MStar2256A升级FW失败后TP无功能

来源:互联网 发布:淘宝运营推广区别 编辑:程序博客网 时间:2024/05/16 01:18

一、背景:

有两种LCD:

一供:模组厂TCL,IC : ili9806e

二供:模组厂BOYI,IC : OTM8019A


有两种TP:

一供:模组厂欧菲光,IC:Fcocaltech6436U

二供:模组厂业际光电,IC:MSTAR2256A


两个项目3G(MTK6580平台)和4G(MTK6737M)项目


二、MSTART TP升级FW遇到问题

3G:用厂商APK升级FW时未出现异常,可以正常升级,升级后TP可正常使用

4G:用厂商APK升级FW时出现升级失败现象,之后TP无功能,无法触控


三、分析过程

1. 对比3G和4G驱动代码,无差异

2. 驱动文件无差异的话应该和系统有关了,具体和哪部分有关只能从Mstar IC升级失败时的log分析了

直接上升级失败时的log:

[    3.356161] <2>.(2)[1:swapper/0]*** DrvIcFwLyrVariableInitialize() ***
[    3.356967] <2>.(2)[1:swapper/0]*** DrvFwCtrlVariableInitialize() ***
[    3.357770] <2>.(2)[1:swapper/0]*** DrvIcFwLyrIsRegisterFingerTouchInterruptHandler() ***
[    3.359745] <2>.(2)[1:swapper/0]*** MStar Ontim ljc start fw upgrade start***
[    3.360629] <2>.(2)[1:swapper/0]***Ontim ljc 666 DrvIcFwLyrCheckFirmwareUpdateBySwId() ***
[    3.361658] <2>.(2)[1:swapper/0]Ontim ljc DrvFwCtrlCheckFirmwareUpdateBySwId g_ChipType = 0x7a
[    3.362732] <2>.(2)[1:swapper/0]*** _DrvFwCtrlMsg22xxCheckFirmwareUpdateBySwId() ***
[    3.363697] <2>.(2)[1:swapper/0]Ontim ljc _DrvFwCtrlMsg22xxCheckFirmwareUpdateBySwId start!
[    3.364742] <2>.(2)[1:swapper/0]*** _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware() eEmemType = 1 ***
[    3.451653] <1>.(1)[89:hps_main]CPU2: shutdown
[    3.452201] <1>.(1)[89:hps_main][Power/hotplug] mt_cpu_kill, cpu: 2
[    3.453561] <1>.(1)[89:hps_main][HPS] (0200)(3)action end(99)(99)(0)(0) (4)(4)(4)(4)(1) (197)(8)(0) (736)(8)(0) (0)(99)(8)(0)(99) wifi_base(0)
[    3.479100] <0>.(0)[1:swapper/0]Hardware CRC = 0xad8ea9bd
[    3.480154] <0>.(0)[1:swapper/0]ERROR,495: id=1,addr: 59, transfer error
[    3.480981] <0>.(0)[1:swapper/0]ERROR,501: I2C_ACKERR
[    3.481610] <0>.(0)[1:swapper/0]I2C(1) dump info++++++++++++++++++++++
[    3.482430] <0>.(0)[1:swapper/0]I2C structure:
[    3.482430] <0>[I2C]Clk=13650,Id=1,Speed mode=1,St_rs=0,Dma_en=0,Op=1,Poll_en=0,Irq_stat=3
[    3.482430] <0>[I2C]Trans_len=1,Trans_num=1,Trans_auxlen=0,Data_size=ffff,speed=360
[    3.482430] <0>[I2C]Trans_stop=1,Trans_comp=1,Trans_error=2
[    3.485663] <0>.(0)[1:swapper/0]base address 0xe0c48000
[    3.486325] <0>.(0)[1:swapper/0]I2C register:
[    3.486325] <0>[I2C]SLAVE_ADDR=b2,INTR_MASK=f8,INTR_STAT=0,CONTROL=28,TRANSFER_LEN=1
[    3.486325] <0>[I2C]TRANSAC_LEN=1,DELAY_LEN=2,TIMING=1012,START=0,FIFO_STAT=1101
[    3.486325] <0>[I2C]IO_CONFIG=3,HS=102,DCM_EN=0,DEBUGSTAT=40,EXT_CONF=1800,TRANSFER_LEN_AUX=0
[    3.489848] <0>.(0)[1:swapper/0]before enable DMA register(0x0):
[    3.489848] <0>[I2C]INT_FLAG=0,INT_EN=0,EN=0,RST=0,
[    3.489848] <0>[I2C]STOP=0,FLUSH=0,CON=0,TX_MEM_ADDR=0, RX_MEM_ADDR=0
[    3.489848] <0>[I2C]TX_LEN=0,RX_LEN=0,INT_BUF_SIZE=0,DEBUG_STATUS=0
[    3.492796] <0>.(0)[1:swapper/0]DMA register(0xe0c42200):
[    3.492796] <0>[I2C]INT_FLAG=0,INT_EN=0,EN=0,RST=0,
[    3.492796] <0>[I2C]STOP=0,FLUSH=0,CON=0,TX_MEM_ADDR=0, RX_MEM_ADDR=0
[    3.492796] <0>[I2C]TX_LEN=0,RX_LEN=0,INT_BUF_SIZE=0,DEBUG_STATUS=0
[    3.495659] <0>.(0)[1:swapper/0]I2C(1) dump info------------------------------
[    3.496581] <0>.(0)[1:swapper/0]IicWriteData() error -22, nSlaveId=89, nSize=1
[    3.497475] <0>.(0)[1:swapper/0]*** _DrvFwCtrlMsg22xxRetrieveFirmwareCrcFromEFlash() eEmemType = 1 ***
[    3.601475] <0>.(0)[1:swapper/0]CRC = 0xffffffff
[    3.603392] <0>.(0)[1:swapper/0]ERROR,495: id=1,addr: 59, transfer error
[    3.604219] <0>.(0)[1:swapper/0]ERROR,501: I2C_ACKERR
[    3.604849] <0>.(0)[1:swapper/0]I2C(1) dump info++++++++++++++++++++++
[    3.605669] <0>.(0)[1:swapper/0]I2C structure:
[    3.605669] <0>[I2C]Clk=13650,Id=1,Speed mode=1,St_rs=0,Dma_en=0,Op=1DMA register(0xe0c42200):
[    3.616052] <0>[I2C]INT_FLAG=0,INT_EN=0,EN=0,RST=0,
[    3.616052] <0>[I2C]STOP=0,FLUSH=0,CON=0,TX_MEM_ADDR=0, RX_MEM_ADDR=0
[    3.616052] <0>[I2C]TX_LEN=0,RX_LEN=0,INT_BUF_SIZE=0,DEBUG_STATUS=0
[    3.618915] <0>.(0)[1:swapper/0]I2C(1) dump info------------------------------
[    3.619835] <0>.(0)[1:swapper/0]IicWriteData() error -22, nSlaveId=89, nSize=1
[    3.620728] <0>.(0)[1:swapper/0]*** _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware() eEmemType = 2 ***
[    3.734903] <0>.(0)[1:swapper/0]Hardware CRC = 0x36f8404
[    3.735912] <0>.(0)[1:swapper/0]ERROR,495: id=1,addr: 59, transfer error
[    3.736739] <0>.(0)[1:swapper/0]ERROR,501: I2C_ACKERR
[    3.737368] <0>.(0)[1:swapper/0]I2C(1) dump info++++++++++++++++++++++
[    3.738188] <0>.(0)[1:swapper/0]I2C structure:
[    3.738188] <0>[I2C]Clk=13650,Id=1,Speed mode=1,St_rs=0,Dma_e[    3.857235] <0>.(0)[1:swapper/0]CRC = 0xffffffff
[    3.859150] <0>.(0)[1:swapper/0]ERROR,495: id=1,addr: 59, transfer error
[    3.860006] <0>.(0)[1:swapper/0]ERROR,501: I2C_ACKERR
[    3.860627] <0>.(0)[1:swapper/0]I2C(1) dump info++++++++++++++++++++++
[    3.861446] <0>.(0)[1:swapper/0]I2C structure:
[    3.861446] <0>[I2C]Clk=13650,Id=1,Speed mode=1,St_rs=0,Dma_en=0,Op=1,Poll_en=0,Irq_stat=3
[    3.861446] <0>[I2C]Trans_len=1,Trans_num=1,Trans_auxlen=0,Data_size=ffff,speed=360
[    3.861446] <0>[I2C]Trans_stop=1,Trans_comp=1,Trans_error=2
[    3.864678] <0>.(0)[1:swapper/0]base address 0xe0c48000
[    3.865341] <0>.(0)[1:swapper/0]I2C register:
[    3.865341] <0>[I2C]SLAVE_ADDR=b2,INTR_MASK=f8,INTR_STAT=0,CONTROL=28,TRANSFER_LEN=1
[    3.865341] <0>[I2C]TRANSAC_LEN=1,DELAY_LEN=2,TIMING=1012,START=0,FIFO_STAT=1101
[    3.865341] <0>[I2C]IO_CONFIG=3,HS=102,DCM_EN=0,DEBUGSTAT=40,EXT_CONF=1800,TRANSFER_LEN_AUX=0
[    3.868839] <0>.(0)[1:swapper/0]before enable DMA register(0x0):
[    3.868839] <0>[I2C]INT_FLAG=0,INT_EN=0,EN=0,RST=0,
[    3.868839] <0>[I2C]STOP=0,FLUSH=0,CON=0,TX_MEM_ADDR=0, RX_MEM_ADDR=0
[    3.868839] <0>[I2C]TX_LEN=0,RX_LEN=0,INT_BUF_SIZE=0,DEBUG_STATUS=0
[    3.871809] <0>.(0)[1:swapper/0]DMA register(0xe0c42200):
[    3.871809] <0>[I2C]INT_FLAG=0,INT_EN=0,EN=0,RST=0,
[    3.871809] <0>[I2C]STOP=0,FLUSH=0,CON=0,TX_MEM_ADDR=0, RX_MEM_ADDR=0
[    3.871809] <0>[I2C]TX_LEN=0,RX_LEN=0,INT_BUF_SIZE=0,DEBUG_STATUS=0
[    3.874673] <0>.(0)[1:swapper/0]I2C(1) dump info------------------------------
[    3.875577] <0>.(0)[1:swapper/0]IicWriteData() error -22, nSlaveId=89, nSize=1
[    3.876653] <1>.(1)[1:swapper/0]nCrcMainA=0xad8ea9bd, nCrcInfoA=0x36f8404, nCrcMainB=0xffffffff, nCrcInfoB=0xffffffff
[    3.877969] <1>.(1)[1:swapper/0]Main block and Info block are broken.

[    3.878771] <1>.(1)[1:swapper/0]Ontim ljc 111 Go to normal boot up process.

[    3.983342] <1>.(1)[1:swapper/0]*** MStar Ontim ljc start fw upgrade end***

由于未抓取到升级失败时的log,暂时只抓了升级失败后重启会再次进行升级时提示的log信息,此时提示:

[    3.877969] <1>.(1)[1:swapper/0]Main block and Info block are broken.

说明上一次升级异常,

Mstar IC升级时分为几个区域:MainA,MainB,InfoA,InfoB

进行如下三个判断后会直接提示升级失败

    if (nCrcMainA == nCrcMainB && nCrcInfoA == nCrcInfoB) // Case 1. Main Block:OK, Info Block:OK

。。。。。。

    else if (nCrcMainA == nCrcMainB && nCrcInfoA != nCrcInfoB) // Case 2. Main Block:OK, Info Block:FAIL

。。。。。。

    else if (nCrcMainA != nCrcMainB && nCrcInfoA == nCrcInfoB) // Case 3. Main Block:FAIL, Info Block:OK

。。。。。。

    else // Case 4. Main Block:FAIL, Info Block:FAIL
    {
        printk("Main block and Info block are broken.\n");
        printk("Ontim ljc 111 Go to normal boot up process.\n");

     }


log里面只提示不匹配,无法获知进一步的信息,此时只能从3G和4G驱动代码差异来考虑,忽然想到,升级时是通过I2C进行通信的,会不会是I2C通信方面出现了问题呢?

此时忽然想起来4G上面I2C通信速率和3G不一样,之前将4G的I2C速率改为360k了,貌似有一线生机,试试吧,将I2C速率改为100K后,升级OK;


三、查看TP设备挂载在哪个I2C上方法

1. 通过TP的原理图

红圈所著,因为不太确定SDA1是第一个I2C设备还是第二个设备,再次搜索SDA0,发现有SDA0,所以确认了挂载在i2c-1上(编号为2的i2c设备上)



2. 通过编译生成的dtsi文件来查看

out/target/product/$(Project)/obj/KERNEL_OBJ/arch/arm/boot/dts/cust.dtsi

&i2c0 {
#address-cells = <1>;
#size-cells = <0>;
camera_main@10 {
compatible = "mediatek,camera_main";
reg = <0x10>;
status = "okay";
};
camera_main_af@0c {
compatible = "mediatek,camera_main_af";
reg = <0x0c>;
status = "okay";
};
camera_sub@3c {
compatible = "mediatek,camera_sub";
reg = <0x3c>;
status = "okay";
};
};


&i2c1 {
#address-cells = <1>;
#size-cells = <0>;
cap_touch@38 {
compatible = "mediatek,cap_touch";
reg = <0x38>;
status = "okay";
};
i2c_lcd_bias@26 {
compatible = "mediatek,i2c_lcd_bias";
reg = <0x26>;
status = "okay";
};
};

备注:

此dtsi是根据dws里面的配置来生成的,所以我们也可以看dws里的i2c配置来确定我们的TP挂载在哪个I2C设备上


3.通过代码

在驱动文件里面,如敦泰驱动文件:focaltech_core.c


#define IIC_PORT                   1// MT6572: 1  MT6589:0 , Based on the I2C index you choose for TPM

 static int __init tpd_driver_init(void) {
        printk("MediaTek fts touch panel driver init\n");
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 19))
tpd_get_dts_info();
#else
        i2c_register_board_info(IIC_PORT, &fts_i2c_tpd, 1);
#endif
if(tpd_driver_add(&tpd_device_driver) < 0)
        TPD_DMESG("add fts driver failed\n");
return 0;
 }
 



















0 0
原创粉丝点击