BR-HisiCam
Buildroot based sample firmware for HiSilicon`s System-On-a-Chip ip cameras
Part of OpenHisiIpCam project
๐ Table of Contents
๐ About
This repo is freezed, will not be maintained or improved.
This repo can be used as starting point for ip camera research or some other associated project.
Here term firmware means full set of software needed for running embedded device. In our case it is bootloader, Linux kernel, filesystem, that contains full software set including system utilities, applications that manage audio/video pipeline, business logic and service functions.
Currently this repo covers just few tasks, it is mostly empty system that runs one application (that itself lacks all needed functionality), but we are working on improvement of different aspects of overall functionality.
๐ Getting started
This is quick tutorial how to prepare source tree and build kernel and root file system image.
All these were developed and tested under Ubuntu 18.04/19.10 GNU/Linux OS. Supposed that everything will work on any modern GNU/Linux distro, deb based distros most probably have same system dependency packages names, on other distros satisfy deps by yourself.
1. Clone repo:
foo@bar:~$ git clone --recursive https://github.com/OpenHisiIpCam/br-hisicam --depth 1
2. Install required system packages:
foo@bar:~$ sudo make install-ubuntu-deps
Let us know if we miss some dependencies!
3. Prepare source tree:
foo@bar:~$ make prepare
During this step buidlroot source archive (~7MB) will be downloaded and unpacked.
4. List avalible boards/modules:
foo@bar:~$ make list-configs
jvt_s274h19v-l29_hi3519v101_imx274
unknown_unknown_hi3519v101_unknown
5. Build toolchain, kernel and rootfs for choosen module:
foo@bar:~$ make BOARD=jvt_s274h19v-l29_hi3519v101_imx274 all
During build step, toolchain will be generated from scratch, that takes time and requires all deps sources to be downloaded. Downloaded data is about 200MB.
All artifacts reside in output directory that is ./output
by default. However you may override it
with OUT_DIR=path/to/my/output
make variable. This output directory will be referenced below as
OUT_DIR
.
๐ง Overall build process (dependencies download time not included) can take:
- about 15 minutes on Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz, 16GB RAM
- about 20 minutes on Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz, 16GB RAM
- about 50 minutes on Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz, 8GB RAM
- about 22 minuts on Intel(R) Core(TM) i5-8250U CPU @ 1.6GHz, 8GB RAM
Directory OUT_DIR/images
contains kernel and rootfs images:
foo@br:~/br-firmware/output/images$ tree .
.
โโโ rootfs.squashfs # XZ compressed SquashFS root file system
โโโ uImage # U-Boot wrapped XZ compressed kernel image
0 directories, 2 files
Now you can deploy software to your camera module!
๐ฅ Deploy
This short deploy guide assume that you are familiar with your hardware, you made all wire (power, network and debug UART) connections and so on.
Prepare host machine
For developing purpose we recommend upload kernel and rootfs (as initramfs) into the RAM of the device, not writing it to ROM. In this case your expiriments will not affect normal device operation, after reset/poweroff of the device it will be at same state as before, becasue ROM data will still contains factory firmware.
Such way requires access to device`s bootloader (U-Boot in our case) and supposed that it will have tftp, bootm commands and avalibity of network operation.
As U-Boot will download kernel and rootfs images via TFTP, you have to install and tune tftp server on your host machine.
In our case it will be tftpd-hpa
, but you can use any you are familiar with.
foo@bar:~$ sudo apt-get install tftpd-hpa
foo@bar:~$ cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/foo/br-firmware/tftp" # <--- change path to your actual dir
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
After changes don`t forget to restart tftpd-hpa
foo@bar:~$ sudo /etc/init.d/tftpd-hpa restart
Your test facility will be look like following schema.
Network configuration is sample, you can use any consistent network settings for your host machine and camera module.
Upload software via U-Boot
Your USB-TTL adapter will be registered in system as /dev/ttyUSB0 or in some cases as /dev/ttyACM0.
You can use any serial terminal app like putty
, miniterm
or even screen
99% of known camera modules have U-Boot setuped for 115200,8n1 serial communication.
After camera power on quickly press Ctrl+C (send Ctrl+C to camera trough serial connection) to interrupt normal boot process.
When you will catch U-Boot prompt hisilicon #
(sometimes xm #
, Zview #
, etc) you ready to input commands.
1. Setup network settings and ip of tftp server (your host machine ip)
hisilicon # setenv ipaddr 192.168.1.100; setenv netmask 255.255.255.0; setenv serverip 192.168.1.1;
Next steps will require chip and board specific information! TODO
make jvt_s274h19v-l29_hi3519v101_imx274_info
2. Download kernel and rootfs images from your host machine tftp server
hisilicon # tftp 0x82000000 uImage
hisilicon # tftp 0x82400000 rootfs.squashfs
3. Setup kernel boot params.
hisilicon # setenv bootargs mem=64M console=ttyAMA0,115200 root=/dev/ram initrd=0x82400000,4M
4. Finally let U-Boot load Linux kernel
hisilicon # bootm 0x82000000
Deploy to ROM is another story and at the moment it is out of scope this document.
๐ Technical notes
All system is built on top of the Buildroot (br for short).
HiSilicon SoCs support made as buildroot external tree (br-ext-hisicam
dir).
For some reason we need flexible way of vanilla kernel patching (we wanted to support orderable patches and files overlay apply),
so we made such extension.
External tree structure
. #br-ext-hisicam dir contains following data
โโโ Config.in
โโโ board
โย ย โโโ hi3516av100 # hi3516av100 family dir
โย ย โย ย โโโ hi3516av100.config # key=value chip specific settings
โย ย โย ย โโโ hi3516dv100.config # ---//---
โย ย โย ย โโโ kernel # patches and files overlay for vanilla kernel
โย ย โย ย โโโ hi3516av100.generic.config # kernel default config
โย ย โย ย โโโ hi3516dv100.generic.config # kernel default config
โย ย โย ย โโโ overlay # kernel files overlay dir
โย ย โย ย โโโ patches # kernel patches dir
โย ย โโโ hi3516av200 # o
โย ย โโโ hi3516cv100 # t
โย ย โโโ hi3516cv200 # h
โย ย โโโ hi3516cv300 # e
โย ย โโโ hi3516cv500 # r
โย ย โโโ hi3516ev200 # families, orginized similar way
โย ย โโโ jvt # JVT modules dir
โย ย โย ย โโโ jvt_s274h19v-l29_hi3519v101_imx274 #
โย ย โย ย โโโ config # key=value board specific settings
โย ย โย ย โโโ kernel # Kernel specific data, like configs, patches overlay
โย ย โโโ ruision # another module vendor dir
โย ย โโโ ssqvision # ---//---
โย ย โโโ xm # ---//---
โย ย โโโ generic # generic boards dir
โย ย ย ย โโโ unknown_unknown_hi3516av100_unknown # similar to vendor modules dir (jvt, xm, etc)
โย ย ย ย โโโ unknown_unknown_hi3516av200_unknown # can be used for initial RnD with new modules
โย ย ย ย โโโ ...
โย ย ย ย โโโ unknown_unknown_hi3519v101_unknown
โโโ configs # all generic and board specific buildroot configs
โย ย โโโ jvt_s274h19v-l29_hi3519v101_imx274_defconfig
โย ย โโโ unknown_unknown_hi3516av100_unknown_defconfig
โย ย โโโ ...
โย ย โโโ unknown_unknown_hi3519v101_unknown_defconfig
โโโ external.desc
โโโ external.mk
โโโ linux # kernel standard br package extension
โย ย โโโ Config.ext.in # inserts hisi_patcher after vanilla source tree unpack
โย ย โโโ linux-ext-hisi_patcher.mk # see 17.20.2 linux-kernel-extensions (br manual)
โโโ package
โโโ gohisicam # GoHisiCam package TODO
โโโ hisi_patcher # package apply patches and file overlays in orderable way
Long story short, when it comes to kernel, after vanilla sources unpack,
br will apply chip family patches, overlay chip family files, than so same for board specific data.
Exact actions are setuped in BR2_LINUX_KERNEL_EXT_HISI_PATCHER_LIST br config param
(cat ./br-ext-hisicam/configs/jvt_s274h19v-l29_hi3519v101_imx274_defconfig | grep BR2_LINUX_KERNEL_EXT_HISI_PATCHER_LIST
).
We recommend you take a look on Buildroot documentation, in case you want detailed understanding externel tree ideology.
๐ท Target hardware
This project mostly targetted on HiSilicon based one cmos ip camera modules.
More information about different ip camera modules in the catalog.
We name modules according following schema {vendor}_{model}_{chip}_{cmos}
.
Examples:
- jvt_s226h19v-l29_hi3519v101_imx226
- xm_ipg-83he20py-s_hi3516ev100_imx323
- jvt_s274h19v-l29_hi3519v101_imx274
- xm_ivg-hp201y-se_hi3516cv300_imx323
- ssqvision_on290h16d_hi3516dv100_imx290
Also there are generic profiles:
- unknown_unknown_hi3516dv100_unknown
- unknown_unknown_{chip}_unknown
Generic profile supposed to run on the module based on corresponding chip, but only debug UART will works, other periphery like network, should be tuned. Such profiles can be used as starting point for new modules research.
Hardware structuring
HiSilicon has a lot of chips, not only special ip camera solutions, but also NVR/DVR and even smartphone SoCs. Unfortunately it is hard to understand their naming policy, it is not random, but there is no strict patterns.
We split chips into groups, that we call families. Not sure that it is official HiSilicon`s term, but anyway such grouping reduce naming mess a bit.
Family - chips that have similar CPU architecture, similar audio/video pipeline hardware and shares same SDK. Software across family is binary compatible. Family name is repeating some chip name from corresponding group, usually (but not always) that chip is most powerfull chip across the family.
Chip families information
chips | family | kernel |
---|---|---|
hi3516av100, hi3516dv100 | hi3516av100 | 4.9.37 |
hi3519v101, hi3516av200 | hi3516av200 | 3.18.20 |
hi3516cv100, hi3518cv100, hi3518ev100 | hi3516cv100 | 3.0.8 |
hi3516cv200, hi3518ev200, hi3518ev201 | hi3516cv200 | 4.9.37 |
hi3516cv300, hi3516ev100 | hi3516cv300 | 3.18.20 |
hi3516cv500, hi3516dv300, hi3516av300 | hi3516cv500 | 4.9.37 |
hi3516ev300, hi3516ev200, hi3516dv200, hi3518ev300 | hi3516ev200 | 4.9.37 |
hi3519av100 | hi3519av100 | 4.9.37 |
hi3559av100 | hi3559av100 | 4.9.37 |
Tests
At the moment test covers:
- load kernel and rootfs to RAM via uboot/tftp (hiburn test)
- successful linux start with simple network echo server (minimal kernel config test)
- GoHisiProbe TODO (kernel and sdk modules consitency, minimal board params test)
Model | Pass |
---|---|
jvt_s274h19v-l29_hi3519v101_imx274 | OK |
xm_ivg-85hf20pya-s_hi3516ev200_imx307 | OK |
xm_53h20-s_hi3516cv100_imx122 | OK |
xm_ivg-hp203y-se_hi3516cv300_imx291 | OK |
xm_ivg-hp201y-se_hi3516cv300_imx323 | OK |
jvt_s323h16xf_hi3516cv300_imx323 | OK |
ruision_rs-h622qm-b0_hi3516cv300_imx323 | OK |
xm_ivg-85hg50pya-s_hi3516ev300_imx335 | Uboot locked |
xm_ipg-83h50p-b_hi3516av100_imx178 | OK |
xm_ipg-83he20py-s_hi3516ev100_imx323 | OK |
xm_ivg-83h80nv-be_hi3516av200_os08a10 | OK |
ssqvision_on335h16d_hi3516dv300_imx335 | OK |
jvt_s226h19v-l29_hi3519v101_imx226 | OK |
xm_53h20-ae_hi3516cv100_imx222 | OK |
xm_83h40pl-b_hi3516av100_ov4689 | OK |
ssqvision_unknown_hi3519v101_imx326 | Uboot net is not working |
ssqvision_on290h16d_hi3516dv100_imx290 | OK |