总线速度有三种模式 标准模式 100kbps 快速模式 400kbps 高速模式 3.4Mbps I2C子系统框架 I2C设备驱动层:drivers/i2c/i2c-dev.c (通用型) 或者为特定设备定制的设备驱动...是I2C从机的驱动程序 给用户提供调用接口 内核提供两种方式来实现设备驱动: 第一种是内核默认实现的通用型的I2C设备驱动,位于drivers/i2c/i2c-dev.c中。...I2C设备驱动层 笔者先从内核提供的通用驱动开始分析,最后在文末给出特定驱动的分析。...内核提供了一个通用于所有设备的I2C设备驱动,用户可以在应用层实现对I2C的驱动,其实现位于drivers/i2c/i2c-dev.c中。...核心层分析可知,I2C总线是根据id_table进行匹配,所以这里并不会按照常规的Linux驱动模型进行match后probe,况且这个驱动里也没有probe方法。
浅谈 Linux 内核无线子系统 Linux 内核是如何实现无线网络接口呢?数据包是通过怎样的方式被发送和接收呢?...1 全局概览 在开始探索 Linux 无线具体细节之前,让我们先来把握一下 Linux 无线子系统整体结构。如图1,展示了 Linux 无线子系统各个模块之间的抽象关系。 ?...通常我们把 Linux 内核无线子系统看成两大块: cfg80211 和 mac80211 ,它们连通内核其他模块和用户空间的应用程序。...Linux 内核无线子系统统一各种 WiFi 设备,并处理 OSI 模型中最底层的 MAC 、 PHY 两层。 若进一步划分, MAC 层可以分为 MAC 高层和 MAC 底层。...Linux 子系统实现大部分的 MAC 高层回调函数。 2 模块间接口 从图一中我们可以看出,各个模块之间分界线很清晰,并且模块间相互透明不可见。模块之间一般不会相互影响。
用户态直接访问,使用内核提供的驱动程序 dev-interface ? ? ? ?...驱动程序编译进内核才有效,I2c-dev.c依赖于那些配置项,查看makefile ? makemenuconfig,搜索CONFIG_I2C_CHARDEV ? ? ?...重启内核,编译新内核,之后下载到开发板 ? ? ?
下面我们自己编写I2C总线驱动,先看下内核的总线驱动怎么写的。 参考内核自带的适配器adapter,搜索配置文件 ?...源码如下: #include #include #include #include #include #include #include #include #include #include #include #include <linux...make uImage 编译内核,加载新内核后重新启动。 装载驱动成功 ? 读写测试 ?
1.硬件协议 1.1mini2440 I2C设备如图所示 ? 1.2 I2C协议如下: ? 1.3启动和停止信号如下图 ? 1.4 I2C总线数据传输时序: ?...注意:I2C设备读之前先写! ?...2.软件框架 2.1总线-设备-驱动模型如下图所示 把某个结构体,左右的放入链表,一一比较,匹配调用probe函数 设备链表 driver链表, 总线提供了match函数 ?...linux-2.6.22.6\Documentation\i2c\instantiating-devices 2.2如何构造I2C_CLIENT?设备的4种构建方法 2.1方法一: ?...2.4第四种 从I2C总线上分辨出某个设备 ? 前面的3种方法都要事先确定适配器(I2C总线,I2C控制器) 如果我事先并不知道这个I2C设备在哪个适配器上,怎么办?
# 前言 开发过单片机的小伙伴可以看一下我之前的一篇文章从单片机开发到linux内核驱动,以浅显易懂的方式带你敲开Linux驱动开发的大门。...# 正文 用户空间的每个函数(用于使用设备或者文件的),在内核空间中都有一个对应的功能相似并且可将内核的信息向用户空间传递的函数。 下表为几种设备驱动事件和它们在内核和用户空间对应的接口函数。...memory.c /** * * 驱动初始化 */ /* Necessary includes for device drivers */ #include <linux...这个函数工作在内核空间,用于为该驱动程序的缓冲区分配内存。 * 它和我们熟悉的malloc函数很相似。 * 最后,如果注册主设备号或者分配内存失败,模块将退出。...在内核维护的设备和驱动列表中寻找你在驱动模块中注册的设备和驱动。
I2C选择总线上挂接的一个从设备是使用从地址来区分的,而SPI采用的是CS片选线 SPI子系统框架 SPI核心层: drivers/spi/spi.c SPI总线驱动层(主机控制器驱动层):drivers.../spi/spi_s3c24xx. c SPI设备驱动层:drivers/spi/spidev.c (内核提供的SPI通用设备驱动) Linux中的主从模式的总线子系统采用的是同一种分离思想,其分离的具体策略大同小异...具体的分离策略详细分析可参考Linux驱动之I2C子系统剖析中内核对I2C子系统框架的阐述。笔者在这与I2C子系统类比,列出数据结构名。...I2C等总线类似,所以不会在一些重复部分展开,具体分析可以参考的Linux驱动之I2C子系统剖析中的分析方法。...核心层中的init函数一样做了两件事,注册SPI总线和创建SPI类,这是内核驱动模型的基本套路,就不比多说了。
控制器驱动 I2C 总线驱动重点是 I2C 适配器驱动,这里要用到两个重要的数据结构:i2c_adapter 和 i2c_algorithm。...其中,Linux 内核将 SOC 的 I2C 适配器(控制器)抽象成 i2c_adapter。...Linux 内核使用的虚拟地址 i2c->base = devm_ioremap_resource(&pdev->dev, res); ........); //向 Linux 内核注册 i2c_adapter ret = i2c_add_numbered_adapter(&i2c->adap); platform_set_drvdata...因此,对于 Linux 来讲,不区分 I2C 控制器和 I2C 从机设备,用的都是同一套东西,即【总线、设备、驱动】框架,都有 probe 函数。
为了对多种不同类型的输入设备进行统一的处理,内核在字符设备驱动上抽象出一层,即输入子系统。...输入子系统由三部分组成: 事件驱动层 输入核心层 设备驱动层 事件驱动层负责处理和应用程序的接口,向应用程序提供简单的、统一的事件接口。 设备驱动层负责与底层输入设备的通信。...输入核心层负责各个结构体的注册以及事件驱动层与设备驱动层的数据传递。 事件驱动层是内核提供的,对所有输入类设备都是通用的,内核里已经支持所有的事件驱动。而驱动开发则只需针对具体输入设备实现设备驱动。...事件驱动层 内核在事件驱动层中实现了一个输入设备通用的事件驱动,即evdev,其实现在driver/input/evdev.c中。无论是按键、触摸屏还是鼠标,都会通过evdev进行输入事件的处理。...设备驱动层 以usbmouse.c为例分析鼠标的设备驱动,鼠标是挂载在usb总线下,笔者在这里将usb相关的代码忽略,只关心输入子系统有关的代码。
何为Misc设备 Linux驱动分为字符设备驱动、块设备驱动和网络设备驱动,而字符设备又包括很多种,内核使用主设备号来区分各个字符设备驱动,在include/linux/major.h文件中已经预先定义好了各类字符设备的主设备号...使用Misc设备的好处 Misc子系统使用一个统一的主设备号来管理,当需要注册Misc驱动时,内核会为其分配次设备号。...(misc_class); fail_remove: remove_proc_entry("misc", NULL); return err; } 先是创建了Misc类,随后将Misc子系统实现为字符设备驱动来注册到内核中...总结 Misc子系统使用同一个驱动来向上提供多个设备文件节点,向下控制多个(相应的)设备。Misc驱动本质上也是字符驱动,只是它借用Misc子系统的框架来更方便的向内核注册而已。...驱动开发人员只需要把Misc设备的一些基本信息通过struct miscdevice来构建,再通过misc_register接口向内核注册即可。
附: 本文默认读者熟悉Linux设备驱动模型,不熟悉的可以先阅读这两篇blog。...Linux驱动之I2C子系统剖析 Linux驱动之SPI子系统剖析 PCI寻址 PCI系统总体布局组织为树状,从CPU连接的Host Bridge引出PCI主桥,主桥连接的是PCI总线0,可以直接连接PCI...Linux内核启动时会从PCI设备的配置寄存器里读取内存/IO起始地址以及irq,并把这些信息赋值给struct pci_dev的相应成员来生成软件描述的PCI设备。...这些信息存储的具体位置需要查阅相应PCI设备的datasheet方可得知,在内核中提供了以下几个接口来获取这些资源。...内核中使用struct pci_dev来描述PCI设备的抽象。
】由普通驱动工程师负责,【i2c 核心层】由 Linux 提供,【i2c 核心层】以下由芯片原厂负责。...I2C 子系统通过 i2c-core 将 i2c 设备驱动和 i2c 总线驱动进行了分离,从而使得 i2c 设备驱动中不用关心 i2c 总线传输细节,专注于 i2c 设备逻辑的实现。...其中,Linux 内核将 SOC 的 I2C 适配器(控制器)抽象成 i2c_adapter,i2c_algorithm 只是一些 i2c 传输的实现函数合集。...在 Linux 系统中有如下节点: 2、I2C Data Structure 我们要搞懂一个 Linux 子系统,必须研究它的数据结构,搞懂每个结构体存储了什么东西,才能梳理清楚该子系统的架构。...I2C 子系统有几个主要的结构体: I2C 控制器:i2c_adapter、i2c_algorithm、mtk_i2c I2C 设备驱动:i2c_client、i2c_driver I2C 传输:i2c_msg
3、I2C Transfer Definition of timing 想要深入探讨 I2C 协议,必须深刻理解各种时间的定义(F/S-mode) 标识符 定义 tf 信号下降时间 tr 信号上升时间...4、write data 5、read data 6、复合格式 7、I2C Transfer Regulation 以 START 条件开始 以 STOP 条件结束 传输的第一个字节为 7bit...repeated START 信号+另外一个设备地址,直接开始访问另外一个设备 8、10-bit addressing 解析如下: A9-A0 表示 10bits 地址 9、示波器波形图 10、补充 I2C
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 I2C协议 参考资料: i2c_spec.pdf 1....硬件连接 I2C在硬件上的接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻的原因以后我们再说)。 2....举例:主设备发送(8bit)给从设备 前8个clk 从设备不要影响SDA,从设备不驱动三极管 主设备决定数据,主设备要发送1时不驱动三极管,要发送0时驱动三极管 第9个clk,由从设备决定数据...当它就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用I2C总线了。 对于IIC协议它只能规定怎么传输数据,数据是什么含义由从设备决定。
Linux内核将 I2C 驱动分为两部分: I2C 总线驱动, I2C总线驱动就是SOC的 I2C控制器驱动,也叫做 I2C适配器驱动。...Linux 内核将 SOC 的 I2C 适配器(控制器)抽象成 i2c_adapter, i2c_adapter 结构体定义在 include/linux/i2c.h 文件中,结构体内容如下: /*...Linux I2C总线的运行机制: 注册I2C驱动 将I2C驱动添加到I2C总线的驱动链表中 遍历I2C总线上的设备链表,根据i2c_device_match函数进行匹配,如果匹配调用i2c_device_probe...对于我们 I2C 设备驱动编写人来说,重点工作就是构建i2c_driver,构建完成以后需要向Linux内核注册这个i2c_driver。 那么如何注册呢?...设备驱动的时候需要将前面注册的 i2c_driver 从 Linux 内核中注销掉,需要用到i2c_del_driver 函数,此函数原型如下: void i2c_del_driver(struct
gpio 和 pinctrl 子系统在内核里的使用率非常高,和嵌入式产品的关联非常大。从这两个子系统开始学习驱动开发是个不错的入门选择。...本文目录: 一、gpio 与 pinctrl 二、内核里如何引用 gpio 三、gpio 子系统框架 四、应用层如何访问 gpio 一、gpio 与 pinctrl 本文主要关注 gpio 子系统,但是老吴认为必要先说明一下...点击查看大图 本文的关注点是 gpio driver --> gpio subsystem core -> gpio consumer 这一路径,读者如果想更深入地了解 pinctrl 子系统,可以参考内核文档...gpio 子系统内核文档: Documentation/driver-api/gpio: 文档 简介 index.rst 文档目录和源码清单 intro.rst gpio 简介 driver.rst 描述如何编写.../dev/gpiochipX 直接操作字符设备是比较低效率的,内核里提供了一些 demo: $ cd linux-4_19/tools/gpio $ ls Makefile gpio-event-mon.c
Linux内核驱动模块机制 静态加载, 把驱动模块编进内核, 在内核启动时加载 动态加载, 把驱动模块编为ko, 在内核启动后,需要用时加载 2....编写内核驱动 #include #include static int __init test_init(void) { return...0; //返回0表示成功, 返加负数退出加载模块 } //__init 当内核把驱动初始化完后, 释放此函数的代码指令空间 static void __exit test_exit(void) { ....驱动模块的Makefile obj-m += test.o //源码文件为test.c modules:make -C 内核源码目录 M=驱动代码所在目录 modules modules install...:make -C 内核源码目录 M=驱动代码所在目录 modules_install INSTALL_MOD_PATH=/文件系统路径 clean:make -C 内核源码目录 M=驱动代码所在目录
4、I2C Data Transfer I2C 数据传输主要有三个 API int i2c_master_send(const struct i2c_client *client,const char...*buf,int count) client:I2C 设备对应的 i2c_client。...| restart_flag)) complete(&i2c->msg_complete); } return IRQ_HANDLED; } 优先级翻转与优先级继承 优先级翻转在可剥夺内核中是非常常见的...最终任务 L 完成所有的工作并释放了信号量,到此为止,由于实时内核知道有个高优先级的任务在等待这个信号量,故内核做任务切换。 任务 H 得到该信号量并接着运行。...Linux 用 rt_mutex 来解决该问题,rt_mutex 是带优先级继承的互斥锁。
4、I2C Synchronization And Arbitration 本文讲解三个重要的 I2C 概念:时钟延展、同步、仲裁 Data and ACK/NACK 正常情况 主接收机必须向从机发送传输结束的信号...在 Hs 模式下,此握手功能只能在字节级别使用 I2C 主设备始终控制着时钟线 SCL,不论是往设备写还是从设备读。...这也是 I2C 通信系统中,从机唯一能控制总线的时候! 关键是很多 I2C 主机不支持 clock stretching 功能,所以,无法和带有 clock stretching 功能的从机通信!...要解决这种冲突,就要进行仲裁的判决,这就是 I2C 总线上的仲裁。 I2C 总线上的仲裁分两部分:SCL 线的同步和 SDA 线的仲裁,这两部分没有先后关系,同时进行。...SDA 线的仲裁可以保证 I2C 总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线。
I2C 系列文章主要分为两个部分来写: 1、I2C spec:研究 I2C 协议本身,研究它的协议规范、传输机制。 2、I2C driver:研究 Linux I2C 驱动。...I2C 系列文章目录如下: I2C spec I2C Introduction I2C Architecture I2C Transfer I2C Synchronization And Arbitration...I2C Hs-mode I3C Introduction I3C Protocol I2C driver I2C SW Architecture I2C Data Structure I2C Register...Flow I2C Data Transfer 1、I2C Introduction I2C 历史 I2C:Inter-Integrated Circuit,集成电路总线。...I2C 是一种多主从架构总线 I2C 的读写均由 master 端发起。 I2C 通信的每一个 byte(8bits)都需要 slaver 端的回应 ACK/NACK 作为回应。
领取专属 10元无门槛券
手把手带您无忧上云