s3c6410 攝像頭圖像鏡像問題筆記

攝像頭鏡像的問題經常碰到 一直只是測試沒有深入去研究 最近看了下 找到了v4l2下面的相關定義 首先上代碼 這個是qt4上面用到的 其它的步驟這裏就不貼代碼了

    struct v4l2_control vc;
    vc.id = V4L2_CID_VFLIP;
    vc.value = 0;

    /* Set up for mirror */
    if (ioctl(fd, VIDIOC_S_CTRL, &vc) < 0) {
        emit display_error(tr("VIDIOC_S_CTRL").arg(QString(strerror(errno))));
        return -1;
    }
這裏直接設置成FLIP_Y_AXIS即垂直方向翻轉 不同的內核版本這裏的vc設置有可能不一樣 我這裏用的是2.6.38的版本

還有水平方向翻轉V4L2_CID_HFLIP

在videodev2.h中定義了這兩個宏

#define V4L2_CID_HFLIP			(V4L2_CID_BASE+20)
#define V4L2_CID_VFLIP			(V4L2_CID_BASE+21)

對應驅動

drivers/media/video/samsung/fimc/s3c_fimc_v4l2.c 函數s3c_fimc_v4l2_s_ctrl中

	case V4L2_CID_HFLIP:
		frame->flip = FLIP_X_AXIS;
		ctrl->rot90 = 0;
		s3c_fimc_change_rotate(ctrl);
		break;

	case V4L2_CID_VFLIP:
		frame->flip = FLIP_Y_AXIS;
		ctrl->rot90 = 0;
		s3c_fimc_change_rotate(ctrl);
		break;
在函數s3c_fimc_change_rotate中最張會去設置6410中的CAMIF中的CICOTRGFMT寄存器的第14-15位

void s3c_fimc_change_rotate(struct s3c_fimc_control *ctrl)
{
	u32 cfg;

	if (ctrl->rot90)
		s3c_fimc_set_rot90(ctrl);

	if (ctrl->out_type == PATH_OUT_DMA) {
		cfg = readl(ctrl->regs + S3C_CIPRTRGFMT);
		cfg &= ~S3C_CIPRTRGFMT_FLIP_MASK;
		cfg |= (ctrl->out_frame.flip << S3C_CIPRTRGFMT_FLIP_SHIFT);

		writel(cfg, ctrl->regs + S3C_CIPRTRGFMT);
	}
}

重新編譯應用程序問題解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章