Linux 设备模型 --- 总线设备驱动模型 --- 设备
2013-05-03 17:48
323 查看
设备模型元素:
1, 总线2, 驱动
3, 设备
下面讲设备;
设备:
设备描述:
Linux 系统中的每个设备由一个 struct device 描述:struct device 结构:
设备 注册 / 注销 device_register device_unregister :
int device_register ( struct device *dev )注册设备;
void device_unregister ( struct device *dev )
注销设备;
一条总线也是个设备,也必须按设备注册;
设备属性 :
struct device_attribute 结构:设备属性使用 struct device_attribute 来描述:
struct device_attribute { struct attribute attr; ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf); ssize_t (*store)(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); };
创建 / 删除 device_create_file device_remove_file :
int device_create_file ( struct device *device , struct device_attribute * entry)
创建属性;
void device_remove_file ( struct device * dev, struct device_attribute * attr )
删除属性;
下面是一个例子,包含两个文件:bus.c 和 device.c
bus.c 文件如下:
#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.9 $"; static int my_match(struct device *dev, struct device_driver *driver) { return !strncmp(dev->bus_id, driver->name, strlen(driver->name)); } static void my_bus_release(struct device *dev) { printk(KERN_DEBUG "my bus release\n"); } struct device my_bus = { .bus_id = "my_bus0", .release = my_bus_release }; struct bus_type my_bus_type = { .name = "my_bus", .match = my_match, }; EXPORT_SYMBOL(my_bus); EXPORT_SYMBOL(my_bus_type); /* * Export a simple attribute. */ 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"); /*注册总线设备*/ ret = device_register(&my_bus); if (ret) printk(KERN_NOTICE "Fail to register device:my_bus!\n"); return ret; } static void my_bus_exit(void) { device_unregister(&my_bus); bus_unregister(&my_bus_type); } module_init(my_bus_init); module_exit(my_bus_exit);
device.c 文件如下:
#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"); extern struct device my_bus; extern struct bus_type my_bus_type; /* Why need this ?*/ static void my_dev_release(struct device *dev) { } struct device my_dev = { .bus = &my_bus_type, .parent = &my_bus, .release = my_dev_release, }; /* * Export a simple attribute. */ static ssize_t mydev_show(struct device *dev, char *buf) { return sprintf(buf, "%s\n", "This is my device!"); } static DEVICE_ATTR(dev, S_IRUGO, mydev_show, NULL); static int __init my_device_init(void) { int ret = 0; /* 初始化设备 */ strncpy(my_dev.bus_id, "my_dev", BUS_ID_SIZE); /*注册设备*/ device_register(&my_dev); /*创建属性文件*/ device_create_file(&my_dev, &dev_attr_dev); return ret; } static void my_device_exit(void) { device_unregister(&my_dev); } module_init(my_device_init); module_exit(my_device_exit);
测试结果:
先 insmod bus.ko ,查看发现 bus 目录下多了 my_bus 目录,再查看 my_bus 下的 devices 目录,发现没有文件;
再加载 insmod device.ko ,
再查看 my_bus 下的 devices 目录,发现有 my_dev 链接文件
相关文章推荐
- linux设备模型之总线,设备,驱动模型
- Linux总线、设备、驱动模型
- Linux总线、设备、驱动模型
- Linux设备模型--总线、驱动、设备、设备类 (相关结构介绍)
- Linux设备模型(总线、设备、驱动程序和类)之三:device_driver && 多厂家驱动自动识别
- Linux总线设备驱动模型相关理论和实例(TQ2440)
- 让天堂的归天堂,让尘土的归尘土——谈Linux的总线、设备、驱动模型
- Linux总线设备驱动模型
- Linux 设备模型 --- 总线设备驱动模型 --- 总线
- Linux的总线、设备、驱动模型
- Linux平台总线驱动设备模型
- Linux平台总线驱动设备模型
- linux平台总线驱动设备模型之点亮LED
- Linux平台总线驱动设备模型
- Linux设备模型中三个很重要的概念: 总线,设备,驱动.即bus,device,driver
- Linux设备模型-总线,设备和驱动
- Linux SPI总线设备驱动模型详解
- Linux设备模型(总线、设备、驱动程序和类)之三:device_driver && 多厂家驱动自动识别
- Linux 内核--总线设备驱动模型(字符/块/网络设备 && platform设备)
- Linux平台总线驱动设备模型