1,bus
struct bus_type结构体内容:
匹配函数:match
使用:
struct bus_type my_bus_type{
.match=my_match,
}
匹配:!strncmp(dev->kobj.name,drv->name,strlen(drv->name));
函数返回1,证明匹配成功。
注册总线bus_register(”自己定义的结构体“);
成功返回0;
注销总线bus_unregister("自己定义的结构体“);
把符号导出
EXPORT_SYMBOL("结构体名字”);
注册和删除函数
2,device
引用bus中定义的结构体:
extern struct bus_type leds_bus_type;
定义device设备:
struct device leds_dev = {
.init_name = "leds_dev",
.bus = &leds_bus_type,
.platform_data = led,
.release = led_release,
};
led硬件资源:
#define GPF3CON 0x114001E0
#define GPF3DAT 0x114001E4
#define GPX1CON 0x11000C20
#define GPX1DAT 0x11000C24
#define GPX2CON 0x11000C40
#define GPX2DAT 0x11000C44
定义一个led数据资源:
例:
struct led_res
{
unsigned int addrcon; //硬件引脚地址
unsigned int addrdat; //控制引脚地址
unsigned volatile int *addrcon_v; //映射地址
unsigned volatile int *addrdat_v; //映射地址
unsigned int flag; //偏移量
};
注册:
device_register(&leds_dev);
注销:
device_unregister(&leds_dev);
module_init(leds_device_init);
module_exit(leds_device_exit);
3,driver
//设备驱动所属总线
extern struct bus_type leds_bus_type;
建立连接:
struct file_operations led_fops = {
.owner = THIS_MODULE,
.open = led_open,
.release = led_release,
.unlocked_ioctl = led_unlocked_ioctl,
};
定义一个设备驱动结构体:
struct device_driver leds_driver = {
//设备驱动名
.name = "leds_dev",
//设备驱动所属总线
.bus = &leds_bus_type,
//设备驱动所属总线中的match函数一旦成功,则会调用设备驱动的probe函数
.probe = leds_probe,
};
虚拟地址映射:
ioremap(地址,数据位);
iounmap函数用于取消ioremap()所做的映射,原型如下:
void iounmap(void * addr);
设备驱动注册:
driver_register(&leds_driver);
设备驱动卸载:
driver_unregister(&leds_driver);
module_init(leds_driver_init);
module_exit(leds_driver_exit);