1 #include <mach/mt_typedefs.h>
3 #include <linux/kernel.h>
4 #include <linux/xlog.h>
7 #include "jpeg_drv_6589_reg.h"
8 #include "jpeg_drv_6589_common.h"
12 #define JPEG_ENC_RST_BIT 0x1
14 #define JPEG_ENC_CTRL_ENABLE_BIT 0x01
15 #define JPEG_ENC_CTRL_DIS_GMC_BIT 0x02
16 #define JPEG_ENC_CTRL_INT_EN_BIT 0x04
17 #define JPEG_ENC_CTRL_YUV_BIT 0x18
18 #define JPEG_ENC_CTRL_FILE_FORMAT_BIT 0x20
19 #define JPEG_ENC_CTRL_GRAY_EN_BIT 0x80
20 #define JPEG_ENC_CTRL_ULTRA_HIGH_EN_BIT 0x200
21 #define JPEG_ENC_CTRL_RESTART_EN_BIT 0x400
22 #define JPEG_ENC_CTRL_BURST_TYPE_MASK 0x00007000
23 #define JPEG_ENC_CTRL_BURST_TYPE_SHIFT_COUNT 12
25 #define JPEG_ENC_EN_DIS_GMC (1 << 2)
26 #define JPEG_ENC_EN_JFIF_EXIF (1 << 5)
27 #define JPEG_ENC_EN_SELF_INIT (1 << 16)
29 #define JPEG_ENC_DEBUG_INFO0_GMC_IDLE_MASK (1 << 13)
32 #define JPEG_MSG(...) xlog_printk(ANDROID_LOG_DEBUG, "xlog/jpeg", __VA_ARGS__)
33 #define JPEG_WRN(...) xlog_printk(ANDROID_LOG_WARN, "xlog/jpeg", __VA_ARGS__)
34 #define JPEG_ERR(...) xlog_printk(ANDROID_LOG_ERROR, "xlog/jpeg", __VA_ARGS__)
36 #define JPEG_MSG printk
37 #define JPEG_WRN printk
38 #define JPEG_ERR printk
40 kal_uint32 _jpeg_enc_int_status
= 0;
45 int jpeg_isr_enc_lisr(void)
47 unsigned int tmp
, tmp1
;
48 //_jpeg_enc_int_status = REG_JPEG_ENC_INTERRUPT_STATUS;
49 tmp1
= REG_JPEG_ENC_INTERRUPT_STATUS
;
50 tmp
= tmp1
& (JPEG_DRV_ENC_INT_STATUS_MASK_ALLIRQ
);
52 _jpeg_enc_int_status
= tmp
;
54 /// clear the interrupt status register
55 //if(_jpeg_enc_int_status)
57 IMG_REG_WRITE( 0, REG_ADDR_JPEG_ENC_INTERRUPT_STATUS
); //REG_JPEG_ENC_INTERRUPT_STATUS = 0;
60 }else if(_jpeg_enc_int_status
){
61 IMG_REG_WRITE( 0, REG_ADDR_JPEG_ENC_INTERRUPT_STATUS
); //REG_JPEG_ENC_INTERRUPT_STATUS = 0;
72 kal_uint32
jpeg_drv_enc_set_src_image(kal_uint32 width
, kal_uint32 height
, kal_uint32 yuv_format
, kal_uint32 totalEncDU
)
77 ret
&= jpeg_drv_enc_set_img_size(width
, height
);
79 ret
&= jpeg_drv_enc_set_encFormat(yuv_format
) ;
81 ret
&= jpeg_drv_enc_set_blk_num(totalEncDU
);
90 kal_uint32
jpeg_drv_enc_set_src_buf(kal_uint32 yuv_format
, kal_uint32 img_stride
, kal_uint32 mem_stride
, kal_uint32 srcAddr
, kal_uint32 srcAddr_C
)
93 if( yuv_format
== 0x00 || yuv_format
== 0x01 ){
94 if( (mem_stride
& 0x1f) || (img_stride
& 0x1f) ){
95 JPEG_MSG("JPEGENC: set image/memory stride not align 0x1f in fmt %x(%x/%x)!!\n", yuv_format
, mem_stride
, img_stride
);
100 ret
&= jpeg_drv_enc_set_image_stride(img_stride
);
102 ret
&= jpeg_drv_enc_set_memory_stride(mem_stride
);
104 ret
&= jpeg_drv_enc_set_luma_addr(srcAddr
);
106 ret
&= jpeg_drv_enc_set_chroma_addr(srcAddr_C
);
112 ///////////////////////////////////////////////////////////////////////////////
118 kal_uint32
jpeg_drv_enc_ctrl_cfg( kal_uint32 exif_en
, kal_uint32 quality
, kal_uint32 restart_interval
)
121 jpeg_drv_enc_set_quality(quality
);
123 jpeg_drv_enc_set_restart_interval(restart_interval
);
125 jpeg_drv_enc_set_EncodeMode(exif_en
);
129 //if (0 != ctrl_cfg.gmc_disable)
130 // REG_JPEG_ENC_CTRL |= JPEG_ENC_CTRL_DIS_GMC_BIT;
132 //REG_JPEG_ENC_CTRL |= JPEG_ENC_EN_SELF_INIT;
135 void jpeg_drv_enc_dump_reg(void)
137 unsigned int reg_value
= 0;
138 unsigned int index
= 0;
140 JPEG_MSG("===== JPEG ENC DUMP =====\n");
141 for(index
= 0x100 ; index
< JPEG_ENC_REG_COUNT
; index
+= 4){
143 reg_value
= *(volatile kal_uint32
*)(JPEG_ENC_BASE
+ index
);
145 //reg_value = ioread32(JPEG_ENC_BASE + index);
146 IMG_REG_READ(reg_value
, JPEG_DEC_BASE
+ index
);
148 JPEG_MSG("+0x%x 0x%08x\n", index
, reg_value
);
152 void jpeg_drv_enc_start(void)
154 unsigned int u4Value
;
156 u4Value
= REG_JPEG_ENC_CTRL
;
157 u4Value
|= (JPEG_ENC_CTRL_INT_EN_BIT
| JPEG_ENC_CTRL_ENABLE_BIT
);
158 IMG_REG_WRITE( (u4Value
), REG_ADDR_JPEG_ENC_CTRL
);
159 //REG_JPEG_ENC_CTRL |= (JPEG_ENC_CTRL_INT_EN_BIT | JPEG_ENC_CTRL_ENABLE_BIT);
162 void jpeg_drv_enc_reset(void)
166 IMG_REG_WRITE( (0), REG_ADDR_JPEG_ENC_RSTB
); //REG_JPEG_ENC_RSTB = 0;
167 IMG_REG_WRITE( (1), REG_ADDR_JPEG_ENC_RSTB
); //REG_JPEG_ENC_RSTB = 1;
169 IMG_REG_WRITE( (0), REG_ADDR_JPEG_ENC_CODEC_SEL
); //REG_JPEG_ENC_CODEC_SEL = 0; //switch SRAM to jpeg module
171 _jpeg_enc_int_status
= 0;
175 kal_uint32
jpeg_drv_enc_warm_reset(void)
177 kal_uint32 timeout
= 0xFFFFF;
179 REG_JPEG_ENC_CTRL
&= ~JPEG_ENC_CTRL_ENABLE_BIT
;
180 REG_JPEG_ENC_CTRL
|= JPEG_ENC_CTRL_ENABLE_BIT
;
183 while (0 == (REG_JPEG_ENC_DEBUG_INFO0
& JPEG_ENC_DEBUG_INFO0_GMC_IDLE_MASK
))
188 JPEG_MSG("Wait for GMC IDLE timeout\n");
193 REG_JPEG_ENC_RSTB
&= ~(JPEG_ENC_RST_BIT
);
194 REG_JPEG_ENC_RSTB
|= JPEG_ENC_RST_BIT
;
196 IMG_REG_WRITE( (0), REG_ADDR_JPEG_ENC_CODEC_SEL
); //REG_JPEG_ENC_CODEC_SEL = 0;
198 _jpeg_enc_int_status
= 0;
204 kal_uint32
jpeg_drv_enc_set_encFormat(kal_uint32 encFormat
)
207 unsigned int u4Value
;
209 if(encFormat
& (~3)){
210 JPEG_ERR("JPEG_DRV_ENC: set encFormat Err %d!!\n", encFormat
);
214 val
= (encFormat
& 3) << 3;
216 // REG_JPEG_ENC_CTRL &= ~JPEG_ENC_CTRL_YUV_BIT;
218 // REG_JPEG_ENC_CTRL |= val;
221 u4Value
= REG_JPEG_ENC_CTRL
;
223 u4Value
&= ~JPEG_ENC_CTRL_YUV_BIT
;
227 IMG_REG_WRITE( (u4Value
), REG_ADDR_JPEG_ENC_CTRL
);
237 kal_uint32
jpeg_drv_enc_set_quality(kal_uint32 quality
)
239 unsigned int u4Value
;
240 if (quality
== 0x8 || quality
== 0xC)
242 JPEG_MSG("JPEGENC: set quality failed\n");
245 u4Value
= REG_JPEG_ENC_QUALITY
;
246 u4Value
= (u4Value
& 0xFFFF0000) | quality
;
247 IMG_REG_WRITE( (u4Value
), REG_ADDR_JPEG_ENC_QUALITY
); //REG_JPEG_ENC_QUALITY = (REG_JPEG_ENC_QUALITY & 0xFFFF0000) | quality;
251 kal_uint32
jpeg_drv_enc_set_img_size(kal_uint32 width
, kal_uint32 height
)
253 unsigned int u4Value
;
254 if ((width
& 0xffff0000) || (height
& 0xffff0000))
256 JPEG_MSG("JPEGENC: img size exceed 65535, (%x, %x)!!\n", width
, height
);
259 u4Value
= (width
<< 16) | height
;
261 IMG_REG_WRITE( (u4Value
), REG_ADDR_JPEG_ENC_IMG_SIZE
); //REG_JPEG_ENC_IMG_SIZE = (width << 16) | height;
266 kal_uint32
jpeg_drv_enc_set_blk_num(kal_uint32 blk_num
) //NO_USE
273 IMG_REG_WRITE( (blk_num
), REG_ADDR_JPEG_ENC_BLK_NUM
); //REG_JPEG_ENC_BLK_NUM = blk_num;
278 kal_uint32
jpeg_drv_enc_set_luma_addr(kal_uint32 src_luma_addr
)
280 if (src_luma_addr
& 0x0F)
282 JPEG_MSG("JPEGENC: set LUMA addr not align (%x)!!\n", src_luma_addr
);
286 IMG_REG_WRITE( (src_luma_addr
), REG_ADDR_JPEG_ENC_SRC_LUMA_ADDR
); //REG_JPEG_ENC_SRC_LUMA_ADDR = src_luma_addr;
291 kal_uint32
jpeg_drv_enc_set_chroma_addr(kal_uint32 src_chroma_addr
)
293 if (src_chroma_addr
& 0x0F)
295 JPEG_MSG("JPEGENC: set CHROMA addr not align (%x)!!\n", src_chroma_addr
);
299 IMG_REG_WRITE( (src_chroma_addr
), REG_ADDR_JPEG_ENC_SRC_CHROMA_ADDR
); //REG_JPEG_ENC_SRC_CHROMA_ADDR = src_chroma_addr;
304 kal_uint32
jpeg_drv_enc_set_memory_stride(kal_uint32 mem_stride
)
306 if ( mem_stride
& 0x0F )
308 JPEG_MSG("JPEGENC: set memory stride failed, not align to 0x1f (%x)!!\n", mem_stride
);
312 IMG_REG_WRITE( (mem_stride
), REG_ADDR_JPEG_ENC_STRIDE
); //REG_JPEG_ENC_STRIDE = (mem_stride);
317 kal_uint32
jpeg_drv_enc_set_image_stride(kal_uint32 img_stride
)
320 if (img_stride
& 0x0F)
322 JPEG_MSG("JPEGENC: set image stride failed, not align to 0x0f (%x)!!\n", img_stride
);
326 IMG_REG_WRITE( (img_stride
), REG_ADDR_JPEG_ENC_IMG_STRIDE
); //REG_JPEG_ENC_IMG_STRIDE = (img_stride);
331 void jpeg_drv_enc_set_restart_interval(kal_uint32 restart_interval
)
333 unsigned int u4Value
;
335 u4Value
= REG_JPEG_ENC_CTRL
;
336 if (0 != restart_interval
)
338 u4Value
|= JPEG_ENC_CTRL_RESTART_EN_BIT
;
339 IMG_REG_WRITE( (u4Value
), REG_ADDR_JPEG_ENC_CTRL
); //REG_JPEG_ENC_CTRL |= JPEG_ENC_CTRL_RESTART_EN_BIT;
343 u4Value
&= ~JPEG_ENC_CTRL_RESTART_EN_BIT
;
344 IMG_REG_WRITE( (u4Value
), REG_ADDR_JPEG_ENC_CTRL
); //REG_JPEG_ENC_CTRL &= ~JPEG_ENC_CTRL_RESTART_EN_BIT;
346 IMG_REG_WRITE( (restart_interval
), REG_ADDR_JPEG_ENC_RST_MCU_NUM
); //REG_JPEG_ENC_RST_MCU_NUM = restart_interval;
350 kal_uint32
jpeg_drv_enc_set_offset_addr(kal_uint32 offset
)
354 JPEG_MSG("JPEGENC:WARN set offset addr %x\n", offset
);
358 IMG_REG_WRITE( (offset
), REG_ADDR_JPEG_ENC_OFFSET_ADDR
); //REG_JPEG_ENC_OFFSET_ADDR = offset;
363 kal_uint32
jpeg_drv_enc_set_dst_buff(kal_uint32 dst_addr
, kal_uint32 stall_size
, kal_uint32 init_offset
, kal_uint32 offset_mask
)
365 if (stall_size
< 624)
367 JPEG_MSG("JPEGENC:stall offset less than 624 to write header %d!!\n",stall_size
);
371 if (offset_mask
& 0x0F)
373 JPEG_MSG("JPEGENC: set offset addr %x\n", offset_mask
);
377 IMG_REG_WRITE( (init_offset
& (~0xF)), REG_ADDR_JPEG_ENC_OFFSET_ADDR
); //REG_JPEG_ENC_OFFSET_ADDR = init_offset & (~0xF);
379 IMG_REG_WRITE( (offset_mask
& 0xF), REG_ADDR_JPEG_ENC_BYTE_OFFSET_MASK
); //REG_JPEG_ENC_BYTE_OFFSET_MASK = (offset_mask & 0xF);
381 IMG_REG_WRITE( (dst_addr
& (~0xF)), REG_ADDR_JPEG_ENC_DST_ADDR0
); //REG_JPEG_ENC_DST_ADDR0 = dst_addr & (~0xF);
383 IMG_REG_WRITE( ((dst_addr
+ stall_size
) & (~0xF)), REG_ADDR_JPEG_ENC_STALL_ADDR0
); //REG_JPEG_ENC_STALL_ADDR0 = (dst_addr + stall_size) & (~0xF);
389 // 0:JPG mode, 1:JFIF/EXIF mode
390 void jpeg_drv_enc_set_EncodeMode(kal_uint32 exif_en
)
392 unsigned int u4Value
;
394 u4Value
= REG_JPEG_ENC_CTRL
;
395 u4Value
&= ~(JPEG_ENC_CTRL_FILE_FORMAT_BIT
);
396 IMG_REG_WRITE( (u4Value
), REG_ADDR_JPEG_ENC_CTRL
); //REG_JPEG_ENC_CTRL &= ~(JPEG_ENC_CTRL_FILE_FORMAT_BIT);
400 u4Value
= REG_JPEG_ENC_CTRL
;
401 u4Value
|= JPEG_ENC_EN_JFIF_EXIF
;
402 IMG_REG_WRITE( (u4Value
), REG_ADDR_JPEG_ENC_CTRL
); //REG_JPEG_ENC_CTRL |= JPEG_ENC_EN_JFIF_EXIF;
406 void jpeg_drv_enc_set_gmc_disable_bit(void)
408 unsigned int u4Value
;
409 u4Value
= REG_JPEG_ENC_CTRL
;
410 u4Value
|= JPEG_ENC_EN_DIS_GMC
;
411 IMG_REG_WRITE( (u4Value
), REG_ADDR_JPEG_ENC_CTRL
);
416 void jpeg_drv_enc_set_burst_type(kal_uint32 burst_type
)
418 unsigned int u4Value
;
420 u4Value
= REG_JPEG_ENC_CTRL
;
422 u4Value
&= ~JPEG_ENC_CTRL_BURST_TYPE_MASK
;
423 u4Value
|= (burst_type
<< JPEG_ENC_CTRL_BURST_TYPE_SHIFT_COUNT
);
426 IMG_REG_WRITE( (u4Value
), REG_ADDR_JPEG_ENC_CTRL
);
429 kal_uint32
jpeg_drv_enc_get_cycle_count()
431 return REG_JPEG_ENC_TOTAL_CYCLE
;
435 kal_uint32
jpeg_drv_enc_get_file_size()
437 return REG_JPEG_ENC_DMA_ADDR0
- REG_JPEG_ENC_DST_ADDR0
;
438 //return REG_JPEG_ENC_CURR_DMA_ADDR - REG_JPEG_ENC_DST_ADDR0;
443 kal_uint32
jpeg_drv_enc_get_result()
445 kal_uint32 file_size
;
446 file_size
= jpeg_drv_enc_get_file_size();
451 kal_uint32
jpeg_drv_enc_get_result(kal_uint32
*fileSize
)
453 *fileSize
= jpeg_drv_enc_get_file_size();
455 if(_jpeg_enc_int_status
& JPEG_DRV_ENC_INT_STATUS_DONE
)
459 else if(_jpeg_enc_int_status
& JPEG_DRV_ENC_INT_STATUS_STALL
)
462 }else if( _jpeg_enc_int_status
& JPEG_DRV_ENC_INT_STATUS_VCODEC_IRQ
){
466 JPEG_MSG("JPEGENC: int_st %x!!\n", _jpeg_enc_int_status
);