当前位置:首页>Linux>Linux下SPI NAND Flash 适配:从 U-Boot 到Kernel (新增国产东芯DS35X系列型号)

Linux下SPI NAND Flash 适配:从 U-Boot 到Kernel (新增国产东芯DS35X系列型号)

  • 2026-08-19 21:31:42
Linux下SPI NAND Flash 适配:从 U-Boot 到Kernel (新增国产东芯DS35X系列型号)
Hello,大家好,我是程序媛MM。

本文约3800字,今天基于君正 A1 平台新增了国产品牌东芯的DS35Q1GB 和 DS35M1GB两款型号Flash,我们只需要中一款,我写代码时将datasheet中的两款型号一并支持进去了,本文完整记录 SPI NAND Flash 适配的全过程,涵盖 SPL/U-Boot 和 Linux 内核两个阶段,并总结出一套可复用的方法。

关注公众号, 即可获得与Linux相关的电子书籍(含《硬件架构的艺术》)以及常用开发工具,文末有文档清单,本公众号提供的电子书均只可作为个人学习使用,不可用做商业用途。


一 前沿

1.1 为什么要适配新 Flash?

在嵌入式产品生命周期中,由于以下原因经常需要更换 Flash 型号:

  • 供应链调整:原型号停产或涨价
  • 成本优化:替换为性价比更高的型号
  • 性能升级:采用更新技术的 Flash

1.2 本文适用范围

  • 平台:君正(Ingenic)xBurst A1 系列 SoC
  • Boot 流程:SPL → U-Boot → Linux Kernel
  • Flash 类型:SPI NAND Flash
  • 涉及代码:工具链、SPL、U-Boot、Linux 内核驱动

二 前置准备

2.1 获取新 Flash 数据手册

数据手册是适配工作的唯一权威依据。需要从手册中提取以下关键参数(以 DS35Q1GB 为例):

参数分类
具体参数
DS35Q1GB 值
手册章节
身份标识
制造商 ID
0xE5
Table 3.2
设备 ID
0xF1
Table 3.2
存储结构
页大小
2048 字节
P6
备用区大小
128 字节
P6
块大小
128KB(64 页)
P6
块数量
1024
P6
ECC 特性
ECC 能力
8-bit/512B
P6
ECC 状态位
ECC_S[2:0](3 位)
Table 3.6
时序参数
读取时间(tR)
90μs
Table 4.6
编程时间(tPROG)
700μs
Table 4.6
擦除时间(tBERS)
10ms
Table 4.6

2.2 对比新旧型号差异

对比项
旧型号
新型号
影响
Device ID
0x71
0xF1
需新增 ID 匹配
OOB Size
64 字节
128 字节
备用区布局变化
ECC 状态位宽
2 位(bit5:4)
3 位(bit6:4)最关键差异
ECC 能力
4-bit
8-bit
纠错能力提升

⚠️ 特别注意:即使是同一厂商的不同型号,ECC 状态寄存器定义也可能不同。0x71 只用 2 位,0xF1 用 3 位——这是适配过程中最容易踩的坑。


三 阶段一:SPL/U-Boot 适配

3.1 代码结构总览

├── tools/ingenic-tools/│   ├── nand_device/│   │   ├── dosilicon_nand.c      ← 【修改点 1】厂商参数定义│   │   ├── winbond_nand.c│   │   └── ...│   ├── sfc_nand_params.c         ← 参数生成工具源码│   └── Makefile├── include/generated/│   └── sfc_nand_params.h         ← 【DO NOT MODIFY】自动生成└── common/spl/    └── spl_sfc_nand.c            ← SPL NAND 加载逻辑

3.2 参数生成流程

nand_device/*_nand.c       ↓ (编译工具)sfc_nand_params 可执行文件       ↓ (执行生成)include/generated/sfc_nand_params.h  ← 被 SPL/U-Boot 包含

⚠️ 关键原则generated/ 目录下的文件禁止手动修改,会被 make clean 覆盖。所有修改必须在源文件 nand_device/*_nand.c 中进行。

3.3 修改点详解

文件:tools/ingenic-tools/nand_device/dosilicon_nand.c

Step 1:定义 ECC 错误状态数组

/* 原有型号 ECC 状态 */staticunsignedchar ds_x1ga[] = {0x2};/* 新增型号 ECC 状态(同样是检测 0x2 为不可纠正错误) */staticunsignedchar ds_x1gb_33v[] = {0x2};  // 3.3V 版本staticunsignedchar ds_x1gb_18v[] = {0x2};  // 1.8V 版本

Step 2:在 device[] 数组中添加新条目

staticstructdevice_structdevice[] = {/* 原有型号 - 保持不变 */    DEVICE_STRUCT(0x7120482421, ds_x1ga),/* ===== 新增 DS35Q1GB ===== */    DEVICE_STRUCT(0xF1,       // device_id(来自数据手册 Table 3.2)2048,       // pagesize(2KB)2,          // addr_len(列地址 12 位)4,          // ecc_bit(从 bit4 开始)3,          // bit_counts(ECC_S[2:0] 占 3 位)← 关键!1,          // eccstat_count(检测 1 个错误状态)        ds_x1gb_33v // eccerrstatus({0x2} = 不可纠正错误)    ),/* ===== 新增 DS35M1GB ===== */    DEVICE_STRUCT(0xA120482431, ds_x1gb_18v),};

Step 3:重新编译

# 重新生成参数工具make tools/ingenic-tools/sfc_nand_params# 全量编译make cleanmake

3.4 验证方法

烧录后串口输出应显示:

SFC_NAND: ****sfc init!Note: nand manufactory name [DS35Q1GB]   ← 识别成功!Board: ISVP (Ingenic xBurst A1 Soc)DRAM:  512 MiBNAND:  0 MiB

如果看到 ERR: don't support this kind of nand device,说明参数表中没有匹配的 ID,需要检查 device_id 是否正确。


四 阶段二:Linux 内核适配

4.1 代码位置

drivers/mtd/nand/spi/ingenic/dosilicon_nand.c

4.2 修改点详解

文件:drivers/mtd/nand/spi/ingenic/dosilicon_nand.c

Step 1:在参数数组中添加新条目

staticstructingenic_sfcnand_base_paramdosilicon_param[] = {/* 原有型号保持不动 */    [0] = { /* DS35X1GAXXX */ },    [1] = { /* DS35Q2GAXXX */ },/* ===== 新增 DS35Q1GB ===== */    [2] = {        .pagesize = 2 * 1024,        .blocksize = 2 * 1024 * 64,        .oobsize = 128,                    /* ← 注意:新款是 128 字节 */        .flashsize = 2 * 1024 * 64 * 1024/* 1Gbit */        .tHOLD  = THOLD,        .tSETUP = TSETUP,        .tSHSL_R = TSHSL_R,        .tSHSL_W = TSHSL_W,        .tRD = 90,    /* 数据手册 Table 4.6 */        .tPP = TPP,        .tBE = TBE,        .plane_select = 0,   /* 1Gbit 单 Plane */        .ecc_max = 0x8,      /* 8-bit ECC */        .need_quad = 1,      /* 支持 Quad SPI */    },/* ===== 新增 DS35M1GB ===== */    [3] = {        .pagesize = 2 * 1024,        .blocksize = 2 * 1024 * 64,        .oobsize = 128,        .flashsize = 2 * 1024 * 64 * 1024,        .tHOLD  = THOLD,        .tSETUP = TSETUP,        .tSHSL_R = TSHSL_R,        .tSHSL_W = TSHSL_W,        .tRD = 90,        .tPP = TPP,        .tBE = TBE,        .plane_select = 0,        .ecc_max = 0x8,        .need_quad = 1,    },};

Step 2:在设备 ID 列表中添加匹配

staticstructdevice_id_structdevice_id[] = {    DEVICE_ID_STRUCT(0x71"DS35X1GAXXX", &dosilicon_param[0]),    DEVICE_ID_STRUCT(0x72"DS35Q2GAXXX", &dosilicon_param[1]),    DEVICE_ID_STRUCT(0xF1"DS35Q1GB", &dosilicon_param[2]),   /* 新增 */    DEVICE_ID_STRUCT(0xA1"DS35M1GB", &dosilicon_param[3]),   /* 新增 */};

Step 3:更新 CDT 参数获取函数

staticcdt_params_t *dosilicon_get_cdt_params(struct sfc_flash *flash, uint8_t device_id){    CDT_PARAMS_INIT(dosilicon_nand->cdt_params);switch(device_id) {case0x71:case0x72:case0xF1:    /* 新增 */case0xA1:    /* 新增 */break;default:        dev_err(flash->dev, "device_id err: 0x%02x\n", device_id);returnNULL;    }return &dosilicon_nand->cdt_params;}

Step 4:更新 ECC 状态处理函数(关键!)

staticinlineintdeal_ecc_status(struct sfc_flash *flash, uint8_t device_id, uint8_t ecc_status){int ret = 0;switch(device_id) {/* 旧型号 0x71:ECC 状态只用 2 位 */case0x71:switch((ecc_status >> 0x4) & 0x3) {case0x2:            dev_err(flash->dev, "ECC >8 bits error, uncorrectable.\n");            ret = -EBADMSG;break;default:            ret = 0;        }break;/*      * 新型号 0x72/0xF1/0xA1:ECC 状态用 3 位(ECC_S[2:0])     * 根据数据手册 Table 3.6     */case0x72:case0xF1:    /* 新增 */case0xA1:    /* 新增 */switch((ecc_status >> 0x4) & 0x7) {case0x0:  /* 0 error */            ret = 0;break;case0x1:  /* 1-3 bits corrected */case0x3:  /* 4-6 bits corrected */case0x5:  /* 7-8 bits corrected */            ret = 0;break;case0x2:  /* >8 bits uncorrectable */            dev_err(flash->dev, "ECC >8 bits error, uncorrectable.\n");            ret = -EBADMSG;break;default:   /* Reserved */            dev_err(flash->dev, "Unknown ECC status: 0x%x\n",                    (ecc_status >> 0x4) & 0x7);            ret = -EIO;break;        }break;default:        dev_err(flash->dev, "device_id err: 0x%02x\n", device_id);        ret = -EIO;    }return ret;}

4.3 验证方法

内核启动日志应显示:

[    0.000000] SFC_NAND: ****sfc init![    0.000000] Note: nand manufactory name [DS35Q1GB][    0.000000] Creating 1 MTD partitions on "spi-nand0":[    0.000000] 0x000000000000-0x000001000000 : "spi_nand"

五 完整流程总结

5.1 新增 Flash 适配清单

graph TD    A[获取数据手册] --> B[提取关键参数]    B --> C[对比新旧型号差异]    C --> D{差异点}    D -->|Device ID| E[修改 ID 匹配表]    D -->|OOB Size| F[更新备用区大小]    D -->|ECC 位宽| G[更新 ECC 解析逻辑]    D -->|时序参数| H[更新 tRD/tPP/tBE]    E --> I[修改 SPL/U-Boot 工具数据源]    F --> I    G --> I    H --> I    I --> J[重新编译工具和固件]    J --> K[烧录验证 SPL/U-Boot]    K --> L[修改 Linux 内核驱动]    L --> M[重新编译内核]    M --> N[烧录验证内核]    N --> O[功能测试]

5.2 关键参数对照表

参数
SPL/U-Boot 位置
内核位置
说明
制造商 ID
id_manufactoryid_manufactory
通常为 0xE5
设备 ID
device_iddevice_id
区分型号的关键
页大小
pagesize.pagesize
通常为 2048
备用区大小
oobsize
(宏参数)
.oobsize
新款多为 128
ECC 位宽
bit_counts
(宏参数)
deal_ecc_status()
 逻辑
最容易出错
ECC 能力
ecc_max
(宏参数)
.ecc_max
新款多为 0x8
读取时间
.tRD
影响性能,非必须

5.3 调试排错 Checklist

现象
可能原因
解决方案
ERR: don't support this kind of nand device
参数表中没有该 ID
在 device_id[] 中添加匹配
ECC 校验失败
bit_counts
 配置错误
核对手册 ECC 状态寄存器定义
读取数据全 0 或全 FF
时序采样点不对
调整 SFC 采样延迟(SMP_DELAY)
OOB 数据异常
oobsize
 配置错误
核对手册备用区大小
Quad SPI 不工作
QE 位未设置
检查 need_quad 和初始化代码

5.4 路径速查表

组件
路径
说明
SPL 工具数据源tools/ingenic-tools/nand_device/*_nand.c
⭐ 主要修改位置
SPL 参数生成工具tools/ingenic-tools/sfc_nand_params.c
工具源码
生成的头文件include/generated/sfc_nand_params.h
❌ 禁止手动修改
SPL 主逻辑common/spl/spl_sfc_nand.c
SPL NAND 加载
内核驱动drivers/mtd/nand/spi/ingenic/*_nand.c
⭐ 内核修改位置
SFC 控制器驱动drivers/mtd/devices/jz_sfc_v1/*nand.c
SoC 级驱动
板级配置drivers/mtd/nand/*_nand.c
板级 NAND 配置

六 踩坑经验与最佳实践

✅ 经验总结

  1. 永远不要修改 generated/ 目录下的文件

    • 这些文件由工具自动生成,make clean 后会被覆盖
    • 正确做法:修改工具的数据源文件
  2. 数据手册是唯一权威

    • 即使是同一厂商的不同型号,参数也可能不同
    • ECC 状态寄存器定义必须逐位核对
  3. 新旧型号对比要全面

    • 不要只看 ID,还要看 OOB 大小、ECC 位宽、时序参数等
    • 本例中 0x71(2 位)和 0xF1(3 位)的 ECC 位宽差异是最大陷阱
  4. SPL/U-Boot 和内核的参数必须一致

    • 两处修改的 pagesize、oobsize、ecc_max 必须相同
    • 建议对照数据手册逐项检查

❌ 容易踩的坑

  1. 误以为可以直接修改 sfc_nand_params.h

    • 结果:重新编译后被覆盖
    • 教训:先理解代码生成流程
  2. 忽略了 bit_counts 参数

    • 结果:ECC 校验逻辑错位,数据读取异常
    • 教训:仔细对比新旧型号的 ECC 状态寄存器
  3. 混淆了 addr_len 的含义

    • 误以为需要改为 3 字节
    • 实际:该字段表示列地址长度(固定 2 字节)
    • 教训:理解每个参数的实际含义
  4. 内核和 SPL 的修改不同步

    • 结果:SPL 能识别但内核不能
    • 教训:两处都要修改,保持一致

七 验证测试命令

7.1 SPL/U-Boot 验证

# 烧录后观察串口输出# 预期看到:Note: nand manufactory name [DS35Q1GB]

7.2 Linux 内核验证

# 查看 MTD 分区cat /proc/mtd# 测试读写flash_erase /dev/mtd0 0 0dd if=/dev/urandom of=/tmp/test.bin bs=1M count=1flashcp /tmp/test.bin /dev/mtd0cmp /tmp/test.bin /tmp/read.bin# 查看内核日志dmesg | grep -i nanddmesg | grep -i ecc

八 总结

本文以 DS35Q1GA → DS35Q1GB 升级为例,完整记录了 SPI NAND Flash 适配的全链路过程

  1. 准备阶段:获取数据手册,提取关键参数,对比新旧差异
  2. SPL/U-Boot 适配:修改工具数据源,重新生成参数表
  3. Linux 内核适配:修改驱动参数数组和 ECC 解析逻辑
  4. 验证测试:确认识别、读写、ECC 功能正常

这套方法论可以复用到其他 SPI NAND Flash 型号的适配中。关键在于:

  • 找到正确的修改位置(工具数据源,而非生成文件)
  • 核对关键参数(尤其是 ECC 状态寄存器定义)
  • 保持 SPL/U-Boot 和内核一致

往期文章(欢迎订阅技术分享栏目全部文章):

【从零开始撸内核驱动源码】:以ttyserial(串口驱动)为例,串联字符设备驱动基础知识点的学习计划
Linux内核源码顶层 Makefile分析并单独编译调试内核自带的驱动
【从零开始撸内核驱动源码】:ttynull驱动
Linux内核驱动安装失败问题调试及解决方法
Linux内核驱动源码走读之编译内核及外部驱动实操指南
谢谢你看到这里
这里是女程序员的笔记本

15年+嵌入式软件开发经验兼二胎宝妈

分享读书心得、工作经验,自我成长和生活方式。

希望我的文字能对你有所帮助

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 20:01:03 HTTP/2.0 GET : https://f.mffb.com.cn/a/509070.html
  2. 运行时间 : 0.185221s [ 吞吐率:5.40req/s ] 内存消耗:4,577.87kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=f3685a8e576a63ce3211462c5a2695d9
  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.001070s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001444s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000707s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000678s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001320s ]
  6. SELECT * FROM `set` [ RunTime:0.000613s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001471s ]
  8. SELECT * FROM `article` WHERE `id` = 509070 LIMIT 1 [ RunTime:0.001131s ]
  9. UPDATE `article` SET `lasttime` = 1787313664 WHERE `id` = 509070 [ RunTime:0.007727s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000725s ]
  11. SELECT * FROM `article` WHERE `id` < 509070 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001220s ]
  12. SELECT * FROM `article` WHERE `id` > 509070 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001169s ]
  13. SELECT * FROM `article` WHERE `id` < 509070 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003233s ]
  14. SELECT * FROM `article` WHERE `id` < 509070 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001864s ]
  15. SELECT * FROM `article` WHERE `id` < 509070 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002433s ]
0.189155s