全志平台A40I : TWI2通讯验证

简介: 全志平台A40I : TWI2通讯验证

前言:

在本文中,简单的介绍如何在全志Android平台上通过I2C协议检测特定的硬件设备。将从硬件连接的确认开始,接着介绍必要的系统配置,然后是对照数据手册进行的详细设置,最后实现一个简单的I2C驱动来识别DMT C0A9加密芯片。

全志平台A40I : I2C通讯问题调试笔记

  1. 确认硬件I2C2的连接接口
TWI2_SCK=PB20
   TWI2_SDA=PB21

  1. 确认sys_config.fex的配置
[twi2]
twi2_used        = 1
twi2_scl         = port:PB20<2><default><default><default>
twi2_sda         = port:PB21<2><default><default><default>
  1. 确认datasheet
TWI2_SCK=PB20_SELECT的010
TWI2_SDA=PB21_SELECT的010

  1. 确认dts文件
    如果没有twi2则需要添加 , 并且新增对应驱动的配置
    dts配置写法不同, 不然会导致匹配不到compatible 从而执行不了probe函数 当前kernel版本是需要去掉@38的。
twi2: twi@0x01c2b400 {
      interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
      status = "okay";
      dmt_c0a9 {
     //dmt_c0a9@38 {
         compatible = "dmt,dmt_c0a9";
         reg = <0x38>;
         status = "okay";
      };
};
  1. 确认dts编译出来的文件是否被编译到
    xxxx\boot\dts.xxx.dtb.dts
twi2: twi@0x01c2b400 {
      interrupts = <0 4 4>;
   status = "okay";
      dmt_c0a9 {
         compatible = "dmt,dmt_c0a9";
         reg = <0x38>;
         status = "okay";
      };
  };
  1. 确认I2C的function被配置成功
a40-p1:/proc/sys/debug/sunxi_pinctrl # cat sunxi_pin_configure
pin[PB20] funciton: 2
pin[PB20] data: 0
pin[PB20] dlevel: 1
pin[PB20] pull: 0
a40-p1:/proc/sys/debug/sunxi_pinctrl # echo PB21 > sunxi_pin
a40-p1:/proc/sys/debug/sunxi_pinctrl # cat sunxi_pin_configure
pin[PB21] funciton: 2
pin[PB21] data: 0
pin[PB21] dlevel: 1
pin[PB21] pull: 0
  1. 确认系统能够探测到硬件I2C地址
a40-p1:/proc/sys/debug/sunxi_pinctrl # i2cdetect -ya 2
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- 38 -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
  1. 写个简单的驱动c0a9
//1.测试读写
    static int dmt_c0a9_read(struct dmt_c0a9_dev *dmt_c0a9, u8 *buf, u32 len)
    {
        int ret;
        printk(KERN_INFO "Entering: %s\n", __func__);
        // Reading data using i2c_master_recv
        ret = i2c_master_recv(dmt_c0a9->client, buf, len);
        if (ret < 0)
        {
            dev_err(dmt_c0a9->dev, "i2c_master_recv failed with ret = %d\n", ret);
        }
        else if (ret != len)
        {
            dev_err(dmt_c0a9->dev, "Expected %d bytes, received %d bytes\n", len, ret);
        }
        printk(KERN_INFO "Exiting: %s with ret = %d\n", __func__, ret);
        return ret;
    }
    static int dmt_c0a9_write(struct dmt_c0a9_dev *dmt_c0a9, u8 *buf, u32 len)
    {
        int ret;
        printk(KERN_INFO "Entering: %s\n", __func__);
        // Writing data using i2c_master_send
        ret = i2c_master_send(dmt_c0a9->client, buf, len);
        if (ret < 0)
        {
            dev_err(dmt_c0a9->dev, "i2c_master_send failed with ret = %d\n", ret);
        }
        else if (ret != len)
        {
            dev_err(dmt_c0a9->dev, "Expected %d bytes to be sent, actually sent %d bytes\n", len, ret);
        }
        printk(KERN_INFO "Exiting: %s with ret = %d\n", __func__, ret);
        return ret;
    }
    static int dmt_c0a9_test(struct dmt_c0a9_dev *dmt_c0a9)
    {
        int ret;
        printk(KERN_INFO "Entering: %s\n", __func__);
        // Writing data to I2C device
        ret = dmt_c0a9_write(dmt_c0a9, txbuf, 32);
        if (ret)
        {
            dev_err(dmt_c0a9->dev, "Write operation failed with ret = %d\n", ret);
            return ret;
        }
        // Reading data from I2C device
        ret = dmt_c0a9_read(dmt_c0a9, rxbuf, 32);
        if (ret)
        {
            dev_err(dmt_c0a9->dev, "Read operation failed with ret = %d\n", ret);
            return ret;
        }
        // Data processing and verification can be done here
        printk(KERN_INFO "Exiting: %s with ret = %d\n", __func__, ret);
        return 0;
    }
      //2.测试c0a9的驱动能够探测到I2C地址0
  static int dmt_c0a9_probe(struct i2c_client *client, const struct i2c_device_id *id)
  {
      int ret;
      u8 dummy_data = 0;
      
      printk(KERN_INFO "Entering: %s\n", __func__);
  
      // 尝试向设备发送一个字节的数据以检测其存在性
      ret = i2c_master_send(client, &dummy_data, 1);
      if (ret == 1) {
          printk(KERN_INFO "Device found at address 0x38\n");
          return 0; // Device exists
      } else {
          printk(KERN_INFO "No device found at address 0x38\n");
          //未检测到DMT C0A9设备 - 触发内核重启
          panic("DMT C0A9 not detected - triggering kernel panic");
          return -ENODEV; // Device does not exist
      }
  }

总结:

通过本文的介绍,学习了在全志平台上检测I2C设备并通过驱动控制的整个过程。

相关文章
|
5月前
|
监控 BI 数据处理
LabVIEW与欧陆温控表通讯的实现与应用:厂商软件与自主开发的优缺点
LabVIEW与欧陆温控表通讯的实现与应用:厂商软件与自主开发的优缺点
48 0
|
7月前
|
Linux Android开发
全志平台A40I : I2C通讯问题调试笔记
全志平台A40I : I2C通讯问题调试笔记
226 0
|
7月前
|
安全 数据安全/隐私保护 智能硬件
智能家电设备连接与验证的流程
智能家电设备连接与验证的流程
228 1
H8
|
自然语言处理 物联网 Unix
全网最佳IoT命令行超级工具箱|帮你轻松解决百万物联网设备测试和联调
作为一个物联网开发和学习人员,IoT设备协议的测试联调是工作中很重要的一环!我有很多时刻都想拥有一个能集成常见物联网协议的客户端工具可供使用。经过我一通查找,发现和我拥有相同问题的人不在少数。 不仅仅是IoT开发者,包括云厂商、网络运营商都有相同烦恼: 开源物联网平台Thingsboard: coap -> coap.js(需要安装node); 移动OneNET平台: mqtt -> mqtt.fx(几年没更新了); 电信AEP平台:自定义TCP协议 -> sokit工具(只支持windows); 阿里云物联网平台: Nb-IoT协议 -> 需要到电信或移动平台上进行测试; 作者:穆书伟
H8
528 0
|
Linux
高通平台开发系列讲解(网络篇)内外部拨号方式区别
高通平台开发系列讲解(网络篇)内外部拨号方式区别
347 0
高通平台开发系列讲解(网络篇)内外部拨号方式区别
|
小程序 物联网 机器人
基于STM32+ESP8266设计物联网产品(重点:支持微信小程序一键配网连接腾讯云平台)
基于STM32+ESP8266设计物联网产品(重点:支持微信小程序一键配网连接腾讯云平台)
1514 0
基于STM32+ESP8266设计物联网产品(重点:支持微信小程序一键配网连接腾讯云平台)