<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          基于Linux操作系統(tǒng)的視頻采集卡驅(qū)動(dòng)程序設(shè)計(jì)

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

          1 引言

          操作系統(tǒng)以其本身強(qiáng)大的性能、卓越的穩(wěn)定性和開(kāi)放源代碼的優(yōu)點(diǎn)正在得到越來(lái)越廣泛的應(yīng)用。設(shè)備在linux內(nèi)核中扮演著特殊的角色,它們是一個(gè)個(gè)獨(dú)立的“黑盒子”,使得特定的硬件響應(yīng)一個(gè)定義良好的內(nèi)部編程接口,這些接口完全隱藏了設(shè)備的工作細(xì)節(jié)。用戶的操作通過(guò)一組標(biāo)準(zhǔn)化的調(diào)用執(zhí)行,而這些調(diào)用獨(dú)立于特定的。將這些調(diào)用映射到作用于實(shí)際硬件的設(shè)備特有操作上,則是的任務(wù)[1]。

          本文撰寫的背景是源于我們自己開(kāi)發(fā)的CDMA無(wú)線視頻傳輸系統(tǒng),該傳輸系統(tǒng)的模塊使用Philip SAA7146+ SAA7111a,本文主要介紹linux環(huán)境下設(shè)備驅(qū)動(dòng)程序的編寫。

          2 采集芯片簡(jiǎn)介[2][3]

          開(kāi)發(fā)驅(qū)動(dòng)程序的第一步就是詳細(xì)了解硬件設(shè)備的規(guī)格,這樣才能具體操縱硬件,實(shí)現(xiàn)硬件特定的操作,因此首先介紹一下Philip SAA7146及7111A芯片。

          Philip SAA7146是PCI總線控制設(shè)備,它負(fù)責(zé)初始化并處理PCI總線上的數(shù)據(jù)傳輸,在這個(gè)意義上說(shuō)它是主設(shè)備;而7111a是從設(shè)備,它只是所謂的視頻解碼器,負(fù)責(zé)將模擬視頻信號(hào)解碼為數(shù)字比特流。對(duì)于后者,只需要通過(guò)I2C總線進(jìn)行編程,而不必直接控制該設(shè)備。它并不具有總線控制能力,因此不能在PCI 總線上找到它。因此7111a并不需要專門的驅(qū)動(dòng)程序,它是通過(guò)主控芯片(SAA7146)經(jīng)由I2C總線來(lái)驅(qū)動(dòng)的,我們只需要編寫主控芯片的驅(qū)動(dòng)程序即可。

          3 V4L規(guī)范[4]

          V4L與V4L2是下開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序的一套規(guī)范,這套規(guī)范使用分層的方法給驅(qū)動(dòng)程序的開(kāi)發(fā)提供了清晰的模型和一致的接口。應(yīng)用程序處于最上層,V4L或V4L2處于中間層,而實(shí)際的硬件設(shè)備處于下層。

          3.1 V4L

          V4L是Video for 的簡(jiǎn)寫,它是Alan Cox為了給Linux下視頻采集設(shè)備驅(qū)動(dòng)程序的編寫提供統(tǒng)一的接口而提出的一套規(guī)范(API),它將所有的視頻采集設(shè)備的驅(qū)動(dòng)程序都納入它的管理之中,給驅(qū)動(dòng)程序編寫者帶來(lái)極大的方便。

          3.2 V4L2

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

          V4L2是一個(gè)兩層驅(qū)動(dòng)結(jié)構(gòu):上層是videodev模塊,當(dāng)videodev初始化后,它把自己注冊(cè)一個(gè)主設(shè)備號(hào)為81的字符設(shè)備,同時(shí)注冊(cè)自己的字符驅(qū)動(dòng)成員函數(shù);下層是V4L2驅(qū)動(dòng)程序,它實(shí)際上是videodev的客戶端,videodev通過(guò)V4L2驅(qū)動(dòng)程序的成員函數(shù)來(lái)調(diào)用V4L2驅(qū)動(dòng)程序。當(dāng)V4L2驅(qū)動(dòng)程序初始化后,它把一個(gè)包含V4L2 驅(qū)動(dòng)程序成員函數(shù),次設(shè)備號(hào)以及其他相關(guān)信息的結(jié)構(gòu)傳遞給videodev,從而把它要處理的設(shè)備注冊(cè)到videodev。當(dāng)應(yīng)用程序觸發(fā)了一個(gè)驅(qū)動(dòng)程序調(diào)用時(shí),控制權(quán)首先傳遞給videodev中的函數(shù),videodev負(fù)責(zé)將應(yīng)用程序傳遞的文件或i節(jié)點(diǎn)結(jié)構(gòu)指針轉(zhuǎn)化為相應(yīng)V4L2結(jié)構(gòu)的指針,并調(diào)用 V4L2驅(qū)動(dòng)中的處理函數(shù)。

          當(dāng)V4L2驅(qū)動(dòng)程序初始化時(shí)候,它首先會(huì)枚舉它將處理的系統(tǒng)中的設(shè)備,然后為每個(gè)設(shè)備填充struct _device結(jié)構(gòu),并把指向該結(jié)構(gòu)的指針傳遞給_register _device ()函數(shù),該函數(shù)調(diào)用_device結(jié)構(gòu)中的初始化函數(shù)對(duì)設(shè)備進(jìn)行初始化。

          Struct v4l2_device結(jié)構(gòu)中的主要域說(shuō)明如下:

          Char name[32]:設(shè)備的名字,該名字會(huì)出現(xiàn)在/proc/Videodev文件中;

          Int type:V4L2設(shè)備類型;

          Int minor:設(shè)備得次設(shè)備號(hào);

          Int(*open)():當(dāng)打開(kāi)新的文件描述符時(shí)調(diào)用;

          Int(*close)():當(dāng)關(guān)閉文件描述符時(shí)調(diào)用;

          Int(*read)():調(diào)用read();

          Int(*write)():調(diào)用write();

          Int(*ioctl)():調(diào)用ioctl();

          Int(*mmap)():調(diào)用mmap();

          Int(*poll)():調(diào)用select();

          Int(*initialize)():當(dāng)設(shè)備注冊(cè)時(shí)調(diào)用;

          Int busy:設(shè)備的打開(kāi)計(jì)數(shù),由videodev維護(hù);

          設(shè)備通過(guò)函數(shù)v4l2_unregister_device()取消注冊(cè);V4L2允許設(shè)備多次打開(kāi),上面的v4l2_device結(jié)構(gòu)中的成員函數(shù)都具有一個(gè)id參數(shù),該參數(shù)可以把設(shè)備的多次打開(kāi)區(qū)分開(kāi)來(lái)。

          4 采集卡驅(qū)動(dòng)程序的基本結(jié)構(gòu)及實(shí)現(xiàn)

          4.1 驅(qū)動(dòng)程序基本結(jié)構(gòu)

          整個(gè)驅(qū)動(dòng)程序分為三層:

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

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

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



          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();