Linux下把驱动编译进内核及图形化配置的方式进行选择

一、Linux驱动编译的两种方法

日常开发工作中,Linux驱动模块编译通常有两种方法:

1、将驱动编译成模块

然后使用insmod、rmmod等命令使模块加载进内核,或从内核卸载模块。

2、直接将驱动编译进内核

这种方法使驱动程序和linux内核成为一个整体。

上述的两种方法中如何使用make menuconfig图形化配置的方式进行选择呢?请看下面的内容。

二、make menuconfig图形化配置

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

首先进入到内核源码的路径下,然后输入make menuconfig即可打开这个界面。

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

Ⅰ.搜索功能

输入""/"”"即可弹出搜索界面,然后输入我们想要搜索的内容即可。

Ⅱ.配置驱动的状态

(1)把驱动编译编译成模块,用M来表示(2)把驱动编译到内核里面,用*来表示(3)不编译。

我们可以使用“空格”按键来配置这三种不同的状态。

3.退出

退出分为保存退出和不保存退出。

4.和make menuconfig有关的文件

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

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

arch/ $ARCH/目录下的Kconfig。

/arch/arm/configs#下面有好多的配置文件。相当于这个饭店的特色菜。

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

肯定是不行的,因为内核会默认读取 Linux内核根目录下的.config_作为默认的配置选项,所以我们不能给他改名字。

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

我们要就要点菜,菜单是Kconfig,通过make menuconfig.来调出这个菜单了。配置完成以后会自动更新到.config里面。

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

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

三、杂项设备驱动讲解

1.Linux三大设备驱动

字符设备:IO的传输过程是以字符为单位的,没有缓冲。比如I2C,SPI都是字符设备

块设备:IO的传输过程是以块为单位的。根存储相关的,都属于块设备,比如,tf卡

网络设备:与前俩个不一样,是以socket套接字来访问的。

杂项设备是字符设备的一种。可以自动生成设备节点。我们的系统里面有很多杂项设备。我们可以输入cat /proc/misc命令来查看。

2.杂项设备除了比字符设备代码简单,还有别的区别吗?

杂项设备的主设备号是相同的,均为10,次设备号是不同的。主设设备号相同就可以节省内核的资源。

3.主设备号和次设备号是什么?

设备号包含主设备号和次设备号,主设备号在Linux系统里面是唯一的,次设备号不一定唯一。

设备号是计算机识别设备的一种方式,主设备相同的就被视为同一类设备

主设备号可以比做成电话号码的区号。比如北京的区号是010

次设备号可以比作成电话号码。

主设备号可以通过命令cat /proc/devices来查看。杂项设备的主设备号是相同的,均为10。

查看杂项设备的次设备号: cat  /proc/misc

查看非杂项设备的 次设备号的是:ls -l /dev

查看块设备的 主、次设备号: lsblk

4.杂项设备的描述

定义在内核源码路径: include/linux/miscdevice.h

extern int misc_register(struct miscdevice *misc);    //注册杂项设备

extern int misc_deregister(struct miscdevice *misc);//注销杂项设备

file_operations文件操作集在定义在include/linux/fs.h下面

5.注册杂项设备的流程

(1)填充miscdevice 这个结构体

(2)填充file_operations这个结构体

(3)注册杂项设备并生生成设备节点。

四、杂项设备驱动代码框架

#include <linux/init.h>     //声明宏定义头文件
#include <linux/module.h>   //包含初始化加载模块的头文件
#include <linux/miscdevice.h>
#include <linux/fs.h>

struct file_operations misc_fops = {
    .owner = THIS_MODULE
};

struct miscdevice misc_dev = {
    .minor = MISC_DYNAMIC_MINOR,
    .name  = "hello_misc",
    .fops  = &misc_fops
};

static int misc_init(void)
{
    int ret;

    ret = misc_register(&misc_dev);
    

    printk("misc init\n");
}

static int misc_exit(void)
{
    printk("misc exit\n");
}

//驱动模块的入口和出口
module_init(misc_init);
module_exit(misc_exit);

//声明信息
MODULE_LICENSE("GPL");

五、Linux下把驱动编译进内核

1.编写代码如上面标题四中的代码。

2.编写makefile

#通知编译器我们要编译模块的哪些源码
obj-$(CONFIG_HELLO) += helloworld.o 

#源码目录变量,这里用户需要根据实际情况选择路径
#作者是将Linux的源码拷贝到目录/media/lichee/linux-3.4下并解压的
#KDIR := /home/xxx/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
KDIR := /home/xxx/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek

#当前目录变量
PWD ?= $(shell pwd)

#make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,作者这里指的是/media/lichee/linux-3.4
#$(PWD)当前目录变量
#modules要执行的操作
all:
	make -C $(KDIR) M=$(PWD) modules

#make clean执行的操作是删除后缀为o的文件
clean:
	rm -rf *.o

3.将makefile和.c文件放到内核中的相应目录,创建Kconfig

 

 4.Kconfig详解

①source "drivers/redled/Kconfig'

他会包含drivers/redled/这个路径下的驱动文件,方便我们对菜单进行管理

②config LED_4412

配置选项的名称,CONFlG_LED_4412

③tristate表示的驱动的状态,把驱动编译成模块,把驱动编译到内核,不编译与之对应的还有bool分别是编译到内核,不编译

"Led Support for GPIO Led"make menuconfig显示的名字A depends on B

表示只有在选择B的时候才可以选择A

④比如我想直接去掉LED相关的去掉,我们直接改.config文件可以吗?可以,但是不推荐。如果有依赖的话,直接修改.config是不成功的。

⑤select

反向依赖,改选项被选中时,后面的定义也会被选中。

⑥help

This option enable support for led


5.编写Kconfig

 

 6.修改../char目录下的Makefile文件

CONFIG_HELLO这个变量名就是..../char/hello目录下Kconfig文件里的:

7.修改../char目录下的Kconfig文件

 以上操作完成之后make menuconfig ARCH=arm 后就可以在图形化界面看到新增加的驱动选择了:

注意:*是表示编译进内核、M表示编译成.ko模块、为空表示不编译。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值