全志平台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设备并通过驱动控制的整个过程。

相关文章
|
传感器 监控 物联网
玄铁RISC-V处理器入门与实战-RISC-V 玄铁系列开发板实践-基于玄铁C906处理器的D1 Dock Pro开发实践(下)
玄铁RISC-V处理器入门与实战-RISC-V 玄铁系列开发板实践-基于玄铁C906处理器的D1 Dock Pro开发实践
740 0
|
Linux Android开发
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
386 0
|
Linux Android开发
全志平台A40I : I2C通讯问题调试笔记
全志平台A40I : I2C通讯问题调试笔记
707 0
|
12月前
|
存储 数据安全/隐私保护 Windows
数据恢复软件合集:盘点13款数据恢复软件
我们平时在使用电脑、手机、U盘等设备时,常常会因为误删除、格式化、系统故障或其他原因丢失重要数据。面对这样的情况,知道如何进行数据恢复会很有用。今天,小编为大家挑选了13款数据恢复软件,每款都有其独特之处,适合不同用户需求。需要恢复数据的友友们,自行去相关软件官网或是靠谱的下载站下载即可。
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
385 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【2023 华数杯全国大学生数学建模竞赛】 A题 隔热材料的结构优化控制研究 问题分析及完整论文
本文提供了2023年华数杯全国大学生数学建模竞赛A题的完整论文,深入分析了隔热材料的结构优化控制研究,包括建立数学模型、求解单根纤维的热导率、优化织物结构参数以及考虑对流换热影响的模型调整,旨在开发出具有更优隔热性能的新型织物。
312 0
【2023 华数杯全国大学生数学建模竞赛】 A题 隔热材料的结构优化控制研究 问题分析及完整论文
ArcGIS:如何进行离散点数据插值分析(IDW)、栅格数据的重分类、栅格计算器的简单使用、缓冲区分析、掩膜?
ArcGIS:如何进行离散点数据插值分析(IDW)、栅格数据的重分类、栅格计算器的简单使用、缓冲区分析、掩膜?
996 0
|
传感器 编解码 Linux
V4L2框架 | MIPI Camera指令调试笔记
V4L2框架 | MIPI Camera指令调试笔记
6964 2
|
存储 Linux Android开发
Rockchip u-boot阶段命令行和代码方式读取u盘内容并解析
Rockchip u-boot阶段命令行和代码方式读取u盘内容并解析
2319 2