Linux嵌入式驱动开发02——驱动编译到内核

全系列传送门

Linux嵌入式驱动开发01——第一个驱动Hello World(附源码)

Linux嵌入式驱动开发02——驱动编译到内核

Linux嵌入式驱动开发03——杂项设备驱动(附源码)

Linux嵌入式驱动开发04——应用层和内核层数据传输

Linux嵌入式驱动开发05——物理地址到虚拟地址映射

Linux嵌入式驱动开发06——第一个相对完整的驱动实践编写

Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)

Linux嵌入式驱动开发08——字符设备(步步为营)

Linux嵌入式驱动开发09——平台总线详解及实战

Linux嵌入式驱动开发10——设备树开发详解

Linux嵌入式驱动开发11——平台总线模型修改为设备树实例

Linux嵌入式驱动开发12——pinctl和gpio子系统实践操作

Linux嵌入式驱动开发13——ioctl接口(gpio控制使用)

Linux嵌入式驱动开发14——中断的原理以及按键中断的实现(tasklet中断下文)

Linux嵌入式驱动开发15——等待队列和工作队列

Linux嵌入式驱动开发16——按键消抖实验(内核定时器)

Linux嵌入式驱动开发17——输入子系统

Linux嵌入式驱动开发18——I2C通信

make menuconfig图形化配置界面

1. 怎么进入到make menuconfig图形化界面?

首先进入到内核源码的路径下
在这里插入图片描述

然后输入

make menuconfig

即可打开这个界面
在这里插入图片描述

2. make menuconfig图形化界面的操作

  • 搜索功能

    • 输入 “ / ” 即可弹出搜索界面,然后输入我们想要搜索的内容即可
      在这里插入图片描述
      例如搜索led
      在这里插入图片描述
  • 配置驱动状态

    • 把驱动编译编译成模块(用M表示)
    • 把驱动编译到内核里面(用*来表示)
    • 不编译

3. 退出

退出分为保存退出和不保存退出
在这里插入图片描述

4. 和make menuconfig有关的文件

  • Makefile
    • 编译规则,告诉我们在make的时候要怎么编译,相当于怎么做饭
  • Kconfig
    • 内核配置的选项,相当于我们去饭店吃饭服务员给我们的菜单
  • .config
    • 配置完内核之后生成的配置选项,相当于我们要点的菜

5. make menuconfig会读哪个目录下的Kconfig文件

arch/ $ARCH/目录下的Kconfig
在这里插入图片描述

arch/arm/configs

在这里插入图片描述

有好多的配置文件,相当于这个饭店的特色菜

6. 为什么要复制成.config而不是其他文件

复制配置文件到源码根目录

 cp imx_v7_defconfig /work/linux-4.1.15/.config

注意:
复制成.config格式
在这里插入图片描述
查看我们复制的.config格式文件
在这里插入图片描述

能不能是其他的文件名字?

肯定是不行的,因为内核会默认读取Linux内核根目录下的.config作为默认的配置选项,所以不可以改名字

7. 我们复制的这个默认的配置选项不符合我们的要求怎么办?

我们要就要点菜,菜单是Kconfig,通过make menuconfig来调出来这个菜单了
在这里插入图片描述

也就是按照要求从图形化界面选择就是了。

配置完成以后会自动更新到.config里面

8. 怎么和Makefile文件建立的关系

当我们make menuconfig保存退出以后,Linux会将所有的配置选项以宏定义的形式保存在include/generated/下面的autoconf.h里面
在这里插入图片描述

在这里插入图片描述
具体怎么建立关系也不是我们关心的内容。

驱动编译到内核

Kconfig例子

source "drivers/redled/Kconfig"        
config LED_4412                         
    tristate "Led Support for GPIO Led" 
    depends on LEDS_CLASS
    help
    This option enable support for led
source "drivers/redled/Kconfig"  

包含drivers/redled这个路径下的驱动文件,方便对菜单管理

config LED_4412        

配置选项的名称LED_4412

tristate "Led Support for GPIO Led" 

tristate表示驱动状态(1、驱动编译成模块,2、驱动编译到内核,3、不编译),
与之对应的还有bool(1、编译到内核,2、不编译)
“Led Support for GPIO Led” 是make menuconfig显示的名字

 depends on LEDS_CLASS

helloworld准备

第一步,复制.c文件到指定位置

首先是打开我们linux源码的char文件位置

 cd /work/linux-4.1.15/drivers/char/

在这里插入图片描述
新建helloworld文件夹

mkdir helloworld
chmod 777 helloworld

复制过来我们之前的helloworld.c 文件就可以了

第二步,新建helloworld对应的Kconfig

nano Kconfig

根据上面的例子写出helloworld的Kconfig

 config HELLOWORLD
        tristate "helloworld"
        help
        This option enable support for helloworld

在这里插入图片描述

第三步,新建helloworld对应的Makefile

nano Makefile
obj-$(CONFIG_HELLOWORLD)+=helloworld.o

在这里插入图片描述

第四步,修改char目录下的Kconfig Makefile

返回上一层目录,来到char目录
在这里插入图片描述
首先是Makefile

obj-$(CONFIG_HELLOWORLD) += helloworld/

在这里插入图片描述
然后就是Kconfig文件

source "drivers/char/helloworld/Kconfig"

在这里插入图片描述

imx_v7_defconfig—>.config

首先执行一个操作

. /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa9hf-neon-poky-linux-gnueabi
make distclean

清除掉linux源码根目录下的.config文件

然后可以

ls .config

查看一下是否被清除掉

make menuconfig的配置文件有一个默认的

cd arch/arm/configs/

我们可以在文件下找到imx_v7_defconfig
在这里插入图片描述
我们这里后面还需要用到,现在需要的是把imx_v7_defconfig复制成linux源码根目录下的.config文件

cp imx_v7_defconfig /work/linux-4.1.15/.config

在这里插入图片描述

make menuconfig

上一步的复制主要为了这一步,因为我们的make menuconfig运行,就是配置我们的.config文件

然后我们就可以找到我们的hello world了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
找到以后,使用 空格 操作,修改成编译到内核

之后保存退出就可以了

这时候我们可以打开.config文件,查看是不是修改成功了

nano .config

在这里插入图片描述
打开后,ctrl+w 就可以搜索我们的hello
在这里插入图片描述

.config—>imx_v7_defconfig

刚才默认配置文件imx_v7_defconfig变成临时的配置文件 .config,现在我们要变回去,因为后面的 make imx_v7_defconfig 操作,会从目录/arch/arm/configs中找到imx_v7_defconfig来进行加载配置
在这里插入图片描述

编译

这里使用脚本文件

#!/bin/bash
make distclean
make imx_v7_defconfig
make zImage -j16
make dtbs
make modules -j16

执行完毕后,我们查看是否成功,通过helloworld目录下有没有编译后生成的helloworld.o文件就可以了
在这里插入图片描述

  • 2
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Linux嵌入式驱动开发可以按照以下步骤行: 1. 掌握Linux基础知识:了解Linux操作系统的基本原理、命令行操作和文件系统等知识。可以通过阅读相关书籍或在线课程来学习。 2. 学习C编程语言:Linux驱动开发主要使用C语言,因此需要掌握C语言的基本语法、指针操作、内存管理等知识。可以通过阅读相关教程或参加编程培训来学习。 3. 了解Linux内核结构和设备模型:深入了解Linux内核的架构和设备模型,包括设备树(Device Tree)、驱动模型(Driver Model)、字符设备、块设备等。可以通过阅读Linux内核源码、内核文档以及相关书籍来学习。 4. 阅读和分析现有驱动代码:选择一些开源的嵌入式驱动代码,如GPIO驱动、I2C驱动等,仔细阅读和分析其代码结构、注册和初始化过程、设备操作函数等,理解其工作原理和设计思路。 5. 实践项目:尝试自己实现一个简单的嵌入式驱动,可以选择一些常用的外设,如LED、按键、传感器等,并编写相应的设备驱动代码。 6. 调试和测试:学习使用调试工具,如GDB、 printk等,掌握嵌入式驱动的调试和测试方法,能够定位和解决常见的驱动问题。 7. 深入研究特定领域的驱动开发:根据自己的兴趣和需求,深入研究特定领域的驱动开发,如网络设备驱动、视频设备驱动等。 此外,可以参考一些优秀的书籍和在线资源,如《Linux设备驱动开发详解》、Linux内核文档、Linux内核源码等,以加深对Linux嵌入式驱动开发的理解和应用。同时,参与开源社区、论坛或者相关的培训课程也是提高技能和获取实践经验的好途径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值