LCD dla OpenWrt
Wyświetlacz LCD w OpenWrtOstatnia zmiana: 2009-09-03 18:16
1. Hack
2. Instalacja
3. Konfiguracja
4. Uruchomienie
5. Uwagi końcowe
Do czego może przydać wyświetlacz LCD w ruterze? Można wyświetlać informacje o systemie, bieżące statystyki, informacje o połączonych klientach, ilość miejsca na dysku, monitorować ściąganie torrentów, wyświetlać kanały rss, wykresy statystyk łącza czy monitorować ups. Możliwości jest wiele. Niestety, wyświetlacze są stosunkowo drogie, ale można wykorzystać popularne breloki LCD na zdjęcia.
Cyfrowy brelok na zdjęcia jest prostym urządzeniem wyposażonym w
- 8 bitowy procesor (najczęściej st2205)
- wyświetlacz LCD (kolor, graficzny, wielkość ok 1.5", zwykle jest to 128x128 pixeli)
- pamięć flash (2/8/16MB)
- złącze mini USB
- małą baterię Li-Ion
W normalnym trybie umożliwia tylko wyświetlanie zdjęć zapisanych wcześniej w pamięci flash. Jednakże dzięki odpowiedniemu oprogramowaniu możliwe jest przekształcenie go w dodatkowy wyświetlacz, umożliwiający pokazywanie obrazu na bieżąco transmitowanego przez kabel USB. Dzięki temu możliwe jest wyświetlenie tekstu na ekranie, wyświetlenie obrazka (setpic), obejrzenie filmu! (mplayer) czy różnorodnych informacji przy pomocy programu LCD4Linux.
Projekt LCD4Linux umożliwia wyświetlanie informacji na różnych rodzajach wyświetlaczy LCD, graficznych i alfanumerycznych. Można wyświetlać informacje o cpu, dyskach, sieci, wifi, statystykach, monitorowanie demona mpd, mysql, skrzynek pocztowych, tunerów DVB, kanałów rss, pogody, obrazków czy dowolnej informacji tekstowej i prezentowanie informacji w różnorodny sposób. Opis funkcjonalności można znaleźć na stronie projektu.
W tym rozwiązaniu wykorzystano "Cyfrowy brelok na zdjęcia" model Dig-291, dostępny na allegro i w sklepach "Biedronka" (!) w cenie ok 20-30zł. Brelok należy najpierw zmusić do wyświetlania obrazu live przez odpowiednią modyfikację jego firmware. Jako ruter - Linksys WRT160NL z USB z OpenWrt Kamikaze (trunk).
Hack
Należy to wykonać z poziomu normalnego systemu i Linuksa. Tą operację wykonuje się tylko raz. Po ściągnięciu i skompilowaniu źródeł projektu PicFrame podłączamy brelok do USB, wybieramy na nim "USB Update". W logach systemowych powinna pojawić się informacja o podłączeniu urządzenia (w tym przypadku wyglądało to następująco):
usb-storage: device found at 3
usb-storage: waiting for device to settle before scanning
scsi 9:0:0:0: Direct-Access SITRONIX MULTIMEDIA 0.09 PQ: 0 ANSI: 0 CCS
sd 9:0:0:0: Attached scsi generic sg2 type 0
sd 9:0:0:0: [sdb] 4096 512-byte hardware sectors: (2.09 MB/2.00 MiB)
sd 9:0:0:0: [sdb] Write Protect is off
sd 9:0:0:0: [sdb] Mode Sense: 0b 00 00 08
sd 9:0:0:0: [sdb] Assuming drive cache: write through
usb-storage: device scan complete
sd 9:0:0:0: [sdb] Assuming drive cache: write through
sdb: unknown partition table
sd 9:0:0:0: [sdb] Attached SCSI removable disk
Następnie uruchamiamy odpowiednią procedurę modyfikacji firmware (jako root!)
./hackfs.sh /dev/sdb
Instalacja
Wszystko już z poziomu rutera.
opkg update
opkg install kmod-usb-core kmod-usb2 kmod-usb-storage
opkg install st2205tool lcd4linux
/etc/init.d/lcd4linux stop
/etc/init.d/lcd4linux enable
Konfiguracja
Całość konfiguracji należy wykonać w pliku /etc/lcd4linux.conf. Widgety, layouty i pluginy opisane są na stronie projektu. Plik konfiguracyjny musi być zapisany z odpowiednimi prawami, inaczej program lcd4linux nie będzie chciał się uruchomić.
chown root.root /etc/lcd4linux.conf
chmod 600 /etc/lcd4linux.conf
Variables {
wifi 'wlan0'
wan 'eth0'
dysk '/tmp'
minuta 60000
transparent 'ffffff00'
}
Display st2205u {
Driver 'st2205'
Port '/dev/sda'
Font '6x8'
Foreground 'ffffff'
Background '000000'
Basecolor '000000'
}
Widget hostname {
class 'Text'
expression uname('nodename')
width 21
align 'C'
style 'bold'
}
Widget uptime {
class 'Text'
expression uptime('%d dni %H:%M:%S')
width 21
prefix 'Uptime '
Background transparent
}
Widget wan_info {
class 'Text'
expression netinfo::ipaddr(wan)
prefix 'WAN IP: '
align 'C'
width 21
style bold
}
Widget down_icon {
class 'Icon'
speed 500
Bitmap {
Row1 '.....|..*..|.***.|*****|.***.|.***.|.***.'
Row2 '.....|.....|..*..|.***.|*****|.***.|.***.'
Row3 '.***.|.....|.....|..*..|.***.|*****|.***.'
Row4 '.***.|.***.|.....|.....|..*..|.***.|*****'
Row5 '.***.|.***.|.***.|.....|.....|..*..|.***.'
Row6 '*****|.***.|.***.|.***.|.....|.....|..*..'
Row7 '.***.|*****|.***.|.***.|.***.|.....|.....'
Row8 '..*..|.***.|*****|.***.|.***.|.***.|.....'
}
Background transparent
Foreground '00ff00'
}
Widget up_icon {
class 'Icon'
speed 500
Bitmap {
Row8 '.....|..*..|.***.|*****|.***.|.***.|.***.'
Row7 '.....|.....|..*..|.***.|*****|.***.|.***.'
Row6 '.***.|.....|.....|..*..|.***.|*****|.***.'
Row5 '.***.|.***.|.....|.....|..*..|.***.|*****'
Row4 '.***.|.***.|.***.|.....|.....|..*..|.***.'
Row3 '*****|.***.|.***.|.***.|.....|.....|..*..'
Row2 '.***.|*****|.***.|.***.|.***.|.....|.....'
Row1 '..*..|.***.|*****|.***.|.***.|.***.|.....'
}
Background transparent
Foreground 'ff0000'
}
Widget wan_dl {
class 'Text'
expression (netdev(wan, 'Rx_bytes', 500))/1024
postfix 'kB/s'
width 8
precision 0
align 'R'
Foreground 'ffffff'
Background transparent
}
Widget wan_up {
class 'Text'
expression (netdev(wan, 'Tx_bytes', 500))/1024
postfix 'kB/s'
width 8
precision 0
align 'R'
Foreground 'ffffff'
Background transparent
}
Widget wan_bar {
class 'Bar'
expression netdev(wan, 'Rx_bytes', 500)
expression2 netdev(wan, 'Tx_bytes', 500)
length 21
direction 'E'
Foreground 'ffffff'
Background '00000080'
BarColor0 '008000'
BarColor1 '800000'
}
Widget tlo {
class 'Image'
file 'openwrt.png'
reload 0
update 0
inverted 0
visible 1
}
Widget wlan_info {
class 'Text'
expression wifi::essid(wifi)
prefix 'ESSID '
width 17
update minuta
style bold
}
Widget wlan_info1 {
class 'Text'
expression wifi::bitrate(wifi)/1024/1024
prefix '@'
width 4
precision 0
update minuta
style bold
}
Widget wlan_klienci {
class 'Text'
expression exec ('/usr/sbin/iw dev '.wifi.' station dump | grep "on '.wifi.'" | wc -l',1000)
prefix 'Podlaczonych '
width 21
Background transparent
}
Widget dysk_wolne {
class 'Text'
expression statfs(dysk, 'bavail')*statfs(dysk, 'bsize')/1024
prefix dysk.' '
postfix 'KB dostepne'
width 21
precision 2
update minuta
Background transparent
}
Widget dysk_bar {
class 'Bar'
expression statfs(dysk, 'blocks')-statfs(dysk, 'bavail')
min 0
max statfs(dysk, 'blocks')
length 16
direction 'E'
update minuta
Foreground 'ffffff'
BarColor0 '8f8fff'
BarColor1 '8f8fff'
Background transparent
style 'H'
}
Widget dysk_zajete {
class 'Text'
expression statfs(dysk, 'bavail')*100/statfs(dysk, 'blocks')
width 4
update minuta
postfix '%'
precision 0
Background transparent
}
Layout mylayout {
Row01.Col01 'hostname'
Row03.Col01 'uptime'
Row05.Col01 'wan_info'
Row07.Col01 'down_icon'
Row07.Col02 'wan_dl'
Row07.Col11 'up_icon'
Row07.Col12 'wan_up'
Row08.Col01 'wan_bar'
Row10.Col01 'wlan_info'
Row10.Col18 'wlan_info1'
Row11.Col01 'wlan_klienci'
Row13.Col01 'dysk_wolne'
Row14.Col01 'dysk_bar'
Row14.Col18 'dysk_zajete'
Layer 2 {
X1.Y1 'tlo'
}
}
Display 'st2205u'
Layout 'mylayout'
Uruchomienie
Podłączamy brelok za pomocą kabla USB, przełączamy go w tryb "USB Update". Następnie uruchamiamy testowo naszą konfigurację:
lcd4linux -F -f /etc/lcd4linux.conf
libst2205: detected device, 128x128, 24 bpp.
Można już normalnie uruchomić proces przez /etc/init.d/lcd4linux start i cieszyć się wyświetlanymi informacjami.
Uwagi końcowe
Modyfikację firmware breloka wykonuje się tylko raz, nie traci on przy tym swojej podstawowej funkcjonalności. Skrypt uruchamiający wyświetlanie można podpiąć pod subsystem hotplug, dzięki czemu będzie się uruchamiał tylko jak podłączymy brelok pod ruter.Na koniec mała galeria:
Widok breloka

(kliknij, aby powiększyć)

(kliknij, aby powiększyć)

(kliknij, aby powiększyć)
Podłączony zestaw i wyświetlana informacja

(kliknij, aby powiększyć)

(kliknij, aby powiększyć)