首页 > 其他分享 >编写设备驱动之i2c_client -10

编写设备驱动之i2c_client -10

时间:2023-07-30 21:44:27浏览次数:36  
标签:10 100ask boot client linux i2c arm ap3216c

编写设备驱动之i2c_client

参考资料:

  • Linux内核文档:

    • Documentation\i2c\instantiating-devices.rst

    • Documentation\i2c\writing-clients.rst

  • Linux内核驱动程序示例:

    • drivers/eeprom/at24.c

  • 本节代码:GIT仓库中

    • IMX6ULL\source\04_I2C\03_ap3216c_ok

    • STM32MP157\source\A7\04_I2C\03_ap3216c_ok

1. I2C总线-设备-驱动模型

 

2. 编译i2c_driver

  • 增加Makefile

  • 设置工具链

    • IMX6ULL

      export ARCH=arm
      export CROSS_COMPILE=arm-linux-gnueabihf-
      export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
    • STM32MP157

      source /home/book/100ask_stm32mp157_pro-sdk/ToolChain/openstlinux_eglfs-linux-gnueabi/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
      export ARCH=arm
      export CROSS_COMPILE=arm-ostl-linux-gnueabi-

       

  • 编译

     

3. 编写测试程序

  • 编程

  • 设置工具链

    • IMX6ULL

      export ARCH=arm
      export CROSS_COMPILE=arm-linux-gnueabihf-
      export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
    • STM32MP157 注意:对于STM32MP157,编译内核/驱动、编译APP的工具链不一样

      export ARCH=arm
      export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
      export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

       

  • 编译

    // imx6ull
    arm-linux-gnueabihf-gcc -o ap3216c_drv_test ap3216c_drv_test.c

    // stm32mp157
    arm-buildroot-linux-gnueabihf-gcc -o ap3216c_drv_test ap3216c_drv_test.c

     

     

4. 多种方法生成i2c_client并测试

4.1 在用户态生成

示例:

// 在I2C BUS0下创建i2c_client
# echo ap3216c 0x1e > /sys/bus/i2c/devices/i2c-0/new_device

// 删除i2c_client
# echo 0x1e > /sys/bus/i2c/devices/i2c-0/delete_device

 

4.2 编写代码

  • i2c_new_device

  • i2c_new_probed_device

  • i2c_register_board_info

    • 内核没有EXPORT_SYMBOL(i2c_register_board_info)

    • 使用这个函数的驱动必须编进内核里去

 

4.3 使用设备树生成

在某个I2C控制器的节点下,添加如下代码:

        ap3216c@1e {
compatible = "lite-on,ap3216c";
reg = <0x1e>;
};
1. STM32MP157
  • 修改arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v1.dts,添加如下代码:

    &i2c1 {
    ap3216c@1e {
    compatible = "lite-on,ap3216c";
    reg = <0x1e>;
    };
    };

    注意:设备树里i2c1就是I2C BUS0。

     

  • 编译设备树: 在Ubuntu的STM32MP157内核目录下执行如下命令, 得到设备树文件:arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v1.dtb

    make dtbs
  • 复制到NFS目录:

    $ cp arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v1.dtb ~/nfs_rootfs/

     

  • 确定设备树分区挂载在哪里

    由于版本变化,STM32MP157单板上烧录的系统可能有细微差别。 在开发板上执行cat /proc/mounts后,可以得到两种结果(见下图):

    • mmcblk2p2分区挂载在/boot目录下(下图左边):无需特殊操作,下面把文件复制到/boot目录即可

    • mmcblk2p2挂载在/mnt目录下(下图右边)

      • 在视频里、后面文档里,都是更新/boot目录下的文件,所以要先执行以下命令重新挂载:

        • mount /dev/mmcblk2p2 /boot

       

  • 更新设备树

    [root@100ask:~]# cp /mnt/stm32mp157c-100ask-512d-lcd-v1.dtb /boot
    [root@100ask:~]# sync
  • 重启开发板

     

2. IMX6ULL
  • 修改arch/arm/boot/dts/100ask_imx6ull-14x14.dts,添加如下代码:

    &i2c1 {
    ap3216c@1e {
    compatible = "lite-on,ap3216c";
    reg = <0x1e>;
    };
    };

    注意:设备树里i2c1就是I2C BUS0。

     

  • 编译设备树: 在Ubuntu的IMX6ULL内核目录下执行如下命令, 得到设备树文件:arch/arm/boot/dts/100ask_imx6ull-14x14.dtb

    make dtbs
  • 复制到NFS目录:

    $ cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs/
  • 更新设备树

    [root@100ask:~]# cp /mnt/100ask_imx6ull-14x14.dtb /boot
    [root@100ask:~]# sync
  • 重启开发板

4.4 上机测试

以下命令在开发板中执行。

  • 挂载NFS

    • vmware使用NAT(假设windowsIP为192.168.1.100)

      [root@100ask:~]# mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 
      192.168.1.100:/home/book/nfs_rootfs /mnt
    • vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为192.168.1.137

      [root@100ask:~]#  mount -t nfs -o nolock,vers=3 192.168.1.137:/home/book/nfs_rootfs /mnt

 

  • 复制、执行程序

    看视频。

    • 先安装i2c_driver驱动

      // 对于IMX6ULL,想看到驱动打印信息,需要先执行
      echo "7 4 1 7" > /proc/sys/kernel/printk

      insmod /mnt/ap3216c_drv.ko
    • 在生成i2c_client 有3种方法,前面介绍了:用户态生成、安装ap3216c_client驱动、使用设备树

    • 执行测试程序

      [root@100ask:~]# /mnt/ap3216c_drv_test
      APP read : 01 00 00 00 8f bf

       

    •  

     

标签:10,100ask,boot,client,linux,i2c,arm,ap3216c
From: https://www.cnblogs.com/liusiluandzhangkun/p/17592101.html

相关文章

  • games101 HomeWork6
    Games101HomeWork6导航导航作业要求IntersectP(constRay&ray,constVector3f&invDir,conststd::array<int,3>&dirIsNeg)intheBounds3.hpp:这个函数的作用是判断包围盒BoundingBox与光线是否相交,你需要按照课程介绍的算法实现求交过程。getIntersection(BVHBuil......
  • 110. 平衡二叉树
    给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例1:输入:root=[3,9,20,null,null,15,7]输出:true#Definitionforabinarytreenode.#classTreeNode:#def__init__(se......
  • 编写设备驱动之i2c_driver -9
    参考资料:Linux内核文档:Documentation\i2c\instantiating-devices.rstDocumentation\i2c\writing-clients.rstLinux内核驱动程序示例:drivers/eeprom/at24.c本节代码:GIT仓库中框架:IMX6ULL\source\04_I2C\02_i2c_driver_exampleSTM32MP157\source\A......
  • 通用驱动i2c-dev分析
    参考资料:Linux驱动程序:drivers/i2c/i2c-dev.cI2C-Tools-4.2:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/AT24cxx.pdf1.回顾字符设备驱动程序怎么编写字符设备驱动程序?确定主设备号创建file_operations结构体在里面填充drv_open/dr......
  • AI语音克隆101
    人工智能语音克隆(也称为语音合成或语音复制)允许计算机模仿人类语音模式并产生令人惊讶的合成声音。本文讨论了AI语音克隆的想法、用途、优点、缺点以及从娱乐到可访问性的潜在未来进展。了解AI语音克隆AI语音克隆,特别是语音合成,是机器学习和自然语言处理(NLP)的一个有趣领域。......
  • Gym103687K Dynamic Reachability
    一个很奇妙的题。回想起之前打的一场模拟赛,有一道题的部分问题是要维护动态图两两联通性的。可能不太一样,但是他有一个离线的思想,将没有修改过的边提前拎出来,把已知的联通性先求了,再用线段树分治一类的可撤销做法维护剩下边的修改。但是这样维护的复杂度跟修改次数相关非常大,如果......
  • 10_Spring_CGLIB动态代理
    10_Spring_CGLIB动态代理proxy动态代理面向接口1必须有接口和实现类2增强接口中定义的方法3只能读取接口中方法的上注解cglib动态代理模式面向父类packagecom.msb.testCglib;importorg.junit.Test;importorg.springframework.cglib.proxy.Enhancer;importorg.s......
  • c语言之判断100-200内的素数
    intmain()//判断100-200内的素数{ //判断素数,即只能被1和他自身整除 //1.试除法 //假设13为素数,就拿2-12的数来试着整除,若可以那就不是素数,若不可以就是素数 //由此可知:如果2到i-1的数可以被i给整除,那么i就不是素数 inti=0; intcount=0; for(i=100;i<=200;i+......
  • Soft Rasterizer (SoftRas) windows10 vscode 运行 环境配置记录
    配了好几天,一边搜索一边配,记录下做了些什么。我的环境:windows10,vscode,RTX3090配置cl环境变量安装openssl,配置环境变量安装libtorch,配置环境变量打开对应的虚拟环境里面的打开torch\include\ATen\Parallel.h,将inlineTORCHAPIvoidlazyinitnumthreads()的实现......
  • Sqli-labs靶场之SQL手注通关详解(Less 1~10)
    Less-1 GET-Errorbased-Singlequotes-String判断注入点,这里的页面中没有可以注入的地方,因此可以判断注入点在url栏。判断注入类型id=1and1=1页面正常id=1and1=2页面正常id=1'and1=1--+页面正常id=1'and1=2--+ 页面正常由此可以判断该注入......