[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を迎えています.
&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); }