• 【打卡】【Linux 设备管理机制】21天学习挑战赛—RK3399平台开发入门到精通-Day18



    活动地址:CSDN21天学习挑战赛

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
    想系统/深入学习某技术知识点…
    一个人摸索学习很难坚持,想组团高效学习…
    想写博客但无从下手,急需写作干货注入能量…
    热爱写作,愿意让自己成为更好的人…

    续-Linux 设备管理机制:

    1.设备驱动模型之总线bus

    kernel/include/linux/device.h
    总线不仅仅是组织设备和驱动的容器,还是同类设备的共有功能的抽象层。即可以是实际的总线如i2c,spi等也可以是虚拟的如platform总线。

    struct bus_type结构体管理挂载在该bus下的device和device_driver,负责它们的match、probe的等工作。

    其中管理device和device_driver的功能独立出来成为一个子系统叫做subsys_private,它除了管理该bus下的设备和设备驱动还用于处理bus、device和device_driver的一些默认属性(公共属性)和uevent事件等。

    /**
     * struct bus_type - The bus type of the device
     *
     * @name:   The name of the bus.
     * @dev_name:   Used for subsystems to enumerate devices like ("foo%u", dev->id).
     * @dev_root:   Default device to use as the parent.
     * @bus_groups: Default attributes of the bus.
     * @dev_groups: Default attributes of the devices on the bus.
     * @drv_groups: Default attributes of the device drivers on the bus.
     * @match:  Called, perhaps multiple times, whenever a new device or driver
     *      is added for this bus. It should return a positive value if the
     *      given device can be handled by the given driver and zero
     *      otherwise. It may also return error code if determining that
     *      the driver supports the device is not possible. In case of
     *      -EPROBE_DEFER it will queue the device for deferred probing.
     * @uevent: Called when a device is added, removed, or a few other things
     *      that generate uevents to add the environment variables.
     * @probe:  Called when a new device or driver add to this bus, and callback
     *      the specific driver's probe to initial the matched device.
     * @sync_state: Called to sync device state to software state after all the
     *      state tracking consumers linked to this device (present at
     *      the time of late_initcall) have successfully bound to a
     *      driver. If the device has no consumers, this function will
     *      be called at late_initcall_sync level. If the device has
     *      consumers that are never bound to a driver, this function
     *      will never get called until they do.
     * @remove: Called when a device removed from this bus.
     * @shutdown:   Called at shut-down time to quiesce the device.
     *
     * @online: Called to put the device back online (after offlining it).
     * @offline:    Called to put the device offline for hot-removal. May fail.
     *
     * @suspend:    Called when a device on this bus wants to go to sleep mode.
     * @resume: Called to bring a device on this bus out of sleep mode.
     * @num_vf: Called to find out how many virtual functions a device on this
     *      bus supports.
     * @dma_configure:  Called to setup DMA configuration on a device on
     *          this bus.
     * @pm:     Power management operations of this bus, callback the specific
     *      device driver's pm-ops.
     * @iommu_ops:  IOMMU specific operations for this bus, used to attach IOMMU
     *              driver implementations to a bus and allow the driver to do
     *              bus-specific setup
     * @p:      The private data of the driver core, only the driver core can
     *      touch this.
     * @lock_key:   Lock class key for use by the lock validator
     * @need_parent_lock:   When probing or removing a device on this bus, the
     *          device core should lock the device's parent.
     *
     * A bus is a channel between the processor and one or more devices. For the
     * purposes of the device model, all devices are connected via a bus, even if
     * it is an internal, virtual, "platform" bus. Buses can plug into each other.
     * A USB controller is usually a PCI device, for example. The device model
     * represents the actual connections between buses and the devices they control.
     * A bus is represented by the bus_type structure. It contains the name, the
     * default attributes, the bus' methods, PM operations, and the driver core's
     * private data.
     */
    struct bus_type {
    	/* 总线名称*/
        const char      *name;
        /* 总线对应设备名称 */
        const char      *dev_name;
        /* 该总线对应的device */
        struct device       *dev_root;
        /* 总线属性 */
        const struct attribute_group **bus_groups;
        /* 设备属性 */
        const struct attribute_group **dev_groups;
        /* 驱动属性 */
        const struct attribute_group **drv_groups;
    
    	/* match接口,用于进行device与driver的匹配 */
        int (*match)(struct device *dev, struct device_driver *drv);
        /* uevent接口,用于发送kobject event,供应用层mdev/udev使用 */
        int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
        /* 总线的probe接口,该接口会调用具体驱动的probe接口 */
        int (*probe)(struct device *dev);
        void (*sync_state)(struct device *dev);
        /* 总线的remove接口,一般该接口主要是调用具体驱动的remove接口 */
        int (*remove)(struct device *dev);
        void (*shutdown)(struct device *dev);
    
        int (*online)(struct device *dev);
        int (*offline)(struct device *dev);
    
        int (*suspend)(struct device *dev, pm_message_t state);
        int (*resume)(struct device *dev);
    
        int (*num_vf)(struct device *dev);
    
        int (*dma_configure)(struct device *dev);
    
        const struct dev_pm_ops *pm;
    
        const struct iommu_ops *iommu_ops;
    	
    	/* 该接口包含了该bus对应的kobject、device对应的kset、driver对应的kset,链接了所有设备的链表,链接了所有驱动的链表等 */
        struct subsys_private *p;
        struct lock_class_key lock_key;
    
        bool need_parent_lock;
    
        ANDROID_KABI_RESERVE(1);
        ANDROID_KABI_RESERVE(2);
        ANDROID_KABI_RESERVE(3);
        ANDROID_KABI_RESERVE(4);
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109

    kernel/drivers/base/base.h

    /**
     * struct subsys_private - structure to hold the private to the driver core portions of the bus_type/class structure.
     *
     * @subsys - the struct kset that defines this subsystem
     * @devices_kset - the subsystem's 'devices' directory
     * @interfaces - list of subsystem interfaces associated
     * @mutex - protect the devices, and interfaces lists.
     *
     * @drivers_kset - the list of drivers associated
     * @klist_devices - the klist to iterate over the @devices_kset
     * @klist_drivers - the klist to iterate over the @drivers_kset
     * @bus_notifier - the bus notifier list for anything that cares about things
     *                 on this bus.
     * @bus - pointer back to the struct bus_type that this structure is associated
     *        with.
     *
     * @glue_dirs - "glue" directory to put in-between the parent device to
     *              avoid namespace conflicts
     * @class - pointer back to the struct class that this structure is associated
     *          with.
     *
     * This structure is the one that is the actual kobject allowing struct
     * bus_type/class to be statically allocated safely.  Nothing outside of the
     * driver core should ever touch these fields.
     */
    struct subsys_private {
        struct kset subsys;	//定义这个子系统结构的kset
        struct kset *devices_kset; //该总线的“设备”目录,包含所有的设备
        struct list_head interfaces; //总线相关接口的列表
        struct mutex mutex; //锁,保护设备和接口列表
    
        struct kset *drivers_kset; //该总线的“驱动” 目录,保护所有的驱动
        struct klist klist_devices; //挂载总线上的所有设备的可迭代链表
        struct klist klist_drivers; //挂载总线上所有驱动的可迭代链表
        struct blocking_notifier_head bus_notifier; 
        unsigned int drivers_autoprobe:1;
        struct bus_type *bus; //指向所属总线
    
        struct kset glue_dirs;
        struct class *class; //指向这个结构所关联类结构的指针
    };
    
    /* 通过kobject找到对应的subsys_private */
    #define to_subsys_private(obj) container_of(obj, struct subsys_private, subsys.kobj)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    通过上面两个重要的数据结构可以看出总线bus是如何管理设备device和设备驱动device_driver的。
    subsys_private结构是总线的驱动核心的私有数据,它下面有两个链表一个用于挂载设备device,一个用于挂载设备驱动device_driver,从而实现总线bus对设备device和设备驱动device_driver的管理。
    在这里插入图片描述

    2.设备驱动模型之设备device

    struct device 数据结构用于抽象设备,Linux系统下挂载的各种设备最终都是通过struct device结构体来描述,其中dts里定义的很多节点最终也都会转换为device数据结构,用于描述一个设备信息,管理设备用到的各种资源等。

    关于bus、device、device_driver三者,对于device,其中一个重要结构即是struct device_private,它
    下面一个重要结构device_private中的成员knode_bus就是用于挂载到bus下的subsys_private结构中的klist_devices。

    kernel/include/linux/device.h

    /**
     * struct device - The basic device structure
     * @parent: The device's "parent" device, the device to which it is attached.
     *      In most cases, a parent device is some sort of bus or host
     *      controller. If parent is NULL, the device, is a top-level device,
     *      which is not usually what you want.
     * @p:      Holds the private data of the driver core portions of the device.
     *      See the comment of the struct device_private for detail.
     * @kobj:   A top-level, abstract class from which other classes are derived.
     * @init_name:  Initial name of the device.
     * @type:   The type of device.
     *      This identifies the device type and carries type-specific
     *      information.
     * @mutex:  Mutex to synchronize calls to its driver.
     * @bus:    Type of bus device is on.
     * @driver: Which driver has allocated this
     * @platform_data: Platform data specific to the device.
     *      Example: For devices on custom boards, as typical of embedded
     *      and SOC based hardware, Linux often uses platform_data to point
     *      to board-specific structures describing devices and how they
     *      are wired.  That can include what ports are available, chip
     *      variants, which GPIO pins act in what additional roles, and so
     *      on.  This shrinks the "Board Support Packages" (BSPs) and
     *      minimizes board-specific #ifdefs in drivers.
     * @driver_data: Private pointer for driver specific info.
     * @links:  Links to suppliers and consumers of this device.
     * @power:  For device power management.
     *      See Documentation/driver-api/pm/devices.rst for details.
     * @pm_domain:  Provide callbacks that are executed during system suspend,
     *      hibernation, system resume and during runtime PM transitions
     *      along with subsystem-level and driver-level callbacks.
     * @pins:   For device pin management.
     *      See Documentation/driver-api/pinctl.rst for details.
     * @msi_list:   Hosts MSI descriptors
     * @msi_domain: The generic MSI domain this device is using.
     * @numa_node:  NUMA node this device is close to.
     * @dma_ops:    DMA mapping operations for this device.
     * @dma_mask:   Dma mask (if dma'ble device).
     * @coherent_dma_mask: Like dma_mask, but for alloc_coherent mapping as not all
     *      hardware supports 64-bit addresses for consistent allocations
     *      such descriptors.
     * @bus_dma_mask: Mask of an upstream bridge or bus which imposes a smaller DMA
     *      limit than the device itself supports.
     * @dma_pfn_offset: offset of DMA memory range relatively of RAM
     * @dma_parms:  A low level driver may set these to teach IOMMU code about
     *      segment limitations.
     * @dma_pools:  Dma pools (if dma'ble device).
     * @dma_mem:    Internal for coherent mem override.
     * @cma_area:   Contiguous memory area for dma allocations
     * @archdata:   For arch-specific additions.
     * @of_node:    Associated device tree node.
     * @fwnode: Associated device node supplied by platform firmware.
     * @devt:   For creating the sysfs "dev".
     * @id:     device instance
     * @devres_lock: Spinlock to protect the resource of the device.
     * @devres_head: The resources list of the device.
     * @knode_class: The node used to add the device to the class list.
     * @class:  The class of the device.
     * @groups: Optional attribute groups.
     * @release:    Callback to free the device after all references have
     *      gone away. This should be set by the allocator of the
     *      device (i.e. the bus driver that discovered the device).
     * @iommu_group: IOMMU group the device belongs to.
     * @iommu_fwspec: IOMMU-specific properties supplied by firmware.
     *
     * @offline_disabled: If set, the device is permanently online.
     * @offline:    Set after successful invocation of bus type's .offline().
     * @of_node_reused: Set if the device-tree node is shared with an ancestor
     *              device.
     * @state_synced: The hardware state of this device has been synced to match
     *        the software state of this device by calling the driver/bus
     *        sync_state() callback.
     *
     * At the lowest level, every device in a Linux system is represented by an
     * instance of struct device. The device structure contains the information
     * that the device model core needs to model the system. Most subsystems,
     * however, track additional information about the devices they host. As a
     * result, it is rare for devices to be represented by bare device structures;
     * instead, that structure, like kobject structures, is usually embedded within
     * a higher-level representation of the device.
     */
    struct device {
        struct device       *parent;
    
        struct device_private   *p;
    
        struct kobject kobj;
        const char      *init_name; /* initial name of the device */
        const struct device_type *type;
    
        struct mutex        mutex;  /* mutex to synchronize calls to
                         * its driver.
                         */
    
        struct bus_type *bus;       /* type of bus device is on */
        struct device_driver *driver;   /* which driver has allocated this
                           device */
        void        *platform_data; /* Platform specific data, device
                           core doesn't touch it */
        void        *driver_data;   /* Driver data, set and get with
                           dev_set/get_drvdata */
        struct dev_links_info   links;
        struct dev_pm_info  power;
        struct dev_pm_domain    *pm_domain;
    
    #ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
        struct irq_domain   *msi_domain;
    #endif
    #ifdef CONFIG_PINCTRL
        struct dev_pin_info *pins;
    #endif
    #ifdef CONFIG_GENERIC_MSI_IRQ
        struct list_head    msi_list;
    #endif
    
    #ifdef CONFIG_NUMA
        int     numa_node;  /* NUMA node this device is close to */
    #endif
        const struct dma_map_ops *dma_ops;
        u64     *dma_mask;  /* dma mask (if dma'able device) */
        u64     coherent_dma_mask;/* Like dma_mask, but for
                             alloc_coherent mappings as
                             not all hardware supports
                             64 bit addresses for consistent
                             allocations such descriptors. */
        u64     bus_dma_mask;   /* upstream dma_mask constraint */
        unsigned long   dma_pfn_offset;
    
        struct device_dma_parameters *dma_parms;
    
        struct list_head    dma_pools;  /* dma pools (if dma'ble) */
    
        struct dma_coherent_mem *dma_mem; /* internal for coherent mem
                             override */
    #ifdef CONFIG_DMA_CMA
        struct cma *cma_area;       /* contiguous memory area for dma
                           allocations */
    #endif
        struct removed_region *removed_mem;
        /* arch specific additions */
        struct dev_archdata archdata;
    
        struct device_node  *of_node; /* associated device tree node */
        struct fwnode_handle    *fwnode; /* firmware device node */
    
        dev_t           devt;   /* dev_t, creates the sysfs "dev" */
        u32         id; /* device instance */
    
        spinlock_t      devres_lock;
        struct list_head    devres_head;
    
        struct klist_node   knode_class;
        struct class        *class;
        const struct attribute_group **groups;  /* optional groups */
    
        void    (*release)(struct device *dev);
        struct iommu_group  *iommu_group;
        struct iommu_fwspec *iommu_fwspec;
    
        bool            offline_disabled:1;
        bool            offline:1;
        bool            of_node_reused:1;
        bool            state_synced:1;
    
        ANDROID_KABI_RESERVE(1);
        ANDROID_KABI_RESERVE(2);
        ANDROID_KABI_RESERVE(3);
        ANDROID_KABI_RESERVE(4);
        ANDROID_KABI_RESERVE(5);
        ANDROID_KABI_RESERVE(6);
        ANDROID_KABI_RESERVE(7);
        ANDROID_KABI_RESERVE(8);
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174

    kernel/drivers/base/base.h

    /**
     * struct device_private - structure to hold the private to the driver core portions of the device structure.
     *
     * @klist_children - klist containing all children of this device
     * @knode_parent - node in sibling list
     * @knode_driver - node in driver list
     * @knode_bus - node in bus list
     * @deferred_probe - entry in deferred_probe_list which is used to retry the
     *  binding of drivers which were unable to get all the resources needed by
     *  the device; typically because it depends on another driver getting
     *  probed first.
     * @async_driver - pointer to device driver awaiting probe via async_probe
     * @device - pointer back to the struct device that this structure is
     * associated with.
     * @dead - This device is currently either in the process of or has been
     *  removed from the system. Any asynchronous events scheduled for this
     *  device should exit without taking any action.
     *
     * Nothing outside of the driver core should ever touch these fields.
     */
    struct device_private {
        struct klist klist_children;
        struct klist_node knode_parent;
        struct klist_node knode_driver;
        struct klist_node knode_bus;
        struct list_head deferred_probe;
        struct device_driver *async_driver;
        struct device *device;
        u8 dead:1;
    };
    #define to_device_private_parent(obj)   \
        container_of(obj, struct device_private, knode_parent)
    #define to_device_private_driver(obj)   \
        container_of(obj, struct device_private, knode_driver)
    #define to_device_private_bus(obj)  \
        container_of(obj, struct device_private, knode_bus)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    3.设备驱动模型之驱动driver

    大家都知道Linux驱动中总线、设备、设备驱动是分离的,对于device_driver数据结构用于描述对struct device结构体描述的设备的驱动方法,即你知道了设备是啥,你怎么去使用操作它,这就是设备驱动。比如对通信协议的实现,对控制器的操作等。这样设备和设备驱动实现分离单独管理,而设备和驱动分离后两者怎么协调合伙工作?即是有总线bus完成,因为它们都挂载在总线bus上,device_driver是用户需要编写的具体操作设备的方法和流程。同样struct device_driver结构体下的driver_private的knode_bus用于链接到struct bus_type下的subsys_private结构体中的klist_drivers。

    kernel/include/linux/device.h

    /**
     * struct device_driver - The basic device driver structure
     * @name:   Name of the device driver.
     * @bus:    The bus which the device of this driver belongs to.
     * @owner:  The module owner.
     * @mod_name:   Used for built-in modules.
     * @suppress_bind_attrs: Disables bind/unbind via sysfs.
     * @probe_type: Type of the probe (synchronous or asynchronous) to use.
     * @of_match_table: The open firmware table.
     * @acpi_match_table: The ACPI match table.
     * @probe:  Called to query the existence of a specific device,
     *      whether this driver can work with it, and bind the driver
     *      to a specific device.
     * @sync_state: Called to sync device state to software state after all the
     *      state tracking consumers linked to this device (present at
     *      the time of late_initcall) have successfully bound to a
     *      driver. If the device has no consumers, this function will
     *      be called at late_initcall_sync level. If the device has
     *      consumers that are never bound to a driver, this function
     *      will never get called until they do.
     * @remove: Called when the device is removed from the system to
     *      unbind a device from this driver.
     * @shutdown:   Called at shut-down time to quiesce the device.
     * @suspend:    Called to put the device to sleep mode. Usually to a
     *      low power state.
     * @resume: Called to bring a device from sleep mode.
     * @groups: Default attributes that get created by the driver core
     *      automatically.
     * @pm:     Power management operations of the device which matched
     *      this driver.
     * @coredump:   Called when sysfs entry is written to. The device driver
     *      is expected to call the dev_coredump API resulting in a
     *      uevent.
     * @p:      Driver core's private data, no one other than the driver
     *      core can touch this.
     *
     * The device driver-model tracks all of the drivers known to the system.
     * The main reason for this tracking is to enable the driver core to match
     * up drivers with new devices. Once drivers are known objects within the
     * system, however, a number of other things become possible. Device drivers
     * can export information and configuration variables that are independent
     * of any specific device.
     */
    struct device_driver {
    	/* 驱动名称 */
        const char      *name;
        /* 该驱动所依附的总线 */
        struct bus_type     *bus;
    	/* 该驱动所属module */
        struct module       *owner;
        /* 模块的名称 */
        const char      *mod_name;  /* used for built-in modules */
    
        bool suppress_bind_attrs;   /* disables bind/unbind via sysfs */
        enum probe_type probe_type;
    
    	/* 设备树使用的设备id */
        const struct of_device_id   *of_match_table;
        const struct acpi_device_id *acpi_match_table;
    
    	/* 该驱动的探测接口 */
        int (*probe) (struct device *dev);
        void (*sync_state)(struct device *dev);
        /* 该驱动的探测移除接口 */
        int (*remove) (struct device *dev);
    
    	/* 该驱动主要对应电源管理方面的接口 */
        void (*shutdown) (struct device *dev);
        int (*suspend) (struct device *dev, pm_message_t state);
        int (*resume) (struct device *dev);
        /* 该驱动所相关的属性接口,主要用于与sysfs模块管理 */
        const struct attribute_group **groups;
    
    	/* 性能管理相关的内容 */
        const struct dev_pm_ops *pm;
        void (*coredump) (struct device *dev);
    
    	/* 该驱动模块相关的私有变量,主要包括驱动对应的kobject、所属模块的kobject等 */
        struct driver_private *p;
    
        ANDROID_KABI_RESERVE(1);
        ANDROID_KABI_RESERVE(2);
        ANDROID_KABI_RESERVE(3);
        ANDROID_KABI_RESERVE(4);
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86

    kernel/drivers/base/base.h

    struct driver_private {
        struct kobject kobj;
        struct klist klist_devices;
        struct klist_node knode_bus;
        struct module_kobject *mkobj;
        struct device_driver *driver;
    };
    #define to_driver(obj) container_of(obj, struct driver_private, kobj)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    卷积神经网络 图像处理,卷积神经网络识别图片
    【校招VIP】前端布局模块之Flex弹性布局
    茶百道:门店数量狂飙,食品安全问题成最大绊脚石
    Win10自带输入法怎么删除-Win10卸载微软输入法的方法
    好看好玩的韩剧电视- 厄运的恋人
    安卓应用开发——Android Studio中关于使用Androidstudio的注意事项
    k8s 常用命令
    Java知识点之单例模式
    【Java SE】第三话·数据类型与变量
    实验送样、数据分析样品、组名命名规范
  • 原文地址:https://blog.csdn.net/qq_23327993/article/details/126450134