首页
学习
活动
专区
工具
TVP
发布

I2C总线架构 之 设备驱动

引言 I2C设备驱动I2C框架中最接近应用层的,其上接应用层,下接I2C核心。也是驱动开发人员需要实现的代码,在此驱动我们只需负责以下步骤(以ap3216c为例): a....添加硬件信息(设备树) b. 搭建驱动框架 c. 构建i2c_driver,并注册到linux i2c d. 注册字符设备 e. 向应用层提供i2c设备操作接口 f....而在Linux,如何与i2c设备的具体通信已经被封装成固定的API,在程序填充这些API的数据参数调用即可,列举读写单个字节的实现: static int ap3216c_read_regs(struct...注销i2c设备 注销操作:在字符驱动出口函数,卸载掉注册的i2c设备。这里调用i2c_del_driver即可实现,与i2c_add_driver是对应的。...由于Linux内部的实现较为复杂,本篇主要以设备驱动的角度来分析整个驱动的代码走向,涉及到内部API的实现,本篇只大概介绍其功能,剩余部分会放在i2c核心继续分析。

1.8K70

Linux设备驱动程序(一)——设备驱动简介

前言 这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。...一、Linux 设备驱动程序的作用 设备驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作细节。...这些代码称为设备驱动,内核必须嵌入系统中出现的每个外设的驱动,从硬盘驱动到键盘和磁带驱动器。 网络 网络必须由操作系统来管理,因为大部分网络操作不是特定于某一个进程:进入系统的报文是异步事件。...三、设备和模块的分类 以 Linux 的方式看待设备可区分为 3 种基本设备类型,每个模块常常实现 3 种类型的 1 种,因此可分类成字符模块,块模块,或者一个网络模块。...Unix 提供的对接口的存取的方式仍然是通过分配一个名子给它们(例如 eth0), 但是这个名子在文件系统没有对应的入口。 内核与网络设备驱动间的通讯与字符和块设备驱动所用的完全不同。

74941
您找到你想要的搜索结果了吗?
是的
没有找到

linux字符设备驱动

Linux设备驱动概述 操作系统内核是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备设备驱动程序是操作系统内核和机器硬件之间的接口,系统调用是操作系统内核和应用程序之间的接口。...Linux系统,应用程序访问外设是通过文件的形式来进行的,Linux将所有的外设都看做文件,统一存放在/dev目录下。...linux如何管理文件 Linux设备纳入文件系统的范畴来管理。 每个设备Linux系统上看起来都像一个文件,它们存放在/dev目录,称为"设备节点"。...Linux设备的属性 设备的类型:字符设备、块设备、网络设备; 主设备号:标识设备对应的驱动程序。...一些重要的数据结构 大部分驱动程序涉及三个重要的内核数据结构: 文件操作file_operations结构体 - 结构体file_operations在头文件 linux/fs.h定义,用来存储驱动内核模块提供的对设备进行各种操作的函数的指针

10.6K65

linux 字符设备驱动

Linux设备驱动概述 操作系统内核是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备设备驱动程序是操作系统内核和机器硬件之间的接口,系统调用是操作系统内核和应用程序之间的接口。...Linux系统,应用程序访问外设是通过文件的形式来进行的,Linux将所有的外设都看做文件,统一存放在/dev目录下。...linux如何管理文件 Linux设备纳入文件系统的范畴来管理。 每个设备Linux系统上看起来都像一个文件,它们存放在/dev目录,称为"设备节点"。...Linux设备的属性 设备的类型:字符设备、块设备、网络设备; 主设备号:标识设备对应的驱动程序。...一些重要的数据结构 大部分驱动程序涉及三个重要的内核数据结构: 文件操作file_operations结构体 - 结构体file_operations在头文件 linux/fs.h定义,用来存储驱动内核模块提供的对设备进行各种操作的函数的指针

9.5K45

linux设备驱动device_init_wakeup

device_set_wakeup_enable(dev, val); //设置设备使不使用唤醒; return 0; } // 设备模型的 所有设备 都有两个标志来控制 唤醒事件(可使得设备或系统退出低功耗状态...看struct device结构体,里面有一个成员struct dev_pm_info power,来看一看struct dev_pm_info,来自include/Linux/pm.h文件: struct...,设备驱动为了支持linux的电源管理,有责任调用device_init_wakeup()来初始化can_wakeup。...而should_wakeup则是在设备的 电源状态发生变化时 被device_may_wakeup()用来测试,测试它该不该变化。 can_wakeup,标识本设备是否具有唤醒能力。...只有具备唤醒能力的设备,才会在sysfs中有一个power目录,用于提供所有的wakeup信息。

2.3K10

Linux系统驱动I2C协议

视频观看 百问网驱动大全 I2C协议 参考资料: i2c_spec.pdf 1....下图:白色背景表示"主→从",灰色背景表示"从→主" 3.3 I2C信号 I2C协议数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。...双方设备,某个设备发送数据时,另一方怎样才能不影响SDA上的数据?...举例:主设备发送(8bit)给从设备 前8个clk 从设备不要影响SDA,从设备驱动三极管 主设备决定数据,主设备要发送1时不驱动三极管,要发送0时驱动三极管 第9个clk,由从设备决定数据...当它就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用I2C总线了。 对于IIC协议它只能规定怎么传输数据,数据是什么含义由从设备决定。

2.8K20

Linux I2C驱动入门,建议收藏!

Linux内核将 I2C 驱动分为两部分: I2C 总线驱动I2C总线驱动就是SOC的 I2C控制器驱动,也叫做 I2C适配器驱动。...I2C驱动 i2c_driver 类似 platform_driver,是我们编写 I2C 设备驱动重点要处理的内容, i2c_driver 结构体定义在 include/linux/i2c.h 文件...I2C设备 I2C设备结构体i2c_client 结构体定义在 include/linux/i2c.h 文件,内容如下: struct i2c_client { unsigned short...Linux 内核将 SOC 的 I2C 适配器(控制器)抽象成 i2c_adapter, i2c_adapter 结构体定义在 include/linux/i2c.h 文件,结构体内容如下: /*...Linux I2C总线的运行机制: 注册I2C驱动I2C驱动添加到I2C总线的驱动链表 遍历I2C总线上的设备链表,根据i2c_device_match函数进行匹配,如果匹配调用i2c_device_probe

2.8K20

Linux设备驱动之字符设备(二)

通过上一节Linux设备驱动字符设备(一)了解了Linux设备驱动的分类,设备号的构成,设备号的申请以及设备号的释放。 在Linux内核中使用struct cdev结构来代码字符设备。...struct kobject kobj 内核的内嵌对象,是Linux设备驱动模型的重要成员。...struct list_head 用来将系统字符设备形成的链表 dev_t dev 字符设备设备号,由主次设备号组成 unsigned int count 次设备号的个数,用于表示驱动程序管理的同类设备的个数...字符设备的注册 在前面知道了如何分配字符设备,以及初始化。接下来的任务就是将字符设备注册到系统中去。内核提供了cdev_add函数,用来将一个字符设备加入到系统。...该部分在后面Linux字符设备框架一节会详细分析,目前只要明白主要流程即可。 字符设备的注销 当驱动程序需要从系统卸载的时候,就需要使用cdev_del释放字符设备占用的内存。

6K20

Linux设备驱动之字符设备(一)

Linux设备驱动的分类 从上图可以看到Linux系统将各异的设备分为三大类:字符设备,块设备和网络设备。内核针对每一类设备都提供了对应驱动模型架构,包括基本的内核设施和文件系统接口。...字符设备:在传送过程以字符为单位,一个字节一个字节的读写,不能随机的读写数据,因为这类设备读写速度比较缓慢(因而其内核设施不提供缓存机制),常见的字符设备有键盘,鼠标已打印机设备等。...主设备号用来标识对于的设备驱动程序,而次设备号则由驱动程序使用,用来标识它所管理的若干同类设备设备号的表示 在linux系统设备号用dev_t表示。这是个32位的无符号整数。..._kernel_dev_t; 在内核,dev_t的低20位用来表示次设备号,高12位用来表示主设备号。...随着Linux系统的演变,上述的主次设备号的分发可能在将来会发生变化,所以设备驱动程序开发者应该避免直接使用主次设备号所占的位宽来获得对于的主设备号或次设备号。

7.1K52

【玩转ESP32】6、驱动i2c设备

前言:在上文中聊了i2c-tools,主要使用命令行,本文使用代码驱动设备。...本文以驱动oled展开,关于oled的详细说明,可查看一文彻底了解SSD1306驱动0.96寸OLED,在这里只聊esp32的i2c如何使用。...1、初始化 (1)配置i2c:指定i2c的引脚、模式、速率等; (2)安装i2c驱动:设置发送、接收缓冲,指定中断等; 这个代码基本是固定的,当做主机的时候都可以使用以下代码来初始化 static esp_err_t...(1)创建一个句柄 (2)产生起始信号 (3)写设备地址 (4)写数据 (5)结束信号 (6)主机发送命令,通知阻塞任务 (7)删除句柄 其中2、3、4、5属于标准i2c的流程,1、6、7属于esp32...(1)创建一个句柄 (2)产生起始信号 (3)写设备地址 (4)读数据 (5)结束信号 (6)主机发送命令,通知阻塞任务 (7)删除句柄 其中2、3、4、5属于标准i2c的流程,1、6、7属于esp32

1.7K20

Linux驱动开发: 块设备驱动开发

设备是与字符设备并列的概念, 这两类设备Linux 驱动的结构有较大差异,总体而言, 块设备驱动比字符设备驱动要复杂得多,在 I/O 操作上表现出极大的不同,缓冲、 I/O 调度、请求队列等都是与块设备驱动相关的概念...在Linux驱动对块设备的输入或输出(I/O)操作,都会向块设备发出一个请求,在驱动中用request结构体描述。...但对于一些磁盘设备而言请求的速度很慢,这时候内核就提供一种队列的机制把这些I/O请求添加到队列(即:请求队列),在驱动中用request_queue结构体描述。...,其工作是管理块设备的请求队列,决定队列的请求的排列顺序以及什么时候派发请求到设备。...绝大多数硬盘都是固定硬盘,被永久性地密封固定在硬盘驱动

31.8K30

Linux设备驱动模型-Bus

前言 在linux设备驱动模型,总线可以看作是linux设备模型的核心,系统的其他设备以及驱动都是以总线为核心围绕。不过驱动程序员在系统创建一条总线的机会并不多。...驱动模型的总线可以是真是存在的物理总线(USB总线,I2C总线,PCI总线),也可以是为了驱动模型架构设计出的虚拟总线(Platform总线)。...为此linux设备驱动模型都将围绕"总线--设备--驱动"来展开,因为符合linux设备驱动模型的设备驱动都是必须挂载在一个总线上的,无论是实际存在的或者虚拟的。....match: 当一个设备或者驱动添加到此总线上的时候,bus就会调用match对设备驱动一一匹配的。...p: 一个用来管理总线上设备驱动的数据结构。

3.8K20

Linux设备驱动详解

Linux系统一次读取磁盘的大小是一个块,而不是一个扇区,块设备驱动由此得名。 二、块设备处理过程 1、linux 内核,块设备将数据存储与固定的大小的块,每个块都有自己的固定地址。...Linux内核设备和其他模块的关系如下。 ? 1、块设备的处理过程涉及Linux内核的很多模块,下面简单描述之间的处理过过程。   ... ?...(Linux系统,对块设备的IO请求,都会向块设备驱动发出一个请求,在驱动中用request结构体描述) 内核结构如下:. struct request { struct list_head queuelist...(也可以不用注册设备驱动一样可以工作,该函数和字符设备的register_chrdev()函数相对应,对于大多数的块设备,第一个工作就是相内核注册自己,但是在Linux2.6以后,register_blkdev

5.3K30
领券