Radxa 学习摘录1:https://developer.aliyun.com/article/1598562
(4)脚本执行顺序
bsp └── [utils]build ├── [utils]load_profile └── [uboot]component_build ├── [utils]bsp_build │ ├── [utils]prepare_source │ ├── [uboot]bsp_prepare │ └── [uboot]bsp_make(make -C) │ └── Makefile └── [uboot]bsp_makedeb
(5)radxa uboot deb 结构
/usr/lib/u-boot/rock-3b/
setup.sh 脚本分析
setup.sh └── update_bootloader /dev/mmcblk1 └── update_idbloader /dev/mmcblk1 ├── idbloader ├── 刷 idbloader.img └── 刷 u-boot.itb
update_bootloader() { local DEVICE=$1 update_idbloader "$DEVICE" if [[ -f "$SCRIPT_DIR/u-boot.itb" ]] then # dd conv=notrunc,fsync if=/usr/lib/u-boot/rock-3b/u-boot.itb of=/dev/mmcblk1 bs=512 seek=16384 dd conv=notrunc,fsync if="$SCRIPT_DIR/u-boot.itb" of=$DEVICE bs=512 seek=16384 elif [[ -f "$SCRIPT_DIR/uboot.img" ]] && [[ -f "$SCRIPT_DIR/trust.img" ]] then dd conv=notrunc,fsync if="$SCRIPT_DIR/uboot.img" of=$DEVICE bs=512 seek=16384 dd conv=notrunc,fsync if="$SCRIPT_DIR/trust.img" of=$DEVICE bs=512 seek=24576 else echo "Missing U-Boot binary!" >&2 return "$ERROR_REQUIRE_FILE" fi # sync /dev/mmcblk1 sync "$DEVICE" } update_idbloader() { local DEVICE=$1 # 偏移 32 K # dd conv=notrunc,fsync if=/usr/lib/u-boot/rock-3b/idbloader.img of=/dev/mmcblk1 bs=512 seek=64 dd conv=notrunc,fsync if="$(idbloader)" of=$DEVICE bs=512 seek=64 } idbloader() { if [ -e "$SCRIPT_DIR/idbloader-sd_nand.img" ] then echo "$SCRIPT_DIR/idbloader-sd_nand.img" else echo "$SCRIPT_DIR/idbloader.img" fi } # echo /usr/lib/u-boot/rock-3b/idbloader.img
(6)资料截图
闭源版本
<SDK>/rkbin/bin/rk35/rk3568_ddr_1560MHz_v1.13.bin ---------------> tpl
<SDK>/rkbin/bin/rk35/rk356x_spl_v1.12.bin -------------------------------> spl
<SDK>/rkbin/bin 目录下存放了很多 RK 提供的二进制文件,这些二进制文件都是不开源的,
所以只有二进制文件。
开源版本
spl 镜像位于 <U-Boot>/spl 目录下:
tpl 镜像位于 <U-Boot>/tpl 目录下:
(7)参考资料
Rockchip RK3399 - 引导流程和准备工作 重制
Rockchip RK3399 - TPL/SPL方式加载uboot
Rockchip RK3399 - 移植uboot 2023.04 & linux 6.3
Rockchip RK3399 - busybox 1.36.0制作根文件系统
Rockchip | Rockchip ATF(ARM Trusted Firmware)的获取与构建
uImage的制作工具mkimage详解(源码编译、使用方法、添加的头解析、uImage的制作)
5、Kernel 开发
(1)构建内核
bsp [options] <linux|u-boot> <profile> [product] ./bsp linux rk356x -s ./bsp linux rk356x ./bsp -d --dirty linux rk356x -r 999 ./bsp --no-prepare-source linux rk3568 -r 999 参数说明: # --no-prepare-source # 使用本地修改进行编译,如果不加这个参数将会从 Radxa kernel 仓库同步最新代码并覆盖本地修改 # -r 999 # 指定内核的版本号为 999,以优先使用 # rockchip_linux_defconfig # rk3568-atk-evb1-ddr4-v10-linux ??
1.编译完成后会在当前目录生成许多 deb 包, 只需要安装下面两个 deb 即可
linux-headers-5.10.160-999-rk356x_5.10.160-20_arm64.deb
linux-image-5.10.160-999-rk356x_5.10.160-20_arm64.deb
- 将上面两个 deb 包复制到板子上使用 dpkg 指令安装即可完成内核安装
sudo dpkg -i linux-image-5.10.160-999-rk356x_5.10.160-20_arm64.deb sudo dpkg -i linux-headers-5.10.160-999-rk356x_5.10.160-20_arm64.deb sudo reboot
(2)脚本执行顺序
bsp └── [utils]build ├── [utils]load_profile # lib/linux.sh, linux/fork.conf └── [linux]component_build ├── [utils]bsp_build │ ├── [utils]prepare_source │ ├── [linux]bsp_prepare │ └── [linux]bsp_make(make -C) │ └── Makefile └── [linux]bsp_makedeb
(3)radxa kernel deb 结构
/usr/lib/linux-image-5.10.160-704-rk356x/rockchip/
/usr/lib/linux-image-5.10.160-704-rk356x/rockchip/overlays/
/lib/modules/5.10.160-704-rk356x/
/lib/modules/5.10.160-704-rk356x/kernel/
(4)DTS
官方文档: Specifications - DeviceTree
(5)驱动
正点原子【第三期】手把手教你学Linux之系统移植和根文件系统构建篇
6、RadxaOS
(1)安装依赖
sudo apt update sudo apt install -y git # Podman (recommended) sudo apt install -y podman podman-docker sudo touch /etc/containers/nodocker # Docker #sudo apt install -y docker.io #sudo adduser $USER docker #sudo reboot
(2)获取代码
git clone https://github.com/radxa-repo/rbuild.git
(3)编译
# Build radxa-cm3-sodimm-io image with default OS (currently Debian Bullseye) and flavor (CLI) ./rbuild radxa-cm3-sodimm-io # Build rock-5b Debian image with KDE ./rbuild rock-5b kde ./rbuild rock-3b bullseye kde -d ./rbuild rock-3b cli -c latest
debos
debos 是一款简化各种基于 Debian 的操作系统映像创建的工具。虽然大多数其他工具都专注于特定用例,但 debos 更像是一个工具链,可让常见操作变得简单,同时提供足够的资源来完成幕后可能需要的任何调整。
7、rsetup
8、摄像头
(1)radxa 摄像头操作
- 预览
打开终端,输入以下命令打开相机预览:
gst-launch-1.0 v4l2src device=/dev/video0 io-mode=4 ! videoconvert ! video/x-raw,format=NV12,width=1920,height=1080 ! xvimagesink;
- 拍照
打开终端,输入以下命令打开相机进行拍照:
gst-launch-1.0 v4l2src device=/dev/video0 io-mode=4 ! videoconvert ! video/x-raw,format=NV12,width=1920,height=1080 ! jpegenc ! multifilesink location=file.name.jpg;
- 拍摄视频
打开终端,输入以下命令打开相机进行拍摄视频:
gst-launch-1.0 v4l2src num-buffers=512 device=/dev/video0 io-mode=4 ! videoconvert ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! tee name=t ! queue ! mpph264enc ! queue ! h264parse ! mpegtsmux ! filesink location=/home/radxa/file.name.mp4
(2)v4l2-ctl
# 查看帮助文档梗概如下 v4l2-ctl --help # 查看完整的帮助文档如下,内容相对较多 v4l2-ctl --help-all # 查看与 streaming 相关的参数如下 v4l2-ctl --help-streaming # 查看与 vidcap 相关的参数如下。它主要包括 get-fmt、set-fmt 等 v4l2-ctl --help-vidcap
使用 v4l2-ctl 抓帧
示例一,抓取 RKCIF 输出的 1 帧 NV12 数据保存到 /tmp/nv12.bin,分辨率为 640x480。在保存数据前,先
丢弃前面 3 帧 (即前面 3 帧虽然返回给 userspace,但不保存到文件) 。
v4l2-ctl -d /dev/video0 \ --set-fmt-video=width=640,height=480,pixelformat=NV12 \ --stream-mmap=3 \ --stream-skip=3 \ --stream-to=/tmp/nv12.bin \ --stream-count=1 \ --stream-poll
示例二,抓取RKISP输出的 10 帧 NV12 数据保存到 /tmp/nv12.bin,分辨率为 1920x1080 。
v4l2-ctl -d /dev/video1 \ --set-selection=target=crop,top=0,left=0,width=1920,height=1080 --set-fmt-video=width=1920,height=1080,pixelformat=NV12 \ --stream-mmap=3 \ --stream-to=/tmp/nv12.bin \ --stream-count=10 \ --stream-poll
参数的说明:
-d,指定操作对象为 /dev/video0 设备。
–set-selection,指定对输入图像进行裁剪。特别是当 RKISP1 的前级大小发生变化时要保证 selection 不大于前级输出大小。RKCIF 的裁剪则是通过 --set-crop 参数设置的
–set-fmt-video,指定了宽高及 pxielformat (用 FourCC 表示)。 NV12 即用 FourCC 表示的 pixelformat 。
–stream-mmap,指定 buffer 的类型为 mmap,即由 kernel 分配的物理连续的或经过 iommu 映射的 buffer 。
–stream-skip,指定丢弃(不保存到文件)前 3 帧
–stream-to,指定帧数据保存的文件路径
–stream-count,指定抓取的帧数,不包括–stream-skip 丢弃的数量
–stream-poll,该选项指示 v4l2-ctl 采用异步 IO,即在 dqbuf 前先用 select 等等帧数据完成,从而保证 dqbuf 不阻塞。否则 dqbuf 将会阻塞直到有数据帧到来
设置曝光、gain 等 control
如果 Sensor 驱动有实现 v4l2 control,在采集图像前,可以通过 v4l2-ctl 设置如曝光、gain 等。RKCIF 或 RKISP 会继承 sub device 的 control,因此这里通过 /dev/video3 可以看到 Sensor 的 v4l2 control。
如下是 RK3326 SDK 机子上查看到的 OV5695 的相关设置,包括 exposure,gain,blanking,test_pattern 等。
v4l2-ctl -d /dev/video1 -l User Controls exposure 0x00980911 (int) : min=0 max=4095 step=1 default=1575 value=1589 gain 0x00980913 (int) : min=256 max=43663 step=1 default=256 value=256 horizontal_flip 0x00980914 (bool) : default=0 value=0 vertical_flip 0x00980915 (bool) : default=0 value=0 Image Source Controls vertical_blanking 0x009e0901 (int) : min=686 max=686 step=1 default=686 value=686 horizontal_blanking 0x009e0902 (int) : min=1524 max=1524 step=1 default=1524 value=1524 analogue_gain 0x009e0903 (int) : min=256 max=2816 step=1 default=512 value=1554 Image Processing Controls link_frequency 0x009f0901 (intmenu): min=0 max=0 default=0 value=0 pixel_rate 0x009f0902 (int64) : min=0 max=182463120 step=1 default=182463120 value=182463120 flags=read-only test_pattern 0x009f0903 (menu) : min=0 max=13 default=0 value=0
用 v4l2-ctl 可以修改这些 control 。如修改 exposure 及 analogue_gain 如下。
v4l2-ctl -d /dev/video3 --set-ctrl 'exposure=1216,analogue_gain=1000
(2)MIPI接口
MIPI CSI(Camera Serial Interface)接口是移动设备中摄像头传输的主要接口之一。摄像头通常使用 MIPI CSI 接口来传输图像数据。MIPI CSI 接口支持多种数据编码格式,包括 YUV、RGB 和 RAW 等。
MIPI DSI(Display Serial Interface)接口可以用于传输触摸屏输入信号和视频信号。触摸屏通常使用 MIPI DSI 接口来传输触摸屏输入信号。MIPI DSI 接口还可以同时传输视频信号和触摸屏输入信号,从而节省系统成本和空间。
CIF 和 ISP
在本文档中,我们将介绍 RK3568 芯片的 CIF (Camera Interface) 和 lSP (lmage SignalProcessor) 模块。这两个模块是 RK3568 芯片的关键组成部分,用于图像采集和处理。
CIF 是一个标准接口,用于连接 CMOS 或 CCD 图像传感器,并从传感器读取图像数据。而 ISP 是一种专门用于图像处理的硬件模块,它可以对从传感器读取的原始图像数据进行预处理、降噪、白平衡、自动对焦等处理操作,以生成最终的图像数据。
在 RK3568 芯片中,CIF 模块负责与相机模块进行物理连接,并将原始的图像数据传输到 ISP 模块进行进一步处理。同时,ISP 模块还可以通过 CIF 模块向相机模块发送控制信号,以控制相机的曝光时间、增益等参数。因此,CF 和 ISP 模块在 RK3568 芯片中密切关联,共同实现了高质量的图像采集和处理功能。
RK3568 芯片的 CIF 和 ISP 模块是紧密协作的,通过相互配合完成了复杂的图像处理任务,为用户提供了出色的图像采集和处理体验 。
9、H264
10、问题
sudo apt-get install ncurses-dev
Ubuntu24.04 安装 libwebkit2gtk-4.0
Types: deb URIs: http://br.archive.ubuntu.com/ubuntu/ Suites: jammy noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg Types: deb URIs: http://security.ubuntu.com/ubuntu/ Suites: jammy-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
sudo apt install libwebkit2gtk-4.0-dev