Part Number:DS90UB941AS-Q1
Hi:
硬件如图去设计:
DS90UB948 的 idx 是直接接地的:
DS90UB941 的I2C地址是 0x1a,DS90UB948 的地址是 0x2c。
Linux 上通过如下命令不能探测到 DS90UB948 的i2c地址:
1、开机探测
# i2cdetect -y 17
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — 1a — — — — — ds90ub941 的地址
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —
2、复位
i2cset -fy 17 0x1a 0x01 0x0f b Reset DSI/DIGITLE 复位
i2cset -fy 17 0x1a 0x03 0xBA b Enable FPD-Link I2C pass through 打开透传,然后可以看到 948 的I2C地址
3、再探测
# i2cdetect -y 17
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — 1a — — — — —
20: — — — — — — — — — — — — — — — — 没有显示 ds90ub948 的地址
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —
通过读取 ds90ub941 的寄存器值,DES_ID_DES_ID_1 Register (Address = 6h) [reset = 0h] 里的值是 0x58 = 0x2c 左移一位,也就是找到了 ds90ub948
通过命令对 ds90ub948 读写无效。
我不知道该怎么去做啦,请帮忙指导一下。
非常感谢
Kailyn Chen:
您好, 如果941和948之间的link建立没有问题的话,那么948的地址会自动加载到941中的,也就是说您通过读取941的寄存器DES_ID的值,如果是能正常读取到的,那说明是没问题的. 我看您这里描述就是通过读取DES_ID的值,能正确读取到948的地址.
您目前遇到的问题, 是通过i2cdetect命令探测948的地址是吗?
,
relax:
因为是使用的Linux系统,它有自带工具 i2c-tools,可以探测到总线上的设备,并列出来,也可以去写挂在i2c总线上的设备。目前通过这个工具去读写948的寄存器是失败的。
,
Kailyn Chen:
明白您的意思了,因为我对Linux系统不是很熟悉, 那么自带的这个I2C tools在其他芯片的I2C使用上, 是否能正确探测呢?
因为根据您的描述,我这边可以判断, 941和948的link是没问题的, 通过DES_ID也能正确读取948的地址, 也说明主机和941, 948都能正确通讯的.
,
relax:
在其它芯片是可以的,我这边使用了两个941,一路是正常的,现在不正常的是另一路,可以看截图。
,
relax:
您好,我这里解决了,因为硬件问题,导致fpdlink的线连接不稳定导致。目前已经可以找到948的i2c地址啦。
也可以正常读写948的寄存器啦。
,
Kailyn Chen:
非常感谢您的反馈, 后续有什么问题,继续讨论.
,
relax:
请问这样的连接,该怎么配置941和948的寄存器呢?
有示例吗?
,
relax:
Hi
我目前已经能够通过Linux i2ctool 写UB941/8的寄存器,让屏幕正常显示。
但是现在遇到了新问题。我把寄存器写的操作加入到驱动里,948的写报错了。要等一些时间,才能成功写948的寄存器。
下面是我使用的命令#define UB941_ADDR 0x1a#define UB948_ADDR 0x2c
ds90ub94x_write_reg(UB941_ADDR, 0x01, 0x0F); /* Reset ub941, Disable DSI */ds90ub94x_write_reg(UB941_ADDR, 0x5B, 0x0C); /* FPD3_TX_MODE=Single or Replicate, Align on DE */ds90ub94x_write_reg(UB941_ADDR, 0x4F, 0x8C); /* Set DSI_CONTINUOUS_CLOCK, 4 lanes, DSI Port 0 */
ds90ub94x_write_reg(UB941_ADDR, 0x40, 0x04); /* Select DSI Port 0 digital registers */ds90ub94x_write_reg(UB941_ADDR, 0x41, 0x21); /* Select DSI_CONFIG_1 register */ds90ub94x_write_reg(UB941_ADDR, 0x42, 0x60); /* Set DSI_CONFIG_1: DSI_VS_POLARITY=DSI_HS_POLARITY=1 */
ds90ub94x_write_reg(UB941_ADDR, 0x40, 0x04); /* Select DSI Port 0 digital registers */ds90ub94x_write_reg(UB941_ADDR, 0x41, 0x05); /* Select DPHY_SKIP_TIMING register */ds90ub94x_write_reg(UB941_ADDR, 0x42, 0x16); /* Write DPHY_SKIP_TIMING: TSKIP_CNT value */
ds90ub94x_write_reg(UB941_ADDR, 0x01, 0x00); /* Enable DSI */ds90ub94x_write_reg(UB941_ADDR, 0x1E, 0x01); /* Select FPD-Link III Port 0 */ds90ub94x_write_reg(UB941_ADDR, 0x03, 0x9A); /* Enable I2C_PASSTHROUGH, FPD-Link III Port 0 */
ds90ub94x_write_reg(UB948_ADDR, 0x01, 0x03); /* Reset ub948 */ds90ub94x_write_reg(UB948_ADDR, 0x1E, 0x90); /* lcd_led_pwm, Pull up*/ds90ub94x_write_reg(UB948_ADDR, 0x1F, 0x09); /* lcd_led_en, Pull up */