嵌入式调试外设芯片时的零零碎碎


MPQ2022芯片

mek_8q_raite:/ # cat /sys/devices/platform/5a820000.i2c/i2c-5/5-0021/mpq2022_reg
[0x5]=0x97,[0x6]=0x96,[0x4]=0xe9,[0x9]=0x65,[0xa]=0x65,addr=0x21

0x09=65 即0110 0110,第一个是0不管,第二个是1,那么就是200mV/bit。第三位开始10 0110=38,那么电压就是1+38*0.2=8.6V

0x05=97即1001 0111=151,电压为151*0.055=8.3V

//MPQ2022芯片读寄存器:

i2ctransfer -f -y 5 w1@0x21 0x5 r1
0x97

MPQ2022写寄存器时需要带入CRC校验码,具体计算举例如下:

其他

自动化测试时在windows的命令行中打印时间戳:echo %time:~0,8%

解串器MAX9286

9286的像素速率似乎74.25mhz,如果使用25fps,则2个芯片的填值如下:
9286的6#~8#填值 96705的47#~49#填值 96705的4A#~4C#填值
74.25mhz/25= 2970000 = 0x2d5190 0x2d37a8 = 2963368 0x0019e8
其中0x2d5190 = 0x2d37a8 +0x0019e8

如果使用15fps,则填值如下
74.25mhz/15 =4950000 = 0x4b87f0 0x4b5cc3 = 4938947 0x002b2d
即:

//max9286 调整6~8,和max96705 调整47~4c,可以看到不发数据的低电平拉长了,从而导致帧率降低,实际发数据的高电平仍然不会变化:

//video link状态看后4bit:
[vm1] mek_8q:/ # i2cget -f -y 8 0x6a 0x49
[vm1] 0x0f

//正常接4个摄像头的max9286寄存器值:

[vm1] mek_8q:/ # i2cdump -f -y 8 0x6a
[vm1] No size specified (using byte-data access)
[vm1] 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
[vm1] 00: ef 00 00 01 00 00 90 51 2d d4 ff e4 91 f3 50 0b ?..?..?Q-?.???P?
[vm1] 10: 00 00 f3 0f e4 9b 00 01 00 00 60 00 f4 ff 40 02 ..????.?..`.?.@?
[vm1] 20: 55 00 00 00 00 00 00 bf 00 00 00 00 00 00 00 00 U......?........
[vm1] 30: 6a 47 99 99 b6 00 00 00 00 00 00 2e 24 54 c8 22 jG???.......$T?"
[vm1] 40: 5a 10 00 a0 00 00 55 ff ef 0f ff 00 00 00 05 00 Z?.?..U.??....?.
[vm1] 50: 00 00 05 00 00 00 05 00 00 00 05 90 51 2d 00 00 ..?...?...??Q-..
[vm1] 60: 45 ff 1f 00 00 12 96 00 50 b0 00 00 00 00 00 00 E.?..??.P?......
[vm1] 70: f0 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ??..............
[vm1] 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[vm1] 90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[vm1] a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[vm1] b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[vm1] c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[vm1] d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[vm1] e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[vm1] f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

加串器MAX96705

//读ID:
MAX96705的ID(地址0x1e)是0x41

i2cget -f -y 8 0x41 0x1e
0x41

//MAX96705的文档中没有细写的寄存器:

加串器MAX9295

//读ID:
MAX9295的ID是0x91(MAX9295A)或者0x93(MAX9295B)

i2ctransfer -f -y 9 w2@0x42 0x00 0x0d r1
0x91

解串器MAX96722

芯片调试步骤:检查硬件 ->读ID ->检查加解串的配置是否一致,读link 是否lock ->调试video是否lock
//读ID:
MAX96722的ID是0xa1

i2ctransfer -f -y 9 w2@0x29 0x00 0x0d r1
0xa1

//读写寄存器:

i2ctransfer -f -y 9 w2@0x29 0x00 0x06 r1
0x0f  //读出原始值0x0f

i2ctransfer -f -y 9 w3@0x29 0x00 0x06 0
//写入0x00

i2ctransfer -f -y 9 w2@0x29 0x00 0x06 r1
0x00   //读出新值0x00

//max96722没有下挂全部4个摄像头,如果需要出图,则需要0x8A0写84,就可以了
//GMSL1读link状态是看bit0=1表示link locked:

i2ctransfer -f -y 9 w2@0x29 0x0b 0xcb r1
i2ctransfer -f -y 9 w2@0x29 0x0c 0xcb r1
i2ctransfer -f -y 9 w2@0x29 0x0d 0xcb r1
i2ctransfer -f -y 9 w2@0x29 0x0e 0xcb r1

//读video lock状态看bit0=1表示locked:


i2ctransfer -f -y 8 w2@0x29 0x01 0xdc r1   //对应第1条流,比如G59的OMS(GMSL2)
i2ctransfer -f -y 8 w2@0x29 0x01 0xfc r1   //对应第2条流,比如G59的AR(GMSL2)
i2ctransfer -f -y 8 w2@0x29 0x02 0x1c r1
i2ctransfer -f -y 8 w2@0x29 0x02 0x3c r1
i2ctransfer -f -y 8 w2@0x29 0x02 0x5c r1
i2ctransfer -f -y 8 w2@0x29 0x02 0x7c r1
i2ctransfer -f -y 8 w2@0x29 0x02 0x9c r1
i2ctransfer -f -y 8 w2@0x29 0x02 0xbc r1


//GMSL2读link状态是看bit3=1表示link locked:

i2ctransfer -f -y 9 w2@0x29 0x00 0x1a r1
i2ctransfer -f -y 9 w2@0x29 0x00 0x0a r1
i2ctransfer -f -y 9 w2@0x29 0x00 0x0b r1
i2ctransfer -f -y 9 w2@0x29 0x00 0x0c r1

使用的GMSL1/2模式看0x06寄存器

解串器TI ds90ub940

//
forward channel =serializer to deserializer
reverse channel =deserializer to serializer
//读ID是F0~F5地址:

spm8675p1_64_wifi:/ # i2cdump -f -y 6 0x0c
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 18 00 00 da 80 00 58 48 48 00 2b 00 13 23 53 00    ?..??.XHH.+.?#S.
10: 11 00 00 8c 00 00 02 1e 7f 7f 01 00 03 00 01 00    ?..?..?????.?.?.
20: 0b 00 25 80 16 00 00 00 01 20 20 b8 00 00 a5 5a    ?.%??...?  ?..?Z
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
40: 10 49 00 00 80 00 63 00 00 00 00 00 00 00 00 40    ?I..?.c........@
50: 16 00 00 00 02 00 00 02 00 00 92 00 02 06 44 00    ?...?..?..?.??D.
60: 22 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00    "?..............
70: 54 00 00 00 00 00 00 54 00 00 00 00 00 00 00 00    T......T........
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
c0: 00 00 80 00 78 00 00 60 c0 00 00 00 00 00 ff 00    ..?.x..`?.......
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
e0: 00 00 80 00 68 38 00 00 00 00 00 00 00 00 00 00    ..?.h8..........
f0: 5f 55 42 39 34 37 00 00 00 00 00 00 00 00 00 00    _UB947..........

//940自己输出color bar:
i2cset -f -y 8 0x2c 0x64 0x05
关闭pattern模式:
i2cset -f -y 8 0x2c 0x64 0x10

//940软复位:
echo 1 > /sys/devices/platform/58226000.i2c/i2c-8/8-002c/ds90ub940_reset

Techpoint TP2855

//40写0,1,2,3可以切换不同的decoder,每个decoder的01最高3位=011是有信号并且lock住,否则就是无信号或没有lock

[vm1] mek_8q:/ # i2cset -f -y 8 0x44 0x40 0
[vm1] mek_8q:/ # i2cget -f -y 8 0x44 0x01
[vm1] 0x7a
[vm1] mek_8q:/ #
[vm1] mek_8q:/ #
[vm1] mek_8q:/ # i2cset -f -y 8 0x44 0x40 1
[vm1] mek_8q:/ # i2cget -f -y 8 0x44 0x01
[vm1] 0x1f
[vm1] mek_8q:/ # i2cset -f -y 8 0x44 0x40 2
[vm1] mek_8q:/ # i2cget -f -y 8 0x44 0x01
[vm1] 0x9f
[vm1] mek_8q:/ # i2cset -f -y 8 0x44 0x40 3
[vm1] mek_8q:/ # i2cget -f -y 8 0x44 0x01
[vm1] 0x1f

//打摄像头pattern:

adb shell "i2cset -f -y 8 0x44 0x40 0x08"
adb shell "i2cset -f -y 8 0x44 0x21 0x83"

常用脚本

批量导出max96722的寄存器值(无法使用i2cdump),使用如下python脚本:

import os
import time

a=0
os.system('adb root')
os.system('adb remount')    

s_hex=""
k=""
t=""
while a < 80:
    b='adb shell i2ctransfer -f -y 9 w2@0x29 0x00 '
    b += s_hex + hex(a)
    b +=' r1'
    k=hex(a) +"="
    print(k)    
    os.system(b)
    a+=1


相关