嵌入式Linux驱动开发笔记(九)
- 源码及工具说明
# 增加配置文件
imx6ull_atk_defconfig# 工具链
gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
# NXP官方原版uboot源码
https://github.com/Freescale/u-boot-fslc# NXP官方原版Linux源码
https://github.com/Freescale/linux-fslc
1 配置 Target options
输入如下命令即可打开图形化配置界面:
make menuconfig
首先配置 Target options 选项,需要配置的项目和其对应的内容如下(“=”号后面是配置项要选择的内容! ):
Target options-> Target Architecture = ARM (little endian)-> Target Binary Format = ELF-> Target Architecture Variant = cortex-A7-> Target ABI = EABIhf-> Floating point strategy = NEON/VFPv4-> ARM instruction set = ARM
2 配置 Toolchain
此配置项用于配置交叉编译工具链,也就是交叉编译器,若设置为我们自己所使用的交叉编译器,配置如下:
Toolchain-> Toolchain type = External toolchain-> Toolchain = Custom toolchain //用户自己的交叉编译器-> Toolchain origin = Pre-installed toolchain //预装的编译器-> Toolchain path =/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf-> Toolchain prefix = $(ARCH)-linux-gnueabihf //前缀-> External toolchain gcc version = 4.9.x-> External toolchain kernel headers series = 4.1.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) //选中
问题解决:Incorrect selection of kernel headers: expected 4.1.x, got 4.0.x
原因是配置buildroot工具链的linux内核版本与工具链本身自带的内核版本标识不一致导致的,我们只要修改下工具链自带的内核版本表示即可。
- 找到交叉编译工具链安装路径
whereis arm-linux-gnueabihf-gcc
进入交叉工具链安装路径,找到version.h文件
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/linuxvim version.h
里面有个宏定义就是内核版本标识,修改为262415(4.1.5版本内核)
#define LINUX_VERSION_CODE 262144
版本计算公式主要是十进制转换为16进制:
263680 = 01000000011000000000(b) = 040600(h) 对应4.6.x版本内核
因此
262144 = 040000(h) 对应4.0.0版本内核
262415 = 04010F(h) 对应4.1.15版本内核
保存后,重新编译即可清除该错误。
若设置为Buildroot默认版本的交叉编译器,且选择从网络下载和安装,配置如下:
Toolchain-> Toolchain type = External toolchain-> Toolchain = Linaro ARM 2018.05 //默认认版本的交叉编译器-> Toolchain origin = Toolchain to be downloaded and installed //网络下载的编译器-> [*] Enable MMU support (NEW) //选中
3 配置 System configuration
此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。需要配置的项目和其对应的内容如下:
System configuration-> System hostname = atk_imx6ull //平台名字,自行设置-> System banner = Welcome to atk i.mx6ull //欢迎语-> Init system = BusyBox //使用 busybox -> /dev management = Dynamic using devtmpfs + mdev //使用 mdev-> [*] Enable root login with password (NEW) //使能登录密码-> Root password = root //登录密码为 root
4 配置 Filesystem images
此选项配置我们最终制作的根文件系统为什么格式的,配置如下:
> Filesystem images-> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4-> ext2/3/4 variant = ext4 //选择 ext4 格式
5 禁止编译 Linux 内核和 uboot
buildroot 不仅仅能构建根文件系统,也可以编译 linux 内核和 uboot。当配置 buildroot,使能 linux 内核和 uboot 以后 buildroot 就会自动下载最新的 linux 内核和 uboot 源码并编译。但是我们一般都不会使用 buildroot 下载的 linux 内核和 uboot,因为 buildroot 下载的 linux 和 uboot官方源码,里面会缺少很多驱动文件,而且最新的 linux 内核和 uboot 会对编译器版本号有要求,可能导致编译失败。因此我们需要配置 buildroot,关闭 linux 内核和 uboot 的编译,只使用buildroot 来构建根文件系统, 首先是禁止 Linux 内核的编译, 配置如下:
-> Kernel-> [ ] Linux Kernel //不要选择编译 Linux Kernel 选项!
禁止编译 Uboot, 配置如下:
-> Bootloaders-> [ ] U-Boot //不要选择编译 U-Boot 选项!
6 配置 Target packages
此选项用于配置要选择的第三方库或软件、比如 alsa-utils、 ffmpeg、 iperf 等工具,但是现在我们先不选择第三方库,防止编译不下去!先编译一下最基本的根文件系统,如果没有问题的话再重新配置选择第三方库和软件。
7 编译 buildroot
配置完成以后就可以编译 buildroot 了,编译完成以后 buildroot 就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:
make
8 添加uboot和内核
我们嵌入式产品,不论是软件还是硬件,选择的标准并不是配置越高越好,软件版本越新越好,而应该是满足我们的需求就可以。因此我们在网络上下载uboot版本代码的时候,就是本着这个原则。
1、并不是越新版本的内核越好
2、选择SoC厂家移植版本会减少工作量
一般的,我们做linux开发,移植uboot和kernel的时候并不需要从头开始移植,uboot和kernel庞大又复杂,从头开始移植不仅耗时耗力,而且还很容易出错,没有人比SOC设计人员更熟悉他们自己的芯片,所以我们不管是软件还是硬件的设计都是根据官方出的开发板进行参考设计,并且在设计的过程中,比较重要的部分会和官方保持一致,例如EMMC、内存、NAND、SD卡、网络等,这是因为如果想要启动起uboot内存是必须的,只要比较重要或常用的几个外设跟官方的原理图保持一致或基本保持一致,那么我们下载进官方的uboot或者依据官方给的uboot进行简单更改,就能适配我们自己的板子,大大缩短了我们的开发周期。
uboot只是一个启动linux的作用,所以没必要将项目中使用到的驱动都适配好,因为在uboot阶段如果需要适配驱动是需要去修改源代码的,没有一些经验和基础是做不到这一步的。在项目开发阶段,uboot中最常用的就是控制台(串口)、SD卡、USB、网络这四个,对于i.MX6ULL来说,设计的时候对于这三个外设只要我们跟官方保持一致,那么用官方的uboot拿来就能直接用!毕竟我们项目开发的目的是在linux系统基础上开发应用而已(ps:这也是现在越来越趋向于嵌入式linux应用开发工程师的职位,因为现在有了设备树的开发方式以及半导体厂家做的BSP足够好了,所以嵌入式linux驱动工程师需要做的事越来越少)。