色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

Linux SPI驅動數據收發(fā)全解析:spi_message、片選與時序排查

Linux SPI驅動數據收發(fā)全解析:spi_message、片選與時序排查 調試一顆SPI接口的傳感器時最讓人抓狂的場景往往不是波形完全沒動靜而是片選拉低了、時鐘也出來了代碼里spi_read()返回 0 表示成功緩沖區(qū)里卻清一色是 0xFF或者單字節(jié)讀 ID 一切正常一旦連續(xù)讀幾十字節(jié)就后半段全是臟數據。前面折騰寄存器手冊、上電時序、Mode 配錯最后發(fā)現問題出在對spi_message和spi_transfer的理解上——消息被拆成了幾段cs_change位置放錯片選在中間被抬高了一次從機狀態(tài)機直接復位。這篇內容圍繞 Linux 下 SPI 設備驅動的數據收發(fā)處理流程把這條鏈路上真正起作用的結構體和函數逐個拆開講。包括spi_device、spi_driver、spi_controller這三者怎么湊到一起spi_message和spi_transfer怎么組織一次完整的事務spi_sync與spi_async的調用鏈差在哪里控制器側的transfer_one_message與set_cs又是怎么把數據真正推到時序線上的。適合已經能寫字符設備、但一遇到 SPI 時序問題就卡住的驅動開發(fā)者也適合想把現有驅動從能跑改到穩(wěn)跑的老手。下面這些內容全部基于內核 SPI 子系統的通用實現邏輯不同版本在字段命名上有差異比如老的spi_master后來并入spi_controller我會在關鍵處點出來。1. 從設備樹節(jié)點到 probe 函數spi_device 與 spi_driver 的匹配鏈路很多人寫 SPI 驅動是照著模板抄的of_match_table填了、probe寫了、spi_setup()調了設備能起來但問到spi_device里的max_speed_hz到底是誰填的、什么時候填的就說不清了。而恰恰是這幾個字段決定了后面每一次傳輸的時鐘頻率、字長和片選行為配錯了就是上面那種讀回全 FF的經典故障。1.1 spi_device 不是驅動 new 出來的是總線枚舉出來的這一點必須先掰清楚。你寫的驅動里沒有kzalloc(sizeof(struct spi_device))spi_device是 SPI 總線在枚舉階段創(chuàng)建的驅動只是認領其中一個。整條鏈路大致是設備樹里有一個掛在 SPI 控制器下面的子節(jié)點帶compatible、reg、spi-max-frequency等屬性控制器驅動在probe里注冊控制器devm_spi_register_controller內核遍歷該控制器下的子節(jié)點每個子節(jié)點對應調用一次spi_alloc_device()分配spi_device再由of_spi_parse_dt()或spi_device_parse_dt這類平臺相關的解析函數把 DTS 屬性灌進去接著spi_add_device()把這個spi_device掛到總線設備鏈表上注冊到設備模型總線開始匹配找到spi_driver調用你的probe。所以probe被調用的時候spi-max_speed_hz、spi-mode、spi-chip_select、spi-bits_per_word這些字段已經是從設備樹里解析好的初值。你的probe里再調spi_setup(spi)作用是把驅動想用的配置和控制器能力做一次協商和下發(fā)而不是從零開始填。這里有個實際影響如果你在probe里手改spi-mode但忘了重新調spi_setup()控制器寄存器還是舊配置波形不會變。反過來如果 DTS 里根本沒有spi-max-frequency解析出來的max_speed_hz可能是 0很多控制器會退化成默認頻率常見是幾百 kHz 到 1 MHz這時候你會發(fā)現明明寫了 10M示波器上只有 500k根子不在驅動代碼里。1.2 關鍵字段逐個說清楚它們的生效位置spi_device字段不少但真正影響數據收發(fā)的就這幾個我把它們和在哪一層生效對應起來字段來源生效位置配錯的典型表現max_speed_hzDTSspi-max-frequency驅動可下調spi_transfer.speed_hz為空時用它頻率過高導致采樣錯位讀回數據高位錯亂modeDTSspi-cpol/spi-cpha或spi-tx/rx-*spi_setup()下發(fā)到控制器CPOL/CPHA 反了數據整體偏移一位bits_per_wordDTS 或驅動設置每次 transfer 繼承8/16 位混用字節(jié)序錯亂chip_selectDTSreg控制器set_cs使用片選錯位多個從機同時被選中cs_gpiodDTScs-gpios控制器用 GPIO 做片選時GPIO 方向或電平反了從機永遠不被選中irqDTSinterrupts驅動request_irq使用中斷觸發(fā)類型不對讀數據永遠等不到mode這個字段值得單獨說一句。它的低兩位是 CPOL 和 CPHA高位還有SPI_CS_HIGH、SPI_LSB_FIRST、SPI_3WIRE、SPI_LOOP、SPI_NO_CS、SPI_READY這些標志位。很多人只關心 CPOL/CPHA忽略了SPI_CS_HIGH——如果你的從機片選是高電平有效DTS 里沒寫spi-cs-high那控制器會一直按低有效處理結果就是從機上電后始終處于選中態(tài)你發(fā)什么它都在聽但片選松開的動作永遠不發(fā)生從機內部狀態(tài)機就不會復位。這類問題在單次讀 ID 時可能碰巧能過連續(xù)讀寫時必然出錯。1.3 spi_driver 的兩條匹配路徑OF 匹配與 modalias 匹配spi_driver結構體本身很簡單核心就三塊struct device_driver driver內含of_match_table、name、pm回調、const struct spi_device_id *id_table、probe/remove。匹配走的是 SPI 總線的match函數邏輯順序是先看of_driver_match_device()也就是of_match_table里的compatible和設備樹節(jié)點比對如果不匹配再看spi_match_device()用id_table里的名字和spi-modalias比對兩條都不中設備就掛著沒人管/sys/bus/spi/devices/下能看到它但driver鏈接是空的。提示modalias一般由compatible字符串轉換而來斜杠、逗號之類的字符會被替換所以只寫of_match_table通常也能匹配上但在某些用spi_board_info靜態(tài)注冊設備的平臺上modalias來自spi_board_info.modalias這時候id_table就是必須的。兩種都寫是最穩(wěn)的做法。probe的返回值也有講究。返回 0 表示接管成功返回-ENODEV或-ENXIO表示這個設備我不認識總線會繼續(xù)嘗試其他驅動在有多驅動競爭同一 compatible 時有用返回其他負值則是硬失敗設備進入probe failed狀態(tài)不會再重試。我見過把-EPROBE_DEFER寫成-EAGAIN的結果電源管理芯片還沒就緒SPI 設備直接放棄注冊后續(xù)永遠起不來。2. spi_message 與 spi_transfer一次事務到底被拆成了什么如果說spi_device是跟誰說話那spi_message就是這一趟要說幾句、每句多長。這是整個 SPI 驅動里最需要動腦子設計的地方也是最容易埋坑的地方。因為 SPI 是全雙工但半雙工時序的總線一次片選拉低期間可以連續(xù)發(fā)多段數據、中間夾延時、甚至在中途抬片選這些復雜行為全靠spi_message里掛的spi_transfer鏈表來描述。2.1 spi_transfer 的字段決定了每一段的物理形態(tài)一個spi_transfer描述一段連續(xù)傳輸核心字段tx_buf/rx_buf發(fā)送和接收緩沖區(qū)指針可以為 NULL。兩個都為 NULL 就是純延時配合delay用。len這一段傳輸的字節(jié)數。speed_hz本段專用頻率為 0 則繼承spi_device.max_speed_hz。bits_per_word本段專用字長為 0 則繼承。delay這一段結束后、下一段開始前的延時結構體spi_delay支持微秒和納秒兩種單位。cs_change這一段結束后是否改變片選狀態(tài)語義在不同上下文下不一樣后面細講。tx_nbits/rx_nbits單線、雙線、四線、八線模式用于 QSPI/OctalSPI。tx_dma/rx_dmaDMA 地址僅當is_dma_mapped為真時有效老式用法新代碼基本不用。這里最容易搞錯的是delay和cs_change的組合語義。舉個真實場景讀一個 SPI 接口的 ADC協議要求發(fā)命令字 → 等 10 微秒轉換 → 讀結果。正確做法是三段 transfer第一段tx_buf cmd, len 1發(fā)命令第二段tx_buf NULL, rx_buf NULL, len 0, delay 10us純延時第三段rx_buf buf, len 2讀結果。如果圖省事把延時塞在第二段的delay上然后直接讀你會發(fā)現時鐘線在延時期間的狀態(tài)不符合從機要求——因為延時發(fā)生在段與段之間片選保持低電平但時鐘停在最后一個邊沿某些從機會把這當成一次額外的時鐘跳變。這種情況在手冊里通常寫成CS must remain low during conversion但沒告訴你 SCLK 要保持什么電平只能靠示波器驗證。2.2 棧上分配 message 是常見做法但異步場景下是致命錯誤標準寫法是這樣的struct spi_transfer xfer { .tx_buf tx, .rx_buf rx, .len len, }; struct spi_message msg; spi_message_init(msg); spi_message_add_tail(xfer, msg); ret spi_sync(spi, msg);spi_message_init()做的是INIT_LIST_HEAD(msg-transfers)加上若干字段清零spi_message_add_tail()把 transfer 掛到鏈表尾部并累加frame_length。這兩個函數本身沒有內存分配所以把 message 和 transfer 放在棧上是完全合法且最常見的做法——前提是用spi_sync。換成spi_async就完全不一樣了。spi_async在把消息掛進控制器的隊列后就返回了真正的傳輸是異步完成的。如果你在函數里定義棧上的spi_message函數一返回棧幀被覆蓋控制器后面再去訪問msg-transfers鏈表讀到的就是垃圾指針。表現出來往往是隨機的內核 oops而且現場很難復現因為取決于棧被覆寫的時機。正確做法是用spi_async時把spi_message和spi_transfer一起嵌進驅動的私有結構體用kzalloc分配或作為設備結構體成員并在complete回調里統一釋放。這個坑我在早期項目里踩過一次現象是高負載下偶發(fā) panic查了兩天才定位到。2.3 什么時候必須拆成多段什么時候一段就夠判斷標準其實只有一條從機的協議是否要求在某段數據之間插入片選變化或延時空檔。不需要就合并成一段需要就拆。合并的好處很實際減少 message 內部循環(huán)次數、減少控制器與驅動的交互開銷、對 DMA 更友好長連續(xù)緩沖區(qū)比多段短緩沖區(qū)更容易映射成大塊。有些控制器對單個 transfer 有長度上限controller-max_transfer_size超過需要驅動自己拆但這個是控制器能力限制和協議要求是兩回事。需要拆的典型情況命令與數據之間有轉換時間要求如某些溫濕度傳感器讀操作要求先寫地址、抬片選、再拉低片選讀數據部分 EEPROM 的時序需要在同一片選周期內切換頻率speed_hz是 per-transfer 的整段 message 共享頻率的話就不需要拆全雙工通信里發(fā)送和接收長度不對稱且硬件 FIFO 深度有限。spi_write_then_read()這個輔助函數就是兩段合并的封裝它內部構造兩段 transfer寫 讀中間不抬片選適合絕大多數寄存器地址 讀數據的場景。但要注意它有棧上分配內部 buffer 的行為傳輸長度受SPI_BUFSIZ限制通常是 32 字節(jié)左右超過就得自己拼 message。3. spi_sync 與 spi_async調用鏈一同步一異步語義差別很大很多驅動里spi_sync和spi_async是混著用的初始化讀 ID 用spi_sync中斷里讀數據用spi_async。但兩者的調用鏈和控制流完全不同混用不當就會出問題——最常見的是在原子上下文里調spi_sync導致睡眠告警或者spi_async的返回值被誤當成傳輸完成。3.1 spi_sync 的執(zhí)行路徑與返回值語義spi_sync(spi, message)內部大致是加總線鎖spi_bus_lock保證同一時刻一個控制器上只有一個 message 在處理把 message 掛進controller-queue調用控制器的transfer老接口或transfer_one_message新接口啟動傳輸用completion等待傳輸結束wait_for_completion喚醒后返回message-status。關鍵點在于spi_sync是可能睡眠的。它要等 completion要持有可睡眠的鎖所以絕對不能在中斷上下文、軟中斷、或者持有自旋鎖的區(qū)域里調用。真在中斷里需要發(fā)數據只能用spi_async或者把工作推給 workqueue/線程化中斷。返回值語義也要注意spi_sync返回 0 只代表消息走完了流程沒有報錯不代表從機給出了有效應答。從機不回數據、總線被拉死、MISO 懸空spi_sync照樣返回 0只有超時或控制器報錯才會返回負值。所以判斷通信是否成功必須校驗接收緩沖區(qū)內容比如讀 ID 寄存器比對預期值不能只看返回值。message-actual_length是另一個有用的字段它記錄了實際傳輸的字節(jié)數。正常情況下等于frame_length但如果控制器中途出錯或被信號打斷actual_length會比預期小這時候即使status是 0也要當作部分失敗處理。3.2 spi_async 的回調上下文與資源釋放時機spi_async(spi, message)的返回值含義和spi_sync完全不同返回 0消息已成功入隊傳輸會在稍后發(fā)生返回負值入隊失敗消息根本沒發(fā)出去complete回調不會被調用。入隊成功后控制器完成傳輸時會調用message-complete(message-context)。這個回調可能在中斷上下文里執(zhí)行所以里面不能睡眠、不能調spi_sync、不能kfree帶鎖的資源用kfree本身可以但不能在里面等待?;卣{里通常只做三件事置完成標志、喚醒等待隊列、把數據掛到環(huán)形緩沖區(qū)。資源釋放的時機是另一個高頻錯誤點。很多人寫成ret spi_async(spi, msg); if (ret 0) kfree(msg.transfers); /* 錯傳輸還沒開始 */正確的做法是讓complete回調負責釋放或者用一個引用計數把驅動持有和控制器持有分開。更省事的做法是把 message 和 transfer 內嵌在設備私有結構體里用一把自旋鎖保護當前是否有傳輸在進行的狀態(tài)而不是每次動態(tài)分配。注意spi_async不保證消息按調用順序執(zhí)行雖然多數控制器內部是 FIFO 隊列但驅動層不該依賴這個假設。如果協議有嚴格順序要求比如先配置寄存器再讀數據要么用spi_sync串起來要么自己在驅動層維護隊列等上一個回調完成再發(fā)下一個。3.3 transfer_one_message 與 transfer_one控制器側的兩套接口寫設備驅動的人一般不用直接碰這兩個但理解它們有助于判斷問題出在驅動還是控制器。spi_controller里有兩個回調transfer_one_message(ctlr, msg)控制器負責整條 message 的處理自己遍歷 transfer 鏈表處理片選、延時、頻率切換全部完成后調spi_finalize_current_message(ctlr)。返回 0 表示已接管稍后完成。transfer_one(ctlr, msg, xfer)控制器只處理一段transfer返回 1 表示這段已完成且整條 message 也完成返回 0 表示這段已啟動但異步完成返回負值表示出錯。由 SPI 核心的spi_transfer_one_message()負責遍歷鏈表、調set_cs、調spi_transfer_delay_exec?,F代驅動大多實現transfer_one因為核心幫你處理了鏈表遍歷和延時控制器只需要關心怎么把一段 buffer 變成時序。但這也意味著延時和片選的語義由核心統一解釋你在設備驅動里寫的delay和cs_change最終是被spi_transfer_delay_exec()和spi_set_cs()消費的。4. 片選與延時被低估的時序細節(jié)全在 spi_controller 這一側數據收發(fā)出問題八九成的根因不在數據緩沖區(qū)而在片選和延時。這兩個東西在設備驅動代碼里通常只體現為一個cs_change標志和一個delay字段但它們在控制器側的執(zhí)行方式直接決定了波形長什么樣。4.1 set_cs 與 cs_gpiod片選到底是硬件還是 GPIOspi_controller有兩種片選實現方式硬件片選控制器外設自帶 CS 引腳驅動實現set_cs(ctlr, spi, enable)回調直接寫寄存器。這種方式時序最準片選動作和時鐘邊沿的間隔由硬件保證。GPIO 片選DTS 里寫cs-gpios核心把 GPIO 描述符填進spi-cs_gpiod由核心的spi_set_cs()統一操作 GPIO。這種方式靈活但時序精度差——GPIO 操作要經過幾層函數調用片選到第一個時鐘邊沿的建立時間可能達到微秒級。對于高速 SPI比如 20 MHz 以上GPIO 片選經常導致第一個字節(jié)采樣錯誤因為片選建立時間不夠。解決方式有兩種一是改用控制器硬件片選二是在 DTS 里配置cs-setup-us對應spi-cs_setup來插入建立延時代價是降低吞吐。還有一個容易忽略的字段cs_inactive。它定義片選無效時的電平默認是高電平對應低有效片選。如果從機是高有效片選除了SPI_CS_HIGH標志還要確認cs_inactive的值和硬件實際電平匹配否則會出現片選看起來在動但邏輯反了的情況。4.2 delay 的兩種單位與 spi_transfer_delay_exec 的執(zhí)行位置spi_transfer.delay是struct spi_delay類型里面有一個value和一個unit單位可以是SPI_DELAY_UNIT_USECS或SPI_DELAY_UNIT_NSECS。早期內核用的是delay_usecs純微秒新代碼建議用delay結構體因為納秒級延時在高速時序里是剛需。執(zhí)行位置在spi_transfer_one_message()的循環(huán)里一段 transfer 交給控制器完成或啟動后核心調用spi_transfer_delay_exec(xfer)執(zhí)行延時然后根據cs_change決定是否調spi_set_cs()。這里的執(zhí)行順序是先延時后處理片選。所以如果你寫延時 10 微秒后抬片選寫法是delay 10uscs_change 1而不是反過來。理解這一點很多片選提前松開的詭異現象就解釋得通了。納秒級延時的實現方式取決于平臺有的用ndelay()有的用控制器自帶的延時計數器更準有的干脆退化成udelay()不準。如果協議要求嚴格的納秒級間隔比如某些高速 ADC 的轉換觸發(fā)最好確認控制器是否支持硬件延時否則只能降頻換取時序余量。4.3 cs_change 的三層語義別只記一種cs_change的含義在不同位置完全不同這是 SPI 子系統里最容易誤用的字段場景cs_change 語義一段 transfer 之后后面還有別的 transfer抬片選、再拉低制造一個片選脈沖最后一段 transfer 之后傳輸結束后保持片選有效不抬只有一段 transfer 的 message同上傳輸結束后保持片選也就是說cs_change 1在中間位置是切換在末尾位置是保持。很多人以為它統一是切換片選結果在單段 message 上設了cs_change 1期望傳輸完抬片選實際卻是一直保持低電平從機永遠不釋放總線下一次通信直接沖突。這個設計的歷史原因是為了支持多次 message 共享一個片選周期的場景。要讓片選在末尾抬起正確做法是cs_change 0默認值。4.4 頻率切換的實際代價speed_hz是 per-transfer 的看起來可以隨意在 message 內部切頻率。但實際執(zhí)行時控制器每次切換頻率都要重算分頻寄存器某些控制器還會有切換后需要等待若干個時鐘周期穩(wěn)定的隱性要求。如果 message 里塞了七八段不同頻率的 transfer實際吞吐可能比單一頻率還低。我的經驗是除非協議強制要求比如配置階段用低頻、數據傳輸用高頻否則整條 message 用統一頻率靠spi_device.max_speed_hz一次性設定。真要分段改頻率把不同頻率的部分拆成獨立 message中間用spi_sync串起來代碼更清晰調試也更容易。5. 排查鏈路實錄從讀回全 FF到定位到具體字段理論講完說點實際的。下面這條排查鏈路是我在一個 SPI 傳感器項目里真實走過的順序基本可以復用到大多數通信不通的場景。5.1 第一步永遠是確認物理層而不是改代碼拿到讀回全 FF的現象先別急著懷疑驅動。全 FF 意味著 MISO 一直保持高電平可能的原因有從機沒上電、從機沒被片選選中、MISO 線沒接、從機處于復位狀態(tài)、從機根本沒收到有效命令。用邏輯分析儀抓四根線CS、SCLK、MOSI、MISO看三件事片選有沒有真的被拉低如果一直是高問題在片選配置SCLK 有沒有波形如果沒有檢查控制器是否真的啟動了傳輸或者時鐘引腳復用沒配對MOSI 上發(fā)的字節(jié)和代碼里寫的是否一致如果 MOSI 全 0說明發(fā)送緩沖區(qū)根本沒被控制器讀到。這一步能排掉一半的問題。我遇到過一次spi_sync返回 0、波形全無最后發(fā)現是控制器的時鐘門控沒開probe里漏了clk_prepare_enable()。代碼層面完全看不出來只有波形能告訴你真相。5.2 波形正常但數據錯按 mode、字長、字節(jié)序的順序排波形有了數據不對按這個順序排ModeCPOL/CPHA 四種組合抓波形對照從機手冊的時序圖。CPHA 錯位表現為數據整體偏移半個到一個時鐘讀出來的值看著像但不對。字長bits_per_word是 8 還是 16如果從機是 16 位寄存器、你按 8 位發(fā)地址會被拆成兩個字節(jié)從機收到的是錯誤地址。字節(jié)序SPI_LSB_FIRST標志。絕大多數 SPI 器件是 MSB first但有些傳感器是 LSB first配反了讀出來的值位序是鏡像的。位寬模式單線、雙線、四線。tx_nbits配成 2 但硬件只接了 MOSI 一根線數據會丟一半。這四項里Mode 和字長占問題總量的八成以上。我現在的習慣是新器件上手先用最低頻率1 MHz 以下、8 位字長、Mode 0 跑通讀 ID再逐步往上加頻率和改 Mode每改一項驗證一次出問題立刻知道是哪一項。5.3 短傳輸正常、長傳輸出錯看長度上限和 DMA 對齊這是另一類高頻問題。單字節(jié)讀 ID 正常連續(xù)讀 64 字節(jié)就后半段全是臟數據。原因通常有三個控制器單次傳輸長度上限。controller-max_transfer_size和max_message_size是控制器能力聲明如果超了有的控制器會截斷有的直接報錯。查/sys/class/spi_master/spiX/下有沒有相關屬性或者在驅動里讀ctlr-max_transfer_size判斷。DMA 緩沖區(qū)對齊。走 DMA 的控制器通常要求緩沖區(qū)按 cache line 對齊32 或 64 字節(jié)。用kmalloc分配的緩沖區(qū)不保證對齊棧上的緩沖區(qū)更是隨機。表現為前半段對、后半段錯因為跨 cache line 的部分被 DMA 跳過或重復搬運。解決辦法是用dma_alloc_coherent()或者在spi_message上依賴核心的spi_map_msg()做 bounce buffer。從機 FIFO 深度限制。有些從機的接收 FIFO 只有 8 字節(jié)你連續(xù)發(fā) 64 字節(jié)超出部分被丟棄。這種情況必須在 message 里拆段每段之間加延時等從機取走數據。5.4 用 spi_statistics 和動態(tài)調試定位瓶頸內核給每個spi_device和spi_controller都掛了統計計數器在/sys/class/spi_master/spiX/statistics/和/sys/class/spi_master/spiX/spiX.Y/statistics/下可以看到bytes_tx/bytes_rx累計收發(fā)字節(jié)數和你代碼里的預期對不上就說明有傳輸被丟棄messages/transfers消息數和段數用來驗證 message 拆分是否符合預期errors錯誤計數配合timedout判斷是不是超時spi_sync/spi_async兩種調用的次數。排查時先cat一遍這些計數器跑一輪測試再cat一遍差值能告訴你很多信息。比如messages增加了 1 但transfers增加了 5說明你的 message 被拆成了 5 段如果預期是 2 段那拆分邏輯就有問題。動態(tài)調試也很實用echo file spi.c p /sys/kernel/debug/dynamic_debug/control echo file spi-mem.c p /sys/kernel/debug/dynamic_debug/control dmesg -w打開后能看到每次spi_sync的 message 長度、每段 transfer 的參數、控制器的啟動和完成時間點。配合 ftrace 的irqsoff或preemptofftracer還能看出傳輸過程中是否被中斷打斷。6. 一份能直接改著用的驅動骨架最后給一份完整骨架覆蓋注冊、probe、讀寫封裝、卸載。省略了具體寄存器操作重點在結構體初始化和 message 組織方式上。6.1 私有結構體與驅動的注冊struct myspi_dev { struct spi_device *spi; struct mutex io_lock; /* 串行化并發(fā)訪問 */ u8 *tx_buf; u8 *rx_buf; struct spi_transfer xfer; struct spi_message msg; }; static const struct of_device_id myspi_of_match[] { { .compatible vendor,myspi-sensor }, { } }; MODULE_DEVICE_TABLE(of, myspi_of_match); static const struct spi_device_id myspi_id[] { { myspi-sensor, 0 }, { } }; MODULE_DEVICE_TABLE(spi, myspi_id); static struct spi_driver myspi_driver { .driver { .name myspi-sensor, .of_match_table myspi_of_match, .pm myspi_pm_ops, }, .id_table myspi_id, .probe myspi_probe, .remove myspi_remove, }; module_spi_driver(myspi_driver);module_spi_driver()展開后就是spi_register_driver()加模塊退出時的spi_unregister_driver()。id_table和of_match_table都寫覆蓋 DTS 枚舉和spi_board_info靜態(tài)注冊兩條路徑。6.2 probe 里必須做的事static int myspi_probe(struct spi_device *spi) { struct myspi_dev *dev; int ret; dev devm_kzalloc(spi-dev, sizeof(*dev), GFP_KERNEL); if (!dev) return -ENOMEM; dev-spi spi; mutex_init(dev-io_lock); spi_set_drvdata(spi, dev); /* 頻率不超過從機上限字長固定 8 位Mode 從 DTS 繼承 */ spi-max_speed_hz min(spi-max_speed_hz, 10000000u); spi-bits_per_word 8; spi-mode ~SPI_MODE_X_MASK; /* 如需強制 Mode 0可在此處改 */ ret spi_setup(spi); if (ret) { dev_err(spi-dev, spi_setup failed: %d\n, ret); return ret; } dev-tx_buf devm_kmalloc(spi-dev, MYSPI_MAX_XFER, GFP_KERNEL | __GFP_DMA); dev-rx_buf devm_kmalloc(spi-dev, MYSPI_MAX_XFER, GFP_KERNEL | __GFP_DMA); if (!dev-tx_buf || !dev-rx_buf) return -ENOMEM; spi_message_init(dev-msg); dev-xfer.tx_buf dev-tx_buf; dev-xfer.rx_buf dev-rx_buf; spi_message_add_tail(dev-xfer, dev-msg); return myspi_hw_init(dev); }幾個細節(jié)緩沖區(qū)用__GFP_DMA分配是為了提高 DMA 可用概率但真正的 cache line 對齊還要靠dma_alloc_coherentspi_setup()必須在改完mode/bits_per_word/max_speed_hz之后調用否則改動不生效spi_message_init和spi_message_add_tail放在 probe 里做一次后續(xù)每次傳輸只改xfer.len和緩沖區(qū)內容減少重復開銷。6.3 讀寫封裝一段式 message 的復用static int myspi_xfer(struct myspi_dev *dev, const u8 *tx, u8 *rx, size_t len) { int ret; if (len 0 || len MYSPI_MAX_XFER) return -EINVAL; mutex_lock(dev-io_lock); if (tx) memcpy(dev-tx_buf, tx, len); else memset(dev-tx_buf, 0, len); dev-xfer.len len; dev-xfer.speed_hz 0; /* 繼承 spi_device 設置 */ dev-xfer.bits_per_word 0; dev-xfer.delay.value 0; dev-xfer.cs_change 0; ret spi_sync(dev-spi, dev-msg); if (ret 0 rx) memcpy(rx, dev-rx_buf, len); mutex_unlock(dev-io_lock); return ret; }用mutex而不是自旋鎖因為spi_sync會睡眠。xfer和msg在結構體里復用避免每次動態(tài)分配。傳輸完成后memcpy出來是因為下一次傳輸會覆蓋rx_buf不拷走的話數據就丟了。單段 message 里cs_change保持 0傳輸結束后片選自動抬起這是絕大多數從機期望的行為。如果從機要求多段之間保持片選才需要構造多段 message 并單獨處理cs_change。6.4 remove 與異常路徑static void myspi_remove(struct spi_device *spi) { struct myspi_dev *dev spi_get_drvdata(spi); myspi_hw_suspend(dev); /* mutex 不需要顯式銷毀devm 分配的內存自動釋放 */ }因為全部用devm_*分配remove 里基本不用手動釋放。唯一要注意的是如果驅動里用了spi_asyncremove 之前必須確保沒有正在進行的傳輸否則回調觸發(fā)時私有結構體已經被釋放。做法是在 remove 里先置一個shutdown標志然后wait_for_completion_timeout()等當前傳輸結束。7. 幾個用血換來的經驗第一永遠先用spi_sync把功能跑通再考慮優(yōu)化成spi_async。異步帶來的復雜度和并發(fā)問題只有在確實需要中斷上下文、高吞吐隊列時才值得。很多驅動寫異步是因為看起來性能更好實際 SPI 總線速率受限于從機異步省下的那點調度開銷根本體現不出來。第二spi_setup()的返回值一定要檢查。它內部要和控制器協商頻率、字長、模式如果控制器不支持你要求的組合會返回-EINVAL。忽略這個返回值后面所有傳輸都會用上一次生效的配置跑現象莫名其妙。第三調試時把max_speed_hz降到 1 MHz 以下。絕大多數時序問題是頻率太高導致的建立/保持時間不夠降頻后問題消失就說明是時序余量問題而不是邏輯錯誤。這個技巧能幫你在一分鐘內把問題范圍縮小一半。第四給每個關鍵傳輸點加dev_dbg打印actual_length和status。status為 0 但actual_length小于預期的情況說明傳輸被部分完成這種隱性失敗最容易被漏掉。第五片選是 SPI 里最不像數據線的數據線。它不傳數據但決定了數據的邊界。所有數據看起來錯位讀出來多一個字節(jié)偶爾成功偶爾失敗的問題先懷疑片選時序比懷疑數據緩沖區(qū)有效得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
AV和黑人在线播放| 超碰在线免费一区二区三区| 色色五月天激情| 久久免费老司机精品| 试看60秒| www.黄色在线| 色婷五月| 亚洲国产剧情少妇激情| 天天欲望网| 黄色激情电影在线观看| 最新日韩黄片| 国产夜夜艹| 一区三区啪啪| 99∨VTV| 中文字幕人乱码中文字的预防方法 | 亚洲精品黄码久久久久| 久久久久久久久成人av解说| 色 亚洲 91| 91网九色蝌蚪操熟女| 91被操| 999岛国大片| 老鸭窝黄色视频网站| 日本在线观看网址| 久久久99久9| 国产亚洲深夜激情| 国产精品天美传媒| 亚洲资源吧| 欧亚性爱在线视频| 97色色国产视频| 日韩啪啪视频| 99蜜月精品久久| 无码137片内射在线影院| 久99视频| 亚洲图片欧美色| 婷婷综合五月| 国产精品播放| 曰本精品久久久| 九九九九久久久久| 亚洲男人的天堂V| 私人尤物在线精品不卡| 久热大香蕉网站| 曰韩av中文字幕专区| 98久久超碰| 国产精品爽爽va在线观看98| 在线不欧美| 久/久精品99看9| 91亚洲影视| 久久久激情| 亚洲熟妇AV日韩熟妇在线| www.狠狠干.coom | 一区二区三区精品久久| 激情自拍 校园春色| 91欧美网| 亚洲国产丝袜在线观看| 在线观看国产黄色| 91中文字幕制服丝袜免费视频| 25国产精品免费观看| 特色a在线上| 精品国产嫩穴视频| 九九无码视频| 啊啊啊好想要| 激情小说亚洲图片| 狠久久| 极品内射| 这里都是精品在线观看| 亚洲se91| 97视频900| 九月婷婷| 熟女人妇一区二区三区| 快灬快灬 一下爽蜜桃在线观看 | 另类小说欧美激情校园春色| 亚洲色图第四色| 人妻天天爽夜夜爽精品2| 日韩免费簧片| 国产精品经典一卡久久久| 亚洲男人的天堂在线看| 天天夜夜久久| 亚洲五月丁香花狠狠干一区二区三区| 成人自拍三级在线观看| 一二三区视频在线观看| 人人搡人人肉久久精品| 欧美三级一级| 91久久久久久| 欧美人妻久久精品二区三区| 中出欧美| 91高清日| 草莓精品视频在线免费观看| 爱妻综合网| 精品国产丝袜一区二区三区乱码 | 最新日产中文在线麻豆| 亚洲福利中文字幕在线| 男人的天堂99| 五十路人妻在线| 国产 无码 一区二区| yaouchengrenav| 91精品人妻一区二区三区蜜臀| 精品人妻一区二区三区蜜桃视频| 国产内射爽爽大片| 一区二区三区免费视频入口| av最新免费中文字幕| 色综合大香蕉| 日韩一级成人毛片免费观看| 久久久久久久久久8888| 日韩欧美丝袜诱惑| 婷婷五月天久久精品视频一区二区三区| 桑老女人九区| 夜夜嗨一区二区三区直播内容| 日欧操屄| 婷婷激情丁香| 明星性猛交ⅹxxx乱大交| 丰满人妻一区二区三区免费| 俞拍自拍| 精品色色| 色在线69堂| yellow网站免费观看日韩高清无码| 人人搞人人插人人操| 日本精品加勒比海一区| 亚洲综合情色| 97网址97| 久久久久久十| 欧美色乱| 色欲三区| 九九色图| 亚洲欧美校园另类春色| 97蜜桃综合| 欧美久久草熟女| 91美女中出| 理论久久婷婷网 8| 东北黄色电影| 人妻五十路在线| 蜜臀色乳| 新91视频.cmp| 97视频在线播放| 神马午夜久久| 亚洲精品国产熟女久久久久久| 人妻一区二区三区四区视频| 亚洲h片在线免费观看| 亚洲春色欧美激情自拍| 日韩美女操b| 久久草在线综合视频| 91久久免费视频互動交流 | 色婷婷电影网| 亚洲综合图文| 人妻精品一区二区| 97亚洲精品超碰| 婷婷久久五月综合激情| wwwxxx日本爽| 免费看日本操逼视频| 五月综合久久| 久久久久久91香蕉国产| 久久精品日韩专区免费观看| 久久 精品| 青草草免费网站av| 伊人婷婷五月天| 五月综合激情| 性老妇一区二区三区| 歐美性天天| 色妇91| 久草看看看| 久久专区| 欧美人妻一区| 十八禁视频网站| 日本熟妇熟色97一本在线观看| 日本三级日本三级三级人妇四虎| 91爱欧美| 可以免费看黄片的视频| 久久五月丁香| 欧洲精品在线播放| 国产精品国产精品国产| 秋霞无码av鲁丝片一区| 中亚av| 久久中日麻豆| 国产av色网| 在线免费观看高清无码视频| 亚洲欧美国产其他二区| 白丝少妇一区二区| 欧美精品宗合| 激情av| 国产精品在线一区二区| 成人午夜高潮av猛片| 无套内射人妻在线播放| 久久久久久久久久久久久久9999| 欧美A√综合网 | 青青欧洲黑| 97在线视频观看| 国产精品一区二区 尿失禁| 精品久久久久,69国产成人精| 中文字幕二区| 日韩熟女乱伦中出| 躁躁日曰躁2020| 久久蜜桃一区二区| 操逼啊啊啊91| 后入式视频国产自| 一级@啪啪视频| 四虎影视在线| 亚洲中文字幕熟女| 中文字幕一区 二区三四五 区日 日骚| 在线小说视频一区| av天堂精品久久| 欧美少妇熟女| 精品黄色电影| 中文字幕一区av| 99精品九九九九九九| 国产麻豆福利av在线播放| 77国产精品| 九九热九九| 久久草大香蕉| www国产无码| 日韩天美| 国产熟妇 码视频户外直播| 曰韩无码777| 欧美性Fer办公室秘书| 久久久久久久国产视频| 长久操视频| 超碰97人妻免费在线| 久久久工口| 人人操人人肉久久精品| 97视频观看| 亚洲综合第一页| 91色碰| 色色九区| 久久的网站啊啊啊啊啊| a片久久久久久久久久久久 | 日韩图色| 精品91摸| 日韩丰满熟妇| 亚洲图片另类| 狠狠狠一区二区三区| JuliaAnn丝袜熟女系列| www.四虎在线| 91社操逼| 正宗无毛一线天嫩逼| 吻戏激情性巴克| 精品在线蜜臀| 少妇蜜汁| 免费综合亚洲中文| 日本韩高清无砖码22o| 九九九九九九九精品视频| 国产熟妇 码视频户外直播| 色综合色综合网| 男女啊啊啊啊啊| 射欧美综合| 欧美少妇性爱网站| 精品人妻一区二区三区在| 五月婷婷六月色| 国产精品美女久久久久久网站| 9热9热综合网| 26uuu性物| 中文字幕久热视频在线| 色色色色色色色色综合| 欧美极品少妇| 色色婷婷五月天| 91处女在线观看| 麻豆国产成人精品| 99视频内射三四| 欧美综合国产精品久久丁香| 亚洲一区制服诱惑| 老熟女91av| 精品午夜福利国产一区二区在线观看| 欧美第二页午夜| 丁香激情网| 眼镜人妻101.com| 中文字幕精品三级久久久| 欧美亚性天堂| 亚洲午夜av| 亚洲综合电影| 啪啪啪综合| 乱人乱色一区二区三区免费 | 亚洲免费成人在线高清无码视频| 国产精品熟女一区二区三区| 亚洲人成色9999精品久久| 亚洲日本天堂| 91亚洲欧美综合高清在线| 午夜精品久久久久久久第一页按摩| yaouchengrenav| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 国产传媒一区二区三区| 高清不卡国产| 97色冈| 免费作爱一级视频| 亚洲国产综合久久天堂| 天堂а√在线最新版在线| 99999久久精| 亚洲色香| 噜噜噜亚洲精品| 欧美成人精品一区二区三区| 五月丁香成人网| 日韩美女操b| 男女日B国产| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 欧美色97| 中精品一区二区三区| 亚洲丝袜二区| 婷婷久久五月| 亚洲中文字幕97久久精品少妇| 午夜福利在线合集| 国产Aα| 一级人妻性爱视频| 国产在线综合网| 超碰97亚洲| 亚洲国产天堂| 97超碰9| 色偷偷色偷偷欧美日韩| 丁香六月婷婷综合| 蜜桃狠狠色伊人亚洲综合 | 综合色久欲| 色婷网| 嗯嗯嗯啊啊啊操的我好爽 | 亚洲丝袜二区在线| 伊人一区二区三区| 免费操逼91| 天美麻花大全视频| 九九aV| 亚洲人妻熟妇三十三区| 亚洲情色综合| 五月天色五月| A级片一区| 91天天爱| 亚乱色| 中国AAAAAA黄色片| 国产精品96久久久久久| 国产传媒一区二区三区| 少妇一区二区三区| 国产午夜精品在线观看| www老逼91| 蜜臀亚洲中文| 999热日韩精品| 美女黄页网站| 国产精品不卡av免费在线观看| 精品国产乱码久久久久久久久久毛片| 9997se| 欧美综合 站| 亚洲中文字幕一区| 97色色色| 高清无码一区二区三区| 亚洲一区二区三区欧美日韩| 手机在线观看不卡无码av| 五月丁香综合| 欧美亚涩| 天堂涩涩| 搡老女人老91二区| 国产日韩手机视频在线| 欧美性爱系列| 中文字幕一区二区三区蜜臀| 91男人天堂网| 中文乱码字幕观看| 思思热久久成人| 黄色一级视| 超碰人人超在线观看| 日韩亚洲美女一区久久| 亚洲网污污污污| 精品美女少妇一区二区| 无码区蜜乳| 黄色免费网页无码| 有码人妻系列| 亚洲少妇视频| 日本一区二区三区四区免费观看| 91亚洲精品青草| 色婷婷一区二区三区久久午夜| 熟女熟妇一区二区三四区| 国产多人在线观看视频| 国产成人网址| 大肉棒导航| 亚洲久9| 欧美少妇性乱| 秋霞网无码| 欧美亚洲中文字幕| 久久99草| 三男一女不戴套的A片| 亚洲日韩成人性爱视频| 91成人在线| 97超碰站| 91久久久久免| 男人的天堂Va| 东亚亚洲无码高清| 久久綜合很很很| 97超碰大| 一区二区三区欧美激情| 久久偷偷色综合蜜桃| 久久久久九九九九| 久久久98网站免费视频| 日韩精品午夜操呦呦不卡影院| AV和黑人在线播放| 无码91| 女生看匆91网站| 婷婷五月天激情网| 欧美天堂超碰97| 日韩免费福利在线观看| 欧美性爱一区| 大香蕉乱级| 亚洲国产精品久久久久婷婷青年| 久久久极品| 国产高清无码一区二区三区四区皇冠| 久久久久无码一妻区| 日本成人免费一区二区三区| 欧美综合色站| 曰韩精品视频一区二区| 97色色,97综合| 91av熟女人妻| 麻豆AV短剧| 26uuu最新| 偷窥自拍亚洲色图| 天堂v无码免费视频| 淫淫总合网| 啪啪自拍九九综合| 日韩女优中文字幕| 亚洲日本激情| 中文字幕久久亚州无码| 日本熟女免费視颖| 久欲AV| 亚洲AV永久无码一区仙野| 久热精品在线| 五月天开心网| 久久99午夜精品一区人妻| 台湾佬中文娱乐网久久久久久久久久com | 大香樵伊人网| 日日骚中文字幕| 老女人爆菊| 日韩精品在线视频,日韩精品……| 五月丁香亭亭| 日韩福利电影网| 日韩精品高清资源在线| 免费看黄视频亚洲网站| 941超碰| 美日韩成人| 91精品91久久久中77777| 亚洲天堂区| 日韩性爱一级片| 中文字幕久久精品一区| 在线精品福利免费播放| 亚洲?V高清一区二区三区尤物| 97视频在线免费看| 婷婷丁香九月| 97日韩欧美亚洲| 欧亚洲精品有视频| 国产99精品一区二区三区免费| 我爱搞逼综合网| 国模艳艳啪啪一区| 欧美成人免费在线观看| 99re热| 丁香激情网| 国内毛片热久久思思热| 超碰久草| 嗯……啊…嗯嗯…啊…好舒服| 最新三级网址| 激情综合网激情综合| 男生女生啊啊啊啊| 99热综合| 91成人在线免费视频| 少妇三p| 中文字幕版| 免费毛片在线播放| 97超碰人人操人人操| 极品出轨视频网站| 青青伊人久久| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 人人喜人人妻| 亚洲综合一区二区| 成人免费毛片| 中欧人妻丝袜中文字幕| 蜜臀av网址| 成人熟女视频一区二区三区| 国产AV天美传媒一区二区三区 | 国产欧美美女免费观看视频| 国产成人午夜视频网址| 激情另类激情| 精品久久九| 任我爽视频在线观看| 日本在线播放不卡一区| 日韩激情中文字幕有码| 亚洲春色欧美激情自拍| 亚洲日韩美女丝袜美腿人妻视频| 亚洲男人天堂2013| 久久伊人青青草| 亚洲综合色男人网| 99在线观看| 黄人人操人人操| 百度百度日本操逼| 亚洲图片欧美| 啪啪自拍九九综合| 国产又大又粗又长视频| 中亚黄色三级大片| 超碰97最新人妻| 日韩成人色图| 欧美色图天堂网m| 91 手机在线播放 绯色| 大香蕉久久| 狠狠激情综合狠狠操中文字幕| 操国产逼| 日韩欧无码一区二区三区免费不卡 | www色婷婷| 人人天天干干| 久99久视频| 8050无码八戒| 亚洲性爱无码乱伦av| 亚洲系列第一页| 日韩精品亚洲专区在线影视| 日本人人操人人操| 被体育老师抱着c到高潮| 可以免费观看的日韩av毛片| 亚洲 国产 精品一区| 蜜桃视频成a人v在线| 午夜超爽| 亚洲最大网站av| www.激情| 久久精品人体AV| 久久国产精品一级二级三级| 国产农村妇女一区二区| 日本裸体久久色噜噜| 人妻在线臀日韩| 欲色影视综合吧| 小骚逼被操的爽不爽| 人妻丝袜肏逼| 久久一二三四五六七八九区| 18+91网站| 亚洲熟女人妻中文字幕一区二区| 我要色综合网| 白丝被操91| 人人操人人操草草| 五月丁香影视| 久久蜜桃综合网| 少妇内射www在线观看视频| 中文字幕女同在线| 又黄又硬又粗又长国产视频| 精品无码一区二区三区色欲| 久草国产在线视频| 婷婷丁香五月综合| 97色爱| 老司机午夜精品福利视频一区二区| 超碰精品人妻狠狠干| 992视频一区| 最新国内自拍av免费| 少妇啪啪自拍| 精品人妻伦一二三区久久| 一区二区三区 丝袜 高跟 美腿| 久插不卡| 九七毛片九九毛片| 亚洲色图欧洲| 在线A日本| 丁香五月久久| 上床不卡网站| 亚洲久9| 嗯啊视频免费在线观看| 婷婷丁香六月天| 97精品久久久久久久| 肥佬影院91| 韩国手机不卡无码三级视频| 91九色在线| 天天看人人操屄犊摸阴| 国产蜜臀精品一区二区尤物| 国产精品久久久久久亚洲色欲| 操逼视频免费日韩无码| 久干网| 人妻精品一区二区| 国产亚洲精品玖玖玖在线观看| 欧美亚洲丝袜人妻制服99| 18禁久极品美女久久哦哟呀!| 日韩精品一区二区人人人| 精品久久久不卡一区二区| 熟女久久| 国产女人和拘做爰视频 | 亚洲中文一区二区三区| 婷婷四五区| chaopen97久久| 欧美巨大性舒爽顶到了| 极品五月天噜噜| 欧美后入式| 先锋激情∨在线视频播放| 欧美午夜精品久久久久久超碰| 欧美一品道| 欧美福利视频啊啊啊啊| 天天弄天天操| 天美传媒精品久久视频| 国产麻豆福利av在线播放| 在线天堂999| 91人人| 亚洲天堂99| 91高跟美女在线播放| a男人的天堂久久一级A毛片| 精品区9| 国产精品播放| 色99色| 天天夜夜rb| 韩国一级做A片免费的| 97在线观看免费视频l| 亚洲性爱成人| SS久久| 精品亚洲一区在线观看| 97青青操视频| 97无码视频在线播放| 97资源制服丝袜| 啊啊啊啊啊啊在线| 熟妇亚洲一区二区三区| 亚洲国产成人综合碰碰三级经典| 一本久道久久综合狠狠爱| 亚州黄站| 丁香五月成人| 日产精品久久久一区二区| 国产成人免费观看在线视频| 蜜桃视频精品一区二区三区| 久久国产在线一区二区| 超碰97在线 欧美 国产| 国产精品久久久久久亚洲色欲| 天天操狠狠日夜夜干超碰撸com视频在线观看| 97久久精品不卡| 中国探花熟女| 密臀国产在线| 久久精品超碰| 美女自卫慰黄网站免费| 超碰色97| 97亚洲综合电影| 日韩欧美性爱电影在线观看| 91撸色网 玖玖网 欧美| 精品中文字幕第一页| 91丝袜熟女| 蜜乳AV一区二区三区四| 亚洲天天自拍| 天天综合色电影| 黄色人人| 老司机福利社视频在线观看| www久久久| 91亚洲高清| 欧美激情欧美精品| 久久午夜鲁丝片| 青青草女人天天干| 清柠毛片| 日本1区2区不卡视频| 加勒比东京热五月天天堂网| 国产在线视视频有精品| 欧洲在线性爱视频| 中文字幕神马久久| 色五月婷婷中文字幕| 亚洲丝袜综合| 亚洲欧美国产va在线| 黄色一级视| 91老熟妇| 98福利在线视频| 9久热| 1769一区| 深夜激情| 久久精品亚洲婷婷| 色综合尤物| 欧美岛国精品在线观看| 人澡逼| 天天看片天天爽| 逼逼逼逼操操操操操操操操操午夜剧场| 久久久久久十| 动漫av中文| 夜夜嗨一区二区| 国产精品久久99日日| 蜜臀99精品国产高清在线观看| 亚洲日韩欧美一区二区| 亚洲色天堂日韩中| 特级毛片特黄久久免费看| 午夜爽爽爽| 亚洲高清在线se| 按摩中文字幕| 亚洲激情久久| 黄色电影观看久久9| 91 丝袜在线播放| 亚洲drav色图| 伊人成人中文字幕久久网| 一起草三级AV电影在线观看 | 亚洲国产丝袜在线观看| 久超碰在| 色色色热| 免费操逼视频下载| 国产日韩在线播放av| 国产精品片| 33044男人的天堂深夜备| 蜜臀无码一区二区| 国产丰满熟夫69mpp| 成人 日韩欧美一区| 岛国黄| 青草成人免费视频一com| 精品二999| 操一区| 亚洲97P| 五月天开心网| 日本丝袜人妻内射| 免费试看60秒| 黄片www视频免费| 九九在线精品| 国产超碰97| henhen91| 安微少妇操BBB| 婷婷爽人人婷婷爽视频| 性欧美| 午夜爽爽爽| 97色爱| 久久这里只精品免费福利| 中字一区| 久久午夜神马| 国产一区免费午夜视频| 国产欧美亚洲精品a第2页| 免费亚洲黄色视频在线观看 | 国产精品麻豆免费视频| 欧美激情精品| 大屁股人妻女教师撅着屁股| 一本大道不卡一二三区| 日韩操逼HD| 日韩91网| 91操熟妇| 校园春色AV天堂| 亚洲欧美九九九| 亚洲黄色网址| 亚洲黄a三级三级三级看三级| 亚洲色性情三级| 蜜桃视频精品一区二区| 超碰色中文| 超碰97人妻在线| 亚州中文字幕超碰97| 吉田爱美AV在线| 97国产亚洲中文在线| 欧美内射少妇| 丝袜无码a片| 干B| 亚洲伊人久久精品影院| 加勒比五月天| AV中文字幕三四五| 日本中文熟女视频| 久久性爱精品一区| 手机在线中文字幕国产| 国产女人91精品嗷嗷嗷嗷| 国产高潮AA片免费看| 亚洲av在线免费观看| 国产性刺激| 中文字幕伊人| 日本黄色精品| 无码不卡亚洲成?人片| 一本大道不卡一二三区| 欧美在线播放aaaa| 99.色网| 久久草视频污视频| 大香蕉中文网| 亚洲好看强奸乱伦| 国产亚洲综合欧美一区| 一区二区三区 丝袜 高跟 美腿| 中国黑人三级片网站上区| 91久久久久久久| 啊啊啊操死我| 日韩色欲久久一二三四区| 大香蕉黄色一区| 丁香五月天婷婷姐| 无码人妻精品一区二区三区九九| 粉嫩久久久久| 伊人热综合| 国产一区二区欧美日本| 91红杏| 9久9久9久9久视频网站| 亚洲视频中文一区| 欧美婷婷五月天| 大香蕉天天看妹子| 狠狠入| 99老司机精品视频在线观看| 九月婷婷综合| 一区二区三区成人| 超碰色综合| 久久久18| 欧美色日| 1769成人国产精品视频| 欧美十八禁网站| 日韩99神马视频播放| 国产精品日日摸天天碰| 国产成年精品高清在线观看91| 五月综合视频| 亚洲久久东京热一二三四五区视频| 日韩福利电影网| 五月丁香六月| 啊啊啊男女| 超碰在线香蕉| 日本一二三高清| 中文有码9| 国产精品久久久久久片| 综合 青草 伊久久 影院 综合 | 在线色导航| 精精夜夜| 日韩精品-原创伙伴| 国产浮力影院第1页| 欧美18禁91| 九九碰九九爱97超| 天天爱天天韩国日本牛牛牛牛| 久草老司机| 亚洲欧美国产其他二区| 极品色电影院| 377p欧洲日本亚洲大胆| 麻豆国产第一| 欧亚性爱在线视频| 欧洲精品网| 亚洲精品国产无码高清| 国产91精品久久久久久久网曝门| 亚洲 暴爽 AV人人爽日日碰| 欧美日韩99| 欧美自拍网| 99ri精品| 久久精品无码专区| 啪啪啪大香蕉| 97综合| 91女网站| 综合av社区| 久久久不卡区一区二区三区久久久| 伊人久久在线视频观看| 午夜福利区| 一类无码操逼视频| 99热日| 国产精品久久久久久 百度| 国产精品一区二区麻豆| 久久曰曰| 天天噜| 青青欧美在线| 逼操网站| 亚洲麻豆18发?| 在线视频日韩欧美国产| 中文字幕一区二区三区四五区| 少妇滛荡视频| 色爱亚洲| 国产精品2020| 草草影院日本第一页| 亚洲综合 欧美| 美女超碰978| 人人做,人人操,人人摸| 日日做夜狠狠爱欧美黑人| 人人人人插| 超碰色97| 又摸又舔在线观看网站| 久久毛卡| 亚洲s色图| 一区二区你上我| 人人弄人人摸| 一二视频神马久久传媒| 国产特级毛片AAAAAA高潮流水| 一本一道久久综合久久| 国产精品一区二区三区在线密挑| 日本东京热久久久电影| 91n免费处女| 激激五月| 九九久久一区二区伦理| 啪啪自拍九九综合| 国产熟女一区二区丰满| 天天拍天天操| 99久久精品无码一区二区毛片免费| 久9久精品视频| 婷婷丁香成人| 国产日韩区| 亚洲欧美在线丝袜| 99色婷婷中文字幕乱色| www.色婷婷色综合| 青椒国产97在线熟女| 另类欧美色| 久热久| 精品少妇一区二区三区免费观看| 成人三一级一片aaa| 女生久久网| 亚洲性猛交| 爱爱60秒免费视频| 熟女六十路| 看免费一级在线播放毛片| 超碰 欧美| 久久大线蕉一区| 久久久久久久久久久久久久久性生活视频 | 无码99| 日韩精品中文字幕二区| 秋霞免费无码视频日韩A片| 中文字幕视频在线观看| 久久草视频污视频| 丁香五月天啪啪| 在线无码操| 国内亚洲高清无码| 成人国产二区三区在线,男女精品。| 中文字幕视频2区| 天天天天操| 精品在线观看视频在线| 五月天久久综合网| 亚洲图片激情小说| 91丝袜美腿片| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 91色黑人少妇| 国产av尤物| 99热最新| 69精品久久久久中文字幕| 青青操综合网| 国产精品人人爽人人做可爱福利| 亚州色综合| 91中出在线| 欧美97免费| 久久久久幕乱码| 日日噜噜夜夜久久亚洲一区二区| 一区二区三区 丝袜 高跟 美腿| 久久五月天婷婷| 欧美性爱伊人| 国产区性爱在线视频秋霞豆| 免费在线黄片视频| 十八禁av无码免费网站APP| 免费家庭乱伦视频| www久久国产精品| 97超碰碰| 国产福利电影| 自拍偷拍第26| 澳门黄片一香蕉视频| 97香蕉网| 亚洲无码 国产无码| 呦呦一区| 九九九精品成人免费视频小说| 日韩欧洲操屄视频| 无码区蜜乳| 中国AV美女| 亚洲色图欧美一区二区不卡| 欧美日韩国产一区二区小黄片大全| 黄片www视频免费| 国产91福利小视频在线观看| av强奸乱轮| av网页一区二区三区| 久草视频在线视频在线视频在线观看| 精品人妻一区二区视频| 操逼视频免费日韩无码| 免费黄色A片| 91久久久久久久| 强奸a片网| 99久热| 美女啊啊啊啊啊啊啊| 国产精品一区二区在钱播放| 久草婷婷| 98福利在线视频| 中文字幕在线第二页| 97超碰中文| 国产白丝AV| 美日韩男女操屄视频| 国产亚洲精品无码三区| 国产在线视视频有精品| 五月丁香| 亚洲美女精品| 青青草精玖玖69精品| 久久久久幕乱码| 另类欧美色| 国产亚洲福利第一页丝袜| 曰韩操B| av资源在线播放天堂| 黄色污污污污污污网站| 国产suv精品一区二区四区999| 精品一久久久| 国产中文字幕在线观看| 亚洲欧洲激情卡通另类文学四射小说网站 | 色婷婷激一区二区三区| 国产精品成人无码av| 爱干爱射网啊啊啊| 欧美在线综合| 麻豆久久一区二区三区| 日韩 欧美 另类 人妻| 国产成人网址| 懂色AV中文| 久久久久久久久国产| 日韩免费a级毛片无码a∨| AV不卡在线| 日韩三级久久久| 青青草女人天天干| 欧美黄色手机在线观看| 欧美激情中文字幕另类小说| 美女啊啊啊啊pc| 国产AB视频| 午夜国产成人精品视频| 一级二级三级黑人无码| 无码操逼网| 91女人的网站| com 首页 18岁 禁区 女优 免费 精选 同城| 国产精品午夜AV完会免费| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 五月天色图| 日韩 成人 有码| 啪啪啪综合| 2020国产精品| 国厂麻豆77q4| 色图综合网| 久久婷婷六月综合| 天天操美美| 男人的天堂 在线一区| 亚洲中文字幕精品久久久久久直播| 女同性恋一区二区三区精品视频| 欧美人妻一区二区| 午夜福利无毒不卡| 欧洲Au麻豆| 99少妇| 久久国产性爱| 懂色AV中文| 囯产精品久久久久久久久久梁医生| 人成午夜免费大片| 天堂麻豆天美| 亚洲另类春色| 岛园激情| 日本淫色网| 97精品久久| 久久99热这里只频精品6学生| 蜜桃久久久久久久| 91性色| av中文在线| 日1区2区3区2020| 成年人一级黄色毛片大全在线观看| 亚洲AV高潮| 日本不卡一二区| 97人人模人人爽人人| 嗯嗯啊啊日韩精品| 天堂无码精品国产久| m欧洲一级午老| 精品久久久久久AV无码| 99精品丰满人妻无| 亚洲色图综合| 国产av白丝| 国产精品国产精品国产| 亚洲欧洲视频小说在线观看| 成人性生活高清视频在线播放| 91色婷婷综合久久中文字幕二区| 天天日骚逼熟女| 久久毛卡| 欧美性视频二区三区| 韩国午夜理伦三级好看| 夜夜国自区| 色综合网1| 久久伊人东京热| 久久久一级| 99re免费| 超碰亚洲欧美日韩无| 久久久久九九九九| 蜜桃久久久久久| 精品国产一区二区三区四区在线看 | 天天做天天爱| 混色激情av| 九九热九九| 亚洲男人天堂网久久| 成人性爱AV在线免费观看| 自拍欧美| 国产人妖视频一区在线观看| 午夜福利 成人 91| 丁香六月啪啪| 97亚洲自在精品在线观看| 久久久一区二区三区四曲免费听| 日韩少妇无码| 一区二区三区四区姦女| 高清国产性猛交xxxx乱大交| 香蕉免费一区二区三区不读| 九九香蕉网| 国产农村妇女精品| 久久av色| 日本三级韩三级99久久| 亚洲成人ab| 女一区二区| 色色色色网站| 99国产精品| 国产美女激情| 日韩黄色电影网站| 亚洲男人天堂av| 人妻天天爽| 国产精品色色| 中国AV美女| 99re这里只有| 超碰97网址| 色五月首页| 欧美 精品国产制服第一页 | 亚洲操人| 亚洲最新Av| 精品美女人人干| 狠狠干狠狠色| 一区二区影院| 精品国产乱码久久久久久网站入口| 啊啊啊要高潮了| 五月丁香啪| 国产女人和拘做爰视频| 亚洲人妻久久| 欧美第二页午夜| 天天色综合图片| 又粗又长又爽在线观看| 欧美亚洲首页| 德国一二三不卡| 国产一级作爱毛片| 襙一襙| 男人的天堂Va| 日韩情色视频| 三级AV入口| 四虎免费在线观看| 国产风韵犹存熟妇三区| 夜夜操av亚洲一区二区| 97摸视频| 精品成人无码| 69av一区二区三区| 91性情| 亚州黄站| 午夜福利在线合集| 婷婷五月天激情网| 日韩另类| 国产乱码精品一区二区三区四川| 国产日韩无码一区二区三区久久区| 大香蕉日韩欧美| 久久精品视频久久久| AA丁香综合激情| 成人午夜小视频手机在线看| 日韩激情无码影院| 久久二| 黑白配性爱AV成| 白嫩妹子国产骚| 神马久久69| 国产25页| 蜜臀AV一区二区三区激情综合| 久久久无码av精| 国产区性爱在线视频秋霞豆| 韩国三级一线观看久| 亚洲无码精品AV久久久| 狠狠爱夜夜| 色悠久久久av| 国产一| 蜜臀亚洲综合一二三四区| 欧美情色贴图| 久久111| 330dv亚洲成年视频网| 天天弄欧美| 久久久精品日本一道| 后入 亚洲 美女 射| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 久久亚洲色图中文字幕| 欧美人与动性人交a| 操逼操逼操| 91处女在线观看| 91亚洲人| 小说区 图片区色 综合区| 99999精品| 超碰在线人人射| 很很操在线| 加勒比海人人操超碰在线| 伦理第一页| 亚洲一区二区三区婷婷| 国产福利合集| 少妇被c 黄 免费观看| 国模无码人体一区二区三| 欧美性爱精品七区| 亚洲91色| 国产精品久久久久久亚洲色欲| 国产婷婷综合在线观看| 日韩精品碰碰| 欧美系列在线一区二区| 国产精品秘 福利姬在线观看| 中文字幕jul-617人妻熟女| 97天堂| 啊啊啊啊啊在线观看网址 | 精品无码久久久久久国产浪潮| 搡老女人老91妇女老熟女| 亚洲伊人成综合成人网| 欧美天天干| 成年人性爱日韩| 青草视频在线看看看看看看看看看| 丁香六月婷婷久久综合| www.狠狠| 男人亚洲91首页在线| 一道本东京热加勒比一区二区三区| 97久久久精品| 久久精品女同亚洲女同13| 无码78| 五月丁香六月综合缴清无码| 日本国产高清色www视频在线| 国产女人成人精品视频| 成人熟女视频一区二区三区| 蜜屁Av| 中文日韩欧美熟| 91爱|