驱动程序开发:Buildroot根文件系统构建并加载驱动文件xxx.ko测试

news2024/11/25 19:33:36

目录

  • 一、buildroot根文件系统简介
  • 二、buildroot下载
  • 三、buildroot构建根文件系统
    • 1、配置 buildroot
      • ①配置 Target options
      • ②配置 Toolchain
      • ③配置 System configuration
      • ④配置 Filesystem images
      • ⑤禁止编译 Linux 内核和 uboot
    • 2、 buildroot 下的 busybox 配置
      • ①修改 Makefile,添加编译器
      • ②busybox 中文字符支持
      • ③配置 busybox
      • ④编译busybox
    • 3、编译buildroot
    • 4、buildroot 根文件系统测试
      • ①创建/lib/modules/4.1.15文件夹
      • ①让命令行显示当前目录路径
  • 四、加载驱动程序xxx.ko文件测试
    • 1、将icm20608.ko文件拷贝到/buildroot/lib/modules/4.1.15目录下,如下图所示:
    • 2、使用depmod命令驱动挂载
    • 3、使用modprobe命令加载驱动,如下图所示:
    • 4、使用icm20608APP应用程序测试,如下图所示:
    • 5、使用lsmod查看当前加载的驱动程序和使用rmmod卸载驱动程序,如下图所示:

一、buildroot根文件系统简介

  buildroot 构建的根文件系统相对比较齐全,很多东西需要它会自行添加,比如 lib 库文件。并且,如果单纯使用busybox的话,在后面的驱动开发中很多第三方软件也需要我们自己去移植,这些第三方软件有很多又依赖其他的库文件,导致移植过程非常的繁琐,而buildroot可以为我们省去这些大部分的麻烦。

二、buildroot下载

  buildroot 官网下载地址为https://buildroot.org/。如下图所示:
在这里插入图片描述
在这里插入图片描述

三、buildroot构建根文件系统

1、配置 buildroot

  将下载的buildroot源码拷贝到ubuntu中,然后对其进行解压,操作命令如下:

tar -vxjf buildroot-2019.02.6.tar.bz2

  解压完成以后就会得到一个名为“buildroot-2019.02.6”的目录,此目录就是我们解压得到的 buildroot 源码,进入到此目录中,此目录如下图所示:
在这里插入图片描述
  buildroot 和 uboot、 Linux kernel 一样也支持图形化配置,输入如下命令即可打开图形化配置界:

make menuconfig

  打开以后的图形化配置界面如下图所示:
在这里插入图片描述

①配置 Target options

  首先配置 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

  配置完成以后如下图所示:
在这里插入图片描述

②配置 Toolchain

在这里插入图片描述

③配置 System configuration

在这里插入图片描述

④配置 Filesystem images

在这里插入图片描述

⑤禁止编译 Linux 内核和 uboot

在这里插入图片描述

2、 buildroot 下的 busybox 配置

  buildroot 在构建根文件系统的时候也是要用到 busybox 的,既然用到了 busybox 那么就涉及到 busybox 的配置。 buildroot 会自动下载 busybox 压缩包, buildroot 下载的源码压缩包都存放在/dl 目录下,在 dl 目录下就有一个叫做“busybox”的文件夹,此目录下保存着 busybox 压缩包,如下图所示:
在这里插入图片描述
  可以看出, buildroot 下载的 busybox 版本为 1.29.3。要想编译 busybox,必须对上图中的压缩包进行解压缩, buildroot 将所有解压缩后的软件保存在/output/build 软件中,我们可以在找到/output/build/busybox-1.29.3 这个文件夹,此文件夹就是解压后的 busybox 源码,文件内容如下图所示:
在这里插入图片描述

①修改 Makefile,添加编译器

  打开 busybox 的顶层 Makefile,添加 ARCH 和 CROSS_COMPILE的值,如下所示:

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

注意:CORSS_COMPILE 使用了绝对路径!主要是为了防止编译出错。

②busybox 中文字符支持

  修改 busybox 源码,取消 busybox 对中文显示的限制,打开文件 busybox-1.29.3/libbb/printable_string.c,找到函数 printable_string,缩减后的函数内容如下:

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) {
19 unsigned char c = *s;
20 if (c == '\0') {
......
28 }
29 if (c < ' ')
30 break;
31 if (c >= 0x7f)
32 break;
33 s++;
34 }
35
36 #if ENABLE_UNICODE_SUPPORT
37 dst = unicode_conv_to_printable(stats, str);
38 #else
39 {
40 char *d = dst = xstrdup(str);
41 while (1) {
42 unsigned char c = *d;
43 if (c == '\0')
44 break;
45 if (c < ' ' || c >= 0x7f)
46 *d = '?';
47 d++;
48 }
......
55 #endif
56 return auto_string(dst);
57 }

  如果支持 UNICODE 码的话,当字符大于 0X7F 就直接输出‘?’。所以我们需要对这 4 行代码进行修改,修改以后如下所示:

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 }

  接着打开文件 busybox1.29.3/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 }
......
1044 return dst;
1045 }
......
1047
1048 return dst;
1049 }

③配置 busybox

  配置 buildroot 下的 busybox,因此打开 busybox 的配置界面,命令(两种打开方式)如下:

sudo make busybox-menuconfig 在buildroot根目录下
sudo make menuconfig 在/output/build/busybox-1.29.3 目录下

  配置界面如下图所示:
在这里插入图片描述


  不采用静态编译,配置路径如下:
在这里插入图片描述
  选项“Build static binary (no shared libs)”用来决定是静态编译 busybox 还是动态编译,静态编译的话就不需要库文件,但是编译出来的库会很大。动态编译的话要求根文件系统中有库文件,但是编译出来的 busybox 会小很多。这里我们不能采用静态编译!因为采用静态编译的话 DNS 会出问题!无法进行域名解析,配置如图下所示:
在这里插入图片描述


  选择vi风格的行编辑命令,配置路径如下:
在这里插入图片描述
在这里插入图片描述


  取消勾选Simplified modutils,配置路径如下:
在这里插入图片描述
在这里插入图片描述


  使能系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件作用的选项mdev,配置路径如下:
在这里插入图片描述
在这里插入图片描述


  使能 busybox 的 unicode 编码以支持中文,配置路径如下:
在这里插入图片描述
在这里插入图片描述


注意!
  退出 linux Modules Utilites后 返回步骤 1 界面;在步骤 1界面选择最后一项 Save configuration to an alternate file,进入如下图界面:
在这里插入图片描述
在这里插入图片描述
  在buildroot-2019.02.6/output/build/busybox-1.29.3目录下会生成busybox.config文件,如下图所示:
在这里插入图片描述
  将buildroot-2019.02.6/package/busybox/busybox.config文件替换成上一步生成的buildroot-2019.02.6/output/build/busybox-1.29.3/busybox.config文件,如下图所示:
在这里插入图片描述

④编译busybox

  查看当前 buildroot 所有配置了的目标软件包,也就是 packages,命令如下:

sudo make show-targets

  单独编译并安装 busybox 如下命令:

sudo make busybox

3、编译buildroot

  编译 buildroot,主要是对其进行打包,输入如下命令:

sudo make

  然后在output/images目录下查看是否生成了rootfs.tar压缩包,如下图所示:
在这里插入图片描述
  在 nfs 目录下新建一个名为 buildrootfs 的文件夹,然后将上图 中的 rootfs.tar 拷贝到 buildrootfs 目录下并解压,命令如下:

cd /home/djw/linux/nfs //进入到 nfs 目录下
mkdir buildrootfs //创建 buildrootfs 目录
cd buildrootfs //进入到 buildrootfs 目录
cp …/…/IMX6ULL/tool/buildroot-2019.02.6/output/images/rootfs.tar ./ //拷贝到 rootfs.tar
tar -vxf rootfs.tar //解压缩 rootfs.tar
rm rootfs.tar //删除 rootfs.tar

  解压缩完成以后的 buildrootfs 目录如下图所示:
在这里插入图片描述

4、buildroot 根文件系统测试

  buildroot 制作出来的根文件系统已经准备好了,接下来就是对其进行测试。测试方法也是通过 nfs 挂载的方式,启动 uboot,修改 bootargs 环境变量,设置 nfsroot 目录为 Ubuntu 中的buildrootfs 目录,命令如下:

setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.111:
/home/djw/linux/nfs/buildrootfs rw ip=192.168.1.119:192.168.1.111:192.168.1.1:255.255.
255.0::eth0:off

在这里插入图片描述
  这里我们重点说一下另外一个问题,我们使用构建的根文件系统启动以后会发现,输入命令的时候命令行前面一直都是“#”,如果我们进入到某个目录的话前面并不会显示当前目录路径,如下图 所示:
在这里插入图片描述
  由上面可知,有两个问题,第一个是缺少/lib/modules文件夹,第二个是命令行不显示当前目录路径。

①创建/lib/modules/4.1.15文件夹

  modprobe 命令主要智能在提供了模块的依赖性分析、错误检查、错误报告等功能,推荐使用 modprobe 命令来加载驱动。 modprobe 命令默认会去/lib/modules/目录中查找模块,我使用的 Linux kernel 的版本号为 4.1.15,因此 modprobe 命令默认会到/lib/modules/4.1.15 这个目录中查找相应的驱动模块,一般自己制作的根文件系统中是不会有这个目录的,所以需要自己手动创建,如下图所示:
在这里插入图片描述

①让命令行显示当前目录路径

  先了解一下“PS1”这个环境变量, PS1 用于设置命令提示符格式,格式如下:
在这里插入图片描述
  打开/etc/profile 文件,修改好后如下图所示:
在这里插入图片描述
etc/profile 文件修改完成以后重启开发板,这个时候我们就如到某个目录的时候命令行就会有提示,如下图所示:
在这里插入图片描述

四、加载驱动程序xxx.ko文件测试

1、将icm20608.ko文件拷贝到/buildroot/lib/modules/4.1.15目录下,如下图所示:

在这里插入图片描述

2、使用depmod命令驱动挂载

  输入“depmod”命令以后会自动生成 modules.alias、modules.symbols 和 modules.dep 这三个文件,如下图所示:
在这里插入图片描述

3、使用modprobe命令加载驱动,如下图所示:

在这里插入图片描述

4、使用icm20608APP应用程序测试,如下图所示:

在这里插入图片描述

5、使用lsmod查看当前加载的驱动程序和使用rmmod卸载驱动程序,如下图所示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hive支持的数据类型

目录 一、hive数据类型 1.基础型 2.复杂型 二、类型转换 1.隐式转换 2.显示转换 一、hive数据类型 1.基础型 数据类型长度大小示例TINYINT1字节有符号整数&#xff0c;范围&#xff1a;-128~12710YSMALLINT2字节有符号整数&#xff0c;范围&#xff1a;-32768~3276710SI…

【解锁技能】学会Python条件语句的终极指南!

文章目录前言一. python条件语句的介绍1.1 什么是条件语句1.2 条件语句的语法1.3 关于内置函数bool()二. 分支语句之单分支三. 多分支语句3.1 二分支语句3.2 多分支语句3.3 嵌套循环总结前言 &#x1f3e0;个人主页&#xff1a;欢迎访问 沐风晓月的博客 &#x1f9d1;个人简介&…

Softing OPC Tunnel——绕过DCOM配置实现OPC Classic广域网通信

一 摘要 Softing OPC Tunnel是dataFEED OPC Suite的一个组件&#xff0c;可避免跨设备OPC Classic通信中出现的DCOM配置问题&#xff0c;同时可保证跨网络数据交换的高性能和可靠性。OPC Tunnel内部集成的存储转发功能&#xff0c;可在连接中断时缓存数据&#xff0c;并在重新…

html的常见标签使用

目录 1.vscode基础操作 2.html基础 语法 3.HTML文件的基本结构标签 4.注释标签 5.标题标签 6.段落标签:p 7.格式化标签 8.图片标签:img 绝对路径 相对路径 网络路径 alt属性 title属性 width/height属性 9.超链接标签:a 10.表格标签 11.列表标签 有序列表 无…

Hbase -- Compact工具梳理

1. 背景 当前&#xff0c;线上HBase集群的自动Major Compact是关闭的&#xff0c;我们选择在凌晨业务空闲的时候进行手动触发Major Compact&#xff0c;Compact工具就是在运维平台上对资源组、RS、表进行Major Compact。目前线上有2种版本的Compact程序&#xff1a;Compact_v1…

html 懒加载图片实现方法

懒加载逻辑 一般如果场景比较大&#xff0c;滚动条很长&#xff0c;图片比较多的情况下&#xff0c;不使用赖加载图片会一下子把资源都加载&#xff0c;导致性能很慢&#xff0c;甚至没有滚动到下面也加载了&#xff0c;很浪费资源现在通过滚动事件来处理图片加载,我们先吧要显…

Vue项目中components组件的使用笔记

目录 前言 一、components和component的区别&#xff1f; 二、components使用的步骤 1.创建组件vue文件 2.引入组件 3.注册组件 4.应用组件 总结 前言 本文章&#xff0c;只是初步了解记录components的使用步骤。 一、components和component的区别&#xff1f; compo…

【Python学习笔记】第二十一节 Python Lambda 函数

Python 提供了非常多的库和内置函数。有不同的方法可以执行相同的任务&#xff0c;而在 Python 中&#xff0c;有个万能之王函数&#xff1a;lambda 函数&#xff0c;它以不同的方式在任何地方使用。一、Lambda 函数简介在 Python 中&#xff0c;函数可以接受一个或多个位置参数…

火爆全网的ChatGPT 和AI 可以为项目经理做什么?

作为一款人工智能聊天机器人&#xff0c;ChatGPT因其逼真和人性化的特性而风靡全球&#xff0c;无疑是当今技术的新流行。人工智能 (AI) 有可能彻底改变许多行业&#xff0c;包括项目管理&#xff0c;及时了解最新技术以及它如何影响你的工作至关重要。于是&#xff0c;我们与C…

C++ string类(二)及深浅拷贝

一、string类方法使用举例1.迭代器迭代器本质&#xff1a;指针&#xff08;理解&#xff09;迭代器&#xff1a;正向迭代器&#xff1a; begin() | end() 反向迭代器&#xff1a; rbegin() | rend()2.find使用//找到s中某个字符 void TestString3() {string s("AAADEFNUIE…

分层测试(1)分层测试是什么?【必备】

1. 什么是分层测试&#xff1f; 分层测试是通过对质量问题分类、分层来保证整体系统质量的测试体系。 模块内通过接口测试保证模块质量&#xff0c;多模块之间通过集成测试保证通信路径和模块间交互质量&#xff0c;整体系统通过端到端用例对核心业务场景进行验证&#xff0c…

Spring Boot 3.0系列【2】部署篇之使用GraalVM构建原生镜像

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot版本2.7.0 文章目录概述JIT & AOTJIT &#xff08;动态编译&#xff09;AOT&#xff08;静态编译&#xff09;GraalVM简介运行模式Native Image&#xff08;原生镜像&#xff09;…

无线蓝牙耳机哪个牌子性价比高?国内性价比高的蓝牙耳机推荐

近年来&#xff0c;蓝牙耳机越来越成为人们日常生活中常见的数码产品之一&#xff0c;其便捷性以及愈发先进的功能得到了不少消费者的认可。无线蓝牙耳机哪个牌子性价比高&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款国内性价比高的蓝牙耳机&#xff0c;一起来看看…

AI画图_stable-diffusion-webui安装使用指南(1)

本文章适用于: 有一定学习能力和钻研能力&#xff0c;遇到问题能合理使用搜索引擎尝试解决问题的人想在windows系统中尝试使用AI作画工具stable-diffusion-webui进行绘画的人有一定的计算机基础&#xff08;会魔法上网、知道 python和Git&#xff09;和英文阅读能力的人显卡为…

js侧滑显示删除按钮

效果图&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno"><title>js侧滑显示删…

堡垒机采购注意事项说明

随着各大企业对数据安全的高度重视&#xff0c;堡垒机作为基础数据安全产品&#xff0c;被采购的也越来越多。但面对是棉厂众多的堡垒机品牌&#xff0c;采购者往往很蒙圈。这里我们行云管家小编就给大家汇总说明了几点堡垒机采购注意事项&#xff0c;希望对大家有用。 堡垒机…

在中外合作办学硕士领域似乎自己一直在纠结,也许是为了能遇见人大女王金融硕士

2023考研成绩如期而至&#xff0c;还记得考试时的一幕幕吗&#xff1f;在身体被高热侵蚀的情况下&#xff0c;我们似乎很难忘记这次考试所带给我们的经历。如今成绩下来了&#xff0c;可能与我们预期的几乎相同&#xff0c;但是在不断地寻找新的学习途径的过程中我们发现&#…

字节跳动青训营--Webpack

文章目录前言一、为什么要学习Webpack&#xff1f;二、什么是Webpack&#xff1f;1. 产生背景2. 基础概念三、使用Webpack1. 安装2. 编辑配置文件3. 执行编译命令核心流程四、如何使用Webpack流程类配置配置总览五、理解Loader六、理解插件插件钩子课外关注资料前言 此文章仅用…

华为OD机试题,用 Java 解【特异性双端队列】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

I.MX6ULL内核开发12:使用设备树插件实现RGB灯驱动

目录 一、引言 二、设备树插件格式 三、实验说明 四、实验准备 4.1 通过内核工具编译设备树插件 五、实验效果 5.1 uboot加载 5.2 加载RGB驱动 一、引言 Linux4.4以后引入了动态设备树&#xff08;Dynamic DevicesTree&#xff09;&#xff0c;这里翻译位“设备树插件…