Сборка ядра Linux на целевой платформе ARM

Ядро Linux — ядро операционной системы, соответствующее стандартам POSIX, составляющее основу операционных систем семейства Linux. Разработка кода ядра была начата финским студентом Линусом Торвальдсом в 1991 году, на его имя зарегистрирована Торговая марка «Linux».
7 января 2019: первый релиз-кандидат Linux 5.0 (Более 26 млн строк кода).

Для примера соберём ядро с поддержкой Cedrus на целевой платформе.
Sunxi-Cedrus.

Покажу, как собрать на базе ядра (4.19.20-sunxi) от armbian.

uname -a


root@orangepipc:~# uname -a
Linux orangepipc 4.19.20-sunxi #5.75 SMP Sat Feb 9 19:02:47 CET 2019 armv7l armv7l armv7l GNU/Linux

Ставим инструментарий:

apt-get install kernel-package libncurses5-dev fakeroot quilt

Получение исходного кода ядра

cd /usr/src
wget https://github.com/bootlin/linux-cedrus/archive/release-2019.03.tar.gz
tar -xvzf release-2019.03.tar.gz
cd linux-cedrus-release-2019.03
make -j4 sunxi_defconfig
make -j4 menuconfig

Необходимо выбрать следующие параметры конфигурации ядра:
CONFIG_MEDIA_SUPPORT
CONFIG_MEDIA_CONTROLLER_REQUEST_API
CONFIG_MEDIA_CONTROLLER
CONFIG_V4L_MEM2MEM_DRIVERS
CONFIG_VIDEO_SUNXI_CEDRUS

Device Drivers  ---> Generic Driver Options  ---> 
        (256) Size in Mega Bytes 
Device Drivers  ---> Multimedia support 
        [*]   Cameras/video grabbers support 
        [*]   Media Controller API
        [*]     Enable Media controller Request API (EXPERIMENTAL)
        [*]   V4L2 sub-device userspace API
        [*]   Enable advanced debug functionality on V4L2 drivers
        [*]   V4L platform devices  --->
                <M>   Allwinner V3s Camera Sensor Interface driver  
        [*]   Memory-to-memory multimedia devices  ---> 
                <M>   Deinterlace support 
                <M>   SuperH VEU mem2mem video processing driver 
         [*]   Media test drivers  --->  
                <M>   Virtual Media Controller Driver (VIMC) 
                <M>   Virtual Video Test Driver    
                 [ ]     Enable CEC emulation support (NEW)    
                (64)    Maximum number of devices (NEW)  
                <M>   Virtual Memory-to-Memory Driver    
                <M>   Virtual Codec Driver
Device Drivers  ---> Staging drivers   ---> Media staging drivers  --->   
        [*]   Allwinner sunXi family Video Devices
        <M>     Allwinner Cedrus VPU driver

пакеты headers и image(ядро) собираю так:

fakeroot make-kpkg -j 4 --initrd --append-to-version=-bootlin kernel_image kernel_headers

На плате Orangepi-PC пакеты собираются примерно за час.
в папке /usr/src найдём два пакета linux-headers-5.0.0-bootlin_5.0.0-bootlin-10.00.Custom_armhf.deb и linux-image-5.0.0-bootlin_5.0.0-bootlin-10.00.Custom_armhf.deb
установим эти пакеты:

cd /usr/src
dpkg -i *.deb

в папке /usr/src/linux-cedrus-release-2019.03/arch/arm/boot/dts найдём файл дерева устройств, в моём случае это файл sun8i-h3-orangepi-pc.dtb (для своей платы ищите соответствующий вашей плате .dtb)
копируем его в нашу систему:

cp -rp /usr/src/linux-cedrus-release-2019.03/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb  /boot/dtb

и делаем новую символьную ссылку на новое ядро:

rm /boot/zImage
ln -s /boot/vmlinuz-5.0.0-bootlin  /boot/zImage 
reboot

проверим:

uname -a


root@orangepipc:~# uname -a
Linux orangepipc 5.0.0-bootlin #1 SMP Sun Mar 17 07:44:45 UTC 2019 armv7l armv7l armv7l GNU/Linux

lsmod


sunxi_cedrus 32768 0
v4l2_mem2mem 20480 1 sunxi_cedrus
videobuf2_dma_contig 20480 1 sunxi_cedrus
videobuf2_memops 16384 1 videobuf2_dma_contig
videobuf2_v4l2 20480 2 sunxi_cedrus,v4l2_mem2mem
videobuf2_common 45056 3 sunxi_cedrus,v4l2_mem2mem,videobuf2_v4l2

root@orangepipc:~# dmesg | grep cedrus
[    4.209507] sunxi_cedrus: module is from the staging directory, the quality is unknown, you have been warned.
[    4.216242] cedrus 1c0e000.video-codec: Device registered as /dev/video0
root@orangepipc:~# ls -l /dev/ | grep video
crw-rw---- 1 root video    29,   0 Mar 18 15:46 fb0
crw-rw---- 1 root video   252,   0 Mar 18 15:46 media0
crw-rw---- 1 root video    81,   0 Mar 18 15:46 video0
 846   2 мес   Linux
9 комментариев
Dreyk 2 мес

Здравствуйте. По вашему мануалу собрал ядро, а дальше по аналогии с http://linux-sunxi.org/Sunxi-Cedrus#libva-v4l2-request хочу собрать libva-v4l2-request, но во время сборки появляется ошибки:

«config.c:127:6: error: ’V4L2_PIX_FMT_H264_SLICE’ undeclared (first use in this function); did you mean ’V4L2_PIX_FMT_H264_MVC’?»
и
«config.c:138:6: error: ’V4L2_PIX_FMT_HEVC_SLICE’ undeclared (first use in this function); did you mean ’V4L2_PIX_FMT_H264_SLICE’?»

Здесь (https://github.com/bootlin/libva-v4l2-request/issues/7) пишут, что якобы хедеры не установлены, но как такое может быть, если мы установили «linux-headers-5.0.0-bootlin_5.0.0-bootlin-10.00.Custom_armhf.deb» ? В чём может быть проблема? Заранее спасибо за ответ)

ua3nbw 2 мес

Здравствуйте. В хидерах, в файле /usr/src/linux-headers-4.20.12/include/uapi/linux/videodev2.h
нет нескольких макросов типа: V4L2_PIX_FMT_MPEG2_SLICE, искал эти макросы в google и вставлял в videodev2.h
после этого libva-v4l2-request собрался.

Dreyk 2 мес

Спасибо.
Эту проблему удалось решить при помощи следующей команды для сборки «libva-v4l2-request»:

./autogen.sh enable-tools=yes prefix=/usr/local CFLAGS=»-I/usr/src/linux-headers-5.0.0-bootlin/include/uapi/ -I/usr/src/linux-headers-5.0.0-bootlin/include/»

Которая ткнула компилятор в хедеры «насильно».

НО в следствии выяснилось, что с текущим ядром (которое получено по вашему мануалу) отсутствует устройство /dev/dri/card0 (самой директории /dev/dri не существует), соответственно ничего не работает и v4l2-request-test не запускается.

Как думаете: в чём может быть причина? Возможно пропущены какие-то пункты при конфигурации ядра?

Dreyk 2 мес

ох... движек обработки текста комментариев «зажевал» команду, но думаю, общий смысл понятен

ua3nbw 2 мес

Есть у bootlin косяк в конфигурировании, для включения нужных опций, дважды заходим в  Device Drivers -> Multimedia support и Device Drivers -> Staging drivers -> Media staging drivers чтобы включить всё нужные модули ядра.

у меня значимых результатов небыло, вроде всё работает, но mpv и  vlc по их описанию http://linux-sunxi.org/Sunxi-Cedrus запустить не удалось.

Dreyk 2 мес

«Device Drivers -> Multimedia support и Device Drivers -> Staging drivers -> Media staging drivers чтобы включить всё нужные модули ядра.»

Так а какие нужные? Те, которые вы указали в мануале? Если только они, то я все выбрал (да, там нужно было по несколько раз заходить, чтоб все опции появились). Но /dev/dri/card0 не появилась... Предполагаю, что из-за того, что конфиг сильно отличается от обычного armbian-овского.

Думаю, нужно или ядро Bootlin Linux-Cedrus собирать с конфигом ARMBIAN-овского ядра + поддержка Cedrus.
Или ARMBIAN-овское ядро какое-нибудь из последних dev с поддержкой Cedrus собирать и проверять.
Так как sunxi_defconfig видимо не всё, что нужно даёт.

Dreyk 2 мес

Я так до конца и не понял чем отличается ядро https://github.com/bootlin/linux-cedrus/ от mainline ядра (ведь все изменения в нём уже есть?)

и чем отличается и отличается ли armbian-овское ядро от оригинального mainline ядра (ведь патчи же armbian какие-то накладывает или нет и вся магия в конфиге?)?

И откуда брать исходники armbian-dev-ядер?

Dreyk 2 мес

Решил, что легче брать эти исходники из https://apt.armbian.com/pool/main/l/linux-source*...

Вот бесит, что у народа, судя по отзывам, как минимум v4l2-request-test запускается и кролик бегает в 1080p на mainline ядре, а я уже второй день долблюсь без толку...

Собрал ядро mainline 5.3 с вроде как включенным Cedrus в конфиге, установил, теперь другие ошибки пишет: то в либе libva-v4l2-request функции нету, то permission denided. Видимо в mainline не завезли ещё полноценную поддержку Cedrus, нужно родной кернел конфиг armbian городить в https://github.com/bootlin/linux-cedrus пытаться...

Популярное