亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

新版Linux LED驅(qū)動(dòng)實(shí)驗(yàn):設(shè)備號(hào)分配與cdev結(jié)構(gòu)體全流程解析

新版Linux LED驅(qū)動(dòng)實(shí)驗(yàn):設(shè)備號(hào)分配與cdev結(jié)構(gòu)體全流程解析 做 ARM Linux 驅(qū)動(dòng)繞不開一個(gè)經(jīng)典實(shí)驗(yàn)LED。這些年在網(wǎng)上能翻到的教程一大半還在用老版register_chrdevmknod那套寫法放到 Ubuntu20.04 的新內(nèi)核上要么編譯報(bào)錯(cuò)要么加載后行為不對勁。標(biāo)題里提到的“新版 LED 驅(qū)動(dòng)實(shí)驗(yàn)原理”和“設(shè)備號(hào)分配 cdev 結(jié)構(gòu)體全流程”其實(shí)點(diǎn)出了新舊兩套框架最本質(zhì)的差異新版把一個(gè)黑盒拆成了幾個(gè)顯式步驟每一步都讓你自己控制、自己釋放。這篇文章就照著 Ubuntu20.04 環(huán)境把從設(shè)備號(hào)申請到 cdev 注冊、再到/dev/led節(jié)點(diǎn)自動(dòng)出現(xiàn)的完整鏈路走一遍順帶把我在調(diào)試中踩過的坑填給你適合剛從 2.6/3.x 老代碼切過來、或者準(zhǔn)備正經(jīng)寫字符設(shè)備驅(qū)動(dòng)的開發(fā)者參考。1. 從“一鍵打包”到“全流程拆解”新版 LED 驅(qū)動(dòng)實(shí)驗(yàn)的框架差異1.1 老版 register_chrdev 到底封裝了什么早期驅(qū)動(dòng)里最常見的一段代碼是這樣的ret register_chrdev(major, led, led_fops);如果major傳 0內(nèi)核會(huì)替你動(dòng)態(tài)分配一個(gè)主設(shè)備號(hào)如果傳一個(gè)固定值那就把該主設(shè)備號(hào)占下來??粗∈碌@個(gè)函數(shù)內(nèi)部做的事情遠(yuǎn)比表面多它會(huì)申請一段設(shè)備號(hào)區(qū)間、初始化一個(gè)cdev結(jié)構(gòu)體、把file_operations掛上去并且一下就占滿 256 個(gè)次設(shè)備號(hào)。問題也隨之而來。第一你無法精細(xì)管理次設(shè)備號(hào)比如一個(gè)驅(qū)動(dòng)要控制 8 個(gè) LED你想讓每個(gè) LED 各占一個(gè)次設(shè)備號(hào)老接口根本表達(dá)不出這種意圖它默認(rèn)把所有次設(shè)備號(hào)都包圓了。第二主設(shè)備號(hào)沖突極難排查內(nèi)核只在申請失敗時(shí)返回一個(gè)錯(cuò)誤碼不會(huì)告訴你是誰占用了這個(gè)號(hào)你得自己去翻/proc/devices。第三也是最讓新手難受的一點(diǎn)設(shè)備節(jié)點(diǎn)不會(huì)自己出現(xiàn)。老教程會(huì)教你在加載后用mknod /dev/led c major 0手動(dòng)建節(jié)點(diǎn)而現(xiàn)代發(fā)行版的/dev由 devtmpfs/udev 管理手動(dòng)mknod出來的節(jié)點(diǎn)在系統(tǒng)重啟后就會(huì)消失權(quán)限也經(jīng)常不對。這并不是說register_chrdev不能用了它在 5.x 內(nèi)核里依然作為兼容接口存在但新代碼再走這條路等于放棄了內(nèi)核提供的大量資源管理能力。新版驅(qū)動(dòng)把流程拆成我們下面要講的“設(shè)備號(hào)分配 → cdev 注冊 → 設(shè)備節(jié)點(diǎn)創(chuàng)建”三段讓每一步都可控、可回滾、可排查。1.2 新版全流程每個(gè)環(huán)節(jié)各管一攤新版 LED 驅(qū)動(dòng)在module_init里要按順序做四件事分配設(shè)備號(hào)alloc_chrdev_region或register_chrdev_region初始化并添加cdevcdev_initcdev_add創(chuàng)建 classclass_create創(chuàng)建設(shè)備節(jié)點(diǎn)device_create。對應(yīng)在module_exit里清理順序嚴(yán)格反著來先銷毀設(shè)備節(jié)點(diǎn)再銷毀 class然后移除 cdev最后釋放設(shè)備號(hào)。我經(jīng)常跟新人講這段順序不是隨便定的它對應(yīng)的是資源依賴關(guān)系device_create依賴 class 存在cdev 依賴設(shè)備號(hào)存在所以你銷毀的時(shí)候必須從最上層開始一層層拆先斷掉用戶可見的入口再回收內(nèi)核資源。我用一個(gè)生活類比來理解這套模型設(shè)備號(hào)是房子的門牌號(hào)cdev是房子里擺好的辦公桌file_operations是桌上貼著的工作流程說明而/dev/led這個(gè)節(jié)點(diǎn)則是門口掛的招牌。沒有門牌號(hào)辦公桌不知道掛靠在哪沒有辦公桌客人來了沒人接待沒有招牌用戶根本不知道有這個(gè)房間。新版驅(qū)動(dòng)把這三件事一步步做每一步失敗都能立刻定位到是哪塊出了問題。2. 設(shè)備號(hào)分配alloc_chrdev_region 和 register_chrdev_region 怎么選2.1 dev_t 與 MKDEV/MAJOR/MINOR 的編碼規(guī)則設(shè)備號(hào)在內(nèi)核里是一個(gè)dev_t類型本質(zhì)是個(gè) 32 位無符號(hào)整數(shù)。高 12 位是主設(shè)備號(hào)低 20 位是次設(shè)備號(hào)。主設(shè)備號(hào)用來區(qū)分設(shè)備類型和對應(yīng)的驅(qū)動(dòng)次設(shè)備號(hào)用來區(qū)分同一驅(qū)動(dòng)下的多個(gè)實(shí)例。直接位運(yùn)算容易出錯(cuò)內(nèi)核提供了現(xiàn)成宏#include linux/kdev_t.h dev_t devno MKDEV(240, 0); // 主設(shè)備號(hào) 240次設(shè)備號(hào) 0 int major MAJOR(devno); // 取出主設(shè)備號(hào) int minor MINOR(devno); // 取出次設(shè)備號(hào)主設(shè)備號(hào)在 5.x 內(nèi)核里可用于注冊的范圍大約到 511實(shí)際分配時(shí)建議別手寫固定值除非你有明確理由。次設(shè)備號(hào)的 20 位空間足夠讓一個(gè)主設(shè)備掛幾百萬個(gè)同類型設(shè)備所以驅(qū)動(dòng)里通常一個(gè)主設(shè)備號(hào)配合多個(gè)次設(shè)備號(hào)使用。我在調(diào)試時(shí)候的習(xí)慣是先把MAJOR(devno)和MINOR(devno)打出來看確認(rèn)設(shè)備號(hào)確實(shí)拿到了再進(jìn)行下一步。這一步出錯(cuò)后面所有工作都白做。2.2 兩種分配函數(shù)的適用場景設(shè)備號(hào)分配有兩個(gè) API很多新手搞不清區(qū)別其實(shí)看名字就夠直白函數(shù)傳入?yún)?shù)特點(diǎn)適用場景風(fēng)險(xiǎn)register_chrdev_region(dev_t first, unsigned count, const char *name)需要手動(dòng)構(gòu)造first即指定起始設(shè)備號(hào)調(diào)試時(shí)固定設(shè)備號(hào)、產(chǎn)品有明確主設(shè)備號(hào)約定可能與其他驅(qū)動(dòng)沖突加載失敗alloc_chrdev_region(dev_t *dev, unsigned firstminor, unsigned count, const char *name)內(nèi)核自動(dòng)分配結(jié)果寫入指針產(chǎn)品代碼、避免手工管理設(shè)備號(hào)每次加載主設(shè)備號(hào)可能不同如果你想固定主設(shè)備號(hào)代碼這么寫static int major 240; dev_t devno; devno MKDEV(major, 0); ret register_chrdev_region(devno, 1, led); if (ret 0) { pr_err(failed to register chrdev region\n); return ret; }如果讓內(nèi)核動(dòng)態(tài)分配dev_t devno; ret alloc_chrdev_region(devno, 0, 1, led); if (ret 0) { pr_err(failed to alloc chrdev region\n); return ret; } major MAJOR(devno); pr_info(led major %d, minor %d\n, major, MINOR(devno));我在實(shí)際項(xiàng)目里強(qiáng)烈推薦第二種原因很現(xiàn)實(shí)你永遠(yuǎn)不知道目標(biāo)板子上哪些主設(shè)備號(hào)已經(jīng)被其他驅(qū)動(dòng)占了。動(dòng)態(tài)分配把“找空號(hào)”這件事交給內(nèi)核沖突概率降到最低。調(diào)試階段為了復(fù)現(xiàn)問題可以加一個(gè)模塊參數(shù)允許手動(dòng)指定主設(shè)備號(hào)0 表示動(dòng)態(tài)分配。static int major 0; module_param(major, int, 0644); if (major) { devno MKDEV(major, 0); ret register_chrdev_region(devno, 1, led); } else { ret alloc_chrdev_region(devno, 0, 1, led); }這樣insmod led.ko默認(rèn)動(dòng)態(tài)分配insmod led.ko major241則固定為 241調(diào)試和產(chǎn)品兩不誤。2.3 設(shè)備號(hào)釋放與常見沖突排查設(shè)備號(hào)屬于內(nèi)核全局資源用完了必須還回去。釋放函數(shù)只有配套的unregister_chrdev_region(devno, count)一個(gè)放在module_exit的最后一步執(zhí)行。我在代碼審查時(shí)見過不少新手把unregister_chrdev_region放在cdev_del之前當(dāng)時(shí)看不出問題但設(shè)備文件還開著的時(shí)候內(nèi)核按設(shè)備號(hào)找不到對應(yīng)的cdev系統(tǒng)日志里就會(huì)冒出一些奇怪的錯(cuò)誤。排查設(shè)備號(hào)沖突最直接的辦法是加載前先看一眼cat /proc/devices這個(gè)文件列出當(dāng)前已經(jīng)注冊的字符設(shè)備和塊設(shè)備的設(shè)備號(hào)與名稱。如果發(fā)現(xiàn)目標(biāo)主設(shè)備號(hào)已經(jīng)在列表里那就別硬搶。還有一招是用grep過濾cat /proc/devices | grep led如果日志出現(xiàn)register_chrdev_region: ... already in use之類的提示多半就是主設(shè)備號(hào)撞車了。3. cdev 結(jié)構(gòu)體如何把 file_operations 掛到設(shè)備號(hào)上3.1 struct cdev 的關(guān)鍵成員與初始化設(shè)備號(hào)只是給設(shè)備發(fā)了一張“身份證”真正讓這張身份證生效的是cdev。內(nèi)核源碼里的定義大致如下struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; dev_t dev; unsigned int count; };四個(gè)關(guān)鍵成員各有用處kobj讓cdev成為內(nèi)核對象模型的一員可以被引用計(jì)數(shù)管理owner通常寫成THIS_MODULE保證設(shè)備正被使用時(shí)模塊不能被卸載ops掛載文件操作函數(shù)集是業(yè)務(wù)核心dev記錄它對應(yīng)的設(shè)備號(hào)count表示占用了多少個(gè)次設(shè)備號(hào)。初始化有兩種方式。一種是在文件作用域直接放一個(gè)struct cdevstatic struct cdev led_cdev; cdev_init(led_cdev, led_fops);另一種先用cdev_alloc()動(dòng)態(tài)分配再cdev_init()。對于 LED 這種單實(shí)例驅(qū)動(dòng)我建議用靜態(tài)方式少一次動(dòng)態(tài)內(nèi)存管理就少一類內(nèi)存泄漏隱患多實(shí)例場景再用動(dòng)態(tài)方式按需創(chuàng)建。初始化完成后led_cdev.owner THIS_MODULE這行也別忘了否則模塊卸載時(shí)會(huì)出問題。3.2 cdev_add 的時(shí)機(jī)與錯(cuò)誤處理cdev_add是真正把cdev和設(shè)備號(hào)綁進(jìn)內(nèi)核的設(shè)備表里的動(dòng)作ret cdev_add(led_cdev, devno, 1); if (ret 0) { pr_err(failed to add cdev\n); goto err_unregister; }第三個(gè)參數(shù)是設(shè)備數(shù)量一般寫 1如果申請了多個(gè)次設(shè)備號(hào)就寫對應(yīng)的數(shù)量。這里特別提醒一個(gè)最容易忽視的點(diǎn)cdev_add一旦成功用戶空間立刻就能打開這個(gè)設(shè)備了所以在這之前必須保證后續(xù)所有資源都已經(jīng)準(zhǔn)備好。順序反了比如先cdev_add再class_create那么成功添加后到 class 創(chuàng)建前這個(gè)短暫窗口內(nèi)已經(jīng)可以 open 設(shè)備但節(jié)點(diǎn)還不存在容易讓上層應(yīng)用拿到一個(gè)半成品設(shè)備。cdev_add失敗時(shí)要記得把前面分配的設(shè)備號(hào)釋放掉。我最??吹降膯栴}就是失敗分支里只return -EINVAL設(shè)備號(hào)還掛在系統(tǒng)里第二次加載直接撞車。正確的回滾順序是cdev_del→unregister_chrdev_region一層層退回去。3.3 file_operations 里怎么設(shè)計(jì) LED 的操作入口file_operations是驅(qū)動(dòng)與用戶空間交互的接口表。LED 實(shí)驗(yàn)不需要復(fù)雜功能核心就三個(gè)open、write、release。以下是新內(nèi)核推薦的空 open 寫法static int led_open(struct inode *inode, struct file *filp) { return 0; }如果有多個(gè) LED可以在open里通過iminor(inode)取出次設(shè)備號(hào)確定當(dāng)前操作的是哪一路 LED。write里要接收用戶傳進(jìn)來的“開/關(guān)”指令static ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos) { char value; if (copy_from_user(value, buf, 1)) return -EFAULT; if (value 1) led_set_state(1); else if (value 0) led_set_state(0); else return -EINVAL; return 1; }注意這里不能直接用*buf那是用戶空間地址內(nèi)核線程不能直接解引用。copy_from_user返回值為 0 表示拷貝成功返回值非 0 表示還有多少字節(jié)沒拷完應(yīng)當(dāng)返回-EFAULT。這個(gè)細(xì)節(jié)是新手最容易踩的不拷貝直接解引用輕則讀到垃圾值重則觸發(fā)內(nèi)核 oops。file_operations定義如下static const struct file_operations led_fops { .owner THIS_MODULE, .open led_open, .write led_write, .release led_release, };寫const是必須的因?yàn)閮?nèi)核只允許注冊只讀的file_operations表。4. 設(shè)備節(jié)點(diǎn)從 mknod 到自動(dòng)出現(xiàn)class_create 與 device_create 的配合4.1 /dev/led 這個(gè)節(jié)點(diǎn)到底是誰創(chuàng)建的老框架需要mknod手動(dòng)創(chuàng)建節(jié)點(diǎn)但新版驅(qū)動(dòng)在module_init里調(diào)用device_create后/dev/led會(huì)自動(dòng)出現(xiàn)。這個(gè)“自動(dòng)”的背后是 udev 在干活device_create會(huì)向內(nèi)核的 sysfs 寫入設(shè)備信息并觸發(fā) ueventudev 守護(hù)進(jìn)程收到事件后根據(jù)設(shè)備所屬的 class 和名字在/dev下創(chuàng)建對應(yīng)節(jié)點(diǎn)。對于嵌入式環(huán)境里不用 udev、而是用 busybox 的場景對應(yīng)的機(jī)制是 mdev需要在啟動(dòng)腳本里配置 mdev 的規(guī)則。Ubuntu20.04 桌面版和服務(wù)器版默認(rèn)都有 udev所以我們在 PC 上跑模塊時(shí)基本上不需要額外配置。class_create的作用是給設(shè)備分組。設(shè)備創(chuàng)建后你會(huì)在/sys/class/led/下面看到這個(gè)設(shè)備這也是用戶態(tài)程序發(fā)現(xiàn)硬件設(shè)備的入口之一??梢岳斫鉃閏lass是設(shè)備在 sysfs 里的“目錄名”決定它歸到哪個(gè)類目下面。4.2 device_create 參數(shù)逐項(xiàng)拆解device_create這個(gè)函數(shù)參數(shù)比較多我一個(gè)個(gè)解釋static struct class *led_class; static struct device *led_device; led_class class_create(THIS_MODULE, led); if (IS_ERR(led_class)) { pr_err(failed to create class\n); goto err_cdev_del; } led_device device_create(led_class, NULL, devno, NULL, led); if (IS_ERR(led_device)) { pr_err(failed to create device\n); goto err_class_destroy; }第一個(gè)參數(shù)led_class是設(shè)備歸屬的 class第二個(gè)參數(shù)parent通常傳 NULL第三個(gè)參數(shù)devno是這個(gè)設(shè)備對應(yīng)的設(shè)備號(hào)它是設(shè)備和cdev掛鉤的錨點(diǎn)第四個(gè)參數(shù)drvdata可以傳驅(qū)動(dòng)的私有數(shù)據(jù)指針LED 實(shí)驗(yàn)里不需要最后一個(gè)變參是設(shè)備節(jié)點(diǎn)名字的格式化字符串比如想要led0、led1這種名字就寫成device_create(led_class, NULL, devno, NULL, led%d, 0)。要注意class_create和device_create的返回值都是錯(cuò)誤指針。判斷時(shí)不能直接和 NULL 比較要用IS_ERR()和PTR_ERR()if (IS_ERR(led_device)) { ret PTR_ERR(led_device); goto err_class_destroy; }4.3 完整可編譯的 LED 驅(qū)動(dòng)代碼把前三章的思路串起來就是一個(gè)完整的新版 LED 字符設(shè)備驅(qū)動(dòng)。我貼一個(gè)能直接編譯的版本實(shí)際硬件控制部分我用一個(gè)接口函數(shù)代替你換成自己的 GPIO 或寄存器操作即可#include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/cdev.h #include linux/device.h #include linux/uaccess.h #define LED_DEV_COUNT 1 static int major 0; module_param(major, int, 0644); MODULE_PARM_DESC(major, led major number, 0 for dynamic alloc); static dev_t led_devno; static struct cdev led_cdev; static struct class *led_class; static struct device *led_device; static void led_set_state(int state) { /* 實(shí)際項(xiàng)目中替換為 ioremap 寄存器操作或 gpiod_set_value */ pr_info(led state - %d\n, state); } static ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos) { char value; if (count 1) return -EINVAL; if (copy_from_user(value, buf, 1)) return -EFAULT; if (value 1) led_set_state(1); else if (value 0) led_set_state(0); else return -EINVAL; return 1; } static int led_open(struct inode *inode, struct file *filp) { return 0; } static int led_release(struct inode *inode, struct file *filp) { return 0; } static const struct file_operations led_fops { .owner THIS_MODULE, .open led_open, .write led_write, .release led_release, }; static int __init led_init(void) { int ret; if (major) { led_devno MKDEV(major, 0); ret register_chrdev_region(led_devno, LED_DEV_COUNT, led); } else { ret alloc_chrdev_region(led_devno, 0, LED_DEV_COUNT, led); } if (ret 0) { pr_err(failed to alloc/register chrdev region\n); return ret; } major MAJOR(led_devno); pr_info(led major %d, minor %d\n, major, MINOR(led_devno)); cdev_init(led_cdev, led_fops); led_cdev.owner THIS_MODULE; ret cdev_add(led_cdev, led_devno, LED_DEV_COUNT); if (ret 0) { pr_err(failed to add cdev\n); goto err_unregister_region; } led_class class_create(THIS_MODULE, led); if (IS_ERR(led_class)) { ret PTR_ERR(led_class); pr_err(failed to create class\n); goto err_cdev_del; } led_device device_create(led_class, NULL, led_devno, NULL, led); if (IS_ERR(led_device)) { ret PTR_ERR(led_device); pr_err(failed to create device\n); goto err_class_destroy; } return 0; err_class_destroy: class_destroy(led_class); err_cdev_del: cdev_del(led_cdev); err_unregister_region: unregister_chrdev_region(led_devno, LED_DEV_COUNT); return ret; } static void __exit led_exit(void) { device_destroy(led_class, led_devno); class_destroy(led_class); cdev_del(led_cdev); unregister_chrdev_region(led_devno, LED_DEV_COUNT); pr_info(led driver removed\n); } module_init(led_init); module_exit(led_exit); MODULE_LICENSE(GPL); MODULE_AUTHOR(A Developer); MODULE_DESCRIPTION(New style LED char device driver); MODULE_VERSION(1.0);這個(gè)文件保存為led.c和后面的 Makefile 放同一目錄。加載后write一個(gè)1或0進(jìn)去日志里會(huì)打印led state - 1或led state - 0。換成真實(shí)硬件時(shí)只要把led_set_state里的占位代碼替換成實(shí)際的點(diǎn)燈/滅燈操作即可字符設(shè)備那套框架完全不用動(dòng)。5. Ubuntu20.04 上編譯模塊KDIR 與 Makefile 是關(guān)鍵5.1 本機(jī)編譯與交叉編譯的取舍Ubuntu20.04 在驅(qū)動(dòng)開發(fā)里通常有兩個(gè)角色。如果你只是想在 x86 主機(jī)上驗(yàn)證字符設(shè)備框架直接用本機(jī)內(nèi)核頭文件編譯模塊insmod到當(dāng)前系統(tǒng)就能測。如果你手上有 ARM 開發(fā)板需要把 Ubuntu 當(dāng)作宿主機(jī)給目標(biāo)板交叉編譯.ko文件。本機(jī)編譯需要安裝內(nèi)核頭文件最簡單的方式sudo apt update sudo apt install linux-headers-generic裝完后一般指向/lib/modules/$(uname -r)/build目錄。uname -r查看當(dāng)前內(nèi)核版本如果頭文件版本和當(dāng)前運(yùn)行內(nèi)核不一致編譯時(shí) vermagic 對不上insmod時(shí)會(huì)拒絕加載。這一點(diǎn)在升級(jí)內(nèi)核后特別容易踩舊頭文件還在但當(dāng)前內(nèi)核已經(jīng)換新版本了。交叉編譯則要準(zhǔn)備目標(biāo)板同版本的內(nèi)核源碼并且該源碼目錄已經(jīng)完成配置。這個(gè)源碼目錄就是 KDIR編譯出的模塊和開發(fā)板內(nèi)核的 vermagic 必須完全一致否則加載時(shí)報(bào)version magic不匹配。所以內(nèi)核源碼版本要和開發(fā)板燒錄的內(nèi)核版本嚴(yán)格對應(yīng)最好直接用制作內(nèi)核鏡像時(shí)的那份源碼。5.2 Makefile 模板外部模塊的 Makefile 是一個(gè)固定套路核心是調(diào)用內(nèi)核構(gòu)建系統(tǒng)obj-m : led.o KERNELDIR ? /lib/modules/$(shell uname -r)/build PWD : $(shell pwd) all: $(MAKE) -C $(KERNELDIR) M$(PWD) modules clean: $(MAKE) -C $(KERNELDIR) M$(PWD) clean-C告訴 make 先切換到內(nèi)核構(gòu)建目錄M$(PWD)指回模塊源碼目錄modules是構(gòu)建目標(biāo)。這個(gè) Makefile 里的縮進(jìn)必須是 Tab不能用空格否則 make 直接報(bào)錯(cuò)我見過太多次因?yàn)檫@個(gè)原因卡住的情況。交叉編譯時(shí)改成ARCH ? arm CROSS_COMPILE ? arm-linux-gnueabihf- KERNELDIR ? /path/to/kernel/source all: $(MAKE) -C $(KERNELDIR) M$(PWD) ARCH$(ARCH) CROSS_COMPILE$(CROSS_COMPILE) modules clean: $(MAKE) -C $(KERNELDIR) M$(PWD) ARCH$(ARCH) CROSS_COMPILE$(CROSS_COMPILE) cleanCROSS_COMPILE是工具鏈前綴Ubuntu20.04 上安裝 32 位 ARM 工具鏈sudo apt install gcc-arm-linux-gnueabihf安裝完確認(rèn)一下arm-linux-gnueabihf-gcc -v工具鏈能跑起來再繼續(xù)否則后面所有交叉編譯命令都會(huì)以command not found告終。5.3 編譯報(bào)錯(cuò)與模塊加載校驗(yàn)編譯階段最常出現(xiàn)的問題之一是頭文件找不到報(bào)錯(cuò)類似linux/module.h: No such file or directory。這通常意味著KERNELDIR指向的目錄缺少include/generated或include/linux文件簡單說就是內(nèi)核頭文件沒準(zhǔn)備好。解決方法是要么用發(fā)行版提供的linux-headers-generic要么在內(nèi)核源碼根目錄先執(zhí)行make prepare等配置步驟不能拿一個(gè)剛解壓的裸源碼目錄直接當(dāng) KDIR 用。另一個(gè)問題是架構(gòu)混亂。如果你在一臺(tái) x86 主機(jī)上編譯出了 ARM 的.ko可以先用file命令確認(rèn)file led.ko輸出里能看到 ELF 架構(gòu)信息比如ARM或x86-64。如果架構(gòu)不對多半是 Makefile 里的ARCH和CROSS_COMPILE沒起作用或者上一次編譯的中間文件殘留。換架構(gòu)之前先make clean清掉舊文件再編避免殘留的.o被復(fù)用。模塊編譯出來之后用modinfo看 vermagicmodinfo led.ko | grep vermagic這份信息和開發(fā)板內(nèi)核要一致。Ubuntu 桌面版默認(rèn)開啟了安全啟動(dòng)直接insmod可能報(bào)Required key not available那是模塊簽名校驗(yàn)沒通過。臨時(shí)測試可以進(jìn)入 BIOS 關(guān)閉 Secure Boot或者給模塊做簽名這個(gè)環(huán)節(jié)不是驅(qū)動(dòng)邏輯問題但很容易卡住新手。6. 加載、測試、排錯(cuò)實(shí)際跑一次新版 LED 驅(qū)動(dòng)6.1 insmod 之后應(yīng)該看到什么先把 Ubuntu20.04 上本機(jī)測試的完整流程走一遍。編譯成功得到led.ko然后用sudo加載sudo insmod led.ko緊接著觀察內(nèi)核日志dmesg | tail正常情況下應(yīng)該能看到led major 240, minor 0數(shù)字取決于動(dòng)態(tài)分配結(jié)果。然后確認(rèn)設(shè)備號(hào)確實(shí)進(jìn)入內(nèi)核cat /proc/devices | grep led再查看設(shè)備節(jié)點(diǎn)ls -l /dev/led如果有crw-rw---- 1 root root 240, 0 ... /dev/led說明整套鏈路已經(jīng)通了。此時(shí)用一個(gè)普通用戶訪問可能沒有權(quán)限測試時(shí)直接換成 root 或用sudoecho 1 /dev/led echo 0 /dev/led每執(zhí)行一次dmesg里應(yīng)該多一行l(wèi)ed state - 1或led state - 0。如果你在板子上接了真實(shí) LED這時(shí)候燈就會(huì)跟著亮滅。6.2 失敗鏈路排查清單我在帶人做實(shí)驗(yàn)時(shí)總結(jié)過一套排查順序按現(xiàn)象定位最快現(xiàn)象可能原因排查與解決insmod 成功但 /dev/led 不存在device_create失敗或者 udev 沒有收到事件dmesg看是否有failed to create device檢查 class_create 是否成功/dev/led 存在但 open 失敗設(shè)備節(jié)點(diǎn)權(quán)限不足或 cdev_add 順序有問題sudo chmod 666 /dev/led臨時(shí)測試寫 udev 規(guī)則做永久處理open 成功但 echo 報(bào)錯(cuò)copy_from_user失敗或 write 邏輯返回負(fù)數(shù)回到驅(qū)動(dòng)代碼檢查 fops 里 write 是否注冊成功rmmod 報(bào)仍在占用有進(jìn)程打開著 /dev/ledfuser -v /dev/led查看占用進(jìn)程關(guān)閉后再卸載加載時(shí)設(shè)備號(hào)沖突register_chrdev_region 指定的 major 被占用cat /proc/devices查詢改用動(dòng)態(tài)分配或換號(hào)特別說一下/dev/led權(quán)限問題。device_create創(chuàng)建的節(jié)點(diǎn)默認(rèn)屬主是 root權(quán)限是 0600所以普通用戶echo進(jìn)去必然被拒。臨時(shí)測試用chmod 666沒問題產(chǎn)品上建議寫一個(gè) udev 規(guī)則按 class 和 subsystem 給設(shè)備節(jié)點(diǎn)設(shè)置權(quán)限組這樣每次開機(jī)自動(dòng)生效不依賴手動(dòng)改權(quán)限。6.3 動(dòng)態(tài)主設(shè)備號(hào)對應(yīng)用透明嗎這是許多新手最后會(huì)糾結(jié)的問題如果每次加載主設(shè)備號(hào)都變那我應(yīng)用程序里寫死的mknod或者open路徑怎么辦答案是不用擔(dān)心。/dev/led這個(gè)節(jié)點(diǎn)名是device_create最后一個(gè)參數(shù)決定的和主設(shè)備號(hào)無關(guān)。應(yīng)用層打開設(shè)備用的是路徑名真正打開時(shí) VFS 會(huì)根據(jù)節(jié)點(diǎn)記錄的dev_t找到對應(yīng)的cdev所以你完全不感知主設(shè)備號(hào)是多少。這也正是新版框架的價(jià)值設(shè)備號(hào)是內(nèi)核內(nèi)部資源應(yīng)用只看到設(shè)備節(jié)點(diǎn)名。多 LED 場景就更好理解了。申請兩個(gè)次設(shè)備號(hào)device_create分別創(chuàng)建led0和led1應(yīng)用行為完全一致驅(qū)動(dòng)內(nèi)部通過iminor(inode)區(qū)分控制哪一路。LED 實(shí)驗(yàn)跑通后建議你再補(bǔ)一個(gè)read方法和ioctl把整個(gè)字符設(shè)備驅(qū)動(dòng)的骨架填滿后面寫按鍵、寫傳感器驅(qū)動(dòng)時(shí)這套框架能直接復(fù)刻。最后提醒一句經(jīng)驗(yàn)調(diào)試階段固定major241方便看現(xiàn)象但產(chǎn)品代碼里一定要默認(rèn)走動(dòng)態(tài)分配。我見過不止一次同事把測試時(shí)的固定設(shè)備號(hào)帶進(jìn)量產(chǎn)程序結(jié)果目標(biāo)板上那個(gè)號(hào)早被別的驅(qū)動(dòng)占走驅(qū)動(dòng)加載直接失敗排查大半天才反應(yīng)過來。新版這套流程看著比老版多一些代碼但每一步都可控、可回滾、可定位等你能不看模板把這個(gè)鏈路默寫出來字符設(shè)備驅(qū)動(dòng)基本上就入門了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美激情精品久久久| 99在线精品观看视频中文| 亚洲熟女乱色一区二区三区 | 日韩丨制服丨中文|在线| 97香焦色区| 美女写真| 97人人夜夜精品视频| 骚日日av| 久久风骚城市人| 熟女自慰久久久| 最新欧洲欧美日本激情网站| 激情综合五月婷婷| 中文字幕精品亚洲熟女| 99久在线精品99re8热视频在线| 吻戏激情性巴克| 一区二区三区视频在线观看免费| 免费1级a做爰片观看| 好吊色综合| 美女干逼2| 青青青青草av在线观看| 一区二区三区日韩欧美| 亚洲欧洲小说图片视频| 国产原创精品| 久久精品72| 久久综合精品一区二区三区| 粘花网06av视频| 欧美天天插| 大香蕉久| 亚洲五码一区二区三区| 鸡巴插逼视频| 亚洲乱码国产乱码精网站| 欧美五十路熟| av一区二区三区 中文| 超碰在线观看av不卡| 中文字幕av亚洲精品| 欧美资源| 色官网色综合| 国产一区二区av综合| 两性色网| 丝袜 中出 制服 人妻 美腿 中文字幕| 久久鲁夜| 久久久专区| 综合激情一一91| 国产精品色约约| 日本久久久精品电影| 国产人人干| 91日韩网站| 国产女s强制榨精视频| 亚洲色人| A片 AV一级在线播放观看免费| 国产精品免费日韩| 九九九久千久久激情蜜桃在线看 | 欧美乱伦专区| 免费A片三p视频| 男女啪啪网站免费视频| 思思在线免费视频| 高清不卡一二三区视频......| 狠狠躁AV| 久热这里| 中文字幕免费看大片| 五月天激情小说| 人妻AV 中文字幕的| 精品无人区麻豆乱码久久久| 日韩乱插| 亚洲熟妇乱女区二区三区| 人妻社区男人天堂| 97鸡把在线视频| 96久久久久| 国语av狠狠色丁香婷婷综合激情| 久操网视频| a v网站在线播放| 97色伦欧美| 久久最新视频免费观看| 撸无码不卡免费视频| 国产中出内射一区二区| 在线观看黄色电话| 天天看人人操屄犊摸阴| 91无码人妻精品一区二区三区蜜桃| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 麻豆黄色五月天| 色阁阁AV综合网| 欧洲精品二区| 黄色AAAAA欧美| 91超碰人人操| 国厂麻豆77q4| 网友自拍第1页| heyZO天然素人无码AⅤ专区| 992这里有精品| 东京热大香焦| 国产不良强奸视频免费看| 久久精品中文字幕观看| 中文一区在线日| 久久色一区| 激情文学小说一区二区| 97亚洲精品| 玖玖玖玖精品国产剧情| 精品久久久久久久久久久久 | 色欧美天天| 香蕉大久久久| 青椒国产97在线熟女| 麻豆影音天美视频| 高清孕妇孕交| 九九玖玖精品| 日韩在线观看三级电影| 人妻啊啊人妻啊| 久久骚| 操逼操2| 黑丝少妇在线观看| 91成人精品| 免费综合亚洲中文| 91精品网站| 久久久久亚洲Aⅴ无码| 肥臀熟女福利视频一区二区| 精品欧美老熟女一二区| 黑丝日韩av丝袜av| 一区二区视频在线播放| 欧美性视频二区三区| 欧美日本中字另类在线| 国产青青美女玩逼视频| 情色五月天就去干| 盗摄 精品 另类 一区| 99福利社| 欧美一级A片在线看视频性色| 免费99精品国产自在在线| 人人操人人搞人人草| 少妇与黑人高潮在线| 人人爱人人乐人人操| 无码人妻丰满熟妇奶水区毛片| 婷婷爽人人婷婷爽视频| 91扒丝袜综合在线| 免费a在线播放v| 91欧美少妇| 91粉嫩萝控精品福利网站_精品影音先锋国 | 屌色在线97视频| 一本色道久久综合精品婷婷| 激情综合五月| 亚洲国产91精品一区二区久久| 青青草成人视频在线观看二区| 亚洲精品尤物yw在线影院| 天堂伊人久久| 99久久99久久综合| 沈阳熟女高潮对白视频| 日韩人妻精品| 长长久久曰曰夜夜成人网| 狠狠操狠狠操操| 丝袜狠狠草尤物人妻av91| 国产极品粉嫩馒头一线天av| 快播久久人人aV| 国产美女mm131爽爽爽爽| 啪啪啪综合| 亚洲网自拍| 99久久久er直播网址| 在线 欧美 亚洲| 污啪啪啪视频| 岛国色情视频在线观看| 综合色一区三区二区| 特级大荫道BBwBBwBBW| 国产极品精品美女视频| 97超碰站| 在线 欧美 亚洲| 成人综合色网| 亚洲成人无码影院| 免费精品无码一级毛片牛牛影视 | 97国产高清视频在线观看| 男人天堂导航| 亚洲视频二区| 亚洲熟妇熟在线电影视频| 欧美性巨大╳╳╳╳╳高跟鞋| 激情欧美97| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 亚洲少妇自拍中文字幕懂色| 综合网亚| 98色网| 日韩乱伦影音先锋| 麻豆国产97在线| 97亚洲自在精品在线观看| 久久超碰亚洲人| 天天爽人人综合免费7799| 立川理惠被中出无码| 快播电影网日韩新片| 五月天色电影| 欧美在线大香蕉| 猛交交| 国产福利小视频高清在线观看| 熟妇综合一区二区三区| 欧美日韩小说| 人人妻人人玩人人澡人人爽| 超碰97综合网| 久久九操在线观看| 夜夜福利| 日本超碰97日韩精品人妻| 日韩另类色图| 日本三级久| 强奸乱伦动态污图免费 | 丝袜美腿诱惑亚洲欧美视频在线观看| 日韩性爱再线视频| AV网站高清无码在线观看| 欧美日韩中文视频播放| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 亚洲中文字幕熟女少妇一区二区| 精品美女人人干| 美日韩一二三区| 亚洲另类久操网| 女同在线视频一区| 亚洲,欧美,春色,另类| 大香蕉乱伦视频网| 亚洲国产欧美中日韩成人综合视频| 凹凸视频在线观看伊人| 亚洲日韩精品在线播放| 免费一级毛片在线视频观看| 极品极品色影院| 日本三级R| 狼人久草| 91粉芽高清在线一区二区| 日日夜夜干| 91爱综合| 好看的91视频| 色在线69堂| 国产热av| 男人久久天堂| 999精品国产高清一区二区| 老熟女乱伦片| 亚洲精品国产熟女久久久久久| www.大香| www超碰| 婷婷综合在线| 91在线免费观看处女| 亚洲五区熟女| 超碰97在线中文| asc国产精品| 久超碰这里只有精品| 99热精品在线观看| a片自拍直播视频| 久久伊人亚洲AV无码网站| 人人潮人人摸| 综合色播| AV天堂电影网| 中文熟女五十乱码在线| 啊啊啊啊啊啊啊啊在线观看| 人人操人人插 - 百度 - 百度| 日韩人妻播放| 91在线页| 国产精品午夜福利视频| 欧美色图电影| 围产精品一区二区三区视频播放| 天天拍天天操| 视频黄站| gogogo免费高清看中国国语 | 亚洲九九视频| 日本潮催一卡操| 国产精品久久久久久久久AV大片| 日本熟妇熟色97一本在线观看| 亚洲永久AV无码精品秋霞| 九九免费影片| 日韩免费中文字幕视频| 人人插人人搞人人操| 久久精品亚洲东京热色播| 青青草久久在线| 9久热这里只有精品| 高清在线不卡一区二区 视频| 99视频精品| 国产精品久久久777| 人人妻人人爱人人玩| 亚洲日韩精品一区视频在线| 欧美性爱一内片一区二区三区| 亚洲欧洲激情| 涩综合导航| 嗯啊不要在线| 亚州欧美在线| 日本熟妇人妻中出视频| 四虎国产成人精品免费一女五男| 欧洲亚洲人妻无码高清久久三区四区| 欧美日韩日产免费网站看| www.超碰| 91bbbbbb| 中文字幕在线免费观看视频| 亚洲国产青青| 综合欧美日本三级| 麻豆天美在线喷水AV| 一区二区三区免费视频入口| 久久久久久久久久久六六| 丰满欧美放荡少妇在线| 第一高清av中文字幕| 久久99精品九九久久久婷婷| 国产免a费看黄片在线| 亚洲永久AV无码精品秋霞| 女生91网站| www.五月天| 91蜜桃传媒精品久久久一区二区| 国产一区二区三区精品观看啪| 东京热精品97综合网| 男女做爰猛烈动高潮A片免费应用| 欧美亚洲综合色| 91日韩网站| 亚洲成人久久美女| 91日韩网站| 欧美日韩91| 蜜桃久久一区| av天堂影视中文在字幕在线中文 | 少妇xx精品| 91AV天美在线视频| 国产精品久久久久久无码红治院| 超碰97在线中文| 丰满岳乱妇一区二区三区| 丝袜综合| 免费成人在线熟妇网| 亚洲暴力强奸AV| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 91狠狠| 操香逼| 人人艹亚洲| 超碰久在线天天做| 色小视频蜜乳| 欧美一级在线观看成人| 久久成年精品| 操操逼操操逼操操逼逼| 97精品在线| 亚洲色图欧美色图另类图片| 美女露胸露屁股| 日韩猛交| 欧美伦乱爱| 亚洲蜜桃V妇女| 日韩精品人妻中文字有码在线| 久久久亚洲Av| 美女t无毒不卡不卡| 久久久精品国产亚洲伊人| 久久久97| 欧美线天码中字| 精品玖九九久| 久久伊人网视频一区二区三区| 欧美精品一区二区少妇免费A片| 精品二区三四区五电影| 青青青国产| 成人精品一区二区91毛片不卡| 综合大香蕉美。| 亚洲人精品久久久喷水| 国产色精品午夜大片| 91日韩国产欧美亚洲另类精盘州至城都| 67194无码不卡| 日韩一性一交一A片俄罗斯| 欧美色网络| 亚州高清色综合| 综合久| 九热中文字幕| 大香交| 狠狠操狠狠| 日韩免费a级毛片无码a∨| 欧美日韩97在线| 后入 亚洲 美女 射| 一类无码操逼视频| 26uuu久久| 日本久久精品| 清纯唯美激情四射| 亚欧洲日韩国产精品| 福利在线黄片| 久草草一二三四区久久| 精品黑人一区二区| 蜜臀久久99'精品久久久| 懂色aV一区二区天美传媒| 成人麻豆av电影网站| 久久久久女教师免费一区 | 激情无码日韩| 一级A片女人高潮叫床| 99热免费精品| 欧美人妻精品一区二区| 久久一二三四不卡| 多毛小伙内射老太婆| 人妻在线臀日韩| 人人摸.人人色| 97这里都是精品| 91爽啪| 国产女人成人精品视频| 2019天天干天天操| 岛国视频一二三区| 精品无码久久久久久久杏吧| 快灬快灬 一下爽蜜桃在线观看| 久草精品一区| 狠狠操狠狠燥| 91九色丰满高潮| 亚洲欲| 亚洲美女 晚间男人天堂 | 日韩 成人 有码| 日日夜夜干| 国产久久久久久久久一区二区 | 操美女人妻| 手机av天堂久久久久| 一区二区日韩欧美久久| 欧美 亚洲 综合 制服| 黄污污污污| 91蜜臀熟女| 99国内精品| 九九玖玖精品| 日韩图区| 无码二级三级| 久久免费少妇| 国产福利电影| 精品在线观看视频在线| 久操婷婷| 国内黄色精品| 国偷自 一区| 青青五月天| 欧美写真视频一区| 亚洲欧美国产中文视频| 一级黄色视频网| 久久性爱大全| 视频二区美腿丝袜制服人妻欧美| 俺去久久| 色网综合网| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 97人人夜| 69XX一中文字幕人妻91| 在线综合色| 九月婷婷综合| 大香蕉色网| 我爱操| 亚洲精品人体| 日韩国产乱子伦App| 久久久国产三级黄色片| 久久亚州高清| 欧美,日韩,中文,另类| 9丨久久九九九| 久草免费福利在线播放| 欧美精品四区| 国产情色在线| 免费AV中文网在线观看| 在线性黄高清免费视频| 亚洲少妇在线影音| 老鸭窝成人免费毛片视频| 7777奇米影视久久| 婷婷久草一区二区三区| 俺也射| 麻豆视频国产一区二区| 国内91熟女人妻丝袜天天精品视频在线| 久久神马影院| 日本加勒比无码专区| 手机在线中文字幕国产| 97舔舔| 噜噜噜噜天天狠狠| 高清国产成人无码| 人妻天天爽夜夜爽精品2| 国产精品69久久久久久久| 四虎国产精品永久入口| 色女网日韩| 亚洲校园激情| 天堂8在线新版官网| 干B| 国产在线综合网| 99色在线视频| 91 亚欧| 久久精品国产亚洲AV片多多| 综合网久久| 国产高清亚洲日韩一区| 后X久久| 天天欲望网| 国产超碰| 日韩电影免费网站麻豆视频| 亚洲欧洲精品视频发布| 啊啊啊久久久视频| 久久av成人无码免费| 久久鲁夜| 欧亚乱色熟女一区二区| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | AV九九| 欧美后入式| 国产又粗又长又爽又色| 国产精品久久久久999| 日韩性爱毛片操骚逼| 免费9 1久久| 91国产操逼视频| 91女神在线视频| 久久78| 欧美18禁91| av毛片aaaaa免费看| 18精品一区| 婷婷色色五月天福利| 亚洲精品丝袜| 亚洲导航深夜福利| 天天操熟妇| 大香蕉综合在线| 91欧美www| 亚洲男人的天堂亚洲| 哈哈操电影| 欧美性猛交美女自慰91| 国产欧美在线观看免费观看| 亚洲免费97免费| 噜噜噜在线视频| 青青草中日韩在线| 玖玖婷婷五月天| 亚洲天堂久久久久久粉红视频| 亭亭丁香激情| 可以免费观看的日韩av毛片| 色哟哟av| 精精夜夜| 国产精品久久久久中文字幕| 欧美三四五区| 情色五月天久久久| 日韩乱伦视频| 亚洲人妻久久| 后入式在线免费观看60秒| 囯产操逼片| 欧美se综合| 后入内射蜜桃臀| 无码丰满熟妇一区二区浪潮AV| 职场同事知名国产国产精品久久欧美日韩 | 成人贴图日韩欧美| 国产女人和拘做爰视频 | 色欲三区| 超碰人人干天天射| 精品乱子一区二区三区99| 日本一区二区不卡精品| 91久久| 亚洲综合射| 国产精品老熟女一区二区| 一区操逼日比视频| 91丝袜在线观看| 欧美高潮| 白丝AV网站| 色色五月天激情| heyZO天然素人无码AⅤ专区| 97神马久久| 男人的天堂在线| 男人亚洲91首页在线| 温婉少妇玩3p| 操婢日韩| 亚州综合网| 99热这里只有精品1| 日本三级小说中文字幕| 国产超碰在线| 爆操无码| 18禁的网站在线| 91福利网在线观看| 97免费在线观看| 青青青草原| 色综合99999| 99re这里只有精品3| 超碰在线人妻| 激情五月天丁香社区| 啪啪啪东京| 色激情综合网站| 亚洲精品欧洲色| 疯操AV| 日日玩天天干| 一区二区播放| 天天操熟妇| 风骚少妇视频中文字幕| 精品人妻一区二区三区夜夜| 蜜臀精品1区2区| 99re9在线| 99自拍视频| 国产动漫操逼视频| 欧美亚洲日本激情在线| 成人美女av| 日韩精品亚洲专区在线影视| 国产女人操逼视频| 大香网站| 日本在线视频导航| 韩国一级做A片免费的| 国产乱码精品久久久久久| 欧美熟妇乱码在线一区| 99re69综合| 97人人中文网| 中文字幕-区二区三区四区视频中国| 国产精品久久发布| 中文字幕制服欧美久久一区| 色狠人在线99| 国产欧美成人精品| 99最新日韩偷拍视频| 久久亚州大香蕉| 蜜臀网址在线| 欧美一二三| 在线日韩日本亚洲国产| 欧美性爱日韩高清| 国产性久久久| 3p国产色噜噜一区| 色99色| 国产亚洲 中文欧美久久| 亚洲天堂性爱| 免费看污网址| 91模特在线观看| 国产精品一区二区三区免费视频| 日产操逼| 亚洲高清无码在线桃色| 九九Av| 亚洲最大的黄色电影网站。 | 操高情无码| 国产高清无码一区二区三区四区皇冠| 9久久精品| 亚洲日韩肥臀视频在线观看| 色天堂综合| 天天综合网视频91| 可免费观看的av毛片中日美韩| 亚洲图片日本AⅤ欧美在线| 亚洲αv一区二区三区| 婷婷操逼| 麻豆伊人网| 熟妇一区,二区,三区。| 粉嫩av在线| www.99中文字幕| 婷婷爱五月| 国产九区| 中文久久久| 国产午夜无码片在线观看影视| 长长久久免费视频| 97网址97| 亚洲电影中字一区二区| 精品超碰国产| 999综合色| 97亚洲中文| 日韩欧美成人性爱在线| 日本91白丝| 中文字幕精品亚洲熟女| 涩综合导航| 成人精品在线观看| 国产熟女完整版中字| 成人欧美一区二区三区黑人一| 欧美熟女妇同| 九九碰九九爱97超碰| 国产精品久久久久久 百度| 91 国产丝袜在线放观看| 骚日日av| 围产精品一区二区三区视频播放| 欧美色图片91| 久操精品| 久久久久人妻| 日韩天天综合| 熟女视频久久| 视频黄站| 婷婷丁香五月天综合东京热| 10000部十八禁看电影| 女性91网站| 可以免费观看的AV| 欧美图片校园春色| 日本一级性爱| 久久久9 9 9精品| 性色生活片久久毛片婬片免费放女人一级毛片| 夫妻四区五区六区| 久久精品国产亚洲AV先锋| 这里只有精品视频在线| 日韩欧美麻豆| 黄色av一区二区在线| 日韩av电影网站| 亚洲男人综合| 九九无码| 亚洲熟妇A V黑人| 欧美一级色| 蜜桃臀av一区二区| 97干在线| 手机在线大香蕉| 六月色婷婷| 青草一区二区| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 岛国999| 久操视频资源站公开| 91久久久久久久| 夜色AV无码手机在线影院| 亚洲国产蜜臀系列在线观看| 欧美性爱系列| 欧美美女视频| 久久久9视频| 人妻一区二区三区视频 | 国产一区二区免费福利片| 91av天美性媒精品视频| 啪啪免费| 视频二区美腿制服人妻欧美| 情色AV电影| 免费中文综合精品| 国产久久男人天堂| 五月天亚洲网| www.久久| 级做a爱无码性色永久免费| 在线一区| 狠狠操狠狠插| 久久黄片国产一区二区| 九九九九97| 夜夜操二区| 欧美精品一区二区少妇免费A片| 亚洲性猛| 麻豆天美国美国产| 约操熟妇| 欧美第二页| 色老牛| 粉嫩绯色AV一区二区在线| 国产精品熟妇一区二区三| 一级片在线观看高清无码| 亚洲中字慕不卡| 欧美日日网| 色婷婷视频| 国产精品96久久久久久| 伦在线97| 大香蕉碰碰| 在线国产福利网址导航| 欧美黑人熟妇精品91| 麻豆激情综合| 亚洲熟妇自偷自拍另欧美| 中文日本免费高清| 亚洲人妻爽爽爽| 久草在| 久热伊人99re| 欧美精品1区2区3区| 亚洲欧美高清无码| 日韩欧美麻豆| 粉嫩小泬久久久一区二区| 免费观看欧美日韩操逼视频| 久久久久亚洲?V片无码V| 国产传媒日韩| 999热日韩精品| 欧美国产一区二区三区麻豆传媒| 五月花婷婷| 日本五十路熟女一区二区| 污色区网站| 丰满人妻-区二区三区免费看| 日韩丝袜高跟制服在线观看| 黄色大片一区二区密桃丝袜| 日日操天天操| 欧美日韩国产色图在线| 一起草欧美| 亚洲伊人久久综合97| 欧美大的香蕉有线电视视频| 精品9999| 99在线啪| 色综合超碰超| 9久久美女首页| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠 | 男人天堂综合| 69综合网| 操人妻逼91| 夜夜高潮夜夜爽| 亚洲欧美九九| 嗯嗯,啊啊,国产精品| 日韩人妻大香蕉| 91粉嫩萝控精品福利网站_精品影音先锋国 | 99少妇| 日韩本不卡视频在线观看| 中文字幕精品专区搜索结果91| 久久久99999久网站| 人妻无码久久一区二区三区免费| 久偷拍| 欧美aⅴ99久久黑人专区| 午夜天堂精品久久| SS久久| 97天天弄| 日韩精品一区,二区 九九...老司机| 青青草字幕AV| 久久偷偷色综合蜜桃| 国产自啪精品视频网站黑丝| 久久久神马影院| 久草毛片| 加勒比中文av| 东京热一区二区中文字幕| 襙一襙| 国产曰批免费观看久久久| 成人八戒网站| 色五月婷婷色| 97色五月天完| 亚洲吊色| 日日玩天天干| 97国产超碰| 黄人人操人人操| 波多野结衣先锋影音| 99精品成人免费看| 最新欧洲欧美日本激情网站| 欧美最婬乱婬爆婬性视频| 欧美熟女妇同| 天天干夜夜操一区二区| 国产91 丝袜在线播放00-百度| 91这里只有精品| 一级毛片久久久久久久女人18| 九九国产热| 亚洲,欧美,综合网| 超碰在线一区| 这里只有精品视频在线观看麻豆| 中文字幕av乱伦| 亚洲性综合9| 亚州中文字幕超碰97| 中日韩久久久免费看| 囯产精品久久久久久久久久二区三区| 超碰97人人cao| 国产成人无码高清| 日本天天人人狠狠在线日美女 | 亚洲精品影视老司机| 九九久久综合| 秋霞午夜视频一区二区| 97精品全部| 俄罗斯一区二区视频在线观看| 免费综合亚洲中文| 蜜臀人妻少妇久久在线观看| 日韩精品资源| 免费a级毛片av无码久久精品中文字幕| 中文字幕日韩人妻视频一区二区三区 | 99r九九| 中文字幕欧洲有码| 日韩偷拍一区二区三区 | 97在线视频网站| 国产av又色又爽又黄| 国产女人高潮视频| 精品无码一区二区三区| 综合av社区| 97色伦欧美| 国产日韩中文字幕欧美| 亚洲国产成人精品999| 日本一级一级一级一级| 99热大香蕉伊在线| 无码人妻一区二区三区色欲aⅴ | 极品美女嘿咻| 2019久久久久久久久福利| 另类图片五月天| 嫩草 我啊~嗯~在线| 亚洲电影中字一区二区| 啊啊啊操一区| 午夜操操操| 色综合av男人天堂| 91性高| 性爱网站一区二区| 九九九网页| 亚洲精品少妇| av九九| 大香蕉手机在线| 日本高清_区二区三区| 磁力99AV| 国内精品久久人妻性色av| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 国产人伦a片信息免费片| 打av高清| 一级AV性爱| 91色综合激情| 插入逼91| 欧美激情 日韩精品| 日韩兔费看黄片| 久久久影院| 免费岛国一级片| 后入 亚洲 美女 射| 97色碰| 高清不卡一二三区视频......| 综合久久97| 少妇无码太爽| 国产精品内射婷婷一级二| 欧美久久草熟女| 久久久久九九九九| 高凊专区人人操| 中英熟女操女| 自拍视频大全亚洲专媒视频/一区二区三区 | 日本孕妇一区二区视频操逼免费看 | 亚洲精品一二三四区| 乱欲视频| 九九久久99| 操操逼操操逼操操逼逼| 亚洲午夜蜜臀| 五月婷婷丁香六月| 亚洲精品97| 性生活久久久久久久久久| 国产精品毛片?v一区二区三区| 四虎在线播放| 亚洲欧美激情在线视频| 天天爱天天操| 国产性感在线观看| 久久精品国产亚洲AV无码做| 天美久久久久| 免费国产电影一区二区| 97超碰国产亚洲精品资源| 超碰美国| 男人天堂2019亚洲| 神马麻豆福利院| 五月丁香六月婷| 久久9免费视频| 啊视频在线| 女人精品内射国产99| 久久综合女优| 亚欧性爱在线无码| 青青草国产欧美非洲黑人| 亚洲成人精品久久久| 亚洲成?V人片在线观看福利| 亚洲中文字幕熟女少妇一区二区| 九九玖玖精品| 秋霞蝌科网日本一区| 亚州综| 精品v1区| 欧亚免费视频| 大象AV在线| 99热国产精品| 97AV爱| 久久香蕉综合一本到3atv| 91老熟妇| 亚洲se电影| 韩国轻伦国内自拍一区| 五月丁香社区婷婷日韩欧美精品影院 | 97爱爱影院| 人人扣人人操| 在线岛| 欧美综合第一页| 1024午夜激情男人的天堂| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 久久人人爽爽人人爽人人片αV| 亚洲综合嫩| 欧美午夜视频| 欧美亚洲性爱一区二区| www.人人cao| 日韩综合成人免费视频| 啊啊啊啊啊啊在线| 国产后入清纯| 亚洲天堂第一页| 色色99| 欧美成人黄网色网站| 另类TS人妖一区二区三区| 九热久| 四虎影视国产精品| 日韩精品大香蕉伊人在线| 色噜噜国产在线| 九九伊人网| 欧美日韩 强奸乱伦| 日韩强奸av| 日本一区不卡| 美女啊啊啊啊啊啊| 五十路熟女,国产欧美精品区一区二区三区 | 大香久久| 日韩AV噜噜噜一区二区三区四区| 欧洲精品久久| 国产日韩人人| 躁躁日曰躁2020| 99久久无色码| 日韩AV电影网站 | 亚洲久久久久| 国产精品久久久久久久久久久久久久| 欧美色道啊| 超碰碰小说97| 啊啊啊好疼| av线电影| 亚洲成人无码影院| 岛国大片国产| AV一区观看| 日韩欧美午夜一区二区| 综合久久久久久久久91| 襙一襙| 2019精品国产无码成人| 国产无码精品无码| 最新无码国产| A一区片| 国模私拍一区二区三区神乳| 久久久精品中文字幕爱豆| 久久久久亚洲熟妇熟女| 日本精品中文字幕视频| 日欧操屄| 新久久AV| 欧美性巨大╳╳╳╳╳高跟鞋| 国产精品一级毛片不卡视| 探花熟女,姿勢到位,體驗感也到位| 草草影院最新网址| 日韩不卡毛片Av免费高清| 在线可观看的黄色网址| 国产超碰| 亚洲综合小说另类图欧美视频激情小说色五月天 | 91久久久久久| 色妺妺在线视频| 亚洲五区熟女| 日韩中文字幕宗合在线| 天美久久久久| 国产女人视频三四五区| 大屁股人妻女教师撅着屁股| 欧美激情另类一区二区| 亚洲欧美日韩夜夜| 欧美天天插| 岛国人妻少妇av在线观看| 色偷综合| 91丝袜视频在线观看| 欧亚无码视频| 亚洲色 国产 欧美 日韩| 国产亚洲在线观看| 夜夜狼人妻| 黑人干亚洲| 熟女人妻精品一区二区视频| 欧美十八禁视频| 日韩AC| 91人妻视频在线| 91国产在线精品| 97超碰欧美精品| 免费一级性爱久久| 亚洲经典啪啪| 中文字幕乱碼在线| 久久是精品| 免费国产视频| 精品一区二区成人| 日韩97超碰中文字幕| 白 大 人妻 区 在线| 精品美女少妇一区二区| 日韩一级性爱无码| 激情专区综合| 大香蕉色网| 亚州欧美另类| 天天做日日做| 欧美乱色| 一区e区三| 久久久久久久久久久免费精品| 久草大| 啊啊啊啊操死我了| 78久久| 人人干人人操人人..com| 国产在线不卡导航| #NAME?| www.伪伪| 欧美成不卡网| 91精品导航| 日韩在线观看字幕精品| 草b在线| 大香蕉线| 日韩黄色成人性爱| 美女干逼2| 麻豆三极片| 久99| 美女丝袜激情小说| 操操逼视频| 国产原创精品| 超碰97COm中文| 亚洲图片偷拍视频区| 日日噜噜夜夜久久亚洲一区二区| 一区二区乱码福利| 九九热精品在线| 国产91专区| 国产精品久久久久久无码红治院| 久久综合18p| 加勒比海人人操超碰在线| 久久一级无码精品毛片6| 欧美日韩精品国产91| 最新亚洲黄色免费电影| 首页亚洲国产高跟丝袜诱惑视频| 福利五区| 尤物一级在线免费观看| 91精产一区二区三区| 国产a片操逼| 97 国产一区| 亚洲精品一区二区精华| 天堂资源欧美| 91久久久亚洲| 91老司机在线视频免费观看| 亚洲有码视频二区| renqi久久久久久久久久久久| 南澳成人一级片在线播放| 男女一级A片大黄,一进一出| 自拍啪啪视频| 国产又色又爽又舒服的三级视频| 欧美在线干| 人妻熟女av国产网站| 老鸭窝在线视频播放| 丁香婷婷啪啪| 91白虎| 狠狠中文字幕| 97精品一区二区视频| 日日干夜夜操视频h| 中文色综合| 黄色片G G G| 久久精品国产72国产精品福利| 9ⅰ久久久天天| 国产热RE99久久6国产精品首| 欧美草草高清日韩视频| 亚洲日韩一区电影| 亚欧色图在线激情| 美女淫穴| 99性爱在线观看| 夜夜黄| 天天影视网综合少妇| 欧美精品久久96人妻无码| 一区二区三区蜜桃成人撸久久东京热| 在线岛| 亚洲综人网| 国产欧美日韩在线观看麻豆传媒公司 | 欧美日产国产在线成人第一区| 一二三四视频在线社区中文字幕| 亚洲中文国际强奸字幕| 蜜臀99久久精品久久久久久| 欧美熟女少妇| 亚洲无码太久| 蜜臀在线网站| 亚洲s在线观看| AAAAAAAAA黄片| 99久在线精品99re8蜜桃| 久操B网| 国产白嫩漂亮KTV在线| 玖玖久久久| 乱老熟女一区二区三区| 日本精品第一视频在'| 国产精品九九九| 一区二区国产视频在线观看| 9999久久久久| 你懂的在线观看区国产| 台湾佬中文娱乐网久久久久久久久久com| 国产精品大香蕉| 欧美亚洲一级在线观看| 色淫网站优优视频| laoshunv91| 久久久蜜桃一区二区三区| 天天综合网日韩7799| 日本综合色图| 超碰视97中文| 精品免费1| 国产AV高清AV无码| 亚洲精品一区二区精华| 东北老熟女| 目产99999久久999| 久久午夜伦| 操逼视频亚洲| 日韩三级在线观看网站| 殴美色网| 亚洲色图 图片| 亚洲AV无码| 日本九九九九| 精品国产丝袜一区二区三区乱码| 美女诱惑一区| 蜜臀网址在线| 天天综合网~91综合网| 久久精品视频久久久| 日本九九九九| 黄色小视频日本txt| 无码一区免费在线不卡| 欧美亚洲手机在线| 土豪酒店各种姿势玩弄极品幼稚| 熟妇视频一区二区三区在线观看| 99色色网| A片三级无码| 美女尤物人人操| 国产精品不卡一区二区三区av| 亚洲国产天堂| 天堂av最新电影网| 久久日本熟女精品一区| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 国产高清免费不卡av| 亚洲无码 国产无码| 9久久精品| 欧美日韩小说| 日韩欧美久久婷婷网站| 久久宗合亚洲| 综合天天网| 日韩三级在线观看mp4| 国产人伦精品一区二区三区| 国产精品人妻熟女aⅴ| 天美传媒国产原创中文字幕亚洲欧美另类| 乱伦日本色图AⅤ| 亚洲一级性爱视频免费看| 特级特黄一级毛片免费| 99re免费视频精品全部| 亚洲日韩人妻中文字幕一区| 天天综合网91| 五月亭亭六月丁香| 欧美激情久操网| 国产在线观看一区二区三区| 青春草莓视频在线观看网址| 国产又黄又爽| 色呦呦国产精品免费看| 中日韩一区二区三区欧美| 亚洲第一页第二页激情| 18禁止看精品中文字幕| 中文字幕高清精品一区| 成人一级性爱| 强奸乱伦Av网| 亚洲黄网在哪免费看| 在线国产探花| 亚洲va综合va国产va中文| 中文字幕第页| 99爱久久视频频| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 91婷婷伊人狠人| 欧美专利1区2区3区4区5区免费| 亚洲国产剧情少妇激情|