2012年7月7日 星期六

omap3isp, camera sensor V4L2 subdev driver, media controller

跟上時代的感覺還不錯,摸索了 v4l2 subdev 的設計方式,也讓 camera driver 進化到 current 介面了 :) 雖然為了改版事情變多,戰力也少了一位同仁(算畢業嗎?XD)

希望趕快有生力軍加入,可以補缺額恢復戰力。

1. omap3isp driver
v4l2 因為已經有包進 i2c 介面,因此我們在新增 camera driver 時,就要宣告
~linux/arch/arm/mach-omap2/devices.c 中 omap3_init_camera() 所需要的
struct isp_platform_data *pdata, 會用來註冊 omap3isp device 搭配 omap3isp driver 
使用

其中 isp_platform_data 定義在 include/media/omap3isp.h 中,裡面又需要定義 isp_v4l2_subdevs_group 也就是單一 camera sub device 的 I2C 與 Camera InterFace 定義,如果有第二個 v4l2 subdev 就是新增一個

isp_v4l2_subdevs_group,依此類推。

Camera I2C 是定義在 struct isp_subdev_i2c_board_info *subdevs; 以及 interface,如果是用 parallel(疑?還沒進化到 MIPI),就定義 bus.parallel 當然也要設定裡面的 bridge 介面參數與 VS, HS CLK 高低準位等。

i2c_board_info 中另一個要定義的是 .platform_data 指到 camera sensor 的 pdata 參考 include/media/mt9p031.h 定義 set_xclk 由 SoC 給 camera sensor mclk 的開關,reset 定義 reset 的 GPIO, ext_freq 定義 mclk 頻率, target_freq 定義 pixel clock 頻率

2. camera sensor driver
~linux/drivers/media/video/mt9p031.c
mt9p031_probe()

註冊 mt9p031->subdev.ctrl_handler = &mt9p031->ctrls;

v4l2_i2c_subdev_init(&mt9p031->subdev, client, &mt9p031_subdev_ops);

掛載 v4l2 的 i2c 介面 device, 另外也有定義 spi 介面的註冊方式

crop 與 format 的 window size, pixel format

而 Linux 的 Media controller 目前除了可以控制 camera, display 等 video device 外,也可以包括 audio 等

3. media-ctl
media controller, build kernel 需要加 media controller driver, mknod /dev/media0 c 252 0
設定各個 v4l2 sub device(entity) 的各個 input/output pad 的 pixel format, picture width, height

流程大致上是

media-ctl -r // reset previous links
media-ctl -l '"mt9p031 2-00cc":0->"OMAP3 ISP CCDC":0[1]'
media-ctl -l '"OMAP3 ISP CCDC":1->"OMAP3 ISP CCDC output":0[1]'
media-ctl -d /dev/media0 -V '"mt9p031 2-00cc":0 [fmt:YUYV/1024x768]'
media-ctl -d /dev/media0 -V '"OMAP3 ISP CCDC":0 [fmt:YUYV/1024x768]'
media-ctl -d /dev/media0 -V '"OMAP3 ISP CCDC":1 [fmt:YUYV/1024x768]'
yavta -f YUYV -s 1024x768 -n 2 --capture=4 -F `media-ctl -e "OMAP3 ISP CCDC output"`
當然也可以串 previewer, resizer,但這就要看各個 entity(sub device) 的 input/output pads

4. references:
~linux/Documentation/video4linux/omap3isp.txt
~linux/include/linux/omap3isp.h

http://git.ideasonboard.org/?p=media-ctl.git;a=summary 其中有 media-ctl git tree
https://gitorious.org/omap4-v4l2-camera 其中有 yavta git tree
git://gitorious.org/omap4-v4l2-camera/yavta.git

http://processors.wiki.ti.com/index.php/UserGuideOmap35xCaptureDriver_PSP_04.02.00.07

http://www.linuxtv.org/downloads/presentations/summit_jun_2010/20100206-fosdem.pdf

http://processors.wiki.ti.com/index.php/Writing_V4L2_Media_Controller_Applications_on_Dm36x_Video_Capture