1,bus

struct bus_type结构体内容:

led总线驱动

匹配函数:match

使用:

 

 

struct bus_type my_bus_type{

.match=my_match,

}

匹配:!strncmp(dev->kobj.name,drv->name,strlen(drv->name));

函数返回1,证明匹配成功。

led总线驱动

 

注册总线bus_register(”自己定义的结构体“);

成功返回0;

注销总线bus_unregister("自己定义的结构体“);

把符号导出

EXPORT_SYMBOL("结构体名字”);

注册和删除函数

led总线驱动

 

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);

相关文章:

  • 2021-11-09
  • 2021-07-10
  • 2022-12-23
  • 2022-12-23
  • 2021-09-17
  • 2021-08-21
  • 2021-05-09
  • 2021-08-30
猜你喜欢
  • 2022-12-23
  • 2021-11-30
  • 2022-12-23
  • 2021-12-03
  • 2021-07-09
  • 2021-07-16
  • 2021-05-31
相关资源
相似解决方案