As many uses for our embedded boards require large quantities to be programmed we have added a mechanism for quickly blasting systems. In all of our linuxrc scripts we have added a function that will on boot:
- Check for a USB drive
- Turn on red LED
- If detected load USB and ethernet modules
- Mount the first partition of the drive
- Execute tsinit
- Turn off red LED
2 Preparing a tsinit USB drive
To prepare the USB drive, create either a FAT32 or EXT2 partition. The script will only mount the first partition, so keep all of your images and the script there. When you copy on the script, you only need to make sure it is executable and named 'tsinit'. You can in place add a natively compiled binary, but usually a shell script will be the simplest for blasting purposes.
2.1 Simple blast script
This example expects an xnand-image.dd and/or an sd-image.dd in the root of the flash drive. If you exclude either, it will still run while only programming one. Normally, it will begin programming both and wait for them both to finish executing. When the script exits, the red LED will turn off. This will be compatible with the TS-75XX, TS-4200, TS-4500, TS-4700, and the TS-4800. Though you can tweak the nand and SD writing to the restore commands for other applicable boards.
Create this file named "tsinit" in the root of the thumbdrive, and run "chmod a+x" on this file.
#!/bin/sh # The linuxrc file will mount the USB drive in /mnt/usbdev/, so any # files you access must use that path. ## Program Nand ## killall nandctl nandctl -XW 2048 -z 131072 -i /mnt/usbdev/xnand-image.dd & ## Program SD ## dd if=/mnt/usbdev/sd-image.dd bs=32k conv=sync of=/dev/nbd5 & ## Program Onboard and Offboard SPI flash ## spiflashctl -l 0 -W 64 -z 65536 -i /mnt/usbdev/spiflash-image.dd & spiflashctl -l 1 -W 64 -z 65536 -i /mnt/usbdev/spiflash-image.dd & wait
3 How this works
In all of the linuxrc scripts we have a function to check if there is a USB drive inserted. This example is from the TS-75XX/TS-4500 series linuxrc:
if [ "$x" -eq 1 ]; then ( ts7500ctl --redledon mount -t tmpfs tmpfs /lib/modules tar -x -z -f /modules.tar.gz -C / modprobe scsi_mod modprobe sd_mod modprobe usbcore modprobe ehci_hcd modprobe usb_storage modprobe smscusbnet modprobe smsc9500 modprobe ohci_hcd umount /lib/modules x=0 while [ "$x" -lt 150 -a ! -e /sys/block/sda ]; do x=$((x+1)) sleep .1 done mount -o ro /dev/sda1 /mnt/usbdev if [ -x /mnt/usbdev/tsinit ]; then /mnt/usbdev/tsinit <$CONSOLE >$CONSOLE 2>&1 fi umount /mnt/usbdev ts7500ctl --redledoff ) & fi