网络摄像头4 cmos 0v9650,driver
生活随笔
收集整理的這篇文章主要介紹了
网络摄像头4 cmos 0v9650,driver
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
將ov9650的驅(qū)動(dòng)編譯進(jìn)內(nèi)核
?Device Drivers? --->?<*> Multimedia support? ---> ?<*>?? OV9650 on the S3C2440 driver
查看這項(xiàng)的help,可知符號
Symbol: S3C2440_CAMERA [=y]?? ?
在目錄/opt/FriendlyArm/mini2440/linux-2.6.32.2/drivers/media/video的Makefile里面找到以下2行
obj-$(CONFIG_S3C2440_CAMERA) += s3c2440camera.o
s3c2440camera-objs??? :=??? s3c2440_ov9650.o sccb.o s3c2440camif.o
可見0v9650的驅(qū)動(dòng)由3個(gè)c文件構(gòu)成,如下
s3c2440camif.c
s3c2440_ov9650.c
sccb.c
還有兩個(gè)h文件
s3c2440camif.h
sccb.h
(并且可如果編譯成模塊的話,生成s3c2440camera.ko)
其中
s3c2440camif.c用于從cmos接口獲取圖像數(shù)據(jù)和將數(shù)據(jù)傳輸?shù)竭M(jìn)程空間(在有app讀取時(shí))。比如創(chuàng)建misc設(shè)備,設(shè)備名字是camera。在misc中僅實(shí)現(xiàn)3個(gè)方法open,read,release。沒有ioctl(和mmap),所以在網(wǎng)絡(luò)攝像頭2里所看到的來自app的ioctl會失敗。
s3c2440_ov9650.c 讀取和配置ov9650寄存器。通過iic接口傳輸數(shù)據(jù)。設(shè)備地址是60(#define OV9650_SCCB_ADDR?? ?0x60).比如進(jìn)行初始化和product id獲取.
sccb.c 定義了去讀ov9650的寄存器的具體方法,是時(shí)序模擬的iic。而s3c2440_ov9650.c里是調(diào)用這些具體方法去讀寫ov9650的寄存器的。
**************************************************************硬件連接******************************************
cmos ov9650的引腳
2440處理器cmos接口
用于傳輸ov9650的寄存器配置信息即工作參數(shù),ov9650<--->2440
電源控制,ov9650<---2440
用戶ov9650傳輸捕獲的圖像數(shù)據(jù),ov9650--->2440
查看ov9650的spec可知其輸出的數(shù)據(jù)格式
**************************************************************驅(qū)動(dòng)分析****************************************************
/** camif_init()*/ static int __init camif_init(void) {int ret;struct s3c2440camif_dev * pdev;struct clk * camif_upll_clk;printk(KERN_ALERT"initializing s3c2440 camera interface......\n");pdev = &camera;/* set gpio-j to camera mode. */s3c2410_gpio_cfgpin(S3C2440_GPJ0, S3C2440_GPJ0_CAMDATA0);s3c2410_gpio_cfgpin(S3C2440_GPJ1, S3C2440_GPJ1_CAMDATA1);s3c2410_gpio_cfgpin(S3C2440_GPJ2, S3C2440_GPJ2_CAMDATA2);s3c2410_gpio_cfgpin(S3C2440_GPJ3, S3C2440_GPJ3_CAMDATA3);s3c2410_gpio_cfgpin(S3C2440_GPJ4, S3C2440_GPJ4_CAMDATA4);s3c2410_gpio_cfgpin(S3C2440_GPJ5, S3C2440_GPJ5_CAMDATA5);s3c2410_gpio_cfgpin(S3C2440_GPJ6, S3C2440_GPJ6_CAMDATA6);s3c2410_gpio_cfgpin(S3C2440_GPJ7, S3C2440_GPJ7_CAMDATA7);s3c2410_gpio_cfgpin(S3C2440_GPJ8, S3C2440_GPJ8_CAMPCLK);s3c2410_gpio_cfgpin(S3C2440_GPJ9, S3C2440_GPJ9_CAMVSYNC);s3c2410_gpio_cfgpin(S3C2440_GPJ10, S3C2440_GPJ10_CAMHREF);s3c2410_gpio_cfgpin(S3C2440_GPJ11, S3C2440_GPJ11_CAMCLKOUT);s3c2410_gpio_cfgpin(S3C2440_GPJ12, S3C2440_GPJ12_CAMRESET);/* init camera's virtual memory. */if (!request_mem_region((unsigned long)S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF, CARD_NAME)){ret = -EBUSY;goto error1;}/* remap the virtual memory. */camif_base_addr = (unsigned long)ioremap_nocache((unsigned long)S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF);if (camif_base_addr == (unsigned long)NULL){ret = -EBUSY;goto error2;}/* init camera clock. */pdev->clk = clk_get(NULL, "camif");if (IS_ERR(pdev->clk)){ret = -ENOENT;goto error3;}clk_enable(pdev->clk);camif_upll_clk = clk_get(NULL, "camif-upll");clk_set_rate(camif_upll_clk, 24000000);mdelay(100);/* init reference counter and its mutex. */mutex_init(&pdev->rcmutex);pdev->rc = 0;/* init image input source. */pdev->input = 0;/* init camif state and its lock. */pdev->state = CAMIF_STATE_FREE;/* init command code, command lock and the command wait queue. */pdev->cmdcode = CAMIF_CMD_NONE;init_waitqueue_head(&pdev->cmdqueue);/* register to videodev layer. */if (misc_register(&misc) < 0){ret = -EBUSY;goto error4;}printk(KERN_ALERT"s3c2440 camif init done\n");sccb_init();hw_reset_camif();has_ov9650 = s3c2440_ov9650_init() >= 0;s3c2410_gpio_setpin(S3C2410_GPG(4), 1);return 0;error4:clk_put(pdev->clk); error3:iounmap((void *)camif_base_addr); error2:release_mem_region((unsigned long)S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF);error1:return ret; }
?Device Drivers? --->?<*> Multimedia support? ---> ?<*>?? OV9650 on the S3C2440 driver
查看這項(xiàng)的help,可知符號
Symbol: S3C2440_CAMERA [=y]?? ?
在目錄/opt/FriendlyArm/mini2440/linux-2.6.32.2/drivers/media/video的Makefile里面找到以下2行
obj-$(CONFIG_S3C2440_CAMERA) += s3c2440camera.o
s3c2440camera-objs??? :=??? s3c2440_ov9650.o sccb.o s3c2440camif.o
可見0v9650的驅(qū)動(dòng)由3個(gè)c文件構(gòu)成,如下
s3c2440camif.c
s3c2440_ov9650.c
sccb.c
還有兩個(gè)h文件
s3c2440camif.h
sccb.h
(并且可如果編譯成模塊的話,生成s3c2440camera.ko)
其中
s3c2440camif.c用于從cmos接口獲取圖像數(shù)據(jù)和將數(shù)據(jù)傳輸?shù)竭M(jìn)程空間(在有app讀取時(shí))。比如創(chuàng)建misc設(shè)備,設(shè)備名字是camera。在misc中僅實(shí)現(xiàn)3個(gè)方法open,read,release。沒有ioctl(和mmap),所以在網(wǎng)絡(luò)攝像頭2里所看到的來自app的ioctl會失敗。
s3c2440_ov9650.c 讀取和配置ov9650寄存器。通過iic接口傳輸數(shù)據(jù)。設(shè)備地址是60(#define OV9650_SCCB_ADDR?? ?0x60).比如進(jìn)行初始化和product id獲取.
sccb.c 定義了去讀ov9650的寄存器的具體方法,是時(shí)序模擬的iic。而s3c2440_ov9650.c里是調(diào)用這些具體方法去讀寫ov9650的寄存器的。
**************************************************************硬件連接******************************************
cmos ov9650的引腳
2440處理器cmos接口
用于傳輸ov9650的寄存器配置信息即工作參數(shù),ov9650<--->2440
電源控制,ov9650<---2440
用戶ov9650傳輸捕獲的圖像數(shù)據(jù),ov9650--->2440
查看ov9650的spec可知其輸出的數(shù)據(jù)格式
**************************************************************驅(qū)動(dòng)分析****************************************************
/** camif_init()*/ static int __init camif_init(void) {int ret;struct s3c2440camif_dev * pdev;struct clk * camif_upll_clk;printk(KERN_ALERT"initializing s3c2440 camera interface......\n");pdev = &camera;/* set gpio-j to camera mode. */s3c2410_gpio_cfgpin(S3C2440_GPJ0, S3C2440_GPJ0_CAMDATA0);s3c2410_gpio_cfgpin(S3C2440_GPJ1, S3C2440_GPJ1_CAMDATA1);s3c2410_gpio_cfgpin(S3C2440_GPJ2, S3C2440_GPJ2_CAMDATA2);s3c2410_gpio_cfgpin(S3C2440_GPJ3, S3C2440_GPJ3_CAMDATA3);s3c2410_gpio_cfgpin(S3C2440_GPJ4, S3C2440_GPJ4_CAMDATA4);s3c2410_gpio_cfgpin(S3C2440_GPJ5, S3C2440_GPJ5_CAMDATA5);s3c2410_gpio_cfgpin(S3C2440_GPJ6, S3C2440_GPJ6_CAMDATA6);s3c2410_gpio_cfgpin(S3C2440_GPJ7, S3C2440_GPJ7_CAMDATA7);s3c2410_gpio_cfgpin(S3C2440_GPJ8, S3C2440_GPJ8_CAMPCLK);s3c2410_gpio_cfgpin(S3C2440_GPJ9, S3C2440_GPJ9_CAMVSYNC);s3c2410_gpio_cfgpin(S3C2440_GPJ10, S3C2440_GPJ10_CAMHREF);s3c2410_gpio_cfgpin(S3C2440_GPJ11, S3C2440_GPJ11_CAMCLKOUT);s3c2410_gpio_cfgpin(S3C2440_GPJ12, S3C2440_GPJ12_CAMRESET);/* init camera's virtual memory. */if (!request_mem_region((unsigned long)S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF, CARD_NAME)){ret = -EBUSY;goto error1;}/* remap the virtual memory. */camif_base_addr = (unsigned long)ioremap_nocache((unsigned long)S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF);if (camif_base_addr == (unsigned long)NULL){ret = -EBUSY;goto error2;}/* init camera clock. */pdev->clk = clk_get(NULL, "camif");if (IS_ERR(pdev->clk)){ret = -ENOENT;goto error3;}clk_enable(pdev->clk);camif_upll_clk = clk_get(NULL, "camif-upll");clk_set_rate(camif_upll_clk, 24000000);mdelay(100);/* init reference counter and its mutex. */mutex_init(&pdev->rcmutex);pdev->rc = 0;/* init image input source. */pdev->input = 0;/* init camif state and its lock. */pdev->state = CAMIF_STATE_FREE;/* init command code, command lock and the command wait queue. */pdev->cmdcode = CAMIF_CMD_NONE;init_waitqueue_head(&pdev->cmdqueue);/* register to videodev layer. */if (misc_register(&misc) < 0){ret = -EBUSY;goto error4;}printk(KERN_ALERT"s3c2440 camif init done\n");sccb_init();hw_reset_camif();has_ov9650 = s3c2440_ov9650_init() >= 0;s3c2410_gpio_setpin(S3C2410_GPG(4), 1);return 0;error4:clk_put(pdev->clk); error3:iounmap((void *)camif_base_addr); error2:release_mem_region((unsigned long)S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF);error1:return ret; }
轉(zhuǎn)載于:https://www.cnblogs.com/-song/archive/2011/11/25/3331928.html
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的网络摄像头4 cmos 0v9650,driver的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络摄像头3 cmos ov9650
- 下一篇: ---WebCam网络摄像头7 cmos