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")