linux驱动编程之设备注册

linux下编写驱动时有注册设备这一步,设备注册有两种方法,一种是直接以平台的形式添加,平时都是用这种方式实现,另一种则是编译成.c文件,通过ko文件添加进去,其实就是将以平台的方式添加的过程通过自己的代码实现出来,如下是这两种的实现过程:

1.以平台的形式添加:

(1). 将设备结构体放到平台文件中,平台会自动注册设备。平台文件都在arch/目录下,具体参考实际的芯片:

          a.添加设备的结构体:

           linux驱动编程之设备注册_第1张图片

           b.将设备添加到设备链表中:

          

(2). 在Kconfig中增加此设备:

           linux驱动编程之设备注册_第2张图片

          这里要说一下,那个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:

linux驱动编程之设备注册_第3张图片

接下来,开始写程序,通过ko的方式加载进去,这里的设备名字是my_hello,如下是源代码:

#include
#include
#include

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查看:

             linux驱动编程之设备注册_第4张图片

         如上所示,可看到my_hello的设备,说明设备注册成功了。

以上就是两种注册方法,第二种其实是将第一种在内核的代码给提取出来了,然后通过ko加载到内核。

你可能感兴趣的:(linux驱动编程之设备注册)