jpeg_drv_6589_enc.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. #include <mach/mt_typedefs.h>
  2. #include <asm/io.h>
  3. #include <linux/kernel.h>
  4. #include <linux/xlog.h>
  5. #include "jpeg_drv_6589_reg.h"
  6. #include "jpeg_drv_6589_common.h"
  7. #define JPEG_ENC_RST_BIT 0x1
  8. #define JPEG_ENC_CTRL_ENABLE_BIT 0x01
  9. #define JPEG_ENC_CTRL_DIS_GMC_BIT 0x02
  10. #define JPEG_ENC_CTRL_INT_EN_BIT 0x04
  11. #define JPEG_ENC_CTRL_YUV_BIT 0x18
  12. #define JPEG_ENC_CTRL_FILE_FORMAT_BIT 0x20
  13. #define JPEG_ENC_CTRL_GRAY_EN_BIT 0x80
  14. #define JPEG_ENC_CTRL_ULTRA_HIGH_EN_BIT 0x200
  15. #define JPEG_ENC_CTRL_RESTART_EN_BIT 0x400
  16. #define JPEG_ENC_CTRL_BURST_TYPE_MASK 0x00007000
  17. #define JPEG_ENC_CTRL_BURST_TYPE_SHIFT_COUNT 12
  18. #define JPEG_ENC_EN_DIS_GMC (1 << 2)
  19. #define JPEG_ENC_EN_JFIF_EXIF (1 << 5)
  20. #define JPEG_ENC_EN_SELF_INIT (1 << 16)
  21. #define JPEG_ENC_DEBUG_INFO0_GMC_IDLE_MASK (1 << 13)
  22. #define JPEG_MSG pr_debug
  23. #define JPEG_WRN pr_debug
  24. #define JPEG_ERR pr_debug
  25. kal_uint32 _jpeg_enc_int_status = 0;
  26. int jpeg_isr_enc_lisr(void)
  27. {
  28. unsigned int tmp, tmp1;
  29. /* _jpeg_enc_int_status = REG_JPEG_ENC_INTERRUPT_STATUS; */
  30. tmp1 = REG_JPEG_ENC_INTERRUPT_STATUS;
  31. tmp = tmp1 & (JPEG_DRV_ENC_INT_STATUS_MASK_ALLIRQ);
  32. if (tmp) {
  33. _jpeg_enc_int_status = tmp;
  34. /* / clear the interrupt status register */
  35. /* if(_jpeg_enc_int_status) */
  36. /* { */
  37. IMG_REG_WRITE(0, REG_ADDR_JPEG_ENC_INTERRUPT_STATUS); /* REG_JPEG_ENC_INTERRUPT_STATUS = 0; */
  38. return 0;
  39. /* } */
  40. } else if (_jpeg_enc_int_status) {
  41. IMG_REG_WRITE(0, REG_ADDR_JPEG_ENC_INTERRUPT_STATUS); /* REG_JPEG_ENC_INTERRUPT_STATUS = 0; */
  42. return 0;
  43. }
  44. return -1;
  45. }
  46. kal_uint32 jpeg_drv_enc_set_src_image(kal_uint32 width, kal_uint32 height, kal_uint32 yuv_format,
  47. kal_uint32 totalEncDU)
  48. {
  49. kal_uint32 ret = 1;
  50. ret &= jpeg_drv_enc_set_img_size(width, height);
  51. ret &= jpeg_drv_enc_set_encFormat(yuv_format);
  52. ret &= jpeg_drv_enc_set_blk_num(totalEncDU);
  53. return ret;
  54. }
  55. kal_uint32 jpeg_drv_enc_set_src_buf(kal_uint32 yuv_format, kal_uint32 img_stride,
  56. kal_uint32 mem_stride, kal_uint32 srcAddr, kal_uint32 srcAddr_C)
  57. {
  58. kal_uint32 ret = 1;
  59. if (yuv_format == 0x00 || yuv_format == 0x01) {
  60. if ((mem_stride & 0x1f) || (img_stride & 0x1f)) {
  61. JPEG_MSG
  62. ("JPEGENC: set image/memory stride not align 0x1f in fmt %x(%x/%x)!!\n",
  63. yuv_format, mem_stride, img_stride);
  64. ret = 0;
  65. }
  66. }
  67. ret &= jpeg_drv_enc_set_image_stride(img_stride);
  68. ret &= jpeg_drv_enc_set_memory_stride(mem_stride);
  69. ret &= jpeg_drv_enc_set_luma_addr(srcAddr);
  70. ret &= jpeg_drv_enc_set_chroma_addr(srcAddr_C);
  71. return ret;
  72. }
  73. /* ///////////////////////////////////////////////////////////////////////////// */
  74. kal_uint32 jpeg_drv_enc_ctrl_cfg(kal_uint32 exif_en, kal_uint32 quality,
  75. kal_uint32 restart_interval)
  76. {
  77. jpeg_drv_enc_set_quality(quality);
  78. jpeg_drv_enc_set_restart_interval(restart_interval);
  79. jpeg_drv_enc_set_EncodeMode(exif_en);
  80. return 1;
  81. /* if (0 != ctrl_cfg.gmc_disable) */
  82. /* REG_JPEG_ENC_CTRL |= JPEG_ENC_CTRL_DIS_GMC_BIT; */
  83. /* */
  84. /* REG_JPEG_ENC_CTRL |= JPEG_ENC_EN_SELF_INIT; */
  85. }
  86. void jpeg_drv_enc_dump_reg(void)
  87. {
  88. unsigned int reg_value = 0;
  89. unsigned int index = 0;
  90. JPEG_MSG("===== JPEG ENC DUMP =====\n");
  91. for (index = 0x100; index < JPEG_ENC_REG_COUNT; index += 4) {
  92. #ifdef FPGA_VERSION
  93. reg_value = *(volatile kal_uint32 *)(JPEG_ENC_BASE + index);
  94. #else
  95. /* reg_value = ioread32(JPEG_ENC_BASE + index); */
  96. IMG_REG_READ(reg_value, JPEG_DEC_BASE + index);
  97. #endif
  98. JPEG_MSG("+0x%x 0x%08x\n", index, reg_value);
  99. }
  100. }
  101. void jpeg_drv_enc_start(void)
  102. {
  103. unsigned int u4Value;
  104. u4Value = REG_JPEG_ENC_CTRL;
  105. u4Value |= (JPEG_ENC_CTRL_INT_EN_BIT | JPEG_ENC_CTRL_ENABLE_BIT);
  106. IMG_REG_WRITE((u4Value), REG_ADDR_JPEG_ENC_CTRL);
  107. /* REG_JPEG_ENC_CTRL |= (JPEG_ENC_CTRL_INT_EN_BIT | JPEG_ENC_CTRL_ENABLE_BIT); */
  108. }
  109. void jpeg_drv_enc_reset(void)
  110. {
  111. IMG_REG_WRITE((0), REG_ADDR_JPEG_ENC_RSTB); /* REG_JPEG_ENC_RSTB = 0; */
  112. IMG_REG_WRITE((1), REG_ADDR_JPEG_ENC_RSTB); /* REG_JPEG_ENC_RSTB = 1; */
  113. IMG_REG_WRITE((0), REG_ADDR_JPEG_ENC_CODEC_SEL);
  114. _jpeg_enc_int_status = 0;
  115. }
  116. kal_uint32 jpeg_drv_enc_warm_reset(void)
  117. {
  118. kal_uint32 timeout = 0xFFFFF;
  119. REG_JPEG_ENC_CTRL &= ~JPEG_ENC_CTRL_ENABLE_BIT;
  120. /* REG_JPEG_ENC_CTRL |= JPEG_ENC_CTRL_ENABLE_BIT; */
  121. while (0 == (REG_JPEG_ENC_DEBUG_INFO0 & JPEG_ENC_DEBUG_INFO0_GMC_IDLE_MASK)) {
  122. timeout--;
  123. if (0 == timeout) {
  124. JPEG_MSG("Wait for GMC IDLE timeout\n");
  125. return 0;
  126. }
  127. }
  128. REG_JPEG_ENC_RSTB &= ~(JPEG_ENC_RST_BIT);
  129. REG_JPEG_ENC_RSTB |= JPEG_ENC_RST_BIT;
  130. IMG_REG_WRITE((0), REG_ADDR_JPEG_ENC_CODEC_SEL); /* REG_JPEG_ENC_CODEC_SEL = 0; */
  131. _jpeg_enc_int_status = 0;
  132. return 1;
  133. }
  134. kal_uint32 jpeg_drv_enc_set_encFormat(kal_uint32 encFormat)
  135. {
  136. kal_uint32 val;
  137. unsigned int u4Value;
  138. if (encFormat & (~3)) {
  139. JPEG_ERR("JPEG_DRV_ENC: set encFormat Err %d!!\n", encFormat);
  140. return 0;
  141. }
  142. val = (encFormat & 3) << 3;
  143. #if 0
  144. /* REG_JPEG_ENC_CTRL &= ~JPEG_ENC_CTRL_YUV_BIT; */
  145. /* */
  146. /* REG_JPEG_ENC_CTRL |= val; */
  147. #else
  148. u4Value = REG_JPEG_ENC_CTRL;
  149. u4Value &= ~JPEG_ENC_CTRL_YUV_BIT;
  150. u4Value |= val;
  151. IMG_REG_WRITE((u4Value), REG_ADDR_JPEG_ENC_CTRL);
  152. #endif
  153. return 1;
  154. }
  155. kal_uint32 jpeg_drv_enc_set_quality(kal_uint32 quality)
  156. {
  157. unsigned int u4Value;
  158. if (quality == 0x8 || quality == 0xC) {
  159. JPEG_MSG("JPEGENC: set quality failed\n");
  160. return 0;
  161. }
  162. u4Value = REG_JPEG_ENC_QUALITY;
  163. u4Value = (u4Value & 0xFFFF0000) | quality;
  164. IMG_REG_WRITE((u4Value), REG_ADDR_JPEG_ENC_QUALITY);
  165. return 1;
  166. }
  167. kal_uint32 jpeg_drv_enc_set_img_size(kal_uint32 width, kal_uint32 height)
  168. {
  169. unsigned int u4Value;
  170. if ((width & 0xffff0000) || (height & 0xffff0000)) {
  171. JPEG_MSG("JPEGENC: img size exceed 65535, (%x, %x)!!\n", width, height);
  172. return 0;
  173. }
  174. u4Value = (width << 16) | height;
  175. IMG_REG_WRITE((u4Value), REG_ADDR_JPEG_ENC_IMG_SIZE); /* REG_JPEG_ENC_IMG_SIZE = (width << 16) | height; */
  176. return 1;
  177. }
  178. kal_uint32 jpeg_drv_enc_set_blk_num(kal_uint32 blk_num) /* NO_USE */
  179. {
  180. if (blk_num < 4)
  181. return 0;
  182. IMG_REG_WRITE((blk_num), REG_ADDR_JPEG_ENC_BLK_NUM); /* REG_JPEG_ENC_BLK_NUM = blk_num; */
  183. return 1;
  184. }
  185. kal_uint32 jpeg_drv_enc_set_luma_addr(kal_uint32 src_luma_addr)
  186. {
  187. if (src_luma_addr & 0x0F) {
  188. JPEG_MSG("JPEGENC: set LUMA addr not align (%x)!!\n", src_luma_addr);
  189. /* return 0; */
  190. }
  191. IMG_REG_WRITE((src_luma_addr), REG_ADDR_JPEG_ENC_SRC_LUMA_ADDR);
  192. return 1;
  193. }
  194. kal_uint32 jpeg_drv_enc_set_chroma_addr(kal_uint32 src_chroma_addr)
  195. {
  196. if (src_chroma_addr & 0x0F) {
  197. JPEG_MSG("JPEGENC: set CHROMA addr not align (%x)!!\n", src_chroma_addr);
  198. /* return 0; */
  199. }
  200. IMG_REG_WRITE((src_chroma_addr), REG_ADDR_JPEG_ENC_SRC_CHROMA_ADDR);
  201. return 1;
  202. }
  203. kal_uint32 jpeg_drv_enc_set_memory_stride(kal_uint32 mem_stride)
  204. {
  205. if (mem_stride & 0x0F) {
  206. JPEG_MSG("JPEGENC: set memory stride failed, not align to 0x1f (%x)!!\n",
  207. mem_stride);
  208. return 0;
  209. }
  210. IMG_REG_WRITE((mem_stride), REG_ADDR_JPEG_ENC_STRIDE); /* REG_JPEG_ENC_STRIDE = (mem_stride); */
  211. return 1;
  212. }
  213. kal_uint32 jpeg_drv_enc_set_image_stride(kal_uint32 img_stride)
  214. {
  215. if (img_stride & 0x0F) {
  216. JPEG_MSG("JPEGENC: set image stride failed, not align to 0x0f (%x)!!\n",
  217. img_stride);
  218. return 0;
  219. }
  220. IMG_REG_WRITE((img_stride), REG_ADDR_JPEG_ENC_IMG_STRIDE); /* REG_JPEG_ENC_IMG_STRIDE = (img_stride); */
  221. return 1;
  222. }
  223. void jpeg_drv_enc_set_restart_interval(kal_uint32 restart_interval)
  224. {
  225. unsigned int u4Value;
  226. u4Value = REG_JPEG_ENC_CTRL;
  227. if (0 != restart_interval) {
  228. u4Value |= JPEG_ENC_CTRL_RESTART_EN_BIT;
  229. IMG_REG_WRITE((u4Value), REG_ADDR_JPEG_ENC_CTRL);
  230. } else {
  231. u4Value &= ~JPEG_ENC_CTRL_RESTART_EN_BIT;
  232. IMG_REG_WRITE((u4Value), REG_ADDR_JPEG_ENC_CTRL);
  233. }
  234. IMG_REG_WRITE((restart_interval), REG_ADDR_JPEG_ENC_RST_MCU_NUM);
  235. }
  236. kal_uint32 jpeg_drv_enc_set_offset_addr(kal_uint32 offset)
  237. {
  238. if (offset & 0x0F) {
  239. JPEG_MSG("JPEGENC:WARN set offset addr %x\n", offset);
  240. /* return 0; */
  241. }
  242. IMG_REG_WRITE((offset), REG_ADDR_JPEG_ENC_OFFSET_ADDR); /* REG_JPEG_ENC_OFFSET_ADDR = offset; */
  243. return 1;
  244. }
  245. kal_uint32 jpeg_drv_enc_set_dst_buff(kal_uint32 dst_addr, kal_uint32 stall_size,
  246. kal_uint32 init_offset, kal_uint32 offset_mask)
  247. {
  248. if (stall_size < 624) {
  249. JPEG_MSG("JPEGENC:stall offset less than 624 to write header %d!!\n", stall_size);
  250. return 0;
  251. }
  252. if (offset_mask & 0x0F) {
  253. JPEG_MSG("JPEGENC: set offset addr %x\n", offset_mask);
  254. /* return 0; */
  255. }
  256. IMG_REG_WRITE((init_offset & (~0xF)), REG_ADDR_JPEG_ENC_OFFSET_ADDR);
  257. IMG_REG_WRITE((offset_mask & 0xF), REG_ADDR_JPEG_ENC_BYTE_OFFSET_MASK);
  258. IMG_REG_WRITE((dst_addr & (~0xF)), REG_ADDR_JPEG_ENC_DST_ADDR0);
  259. IMG_REG_WRITE(((dst_addr + stall_size) & (~0xF)), REG_ADDR_JPEG_ENC_STALL_ADDR0);
  260. return 1;
  261. }
  262. /* 0:JPG mode, 1:JFIF/EXIF mode */
  263. void jpeg_drv_enc_set_EncodeMode(kal_uint32 exif_en)
  264. {
  265. unsigned int u4Value;
  266. u4Value = REG_JPEG_ENC_CTRL;
  267. u4Value &= ~(JPEG_ENC_CTRL_FILE_FORMAT_BIT);
  268. IMG_REG_WRITE((u4Value), REG_ADDR_JPEG_ENC_CTRL);
  269. if (exif_en) {
  270. u4Value = REG_JPEG_ENC_CTRL;
  271. u4Value |= JPEG_ENC_EN_JFIF_EXIF;
  272. IMG_REG_WRITE((u4Value), REG_ADDR_JPEG_ENC_CTRL);
  273. }
  274. }
  275. void jpeg_drv_enc_set_gmc_disable_bit(void)
  276. {
  277. unsigned int u4Value;
  278. u4Value = REG_JPEG_ENC_CTRL;
  279. u4Value |= JPEG_ENC_EN_DIS_GMC;
  280. IMG_REG_WRITE((u4Value), REG_ADDR_JPEG_ENC_CTRL);
  281. }
  282. void jpeg_drv_enc_set_burst_type(kal_uint32 burst_type)
  283. {
  284. unsigned int u4Value;
  285. u4Value = REG_JPEG_ENC_CTRL;
  286. u4Value &= ~JPEG_ENC_CTRL_BURST_TYPE_MASK;
  287. u4Value |= (burst_type << JPEG_ENC_CTRL_BURST_TYPE_SHIFT_COUNT);
  288. IMG_REG_WRITE((u4Value), REG_ADDR_JPEG_ENC_CTRL);
  289. }
  290. kal_uint32 jpeg_drv_enc_get_cycle_count(void)
  291. {
  292. return REG_JPEG_ENC_TOTAL_CYCLE;
  293. }
  294. kal_uint32 jpeg_drv_enc_get_file_size(void)
  295. {
  296. return REG_JPEG_ENC_DMA_ADDR0 - REG_JPEG_ENC_DST_ADDR0;
  297. /* return REG_JPEG_ENC_CURR_DMA_ADDR - REG_JPEG_ENC_DST_ADDR0; */
  298. }
  299. #ifdef FPGA_VERSION
  300. kal_uint32 jpeg_drv_enc_get_result(void)
  301. {
  302. kal_uint32 file_size;
  303. file_size = jpeg_drv_enc_get_file_size();
  304. return file_size;
  305. }
  306. #else
  307. kal_uint32 jpeg_drv_enc_get_result(kal_uint32 *fileSize)
  308. {
  309. *fileSize = jpeg_drv_enc_get_file_size();
  310. if (_jpeg_enc_int_status & JPEG_DRV_ENC_INT_STATUS_DONE)
  311. return 0;
  312. else if (_jpeg_enc_int_status & JPEG_DRV_ENC_INT_STATUS_STALL)
  313. return 1;
  314. else if (_jpeg_enc_int_status & JPEG_DRV_ENC_INT_STATUS_VCODEC_IRQ)
  315. return 2;
  316. JPEG_MSG("JPEGENC: int_st %x!!\n", _jpeg_enc_int_status);
  317. return 3;
  318. }
  319. #endif