MTK智能机兼容电容TP的方法

关于不同芯片方案的自动识别,比如TP芯片、GSENSOR等的自动识别在实际生产和应用中都是很有必要的,大大简化软件维护和发布流程。以下的说明以MTK的智能机平台为基础,对于其他平台该方法并不适用,因为MTK自己有一套设备驱动管理流程,相当于在同一类驱动上都加了一层管理层。(1)在注册MTK的TP的platform_driver时,名字是#define TPD_DEVICE            "mtk-tpd",所以其他TP备选芯片的i2c_driver中的driver->name也都必须是TPD_DEVICE,方便设备挂接。为什么一开始不加修改的在配置文件中同时编译两个TP型号,会出现编译错误(可能是运行错误)?因为每个TP的驱动都有i2c_add_driver,不可能在同一个TPD_DEVICE名字上挂接两个I2C设备。
(2)新的方法,就是在第一个编译加载的TP驱动中做读ID号的判断,如果没有识别到正确的ID,认定该芯片不符,则执行i2c_del_driver,以保证后来编译执行的其他TP能够继续挂接上TPD_DEVICE的platform_driver。
(3)过程:以melfas和mstar两颗TP芯片为例,如果前者在后者之前编译加载,后者不做改动,前者驱动做一定的修改。
定义个单文件内的全局变量:static int i2c_tetect =0;
melfas的i2c_driver定义如下:
[cpp]   view plain copy print ?


  • static struct i2c_driver tpd_i2c_driver =
  • {
  •     .driver = {
  •         .name = TPD_DEVICE,
  •         .owner = THIS_MODULE,
  •     },
  •     .probe = tpd_probe,
  •     .remove = __devexit_p(tpd_remove),
  •     .id_table = tpd_id,
  •     .detect = tpd_detect,
  •     .address_data = &addr_data,
  • };

在它的tpd_probe中开始做个判断,没有读到正确的ID,i2c_tetect=-1;同时该函数也返回-1。注意:tpd_load_status = 1;是在每个TP probe驱动最后中都存在的语句,表示该驱动加载成功。
(4)在melfas的驱动中本地的tpd_local_init中,
[cpp]   view plain copy print ?


  • if(i2c_add_driver(&tpd_i2c_driver) != 0)
  • {
  •      printk("melfas unable to add i2c driver.\n");
  •      return -1;
  • }              //就算tpd_probe返回-1,标识该驱动没有正确识别到芯片,i2c_add_driver并不一定要返回-1。
  • if(i2c_tetect!=0)   //不等于0,说明在tpd_probe中赋值,标识判断不成功
  • {
  •      i2c_del_driver(&tpd_i2c_driver);       //执行i2c_del_driver,留出空位
  •      printk("melfas not detect .\n");
  •      return -1;
  • }

5)在MTK的TPD管理器中,
[cpp]   view plain copy print ?


  • for(i = 1; i < TP_DRV_MAX_COUNT; i++)
  • {
  •             /* add tpd driver into list */
  •         if(tpd_driver_list.tpd_device_name != NULL)
  •         {
  •                 tpd_driver_list.tpd_local_init();
  •                 if(tpd_load_status ==1) {
  •                     TPD_DMESG("[mtk-tpd]tpd_probe, tpd_driver_name=%s\n", tpd_driver_list.tpd_device_name);
  •                     g_tpd_drv = &tpd_driver_list;
  •                     break;
  •                 }
  •         }
  • }

它会依次执行每个TP驱动的tpd_local_init,只有tpd_load_status为1的才是已经完整PROBE的驱动,即刻退出循环;否则继续下一个TP的匹配寻找。当然,此处也可以已
tpd_local_init函数的返回值作为判断标准,PROBE成功的返回0,不成功的会提前返回-1。

       在实际生产中碰到过一个问题:TP的自动识别是靠读取MELFAS的设备ID号来判断的,如果读取不成功则是MSTAR的TP。但是存在一个问题,如果开机MELFAS的TP在第一次开机升级过程中断电,会造成TP不能工作也不能读ID号,必须强制升级才能保证TP的后续工作。这样当读取ID不成功有两种可能:一是MELFAS的TP,得强制升级;二是MSTAR的TP,所以程序中必须做判断处理。处理的原则必须保证:
1,MSTAR TP可用            (验证OK)
2,MELFAS 正常开机可用  (验证OK)
3,MELFAS 第一次开机升级断电可再次升级并可用(验证OK)
4,MELFAS 第一次开机升级只升一次(验证OK)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值