新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LonWorks現場總線設備驅動設計與實現

        LonWorks現場總線設備驅動設計與實現

        作者:劉 廣 石婷婷 時間:2008-06-04 來源:中國測控網 收藏

          (2) 設備標識方式

        本文引用地址:http://www.104case.com/article/83666.htm

          設備由一個主設備號和一個次設備號標識。主設備號唯一標識了設備類型,即設備驅動程序類型,它是塊設備表或字符設備表中相應表項的索引。次設備號僅由設備驅動程序解釋,一般用于識別在若干可能的硬件設備中,I/O請求所涉及到的那個設備。值得一提的是次設備號還可以被分成幾個部分用來區分子設備驅動程序和具體的設備。

          (3) 設備驅動程序組成部分

          設備驅動程序可以分為三個主要組成部分:

          ●自動配置和初始化子程序。負責檢測所要驅動的硬件設備是否存在和是否能正常工作。如果該設備正常,則對這個設備及其相關的、設備驅動程序需要的軟硬件進行初始化。
          
          ● 服務于I/O請求的子程序。它們主要是對file_operations結構的各個入口點的實現。這部分的實現支持了文件系統的調用(如open,close, read等等)。
          
          ●中斷服務子程序。在Linux系統中,并不是直接從中斷向量表中調用設備驅動程序的中斷服務子程序,而是由Linux系統來接收硬件中斷,再由系統來調用中斷服務子程序。

          但是,這三個部分不是必須在每個驅動程序中必須具有的。

          3.3  現場總線網卡驅動程序

          研究了Linux的設備管理以及設備驅動程序實現方法后,我們來設計現場總線設備驅動程序,并對實現中的一些關鍵問題進行探討。

          (1) 現場總線網卡驅動程序

          在驅動程序設計和開發中,我們一定要注意的問題是機制(Mechanism)與策略(Policy)的分離。這里所謂的機制是指我們的驅動程序提供的接口應該很忠實地反映設備的原始功能(bare function),而與應用無關。而策略是指一旦這個設備驅動程序為設備機制提供了相應的軟件接口,那么應用程序開發人員就能按照特定的方式使用機制接口。可以說,在內核驅動程序開發過程中,所設計的數據結構,以及確定的接口命令都是為以后的應用策略提供的一種機制。而如前所述,這種機制在Unix類系統內部是通過一組固定的入口點來提供的。由于我們要開發的設備驅動程序是一個字符型的設備,所以接下來我們首先分析字符型設備驅動程序中常用的入口點:

          ● open入口點
          
          打開設備準備I/O操作。對字符設備文件進行打開操作,都會調用設備的open入口點。open子程序必須對將要進行的I/O操作做好必要的準備工作,如清除緩沖區等。如果設備是獨占的,即同一時刻只能有一個程序訪問此設備,則open子程序必須設置一些標志以表示設備處于忙狀態。

          ●release入口點
          
          關閉一個設備。當最后一次使用設備終結后,調用release子程序。獨占設備必須改變前由open子程序設置的標志,以便設備可再次被使用。

          ●read入口點

          從設備上讀數據。對于有緩沖區的I/O操作,一般是從緩沖區里讀數據。對字符設備文件進行讀操作將調用read子程序。

          ●write入口點

          往設備上寫數據。對于有緩沖區的I/O操作,一般是把數據寫入緩沖區里。對字符設備文件進行寫操作將調用write子程序。

          ● ioctl入口點

          執行讀、寫之外的一些硬件控制操作。

          ●poll入口點

          把對許多非阻塞操作的設備描述符集合起來,等待事件的發生,以便于集中檢查,看數據是否可從設備讀取或設備是否可用于寫數據,這樣就做到了所謂的多路復用。

          以上入口點構成了設備驅動程序的三大組成部分中I/O請求的部分,在Linux中它們由file_operations結構來封裝,并不是所有的字符設備驅動程序都必須提供以上每一個入口點的實現,如果設備驅動程序沒有提供上述入口點中的某幾個,系統會用缺省的子程序來代替。

          由上面的描述可見,在內核設備驅動程序的設計中,相應的機制的提供主要是對設備入口點的選擇和設計。

                針對LonWorks現場總線網卡的特點,我們選擇并實現了五個入口點,即open, release, read,write, ioctl。

          對于open和release入口點由于設備特點,我們只需要控制設備驅動模塊在使用時,不被異常釋放即可。

          接下來,我們將描述以上設計實現中與Linux內核相關的一些調用和問題。

            (2) 對file_operations結構的初始化

          file_operations結構是Linux操作系統中用于實現驅動程序的最重要的數據結構,我們已經在前面提到過,它對Linux提供I/O請求的子程序的一系列入口點進行了封裝。該結構貫穿在整個驅動程序中,故我們在文件作用域內定義了它的一個變量,并對本程序中用到的入口點做了初始化,其代碼如下:

          struct file_operations lmdev_fops= {
             NULL,
             lmdev_read,
          //把實現的lmdev_read函數指針賦給read入口點。
             lmdev_write,
          //把實現的lmdev_write函數指針賦給write入口點。
              NULL,
              NULL,
             lmdev_ioctl,
          //把實現的lmdev_ioctl函數指針賦給ioctl入口點。
              NULL,
              lmdev_open,
          //把實現的lmdev_ open函數指針賦給open入口點。
          lmdev_release,
          //把實現的lmdev_release函數指針賦給release入口點。
          NULL,
          NULL,
          NULL,
          NULL,
          }; 
          對于lmdev-*函數的實現方法,我們將在后面做詳細的討論。 

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 绥棱县| 兴隆县| 曲麻莱县| 锡林浩特市| 克拉玛依市| 宣汉县| 乌拉特中旗| 大理市| 西青区| 鹰潭市| 江陵县| 台东市| 香港 | 乐陵市| 富源县| 察哈| 太谷县| 承德市| 台中县| 西乡县| 潼关县| 仪陇县| 井冈山市| 宁陵县| 青阳县| 互助| 南雄市| 永定县| 高阳县| 田东县| 平陆县| 武冈市| 白水县| 淮南市| 西昌市| 博客| 苏尼特左旗| 龙州县| 甘泉县| 高尔夫| 博兴县|