当前位置:首页>Linux>深入理解 Linux I2C 框架:内核子系统分层解析

深入理解 Linux I2C 框架:内核子系统分层解析

  • 2026-08-19 09:09:02
深入理解 Linux I2C 框架:内核子系统分层解析

在 Linux 系统之中,I2C 框架是极为重要的。其乃是设备之间进行通信的桥梁。宛如交通枢纽一般,使得不同的设备可以有着条理地去交换数据、一同开展工作。例如常见的传感器、EEPROM 这类设备,大多数都是经过 I2C 总线和系统的其他部分来进行通信的。

Linux 系统具备着极为强大的功能并且有着很高的可定制性。I2C 框架乃是 Linux 内核子系统当中的一个部分。它给硬件设备的驱动开发以及管理提供了一种既统一又高效的途径。我们对 I2C 框架的内核子系统分层结构开展深入的了解。这么做可以使得我们更好地去掌握 Linux 设备驱动的开发原理。还能够在实际的项目当中更加灵活地去应对各种各样硬件设备的接入以及管理方面的问题。进而从根本上来提高系统的性能以及稳定性。

一、初识 I2C 框架

面试题写作模版

1.1 I2C 总线物理拓扑与特征

I2C 总线在物理连接方面是比较简单的。其主要是由 SDA 也就是串行数据线、SCL 也就是串行时钟线以及上拉电阻所构成的。当总线处于空闲状态的时候,SDA 和 SCL 会被上拉电阻拉高,处于高电平的状态。I2C 总线上的每一个设备都能够充当主设备或者是从设备,每一个设备都有着唯一的地址,这个地址能够在 I2C 器件的数据手册当中查找到。在实际的应用过程之中,常常会把带有 I2C 总线接口的 CPU 模块当作主设备,而把总线连接的其他设备当作从设备。主设备和从设备是通过设备地址来确定通信器件的。

I2C 总线上可以挂接的设备的数量,受到总线最大电容 400pF 的限制。倘若挂接相同型号的器件,还受到器件地址位的约束。I2C 总线的数据传输速率,在标准模式之下能够达到 100kbit/s,在快速模式之下能够提高到 400kbit/s,在高速模式的时候能够高达 3.4Mbit/s。一般情况下我们可以通过 I2C 总线接口的可编程时钟来对传输速率进行调整,并且传输速率和接上拉电阻的阻值是有关系的。

1.2 I2C 总线协议

I2C 协议是有相关规定的,在总线上的数据传输是以一个起始信号作为开始的条件,并且是以一个结束信号作为停止的条件,而且起始以及结束的信号始终是由主设备来产生的。当 SCL 处于高电平的时候,SDA 从高电平往低电平进行跳变的时候,那就表明有起始条件产生了。当 SCL 处于高电平的时候,SDA 从低电平往高电平进行跳变的时候,那就表明有停止条件产生了。起始条件产生之后,总线就会处于忙碌的状态,会被本次数据传输的主从设备所独占,这时候别的 I2C 器件就没有办法去访问总线。而停止条件产生之后,本次数据传输的主从设备就会把总线释放掉,总线就又回到空闲的状态。

数据的传输乃是按照字节来予以进行的。主设备于 SCL 线上产生每一个时钟脉冲的时候,会在 SDA 线上传送一个数据位。当一个字节依循数据位从高位至低位的顺序传送完毕之后,紧接着从设备会将 SDA 线拉低,回传给主设备一个应答位,只有在这个时候才算是一个字节真正地传输完毕。但是并非所有字节的传输都必须得有应答位,例如当从设备没办法再接收主设备所发送的数据的时候,从设备就会回传一个否定的应答位。

I2C 总线上的每一个设备都具备着独一无二的地址。主设备和从设备之间的数据传输是依据这个地址来进行的。在主设备传输有效数据之前,必须得先指定从设备的地址。地址的指定过程和数据传输的过程相类似。大多数从设备的地址是 7 位的。协议当中规定还要给地址再加上一个最低位,这个最低位是用来表示数据传输的方向的,0 就代表主设备向从设备写数据,1 就代表主设备向从设备读数据 。

1.3 I2C 与 SMBus 协议对比

系统管理总线(SMBus)乃是基于 I2C 操作原理而发展起来的。它主要是为系统以及电源管理相关的任务来提供控制总线。SMBus 和 I2C 存在着相似的地方,例如都是两线的总线协议,拥有 1 个时钟线 SCL 以及 1 个数据线 SDA。它们都运用主从通信的模式,主设备提供时钟,都具备多主机的功能,数据的格式也相类似,都有着 7 位地址的格式。可是 SMBus 和 I2C 也有着许多不同之处。

在 VDD 的极限值状况之下,I2C 协议所涵盖的范围是比较宽泛的。而 SMBus 的范围是从 1.8V 到 5V。在最小时钟频率这一方面,I2C 是没有限制的,SMBus 的最小值是 10KHz。对于 Clock Stretching 的时长来说,I2C 不存在限制,SMBus 则有最大时间的限制。在地址回应方面,I2C 不存在强制回应的要求,SMBus 是强制回应的,以此来感知设备的状态。在数据传输格式方面,I2C 仅仅定义了传输的方式,格式是由设备自身来确定的,SMBus 明确了多种数据格式。

在实际的设备状况之中,SMBus 是更为经常地被予以支持的。Linux 同样也建议要优先去采用 SMBus。即便是 I2C 控制器不存在 SMBus 硬件方面的支持,也可以借助软件借助 I2C 协议来对 SMBus 协议进行模拟。

二、Linux I2C 内核子系统分层结构

面试题写作模版

2.1 硬件层:I2C 控制器与从设备

硬件层面乃是 I2C 通信的物理性根基所在。它具备 I2C 控制器以及众多的 I2C 从设备。I2C 控制器有的处于 CPU 的内部,例如在嵌入式系统的 SoC 芯片之中就存在着 I2C 控制器;有的则是以独立芯片的形式而存在。I2C 控制器所起到的作用是产生 I2C 通信所需要的时钟信号以及控制信号,如同指挥官一般,指挥着数据传输的节奏以及流程。从设备的种类是比较多的,像传感器(比如常见的温度传感器、加速度传感器这类)、EEPROM 等都属于从设备,它们会被动地响应主设备(一般就是 I2C 控制器)的命令,从而进行数据的收发操作。

从物理连接的角度来讲,I2C 控制器和从设备是通过 SDA 也就是串行数据线以及 SCL 也就是串行时钟线连接到一起的。在进行通信的时候,I2C 控制器经过 SCL 线来提供时钟信号,通过 SDA 线来传输数据。从设备接收到时钟信号之后,会根据 SDA 线上数据的变化来做出相应的动作,比如说读取数据或者写入数据相关的情况。硬件层能够稳定地运行是整个 I2C 通信的根基,后续的软件驱动层都是以硬件层作为基础来实现各种各样的功能的。

2.2 适配器驱动层:i2c_adapter 与 i2c_algorithm

适配器驱动层在 I2C 内核子系统中起着承上启下的关键作用 ,它主要涉及两个重要的结构体,i2c_adapter 和 i2c_algorithm,是底层硬件操作的核心软件封装,以下为内核标准源码结构体示例:

// I2C 适配器核心结构体(内核精简版)struct i2c_adapter {    const struct i2c_algorithm *algo;  // 绑定通信算法    struct device dev;                 // 设备属性    int nr;                            // 总线编号    unsigned int timeout;              // 传输超时时间    unsigned int retries;              // 传输重试次数};// I2C 通信算法核心结构体(内核精简版)struct i2c_algorithm {    // 主模式数据传输核心函数    int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);    // SMBus 协议传输函数    int (*smbus_xfer)(struct i2c_adapter *adap, u16 addr, unsigned short flags,                      char read_write, u8 command, int size, union i2c_smbus_data *data);    // 获取适配器支持的功能    u32 (*functionality)(struct i2c_adapter *adap);};
  1. i2c_adapter:i2c_adapter 乃是对于 I2C 控制器的软件层面的抽象之物。它恰似一个管理者一般,对整个 I2C 总线进行管理。此结构体具备许多重要的成员。设备类型成员用于标识适配器所支持的设备类型,在复杂系统当中有助于迅速判断设备是否能够被该适配器所管理。通信算法指针指向具体的通信算法,该算法决定了 I2C 控制器和从设备之间如何进行数据的传输,是通信方面的核心逻辑所在。超时和重试成员同样关键,当数据传输出现异常的时候,比如在规定时间内没有收到从设备的响应,适配器就会按照重试的次数来重新进行传输,以此来确保数据能够可靠地进行传输。在实际应用当中,要是要在系统中添加新的 I2C 设备,首先得要确保对应的 i2c_adapter 得到正确的配置以及注册,如此一来系统才能够识别并且管理新的设备 。
  2. i2c_algorithm:i2c_algorithm 提供了 I2C 适配器进行底层操作的具体途径,是实现 I2C 通信的核心算法部分。它存在几个核心函数,其中 master_xfer 函数是非常关键的。该函数承担确实现 I2C 主模式下数据传输的职责,它会依照传入的参数,例如使用该传输途径的适配器 adap、待传输的消息 msgs、消息的数量 num 等,来开展数据的发送以及接收操作。在实际的应用情形当中,当设备驱动需要向从设备发送数据的时候,就会调用 master_xfer 函数,通过 I2C 总线将数据传输到目标从设备。还有 smbus_xfer 函数,其用于实现 SMBus 协议的传输,但是要是适配器不支持 SMBus 协议的话,这个函数有可能就会被设置成为 NULL。functionality 函数是用来返回适配器所支持的功能的,比如说支不支持 10 位地址传输、支不支持 SMBus 协议等等,这对于系统在运行过程中动态地判断适配器的能力是十分重要的。

2.3 核心层:I2C Core 的关键作用

I2C Core 处于整个 I2C 内核子系统的核心之位。它好似一个大管家一般,为整个系统提供着统一的管理以及协调的机制。I2C Core 提供了一系列重要的内核通用 API,这些 API 对总线、设备、驱动的注册、注销以及匹配绑定起到支撑的作用,能够直接进行调用,不需要底层硬件方面的适配。

I2C Core 提供了统一的应用程序编程接口(API)。当设备驱动进行 I2C 通信的时候,不需要去理会底层硬件的细节之处,直接调用这些统一的 API 就可以了。举例来说设备驱动要是想要给从设备发送数据,那么就调用 I2C Core 所提供的发送数据的 API,不需要去知道具体的 I2C 控制器是如何工作的。在管理方面 I2C Core 负责适配器和设备驱动的匹配以及绑定工作。

当系统当中注册新的适配器以及设备驱动的时候,I2C Core 按照相应的规则来判断哪些设备驱动能够和哪些适配器进行匹配绑定,从而建立起设备与驱动之间的联系,使得设备能够正常地工作。I2C Core 还进行设备的探测以及地址的检测工作,自动去发现总线上的设备,检测地址方面是否存在冲突等情况,以此来确保 I2C 系统能够稳定地运行。

I2C Core 核心通信 API 代码示例如下:

#include <linux/i2c.h>// I2C 读写消息结构体初始化struct i2c_msg msg[2];u8 write_buf[2] = {0x01, 0x02};  // 写入设备寄存器地址+数据u8 read_buf[2];                  // 接收数据缓冲区// 写消息:向 0x68 设备写入数据msg[0].addr = 0x68;msg[0].flags = 0;                // 0 代表写操作msg[0].len = sizeof(write_buf);msg[0].buf = write_buf;// 读消息:从 0x68 设备读取数据msg[1].addr = 0x68;msg[1].flags = I2C_M_RD;         // I2C_M_RD 代表读操作msg[1].len = sizeof(read_buf);msg[1].buf = read_buf;// 核心层通用传输 API(重点)// adap:设备所属适配器,msg:消息数组,2:消息数量int ret = i2c_transfer(client->adapter, msg, 2);if (ret < 0) {    printk("I2C transfer failed!\n");    return ret;}

2.4 设备驱动层:i2c_client 与 i2c_driver

设备驱动层直接和具体的 I2C 设备进行相互的作用。它主要具备两个重要的结构体:i2c_client 以及 i2c_driver。这两个结构体乃是设备驱动开发的核心的承载之物。所有自行定义的 I2C 设备驱动全都是依据这两个结构体来予以实现的。核心结构体与设备匹配代码示例如下:

#include <linux/i2c.h>#include <linux/module.h>// 设备树匹配表,与设备树 compatible 字段对应static const struct of_device_id custom_i2c_of_match[] = {    { .compatible = "custom,i2c-device" },    { /* 匹配结束 */ }};MODULE_DEVICE_TABLE(of, custom_i2c_of_match);// 设备匹配成功后的初始化函数static int custom_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id){    printk("I2C device matched, addr: 0x%02X\n", client->addr);    // 此处可添加设备初始化、寄存器配置、设备节点注册等逻辑    return 0;}// 设备卸载释放函数static int custom_i2c_remove(struct i2c_client *client){    printk("I2C device removed\n");    return 0;}// 注册 I2C 设备驱动static struct i2c_driver custom_i2c_driver = {    .driver = {        .name = "custom_i2c_driver",        .of_match_table = custom_i2c_of_match,    },    .probe = custom_i2c_probe,    .remove = custom_i2c_remove,};module_i2c_driver(custom_i2c_driver);MODULE_LICENSE("GPL");
  1. i2c_client:I2C 总线上的从设备是由 i2c_client 来进行代表的,它是设备驱动和硬件设备之间的一个桥梁。i2c_client 有着多个重要的成员。设备地址成员是用来对从设备在 I2C 总线上的唯一地址进行标识的,这是主设备和从设备进行通信时识别从设备的关键所在。名称成员是用于对设备类型进行描述的,以便在系统里面进行标识和管理。所属适配器成员是指向该设备所连接的 i2c_adapter 的,通过这个指针,设备就能够借助适配器和硬件总线来进行交互。在 i2c_client 的生命周期当中,创建注册是第一步,一般是能够由设备树进行解析(i2c_new_device())或者是用户空间通过 sysfs 动态创建来完成的。创建好了之后,就必须得和对应的 i2c_driver 进行绑定,设备和驱动匹配成功之后,就能够通过 i2c_client 所关联的 i2c_adapter 和硬件来进行通信了。在通信的时候,设备驱动能够通过 i2c_client 来对数据传输进行控制,比如说向从设备发送数据或者是从从设备读取数据。设备不需要的时候,就会被注销掉,释放相关的资源。
  2. i2c_driver:i2c_driver 乃是具体设备的驱动程序。它具备驱动与设备相匹配的规则,还有设备初始化以及移除等等关键的函数。probe 函数可是相当重要的,当 I2C 驱动和 I2C 设备匹配成功之后就会去调用 probe 函数。在 probe 函数里边,一般是去做设备初始化的工作,比如说申请设备资源、注册设备文件操作的接口相关的,为设备能够正常工作做准备。remove 函数是在设备被移除或者驱动被卸载的时候被调用的,用来释放设备所占用的资源,以保证系统资源管理能够正常进行。i2c_driver 通过设备匹配的规则,把自身和符合条件的 i2c_client 关联到一块儿,从而达成对设备的控制和管理。在实际开发当中,得依据具体设备的功能,去编写相应的 i2c_driver,让设备和系统能够无缝地对接起来。

三、各层数据交互与工作流程

面试题写作模版

在 Linux I2C 系统之中,数据的传输是一个有多个层次紧密协同合作的过程。整个的流程是从用户空间里的应用程序发起请求的时候就开始了。打个比方来说,当运行一个读取温度传感器数据的应用程序的时候,应用程序会通过设备节点,以像 open、read、write 这类标准文件 IO 函数的方式来和底层的驱动进行交互。应用程序不需要去知道 I2C 总线的复杂细致的细节,只是按照文件操作的方式去请求数据。

应用层发出请求之后,设备驱动层需要去进行处理。设备驱动层将会把应用层的请求转化成为 I2C 消息。紧接着设备驱动层通过 I2C 核心层所提供的 API,把消息传递给 I2C 核心层。在这个时候设备驱动层就好像是一个翻译,把应用层的通用请求转换成为 I2C 总线能够理解的消息格式。

I2C 核心层乃是整个 I2C 系统当中极为重要的一个角色。它担当起对相关事务进行管理以及调度的职责。它会接收从设备驱动层传来的消息。依据消息的目标情况,将消息传递给相对应的 I2C 适配器驱动层。而且 I2C 核心层还负责适配器和设备驱动之间的匹配以及绑定工作,以此来确保消息能够精准地到达目标设备。

适配器驱动层接收到 I2C 核心层所传递过来的消息。其依照 i2c_algorithm 里面所定义的通信算法,将消息转化成为具体的硬件操作。它对 I2C 控制器硬件进行操作,产生相应的时钟信号以及控制信号,通过 SDA 和 SCL 线和 I2C 从设备进行数据的交互。适配器驱动层如同执行者一般,把上层传递下来的抽象消息转化成为具体的硬件动作,从而实现数据的传输。从设备接收到主设备(也就是 I2C 控制器)所发送过来的信号之后,会按照信号的内容来进行相应的操作,比如说返回数据或者接收数据。整个数据传输的过程依靠各层之间的紧密协作,来实现从用户空间应用程序到硬件层的高效的数据传输。

  1. 应用层以及设备驱动层:应用层是通过设备节点来和设备驱动层进行交互的。在 Linux 系统当中,设备节点一般是处于/dev 目录下的,例如/dev/i2c - 0 这个节点就代表着 I2C 设备。应用层调用标准的文件 IO 函数,比如说使用 open 函数来打开设备节点,从而得到设备的文件描述符,这就好像是拿到了进入设备驱动层的钥匙一样,然后使用 read 函数从设备读取数据,使用 write 函数向设备写入数据。设备驱动层负责处理应用层传来的请求,它会依照具体设备的业务逻辑,把应用层的请求转换成为对设备的具体操作。要是应用层请求读取温度传感器的数据,设备驱动层会根据温度传感器的寄存器地址、数据格式等相关信息,组织相应的 I2C 消息,准备通过 I2C 总线和传感器进行通信。
  2. 设备驱动层与核心层:设备驱动层借助 I2C 核心层所提供的 API 来和核心层开展交互。这些 API 恰似设备驱动层与核心层之间的桥梁,使得设备驱动层可以便捷地运用核心层的各类功能。设备驱动层会去调用 I2C 核心层的 i2c_transfer 函数来进行 I2C 消息的传输。在调用该函数的时候,设备驱动层需要传入一个 i2c_msg 数组,数组当中有着要传输的消息内容,比如目标设备的地址、传输的方向(是读还是写)、数据的长度以及数据的缓冲区等信息。I2C 核心层接收到这些消息之后,会依据消息的目标,把消息传递给对应的 I2C 适配器驱动层。I2C 核心层还负责适配器和设备驱动的匹配以及绑定,当设备驱动层向系统进行注册的时候,I2C 核心层会按照一定的规则,去判断该设备驱动能够和哪些适配器进行匹配绑定,从而构建起设备和驱动之间的关联。
  3. 核心层以及适配器驱动层:I2C 核心层在接收到设备驱动层所传来的消息之后,会将消息传递给适配器驱动层。在传递消息的时候,I2C 核心层会根据消息中所包含的目标设备地址等相关信息,来确定应该将消息发送给哪一个 I2C 适配器驱动。适配器驱动层在接收到消息之后,会按照 i2c_algorithm 中所定义的通信算法,去实现底层的通信时序以及数据传输。i2c_algorithm 中的 master_xfer 函数会根据传入的参数,例如使用该传输方法的适配器 adap、待传输的消息 msgs、消息数量 num 等,来进行数据的发送以及接收操作。在发送数据的时候,master_xfer 函数会依照 I2C 总线协议,控制 I2C 控制器产生相应的时钟信号以及数据信号,将数据通过 SDA 线传输到从设备。在接收数据的时候,它会控制 I2C 控制器接收从设备发送过来的数据,并且将数据存储到指定的缓冲区之中。
  4. 适配器的驱动层和硬件层的相关状况:适配器的驱动层直接与硬件层的 I2C 控制器相互进行交互。它对 I2C 控制器的硬件寄存器进行操作,从而产生 I2C 通信所需要用到的时钟信号 SCL 以及数据信号 SDA。在发送数据的时候,适配器的驱动层把数据按照 I2C 总线协议的格式,一位一位地通过 SDA 线发送出去,同时对 SCL 线进行控制来产生相应的时钟脉冲,以此来确保数据能够准确地进行传输。在接收数据的时候,它通过 SCL 线的时钟信号,从 SDA 线上一位一位地读取从设备发送过来的数据。适配器的驱动层还需要去处理 I2C 总线的错误以及异常状况,例如数据传输超时、校验错误等等,来保障整个 I2C 通信的稳定以及可靠。

四、MPU6050 驱动实战演练

面试题写作模版

4.1 硬件连接与环境搭建

若要更为直观地去知道 Linux I2C 框架在实际项目当中的应用情况,我们就将 MPU6050 六轴传感器的驱动开发作为事例来展开详细的解析。假定我们所使用的开发板是基于 ARM 架构的某一款嵌入式开发板,它具备好几个 I2C 接口。MPU6050 传感器模块是通过 I2C 总线来和开发板进行通信的。在硬件连接方面,将 MPU6050 的 SCL 引脚连接到开发板 I2C 接口的 SCL 引脚,SDA 引脚连接到开发板 I2C 接口的 SDA 引脚。而且必须要确保 MPU6050 的电源引脚 VCC 连接到开发板的 3.3V 电源输出端,GND 引脚连接到开发板的地。

硬件方面完成连接之后,需要去验证硬件连接是否正确。可以运用 i2c - tools 工具来对 I2C 总线上的设备进行扫描。首先要确保开发板已经安装了 i2c - tools 工具,如果还没有安装的话,就使用包管理器来进行安装。安装完毕之后,在终端输入命令 i2cdetect -y [I2C 总线的编号],这[I2C 总线的编号]需要依照实际硬件所连接的 I2C 总线来确定。要是硬件连接正确,并且 MPU6050 正常运作,那么执行命令之后就会显示出 MPU6050 的设备地址 0x68。

4.2 设备树配置

在 Linux 操作体系之中,设备树乃是用于描绘硬件设备信息的一种办法。关于 MPU6050 传感器而言,必须得在设备树之中增加相应的设备节点,如此一来内核才能够正确地辨认以及装备这个设备。在设备树文件当中,寻觅对应的 I2C 总线节点,一般被称作 i2c - [总线号码],接着在这个节点的下面增加 MPU6050 的设备节点。

mpu6050@68 {    compatible = "invensense,mpu6050";    reg = <0x68>;    interrupt-parent = <&gpioX>;    interrupts = <Y IRQ_TYPE_LEVEL_HIGH>;};

上述代码当中,compatible 属性乃是用于指定设备兼容性的,此处将其设置成 invensense,mpu6050,这也就意味着这个设备是 Invensense 公司的 MPU6050 传感器。reg 属性是用于指定设备在 I2C 总线上的地址的,这里把它设置成 0x68,这是 MPU6050 默认的 I2C 地址。

interrupt - parent 以及 interrupts 属性是用来配置设备中断信息的,其中 interrupt - parent 指定中断控制器,interrupts 指定中断号以及中断触发方式。需要依据实际硬件连接情况以及中断配置去对这两个属性的值进行修改。设备树配置完成之后,重新对设备树进行编译,之后把新的设备树文件烧录到开发板之中 。

4.3 内核驱动编写

在 Linux 内核之中,I2C 设备驱动要去填充 i2c_driver 结构体才能够得以达成。对于 MPU6050 驱动而言,得去进行定义并且填充这个结构体。首先定义 probe 函数,当设备和驱动匹配成功之后,probe 函数就会被调用,其作用是用来对设备进行初始化。

在 probe 函数当中,可以进行设备资源的申请、寄存器的初始化这类相关操作。接着定义 remove 函数,当设备被移除或者驱动被卸载的时候,remove 函数就会被调用,其作用是用来释放设备所占用的资源。

static struct i2c_driver mpu6050_driver = {   .driver = {       .name = "mpu6050",       .of_match_table = of_match_ptr(mpu6050_of_match),    },   .probe = mpu6050_probe,   .remove = mpu6050_remove,};

在上述代码当中,将 driver.name 设置为驱动的名字为 mpu6050 。此名字需要和设备树当中 compatible 属性的值保持一致。如此一来设备和驱动才可以正确地进行匹配。of_match_table 被用来指定设备树匹配表。借助着这个匹配表,内核能够在设备树里面寻找到和这个驱动相匹配的设备节点。probe 指向我们所定义的 probe 函数,remove 指向我们所定义的 remove 函数 。

若想要让应用层可以访问 MPU6050 设备,那就得去实现文件操作接口。这类接口包含 open、read、write 等函数。当应用层调用 open 系统调用去打开设备节点的时候,open 函数就会被调用,通常是用来对设备访问相关资源进行初始化。read 函数是用来从设备读取数据的,在 MPU6050 驱动当中,read 函数会读取传感器的测量数据然后把它返回给应用层。write 函数是用来向设备写入数据的,按照 MPU6050 的功能需求来看,有可能得实现 write 函数来对传感器的工作模式相关的进行配置 。

static const struct file_operations mpu6050_fops = {   .owner = THIS_MODULE,   .open = mpu6050_open,   .read = mpu6050_read,   .write = mpu6050_write,   .release = mpu6050_release,};

在上面所呈现的代码当中,owner 将模块的所有者指定成为当前的这个模块。open、read、write 以及 release 分别指向我们所实现的 open 函数、read 函数、write 函数还有 release 函数。release 函数会在应用层关闭设备节点的时候被调用,其作用是去释放和设备访问相关联的很多资源。

4.4 驱动加载与测试

在完成内核驱动的编写后,我们需要将驱动加载到内核中,并进行测试 。在内核驱动代码中,使用 module_init 和 module_exit 宏来注册和注销驱动。

module_init(mpu6050_driver_init);module_exit(mpu6050_driver_exit);

在上述的代码之中,mpu6050_driver_init 函数乃是用于去注册 i2c_driver 从而让驱动发挥作用的。mpu6050_driver_exit 函数是用于去注销 i2c_driver 来卸载驱动的。当驱动加载完成之后,可以去编写一个简单的应用层测试程序,通过设备节点去对 MPU6050 驱动进行访问。在应用层测试程序当中,使用 open 函数去打开设备节点,紧接着使用 read 函数去读取传感器的数据,再把数据给打印出来。

#include <stdio.h>#include <fcntl.h>#include <unistd.h>#define MPU6050_DEV "/dev/mpu6050"int main() {    int fd;    char buf[1024];    ssize_t n;    fd = open(MPU6050_DEV, O_RDONLY);    if (fd < 0) {        perror("open");        return 1;    }    n = read(fd, buf, sizeof(buf));    if (n < 0) {        perror("read");    } else {        printf("Read data from MPU6050: %.*s\n", (int)n, buf);    }    close(fd);    return 0;}

在那一个测试程序当中,第一步运用 open 函数去打开/dev/mpu6050 这一个设备节点。倘若打开没有获取成功,便打印出错误信息而后进行返回。紧接着运用 read 函数从设备节点处读取数据。要是读取出现失败状况,就打印出错误信息。要是读取获取成功,把所读取到的数据进行打印输出出来。最后运用 close 函数去关闭设备节点。随后运行这一个测试程序,去查看输出的结果,来验证 MPU6050 驱动到底是不是处于正常工作的状态。要是所有的一切都处于正常状况,那么应该能够读取到 MPU6050 传感器的测量数据 。

对 Linux I2C 框架内核子系统的分层情况进行深入的解析,能够观察到其分层结构是非常精妙的。硬件层之中存在着 I2C 控制器以及从设备。适配器驱动层包含有 i2c_adapter 和 i2c_algorithm。核心层有 I2C Core 这一组成部分。设备驱动层有 i2c_client 和 i2c_driver。每一个层级都相互紧密地配合着,使得 I2C 设备在 Linux 系统当中能够高效地进行管理以及通信。

end

如果这篇文章对你有所启发,欢迎点赞、在看,转发三连。星标⭐账号,还可以第一时间收到推送,感谢你的收看,我们下期再见~

往期干货推荐

【专栏模块嵌入式Linux
专栏模块】性能优化
专栏模块】面试八股文
专栏模块项目实战
【硬核干货缺了这些,别说你懂 Linux内核
硬核干货】缺了这些,别说你懂 Linux C/C++
【学习思维导图】Linux内核源码自主学习路线

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 23:47:01 HTTP/2.0 GET : https://f.mffb.com.cn/a/508549.html
  2. 运行时间 : 0.254707s [ 吞吐率:3.93req/s ] 内存消耗:4,661.88kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=47f67538f2f47d008287f159112bdd8a
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000932s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001513s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.039638s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000722s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001416s ]
  6. SELECT * FROM `set` [ RunTime:0.000591s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001448s ]
  8. SELECT * FROM `article` WHERE `id` = 508549 LIMIT 1 [ RunTime:0.001121s ]
  9. UPDATE `article` SET `lasttime` = 1787327221 WHERE `id` = 508549 [ RunTime:0.025275s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000618s ]
  11. SELECT * FROM `article` WHERE `id` < 508549 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001034s ]
  12. SELECT * FROM `article` WHERE `id` > 508549 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001100s ]
  13. SELECT * FROM `article` WHERE `id` < 508549 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002356s ]
  14. SELECT * FROM `article` WHERE `id` < 508549 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.014151s ]
  15. SELECT * FROM `article` WHERE `id` < 508549 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001864s ]
0.258353s