新聞中心

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

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

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

        4.2 的實現

        下面討論的具體實現。

        4.2.1 PCI

        本文采用的卡是基于PCI總線的,因此在這里首先討論PCI驅動程序的結構。

        PCI設備是無跳線設備,可在引導階段自動配置。這樣設備驅動程序必須能夠訪問設備中的配置信息以便完成初始化。對于PCI設備來說,這些工作無需探測就可以完成[1][5]。

        所有的PCI設備都有至少256字節的地址空間,前64字節是標準化的,其余的是設備相關的。這個空間也叫做PCI配置空間,它包含廠商標識,設備標識,設備類別,基地址寄存器,中斷引腳等等,編寫PCI的驅動程序就是利用這些域與設備進行“溝通”。

        盡管PCI設備千差萬別,但是控制他們的結構基本是類似的。

        1)為了正確注冊到內核,所有的PCI驅動程序需要創建pci_driver結構體,該結構體由許多回調函數和變量組成。初始化該結構體如下:

        struct pci_driver saa7146__driver = {

        name: "saa7146 ",

        id_table: saa7146__pci_tbl,

        probe: saa7146_v4l2_init_one,

        remove: saa7146_v4l2_remove_one,

        suspend: saa7146_v4l2_suspend,

        resume: saa7146_v4l2_resume,

        };

        為了把struct pci_driver注冊到PCI核心,需要調用以其為參數的pci_module_init函數:

        pci_module_init(saa7146_v4l2_driver);

        2)如果上述函數返回為0,表示初始化成功,此時在驅動程序可以訪問PCI設備的任何設備資源之前(I/O區域或中斷),驅動程序必須調用pci_enable_device函數:

        int pci_enable_device(struct pci_dev *dev);

        3)上述函數將激活設備,此時驅動程序就需要讀取或寫入三個地址空間:內存,I/O端口,配置空間。把I/O空間和內存空間都看作是系統的資源,使用前必須申請,即在系統中進行登記,避免資源使用的混亂。簡述如下:

        首先調用pci_resource_start()和pci_resource_len()函數獲取資源信息,然后調用 request_mem_region()函數分配I/O內存區域,為了確保該內存對內核而言是可訪問的,必須還要建立映射,映射的建立由 ioremap()函數完成,這樣設備驅動程序就可以訪問任意的I/O內存地址。

        4)與設備通信,即通過訪問I/O內存的函數,諸如writel(),readl()等;以及進行I2C操作的函數對SAA7111a進行初始化。

        4.2.2 驅動模塊的設計與實現

        采集卡驅動程序主要由saa7146_v4l2,v4l2_extension,saa7111a三個模塊構成,這三個模塊都要調用i2c- core模塊(Kernel提供)中的函數,即它們依賴于i2c-core模塊;saa7111a模塊具體負責通過I2C控制SAA7111a芯片,v4l2_extension模塊依賴于saa7146_v4l2模塊,它把自己注冊到saa7146核心模塊中。

        重要數據結構聲明

        采集設備的擴展部分結構:

        struct saa7146_v4l2_extension{

        char name[64]; /* 設備名 */

        struct saa7146_v4l2_extension_ioctls* ioctls;

        u32 irq_mask; /* 擴展部分處理的IRQ */

        void (*irq_func)(struct capture_device*, u32* irq_mask);

        /* 擴展部分的函數主要就是ioctl()用于實現各種類型硬件控制 */

        int (*ioctl)(void *id, unsigned int cmd, void *arg);

        };

        采集設備核心結構:

        struct capture_device{

        struct v4l2_device v4l2;

        struct v4l2_capability capability;

        struct pci_dev *pci_device;

        ……

        }

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

        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 射洪县| 饶河县| 获嘉县| 襄樊市| 环江| 探索| 乐都县| 武定县| 凤庆县| 武胜县| 巨野县| 沛县| 天气| 昭平县| 罗源县| 张北县| 定安县| 台南市| 定南县| 巴南区| 曲周县| 宁陵县| 峨眉山市| 清苑县| 松原市| 舞阳县| 武汉市| 泸定县| 萨迦县| 麦盖提县| 岳普湖县| 巴林左旗| 开鲁县| 永吉县| 赤峰市| 马关县| 仁化县| 新沂市| 盘山县| 都匀市| 平阳县|