关键字:热插拔,跨平台移植性
随着技术的不断进步,系统的拓扑结构也越来越复杂,对热插拔,跨平台移植性的要求也越来越高,2.4内核已经难以满足嵌入式Linux技术这些需求。为适应这种形势的需要,从Linux 2.6内核开始提供了全新的设备模型。
关键字:总线,驱动和设备
总线:供设备和驱动匹配
驱动:在总线上挂载驱动
设备:在总线上挂载设备
总线模块程序
#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);
驱动模块程序
#include
#include
#include
#include
extern struct bus_type my_bus_type;
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);
设备模块程序
#include
#include
#include
#include
extern struct bus_type my_bus_type;
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