基于μCLinux的USB驅動(dòng)程序實(shí)現
2.3 設備的注冊與注銷(xiāo)
設備驅動(dòng)在調用前必須首先向系統注冊,這時(shí)就執行加載函數static int_init ft245bl_init(void)。該函數的核心語(yǔ)句是 register_chrdev(ft245bl_major,FT245BL_DEV,ft245bl_fops)字符注冊函數。其中,ft245bl_major是設備驅動(dòng)向系統申請的主設備號;FT245BL_DEV是USB設備的名稱(chēng);ft245bl_fops是之前定義為 file_operations數據結構的各個(gè)功能函數的文件指針。該函數返回值為0,表示注冊成功;返回-INVAL,表示申請的主設備號非法;返回 -EBUSY,表示該設備號正在使用。設備注冊成功后,設備名會(huì )出現在系統的/proc/devices文件中。
設備有注冊就有卸載,卸載字符設備需要調用函數unregister_chrdev(ft245bl_major,FT245BL_DEV),參數有主設備號和設備名兩個(gè),USB退出驅動(dòng),用staticvoid_exit ft245bl_exit(void)函數。
2.4 編寫(xiě)相應的功能函數
對于每一個(gè)設備驅動(dòng)程序來(lái)說(shuō),都有一些與此設備密切相關(guān)的功能函數,通常對于塊設備或者字符設備來(lái)說(shuō),都存在著(zhù)諸如打開(kāi)、關(guān)閉、讀、寫(xiě)這一類(lèi)的操作。當進(jìn)行系統調用時(shí),將自動(dòng)地使用驅動(dòng)函數中特定的函數來(lái)實(shí)現具體的操作。打開(kāi)函數open()主要完成以下操作,即檢查設備錯誤(諸如設備未就緒或相似的硬件問(wèn)題),如果是首次打開(kāi),則初始化設備;讀取次設備號;分配和填寫(xiě)要放在file→private-data內的數據結構;增加使用計數。讀函數 read()用來(lái)從外部設備中讀取數據,當其為NULL指針時(shí),將引起read()系統調用返回-EINVAL(“非法參數”)。函數返回一個(gè)非負值表示成功地讀取了多少字節。寫(xiě)函數write()向外部設備發(fā)送數據,如果沒(méi)有這個(gè)函數,返回一個(gè)-EINVAL;如果返回值非負,就表示成功寫(xiě)入的字節數。當設備被關(guān)閉時(shí)調用release()這個(gè)操作,有時(shí)也稱(chēng)為close()。它應該完成以下操作:使用計數減1;釋放open分配在 file→rivate-data中的內存;在最后一次關(guān)閉操作時(shí)關(guān)閉設備。下面是FT245BL驅動(dòng)程序讀函數read()的實(shí)現:

讀取函數ft245bl_read通過(guò)判斷USB芯片RXF管腳的狀態(tài)來(lái)處理接收到的數據,如果RXF為0,表示接收緩沖區(RX FIFO)中至少有1個(gè)數據,處理器讀取一個(gè)數據后重新回到判斷;如果RXF為1,表示芯片沒(méi)有接收到數據,這時(shí)程序啟動(dòng)中斷等待事件函數 wait_event_interruptible,內核從USB設備驅動(dòng)中釋放出來(lái),運行其他程序,直到有新的數據到來(lái)時(shí),內核首先執行中斷處理函數 ft245bl_rx_handler,將中斷標志位irqflag置1,喚醒等待隊列ft245bl_waitqueue,然后再回到讀取函數中繼續運行。
2.5 中斷處理
設備驅動(dòng)程序通過(guò)調用中斷申請函數申請中斷,其格式為:

函數調用成功返回0值,返回-INVAL表示中斷號超出范圍或者handler=NULL;返回-BUSY表示中斷已經(jīng)被占用且不能共享。其中,handler是中斷處理子程序指針,中斷產(chǎn)生時(shí)自動(dòng)調用該函數;參數irq為中斷號;pt_regs為中斷發(fā)生之前寄存器的映像,很少使用;irqflags控制中斷行為。irqflags=SA_INTER-RUPT表示它在運行時(shí)將禁止所有的中斷;irqflags=SA_SHIRQ 表示共享此中斷處理程序;devname為設備名稱(chēng);dev_id用于支持中斷的共享,它將作為第2個(gè)參數傳遞給中斷處理函數,可以利用它來(lái)傳遞一些必要的信息。該中斷處理程序如下:本文引用地址:http://dyxdggzs.com/article/202492.htm
評論