В прошлой статье мы с вами собрали ядро под mips архитектуру для ТВ-приставки в этой статье поговорим о кросс-компиляции GNU/Linux для Wi-Fi камеры с использованием инструментов buildroot и замечательного проекта OpenIPC.
Камера досталась мне в подарок от коллеги по работе, но для меня была бесполезна, потому что была привязана к сервисам PocтеLeкoма, а я хотел использовать её в походе, запитав от powerbank'a например. В конце статьи мы заставим эту камеру загружацца с MicroSD и подключаться к точке доступа вашего телефона.
нам понадобится MicroSD флешка, UART/TTL адаптер для возможности подключится к камере и подправить конфиг U-boot загрузчика.
Камера использует камень HiSilicon hi3518ev200
И wi-fi модуль от Realtek RTL8188ETV
Клонируем репозиторий:
git clone https://github.com/sw3nlab/firmware
так как мы собираемся загружаться с MicroSD флешки, редактируем конфиг ядра для сборки по адресу:
vim firmware/br-ext-chip-hisilicon/board/hi3516cv200/kernel/hi3518ev200.generic.config
для поддержки файловых систем ext2/3/4
В секции:
# File systems
Нам нужно найти строки:
# CONFIG_EXT2_FS is not set
# CONFIG_EXT3_FS is not set
# CONFIG_EXT4_FS is not set
Раскомментировать их и установить значение "y"
следующим образом:
CONFIG_EXT2_FS = y
CONFIG_EXT3_FS = y
CONFIG_EXT4_FS = y
(*Опытные сборщики могут поиграть и с другими параметрами сборочного конфига ядра, но особо увлекацца не советую, так как любой модуль вкомпиленый в ядро, раздувает его размер и будет юзать и без того скудные ресурсы железа, а так же и не факт, что вы им будете пользоваться, собирайте только то что будет необходимо вам)
Далее переходим к самой сборке, запускаем:
./building.sh
В псевдо-графическом интерфейсе конфигуратора, выбираем наш камень hi3518ev200
Жмякаем ENTER и идём пить кофе и готовить MicroSD для загрузки
В своих опытах я использую вот такую флэшку:
Для разметки нагляднее использовать утилиту gparted
sudo gparted
Выбираем наш накопитель и пилим его на 3 раздела:
[ ========== MicroSD ========== ]
[ ==== 1 === I === 2 === I === 3 === ]
[ == fat32 == I == ext3 ==I = swap = ]
[== uImage = I = rootfs = I ======= ]
[==100Mb== I== 30Gb = I ==OST==]
После компиляции в директории "firmware/output/images"
Среди прочих, появяцца файлы:
- uImage.hi3518ev200
- rootfs.hi3518ev200.tar
Осталось скопировать их в подготовленные разделы на флешке и поменять параметры загрузки U-boot.
Копируем uImage в раздел fat32
А архив rootfs распаковываем в раздел ext3
после распаковки корневой файловой системы, находим файл init
cp init init_backup
редактируем старый init
vim init
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
load_hisilicon -i sensor ov9732 -osmem 36M -board demo -yuv0 0
sleep 1
gpio set 7 1
modprobe r8188eu
sleep 1
#ifconfig lo up
ifconfig wlan0 192.168.222.176 up
wpa_supplicant -B -Dwext -iwlan0 -c/etc/wpa_supplicant.conf
sleep 1
exec /sbin/init
- Зачем это всё?
Дело в том что с дефолтным конфигом OpenIPC, камера подвисает на загрузке модулей, в своём конфиге мы поминимуму монтируем proc и sys, подаём питание на gpio беспроводного модуля, подгружаем побырому драйвера и поднимаем беспроводной интерфейс...
Далее редактируем файл конфигурации беспроводной сети wpa_supplicant.conf
vim /etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
update_config=1
ap_scan=1
network={
ssid="НАЗВАНИЕ ВАШЕЙ ТОЧКИ"
psk="ПАРОЛЬ К ТОЧКЕ"
}
Сохраняем и идём менять конфиг бутлоадера...
Подпаиваем свой UART/TTL адаптер к UART контактам камеры, по следующей схеме:
Для подключения будем использовать screen поэтому, командуем...
screen /dev/ttyUSB0 115200
подключаем питание камеры и быстро останавливаем загрузку, нажатием любой клавиши.
Посмотрим и скопируем на всякий случай дефолтные переменные загрузчика которые собираемся менять.
printenv
Это значения bootcmd и bootargs
(в любой непонятной ситуации можно будет установить эти старые значения)
Значение bootdelay можно выставить в 5 секунд.
Для загрузки ядра с SD карты, меняем значение bootcmd на следующее:
setenv bootcmd 'fatload mmc 0 0x80007fc0 uImage; bootm 0x80007fc0;'
(Этой строкой мы сообщаем загрузчику чтоб метнулся и забрал наше ядро с флэшки, разместил по адресу 0x80007fc0 и передал ему управление.)
Сохраняем новое значение:
saveenv
Теперь меняем значения переменной bootargs:
setenv bootargs 'mem=36M console=ttyAMA0,115200 root=/dev/mmcblk0p2 rw rootwait rootfstype=ext3 init=/init hw_type=421'
(Тут мы передаём ядру параметры с которыми нужно загружаться, где искать файловую систему, какого она типа, где взять файл инициализации и т.д)
Сохраняем:
saveenv
теперь вставляем свою флешку, передёргиваем питание или пишем в загрузчике
reset
После всех манипуляций, камера будет загружаться, искать поблизости wi-fi точку с указанными в /etc/wpa_supplicant.conf параметрами и подключатся к ней.
###### P/S ######
если что то не работает или работает не так:
- Не торопитесь отпаивать UART отлаживайте/проверьте стартует ли ядро, внимательно читайте лог загрузки ядра.
- проверьте загруженные модули lsmod
- проверьте определился ли беспроводной модуль RTL8188eu командой lsusb
- проверьте адрес своей беспроводной сети, в init поднимается wlan0 192.168.222.176 !
############################
доступ к снапшоту камеры можно получить по адресу:
http://192.168.222.176/image.jpg
Видеопотоки по адресам:
http://192.168.222.176/webrtc
http://192.168.222.176/mjpeg.html
########### PSssss ############
Собирать можно как на своих мощностях, так и удалённо на халявных мощностях Google Cloud например, на момент написания статьи они выглядели вот так:
Правда на них предварительно надо доустановить: bc, rsync и (netcat для скачивания результатов компиляции)
sudo apt-get install bc rsync netcat
в общей сложности сборка займёт пол часа...
Для того чтобы скачать скомпилированые файлы с Google Cloud
можно юзать либо scp или nc
на принимающей стороне:
nc -l -p 1337 > rootfs.tar
на отправляющей стороне:
cat rootfs.tar | nc -q 0 REMOTE_IP 1337
Спасибо что дочитали до конца.
Всем счастья !