Changeset 3085


Ignore:
Timestamp:
Jul 27, 2012, 2:54:42 AM (3 years ago)
Author:
wmb
Message:

OLPC EDI driver - handle differences between KB3731 and the new KB9010

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpu/arm/olpc/edi.fth

    r2805 r3085  
    1313\  spi-out    ( byte -- ) - Send byte
    1414\  spi-in     ( -- byte ) - Receive byte
     15
     160 value edi-chip-id
     17: kb9010?  ( -- flag )  edi-chip-id 4 =  ;
     18
     19: efcfg    ( -- reg# )  kb9010?  if  h# fea0  else  h# fead  then  ;
     20: efcmd    ( -- reg# )  kb9010?  if  h# fea7  else  h# feac  then  ;
     21: efdat    ( -- reg# )  kb9010?  if  h# feaa  else  h# feab  then  ;
     22: rst8051  ( -- reg# )  kb9010?  if  h# f010  else  h# ff14  then  ;
     23
     24\ Issues with .py code
     25\ A14:A8 should be A15:A8 several places
     26\ inconsistent use of handle vs gd.handle in edi_erase_chip
     27
     28\ KB9010 stuff...
     29d# 59 d# 1024 * constant /kb9010-flash
     30h# fe80 constant wdtcfg
     31h# fe81 constant wdtpf
     32h# fe82 constant wdt
     33h# fea2 constant shccfg
     34\ h# fea5 constant xbicfg \ Unused
     35h# fea6 constant xbics
     36\ h# feae constant efdatr \ Unused
     37\ h# feaf constant emfburw
     38h# feb2 constant xbiwp
     39\ h# feb6 constant xbipump
     40\ h# feb7 constant xbifm
     41\ h# feb8 constant sbivr
     42h# feb9 constant xbis
     43h# ff0d constant clkcfg
     44h# ff0f constant pllcfg
     45h# ff1d constant ecsts
     46h# ff1f constant pllcfg2
     47h# ff14 constant pxcfg
     48
     49\ end KB9010 stuff...
    1550
    1651d# 128 constant /flash-page
     
    74109[then]
    75110: reset-8051  ( -- )  \ Reset 8-5
    76    h# f010 edi-b@  1 or  h# f010 edi-b!
     111   rst8051 edi-b@  1 or  rst8051 edi-b!
    77112;
    78113: unreset-8051  ( -- )  \ Reset 8-5
    79    h# f010 edi-b@  1 invert and  h# f010 edi-b!
     114   rst8051 edi-b@  1 invert and  rst8051 edi-b!
    80115   d# 2000 ms
    81116;
     
    83118\ 0 in bit 0 selects masked ROM as code source for 8051, 1 selects FLASH
    84119\ The 8051 should be in reset mode when changing that bit.
     120
    85121: select-flash  ( -- )  \ Setup for access to FLASH inside the EC
     122   kb9010?  if  exit  then
    86123   h# f011 edi-b@  1 or  h# f011 edi-b!
     124;
     125
     126: edi-read-id  ( -- id )
     127   spi-cs-on  h# 3e spi-out  0 spi-out  spi-in  spi-cs-off
    87128;
    88129
     
    96137;
    97138
     139: finished?  ( b -- flag )
     140   kb9010?  if  2 and 0=  else  h# 80 =  then
     141;
    98142: wait-flash-busy  ( -- )  \ Wait for an erase/programming operation to complete
    99143   get-msecs  h# 1000 +    ( limit )
    100144   begin                   ( limit )
    101       h# fea0 edi-b@       ( limit b )
    102       h# 80 and  if        ( limit )
    103          drop exit
     145      efcfg edi-b@         ( limit b )
     146      finished?  if        ( limit )
     147         drop exit         ( -- )
    104148      then                 ( limit )
    105149      dup get-msecs - 0<=  ( limit timeout? )
     
    109153;
    110154
    111 : flash-cmd  ( b -- )  h# fea7 edi-b!  ;
     155: flash-cmd  ( b -- )  efcmd edi-b!  ;
    112156
    113157: set-offset  ( offset -- )
    114    wbsplit                          ( offset-low offset-hi )
    115    h# fea9 edi-b!  h# fea8 edi-b!   ( )
     158   lbsplit drop                                   ( offset-low mid hi )
     159   kb9010?  if  h# feaa edi-b!  else  drop  then  ( offset-low mid )
     160   h# fea9 edi-b!  h# fea8 edi-b!                 ( )
    116161;
    117162
     
    122167;
    123168
    124 : erase-chip  ( -- )  wait-flash-busy  h# 60 flash-cmd  wait-flash-busy  ;
    125 
    126 : send-byte  ( b offset -- )  set-offset  h# feaa edi-b!  2 flash-cmd  ;
     169: erase-chip  ( -- ) 
     170   0 set-offset  \ New code does this (and does not wait-flash-busy)
     171   wait-flash-busy  h# 60 flash-cmd  wait-flash-busy
     172;
     173
     174: send-byte  ( b offset -- )  set-offset  efdat edi-b!  2 flash-cmd  ;
    127175
    128176: edi-program-page  ( adr offset -- )
    129177   \ Clear HVPL
    130178   wait-flash-busy  h# 80 flash-cmd  ( adr offset )
     179
     180   wait-flash-busy                ( adr offset )  \ Necessary?
    131181
    132182   \ Fill the page buffer
     
    139189   \ Commit the buffer to the FLASH memory
    140190   wait-flash-busy                ( )  \ Redundant wait?
    141    h# 70 flash-cmd                ( )
     191   h# 70 flash-cmd                ( )  \ Program page command
    142192   wait-flash-busy                ( )
    143193;
     
    163213   loop                           ( )
    164214;
     215
    165216: trim@  ( offset -- b )
    166217   set-offset
    167218   h# 90 flash-cmd
    168219   wait-flash-busy
    169    h# feab edi-b@
     220   efdat edi-b@   \ reg: efdat
    170221;
    171222: trim-tune  ( -- )
     
    227278\   then
    228279;
     280: set-chip-id  ( -- )
     281   ['] edi-read-id  catch  if        ( )
     282       edi-read-id                   ( id )
     283   then                              ( id )
     284   to edi-chip-id
     285;
     286: kb9010-init  ( -- )
     287   h# 00 xbics  edi-b!
     288   h# 00 xbiwp  edi-b! \ Clear XBI write protection
     289   h# ff wdt    edi-b! \ Disable WDT
     290   h# 00 wdtcfg edi-b!
     291   h# 00 wdtpf  edi-b!
     292   h# 00 shccfg edi-b! \ Disable SHC
     293   h# 0c clkcfg edi-b! \ Set the 8051 to 32Mhz
     294   h# 08 efcfg  edi-b! \ Enable the embedded flash cmd mode
     295;
     296base @ hex
     297create special-row     1f0 w,  1f1 w,  1f2 w,  1f4 w,  1f5 w,  1f6 w,  1f3 w,
     298create dest-regs      feb9 w, feb6 w, feb6 w, feb7 w, feb8 w, feb8 w, feb7 w,
     299create source-bits      1f c,   0f c,   0f c,   0f c,   07 c,   1f c,   0f c,
     300create dest-bits        1f c,   f0 c,   0f c,   0f c,   e0 c,   1f c,   f0 c,
     301create shift-cnt         0 c,    4 c,    0 c,    0 c,    5 c,    0 c,    4 c,
     302base !
     303: kb9010-trimtune  ( -- )
     304   h# 1ff trim@  0<>  if
     305      7 0  do
     306         special-row i wa+ w@  edi-b@         ( data )
     307         source-bits i ca+ c@  or             ( field )
     308         shift-cnt   i ca+ c@  lshift         ( field' )
     309         dest-regs   i wa+ w@  edi-b@         ( field dest )
     310         dest-bits   i ca+ c@  invert and or  ( dest' )
     311         dest-regs   i wa+ w@  edi-b!         ( )
     312      loop
     313      wait-flash-busy
     314   then
     315   h# 80 trim@  h# 5a =  if
     316      ecsts edi-b@                   ( old-ecsts )
     317      dup 4 or  ecsts edi-b!         ( old-ecsts )  \ chipid is now pllcfg2
     318
     319      xbis edi-b@  h# 3f and               ( old-ecsts xbis-bits )
     320      h# 81 edi-b@ 3 and  6 lshift or      ( old-ecsts xbis-value )
     321      xbis edi-b!                          ( old-ecsts )
     322
     323      h# 82 edi-b@ h# f and 4 lshift       ( old-ecsts pll-high )
     324      h# 83 edi-b@ h# f0 and 4 rshift or   ( old-ecsts pll-value )
     325      pllcfg edi-b!                        ( old-ecsts )
     326
     327      pllcfg2 edi-b@ h# 3f and             ( old-ecsts pll2-bits )
     328      h# 82 edi-b@ h# 30 and 2 lshift or   ( old-ecsts pll2-value )
     329      pllcfg2 edi-b!                       ( old-ecsts )
     330     
     331      ecsts edi-b!                         ( )
     332   then
     333;
    229334: edi-open  ( -- )
    230335   \ slow-edi-clock   \ Target speed between 1 and 2 MHz
    231336   spi-start
     337   
     338   set-chip-id
     339
    232340   \ The first operation often fails so retry it
    233341   ['] select-flash  catch  if  select-flash  then
    234342   reset-8051
    235    trim-tune
     343
     344   kb9010?  if
     345      kb9010-init
     346      kb9010-trimtune
     347   else
     348      trim-tune
     349   then
    236350   \ fast-edi-clock   \ Target speed up to 16 MHz
    237351   \ reset
Note: See TracChangeset for help on using the changeset viewer.