hello_world-2.2之简单设备驱动模型(一)
写一个最简单的driver,bus,device 来演示驱动模型
1.helloworld-bus.c
#include<linux/module.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/device.h>
#include<linux/kernel.h>
static int virtual_bus_match(struct device *dev,struct device_driver *drv)
{
return !strncmp(dev_name(dev),drv->name,strlen(drv->name));
}
struct bus_type virtual_bus = {
.name = "my_bus",
.match = virtual_bus_match,
};
EXPORT_SYMBOL(virtual_bus);
static int __init bus_init(void)
{
int ret;
ret = bus_register(&virtual_bus);
if(ret)
return ret;
printk("bus register sucess\n");
return ret;
}
static void __exit bus_exit(void)
{
bus_unregister(&virtual_bus);
}
module_init(bus_init);
module_exit(bus_exit);
MODULE_LICENSE("GPL");
2.helloworld_device.c
#include<linux/module.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/device.h>
extern struct bus_type virtual_bus;
extern struct device my_bus;
void virtual_device_release(struct device *dev)
{
printk("virtual_device is release\n");
}
struct device virtual_device ={
.init_name = "my_dev",
.bus = &virtual_bus,
.release = virtual_device_release,
};
static int __init device_init(void)
{
int ret;
ret = device_register(&virtual_device);
if(ret)
return ret;
printk("device register sucess\n");
return ret;
}
static void __exit device_exit(void)
{
device_unregister(&virtual_device);
}
module_init(device_init);
module_exit(device_exit);
MODULE_AUTHOR("doublenian.xie@gmail.com");
MODULE_LICENSE("GPL");
3.helloworld_driver.c
#include<linux/module.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/device.h>
#include<linux/kernel.h>
extern struct bus_type virtual_bus;
int my_driver_remove(struct device *dev)
{
printk(KERN_NOTICE "driver is remove\n");
return 0;
}
int my_driver_probe(struct device *dev)
{
printk(KERN_NOTICE "driver can handle the device\n");
return 0;
}
struct device_driver virtual_driver = {
.name = "my_dev",
.bus = &virtual_bus,
.probe = my_driver_probe,
.remove = my_driver_remove,
};
static int __init my_driver_init(void)
{
int ret;
ret = driver_register(&virtual_driver);
if(ret)
return ret;
printk("driver register sucess\n");
return ret;
}
static void __exit my_driver_exit(void)
{
driver_unregister(&virtual_driver);
}
module_init(my_driver_init);
module_exit(my_driver_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("doublenian.xie");
4.Makefile
obj-m += helloworld-device.o helloworld-bus.o helloworld-driver.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean