今年上半年我對市場常見的
vimicro
攝像頭移植了
linux
下的驅動至在研的一款嵌入式開發板,開發環境為:
os:linux2.6.9
compile:cross 3.3.2
cpu:intel pxa270
camera type :vimicro zc301p +hv7131r
使用的驅動原始碼基於自由軟體
spca5xx
。基於原始碼作了些小改動。記錄一下。
linux
下的usb
驅動架構
linux
下完整的
usb驅動程式必須包括
3個模組:
usb core
,usb
主控制器驅動,
usb裝置驅動。三者的關係如下:
其中:
linux core
封裝了支援
usb主控制器和
usb裝置驅動的
api,通過一系列的資料結構、巨集、函式來抽象化裝置硬體並掩蔽硬體具體細節,使得
linux
系統對usb
裝置的訪問採用如同一般檔案訪問類似的介面函式,如此實現了硬體無關。「裝置即是檔案」。
usb hc
(host controller
)全面負責主機端對
usb的資訊傳輸分工,對下註冊功能和相關資料結構;對上提供了裝置驅動與
usb core
資料傳輸的橋梁。
usb上的實時流資料傳輸通常通過
urb(
usb request block
)的資料結構實現,每一次資料傳輸中,裝置驅動建立
urb,提交給
usb hc
,usb hc
負責完成此次與裝置端的
urb互動。
usb驅動程式的結構
struct usb_driver spca5xx_driver
struct video_device spca50x_template
struct file_operations spca5xx_fops
模組初始化與解除安裝
spca5xx_init()
模組初始化;
spca5xx_disconnect()
模組解除安裝;
spca5xx_probe()
物理裝置查詢、匹配、配置,並向核心註冊
video
裝置。
系統呼叫介面
spca5xx_open()
完成裝置的開啟和初始化,並初始化解碼器模組,
spca5xx_close()
完成裝置的關閉;
spca5xx_read()
完成資料的讀取,其主要的工作就是將資料由核心空間傳送到程序使用者空間;
spca5xx_mmap()
實現將裝置記憶體對映到使用者程序的位址空間的功能;
spca5xx_ioctl()
實現檔案資訊的獲取功能。
資料傳輸
spca50x_reg_write
攝像頭資料傳輸過程
usb匯流排上資訊傳輸型別可分成控制、中斷、等時、成塊四種:其中控制型主要用於裝置的「配置」與控制;中斷型主要用於主機對
usbusb
裝置端提供若干通訊埠(
port
),主機與埠間建立起邏輯上的通訊管道,進行資料傳輸。在攝像頭的裝置初始化階段,主機與
0號埠通訊,驅動程式檢測攝像頭型號和所有埠資訊;進入資料傳輸階段,主機與探測到的實時輸入埠建立通訊管道,實時回傳攝像頭拍攝到的影象資料。
usb主機控制器把每秒匯流排時間分成
1024
個固定大小的
frame
,每個frame
佔據1ms
的時間頻寬並以此為時間單位遞增,同時對應乙個等時互動佇列。主機負責把
usb匯流排上回傳的等時影象資料流量分配給各
frame
,usb
主機控制器每一秒鐘掃瞄一遍所有
frame
,依次讀入各
frame
攜帶的等時資料報至核心緩衝區中。應用程式通過記憶體對映,在使用者空間直接讀取核心緩衝區內容,存入
linux
視訊記憶體幀緩衝(
framebuffer
)中,從而在顯示屏中出現影象資料。
筆者的實驗攝像頭為
vimicro zc301p,sensor
是hv7131r
,驅動程式中每秒鐘進行2次
urb傳輸,每個
urb攜帶16個
1023
位元組的資料報,這樣每秒鐘所能得到的影象資料大小為
32kbyte
。對rgb565
、大小320
×240、16
位顏色深度的影象格式,在
pxa270
處理器的嵌入式開發板上測試,幀速達到每秒17
提高攝像頭工作質量的幾種方法
zhaoyang
Linux系統下USB攝像頭驅動開發
摘要 介紹了在iinux系統下開發符合video for linux標準的usb攝像頭驅動的方法,並對該標準提出 不間斷採集 的改進思路,配合雙urb 雙幀緩衝等方法,提高採集速度。usb攝像頭以其良好的效能和低廉的 得到廣泛應用。同時因其靈活 方便的特性,易於整合到嵌入式系統中。但是如果使用現有的...
Linux系統下USB攝像頭驅動開發
一 linux 系統中的 usb攝像頭驅動程式 usb攝像頭以其良好的效能和低廉的 得到廣泛應用。同時因其靈活 方便的 特性,易於整合到嵌入式系統中。但是如果使用現有的符合video for linux 標準的驅動程式配合通用應用程式,難以充分利用 usb頻寬,幀速不高,不易滿足實時監控等要求。本文...
Android驅動USB攝像頭
先來個整體規劃 剛搜尋了一圈,在有乙個不錯的帖子,android系統原理及開發要點詳解 中也講 camera 硬體抽象層的,不過我是只做驅動,不能越界,先弄乙個 中星微 的z03 先 驅動 起來,讓做應用的先做,我在tiny6410上已經驗證可行 linux qt 不過沒有進行android的驗證,...