summary_first_2016-设备驱动的基本结构

看了好多驱动差不多都是总线设备驱动模型,大体架构都是在总的config文件中定义宏,在总的Makefile中看自己定义的宏是否是Y ,若是Y 就在相对应小的Makefile中进行编译相对应的驱动,再在驱动中调用module_init()函数中注册platform_device和platform_driver,然后match()再进行匹配,匹配成功则调用probe()函数。

TP驱动 i2c_register_board_info(I2C_BUS_NUMBER, &i2c_tpd, 1);先注册IIC驱动;tpd_driver_add(&tpd_device_driver)其次再添加IIC驱动;相当于添加i2c_add_driver(&tpd_i2c_driver) ;然后在IIC_probe里面进行创建线程进行kthread_run(touch_event_handler, 0, TPD_DEVICE);再touch_event_handler进行事件的处理;

先判断是不是手势,其次是案件,再其次是坐标进行事件的优先级判断,从而进行事件的处理。直接进行相对应驱动的添加。

电池驱动也是类似,先注册总线设备结构体然后添加设备驱动,当匹配之后进行调用相对应probe 函数,Probe函数里面创建了线程BAT__thread()每十秒钟进行一次调用,先检查充电器是否连接,获得电池的参数,检查电池的充电状态,上报检查,调用电池的调度算法,更新电池的信息。在此之前要移植好电池的导入ZCV表,QMax,OCV 表,电池的ID兼容,NTC电阻,快充芯片驱动,高低温充电截止配置,电池ID兼容配置。

这里重点关注其match()成员函数,正是此成员函数确定了platform_device和Platform_driver之间是如何进行匹配;匹配有四种可能性:

   基于设备树风格的匹配  if(of_driver_match_device(dev,drv)) return 1;

  基于ACPI风格的匹配   if(acpi_driver_match_device(dev,drv)) return 1;

  匹配ID表格                     if(pdrv->id_table)  return platform_match_id(pdrv->id_table,pdev)!=NULL;

  匹配platform_device设备名和驱动的名字  return (strcmp(pdev->name,drv->name)==0);


IIC控制器所在的驱动的platform_driver与arch/arm/mach-xxx中的platform_device通过platform总线的match()函数匹配导致platform_driver.probe()执行,从而完成IIC控制器的注册;而IIC上挂的触摸屏依附的IIC_driver与arch/arm/mach-xxx中的IIC__board_info指向的设备通过IIC总线的match()函数匹配导致i2c_driver.probe()执行,从而使触摸屏展开。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值