基于ARM和CCD的視頻采集模塊驅(qū)動(dòng)設(shè)計(jì)
本文引用地址:http://www.ex-cimer.com/article/247107.htm
2 驅(qū)動(dòng)設(shè)計(jì)
本系統(tǒng)驅(qū)動(dòng)主要包括兩大部分:處理器S3C6410的Camera接口驅(qū)動(dòng)和視頻解碼器驅(qū)動(dòng)。Camera接口驅(qū)動(dòng)為上層的應(yīng)用程序提供了底層支持,遵循V4L2標(biāo)準(zhǔn);視頻解碼器TVP5150驅(qū)動(dòng)完成了I2C設(shè)備的注冊(cè),遵循I2C通訊協(xié)議,實(shí)現(xiàn)了讀寫內(nèi)部寄存器的接口函數(shù)。
2.1 Camera接口驅(qū)動(dòng)
V4L2(Video For TWO)是Linux內(nèi)核中關(guān)于視頻設(shè)備的API接口,主要用來對(duì)視頻設(shè)備進(jìn)行開關(guān)、采集、輸出等操作。在嵌入式系統(tǒng)中多采用Linux作為其軟件平臺(tái),V4L2是Linux2.6采用的內(nèi)核驅(qū)動(dòng)模型,與之前版本的V4L存在很大差別。V4L2使在Linux下開發(fā)視頻設(shè)備驅(qū)動(dòng)程序具有統(tǒng)一的接口規(guī)范,這套規(guī)范給驅(qū)動(dòng)程序開發(fā)提供了清晰的模型和接口。應(yīng)用程序處于最上層,硬件設(shè)備處于最下層,這套規(guī)范就處于中間層。在Linux2.6發(fā)行版之前此類規(guī)范都是V4L,它將所有的視頻設(shè)備驅(qū)動(dòng)程序都放在其管理中,為編程人員減少了大量的工作。
本方案采用Linux為操作系統(tǒng),內(nèi)核版本為3.0.1,相對(duì)之前的linux2.6.28而言,內(nèi)核版本進(jìn)行了升級(jí),升級(jí)之后的linux3.0.1版本兼容了更多的硬件,修復(fù)了之前系統(tǒng)中的bug和某些資源的沖突問題,系統(tǒng)安全性能得到了顯著提高。Camera接口驅(qū)動(dòng)正是按照V4L2標(biāo)準(zhǔn)來完成的。s3c_time_core.c文件實(shí)現(xiàn)了設(shè)備的注冊(cè)和大部分系統(tǒng)調(diào)用,是驅(qū)動(dòng)的核心,v4l2接口的ioctl系統(tǒng)調(diào)用依靠s3c_time_v4l2.c來實(shí)現(xiàn)。
在Linux操作系統(tǒng)中,設(shè)備被映射為特殊的文件,設(shè)備驅(qū)動(dòng)程序?yàn)楦鞣N設(shè)備提供一致的訪問接口,應(yīng)用程序通過調(diào)用open、close、rea d、write等函數(shù)去操作相應(yīng)的設(shè)備文件來訪問設(shè)備。open()函數(shù)用來打開視頻文件設(shè)備;camera接口底層的讀寫用read()和write()實(shí)現(xiàn);mmap()取代了以前的copy_to_user()方式,用內(nèi)存映射方式把設(shè)備內(nèi)存映射到應(yīng)用程序內(nèi)存中,從而直接處理設(shè)備內(nèi)存;當(dāng)video_device配置完畢,在s3c_time_probe()中通過video_register_device()函數(shù)完成注冊(cè)。
2.2 TVP5150驅(qū)動(dòng)
2.2.1 Linux下I2C驅(qū)動(dòng)體系結(jié)構(gòu)
I2C總線是由PHILIPS公司開發(fā)的微電子通信控制領(lǐng)域廣泛采用的一種新型總線標(biāo)準(zhǔn),用于連接微控制器及其外圍設(shè)備,其最主要的特點(diǎn)是簡(jiǎn)單性和有效性。Linux系統(tǒng)中把I2C設(shè)備當(dāng)作一個(gè)普通的字符設(shè)備來處理,對(duì)I2C設(shè)備具有很好的支持,Linux下的I2C體系結(jié)構(gòu)分為3個(gè)組成部分:I2C核心、I2C總線驅(qū)動(dòng)和I2C設(shè)備驅(qū)動(dòng)。
I2C核心是內(nèi)核用來維護(hù)和管理I2C的核心部分,提供了I2C總線驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊(cè),注銷方法,I2C總線驅(qū)動(dòng)是對(duì)I2C硬件體系結(jié)構(gòu)中適配器端的實(shí)現(xiàn),主要包含了I2C適配器數(shù)據(jù)結(jié)構(gòu)i2c_adapter、I2C適配器的algorithm數(shù)據(jù)結(jié)構(gòu)i2c_algorithm和控制I2C適配器產(chǎn)生通信信號(hào)的函數(shù)。I2C設(shè)備驅(qū)動(dòng)是對(duì)I2C硬件體系結(jié)構(gòu)中設(shè)備端的實(shí)現(xiàn),設(shè)備一般掛接在受CPU控制的I2C適配器上,通過I2C適配器與CPU交換數(shù)據(jù)。I 2C設(shè)備驅(qū)動(dòng)主要包含了數(shù)據(jù)結(jié)構(gòu)i2c_driver和i2c_client,我們需要根據(jù)具體設(shè)備實(shí)現(xiàn)其中的成員函數(shù)。Linux I2C體系結(jié)構(gòu)圖如圖3所示。
2.2.2 TVP5150驅(qū)動(dòng)實(shí)現(xiàn)
Linux3.0.1相對(duì)linux2.6.28而言驅(qū)動(dòng)程序函數(shù)接口發(fā)生了一些變化,驅(qū)動(dòng)程序進(jìn)行了優(yōu)化,TVP5150驅(qū)動(dòng)具體實(shí)現(xiàn)如下:TVP5150驅(qū)動(dòng)程序首先要實(shí)現(xiàn)對(duì)I2C core層的接口,用以掛接I2C adapter層來實(shí)現(xiàn)對(duì)I2C總線及I2C設(shè)備具體的訪問方法,主要包括需要編寫TVP5150_ init()、TVP5150_probe()、TVP5150_remove()等接口函數(shù)。
tvp5150_init()初始化函數(shù),主要調(diào)用i2C_add_driver(&tvp5150_i2c_driver)添加設(shè)備驅(qū)動(dòng)。
tvp5150_probe()在使用i2C_add_driver()注冊(cè)時(shí)被調(diào)用,用來檢查被發(fā)現(xiàn)的所有的I2C適配器是否符合I2C驅(qū)動(dòng)的特定條件,如果符合相關(guān)條件則進(jìn)行連接,并通I2C適配器來實(shí)現(xiàn)對(duì)I2C總線及I2C設(shè)備的訪問。
tvp5150_remove()在刪除Tvp5150時(shí)被調(diào)用,使Tvp5150解碼器脫離I2C適配器,并且清除描述該設(shè)備相關(guān)數(shù)據(jù)結(jié)構(gòu)。
本文的驅(qū)動(dòng)程序主要實(shí)現(xiàn)以下環(huán)節(jié):
首先增加了填充camera接口的結(jié)構(gòu)體:static struct s3c_fimc_camera tvp5150_da-ta,結(jié)構(gòu)體中主要描述了攝像頭的參數(shù),比如圖像尺寸720x240,圖像格式ITU_656_YCBCR422_8BIT,像素頻率27 MHz等。這些數(shù)據(jù)在初始化camera接口時(shí)要用到。在tvp5150_probe(struct i2c_client*c,const structi2c_device_id*id)函數(shù)中增加了一個(gè)函數(shù)接口s-3c_fime_register_camera(&tvp5150_data)用于把上面這個(gè)結(jié)構(gòu)體填入struct s3c_fimc_config s3c_fimc這個(gè)全局變量中,其次定義tvp5150驅(qū)動(dòng)配置參數(shù)的結(jié)構(gòu)體tvp5150_i2c_driver,在tvp5150_in it()函數(shù)中調(diào)用i2c_add_driver(&tvp5150_i2c_driver)添加驅(qū)動(dòng),之后tvp5150_probe()被調(diào)用時(shí)tvp5150_attach_adapter()會(huì)被調(diào)用,通過遍歷系統(tǒng)中的所有I2C總線驅(qū)動(dòng)來探測(cè)Tvp5150,然后調(diào)用內(nèi)核中已經(jīng)注冊(cè)的適配器來連接Tvp5150。tvp5-150_attach_adapter()函數(shù)主要調(diào)用i2c_detect(adapter,driver)函數(shù)來探測(cè)設(shè)備,探測(cè)到目標(biāo)設(shè)備之后創(chuàng)建一個(gè)strnct i2c_client結(jié)構(gòu)來標(biāo)識(shí)這個(gè)設(shè)備。
初始化Tvp5150內(nèi)部特殊功能寄存器的操作主要通過tvp5150_probe()函數(shù)來實(shí)現(xiàn),函數(shù)中調(diào)用i2c_smbus_write_byte_data(c,TVP5150 _init_reg[i].subaddr,TVP5150_init_reg[i].value)來完成寄存器的設(shè)置,從而完成了初始化tvp5150的過程。其圖像采集驅(qū)動(dòng)流程圖如圖4所示。
3 驅(qū)動(dòng)移植和相關(guān)實(shí)驗(yàn)結(jié)果
1)驅(qū)動(dòng)程序編寫好之后,在Kconfig-camera文件中添加與驅(qū)動(dòng)相對(duì)應(yīng)項(xiàng)目的編譯配置選項(xiàng):
模擬信號(hào)相關(guān)文章:什么是模擬信號(hào)
linux相關(guān)文章:linux教程
攝像頭相關(guān)文章:攝像頭原理
評(píng)論