[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

转载于:https://www.cnblogs.com/zzb-Dream-90Time/p/8144837.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值