新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Linux操作系統的視頻采集卡驅動程序設計

        基于Linux操作系統的視頻采集卡驅動程序設計

        作者: 時間:2012-05-21 來源:網絡 收藏

        1 引言

        操作系統以其本身強大的性能、卓越的穩定性和開放源代碼的優點正在得到越來越廣泛的應用。設備在linux內核中扮演著特殊的角色,它們是一個個獨立的“黑盒子”,使得特定的硬件響應一個定義良好的內部編程接口,這些接口完全隱藏了設備的工作細節。用戶的操作通過一組標準化的調用執行,而這些調用獨立于特定的。將這些調用映射到作用于實際硬件的設備特有操作上,則是的任務[1]。

        本文撰寫的背景是源于我們自己開發的CDMA無線視頻傳輸系統,該傳輸系統的模塊使用Philip SAA7146+ SAA7111a,本文主要介紹linux環境下設備驅動程序的編寫。

        2 采集芯片簡介[2][3]

        開發驅動程序的第一步就是詳細了解硬件設備的規格,這樣才能具體操縱硬件,實現硬件特定的操作,因此首先介紹一下Philip SAA7146及7111A芯片。

        Philip SAA7146是PCI總線控制設備,它負責初始化并處理PCI總線上的數據傳輸,在這個意義上說它是主設備;而7111a是從設備,它只是所謂的視頻解碼器,負責將模擬視頻信號解碼為數字比特流。對于后者,只需要通過I2C總線進行編程,而不必直接控制該設備。它并不具有總線控制能力,因此不能在PCI 總線上找到它。因此7111a并不需要專門的驅動程序,它是通過主控芯片(SAA7146)經由I2C總線來驅動的,我們只需要編寫主控芯片的驅動程序即可。

        3 V4L規范[4]

        V4L與V4L2是下開發設備驅動程序的一套規范,這套規范使用分層的方法給驅動程序的開發提供了清晰的模型和一致的接口。應用程序處于最上層,V4L或V4L2處于中間層,而實際的硬件設備處于下層。

        3.1 V4L

        V4L是Video for 的簡寫,它是Alan Cox為了給Linux下視頻采集設備驅動程序的編寫提供統一的接口而提出的一套規范(API),它將所有的視頻采集設備的驅動程序都納入它的管理之中,給驅動程序編寫者帶來極大的方便。

        3.2 V4L2

        鑒于V4L的種種不足,Bill Dirks重新設計了一套API和數據結構,并把它稱作Video for Linux Two(V4L2)。與V4L相比,它的擴展性和靈活性都得到了極大的提高,并且支持的硬件設備也更多。但是也由于它對V4L做了徹底的改造,使得它與 V4L并不兼容。

        V4L2是一個兩層驅動結構:上層是videodev模塊,當videodev初始化后,它把自己注冊一個主設備號為81的字符設備,同時注冊自己的字符驅動成員函數;下層是V4L2驅動程序,它實際上是videodev的客戶端,videodev通過V4L2驅動程序的成員函數來調用V4L2驅動程序。當V4L2驅動程序初始化后,它把一個包含V4L2 驅動程序成員函數,次設備號以及其他相關信息的結構傳遞給videodev,從而把它要處理的設備注冊到videodev。當應用程序觸發了一個驅動程序調用時,控制權首先傳遞給videodev中的函數,videodev負責將應用程序傳遞的文件或i節點結構指針轉化為相應V4L2結構的指針,并調用 V4L2驅動中的處理函數。

        當V4L2驅動程序初始化時候,它首先會枚舉它將處理的系統中的設備,然后為每個設備填充struct _device結構,并把指向該結構的指針傳遞給_register _device ()函數,該函數調用_device結構中的初始化函數對設備進行初始化。

        Struct v4l2_device結構中的主要域說明如下:

        Char name[32]:設備的名字,該名字會出現在/proc/Videodev文件中;

        Int type:V4L2設備類型;

        Int minor:設備得次設備號;

        Int(*open)():當打開新的文件描述符時調用;

        Int(*close)():當關閉文件描述符時調用;

        Int(*read)():調用read();

        Int(*write)():調用write();

        Int(*ioctl)():調用ioctl();

        Int(*mmap)():調用mmap();

        Int(*poll)():調用select();

        Int(*initialize)():當設備注冊時調用;

        Int busy:設備的打開計數,由videodev維護;

        設備通過函數v4l2_unregister_device()取消注冊;V4L2允許設備多次打開,上面的v4l2_device結構中的成員函數都具有一個id參數,該參數可以把設備的多次打開區分開來。

        4 采集卡驅動程序的基本結構及實現

        4.1 驅動程序基本結構

        整個驅動程序分為三層:

        模塊Saa7146_v4l2直接操作硬件設備,它主要提供基于SAA7146芯片的采集設備的核心功能,也可將其稱作核心驅動程序;同時驅動程序還提供了擴展機制,用于擴充核心驅動程序的功能,這樣做的好處就是可以在extension模塊當中實現自己想要的附加功能,而不用修改核心部分。顯然,該擴展模塊也對硬件設備具有完全的控制權。

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

        linux相關文章:linux教程



        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 荃湾区| 石阡县| 巨鹿县| 广昌县| 顺昌县| 孟连| 寻乌县| 南投县| 邯郸县| 铜陵市| 嘉鱼县| 广东省| 尚志市| 宜兴市| 霍林郭勒市| 邢台市| 新晃| 凤冈县| 鹤庆县| 衡阳县| 浮梁县| 蛟河市| 清徐县| 甘泉县| 新田县| 集贤县| 六枝特区| 永春县| 中江县| 阳曲县| 东安县| 武山县| 贡觉县| 板桥市| 湖州市| 临武县| 紫金县| 横山县| 西宁市| 库车县| 武安市|