本人原本是mcu工程师,在b站看了不少linux小电脑的相关视频,被深深的吸引住了,因此萌生出了想自己鼓捣一个linux小电脑的项目的想法,算是实践下自己的兴趣,也算是做一个技术升级。毕竟之前自己这么多年都是以用stm32系列为主,跑系统也都是freertos一类的系统。
通过b站等众多视频了解到了荔枝派,坑网,在这里看了很多帖子入门,也得到了一些大佬的回复与帮助,因此自己在初步调通之后,也想分享一下自己的入门流程,算是对自己的一个记录,希望也可以给后续入门的小伙伴们提供一些有用的信息~。
在坑网中主要参考的是沉鱼大佬的帖子“荔枝派Zero V3s开发板入坑记录 (TF/SD卡启动)(主线Linux,主线u-boot)”(https://whycan.com/t_561.html)。
一、基本环境准备
1 使用的虚拟机环境为VMware workstation,安装Ubuntu14.04LTS(按照沉鱼大佬的帖子),虚拟机跟windows互传文件使用的是filezilla(有关该软件的使用可以百度搜索一下,很多的教程~,主要就是ubuntu里面需要安装ftp服务器,然后使用该软件配置ftp服务发送上传就可以了)。
2 安装交叉编译工具 sudo apt-get install gcc-arm-linux-gnueabihf
3 其他的各种支持的软件(话说我初步配置环境就搞了好久,大家不用急,多搜索慢慢来肯定可以的,缺什么软件就安装什么,这个过程可能会比较繁琐)
二、uboot
由于我使用的是较为简单的sd卡启动,所以获取该uboot源码: git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current。要是比较卡的话也可以手动下载压缩包,然后传到ubuntu上即可,基本如果使用sd卡启动的话,只会用到这一个版本的uboot。
修改 include/configs/sun8i.h, 使u-boot可以直接从tf卡启动:
#define CONFIG_BOOTCOMMAND "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;"
#define CONFIG_BOOTARGS "console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw vt.global_cursor_default=0"
上述添加的内容要放在#include<configs/sunxi-common.h>之前,否则编译会有问题,类似重定义的错误,这个一定要注意。
在修改文件内容是可以使用gedit编辑器,感觉操作比vim方便很多,可以进行熟悉的CV快捷键复制操作等。
其中BOOTCOMMAND与BOOTARGS为启动内核所需要执行的重要命令及uboot向内核传递的重要参数。load,bootz等均为uboot内所使用的命令。"load mmc 0:1 0x41000000 zImage; " 意思是将linux内核镜像zImage加载到内存的0x41000000处,因为linux需要在内存中才能启动,属于标准套路操作"load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock.dtb; "意思是将设备树文件加载到0x41800000地址处,其中设备树文件可根据自己的需要来选取,主要用到的就是sun8i-v3s-licheepi-zero-dock.dtb,以及带屏幕的sun8i-v3s-licheepi-zero-with-800x480-lcd.dtb(网店五寸屏)。"bootz 0x41000000 - 0x41800000;"的意思是使用bootz命令来加载启动linux内核,有关uboot命令的使用大家可以百度一下~资料很多~。BOOTARGS的内容有格式要求,大家可以查看BOOTARGS相关的资料即可~。
接下来是编译uboot:
cd到uboot目录下,
1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make distclean
2 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make LicheePi_Zero_800x480LCD_defconfig (群主网店5寸屏)
或者ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make LicheePi_Zero_480x272LCD_defconfig (通用4.3寸屏)
或者ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make LicheePi_Zero_defconfig (默认)
3 ARCH=arm make menuconfig
4 执行编译:ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make
这四步执行完之后,就会在uboot的目录下生成一个u-boot-sunxi-with-spl.bin,该文件就是最后烧录到sd卡的uboot文件。
三、linux内核及设备树
这部分基本也是参照沉鱼大佬的流程~
获取Linux源码(zero-4.13.y分支对网卡支持比较好): git clone https://github.com/Lichee-Pi/linux.git -b zero-4.13.y
编译linux及生成设备树,还是熟悉的四步
1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make distclean(这里清除一下再编译比较好,要不然残留的配置有可能会有问题)
2 生成荔枝派Zero 默认配置文件: CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm make licheepi_zero_defconfig
3 ARCH=arm make menuconfig
4 编译内核: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
编译设备树: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
四步之后linux内核镜像zImage及设备树文件就生成好了,zImage在arch/arm/boot/下,驱动模块在out/下。设备树文件在arch/arm/boot/dts/下。
其中linux内核的配置基本不用修改,licheepi_zero_defconfig文件基本都帮我们配置好了。
四、根文件系统buildroot
该部分还是继续参考(惭愧0.0)
1). 下载最新的buildroot稳定版本
官方网站: https://buildroot.org/download.html
长支持版本:buildroot-2017.02.7.tar.gz
最新稳定版:buildroot-2017.08.1.tar.gz
我这里下载的buildroot-2017.02.7.tar.gz。
2). 配置buildroot 参数, make menuconfig; make
buildroot的配置主要需要配置两个地方,一个是Target options ,另一个是编译工具链相关,
Target options --->
Target Architecture (ARM (little endian)) --->
Target Binary Format (ELF) --->
Target Architecture Variant (cortex-A7) --->
Target ABI (EABIhf) --->
Floating point strategy (VFPv4-D16) --->
ARM instruction set (ARM) --->
Toolchain --->
Toolchain type (External toolchain) --->
Toolchain External Options
Toolchain (Custom toolchain) --->
Toolchain origin (Pre-installed toolchain) --->
(/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/) Toolchain path
($(ARCH)-linux-gnueabihf) Toolchain prefix
External toolchain gcc version (4.9.x) --->
External toolchain kernel headers series (4.0.x) --->
External toolchain C library (glibc/eglibc) --->
[※] Toolchain has SSP support? (NEW)
[※] Toolchain has RPC support? (NEW)
[※] Toolchain has C++ support?
[※] Enable MMU support (NEW)
该部分配置的主要是按照另一位大佬https://blog.csdn.net/p1279030826/article/details/114500777的流程完成的。
然而我其实这块省事,直接使用晕哥提供的编译好的buildroot,建议大家也可以先用现成的根文件系统,来测试uboot跟内核是否好使,等整个都调通了,再一个部分一个部分的学习~(此处实属偷懒了0.0)
根文件系统最后编译完会生成一个rootfs.tar,这个用来后面解压到sd卡中即可。
五、系统烧写到sd卡
使用sd卡作为启动介质,此处参考晕哥的帖子https://whycan.com/t_547.html,贼给力,总结如下:
1) 删除TF卡所有分区并格式化
2) 将uboot写入到sd卡8k偏移处(必须8K偏移, brom规定的)。
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8 ,其中X为你的盘符,我这里是sdb。
3) 建立第一个分区,大小32M(可以随意填写), 格式FAT16, 把zImage, 设备树.dtb拷贝到 这个分区
4) 建立第二个分区,用尽剩余空间,格式ext4, 把buildroot产生的rootfs.tar解压到该分区根目录
tar xvf output/images/rootfs.tar -C /挂载的tf卡第二个分区目录
这里面我实际操作的时候遇到几个我认为需要注意的地方分享跟大家:
1 使用dd命令烧写uboot的时候,命令执行肯定是会成功的,但是不一定真正的写进去了,因为有时候我发现没卡,但是由于/dev下有sdb设备,该命令也能执行成功,但是事实上都没有插卡肯定是没写进去的,因此大家要多检查一下。我实际操作发现,一般写入速度为4M所有的时候就是写进去了(我的电脑是这样子的)。
2 tar解压根文件系统的时候,建议都使用绝对路径来执行。
3 整个调试的时候大家一开始一定要使用串口接到电脑上看!!!因为我一开始板子到的时候只有五寸屏,手里又没有usb转串口,就合计先调试一下看能不能把信息输出到屏幕上,后来才发现默认uboot的各种信息以及内核启动信息都是输出到串口上的!我鼓捣半天都不知道好不好使,所以初学者还是一定先用串口调试交互,先跑起来再说~
最后成功启动后,登陆账号root,无密码。
跑起来的那一刻真的很激动,从断断续续学相关知识到板子到手到上手跑起来,差不多一个半月时间,着实是用了好久,跑起来的时候真是兴奋的睡不着觉,哈哈。算是从菜鸟变成了小小鸟,因此写下这个帖子跟大家分享下,希望能帮助到其他人~
离线
嘿嘿,第一次发帖,都不太会上传图片,所以没有截图啥的0.0
离线
现在我也还是仅仅刚刚跑起来,现在想串口屏幕双端显示,还是在鼓捣的路上,感觉每前进一步都需要花不少时间0.0
离线
@Expelliarmus
我暂时还没研究明白怎么贴图片哈,不好意思。我启动后直接就是这样的,我复制一部分放上来吧。主要就是“Welcome to Buildroot”之后,直接输入root就可以正常使用了。
Starting logging: OK
Initializing random number generator... [ 1.698817] random: dd: uninitialized urandom read (512 bytes read)
done.
Starting network: OK
Welcome to Buildroot
buildroot login: root
# cat /dev/ttyS0
[ 31.845405] vcc3v0: disabling
[ 31.848404] vcc5v0: disabling
^Z[1]+ Stopped cat /dev/ttyS0
#
# cat /dev/tty0
离线