[openfirmware] [commit] r1992 - cpu/arm cpu/arm/mmp2 cpu/arm/olpc/1.75 dev dev/olpc/dcon dev/olpc/kb3700 dev/olpc/mmp2camera dev/pci
repository service
svn at openfirmware.info
Fri Oct 29 18:17:26 CEST 2010
Author: wmb
Date: Fri Oct 29 18:17:26 2010
New Revision: 1992
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/1992
Log:
OLPC XO-1.75 - another checkpoint - more stuff working.
Added:
cpu/arm/mmp2/spimaster.fth
cpu/arm/olpc/1.75/dconsmb.fth
cpu/arm/olpc/1.75/lcd.fth
cpu/arm/olpc/1.75/prefw.bth
dev/olpc/dcon/mmp2dcon.fth
dev/olpc/mmp2camera/
dev/olpc/mmp2camera/ccic.fth
dev/olpc/mmp2camera/loadpkg.fth
dev/olpc/mmp2camera/ov.fth
dev/olpc/mmp2camera/platform.fth
dev/olpc/mmp2camera/smbus.fth
Modified:
cpu/arm/assem.fth
cpu/arm/disassem.fth
cpu/arm/mmp2/sspspi.fth
cpu/arm/mmp2/watchdog.fth
cpu/arm/olpc/1.75/addrs.fth
cpu/arm/olpc/1.75/boardgpio.fth
cpu/arm/olpc/1.75/config.fth
cpu/arm/olpc/1.75/devices.fth
cpu/arm/olpc/1.75/fw.bth
cpu/arm/olpc/1.75/lcdcfg.fth
cpu/arm/olpc/1.75/probemem.fth
cpu/arm/olpc/1.75/sp.bth
dev/olpc/kb3700/spicmd.fth
dev/pci/isakbd.fth
dev/pckbd.fth
dev/ps2mouse.fth
Modified: cpu/arm/assem.fth
==============================================================================
--- cpu/arm/assem.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/assem.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -546,6 +546,7 @@
: amode-rrop2 ( -- ) init-operands get-r12 get-r16 get-opr2 !op ;
: amode-rnop2 ( -- ) init-operands get-r16 get-opr2 !op ;
: amode-rdop2 ( -- ) init-operands get-r12 get-opr2 !op ;
+: amode-rev ( -- ) init-operands get-r12 get-r00 !op ;
: amode-lsm ( -- )
init-operands
@@ -951,6 +952,10 @@
: ldr ( -- ) 0410.0000 {cond} {shbt} ;
: str ( -- ) 0400.0000 {cond} {hbt} ;
+: rev ( -- ) 06bf0f30 {cond} amode-rev ;
+: rev16 ( -- ) 06bf0fb0 {cond} amode-rev ;
+: revsh ( -- ) 06ff0f30 {cond} amode-rev ;
+
: rd-field ( reg# -- ) d# 12 set-field ;
: rb-field ( reg# -- ) d# 16 set-field ;
Modified: cpu/arm/disassem.fth
==============================================================================
--- cpu/arm/disassem.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/disassem.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -251,9 +251,20 @@
imm12 if ., ." #" +/- imm12 u.h then
then
;
+: .rev ( -- ) {<cond>} op.rd, .rm ;
+: .stuff ( -- )
+ 0 d# 28 bits h# 0fff.0ff0 and
+ case
+ h# 06bf0f30 of ." rev" .rev endof
+ h# 06bf0fb0 of ." rev16" .rev endof
+ h# 06ff0f30 of ." revsh" .rev endof
+ ( default )
+ ." undefined" {<cond>}
+ endcase
+;
: .ldr/str ( -- ) \ d# 25 3 bits 2|3 =
0 d# 28 bits h# 0e00.0010 and h# 0600.0010 = if
- ." undefined" {<cond>}
+ .stuff
exit
then
.ld/st ." r" {<cond>} {b} {t}
Added: cpu/arm/mmp2/spimaster.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/spimaster.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -0,0 +1,104 @@
+\ See license at end of file
+purpose: Driver for Marvell MMP2 SSP in SPI Master Mode
+
+0 0 " d4035000" " /" begin-package \ SPI interface using SSP1
+
+headerless
+
+" spi" device-name
+
+0 0 encode-bytes
+ " Marvell,ssp-spi" encode-string encode+
+" compatible" property
+
+my-address my-space h# 1000 encode-reg
+" reg" property
+
+\ 1 " #address-cells" integer-property
+\ 0 " #size-cells" integer-property
+
+3 /n* buffer: port-data
+: init-queue ( -- ) port-data 3 na+ bounds ?do -1 i ! /n +loop ;
+
+my-space value ssp-base
+: ssp-sscr0 ( -- adr ) ssp-base ;
+: ssp-sscr1 ( -- adr ) ssp-base la1+ ;
+: ssp-sssr ( -- adr ) ssp-base 2 la+ ;
+: ssp-ssdr ( -- adr ) ssp-base 4 la+ ;
+
+: enable ( -- )
+ h# 87 ssp-sscr0 rl! \ Enable, 8-bit data, SPI normal mode
+;
+: disable ( -- )
+ h# 07 ssp-sscr0 rl! \ 8-bit data, SPI normal mode
+;
+\ Switch to master mode, for testing
+: master ( -- )
+ disable
+ h# 0000.0000 ssp-sscr1 rl! \ master mode
+ enable
+;
+
+: ssp1-clk-on 7 h# d4015050 l! 3 h# d4015050 l! ;
+\ : ssp2-clk-on 7 h# d4015054 l! 3 h# d4015052 l! ;
+\ : ssp3-clk-on 7 h# d4015058 l! 3 h# d4015058 l! ;
+\ : ssp4-clk-on 7 h# d401505c l! 3 h# d401505c l! ;
+
+: wb ( byte -- ) ssp-ssdr rl! ;
+: rb ( -- byte ) ssp-ssdr rl@ . ;
+
+: select-ssp1-pins ( -- ) d# 47 d# 43 do h# c3 i af! loop ;
+
+\ Choose alternate function 4 (SSP3) for the pins we use
+: init-ssp-in-master-mode ( -- )
+ select-ssp1-pins
+ ssp1-clk-on
+ disable \ 8-bit data, SPI normal mode
+ 0 ssp-sscr1 rl! \ master mode
+ \ The enable bit must be set last, after all configuration is done
+ enable \ Enable, 8-bit data, SPI normal mode
+;
+
+: .ssr ssp-sssr rl@ . ;
+: ssp-#bytes ( -- n ) ssp-sssr rl@ d# 12 rshift h# f and ;
+
+0 value open-count
+: open ( -- flag )
+ open-count 0= if
+ my-address my-space h# 1000 " map-in" $call-parent is ssp-base
+ init-ssp-in-master-mode
+ then
+ open-count 1+ to open-count
+ true
+;
+: close ( -- )
+ open-count 1 = if
+ ssp-base h# 1000 " map-in" $call-parent 0 is ssp-base
+ then
+ open-count 1- 0 max to open-count
+;
+end-package
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2010 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Modified: cpu/arm/mmp2/sspspi.fth
==============================================================================
--- cpu/arm/mmp2/sspspi.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/mmp2/sspspi.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -38,6 +38,10 @@
disable-interrupts
ignore-power-button
ssp-spi-start
+ \ The following clears out some glitches so the chip will respond
+ \ to the ab-id command.
+ 0 spi-cmd spi-cs-off
+ 0 spi-cmd spi-cs-off
;
: use-ssp-spi ( -- )
Modified: cpu/arm/mmp2/watchdog.fth
==============================================================================
--- cpu/arm/mmp2/watchdog.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/mmp2/watchdog.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -16,7 +16,7 @@
: wdt@ ( offset -- value ) wdt-pa + l@ ;
: (reset-all) ( -- )
enable-wdt-clock
- 2 h# 68 wdt! \ set match register
+ 2 h# 68 wdt! \ set match register
3 h# 64 wdt! \ match enable: just interrupt, no reset yet
1 h# 98 wdt! \ Reset counter
begin again
Modified: cpu/arm/olpc/1.75/addrs.fth
==============================================================================
--- cpu/arm/olpc/1.75/addrs.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/olpc/1.75/addrs.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -12,7 +12,7 @@
\ OFW implementation choices
\ h# 1fe0.0000 constant fw-pa
-0 constant fw-pa
+h# 1fa0.0000 constant fw-pa
[ifdef] virtual-mode
h# f700.0000 constant fw-virt-base
Modified: cpu/arm/olpc/1.75/boardgpio.fth
==============================================================================
--- cpu/arm/olpc/1.75/boardgpio.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/olpc/1.75/boardgpio.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -19,6 +19,7 @@
d# 34 gpio-dir-out \ EN_WLAN_PWR
d# 35 gpio-dir-out \ EN_SD_PWR
d# 57 gpio-dir-out \ WLAN_PD#
+ d# 58 gpio-set \ WLAN_RESET#
d# 58 gpio-dir-out \ WLAN_RESET#
d# 73 gpio-dir-out \ CAM_RST
@@ -221,7 +222,7 @@
0 af, \ GPIO_160 - ND_RDY[1]
1 af, \ GPIO_161 - ND_IO[12] - Not connected (TP 44)
1 af, \ GPIO_162 - (ND_IO[11]) - DCON_SCL
- 1 af, \ GPIO_163 - (ND_IO[10]) - DCON_SDA
+ 1 pull-up, \ GPIO_163 - (ND_IO[10]) - DCON_SDA
1 af, \ GPIO_164 - (ND_IO[9]) - Not connected (TP106)
0 af, \ GPIO_165 - ND_IO[3]
0 af, \ GPIO_166 - ND_IO[2]
Modified: cpu/arm/olpc/1.75/config.fth
==============================================================================
--- cpu/arm/olpc/1.75/config.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/olpc/1.75/config.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -1,4 +1,6 @@
create debug-startup
+create olpc
+create trust-ec-keyboard
fload ${BP}/cpu/arm/olpc/1.75/addrs.fth
fload ${BP}/cpu/arm/mmp2/hwaddrs.fth
Added: cpu/arm/olpc/1.75/dconsmb.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/olpc/1.75/dconsmb.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -0,0 +1,122 @@
+: smb-dly 4 us ;
+
+: smb-data-hi ( -- ) d# 163 gpio-set smb-dly ;
+: smb-data-lo ( -- ) d# 163 gpio-clr smb-dly ;
+: smb-clk-hi ( -- ) d# 162 gpio-set smb-dly ;
+: smb-clk-lo ( -- ) d# 162 gpio-clr smb-dly ;
+: smb-data@ ( -- flag ) d# 163 gpio-pin@ ;
+: smb-clk@ ( -- flag ) d# 162 gpio-pin@ ;
+: smb-off ( -- ) d# 163 gpio-dir-in ;
+: smb-on ( -- ) d# 163 gpio-dir-out ;
+: smb-data-dir-out ( -- ) d# 163 gpio-dir-out ;
+: smb-data-dir-in ( -- ) d# 163 gpio-dir-in ;
+
+h# 3500 constant smb-clk-timeout-us
+\ Slave can flow control by holding CLK low temporarily
+: smb-wait-clk-hi ( -- )
+ smb-clk-timeout-us 0 do
+ smb-clk@ if smb-dly unloop exit then 1 us
+ loop
+ true abort" I2C clock stuck low"
+;
+: smb-data-hi-w ( -- ) smb-data-hi smb-wait-clk-hi ;
+
+h# 3500 constant smb-data-timeout-us
+: smb-wait-data-hi ( -- )
+ smb-data-timeout-us 0 do
+ smb-data@ if unloop exit then 1 us
+ loop
+ true abort" I2C data stuck low"
+;
+
+: smb-restart ( -- )
+ smb-clk-hi smb-data-lo smb-clk-lo
+;
+
+: smb-start ( -- ) smb-clk-hi smb-data-hi smb-data-lo smb-clk-lo ;
+: smb-stop ( -- ) smb-clk-lo smb-data-lo smb-clk-hi smb-data-hi ;
+
+: smb-get-ack ( -- )
+ smb-data-dir-in
+ smb-data-hi
+ smb-clk-hi smb-wait-clk-hi
+ smb-data@ \ drop \ SCCB generates an don't care bit
+ if smb-stop true abort" I2c NAK" then
+ smb-clk-lo
+\ smb-wait-data-hi
+ smb-data-dir-out
+;
+: smb-bit ( flag -- )
+ if smb-data-hi else smb-data-lo then
+ smb-clk-hi smb-wait-clk-hi smb-clk-lo
+;
+
+: smb-byte ( b -- )
+ 8 0 do ( b )
+ dup h# 80 and smb-bit ( b )
+ 2* ( b' )
+ loop ( b )
+ drop ( )
+ smb-get-ack
+;
+: smb-byte-in ( ack=0/nak=1 -- b )
+ smb-data-dir-in
+ 0
+ 8 0 do ( n )
+ smb-clk-hi ( n )
+ 2* smb-data@ if 1 or then ( n' )
+ smb-clk-lo
+ loop
+ smb-data-dir-out
+ swap smb-bit smb-data-hi \ Send ACK or NAK
+;
+
+0 value smb-slave
+: smb-addr ( lowbit -- ) smb-slave or smb-byte ;
+
+: smb-byte! ( byte reg# -- )
+ smb-start
+ 0 smb-addr ( byte reg# )
+ smb-byte ( byte )
+ smb-byte ( )
+ smb-stop
+;
+
+: smb-byte@ ( reg# -- byte )
+ smb-start
+ 0 smb-addr ( reg# )
+ smb-byte ( )
+ smb-stop smb-start \ SCCB bus needs a stop and a start for the second phase
+ 1 smb-addr
+ 1 smb-byte-in ( byte )
+ smb-stop
+;
+
+: smb-word! ( word reg# -- )
+ smb-start
+ 0 smb-addr ( word reg# )
+ smb-byte ( word )
+ wbsplit swap smb-byte smb-byte ( )
+ smb-stop
+;
+
+: smb-word@ ( reg# -- word )
+ smb-start
+ 0 smb-addr ( reg# )
+ smb-byte ( )
+ smb-restart
+ 1 smb-addr ( )
+ 0 smb-byte-in 1 smb-byte-in bwjoin ( word )
+ smb-stop
+;
+
+\ This can useful for clearing out DCON SMB internal state
+: smb-pulses ( -- )
+ d# 32 0 do smb-clk-lo smb-clk-hi loop
+;
+
+: set-dcon-slave ( -- ) h# 1a to smb-slave ;
+: smb-init ( -- ) set-dcon-slave smb-on smb-pulses ;
+
+: dcon@ ( reg# -- word ) set-dcon-slave smb-word@ ;
+: dcon! ( word reg# -- ) set-dcon-slave smb-word! ;
Modified: cpu/arm/olpc/1.75/devices.fth
==============================================================================
--- cpu/arm/olpc/1.75/devices.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/olpc/1.75/devices.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -86,6 +86,17 @@
\needs md5init fload ${BP}/ofw/ppp/md5.fth \ MD5 hash
+[ifdef] notyet
+fload ${BP}/dev/olpc/confirm.fth \ Selftest interaction modalities
+fload ${BP}/cpu/x86/pc/olpc/mfgdata.fth \ Manufacturing data
+fload ${BP}/cpu/x86/pc/olpc/mfgtree.fth \ Manufacturing data in device tree
+fload ${BP}/cpu/x86/pc/olpc/kbdtype.fth \ Export keyboard type
+
+fload ${BP}/dev/olpc/kb3700/battery.fth \ Battery status reports
+[else]
+: find-tag ( adr len -- false | value$ true ) 2drop false ;
+[then]
+
fload ${BP}/dev/olpc/spiflash/flashif.fth \ Generic FLASH interface
fload ${BP}/dev/olpc/spiflash/spiif.fth \ Generic low-level SPI bus access
@@ -103,14 +114,16 @@
: ofw-fw-filename$ " disk:\boot\olpc.rom" ;
' ofw-fw-filename$ to fw-filename$
-0 [if]
0 0 " d420b000" " /" begin-package
" display" name
fload ${BP}/cpu/arm/olpc/1.75/lcdcfg.fth
-\ fload ${BP}/cpu/arm/mmp2/dsi.fth
- fload ${BP}/cpu/arm/mmp2/lcd.fth
+ fload ${BP}/cpu/arm/olpc/1.75/lcd.fth
+ fload ${BP}/cpu/arm/olpc/1.75/dconsmb.fth \ SMB access to DCON chip - bitbanged
+ fload ${BP}/dev/olpc/dcon/mmp2dcon.fth \ DCON control
+
: display-on
+ init-xo-display \ Turns on DCON
init-lcd
fb-pa hdisp vdisp * >bytes h# ff fill
;
@@ -137,12 +150,15 @@
' display-remove is-remove
' display-selftest is-selftest
end-package
+
devalias screen /display
devalias keyboard /keyboard
-fload ${BP}/ofw/termemu/cp881-16.fth
-[then]
+create 15x30pc " ${BP}/ofw/termemu/15x30pc.psf" $file,
+' 15x30pc to romfont
+
+\ fload ${BP}/ofw/termemu/cp881-16.fth
fload ${BP}/cpu/arm/olpc/1.75/sdhci.fth
@@ -151,6 +167,8 @@
fload ${BP}/dev/olpc/kb3700/spicmd.fth
+devalias keyboard /ec-spi/keyboard
+
0 0 " d4208000" " /" begin-package \ USB Host Controller
h# 200 constant /regs
my-address my-space /regs reg
@@ -165,15 +183,26 @@
fload ${BP}/dev/usb2/hcd/ehci/loadpkg.fth
end-package
-: usb-power-on ( -- ) d# 82 gpio-set ; \ 1 instead of 82 for XO
+: usb-power-on ( -- ) 1 gpio-set ;
+: unreset-usb-hub ( -- ) d# 146 gpio-set ;
-0 [if]
fload ${BP}/cpu/arm/marvell/utmiphy.fth
-stand-init: Init USB Phy
+
+: start-usb ( -- )
+ h# 9 h# d428285c l! \ Enable clock to USB block
+ unreset-usb-hub
init-usb-phy
;
+
+0 [if]
+stand-init: Init USB Phy
+\ usb-power-on \ The EC now controls the USB power
+ start-usb
+;
[then]
+fload ${BP}/dev/olpc/mmp2camera/loadpkg.fth
+
\ LICENSE_BEGIN
\ Copyright (c) 2010 FirmWorks
\
Modified: cpu/arm/olpc/1.75/fw.bth
==============================================================================
--- cpu/arm/olpc/1.75/fw.bth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/olpc/1.75/fw.bth Fri Oct 29 18:17:26 2010 (r1992)
@@ -1,168 +1,17 @@
purpose: Build OFW Forth dictionary for OLPC XO-1.75
\ See license at end of file
-dictionary: ${BP}/cpu/arm/build/basefw.dic
+dictionary: ${BP}/cpu/arm/olpc/1.75/build/prefw.dic
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
-' noop is include-hook
+\ ' noop is include-hook
-fload ${BP}/cpu/arm/olpc/1.75/config.fth
-
-: headerless ; : headers ; : headerless0 ;
-
-' (quit) to quit
-
-: \Tags [compile] \ ; immediate
-: \NotTags [compile] \ ; immediate
-
-: RAMbase ( -- adr ) fw-virt-base ;
-: RAMtop ( -- adr ) RAMbase /fw-ram + ;
-
-def-load-base ' load-base set-config-int-default
-
-\ use-movable-vector-base \ Marvell CPU core has a movable vector base
-
-true ' fcode-debug? set-config-int-default
-\ false ' auto-boot? set-config-int-default
-
-
-
-[ifdef] serial-console
-" com1" ' output-device set-config-string-default
-" com1" ' input-device set-config-string-default
-[then]
-
-
-fload ${BP}/cpu/arm/mmp2/rootnode.fth \ Root node mapping - physical mode
-dev /
- " olpc,XO-1.75" model
- " Marvell,Armada 610" encode-string " architecture" property
-\ The clock frequency of the root bus may be irrelevant, since the bus is internal to the SOC
-\ d# 1,000,000,000 " clock-frequency" integer-property
-device-end
-
-: (cpu-arch ( -- adr len )
- " architecture" ['] root-node get-package-property drop
- get-encoded-string
-;
-' (cpu-arch to cpu-arch
-
-\ Memory management services
-[ifdef] virtual-mode
-fload ${BP}/ofw/core/clntmem1.fth \ client services for memory
-[else]
-fload ${BP}/ofw/core/clntphy1.fth \ client services for memory
-: >physical ( va -- pa )
- dup fw-virt-base - fw-virt-size u< if ( va )
- fw-virt-base - fw-pa +
- 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
-
-fload ${BP}/cpu/arm/olpc/1.75/probemem.fth \ Memory probing
-
-stand-init: Probing memory
- " probe" memory-node @ $call-method
-;
-
-[ifdef] virtual-mode
-fload ${BP}/cpu/arm/loadvmem.fth \ /mmu node
-stand-init: MMU
- " /mmu" open-dev mmu-node !
-;
-fload ${BP}/ofw/core/initdict.fth \ Dynamic dictionary allocation
-fload ${BP}/arch/arm/loadarea.fth \ Allocate and map program load area
-[else]
-fload ${BP}/cpu/arm/mmp2/mmuon.fth
-[then]
-
-\ XXX should be elsewhere
-dev /client-services
-: chain ( len args entry size virt -- )
- release ( len args entry )
- h# 8000 alloc-mem h# 8000 + (init-program) ( len args )
- to r1 to r2
- go
-;
-device-end
-
-fload ${BP}/cpu/arm/crc32.fth \ Assembly language Zip CRC calculation
-fload ${BP}/forth/lib/crc32.fth \ High-level portion of CRC calculation
-
-[ifdef] resident-packages
-
-\needs unix-seconds> fload ${BP}/ofw/fs/unixtime.fth \ Unix time calculation
-support-package: ext2-file-system
- fload ${BP}/ofw/fs/ext2fs/ext2fs.fth \ Linux file system
-end-support-package
-
-[ifdef] jffs2-support
-\needs unix-seconds> fload ${BP}/ofw/fs/unixtime.fth \ Unix time calculation
-support-package: jffs2-file-system
- fload ${BP}/ofw/fs/jffs2/jffs2.fth \ Journaling flash file system 2
-end-support-package
-[then]
-
-support-package: zip-file-system
- fload ${BP}/ofw/fs/zipfs.fth \ Zip file system
-end-support-package
-[then]
-
-fload ${BP}/ofw/core/osfile.fth \ For testing
-
-\ Load file format handlers
-
-: call32 ;
-
-fload ${BP}/ofw/core/allocsym.fth \ Allocate memory for symbol table
-fload ${BP}/ofw/core/symcif.fth
-fload ${BP}/ofw/core/symdebug.fth
-: release-load-area ( boundary-adr -- ) drop ;
-
-[ifdef] use-elf
-fload ${BP}/ofw/elf/elf.fth
-fload ${BP}/ofw/elf/elfdebug.fth
-[ifdef] virtual-mode
-\ Depends on the assumption that physical memory is mapped 1:1 already
-: (elf-map-in) ( va size -- ) 0 mem-claim drop ;
-[else]
-: (elf-map-in) ( va size -- ) 2drop ;
-[then]
-' (elf-map-in) is elf-map-in
-[then]
-
-\ Reboot and re-entry code
-fload ${BP}/ofw/core/reboot.fth \ Restart the client program
-fload ${BP}/ofw/core/reenter.fth \ Various entries into Forth
-
-headerless
-[ifdef] virtual-mode
-: (initial-heap) ( -- adr len ) sp0 @ ps-size - dict-limit tuck - ;
-[else]
- \ : (initial-heap) ( -- adr len ) RAMtop heap-size ;
-: (initial-heap) ( -- adr len ) limit heap-size ;
-[then]
-' (initial-heap) is initial-heap
-headers
-
-" /openprom" find-device
- " FirmWorks,3.0" encode-string " model" property
-device-end
-
-[ifdef] virtual-mode
-fload ${BP}/cpu/arm/mmusetup.fth \ Initial values for MMU lists
-[then]
-
-: background-rgb ( -- r g b ) h# ff h# ff h# ff ;
+: confirm-selftest? ( -- flag ) true ; \ XXX implement me
fload ${BP}/cpu/arm/olpc/1.75/devices.fth
@@ -175,17 +24,7 @@
warning on
[then]
-true ' local-mac-address? set-config-int-default
-[ifdef] resident-packages
-support-package: nfs
- fload ${BP}/ofw/fs/nfs/loadpkg.fth
-end-support-package
-
-[then]
-devalias nfs net//obp-tftp:last//nfs
-
fload ${BP}/cpu/arm/linux.fth
-h# 20.0000 to linux-params \ The Jasper Linux kernel fails unless the params are between 0x20.0000 and 0x20.4000
d# 9999 to arm-linux-machine-type \ Marvell Jasper
\ Add a tag describing the linear frame buffer
@@ -207,7 +46,7 @@
0 tag-b, \ Rsvd size
d# 24 tag-b, \ Rsvd position
;
-\ ' mmp-fb-tag, to fb-tag,
+' mmp-fb-tag, to fb-tag,
\ fload ${BP}/cpu/arm/mmp2/usb.fth
@@ -253,24 +92,6 @@
;
' (.firmware) to .firmware
-fload ${BP}/ofw/gui/bmptools.fth
-fload ${BP}/dev/null.fth
-fload ${BP}/ofw/core/bailout.fth
-
-\ GUI
-false value gui-safeboot?
-
-: 2tuck ( d1 d2 -- d2 d1 d2 ) 2swap 2over ;
-: user-ok "ok" ; \ This is supposed to check for authorization
-true value user-mode?
-
-fload ${BP}/ofw/gui/loadmenu.fth
-\ fload ${BP}/ofw/gui/insticon.fth
-
-\ Uninstall the diag menu from the general user interface vector
-\ so exiting from emacs doesn't invoke the diag menu.
-' quit to user-interface
-
: screen-#lines ( -- n )
screen-ih 0= if default-#lines exit then
screen-ih package( #lines )package
@@ -327,51 +148,6 @@
fload ${BP}/cpu/arm/saverom.fth \ Save the dictionary for standalone startup
-fload ${BP}/forth/lib/selstr.fth
-
-fload ${BP}/ofw/inet/loadtcp.fth
-
-support-package: http
- fload ${BP}/ofw/inet/http.fth \ HTTP client
-end-support-package
-
-[ifdef] notyet
-fload ${BP}/cpu/x86/pc/olpc/memtest.fth
-[then]
-
-[ifdef] notyet
-fload ${BP}/ofw/wifi/wifi-cfg.fth
-support-package: supplicant
-fload ${BP}/ofw/wifi/loadpkg.fth
-end-support-package
-
-: ofw-ssids ( -- $ ) " OFWSSID" ;
-' ofw-ssids to default-ssids
-[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"
-;
-' olpc-ntp-servers to ntp-servers
-: ntp-time&date ( -- s m h d m y )
- ntp-timestamp abort" Can't contact NTP server"
- ntp>time&date
-;
-: .clock ( -- )
- time&date .date space .time ." UTC" cr
-;
-: ntp-set-clock ( -- )
- ntp-time&date " set-time" clock-node @ $call-method
- .clock
-;
-
-[ifdef] use-ppp
-fload ${BP}/ofw/ppp/loadppp.fth
-[then]
-
-" dhcp" ' ip-address set-config-string-default
-
[ifdef] notyet
: c1-idle ( -- ) interrupts-enabled? if halt then ;
' c1-idle to stdin-idle
@@ -386,13 +162,19 @@
" //null" open-dev to null-ih \ For text-off state
;
-
+: keyboard-off ( -- )
+ keyboard-ih if
+ keyboard-ih remove-input
+ keyboard-ih close-dev
+ 0 to keyboard-ih
+ then
+;
: interpreter-init ( -- )
hex
warning on
only forth also definitions
-\ install-alarm
+ install-alarm
page-mode
#line off
@@ -478,14 +260,7 @@
quit
;
-\ This helps with TeraTerm, which sends ESC-O as the arrow key prefix
-also hidden also keys-forth definitions
-warning @ warning off
-: esc-o key lastchar ! [""] esc-[ do-command ;
-warning !
-previous previous definitions
-
-tag-file @ fclose tag-file off
+\ tag-file @ fclose tag-file off
.( --- Saving fw.dic ...)
" fw.dic" $save-forth cr
Added: cpu/arm/olpc/1.75/lcd.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/olpc/1.75/lcd.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -0,0 +1,30 @@
+
+: lcd@ ( offset -- l ) lcd-pa + l@ ;
+: lcd! ( l offset -- ) lcd-pa + l! ;
+
+: init-lcd ( -- )
+ \ Turn on clocks
+ h# 08 pmua-disp-clk-sel + h# d428284c l!
+ h# 09 pmua-disp-clk-sel + h# d428284c l!
+ h# 19 pmua-disp-clk-sel + h# d428284c l!
+ h# 1b pmua-disp-clk-sel + h# d428284c l!
+
+ 0 h# 190 lcd! \ Disable LCD DMA controller
+ fb-pa h# f4 lcd! \ Frame buffer area 0
+ 0 h# f8 lcd! \ Frame buffer area 1
+ hdisp bytes/pixel * h# fc lcd! \ Pitch in bytes
+
+ hdisp vdisp wljoin dup h# 104 lcd! dup h# 108 lcd! h# 118 lcd! \ size, size after zoom, disp
+
+ htotal >chunks vtotal wljoin h# 114 lcd! \ SPUT_V_H_TOTAL
+
+ htotal >chunks hdisp - hbp >chunks - 6 - ( low )
+ hbp >chunks wljoin h# 11c lcd!
+
+ vfp vbp wljoin h# 120 lcd!
+ h# 2000FF00 h# 194 lcd! \ DMA CTRL 1
+ h# 2000000d h# 1b8 lcd! \ Dumb panel controller - 18 bit RGB666 on LDD[17:0]
+ h# 01330133 h# 13c lcd! \ Panel VSYNC Pulse Pixel Edge Control
+ clkdiv h# 1a8 lcd! \ Clock divider
+ h# 00021100 h# 190 lcd! \ DMA CTRL 0 - enable DMA, 24 bpp mode
+;
Modified: cpu/arm/olpc/1.75/lcdcfg.fth
==============================================================================
--- cpu/arm/olpc/1.75/lcdcfg.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/olpc/1.75/lcdcfg.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -1,17 +1,20 @@
-d# 4 value hsync
-d# 1200 value hdisp
-d# 1456 value htotal .( HTOTAL ???) cr
-d# 212 value hbp
+h# 40001102 value clkdiv \ Display Clock 1 / 2 -> 56.93 MHz
+h# 00000700 value pmua-disp-clk-sel \ PLL1 / 7 -> 113.86 MHz
-d# 4 value vsync
-d# 800 value vdisp
-d# 845 value vtotal .( VTOTAL ???) cr
-d# 31 value vbp
+d# 8 value hsync \ Sync width
+d# 1200 value hdisp \ Display width
+d# 1256 value htotal \ Display + FP + Sync + BP
+d# 24 value hbp \ Back porch
-: hfp ( -- n ) htotal hdisp - hsync - hbp - ;
-: vfp ( -- n ) vtotal vdisp - vsync - vbp - ;
+d# 3 value vsync \ Sync width
+d# 900 value vdisp \ Display width
+d# 912 value vtotal \ Display + FP + Sync + BP
+d# 5 value vbp \ Back porch
-2 constant #lanes
+: hfp ( -- n ) htotal hdisp - hsync - hbp - ; \ 24
+: vfp ( -- n ) vtotal vdisp - vsync - vbp - ; \ 4
+
+3 constant #lanes
3 constant bytes/pixel
d# 24 constant bpp
Added: cpu/arm/olpc/1.75/prefw.bth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/olpc/1.75/prefw.bth Fri Oct 29 18:17:26 2010 (r1992)
@@ -0,0 +1,249 @@
+purpose: Build OFW Forth dictionary for OLPC XO-1.75
+\ See license at end of file
+
+dictionary: ${BP}/cpu/arm/build/basefw.dic
+command: &armforth &dictionary &this
+build-now
+
+" prefw.tag" r/w create-file drop tag-file !
+
+hex
+\ ' $report-name is include-hook
+' noop is include-hook
+
+fload ${BP}/cpu/arm/olpc/1.75/config.fth
+
+: headerless ; : headers ; : headerless0 ;
+
+' (quit) to quit
+
+: \Tags [compile] \ ; immediate
+: \NotTags [compile] \ ; immediate
+
+: RAMbase ( -- adr ) fw-virt-base ;
+: RAMtop ( -- adr ) RAMbase /fw-ram + ;
+
+def-load-base ' load-base set-config-int-default
+
+\ use-movable-vector-base \ Marvell CPU core has a movable vector base
+
+true ' fcode-debug? set-config-int-default
+\ false ' auto-boot? set-config-int-default
+
+
+
+[ifdef] serial-console
+" com1" ' output-device set-config-string-default
+" com1" ' input-device set-config-string-default
+[then]
+
+
+fload ${BP}/cpu/arm/mmp2/rootnode.fth \ Root node mapping - physical mode
+dev /
+ " olpc,XO-1.75" model
+ " Marvell,Armada 610" encode-string " architecture" property
+\ The clock frequency of the root bus may be irrelevant, since the bus is internal to the SOC
+\ d# 1,000,000,000 " clock-frequency" integer-property
+device-end
+
+: (cpu-arch ( -- adr len )
+ " architecture" ['] root-node get-package-property drop
+ get-encoded-string
+;
+' (cpu-arch to cpu-arch
+
+\ Memory management services
+[ifdef] virtual-mode
+fload ${BP}/ofw/core/clntmem1.fth \ client services for memory
+[else]
+fload ${BP}/ofw/core/clntphy1.fth \ client services for memory
+: >physical ( va -- pa )
+ dup fw-virt-base - fw-virt-size u< if ( va )
+ fw-virt-base - fw-pa +
+ 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
+
+fload ${BP}/cpu/arm/olpc/1.75/probemem.fth \ Memory probing
+
+stand-init: Probing memory
+ " probe" memory-node @ $call-method
+;
+
+[ifdef] virtual-mode
+fload ${BP}/cpu/arm/loadvmem.fth \ /mmu node
+stand-init: MMU
+ " /mmu" open-dev mmu-node !
+;
+fload ${BP}/ofw/core/initdict.fth \ Dynamic dictionary allocation
+fload ${BP}/arch/arm/loadarea.fth \ Allocate and map program load area
+[else]
+fload ${BP}/cpu/arm/mmp2/mmuon.fth
+[then]
+
+\ XXX should be elsewhere
+dev /client-services
+: chain ( len args entry size virt -- )
+ release ( len args entry )
+ h# 8000 alloc-mem h# 8000 + (init-program) ( len args )
+ to r1 to r2
+ go
+;
+device-end
+
+fload ${BP}/cpu/arm/crc32.fth \ Assembly language Zip CRC calculation
+fload ${BP}/forth/lib/crc32.fth \ High-level portion of CRC calculation
+
+[ifdef] resident-packages
+
+\needs unix-seconds> fload ${BP}/ofw/fs/unixtime.fth \ Unix time calculation
+support-package: ext2-file-system
+ fload ${BP}/ofw/fs/ext2fs/ext2fs.fth \ Linux file system
+end-support-package
+
+[ifdef] jffs2-support
+\needs unix-seconds> fload ${BP}/ofw/fs/unixtime.fth \ Unix time calculation
+support-package: jffs2-file-system
+ fload ${BP}/ofw/fs/jffs2/jffs2.fth \ Journaling flash file system 2
+end-support-package
+[then]
+
+support-package: zip-file-system
+ fload ${BP}/ofw/fs/zipfs.fth \ Zip file system
+end-support-package
+[then]
+
+fload ${BP}/ofw/core/osfile.fth \ For testing
+
+\ Load file format handlers
+
+: call32 ;
+
+fload ${BP}/ofw/core/allocsym.fth \ Allocate memory for symbol table
+fload ${BP}/ofw/core/symcif.fth
+fload ${BP}/ofw/core/symdebug.fth
+: release-load-area ( boundary-adr -- ) drop ;
+
+[ifdef] use-elf
+fload ${BP}/ofw/elf/elf.fth
+fload ${BP}/ofw/elf/elfdebug.fth
+[ifdef] virtual-mode
+\ Depends on the assumption that physical memory is mapped 1:1 already
+: (elf-map-in) ( va size -- ) 0 mem-claim drop ;
+[else]
+: (elf-map-in) ( va size -- ) 2drop ;
+[then]
+' (elf-map-in) is elf-map-in
+[then]
+
+\ Reboot and re-entry code
+fload ${BP}/ofw/core/reboot.fth \ Restart the client program
+fload ${BP}/ofw/core/reenter.fth \ Various entries into Forth
+
+headerless
+[ifdef] virtual-mode
+: (initial-heap) ( -- adr len ) sp0 @ ps-size - dict-limit tuck - ;
+[else]
+ \ : (initial-heap) ( -- adr len ) RAMtop heap-size ;
+: (initial-heap) ( -- adr len ) limit heap-size ;
+[then]
+' (initial-heap) is initial-heap
+headers
+
+" /openprom" find-device
+ " FirmWorks,3.0" encode-string " model" property
+device-end
+
+[ifdef] virtual-mode
+fload ${BP}/cpu/arm/mmusetup.fth \ Initial values for MMU lists
+[then]
+
+: background-rgb ( -- r g b ) h# ff h# ff h# ff ;
+
+fload ${BP}/forth/lib/selstr.fth
+
+fload ${BP}/ofw/inet/loadtcp.fth
+
+support-package: http
+ fload ${BP}/ofw/inet/http.fth \ HTTP client
+end-support-package
+
+[ifdef] notyet
+fload ${BP}/cpu/x86/pc/olpc/memtest.fth
+[then]
+
+[ifdef] notyet
+fload ${BP}/ofw/wifi/wifi-cfg.fth
+support-package: supplicant
+fload ${BP}/ofw/wifi/loadpkg.fth
+end-support-package
+
+: ofw-ssids ( -- $ ) " OFWSSID" ;
+' ofw-ssids to default-ssids
+[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"
+;
+' olpc-ntp-servers to ntp-servers
+: ntp-time&date ( -- s m h d m y )
+ ntp-timestamp abort" Can't contact NTP server"
+ ntp>time&date
+;
+: .clock ( -- )
+ time&date .date space .time ." UTC" cr
+;
+: ntp-set-clock ( -- )
+ ntp-time&date " set-time" clock-node @ $call-method
+ .clock
+;
+
+[ifdef] use-ppp
+fload ${BP}/ofw/ppp/loadppp.fth
+[then]
+
+" dhcp" ' ip-address set-config-string-default
+
+fload ${BP}/ofw/gui/bmptools.fth
+fload ${BP}/dev/null.fth
+fload ${BP}/ofw/core/bailout.fth
+
+true ' local-mac-address? set-config-int-default
+[ifdef] resident-packages
+support-package: nfs
+ fload ${BP}/ofw/fs/nfs/loadpkg.fth
+end-support-package
+
+[then]
+devalias nfs net//obp-tftp:last//nfs
+
+\ This helps with TeraTerm, which sends ESC-O as the arrow key prefix
+also hidden also keys-forth definitions
+warning @ warning off
+: esc-o key lastchar ! [""] esc-[ do-command ;
+warning !
+previous previous definitions
+
+\ GUI
+false value gui-safeboot?
+
+: 2tuck ( d1 d2 -- d2 d1 d2 ) 2swap 2over ;
+: user-ok "ok" ; \ This is supposed to check for authorization
+true value user-mode?
+
+fload ${BP}/ofw/gui/loadmenu.fth
+\ fload ${BP}/ofw/gui/insticon.fth
+
+\ Uninstall the diag menu from the general user interface vector
+\ so exiting from emacs doesn't invoke the diag menu.
+' quit to user-interface
+
+tag-file @ fclose tag-file off
+
+.( --- Saving prefw.dic ...)
+" prefw.dic" $save-forth cr
Modified: cpu/arm/olpc/1.75/probemem.fth
==============================================================================
--- cpu/arm/olpc/1.75/probemem.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/olpc/1.75/probemem.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -24,6 +24,7 @@
2drop " reg" property
\ Claim the memory used by OFW
+ fw-pa /fw-ram 0 claim drop
\ high h# 10.0000 - h# 10.0000 0 claim drop
;
Modified: cpu/arm/olpc/1.75/sp.bth
==============================================================================
--- cpu/arm/olpc/1.75/sp.bth Mon Oct 25 14:42:14 2010 (r1991)
+++ cpu/arm/olpc/1.75/sp.bth Fri Oct 29 18:17:26 2010 (r1992)
@@ -355,6 +355,60 @@
setreg d4282860 b8 \ NAND FLASH PLL1/8 + ECC PLL1/4, AXI clock enabled
setreg d4282860 bf \ plus ECC&controller&AXI released from reset
+ \ Read the SPI FLASH into DRAM
+
+ setreg d4035000 0010000f \ 32-bit, not enabled
+ setreg d4035000 0010008f \ 32-bit, enabled
+
+ setreg d401901c 00004000 \ Drive GPIO46 (SPI CS#) high
+
+ setreg d4019058 00004000 \ Set GPIO46 to output direction
+
+ setreg d401e10c 000000c0 \ GPIO mode for FRM
+ delay 10
+ setreg d4019028 00004000 \ Drive GPIO46 (SPI CS#) low
+
+ set r0,0xd4035000 \ Register base address
+ set r1,0x00100000 \ Remaining length
+ set r2,0x00000000 \ DRAM (and FLASH) address
+
+ orr r3,r2,#0x03000000 \ SPI FLASH command - read (3) with address in low bytes
+ str r3,[r0,#0x10] \ Put command in FIFO
+
+ mov r3,#0 \ Value to write (could be anything)
+ str r3,[r0,#0x10] \ Put dummy value in FIFO to force read
+
+ begin
+ ldr r5,[r0,#0x08] \ Read status
+ ands r5,#8 \ Test RxFIFO not empty bit
+ 0<> until
+ ldr r5,[r0,#0x10] \ Read (and discard) first FIFO entry
+
+ begin
+ str r3,[r0,#0x10] \ Put dummy value in FIFO to keep the read going
+
+ begin
+ ldr r5,[r0,#0x08] \ Read status
+ ands r5,#8 \ Test RxFIFO not empty bit
+ 0<> until
+ ldr r5,[r0,#0x10] \ Read FIFO entry
+
+ rev r5,r5 \ byte reverse because the FIFO is big-endian
+ str r5,[r2],#4 \ Write out
+
+ cmp r2,#0x100000
+ = until
+
+ \ Discard the extra entry just for cleanliness
+ begin
+ ldr r5,[r0,#0x08] \ Read status
+ ands r5,#8 \ Test RxFIFO not empty bit
+ 0<> until
+ ldr r5,[r0,#0x10] \ Read (and discard) first FIFO entry
+
+ setreg d401901c 00004000 \ Drive GPIO46 (SPI CS#) high
+
+
\ Finally, release the reset for the main CPU
set r0,0xd4050020
Added: dev/olpc/dcon/mmp2dcon.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/olpc/dcon/mmp2dcon.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -0,0 +1,212 @@
+\ See license at end of file
+\ " dcon" device-name
+
+\ DCON internal registers, accessed via I2C
+\ 0 constant DCON_ID
+\ 1 constant DCON_MODE
+\ 2 constant DCON_HRES
+\ 3 constant DCON_HTOTAL
+\ 4 constant DCON_HSYNC_WIDTH
+\ 5 constant DCON_VRES
+\ 6 constant DCON_VTOTAL
+\ 7 constant DCON_VSYNC_WIDTH
+\ 8 constant DCON_TIMEOUT
+\ 9 constant DCON_SCAN_INT
+\ d# 10 constant DCON_BRIGHT
+
+\ Mode register bits
+\ h# 1 constant DM_PASSTHRU
+\ h# 2 constant DM_SLEEP
+\ h# 4 constant DM_SLEEP_AUTO
+\ h# 8 constant DM_BL_ENABLE
+\ h# 10 constant DM_BLANK
+\ h# 20 constant DM_CSWIZZLE
+\ h# 40 constant DM_COL_AA
+\ h# 80 constant DM_MONO_LUMA
+\ h# 100 constant DM_SCAN_INT
+\ h# 200 constant DM_CLOCKDIV
+\ h# 4000 constant DM_DEBUG
+\ h# 8000 constant DM_SELFTEST
+
+: dcon-load ( -- ) d# 151 gpio-set ;
+: dcon-unload ( -- ) d# 151 gpio-clr ;
+\ : dcon-blnk? ( -- flag ) ; \ Not hooked up
+: dcon-stat@ ( -- n ) h# d4019100 l@ 4 rshift 3 and ;
+: dcon-irq? ( -- flag ) d# 124 gpio-pin@ 0= ;
+
+\ DCONSTAT values: 0 SCANINT 1 SCANINT_DCON 2 DISPLAYLOAD 3 MISSED
+
+1 value vga? \ VGA
+0 value color? \ COLOUR
+
+\ : gxfb! ( l offset -- ) gxfb-dc-regs + rl! ; \ Probably should be IO mapped
+
+d# 905 value resumeline \ Configurable; should be set from args
+
+: wait-output ( -- ) d# 40 ms ;
+
+: mark-time ( -- start-time ) get-msecs ;
+: delta-ms ( start-time -- elapsed-ms ) mark-time swap - ;
+: wait-dcon-mode ( -- retry? )
+ mark-time ( start-time )
+ begin ( start-time )
+ dcon-irq? if ( start-time )
+ dcon-stat@ 2 = if \ DCONSTAT=10 ( start-time )
+ \ Sometimes the DCON ack's the UNLOAD command sooner than it
+ \ should. When that happens, it doesn't really capture the
+ \ new frame data. The workaround is to detect the case and
+ \ retry the sequence.
+ delta-ms d# 20 < ( retry? )
+ exit
+ then ( start-time )
+ then ( start-time )
+ dup delta-ms d# 100 > ( start-time reached? ) \ 100 ms timeout
+ until ( start-time )
+ drop
+ ." Timeout entering DCON mode" cr
+ \ We say false here because we don't want to retry; it probably won't succeed
+ false
+;
+
+: set-source ( vga? -- ) \ true to unfreeze display, false to freeze it
+ dup vga? = if drop exit then ( source )
+ dup to vga? ( source )
+ if
+\ unblank-display
+ d# 50 ms
+ wait-output
+ dcon-load \ Put the DCON in VGA-refreshed mode
+ d# 25 ms \ Ensure that that DCON sees the DCONLOAD high
+\ display-on
+ else
+ begin ( )
+ dcon-unload \ Put the DCON in self-refresh mode
+ lock[ wait-dcon-mode ]unlock ( retry? )
+\ display-off ( retry? )
+ while ( )
+ \ We got a false ack from the DCON so start over from LOAD state
+ dcon-load d# 25 ms ( )
+ repeat ( )
+ then
+;
+
+\ gx_configure_tft(info);
+
+: try-dcon! ( w reg# -- )
+ ['] dcon! catch if 2drop smb-stop 1 ms smb-off 1 ms smb-on then
+;
+
+: mode@ ( -- mode ) 1 dcon@ ;
+: mode! ( mode -- ) 1 dcon! ;
+: hres! ( hres -- ) 2 dcon! ; \ def: h# 458 d# 1200
+: htotal! ( htotal -- ) 3 dcon! ; \ def: h# 4e8 d# 1256
+: hsync! ( sync -- ) 4 dcon! ; \ def: h# 1808 d# 24,8
+: vres! ( vres -- ) 5 dcon! ; \ def: h# 340 d# 900
+: vtotal! ( htotal -- ) 6 dcon! ; \ def: h# 390 d# 912
+: vsync! ( sync -- ) 7 dcon! ; \ def: h# 403 d# 4,3
+: timeout! ( to -- ) 8 dcon! ; \ def: h# ffff
+: scanint! ( si -- ) 9 dcon! ; \ def: h# 0000
+: bright! ( level -- ) d# 10 dcon! ; \ def: h# xxxF
+: bright@ ( -- level ) d# 10 dcon@ ;
+: brighter ( -- ) bright@ 1+ h# f min bright! ;
+: dimmer ( -- ) bright@ 1- 0 max bright! ;
+
+: backlight-off ( -- ) mode@ 8 invert and mode! ;
+: backlight-on ( -- ) mode@ 8 or mode! ;
+
+\ Color swizzle, AA, no passthrough, backlight
+: set-color ( color? -- )
+ dup to color?
+ if h# 69 else h# 89 then mode!
+;
+
+\ Setup so it can be called by execute-device-method
+: dcon-off ( -- ) smb-init h# 12 ['] mode! catch if drop then ;
+
+: dcon2? ( -- flag )
+ 0 ['] dcon@ catch if ( x )
+ drop smb-init ( )
+ 0 ['] dcon@ catch if drop false exit then
+ then
+ h# dc02 =
+;
+
+: dcon-setup ( -- )
+ 0 dcon@ drop 0 dcon@ drop
+
+[ifdef] notdef
+ d# 1200 2 dcon! \ HResolution
+ d# 1240 3 dcon! \ HTotal
+ h# 0608 4 dcon! \ HSyncstart (6+900=906), HSyncwidth (8)
+ d# 900 5 dcon! \ VResolution
+ d# 912 6 dcon! \ VTotal
+ h# 0502 7 dcon! \ VSyncstart (5+900=905), VSyncwidth (2)
+[then]
+
+ \ Switch to OLPC mode
+ h# c040 h# 3a dcon! \ SDRAM Setup/Hold time. Default of e040 fails
+ h# 0000 h# 41 dcon! \ Himax suggested this sequence (0 then 0101)
+
+ h# 0101 h# 41 dcon!
+ h# 0101 h# 42 dcon!
+
+ h# 12 mode!
+;
+: dcon-enable ( -- )
+ dcon-setup
+ true set-color
+ h# f bright!
+;
+
+: video-save
+ 0 set-source \ Freeze image
+\ olpc-lcd-off
+;
+
+: video-restore
+ smb-init
+\ olpc-lcd-mode
+
+\ gp-setup
+ 1 set-source \ Unfreeze image
+;
+
+0 value dcon-found?
+
+: maybe-set-cmos ( -- ) ;
+
+: init-xo-display ( -- )
+ smb-init
+
+\ olpc-lcd-mode
+
+ dcon-load
+ dcon-enable ( maybe-set-cmos )
+ \ dcon-enable leaves mode set to 69 - 40:antialias, 20:swizzle, 8:backlight on, 1:passthru off
+;
+
+\ ' init-xo-display to init-display
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2010 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Modified: dev/olpc/kb3700/spicmd.fth
==============================================================================
--- dev/olpc/kb3700/spicmd.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ dev/olpc/kb3700/spicmd.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -35,12 +35,31 @@
1 " #address-cells" integer-property
0 " #size-cells" integer-property
-3 /n* buffer: port-data
-: init-queue ( -- ) port-data 3 na+ bounds ?do -1 i ! /n +loop ;
-: enque ( data port# -- )
+: encode-unit ( phys -- adr len ) push-hex (u.) pop-base ;
+: decode-unit ( adr len -- phys ) push-hex $number if 0 then pop-base ;
+
+d# 155 constant cmd-gpio#
+d# 125 constant ack-gpio#
+
+\ Channel#(port#) Meaning
+\ 0 Invalid
+\ 1 Switch to Command Mode
+\ 2 Command response
+\ 3 Keyboard
+\ 4 Touchpad
+\ 5 Event
+\ 6 EC Debug
+
+5 constant #ports
+#ports /n* buffer: port-data
+: init-queue ( -- ) port-data #ports /n* bounds ?do -1 i ! /n +loop ;
+: enque ( data channel# -- )
+ 2- ( data queue# )
+ dup #ports >= if 2drop exit then
port-data swap na+ ! ( data adr )
;
-: deque? ( port# -- false | data true )
+: deque? ( channel# -- false | data true )
+ 2- ( queue# )
port-data swap na+ ( adr )
dup @ ( adr data )
dup -1 = if ( adr data )
@@ -70,54 +89,49 @@
enable
;
-: ssp1-clk-on 7 h# d4015050 l! 3 h# d4015050 l! ;
-: ssp2-clk-on 7 h# d4015054 l! 3 h# d4015052 l! ;
+\ : ssp1-clk-on 7 h# d4015050 l! 3 h# d4015050 l! ;
+\ : ssp2-clk-on 7 h# d4015054 l! 3 h# d4015052 l! ;
: ssp3-clk-on 7 h# d4015058 l! 3 h# d4015058 l! ;
-: ssp4-clk-on 7 h# d401505c l! 3 h# d401505c l! ;
+\ : ssp4-clk-on 7 h# d401505c l! 3 h# d401505c l! ;
-: wb ( byte -- ) ssp-ssdr rl! ;
-: rb ( -- byte ) ssp-ssdr rl@ . ;
+: wb ( byte -- ) ssp-ssdr rl! ; \ Debugging tool
+: rb ( -- byte ) ssp-ssdr rl@ . ; \ Debugging tool
\ Wait until the CSS (Clock Synchronization Status) bit is 0
: wait-clk-sync ( -- )
begin ssp-sssr rl@ h# 400.0000 and 0= until
;
-\ Choose alternate function 4 (SSP3) for the pins we use
-: select-ssp3-pins
- h# c4 h# d401e170 rl! \ GPIO74
- h# c4 h# d401e174 rl! \ GPIO75
- h# c4 h# d401e178 rl! \ GPIO76
- h# c4 h# d401e17c rl! \ GPIO77
-;
: init-ssp-in-slave-mode ( -- )
- select-ssp3-pins
ssp3-clk-on
h# 07 ssp-sscr0 rl! \ 8-bit data, SPI normal mode
- h# 1380.0010 ssp-sscr1 rl! \ SCFR=1, slave mode, Rx w/o Tx, early phase
+ h# 1300.0010 ssp-sscr1 rl! \ SCFR=1, slave mode, early phase
\ The enable bit must be set last, after all configuration is done
h# 87 ssp-sscr0 rl! \ Enable, 8-bit data, SPI normal mode
wait-clk-sync
;
-: set-ssp-receive-w/o-transmit ( -- )
- ssp-sscr1 rl@ h# 0080.0000 or ssp-sscr1 rl!
-;
-: clr-ssp-receive-w/o-transmit ( -- )
- ssp-sscr1 rl@ h# 0080.0000 invert and ssp-sscr1 rl!
-;
-0 value ssp-rx-threshold
+2 value ssp-rx-threshold
: set-ssp-fifo-threshold ( n -- ) to ssp-rx-threshold ;
-\ tx fifo trigger threshold?
: .ssr ssp-sssr rl@ . ;
-: ssp-ready? ( -- flag )
- ssp-sssr rl@ d# 12 rshift h# f and ssp-rx-threshold =
+: rxavail ( -- n )
+ ssp-sssr rl@ dup 8 and if ( val )
+ d# 12 rshift h# f and 1+
+ else
+ drop 0
+ then
+;
+: prime-fifo ( -- )
+ ssp-rx-threshold 0 ?do 0 ssp-ssdr l! loop
;
+: rxflush ( -- )
+ begin ssp-sssr rl@ 8 and while ssp-ssdr l@ drop repeat
+;
+: ssp-ready? ( -- flag ) rxavail ssp-rx-threshold >= ;
+false value debug?
\ Set the direction on the ACK and CMD GPIOs
-d# 151 constant cmd-gpio#
-d# 125 constant ack-gpio#
-: init-ec-spi-gpios ( -- )
+: init-gpios ( -- )
cmd-gpio# gpio-dir-out
ack-gpio# gpio-dir-out
;
@@ -125,21 +139,18 @@
: set-cmd ( -- ) cmd-gpio# gpio-set ;
: clr-ack ( -- ) ack-gpio# gpio-clr ;
: set-ack ( -- ) ack-gpio# gpio-set ;
-: fast-ack ( -- ) set-ack clr-ack ;
+: fast-ack ( -- ) set-ack clr-ack debug? if ." ACK " cr then ;
: slow-ack ( -- ) d# 10 ms set-ack d# 10 ms clr-ack ;
-defer pulse-ack ' slow-ack to pulse-ack \ FIXME !!!
-
-0 value ec-spi-cmd-done \ 0 - still waiting, 1 - successful send, 2 - timeout
+defer pulse-ack ' fast-ack to pulse-ack
-6 buffer: ec-cmdbuf
-d# 16 buffer: ec-respbuf
-: expected-response-length ( -- n ) ec-cmdbuf 1+ c@ h# f and ;
-
-: write-cmd-to-ssp-fifo ( -- )
- 6 0 do
- ec-cmdbuf i + c@ ssp-ssdr rl!
- loop
-;
+0 value cmdbuf
+0 value cmdlen
+0 value sticky?
+
+0 value databuf
+0 value datalen
+0 value datain?
+0 value command-finished?
0 value ec-cmd-time-limit
: ec-cmd-timeout? ( -- flag )
@@ -152,100 +163,124 @@
ec-cmd-time-limit 0= if 1 to ec-cmd-time-limit then \ Avoid reserved value
;
-defer ec-spi-state ' noop to ec-spi-state
+defer do-state ' noop to do-state
+defer upstream
-defer ec-spi-upstream
-: ec-spi-response ( -- )
- cancel-cmd-timeout
- expected-response-length 0 ?do
- ssp-ssdr rl@ ec-respbuf i + c!
- loop
- 1 to ec-spi-cmd-done
+: enter-upstream-state ( -- )
2 set-ssp-fifo-threshold
- clr-cmd
- ['] ec-spi-upstream to ec-spi-state
+ ['] upstream to do-state
+;
+: command-done ( -- )
+ cancel-cmd-timeout
+ true to command-finished?
+ sticky? 0= if
+ enter-upstream-state
+ prime-fifo
+ pulse-ack
+ then
+ \ In sticky mode, we hold off on pulsing ACK until we have the
+ \ next command to send.
;
-: ec-spi-switched ( -- )
- set-ssp-receive-w/o-transmit
- expected-response-length if
- expected-response-length set-ssp-fifo-threshold
- ['] ec-spi-response to ec-spi-state
+
+\ Discard 'len' bytes from the Rx FIFO. Used after a send
+\ operation to get rid of the bytes that were received as
+\ a side effect.
+: clean-fifo ( len -- ) 0 ?do ssp-ssdr rl@ drop loop ;
+
+: response ( -- )
+ datalen if
+ \ XXX switch to 64-byte mode if necessary
+ datain? if
+ debug? if ." Data from EC: " then
+ datalen 0 ?do
+ ssp-ssdr rl@
+ debug? if dup . then
+ databuf i + c!
+ loop
+ else
+ \ Unload the spurious (result of sending data) rx bytes from the FIFO
+ datalen clean-fifo
+ then
+ debug? if cr then
+ then
+ command-done
+;
+: switched ( -- )
+ \ Unload the spurious (result of sending command) rx bytes from the FIFO
+ cmdlen clean-fifo
+ datalen if
+ datalen set-ssp-fifo-threshold
+ ['] response to do-state
+ \ XXX switch to 64-byte mode if necessary
+ datain? if
+ prime-fifo
+ else
+ debug? if ." Data to EC: " then
+ datalen 0 ?do
+ databuf i + c@
+ debug? if dup . then
+ ssp-ssdr rl!
+ loop
+ then
+ pulse-ack
else
- ec-spi-response
+ command-done
then
;
-: (ec-spi-upstream) ( -- )
- ssp-ssdr rl@ ssp-ssdr rl@ ( channel# data )
- over 3 = if \ Switched ( channel# data )
- 2drop ( )
- write-cmd-to-ssp-fifo ( )
- clr-ssp-receive-w/o-transmit ( )
- ['] ec-spi-switched to ec-spi-state ( )
- else ( channel# data )
- swap enque ( )
- then
-;
-' (ec-spi-upstream) to ec-spi-upstream
-: init-ec-spi ( -- )
- init-ec-spi-gpios
+: handoff-command ( -- )
+ debug? if ." CMD: " then
+ cmdlen 0 do
+ cmdbuf i + c@
+ debug? if dup . then
+ ssp-ssdr rl!
+ loop
+ debug? if cr then
+ cmdlen set-ssp-fifo-threshold
+ sticky? 0= if clr-cmd then
+ ['] switched to do-state ( )
+ pulse-ack
+;
+: (upstream) ( -- )
+ ssp-ssdr rl@ ssp-ssdr rl@ ( channel# data )
+ debug? if
+ ." UP: " over . dup . cr
+ then
+ over case ( channel# data )
+ 0 of 2drop prime-fifo pulse-ack endof ( channel# data ) \ Invalid
+ 1 of 2drop handoff-command endof ( channel# data ) \ Switched
+ ( default ) ( channel# data channel# )
+ enque prime-fifo pulse-ack ( channel# )
+ endcase
+;
+' (upstream) to upstream
+: init ( -- )
+ init-gpios
init-ssp-in-slave-mode
- set-ssp-receive-w/o-transmit
+ rxflush
+ init-queue
clr-cmd
+ prime-fifo
clr-ack \ Tell EC that it is okay to send
- ['] ec-spi-upstream to ec-spi-state
+ enter-upstream-state
;
-: ec-spi-handle-message ( -- )
- ec-spi-state
- pulse-ack
+: poll ( -- )
+ ssp-ready? if do-state then
+ debug? if key? if key drop debug-me then then
;
-: poll-ec-spi ( -- )
- ssp-ready? if
- exit
- then
- ec-cmd-timeout? if
- clr-cmd
- cancel-cmd-timeout
- 2 to ec-spi-cmd-done \ Timeout
- ['] ec-spi-upstream to ec-spi-state
- exit
- then
- ec-spi-handle-message
-;
-
-: ec-command ( [ args ] #args #results cmd-code -- [ results ] error? )
- ec-cmdbuf 6 erase ( [ args ] #args #results cmd-code )
- ec-cmdbuf c! ( [ args ] #args #results )
- over 4 lshift or ( [ args ] #args #args|#results )
- ec-cmdbuf 1+ c! ( [ args ] #args )
- dup 4 > abort" Too many EC command arguments"
- 0 ?do ( ... arg )
- ec-cmdbuf 2+ i + c! ( ... )
- loop ( )
-
- set-cmd-timeout
- set-cmd
-
- 0 to ec-spi-cmd-done
- begin
- poll-ec-spi
- ec-spi-cmd-done
- until
-
- ec-spi-cmd-done 2 = if true exit then
-
- ec-cmdbuf 1+ c@ 0 ?do \ XXX maybe this loop should go backwards?
- ec-respbuf i + c@
- loop
- false
+: cancel-command ( -- ) \ Called when the command child times out
+ clr-cmd
+ ['] upstream to do-state
+ prime-fifo
+ pulse-ack
;
0 instance value port#
: set-port ( port# -- ) to port# ;
-: put-data ( byte -- ) port# 2 0 d# 99 ec-command ; \ XXX
+\ : put-data ( byte -- ) port# 2 0 d# 99 ec-command ; \ XXX
: get-data? ( -- false | data true )
port# deque? ( false | data true )
- poll-ec-spi
+ poll
;
: get-data ( -- data | -1 ) \ Wait for data from our device
d# 1000 0 do
@@ -254,7 +289,7 @@
loop
true \ abort" Timeout waiting for data from device"
;
-: put-get-data ( cmd -- data | -1 ) put-data get-data ;
+\ : put-get-data ( cmd -- data | -1 ) put-data get-data ;
\ Wait until the device stops sending data
: clear-out-buf ( -- ) begin d# 120 ms get-data? while drop repeat ;
@@ -263,17 +298,182 @@
open-count 0= if
my-address my-space h# 1000 " map-in" $call-parent is ssp-base
\ setup-pin-mux
- init-ec-spi
+ init
then
open-count 1+ to open-count
true
;
: close ( -- )
open-count 1 = if
- ssp-base h# 1000 " map-in" $call-parent 0 is ssp-base
+ ssp-base h# 1000 " map-out" $call-parent 0 is ssp-base
then
open-count 1- 0 max to open-count
;
+
+: data-command ( databuf datalen datain? cmdadr cmdlen more? -- )
+ to sticky? to cmdlen to cmdbuf
+ to datain? to datalen to databuf
+ false to command-finished?
+
+ ['] do-state behavior ['] upstream = if
+ set-cmd-timeout
+ set-cmd
+ else
+ handoff-command
+ then
+ begin poll command-finished? until
+;
+
+: no-data-command ( adr len sticky? -- )
+ >r >r >r 0 0 0 r> r> r> data-command
+;
+
+new-device
+" " " 2" set-args
+" eccmd" name
+my-space " reg" integer-property
+: open ( -- flag )
+ my-unit " set-port" $call-parent
+ true
+;
+: close ( -- )
+;
+8 buffer: ec-cmdbuf
+d# 16 buffer: ec-respbuf
+: expected-response-length ( -- n ) ec-cmdbuf 1+ c@ h# f and ;
+
+0 value #results
+: set-cmdbuf ( [ args ] #args #results cmd-code slen -- )
+ >r ( [ args ] #args #results cmd-code r: slen )
+ ec-cmdbuf 8 erase ( [ args ] #args #results cmd-code )
+ ec-cmdbuf c! ( [ args ] #args #results )
+ to #results ( [ args ] #args )
+ dup ec-cmdbuf 1+ c! ( [ args ] #args r: slen )
+ r> ec-cmdbuf 2+ c! ( [ args ] #args r: )
+ h# f and ( [ args ] #args' )
+ dup 5 > abort" Too many EC command arguments"
+ ec-cmdbuf 3 + swap bounds ?do i c! loop ( )
+;
+: get-results ( -- [ results ] )
+ ec-respbuf #results bounds ?do
+ begin " get-data?" $call-parent until ( byte )
+ i c!
+ loop
+
+ #results 0 ?do \ XXX maybe this loop should go backwards?
+ ec-respbuf i + c@
+ loop
+;
+: ec-command ( [ args ] #args #results cmd-code -- [ results ] error? )
+ 0 set-cmdbuf
+
+ ec-cmdbuf 8 false " no-data-command" $call-parent
+
+ get-results
+ false
+;
+: enter-updater ( -- )
+ 0 0 h# 50 1 set-cmdbuf
+
+ ec-respbuf 1 true ec-cmdbuf 8 true " data-command" $call-parent
+;
+
+create pgm-cmd h# 51 c, h# 84 c, d# 16 c, h# 02 c, h# 00 c, 0 c, 0 c, 0 c,
+create read-cmd h# 51 c, h# 04 c, d# 16 c, h# 03 c, h# 00 c, 0 c, 0 c, 0 c,
+create rdstat-cmd h# 51 c, h# 01 c, d# 01 c, h# 05 c, h# 80 c, 0 c, 0 c, 0 c,
+create wena-cmd h# 51 c, h# 01 c, d# 00 c, h# 06 c, h# 80 c, 0 c, 0 c, 0 c,
+create erase-cmd h# 51 c, h# 01 c, d# 00 c, h# 60 c, h# 80 c, 0 c, 0 c, 0 c,
+
+: set-offset&len ( offset len template -- )
+ >r ( offset len r: template )
+ r@ 2+ c! ( offset r: template )
+ lbsplit drop ( low mid hi r: template )
+ r@ 4 + c! r@ 5 + c! r> 6 + c!
+;
+: flash-command ( datadr datlen in? template -- )
+ 8 true " data-command" $call-parent
+;
+: write-flash-chunk ( adr len offset -- ) \ len limited to 16 bytes for now
+ over pgm-cmd set-offset&len ( adr len )
+ false pgm-cmd flash-command ( )
+;
+: read-flash-chunk ( adr len offset -- )
+ over read-cmd set-offset&len
+ true read-cmd flash-command ( )
+;
+: read-flash-status ( -- stat )
+ ec-respbuf 1 true rdstat-cmd flash-command
+ ec-respbuf c@
+;
+: write-enable-flash ( -- )
+ 0 0 false wena-cmd flash-command
+;
+: erase-flash-all ( -- )
+ 0 0 false erase-cmd flash-command
+;
+: read-flash ( adr len offset -- )
+ swap bounds ?do ( adr )
+ i . (cr ( adr )
+ dup h# 10 i read-flash-chunk ( adr )
+ h# 10 + ( adr' )
+ h# 10 +loop ( adr )
+ drop ( )
+;
+: wait-write-enabled ( -- )
+ write-enable-flash ( adr )
+ begin read-flash-status 2 and until
+;
+: wait-write-done ( -- )
+ begin read-flash-status 1 and 0= until
+;
+
+: erase-flash ( -- )
+ wait-write-enabled
+ erase-flash-all
+ wait-write-done
+;
+
+: write-flash ( adr len offset -- )
+ swap bounds ?do ( adr )
+ i . (cr ( adr )
+ wait-write-enabled
+ dup h# 10 i write-flash-chunk ( adr )
+ wait-write-done ( adr )
+ h# 10 + ( adr' )
+ h# 10 +loop ( adr )
+ drop ( )
+;
+h# 6000 value flash-size
+: get-flash ( -- )
+ load-base flash-size 0 read-flash
+;
+: put-flash ( -- )
+ ." Erasing" cr
+ erase-flash
+ ." Writing" cr
+ load-base flash-size 0 write-flash
+;
+: help ( -- )
+ ." enter-updater" cr
+ ." h# 8000 to flash-size ( default is 6000)" cr
+ ." get-flash" cr
+ ." load-base 100 ldump" cr
+ ." put-flash" cr
+;
+
+finish-device
+
+new-device
+ " " " 3" set-args
+ fload ${BP}/dev/pckbd.fth
+finish-device
+
+new-device
+ " " " 4" set-args
+ fload ${BP}/dev/ps2mouse.fth
+finish-device
+
+
end-package
\ LICENSE_BEGIN
Added: dev/olpc/mmp2camera/ccic.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/olpc/mmp2camera/ccic.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -0,0 +1,301 @@
+\ ========================== video capture operations ==========================
+
+d# 640 constant VGA_WIDTH
+d# 480 constant VGA_HEIGHT
+
+VGA_WIDTH VGA_HEIGHT * 2* constant /dma-buf
+3 constant #dma-bufs
+0 value dma-bufs
+0 value dma-bufs-phys
+0 value next-buf
+
+: 'dma-buf ( i -- virt ) /dma-buf * dma-bufs + ;
+: 'dma-buf-phys ( i -- phys ) /dma-buf * dma-bufs-phys + ;
+
+: alloc-dma-bufs ( -- )
+ dma-bufs 0= if
+ /dma-buf #dma-bufs * alloc-capture-buffer to dma-bufs-phys to dma-bufs
+ then
+;
+: free-dma-bufs ( -- )
+ dma-bufs dma-bufs-phys /dma-buf #dma-bufs * " free-capture-buffer" $call-parent
+ 0 to dma-bufs 0 to dma-bufs-phys
+;
+
+: setup-dma ( -- )
+ h# 0440.003c h# 40 cl! \ posted writes, 3 buffers, 256 byte burst, reserved field
+
+ 0 'dma-buf-phys h# 00 cl!
+ 1 'dma-buf-phys h# 04 cl!
+ 2 'dma-buf-phys h# 08 cl!
+;
+
+\ c000.0000 = 0000.0000 for HSYNC/VSYNC format
+\ 0400.0000 for falling vclk
+\ 0200.0000 for VSYNC active low
+\ 0100.0000 for HSYNC active low
+\ 0080.0000 for VSYNC falling edge
+h# 0000.0000 constant polarities
+h# 20 constant rgb-sensor
+h# 080 constant rgb-fb
+h# 00 constant rgb-endian \ 0c bits
+
+\ VGA RGB565
+: setup-image ( -- )
+ VGA_WIDTH 2* h# 24 cl! \ 640*2 stride, UV stride in high bits = 0
+
+ VGA_WIDTH 2* VGA_HEIGHT wljoin h# 34 cl! \ Image size register
+ 0 0 wljoin h# 38 cl! \ Image offset
+
+ polarities rgb-fb or rgb-sensor or rgb-endian or h# 3c cl! \ CTRL0
+;
+
+: interrupts-off ( -- ) 0 h# 2c cl! h# ffffffff h# 30 cl! ;
+: interrupts-on ( -- ) 7 h# 2c cl! h# ffffffff h# 30 cl! ;
+
+: ctlr-config ( -- )
+
+ interrupts-off
+ setup-dma
+ setup-image
+;
+
+: ctlr-start ( -- ) h# 3c dup cl@ 1 or swap cl! ; \ Enable
+: ctlr-stop ( -- ) h# 3c dup cl@ 1 invert and swap cl! ; \ Disable
+
+: read-setup ( -- )
+ camera-config
+ ctlr-config
+ \ Clear all interrupts
+ interrupts-on \ Enable frame done interrupts
+ ctlr-start
+ 0 to next-buf
+;
+
+: power-on ( -- )
+ \ Enable clocks
+ h# 3f h# d4282828 l! \ Clock gating - AHB, Internal PIXCLK, AXI clock always on
+ h# 0003.805b h# d4282850 l! \ PMUA clock config for CCIC - /1, PLL1/16, AXI arb, AXI, perip on
+
+\ h# 0000.0002 h# 88 cl! \ Clock select - PIXMCLK, 797/2 (PLL1/16) / 2 -> 24.9 MHz
+\ h# 4000.0002 h# 88 cl! \ Clock select - AXI, 797/2 (PLL1/16) / 2 -> 24.9 MHz
+ h# 6000.0002 h# 88 cl! \ Clock select - core, 797/2 (PLL1/16) / 2 -> 24.9 MHz
+
+ sensor-power-on 1 ms
+ h# 40 cl@ h# 1000.0000 invert and h# 40 cl! \ Enable pads
+
+ reset-sensor
+ 1 ms
+;
+
+: power-off ( -- )
+ reset-sensor
+ h# 40 cl@ h# 1000.0000 or h# 40 cl! \ Disable pads
+ sensor-power-off
+;
+
+: init ( -- )
+ power-on
+ ov-smb-setup smb-on
+ camera-init
+;
+
+
+\ ============================= read operation ==============================
+
+0 value buf-act
+: /string ( adr len n -- adr' len' ) tuck - -rot + swap ;
+: buf-done? ( -- false | buf-adr true )
+ h# 30 cl@ dup 1 next-buf lshift and if ( value )
+ h# 30 cl! ( )
+ next-buf 'dma-buf ( buf-adr )
+ true ( buf-adr true )
+ else ( value )
+ drop false ( false )
+ then
+;
+
+
+: snap ( timeout -- true | adr false )
+ 0 do
+ buf-done? if ( buf-adr )
+ false unloop exit ( -- buf-adr false )
+ then
+ 1 ms
+ loop
+ true
+;
+
+external
+
+: read ( adr len -- actual )
+ buf-done? if ( adr len buf-adr )
+ -rot /dma-buf min ( buf-adr adr actual )
+ dup >r move r> ( actual )
+ else
+ 2drop 0
+ then
+;
+
+: open ( -- flag )
+ init
+ ov7670-detected? 0= if false exit then
+ alloc-dma-bufs
+ read-setup
+ true
+;
+
+: close ( -- )
+ ctlr-stop
+ interrupts-off
+ power-off
+ free-dma-bufs
+;
+
+
+\ ============================= selftest operation ===========================
+
+d# 5,000 constant movie-time
+0 constant test-x
+0 constant test-y
+
+\ Thanks to Cortland Setlow (AKA Blaketh) for the autobrightness code
+\ and the full-screen + mirrored display.
+
+: autobright ( -- )
+ read-agc 3 + 3 rshift h# f min " bright!" $call-screen
+;
+: full-brightness ( -- ) h# f " bright!" $call-screen ;
+
+code copy16>24-line ( src-adr dst-adr #pixels -- )
+ mov r2,tos \ #pixels in r2
+ ldmia sp!,{r0,r1,tos} \ r0: src, r1: dst, r2: #pixels
+ begin
+ ldrh r3,[r1]
+ inc r1,2
+
+ mov r4,r3,lsr #8
+ and r4,r4,#0xf8
+ strb r4,[r0],#1
+
+ mov r4,r3,lsr #3
+ and r4,r4,#0xfc
+ strb r4,[r0],#1
+
+ mov r4,r3,lsl #3
+ and r4,r4,#0xf8
+ strb r4,[r0],#1
+
+ decs r2,1
+ 0= until
+c;
+
+VGA_WIDTH value rect-w
+VGA_HEIGHT value rect-h
+
+d# 1200 3 * value dst-pitch
+d# 1200 VGA_WIDTH - 2/ value dst-x
+d# 800 VGA_HEIGHT - 2/ value dst-y
+
+: >dst-adr ( adr -- adr' ) dst-y dst-pitch * dst-x + 3 * + ;
+
+VGA_WIDTH 2* value src-pitch
+
+: copy16>24 ( src-adr dst-base -- )
+ >dst-adr ( src-adr dst-adr )
+ rect-h 0 ?do ( src-adr dst-adr )
+ 2dup rect-w copy16>24-line ( scr-adr dst-adr )
+ swap src-pitch + swap dst-pitch + ( scr-adr' dst-adr' )
+ loop ( src-adr dst-adr )
+ 2drop ( )
+;
+
+: display-frame ( adr -- )
+ fb-pa copy16>24
+\ autobright
+;
+
+: timeout-read ( adr len timeout -- actual )
+ >r 0 -rot r> 0 ?do ( actual adr len )
+ 2dup read ?dup if 3 roll drop -rot leave then
+ 1 ms
+ loop 2drop
+;
+
+: shoot-still ( -- error? )
+ d# 1000 snap if true exit then ( adr )
+ display-frame
+ false
+;
+
+: shoot-movie ( -- error? )
+ get-msecs movie-time + ( timeout )
+ begin ( timeout )
+ shoot-still if drop true exit then ( timeout )
+ dup get-msecs - 0<= ( timeout reached )
+ until ( timeout )
+ drop false
+;
+
+: mirrored ( -- ) h# 1e ov@ h# 20 or h# 1e ov! ;
+: unmirrored ( -- ) h# 1e ov@ h# 20 invert and h# 1e ov! ;
+
+: selftest ( -- error? )
+ open 0= if true exit then
+ d# 300 ms
+ unmirrored shoot-still ?dup if close exit then ( error? )
+ d# 1,000 ms
+ mirrored shoot-movie full-brightness ( error? )
+ close ( error? )
+ ?dup 0= if confirm-selftest? then ( error? )
+;
+
+: dump-regs ( run# -- )
+ 0 d# 16 " at-xy" eval
+ ." Pass " .d
+ key upc h# 47 = if ." Good" else ." Bad" then cr \ 47 is G
+
+ ." 0 1 2 3 4 5 6 7 8 9 a b c d e f" cr
+ ." -----------------------------------------------" cr
+ h# ca 0 do
+ i 2 u.r ." : "
+ i h# 10 bounds do
+ i h# ca < if i ov@ 3 u.r then
+ loop
+ cr
+ h# 10 +loop
+;
+
+: xselftest ( -- error? )
+ open 0= if true exit then
+
+ h# 10 0 do
+ shoot-still drop d# 500 ms camera-config config-check
+ i dump-regs
+ loop
+ 0 close ( error? )
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2010 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/olpc/mmp2camera/loadpkg.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/olpc/mmp2camera/loadpkg.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -0,0 +1,31 @@
+" " " d420a000" " /" begin-package
+ " camera" device-name
+ 0 0 reg \ A reg property makes "test-all" consider this device
+
+0 [if]
+ : alloc-capture-buffer ( len -- vadr padr )
+ \ XXX need map-in if we should use virtual mode
+ dup " dma-alloc" $call-parent ( len vadr )
+ tuck swap ( vadr vadr len )
+ false " dma-map-in" $call-parent ( vadr padr )
+ ;
+ : free-capture-buffer ( vadr padr len -- )
+ 3dup " dma-map-out" $call-parent ( vadr padr len )
+ nip " dma-free" $call-parent
+ ;
+[else]
+ : alloc-capture-buffer ( len -- vadr padr )
+ drop load-base dup
+ ;
+ : free-capture-buffer ( vadr padr len -- )
+ 3drop
+ ;
+[then]
+
+ fload ${BP}/dev/olpc/mmp2camera/smbus.fth
+ fload ${BP}/dev/olpc/mmp2camera/platform.fth
+ fload ${BP}/dev/olpc/mmp2camera/ov.fth
+ fload ${BP}/dev/olpc/mmp2camera/ccic.fth
+end-package
+
+
Added: dev/olpc/mmp2camera/ov.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/olpc/mmp2camera/ov.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -0,0 +1,261 @@
+\ ======================= OV7670 SMBUS operations ==========================
+
+: ov@ ( reg -- data ) ov-smb-setup smb-byte@ ;
+: ov! ( data reg -- ) ov-smb-setup smb-byte! ;
+
+: ovc ( val adr -- )
+ 2dup ov@ ( val reg# val actual )
+ tuck <> if ( val reg# actual )
+ ." Bad camera I2C value at " swap 2 u.r ( val actual )
+ ." expected " swap 2 u.r ." got " 2 u.r cr ( )
+ else ( val reg# actual )
+ 3drop ( )
+ then ( )
+;
+
+\ ============================= camera operations =============================
+
+false value ov7670-detected?
+
+: ((camera-init) ( -- )
+ 80 12 ov! 2 ms \ reset (reads back different)
+ 01 11 ov! \ 30 fps
+ 04 3a ov! \ UYVY or VYUY
+ 00 12 ov! \ VGA
+
+ \ Hardware window
+ 13 17 ov! \ Horiz start high bits
+ 01 18 ov! \ Horiz stop high bits
+ b6 32 ov! \ HREF pieces
+ 0a 19 ov! \ Vert start high bits
+ 7a 1a ov! \ Vert stop high bits
+ 0a 03 ov! \ GAIN, VSTART, VSTOP pieces
+
+ \ Mystery scaling numbers
+ 00 0c ov! \ Control 3
+ 00 3e ov! \ Control 14
+ 3a 70 ov! 35 71 ov! 11 72 ov! f0 73 ov!
+ 02 a2 ov!
+ 00 15 ov! \ Control 10
+
+ \ Gamma curve values
+ 20 7a ov! 10 7b ov! 1e 7c ov! 35 7d ov!
+ 5a 7e ov! 69 7f ov! 76 80 ov! 80 81 ov!
+ 88 82 ov! 8f 83 ov! 96 84 ov! a3 85 ov!
+ af 86 ov! c4 87 ov! d7 88 ov! e8 89 ov!
+
+ \ AGC and AEC parameters
+ e0 13 ov! \ Control 8
+ 00 00 ov! \ Gain lower 8 bits
+ 40 0d ov! \ Control 4 magic reserved bit
+ 18 14 ov! \ Control 9: 4x gain + magic reserved bit
+ 05 a5 ov! \ 50hz banding step limit
+ 07 ab ov! \ 60hz banding step limit
+ 95 24 ov! \ AGC upper limit
+ 33 25 ov! \ AGC lower limit
+ e3 24 ov! \ AGC/AEC fast mode op region
+ 78 9f ov! \ Hist AEC/AGC control 1
+ 68 a0 ov! \ Hist AEC/AGC control 2
+ 03 a1 ov! \ Magic
+ d8 a6 ov! \ Hist AEC/AGC control 3
+ d8 a7 ov! \ Hist AEC/AGC control 4
+ f0 a8 ov! \ Hist AEC/AGC control 5
+ 90 a9 ov! \ Hist AEC/AGC control 6
+ 94 aa ov! \ Hist AEC/AGC control 7
+ e5 13 ov! \ Control 8
+
+ \ Mostly magic
+ 61 0e ov! 4b 0f ov! 02 16 ov! 07 1e ov!
+ 02 21 ov! 91 22 ov! 07 29 ov! 0b 33 ov!
+ 0b 35 ov! 1d 37 ov! 71 38 ov! 2a 39 ov!
+ 78 3c ov! 40 4d ov! 20 4e ov! 00 69 ov!
+ 4a 6b ov! 10 74 ov! 4f 8d ov! 00 8e ov!
+ 00 8f ov! 00 90 ov! 00 91 ov! 00 96 ov!
+ 00 9a ov! 84 b0 ov! 0c b1 ov! 0e b2 ov!
+ 82 b3 ov! 0a b8 ov!
+
+ \ More magic, some of which tweaks white balance
+ 0a 43 ov! f0 44 ov! 34 45 ov! 58 46 ov!
+ 28 47 ov! 3a 48 ov! 88 59 ov! 88 5a ov!
+ 44 5b ov! 67 5c ov! 49 5d ov! 0e 5e ov!
+ 0a 6c ov! 55 6d ov! 11 6e ov!
+ 9f 6f ov! \ 9e for advance AWB
+ 40 6a ov!
+ 40 01 ov! \ Blue gain
+ 60 02 ov! \ Red gain
+ e7 13 ov! \ Control 8
+
+ \ Matrix coefficients
+ 80 4f ov! 80 50 ov! 00 51 ov! 22 52 ov!
+ 5e 53 ov! 80 54 ov! 9e 58 ov!
+
+ 08 41 ov! \ AWB gain enable
+ 00 3f ov! \ Edge enhancement factor
+ 05 75 ov! e1 76 ov! 00 4c ov! 01 77 ov!
+ c3 3d ov! \ Control 13
+ 09 4b ov! 60 c9 ov! \ Reads back differently
+ 38 41 ov! \ Control 16
+ 40 56 ov!
+
+ 11 34 ov!
+ 12 3b ov! \ Control 11
+ 88 a4 ov! 00 96 ov! 30 97 ov! 20 98 ov!
+ 30 99 ov! 84 9a ov! 29 9b ov! 03 9c ov!
+ 5c 9d ov! 3f 9e ov! 04 78 ov!
+
+ \ Extra-weird stuff. Some sort of multiplexor register
+ 01 79 ov! f0 c8 ov!
+ 0f 79 ov! 00 c8 ov!
+ 10 79 ov! 7e c8 ov!
+ 0a 79 ov! 80 c8 ov!
+ 0b 79 ov! 01 c8 ov!
+ 0c 79 ov! 0f c8 ov!
+ 0d 79 ov! 20 c8 ov!
+ 09 79 ov! 80 c8 ov!
+ 02 79 ov! c0 c8 ov!
+ 03 79 ov! 40 c8 ov!
+ 05 79 ov! 30 c8 ov!
+ 26 79 ov!
+
+ \ OVT says that rewrite this works around a bug in 565 mode.
+ \ The symptom of the bug is red and green speckles in the image.
+ 01 11 ov! \ 30 fps def 80
+;
+
+: config-check ( -- )
+ 01 11 ovc \ 30 fps
+ 04 3a ovc \ UYVY or VYUY
+ ( 00 12 ovc ) \ VGA
+
+ \ Hardware window
+ 13 17 ovc \ Horiz start high bits
+ 01 18 ovc \ Horiz stop high bits
+ b6 32 ovc \ HREF pieces
+ ( 0a 19 ovc ) \ Vert start high bits
+ 7a 1a ovc \ Vert stop high bits
+ 0a 03 ovc \ GAIN, VSTART, VSTOP pieces
+
+ \ Mystery scaling numbers
+ 00 0c ovc \ Control 3
+ 00 3e ovc \ Control 14
+ 3a 70 ovc 35 71 ovc 11 72 ovc f0 73 ovc
+ 02 a2 ovc
+ 00 15 ovc \ Control 10
+
+ \ Gamma curve values
+ 20 7a ovc 10 7b ovc 1e 7c ovc 35 7d ovc
+ 5a 7e ovc 69 7f ovc 76 80 ovc 80 81 ovc
+ 88 82 ovc 8f 83 ovc 96 84 ovc a3 85 ovc
+ af 86 ovc c4 87 ovc d7 88 ovc e8 89 ovc
+
+ \ AGC and AEC parameters
+ ( e0 13 ovc ) \ Control 8
+ ( 00 00 ovc ) \ Gain lower 8 bits
+ 40 0d ovc \ Control 4 magic reserved bit
+ ( 18 14 ovc ) \ Control 9: 4x gain + magic reserved bit
+ 05 a5 ovc \ 50hz banding step limit
+ 07 ab ovc \ 60hz banding step limit
+ ( 95 24 ovc ) \ AGC upper limit
+ 33 25 ovc \ AGC lower limit
+ e3 24 ovc \ AGC/AEC fast mode op region
+ 78 9f ovc \ Hist AEC/AGC control 1
+ 68 a0 ovc \ Hist AEC/AGC control 2
+ 03 a1 ovc \ Magic
+ d8 a6 ovc \ Hist AEC/AGC control 3
+ d8 a7 ovc \ Hist AEC/AGC control 4
+ f0 a8 ovc \ Hist AEC/AGC control 5
+ 90 a9 ovc \ Hist AEC/AGC control 6
+ 94 aa ovc \ Hist AEC/AGC control 7
+ ( e5 13 ovc ) \ Control 8
+
+ \ Mostly magic
+ 61 0e ovc 4b 0f ovc 02 16 ovc 07 1e ovc
+ 02 21 ovc 91 22 ovc 07 29 ovc 0b 33 ovc
+ 0b 35 ovc 1d 37 ovc 71 38 ovc 2a 39 ovc
+ 78 3c ovc 40 4d ovc 20 4e ovc 00 69 ovc
+ 4a 6b ovc 10 74 ovc 4f 8d ovc 00 8e ovc
+ 00 8f ovc 00 90 ovc 00 91 ovc 00 96 ovc
+ ( 00 9a ovc ) 84 b0 ovc 0c b1 ovc 0e b2 ovc
+ 82 b3 ovc 0a b8 ovc
+
+ \ More magic, some of which tweaks white balance
+ 0a 43 ovc f0 44 ovc 34 45 ovc 58 46 ovc
+ 28 47 ovc 3a 48 ovc 88 59 ovc 88 5a ovc
+ 44 5b ovc 67 5c ovc 49 5d ovc 0e 5e ovc
+ 0a 6c ovc 55 6d ovc 11 6e ovc
+ 9f 6f ovc \ 9e for advance AWB
+ ( 40 6a ovc )
+ ( 40 01 ovc ) \ Blue gain
+ ( 60 02 ovc ) \ Red gain
+ e7 13 ovc \ Control 8
+
+ \ Matrix coefficients
+ b3 4f ovc b3 50 ovc 00 51 ovc 3d 52 ovc
+ a7 53 ovc e4 54 ovc 9e 58 ovc
+
+ \ 08 41 ovc \ AWB gain enable
+ ( 00 3f ovc ) \ Edge enhancement factor
+ 05 75 ovc e1 76 ovc ( 00 4c ovc ) 01 77 ovc
+ c0 3d ovc \ Control 13
+ 09 4b ovc ( 60 c9 ovc )
+ 38 41 ovc \ Control 16
+ 40 56 ovc
+
+ 11 34 ovc
+ 12 3b ovc \ Control 11
+ 88 a4 ovc 00 96 ovc 30 97 ovc 20 98 ovc
+ 30 99 ovc 84 9a ovc 29 9b ovc 03 9c ovc
+ 5c 9d ovc 3f 9e ovc 04 78 ovc
+
+;
+
+: camera-init ( -- )
+ false to ov7670-detected?
+ ((camera-init)
+ 1d ov@ 1c ov@ bwjoin 7fa2 <> if exit then \ Manufacturing ID
+ b ov@ a ov@ bwjoin 7673 <> if exit then \ Product ID
+ true to ov7670-detected?
+;
+
+\ VGA RGB565
+: init-rgb565 ( -- )
+ 04 12 ov! \ VGA, RGB565
+ 00 8c ov! \ No RGB444
+ 00 04 ov! \ Control 1 (CaFe value is 00, Via is 40 for CCIR656)
+ 10 40 ov! \ RGB565 output
+ 38 14 ov! \ 16x gain ceiling
+ b3 4f ov! \ v-red
+ b3 50 ov! \ v-green
+ 00 51 ov! \ v-blue
+ 3d 52 ov! \ u-red
+ a7 53 ov! \ u-green
+ e4 54 ov! \ u-blue
+ c0 3d ov! \ Gamma enable, UV saturation auto adjust
+;
+
+: read-agc ( -- n )
+ 3 ov@ h# c0 and 2 lshift 0 ov@ or
+;
+
+: read-aec ( -- n )
+ 7 ov@ h# 3f and d# 10 lshift
+ h# 10 ov@ 2 lshift or
+ 4 ov@ 3 and or
+;
+
+: set-hw ( vstop vstart hstop hstart -- )
+ dup 3 >> 17 ov! \ Horiz start high bits
+ over 3 >> 18 ov! \ Horiz stop high bits
+ 32 ov@ swap 7 and or swap 7 and 3 << or 10 ms 32 ov! \ Horiz bottom bits
+
+ dup 2 >> 19 ov! \ Vert start high bits
+ over 2 >> 1a ov! \ Vert start high bits
+ 03 ov@ swap 3 and or swap 3 and 2 << or 10 ms 03 ov! \ Vert bottom bits
+;
+
+: camera-config ( -- )
+ ((camera-init)
+ init-rgb565
+ d# 490 d# 10 d# 14 d# 158 set-hw \ VGA window info
+;
+
Added: dev/olpc/mmp2camera/platform.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/olpc/mmp2camera/platform.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -0,0 +1,26 @@
+\ See license at end of file
+purpose: Driver for OLPC camera connected to Via VX855 Video Capture Port
+
+headers
+hex
+
+" OV7670" " sensor" string-property
+
+: ov-smb-setup ( -- )
+ 1 to smb-dly-us
+ d# 108 to smb-clk-gpio# d# 109 to smb-data-gpio#
+ h# 42 to smb-slave
+;
+
+: reset-sensor ( -- ) d# 73 gpio-clr 1 ms d# 73 gpio-set ;
+
+: sensor-power-on ( -- ) d# 145 gpio-set ;
+: sensor-power-off ( -- ) d# 145 gpio-clr ;
+
+\ CAM_HSYNC is on GPIO67, CAM_VSYNC is on GPIO68
+\ PIXMCLK on GPIO69, PIXCLK on GPIO70, PIXDATA[7:0] on GPIO[59:66]
+\ CAM_SCL on GPIO108, CAM_SDA on GPIO109 (bitbang)
+
+: cl! ( l adr -- ) h# d420a000 + rl! ;
+: cl@ ( adr -- l ) h# d420a000 + rl@ ;
+
Added: dev/olpc/mmp2camera/smbus.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dev/olpc/mmp2camera/smbus.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -0,0 +1,120 @@
+4 value smb-dly-us
+: smb-dly smb-dly-us us ;
+
+0 value smb-data-gpio#
+0 value smb-clk-gpio#
+
+: smb-data-hi ( -- ) smb-data-gpio# gpio-set smb-dly ;
+: smb-data-lo ( -- ) smb-data-gpio# gpio-clr smb-dly ;
+: smb-clk-hi ( -- ) smb-clk-gpio# gpio-set smb-dly ;
+: smb-clk-lo ( -- ) smb-clk-gpio# gpio-clr smb-dly ;
+: smb-data@ ( -- flag ) smb-data-gpio# gpio-pin@ ;
+: smb-clk@ ( -- ) smb-clk-gpio# gpio-pin@ ;
+: smb-off ( -- ) smb-data-gpio# gpio-dir-in ;
+: smb-on ( -- ) smb-data-gpio# gpio-dir-out smb-clk-gpio# gpio-dir-out ;
+: smb-data-dir-out ( -- ) smb-data-gpio# gpio-dir-out ;
+: smb-data-dir-in ( -- ) smb-data-gpio# gpio-dir-in ;
+
+h# 3500 constant smb-clk-timeout-us
+\ Slave can flow control by holding CLK low temporarily
+: smb-wait-clk-hi ( -- )
+ smb-clk-timeout-us 0 do
+ smb-clk@ if smb-dly unloop exit then 1 us
+ loop
+ true abort" I2C clock stuck low"
+;
+: smb-data-hi-w ( -- ) smb-data-hi smb-wait-clk-hi ;
+
+h# 3500 constant smb-data-timeout-us
+: smb-wait-data-hi ( -- )
+ smb-data-timeout-us 0 do
+ smb-data@ if unloop exit then 1 us
+ loop
+ true abort" I2C data stuck low"
+;
+
+: smb-restart ( -- )
+ smb-clk-hi smb-data-lo smb-clk-lo
+;
+
+: smb-start ( -- ) smb-clk-hi smb-data-hi smb-data-lo smb-clk-lo ;
+: smb-stop ( -- ) smb-clk-lo smb-data-lo smb-clk-hi smb-data-hi ;
+
+: smb-get-ack ( -- )
+ smb-data-dir-in
+ smb-data-hi
+ smb-clk-hi smb-wait-clk-hi
+ smb-data@ \ drop \ SCCB generates an don't care bit
+ if smb-stop smb-data-dir-out true abort" I2c NAK" then
+ smb-clk-lo
+\ smb-wait-data-hi
+ smb-data-dir-out
+;
+: smb-bit ( flag -- )
+ if smb-data-hi else smb-data-lo then
+ smb-clk-hi smb-wait-clk-hi smb-clk-lo
+;
+
+: smb-byte ( b -- )
+ 8 0 do ( b )
+ dup h# 80 and smb-bit ( b )
+ 2* ( b' )
+ loop ( b )
+ drop ( )
+ smb-get-ack
+;
+: smb-byte-in ( ack=0/nak=1 -- b )
+ smb-data-dir-in
+ 0
+ 8 0 do ( n )
+ smb-clk-hi ( n )
+ 2* smb-data@ if 1 or then ( n' )
+ smb-clk-lo
+ loop
+ smb-data-dir-out
+ swap smb-bit smb-data-hi \ Send ACK or NAK
+;
+
+0 value smb-slave
+: smb-addr ( lowbit -- ) smb-slave or smb-byte ;
+
+: smb-byte! ( byte reg# -- )
+ smb-start
+ 0 smb-addr ( byte reg# )
+ smb-byte ( byte )
+ smb-byte ( )
+ smb-stop
+;
+
+: smb-byte@ ( reg# -- byte )
+ smb-start
+ 0 smb-addr ( reg# )
+ smb-byte ( )
+ smb-stop smb-start \ SCCB bus needs a stop and a start for the second phase
+ 1 smb-addr
+ 1 smb-byte-in ( byte )
+ smb-stop
+;
+
+: smb-word! ( word reg# -- )
+ smb-start
+ 0 smb-addr ( word reg# )
+ smb-byte ( word )
+ wbsplit swap smb-byte smb-byte ( )
+ smb-stop
+;
+
+: smb-word@ ( reg# -- word )
+ smb-start
+ 0 smb-addr ( reg# )
+ smb-byte ( )
+ smb-restart
+ 1 smb-addr ( )
+ 0 smb-byte-in 1 smb-byte-in bwjoin ( word )
+ smb-stop
+;
+
+\ This can useful for clearing out DCON SMB internal state
+: smb-pulses ( -- )
+ d# 32 0 do smb-clk-lo smb-clk-hi loop
+;
Modified: dev/pci/isakbd.fth
==============================================================================
--- dev/pci/isakbd.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ dev/pci/isakbd.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -6,11 +6,13 @@
fload ${BP}/dev/i8042.fth
new-device
+ " " " 0" set-args
fload ${BP}/dev/pckbd.fth
\ d# 1 encode-int 3 encode-int encode+ " interrupts" property
finish-device
new-device
+ " " " 1" set-args
fload ${BP}/dev/ps2mouse.fth
\ d# 12 encode-int 3 encode-int encode+ " interrupts" property
finish-device
Modified: dev/pckbd.fth
==============================================================================
--- dev/pckbd.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ dev/pckbd.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -6,14 +6,13 @@
hex
headerless
+my-space " reg " integer-property
" keyboard" device-name
" pnpPNP,303" " compatible" string-property
" keyboard" device-type
-0 " reg" integer-property
-
: kbdtest ;
0 value #queued
@@ -528,7 +527,7 @@
: open ( -- okay? )
kbd-refcount @ if 1 +refcnt true exit then
unlock
- 0 set-port
+ my-space set-port
keyboard-present? if clear-out-buf else reset then
keyboard-present? 0= if false exit then
choose-type
Modified: dev/ps2mouse.fth
==============================================================================
--- dev/ps2mouse.fth Mon Oct 25 14:42:14 2010 (r1991)
+++ dev/ps2mouse.fth Fri Oct 29 18:17:26 2010 (r1992)
@@ -4,7 +4,7 @@
" mouse" device-name
" mouse" device-type
" pnpPNP,f03" " compatible" string-property
-1 " reg" integer-property
+my-space " reg " integer-property
headerless
: get-data ( -- byte ) " get-data" $call-parent ;
@@ -299,7 +299,7 @@
lock[
identify if
\ This port is unresponsive; try the other
- 0 set-port identify if ]unlock true exit then
+ my-unit 1- set-port identify if ]unlock true exit then
then ( id )
dup h# ab = if ( id )
@@ -312,7 +312,7 @@
my-port 0= if ]unlock true exit then
\ Otherwise look for the mouse on the keyboard port
- 0 set-port identify if ]unlock true exit then ( id )
+ my-unit 1- set-port identify if ]unlock true exit then ( id )
then ( id )
]unlock ( id )
@@ -325,7 +325,7 @@
headers
: open ( -- flag )
- 1 set-port
+ my-unit set-port
open-count 0= if
\ The "force" argument causes the open to succeed even if no mouse
More information about the openfirmware
mailing list