Ладно, признаюсь, делаем робота, достаточно умного и большого. Настолько, что для мозгов потребовался ARM (SmartQ7) И микроконтроллер для грязной работы (чтобы рулить движками, собирать данные с датчиков и все это скармливать ARM’у на обработку) Но бегать за роботом с программатором или сидеть на конце пяти метрового усб шнура как-то «не комильфо»
Так что, покумекав, решил я запрячь SmartQ7 на прошивку сего хозяйства. Для грязной работы у нас стоит atmega2560 (на самом деле нам нужны были все те PWM’ки да внешние прерывания, а не место под код, но товарищ настоял поставить туда все по максимуму). Так что я стрельнул у него на отладку ардуйну с мегой 1280 (разница только в объеме флеша, мне кажется мы уметимся и в 640ю). Так как ардуйновскую IDE я плохо перевариваю, ровно как и саму ардуйну, осталось от ардуйны только бутлоадер да название шелкографией на на платке.
На SmartQ я поднял линух, собранный свеженьким билдрутом, в который вкрячил парочку своих пакетов. Среди них всем известная аврдудка.
Так как оная собирается автотулзами, то ее подцепить туда является делом весьма не хитрым.
Мой пакетик с дудкой для билдрута можно ухватить здесь link
В комплекте едет патчсет к дудке от убунтовских мейнтейнеров, которые туда впихнули пару полезных фичей из SVN транка, таких как дерганье ресетом по DTR на ардуйновских бордах. Кстати, бинарник будет зваться arm-linux-avrdude
Теперь надо бы все это хозяйство собрать. Я не буду вдаваться в подробности как собирал корневуху, только обращу внимание на основные моменты.
нам потребуется openssh, avrdude, wpa_supplicant (не забудте отметить в menuconfig ). udev тоже не помешает положить в комплект. Остальное по вкусу.
Когда корень окажется на SD карточке надо доработать сборку напильником Правим /etc/init.d/rcS
В самый низ, особо не думая можем написать наш код, который поднимет сеть.
Про udhcpc, не забыли?
На SmartQ wifi врубается как-то так:
echo 1 > /sys/devices/platform/smartq_gpio/wifi_en
После можно врубать wpa_supplicant. Конфиг оного выглядит как-то так:
/etc/wpa_supplicant.conf
Заполняем сюда свои данные
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
ap_scan=1
network={
ssid="Astra"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP
psk="MyReallyLongPass"
}
Ну а скрипт поднятия сети при старте выглядит так:
1 2 3 4 5 6 7 | echo 1 > /sys/devices/platform/smartq_gpio/wifi_en sleep 1 echo "Activating wireless" wpa_supplicant -B -c/etc/wpa_supplicant.conf -ieth0 -Dwext sleep 5 udhcpc eth0 echo "System active" |
Теперь правим /etc/sshd_config чтобы можно было лазить по ключу. Правим там путь авторизованных ключей на /etc/authorized_keys и кладем туда пабликкей.
Мы работаем под рутом, что не есть гут, но поднимать мультипользовательское окружения при поджимающих сроках было откровенно говоря лень.
Если все заполнено правильно, втыкаем карту в планшет и грузимся с нее, через пару секунд видем полученный от роутера IP на экране.
Теперь туда можно вломиться по ssh. Это очень круто, так как наконец-то можно приступить к написанию Makefile. Ардуйно-фаги в пролете, я незнаю как это прикручивать к их среде и не горю желанием узнать, так как предпочитаю чистый C, мейкфайлы, и ненавижу ардуйно. В моем случае make flash выглядит как-то так:
1 2 3 4 5 6 7 8 | flash: $(PROJECT).hex ifeq ($(REMOTE),"YES") @echo "Remote flashing in progress" scp $(PROJECT).hex $(REMOTE_USER)@$(REMOTE_HOST):/tmp/$(PROJECT).hex ssh -l $(REMOTE_USER) $(REMOTE_HOST) $(AVRDUDE) -c $(PROG) -p $(MCU) -P $(PORT) -b $(BAUD) -u -U flash:w:/tmp/$(PROJECT).hex else sudo $(AVRDUDE) -c $(PROG) -p $(MCU) -P $(PORT) -b $(BAUD) -u -U flash:w:$(PROJECT).hex endif |
Все переменные надо ясен пень выставить. Я ради этого прикрутил к мейкфайлу что-то вроде управления профилями сборки, что выполняет сие действо парой симлинков. Выставив REMOTE в «YES» мы врубаем «удаленную» прошивку мк: hex летит по ssh в /tmp планшета а оттуда шьется дудкой. /tmp лучше смонтировать как tmpfs, кстати.
Да, и не забываем врубить питание usb хоста, если мк от него питается. На смартку это делается записью единички в волшебный файл. Но надо бы более общее решение… Makefile’ом!
Нижеследующее можно засунуть в smq.mk и -includeить в свой Makefile. Выглядит местами страшновато, но зато работает!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #This is a helper Makefile that allows to control different functions of SmartQ 7 via a makefile iface smq-log: ssh -l $(REMOTE_USER) $(REMOTE_HOST) "echo '$(TEXT)' > /dev/tty0" sw-gpio: ssh -l $(REMOTE_USER) $(REMOTE_HOST) "echo $(STATE) > /sys/devices/platform/smartq_gpio/$(GFILE)" sw-lcd: ssh -l $(REMOTE_USER) $(REMOTE_HOST) "echo $(STATE) > /sys/devices/platform/s3c-lcd/$(GFILE)" hostpwr-on: STATE=1 GFILE=usbhostpwr_en $(MAKE) sw-gpio hostpwr-off: STATE=0 GFILE=usbhostpwr_en $(MAKE) sw-gpio otgpwr-on: STATE=1 GFILE=usbpwr_en $(MAKE) sw-gpio otgpwr-off: STATE=0 GFILE=usbpwr_en $(MAKE) sw-gpio led1-on: STATE=1 GFILE=led1_en $(MAKE) sw-gpio led1-off: STATE=0 GFILE=led1_en $(MAKE) sw-gpio led2-on: STATE=1 GFILE=led2_en $(MAKE) sw-gpio led2-off: STATE=0 GFILE=led2_en $(MAKE) sw-gpio lcd-on: STATE=1 GFILE=backlight_power $(MAKE) sw-lcd STATE=1 GFILE=lcd_power $(MAKE) sw-lcd STATE=100 GFILE=backlight_level $(MAKE) sw-lcd lcd-off: STATE=0 GFILE=backlight_level $(MAKE) sw-lcd STATE=0 GFILE=lcd_power $(MAKE) sw-lcd STATE=0 GFILE=backlight_power $(MAKE) sw-lcd backlight-%: STATE=$* GFILE=backlight_level $(MAKE) sw-lcd ssh: -ssh -l $(REMOTE_USER) $(REMOTE_HOST) |
И оно даже работает!