概述
很精致小巧的一块板子,基于全志V3s芯片。
一、我的目标
名称 | 描述 | 链接 |
---|---|---|
U-Boot | 使用Licheepi的Uboot | https://github.com/Lichee-Pi/u-boot/tree/v3s-current |
Linux Kernel | 使用Licheepi的Linux Kernel | https://github.com/Lichee-Pi/linux/tree/zero-5.2.y |
Buildroot | 使用buildroot-2017.08.1 | https://buildroot.org/downloads/buildroot-2017.08.1.tar.bz2 |
Qt5 | 自己交叉编译 | https://download.qt.io/archive/qt/5.12/5.12.9/single/qt-everywhere-src-5.12.9.tar.xz |
二、SD卡分区
嵌入式Linux–荔枝派Zero–V3s–SD卡启动
三个分区:
分区一 | 分区二 | 分区三 | |
---|---|---|---|
命名 | 未格式化区域 | boot分区 | rootfs分区 |
格式 | 无格式(裸数据) | fat16 | ext4 |
大小 | 1MB(视U-Boot大小而定) | 16MB(视Kernel、dtb文件大小而定) | 剩余的空间(视根文件系统大小而定) |
用途 | 存放U-Boot二进制执行文件 | 存放Linux Kernel二进制文件、设备树文件 | 存放用户空间根文件系统 |
烧录方式 | 使用dd命令烧录U-Boot到SD卡:sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb1 bs=1024 seek=8 清除TF卡上的uboot区域(假设Uboot区域是1M): sudo dd if=/dev/zero of=/dev/sdb bs=1024 count=1024 seek=8 | 拷贝Kernel到分区:sudo cp zImage /media/liefyuan/BOOT/ 拷贝设备树到分区: sudo cp sun8i-v3s-licheepi-zero.dtb /media/liefyuan/BOOT/ | 解压根文件系统压缩包到分区:sudo tar xvf rootfs.tar -C /media/liefyuan/rootfs/ |
烧录Uboot:
会跳过SD卡前8K的地址
总结:
Windows系统下使用软件SDFormatter进行快速格式化卡
Ubuntu系统下使用软件GParted进行分区
- 卸载所有的现有分区
- 删除所有分区,使其整张卡都是raw区域
- 创建第一个区域boot,格式为fat16,大小一般预留个10MiB ~ 16MiB用来存放Kernel镜像和dtb,这个分区前需要预留一个1MiB~10MiB的无文件格式的区域(RAW区域)用来存放uboot
- 创建第二个分区rootfs,格式ext4,大小就是剩余的所有空间,该分区前无需预留空间。
三、编译U-Boot
1、传给Kernel的参数
Uboot起来以后是需要给Kernel传一些启动参数的,比如:
- 控制台输出终端(串口、屏幕或其他),如果是串口终端输出还要传波特率
- 文件系统启动的分区/块
- 内核打印信息等级
- 等待时间
- 启动init
目前有两种方法传参:
方法一:在Uboot命令行设置参数
Uboot上电后按回车进入命令行:配置env并设置bootarg和bootcmd参数变量最后保存env
-
配置串口打印信息(可选一):
setenv bootargs 'console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw vt.global_cursor_default=0'
-
配置屏幕显示和串口同时打印信息(可选二):
setenv bootargs 'console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw vt.global_cursor_default=0'
-
配置启动相关的一些信息(必运行):
setenv bootcmd 'setenv bootm_boot_mode sec; load mmc 0:1 0x41000000 zImage; load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock.dtb; bootz 0x41000000 - 0x41800000;'
-
最后保护好参数(必运行):
saveenv
解释:
设置bootargs参数:ttyS0代表串口输出终端(需要带波特率的值),tty0代表屏幕输出终端
设置bootcmd参数:就是从EMMC设备拷贝kernel文件(根据文件名)到DRAM的指定地址,并拷贝设备树文件(根据文件名)到DRAM的指定地址,然后再设置从DRAM启动Kernel的地址和设备树地址(和前面指定地址一致)。
方法二:使用boot.scr文件传参
参考我的这篇博客:全志V3s学习记录(5)uboot:传参(boot.scr)参数配置(script.bin)
在uboot环境变量里面需要设置内核和设备树的加载地址,使用boot.scr可以直接传递这些参数。
- boot.scr是由boot.cmd使用mkimage工具生成的。
- mkimage工具在uboot/tools文件夹下
- boot.scr放在TF卡第一分区。
在uboot源码根目录下新建
vim boot.cmd
写入以下内容(普通配置,没有屏幕)
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10 earlyprintk rw
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock.dtb
bootz 0x41000000 - 0x41800000
或者带屏幕的分辨率为480x272 LCD的配置
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10 earlyprintk rw
setenv video-mode sunxi:480x272-18@60,monitor=lcd
setenv lcd-mode x:480,y:272,depth:18,pclk_khz:10000,le:42,ri:8,up:11,lo:4,hs:1,vs:1,sync:3,vmode:0
setenv stderr serial,lcd
setenv stdout serial,lcd
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock.dtb
bootz 0x41000000 - 0x41800000
又或者带屏幕的分辨率为800x480 LCD的配置
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10 earlyprintk rw
setenv video-mode sunxi:800x480-18@60,monitor=lcd
setenv lcd-mode x:800,y:480,depth:18,pclk_khz:10000,le:42,ri:8,up:11,lo:4,hs:1,vs:1,sync:3,vmode:0
setenv stderr serial,lcd
setenv stdout serial,lcd
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock.dtb
bootz 0x41000000 - 0x41800000
使用mkimage工具
mkimage工具在/uboot/tools文件夹下
在uboot根目录下输入以下命令拷贝到用户文件夹下,方便以后可以直接使用
sudo cp ./tools/mkimage /usr/local/bin/mkimage
使用mkimage生成boot.scr
mkimage -C none -A arm -T script -d boot.cmd boot.scr
拷贝boot.scr到启动卡的第一分区(boot分区)
sudo cp boot.scr /media/liefyuan/BOOT/
2、编译U-Boot
2.1 编译U-Boot
- 清除:make clean
- 配置编译文件(我的屏幕是5寸):
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_800x480LCD_defconfig
- 编译:
time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log
加了time可以统计编译的时间
2.2 烧录U-Boot
-
使用dd命令将bin文件烧录到SD卡的开始位置(多运行几次!):
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
-
ubuntu环境下安全弹出SD卡:
sync && eject /dev/sdb
/dev/sdb
请替换为实际的TF卡设备文件名。sync
命令可以确保数据成功写到TF卡中,eject
命令用于弹出TF卡。
四、编译Kernel
-
清除:
make clean
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- licheepi_zero_defconfig
-
time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
加了time可以统计编译的时间
- 拷贝kernel镜像文件到boot分区:
sudo cp arch/arm/boot/zImage /media/liefyuan/BOOT/
- 拷贝dtb文件到boot分区:
sudo cp arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dtb /media/liefyuan/BOOT/
增加USB接口的WIFI模组RTL8188ETV
rtl8188eu 和 8188etv 使用相同的驱动,以下以 rtl8188eu 为例说明
Linux 内核配置里面使能编译成模块,编译后的.ko驱动文件在drivers/staging/rtl8188eu
目录下:
- 将r8188eu.ko驱动模块文件拷贝到根文件系统的/lib/moduel
- 将WiFi固件rtl8723bs_nic.bin拷到根文件系统分区/lib/firmware/rtlwifi目录下
完整的记录参考这个:
嵌入式Linux:移植USB接口的RTL8188EUS、RTL8188ETV WIFI模块
需要适配
嵌入式Linux:mangopi-V3s适配
适配电容屏
注释NS2009(电阻屏触摸芯片)相关的设备树代码
目录:arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts
/*&i2c0 {
status = "okay";
ns2009: ns2009@48 {
compatible = "nsiway,ns2009";
reg = <0x48>;
};
};*/
添加电容屏设备树
目录:arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dts
&i2c0 {
status = "okay";
gt911: touchscreen@14 {
compatible = "goodix,gt911";
reg = <0x14>;
interrupt-parent = <&pio>;
interrupts = <1 3 IRQ_TYPE_EDGE_FALLING>; /* (PB3) */
pinctrl-names = "default";
irq-gpios = <&pio 1 3 GPIO_ACTIVE_HIGH>; /* (PB3) */
reset-gpios = <&pio 1 2 GPIO_ACTIVE_HIGH>; /* RST (PB2) */
/* touchscreen-swapped-x-y */
};
};
内核配置
- 取消ns2009
- 增加电容芯片GT911
make ARCH=arm menuconfig
上电之后需要运行一下tslib的校验才可以用触摸功能
五、编译Buildroot
参考这个:全志V3s学习记录(9)buildroot文件系统构建
六、编译Qt
参考:嵌入式Linux–交叉编译安装Qt5.9.1
参考:嵌入式Linux–交叉编译安装Qt5.12.9
参考:Mangopi MQ-R:T113-s3编译Tina Linux系统(三)独立编译Qt5
最后
以上就是标致毛豆为你收集整理的BingPi V3s:一步一个脚印一、我的目标二、SD卡分区三、编译U-Boot四、编译Kernel五、编译Buildroot六、编译Qt的全部内容,希望文章能够帮你解决BingPi V3s:一步一个脚印一、我的目标二、SD卡分区三、编译U-Boot四、编译Kernel五、编译Buildroot六、编译Qt所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复