编写设备驱动之i2c_client

news2024/12/27 4:05:43

编写设备驱动之i2c_client


文章目录

  • 编写设备驱动之i2c_client
  • 参考资料:
    • 一、I2C总线-设备-驱动模型
    • 二、 编译i2c_driver
    • 三、编写测试程序
    • 四、多种方法生成i2c_client并测试
      • 4.1 在用户态生成
      • 4.2 编写代码
      • 4.3 使用设备树生成
        • 2. IMX6ULL
      • 4.4 上机测试
  • 致谢


参考资料:

  • Linux内核文档:

    • Documentation\i2c\instantiating-devices.rst
    • Documentation\i2c\writing-clients.rst
  • Linux内核驱动程序示例:

    • `drivers/eeprom/at24.c

一、I2C总线-设备-驱动模型

在这里插入图片描述

二、 编译i2c_driver

  • 增加Makefile

  • 设置工具链

    • IMX6ULL

      export ARCH=arm
      export CROSS_COMPILE=arm-linux-gnueabihf-
      export PATH=$PATH:/home/book/work/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
      
      • 编译

三、编写测试程序

  • 编程

  • 设置工具链

    • 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
      
  • 编译

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

四、多种方法生成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>;
		};
```shell
make dtbs
```
  • 复制到NFS目录:

    $ cp arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v1.dtb ~/nfs_rootfs/
    
  • 确定设备树分区挂载在哪里

    在开发板上执行cat /proc/mounts后,可以得到两种结果(见下图):

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

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

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

在这里插入图片描述

    * 更新设备树

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

2. IMX6ULL

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

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

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

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

    make dtbs
    
  • 复制到NFS目录:

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

    [original@ubuntu22.04:~]# cp /mnt/imx6ull-14x14.dtb /boot
    [original@ubuntu22.04:~]# sync
    
  • 重启开发板

4.4 上机测试

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

  • 挂载NFS

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

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

      [original@ubuntu22.04:~]#  mount -t nfs -o nolock,vers=3 192.168.1.137:/work/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驱动、使用设备树

    • 执行测试程序

      [original@ubuntu22.04:~]# /mnt/ap3216c_drv_test
      APP read : 01 00 00 00 8f bf
      

致谢

以上笔记源自韦东山老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

prometheus的remotewrite解析

特性 目的是为了向远端的存储写入数据。 为了提高写入效率&#xff0c;Prometheus在将采集到的samples写入远程存储之前&#xff0c;会先缓存在内存队列中&#xff0c;然后打包发送给远端存储。而这个内存队列的配置参数&#xff0c;对于Prometheus写入远程存储的效率影响较大…

《MySQL高级篇》十一、事务基础知识

文章目录1. 数据库事务概述1.1 存储引擎支持情况1.2 基本概念1.3 事务的ACID特性1.4 事务的状态2. 如何使用事务2.1 显式事务2.2 隐式事务2.3 隐式提交数据的情况2.4 使用举例1&#xff1a;提交与回滚2.5 使用举例2&#xff1a;测试不支持事务的Engine2.6 使用举例3&#xff1a…

STL中的队列用法整理

STL中的队列先进先出队列&#xff08;FIFO&#xff09;主要方法代码示例输出优先级队列模版原型主要对方法有代码示例int的大顶堆运行结果int的小顶堆运行结果使用自定义的比较函数的优先队列代码示例运行结果双端队列主要方法示例运行结果有关双端队列的题目先进先出队列&…

Vue生命周期,总也学不会,所以我详细整理了一下

今天&#xff0c;我和大家一起来对vue生命周期做一个整理和思考&#xff0c;希望有缘人看到我的年度整理和思考&#xff0c;如果觉得靠谱呢&#xff0c;就交个朋友&#xff0c;如果觉得我整理的不足&#xff0c;就请指出&#xff0c;让我们一起进步&#xff0c;让我们2023年能共…

单链表

插入&#xff1a; head 表示头结点的下标 e[i] 表示节点i的值 ne[i] 表示节点i的next指针是多少 idx 存储当前已经用到了哪个点 步骤&#xff1a;1.初始化head 2.将x插到头结点 3.插入&#xff1a;将x插到下标是k的点后面 4.将x插到下标是k的点后面 5.将下标是k的点后面…

springboot,vue影院订票系统

开发工具&#xff1a;IDEA服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8项目构建&#xff1a;maven数据库&#xff1a;mysql5.7系统用户前台和管理后台两部分&#xff0c;项目采用前后端分离前端技术&#xff1a;vue elementUI服务端技术&#xff1a;springbootmybatis项目功…

集合框架及背后的数据结构

集合框架及背后的数据结构1. 介绍2. 学习的意义2.1 Java 集合框架的优点及作用2.2 笔试及面试题3. 接口 interfaces3.1 基本关系说明3.2 Collection 接口说明3.3 Collection 常用方法说明3.4 Collection 示例3.5 Map 接口说明Map3.6 Map 常用方法说明3.7 Map 示例4. 实现 class…

免费AI改图神器,一个万能宝藏在线工具箱

说到工具箱&#xff0c;无论是在线工具&#xff0c;还是软件应用都非常多。 比如想要抠一张图片&#xff0c;如果专业处理&#xff0c;那么会使用到 Photoshop&#xff0c;需要一定的学习成本&#xff0c;想要更快捷处理&#xff0c;那么会直接使用在线工具&#xff0c;网络上…

Secret

目录 文章目录目录本节实战前言1、Opaque Secret1.创建Secret&#xff08;1&#xff09;通过data字段来创建secret资源对象&#xff08;2&#xff09;通过stringData字段来创建secret资源对象&#xff08;3&#xff09;通过kubectl create命令来创建Opaque类型的Secret资源2.使…

ROS2 基础概念 参数

ROS2 基础概念 参数1. Parameters2. 参数3. 参数查看4. 参数设置5. 参数保存6. 参数加载1. Parameters 指令功能ros2 param delete /node parameter删除参数值ros2 param describe /node parameter显示参数的相关描述ros2 param dump /file将参数保存到一个文件中ros2 param g…

LinuxDeployQT打包QT程序

系统&#xff1a;ubuntu20.04官网可直接下载使用https://github.com/probonopd/linuxdeployqt/releases&#xff0c;但是因为不支持ubuntu20所以本文通过下载源码编译的方式编译linuxdeployqt安装编译相关依赖sudo apt-get install git g libgl1-mesa-dev wget安装QTsudo apt-g…

大数据之Kafka Shell命令和Java API

文章目录前言一、Kafka相关Shell命令&#xff08;一&#xff09;创建并查询Topic&#xff08;二&#xff09;删除Topic&#xff08;三&#xff09;增加Topic的分区&#xff08;四&#xff09;生产数据到Topic&#xff08;五&#xff09;从Topic消费数据总结前言 #博学谷IT学习…

机器学习笔记之深度玻尔兹曼机(一)玻尔兹曼机系列整体介绍

机器学习笔记之深度玻尔兹曼机——玻尔兹曼机系列整体介绍引言关于含隐变量模型的对数似然梯度玻尔兹曼机受限玻尔兹曼机深度信念网络深度玻尔兹曼机引言 从本节开始&#xff0c;将介绍玻尔兹曼机系列的最后一个模型——深度玻尔兹曼机(Deep Boltzmann Machine,DBM) 关于含隐…

【状态设计优化DP】P4310 绝世好题

不愧是绝世好题和abc那道E一样&#xff0c;也是重新定义状态来优化转移复杂度的DP(56条消息) Atcoder Beginner Contest E - Work or Rest_lamentropetion的博客-CSDN博客这种其实就是通过转移方式的特殊性来设计状态&#xff0c;从而降低复杂度其实我感觉降低复杂度优化就是因…

数据结构——括号匹配问题

这是一道常见的经典的数据结构中栈的问题。题目&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09;我们运用C语言实现这个问题。有效括号调用栈由于要涉及到栈的问题&#xff0c;不可避免的要运用栈的函数接口。比较直接的方法是&#xff0c;直接复制 栈 的代…

通过windows程序计划设定nginx开机自启动

通过windows程序计划设定nginx开机自启动1、按下win键输入计划&#xff0c;回车2、找到windows目录&#xff0c;在当下目录创建新任务3、自定义名称描述4、将触发设定为开机自启动5.点击下一步&#xff0c;程序或脚本选择nginx.exe所在目录&#xff0c;要把下面的起始于 处填上…

算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树

算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树 最大二叉树 654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值…

《Linux Shell脚本攻略》学习笔记-第十一章

11.1 简介 本章将会讲述如何获取相关网络分组。CPU占用率、磁盘使用情况以及东台调用的更多信息。 11.2 使用tcpdump跟踪分组 tcpdump需要以root身份运行。 关键字port可以只显示出发往或者来自特定端口的分组 src修饰符配合特定的“关键字-值”就可以指定源文件中的这类分组。…

Linux chown 命令

Linux chown&#xff08;英文全拼&#xff1a;change owner&#xff09;命令用于设置文件所有者和文件关联组的命令。Linux/Unix 是多人多工操作系统&#xff0c;所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组&#xff0c;用户可以是用户名或者用户 …

基于机器学习 实现APT 检测(附完整代码)

项目环境概述以机器学习的方式&#xff0c;可以通过多种模型对 APT 组织所使用的恶意代码进行训练学习&#xff0c;同时由于训练的多样化&#xff0c;检测效果也会比家好。本项目采用的随机森林以及不同采样策略进行模型训练。详细设计见md文件。1.系统描述本系统主要是针对大量…