色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          關(guān) 閉

          新聞中心

          EEPW首頁(yè) > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 基于μCLinux的USB驅(qū)動(dòng)程序?qū)崿F(xiàn)

          基于μCLinux的USB驅(qū)動(dòng)程序?qū)崿F(xiàn)

          作者: 時(shí)間:2010-12-16 來(lái)源:網(wǎng)絡(luò) 收藏

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


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


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

          本文引用地址:http://cafeforensic.com/article/202492.htm



          關(guān)鍵詞: CLinux USB 驅(qū)動(dòng)程序

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉