首页 > 其他分享 >总线类型 【ChatGPT】

总线类型 【ChatGPT】

时间:2023-12-10 13:13:03浏览次数:39  
标签:struct -- bus 总线 类型 ChatGPT type 驱动程序

总线类型

定义

请参阅结构体bus_type的内核文档。

int bus_register(struct bus_type * bus);

声明

内核中的每个总线类型(如PCI、USB等)应该声明一个此类型的静态对象。它们必须初始化name字段,并可以选择初始化match回调函数:

struct bus_type pci_bus_type = {
       .name = "pci",
       .match        = pci_bus_match,
};

该结构体应该在头文件中向驱动程序导出:

extern struct bus_type pci_bus_type;

注册

当总线驱动程序初始化时,它调用bus_register函数。这将初始化总线对象中的其余字段,并将其插入到全局总线类型列表中。一旦总线对象被注册,其中的字段就可以被总线驱动程序使用。

回调函数

match(): 将驱动程序附加到设备

设备ID结构的格式和比较它们的语义在本质上是特定于总线的。驱动程序通常在特定于总线的驱动程序结构中声明支持的设备的设备ID数组。

match回调函数的目的是让总线有机会通过比较驱动程序支持的设备ID与特定设备的设备ID来确定特定驱动程序是否支持特定设备,而不会牺牲总线特定的功能或类型安全性。

当驱动程序与总线注册时,总线的设备列表将被迭代,并且对于每个没有与之关联驱动程序的设备,将调用match回调函数。

设备和驱动程序列表

设备和驱动程序列表旨在替代许多总线保留的本地列表。它们分别是struct devices和struct device_drivers的列表。总线驱动程序可以自由地使用这些列表,但可能需要转换为特定于总线的类型。

LDM核心提供了用于遍历每个列表的辅助函数:

int bus_for_each_dev(struct bus_type * bus, struct device * start,
                     void * data,
                     int (*fn)(struct device *, void *));

int bus_for_each_drv(struct bus_type * bus, struct device_driver * start,
                     void * data, int (*fn)(struct device_driver *, void *));

这些辅助函数遍历相应的列表,并为列表中的每个设备或驱动程序调用回调函数。所有列表访问都通过获取总线的锁(当前为读取锁)进行同步。在调用回调函数之前,列表中每个对象的引用计数都会增加;在获取下一个对象之后,引用计数会减少。在调用回调函数时,不会持有锁。

sysfs

有一个名为“bus”的顶级目录。

每个总线在总线目录中都有一个目录,以及两个默认目录:

/sys/bus/pci/
|-- devices
`-- drivers

在总线注册的驱动程序在总线的驱动程序目录中获得一个目录:

/sys/bus/pci/
|-- devices
`-- drivers
    |-- Intel ICH
    |-- Intel ICH Joystick
    |-- agpgart
    `-- e100

在该类型总线上发现的每个设备都会在总线的设备目录中得到一个符号链接,指向物理层次结构中设备的目录:

/sys/bus/pci/
|-- devices
|   |-- 00:00.0 -> ../../../root/pci0/00:00.0
|   |-- 00:01.0 -> ../../../root/pci0/00:01.0
|   `-- 00:02.0 -> ../../../root/pci0/00:02.0
`-- drivers

导出属性

struct bus_attribute {
      struct attribute        attr;
      ssize_t (*show)(const struct bus_type *, char * buf);
      ssize_t (*store)(const struct bus_type *, const char * buf, size_t count);
};

总线驱动程序可以使用BUS_ATTR_RW宏导出属性,该宏的工作方式类似于DEVICE_ATTR_RW宏用于设备。例如,像这样的定义:

static BUS_ATTR_RW(debug);

等同于声明:

static bus_attribute bus_attr_debug;

然后可以使用以下方式将属性添加到总线的sysfs目录中或从中删除:

int bus_create_file(struct bus_type *, struct bus_attribute *);
void bus_remove_file(struct bus_type *, struct bus_attribute *);

标签:struct,--,bus,总线,类型,ChatGPT,type,驱动程序
From: https://www.cnblogs.com/pengdonglin137/p/17892423.html

相关文章

  • 设备驱动设计模式 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/design-patterns.html设备驱动设计模式这份文档描述了设备驱动中常见的设计模式。子系统维护者可能会要求驱动开发者遵循这些设计模式。状态容器container_of()1.状态容器虽然内核中包含一些设备驱动,假......
  • 设备基本结构 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/device.html设备基本结构请参阅内核文档以了解structdevice的结构。编程接口发现设备的总线驱动程序使用以下方法将设备注册到核心:intdevice_register(structdevice*dev);总线应该初始化以下字段:p......
  • Devres - 管理设备资源 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/devres.htmlDevres-管理设备资源[email protected]首稿日期:2007年1月10日1.简介在尝试将libata转换为使用iomap时,出现了devres。每个iomapped地址应该在驱动程序分离时保留和取消映射。例如,一个普......
  • 驱动绑定 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/binding.html驱动绑定驱动绑定是将设备与能够控制它的设备驱动程序关联起来的过程。通常由总线驱动程序处理这一过程,因为总线特定的结构用于表示设备和驱动程序。使用通用设备和设备驱动程序结构后,大部分绑定可......
  • 硬件自旋锁框架 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/hwspinlock.html硬件自旋锁框架简介硬件自旋锁模块为异构处理器和不在单一共享操作系统下运行的处理器之间的同步和互斥提供硬件辅助。例如,OMAP4具有双核Cortex-A9、双核Cortex-M3和一个C64x+DSP,每个处理器运行不同的操作系......
  • 驱动模型 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/index.htmlDriverModel(驱动程序模型)DriverBinding(驱动绑定)BusTypes(总线类型)DeviceDriverDesignPatterns(设备驱动程序设计模式)TheBasicDeviceStructure(基本设备结构)Devres-ManagedDeviceResou......
  • percpu 读写信号量 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/percpu-rw-semaphore.html"Percpurwsemaphores"是一种新的读写信号量设计,针对读取操作进行了优化。传统的读写信号量存在一个问题,即当多个核心获取读取锁时,包含信号量的缓存行在各个核心的L1缓存之间反复传输,导致性能下降......
  • 保持内核代码的可抢占安全 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/preempt-locking.html在可抢占内核下的适当锁定:保持内核代码的可抢占安全作者[email protected]介绍可抢占内核会引发新的锁定问题。这些问题与SMP下的问题相同:并发性和可重入性。幸运的是,Linux可抢占内核模型利......
  • 序列计数器和顺序锁 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/seqlock.html#序列计数器和顺序锁介绍序列计数器是一种具有无锁读取器(只读重试循环)和无写入者饥饿的读者-写者一致性机制。它们用于很少写入数据的情况(例如系统时间),其中读者希望获得一致的信息集,并且愿意在信息发生变化时重试......
  • 锁定课程 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/spinlocks.html锁定课程课程1:自旋锁用于锁定的最基本原语是自旋锁:staticDEFINE_SPINLOCK(xxx_lock);unsignedlongflags;spin_lock_irqsave(&xxx_lock,flags);...临界区域...spin_unlock_irqrestore(&xxx_lock,fl......