linux总线对象bus_type
来源:互联网 发布:大数据课程体系 编辑:程序博客网 时间:2024/05/20 00:50
linux总线对象bus_type
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 bus_type_private *p; //管理总线上的设备与驱动};struct bus_type_private { struct kset subsys; //总线的kset struct kset *drivers_kset; //驱动对象的kset struct kset *devices_kset; //设备对象的kset struct klist klist_devices; struct klist klist_drivers; struct blocking_notifier_head bus_notifier; unsigned int drivers_autoprobe:1; struct bus_type *bus;};//注册总线/base/bus.cint __init buses_init(void){ bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL); if (!bus_kset) return -ENOMEM; return 0;}int bus_register(struct bus_type *bus){ priv = kzalloc(sizeof(struct bus_type_private), GFP_KERNEL); priv->subsys.kobj.kset = bus_kset; priv->subsys.kobj.ktype = &bus_ktype; //kobject_type retval = kobject_set_name(&priv->subsys.kobj, "%s", bus->name); retval = kset_register(&priv->subsys); //注册subsys的kset retval = bus_create_file(bus, &bus_attr_uevent); //创建 sysbus 的 attr priv->devices_kset = kset_create_and_add("devices", NULL, //创建subsys的kset的driver &priv-subsys.kobj priv->drivers_kset = kset_create_and_add("drivers", NULL, //创建subsys的kset的device &priv->subsys.kobj);}举例:操作总线属性//操作属性文件static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store);#define BUS_ATTR(_name, _mode, _show, _store) \ struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)举例:int bus_register(struct bus_type *bus){ retval = bus_create_file(bus, &bus_attr_uevent); retval = add_probe_files(bus); retval = bus_create_file(bus, &bus_attr_drivers_probe); retval = bus_create_file(bus, &bus_attr_drivers_autoprobe);}static BUS_ATTR(drivers_autoprobe, S_IWUSR | S_IRUGO, show_drivers_autoprobe, store_drivers_autoprobe);#define BUS_ATTR(_name, _mode, _show, _store) \struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)static ssize_t show_drivers_autoprobe(struct bus_type *bus, char *buf){ return sprintf(buf, "%d\n", bus->p->drivers_autoprobe);}static ssize_t store_drivers_autoprobe(struct bus_type *bus, const char *buf, size_t count){ if (buf[0] == '0') bus->p->drivers_autoprobe = 0; else bus->p->drivers_autoprobe = 1; return count;}//应用空间修改attr文件的值 [root@EmbedSky i2c]# cat drivers_autoprobe 1[root@EmbedSky i2c]# echo 0 > drivers_autoprobe[root@EmbedSky i2c]# cat drivers_autoprobe 0
0 0
- linux总线对象bus_type
- Linux总线驱动-02: struct bus_type 结构体
- Linux总线驱动-02: struct bus_type 结构体
- Linux设备模型(总线、设备、驱动程序和类)之一:bus_type
- Linux设备模型(总线、设备、驱动程序和类)之一:bus_type
- Linux设备模型(总线、设备、驱动程序和类)之一:bus_type
- Linux设备模型(总线、设备、驱动程序和类)之一:bus_type
- bus_type
- 设备驱动模型:总线bus_type 设备device 驱动driver
- Linux设备驱动模型 bus_type bus_attribute device driver
- Linux Kernel设备驱动模型之 struct bus_type
- struct bus_type
- struct bus_type
- struct bus_type 结构体
- Linux I2C 总线浅析
- Linux I2C总线驱动程序
- linux SPI总线驱动
- Linux I2C 总线驱动
- 树的基本概念
- 匿名内部类访问外部类中的局部变量必须是final属性
- IEEE 802.15.4协议完整中文版 - 4.1 通用描述
- @Repository、@Service、@Controller 和 @Component
- ACM 数论 HDU 2608 0 or 1 规律!
- linux总线对象bus_type
- poj2506Tiling
- 博客第一篇:C语言处理动态数组
- 生活感悟
- mac 下 MyEclipse 2015 安装并且激活
- ACM 数论 HDU1215 七夕节 (模板!)
- Android学习(54) -- 多线程下载 原理和代码
- 基于PHP的sso单点登录实例
- adb无线调试