使用BSP包
前言
嵌入式系统启动流程:先启动bootloader,再启动内核,再启动根文件系统,最后启动用户的应用。之前的嵌入式linux教学都是从bootloader、内核、设备驱动、应用、项目全部涉及,但是实际工作中uboot会用就行基本不需要修改,而且从uboot到内核到根文件系统需要大量的学习周期,对于只有业余时间的在职工程师来说,需要的是快速上手。uboot、内核、根文件系统只需懂得如何使用官方BSP包去生成,然后烧写即可,什么时候用到了再仔细的去学习。
BSP
BSP是板级支持包,(board support package)是介于主板硬件和操作系统之间的一层,屏蔽底层硬件的多样性,根据操作系统的要求完成硬件的直接操作,向操作系统提供硬件信息,最终使操作系统运行于底层硬件主板。linux BSP开发简单说,就是将linux在板子上跑起来。包括bootloader,kernel,根文件系统,也包括一些驱动开发。 参考CSDN
x210开发板的BSP是由开发板商(九鼎)提供的文件位于 光盘B/linux/QT4.8/bsp/qt_x210v3s_160307.tar.bz2
在根目录(/)下新建目录:
sudo mkdir x210v3_bsp
进入x210v3_bsp,新建目录,并进入该目录
cd x210v3_bsp
sudo mkdir qt_x210v3
cd qt_x210v3
复制共享文件夹中的qt_x210v3s_160307.tar.bz2到新建的/x210v3_bsp/qt_x210v3目录下(该bsp包一定不要在共享文件夹下解压编译,否则会有各种问题)
cp /mnt/hgfs/share/bsp/qt_x210v3s_160307.tar.bz2 ./
解压到指定的文件夹
sudo tar -jxvf qt-x210v3s_160307.tar.bz2 -C /x210v3_bsp/qt_x210v3
BSP文件包解压后的文件包含:
文件夹名 | 说明 |
---|---|
buildroot | 构建根文件系统 |
kernel | 内核源代码 |
mk | 用于管理和编译整个bsp |
tools | 应用层的工具 |
tslib_x210_qtopia.tgz | 支持QT触摸屏操作的应用层库 |
uboot | bootloader源代码 |
version | 版本说明 |
xboot | bootloader源代码(九鼎给自己开发板编写的bootloader) |
mk详解
mk脚本的主要作用是编译BSP中的源代码,实际是整个BSP的makefile。我们可以完整编译也可以部分编译
指令 | 说明 |
---|---|
./mk -h | 查看mk的帮助信息 |
./mk -a | 编译所有的bsp源代码 |
./mk -x | 只编译xboot |
./mk -ui | 只编译inand版本开发板的uboot(即我们用的X210V3S开发板) |
./mk -k | 只编译kernel |
./mk -r | 编译buildroot,只得到文件夹形式的rootfs,并没有制作成镜像文件 |
./mk -re | 编译buildroot,并制作得到ext3格式的rootfs镜像 |
./mk -rj | 编译buildroot,并制作得到jffs2格式的rootfs镜像 |
使用BSP创建bootloader,kernel,根文件系统
(1)创建bootloader
./mk -ui
详见视频2.3零距离初体验uboot,在qt_x210v3/release/(同时在uboot根目录)下生成uboot_inand.bin
(2)创建kernel
./mk -k
详见视频2.15内核的配置和编译原理,在qt_x210v3/release/(同时在kernel/arch/arm/boot/)目录下生成zImage-qt
(3)创建根文件系统
在本次BSP开发中buildroot只是用来搭建根文件系统,uboot和kernel还是用BSP包中的mk编译生成。但经过网上查看buildroot也可以配置生成uboot,kernel,根文件系统,驱动。但是因为是针对x210板卡学习,还是建议根据板卡提供的BSP开发,后面如有需要再学习也可以。将网上搜集到的buildroot开发放在补充,方便以后查看。
在使用buildroot创建根文件系统之前需要安装软件包
sudo apt-get install g++
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install texinfo
sudo apt-get install git
sudo apt-get install hgsubversion
sudo apt-get install whois
生成rootfs文件夹
./mk -r
生成ext3格式的rootfs镜像
./mk -re
详见视频2.20.buildroot的引入和介绍, 在qt_x210v3/release/下生成rootfs_qt4.ext3
(4)fastboot下载
通过fastboot指令下载到开发板上。
使用官方bsp新建的qt工程 用户:root,密码:123456
使用BSP中的uboot文件夹单独编译uboot
uboot文件夹是通过makefile文件编译uboot
(1)检查安装的 arm-none-linux-gnueabi-gcc 交叉编译工具链是否正确
检查uboot根目录的makefile中编译器设置的交叉编译工具链的路径和名字是否正确(CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-)。
(2)清除之前编译生成的文件
在uboot根目录下执行 make distclean 清除之前编译产生的文件。
make distclean
(3)配置uboot
在uboot根目录下执行:make x210_sd_config (生成用于inand烧写的uboot和后面的mk -ui 效果相同)
make x210_sd_config
如果出现:Configuring for x210_sd board … 说明配置完成。
(4)编译
执行 make (或者 make -j4(4线程编译))指令进行编译得到 uboot.bin(位于uboot根目录下)
make
或
make -j4
使用BSP中的kernel文件夹单独编译kernel
kernel文件夹是通过makefile文件编译kernel
(1)检查安装的 arm-none-linux-gnueabi-gcc 交叉编译工具链是否正确。
检查kernel根目录的makefile中编译器设置的交叉编译工具链的路径和名字是否正确(CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-)
检查ARCH = arm
(2)安装ncurses库
安装ncurses库
sudo apt-get install libncurses5-dev
(3)清除之前编译生成的文件
在kernel根目录下执行make distclean 清除之前编译产生的文件
make distclean
(3)配置kernel
在kernel根目录下执行:make x210ii_qt_defconfig
make x210ii_qt_defconfig
如果出现configuration writeen to .config 说明配置完成,表明 .config 文件生成。
将终端输入指令窗口全屏,执行 make menuconfig,进行其他自定义配置
make menuconfig
(4)编译
执行 make (或者make -j4(4线程编译))指令进行编译得到zImage(位于arch/arm/boot目录下)
make
或
make -j4
补:
在编译过程中出现recipe for target ‘kernel/timeconst.h’ failed kernel/timeconst.h]问题
解决方法:
kernel/timeconst.pl中第373行的defined()去掉,只留下 !@val 就可以了
使用Busybox自制根文件系统
Busybox是一个开源项目,制作rootfs的常用工具。下载链接
(1)前期准备工作
新建rootfs文件夹
mkdir rootfs
解压busybox压缩包
tar -vxjf busybox-1.19.2-x210.tar.bz2
(2)busybox中的文件修改
顶层Makefile文件
164 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
......
190 ARCH ?= arm
libbb/printable_string.c文件
12 const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)
13 {
14 char *dst;
15 const char *s;
16
17 s = str;
18 while (1) {
......
30 if (c < ' ')
31 break;
32 /* 为支持中文字符*/
33 /* if (c >= 0x7f)
34 break; */
35 s++;
36 }
37
38 #if ENABLE_UNICODE_SUPPORT
39 dst = unicode_conv_to_printable(stats, str);
40 #else
41 {
42 char *d = dst = xstrdup(str);
43 while (1) {
44 unsigned char c = *d;
45 if (c == '\0')
46 break;
47 /* 为支持中文字符*/
48 /* if (c < ' ' || c >= 0x7f) */
49 if( c < ' ')
50 *d = '?';
51 d++;
52 }
......
59 #endif
60 return auto_string(dst);
61 }
libbb/unicode.c文件
1003 static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t *stats, const char *src, unsigned width, int flags)
1004 {
1005 char *dst;
1006 unsigned dst_len;
1007 unsigned uni_count;
1008 unsigned uni_width;
1009
1010 if (unicode_status != UNICODE_ON) {
1011 char *d;
1012 if (flags & UNI_FLAG_PAD) {
1013 d = dst = xmalloc(width + 1);
......
1022 /* 为支持中文字符*/
1023 /* *d++ = (c >= ' ' && c < 0x7f) ? c : '?'; */
1024 *d++ = (c >= ' ') ? c : '?';
1025 src++;
1026 }
1027 *d = '\0';
1028 } else {
1029 d = dst = xstrndup(src, width);
1030 while (*d) {
1031 unsigned char c = *d;
1032 /* 为支持中文字符*/
1033 /* if (c < ' ' || c >= 0x7f) */
1034 if(c < ' ')
1035 *d = '?';
1036 d++;
1037 }
1038 }
(3)busybox配置
先执行默认配置
make defconfig
再细节配置
make menuconfig
在控制面板设定如下:
Busybox Settings--->
Build Options--->
[*]Build BusyBox as a static binary(no shared libs)
Busybox Library Tuning--->
[*]vi-style line editing commands
[*]Fancy shell prompts
Linux Module Utilities--->
[ ]Simplified modutils
[*]insmod
[*]rmmod
[*]lsmod
[*]modprobe
[*]depmod
Linux System Utilities--->[*]mdev
[*]Support /etc/mdev.conf
[*]Support subdirs/symlinks
[*]Support regular expressions substitutions when renaming dev
[*]Support command execution at device addition/removal
[*]Support loading of firmwares
编译busybox
make install CONFIG_PREFIX=XXXX
XXX=前期准备工作中新建的rootfs文件夹路径
(3)添加所需文件夹
lib文件夹
新建lib文件夹
mkdir lib
复制交叉编译工具链中的so文件到新建lib文件夹中
cp tool/toolchain/arm-2009q3/arm-none-linux-guneabi/libc/lib/*so* ./rootfs/lib/ -d
删除ld-linux-armhf.so.3文件
rm ld-linux-armhf.so.3
再次进入到交叉编译工具链的复制目录下
cp ld-linux-armhf.so.3 ./rootfs/lib
复制交叉编译工具链中的.a文件到新建lib文件夹中
cp tool/toolchain/arm-2009q3/arm-none-linux-guneabi/lib/*.a ./rootfs/lib/ -d
复制交叉编译工具链中的so文件和.a文件到/usr/lib文件夹中
cp tool/toolchain/arm-2009q3/arm-none-linux-guneabi/lib/*so* *.a ./rootfs/usr/lib/ -d
etc文件夹
复制2.19课件文件夹中的etc
注意:在notepad++中修改rcS格式为UNIX格式(notepad++右下方UTF-8左侧项右键)同时进行chmod +777 rcS
下载链接:https://download.csdn.net/download/wuli_Thames/86394102
其他文件夹
mkdir dev proc sys tmp var 等
(4)生成etx2格式
新建rootfs.ext2生成目录
mkdir rootfs_release
切换到新建的生成目录
cd rootfs_release
dd if=/dev/zero of=rootfs.ext2 bs=1024 count20480
losetup /dev/loop2 rootfs.ext2
mke2fs -m 0 /dev/loop2 20480
mkdir rootfs_ext2
mount -t ext2 /dev/loop2 ./rootfs_ext2/
cp ../rootfs/* ./rootfs_ext2/ -rf
umount /dev/loop2
losetup -d /dev/loop2
Buildroot补充
Buildroot官方全英文使用手册的链接
Buildroot是一个开源的嵌入式Linux系统自动构建框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)
(1)源码下载
先从Buildroot官网下载最新的稳定版压缩包(buildroot-xxx.tar.gz)
(2)解压
放到Ubuntu系统下解压,进入解压后的Buildroot主目录,其目录结构解释如下
(3)配置
make XXX_defconfig 选择一个defconfig,这个文件在config目录下。
make menuconfig 进行配置
(4)编译
make all
(5)下载
在Buildroot主目录的在output/images/ 文件夹下,生成可烧写文件:Uboot(u-boot.bin);Kernel(uImage);根文件系统(rootfs.jfss2)
具体使用可参考CSDN