总线设备驱动模型

2019-07-13 07:25发布

关键字:热插拔,跨平台移植性
随着技术的不断进步,系统的拓扑结构也越来越复杂,对热插拔,跨平台移植性的要求也越来越高,2.4内核已经难以满足嵌入式Linux技术这些需求。为适应这种形势的需要,从Linux 2.6内核开始提供了全新的设备模型。 关键字:总线,驱动和设备
总线:供设备和驱动匹配
驱动:在总线上挂载驱动
设备:在总线上挂载设备 总线模块程序 /*Copyright (c) 2018 Caokaipeng,All rights reserved.*/ #include #include #include #include //匹配设备和驱动的函数 int my_match(struct device *dev,struct device_driver *drv) { //通过设备名字和驱动名字匹配 return !strncmp(dev->kobj.name,drv->name,strlen(drv->name)); } //定义一条总线 struct bus_type my_bus_type = { .name = "my_bus", .match = my_match, }; //输出符号 EXPORT_SYMBOL(my_bus_type); int my_bus_init() { int ret; //注册总线 ret = bus_register(&my_bus_type); return ret; } void my_bus_exit() { //注销总线 bus_unregister(&my_bus_type); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("CaoKaipeng"); MODULE_DESCRIPTION("bus driver"); MODULE_VERSION("V1.0"); module_init(my_bus_init); module_exit(my_bus_exit); 驱动模块程序 /*Copyright (c) 2018 Caokaipeng,All rights reserved.*/ #include #include #include #include //外部变量总线描述结构my_bus_type extern struct bus_type my_bus_type; //probe函数 int my_probe(struct device *dev) { printk(KERN_WARNING"Driver find the device can be handled! "); return 0; } //定义一个驱动 struct device_driver my_driver = { .name = "my_dev", .bus = &my_bus_type, .probe = my_probe, }; int my_driver_init() { int ret; //注册驱动 ret = driver_register(&my_driver); return ret; } void my_driver_exit() { //注销驱动 driver_unregister(&my_driver); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("CaoKaipeng"); MODULE_DESCRIPTION("bus driver"); MODULE_VERSION("V1.0"); module_init(my_driver_init); module_exit(my_driver_exit); 设备模块程序 /*Copyright (c) 2018 Caokaipeng,All rights reserved.*/ #include #include #include #include //外部变量总线描述结构my_bus_type extern struct bus_type my_bus_type; //定义一个device描述结构 struct device my_device = { .init_name = "my_dev", .bus = &my_bus_type, }; int my_device_init() { int ret; //注册设备 ret = device_register(&my_device); return ret; } void my_device_exit() { //注销设备 device_unregister(&my_device); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("CaoKaipeng"); MODULE_DESCRIPTION("bus driver"); MODULE_VERSION("V1.0"); module_init(my_device_init); module_exit(my_device_exit); 总结
先创建总线,再加载驱动,最后加载设备时,会调用总线模块的match函数来匹配设备和驱动,匹配成功则调用驱动的probe函数。
这里写图片描述 先创建总线,再加载设备,最后加载驱动时,也会调用总线模块的match函数来匹配设备和驱动,匹配成功则调用驱动的probe函数。
这里写图片描述 ————————————
2018.02.08
0:16