Прошиваем AVR удаленно от ARM’a

Ладно, признаюсь, делаем робота, достаточно умного и большого. Настолько, что для мозгов потребовался 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)

И оно даже работает!

Добавить комментарий