【转载】wince6.0+s3c6410摄像头驱动修改

这段时间开发一个图像识别的项目,基于WinCE6.0+s3c6410 系统,使用友坚恒天的6410 开发板。该开发板带有OV9650 摄像头接 口,但存在一个最大的问题,是摄像头获取的图像太小,只能看到320*240 的图像,我需要1280*1024 的图像,所以只能修改。本想驱动能提供接 口,可以在应用程序中修改像素,但仔细分析驱动源代码发现,摄像头的像素是在驱动中设置死的,所以只能修改驱动。修改驱动的过程中走了很多弯路,不过今天 终于成功了,可以成功显示640*480 和1280*1024 的图像。

驱动中需要修改的文件主要有:setting.h ,OV9650_MODUAL.cpp, sensorformat.h, s3c6410_camera.h.camera_pdd.cpp。

首先修改CMOS 的寄存器设置,驱动程序在OV9650_MODUAL.CPP 文件中对OV9650 寄存器进行了初始化。具体代码如下:

for (i=0; i<OV9650_REGS; i++)

    {

        HW_WriteRegisters(&ov9650_reg[i][0], 2);

         RETAILMSG(OV9650_DEBUG,(TEXT("HW_WriteRegisters: Reg[0x%x] = 0x%x, i = %d./r/n" ), ov9650_reg[i][0], ov9650_reg[i][1], i));

    }

    ModuleSetImageSize(VGA);

查看了一下,一般开发板提供的摄像头驱动都是将OV9650 的像素设置成了VGA(640*480) 格式,所以要显示更大的像素比如1280*1024 ,就需要修改寄存器初始化值,这个寄存器设置可以从OV 公司获得。 OV9650的寄存器比较复杂,而且datasheet写的很烂,所以还是建议从OV公司的国内FAE哪里要具体的设置。 OV9650 的寄存器初始化值在setting.h 文件中,二维数组ov9650_reg[][2] 为OV9650 的初始化列表,分别为寄存器地址和寄存器值。主要修改掉的几项为:

 {0x6a,0x41},//3e

       {0x12,0x00},//40

     {0x0c,0x00},//04

     {0x0d,0x00},//80

     {0x18,0xbe},//c6

     {0x17,0x1e},//26

     {0x32,0xbf},//ad

     {0x03,0x12},//00

     {0x1a,0x81},//3d

     {0x2a,0x10},//00

     {0x2b,0x34},//00

注释掉的值为640*480 时的值。

其实仔细研究代码可以发现,驱动中并没有在其他地方设置像素,只在寄存器初始化之后使用 ModuleSetImageSize( ) 函数设置了一下像素,所以在初始化设置好像素之后,ModuleSetImageSize(VGA) 这行代码完全可以去掉。如果要保留改函数,要显示1280*1024像素的图像,那需要将其改为: ModuleSetImageSize(SXGA);但 ModuleSetImageSize()函数的定义中并没有SXGA选项,所以需要添加部分代码,修改后的定义如下:

int ModuleSetImageSize(int imageSize)
{
    BYTE sizeValue[2];
    
    sizeValue[0] = 0x12;
    switch(imageSize)
    {
        case SXGA://添加项 
            sizeValue[1] = 0x00;
            break;

        case VGA:
            sizeValue[1] = 0x40;
            break;
        case CIF:
            sizeValue[1] = 0x20;
            break;
        case QVGA:
            sizeValue[1] = 0x10;
            break;
        case QCIF:
            sizeValue[1] = 0x08;
            break;
        case RAW_RGB:
            sizeValue[1] = 0x04;
            break;
    }
    
    HW_WriteRegisters(sizeValue, 2);
    return TRUE;
}

还要修改预览缓存的大小,在 s3c6410_camera.h 文件中:

#define PREVIEW_BUFFER_SIZE      10485760   // 1280*1024*2*4

                                        //2457600   //640*480*2*4       

//614400//  ( 320*240*2  )  * MAX_HW_FRAMES

其中,10485760 为预览1280*1024 像素图像的缓存大小,2457600 为预览640*480 图像的缓存大小,可根据自己需要的像素大小设置。

接下来对 sensorformat.h 文件进行修改 :

/* 原始部分

MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_0, 160, 120, 16, 30);

MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_1, 176, 144, 16, 30);

MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_2, 320, 240, 16, 15);

MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_3, 320, 240, 16, 30);

MAKE_STREAM_MODE_YV12(DCAM_StreamMode_5, 176, -144, 12, 15);

MAKE_STREAM_MODE_YV12(DCAM_StreamMode_6, 320, -240, 12, 15);

MAKE_STREAM_MODE_YV12(DCAM_StreamMode_7, 176, -144, 12, 15);

MAKE_STREAM_MODE_YV12(DCAM_StreamMode_8, 640, -480, 12, 15);

MAKE_STREAM_MODE_YV12(DCAM_StreamMode_9, 240, -180, 12, 15);

 

*/

//修改掉的部分:

MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_0, 160, 120, 16, 30);

MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_1, 176, 144, 16, 30);

//MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_2, 320, 240, 16, 15);

MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_2, 320, 240, 16, 30);

MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_3, 640, 480, 16, 15);

MAKE_STREAM_MODE_RGB565(DCAM_StreamMode_4, 1280, 1024, 16, 15);// 新增加

 

MAKE_STREAM_MODE_YV12(DCAM_StreamMode_5, 176, -144, 12, 15);

MAKE_STREAM_MODE_YV12(DCAM_StreamMode_6, 320, -240, 12, 15);

MAKE_STREAM_MODE_YV12(DCAM_StreamMode_7, 176, -144, 12, 15);

MAKE_STREAM_MODE_YV12(DCAM_StreamMode_8, 640, -480, 12, 15);// 新增加

MAKE_STREAM_MODE_YV12(DCAM_StreamMode_9, 1280, -1024, 12, 15);// 新增加

最后修改文件camera_pdd.cpp, 注释掉的部分为原来驱动的代码,注意这部分需要上面修改掉的部分对应。

/* m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[0] = &DCAM_StreamMode_5;

    m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[1] = &DCAM_StreamMode_6;

    m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[2] = &DCAM_StreamMode_7;

    m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[3] = &DCAM_StreamMode_8;

    m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[4] = &DCAM_StreamMode_9;

     */

      m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[0] = &DCAM_StreamMode_9;

    m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[1] = &DCAM_StreamMode_8;

    m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[2] = &DCAM_StreamMode_7;

    m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[3] = &DCAM_StreamMode_6;

m_pModeVideoFormat[CAPTURE].pCsDataRangeVideo[4] = &DCAM_StreamMode_5;

  /* m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[0] = &DCAM_StreamMode_0;

        m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[1] = &DCAM_StreamMode_1;

        m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[2] = &DCAM_StreamMode_2;

        m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[3] = &DCAM_StreamMode_3;

         */

         m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[0] = &DCAM_StreamMode_4;//1280*1024

        m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[1] = &DCAM_StreamMode_3;

        m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[2] = &DCAM_StreamMode_2;

        m_pModeVideoFormat[PREVIEW].pCsDataRangeVideo[3] = &DCAM_StreamMode_1;

经过以上修改,就算大工告成了。

以上是我自己修改过程的总结,如果有错误和遗漏的地方,还望高手多多指教。

原文地址:http://blog.csdn.net/zpf03/article/details/5903484

转载于:https://www.cnblogs.com/gooogleman/archive/2011/07/11/2102862.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值