[RK 3288][Android 6.0]デバッグノート---I 2 Cデバイスの正常な伝送方法をテストする
2114 ワード
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92
rkは駆動層で汎用i 2 cテストコードを上層に提供し、i 2 c周辺機器が正常に伝送するかどうかを迅速にテストした.
試験使用方法:#echo[0-5]>/dev/i 2 c_detect//0-5はi 2 c number番号を表すが、i 2 c 5はドライバを変更する必要があり、デフォルトではi 2 c 4にしかサポートされていない.例えば私のi 2 c 2はaudio codecを迎えています.
kernel log印刷:
I2c2 slave list: 0x1a
audio codecのアドレスは0 x 1 aである.
ドライバキーの説明:
kernel/drivers/i2c/buses/i2c-rockchip.c:
rkは駆動層で汎用i 2 cテストコードを上層に提供し、i 2 c周辺機器が正常に伝送するかどうかを迅速にテストした.
試験使用方法:#echo[0-5]>/dev/i 2 c_detect//0-5はi 2 c number番号を表すが、i 2 c 5はドライバを変更する必要があり、デフォルトではi 2 c 4にしかサポートされていない.例えば私のi 2 c 2はaudio codecを迎えています.
&i2c2 {
status = "okay";
rt5631: rt5631@1a {
compatible = "rt5631";
reg = <0x1a>;
};
};
root@rk3288:/# echo 2 >/dev/i2c_detect kernel log印刷:
I2c2 slave list: 0x1a
audio codecのアドレスは0 x 1 aである.
ドライバキーの説明:
kernel/drivers/i2c/buses/i2c-rockchip.c:
static ssize_t i2c_detect_write(struct file *file,
const char __user *buf, size_t count, loff_t *offset)
{
char nr_buf[8];
int nr = 0, ret;
/* i2c4, i2c5, 5.*/
if (count > 4)
return -EFAULT;
ret = copy_from_user(nr_buf, buf, count);
if (ret < 0)
return -EFAULT;
sscanf(nr_buf, "%d", &nr);
/* 6. */
if (nr >= 5 || nr < 0)
return -EFAULT;
slave_detect(nr);
return count;
}
static void slave_detect(int nr)
{
int ret = 0;
unsigned short addr;
char val[8];
char buf[6 * 0x80 + 20];
struct i2c_client client;
memset(buf, 0, 6 * 0x80 + 20);
sprintf(buf, "I2c%d slave list: ", nr);
do {
/* 0x01~0x80 .*/
for (addr = 0x01; addr < 0x80; addr++) {
detect_set_client(&client, addr, nr);
/* .*/
ret = detect_read(&client, val, 1);
if (ret > 0)
sprintf(buf, "%s 0x%02x", buf, addr);
}
/* .*/
printk("%s
", buf);
}
while (0);
}
static int detect_read(struct i2c_client *client, char *buf, int len)
{
struct i2c_msg msg;
msg.addr = client->addr;
msg.flags = client->flags | I2C_M_RD;
msg.buf = buf;
msg.len = len;
/* 100kHz */
#ifdef CONFIG_I2C_ROCKCHIP_COMPAT
msg.scl_rate = 100 * 1000;
#endif
return i2c_transfer(client->adapter, &msg, 1);
}