linux驱动学习笔记(一)

Linux驱动的三个概念:设备,驱动,总线;

什么是设备?如何理解设备?

  • 在设备树(device tree)中的每一个节点都代表一个设备,每个设备都在/dev下面有自己的一席之地(确认一下这句话?)
  • 从物理的角度看,一个要被控制的对象就是一个设备

什么是驱动?

我们写的驱动程序,编译出来的ko是驱动

驱动是用来控制设备的,驱动需要匹配对应的设备, 鼠标的驱动控制鼠标,lcd的驱动控制lcdc, gpu的驱动控制gpu.

 

insmod的时候发生了什么?

insmod的时候会加载我们写的驱动,并执行我们写的xx_init函数,在rmmod的时候执行我们的xx_exit函数

 

为什么单靠dts就可以控制某些的driver的加载,无需手动去insmod?

在linux内核启动过程中,当驱动程序的driver->name与dts中的某个节点(设备)的compatible完全对应,就会调用该驱动的probe函数。通俗的说,在内核启动解析dtb的时候,会去找每一个dtb的设备节点的compatible字段是否与内核中的某个driver的name的symbol对应的上,如果对应的上,这个driver的代码就会得到执行。这里需要注意,要把driver移植成platform driver才会有probe函数去注册,才能享受dts等优点。

 

驱动中的class是什么概念?

在/sys下面有一个class目录,该目录下包含所有注册在kernel的设备类型,每个设备类型表达具有一种功能的设备,每个设备类型子目录下面是具体设备的符号链接,指向/sys/devices/下的具体设备。设备类型和设备并不是一一对应的。

class,是设备类,完全是抽象出来的概念,没有对应的实体。所谓设备类,是指提供的用户接口相似的一类设备的集合,常见的设备类的有block、tty、input、usb等等。

看一下具体的数据结构:

    struct class {  
        const char      *name;  
        struct module       *owner;  
      
        struct class_attribute      *class_attrs;  
        struct device_attribute     *dev_attrs;  
        struct kobject          *dev_kobj;  
      
        int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);  
        char *(*devnode)(struct device *dev, mode_t *mode);  
      
        void (*class_release)(struct class *class);  
        void (*dev_release)(struct device *dev);  
      
        int (*suspend)(struct device *dev, pm_message_t state);  
        int (*resume)(struct device *dev);  
      
        const struct dev_pm_ops *pm;  
      
        struct class_private *p;  
    };  

这篇博客讲得很好,引用一下:https://www.cnblogs.com/xinghuo123/p/12872037.html

 

posted on 2022-04-29 21:02  疾速瓜牛  阅读(127)  评论(0编辑  收藏  举报

导航