[openfirmware] [commit] r1823 - in cpu/arm: . mmp2
repository service
svn at openfirmware.info
Wed Jun 16 13:41:36 CEST 2010
Author: wmb
Date: Wed Jun 16 13:41:36 2010
New Revision: 1823
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/1823
Log:
ARM MMP2 port - Initial checkin of mmp2 directory and preliminary versions
of some drivers. Needs cleanup, but basically works.
Added:
cpu/arm/mmp2/
cpu/arm/mmp2/addrs.fth
cpu/arm/mmp2/dsi.fth
cpu/arm/mmp2/gpio.fth
cpu/arm/mmp2/lcd.fth
cpu/arm/mmp2/lcdcfg.fth
cpu/arm/mmp2/mfpr.fth
cpu/arm/mmp2/mmp2.bth (contents, props changed)
cpu/arm/mmp2/physaddr.fth
cpu/arm/mmp2/probemem.fth
cpu/arm/mmp2/rootnode.fth
cpu/arm/mmp2/sdhcimmp2.fth
cpu/arm/mmp2/sdregs.fth
cpu/arm/mmp2/timer.fth
cpu/arm/mmp2/twsi.fth
cpu/arm/mmp2/virtaddr.fth
cpu/arm/rootnode.fth
Added: cpu/arm/mmp2/addrs.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/addrs.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,13 @@
+h# d401.9000 constant gpio-base
+h# d405.1024 constant acgr-pa
+h# d401.5000 constant clock-unit-pa
+h# d405.0000 constant main-pmu-pa
+h# d428.2800 constant pmua-pa \ Application processor PMU register base
+h# d420.b800 constant dsi1-pa \ 4-lane controller
+h# d420.ba00 constant dsi2-pa \ 3-lane controller
+h# d420.b000 constant lcd-pa
+h# d401.4000 constant timer-pa
+
+
+h# 08.0000 constant fb-pa
+
Added: cpu/arm/mmp2/dsi.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/dsi.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,378 @@
+h# 004c constant pmua_display1_clk_res_ctrl_offset \ DISPLAY1 Clock/Reset Control Register
+h# 0110 constant pmua_display2_clk_res_ctrl_offset \ DISPLAY2 Clock/Reset Control Register
+h# 0050 constant pmua_ccic_clk_res_ctrl_offset \ CCIC Clock/Reset Control Register
+
+
+
+: pmua@ ( offset -- n ) pmua-pa + l@ ;
+: pmua! ( n offset -- ) pmua-pa + l! ;
+
+: dsi-twsi! ( l reg# -- )
+ >r lbsplit swap 2swap swap r> wbsplit 6 twsi-write
+;
+: dsi-twsi-w! ( w reg# -- )
+ >r wbsplit swap r> wbsplit 4 twsi-write
+;
+: dsi-twsi@ ( reg# -- l ) wbsplit 2 4 twsi-get bljoin ;
+: dsi-twsi-w@ ( reg# -- w ) wbsplit 2 2 twsi-get bwjoin ;
+: dsi1! ( n offset -- ) dsi1-pa + l! ;
+: dsi1@ ( n offset -- ) dsi1-pa + l@ ;
+: dsi2! ( n offset -- ) dsi2-pa + l! ;
+: dsi2@ ( n offset -- ) dsi2-pa + l@ ;
+
+0 value dsi-base
+: dsi! ( n offset -- ) dsi-base + l! ;
+: dsi@ ( n offset -- ) dsi-base + l@ ;
+
+: bitset ( mask reg-adr -- ) tuck l@ or swap l! ;
+: bitclr ( mask reg-adr -- ) tuck l@ swap invert and swap l! ;
+: init-dsi1 ( -- )
+ \ Ensure that the pins are set up properly
+ h# c0 d# 83 gpio>mfpr l! \ Configure GPIO83 for function 0 - GPIO
+ d# 83 gpio-dir-out \ Set the direction control to output
+
+ h# d123f h# 4c pmua! \ Send clock to TC358762 MIPI DSI bridge
+ \ Enable the M/N clock output
+ main-pmu-pa h# 1024 + l@ h# 200 or main-pmu-pa h# 1024 + l! \ Set (GPC) G_CLK_OUT ena in clock gating register
+ \ Set the M/N value and re-enable the clock gate register
+ h# 20001 main-pmu-pa h# 30 + l! \ Set M/N divider values in PMUM_GPCR register
+ h# 4000 mfpr-base h# 160 + bitset \ pull-up
+
+ \ Disable DSI
+ 0 h# 00 dsi1! \ Stop the interface
+ h# c000.0000 dsi1-pa h# 00 + bitset
+ 1 ms
+ h# c000.0000 dsi1-pa h# 00 + bitclr
+ 1 ms
+ d# 83 gpio-clr 1 ms d# 83 gpio-set 1 ms \ LCD_RST_N line resets DSI bridge
+
+ 5 set-address h# 16 set-slave \ TWSI address of TC358762 MIPI DSI bridge
+ \ Data Reg#.......
+ 0 h# 047c dsi-twsi! \ Turn off sleep mode
+ 2 ms
+ 7 h# 0210 dsi-twsi! \ Enable 2 lanes + clock lane
+ h# b8230000 h# 0470 dsi-twsi! \ Set PCLK to 33.2 MHz
+ 5 ms
+ h# 0400 h# 0464 dsi-twsi! \ Set PCLK divider
+ 5 ms
+ 1 h# 204 dsi-twsi! \ Start RX
+ 0 h# 144 dsi-twsi! \ Analog timer setup for lane 0
+ 0 h# 148 dsi-twsi! \ Analog timer setup for lane 1
+
+ \ Set asserting period for the duration between LP-00 detect and
+ \ High Speed data reception for each lane. (This is for LANE 0)
+ \ Set between 85ns + 6*UI and 145 ns + 10*UI based on HSBCLK
+ h# a h# 164 dsi-twsi! \ D0S_CLRSIPOCOUNT register
+
+ \ Set asserting period for the duration between LP-00 detect and
+ \ High Speed data reception for each lane. (This is for LANE 1)
+ \ Set between 85ns + 6*UI and 145 ns + 10*UI based on HSBCLK
+ h# a h# 168 dsi-twsi! \ D1S_CLRSIPOCOUNT register
+
+ h# 150 h# 420 dsi-twsi! \ LCDCTR0 - RGB888 24-bit color
+
+ h# 3FF0000 h# 0450 dsi-twsi! \ SPIRCMR/SPICTRL
+
+ 1 h# 0104 dsi-twsi! \ STARTPPI
+
+ \ High speed mode setup
+ h# 2102 h# 0020 dsi-twsi! \ CLW_DLYCNTRL = 20pS -> CLW_DPHYCONTRX
+ h# 2002 h# 0024 dsi-twsi! \ D0W_DLYCNTRL = 10pS -> D0W_DPHYCONTRX
+ h# 2002 h# 0028 dsi-twsi! \ D1W_DLYCNTRL = 10pS -> D1W_DPHYCONTRX
+
+ 1 h# 204 dsi-twsi! \ Start RX -> STARTDSI (repeat)
+
+ h# 152 h# 420 dsi-twsi! \ LCDCTR0 - RGB888 24-bit color
+
+ hsync h# 424 dsi-twsi-w! \ HSYNC width
+ hbp h# 426 dsi-twsi-w! \ Horizontal back porch
+ hdisp h# 428 dsi-twsi-w! \ Horizontal display
+ hfp h# 42a dsi-twsi-w! \ Horizontal front porch
+ vsync h# 42c dsi-twsi-w! \ VSYNC
+ vbp h# 42e dsi-twsi-w! \ Vertical back porch
+ vdisp h# 430 dsi-twsi-w! \ Vertical display
+ vfp h# 432 dsi-twsi-w! \ Vertical front porch
+
+ \ Magic numbers, tuned with scope
+ h# 07320302 h# c0 dsi1! \ PHY time 0
+ h# 370afff0 h# c4 dsi1! \ PHY time 1
+ h# 070a1504 h# c8 dsi1! \ PHY time 2
+ h# 00000400 h# cc dsi1! \ PHY time 3
+
+ h# 30 h# 88 dsi1! \ PHY control 2 - enable 2 lanes
+ h# 30.0000 h# 24 dsi1! \ Packet command 1 - enable low power tx on 2 lanes
+
+ htotal bytes/pixel * #lanes / ( total-chunks )
+ hdisp bytes/pixel * #lanes / ( total-chunks disp-chunks )
+
+ wljoin h# 110 dsi1! \ DSI_LCD1_TIMING_0
+ hbp hsync wljoin h# 114 dsi1! \ DSI_LCD1_TIMING_1
+
+\ For now the active size is set really low (we'll use 10) to allow
+\ the hardware to attain V Sync. Once the DSI bus is up and running,
+\ the final value will be put in place for the active size (this is
+\ done below). In a later stepping of the processor this workaround
+\ will not be required.
+
+ vtotal ( vdisp ) d# 10 wljoin h# 118 dsi1! \ DSI_LCD1_TIMING_2
+
+ \ The 1- below is for debugging, to get first line positioned properly
+ vbp 1- vsync wljoin h# 11c dsi1! \ DSI_LCD1_TIMING_3
+
+ hsync >bytes d# 11 - 0 max 4 - 6 - ( low )
+ hbp hsync + >bytes 4 - 6 - ( low high )
+ wljoin h# 120 dsi1! \ DSI_LCD1_WC_0
+
+ hdisp >bytes hfp >bytes 6 - 6 - wljoin h# 124 dsi1! \ DSI_LCD1_WC_1
+
+ h# 0040.0010 h# 100 dsi1! \ DSI_LCD1_CTRL_0
+ h# 0014.0007 h# 104 dsi1! \ DSI_LCD1_CTRL_1 - non-burst w/ sync, 24bpp
+
+ h# e4 h# 4 dsi1! \ DSI_CTRL_1 - virtual channel setup
+ h# 1 h# 0 dsi1! \ DSI_CTRL_0 - active panel 1 enable
+ d# 100 ms
+
+ \ Reset timing register 2 to its final value (workaround)
+ h# 118 dsi1@ \ DSI_LCD1_TIMING_2
+ lwsplit drop
+ vdisp 2- wljoin
+ h# 118 dsi1! \ DSI_LCD1_TIMING_2
+;
+: .dsi ( index -- ) dup 3 u.r space dsi-twsi@ 8 u.r cr ;
+: .dsiw ( index -- ) dup 3 u.r space dsi-twsi-w@ 8 u.r cr ;
+: dump-dsi ( -- )
+ 5 set-address 16 set-slave
+ 47c .dsi
+ 210 .dsi
+ 470 .dsi
+ 464 .dsi
+ 204 .dsi
+ 144 .dsi
+ 148 .dsi
+ 164 .dsi
+ 168 .dsi
+ 420 .dsi
+ 450 .dsi
+ 104 .dsi
+ 20 .dsi
+ 24 .dsi
+ 28 .dsi
+ 204 .dsi
+ 420 .dsi
+ 424 .dsiw
+ 426 .dsiw
+ 428 .dsiw
+ 42a .dsiw
+ 42c .dsiw
+ 42e .dsiw
+ 430 .dsiw
+ 432 .dsiw
+;
+[ifdef] support-low-speed-dsi
+: parity ( n -- 0|1 )
+ dup d# 16 rshift xor
+ dup 8 rshift xor
+ dup 4 rshift xor
+ dup 2 rshift xor
+ dup u2/ xor
+ 1 and
+;
+
+\ ECC bits
+\ 10 11 12 13 14 15 16 17 18 19 21 22 23 ->ecc[5] h# effc00
+\ 4 5 6 7 8 9 16 17 18 19 20 22 23 ->ecc[4] h# df03f0
+\ 1 2 3 7 8 9 13 14 15 19 20 21 23 ->ecc[3] h# b8e38e
+\ 0 2 3 5 6 9 11 12 15 18 20 21 22 ->ecc[2] h# 749a6d
+\ 0 1 3 4 6 8 10 12 14 17 20 21 22 23 ->ecc[1] h# f2555b
+\ 0 1 2 4 5 7 10 11 13 16 20 21 22 23 ->ecc[0] h# f12cb7
+
+: calc-ecc ( l -- )
+ >r
+ \ The following masks are all 00 in the low byte, because the calculation
+ \ skips the first byte in the array
+ r@ 00ef.fc00 and parity d# 29 lshift
+ r@ 00df.03f0 and parity d# 28 lshift or
+ r@ 00b8.e38e and parity d# 27 lshift or
+ r@ 009a.746d and parity d# 26 lshift or
+ r@ 00f2.555b and parity d# 25 lshift or
+ r@ 00f1.2cb7 and parity d# 24 lshift or ( ecc )
+ r> or
+;
+: updcrc ( byte crc -- crc' )
+ 8 0 do ( byte crc )
+ 2dup xor 1 and if ( byte crc )
+ u2/ h# 8408 xor ( byte crc' )
+ else
+ u2/ ( byte crc' )
+ then ( byte crc )
+ swap u2/ swap ( byte' crc )
+ loop ( byte crc )
+ nip ( crc )
+;
+: calc-crc16 ( adr len -- ) \ Len includes the CRC
+ swap 4 + swap 6 - ( payload-adr payload-len )
+ h# ffff >r ( adr len r: crc )
+ begin dup while ( adr len r: crc )
+ over c@ ( adr len byte r: crc )
+ r> updcrc >r ( adr len r: crc' )
+ repeat ( adr len r: crc' )
+ drop r> ( adr crc )
+ swap le-w! ( )
+;
+: calc-checksums ( adr len low-speed? -- )
+ \ Calculate ECC and maybe CRC if low speed - hardware does it in high speed mode
+ third if ( adr len )
+ over le-l@ calc-ecc ( adr len ecc )
+ third le-l! ( adr len )
+ \ Calculate CRC if long packet
+ dup 4 <> if ( adr len )
+ 2dup calc-crc16 ( adr len )
+ then ( adr len )
+ then ( adr len )
+;
+
+[then]
+[ifdef] use-dsi2
+: set-dsi-data ( l index -- )
+ swap h# 30 dsi! ( index ) \ Data register
+ d# 16 lshift h# c000.0000 or h# 2c dsi! \ Packet data address to CPU_CMD_3 register
+ h# 400 0 do h# 2c dsi@ 0>= abort" DSI timeout" loop
+;
+: stuff-dsi-fifo ( adr len -- )
+ 0 ?do ( adr' )
+ dup le-l@ i la1+ set-dsi-data ( adr )
+ la1+ ( adr' )
+ 4 +loop ( adr )
+ drop ( )
+;
+: run-dsi-cmd ( cmd -- )
+ h# 20 dsi! ( )
+ h# 400 0 do ( )
+ h# 20 dsi@ 0>= ?leave ( )
+ loop ( )
+;
+: dsi-write-short ( l -- ) \ high speed short packet
+\ calc-ecc ( l' )
+ 0 set-dsi-data ( )
+ h# c000.0000 run-dsi-cmd ( )
+;
+
+: dsi-write ( adr len -- )
+ \ Send the long payload code and the length as the first word
+ dup 8 lshift h# 29 or 0 set-dsi-data ( adr len )
+ tuck stuff-dsi-fifo ( len )
+ h# 8000.0000 or run-dsi-cmd
+;
+
+: setup-lcd ( -- )
+ " "(F1 5A 5A)" dsi-write
+ " "(FC 5A 5A)" dsi-write
+ " "(B7 00 11 11)" dsi-write
+ " "(B8 2d 21)" dsi-write
+ " "(B8 00 06)" dsi-write
+ " "(2a 00 00 01 df)" dsi-write
+ " "(2b 00 00 02 7f)" dsi-write
+ h# 00001105 dsi-write-short
+ 5 ms
+ " "(F4 00 23 00 64 5C 00 64 5C 00 00)" dsi-write
+ " "(F5 00 00 0E 00 04 02 03 03 03 03)" dsi-write
+ " "(EE 32 29 00)" dsi-write
+ " "(F2 00 30 88 88 57 57 10 00 04)" dsi-write
+ " "(F3 00 10 25 01 2D 2D 24 2D 10 12 12 73)" dsi-write
+ " "(F6 21 AE BF 62 22 62)" dsi-write
+ " "(F7 00 01 00 F2 0A 0A 0A 30 0A 00 0F 00 0F 00 4B 00 8C)" dsi-write
+ " "(F8 00 01 00 F2 0A 0A 0A 30 0A 00 0F 00 0F 00 4B 00 8C)" dsi-write
+ " "(F9 11 10 0F 00 01 02 04 05 08 00 0A 00 00 00 0F 10 11 00 00 C3 FF 7F)" dsi-write
+ d# 120 ms
+ h# 00002905 dsi-write-short
+;
+
+\ This is for the TV path
+: init-dsi2 ( -- )
+ \ Send clock to TC358762 MIPI DSI bridge
+ h# d123f h# 4c pmua! \ Display 1 clock
+ h# d123f h# 110 pmua! \ Display 2 clock
+
+ \ Disable DSI
+ 0 h# 00 dsi2! \ Stop the interface
+ h# c000.0000 dsi2-pa h# 00 + bitset
+ 1 ms
+ h# c000.0000 dsi2-pa h# 00 + bitclr
+ 1 ms
+
+ \ Magic numbers, tuned with scope
+ h# 07320302 h# c0 dsi2! \ PHY time 0
+ h# 370afff0 h# c4 dsi2! \ PHY time 1
+ h# 070a1504 h# c8 dsi2! \ PHY time 2
+ h# 00000400 h# cc dsi2! \ PHY time 3
+
+ h# 30 h# 88 dsi2! \ PHY control 2 - enable 2 lanes
+ h# 30.0000 h# 24 dsi2! \ Packet command 1 - enable low power tx on 2 lanes
+
+ setup-lcd
+ htotal >chunks hdisp >chunks wljoin h# 190 dsi2! \ DSI_LCD2_TIMING_0
+ hbp hsync wljoin h# 194 dsi2! \ DSI_LCD2_TIMING_1
+
+ \ For now the active size is set really low (we'll use 10) to allow
+ \ the hardware to attain V Sync. Once the DSI bus is up and running,
+ \ the final value will be put in place for the active size (this is
+ \ done below). In a later stepping of the processor this workaround
+ \ will not be required.
+
+ vtotal vdisp wljoin h# 198 dsi2! \ DSI_LCD2_TIMING_2
+
+ \ The 1- below is for debugging, to get first line positioned properly
+ vbp 1- vsync wljoin h# 19c dsi2! \ DSI_LCD2_TIMING_3
+
+ hsync bytes/pixel * d# 11 - 0 max 4 - 6 - ( low )
+ hbp hsync + bytes/pixel * 4 - 6 - ( low high )
+ wljoin h# 1a0 dsi2! \ DSI_LCD2_WC_0
+
+ hdisp hfp bytes/pixel * wljoin h# 124 dsi1! \ DSI_LCD1_WC_1
+
+ h# 0050.0010 h# 180 dsi2! \ DSI_LCD2_CTRL_0
+ h# 0014.0007 h# 184 dsi2! \ DSI_LCD2_CTRL_1 - non-burst w/ sync, 24bpp
+
+ h# e4 h# 4 dsi2! \ DSI_CTRL_1 - virtual channel setup
+ h# 1 h# 0 dsi2! \ DSI_CTRL_0 - active panel 1 enable
+ d# 100 ms
+
+ \ Reset timing register 2 to its final value (workaround)
+ h# 198 dsi2@ \ DSI_LCD2_TIMING_2
+ lwsplit drop
+ vdisp 2- wljoin
+ h# 198 dsi2! \ DSI_LCD2_TIMING_2
+
+;
+: dsi-read ( -- n ) h# 64 dsi2@ ;
+: dsi-lcd ( enable? -- )
+ 0 dsi1@ 7 invert and 0 dsi1! \ Disable all panels
+ h# 4c pmua@ 2 invert and h# 4c pmua! \ stop clock?
+ ( enable? ) if
+ d# 100 ms
+ h# 4c pmua@ 2 or h# 4c pmua! \ start clock
+ d# 100 ms
+ 0 dsi1@ 1 or 0 dsi1! \ Enable panel 0
+ then
+;
+
+h# 106 buffer: dsi-cmd-buf
+
+: lcd-send-some ( code adr len -- code' adr' len' )
+ rot dup dsi-cmd-buf c! ( adr len code )
+ h# 10 or -rot ( code' adr len ) \ Change code to 3c after first time
+ dup d# 240 min ( code adr len thislen )
+ third dsi-cmd-buf 1+ third ( code adr len thislen adr dst thislen )
+ move ( code adr len thislen )
+ dsi-cmd-buf over dsi-write ( code adr len thislen )
+ /string ( code adr' len' )
+;
+
+: lcd-send ( adr len -- )
+ h# 2c -rot ( code adr len )
+ begin dup while ( code adr len )
+ lcd-send-some ( code' adr' len' )
+ repeat ( code' adr' len' )
+ 3drop
+;
+[then]
Added: cpu/arm/mmp2/gpio.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/gpio.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,43 @@
+create gpio-offsets
+\ 0 1 2 3 4 5
+ 0 , 4 , 8 , h# 100 , h# 104 , h# 108 ,
+
+: >gpio-pin ( gpio# -- mask pa )
+ dup h# 1f and ( gpio# bit# )
+ 1 swap lshift ( gpio# mask )
+ swap 5 rshift gpio-offsets swap na+ @ gpio-base + ( mask pa )
+;
+: gpio-pin@ ( gpio# -- flag ) >gpio-pin l@ and 0<> ;
+
+: >gpio-dir ( gpio# -- mask pa ) >gpio-pin h# 0c + ;
+: gpio-out? ( gpio# -- out? ) >gpio-dir l@ and 0<> ;
+
+: gpio-set ( gpio# -- ) >gpio-pin h# 18 + l! ;
+: gpio-clr ( gpio# -- ) >gpio-pin h# 24 + l! ;
+
+: >gpio-rer ( gpio# -- mask pa ) >gpio-pin h# 30 + ;
+: gpio-rise@ ( gpio# -- flag ) >gpio-rer l@ and 0<> ;
+
+: >gpio-fer ( gpio# -- mask pa ) >gpio-pin h# 3c + ;
+: gpio-fall@ ( gpio# -- flag ) >gpio-fer l@ and 0<> ;
+
+: >gpio-edr ( gpio# -- mask pa ) >gpio-pin h# 48 + ;
+: gpio-edge@ ( gpio# -- flag ) >gpio-edr l@ and 0<> ;
+: gpio-clr-edge ( gpio# -- ) >gpio-edr l! ;
+
+: gpio-dir-out ( gpio# -- ) >gpio-pin h# 54 + l! ;
+: gpio-dir-in ( gpio# -- ) >gpio-pin h# 60 + l! ;
+: gpio-set-rer ( gpio# -- ) >gpio-pin h# 6c + l! ;
+: gpio-clr-rer ( gpio# -- ) >gpio-pin h# 78 + l! ;
+: gpio-set-fer ( gpio# -- ) >gpio-pin h# 84 + l! ;
+: gpio-clr-fer ( gpio# -- ) >gpio-pin h# 90 + l! ;
+
+: >gpio-mask ( gpio# -- mask pa ) >gpio-pin h# 9c + ;
+: gpio-set-mask ( gpio# -- ) >gpio-mask l! ;
+
+: >gpio-xmsk ( gpio# -- mask pa ) >gpio-pin h# a8 + ;
+: gpio-set-xmsk ( gpio# -- ) >gpio-xmsk l! ;
+
+
+
+
Added: cpu/arm/mmp2/lcd.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/lcd.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,76 @@
+: lcd@ ( offset -- l ) lcd-pa + l@ ;
+: lcd! ( l offset -- ) lcd-pa + l! ;
+
+: spi-clr-irq ( -- )
+ h# 1c4 lcd@ h# 00040000 invert and h# 1c4 lcd! \ Clear SPI_IRQ bit
+;
+: lcd-spi ( w -- )
+ spi-clr-irq
+ 1 us
+ h# 180 lcd@ h# 40 or h# 180 lcd! \ Set CFG_KEEPXFER, set CS LOW
+ ( w ) h# 184 lcd! \ Set TX data
+ h# 180 lcd@ 1 or h# 180 lcd! \ Set SPI_START
+ begin h# 1c4 lcd@ h# 00040000 and until
+ spi-clr-irq
+ h# 180 lcd@ h# 41 invert and h# 180 lcd! \ Clear CFG_KEEPXFER and SPI_START, set CS HITH
+;
+: init-tpo ( -- )
+ h# 0f000f0a h# 180 lcd! \ Set LCD SPI controller for 16bit tranmit
+ h# 080f lcd-spi \ Invert pixel clockA
+ h# 0c5f lcd-spi
+ h# 1017 lcd-spi
+ h# 1420 lcd-spi
+ h# 1808 lcd-spi
+ h# 1c20 lcd-spi
+ h# 2020 lcd-spi
+ h# 2420 lcd-spi
+ h# 2820 lcd-spi
+ h# 2c20 lcd-spi
+ h# 3020 lcd-spi
+ h# 3420 lcd-spi
+ h# 3810 lcd-spi
+ h# 3c10 lcd-spi
+ h# 4010 lcd-spi
+ h# 4415 lcd-spi
+ h# 48aa lcd-spi
+ h# 4cff lcd-spi
+ h# 5086 lcd-spi
+ h# 548d lcd-spi
+ h# 58d4 lcd-spi
+ h# 5cfb lcd-spi
+ h# 602e lcd-spi
+ h# 645a lcd-spi
+ h# 6889 lcd-spi
+ h# 6cfe lcd-spi
+ h# 705a lcd-spi
+ h# 749b lcd-spi
+ h# 78c5 lcd-spi
+ h# 7cff lcd-spi
+ h# 80f0 lcd-spi
+ h# 84f0 lcd-spi
+ h# 8808 lcd-spi
+;
+
+: init-lcd ( -- )
+ 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# d h# 1b8 lcd! \ Dumb panel controller
+ h# 01330133 h# 13c lcd! \ Panel VSYNC Pulse Pixel Edge Control
+ h# 40001108 h# 1a8 lcd! \ Clock divider
+ h# 00021100 h# 190 lcd! \ DMA CTRL 0 - enable DMA, 24 bpp mode
+ init-dsi1
+ init-tpo
+ h# c0 lcd-backlight!
+;
Added: cpu/arm/mmp2/lcdcfg.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/lcdcfg.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,19 @@
+d# 4 value hsync
+d# 800 value hdisp
+d# 1056 value htotal
+d# 212 value hbp
+
+d# 4 value vsync
+d# 480 value vdisp
+d# 525 value vtotal
+d# 31 value vbp
+
+: hfp ( -- n ) htotal hdisp - hsync - hbp - ;
+: vfp ( -- n ) vtotal vdisp - vsync - vbp - ;
+
+2 constant #lanes
+3 constant bytes/pixel
+d# 24 constant bpp
+
+: >bytes ( pixels -- chunks ) bytes/pixel * ;
+: >chunks ( pixels -- chunks ) >bytes #lanes / ;
Added: cpu/arm/mmp2/mfpr.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/mfpr.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,261 @@
+: set-camera-domain-voltage
+ h# baba h# d4015068 l! \ Unlock sequence
+ h# ec10 h# d401506c l!
+ h# d401e80c l@ 4 or ( n ) \ Set 1.8V selector bit in AIB_GPIO2_IO
+ h# baba h# d4015068 l! \ Unlock sequence
+ h# ec10 h# d401506c l!
+ h# d401e80c l!
+;
+: acgr-clocks-on ( -- )
+ h# 0818.F33C acgr-pa l! \ Turn on all clocks
+;
+: set-gpio-directions ( -- )
+ 3 h# 38 clock-unit-pa + l! \ Enable clocks in GPIO clock reset register
+
+ h# 000e.0000 gpio-base h# 0c + l! \ Bits 19, 18, 17
+ h# 0704.2000 gpio-base h# 10 + l! \ Bits 58,57,56,50 and 45
+ h# 03ec.3e00 gpio-base h# 14 + l! \ Bits 89:85,83,82, and 77:73
+
+ h# 0200.3c00 gpio-base h# 20 + l! \ Turn off LEDS (3c00) and turn on 5V (0200.0000)
+;
+
+hex
+create mfpr-offsets \ GPIOs
+ 054 w, 058 w, 05C w, 060 w, 064 w, 068 w, 06C w, 070 w, \ 0->7
+ 074 w, 078 w, 07C w, 080 w, 084 w, 088 w, 08C w, 090 w, \ 8->15
+ 094 w, 098 w, 09C w, 0A0 w, 0A4 w, 0A8 w, 0AC w, 0B0 w, \ 16->23
+ 0B4 w, 0B8 w, 0BC w, 0C0 w, 0C4 w, 0C8 w, 0CC w, 0D0 w, \ 24->31
+ 0D4 w, 0D8 w, 0DC w, 0E0 w, 0E4 w, 0E8 w, 0EC w, 0F0 w, \ 32->39
+ 0F4 w, 0F8 w, 0FC w, 100 w, 104 w, 108 w, 10C w, 110 w, \ 40->47
+ 114 w, 118 w, 11C w, 120 w, 124 w, 128 w, 12C w, 130 w, \ 48->55
+ 134 w, 138 w, 13C w, 280 w, 284 w, 288 w, 28C w, 290 w, \ 56->63
+ 294 w, 298 w, 29C w, 2A0 w, 2A4 w, 2A8 w, 2AC w, 2B0 w, \ 64->71
+ 2B4 w, 2B8 w, 170 w, 174 w, 178 w, 17C w, 180 w, 184 w, \ 72->79
+ 188 w, 18C w, 190 w, 194 w, 198 w, 19C w, 1A0 w, 1A4 w, \ 80->87
+ 1A8 w, 1AC w, 1B0 w, 1B4 w, 1B8 w, 1BC w, 1C0 w, 1C4 w, \ 88->95
+ 1C8 w, 1CC w, 1D0 w, 1D4 w, 1D8 w, 1DC w, 000 w, 004 w, \ 96->103
+ 1FC w, 1F8 w, 1F4 w, 1F0 w, 21C w, 218 w, 214 w, 200 w, \ 104->111
+ 244 w, 25C w, 164 w, 260 w, 264 w, 268 w, 26C w, 270 w, \ 112->119
+ 274 w, 278 w, 27C w, 148 w, 00C w, 010 w, 014 w, 018 w, \ 120->127
+ 01C w, 020 w, 024 w, 028 w, 02C w, 030 w, 034 w, 038 w, \ 128->135
+ 03C w, 040 w, 044 w, 048 w, 04C w, 050 w, 008 w, 220 w, \ 136->143
+ 224 w, 228 w, 22C w, 230 w, 234 w, 238 w, 23C w, 240 w, \ 144->151
+ 248 w, 24C w, 254 w, 258 w, 14C w, 150 w, 154 w, 158 w, \ 152->159
+ 250 w, 210 w, 20C w, 208 w, 204 w, 1EC w, 1E8 w, 1E4 w, \ 160->167
+ 1E0 w, \ 168
+
+h# d401.e000 constant mfpr-base
+: gpio>mfpr ( gpio# -- mfpr-pa )
+ mfpr-offsets swap wa+ w@
+ mfpr-base +
+;
+
+: dump-mfprs ( -- )
+ base @
+ d# 169 0 do decimal i 3 u.r space i gpio>mfpr l@ 4 hex u.r cr loop
+ base !
+;
+
+: no-update, ( -- ) 8 w, ; \ 8 is a reserved bit; the code skips these
+: af, ( n -- ) h# c0 + w, ;
+: pull-up, ( n -- ) h# c0c0 + w, ;
+: pull-dn, ( n -- ) h# a0c0 + w, ;
+
+create mfpr-table
+ 1 af, \ GPIO_00 - KP_MKIN[0]
+ 1 af, \ GPIO_01 - KP_MKOUT[0]
+ 1 af, \ GPIO_02 - KP_MKIN[1]
+ 1 af, \ GPIO_03 - KP_MKOUT[1]
+ 1 af, \ GPIO_04 - KP_MKIN[2]
+ 1 af, \ GPIO_05 - KP_MKOUT[2]
+ no-update, \ GPIO_06 - Not used
+ no-update, \ GPIO_07 - Not used
+ no-update, \ GPIO_08 - Not used
+ no-update, \ GPIO_09 - Not used
+ no-update, \ GPIO_10 - Not used
+ no-update, \ GPIO_11 - Not used
+ no-update, \ GPIO_12 - Not used
+ no-update, \ GPIO_13 - Not used
+ no-update, \ GPIO_14 - Not used
+ no-update, \ GPIO_15 - Not used
+ no-update, \ GPIO_16 - Not used
+ 0 af, \ GPIO_17 - BB_GPIO1 (use as GPIO out)
+ 0 af, \ GPIO_18 - BB_GPIO2 (use as GPIO out)
+ 0 af, \ GPIO_19 - BB_GPIO3 (use as GPIO out)
+ 0 af, \ GPIO_20 - ISP_INT (use as GPIO in)
+ 0 af, \ GPIO_21 - WIFI_GPIO2 (use as GPIO i/o)
+ 0 af, \ GPIO_22 - WIFI_GPIO3 (use as GPIO i/o)
+ 0 af, \ GPIO_23 - CODEC_INT (use as GPIO in)
+ 1 af, \ GPIO_24 - I2S_SYSCLK (Codec - HI-FI)
+ 1 af, \ GPIO_25 - SSPA2_SCLK (Codec - HI-FI)
+ 1 af, \ GPIO_26 - SSPA2_SFRM (Codec - HI-FI)
+ 1 af, \ GPIO_27 - SSPA2_TXD (Codec - HI-FI)
+ 1 af, \ GPIO_28 - SSPA2_RXD (Codec - HI-FI)
+ 1 af, \ GPIO_29 - UART1_RXD (Bluetooth)
+ 1 af, \ GPIO_30 - UART1_TXD (Bluetooth)
+ 1 af, \ GPIO_31 - UART1_CTS (Bluetooth)
+\
+ 1 af, \ GPIO_32 - UART1_RTS (Bluetooth)
+ 0 af, \ GPIO_33 - SSPA2_CLK (Codec - LO-FI)
+ 0 af, \ GPIO_34 - SSPA2_FRM (Codec - LO-FI)
+ 0 af, \ GPIO_35 - SSPA2_TXD (Codec - LO-FI)
+ 0 af, \ GPIO_36 - SSPA2_RXD (Codec - LO-FI)
+ 1 af, \ GPIO_37 - MMC2_DAT<3>
+ 1 af, \ GPIO_38 - MMC2_DAT<2>
+ 1 af, \ GPIO_39 - MMC2_DAT<1>
+ 1 af, \ GPIO_40 - MMC2_DAT<0>
+ 1 af, \ GPIO_41 - MMC2_CMD
+ 1 af, \ GPIO_42 - MMC2_CLK
+ 1 af, \ GPIO_43 - TWSI2_SCL (for codec/noise/FM)
+ 1 af, \ GPIO_44 - TWSI2_SDA (for codec/noise/FM)
+ 0 af, \ GPIO_45 - WM8994_LDOEN (use as GPIO out)
+ 0 af, \ GPIO_46 - HDMI_DET (use as GPIO in)
+ 2 af, \ GPIO_47 - SSP2_CLK
+ 2 af, \ GPIO_48 - SSP2_FRM
+ 2 af, \ GPIO_49 - SSP2_RXD
+ 0 af, \ GPIO_50 - GPS_STBY (use as GPIO out)
+ 1 af, \ GPIO_51 - UART3_RXD (debug port)
+ 1 af, \ GPIO_52 - UART3_TXD (debug port)
+ 5 af, \ GPIO_53 - PWM3 (Keypad backlight)
+ 4 af, \ GPIO_54 - HDMI_CEC (MOVED to GPIO 113?)
+ 0 af, \ GPIO_55 - WIFI_GPIO0 (use as GPIO in)
+ 0 af, \ GPIO_56 - WIFI_GPIO1 (use as GPIO out)
+ 0 af, \ GPIO_57 - WIFI_PD_N (use as GPIO out)
+ 0 af, \ GPIO_58 - WIFI_RST_N (use as GPIO out)
+ 1 af, \ GPIO_59 - CCIC_IN<7>
+ 1 af, \ GPIO_60 - CCIC_IN<6>
+ 1 af, \ GPIO_61 - CCIC_IN<5>
+ 1 af, \ GPIO_62 - CCIC_IN<4>
+ 1 af, \ GPIO_63 - CCIC_IN<3>
+\
+ 1 af, \ GPIO_64 - CCIC_IN<2>
+ 1 af, \ GPIO_65 - CCIC_IN<1>
+ 1 af, \ GPIO_66 - CCIC_IN<0>
+ 1 af, \ GPIO_67 - CAM_HSYNC
+ 1 af, \ GPIO_68 - CAM_VSYNC
+ 1 af, \ GPIO_69 - CAM_MCLK
+ 1 af, \ GPIO_70 - CAM_PCLK
+ 1 af, \ GPIO_71 - TWSI3_SCL (for CAM)
+ 1 af, \ GPIO_72 - TWSI3_CLK (for CAM)
+ 0 af, \ GPIO_73 - CCIC_RST_N (use as GPIO out)
+ 0 af, \ GPIO_74 - LED - ORANGE (use as GPIO out) LCD VSYNC
+ 0 af, \ GPIO_75 - LED - BLUE (use as GPIO out) LCD HSYNV
+ 0 af, \ GPIO_76 - LED - RED (use as GPIO out) LCD PCLK
+ 0 af, \ GPIO_77 - LED - GREEN (use as GPIO out)
+ 5 af, \ GPIO_78 - SSP4_CLK
+ 5 af, \ GPIO_79 - SSP4_FRM
+ 5 af, \ GPIO_80 - SSP4_SDA
+ 0 af, \ GPIO_81 - VBUS_FLT_N (use as GPIO in)
+ 0 af, \ GPIO_82 - VBUS_EN (use as GPIO out)
+ 0 af, \ GPIO_83 - LCD_RST_N (use as GPIO out)
+ 0 af, \ GPIO_84 - USB_INT_N (use as GPIO in)
+ 0 af, \ GPIO_85 - USB_RST_N (use as GPIO out)
+ 0 af, \ GPIO_86 - USB_PWDN_N (use as GPIO out)
+ 0 af, \ GPIO_87 - USB_HUB_EN (use as GPIO out)
+ 0 af, \ GPIO_88 - USB_MMC_EN (use as GPIO out)
+ 0 af, \ GPIO_89 - 5V_Enable (use as GPIO out)
+ no-update, \ GPIO_90 - Not used
+ 0 af, \ GPIO_91 - ACC_INT (use as GPIO in)
+ 0 af, \ GPIO_92 - PROX1_INT (use as GPIO in)
+ no-update, \ GPIO_93 - Not used
+ 3 pull-dn, \ GPIO_94 - SPI_CLK
+ 3 pull-up, \ GPIO_95 - SPI_CSO
+\
+ 3 pull-dn, \ GPIO_96 - SPI_SDA
+ 2 af, \ GPIO_97 - TWSI6_SCL (HDMI EDID)
+ 2 af, \ GPIO_98 - TWSI6_SDA (HDMI EDID)
+ 4 af, \ GPIO_99 - TWSI5_SCL (CAP TOUCH)
+ 4 af, \ GPIO_100 - TWSI5_SDA (CAP TOUCH)
+ 0 af, \ GPIO_101 - TSI_INT (use as GPIO in)
+ 0 af, \ GPIO_102 - USIM_UCLK
+ 0 af, \ GPIO_103 - USIM_UIO
+ 0 af, \ GPIO_104 - ND_IO[7]
+ 0 af, \ GPIO_105 - ND_IO[6]
+ 0 af, \ GPIO_106 - ND_IO[5]
+ 0 af, \ GPIO_107 - ND_IO[4]
+ 0 af, \ GPIO_108 - ND_IO[15]
+ 0 af, \ GPIO_109 - ND_IO[14]
+ 0 af, \ GPIO_110 - ND_IO[13]
+ 0 af, \ GPIO_111 - ND_IO[8] Use 2 af, for eMMC
+ 0 af, \ GPIO_112 - ND_RDY[0] Use 2 af, for eMMC
+ no-update, \ GPIO_113 - Not used
+ 1 af, \ GPIO_114 - M/N_CLK_OUT (G_CLK_OUT)
+ 0 af, \ GPIO_115 - GPIO_115 (i/o)
+ 0 af, \ GPIO_116 - GPIO_116 (i/o)
+ 0 af, \ GPIO_117 - GPIO_117 (i/o)
+ 0 af, \ GPIO_118 - GPIO_118 (i/o)
+ 0 af, \ GPIO_119 - GPIO_119 (i/o)
+ 0 af, \ GPIO_120 - GPIO_120 (i/o)
+ 0 af, \ GPIO_121 - GPIO_121 (i/o)
+ 0 af, \ GPIO_122 - GPIO_122 (i/o)
+ 0 af, \ GPIO_123 - MBFLT_N (use as GPIO in)
+ 1 af, \ GPIO_124 - MMC1_DAT[7]
+ 1 af, \ GPIO_125 - MMC1_DAT[6]
+ 0 pull-up, \ GPIO_126 - Board Rev ID bit 0
+ 0 pull-up, \ GPIO_127 - Board Rev ID bit 1
+\
+ 0 pull-up, \ GPIO_128 - Board Rev ID bit 2
+ 1 af, \ GPIO_129 - MMC1_DAT[5]
+ 1 af, \ GPIO_130 - MMC1_DAT[4]
+ 1 af, \ GPIO_131 - MMC1_DAT[3]
+ 1 af, \ GPIO_132 - MMC1_DAT[2]
+ 1 af, \ GPIO_133 - MMC1_DAT[1]
+ 1 af, \ GPIO_134 - MMC1_DAT[0]
+ no-update, \ GPIO_135 - Not used
+ 1 af, \ GPIO_136 - MMC1_CMD
+ no-update, \ GPIO_137 - Not used
+ no-update, \ GPIO_138 - Not used
+ 1 af, \ GPIO_139 - MMC1_CLK
+ 1 af, \ GPIO_140 - MMC1_CD
+ 1 af, \ GPIO_141 - MMC1_WP
+ 0 af, \ GPIO_142 - USIM_RSTn
+ 0 af, \ GPIO_143 - ND_CS[0]
+ 0 af, \ GPIO_144 - ND_CS[1]
+ no-update, \ GPIO_145 - Not used
+ no-update, \ GPIO_146 - Not used
+ 0 af, \ GPIO_147 - ND_WE_N
+ 0 af, \ GPIO_148 - ND_RE_N
+ 0 af, \ GPIO_149 - ND_CLE
+ 0 af, \ GPIO_150 - ND_ALE
+ 2 af, \ GPIO_151 - MMC3_CLK
+ no-update, \ GPIO_152 - Not used
+ no-update, \ GPIO_153 - Not used
+ 0 af, \ GPIO_154 - SM_INT
+ 1 af, \ MMC3_RST_N (use as GPIO)
+ no-update, \ GPIO_156 - PRI_TDI (JTAG)
+ no-update, \ GPIO_157 - PRI_TDS (JTAG)
+ no-update, \ GPIO_158 - PRI_TDK (JTAG)
+ no-update, \ GPIO_159 - PRI_TDO (JTAG)
+\
+ 0 af, \ GPIO_160 - ND_RDY[1]
+ 0 af, \ GPIO_161 - ND_IO[12]
+ 0 af, \ GPIO_162 - ND_IO[11] Use 2 af, for eMMC
+ 0 af, \ GPIO_163 - ND_IO[10] Use 2 af, for eMMC
+ 0 af, \ GPIO_164 - ND_IO[9] Use 2 af, for eMMC
+ 0 af, \ GPIO_165 - ND_IO[3] Use 2 af, for eMMC
+ 0 af, \ GPIO_166 - ND_IO[2] Use 2 af, for eMMC
+ 0 af, \ GPIO_167 - ND_IO[1] Use 2 af, for eMMC
+ 0 af, \ GPIO_168 - ND_IO[0] Use 2 af, for eMMC
+
+: init-mfprs
+ d# 169 0 do
+ mfpr-table i wa+ w@ ( code )
+ dup 8 = if ( code )
+ drop ( )
+ else ( code )
+ i gpio>mfpr l! ( )
+ then
+ loop
+;
+
+: af! ( function# gpio# -- ) gpio>mfpr l! ;
+: gpios-for-nand ( -- )
+ h# c0 d# 111 af!
+ h# c0 d# 112 af!
+ d# 169 d# 162 do h# c0 i af! loop
+;
+: gpios-for-emmc ( -- )
+ h# c2 d# 111 af!
+ h# c2 d# 112 af!
+ d# 169 d# 162 do h# c2 i af! loop
+;
Added: cpu/arm/mmp2/mmp2.bth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/mmp2.bth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,178 @@
+purpose: Load file for OFW on Marvell MMP2 ARM demo board
+\ See license at end of file
+
+dictionary: ${BP}/cpu/arm/build/basefw.dic
+command: &armforth &dictionary &this
+build-now
+
+" mmp2.tag" r/w create-file drop tag-file !
+
+\ ' $report-name is include-hook
+
+use-movable-vector-base \ CortexA8 CPU core has a movable vector base
+
+h# 8.0000 constant initial-heap-size
+
+: (initial-heap) ( -- adr len ) limit initial-heap-size ;
+' (initial-heap) to initial-heap
+
+fload ${BP}/dev/omap/diaguart.fth \ OMAP UART
+h# d4018000 to uart-base \ UART# base address on MMP2
+
+fload ${BP}/forth/lib/sysuart.fth \ Set console I/O vectors to UART
+
+
+\ Install the simple UART driver from the standalone I/O init chain
+: stand-init-io ( -- )
+ stand-init-io
+ inituarts install-uart-io
+;
+
+\ ---
+\ ' $report-name to include-hook
+
+h# 1000 to pagesize
+d# 12 to pageshift
+
+fload ${BP}/cpu/arm/mmp2/physaddr.fth \ Architecture-generic phys. addresses
+fload ${BP}/cpu/arm/mmp2/virtaddr.fth \ Virtual addresses for the firmware
+
+fload ${BP}/cpu/arm/mmp2/addrs.fth
+fload ${BP}/cpu/arm/mmp2/twsi.fth
+fload ${BP}/cpu/arm/mmp2/timer.fth
+fload ${BP}/cpu/arm/mmp2/mfpr.fth
+: init-stuff
+ set-camera-domain-voltage
+ acgr-clocks-on
+ init-mfprs
+ set-gpio-directions
+ init-timers
+ init-twsi
+ power-on-dsi
+;
+fload ${BP}/cpu/arm/mmp2/gpio.fth
+fload ${BP}/cpu/arm/mmp2/lcdcfg.fth
+fload ${BP}/cpu/arm/mmp2/dsi.fth
+fload ${BP}/cpu/arm/mmp2/lcd.fth
+: display-on
+ init-stuff
+ init-lcd
+ fb-pa hdisp vdisp * >bytes h# ff fill
+;
+
+
+\ fload ${BP}/cpu/arm/rootnode.fth \ Root node mapping
+fload ${BP}/cpu/arm/mmp2/rootnode.fth \ Root node mapping - physical mode
+dev /
+ " Marvell,Bonnell" model
+ " ARM SOC" encode-string " architecture" property
+ 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
+fload ${BP}/ofw/core/clntmem1.fth \ client services for memory
+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/mmp2/probemem.fth \ Populate memory node
+stand-init: Probing memory
+ " probe" memory-node @ $call-method
+;
+
+fload ${BP}/cpu/arm/loadvmem.fth \ /mmu node
+stand-init: MMU
+ " /mmu" open-dev mmu-node !
+;
+\ fload ${BP}/pkg/console/bailout.fth \ Keyboard bailout code
+
+hex
+warning on
+
+" /openprom" find-device
+ " FirmWorks,3.0" encode-string " model" property
+device-end
+
+\ fload ${BP}/arch/dna/mmusetup.fth \ Initial values for MMU lists
+
+\ fload ${BP}/arch/dna/boot.fth
+
+\ false ' auto-boot? set-config-int-default
+
+\ 1 section before origin section table
+h# 10.0000 h# 8000 - h# 4000 - dictionary-size !
+
+\ dev /mmu
+\ patch instruction! l! section!
+\ device-end
+
+defer probe-all
+: (probe-all) ( -- )
+ " probe-" do-drop-in
+ " probe+" do-drop-in
+;
+' (probe-all) to probe-all
+
+\ ---
+
+d# 3000 to ms-factor
+
+fload ${BP}/cpu/arm/mmp2/sdhcimmp2.fth
+
+tag-file @ fclose tag-file off
+
+fload ${BP}/cpu/arm/saverom.fth \ Save the dictionary for standalone startup
+
+.( --- Saving mmp2.dic --- ) cr " mmp2.dic" $save-forth
+
+\ This is some glue code to convert the machine setup that QEMU gives us
+\ to the setup that start-forth (see arm/boot.fth) wants.
+\ We get here via a call instruction at origin+8, which is inserted below
+
+code stand-cold-code ( r0: 0 r1: board-id r2: &kernel-args lr: &aif_header+8c )
+ here origin 8 + put-call \ Insert call instruction
+
+ \ Put the arguments in safe registers
+ sub r6,lr,#0x8c \ r6 points to header (lr set by code at origin)
+ mov r7,#0 \ r7: functions
+ add r8,r6,0x200000 \ r8: memtop - 2MiB above load address
+ \ r9 is up
+ mov r10,#0 \ r10: argc
+ mov r11,r2 \ r11: argv (kernel args)
+ mov r12,`initial-heap-size` \ r12: initial-heap-size
+
+ b 'code start-forth \ Branch to the generic startup code
+end-code
+
+.( --- Saving mmp2.rom --- ) cr " mmp2.rom" $save-rom
+
+\ 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: cpu/arm/mmp2/physaddr.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/physaddr.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,4 @@
+h# 2000.0000 constant sdram-size
+
+: (memory?) ( phys -- flag ) sdram-size u< ;
+' (memory?) to memory?
Added: cpu/arm/mmp2/probemem.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/probemem.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,29 @@
+purpose: Memory probing
+copyright: Copyright 1994 FirmWorks All Rights Reserved
+
+" /memory" find-device
+
+headerless
+
+h# ffff.ffff value low
+h# 0 value high
+
+: log&release ( adr len -- )
+ over low umin to low ( adr len )
+ 2dup + high umax to high ( adr len )
+ release
+;
+
+headers
+: probe ( -- )
+ 0 sdram-size log&release
+
+ 0 0 encode-bytes ( adr 0 )
+ physavail ['] make-phys-memlist find-node ( adr len prev 0 )
+ 2drop " reg" property
+
+ \ Claim the memory used by OFW
+\ high h# 10.0000 - h# 10.0000 0 claim drop
+;
+
+device-end
Added: cpu/arm/mmp2/rootnode.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/rootnode.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,99 @@
+purpose: Methods for root node
+\ See license at end of file
+
+: root-map-in ( phys len -- virt )
+ " /" " map-in" execute-device-method drop
+;
+: root-map-out ( virt len -- )
+ " /" " map-out" execute-device-method drop
+;
+
+dev /
+extend-package
+
+1 encode-int " #address-cells" property
+
+hex
+
+\ Static methods
+: decode-unit ( adr len -- phys ) push-hex $number if 0 then pop-base ;
+: encode-unit ( phys -- adr len ) push-hex (u.) pop-base ;
+
+\ Not-necessarily-static methods
+: open ( -- true ) true ;
+: close ( -- ) ;
+
+: map-in ( phys size -- virt )
+ drop
+;
+: map-out ( virtual size -- )
+ 2drop
+;
+
+: dma-alloc ( size -- virt ) alloc-mem ;
+: dma-free ( virt size -- ) free-mem ;
+
+: dma-map-in ( virt size cacheable -- devaddr )
+ drop 2dup flush-d$-range drop ( virt )
+;
+: dma-map-out ( virt devaddr size -- ) nip flush-d$-range ;
+
+: dma-sync ( virt devaddr size -- ) nip flush-d$-range ;
+: dma-push ( virt devaddr size -- ) nip flush-d$-range ;
+: dma-pull ( virt devaddr size -- ) nip flush-d$-range ;
+
+finish-device
+
+device-end
+
+\ Call this after the system-mac-address is determined, which is typically
+\ done near the end of the probing process.
+: set-system-id ( -- )
+ system-mac-address dup if ( adr 6 )
+ " /" find-device ( adr 6 )
+
+ \ Convert the six bytes of the MAC address into a string of the
+ \ form 0NNNNNNNNNN, where N is an uppercase hex digit.
+ push-hex ( adr 6 )
+
+ <# bounds swap 1- ?do ( )
+ i c@ u# u# drop ( )
+ -1 +loop ( )
+ 0 u# u#> ( adr len )
+
+ 2dup upper ( adr len ) \ Force upper case
+
+ pop-base ( adr len )
+
+ encode-string " system-id" property ( )
+
+ device-end
+ else
+ 2drop
+ then
+;
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2007 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: cpu/arm/mmp2/sdhcimmp2.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/sdhcimmp2.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,27 @@
+purpose: Load file for SDHCI (Secure Digital Host Controller Interface)
+
+0 0 " d4280000" " /" begin-package
+
+ fload ${BP}/cpu/arm/mmp2/sdregs.fth
+ fload ${BP}/dev/mmc/sdhci/sdhci.fth
+
+ new-device
+ 3 encode-int " reg" property
+ fload ${BP}/dev/mmc/sdhci/sdmmc.fth
+ \ fload ${BP}/dev/mmc/sdhci/selftest.fth
+ " internal" " slot-name" string-property
+ finish-device
+
+\ new-device
+\ 2 encode-int " reg" property
+\ " mv8686" " $load-driver" eval drop
+\ finish-device
+
+ new-device
+ 1 encode-int " reg" property
+ fload ${BP}/dev/mmc/sdhci/sdmmc.fth
+ \ fload ${BP}/dev/mmc/sdhci/selftest.fth
+ " external" " slot-name" string-property
+ finish-device
+
+end-package
Added: cpu/arm/mmp2/sdregs.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/sdregs.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,27 @@
+h# 100 value /regs \ Standard size of SDHCI register block
+4 value #slots
+
+0 instance value slot
+0 instance value chip
+
+0 0 encode-bytes
+h# d4280000 encode-phys encode+ /regs encode-int encode+
+h# d4280800 encode-phys encode+ /regs encode-int encode+
+h# d4281000 encode-phys encode+ /regs encode-int encode+
+h# d4281800 encode-phys encode+ /regs encode-int encode+
+" reg" property
+
+: map-regs ( -- )
+ chip if exit then
+ slot 1- h# 800 * my-space + /regs " map-in" $call-parent
+ to chip
+;
+: unmap-regs ( -- )
+ chip 0= if exit then
+ chip /regs " map-out" $call-parent
+ 0 to chip
+;
+
+: vendor-modes ( -- ) ;
+: ?cafe-fpga-quirk ( -- ) ;
+: ?via-quirk ( -- ) ;
Added: cpu/arm/mmp2/timer.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/timer.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,50 @@
+: +!@ ( value offset base -- ) + tuck l! l@ drop ;
+: timer! ( value offset -- ) timer-pa +!@ ;
+: init-timers ( -- )
+ h# 13 h# 24 clock-unit-pa + l!
+ 0 h# 84 timer-pa + l! \ TMR_CER - count enable
+ begin h# 84 timer-pa + l@ 7 and 0= until
+ h# 24 h# 00 timer-pa +!@ \ TMR_CCR - clock control
+ h# 200 0 do loop
+ 0 h# 88 timer! \ count mode - periodic
+ 0 h# 4c timer! \ preload value timer 0
+ 0 h# 50 timer! \ preload value timer 1
+ 0 h# 54 timer! \ preload value timer 2
+ 0 h# 58 timer! \ free run timer 0
+ 0 h# 5c timer! \ free run timer 1
+ 0 h# 60 timer! \ free run timer 2
+ 7 h# 74 timer! \ interrupt clear timer 0
+ h# 100 h# 4 timer! \ Force match
+ h# 100 h# 8 timer! \ Force match
+ h# 100 h# c timer! \ Force match
+ h# 200 0 do loop
+ 7 h# 84 timer!
+;
+
+
+code timer0@ ( -- n ) \ 3.25 MHz
+ psh tos,sp
+ set r1,0xD4014000
+ mov r0,#1
+ str r0,[r1,#0xa4]
+ mov r0,r0
+ ldr tos,[r1,#0x28]
+c;
+
+code timer1@ ( -- n ) \ 32.768 kHz
+ psh tos,sp
+ set r1,0xD4014000
+ mov r0,#1
+ str r0,[r1,#0xa8]
+ mov r0,r0
+ ldr tos,[r1,#0x2c]
+c;
+
+code timer2@ ( -- n ) \ 1 kHz
+ psh tos,sp
+ set r1,0xD4014000
+ mov r0,#1
+ str r0,[r1,#0xac]
+ mov r0,r0
+ ldr tos,[r1,#0x30]
+c;
Added: cpu/arm/mmp2/twsi.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/twsi.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,316 @@
+purpose: Driver for Two Wire Serial Interface on Marvell Armada 610
+
+\ 0 0 " d4011000" " /" begin-package
+
+0 value chip
+0 value clock-reg
+0 value slave-address
+
+: dbr@ ( -- n ) chip h# 08 + l@ ;
+: cr@ ( -- n ) chip h# 10 + l@ ;
+: sr@ ( -- n ) chip h# 18 + l@ ;
+: sar@ ( -- n ) chip h# 20 + l@ ;
+: lcr@ ( -- n ) chip h# 28 + l@ ;
+: dbr! ( n -- ) chip h# 08 + l! ;
+: cr! ( n -- ) chip h# 10 + l! ;
+: sr! ( n -- ) chip h# 18 + l! ;
+: sar! ( n -- ) chip h# 20 + l! ;
+: lcr! ( n -- ) chip h# 28 + l! ;
+
+create channel-bases
+h# D4011000 , h# D4031000 , h# D4032000 , h# D4033000 , h# D4033800 , h# D4034000 ,
+
+create clock-offsets
+h# 04 c, h# 08 c, h# 0c c, h# 10 c, h# 7c c, h# 80 c,
+
+create slave-addresses \ per channel
+h# 78 c, \ 1 MAX8925 PMIC MAIN 78, PMIC ADC 8e, PMIC RTC d0, MAX8649 c0
+h# 34 c, \ 2 WM8994 Audio Codec 34, WM2000 Noise Canceler 74
+h# 3e c, \ 3 m6M0 Camera ISP 3e, OV8810 Camera 6c
+h# 3c c, \ 4 HMC5843 compass 3c, CM3623 ALS/PS 20+22+b0, BMA150 accelerometer 70
+h# 16 c, \ 5 TC358762 MIPI bridge 16, TM-1210 or TM1414 touchscreen 40
+h# a0 c, \ 6 HDMI DDC EDID a0
+
+: set-slave ( n -- ) to slave-address ;
+: set-address ( n -- ) \ Channel numbers range from 1 to 6
+ 1-
+ channel-bases over na+ @ to chip ( n )
+ dup clock-offsets + c@ clock-unit-pa + to clock-reg ( n )
+ slave-addresses + c@ set-slave
+;
+
+\ Bit defines
+
+h# 4000 constant bbu_ICR_UR \ Unit Reset bit
+h# 0040 constant bbu_ICR_IUE \ ICR TWSI Unit enable bit
+h# 0020 constant bbu_ICR_SCLE \ ICR TWSI SCL Enable bit
+h# 0010 constant bbu_ICR_MA \ ICR Master Abort bit
+h# 0008 constant bbu_ICR_TB \ ICR Transfer Byte bit
+h# 0004 constant bbu_ICR_ACKNAK \ ICR ACK bit
+h# 0002 constant bbu_ICR_STOP \ ICR STOP bit
+h# 0001 constant bbu_ICR_START \ ICR START bit
+h# 0040 constant bbu_ISR_ITE \ ISR Transmit empty bit
+h# 0400 constant bbu_ISR_BED \ Bus Error Detect bit
+
+h# 1000 constant BBU_TWSI_TimeOut \ TWSI bus timeout loop counter value
+
+bbu_ICR_IUE bbu_ICR_SCLE or constant iue+scle
+: init-twsi-channel ( channel# -- )
+ set-address
+ 7 clock-reg l! 3 clock-reg l! \ Set then clear reset bit
+ 1 us
+ iue+scle bbu_ICR_UR or cr! \ Reset the unit
+ iue+scle cr! \ Release the reset
+ 0 sar! \ Set host slave address
+ 0 cr! \ Disable interrupts
+;
+
+: twsi-run ( extra-flags -- )
+ iue+scle or bbu_ICR_TB or cr! ( )
+
+ h# 1000 0 do
+ cr@ bbu_ICR_TB and 0= if unloop exit then
+ loop
+ true abort" TWSI timeout"
+;
+: twsi-putbyte ( byte extra-flags -- )
+ swap dbr! ( extra-flags )
+ twsi-run
+;
+: twsi-getbyte ( extra-flags -- byte )
+ twsi-run ( )
+ dbr@ ( byte )
+ sr@ sr! ( byte )
+;
+
+: twsi-start ( slave-address -- )
+ bbu_ICR_START twsi-putbyte ( )
+ sr@ bbu_ISR_BED and if ( )
+ bbu_ISR_BED sr! ( )
+ iue+scle bbu_ICR_MA or cr! ( )
+ true abort" TWSI bus error"
+ then ( )
+;
+
+: twsi-get ( register-address .. #reg-bytes #data-bytes -- data-byte ... )
+ >r ( reg-adr .. #regs r: #data-bytes )
+ \ Handle the case where the device does not require that a write register address be sent
+ slave-address ( reg-adr .. #regs slave-address r: #data-bytes )
+ over 0= if ( reg-adr .. #regs slave-address r: #data-bytes )
+ r@ if ( reg-adr .. #regs slave-address r: #data-bytes )
+ 1 or ( reg-adr .. #regs slave-address' r: #data-bytes )
+ then ( reg-adr .. #regs slave-address' r: #data-bytes )
+ then ( reg-adr .. #regs slave-address' r: #data-bytes )
+
+ twsi-start ( reg-adr .. #regs r: #data-bytes )
+
+ \ Abort the transaction if both #reg-bytes and #data-bytes are 0
+ dup r@ or 0= if ( #regs r: #data-bytes )
+ iue+scle bbu_ICR_MA or cr! ( #regs r: #data-bytes ) \ Master abort
+ r> 2drop exit ( -- )
+ then ( reg-adr .. #regs r: #data-bytes )
+
+ \ Send register addresses, if any
+ 0 ?do 0 twsi-putbyte loop ( r: #data-bytes )
+
+ \ If no result data requested, quit now
+ r> dup 0= if ( #data-bytes )
+ drop ( )
+ iue+scle bbu_ICR_STOP or cr! ( )
+ exit
+ then ( #data-bytes )
+
+ \ Otherwise send the read address with another start bit
+ slave-address 1 or bbu_ICR_START twsi-putbyte ( #data-bytes )
+ sr@ sr! \ clear ITE and IRF status bits ( #data-bytes )
+ \ Bug on line 367 of bbu_TWSI.s - writes SR without first reading it
+
+ 1- 0 ?do 0 twsi-getbyte loop ( bytes )
+
+ \ Set the stop bit on the final byte
+ bbu_ICR_STOP bbu_ICR_ACKNAK or twsi-getbyte ( bytes )
+;
+
+: twsi-write ( byte .. #bytes -- )
+ slave-address twsi-start ( byte .. #bytes )
+
+ 1- 0 ?do 0 twsi-putbyte loop ( byte )
+ bbu_ICR_STOP twsi-putbyte ( )
+;
+
+: twsi-b@ ( reg -- byte ) 1 1 twsi-get ;
+: twsi-b! ( byte reg -- ) 2 twsi-write ;
+
+: select-touch-panel ( -- )
+ 5 set-address
+ h# 40 set-slave
+;
+: touch-panel-type ( -- n )
+ select-touch-panel
+ h# bd twsi-b@
+;
+: get-tm1414-data ( -- x y finger-mask )
+ select-touch-panel ( )
+ h# 1a twsi-b@ ( low-y,low-x )
+ dup h# f and h# 18 twsi-b@ 4 lshift or ( low-y,low-x x )
+ swap 4 rshift h# f and h# 19 twsi-b@ 4 lshift or ( x y )
+ h# 15 twsi-b@ ( x y mask )
+;
+: touchpad@ ( -- x y finger-mask ) get-tm1414-data ;
+
+: get-tm1210-data ( -- x y reg7-flick-magnitude reg6-gesture reg0-finger-count )
+ 3 twsi-b@ 2 twsi-b@ bwjoin ( x )
+ 5 twsi-b@ 4 twsi-b@ bwjoin ( x y )
+
+ 7 twsi-b@
+ 6 twsi-b@
+ 0 twsi-b@
+;
+
+: select-compass ( -- )
+ 4 set-address
+ h# 3c set-slave
+;
+
+: compass@ ( -- x y z temp id )
+ select-compass
+ 0 0 twsi-b! \ Config register A
+ h# 50 1 twsi-b! \ Config register B
+ 0 2 twsi-b! \ Mode register
+ 4 twsi-b@ 3 twsi-b@ bwjoin ( x )
+ 6 twsi-b@ 5 twsi-b@ bwjoin ( x y )
+ 8 twsi-b@ 7 twsi-b@ bwjoin ( x y z )
+ h# b twsi-b@ ( x y z temp )
+ h# a twsi-b@ 9 twsi-b@ bwjoin ( x y z temp id )
+;
+
+: select-pmic ( -- ) 1 set-address h# 78 set-slave ;
+
+: accel-power-on ( -- ) \ LDO8 - vout is 36, ctl is 34
+ select-pmic
+ d# 3000 d# 750 - d# 50 / h# 36 twsi-b! \ want 3.0V
+ h# 1f h# 34 twsi-b!
+;
+: accel-power-off ( -- ) \ LDO8 - vout is 36, ctl is 34
+ select-pmic
+ h# 1e h# 34 twsi-b!
+;
+: accel@ ( -- x y z temp id )
+ 4 set-address
+ h# 70 set-slave
+
+ 2 twsi-b@ 6 rshift ( x-low )
+ 3 twsi-b@ 2 lshift or ( x )
+
+ 4 twsi-b@ 6 rshift ( x y-low )
+ 5 twsi-b@ 2 lshift or ( x y )
+
+ 6 twsi-b@ 6 rshift ( x y z-low )
+ 7 twsi-b@ 2 lshift or ( x y z )
+
+ 8 twsi-b@ 0 twsi-b@ ( x y z temp id )
+;
+
+: init-pals ( -- )
+ 4 set-address
+
+ h# b0 set-slave \ Set PS parameters address
+ 0 1 twsi-write \ clear interrupt settings
+
+ h# 22 set-slave \ Device init address
+ h# 10 1 twsi-write \ Init device
+
+ h# 20 set-slave \ Ambient Light Sensor address
+ 2 1 twsi-write \ Enable ALS in most sensitive mode, 16-bit data
+;
+: als@ ( -- n )
+ 4 set-address
+ h# 22 set-slave \ Ambient Light Sensor LSB address
+ 0 1 twsi-get ( low )
+ h# 20 set-slave \ Ambient Light Sensor MSB address
+ 0 1 twsi-get bwjoin ( n )
+;
+
+: proximity@ ( -- byte )
+ 4 set-address
+ h# b0 set-slave \ Proximity Sensor address
+ 0 1 twsi-get ( byte )
+;
+
+: lcd-backlight! ( b.intensity -- )
+ select-pmic ( b.intensity )
+ dup if ( b.intensity )
+ h# 85 twsi-b! ( )
+ h# 84 twsi-b@ 1 or h# 84 twsi-b! \ Turn on first LED string
+ else ( 0 )
+ drop ( )
+ h# 84 twsi-b@ 1 invert and h# 84 twsi-b! \ Turn off first LED string
+ then
+;
+
+: keypad-backlight! ( b.intensity -- )
+ select-pmic ( b.intensity )
+ dup if ( b.intensity )
+ h# 85 twsi-b! ( )
+ h# 84 twsi-b@ 3 or h# 84 twsi-b! \ Turn on both LED strings
+ else ( )
+ h# 84 twsi-b@ 3 invert and h# 84 twsi-b! \ Turn off both LED strings
+ then
+;
+
+: init-twsi ( -- )
+ 7 1 do i init-twsi-channel loop
+;
+: power-on-dsi ( -- )
+ select-pmic
+
+ h# 16 h# 22 twsi-b! \ 1.2 volts for LDO3
+ h# 1f h# 20 twsi-b! \ LDO3 enable
+
+ h# 16 h# 16 twsi-b! \ 1.2 volts for LDO17
+ h# 1f h# 14 twsi-b! \ LDO17 enable
+
+ h# 1f h# 34 twsi-b! \ LDO8 enable
+
+ d# 10 ms
+;
+
+: bcd> ( bcd -- binary )
+ dup h# f and swap 4 rshift d# 10 * +
+;
+: twsi-bcd@ ( reg# -- binary ) twsi-b@ bcd> ;
+: get-rtc ( -- )
+ 1 set-address
+ h# d0 set-slave
+
+\ 3 twsi-b@ ( dow )
+\
+
+ 0 twsi-bcd@ ( sec )
+ 1 twsi-bcd@ ( sec min )
+ 2 twsi-bcd@ ( sec min hr )
+ 4 twsi-bcd@ ( sec min hr day )
+ 5 twsi-bcd@ ( sec min hr day mon )
+ 6 twsi-bcd@ d# 2000 + ( sec min hr day yr )
+;
+
+: core-voltage! ( mv -- )
+ 1 set-address h# c0 set-slave \ MAX8649 power management IC
+
+ d# 750 umax d# 1350 umin \ Clipped voltage
+ d# 750 - d# 10 / ( offset-in-mv/10 )
+ h# 80 or ( code )
+ 2 twsi-b!
+;
+: core-voltage@ ( -- mv )
+ 1 set-address h# c0 set-slave \ MAX8649 power management IC
+ 2 twsi-b@ ( code )
+ h# 7f and ( offset-mv/10 )
+ d# 10 * ( offset-mv )
+ d# 750 +
+;
+: .core-voltage ( -- ) core-voltage@ .d ;
+
+: vibrate-on ( -- ) select-pmic h# 1f h# 3c twsi-b! ; \ LDO10
+: vibrate-off ( -- ) select-pmic h# 1e h# 3c twsi-b! ;
+
Added: cpu/arm/mmp2/virtaddr.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/mmp2/virtaddr.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,3 @@
+h# 10.0000 constant fw-virt-base
+h# 40.0000 constant fw-virt-size
+
Added: cpu/arm/rootnode.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/rootnode.fth Wed Jun 16 13:41:36 2010 (r1823)
@@ -0,0 +1,105 @@
+purpose: Methods for root node
+\ See license at end of file
+
+: root-map-in ( phys len -- virt )
+ " /" " map-in" execute-device-method drop
+;
+: root-map-out ( virt len -- )
+ " /" " map-out" execute-device-method drop
+;
+
+dev /
+extend-package
+
+1 encode-int " #address-cells" property
+
+hex
+
+\ Static methods
+: decode-unit ( adr len -- phys ) push-hex $number if 0 then pop-base ;
+: encode-unit ( phys -- adr len ) push-hex (u.) pop-base ;
+
+\ Not-necessarily-static methods
+: open ( -- true ) true ;
+: close ( -- ) ;
+
+: map-in ( phys size -- virt )
+ over mmu-lowbits + pagesize round-up >r ( phys r: size' )
+ r@ pagesize mmu-claim ( phys virt r: size' )
+ >r dup mmu-highbits ( phys phys' r: size' virt )
+ r> r> over >r ( phys phys' virt size r: virt )
+ -1 mmu-map ( phys r: virt )
+ mmu-lowbits r> + ( virtual )
+;
+: map-out ( virtual size -- )
+ 2dup mmu-unmap mmu-release
+;
+
+: dma-alloc ( size -- virt ) alloc-mem ;
+: dma-free ( virt size -- ) free-mem ;
+
+: dma-map-in ( virt size cacheable -- devaddr )
+ drop 2dup flush-d$-range drop ( virt )
+ mmu-translate 0= abort" Invalid DMA address" drop ( phys )
+;
+: dma-map-out ( virt devaddr size -- ) nip flush-d$-range ;
+
+: dma-sync ( virt devaddr size -- ) nip flush-d$-range ;
+: dma-push ( virt devaddr size -- ) nip flush-d$-range ;
+: dma-pull ( virt devaddr size -- ) nip flush-d$-range ;
+
+finish-device
+
+device-end
+
+\ Call this after the system-mac-address is determined, which is typically
+\ done near the end of the probing process.
+: set-system-id ( -- )
+ system-mac-address dup if ( adr 6 )
+ " /" find-device ( adr 6 )
+
+ \ Convert the six bytes of the MAC address into a string of the
+ \ form 0NNNNNNNNNN, where N is an uppercase hex digit.
+ push-hex ( adr 6 )
+
+ <# bounds swap 1- ?do ( )
+ i c@ u# u# drop ( )
+ -1 +loop ( )
+ 0 u# u#> ( adr len )
+
+ 2dup upper ( adr len ) \ Force upper case
+
+ pop-base ( adr len )
+
+ encode-string " system-id" property ( )
+
+ device-end
+ else
+ 2drop
+ then
+;
+headers
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2007 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
More information about the openfirmware
mailing list