当前位置:首页>Linux>Linux音频三部曲(2):Linux ASoC驱动深度开发

Linux音频三部曲(2):Linux ASoC驱动深度开发

  • 2026-07-01 17:52:43
Linux音频三部曲(2):Linux ASoC驱动深度开发

本文基于Bootlin文档面向嵌入式Linux内核驱动开发、音频系统集成与硬件调试工程师。内容以相关内核代码、设备树配置、寄存器操作、DAPM电源管理、Regmap抽象为主,覆盖从ALSA到ASoC的演进、三大组件驱动实现、DT配置、DAPM、调试方法。

一、从ALSA到ASoC:架构演进与设计目标

1.1 标准ALSA架构的局限

ALSA(Advanced Linux Sound Architecture)于2002年随Linux 2.5内核合入主线,提供标准化音频API、播放/捕获流、kcontrol控件接口。标准ALSA设计面向PC架构,一张声卡对应一个设备、一个驱动,驱动内部耦合PCI总线、Codec、DMA、接口控制等全部逻辑。

这种架构在嵌入式场景存在明显缺陷:

  1. 代码无法复用:不同SoC与Codec组合需重新编写全量驱动;
  2. 组件耦合严重:Codec驱动与平台驱动绑定,无法独立维护;
  3. 不支持低功耗:缺乏细粒度音频路径电源管理;
  4. 无法适配多组件硬件:SoC+Codec+功放+MUX的模块化结构难以描述。

标准ALSA无法满足嵌入式音频可复用、低功耗、多组件、可配置的核心需求,因此ASoC框架被提出并合入内核。

1.2 ASoC架构定义与设计目标

ASoC全称ALSA System on Chip,2006年合入主线,定位为标准ALSA之上的嵌入式增强层,对外保持原有用户空间API不变,对内实现硬件解耦与组件化。

ASoC核心设计目标:

  1. 组件化驱动分离:Codec、Platform(CPU DAI)、Machine三层独立;
  2. 跨平台复用:同一Codec驱动可适配任意SoC,同一DAI驱动可搭配任意Codec;
  3. 精细化低功耗:基于音频路径的动态电源管理DAPM;
  4. 设备树化配置:支持simple-audio-card等通用驱动,无需手写C语言机器驱动;
  5. 支持多链路、多通道、TDM、PDM等复杂嵌入式接口。

ASoC不修改用户空间ABI,原有aplay/arecord/alsamixer等工具无需改动即可使用。

1.3 ASoC三大核心组件

ASoC将音频系统严格拆分为三部分,遵循单一职责、解耦复用原则:

  1. Codec Driver
    :负责音频编解码器本身,包含寄存器配置、DAI格式、控件、DAPM、时钟;
  2. Platform Driver
    :包含CPU DAI控制器驱动(I2S/SAI/SSI等)与DMA驱动,无板级相关代码;
  3. Machine Driver
    :板级驱动,负责绑定Codec与CPU DAI、配置时钟主从、音频路由、GPIO、功放等。

Codec与Platform驱动高度复用,仅Machine驱动与具体电路板相关。这一结构是嵌入式音频驱动开发的基础。

二、ASoC核心数据结构与注册流程

2.1 核心结构体总览

ASoC驱动围绕一组标准化结构体展开,内核定义位于:

  • include/sound/soc.h
  • include/sound/soc-dai.h
  • include/sound/soc-component.h
  • include/sound/soc-dapm.h

关键结构体:

  1. struct snd_soc_card
    :代表一张声卡,是Machine驱动的核心载体;
  2. struct snd_soc_dai_link
    :描述一条CPU DAI与Codec DAI的连接链路;
  3. struct snd_soc_component
    :组件抽象,统一表示Codec、CPU DAI、功放、MUX;
  4. struct snd_soc_dai_driver
    :DAI接口驱动,包含格式、时钟、回调;
  5. struct snd_soc_dapm_widget
     :DAPM电源管理节点与路径;
  6. struct snd_kcontrol_new
    :ALSA控件(音量、静音、开关、枚举);
  7. struct regmap_config
    :I2C/SPI寄存器抽象配置。

2.2 声卡注册流程

ASoC声卡注册入口为Machine驱动,标准流程:

  1. 定义并填充struct snd_soc_card
  2. 定义struct snd_soc_dai_link,绑定CPU DAI与Codec DAI;
  3. 实现必要回调(hw_params、set_sysclk等);
  4. 调用devm_snd_soc_register_card注册声卡;
  5. 内核自动匹配并加载Codec与Platform组件;
  6. 初始化DAPM图、控件、路由;
  7. 向ALSA核心注册声卡,导出至用户空间。

注册失败常见原因:DAI匹配失败、时钟不可用、寄存器访问错误、DAPM路由未定义。

三、Codec驱动开发完整实现

Codec是音频硬件核心,Codec驱动是ASoC中最复杂的组件,负责寄存器控制、DAI通信、模拟路由、时钟管理、控件、DAPM

3.1 Codec驱动基本结构

现代内核(≥4.17)统一使用struct snd_soc_component_driver替代旧struct snd_soc_codec_driver,驱动通过devm_snd_soc_register_component注册。

典型注册代码:

static const struct snd_soc_component_driver xxx_codec_driver = {    .name           = "xxx-codec",    .probe          = xxx_codec_probe,    .remove         = xxx_codec_remove,    .controls       = xxx_controls,    .num_controls   = ARRAY_SIZE(xxx_controls),    .dapm_widgets   = xxx_dapm_widgets,    .num_dapm_widgets = ARRAY_SIZE(xxx_dapm_widgets),    .dapm_routes    = xxx_dapm_routes,    .num_dapm_routes = ARRAY_SIZE(xxx_dapm_routes),    .set_sysclk     = xxx_set_sysclk,    .set_pll        = xxx_set_pll,    .set_bias_level = xxx_set_bias_level,};

3.2 DAI驱动描述

每个Codec至少实现一个DAI,用于与CPU通信:

static struct snd_soc_dai_driver xxx_dai = {    .name = "xxx-hifi",    .playback = {        .stream_name    = "Playback",        .channels_min   = 1,        .channels_max   = 2,        .rates          = SNDRV_PCM_RATE_8000_48000,        .formats        = SNDRV_PCM_FMTBIT_S16_LE |                          SNDRV_PCM_FMTBIT_S24_LE,    },    .capture = {        .stream_name    = "Capture",        .channels_min   = 1,        .channels_max   = 2,        .rates          = SNDRV_PCM_RATE_8000_48000,        .formats        = SNDRV_PCM_FMTBIT_S16_LE,    },    .ops = &xxx_dai_ops,};

3.3 DAI操作回调(dai_ops)

DAI ops是Codec与平台交互的核心接口,必须正确实现:

struct snd_soc_dai_ops {    int (*set_sysclk)(struct snd_soc_dai *dai, int clk_id,                       unsigned int freq, int dir);    int (*set_pll)(struct snd_soc_dai *dai, int pll_id, int source,                    unsigned int freq_in, unsigned int freq_out);    int (*set_fmt)(struct snd_soc_dai *dai, unsigned int fmt);    int (*hw_params)(struct snd_pcm_substream *substream,                     struct snd_pcm_hw_params *params,                     struct snd_soc_dai *dai);    int (*trigger)(struct snd_pcm_substream *substream,                    int cmd, struct snd_soc_dai *dai);    int (*mute_stream)(struct snd_soc_dai *dai, int mute, int stream);};

关键回调说明:

  • set_fmt
    :配置接口格式(I2S/Left-J/DSP-A/TDM)与时钟主从;
  • hw_params
    :根据采样率、位深、通道数配置Codec;
  • set_sysclk
    :设置MCLK频率与来源;
  • trigger
    :处理START/STOP等流事件,用于复位、同步;
  • mute_stream
    :实现软硬件静音,抑制爆音。

3.4 Regmap寄存器抽象

Codec几乎全部通过I2C/SPI配置,内核使用Regmap框架统一抽象,简化读写、缓存、位操作。

典型Regmap配置:

const struct regmap_config xxx_regmap_config = {    .reg_bits       = 16,    .val_bits       = 8,    .max_register   = 0x7F,    .writeable_reg  = xxx_writeable_reg,    .readable_reg   = xxx_readable_reg,    .volatile_reg   = xxx_volatile_reg,    .cache_type     = REGCACHE_RBTREE,};

Regmap提供统一接口:

  • regmap_read
     / regmap_write
  • regmap_update_bits
    :读—改—写原子操作
  • regcache_sync
    :缓存同步至硬件

Regmap大幅减少驱动重复代码,兼容I2C/SPI/MMIO。

3.5 Codec时钟配置

Codec依赖稳定时钟才能正常工作,时钟配置流程:

  1. Machine驱动通过snd_soc_dai_set_sysclk传入MCLK;
  2. Codec驱动在set_sysclk中保存频率与来源;
  3. hw_params
    中根据采样率配置PLL与分频;
  4. 生成正确BCLK与LRCLK。

时钟错误会导致无声、爆音等现象。

3.6 控件(kcontrol)实现

kcontrol是用户空间控制音频参数的统一接口,ASoC提供大量宏简化定义:

常用宏:

  • SOC_SINGLE
    :单比特开关/单通道控制;
  • SOC_DOUBLE
    :左右声道双控;
  • SOC_ENUM
    :枚举选择(去加重、通道选择);
  • SOC_SINGLE_TLV
    :带dB映射的音量控制;
  • SOC_DOUBLE_R_RANGE_TLV
    :左右分离、带范围音量。

示例:

static const DECLARE_TLV_DB_SCALE(dac_tlv, -10050501);SOC_SINGLE_TLV("Master Playback Volume", REG_DAC_VOL, 02550, dac_tlv),SOC_DOUBLE("ADC1 Mute Switch", REG_ADC_MUTE, 0110),

控件命名遵循ALSA约定,如Master Playback VolumeCapture Volume,便于alsamixer自动识别。

四、Platform(CPU DAI)驱动开发

Platform驱动包含CPU DAI控制器DMA两部分,负责数字接口时序与数据搬运。

4.1 CPU DAI驱动职责

  1. 实现I2S/SAI/SSI/McASP等控制器时序;
  2. 提供时钟生成与分频;
  3. 配置格式、位宽、通道、TDM时隙;
  4. 与DMA联动,实现FIFO读写;
  5. 提供set_sysclkset_fmthw_params回调。

典型CPU DAI:NXP SAI、Atmel SSC、TI McASP、Rockchip I2S、Allwinner DAI。

4.2 DMA处理

ASoC推荐使用标准DMAengine框架,驱动只需:

  1. 定义DMA通道地址与FIFO位置;
  2. 调用snd_soc_dai_init_dma_data绑定DMA参数;
  3. 调用devm_snd_dmaengine_pcm_register注册PCM设备。

示例:

struct snd_dmaengine_dai_dma_data playback_dma = {    .addr = 0xXXXXXXX,    .maxburst = 1,};snd_soc_dai_init_dma_data(dai, &playback_dma, &capture_dma);

DMA配置错误会导致数据中断等现象。

4.3 TDM与时隙配置

多通道场景使用TDM,驱动需实现set_tdm_slot回调:

int (*set_tdm_slot)(struct snd_soc_dai *dai,                    unsigned int tx_mask, unsigned int rx_mask,                    int slots, int slot_width);
  • slots:总时隙数(4/8/16);
  • slot_width:每时隙位宽(16/24/32);
  • tx_mask/rx_mask:激活时隙位图。

CPU DAI与Codec必须配置完全一致的TDM参数。

五、Machine驱动与设备树(DT)配置

Machine驱动连接Codec与CPU DAI。现代内核优先使用设备树+通用simple-audio-card,无需手写C语言驱动。

5.1 simple-audio-card标准绑定

simple-audio-card是内核通用音频声卡驱动,驱动路径:sound/soc/generic/simple-card.c

必备属性:

  • compatible = "simple-audio-card"
  • simple-audio-card,name
    :声卡名称;
  • simple-audio-card,format
    :音频格式(i2s/left_j/dsp-a/tdm);
  • simple-audio-card,mclk-fs
    :MCLK与采样率比率(256/384);
  • cpu
    子节点:sound-dai = <&dai>
  • codec
    子节点:sound-dai = <&codec>
  • bitclock-master
    /frame-master:时钟主从配置。

5.2 时钟主从配置

时钟主从决定BCLK/LRCLK来源,通过dai_fmt配置:

  • SND_SOC_DAIFMT_CBP_CFP
    :Codec提供位时钟+帧时钟(推荐);
  • SND_SOC_DAIFMT_CBC_CFC
    :CPU提供全部时钟。

设备树中直接使用:

bitclock-master = <&codec_dai>;frame-master = <&codec_dai>;

主从配置错误是嵌入式音频最常见故障。

5.3 设备树完整示例(i.MX6UL + ADAU1372)

&i2c1 {    adau1372: codec@3c {        compatible = "adi,adau1372";        reg = <0x3c>;#sound-dai-cells = <0>;        clocks = <&clk IMX6UL_CLK_SAI2>;        clock-names = "mclk";    };};&sai2 {    status = "okay";    pinctrl-0 = <&pinctrl_sai2>;    fsl,sai-mclk-direction-output;    assigned-clocks = <&clks IMX6UL_CLK_SAI2>;    assigned-clock-rates = <24576000>;};sound {    compatible = "simple-audio-card";    simple-audio-card,name = "imx6ul-adau1372";    simple-audio-card,format = "i2s";    simple-audio-card,mclk-fs = <512>;    bitclock-master = <&adau1372_dai>;    frame-master = <&adau1372_dai>;    simple-audio-card,dai-link@0 {        cpu {            sound-dai = <&sai2>;        };        codec {            sound-dai = <&adau1372>;        };    };};

5.4 音频路由(Routing)配置

Routing用于描述板级模拟连接,如麦克风→ADC、DAC→耳机。

设备树配置:

simple-audio-card,widgets =    "Microphone""Built-in Mic",    "Headphone""Headphone Jack";simple-audio-card,routing =    "MICIN""Built-in Mic",    "Headphone Jack""HPOUTL",    "Headphone Jack""HPOUTR";

Routing直接决定DAPM路径是否连通。

5.5 手写C语言Machine驱动

简单平台可手写C语言Machine驱动,核心是struct snd_soc_card

struct snd_soc_dai_linkstatic struct snd_soc_dai_link atmel_wm8904_dailink = {    .name = "WM8904",    .stream_name = "WM8904 PCM",    .dai_fmt = SND_SOC_DAIFMT_I2S |                SND_SOC_DAIFMT_NB_NF |                SND_SOC_DAIFMT_CBP_CFP,    .ops = &atmel_asoc_wm8904_ops,};static struct snd_soc_card atmel_asoc_wm8904_card = {    .name = "atmel-asoc-wm8904",    .dai_link = &atmel_asoc_wm8904_dailink,    .num_links = 1,};staticintatmel_asoc_wm8904_probe(struct platform_device *pdev){    card->dev = &pdev->dev;    return devm_snd_soc_register_card(&pdev->dev, card);}

现代产品优先使用设备树方案,维护更简单。

六、ASoC DAPM动态电源管理

DAPM(Dynamic Audio Power Management)是ASoC低功耗核心,自动根据音频路径上下电模块,对用户空间完全透明。

6.1 DAPM基本概念

  1. Widget
    :可独立电源控制的硬件单元(ADC/DAC/MICBIAS/PGA/MUX/OUT);
  2. Route
    :Widget之间的音频连接;
  3. Path
    :从输入到输出的完整音频路径;
  4. Power
    :路径连通则自动上电,断开则自动下电。

DAPM基于图遍历算法,无需驱动手动管理电源。

6.2 Widget类型

  • 端点:SND_SOC_DAPM_INPUTOUTPUTMICSPEAKERHEADPHONE
  • 处理:SND_SOC_DAPM_ADCDACPGAMIXERMUX
  • 电源:SND_SOC_DAPM_SUPPLYMICBIAS
  • 虚拟:SND_SOC_DAPM_STREAM

定义示例:

static const struct snd_soc_dapm_widget xxx_dapm_widgets[] = {    SND_SOC_DAPM_INPUT("AINL"),    SND_SOC_DAPM_INPUT("AINR"),    SND_SOC_DAPM_ADC("ADC""Capture", REG_ADC_PD, 01),    SND_SOC_DAPM_DAC("DAC""Playback", REG_DAC_PD, 01),    SND_SOC_DAPM_OUTPUT("HPOUTL"),    SND_SOC_DAPM_OUTPUT("HPOUTR"),    SND_SOC_DAPM_MICBIAS("MICBIAS", REG_MICBIAS, 01),};

6.3 Route定义

Route表示音频可流通路径:

static const struct snd_soc_dapm_route xxx_dapm_routes[] = {    { "ADC"NULL"AINL" },    { "ADC"NULL"AINR" },    { "HPOUTL"NULL"DAC" },    { "HPOUTR"NULL"DAC" },    { "MICBIAS"NULL"Mic Jack" },};

Route错误会导致DAPM无法上电,出现无声但寄存器正常的问题。

6.4 DAPM工作流程

  1. 用户打开播放/捕获流;
  2. ALSA触发hw_params;
  3. DAPM遍历所有Widget;
  4. 标记连通路径上的Widget为上电;
  5. 按顺序上电(偏置→模拟→数字→输出);
  6. 停止时逆序下电,抑制爆音。

6.5 DAPM调试工具

  1. debugfs路径:/sys/kernel/debug/asoc/<card>/<component>/dapm/
  2. cat xxx_widget
    可查看开关状态;
  3. dapm-graph
    vizdapm生成可视化拓扑图;

4. 常见问题:Widget始终Off,说明Route未连通或控件未打开。

七、辅助设备驱动:功放、MUX

嵌入式音频常包含功放、模拟开关、MIC MUX等,ASoC提供通用驱动。

7.1 simple-amplifier

GPIO控制功放,无需I2C配置:

speaker_amp: audio-amplifier {    compatible = "simple-audio-amplifier";    enable-gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>;    sound-name-prefix = "Speaker Amp";};

在声卡中通过simple-audio-card,aux-devs挂载。

7.2 simple-mux

GPIO模拟多路选择器:

mic_mux: mic-mux {    compatible = "simple-audio-mux";    mux-gpios = <&gpio5 5 GPIO_ACTIVE_LOW>;    sound-name-prefix = "Mic Mux";};

路由配置:

"Mic Mux OUT""Mic Mux IN1","Mic Mux OUT""Mic Mux IN2"

八、总结

ASoC是嵌入式Linux音频的标准框架,其核心价值在于组件化复用、设备树化配置、DAPM低功耗、标准化API

驱动开发遵循固定流程:

  1. 明确硬件架构:Codec、DAI、时钟、功放、路由;
  2. 编写/适配Codec驱动,实现Regmap、DAI、控件、DAPM;
  3. 确保CPU DAI驱动支持对应格式与时钟;
  4. 使用simple-audio-card编写设备树,配置主从、时钟、路由;
  5. 调试DAPM连通性、时钟、控件、功放时序;
  6. 优化功耗、爆音等问题。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 21:57:59 HTTP/2.0 GET : https://f.mffb.com.cn/a/492562.html
  2. 运行时间 : 0.143540s [ 吞吐率:6.97req/s ] 内存消耗:4,584.24kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=06e42f53463e9bad4a20f9582eda88cf
  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.000502s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000569s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.005220s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000463s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000492s ]
  6. SELECT * FROM `set` [ RunTime:0.015886s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000704s ]
  8. SELECT * FROM `article` WHERE `id` = 492562 LIMIT 1 [ RunTime:0.007703s ]
  9. UPDATE `article` SET `lasttime` = 1783087079 WHERE `id` = 492562 [ RunTime:0.002263s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000386s ]
  11. SELECT * FROM `article` WHERE `id` < 492562 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001627s ]
  12. SELECT * FROM `article` WHERE `id` > 492562 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.003727s ]
  13. SELECT * FROM `article` WHERE `id` < 492562 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.004998s ]
  14. SELECT * FROM `article` WHERE `id` < 492562 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.014678s ]
  15. SELECT * FROM `article` WHERE `id` < 492562 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.016687s ]
0.145147s