linux驱动移植问题点
1、I2C地址是否和其它IC冲突。通过改地址解决
——通常,以下三种情况的log表现相同:1、ic没连接到主板;2、i2c地址错误;3、该器件I2C地址与同组其它器件冲突
2、I2C通信是否受到其它slaver影响。检测:示波器测I2C波形。排查:逐个去掉其它I2C部件,看本IC的I2C波形是否恢复正常。
3、是否由于IC本身原因,某个寄存器写值后无应答。我调的这款LED的reset寄存器就是如此,导致probe 调用reset时报错,而其他寄存器正常。
4、硬件接触是否良好。我遇到的是金手指和卡座接触不良,而且,该金手指上的另一个IC——距离传感器在较松的插入情况下可以正常工作,但LED不能。排查:将LED引脚直接接到卡座引脚,绕过金手指排线
4.9、I2C可以通信后,若无法request_irq,检查该函数的第一个参数,通常是中断号出错。adb中可读取已注册的中断脚:cat proc/interrupts
4.99、若probe成功,无法产生中断:测量IC中断脚电平,看是否有硬件中断产生,若有:再测量IC供电电平,若IC供电电平=中断电平,则会导致CPU无法产生中断事件。解决方案:硬件提高IC供电电平 或 IC厂降低中断电平
可能用到的引脚操作函数:
HAL_tlmm_SetOwner(pin,TLMM_OWNER_PERIPHERAL);
gpio_direction_output(pin,level);
4.999、看注册中断脚request irq之后,是否有enable_irq
5、若某个GPIO无法拉高,检查GPIO配置,modem端需配置为TLMM_OWNER_MASTER,kernel端需配置为TLMM_OWNER_PERIPHERAL
6、厂商提供的代码和本地平台可能会有版本差异性,一些宏定义、函数定义可能会不同,需要比对本地依赖库中的函数。