简介面向具备一定Linux与嵌入式基础的研发人员这份PDF系统梳理了全志V3S平台音视频开发的完整链路从交叉编译环境搭建、U-boot与Linux内核配置、Buildroot根文件系统制作到TFT屏幕、按键、声卡与摄像头等外设驱动再到SDL2与QT5的移植及音乐播放器、图片浏览、视频播放和摄像头模块的界面实现帮助读者打通从底层驱动到上层GUI的整条开发路径。资源包内仅含1个PDF文件大小约12.26MB内容按章节顺序组织便于对照实践逐步推进。目前已有329人学习适合希望系统掌握嵌入式音视频开发流程、补齐外设驱动与QT5应用短板的工程师参考也可作为FFmpeg解码与音视频界面设计的实操读本。1. 全志V3S音视频开发环境搭建从交叉编译器到Qt5的完整链路第一次在 V3S 上折腾音视频最容易翻车的不是代码而是环境。板子还没点亮交叉编译器路径写错、U-boot 设备树少一段、内核 NFS 没编进去随便一个都能让你在串口黑屏前坐一下午。全志 V3S 这颗 SoC 在物联网和智能硬件里出镜率很高Cortex-A7 单核、内置以太网 PHY、接口够用拿来做音乐播放器、摄像头预览、小屏 GUI 都合适。这套环境的核心链路是交叉编译器 → U-boot → Linux 5.4.31 内核 → buildroot 根文件系统 → SDL2/Qt5 音视频应用。下面按我实际装机的顺序走一遍版本、路径、参数都落到能抄的程度。2. 交叉编译器与工作目录先把工具链钉死2.1 版本选择与目录规划交叉编译器选的是gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf。这个版本和 5.4.31 内核、buildroot-2021.02.1 搭配比较稳glibc 版本不会太新导致根文件系统里跑不起来。下载来源是 Linaro 官方 releases 页面选 6.5-2018.12 分支下的arm-linux-gnueabihf目录拿 x86_64 宿主机对应的压缩包。工作目录我习惯先建一个总目录再按用途拆子目录后面所有路径引用都从这里出发mkdir -p ~/qz/{driver,tools,kernel} # driver放应用程序和测试代码 # tools放交叉编译器、U-boot、buildroot # kernel放 Linux 内核源码把下载好的工具链压缩包拷到~/qz/tools下解压cd ~/qz/tools tar -xvf gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz解压后目录名就是gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf。这里有个细节压缩包通过 Samba 共享或虚拟机共享目录拷进来都行但别在 Windows 盘符挂载目录里直接解压符号链接会丢后面编译内核时报cannot execute binary file就是它。2.2 获取工具链输出路径并写入 bashrc进入 bin 目录拿绝对路径这个路径每个人不一样必须用pwd实际输出cd ~/qz/tools/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/bin pwd # 输出示例/home/farsight/qz/tools/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/bin然后写进用户 shell 环境vim ~/.bashrc # 文件末尾追加路径替换成上一步 pwd 的真实输出 export PATH$PATH:/home/farsight/qz/tools/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/binexport PATH是把工具链 bin 目录追加到现有 PATH 后面不覆盖系统原有路径。这里不建议写PATH...:$PATH放前面避免工具链里的ld、as抢在系统工具前头影响宿主机本地编译。改完执行source ~/.bashrc arm-linux-gnueabihf-gcc -v能打印出 gcc 6.5.0 的版本信息就说明环境变量生效了。如果提示 command not found先echo $PATH看路径有没有拼错再确认 bin 目录下确实有arm-linux-gnueabihf-gcc这个可执行文件。提示工具链路径里不要带空格和中文虚拟机共享目录路径尤其容易踩这个坑编译到一半报路径解析错误很难往回查。3. U-boot 编译与网络验证设备树和 GMAC 是重点3.1 解压与初始化配置U-boot 源码包u-boot-v3s-current.zip放到~/qz/tools下解压进入目录后先做 defconfigcd ~/qz/tools unzip u-boot-v3s-current.zip cd u-boot-v3s-current make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- LicheePi_Zero_defconfigARCHarm指定目标架构CROSS_COMPILE是工具链前缀末尾的短横线不能省。LicheePi_Zero_defconfig是 V3S 对应板级的默认配置模板执行成功会提示configuration written to .config。这一步只是生成.config还没真正编译。3.2 设备树里补以太网节点V3S 内置以太网 PHY但默认设备树里 EMAC 节点是关着的不补这段网络起不来。先改板级 dtsvi ./arch/arm/dts/sun8i-v3s-licheepi-zero.dts在aliases里加ethernet0 emac;文件末尾追加emac { phy phy0; phy-mode mii; allwinner,use-internal-phy; allwinner,leds-active-low; status okay; phy0: ethernet-phy0 { reg 1; }; };phy-mode mii对应内部 PHY 的接口模式allwinner,use-internal-phy告诉驱动走片内 PHYreg 1是 PHY 地址。接着改sun8i-v3s.dtsi在soc {}里补 pinctrl 和 emac 节点emac_rgmii_pins: emac00 { allwinner,pins PD0, PD1, PD2, PD3, PD4, PD5, PD7, PD8, PD9, PD10, PD12, PD13, PD15, PD16, PD17; allwinner,function emac; allwinner,drive SUN4I_PINCTRL_40_MA; allwinner,pull SUN4I_PINCTRL_NO_PULL; }; emac: ethernet1c30000 { compatible allwinner,sun8i-h3-emac; reg 0x01c30000 0x104, 0x01c00030 0x4; reg-names emac, syscon; interrupts GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH; resets ccu RST_BUS_EMAC, ccu RST_BUS_EPHY; reset-names ahb, ephy; clocks ccu CLK_BUS_EMAC, ccu CLK_BUS_EPHY; clock-names ahb, ephy; status disabled; };引脚列表里 PD6、PD11、PD14 没列进去是因为这几个脚在 V3S 上复用给了别的功能照抄时别自作主张补全。status disabled在 dtsi 里保持关闭由板级 dts 的okay覆盖这是内核设备树的常规写法。3.3 menuconfig 打开 GMAC 并编译烧录make ARCHarm menuconfig路径是Device Drivers → Network device support → Ethernet driver support勾上Allwinner sun8i GMAC support。保存退出后编译make ARCHarm CROSS_COMPILEarm-linux-gnueabihf-产物是u-boot-sunxi-with-spl.bin烧到 SD 卡偏移 8KB 处sudo dd ifu-boot-sunxi-with-spl.bin of/dev/sdc bs1024 seek8/dev/sdc换成你实际 SD 卡设备名seek8是 V3S 的 SPL 固定偏移写错位置板子直接不启动。烧完插板子上电串口进 U-boot 命令行配网络 setenv ipaddr 192.168.10.202 setenv gatewayip 192.168.10.1 setenv serverip 192.168.10.201 setenv netmask 255.255.255.0 saveenv ping 192.168.10.201serverip填的是 Ubuntu 宿主机地址ping通会显示host 192.168.10.201 is alive。这一步通了后面内核用 TFTP 下载 uImage 才有基础。ping 不通先查网线、宿主机防火墙再看 U-boot 里mii info能不能识别到 PHY。4. Linux 5.4.31 内核架构、NFS 与设备树三处改动4.1 解压内核并改 Makefile内核源码linux-5.4.31.tar.gz放到~/qz/kernel解压。如果拿到的是带厂商补丁的包先解外层再解标准内核cd ~/qz/kernel tar -xvf linux-5.4.31.tar.gz cd linux-5.4.31改顶层 Makefile 里的架构和编译器ARCH ? arm CROSS_COMPILE ? arm-linux-gnueabihf-?表示没外部传参时才用这个值命令行里再传ARCHarm会覆盖不冲突。改完先套模板配置make sunxi_defconfig4.2 打开 NFS 和 Allwinner GMAC音视频开发阶段我一般用 NFS 挂根文件系统改完驱动不用反复烧卡。make ARCHarm menuconfig里两处要动网络驱动部分Device Drivers → Network device support → Ethernet driver support下勾Allwinner GMAC support和Allwinner sun8i GMAC supportSTMMAC Platform bus support和Generic driver for DWMAC也要在sun8i GMAC 驱动依赖 DWMAC 框架。NFS 部分Networking support → Networking options下勾NFS client supportNFS client support for NFS version 3Root file system on NFSNFSv2 可以不勾宿主机默认走 v3/v4。Root file system on NFS是让内核支持从网络挂根漏了它启动时只会报VFS: Unable to mount root fs。4.3 内核设备树补 EMAC 和 MDIO板级 dts 里aliases加ethernet0 emac;末尾追加emac { phy-handle int_mii_phy; phy-mode mii; allwinner,leds-active-low; status okay; };sun8i-v3s.dtsi里补完整的 emac 节点和 mdio 复用结构emac: ethernet1c30000 { compatible allwinner,sun8i-v3s-emac; syscon syscon; reg 0x01c30000 0x10000; interrupts GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH; interrupt-names macirq; resets ccu RST_BUS_EMAC; reset-names stmmaceth; clocks ccu CLK_BUS_EMAC; clock-names stmmaceth; phy-handle int_mii_phy; phy-mode mii; status disabled; mdio: mdio { compatible snps,dwmac-mdio; }; mdio_mux: mdio-mux { compatible allwinner,sun8i-h3-mdio-mux; mdio-parent-bus mdio; internal_mdio: mdio1 { compatible allwinner,sun8i-h3-mdio-internal; reg 1; int_mii_phy: ethernet-phy1 { compatible ethernet-phy-ieee802.3-c22; reg 1; clocks ccu CLK_BUS_EPHY; resets ccu RST_BUS_EPHY; }; }; }; };mdio-mux是因为 V3S 的 MDIO 总线在内部 PHY 和外部接口之间复用同一时刻只能用一路mdio-parent-bus指向父总线。int_mii_phy的reg 1和 U-boot 里 PHY 地址保持一致两边对不上内核探测不到网卡。4.4 编译 uImage 和 dtb 并放到 TFTP 目录make ARCHarm -j12 uImage LOADADDR0x41000040 make ARCHarm dtbs cp ./arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dtb /tftpboot/ cp ./arch/arm/boot/uImage /tftpboot/LOADADDR0x41000040是 V3S 上 uImage 的加载地址这个值写错内核解压后会跑飞。-j12按宿主机核数调内存小的虚拟机降到-j4不然编译中途 OOM。dtb 和 uImage 放同一个 TFTP 目录U-boot 里tftp命令直接按文件名取。5. buildroot 根文件系统外部工具链配置最容易错5.1 解压与目标架构配置buildroot-2021.02.1.tar.xz放到~/qz/tools解压进目录跑 menuconfigcd ~/qz/tools tar -xvf buildroot-2021.02.1.tar.xz cd buildroot-2021.02.1 make ARCHarm menuconfigTarget options里按 V3S 的 Cortex-A7 配配置项取值Target ArchitectureARM (little endian)Target Binary FormatELFTarget Architecture Variantcortex-A7Target ABIEABIhfFloating point strategyVFPv3ARM instruction setARMV3S 是硬浮点EABIhf和VFPv3必须和工具链一致选成 soft float 后面链接 Qt5 库会报 ABI 不匹配。5.2 外部工具链路径与版本对齐Toolchain里选External toolchainCustom toolchainPre-installed toolchain然后填路径和前缀Toolchain path: /home/farsight/qz/tools/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf Toolchain prefix: arm-linux-gnueabihf External toolchain gcc version: 6.x External toolchain kernel headers series: 5.4.x External toolchain C library: glibc/eglibc路径填的是工具链根目录不是 bin 目录这点和 bashrc 里不一样写错 buildroot 会报找不到arm-linux-gnueabihf-gcc。gcc 版本选 6.x 对应 6.5.0kernel headers 选 5.4.x 对应内核版本C 库选 glibc。下面几个勾选项按需开Toolchain has SSP support、Toolchain has RPC support、Toolchain has C support、Enable MMU support做 Qt5 的话 C support 必须勾。注意buildroot 里工具链路径和 bashrc 里的 PATH 是两套独立配置改了 bashrc 不代表 buildroot 认两边都要对。5.3 编译与产物位置make -j12首次编译会下载大量包网络不稳容易断断了重新make会续传。产物在output/images/下rootfs.tar是根文件系统压缩包解到 SD 卡第二个分区或 NFS 目录里用。编译过程中如果报某个包下载失败去output/build/下对应包目录看.stamp_download状态删掉重新下。6. 避坑排查五个装环境时真踩过的坑6.1 工具链路径写错导致 command not found现象source ~/.bashrc后执行arm-linux-gnueabihf-gcc -v提示找不到命令。 原因export PATH里路径拼错或者写成了工具链根目录而不是 bin 目录。 解决echo $PATH逐段核对ls确认 bin 目录下确实有该可执行文件路径里不能有中文和空格。6.2 U-boot 烧录后串口无输出现象dd烧完插板子上电串口一片空白。 原因seek8偏移写错或者of指向了分区而不是整卡设备。 解决确认of/dev/sdc是整卡不是/dev/sdc1bs1024 seek8两个参数一起用烧完sync再拔卡。6.3 内核启动卡在 VFS Unable to mount root fs现象内核打印到一半停在VFS: Unable to mount root fs on unknown-block。 原因menuconfig 里没勾Root file system on NFS或者 U-boot 的bootargs里 NFS 路径写错。 解决回内核配置确认 NFS 相关项全开检查bootargs里root/dev/nfs nfsroot宿主机IP:路径格式。6.4 网卡识别不到 PHY现象内核启动后ifconfig -a看不到 eth0dmesg 里 PHY 探测失败。 原因设备树里int_mii_phy的reg地址和 U-boot 不一致或者 mdio-mux 节点没补全。 解决两边 PHY 地址统一成1确认mdio-parent-bus指向mdio重新编译 dtb。6.5 buildroot 编译 Qt5 报 ABI 不匹配现象链接阶段报uses VFP register arguments, output does not。 原因Target ABI 或 Floating point strategy 和工具链不一致。 解决确认EABIhfVFPv3工具链 gcc 版本选 6.x改完make clean重编增量编译有时不刷新工具链检测结果。7. 装完怎么验证三层检查跑通再动应用环境装完别急着上 Qt5按三层顺序验证每层过了再往下走。第一层是工具链宿主机上编一个最小 ARM 程序cat hello.c EOF #include stdio.h int main(void) { printf(v3s toolchain ok\n); return 0; } EOF arm-linux-gnueabihf-gcc hello.c -o hello file hellofile输出里出现ARM, EABI5就说明交叉编译链路通了。第二层是 U-boot 网络串口里ping宿主机通tftp能拉到 uImage 和 dtb这层不过后面 NFS 免谈。第三层是内核启动后ifconfig eth0有地址、mount -t nfs能挂上根文件系统ls /能看到 buildroot 生成的目录结构。三层都过之后再往 SDL2 和 Qt5 上走。我一般会在根文件系统里先跑一个静态链接的测试程序确认动态库路径没问题再编 Qt5 应用。这套环境里最容易反复的是设备树和工具链路径建议把改过的 dts 和.bashrc单独备份一份重装虚拟机时直接覆盖比重新查一遍快得多。从那以后我每次重搭 V3S 环境都强制先跑这三层验证再碰应用代码省下来的时间比调试音视频本身多得多。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?