华清平台总线(同平台)201207

华清平台总线(同平台)201207

一,struct bus_type
(一)总线对象,描述一个总线,管理device和driver,并且完成匹配动作。
(二)一个结构体,里面有很多成员,但是记住主要的即可。
struct bus_type {
const char *name;
int (*match)(struct device *dev, struct device_driver *drv);
}
(三)注册和注销总线
1,int bus_register(struct bus_type bus); //注册
2,void bus_unregister(struct bus_type bus); //注销(四)当注册了总线之后(运行下例代码),在/sys/bus/中会出现mybus总线,进入到mybus,默认已经出现device和drivers,但是进入device和drivers里面,里面什么东西也没有。
代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
/
/
//实例化一个bus对象
struct bus_type mybus = {
.name = “mybus”;
};

static int _init mybus_init(void)
{
printk("----------%s----------\n", FUNCTION);
//
//构建一个总线
// /sys/bus/mybus/
int ret = bus_register(&mybus);
if(ret != 0)
{
printk(“bus_register error\n”);
return ret;
}
return 0;
}

static void _exit mybus_exit(void)
{
printk("----------%s----------\n", FUNCTION);
void bus_unregister(&mybus);
}
/***/
module_init(mybus_init);
module_exit(mybus_exit);
MODULE_LICENSE(“GPL”);

二,device对象
(一)device对象:设备对象,描述设备信息,包括地址,中断号,甚至其他自定义的数据。
(二)既然描述的是对象的信息,那结构体成员更多的,是描述属性。
struct device{
struct kobject kobj; //所有对象的父类
const char init_name; //在总线中会有一个名字,用于做匹配,在/sys/bus/mybus/devices/名字(以init_name为准)
struct bus_type *bus; //一个device最终要加入总线当中去,此结构体作用是指向该device对象依附于总线的对象(名字)。
void *platform_data; //自定义的数据,(void万能型指针),指向任何类型数据。
}
(三)注册和注销的方法
1,int device_register(struct device *dev);
2,void device_unregister(struct device *dev);
注册与注销的概念其实就是将设备放到总线中去或是移除出来。
代码:

三,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要做的事情
}
struct device_driver结构体同样有描述属性的成员,不单只有描述方法的。
(三)注册和注销
1,int driver_register(struct device_driver *drv)
2,void driver_unregister(struct device_driver *drv)
四,匹配
(一)实现bus对象中的match方法
(二)match函数原型
int (*match) (struct device dev, struct device_driver drv);
{
//如果匹配成功,match方法一定要返回一个-1,失败返回0
/
if(strncmp(drv->name, dev->name))错误写法,不能用init->name,因为代码会自动帮它置空,将值(init_name)交给父类
/
if(strncmp(drv->name, dev->kobj.name),strlen(dev->name))
{
printk(“match ok\n”);
return 1;
}else{
printk(“match failed\n”);
return 0;
}
}
(三)如何实现总线匹配,匹配成功之后会自动调用driver的probe方法:
1,实现bus对象中,match方法;
2,保证driver和device中名字一样
(四)当device或者driver有移除时,不仅driver会执行方法,device也会。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值