欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

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
返回資訊列表
亚洲岛国电影| 亚洲综合另类| 亚洲成人高清在线| 色久五月天| 成人AV中文字幕| 丁香六月综合激情| 99riAV国产精品视频| 色婷婷丁香五月天在线视频| 操97| 99日精品视频| 精品操逼一区二区| 久草热8精品视频在线观看| 91午夜激情| 五月天婷婷久久日| 国产色色在线| 、激情六月天| 免费九九热| 91av成人| 9l视频自拍九色9l黑人| 成人网在线观看视频| 97精品欧美91久久久久久久| 欧美婷婷日本| 婷婷久久五月丁香| AV在线大香蕉| 天天久久狠狠色综合| 狠狠色综合五月| 91狠狠综合久久久| 激情色色| 亚洲另类婷婷五月丁香在线播放| 五月婷婷激情综合| 狠狠搞五月天| 99亚洲精品视频在线观看| 久久天堂女人| 色99免费视频中文| 精典久久| 新久久五月天激情| 乱女乱妇熟女熟妇综合网站| 婷婷丁香一月| 狠狠操狠狠干综合| 婷婷噜噜| 九九热在线精品视频| 激情丁香网| 婷婷五月中文在线| 丁香五月在线观看综合| 五月婷婷性| 五月婷六月天| 五月丁香色婷婷| 99这里有精品视频视频| 激情五月婷黄版| 色久综合| 综合网五月| www.99在线| 超碰chaompinm| 国产.亚洲.欧洲视频在线| www.五月天社区| 热久久66| 五月天激情小说欧美激情| 丁香五月无码| 精品99在线| 51国精产品自偷自偷综合| 乱色色色| 99在线热| 五月综合激情久久| 91视频综合网| 99视频地址| 婷婷丁香久久五月综合| 天天爽天天摸天天爱| 性日本精品| 五月深爱网| 99这里只有| 婷婷情爱五月天6| Www.狠狠| 中文字幕成人| 丁香五月手机视频| 婷婷丁香五另类网站| 色欲日日躁| 激情五月六月丁香| 9久久婷婷国产综合精品性色| 婷婷精品视频| 在线成人国产| 婷婷丁香社区网| 色综合久久五月| 色色日韩无码| www婷婷| 国产亚洲精品久久久久久郑州| 91se视频| 激情综合网激情五月婷婷| 天天视频亚洲| 欧洲色| 久操欧美在线观看97| 97人碰人操| 六月婷婷香蕉| 丁香五月精品| 做爰丰满少妇1313| 国产熟女一区二区三区五月婷| 婷婷伊人无码| 啪色综合| 国产色色色色色| 91狠狠色丁香| 亚洲欧州色情在线观看| 丁香六月婷婷| 狠狠综合网| 色高清无码视频| 日本欧美成人片AAAA| 五月丁香色综合| 国产精品黑丝| 综合综合网| 人妻AV在线观看| 国产精品久久久久久久久久免费| 婷婷六月色| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪| 伊人久久艹| 停停六月 综合| 99亚洲精品视频在线观看| 久久这里只有精品无码| 香蕉久久国产AV一区二区| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 热久免费视频9| 天天狠狠婷婷在线| 欧美日韩成人免费在线| 色级婷婷| 免费观看的婷婷五月视频在线| 天天日夜夜爽| 亚洲精品乱码久久久久久综合| 可以看的av| 亚洲色婷婷视频| 婷婷五月av| 国产综合81p| 天天艹夜夜爽| 亚洲深喉aV| 久久婷婷色| 另类综合色| 黄网在线免费观| 婷婷五月天激情四射| 另类 在线| 丁香婷婷五月综合欧美另类| 五月之婷婷| 免费视频WWW在线观看网站| 亚洲天堂热| 色天堂A| 亚洲人成网站999综合| 欧美韩日AAA网站| 开心激情五月天网| av 一区三区四区| 亚洲成人在线播放| 色婷婷欧美在线| 激情综合五| 婷婷综合视频| 久久天天| 亚洲激情五月丁香久久久久| 操精品9| 操操操操操电影网| 在线综合啪| 婷婷五月天干干| 六月婷婷色色网| 六月天无码网址| 99碰碰| 99er国产| 久久精99| 香蕉操亚洲| 久久丁香五月| www.婷婷| 免费观看欧美成人AA片爱我多深 | www.激情| 激情综合婷婷| 婷婷 丁香 久久| 五月天婷婷免费视频| 婷婷99狠狠躁天天躁中文| 99re这里只有| 丁香色情五月天| 色五月婷婷基地| 九九免费精品在线视频| 三日本无码| 久久一热| 亚洲欧洲99| 9久久精品| 免费精品66| 欧美激情综合五月色丁香| 国产精品久久久60086| 色狠狠色综合久久久绯色aⅴ影视| 久久婷婷五月综合啪| 五月丁香花激情啪啪网| 亚洲六月色| 色色色视频免费无码| 97精品人人A片免费看| 久久在线人妻| 伊人久久婷| 色综合久| 五月天婷综合| 婷婷五月天影视| 婷婷字幕在线| 九九热视频在线观看| 九九热这里只有精品一| 亚洲精品亚洲人成人网| 五月天色欧美| 精品一区二区三区免费毛片爱| 五月婷婷丁香av| 五月丁香最新| 国产欧美日韩综合精品一区二区| 久久精品99久久久久久| 天天日天天日天天搞| 色婷成人狠干| 五月激情综合网婷婷| 婷婷六月天| 他改变了拜占庭| 日本91在线播放| 久热中文字幕| 色狠狠婷婷| 97色色色色色色色| 99在线视频播放| 琪琪色五月婷婷老师| 女婷久久| 九九精品热播| 日韩无码色色| 精品国产va久久久| 午夜爱爱爱成人| 九九热中文| 97碰碰九九视频| 狠狠操狠狠操| 久久伊人大香蕉| 婷婷亚洲欧美丁香五月| 99视频这里只有久久精品 | 无码99| 久久金品黃色| 人人摸人人干人人做| 久热这里只有国产| 丁香久久| 五月丁香婷婷综合| 99在线视频播放| 成人综合视频网址| 国产69久久久欧美黑人A片| 婷婷成人五月天成人文学| 五月视频日本免费观看| 激情五月综合色| 五月间天堂综合| 玖玖色综合色| 日韩人人操| www.久久99| 五月色色网| 亚洲六月婷婷| 99色色| 丁香婷婷六月| 午夜爱爱网站| 97干97色| 五月天婷婷综合网| 荫道BBWBBB高潮潮喷| 99热综合网| 九九色婷婷| WWW.17C亚洲精品| cc精品国产性传播| 婷婷五月大香蕉| 99激情视频| 夜夜爱网站| 欧美日韩aaaa| 久久婷婷五月综合啪| 99性色| 深爱激情丁香五月| 婷婷五月丁香欧洲| 狠狠搞狠狠操| 亚洲亚洲人成综合网络| 一区二区无码视频| 五月婷婷,狠狠操| 欧美 日韩 成人| 成人va在线| www.九月婷婷丁香.com| 在线观看的av| 久久国产性爱A V| 婷婷五月天激情综合| 五月丁香六月婷婷综合免| 亚洲AV激情五月综合网| www.亭亭五月天| 婷婷五月丁香手机在线视频| 久久免费操| www.99视频| 五月色综合| 欧美电影在线播放| 丁香五月激情啪啪啪| 99人人精品| 五月婷婷欧美| 天天干天天干天天干天天干天天| 月婷婷婷婷五月| z色五月播播久久| 精品激情| 日韩AC在线免费观看| 超碰五月婷婷五月天| 九9九9无码| 婷婷九月激情| 欧美性色五月天| 四色99久久| 综合久久久| 色婷五月| 色五月97| 色色丁香五月婷婷| 97婷婷狠狠| 另类少妇人与禽zOZZ0性伦| 丁香五月婷婷国产av| 人人妻人人澡人人爽| 超碰在线观看99| 五月天色婷婷av| 精品久久人妻| 欧美怡红院黄站| 人人插9| 五月天免费色| 婷婷色在线观看| 丰满少妇猛烈A片免费看观看| 免费超碰在线| 五月激情基地| 99热成人| 天天做天天爱天天爽夜夜揉| 99热这里只有精品8| 婷婷午夜| 欧美天堂久久| 激情五月天激情小说| 天天日天天舔| 狼人狠狠操| 色婷婷色情| 99热婷婷| 大香蕉婷婷五月| 丁香五月天啪啪激情综合网| 婷婷五月成人| 婷婷在线观看五月天在线视频| 噜噜色com| 国产精品第一国产精品| 伊人久久激情图区五月| 婷婷五月激情网| 五月天激情日色在线| 亚洲色色图片| 丁香五月av| 日韩成人中文字幕| 麻豆雪千夏| 新激情五月天| 五月天婷婷青青草| 综合aV在线| 日韩好吊操| 久久婷婷色色| 婷婷的99视频网站| 午夜免费试看| 久久九九网| 激情五月天婷婷丁香 | 五月天艹天天| 五月天色色无码| 超碰chaompinm| 青青草五月天| 最熟少妇乱码| 天天撸天天干天天插| 久久久婷婷| 婷综合六月| 99aese| 色婷网| www.97碰碰com| 战争与艾拉电影免费观看| 亚洲第一综合| 草美女在线观看视频在线播放| 久久免费操| 色婷婷AV久久| 五月天婷婷社区| 无码字幕中文| 久久色五月天激情小说| 影音先锋一区二区资源站| 天天做综合| 婷婷成人五月天| 成人av中文字幕| 色婷婷丁香五月| 97日本操| 色色国产| 人妻熟妇国产精品| 夜夜干 夜夜操| 久久大香蕉视频| 另类激情五月在线视频欧美| 丁香五月人妻| 在线中文字幕视频| 激情综合网丁香| www99热| 99热久久这里只有精品| 91蝌蚪窝视频在线| 久久精热| 97婷婷五月丁香| 丁香六月亭亭久久综合| 欧美WW在线网| 久久久久er热| www.av视频xx999.com| 国产精品涩涩涩视频网站| 丁香五月婷婷深五月| 亚洲综合五月天婷婷| 99热这里在线精品| 日本偷拍九九九| 婷婷五月天开心激情网| 婷婷五月电影| 六月丁香网| 美女妹子后射视频网站在线观看| 在线观看996精品| 婷婷五月激情图片| 久久er+| 激情综合网激情五月丁香五月俺也去| 99这里| 99riAv1国产在线观看| 亚洲激情在线| 婷婷国产综合| 懂色av蜜臀av粉嫩av永陈冠希| 亚洲AV综合网| 密臀久久| 亚洲免费视频网站| 婷婷久久综合| 五月天狠狠色| www.日韩艹| 狠狠插.com| 激情网五月| 精品久久99码| 激情婷婷五月社区| 五月婷亚洲精品AV天堂| 婷婷激情丁香六月| 色综合区| 99视频在线9| 99热精品在线免费观看| 99精品视频在线6| 97日本在线播放| 色婷久| 婷婷五月蜜桃成人桃色丁香| 超碰93在线观看| 综合激情五月丁香| 97干在线观看视频| 三级大香蕉网| 五月激情精品视频| 日韩久热| 热久91| 久久综合九九| 婷婷久久亚洲| 夜夜爽天天爽| 五月婷婷丁香五月婷婷| 亚洲性天天| 国产精品视频| 日韩三级视频一区二区| 中文字幕网伦射乱中文| 91热在线| 亚洲另类婷婷综合| 亚洲综合99| 久久亚洲色导航| 69色婷婷| 色五月色开心开心五月| 香蕉人妻AV久久久久天天| 久草天堂| 大香蕉啪啪网| 五月婷婷偷拍| 色五月激情网| 久久久久久人妻久久久久久久久久人妻久久久| 日韩久久这里只有精品| 色婷婷在线视频久| 日日夜夜狠狠婷婷色| 婷婷五月天综合AV| 五月天婷婷爱| a色婷婷| 久久大大香| 丁香六月婷婷| 五月婷色| 噼里啪啦在线观看免费完整版视频 | 亚洲视频一区| 99国产精品久久久久久久久久久 | 色五月,com| 色五月琪琪| 亚洲无码性爱| 婷婷.com| 人人操人人添人人摸97| 久久婷婷老| 亚洲第一成人无码A片| 久操人妻| 五月激情视频| 九九色综合九九色| 欧美美女视频| 无码人妻AV久久久一区二区三区| 婷婷久久综合| 另类视频五月天| 99热精品无码| 婷婷五月色| 亚洲色婷婷| 五月婷婷六月丁香| 婷婷丁香色五月天| 五月天大香焦| 五月丁香毛片| 色色精品色| 天天性视频| 夜夜夜天天操| 欧美综合婷婷欧美综| 亚洲男人的天堂婷婷色五月| 婷婷五月天欧美图片在线播放电驴| 五月丁香六月合| VA婷婷| 成人婷婷色五月天| 99在线国| 99精品热| 综合婷婷| 色婷婷很很丝袜| 久久九九思思| 亚洲xx网| 婷婷五月天亚洲色| 97婷婷五月| 性色天| 亚洲第一综合| 狠狠狠狠狠狠草| 美腿丝袜AV天堂网| 亚洲精品视频在线| 欧美va欧美va差| 色久丁香五| 婷婷精品在线| 国产精品久久久久久久久久| 欧美日韩国产日本精品四虎网网站物| 任我肏| 九九综合精品| 九九热婷婷| 深爱激情综合| 九九在线91| xxxx久| 激情综合网激情五月欧美| 久久婷婷激情视频| www.99视频| 国产午夜精品一区二区三区四区| 久热9热| 人妻性操逼中文字幕 国产| 激情丰满熟妇五月| 中文字幕在线不卡| 国产黄大片在线观看画质优化| 91人人妻人人操人人爽| 五月丁香六月在线欧美| 色综合另类| 久久机热/这里只有精品| 亚洲偷| 色婷婷AV在线| 99av视频| 丁香五月影院| 99啪99| 99热99这里有免费的精品| enecarbon-materials.com污K127封锁请涟系@wip1688 | 五月色婷婷中文字幕| 操国产人妻| 国産精品| 亲子乱av一区二区三区的| 久久久思思热| 日韩1区2区| 色婷婷影视99| 人妻久久久久久久久| 丁香五月另类色婷婷麻豆| 婷婷福利影院| 森林影视大全,最好看的2019年视频 | www.五月婷婷| 丁香五月天啪啪| 狠狠爱深色婷婷综合| 婷婷午夜精品久久久| 日本激情五月天‘| 久久婷婷五月综合| 99丁香五月婷| 99黄色性生活| 丁香密臀AV激情网| 丁香 亚洲 久久| 热99视频精品在线| 色综合播放| 99热精品在这里| 色婷婷色| 久色婷婷200| 99热热热99精品婷婷| 99热色无码| 亚洲色图五月丁香| 操婷婷基地| 天天综合天综合| 乱岳熟女50岁| 亚洲色情免费网| 亚洲天堂久久| wwxx日本| 最近中文字幕在线中文视频| 色五月丁香总合网| 中文幕无线码中文字蜜桃| 另类在线| 六月婷婷五月丁香| 色五月婷婷中文字幕在线观看 | 亚洲综合狠狠艹| 啪啪啪大香蕉| 婷婷丁香五月天小说| 97五月天| 丁香婷婷射| 黄桃AV无码免费一区二区三区| 蜜臀av无码久久久久久久久| 国产精品久久久久久久久久| 色色婷婷综合网| AV大片在线播放| 五月开心婷婷| 欧美日韩国产成人在线| 色噜噜狠狠色综合成人网| 日韩精品一区二区亚洲AV观看| 五月天综合色| 熟女色专区| 久久久久9999| 99热这里只是精品| 9l视频自拍9l九色9l成人| 久色大| 综合视频久久| AV操逼网| 婷婷五月激情片| 色婷丁香91| http://www.sd-xiangsu.com/| 伊人久久中文网| 99在线免费视频| 91人人网| 岛国AAAV| 婷婷激情人妻| 激情五月天啪啪视频| 极品人妻VIDEOSSS人妻| 五月婷婷免费在线视频| 丁香九月婷婷| 99精品综合| 996er热| 久月丁香爱婷婷综合| 老妇六区| 草草视频91| 六月色色婷婷| 丁香五月婷婷AV| 少妇水多A片太爽了| 久热视频这里只有精品| 亚洲中文字幕av| 潘金莲AAAAAAAAAA| 玖玖综合色| 五月婷婷香蕉| 黑人熟妇一区二区三区| 中文字幕视频色婷婷| 青青草五月天| 色在线五月天免费| 色色色色色色色色五月先| 亚洲成人在线播放| 五月成人网站| 久久这里只有国产精品视频| 超碰大香蕉网| 激情电影五月婷婷| 桃色成人网| 色在线99| 日韩欧美骚货| 久久国产性爱A V| 色婷婷情片| 天天干天天做| 久久激情视频| 伊人啪啪网| 色色色99韩| 91热在线| 日本123区日韩欧美不卡在线看| 五月丁香亭亭| 五月丁香综合在线| 五月婷六月丁香| 婷婷五月色情| 超碰免费观看| 99ER热精品视频| www.99视频| 久久99热免费最新版| 26uu| 人人九色| www,色婷婷| 99色综合久久| 超碰在线日夜| 国产精品久久久久久亚洲毛片| 日熟女| 五月丁香成人网| 天天热夜夜操| 五月婷丁香久久久| 狠狠干2007| 五夜婷婷| 99热综合在线| 综合99久久| 精品99在线观看| 婷婷9月天| 99久热视频在线| 无码AV免费精品一区二区三区 | 五月天婷婷在线播放| 天天久久综合| 国色天香伊人狠狠色| 包操45分钟网站| www.天天色综合| 婷婷久久综合久| 久久婷婷综合基地| 五月综合激情| 丁香五月天导航| 日韩九区| 激情欧美婷婷| 六月丁香婷婷网| 丁香五月色综合色播五月| 99视频这里只有免费精品| 五月天激情四射| 婷婷久久亚洲| 99er6免费视频热播| 五月丁香婷婷无码中文| 美女亚洲五月丁香| 五月久久噜噜| www.成人婷婷综合| xx人人xx| 中文字幕综合| 精品久久99| 91丨九色丨东北熟女| 五月天精品| 怎么样可以看免费的一级av| 99久操视频| 热久免费视频9| 991精品在线视频| 午夜亚洲国产精品av一区二区| 日韩啪| wwW天天干| 婷婷五六日| 久久五月综合| h亚洲| 婷婷激情五月| 五月伊人91| 九月婷婷综合在线| 成人婷婷| 国产精品-第3页-91JQ就要激情网91JQ5.JQJQ926.XYZ | 五月丁香婷婷欧美色图视频五月丁香777电影 | 14色综合婷婷| 丁香婷婷啪啪| 日本eVa一区=区视频| 六月大香蕉| 婷婷丁香色五月亚洲| 日日干夜夜撸夜夜骑| www五月天com| 婷婷激情社区| 天天综合色99| 丁香五月亚洲AV| 开心日韩丁香婷婷五月| 噜噜操操| 人妻熟女一区二区AV| 毛片蕉地一二| oumeisesewang| 99热这里只有精品18| 色婷婷婷婷| 丁香五月花影院| 狠狠爱激情网| AV伊人青草丁香六月| 这里只有久久精99| 99爱视频在线观看这里只有精品| 六月婷婷操逼| 噜噜色五月| 丁香六月婷婷综合啪啪| 欧美激情五月天| 99色.com| 五月婷婷久久内射| 小视频久久久aaa| 婷婷五月天渟渟| 99热国内| www.色五月.com| 色哟呦av| va中文资源在线观看| 色五月综合| 99久久99综合| 天天日综合网射| 无套内射极品大美女| 日韩无码色色| 激情AV在线| 丁香五月欧美激情| 久久97久久99久久综合欧美| 97色在线视频| 综合图片色色| 久久天堂女人| 啪啪干伊人婷婷| 精品久久久人妻| 四LLL少妇BBBB槡BBBB| 91婷婷色| 99啪啪网| 91日综合欧美| 五月丁香黄色| 五月婷婷香蕉视频| 久草久青福利| 丁香五月激情五月| 久草大| 新激情五月天天在线网| 激情婷婷视频在线| 色婷视频| 精品热青草| 亚洲噜色| 日韩AV中文在线观看| 五月天开心成人网| 极品人妻VideOssS人妻| 日本三级中国三级99| 中文字幕精品在线观看| 狠狠色丁香婷婷| 涩综合在线 | 99九九综合久久九九| 色5月丁香婷婷| 亚洲 成人 电影av在线观看| 亚洲狠狠干| 婷婷五月综合色小姐小说| 五月天四色房丁香| 91呦呦呦| 五月天婷婷中文字幕在线播放| 色5月婷婷| 成人天天爽| 色欲色香综合网| 成人天天爽| 免费黄色视频网址| 琪琪色五月天| 五月激情综合网| 久久只有这里精品免费| 日韩成人精品中文字幕| 色爱综合视频| 成人国产欧美大片一区| 亚洲婷婷成人五月天| 超碰色碰碰| 五月性色| 97资源欧美日韩大香蕉超碰一区| 日本一级一片免费视频| 五月激情日本在线| 成人国产欧美大片一区| 五月丁香六月香综合激情| 青青久久91| 五月丁香婷婷免费视频| 91人人爽狠狠狠| 久久精品人妻| 人人人va亚洲视频在线| 99热超| 欧美熟女99| 丁香婷婷丁香五月欧美人| 最近中文字幕2019视频1| 五月天激情视频五月天| 久久婷中文字幕| 97干97色| 亚洲性色XXXXX| 日本全黄一级999| 五月丁香婷婷成人网| wuyuedingxiang99| 色婷婷很很十八禁| 婷婷丁香宗合888| 婷婷五月天av网| 色五月噜噜| 婷婷99热| 丁香色啪综合| 久久超级碰视频| 色五月天综合网| 99操| 91亚洲免费片| 开心五月网 | 在线观看av网站| 综合久久99| 自拍盗摄 另类| 五月丁香另类图片| 五月天色色色网| 亚洲成人高清在线| 我要射综合| 色色色综合色| 久色精品| 色偷偷综合| 五月丁香六月香综合激情| 99热最新| 99精日本久久| 影音先锋一区二区三区| 亚城区在线| 久久这里都是精品免费| 综合色色综合| 亚洲精品久久久无码| 91狠狠色| 五月天天爽| 26uuu国产色| 9l视频自拍9l九色9l成人| 国产乱子轮XXX农村| 91精品国产91久久久久青草| 五月天婷婷黄色| 免费看片在线观看| 在线18av | 伊人久久五月天| 人妻久久久| 色宗合久久五月婷婷| 色情·com| 99啪啪网| 9久热在线视频| 日本黄色三级片内射| 色婷婷电影网| 干一干xxxx| 毛片毛片毛片毛片| 色情激情五月| 久久婷婷六月| 日本久久人人| 丁香六月狠狠干| WWW.久久99| 1024在线视频| 人妻丰满精品一区二区A片| 色色性爱视频| 男人天堂99| 天天干肏夜夜| 五月欧美色色五月| 99热99日…..| 婷婷五月激情六月丁香| 美女黄频aⅴ视频| 超碰人人91| 五月亭久久无码视频| 99在线小视频| 久久91久久精品久久| 国产毛片欧美毛片久久久| 婷婷五月天av| 99久热| 99在线免费视频| 婷婷在线视频| 婷婷六月色| 79精品视频在线观看,| 激情网五月天| 99精品综合视频| 五月激情小说网| 天天艹夜夜艹| 99精品综合| 五月丁香婷婷综合视频| 秋霞网在线观看理论91| 久久久er热| 香蕉婷婷色五月| ,99视频久久| 色色色综合视频| 亚洲性爱99在线| 亚洲婷婷丁香五月视频| 五月婷婷开心亚州在线| 96五月丁香熟女| 婷婷九月丁香| 操操自拍| 级情九色| 国产精品99久久久久久久女警| 99热精品免费| www.99色在线| 色久一| 色呦呦美女| 色999五月色| 天天激情夜夜干| www,婷婷五月天777me,com| 99这里是精品| 狠狠色丁香| 91婷色| 五月天综合网| 久久R激情| 欧美激情中文字幕| 9久视频| 天天摸日日舔狠狠添婷婷婷 | 91丨人妻丨国产丨丝袜| 欧美97色| 国产阿姨日皮艹逼内射视频| 五月丁香婷婷成人综合网| 激情文学五月丁香六月婷婷| 五月色色网| 天天爽天天| 99碰碰碰| 男人天堂99| 五月天激情婷婷五月天久久| 色色色色av色色色色| Www,五月天| 国产亚洲色婷婷久久99精品91| 五月激情综合网| www.91热久久| 六月婷婷七月丁香| 丁香六月视频| 丁香五月五月婷婷| 色五月婷婷五月天| 亚洲成人精品三区| 性爱动图国产麻豆一区二区三区| 99热这里只有精品一| 99精品国产在热久久婷婷| 五月丁香六月情| 91在线观看www| A片一曲| www.十八禁不禁AV.com| 棕合影院色色| 亚洲蜜桃精久久久久久久久久久久 | 国产精品久久久久9999小说| 成人VAV视频在线观看| 丁香五月在线伊人| 99无码黄色视频| 色婷婷成人做爰A片免费看网站| 丁香五月婷婷激情蜜桃| 琪琪理论片| 丁香五月在线观看| 精品人妻午夜一区二区三区四区| 9热在线观看| 婷婷五月婷婷五月| 99久久婷| 亚洲色五月婷婷| 爱之国产色情综合| 九九色欲网| 99在线资源视频| 亚洲激情免费久久| 激情爱爱网站超大免费| 色五月综合网站| 国产精品久久99| 大香蕉伊人99| 91聚色综合网| 婷婷在线午夜| 99综合视频| 五月丁香花视频| 开心五月深爱五月丁香五月激情五月| 91九九| 婷婷五月综合久久中文字幕| 丁香五月婷婷亚洲色图| 九色视频91| 超碰色人妾| 99热这里只有精品最新| 婷婷五月婷婷| 色色操| 久久与婷婷| 玖玖精品婷婷| 99r这里只有精品在线观看| 免费超碰在线观看| 丁香五月色色色色| 午夜丁香婷婷| yellow视频在线观看91| 久re热视频| 婷婷六月久久| 黄色激情五月天| 在线视频婷婷| 六月丁香五月激情婷婷| 色色亚洲| 97丁香五月天| 激情五月天视频| 五月婷五月婷伊人伊人五月婷| 免费看成人747474九号视频在线观看| 色 噜噜 九月 婷婷| 99精品久久久久久久婷婷久久| 风流少妇A片一区二区蜜桃| 丁香五月色情| 色色亚洲| 亚洲VA欧美VA| 另类少妇人与禽zOZZ0性伦| 天搞天天天天天| 99热这里只有精品66| 久99久视频| 久久99热这里只有精品| 91狠狠色丁香婷婷综合久久精品| 超碰久热| 《诡秘之主》在线观看| 天天做天天爱| 人人操AV| 婷婷五月丁香五月| www久久99com| 五月丁香影院| 激情伊人五月婷婷久久| 五月天综合网| 久久久五月婷婷| 超碰婷婷五月| 狠狠干婷婷| 日韩另类在线观看| 五月丁香| 日韩无码一区二区三区四区| 中文字幕一色哟哟哟哟| 六月婷婷国产| 9 1在线视频| 久久电影4399| 台湾综合丁香五月蜜桃| 国产亚洲精品AAAAAAA片| 亚洲第一色区| 啪精品| 99热这里只有精| 亚洲国产网站| 欧美成人无码一区二区三区| 天堂伊人干| 丁香五月综合网亚洲综合欧美狠狠| 久久五月天激情婷婷| 婷婷五月情| 超碰av在线| 综合色99| 婷婷激情丁香六月| AA片在线观看视频在线播放| 五月停停激情网| 色婷婷亚洲综合av| 亚洲在线综合| 五月丁香婷婷激情在线| 人人操超碰| 日本片日本片祼观看网站在线看中文版网页在线看 | 亚洲婷婷五月天在线激情综合网| 九九热在线视频| 91精品久久久久、久五月天| 婷婷综合五月天| 韩日另类| 中文字幕丰满人妻无码专区| 成人五月天在线视频在线观看| 欧美一级a | 97干免费视频| www.五月天| 综合激情五月婷婷| 六月婷婷激情| 黄色国久久| 国産精品| 9这里只有精品| 一级性感黄色内射视频| 国产亚洲精品久久久久苍井松| 久久在线大香蕉| 天天狠狠色| 国产脫衣舞一区二区三区| 天天色天天操天天射| 精品人妻在线| www.lingjunshare.com| yellow视频在线观看91| 日韩三级高清无码| 久久亚洲婷婷| 日本色综合| 九九视频热| 五月丁香久久网| 99在线一区| 五月婷婷激情| 日日噜狠狠| 久久er99| 六月天无码网址| www九九| 成人短视频在线免费观看| 久久精品熟女亚洲AV麻豆| 婷婷五月综合在线| 美国十月色婷婷在线观看| 婷婷六月丁香1| 久久这里这里有精品免费视频| 五月激情久久| 久久婷婷五月天激情新地址| 色播五月婷婷| 亚洲 五月 婷婷 成人| 激情播丁香| 五月丁香啪综合| 97人妻碰碰碰久久久久-最近国语高清| 中文人妻AV久久人妻18| se99视频| 丁香五月综合激情性爱| 国产精品色婷婷AV综合色色| 五月丁香六月停停| 五月婷婷偷| 91碰碰| 色五月婷婷综合在线| 欧美操综合| 99超级碰免费视频| 永久精品| 亚洲情欲| 91热久久| 97色色婷婷| 激情爱爱网站超大免费| 桃色五月天| 日本五月天网站| 色久综合天天做视频| 亚洲综合婷婷五月天| 99精品视频在线6| 五月天婷婷自拍图片在线观看| 婷婷久久亚洲| 亚洲欧美成人在线| 97色婷| 人妻综合网| 99热综合在线| 99碰超| 五月天色婷婷激情综合| 国产成人网站在线观看| 成人精品人妻| 中文字幕黄色片| 亚洲99综合| 99热欧美在线观看| 五月丁香婷草| 亚洲综合视频在线| 欧亚洲在线高清视频| 久久九色| 色久在| 婷婷天天舔| 五月天色视频| 99免费| 五月天色综合| 91一起艹| 五月婷婷片| 久久AV无码精品人妻系列试探| 五月天婷婷色播综合在线| 日本激情综合| 婷婷久久18| 日韩AV在线免费观看| 1024日韩| 五月天激情AAAA| 五月开心深深爱激情综合 | 人妻无码精品一区| 婷婷五月天激情电影小说| 51XX午夜影福利| 色色色色色色网| 99热18| 婷婷五月天久| 99热国产婷婷| WWW,色五月| 思思热热久久| 夜夜操天天干| 97干在线| 丁香婷婷成年| 丁香五月婷婷少妇| 狠狠干婷婷| 婷婷色五月天第7色| 五月五婷婷| 久久九九99| 国产精品美女久久久久AV超清| 伊人久久大香天蕉亚洲特级| 先锋资源91| 性一交一乱一交A片久久四色| 丁香九月综合激情| 成AV人片一区二区三区久久| 97亚洲精品| 日本九九视频| 婷婷五月天成人动漫 | 狠狠搞狠狠操| 狠狠色成人影片| 五月Huangsewang| 五月天色综合| 九九久久综合网站| 天天干天天拍| 狠狠精品干练久久久无码中文字幕 | 99精品视频免费在线播放| 日日想日日夜日日操| 在线观看免费狠狠色丁香香综合| AV在线中文| 中文字幕日本最新乱码视频 | 五月婷婷综合网| 国产玖玖资源| www色色com| 1024在线观看免费视频| 精品无码av丁香五月激情| 久热网站| 无码免费人妻A片AAA毛片西瓜 | www色婷婷久久综合久色| 丁香五月天成人网站| www激情| 日本3级片一区2区| 亚洲久久婷婷| 丁香五月性| 91一道本| 久久这里只有欧美| 五月丁香六月婷婷网| 综合爱久久| 五月丁香亭亭天天舔| www.99热视频| 999九九九久久久99HD| 久久99热只有精品| 综合视频久久| 亚洲免费电影2| 青草久久五月婷伊人| 91久久婷婷| 亚洲无码成人网| 一区二区三区四区无码| 久久香蕉影院| 丁香五月天堂| 色五月丁香婷婷| 亚洲AV无码成人电影| 五月花成人网| 99在线小视频| 色婷婷丁香五月在线| 99色亚洲| 婷婷久久精品| 日本va欧美va欧美精品88| 婷婷视频网| 久久精品4| 色婷婷五月天成人网| 91a片爽| 97色伦另类图片小说视频| 久热超碰| 亚洲人妻AV| 99自拍视频在线| 欧美久久婷婷| 欧洲色| 色婷婷瘦婷婷日韩| 色色色色色色网| 97luluse| 丁香社区婷婷五月| 人人妖人人97| 777精品成人a v久久| 成人免费120分钟啪啪| 狠狠人人| 丁香五月av| 五月在线婷色| 99久久婷婷| 熟女色专区| 中文激情网| 热99视频精品| 伊人久久婷婷| 亚洲丁香五月深爱五月| 亚洲视频一区| 五月综合777| 国产在线网| 欧美草久久五月天91| 久久伊人五月天| 人妻在线中文字幕久久| 91综合视频丁香|