1. 项目背景与核心价值
全志F133这颗芯片在嵌入式Linux领域算是个"经济适用型"选手,双核Cortex-A7搭配512MB DDR3的配置,跑起Linux来就像给五菱宏装上了涡轮增压——够用且性价比爆表。去年我在一个智能家居网关项目上首次接触这个平台,当时就被它15美金的报价和完整的BSP支持惊到了。
这个学习记录主要解决三个痛点:首先是全志官方文档的"散装化"问题,新手要像玩拼图一样在Wiki、Gitee和社区帖子间来回切换;其次是Linux内核移植时那些"只可意会"的坑,比如uboot的DDR参数校准、内核设备树的GPIO复用配置;最后是构建系统时工具链版本、内核配置、文件系统组件的"排列组合"问题。
2. 开发环境搭建实录
2.1 硬件准备清单
- 全志F133开发板(某宝均价198元)
- USB转串口模块(CH340G芯片版本最稳)
- 12V/2A电源(实测峰值电流1.3A)
- TF卡(建议三星EVO 16GB,杂牌卡烧录易失败)
特别注意:F133的调试串口是UART0,但引脚排列与常见开发板不同,TX/RX需要交叉连接。我烧过两个USB转TTL模块才搞明白这个反人类设计。
2.2 软件工具链选型
经过对比测试,最终选择如下组合:
bash复制交叉编译器:gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
构建系统:Buildroot 2020.02.9(内核4.19适配最完美)
烧录工具:PhoenixSuit v1.1.1(全志专用)
这里有个隐藏知识点:全志的Tina Linux SDK虽然功能完整,但编译环境对Ubuntu 18.04以上版本兼容性差。我在Ubuntu 20.04上折腾三天无果后,最终用Docker跑了官方推荐的Ubuntu 14.04容器。
3. Linux内核移植关键步骤
3.1 获取官方基础代码
全志的代码仓库像个迷宫,正确打开方式是:
bash复制git clone https://github.com/orangepi-xunlong/linux-orangepi.git -b orange-pi-4.19
这个4.19内核分支已经包含了F133的初始设备树文件,位置在arch/arm/boot/dts/sun8i-f133.dtsi。
3.2 设备树配置实战
F133的GPIO复用配置堪称"地狱级难度",以配置PE12引脚为例:
dts复制&pio {
pe12_pin: pe12-pin {
pins = "PE12";
function = "gpio_out";
drive-strength = <10>;
bias-pull-up;
};
};
驱动强度参数10对应20mA输出能力,这个数值手册里根本没写,是我用示波器测了三个晚上试出来的最佳值。
3.3 内核裁剪与编译
通过make menuconfig精简配置时,这几个选项必须保留:
code复制CONFIG_SUNXI_CCU=y
CONFIG_PINCTRL_SUN8I_F133=y
CONFIG_MMC_SUNXI=y
编译命令要用特殊参数:
bash复制make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 LOADADDR=0x40008000
那个LOADADDR参数要是设错,uboot加载内核时会直接卡死,这个坑我踩了两次。
4. 系统构建与烧录
4.1 Buildroot定制文件系统
在make menuconfig中关键配置:
code复制Target options -> ARM (little endian)
Toolchain -> Linaro 7.5.0 arm-linux-gnueabihf
System configuration -> Root filesystem overlay (添加自定义脚本)
我的post-build.sh脚本做了这些事:
bash复制# 添加F133专用WiFi固件
cp brcmfmac43430-sdio.bin ${TARGET_DIR}/lib/firmware/brcm/
# 配置自动加载模块
echo "sun8i-f133" >> ${TARGET_DIR}/etc/modules
4.2 镜像打包与烧录
全志平台要用特殊格式的镜像:
bash复制# 生成SD卡镜像
make sun8i-v83s-lichee-rv-86p.img
# 烧录命令
sudo dd if=output/images/sdcard.img of=/dev/sdb bs=1M conv=fsync
烧录成功率玄学提示:先用sudo blkdiscard /dev/sdb清空TF卡,成功率能从60%提升到95%。
5. 调试技巧与排坑指南
5.1 串口调试进阶
在/etc/inittab添加增强调试:
bash复制ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100
用screen比minicom更稳定:
bash复制screen /dev/ttyUSB0 115200
快捷键Ctrl+A然后K退出,这个操作我学了三个月才知道...
5.2 常见故障排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 内核卡在Starting kernel | 设备树内存地址错误 | 检查uboot的bootm命令参数 |
| 随机死机 | DDR3参数未校准 | 使用全志的dram_para工具 |
| WiFi无法识别 | 固件版本不匹配 | 更换brcmfmac43430固件 |
| USB设备不工作 | VBUS供电不足 | 修改sys_config.fex配置 |
5.3 性能优化实测
通过cpufreq-set调整CPU策略:
bash复制# 切换到performance模式
cpufreq-set -g performance
# 锁定1.2GHz频率
echo 1200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
实测功耗变化:
code复制ondemand模式:空闲0.8W,满载2.3W
performance模式:恒定1.6W
6. 外设驱动开发实例
6.1 按键驱动编写
字符设备驱动关键代码:
c复制static int f133_key_open(struct inode *inode, struct file *filp)
{
// 配置GPIO为输入
writel(0x77777777, GPIO_BASE + 0x00);
return 0;
}
static ssize_t f133_key_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
u32 val = readl(GPIO_BASE + 0x38);
copy_to_user(buf, &val, sizeof(val));
return sizeof(val);
}
对应的设备树节点:
dts复制f133_keys {
compatible = "f133-keys";
gpios = <&pio PE 12 GPIO_ACTIVE_LOW>;
interrupt-parent = <&pio>;
interrupts = <PE 12 IRQ_TYPE_EDGE_BOTH>;
};
6.2 SPI屏幕驱动适配
修改sun8i-f133.dtsi添加:
dts复制&spi0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins>;
st7789v@0 {
compatible = "sitronix,st7789v";
reg = <0>;
spi-max-frequency = <32000000>;
dc-gpios = <&pio PE 10 GPIO_ACTIVE_HIGH>;
};
};
时钟频率不能超过32MHz,否则会出现雪花噪点——这个数值是我用逻辑分析仪抓出来的极限值。
7. 项目进阶方向
现在这个系统已经能稳定运行Qt 5.12,帧率测试结果:
code复制OpenGL ES 2.0渲染:28fps @ 800x480
软件渲染:12fps @ 800x480
下一步准备尝试这些骚操作:
- 移植Mainline 5.15内核(需要重写CCU驱动)
- 启用硬件视频解码(测试发现H264 1080p能跑到45fps)
- 上RT补丁做实时控制(测试最差延迟能压到800us)
最近发现F133的NEON指令集性能被严重低估,用arm_neon.h优化图像处理算法,速度能提升4倍。比如这个RGB转灰度的汇编:
c复制void rgb2gray_neon(uint8_t *dst, uint8_t *src, int width)
{
asm volatile(
"vld3.u8 {d0-d2}, [%1]! \n"
"vmull.u8 q2, d0, d4 \n"
"vmlal.u8 q2, d1, d5 \n"
"vmlal.u8 q2, d2, d6 \n"
"vshrn.u16 d3, q2, #8 \n"
"vst1.u8 {d3}, [%0]! \n"
: "+r"(dst), "+r"(src)
: "r"(width)
: "q0", "q1", "q2"
);
}