嵌入式Linux驱动开发笔记(九)

news/2024/11/8 8:36:49/

嵌入式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驱动工程师需要做的事越来越少)。


http://www.ppmy.cn/news/9038.html

相关文章

OpenCV4入门到进阶

OpenCV4入门到进阶 第1章 介绍与学习指南 第2章 OpenCV开发环境搭建 第3章 图像&视频的加载与展示 第4章 OpenCV必知必会基础 第5章 OpenCV实现图形的绘制 第6章 OpenCV的算术与位运算 第7章 图像基本变换 第8章 OpenCV中的滤波器 第9章 OpenCV中的形态学 第10章 目标识别…

关于一名资深Java程序员在移动端的进阶之路

目录 那年刚毕业 初识移动端 H5开始入门 微信小程序开发 未来的目标(唯有热爱,可抵这岁月漫长) 既然进来了,就帮我点亮五星好评吧,你的五星就是对我最大的支持和鼓励…… https://bbs.csdn.net/topics/611387335 今天呢,就借…

2022年终总结 2023展望

一、回首2022 总结2022,同时也给新的一年设定目标,明年来还愿。 2022对我来说意义非凡,最重要莫过于考上了理想的研究生学校。 1~2月 考研初试刚结束,很长时间没敲过代码,而且本科期间刷的算法题不多,感觉…

Node.js操作Dom ,轻松hold住简单爬虫

前言 前段时间,我发现一个开源题库,题目非常有意思。我想把它整成一个JSON文件做为数据储备,方便整活。 一共有一百五十多道题目,手动CV我肯定是不想干的。于是写了个脚本,在写脚本的过程中,我发现一个能…

【linux】三种权限的使用和更改、粘滞位和yum的使用

目录 1.权限问题 ①什么是权限? ②小问题 ③默认权限 ④如何更改“人”的权限呢? ⑤更改权限的八进制方案 ⑥强制改权限里的“人”(权限人文件属性) 2.粘滞位 2.yum的使用 1.权限问题 ①什么是权限? 权限人&a…

“当不存在跨域问题,也解决了数据验证时,还出现:No ‘Access-Control-Allow-Origin‘,说存在跨域问题 ”的解决办法

不存在跨域问题,数据验证也弄好了,还出现下面的问题:Access to XMLHttpRequest at https://m.maizuo.com/gateway?cityId440100&pageNum1&pageSize10&type1&k7325551 from origin http://localhost:8080 has been blocked b…

1231. 航班时间(恶心的输入处理 + 简单的数学)

题目如下: 题解 or 思路: 因为题目假设两次飞行时间是相同的,我们可以通过减法将时差消去。那么飞行时间就是: time1time22\frac{time_1 time2}{2}2time1​time2​ 题目的难点是处理输入,我们可以使用 sscanf 来进行处理&#x…

Vi/Vim模式下常见的命令操作

Vi和Vim的使用 Linux系统内会内置Vi 文本编辑器 vim 具有程序编辑能力,可以看做是vi的增强版本,可以主动以字体颜色辨别语法的正确性,方便程序设计。因此在程序员中被广泛使用 VIM有三种工作模式 一般模式/正常模式插入模式/编辑模式命令…