嵌入式快速入门学习笔记-使用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触摸屏操作的应用层库
ubootbootloader源代码
version版本说明
xbootbootloader源代码(九鼎给自己开发板编写的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

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值