freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

第11章嵌入式linux設(shè)備驅(qū)動開發(fā)-閱讀頁

2025-02-19 17:43本頁面
  

【正文】 truct hd_struct **part。 /* 塊設(shè)備操作接口,與字符設(shè)備的 file_operations結(jié)構(gòu)對應(yīng) */ struct request_queue *queue。 /* 指向驅(qū)動程序私有數(shù)據(jù) */ sector_t capacity。 重要數(shù)據(jù)結(jié)構(gòu)( 2) struct block_device_operations { int (*open) (struct inode *, struct file *)。 int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long)。 long (*pat_ioctl) (struct file *, unsigned, unsigned long)。 int (*media_changed) (struct gendisk *)。 int (*getgeo)(struct block_device *, struct hd_geometry *)。 }。對塊設(shè)備的讀寫請求都是以異步方式發(fā)送到設(shè)備相關(guān)的request 隊列之中。 其中參數(shù) major為要注冊的塊設(shè)備的主設(shè)備號,如果其值等于 0,則系統(tǒng)動態(tài)分配并返回主設(shè)備號。如果出錯,則該函數(shù)返回負值。 其參數(shù)必須與注冊函數(shù)中的參數(shù)相同。 ( 2)申請并初始化請求隊列 這一步要調(diào)用 blk_init_queue()函數(shù)來申請并初始化請求隊列。參數(shù) lock為自旋鎖,用于控制對所分配的隊列的訪問。 int unregister_blkdev(unsigned int major, const char *name)。 在完成對 gendisk的分配和初始化之后,調(diào)用 add_disk()函數(shù)向系統(tǒng)注冊塊設(shè)備。 塊設(shè)備請求處理 塊設(shè)備驅(qū)動中一般要實現(xiàn)一個請求隊列處理函數(shù)來處理隊列中的請求。對塊設(shè)備的讀寫操作被封裝到了每一個請求中。中斷機制提供了硬件和軟件之間異步傳遞信息的方式。中斷實現(xiàn)了硬件設(shè)備按需獲得處理器關(guān)注的機制,與查詢方式相比可以大大節(jié)省 CPU資源的開銷。 int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long irqflags, const char * devname, oid *dev_id)。 中斷編程接口( 2) ? 其中 irq是要申請的硬件中斷號。 ? 參數(shù) handler為將要向系統(tǒng)注冊的中斷處理函數(shù)。設(shè)備 id就是在調(diào)用 request_irq()時傳遞給系統(tǒng)的參數(shù) dev_id。這個參數(shù)用于標明中斷處理程序是快速處理程序(設(shè)置 SA_INTERRUPT)還是慢速處理程序(不設(shè)置SA_INTERRUPT)。慢速處理程序只屏蔽正在處理的中斷。 ? 參數(shù) devname為設(shè)備名,會在 /dev/interrupts中顯示。一般設(shè)置為這個設(shè)備的 device結(jié)構(gòu)本身或者 NULL。 按鍵驅(qū)動程序?qū)嵗? 按鍵工作原理( 1) ? LED和蜂鳴器是最簡單的 GPIO的應(yīng)用,都不需要任何外部輸入或控制。按鍵硬件驅(qū)動原理圖如圖 117所示。 按鍵工作原理( 2) 按鍵電路的主要端口 按鍵驅(qū)動程序原理( 1) ? 因為通常中斷端口是比較珍貴且有限的資源,所以在本電路設(shè)計中, 16個按鍵復用了 4個中斷線。因此可以通過查看產(chǎn)生了哪個中斷,來確定在矩陣的哪一行中發(fā)生了按鍵操作(按住或釋放)。這時候 4個 EINT端口應(yīng)該通過 GPIO配置寄存器被設(shè)置為外部中斷端口,而且 4個 KSCAN端口的輸出必須為低電平。此時要使用 KSCAN端口組,同時將 4個EINT端口配置為通用輸入端口(而不是中斷端口)。這樣逐列進行掃描,直到按鍵所在列的 KSCAN端口輸出為低電平,此時按鍵操作所在行的 EINT管腳的輸入端口的值會變成低電平。若發(fā)現(xiàn)在KSCAN1為低電平時(其他端口輸出均為高電平), GPF2( EINT2管腳的輸入端口)變?yōu)榈碗娖?,則可以斷定按鍵K8被按住了。例如,當按鍵被按下時,其動作就像彈簧的若干次往復運動,將產(chǎn)生幾個脈沖信號。因此驅(qū)動程序中必須要解決去除抖動所產(chǎn)生的毛刺信號的問題。 $ make clean。make /* 驅(qū)動程序的編譯 */ $ insmod /* 加載 gpio驅(qū)動 */ $ cat /proc/devices /* 通過這個命令可以查到 gpio設(shè)備的主設(shè)備號 */ $ mknod /dev/gpio c 251 0 /* 假設(shè)主設(shè)備號為 251, 創(chuàng)建設(shè)備文件節(jié)點 */ 然后編譯并運行驅(qū)動測試程序。 實驗內(nèi)容 —— test驅(qū)動 實驗?zāi)康暮蛯嶒瀮?nèi)容 ? 1.實驗?zāi)康? 該實驗是編寫最簡單的字符驅(qū)動程序,這里的設(shè)備也就是一段內(nèi)存,實現(xiàn)簡單的讀寫功能,并列出常用格式的Makefile以及驅(qū)動的加載和卸載腳本。 ? 2.實驗內(nèi)容 該實驗要求實現(xiàn)對虛擬設(shè)備(一段內(nèi)存)的打開、關(guān)閉、讀寫的操作,并要通過編寫測試程序來測試虛擬設(shè)備及其驅(qū)動運行是否正常。make $ ./test_drv_load $ gcc –o test $ ./test Input some words to kernel(enter 39。 to exit):Hello, everybody! The read string is from kernel:Hello, everybody! /* 從內(nèi)核讀取的數(shù)據(jù) */ Input some words to kernel(enter 39。 to exit):This is a simple driver The read string is from kernel: This is a simple driver Input some words to kernel(enter 39。 to exit):quit The read string is from kernel:quit $ ./test_drv_unload $ dmesg|tail –n 10 …… The major of the test device is 250 /* 當加載模塊時打印 */ This is open operation /* 當打開設(shè)備時打印 */ This is release operation /* 關(guān)閉設(shè)備時打印 */ Test device uninstalled /* 當卸載設(shè)備時打印 */ 思考與練習 ? 根據(jù)書上的提示,將本章中所述的按鍵驅(qū)動程序進行進一步的改進,并在開發(fā)板上
點擊復制文檔內(nèi)容
教學課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1