日常开发工作中,Linux驱动模块编译通常有两种方法:
然后使用insmod、rmmod等命令使模块加载进内核,或从内核卸载模块。
这种方法使驱动程序和linux内核成为一个整体。
上述的两种方法中如何使用make menuconfig图形化配置的方式进行选择呢?请看下面的内容。
首先进入到内核源码的路径下,然后输入make menuconfig即可打开这个界面。
输入""/"”"即可弹出搜索界面,然后输入我们想要搜索的内容即可。
(1)把驱动编译编译成模块,用M来表示(2)把驱动编译到内核里面,用*来表示(3)不编译。
我们可以使用“空格”按键来配置这三种不同的状态。
退出分为保存退出和不保存退出。
Makefile里面是编译规则,告诉我们在make的时候要怎么编译,相当于怎么做饭。Kconfig内核配置的选项,相当于我们去饭店吃饭服务员给我的菜单。.config是配置完内核以后生成的配置选项,相当于我们点完的菜。
arch/ $ARCH/目录下的Kconfig。
/arch/arm/configs#下面有好多的配置文件。相当于这个饭店的特色菜。
肯定是不行的,因为内核会默认读取 Linux内核根目录下的.config_作为默认的配置选项,所以我们不能给他改名字。
我们要就要点菜,菜单是Kconfig,通过make menuconfig.来调出这个菜单了。配置完成以后会自动更新到.config里面。
当我们make menuconfig.保存退出以后,Linux会将所有的配置选项以宏定义的形式保存在include/generated/下面的autoconf.h里面。
字符设备:IO的传输过程是以字符为单位的,没有缓冲。比如I2C,SPI都是字符设备
块设备:IO的传输过程是以块为单位的。根存储相关的,都属于块设备,比如,tf卡
网络设备:与前俩个不一样,是以socket套接字来访问的。
杂项设备是字符设备的一种。可以自动生成设备节点。我们的系统里面有很多杂项设备。我们可以输入cat /proc/misc命令来查看。
杂项设备的主设备号是相同的,均为10,次设备号是不同的。主设设备号相同就可以节省内核的资源。
设备号包含主设备号和次设备号,主设备号在Linux系统里面是唯一的,次设备号不一定唯一。
设备号是计算机识别设备的一种方式,主设备相同的就被视为同一类设备
主设备号可以比做成电话号码的区号。比如北京的区号是010
次设备号可以比作成电话号码。
主设备号可以通过命令cat /proc/devices来查看。杂项设备的主设备号是相同的,均为10。
查看杂项设备的次设备号: cat /proc/misc
查看非杂项设备的 次设备号的是:ls -l /dev
查看块设备的 主、次设备号: lsblk
定义在内核源码路径: include/linux/miscdevice.h
extern int misc_register(struct miscdevice *misc); //注册杂项设备
extern int misc_deregister(struct miscdevice *misc);//注销杂项设备
file_operations文件操作集在定义在include/linux/fs.h下面
(1)填充miscdevice 这个结构体
(2)填充file_operations这个结构体
(3)注册杂项设备并生生成设备节点。
#include //声明宏定义头文件
#include //包含初始化加载模块的头文件
#include
#include
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");
#通知编译器我们要编译模块的哪些源码
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
①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
CONFIG_HELLO这个变量名就是..../char/hello目录下Kconfig文件里的:
以上操作完成之后make menuconfig ARCH=arm 后就可以在图形化界面看到新增加的驱动选择了:
注意:*是表示编译进内核、M表示编译成.ko模块、为空表示不编译。