[openfirmware] [commit] r2026 - cpu/arm/mmp2 cpu/arm/olpc/1.75 cpu/x86 cpu/x86/pc/olpc cpu/x86/pc/olpc/via dev/olpc/keyboard dev/olpc/mmp2camera dev/olpc/touchpad dev/video/common

repository service svn at openfirmware.info
Thu Nov 18 01:52:12 CET 2010


Author: wmb
Date: Thu Nov 18 01:52:11 2010
New Revision: 2026
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2026

Log:
OLPC XO-1.75 - Audio selftest and a few other selftests are now working.  Some refactoring of common code to support same.

Modified:
   cpu/arm/mmp2/mmuon.fth
   cpu/arm/mmp2/rootnode.fth
   cpu/arm/olpc/1.75/addrs.fth
   cpu/arm/olpc/1.75/devices.fth
   cpu/arm/olpc/1.75/fw-version.fth
   cpu/arm/olpc/1.75/fw.bth
   cpu/arm/olpc/1.75/prefw.bth
   cpu/arm/olpc/1.75/rtc.fth
   cpu/arm/olpc/1.75/sdhci.fth
   cpu/arm/olpc/1.75/smbus.fth
   cpu/arm/olpc/1.75/sound.fth
   cpu/x86/adpcm.fth
   cpu/x86/pc/olpc/gridmap.fth
   cpu/x86/pc/olpc/via/banner.fth
   dev/olpc/keyboard/selftest.fth
   dev/olpc/mmp2camera/loadpkg.fth
   dev/olpc/touchpad/touchpad.fth
   dev/video/common/rectangle16.fth

Modified: cpu/arm/mmp2/mmuon.fth
==============================================================================
--- cpu/arm/mmp2/mmuon.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/mmp2/mmuon.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -29,7 +29,7 @@
 \   h# d100.0000  h# c0e  over  h# 0030.0000 map-sections  \ Cache and write bufferable (SRAM)
    h# d100.0000  h# c02  over  h# 0030.0000 map-sections  \ I/O - no caching or buffering (SRAM)
    h# d400.0000  h# c02  over  h# 0040.0000 map-sections  \ I/O - no caching or buffering
-   h# e000.0000  h# c02  over  /section     map-sections  \ I/O - no caching or buffering
+   h# e000.0000  h# c02  over  /section     map-sections  \ Audio SRAM - no caching or buffering
 ;
 
 : setup-sections

Modified: cpu/arm/mmp2/rootnode.fth
==============================================================================
--- cpu/arm/mmp2/rootnode.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/mmp2/rootnode.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -31,8 +31,78 @@
    2drop
 ;
 
-: dma-alloc  ( size -- virt )  alloc-mem  ;
-: dma-free   ( virt size -- )  free-mem  ;
+: dma-range  ( -- start end )  dma-base   dup dma-size +  ;
+
+h# 0 constant dma-map-mode		\ XXX what should this be?
+
+\ Used with "find-node" to locate a physical memory node containing
+\ enough memory in the DMA range.
+\ We first compute the intersection between the memory piece and the
+\ range reachable by DMA.  If the regions are disjoint, then ok-high
+\ will be (unsigned) less than ok-low.  We then subtract ok-low from
+\ ok-high to give the (possibly negative) size of the intersection.
+: in-range?  ( size mem-low mem-high range-low range-high -- flag )
+   rot umin -rot              ( size min-high mem-low mem-high )
+   umax                       ( size min-high max-low )
+   - <=                       ( flag )
+;
+
+: dma-ok?  ( size node-adr -- size flag )
+   node-range				 ( size mem-adr mem-len )
+   over +                                ( size mem-adr mem-end )
+
+   3dup dma-range in-range?  if          ( size mem-adr mem-end )
+      2drop true exit                    ( size true )
+   then                                  ( size mem-adr mem-end )
+
+   2drop false                           ( size false )
+;
+
+\ Find an available physical address range suitable for DMA.  This word
+\ doesn't actually claim the memory (that is done later), but simply locates
+\ a suitable range that can be successfully claimed.
+: find-dma-address  ( size -- true | adr false )
+   " physavail" memory-node @ $call-method  	( list )
+   ['] dma-ok?  find-node is next-node  drop	( size' )
+   next-node 0=  if  drop true exit  then	( size' )
+   next-end                                     ( size mem-end )
+   dma-range                                    ( size mem-end range-l,h )
+   nip umin  swap -   false		        ( adr false )
+;
+
+headers
+: dma-alloc  ( size -- virt )
+   pagesize round-up
+
+   \ Locate a suitable physical range
+   dup  find-dma-address  throw			( size' phys )
+
+   \ Claim it
+   over 0  mem-claim				( size' phys )
+
+[ifdef] virtual-mode
+   \ Get a virtual range
+   over pagesize  mmu-claim			( size' phys virt )
+
+   \ Map the physical and virtual ranges
+   dup >r					( size' phys virt )
+   rot dma-map-mode				( phys virt size' mode )
+   mmu-map					( )
+   r>						( virt )
+[else]
+   nip
+[then]
+;
+: dma-free  ( virt size -- )
+   pagesize round-up				( virt size' )
+[ifdef] virtual-mode
+   over mmu-translate 0= abort" Freeing unmapped dma memory"  drop
+						( virt size phys )
+   -rot tuck                                    ( phys size  virt size )
+   2dup mmu-unmap  mmu-release			( phys size )
+[then]
+   mem-release					( )
+;
 
 : dma-map-in   ( virt size cacheable -- devaddr )
    drop   2dup flush-d$-range  drop   ( virt )

Modified: cpu/arm/olpc/1.75/addrs.fth
==============================================================================
--- cpu/arm/olpc/1.75/addrs.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/olpc/1.75/addrs.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -6,6 +6,7 @@
 
 fb-pa constant available-ram-size
 
+
 h#  20000 constant dropin-offset   \ Offset to dropin driver area in SPI FLASH
 [ifdef] use-flash-nvram
 h# d.0000 constant nvram-offset
@@ -20,9 +21,11 @@
 : (memory?)  ( phys -- flag )  total-ram-size u<  ;
 
 \ OFW implementation choices
-\ h# 1fe0.0000 constant fw-pa
 h# 1fa0.0000 constant fw-pa
 
+h# 1f00.0000 constant dma-base
+h#   a0.0000 constant dma-size
+
 [ifdef] virtual-mode
 h# f700.0000 constant fw-virt-base
 h# 0100.0000 constant fw-virt-size  \ 16 megs of mapping space

Modified: cpu/arm/olpc/1.75/devices.fth
==============================================================================
--- cpu/arm/olpc/1.75/devices.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/olpc/1.75/devices.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -191,6 +191,9 @@
    " ISO8859-1" encode-string    " character-set" property
    0 0  encode-bytes  " iso6429-1983-colors"  property
 
+   \ Used as temporary storage for images by $get-image
+   : graphmem  ( -- adr )  dimensions * pixel*  fb-pa +  ;
+
    : display-install  ( -- )
       display-on
       default-font set-font
@@ -217,8 +220,8 @@
 
 fload ${BP}/cpu/arm/olpc/1.75/sdhci.fth
 
-devalias int /sd at d4281000/disk
-devalias ext /sd at d4280000/disk
+devalias int /sd/disk at 1
+devalias ext /sd/disk at 3
 devalias net /wlan  \ XXX should report-net in case of USB Ethernet
 
 fload ${BP}/dev/olpc/kb3700/spicmd.fth
@@ -262,8 +265,14 @@
 
 fload ${BP}/dev/olpc/mmp2camera/loadpkg.fth
 
+fload ${BP}/cpu/x86/adpcm.fth            \ ADPCM decoding
+d# 32 is playback-volume
+
 fload ${BP}/cpu/arm/olpc/1.75/sound.fth
 fload ${BP}/cpu/arm/olpc/1.75/rtc.fth
+stand-init: RTC
+   " /rtc" open-dev  clock-node !
+;
 fload ${BP}/cpu/arm/olpc/1.75/accelerometer.fth
 fload ${BP}/cpu/arm/olpc/1.75/compass.fth
 

Modified: cpu/arm/olpc/1.75/fw-version.fth
==============================================================================
--- cpu/arm/olpc/1.75/fw-version.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/olpc/1.75/fw-version.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -1,3 +1,3 @@
 \ The overall firmware revision
 macro: FW_MAJOR A
-macro: FW_MINOR 04c
+macro: FW_MINOR 04d

Modified: cpu/arm/olpc/1.75/fw.bth
==============================================================================
--- cpu/arm/olpc/1.75/fw.bth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/olpc/1.75/fw.bth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -5,7 +5,7 @@
 command: &armforth &dictionary &this
 build-now
 
-\ " fw.tag" r/w create-file drop  tag-file !
+" fw.tag" r/w create-file drop  tag-file !
 
 hex
 \ ' $report-name is include-hook
@@ -51,6 +51,8 @@
 \ false to stand-init-debug?
 true to stand-init-debug?
 
+false value secure?
+
 : protect-fw  ( -- )  ;
 
 hex
@@ -90,8 +92,6 @@
 ;
 ' (.firmware) to .firmware
 
-\ fload ${BP}/cpu/x86/pc/olpc/via/banner.fth
-
 patch merge-rect-565 merge-rect merge-cursor  \ Hack since we do all our user-level graphics in 565
 patch merge-rect-565 merge-rect merge-cursor  \ Hack since we do all our user-level graphics in 565
 
@@ -126,6 +126,12 @@
 
 fload ${BP}/cpu/x86/pc/olpc/via/banner.fth
 
+h# d00 value board-revision   \ Implement me!!!
+
+\ This must be defined after spiui.fth, otherwise spiui will choose some wrong code
+: rom-pa  ( -- adr )  mfg-data-buf mfg-data-offset -  ;  \ Fake out setwp.fth
+fload ${BP}/cpu/x86/pc/olpc/setwp.fth
+
 fload ${BP}/cpu/x86/pc/olpc/help.fth
 fload ${BP}/cpu/x86/pc/olpc/gui.fth
 fload ${BP}/cpu/x86/pc/olpc/strokes.fth
@@ -142,24 +148,50 @@
 end-package
 
 fload ${BP}/dev/logdev.fth
-[ifdef] notyet
+0 value smt-test?  \ !!!
+0 value final-test?  \ !!!
+fload ${BP}/cpu/x86/pc/olpc/disptest.fth
 fload ${BP}/dev/olpc/keyboard/selftest.fth   \ Keyboard diagnostic
 fload ${BP}/dev/olpc/touchpad/touchpad.fth   \ Touchpad diagnostic
-[then]
 fload ${BP}/cpu/x86/pc/olpc/gridmap.fth      \ Gridded display tools
 fload ${BP}/cpu/x86/pc/olpc/via/copynand.fth
 
-[ifdef] notyet
+: game-key@  ( -- n )  0  ;   \ Implement me!!!
 fload ${BP}/cpu/x86/pc/olpc/gamekeys.fth
 : emacs  ( -- )
    false to already-go?
    boot-getline to boot-file   " rom:emacs" $boot
 ;
 defer rm-go-hook  \ Not used, but makes security happy
+: tsc@  ( -- d.ticks )  timer0@ u>d  ;
+d# 6500 constant ms-factor
+0 value ec-indexed-io-off?    \ !!!
+: ec-indexed-io-off  ( -- )  ;  \ !!!
+: ec-ixio-reboot  ( -- )  ;   \ !!!
+: flash-base  ( -- )  true abort" The stuff that relies on flash-base in security.fth needs to be reworked!"  ;
+: cmos@  ( index -- data )  h# 38 mod  8 +  " rtc@" clock-node @  $call-method  ;
+: cmos!  ( index data -- )  h# 38 mod  8 +  " rtc!" clock-node @  $call-method  ;
+: halt  ( -- )  c7-wfi  ;
+fload ${BP}/cpu/x86/pc/olpc/sound.fth
 fload ${BP}/cpu/x86/pc/olpc/security.fth
 
+[ifdef] notyet
+create use-thinmac
+fload ${BP}/cpu/x86/bootascall.fth
+fload ${BP}/cpu/x86/pc/olpc/wifichannel.fth
+fload ${BP}/cpu/x86/pc/olpc/via/nbtx.fth
+fload ${BP}/cpu/x86/pc/olpc/via/nbrx.fth
+fload ${BP}/cpu/x86/pc/olpc/via/blockfifo.fth
+[else]
+0 value nb-zd-#sectors
+: nandblaster  true abort" No nandblaster yet"  ;
+: show-temperature  ;
 [then]
 
+fload ${BP}/cpu/x86/pc/olpc/via/fsupdate.fth
+fload ${BP}/cpu/x86/pc/olpc/via/fsverify.fth
+devalias fsdisk int:0
+
 fload ${BP}/ofw/gui/ofpong.fth
 [ifdef] notyet
 fload ${BP}/cpu/x86/pc/olpc/life.fth
@@ -171,6 +203,8 @@
 \needs ramdisk  " " d# 128 config-string ramdisk
 " "   ' boot-file      set-config-string-default   \ Let the boot script set the cmdline
 
+2 config-int auto-boot-countdown
+
 \ Eliminate 4 second delay in install console for the case where
 \ there is no keyboard.  The delay is unnecessary because the screen
 \ does not go blank when the device is closed.
@@ -212,7 +246,9 @@
    warning on
    only forth also definitions
 
+   show-child
    install-alarm
+   ['] sound catch drop
 
    page-mode
    #line off
@@ -251,6 +287,7 @@
 ;
 [then]
 
+
 : startup  ( -- )
    standalone?  0=  if  exit  then
 
@@ -311,7 +348,7 @@
    " devalias fsdisk //null" evaluate
 ;
 
-\ tag-file @ fclose  tag-file off
+tag-file @ fclose  tag-file off
 
 .( --- Saving fw.dic ...)
 " fw.dic" $save-forth cr

Modified: cpu/arm/olpc/1.75/prefw.bth
==============================================================================
--- cpu/arm/olpc/1.75/prefw.bth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/olpc/1.75/prefw.bth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -38,6 +38,8 @@
 " com1" ' input-device set-config-string-default
 [then]
 
+fload ${BP}/ofw/core/memlist.fth	\ Resource list common routines
+fload ${BP}/ofw/core/showlist.fth	\ Linked list display tool
 
 fload ${BP}/cpu/arm/mmp2/rootnode.fth	\ Root node mapping - physical mode
 dev /
@@ -64,8 +66,7 @@
    then
 ;
 [then]
-fload ${BP}/ofw/core/memlist.fth	\ Resource list common routines
-fload ${BP}/ofw/core/showlist.fth	\ Linked list display tool
+
 fload ${BP}/ofw/core/allocph1.fth	\ S Physical memory allocator
 fload ${BP}/ofw/core/availpm.fth	\ Available memory list
 
@@ -197,18 +198,6 @@
 : olpc-ssids  ( -- $ )  " OLPCOFW"  ;
 ' olpc-ssids to default-ssids
 
-[ifdef] notyet
-create use-thinmac
-fload ${BP}/cpu/x86/bootascall.fth
-fload ${BP}/cpu/x86/pc/olpc/wifichannel.fth
-fload ${BP}/cpu/x86/pc/olpc/via/nbtx.fth
-fload ${BP}/cpu/x86/pc/olpc/via/nbrx.fth
-fload ${BP}/cpu/x86/pc/olpc/via/blockfifo.fth
-fload ${BP}/cpu/x86/pc/olpc/via/fsupdate.fth
-fload ${BP}/cpu/x86/pc/olpc/via/fsverify.fth
-devalias fsdisk int:0
-[then]
-
 fload ${BP}/ofw/inet/sntp.fth
 : olpc-ntp-servers  ( -- )
    " DHCP time 172.18.0.1 0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org"

Modified: cpu/arm/olpc/1.75/rtc.fth
==============================================================================
--- cpu/arm/olpc/1.75/rtc.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/olpc/1.75/rtc.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -4,6 +4,48 @@
 : set-address  ( -- )  h# d0 2 set-twsi-target  ;
 : rtc@  ( reg# -- byte )  set-address  twsi-b@  ;
 : rtc!  ( byte reg# -- )  set-address  twsi-b!  ;
-: open  ( -- okay )  true  ;
-: close  ( -- )  ;
+
+headerless
+
+headerless
+
+headers
+: open  ( -- true )
+   true
+;
+: close  ( -- )
+;
+
+headerless
+: bcd>  ( bcd -- binary )  dup h# f and  swap 4 >>  d# 10 *  +  ;
+: >bcd  ( binary -- bcd )  d# 10 /mod  4 << +  ;
+
+: bcd-time&date  ( -- s m h d m y century )
+   0 1 7 twsi-get   ( s m h dow d m y )
+   3 roll drop      ( s m h dow d m y )
+   d# 20
+;
+: bcd!  ( n offset -- )  swap >bcd  swap rtc!  ;
+
+headers
+: get-time  ( -- s m h d m y )
+   bcd-time&date  >r >r >r >r >r >r
+   bcd>  r> bcd>  r> bcd>  r> bcd>  r> bcd>  r> bcd>  r> bcd> ( s m h d m y c )
+
+   d# 100 * +  		\ Merge century with year
+;
+: set-time  ( s m h d m y -- )
+   d# 100 /mod  h# 1a bcd!  9 bcd!  8 bcd!  7 bcd!  4 bcd!  2 bcd!  0 bcd!
+;
+
+: selftest  ( -- flag )
+   open  0=  if  true  close exit  then
+   0 rtc@  d# 1100 ms  0 rtc@  =  if
+      ." RTC did not tick" cr
+      true  close  exit
+   then
+   close
+   false
+;
+
 end-package

Modified: cpu/arm/olpc/1.75/sdhci.fth
==============================================================================
--- cpu/arm/olpc/1.75/sdhci.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/olpc/1.75/sdhci.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -30,7 +30,7 @@
    new-device
       1 encode-int " reg" property
       fload ${BP}/dev/mmc/sdhci/sdmmc.fth
-      \ fload ${BP}/dev/mmc/sdhci/selftest.fth
+      fload ${BP}/dev/mmc/sdhci/selftest.fth
       " external" " slot-name" string-property
    finish-device
 
@@ -42,7 +42,7 @@
    new-device
       3 encode-int " reg" property
       fload ${BP}/dev/mmc/sdhci/sdmmc.fth
-      \ fload ${BP}/dev/mmc/sdhci/selftest.fth
+      fload ${BP}/dev/mmc/sdhci/selftest.fth
       " internal" " slot-name" string-property
    finish-device
 

Modified: cpu/arm/olpc/1.75/smbus.fth
==============================================================================
--- cpu/arm/olpc/1.75/smbus.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/olpc/1.75/smbus.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -11,7 +11,7 @@
 : smb-data@  ( -- flag )  smb-data-gpio# gpio-pin@  ;
 : smb-clk@  ( -- flag )  smb-clock-gpio# gpio-pin@  ;
 : smb-off  ( -- )  smb-data-gpio# gpio-dir-in  ;
-: smb-on  ( -- )  smb-data-gpio# gpio-dir-out  ;
+: smb-on  ( -- )  smb-data-gpio# gpio-dir-out  smb-clock-gpio# gpio-dir-out  ;
 : smb-data-dir-out  ( -- )  smb-data-gpio# gpio-dir-out  ;
 : smb-data-dir-in  ( -- )  smb-data-gpio# gpio-dir-in  ;
 

Modified: cpu/arm/olpc/1.75/sound.fth
==============================================================================
--- cpu/arm/olpc/1.75/sound.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/arm/olpc/1.75/sound.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -2,10 +2,12 @@
 " audio" name
 my-space h# 40 reg
 
-: sspa!  ( n offset -- )  h# d42a.0c00 + l!  ;  \ Write a register in SSPA1
-: sspa@  ( offset -- n )  h# d42a.0c00 + l@  ;  \ Read a register in SSPA1
-: adma!  ( n offset -- )  h# d42a.0800 + l!  ;
-: adma@  ( offset -- n )  h# d42a.0800 + l@  ;
+h# d42a.0c00 constant sspa-base
+h# d42a.0800 constant adma-base
+: sspa!  ( n offset -- )  sspa-base + l!  ;  \ Write a register in SSPA1
+: sspa@  ( offset -- n )  sspa-base + l@  ;  \ Read a register in SSPA1
+: adma!  ( n offset -- )  adma-base + l!  ;
+: adma@  ( offset -- n )  adma-base + l@  ;
 
 : audio-clock-on  ( -- )
    h# 600 h# d428.290c l!  d# 10 us  \ Enable
@@ -14,22 +16,34 @@
    h# 712 h# d428.290c l!  d# 10 us  \ Release reset
 
 
+[ifdef] 24mhz
    \  * 10 / 27 gives about 147.456
    \ The M/N divisor gets 199.33 MHz (Figure 283 - clock tree - in Datasheet)
    \ But the M/N divisors always have an implicit /2 (section 7.3.7 in datasheet),
    \ so the input frequency is 99.67 with respect to NOM (sic) and DENOM.
-   \ we want 24.576 MHz SYSCLK.  99.67 * 18 / 73 = 24.575 - 50 ppm error.
+   \ we want 24.576 MHz SYSCLK.  99.67 * 18 / 73 = 24.575 so 50 ppm error.
    d# 18 d# 15 lshift d# 73 or h# d000.0000 or  h# d4050040 l!
+[else]
+   \  * 10 / 27 gives about 147.456
+   \ The M/N divisor gets 199.33 MHz (Figure 283 - clock tree - in Datasheet)
+   \ But the M/N divisors always have an implicit /2 (section 7.3.7 in datasheet),
+   \ so the input frequency is 99.67 with respect to NOM (sic) and DENOM.
+   \ we want 12.288 MHz SYSCLK.  99.67 * 9 / 73 = 12.2876 so 50 ppm error.
+   d# 9 d# 15 lshift d# 73 or h# d000.0000 or  h# d4050040 l!
+[then]
 
    h# d405.0024 l@  h# 20 or  h# d405.0024 l!  \ Enable 12S clock out to SSPA1
 
    h# 10800 38 sspa!
+  
+[ifdef] 24mhz
    \ Bits 14:9 set the divisor from SYSCLK to BITCLK.  The setting below
    \ is d# 16, which gives BITCLK = 3.072 MHz.  That's 32x 48000, just enough
    \ for two (stereo) 16-bit samples.
-\   h#  2183 34 sspa!
-  
-   h#  2183 34 sspa!  \ Divisor 16 - BITCLK = 3.072 Mhz
+   h#  2183 h# 34 sspa!  \ Divisor 16 - BITCLK = 3.072 Mhz
+[else]
+   h#  1183 h# 34 sspa!  \ Divisor  8 - BITCLK = 3.072 Mhz
+[then]
 ;
 
 : setup-sspa-rx  ( -- )
@@ -52,6 +66,8 @@
    d# 31 d#  4 lshift or \ Frame sync period
    1     d#  2 lshift or \ Flush the FIFO
    h# 0c sspa!
+
+   h# 10 h# 10 sspa!   \ Rx FIFO limit
 ;
 : enable-sspa-rx  ( -- )  h# 0c sspa@  h# 8004.0001 or  h# 0c sspa!  ;
 : disable-sspa-rx  ( -- )  h# 0c sspa@  h# 8000.0040 or  h# 4.0001 invert and    h# 0c sspa!  ;
@@ -68,7 +84,7 @@
    2 d#  5 lshift or  \ 16 bit word in phase 1
    0 d#  3 lshift or  \ Left justified data
    2 d#  0 lshift or  \ 16-bit audio sample in phase 1
-   h# 88 sspa!   \ Receive control register
+   h# 88 sspa!   \ Transmit control register
 
    h# 8000.0000          \ Enable writes
    d# 15 d# 20 lshift or \ Frame sync width
@@ -79,81 +95,78 @@
    d# 31 d#  4 lshift or \ Frame sync period
    1     d#  2 lshift or \ Flush the FIFO
    h# 8c sspa!
+
+   h# 10 h# 90 sspa!  \ Tx FIFO limit
 ;
 : enable-sspa-tx  ( -- )  h# 8c sspa@  h# 8004.0001 or  h# 8c sspa!  ;
 : disable-sspa-tx  ( -- )  h# 8c sspa@  h# 8000.0040 or  h# 4.0001 invert and  h# 8c sspa!  ;
-: set-tx-fifo-limit  ( n -- )  h# 90 sspa!  ;
-: set-rx-fifo-limit  ( n -- )  h# 10 sspa!  ;
 
-: putsample  ( w -- )
-   d# 16 lshift    \ Justify               ( l )
-   h# a0 sspa@                             ( l fifo-size )
-   begin  dup h# 9c sspa@ <>  until  drop  ( w )
-   h# 80 sspa!
-;
-: getsample  ( -- w )
-   begin  h# 1c sspa@  until
-   0 sspa@ d# 16 rshift
+h# e000.0000 constant audio-sram
+h# fc0 constant /audio-buf
+audio-sram           constant out-bufs
+audio-sram h# 1f80 + constant out-desc
+audio-sram h# 2000 + constant in-bufs
+audio-sram h# 3f80 + constant in-desc
+
+\ Descriptor format:
+\ Byte count
+\ Source
+\ Destination
+\ link
+
+0 value my-out-desc  \ out-desc or out-desc h# 20 +
+0 value out-adr
+0 value out-len
+0 value my-in-desc   \ in-desc or in-desc h# 20 +
+0 value in-adr
+0 value in-len
+: set-descriptor   ( next dest source length adr -- )
+   >r  r@ l!  r@ la1+ l!  r@ 2 la+ l!  r> 3 la+ l!
+;
+: make-out-ring  ( adr len -- )
+   out-desc h# 10 +  sspa-base h# 80 +  out-bufs               /audio-buf   out-desc          set-descriptor
+   out-desc          sspa-base h# 80 +  out-bufs /audio-buf +  /audio-buf   out-desc  h# 10 + set-descriptor
+   out-desc  h# 30 adma!   \ Link to first descriptor
+   out-desc to my-out-desc
+;
+: start-out-ring  ( -- )
+   1 h# 80 adma!           \ Enable DMA completion interrupts
+   h# 0081.3020   h# 40 adma! \ 16 bits, pack, fetch next, enable, chain, hold dest, inc src
+;
+: make-in-ring  ( adr len -- )
+   in-desc h# 10 +  in-bufs               sspa-base   /audio-buf   in-desc          set-descriptor
+   in-desc          in-bufs /audio-buf +  sspa-base   /audio-buf   in-desc  h# 10 + set-descriptor
+   in-desc  h# 34 adma!   \ Link to first descriptor
+   in-desc to my-in-desc
+;
+: start-in-ring  ( -- )
+   1 h# 84 adma!           \ Enable DMA completion interrupts
+\   h# 0081.3008   h# 44 adma! \ 16 bits, pack, fetch next, enable, chain, inc dest, hold src
+   h# 00a1.31c8   h# 44 adma! \ 16 bits, pack, fetch next, enable, chain, burst32, inc dest, hold src
+;
+
+: copy-out  ( -- )
+   my-out-desc >r                        ( r: desc )
+   out-len /audio-buf min                ( this-len r: desc )
+   dup r@ l!                             ( this-len r: desc )
+   out-adr  r@ la1+ l@  third  move      ( this-len r: desc )
+   out-adr  over +  to out-adr           ( this-len r: desc )
+   out-len  swap -  to out-len           ( r: desc )
+   out-len  if
+      r> 3 la+ l@  to my-out-desc
+   else
+      0 r> 3 la+ l!  \ When there is no more data, terminate the list
+   then
 ;
-: audio-in  ( adr len -- actual )
-   tuck bounds  ?do
-      getsample  i w!
-   /w +loop
+
+: copy-in  ( -- )
+   in-len /audio-buf min                       ( this-len )
+   my-in-desc 2 la+ l@  in-adr  third  move       ( this-len )
+   in-adr  over +  to in-adr                   ( this-len )
+   in-len  over -  to in-len                   ( this-len )
+   drop                                        ( )
+   my-in-desc 3 la+ l@ to my-in-desc
 ;
-: audio-out  ( adr len -- actual )
-   tuck bounds  ?do
-      i w@  putsample
-   /w +loop
-;
-0 value descriptors
-0 value /descriptors
-: make-out-dma-descriptor-chain  ( adr len -- )
-   dup h# 8000 round-up h# 8000 / to /descriptors
-   /descriptors alloc-mem  to descriptors    ( adr len )
-   descriptors /descriptors  bounds  ?do     ( adr len )
-      dup h# 8000 max     i l!               ( adr len )
-      over          i 1 la+ l!               ( adr len )
-      h# d42a.0c80  i 2 la+ l!               ( adr len )
-      i h# 10 +     i 3 la+ l!               ( adr len )
-      h# 8000 /string                        ( adr' len' )
-   h# 10 +loop                               ( adr len )
-   2drop
-   0 descriptors /descriptors + -1 la+ l!
-;
-: make-in-dma-descriptor-chain  ( adr len -- )
-   dup h# 8000 round-up h# 8000 / to /descriptors
-   /descriptors alloc-mem  to descriptors    ( adr len )
-   descriptors /descriptors  bounds  ?do     ( adr len )
-      dup h# 8000 max     i l!               ( adr len )
-      h# d42a.0c00  i 1 la+ l!               ( adr len )
-      over          i 2 la+ l!               ( adr len )
-      i h# 10 +     i 3 la+ l!               ( adr len )
-      h# 8000 /string                        ( adr' len' )
-   h# 10 +loop                               ( adr len )
-   2drop
-   0 descriptors /descriptors + -1 la+ l!
-;
-: dma-audio-in  ( adr len -- )
-   make-in-dma-descriptor-chain
-   \ Channel 1
-   tuck  4 adma!  h# 14 adma! \ Address and length
-   h# d42a.0c00 h# 24 adma!   \ RX Data register
-   0 h# 34 adma!              \ Next descriptor
-   h# 0081.1208   h# 44 adma! \ 16 bits, pack, enable, non-chain, inc dest, hold src
-;
-: dma-audio-out  ( adr len -- )
-   \ Channel 0
-   tuck  0 adma!  h# 10 adma! \ Address and length
-   h# d42a.0c80 h# 20 adma!   \ Tx data register
-   0 h# 30 adma!              \ Next descriptor
-   h# 0081.1220   h# 40 adma! \ 16 bits, pack, enable, non-chain, hold dest, inc src
-;
-: write-done  ;
-
-: open-in   ( -- )  h# 10 set-tx-fifo-limit enable-sspa-rx  ;
-: close-in  ( -- )  disable-sspa-rx  ;
-: open-out  ( -- )  h# 10 set-tx-fifo-limit enable-sspa-tx  ;
-: close-out ( -- )  disable-sspa-tx  ;
 
 \ Reset is unconnected on current boards
 \ : audio-reset  ( -- )  8 gpio-clr  ;
@@ -203,6 +216,25 @@
 : codec-off  ( -- )
    h# ef00 h# 26 codec!  \ Power down everything
 ;
+d# 48000 value sample-rate
+
+\ Longest time to wait for a buffer event - a little more
+\ than the time it takes to output /audio-buf samples
+\ at the current sample rate.
+0 value buf-timeout
+
+: set-sample-rate  ( rate -- )
+   to sample-rate
+   sample-rate case
+      d#  8000 of  h# 2222 h# 5272 d# 48  d# 129  endof
+      d# 16000 of  h# 2020 h# 2272 d# 24  d#  65  endof
+      d# 32000 of  h# 2121 h# 2172 d# 12  d#  33  endof
+      d# 48000 of  h# 0000 h# 3072 d#  8  d#  23  endof
+      ( default )  true abort" Unsupported audio sample rate"
+   endcase   ( reg62val2 reg60val sspareg34val timeout )
+   to buf-timeout
+   9 lshift h# 183 or  h# 34 sspa!  h# 60 codec!  h# 62 codec!
+;
 
 \ Mic bias 2 is for external mic
 \ I think we don't need to use the audio PLL, because we are using the PMUM M/N divider
@@ -213,19 +245,57 @@
 \    h# 0000.0000 h# 3c sspa!
 \ ;
 
-: init-audio  ( -- )
-   audio-clock-on
-   codec-on
-   setup-sspa-rx
-   setup-sspa-tx
+: dma-alloc  ( len -- adr )  " dma-alloc" $call-parent  ;
+: dma-free  ( adr len -- )  " dma-free" $call-parent  ;
+
+: open-in   ( -- )  setup-sspa-rx  ;
+: close-in  ( -- )  ;
+: open-out  ( -- )  setup-sspa-tx  ;
+: close-out ( -- )  ;
+: write-done  ( -- )  ;
+
+: wait-out  ( -- )
+   buf-timeout  0  do   
+      1 ms  h# a0 adma@ 1 and  ?leave
+   loop
+   0 h# a0 adma!
 ;
-: test-setup  ( -- )
-   h# 2000 0 do
-      i     h# e000.0000 i wa+  w!
+: audio-out  ( adr len -- actual )
+   tuck  to out-len  to out-adr   
+   make-out-ring
+   copy-out
+   start-out-ring
+   enable-sspa-tx
+   begin  out-len  while
+      copy-out
+      wait-out
+   repeat
+   wait-out
+   disable-sspa-tx
+;
+: write  ( adr len -- actual )  open-out audio-out   ;
+
+: wait-in  ( -- )
+   buf-timeout  0  do
+      1 ms  h# a4 adma@ 1 and  ?leave
    loop
+   0 h# a4 adma!
+;
+: audio-in  ( adr len -- actual )
+   tuck  to in-len  to in-adr  ( actual )
+   make-in-ring                ( actual )
+   enable-sspa-rx              ( actual )
+   start-in-ring               ( actual )
+   begin  in-len  while        ( actual )
+      wait-in                  ( actual )
+      copy-in                  ( actual )
+   repeat                      ( actual )
+   disable-sspa-rx             ( actual )
 ;
-: dma  h# e000.0000 h# 4000 dma-audio-out  ;
-: run  open-out  d# 200 ms  close-out  ;
+: read  ( adr len -- actual )  open-in audio-in  ;
+
+: wait-sound  ( -- )  ;
+: stop-sound  ( -- )  ;
 
 0 [if]
 \ Notes:
@@ -246,7 +316,6 @@
 : mic+30db   ( -- )  h# a00 mic-gain  ;
 : mic+40db   ( -- )  h# f00 mic-gain  ;
 
-
 : mic-bias-off  ( -- )  h# 000c h# 3a codec-clr  ;
 : mic-bias-on   ( -- )  h# 000c h# 3a codec-set  ;
 
@@ -283,23 +352,22 @@
 
 : headphones-inserted?  ( -- flag )  h# 54 codec@ 2 and 0<>  ;
 
-\ 0 is off, 1 is softest non-off, etc
-: set-record-gain  ( n -- )
-   0 max  h# 1f max  dup 7 lshift   h# 0f9f h# 12 codec-field
-;
-: attenuation>lr  ( n -- true | regval false )
-   0 max        ( n' )
-   ?dup  if     ( n )
-      h# 1f min
-      h# 20 swap -
+\ The range is from -34.5 db to +12 dB
+: gain>lr  ( db -- true | regval false )
+   2* 3 /              ( steps )  \ Converts -34.5 .. 12 db to -23 .. 8 steps
+   dup d# -23 <  if    ( steps )
+      drop true
+   else                ( steps )
+      8 swap -         ( -steps )
+      0 max            ( clipped-steps )
       dup 8 lshift or  ( regval )
       false
-   else         ( )
-      true
    then
-;   
-: >output-volume  ( n -- regval mask )
-   attenuation>lr  if  h# 8080  then   h# 9f9f       
+;
+\ The range is from -46.5 db to 0 dB
+: >output-volume  ( db -- regval mask )
+   d# 12 +     \ Bias to the range used by gain>lr
+   gain>lr  if  h# 8080  then   h# 9f9f       
 ;
 : set-speaker-volume    ( n -- )  >output-volume  2 codec-field  ;
 : set-headphone-volume  ( n -- )  >output-volume  4 codec-field  ;
@@ -307,19 +375,21 @@
 : set-volume  ( n -- )
    dup set-speaker-volume  set-headphone-volume
 ;
-d# 8 constant default-dac-gain
-
-d# 20 constant default-volume
+d#  0 constant default-adc-gain            \  0 dB - range is -16.5 to +30
+d#  0 constant default-dac-gain            \  0 dB - range is -34.5 to +12
+d# 44 constant default-mic-gain            \ 44 dB - range is -34.5 to 
+d#  0 constant default-speaker-volume      \  0 dB - range is -46.5 to 0
+d#  0 constant default-headphone-volume    \  0 dB - range is -46.5 to 0
 
 : select-headphones  ( -- )  h# 300 h# 1c codec!  ;
 : select-speakers-ab  ( -- )  h# 4800 h# 1c codec!  ;  \ ClassAB, headphone mixer
 : select-speakers  ( -- )  h# 6800 h# 1c codec!  ;  \ ClassD, headphone mixer
 
 : set-line-in-gain  ( n -- )
-   attenuation>lr  if  h# e000  then  h# ff1f  h# a  codec-field
+   gain>lr  if  h# e000  then  h# ff1f  h# 0a codec-field
 ;
 : set-dac-gain  ( n -- )
-   attenuation>lr  if  h# e000  then  h# ff1f  h# c  codec-field
+   gain>lr  if  h# e000  then  h# ff1f  h# 0c codec-field
 ;
 false value external-mic?
 : mic-routing  ( -- n )
@@ -328,34 +398,65 @@
    \ For internal, we send MIC1 to both left and right
    external-mic?  if   h# 2040  else  h# 2020  then
 ;
-: set-mic-gain  ( n -- )
-   attenuation>lr  if  ( )  \ Mute
+: set-mic-boost  ( db -- db' )
+   dup d# 26 >  if  mic+40db d# 40 -  exit  then
+   dup d# 16 >  if  mic+30db d# 30 -  exit  then
+   dup d# 06 >  if  mic+20db d# 20 -  exit  then
+   mic+0db
+;
+: set-mic-gain  ( db -- )
+   set-mic-boost              ( db' )   
+   gain>lr  if                ( )  \ Mute
       \ Turn everything off
+      mic-bias-off            ( )
       0  h# 6060  h# e0e0     ( gain adc-mute mic-output-mute )
    else                       ( gain )
+      mic-bias-on             ( gain )
       \ Mic routing to ADC depends on internal or external mic
-      \ We route the mic only to the headphone output
-      mic-routing  h# 6060    ( gain adc-mute mic-output-mute )
+      mic-routing             ( gain adc-mute )
+      \ To avoid feedback, we do not feedthrough the mic
+      h# e0e0                 ( gain adc-mute mic-output-mute )
    then                       ( gain adc-mute mic-output-mute )
    h# e0e0 h# 10 codec-field  ( gain adc-mute )
    h# 6060 h# 14 codec-field  ( gain )
-   h# 1f1f h# 0c codec-field
+   h# 1f1f h# 0e codec-field
+;
+: set-adc-gain  ( db -- )  \ Range is -16.5 dB to +30 dB
+   d# 18 -       ( db' )
+   gain>lr  if  0  then   ( gain )
+   h# f9f h# 12 codec-field
+   h# 60 h# 12 codec-set  \ Enable ADC zero-cross detectors
+;
+   
+\ This is called from "record" in "mic-test" in "selftest"
+: set-record-gain  ( db -- )
+   \ translate value from ac97 selftest code into our default value
+   dup h# 808  =  if          ( db )
+      drop default-adc-gain   ( db' )
+      d# 40 set-mic-gain      ( db )
+   then                       ( db )
+   set-adc-gain
 ;
 
 : stereo  ;
 : mono  ;
 
-d# 48000 value sample-rate
 : open  ( -- flag )
-   init-audio
+   audio-clock-on
+   codec-on
    headphones-inserted?  if  select-headphones  else  select-speakers  then
-   default-volume set-volume
+   default-speaker-volume set-speaker-volume
+   default-headphone-volume set-headphone-volume
    default-dac-gain set-dac-gain
+   default-mic-gain set-mic-gain
+   default-adc-gain set-adc-gain
+   d# 48000 set-sample-rate
    true
 ;
 : close  ( -- )  ;
 
 fload ${BP}/forth/lib/isin.fth
 fload ${BP}/forth/lib/tones.fth
+fload ${BP}/dev/geode/ac97/selftest.fth
 
 end-package

Modified: cpu/x86/adpcm.fth
==============================================================================
--- cpu/x86/adpcm.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/x86/adpcm.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -55,6 +55,7 @@
    swap in-skip + swap
 ;
 
+[ifdef] 386-assembler
 code adpcm-decode-sample  ( in out sample# -- in' out' )
    \ Get the delta value
    eax pop                              ( in out )
@@ -106,6 +107,34 @@
    d# 88 # eax cmp >  if  d# 88 # eax mov  then
    eax 'user index mov                  \ Update index
 c;
+[then]
+[ifndef] adpcm-decode-sample
+: adpcm-decode-sample  ( in out sample# -- in' out' )
+   7 and  if             ( in out )
+      in-val 4 rshift    ( in out delta )
+   else                  ( in out )
+      over l@            ( in out delta )
+      rot la1+ -rot      ( in' out delta )
+   then                  ( in out delta )
+   dup to in-val         ( in out delta )
+   h# f and  >r          ( in out r: delta' )
+
+   \ Compute difference and new predicated value
+   \ Computes 'vpdiff = (delta+0.5)*step/4', but see comment in adpcm-coder.
+   'stepsize-table index la+ l@    ( in out step r: delta )
+   dup 3 rshift                    ( in out step vpdiff r: delta )
+   r@ 4 and  if  over     +  then  ( in out step vpdiff' r: delta )
+   r@ 2 and  if  over /w* +  then  ( in out step vpdiff' r: delta )
+   r@ 1 and  if  over /l* +  then  ( in out step vpdiff' r: delta )
+   nip                             ( in out vpdiff r: delta )
+
+   r@ 8 and  if  val-pred +  else  val-pred swap -  then  ( in out vp r: delta )
+   d# 32767 min  d# -32768 max   dup to val-pred          ( in out vp r: delta )
+   over w!                                                ( in out  r: delta )
+   out-skip +                                             ( in out' r: delta )
+   'index-table r> la+ l@  index +  0 max  d# 88 min  to index  ( in out )
+;
+[then]
 
 : adpcm-decode-ch  ( in out #sample -- )
    0  ?do

Modified: cpu/x86/pc/olpc/gridmap.fth
==============================================================================
--- cpu/x86/pc/olpc/gridmap.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/x86/pc/olpc/gridmap.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -60,5 +60,3 @@
 [then]
 
 : show-color  ( eblock# color32 -- )  map-color show-state  ;
-
-dev screen  : erase-screen erase-screen ;  dend

Modified: cpu/x86/pc/olpc/via/banner.fth
==============================================================================
--- cpu/x86/pc/olpc/via/banner.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ cpu/x86/pc/olpc/via/banner.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -97,11 +97,11 @@
 
 : ofw-model$  ( -- adr len )
    " /openprom" find-package drop  ( phandle )
-   " model" rot get-package-property  if
-      " ???   ?????  ???"
-   else
-      decode-string
-   then
+   " model" rot get-package-property  if  ( )
+      " ???   ?????  ???"          ( adr len )
+   else                            ( adr len )
+      decode-string 2nip           ( adr len' )
+   then                            ( adr len )
 ;
 : ofw-version$  ( -- adr len )
    ofw-model$ drop 6 +  7  -trailing

Modified: dev/olpc/keyboard/selftest.fth
==============================================================================
--- dev/olpc/keyboard/selftest.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ dev/olpc/keyboard/selftest.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -4,7 +4,7 @@
 \needs final-test?  0 value final-test?
 \needs smt-test?    0 value smt-test?
 
-dev /8042/keyboard
+dev /keyboard
 hex
 
 \ This is 1 for the original rubber keyboard and 2 for the mechanical keyboard

Modified: dev/olpc/mmp2camera/loadpkg.fth
==============================================================================
--- dev/olpc/mmp2camera/loadpkg.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ dev/olpc/mmp2camera/loadpkg.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -22,7 +22,6 @@
    ;
 [then]
 
-   fload ${BP}/cpu/arm/olpc/1.75/smbus.fth
    fload ${BP}/dev/olpc/mmp2camera/platform.fth
    fload ${BP}/dev/olpc/mmp2camera/ov.fth
    fload ${BP}/dev/olpc/mmp2camera/ccic.fth

Modified: dev/olpc/touchpad/touchpad.fth
==============================================================================
--- dev/olpc/touchpad/touchpad.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ dev/olpc/touchpad/touchpad.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -1,6 +1,6 @@
 \ See license at end of file
 \ Add this code to the existing mouse driver
-dev /pci/isa/8042 at i60/mouse
+dev /mouse
 
 variable 'get-data  'get-data  off
 variable 'get-data? 'get-data? off

Modified: dev/video/common/rectangle16.fth
==============================================================================
--- dev/video/common/rectangle16.fth	Wed Nov 17 01:21:03 2010	(r2025)
+++ dev/video/common/rectangle16.fth	Thu Nov 18 01:52:11 2010	(r2026)
@@ -247,6 +247,8 @@
       2drop
    then
 ;
+\ This creates a device method from a termemu method
+: erase-screen  ( -- )  erase-screen  ;
 
 \ LICENSE_BEGIN
 \ Copyright (c) 2006 FirmWorks



More information about the openfirmware mailing list