I2C设备驱动是I2C框架中最接近应用层的,其上接应用层,下接I2C核心。也是驱动开发人员需要实现的代码,在此驱动中我们只需负责以下步骤(以ap3216c为例):
I2C总线对应着/bus下的一条总线,这个i2c总线结构体管理着i2c设备与I2C驱动的匹配,删除等操作,I2C总线会调用i2c_device_match函数看I2C设备和I2C驱动是否匹配,如果匹配就调用i2c_device_probe函数,进而调用I2C驱动的probe函数。
I2C在硬件上的接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻的原因以后我们再说)。
在虚拟的I2C_Adapter驱动程序里,只要实现了其中的master_xfer函数,这个I2C Adapter就可以使用了。 在master_xfer函数里,我们模拟一个EEPROM,思路如下:
作者: 付汉杰 hankf@xilinx.com hankf@amd.com 测试环境: Vivado/PetaLinux 2021.2, Linux 5.10.0
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git 视频观看 百问网驱动大全 编写设备驱动之i2c_client 参考资料: Linux内核文档: Documentation\i2c\instantiating-devices.rst Documentation\i2c\writing-clients.rst Linux内核驱
I2C(Inter-Integrated Circuit BUS)是I2C BUS简称,中文为集成电路总线,是目前应用最广泛的总线之一。和IMX6ULL有些相关的是,刚好该总线是NXP前身的PHILIPS设计。
里面保存I2C总线驱动相关的文件,比如i2c-omap.c、 i2c-versatile.c、 i2c-s3c2410.c等。
学习 I2C 和 SPI 驱动的时候,针对 I2C 和 SPI 设备寄存器的操作都是通过相关的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问 I2C/SPI 设备的时候,为此引入了 Regmap 子系统。
介绍 Sunxi 平台上 TWI 驱动接口与调试方法,为 TWI 模块开发提供参考。
从Linux 2.6起引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。
针对音箱日常工作项目开展的前期,需要快速的适配音频子模块,方便项目的声学评估和开展,期间遇到不少的问题,其中有一些细节往往会忽略掉,然而正好是问题的所在。在此背景下,遇到问题一步一步梳理,方便快速的定位出问题所在 。
把上述代码,放入arch/arm/boot/dts/100ask_imx6ull-14x14.dts的根节点下面。
来自: http://www.diybl.com/course/6_system/linux/Linuxjs/200871/129585.html
笔记: 调试步骤: 1. BLSPcheck:主要确认GPIO功能和BLSP通道 2. pinctrl文件配置 3. 平台设备树文件配置 4. 时钟文件修改 5. 添加从设备: 1 设备树注册方法 2 设备数节点创建
传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。pinctrl 子系统就是为了解决这个问题而引入的,pinctrl 子系统主要工作内容如下:
i2c_apdater核心是master_xfer函数,它的实现取决于硬件,大概代码如下:
这篇文章介绍了一种基于I2C接口的EEPROM存储器读写方法,包括地址位、数据位以及控制命令的发送。作者通过一个例子详细展示了读写EEPROM的步骤和注意事项。此外,文章还介绍了如何使用I2C接口实现EEPROM存储器的硬件电路设计和驱动程序。
i2c_driver跟i2c_client匹配成功后,就调用i2c_driver.probe函数。
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git 视频观看 百问网驱动大全 I2C视频介绍 参考资料: I2CTools:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/ 1. I2C硬件框架 📷 在一个芯片(SoC)内部,有一个或多个I2C控制器 在一个I2
总线代表着同类设备需要共同遵守的工作时序,不同的总线对于物理电平的要求是不一样的,对于每个比特的电平维持宽度也是不一样,而总线上传递的命令也会有自己的格式约束。如I2C总线、USB总线、PCI总线等等。以I2C总线为例,在同一组I2C总线上连接着不同的I2C设备。
今天来个简单且常见的命令分享。i2c-tools的相关命令常用于linux系统读写i2c设备寄存器的在线调试。 安装命令: apt-get update apt-get install i2c-tools linux版本代码下载路径: https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/ 一、i2cdetect 1、命令 root@linaro-alip:/# i2cdetect Error: No i2c-bus specified!
前言 Linux的IIC驱动想必大家都耳熟能详,网上也有很多相关的教程。 网上的教程总结,比如: 方法问题描述Linux 3.X.X版本之后,设备树+驱动此方法是比较符合linux驱动的写法的。当对于不熟悉设备树的小伙伴,写起来比较棘手使用 i2c-tools,并通过脚本或者应用程序编写设备驱动(简单粗暴)此方法是将设备驱动丢到用户态中,对于一些的设备除了I2C通信还有一些引脚也要控制的,此方法写起来将非常痛苦直接操作i2c总线驱动。(简单粗暴)此方法是将设备驱动丢到用户态中,对于一些的设备除了I2C通信还
很多学员有过STM32的学习经验,他们手上的开发板很多,LCD也很多。 一个LCD还挺贵的,不能浪费。 各家的LCD引脚顺序都不一样,所以别家的LCD不能直接接到100ASK_IMX6ULL开发板,需要转接板。 大部分单片机学员都是使用正点原子、野火的板子,有他们的屏。 针对这两家的屏,我们做了转接板,如下:
APP访问硬件肯定是需要驱动程序的, 对于I2C设备,内核提供了驱动程序drivers/i2c/i2c-dev.c,通过它可以直接使用下面的I2C控制器驱动程序来访问I2C设备。 框架如下:
为了方便查找,我们加入了一个显示功能引脚位置的功能,运行以下命令,查看板子的40pin引脚上有几个可用i2c
Regmap 机制是在 Linux 3.1 加入进来的特性。主要目的是减少慢速 I/O 驱动上的重复逻辑,提供一种通用的接口来操作底层硬件上的寄存器。其实这就是内核做的一次重构。Regmap 除了能做到统一的 I/O 接口,还可以在驱动和硬件 IC 之间做一层缓存,从而能减少底层 I/O 的操作次数。
SMBus: System Management Bus,系统管理总线。 SMBus最初的目的是为智能电池、充电电池、其他微控制器之间的通信链路而定义的。 SMBus也被用来连接各种设备,包括电源相关设备,系统传感器,EEPROM通讯设备等等。 SMBus 为系统和电源管理这样的任务提供了一条控制总线,使用 SMBus 的系统,设备之间发送和接收消息都是通过 SMBus,而不是使用单独的控制线,这样可以节省设备的管脚数。 SMBus是基于I2C协议的,SMBus要求更严格,SMBus是I2C协议的子集。
读I2C数据时,要先发出设备地址,这是写操作,然后再发起读操作,涉及写、读操作。所以以读I2C数据为例讲解核心代码。
这里连接0.96吋 oled,也是比较常用的一个i2c设备,连接在gpio21和gpio22上。
在嵌入式开发仲,有时候需要确认硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试I2C总线的工具——i2c-tools。
高通平台8953 Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953 android7.1实例分析篇)
总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。举个例子,充电墙壁插座安静的嵌入在墙面上,无论设备是电脑还是手机,插座都能依然不动的完成它的使命——充电,没有说为了满足各种设备充电而去更换插座的。其实这就是软件工程强调的高内聚、低耦合概念。
在之前的 「《I2C总线架构 之 设备驱动》」 和 「《I2C总线架构 之 总线驱动》」 中一再提到i2c核心,本篇文章就总结一下i2c核心的主要功能。
在嵌入式开发中,有时候需要确认硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试 I2C 总线的工具:i2c-tools。
idr在linux内核中指的就是整数ID管理机制,从本质上来说,这就是一种将整数ID号和特定指针关联在一起的机制。这个机制最早是在2003年2月加入内核的,当时是作为POSIX定时器的一个补丁。现在,在内核的很多地方都可以找到idr的身影。
调试IIC过程中,需要准备示波器或逻辑分析仪,需要通过示波器查看波形确定硬件连接是否正确,不然出现问题,软件再怎么调试,都是枉然.
最近遇到 i2c 传输慢的问题,正常一笔 i2c 传输 52 bytes 应该在 1ms 内返回,但是偶尔出现 6 ~ 7ms 才返回,不满足要求,因此研究一下 ftrace 工具,分析 i2c 传输到底慢在哪里。怀疑:
ChatGPT也热火朝天了有一段时间了,今天闲来没事,也想着玩一玩ChatGPT,看看是不是网上说的那么强大!
[导读] Linux设备林林总总,嵌入式开发一个绕不开的话题就是设备驱动开发,在做具体设备驱动开发之前,有必要对Linux设驱动模型有一个相对清晰的认识,将会帮助驱动开发,明白具体驱动接口操作符相应都做些什么。
单片机的IIC编程中,如果我们直接一点,只需要控制IIC硬件GPIO脚,然后根据IIC协议模拟各种电平时序实现与IIC设备的通信。但是这种编程方法,移植性较差(假如新加了一种IIC设备,同样的代码,又要重新复制一份)。这种做法完全不适应Linux的通用性的设计理念,对于Linux来讲:同样的事情我只做一遍,向外提供接口,不管你是什么IIC设备挂载那条IIC总线上,都可以用。因此,这就需要Linux在代码架构上有非常严谨的模块化设计。
实际项目的调试中,往往需要快速修改驱动芯片(只针对IIC通讯)中对应寄存器的值,传统的方式一般是编译驱动 -> 烧录固件 -> 测试,而这样的方式往往很繁琐。这里介绍使用i2c-tools快速修改驱动芯片的寄存器方式1
把某个结构体,左右的放入链表,一一比较,匹配调用probe函数 设备链表 driver链表, 总线提供了match函数
最近几年,边缘计算的需求急剧爆发。人工智能、物联网和 5G 的演进给边缘计算带来了无限的可能性。因为工作原因,有幸在2019开始接触了英伟达 Jetson 家族的各种边缘计算设备:Nano,TX2,AGX,NX等,其操作系统使用的是 Ubuntu 18.02。我们可以作为独立的小型服务器使用,试问又有哪一个程序猿会拒绝拥有一台自己的小电脑呢?在其上,特别是拥有GPU的服务器上,我们可以折腾无限的可能。
领取专属 10元无门槛券
手把手带您无忧上云