首页 > 系统相关 >Linux平台总线

Linux平台总线

时间:2023-12-24 14:57:11浏览次数:45  
标签:struct bus 平台 总线 dev drv Linux device driver

linux drv和 dev都会注册进总线的链表,如果设备和驱动匹配,调用驱动程序的probe函数

image-20230817100007702

总线类型:bus_type

代码分析:

  1. 注册drv

    image-20230817100147811

举例说明:

分析注册一个平台drv

driver_register(&drv->driver)
	bus_add_driver(struct device_driver *drv)
		klist_add_tail(&priv->knode_bus, &bus->p->klist_drivers)		/* 把这个drv添加进bus的链表中(bus->p->klist_drivers) */
		driver_attach(struct device_driver *drv)
			bus_for_each_dev(drv->bus, NULL, drv, __driver_attach)  /* 对于bus中的每一个dev执行 __driver_attach 函数 */
			/* bus_for_each_dev 会拿到bus链表中的每一个dev结构体 */
			__driver_attach(struct device *dev, void *data)
				driver_match_device(drv, dev)	/* dev和drv的匹配函数,返回0表示匹配失败 */
					driver_probe_device(struct device_driver *drv, struct device *dev)
						really_probe(struct device *dev, struct device_driver *drv)	/* 真正的枚举,说明已经匹配到了 */
						dev->driver = drv;		/* 说明已经有drv适配这个dev了,后续dev分析的时候,会来判断这个设备是否已经有驱动支持了 */
							drv->probe(dev)

从bus->p->klist_devices这个链表中取dev,那么谁给这个链表添加dev的?

在注册设备的时候添加klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices)

  1. 注册dev

同样的例子:

platform_device_register(struct platform_device *pdev)
	platform_device_add(struct platform_device *pdev)
	pdev->dev.bus = &platform_bus_type;		/* 表示这个dev的总线是平台总线类型 */
	switch (pdev->id)  /* 根据 pdev->id 来判断在/sys/class/dev/下面的名字 */
		device_add(&pdev->dev)
			bus_add_device(dev)
			klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices)		/* 把这个dev添加进bus->p->klist_devices链表,上面有提过 */
				bus_probe_device(struct device *dev)
					device_initial_probe(struct device *dev)
						__device_attach(struct device *dev, bool allow_async)
						bus_for_each_drv(dev->bus, NULL, &data,__device_attach_driver)	/* 对于bus中的每一个drv执行 __device_attach_driver 函数 bus_for_each_drv会从链表中拿到每一个drv结构体 */
						__device_attach_driver(struct device_driver *drv, void *_data)
							if (dev->driver)		/* 如果这个设备已经有驱动了,就返回,不用在去匹配过程了 */
								return -EBUSY;		/* 在之前really_probe函数下,已经标记了这个设备支持的驱动了,由此可见,一个dev最多只能适配一个drv,但是会从drv链表中取出每个drv来匹配,所以无论是先注册dev还是drv都没有关系,因为总是每个都取出来匹配的,只是这个dev匹配到了支持的drv,就不会匹配其他的了 */
								driver_probe_device(drv, dev);
									really_probe(dev, drv);

这里又是取出bus链表中每一个drv的结构体,谁给这个链表添加drv的?

在注册drv的时候添加klist_add_tail(&priv->knode_bus, &bus->p->klist_drivers)

标签:struct,bus,平台,总线,dev,drv,Linux,device,driver
From: https://www.cnblogs.com/yangdh/p/17924390.html

相关文章

  • 新中源台湾版六仔系统平台安装编译出租的注意方法和处理
    T-G: zy369369在同步的Rust方法中调用异步代码经常会导致一些问题,特别是对于不熟悉异步Rustruntime底层原理的初学者。本人网站有详细介绍多种方法http://www.jizhifuke.com在做GreptimeDB项目的时候,我们遇到一个关于在同步Rust方法中调用异步代码的问题。经过一系列......
  • 将windows上socket的client程序修改到linux上运行
    将windows上客户端程序修改到linux上运行记录一下修改哪些地方编译命令文件夹的内容:包含了client.cppmySocket.cppmySocket.huntil.h链接在一起g++-cclient.cppmySocket.cppuntil.h-std=c++11-pthread使用g++编译器将client.cpp、mySocket.cpp和until.h......
  • linux中文件的特殊权限setgid-setuid-sbit
    1.SetUID一.SetUID的功能SetUID主要是给命令提供一个root权限,就是命令运行时拥有root用户权限,命令运行结束后root权限消失1.只有执行的二进制程序才能设定SUID权限2.命令执行者要对该程序有用x(执行)权限3.命令执行者在执行该程序时获得该程序文件属主(所有者)的身份(在执行程......
  • windows通过 桥接Usb 电缆连接linux 主机并通信的方法
    在Windows上通过USB转串口线连接Linux主机并进行通信,可以参考以下步骤:首先,插入USB转串口线到电脑的USB接口,此时系统会自动识别设备并安装驱动。检查设备管理器的端口(COM和LPT)中是否出现相应的串口信息。启动USB/IP项目以启用常见的开发人员USB场景,例如访问智能卡读取器等。确保你的......
  • Linux安装无线网卡驱动
    您可以通过以下步骤来实现:首先,将Linux安装盘插入电脑的USB接口。打开电脑的BIOS设置,将启动顺序设置为优先从USB设备启动。重启电脑并进入Linux安装界面。在安装过程中,选择“手动分区”选项,然后为Linux系统分配一个适当的分区。接下来,选择“安装Linux内核”选项,并等待安装完成。安装......
  • linux-网络接口的绑定与组合(bond 网桥的创建)
    网络接口的绑定一、虚拟接口将多个网络逻辑接口连接在一起:1、实现冗余、避免故障2、提高吞吐率原理:非在物理网卡上设置、而是通过多个物理网卡聚合成一个虚拟的网卡(外部网络访问的就是本机的虚拟网卡的地址)二、通过networkmanger实现绑定模式balanceactive-backup--......
  • linux 中正则匹配限制词首和词尾
     001、\<或者\b限制词首[root@pc1test]#lsa.txt[root@pc1test]#cata.txt##测试数据010203040506070809101112131415137831204331617181920212223242524332233443262728293031323334353637383940[root@......
  • linux 中 grep命令限制匹配次数
     001、测试数据,,匹配末尾为_一个数字的数据[root@pc1test2]#lsa.txt[root@pc1test2]#cata.txt##测试数据NC_052532.1tRNAscan-SETRNAD-GUC_1NC_052532.1tRNAscan-SETRNAD-GUC_229NC_052532.1tRNAscan-SETRNAS-......
  • linux修改内核参数禁止OOM机制
    Linux内核有个机制叫OOMkiller(Out-Of-Memorykiller),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽,内核会把该进程杀掉,监控是正常的。防止重要的系统进程触发(OOM)机制而被杀死:可以设置参数/proc/PID/oom_adj为-17,临时关闭linux内核的OOM机制......
  • Linux目录结构
    视频地址: https://space.bilibili.com/204411292目录简介在Linux中一切皆文件,这些文件按照一定的规则存放在不同的目录当中。为了能够快速找到文件及以后的操作的规范性,我们必须记清楚Linux的目录结构。Windows以多根的方式组织文件,如C:\D:\E:\,而Linux以单跟/的方式组织文件。......