13.平台总线专题2

本文详细介绍了Linux驱动程序中设备(device)和驱动(driver)的构建、注册与注销过程,以及总线(bus)匹配的实现。通过自定义device对象,设置匹配方法,并确保driver和device名称一致,实现设备与驱动的自动匹配。同时,文章讨论了在设备卸载时如何避免错误,以及在prob方法中合并数据的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

device的构建和注册

device对象:设备对象,描述设备信息,包括地址,中断号,甚至其他自定义的数据
struct device {
struct kobject kobj;  //所有对象的父类
const char *init_name;
// 在总线中会有一个名字,用于做匹配,在/sys/bus/mybus/devices/名字
struct bus_type *bus; //指向该device对象依附于总线的对象
void *platform_data; // 自定义的数据,指向任何类型数据

注册和注销的方法:
int device_register(struct device *dev)
void device_unregister(struct device *dev)

1.创建mydev.c驱动程序并搭建模块驱动的框架
2.注册和销毁device,注意要在mybus.c中导出mybus
在这里插入图片描述在这里插入图片描述

mybus.c
在这里插入图片描述

3.insmod以后查看ls /sys/bus/mybus/devices

driver的构建和注册

driver对象:描述设备驱动的方法(代码逻辑)
struct device_driver {
const char *name;
// 在总线中会有一个名字,用于做匹配,在/sys/bus/mybus/drivers/名字
struct bus_type *bus;//指向该driver对象依附于总线的对象
int (*probe) (struct device *dev); // 如果device和driver匹配之后,driver要做的事情
int (*remove) (struct device *dev); // 如果device和driver从总线移除之后,driver要做的事情
}
注册和注销:
int driver_register(struct device_driver *drv)
void driver_unregister(struct device_driver *drv)

1.创建mydrv.c
在这里插入图片描述在这里插入图片描述在这里插入图片描述

总线bus匹配的实现

如何实现总线匹配,匹配成功之后会自动调用driver的probe方法:
1, 实现bus对象中 match方法
2, 保证driver和device中名字要一样

1.实现bus对象 中match方法
mybus.c
在这里插入图片描述
2.保证driver和device中名字要一样
mydev.c
在这里插入图片描述
mydrv.c
在这里插入图片描述
3.补充:解决在卸载mydev的时候报错
在这里插入图片描述

driver和device分离和合并的实现

1.自定义设备对象
mydev.c
在这里插入图片描述
2.在驱动中的prob方法中合并数据
在这里插入图片描述

完整代码

mybus.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>

int mybus_match(struct device *dev, struct device_driver *drv)
{
   
   
	if (!strncmp(drv->name, dev->kobj.name, strlen(drv->name)))
	{
   
   
		printk("match ok\n");
		return 1;
	}
	else
	{
   
   
		printk("match failed\n");
		return 0;
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值