<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

基于Linux操作系統的視頻采集卡驅動(dòng)程序設計

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

4.2 的實(shí)現

下面討論的具體實(shí)現。

4.2.1 PCI

本文采用的卡是基于PCI總線(xiàn)的,因此在這里首先討論PCI驅動(dòng)程序的結構。

PCI設備是無(wú)跳線(xiàn)設備,可在引導階段自動(dòng)配置。這樣設備驅動(dòng)程序必須能夠訪(fǎng)問(wèn)設備中的配置信息以便完成初始化。對于PCI設備來(lái)說(shuō),這些工作無(wú)需探測就可以完成[1][5]。

所有的PCI設備都有至少256字節的地址空間,前64字節是標準化的,其余的是設備相關(guān)的。這個(gè)空間也叫做PCI配置空間,它包含廠(chǎng)商標識,設備標識,設備類(lèi)別,基地址寄存器,中斷引腳等等,編寫(xiě)PCI的驅動(dòng)程序就是利用這些域與設備進(jìn)行“溝通”。

盡管PCI設備千差萬(wàn)別,但是控制他們的結構基本是類(lèi)似的。

1)為了正確注冊到內核,所有的PCI驅動(dòng)程序需要創(chuàng )建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,表示初始化成功,此時(shí)在驅動(dòng)程序可以訪(fǎng)問(wèn)PCI設備的任何設備資源之前(I/O區域或中斷),驅動(dòng)程序必須調用pci_enable_device函數:

int pci_enable_device(struct pci_dev *dev);

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

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

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

4.2.2 驅動(dòng)模塊的設計與實(shí)現

采集卡驅動(dòng)程序主要由saa7146_v4l2,v4l2_extension,saa7111a三個(gè)模塊構成,這三個(gè)模塊都要調用i2c- core模塊(Kernel提供)中的函數,即它們依賴(lài)于i2c-core模塊;saa7111a模塊具體負責通過(guò)I2C控制SAA7111a芯片,v4l2_extension模塊依賴(lài)于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()用于實(shí)現各種類(lèi)型硬件控制 */

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操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>