int jpeg_set_enc_param(struct jpeg_control *ctrl) { if (ctrl) { jpeg_sw_reset(ctrl->reg_base); } else { jpeg_err("jpeg ctrl is NULL\n"); return -1; } jpeg_set_clk_power_on(ctrl->reg_base); jpeg_set_mode(ctrl->reg_base, 0); jpeg_set_enc_in_fmt(ctrl->reg_base, ctrl->enc_param.in_fmt); jpeg_set_enc_out_fmt(ctrl->reg_base, ctrl->enc_param.out_fmt); jpeg_set_enc_dri(ctrl->reg_base, 2); jpeg_set_frame_size(ctrl->reg_base, ctrl->enc_param.width, ctrl->enc_param.height); jpeg_set_stream_buf(&ctrl->mem.stream_data_addr, ctrl->mem.base); jpeg_set_stream_addr(ctrl->reg_base, ctrl->mem.stream_data_addr); jpeg_set_frame_buf(&ctrl->mem.frame_data_addr, ctrl->mem.base); jpeg_set_frame_addr(ctrl->reg_base, ctrl->mem.frame_data_addr); jpeg_set_enc_coef(ctrl->reg_base); jpeg_set_enc_qtbl(ctrl->reg_base, ctrl->enc_param.quality); jpeg_set_enc_htbl(ctrl->reg_base); return 0; }
static void jpeg_device_enc_run(void *priv) { struct jpeg_ctx *ctx = priv; struct jpeg_dev *dev = ctx->dev; struct jpeg_enc_param enc_param; struct vb2_buffer *vb = NULL; unsigned long flags; dev = ctx->dev; spin_lock_irqsave(&ctx->dev->slock, flags); dev->mode = ENCODING; enc_param = ctx->param.enc_param; jpeg_sw_reset(dev->reg_base); jpeg_set_interrupt(dev->reg_base); jpeg_set_huf_table_enable(dev->reg_base, 1); jpeg_set_enc_tbl(dev->reg_base); jpeg_set_encode_tbl_select(dev->reg_base, enc_param.quality); jpeg_set_stream_size(dev->reg_base, enc_param.in_width, enc_param.in_height); jpeg_set_enc_out_fmt(dev->reg_base, enc_param.out_fmt); jpeg_set_enc_in_fmt(dev->reg_base, enc_param.in_fmt); vb = v4l2_m2m_next_dst_buf(ctx->m2m_ctx); jpeg_set_stream_buf_address(dev->reg_base, dev->vb2->plane_addr(vb, 0)); vb = v4l2_m2m_next_src_buf(ctx->m2m_ctx); if (enc_param.in_plane == 1) jpeg_set_frame_buf_address(dev->reg_base, enc_param.in_fmt, dev->vb2->plane_addr(vb, 0), 0, 0); if (enc_param.in_plane == 2) jpeg_set_frame_buf_address(dev->reg_base, enc_param.in_fmt, dev->vb2->plane_addr(vb, 0), dev->vb2->plane_addr(vb, 1), 0); if (enc_param.in_plane == 3) jpeg_set_frame_buf_address(dev->reg_base, enc_param.in_fmt, dev->vb2->plane_addr(vb, 0), dev->vb2->plane_addr(vb, 1), dev->vb2->plane_addr(vb, 2)); jpeg_set_encode_hoff_cnt(dev->reg_base, enc_param.out_fmt); jpeg_set_enc_dec_mode(dev->reg_base, ENCODING); spin_unlock_irqrestore(&ctx->dev->slock, flags); }