Linux I2C总线设备驱动模型分析(ov7740)(6)

/*
    CIPRCTRL:
        bit[23:19] -- 主突发长度(Main_burst)
        bit[18:14] -- 剩余突发长度(Remained_burst)
        bit[2]      -- 是否使能LastIRQ功能(不使能)
    */
    CalculateBurstSize(bytesperline, &Main_burst, &Remained_burst);
    *CIPRCTRL = (Main_burst<<19)|(Remained_burst<<14)|(0<<2);

/*
    CIPRSCPRERATIO:
        bit[31:28]: 预览缩放的变化系数(SHfactor_Pr)
        bit[22:16]: 预览缩放的水平比(PreHorRatio_Pr)
        bit[6:0]: 预览缩放的垂直比(PreVerRatio_Pr)

CIPRSCPREDST:
        bit[27:16]: 预览缩放的目标宽度(PreDstWidth_Pr)
        bit[11:0]: 预览缩放的目标高度(PreDstHeight_Pr)

CIPRSCCTRL:
        bit[29:28]: 告诉摄像头控制器(图片是缩小、放大)(ScaleUpDown_Pr)
        bit[24:16]: 预览主缩放的水平比(MainHorRatio_Pr)
        bit[8:0]: 预览主缩放的垂直比(MainVerRatio_Pr)

bit[31]: 必须固定设置为1
        bit[30]: 设置图像输出格式是RGB16、RGB24
        bit[15]: 预览缩放开始
    */
    cmos_ov7740_calculate_scaler_info();
    *CIPRSCPRERATIO = (sc.SHfactor<<28)|(sc.PreHorRatio<<16)|(sc.PreVerRatio<<0);
    *CIPRSCPREDST = (sc.PreDstWidth<<16)|(sc.PreDstHeight<<0);
    *CIPRSCCTRL |= (1<<31)|(sc.ScaleUpDown<<28)|(sc.MainHorRatio<<16)|(sc.MainVerRatio<<0);

/*
    CIPRTAREA:
        表示预览通道的目标区域
    */
    *CIPRTAREA = TargetHsize_Pr * TargetVsize_Pr;

/*
    CIIMGCPT:
        bit[31]: 用来使能摄像头控制器
        bit[30]: 使能编码通道
        bit[29]: 使能预览通道
    */
    *CIIMGCPT = (1<<31)|(1<<29);
    *CIPRSCCTRL |= (1<<15);

return 0;
}

/* A17 停止
 * 参考 : uvc_video_enable(video, 0)
 */
static int cmos_ov7740_vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type t)
{
    *CIPRSCCTRL &= ~(1<<15);
    *CIIMGCPT &= ~((1<<31)|(1<<29));

return 0;
}

static const struct v4l2_ioctl_ops cmos_ov7740_ioctl_ops = {
        // 表示它是一个摄像头设备
        .vidioc_querycap      = cmos_ov7740_vidioc_querycap,

/* 用于列举、获得、测试、设置摄像头的数据的格式 */
        .vidioc_enum_fmt_vid_cap  = cmos_ov7740_vidioc_enum_fmt_vid_cap,
        .vidioc_g_fmt_vid_cap    = cmos_ov7740_vidioc_g_fmt_vid_cap,
        .vidioc_try_fmt_vid_cap  = cmos_ov7740_vidioc_try_fmt_vid_cap,
        .vidioc_s_fmt_vid_cap    = cmos_ov7740_vidioc_s_fmt_vid_cap,
       
        /* 缓冲区操作: 申请/查询/放入队列/取出队列 */
        .vidioc_reqbufs      = cmos_ov7740_vidioc_reqbufs,

/* 说明: 因为我们是通过读的方式来获得摄像头数据,因此查询/放入队列/取出队列这些操作函数将不在需要 */
#if 0
        .vidioc_querybuf      = myuvc_vidioc_querybuf,
        .vidioc_qbuf          = myuvc_vidioc_qbuf,
        .vidioc_dqbuf        = myuvc_vidioc_dqbuf,
#endif

// 启动/停止
        .vidioc_streamon      = cmos_ov7740_vidioc_streamon,
        .vidioc_streamoff    = cmos_ov7740_vidioc_streamoff, 
};

/* A1 */
static int cmos_ov7740_open(struct file *file)
{
    return 0;
}

/* A18 关闭 */
static int cmos_ov7740_close(struct file *file)
{
   
    return 0;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/124de2ba14b952f5a166e369a62106bb.html