从A33移植ICM20608D谈Android sensors移植

在A33上移植ICM20608D,历时3.5天。回顾该Sneosr移植、调试历程,没有产生过多障碍及意外。可以说,一切按设想中的样子演进。16日下午完成了linux driver及android hal的移植,确认sensor工作正常,interrupt可产生,driver可作出响应。17日及18日,熟悉代码及调试。19日供应商现场支持,收官。
Android sensors的移植方法,可以概括为以下步骤:
  1. 确认硬件线路是否正确。
  2. 移植sensor driver。
  3. 脱离HAL层对driver及sensor进行调试,确认sensor工作是否正常,driver是否移植正确。
  4. 移植HAL层,结合HAL及driver调试。
  5. 必要时检查SensorService。
  6. 若上述5步做到位但未得到预期结果,迅速联系供应商做现场支持。

第1点不必多说,读懂原理图是作为嵌入式软件工程师的基本素质。
第2点是移植driver,一般来说,供应商会给到某平台的适用source code,不一定是全志平台,但必须是可用的,完整的source code。移植driver要做的工作一般是:
  1. linux core打开driver所需要的外部模块及代码。
  2. 根据平台特性加入driver private data。
  3. 根据平台特性加入bus识别sensor的代码。
  4. 根据平台特性完成中断/唤醒等gpio申请注册使用。

将驱动代码正确移植到平台,成功编译后。需要检查软件代码在时序上是否满足sensor工作所需的时序,sensor的中断是否合理地产生,driver的中断处理函数是否合理地进行响应。
第3点相当重要,在移植HAL之前,必须想办法尝试脱离HAL层的影响对底层进行debug确认。仔细阅读ICM20608D驱动代码后,不难发现,驱动里面会产生若干节点,其中就包括读取sensor registers当前值的节点及其他重要的节点。另外,在HAL代码中,也存在好几个调试用的工具源码,比如selftest、mpu_iio等。可以将它们编译出现,在shell中直接执行。
第4点是移植HAL层代码,将HAL代码存放到android/hardware下,全志平台加载sensor hal是根据sensors..so的规划进行加载,因此,应优先将LOCAL_MODULE的值修改为sensors.$(TARGET_BOARD_PLATFORM)。由于HAL层代码不同产家规范不一样,很难抽象出能适用于所有sensor hal移植的方法论。但是,只要代码本身是完整的,通过阅读代码,编译,debug,成功移植只是时间问题。
HAL代码向上注册硬件设备使用是公共的规范和接口,一般来说,不需要太怀疑SensorService的正确性。
如果说经历了上面的过程,sensor仍然没有办法在系统中正常使用起来,就应该毫不犹豫地约供应商技术人员过来现场支持。原因有:
  1. HAL层及以下的代码,各家有各家的规范,应优先找产家支持。
  2. 供应商比我们更熟悉他们的代码。
  3. 供应商可以找到Sensor的原厂支持。

总结:
  1. 在Android System移植sensor代码,要注意向供应商确认代码的完整性和准确性。一般来说拿过来可以编译通过并使用的情况比较少,还是须要工程师耐心地移植调试。一步一步去完成。
  2. Android System不同于Melis等小型专用系统,全志的linux core也是抓取自公共linux core的sunxi分支,如非全志有意封装,均可视为通用模块。
  3. 在移植工作已经基本做到位,不存在中断申请错误等低级问题的前提下,应大胆申请供应商技术支持,推进调试进度。

你可能感兴趣的:(android)