ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2013年6月3日 星期一

worklog: i2c control ADV7611

要對 ADV7611 控制。
介面是 i2c。

使用 i2ctool,follow 這一篇: http://boundarydevices.com/i2c-tools-under-android/
舊版頁面 去download 3.0.2

2019: source 改道這裡了...
git clone git://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git -b i2c-tools-3.1
解開到 framework 下,
再follow 那一篇,把 Android.mk create 出來。
為了避免 link 不見, copy 了一份在 gist

OK, build 出來後,在 android 下就可以 run 了。

先用 i2cdetect -l 看一下:
i2c-0 i2c        imx-i2c                          I2C adapter
i2c-1 i2c        imx-i2c                          I2C adapter
i2c-2 i2c        imx-i2c                          I2C adapter

有出現 3 個 i2c bus 。

ADV7611 datasheet,說明 reset 後,i2c address 是 0x98。
但是 i2c address 是 7 個 bit + 1 個 bit R/W。

參考以前歐先生的 code,知道,在用 linux driver 控制時,要把這種標示的 i2c address shift 1 bit:
0x98 >> 1
就是 0x4c

用 i2cget commadn 讀一下 register 0xEA, 0xEB : Revision identification: bash-3.2# i2cget -f -y 0 0x4c 0xea 0x20 bash-3.2# i2cget -f -y 0 0x4c 0xeb 0x51
所以是 0x2051. ADV7611 沒錯。

接著測試 write function。
ADV7611 有說,他的 address 是考 VS/FIELD/ALSB 決定的。
但是這是動態決定,所有 chip power on reset 後,address 都是 0x98。
之後 write 0x01 到 register 0x1B (SAMPLE_ALSB),之後, chip 就會依照 VS/FIELD/ALSB 的電壓決定 address:
  • low : 0x98 (shift 後就是 0x4c)
  • high: 0x9A (shift 後就是 0x4d)
所以先讀一下 0x1B: bash-3.2# i2cget -f -y 0 0x4c 0x1b 0x00
然後寫入: bash-3.2# i2cset 0 0x4c 0x1b 1 WARNING! This program can confuse your I2C bus, cause data loss and worse! I will write to device file /dev/i2c-0, chip address 0x4c, data address 0x1b, data 0x01, mode byte. Continue? [Y/n] Y
用新 address 0x4d 讀讀看: bash-3.2# i2cget -f -y 0 0x4d 0x1b 0x01
好像成功了。


很可惜的,這個 tool 是基於 smbus,所以只有符合 smbus 規範的 i2c 裝置才能用。
TI 有一篇 pdf 說明 smbus, i2c 的差異: http://www.ti.com/lit/an/sloa132/sloa132.pdf

沒有留言:

標籤

網誌存檔