The NetBSD Toaster
kv9 writes "Finally after many, many yeas of running on everything-but-your-toaster NetBSD is there too. Technologic Systems has made a toaster that is controlled by NetBSD and powered by one of their ARM boards, the TS-7200. Everything is controlled through sysctl, there are LEDs that show you what is going on, the toaster can play MP3s while it fries the bread and even has Apache/PHP installed. More information in the press release [pdf warning] and on this running NetBSD on the TS-7200 page."
Yes, actually! I'm Christian von Kleist and I'm with The NetBSD Foundation, manning the booth at LinuxWorld SF '05 and operating our sweet, sweet toaster demo. The script that does the toasting is /usr/local/bin/toast (seriously). Scripts interface with the toaster device drivers (the burner relay, the buttons, the LED bank, the toastiness knob, and the relay that turns on the latch electromagnet) through sysctl.
/usr/local/bin/toast is pretty complicated, but a basic toast script works like this:
/bin/sh
:D
/sys/arch/evbarm/compi
Pictures I took: http://wickedways.org/articles/linuxworld2005/
Here's what's available to a script from sysctl:
# sysctl -a | grep hw.t
hw.toaster0.led0_duty = 1 hw.toaster0.led0_width = 8
hw.toaster0.led1_duty = 2 hw.toaster0.led1_width = 16
hw.toaster0.led2_duty = 4 hw.toaster0.led2_width = 32
hw.toaster0.led3_duty = 8 hw.toaster0.led3_width = 64
hw.toaster0.magnetic_latch = 0 hw.toaster0.burner_element = 0
hw.toastersensors0.burnlevel_knob = 1593 hw.toastersensors0.cancel_key = 0 hw.toastersensors0.cancel_key_ticks = 13 hw.toastersensors0.toast_key = 0
hw.toastersensors0.toast_key_ticks = 4 hw.toastersensors0.bagel_key = 0
hw.toastersensors0.bagel_key_ticks = 6
hw.toastersensors0.warm_key = 0 hw.toastersensors0.warm_key_ticks = 7 hw.toastersensors0.frozen_key = 0 hw.toastersensors0.frozen_key_ticks = 10 hw.toastersensors0.toast_down = 0 hw.toastersensors0.toast_down_ticks = 50965 hw.tspld0.board_temp = 40250000 hw.tspld0.board_temp_5s = 40290128
hw.tspld0.board_temp_30s = 40477805
(The board_temp are the temperature in C, multiplied by 10^6, so right now it's at 40.25 degrees C.)
#!
sysctl -w hw.toaster0.magnetic_latch=1
# user presses toast lever down now...
sysctl -w hw.toaster0.burner_element = 1
sleep 60
sysctl -w hw.toaster0.burner_element = 0
sysctl -w hw.toaster0.magnetic_latch=0
echo "Toast is done!"
Only root has write access to hw.toaster0.burner_element!
The real script uses trap to prevent the sleep line from being interrupted, since that could result in a fire!
Just FYI:
# dmesg
NetBSD 3.0_BETA (TS7200) #57: Mon Aug 8 00:34:41 MST 2005
joff@sayan.wifi.home:/home/joff/NetBSD-toaster/obj
le/TS7200
total memory = 32768 KB
avail memory = 28196 KB
mainbus0 (root)
cpu0 at mainbus0: ARM920T rev 0 (ARM9TDMI core)
cpu0: DC enabled IC enabled WB enabled EABT
cpu0: 16KB/32B 64-way Instruction cache
cpu0: 16KB/32B 64-way write-back-locking-A Data cache
epsoc0 at mainbus0: Cirrus Logic EP93xx SoC rev E0
epsoc0: fclk 200.03 Mhz hclk 100.01 Mhz pclk 50.01 Mhz
ohci0 at epsoc0 addr 0x80020000-0x80020fff intr 56
epclk0 at epsoc0 addr 0x80810000-0x8081008f intr 35
epe0 at epsoc0 addr 0x80010000-0x8001ffff intr 39
epe0: MAC address 00:d0:69:4f:af:76
ukphy0 at epe0 phy 1: Generic IEEE 802.3u media interface
ukphy0: OUI 0x0010a1, model 0x0021, rev. 9
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
epcom0 at epsoc0 addr 0x808c0000-0x808c0fff intr 52
epcom1 at epsoc0 addr 0x808d0000-0x808d0fff intr 54
epcom1: console
ohci0: OHCI version 1.0
usb0 at ohci0: USB revision 1.0
uhub0 at usb0
uhub0: Cirrus Logic OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 3 ports with 3 removable, self powered
tspld0 at mainbus0: Technologic Systems TS-7200 rev C, features 0x1
tspld0: jumpers 0x7
tspld0: board temperature 21.93 degC (71.48 degF)
isa0 at tspld0: PC/104 expansion bus
tsdio0 at isa0 port 0x100-0x107: Technologic Systems TS-DIO24
toasterlcd0 at tsdio0: 4x40 text-mode hd44780 LCD
toasterlcd0: using port C, bits 0-7 as DB0-DB7
toasterlcd0: using port B, bits 0-3 as RS, WR, EN1, EN2
wsdisplay0 at toasterlcd0 kbdmux 1
wsmux1: connecting to wsdisplay0
toaster0 at ts