linux下编写驱动时有注册设备这一步,设备注册有两种方法,一种是直接以平台的形式添加,平时都是用这种方式实现,另一种则是编译成.c文件,通过ko文件添加进去,其实就是将以平台的方式添加的过程通过自己的代码实现出来,如下是这两种的实现过程:
1.以平台的形式添加:
(1). 将设备结构体放到平台文件中,平台会自动注册设备。平台文件都在arch/目录下,具体参考实际的芯片:
a.添加设备的结构体:
b.将设备添加到设备链表中:
(2). 在Kconfig中增加此设备:
这里要说一下,那个tristate也可以换成bool,这两者的区别在于,用tristate,则在接下来的make menuconfig中进行选择时1会多出一个选择项,具体我们稍后再说。
(3). 在make menuconfig中选择此设备:
可以看到,此时有HELLO选项,它前面的括号里面是空的,表示未选中,
它有如下两种选中方式:
"M"表示编译成模块,"*"表示编译进内核。
在(2)中,如果用tristate,则表示用两种选择,如果用bool,则只有*一种选择,这就是这两者的区别。
(4). 编译内核:
编译烧些后,可以通过ls /sys/devices/platform命令看到hello已经存在了,即已经hello设备注册成功了:
2.以平台的形式添加:
在添加设备之前,我们先用 ls /sys/devices/platform看下,这里面没有hello:
接下来,开始写程序,通过ko的方式加载进去,这里的设备名字是my_hello,如下是源代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
static void hello_release(struct device *dev)
{
printk(KERN_EMERG "hello_release!\n");
}
struct platform_device device_my_hello_ctl = {
.name = "my_hello",
.id = -1,
.dev = {
.release = hello_release,
}
};
static int hello_init(void)
{
printk(KERN_EMERG "HELLO WORLD enter!\n");
platform_device_register(&device_my_hello_ctl);
return 0;
}
static void hello_exit(void)
{
printk(KERN_EMERG "HELLO WORLD exit!\n");
platform_device_unregister(&device_my_hello_ctl);
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("kingyal");
接下来,编译成ko文件,加载到内核,并运行ko,再通过 ls /sys/devices/platform查看:
如上所示,可看到my_hello的设备,说明设备注册成功了。
以上就是两种注册方法,第二种其实是将第一种在内核的代码给提取出来了,然后通过ko加载到内核。