嵌入式 Linux 系统移植——BSP分析
一、BSP简介
嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随应用的不同而有不同的要求。硬件平台的多样性是嵌入式系统的主要特点,如何使嵌入式操作系统在不同的硬件平台上有效地运行,是嵌入式系统开发中需要解决的关键问题。解决的方法是在硬件平台和操作系统之间提供硬件相关层来屏蔽这些硬件的差异,给操作系统提供统一的运行环境,硬件相关层就是嵌入式系统中的板级支持包 BSP(Board Support Package,简称BSP)。
BSP是嵌入式系统中介于硬件平台和操作系统之间的中间层软件,主要目的是为了屏蔽底层硬件的多样性,根据操作系统的要求完成对硬件的直接操作,向操作系统提供底层硬件信息并最终启动操作系统。BSP具有硬件相关性和操作系统相关性的特点,BSP主要功能为屏蔽硬件,提供操作系统及硬件驱动,具体功能包括:
A、单板硬件初始化,主要是CPU的初始化,为整个软件系统提供底层硬件支持
B、为操作系统提供设备驱动程序和系统中断服务程序
C、定制操作系统的功能,为软件系统提供一个实时多任务的运行环境
D、初始化操作系统,为操作系统的正常运行做好准备
BSP是相对于操作系统而言的,不同的操作系统有不同定义形式的BSP,要求BSP所实现的功能也有所不同。在嵌入式Linux系统中,主要是初始化底层硬件并引导操作系统;同时,BSP又是和硬件相关的,还要考虑对硬件的初始化操作。这些初始化操作主要是对CPU、内存、中断等相关的寄存器及协处理器进行正确的配置。在不同的开发阶段,因为核心和文件系统所处的位置不同,BSP所要完成的工 作也有所不同;在开发调试阶段,BSP要能够与主机通信并从主机下载核心;在目标产品中,BSP要能够从非易失存储设备中加载核心。
对于开发板提供商来说,BSP就是开发板的生产商提供的一个资料和资源包。
通常包括:
硬件相关:
A、开发板原理图
B、开发板元件列表
C、接口定义
D、地址分布
软件相关:
A、某些操作系统的bootloader及源代码
B、某些操作系统裁剪好的映像文件(如linux系列可能有源码,如WinCE可能有CEC文件)
服务相关 :
售后的技术支持
二、buildroot简介
Buildroot是一个包含Makefile和修补程序的集合,实现构建交叉工具链,根文件系统以及Linux内核映像。Buildroot是从事嵌入式系统开发的强大工具。
官方网站:https://www.buildroot.org
1、buildroot工程目录分析
/dl 存放下载的源码包
/toolchain 放置编译交叉工具的配置文件与源代码
/fs/ 主要存放各种文件系统的源代码
/fs/skeleton 存放骨架,第一次生成文件系统镜像的地方
/linux linux源码存放地方
/configs 预先放置了一些开发板的配置参考,有arm,X86和MIPS等
/board 发现友善之臂的配置文件
/boot bootloader的一些配置,可以通过配置下载源码
/package 主要存放应用软件的配置文件,未来开发的主战场,可以通过配置其文件,增加源码包或者删减,利用 buildroot来实现交叉编译
/Output 编译的生成目录
/Output/p_w_picpaths 存放编译后产生的所有镜像文件
/Output/build 编译的源码包,buildroot从dl的包解压缩到build里面,然后再编译
/Output/staging 这个目录非常重要,它提供了交叉编译依赖的库,一般进行make的时候,都会利用staging的库文件进行链接
/Output/target 嵌入式设备下的根文件系统,里面是我们实际烧写的根文件系统镜像
/Output/host 交叉编译工具位置如arm-linux-gc
/Output/toolchain 第三方交叉编译工具位置,我的目录是空的。
三、BSP实例分析
九鼎科技发布的基于X210开发板的qt_x210v3 BSP。结构如下:
buildroot,构建根文件系统
Kernel,kernel内核
uboot、xboot,uboot移植部分
mk:整个BSP的管理、编译脚本,
1、buildroot
buildroot是一个工具集成包,集成了交叉编译工具链的制作,以及整个rootfs的配置编译过程。同时,buildroot将集成了bootloader和kernel的make xxx_defconfig+make menuconfig配置过程,所有跟bootloader、kernel、rootfs有关的配置均可以在buildroot中完成。Buildroot本身也是使用make xxxconfig进行界面选项配置的。
2、mk脚本
mk脚本的主要作用是编译bsp中的所有的源代码(包括bootloader、kernel、rootfs等),实际是整个BSP的Makefile。mk脚本可以指定BSP中的某个目标进行编译,也可以编译全部目标(bootloader、kernel、rootfs)。使用方法如下:
-j=n using n threads when building source project (example: -j=16)
-x, --xboot build bootloader xboot from source file
-ui,--uboot_inand build uboot for emmc
-un,--uboot_nand build uboot for nand flash
-k, --kernel build kernel from source file and using default config file
-r, --rootfs build root file system
-re,--rootfs_ext3 build rootfs for emmc,used with uboot
-rj,--rootfs_jffs2 build rootfs for nand,used with uboot
-U, --update gen update package update.bin,used with xboot
-a, --all build all, include anything
-h, --help display this help and exit