Author: wmb Date: 2009-12-11 06:29:47 +0100 (Fri, 11 Dec 2009) New Revision: 1571
Added: cpu/x86/pc/olpc/via/smt.fth Removed: cpu/x86/pc/olpc/via/smttags.fth Log: OLPC manufacturing tests - Renamed script from smttags.fth to smt.fth .
Copied: cpu/x86/pc/olpc/via/smt.fth (from rev 1567, cpu/x86/pc/olpc/via/smttags.fth) =================================================================== --- cpu/x86/pc/olpc/via/smt.fth (rev 0) +++ cpu/x86/pc/olpc/via/smt.fth 2009-12-11 05:29:47 UTC (rev 1571) @@ -0,0 +1,343 @@ +\ SMT test script $Revision$ + +visible + +: wanted-fw$ ( -- $ ) " q3a20" ; + + +: nocase-$= ( $1 $2 -- flag ) + rot tuck <> if ( adr1 adr2 len2 ) + 3drop false exit ( -- false ) + then ( adr1 adr2 len2 ) + caps-comp 0= ( flag ) +; + +: find-firmware-file ( -- name$ ) + wanted-fw$ " u:\boot\%s.rom" sprintf ( name$ ) + ." Trying " 2dup type cr ( name$ ) + 2dup $file-exists? if exit then ( name$ ) + 2drop ( ) + + wanted-fw$ factory-server$ " %s\%s.rom" sprintf ( name$ ) + ." Trying " 2dup type cr ( name$ ) + 2dup $file-exists? if exit then ( name$ ) + 2drop + + true abort" Can't find new firmware file" +; + +: ?update-firmware ( -- ) + \ Exit if the existing firmware and the wanted firmware are the same + fw-version$ wanted-fw$ nocase-$= if exit then + ." Updating firmware to version " fw-version$ type cr + d# 2000 ms + ?enough-power + find-firmware-file $get-file reflash +; + +: mfg-ntp-server ( -- name$ ) + " NT" find-tag if ?-null else " 10.60.0.2" then +; +' mfg-ntp-server to ntp-servers + +: .instructions ( adr len -- ) + cr blue-letters type black-letters cr +; +: .problem ( adr len -- ) + red-letters type black-letters cr +; + +d# 20 buffer: bn-buf \ Buffer for scanned-in board number string +: board#$ ( -- adr len ) bn-buf count ; + +: accept-to-buf ( buf len -- actual ) + over 1+ swap accept ( buf actual ) + tuck swap c! ( actual ) +; + +\ Get a board number from the user, retrying until valid +\ Usually the number is entered with a barcode scanner +: get-board# ( -- ) + ." *****" + begin + " Please Input Board Number ......" .instructions + bn-buf d# 20 accept-to-buf ( n ) + d# 14 <> if + " Wrong length (must be 14 characters), try again" .problem + else + bn-buf 1+ c@ [char] Q = if exit then + " Must begin with Q, try again" .problem + then + again +; + +d# 20 buffer: station#-buf +: station#$ ( -- adr len ) station#-buf count ; \ e.g. J01 + +: get-station# ( -- ) + ." *****" + begin + " Please Input Station Number ......" .instructions + + station#-buf d# 20 accept-to-buf ( n ) + d# 3 <> if + " Wrong length (must be like J01), try again" .problem + else + station#-buf 1+ c@ [char] A [char] Z between if exit then + " Must begin with A-Z, try again" .problem + then + again +; + +d# 20 buffer: opid-buf +: opid$ ( -- adr len ) opid-buf count ; \ e.g. 12345678 + +\ Get and validate an operator ID +: get-opid ( -- ) + ." *****" + begin + " Please Input Operator ID ......" .instructions + opid-buf d# 20 accept-to-buf ( n ) + + d# 8 <> if + " Wrong length (must be 8 digits), try again" .problem + else + opid$ push-decimal $number pop-base if ( ) + " Must be a number, try again" .problem + else ( n ) + drop exit + then + then + again +; + +\ Construct the filename used for communicating with the server +d# 20 buffer: filename-buf +: smt-filename$ ( -- adr len ) filename-buf count ; +: set-filename ( -- ) + board#$ " %s.txt" sprintf filename-buf place +; + +: get-info ( -- ) + get-board# + set-filename + get-station# + get-opid +; + +\ Upload the result data +: smt-result ( pass? -- ) + smt-filename$ open-temp-file + if " PASS" else " FAIL" then " RESULT=" put-key+value + " PROCESS=FVT" put-key-line + " STATION=" put-key-line + " OPID=" put-key-line + " GUID=" put-key-line + board#$ " MB_NUM=" put-key+value + " Result" submit-file +; + +\ Send the board number as the request and return the response data +: smt-request$ ( -- adr len ) + smt-filename$ open-temp-file + board#$ " MB_NUM=" put-key+value + opid$ " OPID=" put-key+value + station#$ " STATION=" put-key+value + " Request" submit-file + " Response" get-response +; + +: clear-mfg-buf ( -- ) mfg-data-buf /flash-block h# ff fill ; + +: put-ascii-tag ( value$ key$ -- ) + 2swap dup if add-null then 2swap ( value$' key$ ) + ($add-tag) ( ) +; + +\ Remove possible trailing carriage return from the line +: ?remove-cr ( adr len -- adr len' ) + dup if ( adr len ) + 2dup + 1- c@ carret = if ( adr len ) + 1- + then + then +; + +: put-tag ( value$ key$ -- ) + 2swap dup if add-null then 2swap ( value$' key$ ) + ($add-tag) ( ) +; + +0 0 2value response$ + +false value any-tags? + +\ If the server sends us tags in the response file, we put +\ them in the mfg data +: write-new-tags ( adr len -- ) + begin dup while ( adr len ) + linefeed left-parse-string ( rem$ line$ ) + ?remove-cr ( rem$ line$ ) + [char] = left-parse-string ( rem$ value$ key$ ) + dup 2 = if ( rem$ value$ key$ ) + true to any-tags? ( rem$ value$ key$ ) + put-tag ( rem$ ) + else ( rem$ value$ key$ ) + 4drop ( rem$ ) + then ( rem$ ) + repeat ( adr len ) + 2drop ( ) +; + +\ Decode the server's response and insert appropriate mfg data tags +: parse-smt-response ( -- ) + ." Server responded with: " cr response$ list cr ( ) + + response$ nip 0= if ." Null manufacturing data" cr exit then + + flash-write-enable + + clear-mfg-buf ( ) + response$ write-new-tags ( ) +\ " " " ww" put-ascii-tag ( ) +\ " EN" " SS" put-ascii-tag ( ) +\ " ASSY" " TS" put-ascii-tag ( ) +\ " D3" " SG" put-ascii-tag ( ) +\ board#$ " B#" put-ascii-tag ( ) + any-tags? if (put-mfg-data) then + + \ check-tags + + no-kbc-reboot + kbc-on +; + +: silent-probe-usb ( -- ) + " /" ['] (probe-usb2) scan-subtree + " /" ['] (probe-usb1) scan-subtree + report-disk report-net report-keyboard +; + +: scanner? ( -- flag ) + " usb-keyboard" expand-alias if 2drop true else false then +; +: wait-scanner ( -- ) + scanner? 0= if + " Connect USB barcode scanner" .instructions + begin d# 1000 ms silent-probe-usb scanner? until + then + ; +: wired-lan? ( -- flag ) + " /usb/ethernet" locate-device if false else drop true then +; +: wait-lan ( -- ) + wired-lan? 0= if + " Connect USB Ethernet Adapter" .instructions + begin d# 1000 ms silent-probe-usb wired-lan? until + then +; +: usb-key? ( -- flag ) + " /usb/disk" locate-device if false else drop true then +; +: wait-usb-key ( -- ) + usb-key? 0= if + " Connect USB memory stick" .instructions + begin d# 1000 ms silent-probe-usb usb-key? until + then +; +: stall ( -- ) begin halt again ; +: require-int-sd ( -- ) + " int:0" open-dev ?dup if close-dev exit then + " Power off and insert internal SD card" .problem + stall +; + +: wait-connections ( -- ) + require-int-sd + silent-probe-usb + wait-scanner + wait-lan + wait-usb-key +; + +0 value test-passed? +: show-result-screen ( -- ) + restore-scroller + clear-screen + test-passed? if + ." Selftest passed." cr cr cr + green-screen + else + ." Selftest failed." cr cr cr + red-screen + then + d# 2000 ms +; + +: finish-smt-test ( pass? -- ) + show-result-screen + + cifs-connect + ." Sending test result " test-passed? smt-result ." Done" cr + cifs-disconnect + + test-passed? if + ." Writing tags " parse-smt-response ." Done" cr + then + + any-tag? 0= if + cr cr cr + " WARNING: Invalid response from shop floor server - no tags." .problem + cr cr cr + begin halt again + then ( ) + + ." Powering off ..." d# 2000 ms + power-off +; + +d# 15 to #mfgtests + +: smt-tests ( -- ) + 5 #mfgtests + 5 do + i set-current-sq + refresh + d# 1000 ms + doit + pass? 0= if false to test-passed? finish-smt-test unloop exit then + loop + true to test-passed? finish-smt-test +; + +\ This modifies the menu to be non-interactive +: doit-once ( -- ) do-key smt-tests ; +patch doit-once do-key menu-interact + +: start-smt-test ( -- ) + ?update-firmware + + wait-connections + + ." Setting clock " ntp-set-clock ." Done" cr + + get-info + + ." Connecting to shop floor server " cifs-connect ." Done" cr + ." Getting tags " smt-request$ to response$ ." Done" cr + cifs-disconnect + + true to diag-switch? + " patch smt-tests play-item mfgtest-menu" evaluate + menu + false to diag-switch? +; + +dev /wlan +: selftest ( -- error? ) + true to force-open? open false to force-open? ( opened? ) + if close false else true then ( error? ) +; +dend + +\ Automatically run the sequence +start-smt-test
Deleted: cpu/x86/pc/olpc/via/smttags.fth =================================================================== --- cpu/x86/pc/olpc/via/smttags.fth 2009-12-11 05:24:29 UTC (rev 1570) +++ cpu/x86/pc/olpc/via/smttags.fth 2009-12-11 05:29:47 UTC (rev 1571) @@ -1,343 +0,0 @@ -\ SMT test script $Revision$ - -visible - -: wanted-fw$ ( -- $ ) " q3a20" ; - - -: nocase-$= ( $1 $2 -- flag ) - rot tuck <> if ( adr1 adr2 len2 ) - 3drop false exit ( -- false ) - then ( adr1 adr2 len2 ) - caps-comp 0= ( flag ) -; - -: find-firmware-file ( -- name$ ) - wanted-fw$ " u:\boot\%s.rom" sprintf ( name$ ) - ." Trying " 2dup type cr ( name$ ) - 2dup $file-exists? if exit then ( name$ ) - 2drop ( ) - - wanted-fw$ factory-server$ " %s\%s.rom" sprintf ( name$ ) - ." Trying " 2dup type cr ( name$ ) - 2dup $file-exists? if exit then ( name$ ) - 2drop - - true abort" Can't find new firmware file" -; - -: ?update-firmware ( -- ) - \ Exit if the existing firmware and the wanted firmware are the same - fw-version$ wanted-fw$ nocase-$= if exit then - ." Updating firmware to version " fw-version$ type cr - d# 2000 ms - ?enough-power - find-firmware-file $get-file reflash -; - -: mfg-ntp-server ( -- name$ ) - " NT" find-tag if ?-null else " 10.60.0.2" then -; -' mfg-ntp-server to ntp-servers - -: .instructions ( adr len -- ) - cr blue-letters type black-letters cr -; -: .problem ( adr len -- ) - red-letters type black-letters cr -; - -d# 20 buffer: bn-buf \ Buffer for scanned-in board number string -: board#$ ( -- adr len ) bn-buf count ; - -: accept-to-buf ( buf len -- actual ) - over 1+ swap accept ( buf actual ) - tuck swap c! ( actual ) -; - -\ Get a board number from the user, retrying until valid -\ Usually the number is entered with a barcode scanner -: get-board# ( -- ) - ." *****" - begin - " Please Input Board Number ......" .instructions - bn-buf d# 20 accept-to-buf ( n ) - d# 14 <> if - " Wrong length (must be 14 characters), try again" .problem - else - bn-buf 1+ c@ [char] Q = if exit then - " Must begin with Q, try again" .problem - then - again -; - -d# 20 buffer: station#-buf -: station#$ ( -- adr len ) station#-buf count ; \ e.g. J01 - -: get-station# ( -- ) - ." *****" - begin - " Please Input Station Number ......" .instructions - - station#-buf d# 20 accept-to-buf ( n ) - d# 3 <> if - " Wrong length (must be like J01), try again" .problem - else - station#-buf 1+ c@ [char] A [char] Z between if exit then - " Must begin with A-Z, try again" .problem - then - again -; - -d# 20 buffer: opid-buf -: opid$ ( -- adr len ) opid-buf count ; \ e.g. 12345678 - -\ Get and validate an operator ID -: get-opid ( -- ) - ." *****" - begin - " Please Input Operator ID ......" .instructions - opid-buf d# 20 accept-to-buf ( n ) - - d# 8 <> if - " Wrong length (must be 8 digits), try again" .problem - else - opid$ push-decimal $number pop-base if ( ) - " Must be a number, try again" .problem - else ( n ) - drop exit - then - then - again -; - -\ Construct the filename used for communicating with the server -d# 20 buffer: filename-buf -: smt-filename$ ( -- adr len ) filename-buf count ; -: set-filename ( -- ) - board#$ " %s.txt" sprintf filename-buf place -; - -: get-info ( -- ) - get-board# - set-filename - get-station# - get-opid -; - -\ Upload the result data -: smt-result ( pass? -- ) - smt-filename$ open-temp-file - if " PASS" else " FAIL" then " RESULT=" put-key+value - " PROCESS=FVT" put-key-line - " STATION=" put-key-line - " OPID=" put-key-line - " GUID=" put-key-line - board#$ " MB_NUM=" put-key+value - " Result" submit-file -; - -\ Send the board number as the request and return the response data -: smt-request$ ( -- adr len ) - smt-filename$ open-temp-file - board#$ " MB_NUM=" put-key+value - opid$ " OPID=" put-key+value - station#$ " STATION=" put-key+value - " Request" submit-file - " Response" get-response -; - -: clear-mfg-buf ( -- ) mfg-data-buf /flash-block h# ff fill ; - -: put-ascii-tag ( value$ key$ -- ) - 2swap dup if add-null then 2swap ( value$' key$ ) - ($add-tag) ( ) -; - -\ Remove possible trailing carriage return from the line -: ?remove-cr ( adr len -- adr len' ) - dup if ( adr len ) - 2dup + 1- c@ carret = if ( adr len ) - 1- - then - then -; - -: put-tag ( value$ key$ -- ) - 2swap dup if add-null then 2swap ( value$' key$ ) - ($add-tag) ( ) -; - -0 0 2value response$ - -false value any-tags? - -\ If the server sends us tags in the response file, we put -\ them in the mfg data -: write-new-tags ( adr len -- ) - begin dup while ( adr len ) - linefeed left-parse-string ( rem$ line$ ) - ?remove-cr ( rem$ line$ ) - [char] = left-parse-string ( rem$ value$ key$ ) - dup 2 = if ( rem$ value$ key$ ) - true to any-tags? ( rem$ value$ key$ ) - put-tag ( rem$ ) - else ( rem$ value$ key$ ) - 4drop ( rem$ ) - then ( rem$ ) - repeat ( adr len ) - 2drop ( ) -; - -\ Decode the server's response and insert appropriate mfg data tags -: parse-smt-response ( -- ) - ." Server responded with: " cr response$ list cr ( ) - - response$ nip 0= if ." Null manufacturing data" cr exit then - - flash-write-enable - - clear-mfg-buf ( ) - response$ write-new-tags ( ) -\ " " " ww" put-ascii-tag ( ) -\ " EN" " SS" put-ascii-tag ( ) -\ " ASSY" " TS" put-ascii-tag ( ) -\ " D3" " SG" put-ascii-tag ( ) -\ board#$ " B#" put-ascii-tag ( ) - any-tags? if (put-mfg-data) then - - \ check-tags - - no-kbc-reboot - kbc-on -; - -: silent-probe-usb ( -- ) - " /" ['] (probe-usb2) scan-subtree - " /" ['] (probe-usb1) scan-subtree - report-disk report-net report-keyboard -; - -: scanner? ( -- flag ) - " usb-keyboard" expand-alias if 2drop true else false then -; -: wait-scanner ( -- ) - scanner? 0= if - " Connect USB barcode scanner" .instructions - begin d# 1000 ms silent-probe-usb scanner? until - then - ; -: wired-lan? ( -- flag ) - " /usb/ethernet" locate-device if false else drop true then -; -: wait-lan ( -- ) - wired-lan? 0= if - " Connect USB Ethernet Adapter" .instructions - begin d# 1000 ms silent-probe-usb wired-lan? until - then -; -: usb-key? ( -- flag ) - " /usb/disk" locate-device if false else drop true then -; -: wait-usb-key ( -- ) - usb-key? 0= if - " Connect USB memory stick" .instructions - begin d# 1000 ms silent-probe-usb usb-key? until - then -; -: stall ( -- ) begin halt again ; -: require-int-sd ( -- ) - " int:0" open-dev ?dup if close-dev exit then - " Power off and insert internal SD card" .problem - stall -; - -: wait-connections ( -- ) - require-int-sd - silent-probe-usb - wait-scanner - wait-lan - wait-usb-key -; - -0 value test-passed? -: show-result-screen ( -- ) - restore-scroller - clear-screen - test-passed? if - ." Selftest passed." cr cr cr - green-screen - else - ." Selftest failed." cr cr cr - red-screen - then - d# 2000 ms -; - -: finish-smt-test ( pass? -- ) - show-result-screen - - cifs-connect - ." Sending test result " test-passed? smt-result ." Done" cr - cifs-disconnect - - test-passed? if - ." Writing tags " parse-smt-response ." Done" cr - then - - any-tag? 0= if - cr cr cr - " WARNING: Invalid response from shop floor server - no tags." .problem - cr cr cr - begin halt again - then ( ) - - ." Powering off ..." d# 2000 ms - power-off -; - -d# 15 to #mfgtests - -: smt-tests ( -- ) - 5 #mfgtests + 5 do - i set-current-sq - refresh - d# 1000 ms - doit - pass? 0= if false to test-passed? finish-smt-test unloop exit then - loop - true to test-passed? finish-smt-test -; - -\ This modifies the menu to be non-interactive -: doit-once ( -- ) do-key smt-tests ; -patch doit-once do-key menu-interact - -: start-smt-test ( -- ) - ?update-firmware - - wait-connections - - ." Setting clock " ntp-set-clock ." Done" cr - - get-info - - ." Connecting to shop floor server " cifs-connect ." Done" cr - ." Getting tags " smt-request$ to response$ ." Done" cr - cifs-disconnect - - true to diag-switch? - " patch smt-tests play-item mfgtest-menu" evaluate - menu - false to diag-switch? -; - -dev /wlan -: selftest ( -- error? ) - true to force-open? open false to force-open? ( opened? ) - if close false else true then ( error? ) -; -dend - -\ Automatically run the sequence -start-smt-test