嵌入式linux平台设备驱动(设备驱动模型)开发之linux内核中bus总线

时间:2021-11-19 17:56:21

linux内核中的bus(总线)

1.背景描述

在linux内核2.6以后的版本引入一种全新的linux外部设备驱动框架:设备和设备驱动模型,在设备和设备驱动的模型之下,需要涉及几种数据结构体,用struct device来表示设备,struct dirver表示设备驱动,以及用struct bus_type表示的总线。

2.总线的概念以及相关的描述

概念:总线是计算机系统一个非常重要的概念,是处理器和计算机外设的通信通道。在linux内中的总线也是指处理器与外设之间的通信通道。在计算机系统中常见的总线有usb总线,pci总线,系统总线。但是在linux 2.6版本之后的设备和设备驱动模型的架构之中,所有的设备和设备驱动都是挂在在相应的总线上,以便管理和提高效率,常见的总线有usb总线,pci总线,iic总线,审spi总线,can总线,platform总线等,usb设备挂在usb总线上,pci设备挂在pci总线,iic设备挂在iic总线上,spi设备挂在spi总线之上。然而对于那些直接挂在系统总线上,直接和处理器进行通信的设备,linux内核提出一个非常重要的概念平台总线,许多人理解为虚拟的总线,它实际属于虚拟总线。挂在在平台总线的设备称为平台设备,即直接挂在系统总线上的设备。
linux内核用struct bus_type来表示总线,详细如下 struct bus_type  {
const char *name;
struct bus_attribute*bus_attrs;
struct device_attribute*dev_attrs;
struct driver_attribute*drv_attrs;

int (*match)(struct device *dev, struct device_driver *drv);
int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
int (*probe)(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);

const struct dev_pm_ops *pm;

struct subsys_private *p;
};
总要的成员介绍如下:name:总线名称
match:总线的match函数,在注册一个外部设备或则具体的外设驱动到具体总线上,回调该match函数来对设备和设备驱动进行相应的匹配,具体的匹配过程以后再叙述
struct subsys_private {
struct kset subsys;
struct kset *devices_kset;


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 list_head class_interfaces;
struct kset glue_dirs;
struct mutex class_mutex;
struct class *class;
};
struct klist klist_devices:设备注册成功之后,加载到总线的设备链表之中 struct klist klist_drivers;设备驱动注册挂在总线之上后,将设备驱动加载设备驱动的链表之中

平台总线结构体变量的定义如下: struct bus_type platform_bus_type {   .name = "platform",   .match = platform_match,   ....... };