新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于ARM和CCD的視頻采集模塊驅動設計

基于ARM和CCD的視頻采集模塊驅動設計

作者: 時間:2014-05-20 來源:網絡 收藏

 

本文引用地址:http://butianyuan.cn/article/247107.htm

2 驅動設計

本系統(tǒng)驅動主要包括兩大部分:處理器S3C6410的Camera接口驅動和視頻解碼器驅動。Camera接口驅動為上層的應用程序提供了底層支持,遵循V4L2標準;視頻解碼器TVP5150驅動完成了I2C設備的注冊,遵循I2C通訊協(xié)議,實現了讀寫內部寄存器的接口函數。

2.1 Camera接口驅動

V4L2(Video For TWO)是Linux內核中關于視頻設備的API接口,主要用來對視頻設備進行開關、采集、輸出等操作。在嵌入式系統(tǒng)中多采用Linux作為其軟件平臺,V4L2是Linux2.6采用的內核驅動模型,與之前版本的V4L存在很大差別。V4L2使在Linux下開發(fā)視頻設備驅動程序具有統(tǒng)一的接口規(guī)范,這套規(guī)范給驅動程序開發(fā)提供了清晰的模型和接口。應用程序處于最上層,硬件設備處于最下層,這套規(guī)范就處于中間層。在Linux2.6發(fā)行版之前此類規(guī)范都是V4L,它將所有的視頻設備驅動程序都放在其管理中,為編程人員減少了大量的工作。

本方案采用Linux為操作系統(tǒng),內核版本為3.0.1,相對之前的linux2.6.28而言,內核版本進行了升級,升級之后的linux3.0.1版本兼容了更多的硬件,修復了之前系統(tǒng)中的bug和某些資源的沖突問題,系統(tǒng)安全性能得到了顯著提高。Camera接口驅動正是按照V4L2標準來完成的。s3c_time_core.c文件實現了設備的注冊和大部分系統(tǒng)調用,是驅動的核心,v4l2接口的ioctl系統(tǒng)調用依靠s3c_time_v4l2.c來實現。

在Linux操作系統(tǒng)中,設備被映射為特殊的文件,設備驅動程序為各種設備提供一致的訪問接口,應用程序通過調用open、close、rea d、write等函數去操作相應的設備文件來訪問設備。open()函數用來打開視頻文件設備;camera接口底層的讀寫用read()和write()實現;mmap()取代了以前的copy_to_user()方式,用內存映射方式把設備內存映射到應用程序內存中,從而直接處理設備內存;當video_device配置完畢,在s3c_time_probe()中通過video_register_device()函數完成注冊。

2.2 TVP5150驅動

2.2.1 Linux下I2C驅動體系結構

I2C總線是由PHILIPS公司開發(fā)的微電子通信控制領域廣泛采用的一種新型總線標準,用于連接微控制器及其外圍設備,其最主要的特點是簡單性和有效性。Linux系統(tǒng)中把I2C設備當作一個普通的字符設備來處理,對I2C設備具有很好的支持,Linux下的I2C體系結構分為3個組成部分:I2C核心、I2C總線驅動和I2C設備驅動。

I2C核心是內核用來維護和管理I2C的核心部分,提供了I2C總線驅動和設備驅動的注冊,注銷方法,I2C總線驅動是對I2C硬件體系結構中適配器端的實現,主要包含了I2C適配器數據結構i2c_adapter、I2C適配器的algorithm數據結構i2c_algorithm和控制I2C適配器產生通信信號的函數。I2C設備驅動是對I2C硬件體系結構中設備端的實現,設備一般掛接在受CPU控制的I2C適配器上,通過I2C適配器與CPU交換數據。I 2C設備驅動主要包含了數據結構i2c_driver和i2c_client,我們需要根據具體設備實現其中的成員函數。Linux I2C體系結構圖如圖3所示。

 

 

2.2.2 TVP5150驅動實現

Linux3.0.1相對linux2.6.28而言驅動程序函數接口發(fā)生了一些變化,驅動程序進行了優(yōu)化,TVP5150驅動具體實現如下:TVP5150驅動程序首先要實現對I2C core層的接口,用以掛接I2C adapter層來實現對I2C總線及I2C設備具體的訪問方法,主要包括需要編寫TVP5150_ init()、TVP5150_probe()、TVP5150_remove()等接口函數。

tvp5150_init()初始化函數,主要調用i2C_add_driver(&tvp5150_i2c_driver)添加設備驅動。

tvp5150_probe()在使用i2C_add_driver()注冊時被調用,用來檢查被發(fā)現的所有的I2C適配器是否符合I2C驅動的特定條件,如果符合相關條件則進行連接,并通I2C適配器來實現對I2C總線及I2C設備的訪問。

tvp5150_remove()在刪除Tvp5150時被調用,使Tvp5150解碼器脫離I2C適配器,并且清除描述該設備相關數據結構。

本文的驅動程序主要實現以下環(huán)節(jié):

首先增加了填充camera接口的結構體:static struct s3c_fimc_camera tvp5150_da-ta,結構體中主要描述了攝像頭的參數,比如圖像尺寸720x240,圖像格式ITU_656_YCBCR422_8BIT,像素頻率27 MHz等。這些數據在初始化camera接口時要用到。在tvp5150_probe(struct i2c_client*c,const structi2c_device_id*id)函數中增加了一個函數接口s-3c_fime_register_camera(&tvp5150_data)用于把上面這個結構體填入struct s3c_fimc_config s3c_fimc這個全局變量中,其次定義tvp5150驅動配置參數的結構體tvp5150_i2c_driver,在tvp5150_in it()函數中調用i2c_add_driver(&tvp5150_i2c_driver)添加驅動,之后tvp5150_probe()被調用時tvp5150_attach_adapter()會被調用,通過遍歷系統(tǒng)中的所有I2C總線驅動來探測Tvp5150,然后調用內核中已經注冊的適配器來連接Tvp5150。tvp5-150_attach_adapter()函數主要調用i2c_detect(adapter,driver)函數來探測設備,探測到目標設備之后創(chuàng)建一個strnct i2c_client結構來標識這個設備。

初始化Tvp5150內部特殊功能寄存器的操作主要通過tvp5150_probe()函數來實現,函數中調用i2c_smbus_write_byte_data(c,TVP5150 _init_reg[i].subaddr,TVP5150_init_reg[i].value)來完成寄存器的設置,從而完成了初始化tvp5150的過程。其圖像采集驅動流程圖如圖4所示。

 

 

3 驅動移植和相關實驗結果

1)驅動程序編寫好之后,在Kconfig-camera文件中添加與驅動相對應項目的編譯配置選項:

模擬信號相關文章:什么是模擬信號


linux相關文章:linux教程


攝像頭相關文章:攝像頭原理


關鍵詞: ARM CCD

評論


相關推薦

技術專區(qū)

關閉