[RK3288][Android6.0] 调试笔记 --- 测试I2C设备正常传输方法【转】

本文转载自:http://blog.csdn.net/kris_fei/article/details/71515020

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92

 

rk在驱动层做了一个通用i2c测试代码提供给上层快速测试i2c外设是否传输正常.

测试使用方法:
#echo [0-5] > /dev/i2c_detect    //0-5表示i2c number号,不过i2c5需要修改下驱动,默认只支持到i2c4.
例如我的i2c2接的是audio codec:
[plain] view plain copy
 
  1. &i2c2 {  
  2.     status = "okay";  
  3.     rt5631: rt5631@1a {  
  4.         compatible = "rt5631";  
  5.         reg = <0x1a>;  
  6.     };  
  7. };  
root@rk3288:/ # echo 2 > /dev/i2c_detect
kernel log出打印:
I2c2 slave list:   0x1a
而audio codec的地址就是0x1a.

驱动关键点说明:
kernel/drivers/i2c/buses/i2c-rockchip.c:
[cpp] view plain copy
 
  1. static ssize_t i2c_detect_write(struct file *file,  
  2.             const char __user *buf, size_t count, loff_t *offset)  
  3. {  
  4.     char nr_buf[8];  
  5.     int nr = 0, ret;  
  6.     /*只支持到i2c4, 如果要支持i2c5,那么要改成5.*/  
  7.     if (count > 4)  
  8.         return -EFAULT;  
  9.     ret = copy_from_user(nr_buf, buf, count);  
  10.     if (ret < 0)  
  11.         return -EFAULT;  
  12.   
  13.     sscanf(nr_buf, "%d", &nr);  
  14.     /*这里得改成6. */  
  15.     if (nr >= 5 || nr < 0)  
  16.         return -EFAULT;  
  17.   
  18.     slave_detect(nr);  
  19.   
  20.     return count;  
  21. }  
  22.   
  23. static void slave_detect(int nr)  
  24. {  
  25.     int ret = 0;  
  26.     unsigned short addr;  
  27.     char val[8];  
  28.     char buf[6 * 0x80 + 20];  
  29.     struct i2c_client client;  
  30.   
  31.     memset(buf, 0, 6 * 0x80 + 20);  
  32.   
  33.     sprintf(buf, "I2c%d slave list: ", nr);  
  34.     do {  
  35.         /*扫描0x01~0x80地址范围的设备.*/  
  36.         for (addr = 0x01; addr < 0x80; addr++) {  
  37.             detect_set_client(&client, addr, nr);  
  38.             /*读取一个字节.*/  
  39.             ret = detect_read(&client, val, 1);  
  40.             if (ret > 0)  
  41.                 sprintf(buf, "%s  0x%02x", buf, addr);  
  42.         }  
  43.         /*打印扫描到的设备地址.*/  
  44.         printk("%s\n", buf);  
  45.     }  
  46.     while (0);  
  47. }  
  48.   
  49. static int detect_read(struct i2c_client *client, char *buf, int len)  
  50. {  
  51.     struct i2c_msg msg;  
  52.   
  53.     msg.addr = client->addr;  
  54.     msg.flags = client->flags | I2C_M_RD;  
  55.     msg.buf = buf;  
  56.     msg.len = len;  
  57.     /*以100kHz的速率读取*/  
  58. #ifdef CONFIG_I2C_ROCKCHIP_COMPAT  
  59.     msg.scl_rate = 100 * 1000;  
  60. #endif  
  61.   
  62.     return i2c_transfer(client->adapter, &msg, 1);  
  63. }  
 
1
 
0
posted @ 2017-12-29 15:47  请给我倒杯茶  阅读(2613)  评论(0编辑  收藏  举报