linux--bus驱动-初级--只实现bus总线程序模块设计

总线:是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部虚拟的“platform”总线。。。。要使用到的头文件<linux/device.h>'

总线描述结构体:

struct bus_type {
const char*name;//名称
struct bus_attribute*bus_attrs;//总线属性
struct device_attribute*dev_attrs;//设备属性
struct driver_attribute*drv_attrs;//驱动属性


int (*match)(struct device *dev, struct device_driver *drv);//匹配函数

int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
int (*probe)(struct device *dev);
int (*remove)(struct device *dev);
void (*shutdown)(struct device *dev);


int (*suspend)(struct device *dev, pm_message_t state);
int (*resume)(struct device *dev);


const struct dev_pm_ops *pm;


struct subsys_private *p;
};

总线的使用方法:

1、首先要注册 总线 使用的函数是---::

bus_register(struct bus_type *bus)

若成功,则将总线添加到系统中去,并可以在/sys/bus下看到

总线删除函数

bus_unregister(struct bus_type *bus);

2、创建bus属性--在属性中包含了 读取调用的函数和 写操作是调用的函数

总线属性描述结构体

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

 创建bus属性的函数

bus_create_file(struct bus_type *,struct bus_attribute *);

在创建属性文件的时候要用到 的宏定义

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


#define BUS_ATTR(_name, _mode, _show, _store) \
struct bus_attribute
bus_attr_##_name = __ATTR(_name, _mode, _show, _store);//注意函数的名字是bus_attr_##_name

删除属性的函数:::

bus_remove_file(struct bus_type *, struct bus_attribute *);

稍后贴代码::::::

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

MODULE_AUTHOR("David Xie");
MODULE_LICENSE("Dual BSD/GPL");

static char *Version = "$Revision: 1.0 $";

static int my_match(struct device *dev, struct device_driver *driver)
{
return !strncmp(dev->bus_id, driver->name, strlen(driver->name));
}

struct bus_type my_bus_type = {
.name = "my_bus",
.match = my_match,
};

static ssize_t show_bus_version(struct bus_type *bus, char *buf)
{
return snprintf(buf, PAGE_SIZE, "%s\n", Version);
}

static BUS_ATTR(version, S_IRUGO, show_bus_version, NULL);

static int __init my_bus_init(void)
{
int ret;
        
        /*注册总线*/
ret = bus_register(&my_bus_type);
if (ret)
return ret;

/*创建属性文件*/
if (bus_create_file(&my_bus_type, &bus_attr_version))
printk(KERN_NOTICE "Fail to create version attribute!\n");

return ret;
}

static void my_bus_exit(void)
{
bus_unregister(&my_bus_type);
}

module_init(my_bus_init);
module_exit(my_bus_exit);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值