[openfirmware] [commit] r3022 - cpu/arm/olpc
repository service
svn at openfirmware.info
Fri Jun 29 22:53:56 CEST 2012
Author: wmb
Date: Fri Jun 29 22:52:33 2012
New Revision: 3022
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3022
Log:
Checked in TI MSP430 Bootstrap Loader download code.
Added:
cpu/arm/olpc/bsl.fth
Added: cpu/arm/olpc/bsl.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/olpc/bsl.fth Fri Jun 29 22:52:33 2012 (r3022)
@@ -0,0 +1,328 @@
+\ See license at end of file
+purpose: Downloader for TI MSP430 BootStrap Loader (BSL) protocol
+
+\ devalias bsl /uart at NNNN:9600,8,e,1//bsl-protocol
+
+h# fe016000 value bsl-uart-base \ Virtual address of UART; set later
+
+: bsl-baud ( baud-rate -- ) \ 9600,8,e,1
+ uart-base >r bsl-uart-base to uart-base baud h# 1b 3 uart! r> to uart-base
+;
+
+: send ( char -- ) uart-base >r bsl-uart-base to uart-base uemit r> to uart-base ;
+
+: receive? ( -- false | char true )
+ uart-base >r bsl-uart-base to uart-base
+ ukey? if ukey true else false then
+ r> to uart-base
+;
+
+0 value rst-gpio#
+0 value test-gpio#
+\ : bsl-config-test ( -- )
+: init-gpios
+ fallback-in-ih ?dup if dup remove-input close-dev 0 to fallback-in-ih then
+ fallback-out-ih ?dup if dup remove-output close-dev 0 to fallback-out-ih then
+
+ d# 115 to test-gpio#
+ d# 116 to rst-gpio#
+
+ test-gpio# 0 swap af!
+ rst-gpio# 0 swap af!
+;
+
+: bsl-open ( -- )
+ init-gpios
+
+ rst-gpio# gpio-clr
+ test-gpio# gpio-clr
+ rst-gpio# gpio-dir-out
+ test-gpio# gpio-dir-out
+ h# 16000 +io to bsl-uart-base
+
+ d# 9600 bsl-baud
+;
+: bsl-close ( -- )
+ rst-gpio# gpio-dir-in
+ test-gpio# gpio-dir-in
+;
+: msp430-off ( -- )
+ rst-gpio# gpio-clr
+ test-gpio# gpio-clr
+;
+
+: dly ( -- ) d# 10 ms ;
+: start-bsl ( -- )
+ bsl-open
+ d# 250 ms
+ test-gpio# gpio-set
+ dly
+ test-gpio# gpio-clr
+ dly
+ test-gpio# gpio-set
+ dly
+ rst-gpio# gpio-set
+ dly
+ test-gpio# gpio-clr
+;
+: flush-bsl ( -- ) begin receive? while drop repeat ;
+: rst-bsl ( -- ) msp430-off start-bsl flush-bsl ;
+
+d# 1000 constant timeout
+: wait-byte ( -- char )
+ get-msecs timeout + ( limit )
+ begin ( limit )
+ receive? if ( limit char )
+ nip exit ( -- char )
+ then ( limit )
+ dup get-msecs - 0< ( limit timeout? )
+ until ( limit )
+ drop true abort" BSL data timeout"
+;
+: ack? ( -- okay? )
+ get-msecs timeout + ( limit )
+ begin ( limit )
+ receive? if ( limit char )
+ case
+ h# 90 of ( limit )
+ drop true exit ( -- true )
+ endof
+ h# a0 of ( limit )
+ ." NAK!"
+ drop false exit
+ endof
+ endcase
+ then ( limit )
+ dup get-msecs - 0< ( limit timeout? )
+ until ( limit )
+ drop false ( false )
+;
+: bsl-sync ( -- )
+ d# 4 0 do
+ h# 80 send ack? if unloop exit then
+ loop
+ true abort" BSL unresponsive"
+;
+
+0 value checksum
+
+: +sum ( w -- ) checksum xor to checksum ;
+: send-summed ( w -- )
+ dup +sum wbsplit swap send send
+;
+: send-length ( n -- )
+ dup 1 and abort" BSL odd length!"
+ dup d# 255 > abort" BSL length >255"
+ dup bwjoin send-summed
+;
+: frame( ( extra-len cmd -- )
+ bsl-sync ( extra-len cmd )
+ 0 to checksum ( extra-len cmd )
+ h# 80 swap bwjoin ( extra-len cmd,hdr )
+ send-summed ( extra-len )
+ 4 + send-length ( )
+;
+
+: send-address ( w -- ) send-summed ;
+: send-data-length ( w -- ) send-summed ;
+: send-xx ( -- ) 0 send-summed ; \ Send don't care word
+: send-data ( adr len -- )
+ bounds ?do i le-w@ send-summed /w +loop
+;
+: )frame-no-ack ( -- )
+ checksum h# ffff xor wbsplit swap send send
+;
+: )frame ( -- )
+ )frame-no-ack
+ ack? 0= abort" BSL - no ACK!"
+;
+
+: rx-data-block ( adr len device-adr -- )
+ over h# 12 frame( ( adr len device-adr )
+ send-summed ( adr len ) \ device address
+ dup send-summed ( adr len ) \ data length
+ send-data ( )
+ )frame
+;
+: rx-password ( adr len -- )
+ dup d# 32 <> abort" BSL password must be 32 bytes long"
+ dup h# 10 frame( ( adr len )
+ send-xx send-xx ( adr len )
+ send-data ( )
+ )frame
+;
+: ff-password ( -- )
+ " "(ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff)"
+ rx-password
+;
+: 00-password ( -- )
+ " "(00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff)"
+ rx-password
+;
+: (erase) ( device-adr code -- )
+ swap ( device-adr code )
+ 0 h# 16 frame( ( code device-adr )
+ send-summed ( code )
+ send-summed ( )
+ )frame
+;
+: erase-segment ( device-adr -- ) h# a502 (erase) ;
+: erase-main ( device-adr -- ) h# a504 (erase) ;
+: mass-erase ( -- ) 0 h# a506 (erase) ;
+: change-baud-rate ( d3 d2 d1 -- )
+ 0 h# 20 frame( ( d3 d2 d1 )
+ swap bwjoin send-summed ( d3 )
+ send-summed ( )
+ )frame
+;
+: set-mem-offset ( device-adr -- )
+ 0 h# 21 frame( ( device-adr )
+ send-xx ( device-adr )
+ send-summed ( )
+ )frame
+;
+: load-pc ( device-adr -- )
+ 0 h# 1a frame( ( device-adr )
+ send-summed ( )
+ send-xx ( )
+ )frame
+;
+: wait-word ( -- w ) wait-byte wait-byte bwjoin dup +sum ;
+
+: )frame-receive ( adr len -- )
+ )frame-no-ack
+ wait-byte case
+ h# 80 of endof
+ h# a0 of true abort" NAK!" endof
+ ( default ) ." Received unexpected response frame first byte " dup .x cr
+ abort
+ endcase
+ wait-byte ?dup if
+ ." Received unexpected response frame second byte " dup .x cr
+ abort
+ then
+ h# 80 to checksum
+
+ wait-word wbsplit ( adr len response-len1 response-len2 )
+
+ over <> abort" BSL - response length check byte mismatch" ( adr len response-len )
+ over <> abort" BSL - unexpected response length" ( adr len )
+ bounds ?do wait-word i le-w! /w +loop ( )
+ wait-word drop ( ) \ Get checksum and add it in
+ checksum h# ffff <> abort" BSL - bad response checksum" ( )
+;
+: tx-data-block ( adr len device-adr -- )
+ 0 h# 14 frame( ( adr len device-adr )
+ send-summed ( adr len )
+ dup send-summed ( adr len )
+ )frame-receive ( )
+;
+: tx-bsl-version ( adr len -- )
+ dup d# 16 <> abort" BSL version buffer must be 16 bytes long"
+ 0 h# 1e frame( ( adr len )
+ send-xx ( adr len )
+ send-xx ( adr len )
+ )frame-receive ( )
+;
+
+d# 250 constant /bsl-max-read
+: bsl-read ( adr len device-adr -- )
+ >r even ( adr len' r: device-adr )
+ begin dup 0> while ( adr len r: device-adr )
+ r@ (cr .x
+ 2dup /bsl-max-read min ( adr len adr thislen r: device-adr )
+ r@ tx-data-block ( adr len r: device-adr )
+ /bsl-max-read /string ( adr' len' r: device-adr )
+ r> /bsl-max-read + >r ( adr len r: device-adr' )
+ repeat ( adr len r: device-adr' )
+ r> 3drop
+;
+
+0 value next-address
+0 value line-#bytes
+d# 50 buffer: binary-buf
+
+: hex-number ( adr len -- n )
+ push-hex ( adr len )
+ $number abort" Bad number in TI TXT file" ( n )
+ pop-base
+;
+: program-bytes ( adr len -- )
+ d# 50 0 do ( adr len )
+ dup if ( adr len )
+ bl left-parse-string ( adr' len' head$ )
+ hex-number ( adr len n )
+ binary-buf i + c! ( adr len )
+ else ( adr len )
+ 2drop ( )
+ (cr next-address . ( )
+ i 1 and if ( )
+ h# ff binary-buf i + c! ( )
+ i 1+ ( len )
+ else ( )
+ i ( len )
+ then
+ binary-buf swap next-address rx-data-block
+ next-address i + to next-address
+ unloop exit
+ then
+ loop ( adr len )
+ true abort" TI TXT Line too long!"
+;
+: handle-line ( adr len -- )
+ dup 0= if 2drop exit then ( adr len )
+ over c@ case
+ [char] @ of ( adr len )
+ 1 /string hex-number to next-address
+ endof
+ [char] q of ( adr len )
+ 2drop ( )
+ endof ( adr len )
+ ( default ) ( adr len char )
+ -rot program-bytes ( char )
+ endcase ( )
+;
+: force-erase ( -- )
+ ." Resetting/erasing" cr
+ rst-bsl
+ ['] 00-password catch drop
+ rst-bsl
+ ff-password
+;
+d# 100 buffer: line-buf
+: $bsl-ti-text-file ( filename$ -- )
+ $read-open ( )
+ force-erase ( )
+ ." Programming" cr
+ begin ( )
+ line-buf d# 100 ifd @ read-line abort" Read line failed"
+ while ( len )
+ line-buf swap handle-line ( )
+ repeat ( len )
+ drop
+ ifd @ fclose
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2012 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