前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >120帧高速动态捕捉GC0308模块

120帧高速动态捕捉GC0308模块

作者头像
云深无际
发布2021-04-14 11:09:42
1.6K0
发布2021-04-14 11:09:42
举报
文章被收录于专栏:云深之无迹云深之无迹

啊,淘宝真是个好地方,稀奇古怪得东西真的好多哇.这个模块我购物车放好久了,今天查快递得时候又看到了.我觉得有缘,再分享一下.

很贴心得送一个USB连接线

1.30万像素小体积特殊应用摄像头模组

2.产品尺寸:25MM*12MM*6MM

3.产品芯片:GC0308(1/6.5'')

4.最高分辨率:

320*240 120fps黑白款

另可做彩色款640*480 30fps

5.视场角:50

120这个场景我不知道有没有.黑白还是可以接受得,就是分辨率感人但是做个扫描二维码得.完全没有压力.

是的,你没有看错.120帧率的是黑白的。如果要彩色的只能做到30帧

320*240分辨率是可以120帧的,发热有点大.

我顺手查了一下芯片得手册

GC0308摄像头驱动程序使用的是linux v4l2协议,通过i2c信号进行控制。GC0308摄像头,对上电时序要求很严格,一定要根据datasheet初始化摄像头。

本驱动使用的3.10内核,所以首先要配置dts,在内核启动阶段支持摄像头,结合硬件原理图,首先配置硬件接口属性:

代码语言:javascript
复制
pinctrl_ipu1_4: ipu1grp-4 { /*++++  GC0308  camera */
            fsl,pins = <
                MX6QDL_PAD_GPIO_3__CCM_CLKO2               0x130b0    /*时钟*/
                MX6QDL_PAD_CSI0_DAT10__GPIO5_IO28          0x80000000  <span style="font-family: Arial, Helvetica, sans-serif;">/*CAM_nRST_CSI0_DAT10*/</span>
                MX6QDL_PAD_CSI0_DAT11__GPIO5_IO29          0x80000000 /* DAT11 */ <span style="font-family: Arial, Helvetica, sans-serif;">/*CAM_SHDN_CSI0_DAT11*/</span>
                MX6QDL_PAD_CSI0_DAT12__IPU1_CSI0_DATA12    0x80000000  /*12-19八条数据线*/
                MX6QDL_PAD_CSI0_DAT13__IPU1_CSI0_DATA13    0x80000000
                MX6QDL_PAD_CSI0_DAT14__IPU1_CSI0_DATA14    0x80000000
                MX6QDL_PAD_CSI0_DAT15__IPU1_CSI0_DATA15    0x80000000
                MX6QDL_PAD_CSI0_DAT16__IPU1_CSI0_DATA16    0x80000000
                MX6QDL_PAD_CSI0_DAT17__IPU1_CSI0_DATA17    0x80000000
                MX6QDL_PAD_CSI0_DAT18__IPU1_CSI0_DATA18    0x80000000
                MX6QDL_PAD_CSI0_DAT19__IPU1_CSI0_DATA19    0x80000000
                MX6QDL_PAD_CSI0_DATA_EN__IPU1_CSI0_DATA_EN 0x80000000  /* 硬件悬空*/
                MX6QDL_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK   0x80000000   /*像素时钟*/
                MX6QDL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC      0x80000000
                MX6QDL_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC     0x80000000
                >;
        };

然后配置摄像头属性:

代码语言:javascript
复制
&i2c3{
    clock-frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c3_1>;
    status = "okay";

    gc0308: gc0308@21{
        compatible = "gc0308-capture";
        reg = <0x21>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ipu1_4>; /* GC0308  camera*/
        clocks = <&clks 201>;
        clock-names = "csi_mclk";
        DOVDD-supply = <&vgen4_reg>; /* 1.8v */
        AVDD-supply = <&vgen3_reg>;  /* 2.8v, on rev C board is VGEN3,
                        on rev B board is VGEN5 */
        DVDD-supply = <&vgen2_reg>;  /* 1.5v*/
        pwn-gpios = <&gpio5 29 1>;   /* active low: SD1_DAT0 */
        rst-gpios = <&gpio5 28 0>;   /* active high: SD1_DAT1 */
        csi_id = <0>;
        mclk = <24000000>;
        mclk_source = <0>;
    };

};

部分内核驱动代码分析:

代码语言:javascript
复制
static const struct i2c_device_id gc0308_id[] = {                                                                     
    {"gc0308-capture", 0},                                                                                            
    {},                                                                                                               
};                                                                                                                    
                                                                                                                      
MODULE_DEVICE_TABLE(i2c, gc0308_id);

将gc0308_id加入i2c队列,当在dts中有相应名字的设备声明时,调用驱动程序的probe函数。

代码语言:javascript
复制
static struct i2c_driver gc0308_i2c_driver = {
    .driver = {
          .owner = THIS_MODULE,
          .name  = "gc0308-capture",
          },
    .probe  = gc0308_probe,
    .remove = gc0308_remove,
    .id_table = gc0308_id,
};

驱动程序初始化的时候,加入到i2c设备。

代码语言:javascript
复制
static struct i2c_driver gc0308_i2c_driver = {
    .driver = {
          .owner = THIS_MODULE,
          .name  = "gc0308-capture",
          },
    .probe  = gc0308_probe,
    .remove = gc0308_remove,
    .id_table = gc0308_id,
};

I2C数据读写

代码语言:javascript
复制
static struct v4l2_int_ioctl_desc gc0308_ioctl_desc[] = {
    {vidioc_int_dev_init_num, (v4l2_int_ioctl_func *)ioctl_dev_init},
    {vidioc_int_dev_exit_num, ioctl_dev_exit},
    {vidioc_int_s_power_num, (v4l2_int_ioctl_func *)ioctl_s_power},
    {vidioc_int_g_ifparm_num, (v4l2_int_ioctl_func *)ioctl_g_ifparm},
    {vidioc_int_init_num, (v4l2_int_ioctl_func *)ioctl_init},
    {vidioc_int_enum_fmt_cap_num,
                (v4l2_int_ioctl_func *)ioctl_enum_fmt_cap},
    {vidioc_int_g_fmt_cap_num, (v4l2_int_ioctl_func *)ioctl_g_fmt_cap},
    {vidioc_int_g_parm_num, (v4l2_int_ioctl_func *)ioctl_g_parm},
    {vidioc_int_s_parm_num, (v4l2_int_ioctl_func *)ioctl_s_parm},
    {vidioc_int_g_ctrl_num, (v4l2_int_ioctl_func *)ioctl_g_ctrl},
    {vidioc_int_s_ctrl_num, (v4l2_int_ioctl_func *)ioctl_s_ctrl},
    {vidioc_int_enum_framesizes_num,
                (v4l2_int_ioctl_func *)ioctl_enum_framesizes},
    {vidioc_int_g_chip_ident_num,
                (v4l2_int_ioctl_func *)ioctl_g_chip_ident},
};

一系列ioctl函数的指针数组,供应用程序调用。

代码语言:javascript
复制
static int get_device_id(void)
{
    u8 au8RegBuf[2] = {0};
    u8 u8RdVal = 0;
    au8RegBuf[0] = 0x00;
 
    if (1 != i2c_master_send(gc0308_data.i2c_client, au8RegBuf, 1)) {
        pr_err("%s:write reg error:reg=%x\n",
                __func__, 0xfb);
        return -1;
    }
 
    if (1 != i2c_master_recv(gc0308_data.i2c_client, &u8RdVal, 1)) {
        pr_err("%s:read reg error:reg=%x,val=%x\n",
                __func__, 0xfb, u8RdVal);
        return -1;
    }
 
    printk(KERN_INFO "u8RdVal=%x\n\n", u8RdVal);
 
    return u8RdVal;
}

读取设备ID,具体读ID的指令,根据datasheet确定。

当ID成功读到了,接下来,设置多个摄像头属性,通常做成一个数组。此时摄像头基本能工作了。

当插入驱动模块以后会在/dev/ 目录下产生一个videoX 设备,这时候可以使用cheese xawtv等程序进行测试。

随便分析一波驱动.玩的愉快呀!!!.有应用场景得时候,记得喊我一起玩耍!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档