免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

深入解析fsl-asoc-card.c:理解ASoC機(jī)器驅(qū)動(dòng)probe全流程

深入解析fsl-asoc-card.c:理解ASoC機(jī)器驅(qū)動(dòng)probe全流程 把一塊 i.MX6ULL 板子上的聲卡整明白最繞不開的就是fsl-asoc-card.c這個(gè)驅(qū)動(dòng)。它是 NXP 平臺(tái) ASoC 機(jī)器驅(qū)動(dòng)的通用實(shí)現(xiàn)負(fù)責(zé)把 CPU 側(cè)的 SAI 和外部 Codec “縫”成一張完整的 HiFi 聲卡。網(wǎng)上講 ALSA 和 ASoC 的資料不少但真到probe函數(shù)級(jí)別一段一段跟過源碼的人其實(shí)不多。這篇文章就拿fsl-asoc-card.c的 probe 流程開刀從 compatible 匹配到snd_soc_register_card把每一步在干什么、為什么要這么干講清楚。如果你正在調(diào) imx6ull 的音頻驅(qū)動(dòng)或者想弄懂機(jī)器驅(qū)動(dòng)怎么和 DTS 配合生成聲卡這篇逐段拆解應(yīng)該能幫你少走不少彎路。1. 先明白 fsl-asoc-card.c 到底在縫什么1.1 ASoC 的三角關(guān)系machine 就是那根線ASoC 框架把音頻驅(qū)動(dòng)拆成三個(gè)角色CPU DAI、Codec、Machine。CPU DAI 在 i.MX6ULL 上就是 SAI同步音頻接口它負(fù)責(zé)把內(nèi)存里的 PCM 數(shù)據(jù)用 I2S 格式發(fā)出去Codec 是板子上的編解碼芯片比如 WM8960、SGTL5000負(fù)責(zé)把數(shù)字信號(hào)轉(zhuǎn)成模擬信號(hào)或者反過來Machine 驅(qū)動(dòng)則負(fù)責(zé)把這兩者連接起來告訴 ASoC哪塊 CPU DAI 和哪顆 Codec 配對(duì)用什么采樣率、什么聲道格式??梢赃@樣理解CPU 側(cè)就像是一個(gè)只講數(shù)字協(xié)議的搬運(yùn)工Codec 是一個(gè)只懂模擬信號(hào)的翻譯官而 machine 驅(qū)動(dòng)是那根電話線它要確保兩邊說的都是同一種“方言”否則音頻數(shù)據(jù)就傳不過去。fsl-asoc-card.c在 i.MX6ULL 上扮演的正是 machine 驅(qū)動(dòng)這個(gè)角色。它本身不處理音頻數(shù)據(jù)也不配置硬件寄存器它只負(fù)責(zé)“牽線搭橋”告訴內(nèi)核這三者之間的連接關(guān)系。這也是為什么很多初學(xué)者上來就去找音頻數(shù)據(jù)流經(jīng)的代碼路徑找半天找不到——因?yàn)闄C(jī)器驅(qū)動(dòng)里根本沒有音頻數(shù)據(jù)只有綁定關(guān)系和初始化順序。理解了這點(diǎn)你再去看probe函數(shù)里的那些結(jié)構(gòu)體賦值就不會(huì)覺得亂了。1.2 fsl-asoc-card.c 和 simple-card 的取舍內(nèi)核里其實(shí)早就有一個(gè)通用機(jī)器驅(qū)動(dòng)simple-card很多平臺(tái)用它也能跑起來。那為什么 NXP 還要單獨(dú)維護(hù)一個(gè)fsl-asoc-card.c因?yàn)樗?simple-card 多做了幾件 NXP 平臺(tái)特定的事。比如說不同 Codec 對(duì) MCLK 的頻率要求不一樣WM8960 需要 24MHz 或者 12MHz 的 SYSCLK而 SGTL5000 可能對(duì)時(shí)鐘的使能時(shí)序更敏感。fsl-asoc-card 里針對(duì)常見 Codec 做了適配能在hw_params階段正確設(shè)置 clock 和格式。另一個(gè)典型場(chǎng)景是 ESAI 接口的 TDM 模式simple-card 不一定能正確處理每條 DAI 的 slot 配置。加上 fsl-asoc-card 直接綁定了fsl,imx-audio-wm8960、fsl,imx-audio-sgtl5000這類 compatibleDTS 里寫起來更直觀對(duì) NXP 參考板上常見的 Codec 型號(hào)幾乎做到開箱即用。當(dāng)然這不是說 simple-card 不行。如果你的板子用的是通用 Codec且不需要特定時(shí)鐘時(shí)序simple-card 反而更輕量。但既然你點(diǎn)開了fsl-asoc-card.c大概率就是用 NXP 官方的參考設(shè)計(jì)那跟著這套驅(qū)動(dòng)走下去是最省事的路徑。1.3 probe 在整條鏈路里的位置一個(gè)聲卡從無到有要經(jīng)過設(shè)備樹節(jié)點(diǎn)匹配、platform driver probe、dai_link 填充、snd_soc_register_card 注冊(cè)、card instantiate 這一連串過程。probe函數(shù)是其中的總調(diào)度它做的事情可以歸納為三件拿到硬件信息、填充描述結(jié)構(gòu)體、把結(jié)構(gòu)體交給 ASoC 框架注冊(cè)。后面幾個(gè)章節(jié)會(huì)逐段展開這三件事。先給讀者一個(gè)心理預(yù)期fsl_asoc_card_probe本身的代碼量并不大幾十行到一百多行但它牽扯出的數(shù)據(jù)結(jié)構(gòu)很多。真正理解它的人不是記住了每一行而是明白了它往dai_link里填的那些字符串最終如何被 ASoC 框架用來查找和綁定設(shè)備。2. probe 前半場(chǎng)從 compatible 到私有數(shù)據(jù)就位2.1 入口函數(shù)與設(shè)備樹匹配以 5.4 版本內(nèi)核為例fsl-asoc-card.c的驅(qū)動(dòng)入口用的是一個(gè)標(biāo)準(zhǔn)platform_driver結(jié)構(gòu)static const struct of_device_id fsl_asoc_card_dt_ids[] { { .compatible fsl,imx-audio-sgtl5000, }, { .compatible fsl,imx-audio-wm8960, }, { .compatible fsl,imx-audio-cs42888, }, { .compatible fsl,imx-audio-wm8962, }, { .compatible fsl,imx-audio-ak4458, }, { .compatible fsl,imx-audio-ak5558, }, { .compatible fsl,imx-audio-esai, }, { .compatible fsl,imx-audio-sai, }, {}, }; static struct platform_driver fsl_asoc_card_driver { .probe fsl_asoc_card_probe, .driver { .name fsl-asoc-card, .pm snd_soc_pm_ops, .of_match_table fsl_asoc_card_dt_ids, }, };probe函數(shù)的入口長這樣代碼有省略但核心邏輯保留static int fsl_asoc_card_probe(struct platform_device *pdev) { struct device *dev pdev-dev; struct fsl_asoc_card_priv *priv; struct device_node *np dev-of_node; int ret; priv devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv-dev dev; dev_set_drvdata(dev, priv); /* 獲取 CPU DAI 信息 */ ret fsl_asoc_card_get_dai(priv); if (ret) return ret; /* 獲取 Codec 信息 */ ret fsl_asoc_card_get_codec(priv); if (ret) return ret; /* 填充 dai_link */ ret fsl_asoc_card_fill_dai_link(priv); if (ret) return ret; /* 注冊(cè)聲卡 */ ret snd_soc_register_card(priv-card); if (ret) { dev_err(dev, snd_soc_register_card failed: %d\n, ret); return ret; } return 0; }入口的邏輯非常直白devm_kzalloc分配一個(gè)私有數(shù)據(jù)結(jié)構(gòu)體然后依次調(diào)用幾個(gè)輔助函數(shù)去獲取 DAI、獲取 Codec、填充 dai_link最后注冊(cè)。這種寫法在 Linux 驅(qū)動(dòng)里非常典型——先準(zhǔn)備數(shù)據(jù)再提交注冊(cè)。注意這里用的是devm_kzalloc它會(huì)在驅(qū)動(dòng)解綁時(shí)自動(dòng)釋放內(nèi)存省掉了手動(dòng)kfree的麻煩也讓remove函數(shù)變得很干凈。2.2 fsl_asoc_card_priv 這個(gè)“總管”里有什么私有數(shù)據(jù)結(jié)構(gòu)體fsl_asoc_card_priv是整個(gè)聲卡驅(qū)動(dòng)的“總管”它貫穿了 probe 后續(xù)的所有階段。不同內(nèi)核版本結(jié)構(gòu)體略有差異但核心字段是穩(wěn)定的struct fsl_asoc_card_priv { struct device *dev; struct snd_soc_card card; struct snd_soc_dai_link dai_link; struct snd_soc_dai_link_component cpu_dai; struct snd_soc_dai_link_component codec_dai; struct snd_soc_dai_link_component platform_dai; struct snd_soc_dai_link_component codec_component; struct fsl_asoc_dai_priv dai_priv; ... };這個(gè)結(jié)構(gòu)體的設(shè)計(jì)意圖很明顯把聲卡描述拆成 CPU DAI、Codec、Platform 三塊每一塊用snd_soc_dai_link_component記錄名字和設(shè)備節(jié)點(diǎn)。snd_soc_card和snd_soc_dai_link是 ASoC 框架要求填的兩大核心結(jié)構(gòu)前者代表聲卡本身后者代表一組數(shù)據(jù)鏈路。從snd_soc_dai_link_component這個(gè)命名就能看出現(xiàn)代內(nèi)核把“Codec”和“DAI”分開描述了不再像老內(nèi)核那樣把 codec 直接掛在 dai_link 上。這是一種更靈活的模型一個(gè) Codec 芯片里可以存在多個(gè) DAI比如 WM8960 有 AIF1、AIF2 兩個(gè)音頻接口通過 codec_dai 的名字來指定用哪一個(gè)。2.3 fsl_asoc_card_get_dai先把 CPU 側(cè)的信息摳出來fsl_asoc_card_get_dai的作用是從設(shè)備樹節(jié)點(diǎn)拿到 CPU DAI 的 phandle 和名字。DTS 里通常這么寫sound { compatible fsl,imx6ull-evk-wm8960, fsl,imx-audio-wm8960; model wm8960-audio; cpu-dai sai2; audio-codec wm8960; codec-dai-name wm8960-hifi; audio-routing Headphone Jack, HP_L, Headphone Jack, HP_R, LINPUT1, AMIC, LINPUT3, AMIC; mux-int-pin 1; mux-ext-pin 1; };cpu-dai sai2指向 SAI2 節(jié)點(diǎn)fsl_asoc_card_get_dai內(nèi)部會(huì)調(diào)用of_parse_phandle找到這個(gè)節(jié)點(diǎn)再讀取節(jié)點(diǎn)的名字最終拼出 CPU DAI 的設(shè)備名。這個(gè)設(shè)備名會(huì)填進(jìn)cpu_dai組件里以后 ASoC 框架就是靠它去找已經(jīng)注冊(cè)的 DAI 設(shè)備。這里比較容易忽略的一點(diǎn)是CPU DAI 的設(shè)備節(jié)點(diǎn)必須已經(jīng)有一個(gè)對(duì)應(yīng)的平臺(tái)驅(qū)動(dòng)在跑。對(duì) SAI2 來說驅(qū)動(dòng)是fsl-sai.c如果 SAI2 節(jié)點(diǎn)沒有status okay或者 SAI 驅(qū)動(dòng)沒有成功 probe后面再怎么做聲卡匹配都會(huì)失敗而且報(bào)錯(cuò)信息可能要到很晚才出現(xiàn)。2.4 fsl_asoc_card_get_codecCodec 的設(shè)備節(jié)點(diǎn)也要拿到與 CPU DAI 類似fsl_asoc_card_get_codec負(fù)責(zé)解析audio-codec屬性。codec 通常在 I2C 總線上比如 WM8960 掛在 I2C1 上設(shè)備節(jié)點(diǎn)是一個(gè) i2c_client。驅(qū)動(dòng)讀取audio-codec的 phandle同樣拿到 codec 設(shè)備的完整名字然后把它填進(jìn) codec 組件。這一步需要特別注意Codec 本身也是一個(gè)獨(dú)立驅(qū)動(dòng)的設(shè)備。如果 I2C 上的 WM8960 沒有成功 probefsl_asoc_card_get_codec可能不會(huì)立刻報(bào)錯(cuò)因?yàn)檫@里只是在解析設(shè)備樹名字并沒有去檢查設(shè)備是否活躍。等到后面snd_soc_register_card真正去綁定 codec 時(shí)才會(huì)發(fā)現(xiàn)找不到對(duì)應(yīng)的 codec 設(shè)備那時(shí)候的報(bào)錯(cuò)就讓人一頭霧水了。3. probe 中場(chǎng)dai_link 是怎么被填出來的3.1 dai_link 的每個(gè)字段都有來歷fsl_asoc_card_fill_dai_link是 probe 里信息密度最高的一段。它把前面解析到的 CPU DAI、Codec 信息逐一填進(jìn)struct snd_soc_dai_link結(jié)構(gòu)體。核心代碼大概長這樣static int fsl_asoc_card_fill_dai_link(struct fsl_asoc_card_priv *priv) { struct snd_soc_dai_link *dai_link priv-dai_link; dai_link-name HiFi; dai_link-stream_name HiFi; dai_link-cpus priv-cpu_dai; dai_link-num_cpus 1; dai_link-codecs priv-codec_component; dai_link-num_codecs 1; dai_link-platforms priv-platform_dai; dai_link-num_platforms 1; dai_link-ops fsl_asoc_card_ops; dai_link-init fsl_asoc_card_dai_init; return 0; }這里name和stream_name都叫 “HiFi”這個(gè)字符串會(huì)出現(xiàn)在聲卡的 PCM 設(shè)備名里。cpus、codecs、platforms這三組指針分別指向前面解析出的組件結(jié)構(gòu)體。ops指向的是一個(gè)回調(diào)集里面有hw_params、startup、shutdown等函數(shù)這些回調(diào)會(huì)在聲卡運(yùn)行時(shí)被 ASoC 調(diào)用。init回調(diào)在 dai_link 初始化時(shí)執(zhí)行通常用于設(shè)置 codec 的私有數(shù)據(jù)或初始化 kcontrol。注意一點(diǎn)在老版本內(nèi)核里dai_link 直接使用cpu_dai_name、codec_name、codec_dai_name這種字符串字段而新版本改成了snd_soc_dai_link_component數(shù)組。如果你在網(wǎng)上搜到舊代碼看到字符串賦值不要奇怪那是內(nèi)核 API 演進(jìn)的結(jié)果。理解這一點(diǎn)你查代碼時(shí)就不容易犯迷糊。3.2 codec_dai_name 是從哪來的DTS 里codec-dai-name wm8960-hifi這個(gè)屬性最終會(huì)被解析進(jìn) codec_dai 組件的dai_name字段。這個(gè)字符串必須和 codec 驅(qū)動(dòng)內(nèi)部注冊(cè)的 DAI 名字完全一致多一個(gè)空格都不行。WM8960 驅(qū)動(dòng)里會(huì)這樣注冊(cè) DAIstatic struct snd_soc_dai_driver wm8960_dai { .name wm8960-hifi, .playback { ... }, .capture { ... }, };也就是說Machine 驅(qū)動(dòng)說“我要用名字叫 wm8960-hifi 的 DAI”ASoC 框架就去 Codec 驅(qū)動(dòng)已注冊(cè)的 DAI 列表里找這個(gè)名字。如果 DTS 里寫成了wm8960_hifi或者wm8960-hifi1那匹配就會(huì)失敗聲卡注冊(cè)就會(huì)報(bào)錯(cuò)。這個(gè)設(shè)計(jì)既是 ASoC 靈活性的體現(xiàn)也是初學(xué)者最容易踩的坑。內(nèi)核打印的錯(cuò)誤信息有時(shí)不夠直觀比如只顯示一個(gè)ASoC: DAI wm8960-hifi not registered如果不清楚匹配規(guī)則很難快速定位到是 DTS 里一個(gè)短橫線和下劃線的區(qū)別。3.3 ops 里藏著的 HiFi 參數(shù)控制fsl_asoc_card_ops里的核心回調(diào)是hw_params。以 WM8960 為例它需要對(duì) codec 設(shè)置系統(tǒng)時(shí)鐘否則 Codec 內(nèi)部的 DSP 和 DAC/ADC 都起不來static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd substream-private_data; struct fsl_asoc_card_priv *priv ...; unsigned int sample_rate params_rate(params); unsigned int mclk; /* 根據(jù)采樣率計(jì)算合適的 MCLK */ mclk fsl_asoc_card_get_mclk_rate(sample_rate, priv); /* 設(shè)置 CPU DAI 和 Codec 的系統(tǒng)時(shí)鐘 */ snd_soc_dai_set_sysclk(rtd-cpu_dai, 0, mclk, 0); snd_soc_dai_set_sysclk(rtd-codec_dai, 0, mclk, 0); return 0; }為什么要根據(jù)采樣率計(jì)算 MCLK因?yàn)槌R姷囊纛l采樣率是 8k 的整數(shù)倍和 48k 的整數(shù)倍這兩組頻率對(duì) MCLK 的要求不同。比如 44.1kHz 系常用 22.5792MHz 或 11.2896MHz48kHz 系常用 24.576MHz 或 12.288MHz。WM8960 的 SYSCLK 要求通常是采樣率的 256 倍、384 倍、512 倍等這里 fsl-asoc-card 會(huì)優(yōu)先選擇固定的 PLL 輸出頻率讓 Codec 工作在最優(yōu)狀態(tài)。如果你在移植中改了 Codec比如把 WM8960 換成 SGTL5000就一定要關(guān)注這個(gè)fsl_asoc_card_get_mclk_rate函數(shù)。不同 Codec 的 MCLK 范圍、PLL 倍頻系數(shù)都不一樣直接套用會(huì)出現(xiàn)“播放有聲音但明顯變調(diào)”或者“錄音全是噪音”的怪問題。3.4 dai_init撥碼開關(guān)和私有設(shè)置的入口dai_link 的init回調(diào)在 ASoC 框架實(shí)例化這條路時(shí)會(huì)被調(diào)用fsl-asoc-card 里通常會(huì)在此時(shí)做一些 Codec 專屬的設(shè)置。比如從設(shè)備樹讀取audio-routing屬性創(chuàng)建音頻路由或者通過snd_soc_dapm_force_enable_pin強(qiáng)制開啟某個(gè)引腳。有些參考板上音頻路徑里有一個(gè)外部模擬開關(guān)切換 Line-in 和 Mic 輸入由 GPIO 控制。這時(shí)就可以在dai_init里讀取 DTS 中自定義的mux-int-pin、mux-ext-pin屬性通過snd_soc_dapm_new_controls注冊(cè)自定義開關(guān)。這也是為什么dai_init往往比hw_params更容易讓人困惑——它做的事情高度依賴具體板卡設(shè)計(jì)沒有一個(gè)統(tǒng)一套路。拿到一份不熟悉的 DTS最好的辦法是在dai_init里打一個(gè)dev_info把接收到的節(jié)點(diǎn)內(nèi)容打印出來再對(duì)照原理圖確認(rèn)每一個(gè) pin 的含義。4. probe 后半場(chǎng)snd_soc_register_card 和那根“針線”4.1 注冊(cè)前的自檢fsl_asoc_card_fill_dai_link完成后probe 還剩最后一個(gè)關(guān)鍵動(dòng)作調(diào)用snd_soc_register_card。不過在此之前有些版本會(huì)先檢查card結(jié)構(gòu)體的完整性比如 num_dapm_widgets 是否合法、driver_name 是否為空等。這些自檢邏輯散落在 ASoC 框架內(nèi)部probe 本身反而看不到太多。實(shí)際上當(dāng) fsl-asoc-card 走到snd_soc_register_card時(shí)它正在做的事情可以概括為把一張“還沒通電”的聲卡描述注冊(cè)到 ALSA 核心。注冊(cè)成功之后ALSA 核心會(huì)為它創(chuàng)建邏輯設(shè)備節(jié)點(diǎn)但真正的硬件初始化還要等到 card instantiate 過程。這里有一個(gè)容易混淆的概念snd_soc_register_card和后面聲卡真正變得“可用”之間還有一段路要走。它更像是在社保局登記了一個(gè)人的戶口但這個(gè)人還沒開始上班。真正的上班也就是 DAC 初始化、codec bias 上電是在 instantiate 階段完成的。4.2 snd_soc_register_card 之后發(fā)生了什么snd_soc_register_card會(huì)觸發(fā)snd_soc_instantiate_card這個(gè)過程做幾件大事第一遍歷card-dai_link數(shù)組對(duì)每個(gè) dai_link 調(diào)用soc_bind_dai_link把 cpu_dai、codec_dai、platform 從內(nèi)核已注冊(cè)的設(shè)備列表里找出來并綁定。這就是最常報(bào)錯(cuò)的地方如果找不到匹配的 CPU DAI 或 Codec這里會(huì)輸出ASoC: CPU DAI ... not registered之類的錯(cuò)誤。第二對(duì)所有綁定的 DAI 調(diào)用snd_soc_dai_probe這個(gè)函數(shù)會(huì)調(diào)用 DAI 驅(qū)動(dòng)自己的probe回調(diào)完成硬件初始化。對(duì) SAI 來說就是配置引腳、時(shí)鐘、DMA 通道對(duì) Codec 來說就是復(fù)位、初始化寄存器。第三調(diào)用card-probe回調(diào)也就是 fsl-asoc-card 里fsl_asoc_card_probe注意這個(gè)和 platform driver 的 probe 不是同一個(gè)函數(shù)只是名字容易混淆。這個(gè)回調(diào)里通常會(huì)做snd_soc_card_late_probe前的最后準(zhǔn)備比如設(shè)置 Codec 的輸出功率。這個(gè)“延遲綁定”機(jī)制是 ASoC 比老式 ALSA 驅(qū)動(dòng)先進(jìn)的地方。CPU DAI 和 Codec 設(shè)備不需要嚴(yán)格按順序 probe只要在snd_soc_register_card之后的某個(gè)時(shí)刻兩邊都已經(jīng)注冊(cè)好框架就能動(dòng)態(tài)完成綁定。所以你會(huì)看到有時(shí)候 dmesg 里 I2C Codec 的 probe 日志出現(xiàn)在聲卡日志之后這是正?,F(xiàn)象。4.3 late_probe修音量的最后機(jī)會(huì)fsl-asoc-card 里還有一個(gè)late_probe回調(diào)通常在聲卡基本成型后調(diào)用用于處理代碼執(zhí)行順序的問題。例如 WM8960 的輸出偏置電壓需要等時(shí)鐘穩(wěn)定之后再配置放在late_probe里就比放在普通probe里更穩(wěn)妥。實(shí)戰(zhàn)中l(wèi)ate_probe常被用來打印聲卡狀態(tài)、補(bǔ)充創(chuàng)建 kcontrol 等操作。如果你在調(diào)試中遇到“聲卡注冊(cè)成功但 alsamixer 里找不到某個(gè)控件”可以考慮是不是控件創(chuàng)建早了或者創(chuàng)建晚了。把控件創(chuàng)建挪到late_probe往往能解決這類時(shí)序問題。5. 實(shí)際操作中的坑與排查5.1 常見報(bào)錯(cuò)速查表調(diào)聲卡驅(qū)動(dòng)時(shí)dmesg 里的錯(cuò)誤信息是最直接的線索。我整理了一份出現(xiàn)頻率最高的報(bào)錯(cuò)和對(duì)應(yīng)的排查方向報(bào)錯(cuò)信息含義排查方向ASoC: CPU DAI ... not registeredCPU DAI 沒有被綁定檢查 SAI 節(jié)點(diǎn) status、fsl-sai 驅(qū)動(dòng)是否 probe 成功ASoC: CODEC DAI ... not registeredCodec DAI 名字不匹配核對(duì)codec-dai-name和 codec 驅(qū)動(dòng)中的 dai 名字Failed to set sysclk時(shí)鐘設(shè)置失敗檢查 MCLK 引腳、PLL 配置用示波器測(cè)時(shí)鐘輸出wm8960: ASoC: error at soc_codec_probe on wm8960Codec 驅(qū)動(dòng) probe 失敗檢查 I2C 地址、I2C 通信是否正常snd_soc_register_card failed: -517依賴設(shè)備未 ready檢查是否是 -EPROBE_DEFER等待 Codec 或 SAI 驅(qū)動(dòng)就緒-517這個(gè)返回值特別有意思。它對(duì)應(yīng)-EPROBE_DEFER意思是“這次先不干了等依賴的設(shè)備注冊(cè)好了再試一次”。內(nèi)核會(huì)把該 probe 插入延遲隊(duì)列等 Codec 或 SAI probe 完成后再次嘗試。所以你看到-517不代表失敗而是一種基于依賴的排隊(duì)等待機(jī)制。5.2 我踩過的三個(gè)具體坑第一個(gè)坑是codec-dai-name寫錯(cuò)。曾經(jīng)把wm8960-hifi寫成wm8960_HiFi大小寫加下劃線全錯(cuò)了開機(jī)后 dmesg 一直報(bào)wm8960_HiFi not registered。當(dāng)時(shí)圍著 I2C 和 GPIO 排查了半天最后用cat /sys/kernel/debug/asoc/dais查了系統(tǒng)里實(shí)際注冊(cè)的 DAI 名字才恍然大悟。這個(gè)調(diào)試節(jié)點(diǎn)的信息非常全強(qiáng)烈建議遇到 DAI 綁定問題先看一眼。第二個(gè)坑是 SAI2 的 MCLK 出不來。DTS 里明明配了fsl,sai-synchronous-rx之類的屬性但用示波器量 SAI2_MCLK 引腳始終沒有時(shí)鐘輸出。最后發(fā)現(xiàn)是 IOMUX 里少了SAI2_MCLK的 pinmux 配置引腳還處于 GPIO 模式。這個(gè)問題在 dmesg 里不會(huì)報(bào)任何錯(cuò)誤因?yàn)閮?nèi)核認(rèn)為時(shí)鐘已經(jīng)使能只是物理引腳沒通。第三個(gè)坑是聲卡注冊(cè)成功但沒有 PCM 設(shè)備。這種情況往往出現(xiàn)在 platform DAI 沒配對(duì)好導(dǎo)致 PCM 設(shè)備沒有創(chuàng)建成功。排查方法是aplay -l如果顯示**** List of PLAYBACK Hardware Devices ****下面一片空白多半是 codec 或 platform 的 DMA 配置有問題需要回到 SAI 的fsl-sai.c驅(qū)動(dòng)里核對(duì) DMA 綁定。5.3 怎么快速確認(rèn)聲卡已經(jīng)“縫”好確認(rèn)聲卡狀態(tài)最快的方法是看/proc/asound/cardsrootimx6ull:~# cat /proc/asound/cards 0 [wm8960audio ]: wm8960-audio - wm8960-audio wm8960-audio看到[wm8960audio]說明聲卡已經(jīng)注冊(cè)成功了。再用aplay -l查看 PCM 設(shè)備rootimx6ull:~# aplay -l **** List of PLAYBACK Hardware Devices **** card 0: wm8960audio [wm8960-audio], device 0: HiFi wm8960-hifi-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0這里的HiFi就是 dai_link 里的stream_namewm8960-hifi是 Codec 的 DAI 名字??吹竭@一行說明從 CPU DAI 到 Codec DAI 的整條鏈路已經(jīng)綁定成功。如果還是想深入看綁定情況可以檢查 debugfsrootimx6ull:~# ls /sys/kernel/debug/asoc/ dais componentscomponents文件會(huì)列出 codec、platform、cpu_dai 等所有組件格式類似snd-soc-dummy、wm8960.0-001a、5a020000.sai這樣。逐個(gè)對(duì)照很容易發(fā)現(xiàn)問題出在哪個(gè)環(huán)節(jié)。6. 從 fsl-asoc-card 出發(fā)怎么改造成私有驅(qū)動(dòng)6.1 復(fù)制代碼要克制理解后再動(dòng)手很多人拿到一塊定制板子第一反應(yīng)是直接把fsl-asoc-card.c復(fù)制一份改個(gè)名字然后開始堆自己的代碼。我建議克制一下這個(gè)沖動(dòng)。因?yàn)?fsl-asoc-card 里的邏輯和 DTS 的綁定關(guān)系已經(jīng)比較成熟隨意復(fù)制再修改往往會(huì)遺失掉一些隱性的處理比如特定 Codec 的時(shí)鐘表格、DAPM 路由初始化等。更穩(wěn)妥的做法是先在原版驅(qū)動(dòng)上跑通聲音確認(rèn)鏈路沒有問題再把需要擴(kuò)展的部分以回調(diào)或者獨(dú)立文件的方式加入。比如新 Codec 需要額外的 PLL 配置可以先在fsl_asoc_card_ops里增加一個(gè)自定義的hw_params回調(diào)而不是整個(gè)替換驅(qū)動(dòng)。6.2 一個(gè)簡單例子增加自定義 DAPM 控件假設(shè)你的板子有一個(gè) GPIO 控制的功放需要在聲卡初始化時(shí)注冊(cè)一個(gè)“功放開關(guān)”??梢栽?card 的 probe 回調(diào)里這樣寫static const struct snd_kcontrol_new amp_controls[] { SOC_GPIO_SWITCH(Amp Switch, amp_gpio, 0, 0), }; static int fsl_asoc_card_my_probe(struct snd_soc_card *card) { struct snd_soc_card *card ...; int ret; ret snd_soc_add_card_controls(card, amp_controls, ARRAY_SIZE(amp_controls)); if (ret) return ret; return 0; }把這個(gè)回調(diào)掛到card-probe上聲卡注冊(cè)時(shí)就會(huì)自動(dòng)創(chuàng)建這個(gè) kcontrol。這樣在 tinymix 里就能看到Amp Switch可以直接控制功放通斷。6.3 個(gè)人經(jīng)驗(yàn)調(diào)聲卡驅(qū)動(dòng)要從“時(shí)鐘、格式、路由”三件套入手做了這么多年嵌入式音頻調(diào)試我總結(jié)出一個(gè)經(jīng)驗(yàn)絕大多數(shù)聲卡問題出在三個(gè)地方——時(shí)鐘不對(duì)、格式不匹配、路由沒通。時(shí)鐘不對(duì)的表現(xiàn)是播放變調(diào)、錄音頻率漂移優(yōu)先查 MCLK 和 BCLK 的配置格式不匹配的表現(xiàn)是播放或錄音完全無聲但無報(bào)錯(cuò)優(yōu)先查 I2S 格式是 I2S 還是 LEFT_J、位寬是 16bit 還是 24bit路由沒通的表現(xiàn)是聲卡注冊(cè)正常但某個(gè)通路沒聲音優(yōu)先查 DAPM 路由和 kcontrol 的開關(guān)狀態(tài)。這次拆解fsl-asoc-card.c的 probe回頭看其實(shí)就是圍繞這三件事在準(zhǔn)備數(shù)據(jù)因?yàn)橹挥邪褧r(shí)鐘信息、格式信息、設(shè)備綁定信息全部填進(jìn) dai_link 和 opsASoC 框架才能在后來的hw_params階段正確執(zhí)行硬件配置。所以下次你再看到snd_soc_register_card成功但沒聲音時(shí)不用慌把這“時(shí)鐘、格式、路由”三件事各查一遍很多問題能自己浮出水面。驅(qū)動(dòng)代碼只是替你把這三件事描述給了內(nèi)核真正出問題時(shí)硬件鏈路反而更容易暴露出真相。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天做天天爱天天要| 五月婷六月综合在线观看| www.com五月天| www.精品久9| 操逼巨乳91| 玖玖99免费视频| 啪到高潮激情丁香五月| 99热最新精品| 天天肏天天肏| 国产偷人爽久久久久久老妇APP| 丁香五月欧美色综合| 久激情| 六月丁香激情网| 亚洲综合网激情小说| 色婷婷AⅤ| 狠狠色综合网站久久久久| 亚洲五月天天| 91超碰人人操| 99婷婷五月天激情| 韩日另类| 99国产精品久久久久久久久久久| 91成人视频| 五月丁香婷色| 69精品人人人人| 日韩AC在线免费观看| 91丨九色丨熟女|新版| 第二色AⅤ| 婷婷六月综合基地| 久热久re| 久久99久久99久久99人受| 丁香综合网| 亚洲婷婷91丁香| 婷婷五月丁香青青草在线| 91se在线视频| 91碰碰视频| 伊人色综在线| 亚洲精品性色| 六月色色综合| oVV4WIB3vFi8D| 色欲婷婷五月天丁香| 少妇性BBB搡BBB爽爽爽电影| 婷婷色操| 亚洲欧美丁香五月天亚洲欧美| 久久久久亚洲A∨成人乱码电影| 一起操 91N.com| 亚洲视频一区| 久操香蕉| 色婷婷玖玖影院| 亚洲情综合五月天| 欧美情色一区| 久久99久久99www| 欧美成人一区二区三区在线视频| 丁香激情五月天| 丁香五月23111| 色五月综合婷婷久久综合婷婷久久综合婷婷久久综合婷婷久久 | 激情婷婷五月天日本系列| 在线中文字幕视频| 97se在线视频| 亚洲六月综合激情久久下卡| 色激情综合狠狠婷婷| 成人短视频免费| 日曰躁夜夜躁2026| 国产av网| 欧美色色色色色色色色| www91在线| 欧洲区自拍| 亚洲99热| 天堂综合久| 色情五月天导航| 九月激情婷婷丁香| 亚洲成人AV一区在线观看| 黄色视频网站在线播放| 久久天堂色| 久久5 9视频免费观看| 噼里啪啦在线观看免费完整版视频| 五月婷婷激情久久| 国产婷婷色综合AV蜜臀AV | 欧美性猛交 XXXX 乱大交| 夜夜爱网站| 激情综合网五月婷婷| 丝袜大香蕉| 欧美婷婷五月丁香| 国产性av| 久久天堂| 婷婷六月丁香综合| 丁香五月激情五月开心五月| 2025天天日爽| AV九九| 99精品综合| 亚洲人妻av| 无码激情AAAAA片-区区| 狠狠综合色网| se色99| 亚洲热综合网在线观看| 亚洲免费av在线| 97干网站| 五月天啪啪网| 亚洲色9| 激情婷婷五六月天| 九九成人| 偷拍丁香九月激情| 成人av在线电影| 色婷婷综合久色AV五色最新| 亚洲精品永久久久久久| 久久婷婷热| 国产视频色色色色色色色 | 久久久五月四色| 欧美色五月| 大香蕉伊人久久| 国产特级毛片AAAAAAA高清| 射满了还射免费在线观看 -午夜版全集-新视觉影院 | 激情99。| 五月丁香啪啪啪| 欧美婷婷五月丁香| 淫荡A片| 婷婷亚洲五| 五月婷婷丁香色吧网| 一月婷婷色色| 久综合4| 狠狠丁香| 五月丁香色婷婷| 99热精品中文字幕| 婷婷娌伦网| 99噜噜噜在线播放| caop在线| 成人午夜免费电影| 我要看激情五月天| 亚洲va综合va国产va中文| 国产精品视频网| 99思思在线视频| 激情五月视频在线婷婷| 99久热视频在线| 婷婷九月激情| 久久久无码精品成人A片小说| 六月丁香久久| 婷婷香香五月| 五月天成人综合| 午夜伊人大香蕉| 久久九九网| 五月第四色| 丁香五月天堂| 久久激情婷婷| 婷婷五月天激情文学| 天天日天天插| 丁香 婷婷 激情 综合 五月| 天天操无码| 色综合综合色| 欧美黄色AA片哗啦啦啦| 成人免费黄色短视频| 婷婷黄色| 久久婷婷啪啪视频| 另类A片| 日本操逼九九九九58日本操逼| 婷婷六月丁香五月| 、激情六月天| 婷婷五月花| 91九色 婷婷| 天天热夜夜操| www.99精品日操伊人乱碰在线| 色五月婷婷激情综合网| 99色在线| 九月色婷婷综合| 九九精品热| 九九超日本| 久久亚洲婷婷| 色欧美日| 另类图片色五月| 色婷婷综合丁香五月天| 中文成人在线| 久久曰曰| 嫩草AV久久伊人妇女超级A| 久久色情| 亚洲国产精品二二三三区| 99精品在线观看| 超碰在线人人| 一区二区三区四区五区| 丁香性爱在线视频| 成人丁香婷婷| 超碰在线视屏| 成人做爰A片免费看网站找不到了 噼里啪啦在线观看免费完整版视频 | 日韩色色小视频| 91欧美| 91n啪啪| 人妻久久久久久久 | 亚洲综合色婷婷| 五月花婷婷在线精品视频| 五月婷婷亞洲中文| 91pornav在线| 色婷婷久久| 天天综合图片| 成人一区在线观看| 亚洲日日日| 79亚洲精品少妇| 色视频色综合91| 欧美英丁香开心快乐六月天网| 久婷婷视平| 欧美五月丁香| 天天人人综合| 中文字幕精品推荐免费在线观| 色婷婷五月天视频网站| 色婷婷丁香五月| 伊人综合网站| 超碰资源在线| 五月色欧洲| 久久婷婷原创视频| 婷婷色五月丁香六月欧美啪| 久色五月| 玖热精品综合视频| 五月天色五月天| 爽tv | 这里只有精彩视| 日本三级片片| 色狠狠色噜噜AV天堂五区| 97色伦另类图片小说视频| 九九九九热99超碰| 天天日日夜夜| 亚洲色热| 六月亭亭久久综合激情| 丁香五月在线人妻| 新激情综合| 日本三级黄色大片| 亚洲99热| 丁香五月婷婷激情123| 毛片九九九九九九| 久久婷婷丁香| 婷婷综合精品视频97| 色色激情网| 99在线精品免费视频| 丁香桃色综合网| 欧美日韩中国| 97碰 在线视频观看| 久久作爱| 亚洲操B| 婷丁香久综合| 五月丁香福利| 综合一区二区三区| 国产在线视频1234| 婷婷五月丁香综合亚洲| 青草青草视频2免费观看| 激情五月天婷婷在线网址发给我| 国产成人va在线| 久久久久激情| 丁香五月先锋| 视频在线免费观看欧洲乱码| 9|人妻人人操| 大香蕉综合视频在线| 99爱爱| 啪啪小说五月天| 激情综合青草| 97狠狠碰| www.99久| 亚洲不卡| 丁香色综合| 婷婷婷婷婷开心无码播放| 天天日人人| 激情五月天丁香| 日hao1区| 五月天狠狠色| 丁香九月综合激情| 狠狠爱婷婷爱| 91啪啪视频| 五月丁香色婷婷色| 日本精品99网站| 五月婷激情| 色婷婷影音| 思思99热热热99| 综合五月丁香六月婷婷| 日本在线视频手机播放五月婷| 色色欧美色色色| 久久只这里有精品| 天堂AV在线看| 亚洲色情在线| 国产亚洲精品久久一区二区三区| 91操网| 26uuu欧美| 五月天综合视频| 丁香五月婷婷欧美成人色图| 小视频久久久aaa| 欧美噜一噜| 婷婷五月激情片| 五月六月激情婷婷| 五月婷婷开心亚州在线| 六月香五月婷| 99热视精品| 天天日天天干天天插天天射| 天天久综合| 久久黄色网扯| 五月激情婷婷女| 久久综合丁香激情五月| 激情丁香六月| 中文字幕人妻熟女在线| 狠狠色中色| 9热久久在线| 69色婷婷| 五月婷婷色男女| 狠狠狠狠狠狠草| www.97碰碰com| 久久激情综合| 日日做夜夜爱| 六月丁香色色| 伊人高清无码| 人人干女人| 超碰女人天堂| 狠狠色性| 丁香婷婷五月综合| 欧美激情综合色综合啪啪五月| 色99视频| 综合色色综合| 伊人综合网4| 天天爽天天摸| 五月丁香五月婷婷| 五月天伊人久久| 久99视频在线观看| 五月涩涩网| www婷婷| 丁香五月婷久久| 韩日另类| 综合激情伊人影视在线| 啪啪六月婷婷| 欧美日韩99| 色五月激情图片| 色七七九九| 色色色色色级无码| 久操大| 97人碰人操| 亚洲AV人人操| 九九色综合视频| 伊人激情综合网| 婷婷色婷婷| 久久一级片| 日日天天天| 色婷婷亚洲六月婷婷中文字幕| 丁香五月成人社区| 天堂在线9| 国产色色网址网站| 日本三级韩三级99久久| 亚洲无码你懂的| 五月天婷a在线| 久久婷婷六月天| 九色啦蜜臀| 99网| 五月花综合网| 婷婷丁香六月| 超碰97干| 五月永久激情| 天天综合色| 99热在线观看精品| 六月丁香网| 两性婷婷丁香五月| 青青草日本亚洲| 激情www| CAOBIBI| 蜜乳国产网站| 婷婷九九| 婷婷99中文字幕| 亚州性爱99| 97色色网| 九九色综合| 久久婷婷五月天激情| 大香焦啪啪啪| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 综合色五月| 中文字幕不卡视频| 狠狠色噜噜狠狠| 夜精品无码A片一区二区蜜桃| 91美女被操| 深爱五月天| 久9草在线观看视频| wwccc久久久| 五月丁香网站| www久久五月com| 中文无码婷婷| sesesesezonghe| 色99视频| 永久的网站AAAA| 日本91在线| 婷婷五月天桃花网| 丁香婷婷成人在线播放| Av中文在线| 六月丁香影院| 欧美三级视频下载| 五月激情小说| 日韩操逼大片| 色色com| 久久多色| 另类小说五月天| 伊人婷婷青青cao| 色五月激情网| 深夜婷婷五月丁香| 91大屁股在线| 五月丁香在线| 思思久久99热| 97啪在线观看视频| 色爱亚洲| 九九热在线观看6| 日韩九九| 五月丁香久久久| 久久综合55| 五月叮香啪| 欧美啪啪五月天| 色婷婷日本| 精品国产乱码久久久久久免费| 激情的五月| 丁香五月婷中字在线| 婷婷丁香在线播放| 色婷婷免费视频| 久久婷婷视频| www.热99热| www.综合久久| 激情丁香五月婷婷| WWW,婷婷,COM| 99久久99久久综合| 淫五月停停| 欧美婷婷精品激情| .comwww在线观看免费操| 天天日天天插| 丁香五月综合福利视频导航| 99九九热视频免费| 色情五月综合婷婷| 色综合伊人网| 激情婷婷人妻| 激情综合视频| 久久五月视频| 激情五月天影院| 99热啪啪| 五月婷婷亚洲色图| 亚洲精品无码一区二区| 精品网站:999WWW| 色婷丁香五月| 97五月婷婷| EEUSS鲁片一区二区三区| 五月丁香啪啪伦理电影| 久月丁香爱婷婷综合| 欧美偷偷操| 久久综合五月天| 精品五月天| 啪啪91| 婷婷六月成人| 国产成人精品一区二三区熟女在线 | 天天爱天天做天天日| 97人碰人操| 99熟女| 婷婷五月天开心激情网| 蜜臀A∨在线水帘洞| 五月天婷婷亚洲| 五月天电影网| 五月天激情婷婷| 六月婷婷综合| 开心五月激情五月丁香五月婷婷| 另类五月婷婷| 婷婷视频网| 久久人视频| 色色色色丁香| 第九色区av天堂| 97人人看| 九热免费视频| www五月| 五月天婷婷开心| 91热在线| 日本一级一片免费视频| 996精品热视频| 激情五月四色| 婷婷激情五月呦呦| 91久久久久久| 99热精品在线观看| 俺去也五月天| 六月丁香五月天| 丁香五月综合激情性爱 | 激情五月色播五月| 五月丁香欧美在线| 激情五月天免费视频| 久久人妻乱子伦| 亚洲天堂热| 色婷婷伊人| 啪啪操超碰| 激情久久综合网| 婷婷99狠| 丁香六月激情毛片| 亚洲色图五月丁香| 天天色图| 高清无码.com| 婷婷五月天少妇| 96人人操人人操人人| 久久99免费视屏| 99操中文视频| 1区2区视频| 欧美日韩中国| 国产精品天天狠天天看| 五月丁久久| www.色五月| a久久| 成人午夜天| 色综合丁香| 99九九久久| 激情五月丁香五月| 色婷婷丁香五月| 色色色综合色| 538在线精品| 狠狠干最新地址| 婷婷丁香五| 亚洲婷婷丁香五月天激情小说| 婷婷六月综合在线| 天天搞天天色综合| 婷婷五月丁香91| 91狠狠色| 五月婷婷综合网| 成熟妇人A片免费看网站| 乱精品一区字幕二区| 成人国产欧美大片一区| 婷婷五月在线| 97人人操人人爽| 色情五月丁香婷婷网| 99re思思热这里| 66精品成人免费网站在线观看| 婷婷五月天激情免费在线观看| 婷婷色五天| 色五月婷婷久久| 91超级碰| www99xxxx五月丁| 婷婷综合精品| 超碰AAAAAAV| 怡红院视频| 综合大香蕉| 国产精品A成V人在线播放| 有码一区二区三区| 日本69日人视频| 伊人五月久久| av在线观看网站| 操人91| 丁香五月婷婷激情中文| www.激情.com.| 婷婷五月色丁香在线看| 伊人六月丁香婷婷| 日韩在线一级| 激情婷婷狠狠干综合| 国产在线自| 色五月综合婷婷久久综合婷婷久久综合婷婷久久综合婷婷久久 | 亚洲无码色色| 秋霞网在线免费基地五月婷婷丁香| 99热高清在线| 啪啪激情网站| 午夜一区| 丁香久月| 色婷婷六月天在线| 另类小说色婷婷| 成人丁香五月婷| 丁香五月天信号| 激情综合丁香五月| 久久9热好| 五月婷婷狠狠干| 婷婷丁香综合成人| 欧美性生交A片免费看| 婷婷大乡焦噜噜| 思思热在线精品视频网站| 亚洲愉拍99热成人精品| 中文字幕在线不卡视频| 五月天激情国产综合AV| 婷婷五月天影院| 91在线视频综合| 97色伦另类图片小说视频| 夜夜撸日日骑| 久久精品国产一区二区三区四区 | 日本97在线视频| 玖玖资源天天无码| 色婷婷六月| 婷婷色中文字幕| 亚洲一区二区无遮挡A片| 丁香色婷婷五月天| 日本精品99网站| 深爱综合网| Aaa久久| 丁香六月婷婷综合网| 天天干夜夜谢| 无码色色色色色| 婷婷五月六月丁香| 老师把我爽高潮了免费A片| 97人人操在线| 婷婷五月电影院| 五月婷婷七月丁香| 亚洲区在线| 激情五月婷| 久久五月丁香| 日本三级网址| 激情五月天偷拍综合网| 日本熟妇乱妇熟色A片蜜桃| 婷婷五月天中文字幕.| 99啪啪视频| 国产在线中文字幕| 婷婷五月色播放| 丁香六月啪| 99久久99久久综合| 99热最新地址在线| 日日干夜夜干| 色婷婷精品小视频| 97热91| 五月婷婷狠狠干| 蒲京久久无码视频| 久热这里这里有精品| 国产肥白大熟妇BBBB视频| 五月天综合缴情网网站0| www色色com| 婷婷狠狠久久| 丁香花大香蕉婷婷综合| 色五月丁香五月天| 天天综合五月| 99无码视频| www好屌操| 2050人人操免费工开爱| 天天操狠狠操| 99ri精品在线| 欧美色五月| 中文aV网| 综合色婷婷| 久久HD| 先锋资源91| 99这里只有| 婷婷丁香五| 婷婷久综合| 丁香六月欧美| 華人性愛AV在線| 五月天婷婷婷| 操逼视频一区| 热久久思思热思思| 碰久久精品w| 色综合网址| 丁香婷婷激情五月| 99热 在线播放| 人妻中文在线| www.五月天社区| avh片在线观看| 神马欧美精| 五月香蕉综合| 在线99精品| 五月丁香激情怕怕| 99热亚洲| 猫咪伊人久久| 俺去也在线视频| 五月丁香黄色| 五月婷婷色色爱| 天堂久久精品| 天天天摸夜夜夜玩| 亚洲成人网站在线观看| www.99精品日操伊人乱碰在线| 六月婷婷色色色| 亚洲五月天天| www.五月婷婷.com| 三日本无码| 色婷婷色99国产综合精品| 五月色丁香激情| 五月丁香久人妻中文| 碰97 久| 丁香五月Av| 538在线精品| 色色婷五月天| 激情久久久久久| 182.t午在线观看| 成人片在线播放| 五月婷婷激情中文字幕| 性色99| 婷婷六月丁香开心深深爱| 美国不卡视频| 色综合色综合网| 丁香五月婷婷丫| 99自拍网| 国产成人AV在线播放| 九色在线五月婷婷网址| 日韩aaaaa| 9久久婷婷国产综合精品性色| 五月丁香六月香香蕉| 少妇被下春药玩弄A片| 色五月综合激情| 色天天综合色| 丁香五月天激情网址| 六月婷婷香蕉| 亚洲狠狠色丁香婷婷综合久久| 五月丁香狠狠爱| 99热成人精品网站| 色色色色综合网| 日韩六十路91性交电影| 精品久久人妻热| 先锋av性爱成人电影| 色五月婷婷在线视频| 色色操| AV色五月婷婷| 国产伦亲子伦亲子视频观看| 欧美xx激情视频在线观看| 一起草无码| 婷婷五月婷婷| 99性爱精品| 日本在线99| 激情丁香五月婷婷| 99热在线观看亚洲区| 激情四射婷婷色色色| 激情色色色| 色婷五月| 夜夜操狠狠操| 亚洲色vA| 成人网站av免费网站推荐| 午夜婷婷久久 | 91久久久久| 五月天亚洲色| 超碰免费大香蕉| 久久婷婷成人综合色怡春院| 五月六月婷婷激情网| 香蕉AV福利精品导航| 伊人久久婷婷| 精品久久久久久久久久久久人妻| 久久久久九九九九视屏小说88| 婷婷五月激情小说| 丁香五月天堂| 办公室少妇激情呻吟A片在线观看| 五月综合六月丁| 婷婷综合玖玖五月| 超碰超碰在线| 综合久色五月| 亚州激情九月| 79精品视频在线观看,| 天天日日天天| 97ai婷婷| 粉嫩av懂色av蜜臀av熟妇| 丁香亭亭久久| www色哟哟| 伊人久久大香线蕉av最新| www色婷婷久久综合久色| 色就色94欧美setu| 日本色图综合| 丁香婷婷五月六月天| 91岛国片| 91色色色| 能直接看的av网站| 草AV9999| 婷婷五月激情的图片| 99免费在线视频| 天久综合91综合首页| 97福利视频| 丁香六月久久| 久久久精品人妻录| 天天肏天天插| 久久丁香五月综合六月激情红杏视频| 色99免费视频中文| 色色亚洲99com| 开心激情站| 中文字幕成人| 婷婷综合视频| 日韩aaaaa| 婷婷五月天综合色| 激情校园 亚洲| 九九九精品视频免费观看| 9l视频自拍9l视频自拍九色学生| 性爱五月婷| 99丁香婷婷综合网| 国产精品久久久久久久久久免费| 五月婷婷婷婷| 婷婷亚洲影院| 亚洲av成人在线| 久色大| 五月婷婷在线免费观看| 久久婷婷五月综合伊人| 人人干Av| 五月婷婷婷婷婷婷艺术| 五月www| 久久与婷婷| 五月综合视频在线| 色婷婷丁香网| 天天肏屄夜夜爽| AA丁香综合激情| 天天色天天射天天日| 激情人妻综合| 久久五月天色婷婷| 婷婷激情在线| 大香蕉久热| 熟女网站久久| 99re免费精品视频| 久操热线| 久久婷婷成人综合色怡春院| 久久丁香五月天| 婷婷久草| 天天爽天天日| 五月丁香婷婷色| 婷婷九月| 色www久视频| 丁香五月婷婷社区| 伊人激情综合| 丁香香蕉婷婷| 亚洲天堂大香蕉| 久色网址| 色婷婷内射| 操逼福利视频| 亚洲成人黄色网| 婷婷伊人网| 精品99视频| 激情综合久久| 天天干天天做| 国产毛片操B| 九九九九无码| 91碰碰视频| 99热91| 天天草婷婷五月| 丁香婷婷伊人| 久色激情| 996er热| 51精品国自产在线| 好大好粗嗯啊-一级黄色大片免费观看-成人AV | 婷婷激情视频| 九九热这里只有精品23| 激情5月婷婷狠狠干| 五月丁香激情婷婷综合| 婷婷五月天狠狠色| 激情综合色| 天天干,夜夜爽| 在线成人va| 中文字幕天天干| 五月婷啪| 亚洲天堂AAA| 丁香婷婷五月| 天天日,天天插| 欧美丰满熟妇BBB久久久| 久久婷婷五月综合网| 91激情五月开心| 五月色婷婷亚洲 | 好大好粗嗯啊-一级黄色大片免费观看-成人AV| 色婷婷五月影院| 欧美va精品va老师va| 可以直接看的AV网站| 五月婷婷六月丁香| 九九久久精品| 婷婷伊人綜合中文| 丁香婷婷大香蕉| www,婷婷五月天,com| 九九人人精品| 免费看欧美成人A片无码| 国产亚洲成人综合| 五月天婷婷激情网| 九九色综合视频| 激情五月综合网| 成人AV片播放| 丁香五月天无码AV| 色五月女| 五月婷婷丁香| 思思热在线视频精品| 久色视频| 色99www.| 五月天久久婷婷婷| 国产成人高清| 香蕉网婷婷| 99久久99九九九99九他书对| 丁香五月停停av| 91欧美| 五月丁香偷拍| 丁香花五月天| 婷婷五月电影院| 亚洲色图五月丁香五月婷婷| 色色综合色视频| 婷婷六月天激情| 国产精品美女久久久久AV超清 | 婷婷五月天精品| 色狠狠色| 五月丁香激情婷婷| 婷婷色爱| 无码日本精品XXXXXXXXX| 在线观看免费狠狠色丁香香综合| 激情综合网亚洲色图| 九九这里都是精品| 亚洲操B视频| 色婷婷五月网| 色999五月色| 991精品在线视频| 伊人五月成人| 最近中文字幕大全免费版在线 | 日韩欧洲亚洲| a久久| 九九精品丁香花| 色播五月丁香婷婷| 99色精品| 亚洲精品国产setv| 九九热精品| 神马久久五月天| 无码激情精品色婷婷久久久久| 亚洲成人免费在线| 伊人婷婷色| 九九热99热| 久久婷婷超碰| 日韩av干| 99噜噜噜在线播放| 色噜噜狠狠色综合AV兰草影视| 色情五月天丁香社区| 97ai婷婷| 天天日,天天射,天天舔| 五月天激情美女久久| caobi四区| 日本三级韩三级99久久| 婷婷亚洲天堂| 色婷婷丁香| 丁香五月日韩| 99九九在线精品热动漫| 五月丁香综合中文| 天天日天天爽夜夜爽| 91九九热| www色婷婷com| 97人人操人人拍| 天天天日天天天干| 久久婷婷五月综合色丁香花| 五月开心婷婷| 久久婷婷五月综合色区| 五月天婷婷影院影院| 无码日本精品XXXXXXXXX | 天天综合色丁香| 日本欧美成人片AAAA| 伊人婷婷青青cao| 26uuu日韩| 色欲婷婷夜夜| 色婷五月天| 天天做天天双| 激情内射人妻1区2区3区| 丁香五月大片| 秋霞少妇AV网站| 国产精品A片| 国产精品婷婷午夜在线观看| 91色性感五月婷婷丁香| 五月亭亭综合五码| 婷婷五月精品| 日韩AAAAA| 婷婷va| 五月婷精品| aⅤ79成人片| 91超级碰碰碰| 影音先锋 婷婷| 91婷婷丁香五月亚洲| 五月天涩涩| 9精品视频在线| 色五月综合| 欧美噜噜久久久XXX| 天天射影院| 天天干天天射综合网| 一本九九色| 99色热视频| 激情五月天噢美| 五月开心播播网| 激情内射p| a九九热www| 九九色婷婷| 六月婷婷激情小说网| 六月婷婷青青青视频| 久操福利| 婷婷五月天激情在线观看 | 久人操| 婷婷伊人綜合中文字幕| 精品国产va久久久久久久| 日本www免费九九| 久热免费视频| 五月天婷婷一起草| 综合色在线| 蜜臀99精品| 天天肏屄夜夜爽| 99在线看视频| 99热爱爱干干日| 开心五月丁香综合久久| 丁香五月天婷婷大香蕉| 色五月天堂| 五月天成人网婷婷| www.99热这里精品| 超碰AV在线| 精品A√| 五月丁香六月婷综合成人综合| 内射干少妇亚洲69XXX| 五月亭亭性| 色5在线| 丁香五月天婷婷大香蕉| 日日爽日日| 色六月视频| 在线播放中文字幕| 国产干逼片| 婷婷九月| 男人的天堂五月丁香| 九九色影院| 丁香婷婷五月激情四射网| 91精品无码| 五月天激情子轮| 九九碰九九爱97超碰| AV亚洲在线| 婷婷深爱五月| 激情欧美五月丁香| 日日操夜夜操狠狠操| 久久超级碰视频| 亚洲乱码日产精品BD| 久久人妻视频| 亚洲无码成人性爰网| 99热碰碰热| 日本婷婷色| 五月天激情网站| 天天做天天爱天天玩| ss99热| 91人人网| 午夜在线成人网站免费观看| 91成人性爱视频| 天天插天天爽| 黄色99网| 成人在线网址| 国产女生爱爱AA| 99热网站| 97人人干人人操| 欧美五月丁香| 五月婷婷m| 久久99热只有精品| 啪啪操超碰| WWW色色色COM| 成人做爰高潮A片免费视频| 激情另类综合| 久久丁香五月天| 天天爽夜夜爽天天爽夜夜爽| 琪琪理论片| 狠狠香蕉| 中文字幕av亚洲| 999热成人在线综合网| 久久草人妻| 激情黄色小说色五月| 婷婷成人在线| 九九综合网| 男女啪啪做爰高潮无遮挡| 色色色综合网| 伊人五月婷婷| 欧美成人精品A片免费一区99| 国产精品成人av在线观看春天| 欧洲激情五月天婷婷| 91chinese在线| 丁香激情四射| av在线免费网站| 亚洲影院婷婷色| 婷婷五月天综合亚洲| 极品少妇XXXX精品少妇偷拍| 色色色色综合| 99九九久久| 久久色婷婷| 97人人操| 成人 视频免费观看网站| www.99热视频| 六月丁香综合| 深爱激情综合网| 99热这里只有精品2| 久久视频这里99| 99综合一区| 天天免费日日夜夜夜夜| 中文字幕 久久9999| 伊人婷婷五月| 精品少妇蜜臀91| 麻豆五月丁香婷婷| 丁香五月激情性色郤| 婷婷五月天激情AV影院| 五月婷婷精品视频| 久久婷婷五月草视频| 丁香五月婷婷乱| 欧美噜一噜| 天天爽综合| 五月婷婷丁香综合网| 天天干com| 激情伊人五月天| 夜夜爽天天干| 99热免费| 日韩欧洲亚洲| 夜夜撸夜夜骑| 99色在线视频| 国产精品色情AAAAA片软件| 91丁香综合| 亚洲av电影网站| 天啪色| 五月丁香大相交| 久久精品99| 色五月激情问网站| 69er小视频| 色99热| 丁香五月天婷婷中文字幕| 97色热| 狠狠色综合网| 国产做爰视频免费播放| 久久丁香综合香蕉| 欧美婷婷丁香五月| 婷婷五月综合网| 97成人丁香婷婷| 天天日夜夜草进麻麻的子宫| 成人精品99| 婷婷五月天小说| 九九这里都是精品| 国产XXXX搡XXXXX搡麻豆| 91国产精品视频播放| 亚洲色图日韩网址| 91色综合| 6080av| 综合婷婷都市激情| 色吧五月婷婷| 亚洲妇女熟BBW| 伊人久久大香线蕉综合网站| 五月丁香激情四射综合| 中文字幕婷婷五月天| 亚洲综合婷婷五月| 亚洲人人操| 色色国产| 色五月美女| 超碰操网| 久久人妻情侣| 99热这里都是精品| 99这里只有精品| 韩日AV片| 天天性视频| www.99热. com这里只有精品| 噜噜狠狠色综合久| 色色色999| 一本狠婷婷综合| 中文字幕成人| 开心五月色婷婷综合开心网| 五月停停999| 欧美叉叉叉BBB网站| 日韩大片艹艹| 久久亚洲婷婷综合色五月| 五月婷婷开心综合| 97色在线视频| 国产一二区爆乳_1国产日韩一区二区三-成人AV| www.激情五月天.com| 欧美激情综合| Www,五月天| 人人草人人舔| av操一操| 丁香花五月天| 久操综合| 伊人网色婷婷五月天| 亚洲综合1024| 996日日爱| 天天干,夜夜爽| 色色色色区| 97婷婷丁香五月天激情图片| 99ri精品在线| 色九四色| 久久黄A片| 五月婷婷在线视频观看| 午夜少妇在线观看视频| 97色97干| 五月丁香无码| 五月婷婷激情综合| 玖玖五月| 5月丁香六月婷婷| 六月婷婷五月丁香| 色色色区| 天天射色五月天| 九九色综合| 亚洲成人av在线| ji'qi'luan'ren'lun| 狠狠操天天干| 婷婷四色五月| 亚洲精品永久久久久久| 国产精品第一国产精品| 五月色在线| www.色9| 亚州色综合| 婷婷激情啪啪| 激情综合五月| 日本色道视频网站| 成人在线日韩欧美| 久久精99| 99热这里只有精品33| 9l视频自拍9l九色成人| 国产成人在线精品| 这里只有精品1| 亚洲av综合在线| 亚洲 在线 性爱| 思思热在线| 一区二区成人电影| 色五月五月天色婷婷色五月| 婷婷五月综合社区在线| 色久五月| 99∨VTV| 婷婷激情四射| 玖玖爱伊人| 91精品人妻少妇无码影院| 五月丁香六月综合基地| 伊人九热| 九热视频这里只有精品| 成人精品视频99在线观看免费| 伊人久久婷婷| 婷婷五月丁香综合| 第五婷婷伊人丁香色| 五月天婷婷基地| 久热婷婷在线视频| 色播激情五月天| 色婷婷人人| 久久人妻伦理| 日日操夜夜操中国无码| 丁香婷婷激情网站| 婷婷在线日韩综合| 五月色俺婷婷| 99色在线观看视频者| 五月天狠狠干| 婷婷五月天av小说| 亚洲色亚洲精品| 大香久久综合网| 亚洲视频图片婷婷五月| 97丁香视频| 99A片| 91chinese 在线| 99狠狠| 九九AV在线| 99热综合| 婷婷五月天伊人在线| 丁香五月激情综合| 日日婷婷不卡| 婷婷五月天免费99| 新伍月婷婷| 东北黄色一级| 免费国产视频| 久久九色| 婷婷色影院| 五月丁香婷婷成人伊人网| 色五月婷婷7777| 五月丁香久久丝袜啪啪| av一区二区电影免费在线观看| 在线1青婷| 久9免费视频| 99爱视频在线| 噜综合| 99热 精品在线| 九九热免费| 一区二区免费看| 九九热99热| 狠狠色婷婷丁香六月| 午夜成人av在线| 久久99热这里只有精品| 五月丁香啪综合| www.色综合| 婷婷激情五月综合丁| 五月丁香综合久久夜夜| 狠狠99| 日韩人妻无码一区二区| 久久久久久久久久久-久五月天婷婷| 婷婷十月丁香| 伊人玖玖精品| 久久99久久99久久99人受| 中文字幕 久久9999| 丁香五月婷婷五月| 99九九视频| 五月天影院婷婷在线观看| 红桃91人妻爽人妻爽| 五月婷婷激情日本| 五月丁香成人| 思思网站| 狠狠色丁香久久综合婷婷亚洲成人福利| 五月亭亭狠狠| 99小视频| 91黄色五月天视频| 97干欧美| 激情五月婷婷伊人| 激情综合在线播放| www.狠狠操| 五月深爱激情网| 亚洲中文字幕av| 琪琪色网在线| 色99自拍| 亚洲久久婷婷丁香五月天| 夫妻超碰在线| 久久久久9999| 久久婷婷六月综合综合色| 在线99热| 丁香色色五月| 99爱这里只有精品免费视频| 日日做夜夜爱| 丁香六月婷婷| 91九九精品| 狠狠操狠狠| 91大屁股精品|