Найти тему
Кириши HackerSpace

Собираем Linux ядро под ARM, для Wi-Fi камеры QVC-IPC-136W

В прошлой статье мы с вами собрали ядро под mips архитектуру для ТВ-приставки в этой статье поговорим о кросс-компиляции GNU/Linux для Wi-Fi камеры с использованием инструментов buildroot и замечательного проекта OpenIPC.

QVC-IPC-136W
QVC-IPC-136W
Камера досталась мне в подарок от коллеги по работе, но для меня была бесполезна, потому что была привязана к сервисам PocтеLeкoма, а я хотел использовать её в походе, запитав от powerbank'a например. В конце статьи мы заставим эту камеру загружацца с MicroSD и подключаться к точке доступа вашего телефона.
Внимание! Сейчас вылетит птичка ;)
Внимание! Сейчас вылетит птичка ;)
нам понадобится MicroSD флешка, UART/TTL адаптер для возможности подключится к камере и подправить конфиг U-boot загрузчика.

Камера использует камень HiSilicon hi3518ev200

HiSilicon hi3518ev200
HiSilicon hi3518ev200

И wi-fi модуль от Realtek RTL8188ETV

RTL8188ETV
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 для загрузки

В своих опытах я использую вот такую флэшку:

-6

Для разметки нагляднее использовать утилиту 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 контактам камеры, по следующей схеме:

UART pinout
UART pinout

Для подключения будем использовать 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 например, на момент написания статьи они выглядели вот так:

Google Cloud console
Google Cloud console

Правда на них предварительно надо доустановить: bc, rsync и (netcat для скачивания результатов компиляции)

sudo apt-get install bc rsync netcat

в общей сложности сборка займёт пол часа...

Cross-Compilation log
Cross-Compilation log

Для того чтобы скачать скомпилированые файлы с Google Cloud

можно юзать либо scp или nc

на принимающей стороне:

nc -l -p 1337 > rootfs.tar

на отправляющей стороне:

cat rootfs.tar | nc -q 0 REMOTE_IP 1337

Спасибо что дочитали до конца.

Всем счастья !