BingPi V3s:一步一个脚印
很精致小巧的一块板子,基于全志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:一步一个脚印相关推荐
- 一步一个脚印学习WCF系列之WCF概要—生成元数据与代理(五)
阅读目录 一:契约与元数据 二:服务描述与元数据 一:契约与元数据 . 客户端与服务端之间共享的应该是Contract契约而不是代码,就是前面我们讲的文章"一步一个脚印学习WCF之WCF概要 ...
- 建模学习是个持之以恒的过程,一步一个脚印,才能真正的学到知识
学习都是有一个过程的,不管是学习什么内容,都是有好奇时期-兴趣大-认真学习-遇到阻力沮丧-回头细想理性对待.(1)要根据自己的特长去决定自己学习MAX和应用MAX的目标.譬如,你的主业是建筑行业,熟悉 ...
- 一步一个脚印,QAD助力CAPP走出信息化进阶之路
[本文转载于e-works数字化企业网] 客户引言: "随着汽车市场进入拐点,整个行业尤其是零部件厂商无可避免的将从管理入手进行转型升级.QAD ERP解决方案在汽车行业拥有"专业 ...
- 勤劳的人,一步一个脚印,加油
今天一个粉丝后台私聊我,感触挺深的,把内容整理成文章,希望你以后越走越好,加油! 这个月我的主业和副业收入大概在4.5 万,这是我来到杭州后三年第一次一个月赚这么多钱,我记得刚来杭州的时候月薪是3 K ...
- 【一步一个脚印】Tomcat+MySQL为自己的APP打造服务器(2-1)Servlet的使用
最近工作上效率比较低,各种需求更改耗费了大量的时间成本(不吐槽,你懂的,已无力),高的身心俱疲.... ... 每次废话都比较多,我也是服了自己了,就当我是来凑字数的吧!不废话了,开始正题: 翻了一下 ...
- 【一步一个脚印】Tomcat+MySQL为自己的APP打造服务器(2-2)Servlet的使用
在上一篇 [一步一个脚印]Tomcat+MySQL为自己的APP打造服务器(2-1)Servlet 的使用 中我们只是简单的对 Servlet 要做的任务.在服务器中的地位有了一个大概的了解,完成了在 ...
- 一步一个脚印,其实真的不慌
怎么总是有时候,会犯一个错误,就是有点急于求成,会不惜代价的去完成本应该是水到渠成的事情. 还是心急了,,,,不光是学习,有偶尔生活也是这样的. 在这里记一下: 一步一步来,按照自己的节奏来,要掌握好 ...
- 单点突破,一步一个脚印
项目上问题很多,从需求.设计.编码.测试.验收,流程上的每一步都不尽完善.各个模块从组长到组员,也都有很多提升空间. 现状如此,急也急不来,只能是一个长期的过程.眉毛胡子一把抓,没法聚焦,反而 ...
- java的栈堆的理解_理解堆与栈 - 一步一个脚印 - BlogJava
一.引言: 一直不太明白堆与栈到底是什么,是指一块内存区呢,还是指一种数据结构?编写程序中总提到内存分配的栈与堆的区别,静态与动态分配等,总也弄不明白,隐约知道一点,但总分不清堆与栈到底是一块内存区还 ...
最新文章
- MSMQ 远程计算机不可用 remotemachinenotavailable
- C# 中对COOKIES的操作
- 数组拷贝问题,实际上是指针指向发生变化
- 最大子段和问题Java实现
- centos卸载内核_CentOS 中内核模块的加载和卸载
- 【译】C#9的候选功能
- Spring MVC和Thymeleaf:如何从模板访问数据
- mysql8和5.7区别_mysql8.0与mysql5.7安全加密小差别
- 【NLP】Stanford
- [Common 17-39] ‘connect_bd_intf_net‘ failed due to earlier errors. 的解决办法
- MFC(VS2010)编程实例之一(Edit Control控件)
- Linux 文件类型!
- css3 animation 位置移动了怎么不占位置_手把手整理CSS3知识汇总【思维导图】
- 小米 note3 android,小米Note3将更新MIUI10:基于安卓8.1 速度提升明显手感更加丝滑...
- 树形控件之思维导图 Android
- 物体识别基本原理及其Python实现
- ssb的matlab仿真,线性调制AM、DSB、SSB的MATLAB仿真代码
- 数学:定积分和数列和互相转化
- 【Activity学习五】--基于SSM整合Activiti之请假流程实现(二)
- 狼行千里吃肉,马行千里吃草(我读了5遍,震撼了!)
热门文章
- mysql日期从小到大排序,简述5种MySQL数据排序
- 这32件小事儿,对考研上岸真的有帮助
- 要不是和阿里P6聊过,到死也不知道自己原来啥也不是
- pig加载两个不同字段个数的文件?load file with different items(f1有42列,f2有43列读到一个对象中)
- 汽车钣金模具设计规范
- 回归本源,勿忘初心,趋势与未来洞察
- Word入门动画教程5:制作稿纸(转)
- 房地产装饰行业ERP工程项目实施要点分析
- 张生尧:5.17黄金最新走势分析,黄金涨跌精准操作策略
- python手机自动化截图_Python Appium自动化测试 屏幕截图