zoukankan      html  css  js  c++  java
  • [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 ", 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
  • 相关阅读:
    关于POST的请求的问题的汇总
    EF关于报错Self referencing loop detected with type的原因以及解决办法
    系统体验设计需注意的地方
    win10文件共享的实现
    idea快速生成实体类Entity
    idea下使用码云插件进行git提交
    漏洞利用-FTP漏洞利用
    metasploit2
    day02-业务服务监控
    day01-系统基础信息模块
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8144837.html
Copyright © 2011-2022 走看看