尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

嵌入式Linux开发实战:基于Gateworks Venice和Ubuntu的完整流程

嵌入式Linux开发实战:基于Gateworks Venice和Ubuntu的完整流程 做嵌入式开发这些年Linux 单板计算机SBC我摸过不少从树莓派到各种国产派但真正拿它当“产品原型”来用的Gateworks Venice 算一个绕不开的选项。这个板卡最大的特点不是跑分多高而是它把 NXP i.MX8M Mini 这颗 SoC 的工业级潜力全部暴露了出来——双千兆网口、PCIe、M.2、宽压供电全是在正经设备里能用得上的东西。而我这次选它的原因更直接官方提供一套完整的 Ubuntu 镜像能让我绕过 Yocto 那套又长又臭的编译流程直接拿到一个成熟的 Linux 用户态环境来做应用开发。这篇文章我打算把从硬件选型、镜像烧录、系统初始化到 GPIO/I2C/UART 驱动开发、容器化部署再到最后“踩坑”的整个全过程都梳理一遍。不管你是刚开始接触嵌入式 Linux 的软件工程师还是想评估这块板卡能不能做产品原型的朋友应该都能从中找到你需要的细节。1. 项目背景我为什么在 Venice 板卡上装 Ubuntu1.1 Gateworks Venice 是什么为什么值得选Gateworks 是一家老牌的美国嵌入式板卡厂商主要面向军工、交通、工业自动化这类对可靠性和生命周期要求极高的场景。Venice 系列是他们的产品线代号命名方式很有规律比如 GW7300、GW7304 这类型号都是以“GW”开头、后面跟一串数字来区分不同配置。这个系列覆盖了从 i.MX6 到 i.MX8M Plus 的一整条 NXP 处理器路线具体到这一篇的主角就是搭载 i.MX8M Mini 的中端型号。选 Gateworks 而不是树莓派核心区别在于“设计余量”。树莓派是为消费电子设计的IO 电平、供电能力、工作温度都偏保守。Venice 的板子默认就是 -40℃ 到 85℃ 的工业级温度范围供电支持 8V 到 32V 直流宽压输入这个在工业现场意味着你可以省掉一个 DC-DC 模块直接用车载电瓶或者 24V 开关电源供电。再加上板载的 Gateworks System ControllerGSC可以做远程状态监控、电量管理、环境温度采样甚至断电后自动切断电源这些都是做产品原型时真正会需要的东西。1.2 i.MX8M Mini 的定位与性能预期NXP i.MX8M Mini 是一颗四核 Cortex-A53 处理器主频最高 1.8GHz这颗 SoC 在 2019 年前后大量出现在智能音箱、楼宇对讲、工业 HMI 这些设备里。它比树莓派 4 的 BCM2711 性能弱不少但优势在于生态成熟、供货稳定、外设丰富特别是原生支持 MIPI-DSI 显示接口和 MIPI-CSI 摄像头接口做嵌入式 GUI 项目非常合适。我用它跑了一个带有 Qt 界面的监控程序实测下来720P 分辨率的动态界面CPU 占用率大约在 20%~35% 之间波动。如果不涉及复杂的视频编解码运行普通的 Linux 服务和应用是完全够用的。同时这颗 SoC 内部还有一个 Cortex-M4 协处理器可以做实时任务比如硬实时 IO 控制或者协议解析这个在 Ubuntu 普通进程里是做不到的但 NXP 的官方 SDK 通常配合 Yocto 才有完整支持使用 Ubuntu 主系统时一般就把 M4 核心闲置了这是需要注意的取舍。1.3 Ubuntu 而非 Yocto两条开发路线的取舍嵌入式 Linux 圈子里对 Yocto 又爱又恨。它确实能高度定制一个最小系统镜像能压到几十 MB启动只要一两秒但代价是学习曲线极陡。我见过太多团队光是把 Yocto 环境跑通、交叉编译出第一版镜像就花掉一两个月。对于应用层开发为主的团队这套流程完全是负担。Gateworks 官方提供 Ubuntu 22.04 LTS以及更新版本的完整镜像直接烧到 eMMC 或者 SD 卡上就能用。这意味着你得到了一个具备完整 apt 软件包管理的标准发行版装什么依赖都是apt install一下的事。网络上有大量软件包可以直接复用比如 Mosquitto、Node-RED、Docker、Python 库全是预编译好的不需要自己编译。当然 Ubuntu 也有代价启动时间比裁剪过的 Yocto 长实测约十几秒到二十秒系统占用内存高哪怕开成不带桌面版的最小化安装也要占 200MB 以上而且无法做到银行级的安全裁剪。我的经验是如果产品原型验证阶段选 Ubuntu如果要做量产固件且安全要求高再考虑 Yocto。本文后续所有内容都以 Ubuntu 镜像为基础展开。2. 硬件准备与系统镜像烧录2.1 板卡形态与接口速览拿到手的是 GW7304 型号板型是 Pico-ITX 尺寸大约 100mm x 72mm比一张扑克牌大不了多少。接口布局相当紧凑主板上能直接看到的接口包括一个 micro USB 接口用于串口调试一个 USB 3.0 Type-C 口用于 OTGDevice 模式一个 USB 2.0 标准口用于外接设备两个千兆 RJ45 网口以及板载的 M.2 和 mini-PCIe 插槽可以分别扩展 SSD、WiFi/蓝牙或者 4G/5G 模块。特别值得注意的地方是那颗 mini-PCIe 插槽它专门做了 PCIe 2.0 通道复用可以通过板卡上的电阻和拨码开关来切换不同的外设模式。比如插上 WiFi 模块时需要在 U-Boot 环境里配置 PCIe 设备树的 overlay。而 M.2 插槽则支持 NVMe 固态硬盘这就让 Ubuntu 根文件系统放在 NVMe 上成为可能访问速度比 eMMC 快好几倍。不过我第一次没注意到 M.2 插槽旁边的跳线结果插上 SSD 没有任何反应后来翻看手册才知道这块板卡默认断电只给 M.2 供电需要手动跳线切换。2.2 获取 Ubuntu 镜像的两种方式Gateworks 的 Ubuntu 镜像有两个安装途径。第一种是直接从 Gateworks 官方站点下载预先构建好的镜像文件通常为.img.gz然后使用dd命令写入 SD 卡再从 SD 卡启动后通过他们提供的flashupdate脚本刷写到 eMMC。这种方式适合首次安装或者完全不在乎已经有数据的场景。第二种是利用板载 U-Boot 的网络启动功能。Venice 系列的 U-Boot 支持 DHCP TFTP 启动模式只要在同一局域网内搭好 TFTP 服务器放上内核、设备树和 rootfs就能直接用网络引导启动 Ubuntu。这个方式在调内核设备树的时候特别有用可以反复重启、反复测试不用一遍遍烧写 eMMC。不过网络安装对 TFTP 服务器的稳定性要求比较高体验远不如直接刷 eMMC 来得干净。无论用哪种方式有几个准备工作必须做在前头准备一个质量可靠的 SD 卡至少 16GB推荐使用 A1 或 A2 速度等级后面烧写镜像会用到整卡空间。准备一根 micro USB 转 USB 的数据线用于连接板卡与电脑通过串口终端查看 U-Boot 和内核启动日志。准备一个串口终端软件Windows 用 MobaXtermLinux 上用 minicommacOS 上用 screen串口参数一般是 115200-8-N-1。2.3 烧录 SD 卡/写入 eMMC 的操作细节第一步下载镜像。在 Gateworks 的发行版下载页面上找到ubuntu-22.04-gw7304.img.gz类似的链接大概有几个 GB 大小建议在稳定的宽带环境下下载。解压后得到原始的.img文件这是个裸盘镜像包含了 GPT 分区表和一整个根文件系统。第二步写入 SD 卡。在 Linux 环境下输入lsblk确认 SD 卡对应的设备节点常见是/dev/sdb或者/dev/mmcblk0。然后用dd命令写入sudo dd ifubuntu-22.04-gw7304.img of/dev/sdb bs4M convfsync statusprogress这里的convfsync是强制数据同步写入物理设备防止拔卡过早导致分区表损坏。整个过程大约 10 分钟取决于 SD 卡写入速度。写入完成后sync再拔卡。第三步启动到 U-Boot。插上 SD 卡连接串口线给板卡上电。串口终端会立刻打印出 U-Boot 启动信息观察它是否能自动检测到 SD 卡里的启动分区。如果 U-Boot 环境变量之前被修改过可能默认从 eMMC 启动这时候需要在启动倒计时阶段按任意键进入 U-Boot 命令行手动执行setenv boot_device sd run distro_bootcmd这个命令会重新扫描所有启动设备包括 SD、USB、网络和 eMMC找到第一个可启动的介质就直接引导。只要 SD 卡烧录没有大问题基本都能进入 Ubuntu 系统。第四步调用flashupdate脚本刷写 eMMC。进入 Ubuntu 后先确认 SD 卡的分区挂载位置在/media/下找到镜像文件解压后的目录。运行sudo /opt/gateworks/flashupdate -d /dev/mmcblk2 -i /media/user/rootfs.img这里的/dev/mmcblk2是 eMMC 设备节点具体以你的板卡枚举为准命令会直接镜像到 eMMC。完成后断电、拔掉 SD 卡重新上电应该就能从 eMMC 启动 Ubuntu 了。3. 首次启动与系统初始化调优3.1 启动日志分析与关键信息解读Ubuntu 首次启动会经历 U-Boot → Linux 内核 → systemd → 用户空间登录四层。U-Boot 阶段的日志重点是检查环境变量里 bootargs 是否包含正确的 root 设备参数一般情况下设备树里已经写好了启动介质的选择逻辑不需要手动干预。内核阶段需要关注几个关键节点。首先是设备树是否正确辨识了板载外设日志中出现mmc,i2c,gpio,fec网络控制器等节点名说明对应驱动已加载。其次是网口是否初始化成功我遇到过第一次启动后只有一个网口有 IP、另一个网口没有任何反应的情况这种情况下用dmesg查看fec驱动日志往往能看到 phy 模式配置错误的信息。systemd 阶段主要检查 journal 日志。执行journalctl -b查看本次启动的所有日志重点看标有FAILED的服务。Ubuntu 在 SBC 上最常见的失败服务有两个一个是networkd-dispatcher网络管理服务因为缺少网卡配置而报错另一个是systemd-resolved的 DNS 解析缓存和 NetworkManager 冲突。这两个如果不处理会导致后续网络配置非常麻烦我的建议是直接卸载networkd-dispatcher或者干脆禁用它把网络管理权全部交给 NetworkManager。3.2 网络、时区、软件源的初始化配置Venice 板卡有两个物理网口U-Boot 阶段默认 eno1 是管理口。Ubuntu 里我建议把第 1 个口配成静态 IP第 2 个口配成 DHCP方便后面用网线直连开发机调试。在 Ubuntu 22.04 中网络配置使用 netplan编辑/etc/netplan/01-netcfg.yamlnetwork: version: 2 renderer: NetworkManager ethernets: eno1: dhcp4: no addresses: [192.168.2.10/24] routes: - to: default via: 192.168.2.1 nameservers: addresses: [8.8.8.8, 114.114.114.114] eno2: dhcp4: yes修改后执行sudo netplan apply让配置生效再用ip a验证 IP 是否绑定成功。时区设置在高可用场景下容易被忽略。嵌入式设备通常要连局域网内的 NTP 服务器来校准时间不能只依赖 Ubuntu 默认的 time-sync。在 Ubuntu 22.04 里我推荐使用systemd-timesyncd配合自定义 NTP 配置先修改/etc/systemd/timesyncd.conf把 NTP 服务器指向局域网内部的时钟源然后启用服务。软件源方面嵌入式板卡如果直连外网建议先更新到国内镜像源加快后续下载速度。修改/etc/apt/sources.list里的archive.ubuntu.com为国内镜像地址随后运行sudo apt update sudo apt upgrade -y。注意升级内核时要谨慎确认升级后的设备树不影响板卡外设实测多数情况下没问题但如果板卡上接有复杂外设升级前最好备份原内核。3.3 CPU 频率、温度管理与电源策略Ubuntu 自带 cpufreq 工具但默认可能是 powersave 模式。对 SBC 来说建议切换到schedutil或performance模式。前者由内核调度器动态调整频率性能与功耗的平衡最优后者则常驻最高频适合性能优先的现场级设备。切换方式sudo apt install linux-tools-common cpufrequtils echo GOVERNORschedutil | sudo tee /etc/default/cpufrequtils sudo systemctl restart cpufrequtils温度管理是工业现场必须关注的。i.MX8M Mini 的结温最高 105℃虽然正常负载很难达到但如果在高温机柜里长时间连续运行还是建议加一个定时任务来巡检温度。Gateworks 的 GSC 提供了一个虚拟温度传感器可通过板载 I2C 读取。实测在 25℃ 室温下满载跑stress-ng六十分钟CPU 温度稳定在 78℃ 左右散热片表面温度约 45℃。电源策略上 Ubuntu 默认启用autosleep、CPU 进入低功耗状态但这有时会让串口调试或 GPIO 中断响应出现几十毫秒的延迟。如果项目对 IO 响应时间敏感建议在/etc/default/grub的内核命令行里追加processor.max_cstate1来禁用 C-state 深度睡眠。修改完后运行sudo update-grub并重启生效。这个参数对老式外设兼容性影响较大务必在启用了重要外设后再实际验证一轮。4. 核心外设开发GPIO、I2C、UART 实战4.1 GPIO 控制从 sysfs 到 libgpiod在 Ubuntu 上操作 GPIO有两条路线一条是老的 sysfs 接口/sys/class/gpio另一条是新的字符设备接口/dev/gpiochipN配合 libgpiod 工具。Ubuntu 22.04 默认的 Linux 5.15 内核里sysfs 接口没有默认启用需要在内核配置里打开CONFIG_GPIO_SYSFS。Gateworks 官方镜像里这个选项是关闭的因为新内核更推荐用libgpiod。所以我建议直接使用 libgpiod。先安装工具sudo apt install gpiod gpiodetect执行gpiodetect会列出板卡上的所有 GPIO 控制器Venice 上会看到多个 gpiochip分别对应 i.MX8M Mini 的 GPIO 组和 GSC 的控制引脚。每个 chip 按 0~N 编号管脚使用gpioinfo查看具体编号对应的功能。要操作一个 LED 灯比如控制 GPIO1_IO08先查这个脚在芯片上对应哪个 chip 和 line然后使用gpioset gpiochip0 81 # 拉高 gpioset gpiochip0 80 # 拉低在应用层我建议用 libgpiod 的 Python 绑定来写控制逻辑比直接用 shell 命令更可控。一个简单的点亮、闪烁、延时控制脚本非常容易实现而且不会像 sysfs 那样在每次访问时都要打开和关闭文件性能更好。内核 5.15 之后还支持gpio-line-names属性来给管脚起别名这样在设备树中配置后可以用名字访问避免每次看原理图找脚位。4.2 I2C 设备探测与传感器读取Gateworks Venice 板卡上有 3~4 组独立的 I2C 总线分别承载不同的外设一组接 GSC一组接 EEPROM一组接扩展座。Ubuntu 启动后在内核日志里可以看到i2c控制器枚举成功的消息。首先安装 I2C 工具sudo apt install i2c-tools i2cdetect -l-l列出所有 I2C 适配器找到需要操作的适配器号后用i2cdetect -y 2去扫描某条总线上的所有从设备地址。比如探测到一个温湿度传感器 SHT20 挂在 0x40 地址上就可以用 Python 的 smbus2 库直接读取from smbus2 import SMBus bus SMBus(2) data bus.read_i2c_block_data(0x40, 0xE3, 2)第一次读到数据时我一度怀疑是板子的问题因为数值完全不对。后来仔细看 SHT20 的数据手册才发现它需要先发送一条“measure”命令再读取两个字节温度数据和一枚 CRC 校验字节。直接在命令行用i2cget也无法正确读取因为 i2cget 往往用于读寄存器的场景而这个传感器走的是“命令-响应”协议。这类细节做嵌入式开发时最容易踩坑遇到读出来完全不对的情况我第一反应就是先去看数据手册的命令时序和地址位宽而不是怀疑硬件。4.3 UART 串口调试与应用层访问Venice 的调试串口默认通过板载 micro USB 口引出。Ubuntu 系统内这个串口被映射为/dev/ttymxc0i.MX8M Mini 的 UART 外设命名在开发时可以直接用echo往串口写数据做测试。很多嵌入式设备会通过 UART 接外部传感器或设备比如 GPS 模块、工业读码器、RS485 转换器。在 Ubuntu 上使用 UART 和普通串口没有任何区别注意一点i.MX8M Mini 的 UART 外设默认在内核设备树里可能没有全部启用需要修改设备树 overlay 来打开对应的 UART 节点。Gateworks 提供了一套设备树 overlay 机制可以在 U-Boot 里通过overlay_addr环境变量加载自定义的 dtbo 文件也可以在系统运行时用dtoverlay指令动态加载。实际操作中我用 U-Boot 启动菜单来加载 UART4 的 overlay 文件重启后就能在/dev下看到ttymxc3。挂载后跑一遍stty -F /dev/ttymxc3 115200 raw -echo设置波特率再用 Python 的pyserial库读取 GPS 数据。如果读到乱码优先检查波特率和串口电平这一点在工业现场尤其重要很多设备是 3.3V 电平而外部传感器可能是 RS232 或 RS485 电平中间不能直接连接需要加电平转换芯片。4.4 硬件看门狗与自动化部署工业级 Linux 设备里看门狗属于标配防止应用死锁导致整机假死。Gateworks 的 GSC 提供硬件看门狗功能在 Ubuntu 里对应/dev/watchdog设备。启用方法在/etc/watchdog.conf里配置好watchdog-device然后启动watchdog服务。我建议在应用层写一个心跳脚本定期“喂狗”。如果主程序因为未知原因卡死看门狗在预定时间内没有收到喂狗信号就会强制硬件复位整机最终恢复到工作状态。这个机制在无人值守的现场非常可靠也经常是工业客户验收时必查的项目。实测看门狗触发到系统重启的间隔大约是 2 秒这个时间由 GSC 的配置决定在 U-Boot 里可以通过gsc_wd_timeout环境变量调整。自动化部署方面Ubuntu 的优势体现得非常充分。我们可以写一个 setup 脚本把依赖包、配置文件、服务单元全部打包首次启动后自动执行。我在这块板卡上维护了一个 Ansible 角色新板卡一旦接入网络Ansible 就能把所有预装软件和配置同步过去整个过程不用登录串口操作。这在批量部署十台、二十台设备时省下的时间非常可观。5. 常见问题与排查技巧实录5.1 启动卡死在 U-Boot 的修复实例一次修改了网口的设备树并重新生成 SD 卡镜像后板卡重启时卡在 U-Boot 提示符处不再继续引导内核。排查步骤是进入 U-Boot 命令行执行printenv bootcmd查看默认启动命令发现它遍历所有设备时没有找到可用的 extlinux 配置文件说明镜像里的/boot/extlinux/extlinux.conf丢失或者路径不对。修复方式是把 SD 卡重新插回电脑用parted检查分区确认 boot 分区是否被正确写入。我的问题出在解压镜像时误删了 boot 分区的部分文件。这里给个经验U-Boot 引导 Linux 时如果遇到“Could not find bootable device”大概率不是设备损坏而是 boot 分区里的引导文件extlinux.conf、内核Image、设备树dtb不完整。检查步骤有优先级先走ls命令确认文件是否在再fatls mmc 1:1查看 FAT 分区内容最后看 U-Boot 的可视化启动菜单如果有能不能正确加载。5.2 eMMC 寿命与误格式化问题eMMC 有一定擦写寿命如果系统频繁写日志、数据库坏块迟早会出现。Gateworks 默认 eMMC 是 8GB剩余空间充足但若不做任何优化几个月后就可能因持续日志写入导致闪存老化加快。建议做了两件事把/var/log挂载到 tmpfs内存文件系统上重启日志清空适合长期无人值守的场景定期用fstrim -a对 eMMC 执行 TRIM 操作维持闪存性能。碰到误格式化 eMMC 的极端情况比如在 SD 卡启动的 Ubuntu 里执行了mkfs.ext4 /dev/mmcblk2p1这时不要慌直接把 SD 卡里的镜像重新刷写一次即可。因为 Gateworks 的 eMMC 分区里并没有不可恢复的引导程序U-Boot 本体存放在独立的 SPI NOR Flash 上与 eMMC 完全隔离。这也是这个系列设计上的一个优点不管根文件系统怎么折腾底层引导始终有保障。5.3 Ubuntu 桌面版跑不动的性能优化清单如果你坚持使用完整桌面版 Ubuntu 而非精简版性能优化就变成必修课。我在 2GB 内存的 Venice 板上跑 Ubuntu 22.04 桌面版开机内存占用约 1.4GB可用的连 600MB 都不到稍微开几个应用就开始 swap。优化手段用systemd-analyze blame找出启动耗时最长的服务把不需要的桌面组件禁用。换成轻量级桌面环境比如 XFCE 或 LXDE实测内存占用能降 500MB。将 Ubuntu 的 GNOME Shell 换为 Mutter 轻量合成器不适合的话直接用Ubuntu Servercage跑单一应用这是一种更好用的工业 HMI 方案。给根文件系统启用压缩特性用btrfs替代 ext4并在 fstab 里挂载参数加compresszstd对文本型日志、代码文件的压缩收益明显实测能省 20%~30% 的存储空间。值得强调的是如果主要目的是运行单个 GUI 应用我强烈建议别再跑完整桌面。直接使用 Ubuntu Server 版加 X 服务器和一个窗口管理器让应用全屏。这套方案的内存占用可以控制在 400MB 以下启动时间也快得多更符合工业 SBC 的定位。6. 进阶扩展从开发到量产的经验沉淀6.1 基于 Ubuntu 做产品级 OTA 更新的思路产品量产后固件更新是一个绕不开的问题。Ubuntu 提供snap机制和unattended-upgrades但对嵌入式设备来说我们需要控制的粒度更细。我在这块板卡上用过一种比较稳妥的方案把系统划分为 A/B 双分区rootfs_a / rootfs_b通过 U-Boot 的boot_android或自定义环境变量来选择从哪个分区启动。更新时先下载新镜像到空闲分区写入完成后修改 U-Boot 的rootdev变量再重启系统就能切换到新分区。如果新版本启动失败U-Boot 里的看门狗超时机制会自动切回旧分区这样就实现了失败回滚。这个方案之所以好用是因为 U-Boot 提供了灵活的启动参数控制不需要依赖任何繁琐的 OS 层 OTA 工具。具体实现时建议把内核和根文件系统放在不同分区内核放 boot 分区rootfs 两个分区轮流使用这能显著减少更新时的数据量。实测用 eMMC 写一块约 2GB 的文件系统镜像时间大约一分钟完整 OTA 流程下来不到三分钟现场可接受。6.2 容器化应用部署Docker 在 SBC 上的实践很多人担心 Ubuntu Docker 在这么小的设备上跑不起来实测可行。i.MX8M Mini 是 ARM64 架构Ubuntu 22.04 的 Docker 软件源直接有 ARM64 版安装后拉取镜像非常顺利arm64v8开头的公开镜像直接可以用。容器化带来的最大好处是应用环境隔离和可移植性。我在上位机和板卡之间跨环境调试时不再需要满世界找依赖包把代码打成 Docker 镜像推给板卡跑起来就是一样的运行环境。不过需要注意容器可能增加资源开销。对于启动一个 Python 服务和 Mosquitto 服务这类轻量任务内存开销约 80~120MB完全可接受。但在做实时控制任务时容器化会引入额外的调度延迟这时候应该把实时任务放在宿主机用容器跑附属服务。我在生产环境中的做法是宿主机只安装 Docker 引擎和硬件驱动业务应用全部容器化通过docker-compose.yml管理多个容器。容器之间使用内部网络通信对外暴露必要端口。这样无论是升级业务代码还是回滚版本只要替换镜像即可宿主机系统保持极简也能减小攻击面。6.3 我对这个方案的最终评价到这里整个项目从选型、烧录、调优、外设开发到量产化考虑基本走完了一遍。我对“Gateworks Venice Ubuntu”这个组合的结论是它非常适合产品原型验证和小批量交付成本可控、开发速度快、可维护性强且拥有完善的驱动支持和社区资料。相比从零搞 YoctoUbuntu 给我省下了太多时间尤其是在快速迭代阶段。但也必须承认它不适合所有量产场景。如果你的产品需要严苛的安全认证如无 root 权限、强制签名、最小攻击面或者对启动时间有秒级以内的硬性要求那还是得花时间上 Yocto 定制系统。反过来如果你的团队以应用开发为主硬件选型又在 i.MX8M Mini 附近这个性能档位那么这套组合不妨试试。最后再分享一个小技巧Gateworks 官方提供了一个内核仓库和 Ubuntu 定制脚本可以直接从仓库拉取最新内核和设备树来编译自己的内核包。你不需要完整配置 Yocto只需要装上交叉编译工具链把linux-gateworks源码仓库 clone 下来修改设备树后编译出.deb包用dpkg -i就能安装替换。这个流程我实测过比想象中简单能让你在不碰 Yocto 的前提下保留对内核的完全控制权。
返回列表