当前位置:首页>Linux>Linux设备驱动 -- AP3216C驱动(I2C)

Linux设备驱动 -- AP3216C驱动(I2C)

  • 2026-03-26 09:16:02
Linux设备驱动 -- AP3216C驱动(I2C)

I2C子系统

Linux设备驱动 -- I2C子系统

AP3216C

AP3216C是敦南科技退出的一款三合一环境传感器:

  • 数字环境光传感器(ALS)
  • 接近传感器(PS)
  • 一个红外LED(IR)

通信接口:

  • 通过IIC接口和MCU连接,并支持中断(INT)输出

应用:

  • AP3216C被广泛应用于智能手机上面,用来检测光强度(自动背光控制),和接近开关控制(听筒靠近耳朵,手机自动灭屏功)

寄存器表:

寄存器描述:

I2C写寄存器时序:

  1. S,I2C启动信号
  2. Slave address, I2C从设备地址
  3. W,该位和Slave address组成一个字节,地址字节最低位,其值为0表示操作方向为写,1则表示读
  4. A,应答信息,从设备给主机的应答
  5. Register Address,寄存器地址,主机要往哪个寄存器地址写数据
  6. A,应答信息,从设备给主机的应答

I2C读寄存器时序:

  1. S,I2C启动信号
  2. Slave address, I2C从设备地址,W为0,表示写数据
  3. A,应答信息,从设备给主机的应答
  4. Register Address,寄存器地址,主机要往哪个寄存器地址写数据
  5. A,应答信息,从设备给主机的应答
  6. Sr,重新发起I2C启动信号
  7. Slave address, I2C从设备地址,W为1,表示读数据
  8. A,应答信息,从设备给主机的应答
  9. Register Command,从句返回寄存器的值
  10. N,主机 主动发送非应答
  11. P,主机发起停止信号

AP3216C驱动实现

设备树编写

imx6ull-mmc-npi.dts: 向i2c1 节点追加节点ap3216c

&i2c1 {        clock-frequency = <100000>;     pinctrl-names = "default"    pinctrl-0 = <&pinctrl_i2c1>;       status = "okay"#address-cells = <1>;#size-cells = <0>;    /* 设备树修改查看是否修改成功,查看内核目录/sys/bus/i2c/devices/看是否存在0x1E地址的设备 */    ap3216c@1E {        compatible = "xgj-ap3216c"//        compatible = "fire,i2c_ap3216c";        reg = <0x1E>;         interrupt-parent = <&gpio5>;        interrupts = <2 IRQ_TYPE_EDGE_BOTH>;   //IRQ_TYPE_EDGE_RISING         status = "okay"    };};
  • compatible ,设备树匹配属性
  • reg ,i2c设备地址

ap3216c接在i2c1下,在i2c1节点下追加设备的子节点ap3216c

设备树编译:

ares@ubuntu:~/work/ebf_linux_kernel-ebf_4.19.35_imx6ul$ cat make_dtb.sh#!/bin/shmake ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs

将设备树拷贝系统目录:

debian@npi:~/nfs_root/driver$ cat cp_dtb_to_linux.sh#!/bin/shsudo cp imx6ull-mmc-npi.dtb /usr/lib/linux-image-4.19.35-carp-imx6/
  • /usr/lib/linux-image-4.19.35-carp-imx6/  ,系统存放设备树的目录

重启系统设备树生效:

sudo reboot

通过查看系统目录 /sys/firmware/devicetree/base/ 看是否存在ap3216c的设备树节点判定设备树是否生效

驱动实现

ap3216c.h:寄存器相关的定义

#ifndef _AP3216C_H_#define _AP3216C_H_#include<linux/i2c.h>/* System Registers define */#define AP3216C_REG_SYS_CONFIG         0x00          /* Control of basic functions */#define AP3216C_REG_INT_STATUS         0x01          /* ALS and PS interrupt status output  */#define AP3216C_REG_INT_CLEAR_MANNER   0x02          /* Auto/semi clear INT pin selector */#define AP3216C_REG_IR_DATA_LOW        0x0A          /* Lower byte for IR ADC channel output */#define AP3216C_REG_IR_DATA_HIGH       0x0B          /* Higher byte for IR ADC channel output  */#define AP3216C_REG_ALS_DATA_LOW       0x0C          /* Lower byte for ALS ADC channel output  */#define AP3216C_REG_ALS_DATA_HIGH      0x0D          /* Higher byte for ALS ADC channel output */#define AP3216C_REG_PS_DATA_LOW        0x0E          /* Lower byte for PS ADC channel output */#define AP3216C_REG_PS_DATA_HIGH       0x0F          /* Higher byte for PS ADC channel output *//* ALS rAP3216C_egisters define */#define AP3216C_REG_ALS_CONFIG               0x10          /* Control of gain, conversion time of persist for ALS */#define AP3216C_REG_ALS_CALIBRATION          0X19          /* ALS window loss calibration  */#define AP3216C_REG_ALS_LOW_THRESHOLD_LOW    0x1A         /* Lower byte of ALS low threshold */#define AP3216C_REG_ALS_LOW_THRESHOLD_HIGH   0x1B         /* Higher byte of ALS low threshold */#define AP3216C_REG_ALS_HIGH_THRESHOLD_LOW    0x1C        /* Lower byte of ALS high threshold */#define AP3216C_REG_ALS_HIGH_THRESHOLD_HIGH   0x1D        /* Higher byte of ALS high threshold *//* PS reAP3216C_gisters define */#define AP3216C_REG_PS_CONFIG                 0x20        /* Control of gain, integrated time and persist for PS */#define AP3216C_REG_PS_LED_DRIVER             0x21        /* Control of LED pulses number and driver current */#define AP3216C_REG_PS_INT_FORM               0x22        /* Interrupt algorithms style select of PS */#define AP3216C_REG_PS_MEAN_TIME              0x23        /* PS average time selector */#define AP3216C_REG_PS_LED_WAITING_TIME       0x24        /* Control PS LED waiting time */#define AP3216C_REG_PS_CALIBRATION_L          0x28        /* Offset value to eliminate cross talk */#define AP3216C_REG_PS_CALIBRATION_H          0x29        /* Offset value to eliminate cross talk */#define AP3216C_REG_PS_LOW_THRESHOLD_LOW      0x2A        /* Lower byte of PS low threshold */#define AP3216C_REG_PS_LOW_THRESHOLD_HIGH     0x2B        /* Higher byte of PS low threshold */#define AP3216C_REG_PS_HIGH_THRESHOLD_LOW     0x2C         /* Lower byte of PS high threshold */#define AP3216C_REG_PS_HIGH_THRESHOLD_HIGH    0x2D         /* Higher byte of PS high threshold */enumsys_config_value {    AP3216C_SYS_CONF_POWER_DOWN = 0x000,    AP3216C_SYS_CONF_ALS_ACTIVE = 0x001,    AP3216C_SYS_CONF_PS_IR_ACTIVE = 0x002,    AP3216C_SYS_CONF_ALS_PS_IR_ACTIVE = 0x03,    AP3216C_SYS_CONF_SW_RESET = 0x04,       /* software reset */    AP3216C_SYS_CONF_ALS_ONCE = 0x05,    AP3216C_SYS_CONF_PS_IR_ONCE = 0x06,    AP3216C_SYS_CONF_ALS_PS_IRONCE = 0x07,};#endif/* _AP3216C_H_ */

使用内核i2c子系统去驱动ap3216c

staticintap3216c_i2c_write_reg(struct i2c_client *client, uint8_t reg_addr, uint8_t data){int ret = 0;#if 0    structi2c_msgmsgs[2];    msgs[0].addr = client->addr;        msgs[0].buf = ®_addr;           /* 发送寄存器地址 */    msgs[0].flags = 0;                  /* I2C方向 :写数据 */    msgs[0].len = sizeof(reg_addr);    msgs[1].addr = client->addr;    msgs[1].buf = &data;                /* 写数据 */    msgs[1].flags = 0;                  /* I2C方向 :写数据 */    msgs[1].len = sizeof(data);#elseuint8_t buf[2];structi2c_msgmsg;    buf[0] = reg_addr;    buf[1] = data;    msg.addr = client->addr;        msg.buf = buf;           /* 发送寄存器地址 */    msg.flags = 0;                  /* I2C方向 :写数据 */    msg.len = 2;#endif    ret = i2c_transfer(client->adapter, &msg, 1);if (ret < 0)return ret;elseif (ret != 1)return -EIO;return0;}staticintap3216c_i2c_read_reg(struct i2c_client *client, uint8_t reg_addr, uint8_t *data){int ret = 0;structi2c_msgmsgs[2];    msgs[0].addr = client->addr;    msgs[0].buf = ®_addr;              /* 发送寄存器地址 */    msgs[0].flags = 0;                    /* I2C方向 :写数据 */    msgs[0].len = sizeof(reg_addr);    msgs[1].addr = client->addr;    msgs[1].buf = data;                    /* 读取寄存器数据 */    msgs[1].flags = I2C_M_RD;              /* I2C方向 :读数据 */    msgs[1].len = 1;    ret = i2c_transfer(client->adapter, msgs, 2);if (ret < 0)return ret;elseif (ret != 2)return -EIO;return0;}staticintap3216c_init(void){int ret; /* 软复位 */    ret = ap3216c_i2c_write_reg(ap3216c_dev->client, AP3216C_REG_SYS_CONFIG, AP3216C_SYS_CONF_SW_RESET);              msleep(50);/* 开启ALS、PS、IR*/    ret = ap3216c_i2c_write_reg(ap3216c_dev->client, AP3216C_REG_SYS_CONFIG, AP3216C_SYS_CONF_ALS_PS_IR_ACTIVE);  return ret;}staticintap3216c_read_als(shortint *als){int ret;uint8_t low, high;    ret = ap3216c_i2c_read_reg(ap3216c_dev->client, AP3216C_REG_ALS_DATA_LOW, &low);    ret = ap3216c_i2c_read_reg(ap3216c_dev->client, AP3216C_REG_ALS_DATA_HIGH, &high);    *als = (high << 8) + low;return ret;}staticintap3216c_read_ps(shortint *ps){int ret;uint8_t low, high;    ret = ap3216c_i2c_read_reg(ap3216c_dev->client, AP3216C_REG_PS_DATA_LOW, &low);    ret = ap3216c_i2c_read_reg(ap3216c_dev->client, AP3216C_REG_PS_DATA_HIGH, &high);    *ps = (high << 8) + low;return ret;}staticintap3216c_read_ir(shortint *ir){int ret;uint8_t low, high;    ret = ap3216c_i2c_read_reg(ap3216c_dev->client, AP3216C_REG_IR_DATA_LOW, &low);    ret = ap3216c_i2c_read_reg(ap3216c_dev->client, AP3216C_REG_IR_DATA_HIGH, &high);    *ir = (high << 8) + low;return ret;}

熟透于心的linux驱动的框架(套路):

#define AP3216C_DTS_NODE_PATH    "xgj_ap3216c"#define AP3216C_DTS_COMPATIBLE   "xgj-ap3216c"#define AP3216C_READY_GPIO_NAME  "ready-gpios"#define DEV_NAME                 "ap3216c"structap3216c_data {shortint als;        //环境光亮度传感器数据shortint ps;         //接近传感器数据shortint ir;         //红外LED};structap3216c_device {int irq;                        /* 中断号 */int gpio;dev_t dev_no;                   /* 设备号 */structcdevchrdev;structclass *class;structmutexm_lock;wait_queue_head_t  wq;          /* 等待队列 */structap3216c_datadata;structi2c_client *client;};staticstructap3216c_device  *ap3216c_dev;staticint _drv_open (struct inode *node, struct file *file){int ret = 0;    file->private_data = ap3216c_dev;if ((ret = ap3216c_init()) != 0)    {        printk("ap3216c init failed %d\r\n", ret);    }    printk("%s open\r\n", DEV_NAME);return ret;}staticssize_t _drv_read(struct file *filp, char __user *buf, size_t size, loff_t *offset){int ret = 0;structap3216c_device *tmp_ap3216c = filp->private_data;/* 中断屏蔽 */if (size != sizeof(struct ap3216c_data)) return -EINVAL;    ret = ap3216c_read_als(&ap3216c_dev->data.als);    ret = ap3216c_read_ps(&ap3216c_dev->data.ps);    ret = ap3216c_read_ir(&ap3216c_dev->data.ir);if (copy_to_user(buf, &tmp_ap3216c->data, sizeof(struct ap3216c_data)))     {        ret = -EFAULT;    } else    {        ret = sizeof(struct ap3216c_data);    }return ret;}/* 使驱动支持多路复用IO */static__poll_t _drv_poll(struct file *filp, struct poll_table_struct *wait){__poll_t mask = 0;// mutex_lock(&ap3216c_dev->m_lock);// poll_wait(filp, &ap3216c_dev->wq, wait); // mutex_unlock(&sr501.m_lock);return mask;}staticlong _drv_ioctl(struct file *filp, unsignedint cmd, unsignedlong arg){int ret = 0;return ret;}staticint _drv_release(struct inode *node, struct file *filp){structap3216c_device *tmp_ap3216c = filp->private_data;    printk("%s close\n", DEV_NAME);return0;}staticstructfile_operationsap3216c_drv_ops = {     .owner    = THIS_MODULE,    .open   = _drv_open,    .read   = _drv_read,// .poll   = _drv_poll,    .release = _drv_release,};staticirqreturn_tap3216c_isr(int irq, void *dev){    printk("%s %d %s\n", __FILE__, __LINE__, __FUNCTION__);return IRQ_RETVAL(IRQ_HANDLED);   }staticint _driver_probe(struct i2c_client *client, conststruct i2c_device_id *id)int err = 0;int ret;structdevice *_dev;structdevice_node *_dts_node;    ap3216c_dev = (struct ap3216c_device *) kzalloc(sizeof(struct ap3216c_device), GFP_KERNEL);if (!ap3216c_dev)     {        printk("can't kzalloc ap3216c\n");return -ENOMEM;    }    _dts_node = client->dev.of_node; if (!_dts_node) {                  printk("AP3216C dts node can not found!\r\n");            err = -EINVAL; goto out_free_dev;    }    ap3216c_dev->client = client;    printk("AP3216C irq %d !\r\n", client->irq);    #if 1    ap3216c_dev->irq = client->irq;    err = request_irq(ap3216c_dev->irq, ap3216c_isr, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, DEV_NAME, NULL);    /* 申请中断 */if (err) {        printk(KERN_INFO"failed to request irq %d\r\n", ap3216c_dev->irq);goto out_free_dev;    }/* 内核自动分配设备号 */    err = alloc_chrdev_region(&ap3216c_dev->dev_no, 01, DEV_NAME);        if (err < 0) {        pr_err("Error: failed to register mbochs_dev, err: %d\n", err);goto out_free_irq;    }    cdev_init(&ap3216c_dev->chrdev, &ap3216c_drv_ops);    err = cdev_add(&ap3216c_dev->chrdev, ap3216c_dev->dev_no, 1);if (err) {goto out_unregister;    }    ap3216c_dev->class = class_create(THIS_MODULE, DEV_NAME);if (IS_ERR(ap3216c_dev->class)) {         err = PTR_ERR(ap3216c_dev->class);goto out_cdev_del;    }/* 创建设备节点 */    _dev = device_create(ap3216c_dev->class , NULL, ap3216c_dev->dev_no, NULL, DEV_NAME); if (IS_ERR(_dev)) {       /* 判断指针是否合法 */        err = PTR_ERR(_dev);goto out_class_del;    }// mutex_init(&ap3216c_dev->m_lock);                 /* 初始化互斥锁  */       printk("ap3216c probe success\r\n");goto out;out_class_del:    class_destroy(ap3216c_dev->class);out_cdev_del:    cdev_del(&ap3216c_dev->chrdev);out_unregister:    unregister_chrdev_region(ap3216c_dev->dev_no, 1);      /* 注销设备 */out_free_irq:    free_irq(ap3216c_dev->irq, NULL);out_free_dev:    kfree(ap3216c_dev);    ap3216c_dev = NULL;out:#endifreturn err;}staticint _driver_remove(struct i2c_client *client){    device_destroy(ap3216c_dev->class, ap3216c_dev->dev_no);    class_destroy(ap3216c_dev->class);    unregister_chrdev_region(ap3216c_dev->dev_no, 1);      /* 注销设备 */    cdev_del(&ap3216c_dev->chrdev);    free_irq(ap3216c_dev->irq, NULL);                      /* 释放中断*/    kfree(ap3216c_dev);    printk(KERN_INFO"%s success\n", DEV_NAME);return0;}/* 设备树的匹配列表 */staticstructof_device_iddts_match_table[] = {    {.compatible = AP3216C_DTS_COMPATIBLE, },                     /* 通过设备树来匹配 */};/* 传统匹配方式 ID 列表 ,即使不使用也要添加,不然probe匹配不成功 */staticconststructi2c_device_idap3216c_id[] = {    {AP3216C_DTS_COMPATIBLE, 0},   }; staticstructi2c_driverap3216c_driver = {    .probe = _driver_probe,    .remove = _driver_remove,    .driver = {        .name = AP3216C_DTS_COMPATIBLE,        .owner = THIS_MODULE,        .of_match_table = dts_match_table,                      /* 通过设备树匹配 */    },    .id_table = ap3216c_id,};/* 入口函数 */staticint __init _driver_init(void){int ret = 0;    ret = i2c_add_driver(&ap3216c_driver);                  /* 注册I2C驱动 */    printk("%s %s\n", DEV_NAME, __FUNCTION__);return ret;}/*  出口函数 */staticvoid __exit _driver_exit(void){    printk("%s driver %s\n", DEV_NAME, __FUNCTION__);    i2c_del_driver(&ap3216c_driver);                      /* 注销I2C驱动 */}module_init(_driver_init);module_exit(_driver_exit);MODULE_AUTHOR("Ares");MODULE_LICENSE("GPL");

必须注意的地方:

I2C总线驱动内核缺陷,即使不用i2c_device_id也要加上,不然设备树匹配方式of_device_id 无法匹配成功

测试程序:

#include"stdio.h"#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdio.h>#include<string.h>#include<sys/ioctl.h>#include<poll.h>#include<stdint.h>#define DEV_NAME   "/dev/ap3216c"structap3216c_data {shortint als;        /* 环境光亮度传感器数据 */shortint ps;         /* 接近传感器数据 */shortint ir;         /* 红外LED */};voidsleep_ms(unsignedint ms){structtimevaldelay;    delay.tv_sec = 0;    delay.tv_usec = ms * 1000    select(0NULLNULLNULL, &delay);}intmain(int argc, char **argv){int fd;int ret;structpollfdfds[1];/* 2. 打开文件 */    fd = open(DEV_NAME, O_RDWR );   // | O_NONBLOCKif (fd < 0)    {printf("can not open file %s, %d\n", DEV_NAME, fd);return-1;    }structap3216c_datadata;while (1)    {if (read(fd, &data, sizeof(data)) == sizeof(data))        {printf("als %d ps %d ir %d\r\n", data.als, data.ps, data.ir);        }        sleep_ms(1000);    }    close(fd);printf("%s ok!\n", DEV_NAME);return0;}

安装、卸载and执行测试程序:

sudo insmod ap3216c_drv.kosudo ./ap3216c_testsudo rmmod ap3216c_drv.ko

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 11:41:39 HTTP/2.0 GET : https://f.mffb.com.cn/a/482756.html
  2. 运行时间 : 0.095921s [ 吞吐率:10.43req/s ] 内存消耗:4,818.55kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0842c3fa6ed044602ed7098821bedfac
  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.000426s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000604s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002689s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.002434s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000648s ]
  6. SELECT * FROM `set` [ RunTime:0.000223s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000636s ]
  8. SELECT * FROM `article` WHERE `id` = 482756 LIMIT 1 [ RunTime:0.003193s ]
  9. UPDATE `article` SET `lasttime` = 1774582899 WHERE `id` = 482756 [ RunTime:0.003670s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000996s ]
  11. SELECT * FROM `article` WHERE `id` < 482756 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000564s ]
  12. SELECT * FROM `article` WHERE `id` > 482756 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000601s ]
  13. SELECT * FROM `article` WHERE `id` < 482756 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001000s ]
  14. SELECT * FROM `article` WHERE `id` < 482756 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003277s ]
  15. SELECT * FROM `article` WHERE `id` < 482756 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001734s ]
0.098387s