[openfirmware] [commit] r1971 - dev/olpc/kb3700

repository service svn at openfirmware.info
Fri Oct 8 09:51:35 CEST 2010


Author: wmb
Date: Fri Oct  8 09:51:35 2010
New Revision: 1971
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/1971

Log:
OLPC XO-1.75 - added spicmd.fth .

Added:
   dev/olpc/kb3700/spicmd.fth

Added: dev/olpc/kb3700/spicmd.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dev/olpc/kb3700/spicmd.fth	Fri Oct  8 09:51:35 2010	(r1971)
@@ -0,0 +1,260 @@
+\ See license at end of file
+purpose: Host to EC SPI protocol
+
+\ See http://wiki.laptop.org/go/XO_1.75_HOST_to_EC_Protocol
+
+\ Interface from pckbd.fth to i8042.fth:
+\   set-port  ( port# -- )  \ Selects keyboard (port#=0) or mouse (port#=1)
+\   get-data  ( -- data | -1 )  \ Returns a keyboard or mouse byte, or -1 if none after one second
+\   get-data?  ( -- false | data true )  \ Non-blocking version of get-data
+\   clear-out-buf  ( -- )  \ Drains pending data, waiting until 120 ms elapses with no data.  Built from get-data?
+\   put-get-data  ( cmd -- data | -1 )   \ Sends cmd and waits for one response byte
+\         Used only by "echo?", which is not called on OLPC.
+\   put-data  ( data -- )  \ Sends a byte to the keyboard or mouse
+\         Used only by "cmd".  "cmd" is used by set-scan-set, default-disable-kbd, enable-scan, set-leds, toggle-leds,
+\         kbd-reset, (obsolete) olpc-set-ec-keymap.  set-scan-set is used only by commented-out code guarded by
+\         the non-defined ifdef "fix-keyboard".  default-disable-kbd is called only by get-initial-state (NC on OLPC).
+\         enable-scan is NC on OLPC.  set-leds is called by toggle-leds with is called when you press numlock or
+\         scrolllock or capslock, none of which the OLPC keyboard has.
+\   enable-intf  ( -- )  \ Sends "ae" to the keyboard controller (not the keyboard).  Not called on OLPC with current FW.
+\   test-lines  ( -- error? )  \ Tests the keyboard clock and data lines.  Not called on OLPC.
+
+0 0  " d4037000"  " /" begin-package   	\ EC-SPI interface using SSP3
+
+headerless
+
+" ec-spi"     device-name
+
+0 0 encode-bytes
+   " olpc,ec-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  ;
+: enque  ( data port# -- )
+   port-data swap na+ !    ( data adr )
+;
+: deque?  ( port# -- false | data true )
+   port-data swap na+      ( adr )
+   dup @                   ( adr data )
+   dup -1 =  if            ( adr data )
+      2drop false          ( false )
+   else                    ( adr data )
+      -1 rot !             ( data )
+      true                 ( data true )
+   then
+;
+
+0 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+  ;
+
+: init-ssp-in-slave-mode  ( -- )
+   7 h# d4015058 l!   3 h# d4015058 l!  \ Enable clock to SSP3
+   h# 07 ssp-sscr0 rl!   \ 8-bit data, SPI normal mode
+   h# 1380.0000 ssp-sscr1 rl!  \ SCFR=1, slave mode, rx w/o tx
+   \ The enable bit must be set last, after all configuration is done
+   h# 87 ssp-sscr0 rl!   \ Enable, 8-bit data, SPI normal mode
+;
+: 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
+: 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  =
+;
+
+: init-ec-spi-gpios  ( -- )
+   d# 78 gpio-dir-out
+   d# 79 gpio-dir-out
+;
+: clr-cmd  ( -- )  d# 78 gpio-clr  ;
+: set-cmd  ( -- )  d# 78 gpio-set  ;
+: clr-ack  ( -- )  d# 79 gpio-clr  ;
+: set-ack  ( -- )  d# 79 gpio-set  ;
+: pulse-ack  ( -- )  clr-ack set-ack  ;
+
+0 value ec-spi-cmd-done  \ 0 - still waiting, 1 - successful send, 2 - timeout
+
+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 ec-cmd-time-limit
+: ec-cmd-timeout?   ( -- flag )
+   ec-cmd-time-limit 0=  if  false exit  then
+   get-msecs  ec-cmd-time-limit  -  0>=
+;
+: cancel-cmd-timeout  ( -- )  0 to ec-cmd-time-limit  ;
+: set-cmd-timeout  ( -- )
+   get-msecs d# 1000 +  to ec-cmd-time-limit
+   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 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
+   2 set-ssp-fifo-threshold
+   clr-cmd
+   ['] ec-spi-upstream to ec-spi-state
+;
+: 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
+   else
+      ec-spi-response
+   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
+   init-ssp-in-slave-mode
+   set-ssp-receive-w/o-transmit
+   clr-cmd
+   set-ack
+   ['] ec-spi-upstream to ec-spi-state
+;
+
+: ec-spi-handle-message  ( -- )
+   ec-spi-state
+   pulse-ack
+;
+: 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-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
+;
+
+0 instance value port#
+: set-port  ( port# -- )  to port#  ;
+: put-data  ( byte -- )  port# 2 0 d# 99 ec-command  ;  \ XXX
+: get-data?  ( -- false | data true )
+   port# deque?     ( false | data true )
+   poll-ec-spi
+;
+: get-data  ( -- data | -1 )  \ Wait for data from our device
+   d# 1000 0  do
+      get-data?  if  unloop exit  then		( data )
+      1 ms
+   loop
+   true \ abort" Timeout waiting for data from device" 
+;
+: 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  ;
+
+0 value open-count
+: open  ( -- flag )
+   open-count  0=  if
+      my-address my-space  h# 1000  " map-in" $call-parent  is ssp-base
+\     setup-pin-mux
+      init-ec-spi
+   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



More information about the openfirmware mailing list