camif.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:29k
源码类别:

uCOS

开发平台:

C/C++

  1. /************************************************************
  2. File Name : camif.c
  3. Descriptions
  4.  -S3C2440 camera test routines & basic libraries
  5. History
  6.  - July 23, 2003. Draft Version 0.0 by purnnamu
  7.  - Janualy 15, 2004. Modifed by Boaz
  8. Copyright (c) 2004 SAMSUNG Electronics.
  9. # However, Anybody can use this code without our permission.  
  10. *************************************************************/
  11. #include <ctype.h>
  12. #include "def.h"
  13. #include "2440addr.h"
  14. #include "2440lib.h"
  15. #include "camif.h"
  16. #include "lcdlib.h"
  17. #include "glib.h"
  18. #include "camproset.h" // for camera setting
  19. //#include ".bmppqvga16bsm5.h"
  20. #include ".bmp422jpeg.h"
  21. #include ".bmp420jpeg.h"
  22. #include ".bmpforeman_cif_420.H"
  23. volatile U32 camTestMode;
  24. volatile U32 camCodecCaptureCount;
  25. volatile U32 camPviewCaptureCount;
  26. volatile U32 camCodecStatus;
  27. volatile U32 camPviewStatus;
  28. volatile U32 amount;
  29. U32 save_GPJCON, save_GPJDAT, save_GPJUP;
  30. U8 flagCaptured_P = 0;
  31. U8 flagCaptured_C = 0;
  32. void * func_camera_test[][2]=
  33. {
  34. (void *)Test_CamPreview, "Preview Test ",
  35. (void *)Test_CamCodec, "Codec Test ",
  36. (void *)Camera_Iic_Test, "IIC interface test ",
  37. (void *)Test_YCbCr_to_RGB, "YCbCr2RGB test",
  38. 0,0
  39. };
  40. void Camera_Test(void)
  41. {
  42. int i;
  43. Uart_Printf("n======  Camera Interface Test Start ======n");
  44. CamReset();
  45. // Initializing camif
  46. rCLKCON |= (1<<19); // enable camclk
  47. CamPortSet();
  48. ChangeUPllValue(60, 4, 1); // UPLL clock = 96MHz, PLL input 16.9344MHz
  49. rCLKDIVN|=(1<<3); // UCLK 48MHz setting for UPLL 96MHz
  50. // 0:48MHz, 1:24MHz, 2:16MHz, 3:12MHz...
  51. // Camera clock = UPLL/[(CAMCLK_DIV+1)X2]
  52. Uart_Printf("1...n");
  53. switch(USED_CAM_TYPE)
  54. {
  55. case CAM_AU70H :
  56. if (AU70H_VIDEO_SIZE==1152)
  57. SetCAMClockDivider(CAMCLK24000000); //Set Camera Clock for SXGA
  58. if (AU70H_VIDEO_SIZE==640)
  59. SetCAMClockDivider(CAMCLK16000000); //Set Camera Clock for VGA
  60. break;
  61. case CAM_S5X3A1 :
  62. SetCAMClockDivider(CAMCLK24000000); //Set Camera Clock for SXGA
  63. break;
  64. default :  // 24MHz
  65. SetCAMClockDivider(CAMCLK24000000); //Set Camera Clock 24MHz s5x532, ov7620
  66. break;
  67. }
  68. Uart_Printf("2...n");
  69. // Initializing camera module
  70. CamModuleReset(); // s5x532 must do this..
  71. Delay(500); // ready time of s5x433, s5x532 IIC interface. needed...
  72. CameraModuleSetting();
  73. Uart_Printf("Initializing end...n");
  74. while(1)
  75. {
  76. i=0;
  77. Uart_Printf("nn");
  78. while(1)
  79. {   //display menu
  80. Uart_Printf("%2d:%sn",i,func_camera_test[i][1]);
  81. i++;
  82. if((int)(func_camera_test[i][0])==0)
  83. {
  84. Uart_Printf("n");
  85. break;
  86. }
  87. if((i%4)==0)
  88. Uart_Printf("n");
  89. }
  90. Uart_Printf("nPress only Enter key to exit : ");
  91. i = Uart_GetIntNum();
  92. if(i==-1) break; // return.
  93. if(i>=0 && (i<((sizeof(func_camera_test)-1)/8)) ) // select and execute...
  94. ( (void (*)(void)) (func_camera_test[i][0]) )();
  95. }
  96. Uart_Printf("n====== Camera IF Test program end ======n");
  97. // CamModuleReset(); // s5x532 must do this..
  98. rCLKCON &= ~(1<<19); // disable camclk
  99. }
  100. void CamPortSet(void)
  101. {
  102. save_GPJCON = rGPJCON;
  103. save_GPJDAT = rGPJDAT;
  104. save_GPJUP = rGPJUP;
  105. rGPJCON = 0x2aaaaaa;
  106. rGPJDAT = 0;
  107. rGPJUP = 0;
  108. }
  109. void CamPortReturn(void)
  110. {
  111. rGPJCON = save_GPJCON;
  112. rGPJDAT = save_GPJDAT;
  113. rGPJUP = save_GPJUP;
  114. }
  115. void CamPreviewIntUnmask(void)
  116. {
  117.     rINTSUBMSK &= ~(BIT_SUB_CAM_P);//INT CAMERA Port A ENABLE 
  118.     rINTMSK &= ~(BIT_CAM);
  119. }
  120. void CamCodecIntUnmask(void)
  121. {
  122.     rINTSUBMSK &= ~(BIT_SUB_CAM_C);//INT CAMERA Port B ENABLE 
  123.     rINTMSK &= ~(BIT_CAM);
  124. }
  125. void CamPreviewIntMask(void)
  126. {
  127.     rINTSUBMSK |= BIT_SUB_CAM_P;//INT CAMERA Port A ENABLE 
  128.     rINTMSK |= (BIT_CAM);
  129. }
  130. void CamCodecIntMask(void)
  131. {
  132.     rINTSUBMSK |= BIT_SUB_CAM_C;//INT CAMERA Port B ENABLE 
  133.     rINTMSK |= (BIT_CAM);
  134. }
  135. /******************************************************
  136.  *                                                                       *    
  137.  *                       camera interface initialization                     *
  138.  *                                                                             *     
  139.  *******************************************************/
  140. void CamReset(void)
  141. {
  142. rCIGCTRL |= (1<<31); //camera I/F soft reset
  143. Delay(10);
  144. rCIGCTRL &= ~(1<<31);
  145. }
  146. void CamModuleReset(void)
  147. {
  148. switch(USED_CAM_TYPE)
  149. {
  150. case CAM_OV7620 : // reset - active high
  151. case CAM_S5X532 : // reset - active low, but H/W inverted.. so, in this case active high
  152. case CAM_S5X433 : // reset - active low, but H/W inverted.. so, in this case active high
  153. case CAM_S5X3A1 : // reset - active low, but H/W inverted.. so, in this case active high
  154. rCIGCTRL |= (1<<30);   //external camera reset high
  155. Delay(30);
  156. rCIGCTRL &= ~(1<<30); //external camera reset low
  157. break;
  158. case CAM_AU70H : // reset - active low
  159. default :
  160. rCIGCTRL &= ~(1<<30); //external camera reset low
  161. Delay(10);
  162. rCIGCTRL |= (1<<30); //external camera reset high
  163. break;
  164. }
  165. }
  166. // 0:48MHz, 1:24MHz, 2:16MHz, 3:12MHz...
  167. // Camera clock = UPLL/[(CAMCLK_DIV+1)X2]
  168. void SetCAMClockDivider(int divn) 
  169. {
  170. rCAMDIVN = (rCAMDIVN & ~(0xf))|(1<<4)|(divn); // CAMCLK is divided..
  171. }
  172. /* Description of Parameters
  173. CoDstWidth: Destination Width of Codec Path
  174. CoDstHeight: Destination Height of Codec Path
  175. PrDstWidth: Destination Width of Preview Path
  176. PrDstHeight: Destination Height of Preview Path
  177. WinHorOffset: Size of Window Offset for Horizontal Direction
  178. WinVerOffset: Size of Window Offset for Vertical Direction
  179. CoFrameBuffer: Start Address for Codec DMA
  180. PrFrameBuffer: Start Address for Previe DMA
  181. */
  182. void CamInit(U32 CoDstWidth, U32 CoDstHeight, U32 PrDstWidth, U32 PrDstHeight, 
  183. U32 WinHorOffset, U32 WinVerOffset,  U32 CoFrameBuffer, U32 PrFrameBuffer)
  184. {
  185. U32 WinOfsEn;
  186. U32 divisor, multiplier;
  187. U32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC, MainBurstSizeRGB, RemainedBurstSizeRGB;
  188. U32 H_Shift, V_Shift, PreHorRatio, PreVerRatio, MainHorRatio, MainVerRatio;
  189. U32 SrcWidth, SrcHeight;
  190. U32 ScaleUp_H_Co, ScaleUp_V_Co, ScaleUp_H_Pr, ScaleUp_V_Pr;
  191. //constant for calculating codec dma address
  192. if(CAM_CODEC_OUTPUT)
  193. divisor=2; //CCIR-422
  194. else
  195. divisor=4; //CCIR-420
  196. //constant for calculating preview dma address
  197. if(CAM_PVIEW_OUTPUT)
  198. multiplier=4;
  199. else
  200. multiplier=2;
  201. if(WinHorOffset==0 && WinVerOffset==0)
  202. WinOfsEn=0;
  203. else
  204. WinOfsEn=1;
  205. SrcWidth=CAM_SRC_HSIZE-WinHorOffset*2;
  206. SrcHeight=CAM_SRC_VSIZE-WinVerOffset*2;
  207. if(SrcWidth>=CoDstWidth) ScaleUp_H_Co=0; //down
  208. else ScaleUp_H_Co=1; //up
  209. if(SrcHeight>=CoDstHeight) ScaleUp_V_Co=0;
  210. else ScaleUp_V_Co=1;
  211. if(SrcWidth>=PrDstWidth) ScaleUp_H_Pr=0; //down
  212. else ScaleUp_H_Pr=1; //up
  213. if(SrcHeight>=PrDstHeight) ScaleUp_V_Pr=0;   // edited 040225
  214. else ScaleUp_V_Pr=1;
  215. ////////////////// common control setting
  216. rCIGCTRL |= (1<<26)|(0<<27); // inverse PCLK, test pattern
  217. rCIWDOFST = (1<<30)|(0xf<<12); // clear overflow 
  218. rCIWDOFST = 0;
  219. rCIWDOFST=(WinOfsEn<<31)|(WinHorOffset<<16)|(WinVerOffset);
  220. rCISRCFMT=(CAM_ITU601<<31)|(0<<30)|(0<<29)|(CAM_SRC_HSIZE<<16)|(CAM_ORDER_YCBYCR<<14)|(CAM_SRC_VSIZE);
  221. ////////////////// codec port setting
  222. if (CAM_CODEC_4PP)
  223. {
  224. rCICOYSA1=CoFrameBuffer;
  225. rCICOYSA2=rCICOYSA1+CoDstWidth*CoDstHeight+2*CoDstWidth*CoDstHeight/divisor;
  226. rCICOYSA3=rCICOYSA2+CoDstWidth*CoDstHeight+2*CoDstWidth*CoDstHeight/divisor;
  227. rCICOYSA4=rCICOYSA3+CoDstWidth*CoDstHeight+2*CoDstWidth*CoDstHeight/divisor;
  228. rCICOCBSA1=rCICOYSA1+CoDstWidth*CoDstHeight;
  229. rCICOCBSA2=rCICOYSA2+CoDstWidth*CoDstHeight;
  230. rCICOCBSA3=rCICOYSA3+CoDstWidth*CoDstHeight;
  231. rCICOCBSA4=rCICOYSA4+CoDstWidth*CoDstHeight;
  232. rCICOCRSA1=rCICOCBSA1+CoDstWidth*CoDstHeight/divisor;
  233. rCICOCRSA2=rCICOCBSA2+CoDstWidth*CoDstHeight/divisor;
  234. rCICOCRSA3=rCICOCBSA3+CoDstWidth*CoDstHeight/divisor;
  235. rCICOCRSA4=rCICOCBSA4+CoDstWidth*CoDstHeight/divisor;
  236. }
  237. else
  238. {
  239. rCICOYSA1=CoFrameBuffer;
  240. rCICOYSA2=rCICOYSA1;
  241. rCICOYSA3=rCICOYSA1;
  242. rCICOYSA4=rCICOYSA1;
  243. rCICOCBSA1=rCICOYSA1+CoDstWidth*CoDstHeight;
  244. rCICOCBSA2=rCICOCBSA1;
  245. rCICOCBSA3=rCICOCBSA1;
  246. rCICOCBSA4=rCICOCBSA1;
  247. rCICOCRSA1=rCICOCBSA1+CoDstWidth*CoDstHeight/divisor;
  248. rCICOCRSA2=rCICOCRSA1;
  249. rCICOCRSA3=rCICOCRSA1;
  250. rCICOCRSA4=rCICOCRSA1;
  251. }
  252. rCICOTRGFMT=(CAM_CODEC_IN_422<<31)|(CAM_CODEC_OUTPUT<<30)|(CoDstWidth<<16)|(CAM_FLIP_NORMAL<<14)|(CoDstHeight);
  253. CalculateBurstSize(CoDstWidth, &MainBurstSizeY, &RemainedBurstSizeY);
  254. CalculateBurstSize(CoDstWidth/2, &MainBurstSizeC, &RemainedBurstSizeC);
  255. rCICOCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4);
  256. CalculatePrescalerRatioShift(SrcWidth, CoDstWidth, &PreHorRatio, &H_Shift);
  257. CalculatePrescalerRatioShift(SrcHeight, CoDstHeight, &PreVerRatio, &V_Shift);
  258. MainHorRatio=(SrcWidth<<8)/(CoDstWidth<<H_Shift);
  259. MainVerRatio=(SrcHeight<<8)/(CoDstHeight<<V_Shift);
  260.     
  261. rCICOSCPRERATIO=((10-H_Shift-V_Shift)<<28)|(PreHorRatio<<16)|(PreVerRatio);
  262. rCICOSCPREDST=((SrcWidth/PreHorRatio)<<16)|(SrcHeight/PreVerRatio); 
  263. rCICOSCCTRL=(CAM_SCALER_BYPASS_OFF<<31)|(ScaleUp_H_Co<<30)|(ScaleUp_V_Co<<29)|(MainHorRatio<<16)|(MainVerRatio);
  264. rCICOTAREA=CoDstWidth*CoDstHeight;
  265. ///////////////// preview port setting
  266. if (CAM_PVIEW_4PP) // codec view mode
  267. {
  268. rCIPRCLRSA1=PrFrameBuffer;
  269. rCIPRCLRSA2=rCIPRCLRSA1+PrDstWidth*PrDstHeight*multiplier;
  270. rCIPRCLRSA3=rCIPRCLRSA2+PrDstWidth*PrDstHeight*multiplier;
  271. rCIPRCLRSA4=rCIPRCLRSA3+PrDstWidth*PrDstHeight*multiplier;
  272. }
  273. else // direct preview mode
  274. {
  275. rCIPRCLRSA1=LCDFRAMEBUFFER;
  276. rCIPRCLRSA2=LCDFRAMEBUFFER;
  277. rCIPRCLRSA3=LCDFRAMEBUFFER;
  278. rCIPRCLRSA4=LCDFRAMEBUFFER;
  279. }
  280. rCIPRTRGFMT=(PrDstWidth<<16)|(CAM_FLIP_NORMAL<<14)|(PrDstHeight);
  281. if (CAM_PVIEW_OUTPUT==CAM_RGB24B)
  282. CalculateBurstSize(PrDstWidth*4, &MainBurstSizeRGB, &RemainedBurstSizeRGB);
  283. else // RGB16B
  284. CalculateBurstSize(PrDstWidth*2, &MainBurstSizeRGB, &RemainedBurstSizeRGB);
  285.     rCIPRCTRL=(MainBurstSizeRGB<<19)|(RemainedBurstSizeRGB<<14);
  286. CalculatePrescalerRatioShift(SrcWidth, PrDstWidth, &PreHorRatio, &H_Shift);
  287. CalculatePrescalerRatioShift(SrcHeight, PrDstHeight, &PreVerRatio, &V_Shift);
  288. MainHorRatio=(SrcWidth<<8)/(PrDstWidth<<H_Shift);
  289. MainVerRatio=(SrcHeight<<8)/(PrDstHeight<<V_Shift);
  290. rCIPRSCPRERATIO=((10-H_Shift-V_Shift)<<28)|(PreHorRatio<<16)|(PreVerRatio);  
  291. rCIPRSCPREDST=((SrcWidth/PreHorRatio)<<16)|(SrcHeight/PreVerRatio);
  292. rCIPRSCCTRL=(1<<31)|(CAM_PVIEW_OUTPUT<<30)|(ScaleUp_H_Pr<<29)|(ScaleUp_V_Pr<<28)|(MainHorRatio<<16)|(MainVerRatio);
  293.     
  294. rCIPRTAREA= PrDstWidth*PrDstHeight;
  295. }
  296. /********************************************************
  297.  CalculateBurstSize - Calculate the busrt lengths
  298.  
  299.  Description:
  300.  - dstHSize: the number of the byte of H Size.
  301.  
  302. */
  303. void CalculateBurstSize(U32 hSize,U32 *mainBurstSize,U32 *remainedBurstSize)
  304. {
  305. U32 tmp;
  306. tmp=(hSize/4)%16;
  307. switch(tmp) {
  308. case 0:
  309. *mainBurstSize=16;
  310. *remainedBurstSize=16;
  311. break;
  312. case 4:
  313. *mainBurstSize=16;
  314. *remainedBurstSize=4;
  315. break;
  316. case 8:
  317. *mainBurstSize=16;
  318. *remainedBurstSize=8;
  319. break;
  320. default: 
  321. tmp=(hSize/4)%8;
  322. switch(tmp) {
  323. case 0:
  324. *mainBurstSize=8;
  325. *remainedBurstSize=8;
  326. break;
  327. case 4:
  328. *mainBurstSize=8;
  329. *remainedBurstSize=4;
  330. default:
  331. *mainBurstSize=4;
  332. tmp=(hSize/4)%4;
  333. *remainedBurstSize= (tmp) ? tmp: 4;
  334. break;
  335. }
  336. break;
  337. }          
  338. }
  339. /********************************************************
  340.  CalculatePrescalerRatioShift - none
  341.  
  342.  Description:
  343.  - none
  344.  
  345. */
  346. void CalculatePrescalerRatioShift(U32 SrcSize, U32 DstSize, U32 *ratio,U32 *shift)
  347. {
  348. if(SrcSize>=64*DstSize) {
  349. Uart_Printf("ERROR: out of the prescaler range: SrcSize/DstSize = %d(< 64)n",SrcSize/DstSize);
  350. while(1);
  351. }
  352. else if(SrcSize>=32*DstSize) {
  353. *ratio=32;
  354. *shift=5;
  355. }
  356. else if(SrcSize>=16*DstSize) {
  357. *ratio=16;
  358. *shift=4;
  359. }
  360. else if(SrcSize>=8*DstSize) {
  361. *ratio=8;
  362. *shift=3;
  363. }
  364. else if(SrcSize>=4*DstSize) {
  365. *ratio=4;
  366. *shift=2;
  367. }
  368. else if(SrcSize>=2*DstSize) {
  369. *ratio=2;
  370. *shift=1;
  371. }
  372. else {
  373. *ratio=1;
  374. *shift=0;
  375. }    
  376. }
  377. /********************************************************
  378.  CamCaptureStart - Start camera capture operation.
  379.  
  380.  Description:
  381.  - mode= CAM_CODEC_CAPTURE_ENABLE_BIT or CAM_PVIEW_CAPTURE_ENABLE_BIT or both
  382.   
  383. */
  384. void CamCaptureStart(U32 mode)
  385.     
  386. if(mode&CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT) {
  387. camCodecStatus=CAM_STARTED;
  388. rCICOSCCTRL|=CAM_CODEC_SACLER_START_BIT;
  389. }
  390. if(mode&CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT) {
  391. camPviewStatus=CAM_STARTED;
  392. rCIPRSCCTRL|=CAM_PVIEW_SACLER_START_BIT;
  393. }
  394. if(mode&CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT) {
  395. camCodecStatus=CAM_STARTED;
  396. rCICOSCCTRL|=CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT;
  397. }
  398. rCIIMGCPT|=CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT|mode;
  399. }
  400. void CamCaptureStop(void)
  401. {
  402. camCodecStatus=CAM_STOP_ISSUED;
  403. camPviewStatus=CAM_STOP_ISSUED;
  404. }
  405. void _CamCodecStopHw(void)
  406. {
  407. rCICOSCCTRL &= ~CAM_CODEC_SACLER_START_BIT; //stop codec scaler.
  408. rCIIMGCPT &= ~CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT; //stop capturing for codec scaler.
  409. if(!(rCIIMGCPT & CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT))
  410. rCIIMGCPT &= ~CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT; //stop capturing for preview scaler if needed.
  411. rCICOCTRL |= (1<<2); //Enable last IRQ at the end of frame capture.
  412.        //NOTE:LastIrqEn bit should be set after clearing CAPTURE_ENABLE_BIT & SCALER_START_BIT
  413. }
  414. void _CamPviewStopHw(void)
  415. {
  416. rCIPRSCCTRL &= ~CAM_PVIEW_SACLER_START_BIT; //stop preview scaler.
  417. rCIIMGCPT &= ~CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT; //stop capturing for preview scaler.
  418. if(!(rCIIMGCPT&CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT))
  419. rCIIMGCPT &= ~CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT; //stop capturing for codec scaler if needed.
  420. rCIPRCTRL |= (1<<2); //Enable last IRQ at the end of frame capture.
  421.         //NOTE:LastIrqEn bit should be set after clearing CAPTURE_ENABLE_BIT & SCALER_START_BIT
  422. }
  423. void __irq CamIsr(void)
  424. {
  425. U32 completedFrameIndex;
  426. if (rSUBSRCPND&BIT_SUB_CAM_C)
  427. {
  428. Uart_Printf("[C]");
  429. CamCodecIntMask();
  430. rSUBSRCPND |= BIT_SUB_CAM_C;
  431. ClearPending(BIT_CAM);
  432. switch(camCodecStatus) {
  433. case CAM_STOP_ISSUED:
  434. _CamCodecStopHw();
  435. camCodecStatus=CAM_LAST_CAPTURING;
  436. Uart_Printf("cr=%xn", rCICOCTRL);
  437. //Uart_Printf("cS1n");
  438. break;
  439. case CAM_LAST_CAPTURING:
  440. camCodecStatus=CAM_STOPPED;
  441. CamCodecIntMask();
  442. //Uart_Printf("cS2n");
  443. return;
  444. case CAM_STARTED:
  445. flagCaptured_C = 1;
  446. // _CamCodecStopHw();
  447. if(camTestMode&CAM_TEST_MODE_CODEC) {
  448. if(camCodecCaptureCount>0) 
  449. completedFrameIndex=(((rCICOSTATUS>>26)&0x3)+4-2)%4;   
  450. //Uart_Printf("FrameIndex:%dn",completedFrameIndex);
  451. }
  452. else {
  453. //Uart_Printf("Just Capturing without display");
  454. }
  455. break;
  456. case CAM_CODEC_SCALER_BYPASS_STATE:
  457. //Uart_Printf("cBPn");
  458. break;
  459. default:
  460. break;
  461. }
  462. CamCodecIntUnmask();
  463.     camCodecCaptureCount++;  
  464. }
  465. else
  466. {
  467. Uart_Printf("[P]"); 
  468. CamPreviewIntMask();
  469. rSUBSRCPND |= BIT_SUB_CAM_P;
  470. ClearPending(BIT_CAM) 
  471. switch(camPviewStatus) {
  472. case CAM_STOP_ISSUED:
  473. _CamPviewStopHw();
  474. camPviewStatus=CAM_LAST_CAPTURING;  
  475. Uart_Printf("pr=%xn", rCIPRCTRL);
  476. //Uart_Printf("pS1n");
  477. break;
  478. case CAM_LAST_CAPTURING:
  479. camPviewStatus=CAM_STOPPED;
  480. CamPreviewIntMask();
  481. //Uart_Printf("pS2n"); 
  482. return;
  483. case CAM_STARTED:
  484. flagCaptured_P = 1;
  485. if(camTestMode&CAM_TEST_MODE_PVIEW) {
  486. if(camPviewCaptureCount >0) 
  487. completedFrameIndex=(((rCIPRSTATUS>>26)&0x3)+4-2)%4;
  488. //Uart_Printf("FrameIndex:%dn",completedFrameIndex);
  489. }
  490. else {
  491. //Uart_Printf("Preview Image Capturedn");
  492. default:
  493. break;
  494. CamPreviewIntUnmask();
  495. camPviewCaptureCount++;
  496. }
  497. }
  498. /******************************************************************************
  499.  *                                                                            *    
  500.  *                   camera interface interrupts & controls                   *
  501.  *                                                                            *     
  502.  ******************************************************************************/
  503. U32 Conv_YCbCr_Rgb(U8 y0, U8 y1, U8 cb0, U8 cr0)  // second solution... by junon
  504. {
  505. // bit order is
  506. // YCbCr = [Cr0 Y1 Cb0 Y0], RGB=[R1,G1,B1,R0,G0,B0].
  507. int r0, g0, b0, r1, g1, b1;
  508. U32 rgb0, rgb1, rgb;
  509.  
  510. #if 1 // 4 frames/s @192MHz, 12MHz ; 6 frames/s @450MHz, 12MHz
  511. r0 = YCbCrtoR(y0, cb0, cr0);
  512. g0 = YCbCrtoG(y0, cb0, cr0);
  513. b0 = YCbCrtoB(y0, cb0, cr0);
  514. r1 = YCbCrtoR(y1, cb0, cr0);
  515. g1 = YCbCrtoG(y1, cb0, cr0);
  516. b1 = YCbCrtoB(y1, cb0, cr0);
  517. #endif
  518. if (r0>255 ) r0 = 255;
  519. if (r0<0) r0 = 0;
  520. if (g0>255 ) g0 = 255;
  521. if (g0<0) g0 = 0;
  522. if (b0>255 ) b0 = 255;
  523. if (b0<0) b0 = 0;
  524. if (r1>255 ) r1 = 255;
  525. if (r1<0) r1 = 0;
  526. if (g1>255 ) g1 = 255;
  527. if (g1<0) g1 = 0;
  528. if (b1>255 ) b1 = 255;
  529. if (b1<0) b1 = 0;
  530. // 5:6:5 16bit format
  531. rgb0 = (((U16)r0>>3)<<11) | (((U16)g0>>2)<<5) | (((U16)b0>>3)<<0); //RGB565.
  532. rgb1 = (((U16)r1>>3)<<11) | (((U16)g1>>2)<<5) | (((U16)b1>>3)<<0); //RGB565.
  533. rgb = (rgb1<<16) | rgb0;
  534. return(rgb);
  535. }
  536. void Display_Cam_Image(U32 size_x, U32 size_y)
  537. {
  538. U8 *buffer_y, *buffer_cb, *buffer_cr;
  539. U8 y0,y1,cb0,cr0;
  540. int r0,r1,g0,g1,b0,b1;
  541. U32 rgb_data0, rgb_data1; 
  542. U32 x, y;
  543. int temp;
  544. if (CAM_CODEC_4PP)
  545. temp = (((rCICOSTATUS>>26)&0x3)+4-2)%4; // current frame memory block
  546. else
  547. temp = 4;
  548. //Uart_Printf("Current Frame memory %dn", temp);
  549. switch (temp) // current frame mem - 2
  550. {
  551. case 0:
  552. buffer_y = (U8 *)rCICOYSA1;
  553. buffer_cb = (U8 *)rCICOCBSA1;
  554. buffer_cr = (U8 *)rCICOCRSA1;
  555. break;
  556. case 1:
  557. buffer_y = (U8 *)rCICOYSA2;
  558. buffer_cb = (U8 *)rCICOCBSA2;
  559. buffer_cr = (U8 *)rCICOCRSA2;
  560. break;
  561. case 2:
  562. buffer_y = (U8 *)rCICOYSA3;
  563. buffer_cb = (U8 *)rCICOCBSA3;
  564. buffer_cr = (U8 *)rCICOCRSA3;
  565. break;
  566. case 3:
  567. buffer_y = (U8 *)rCICOYSA4;
  568. buffer_cb = (U8 *)rCICOCBSA4;
  569. buffer_cr = (U8 *)rCICOCRSA4;
  570. break;
  571. default :
  572. buffer_y = (U8 *)rCICOYSA1;
  573. buffer_cb = (U8 *)rCICOCBSA1;
  574. buffer_cr = (U8 *)rCICOCRSA1;
  575. break;
  576. }
  577. //Uart_Printf("End setting : Y-0x%x, Cb-0x%x, Cr-0x%xn", buffer_y, buffer_cb, buffer_cr);
  578. #if 0
  579. // for checking converting time 
  580. rGPGCON = (rGPGCON&~(1<<23))|(1<<22); //EINT19 -> GPG11 output
  581. rGPGUP |= (1<<11);
  582. rGPGDAT &= ~(1<<11);
  583. Delay(90);
  584. rGPGDAT |=(1<<11);
  585. rgb_data0 = 0;
  586. #endif
  587. #if CAM_CODEC_OUTPUT==CAM_CCIR420
  588. for (y=0;y<size_y;y++) // YCbCr 4:2:0 format
  589. {
  590. for (x=0;x<size_x;x+=2)
  591. {
  592. rgb_data0 = Conv_YCbCr_Rgb(*buffer_y++, *buffer_y++, *buffer_cb++, *buffer_cr++);
  593. frameBuffer16BitTft240320[y][x/2] = rgb_data0;
  594. if ( (x==(size_x-2)) && ((y%2)==0) ) // when x is last pixel & y is even number
  595. {
  596. buffer_cb -= size_x/2;
  597. buffer_cr -= size_x/2;
  598. }
  599. }
  600. #else
  601. for (y=0;y<size_y;y++) // YCbCr 4:2:2 format
  602. {
  603. for (x=0;x<size_x;x+=2)
  604. rgb_data0 = Conv_YCbCr_Rgb(*buffer_y++, *buffer_y++, *buffer_cb++, *buffer_cr++);
  605. frameBuffer16BitTft240320[y][x/2] = rgb_data0;
  606. }
  607. #endif
  608. // memcpy((unsigned char*)0x30100000,  frameBuffer16BitTft240320, 320*240*2); // QCIF=178*144*2
  609. #if 0
  610. rGPGDAT &= ~(1<<11);
  611. Delay(30);
  612. rGPGDAT |=(1<<11);
  613. rGPGCON = (rGPGCON&~(1<<22))|(1<<23); // GPG11 output -> EINT19
  614. #endif
  615. }
  616. #if 0
  617. void Display_Cam_Image(int offset_x, int offset_y, int size_x, int size_y)
  618. {
  619. U8* CamFrameAddr, LcdFrameAddr;
  620. int i, temp;
  621. Lcd_MoveViewPort(offset_x, offset_y, USED_LCD_TYPE);
  622. switch(camPviewCaptureCount%4)
  623. {
  624. case 2 : 
  625. temp = rCIPRCLRSA1;
  626. break;
  627. case 3 : 
  628. temp = rCIPRCLRSA2;
  629. break;
  630. case 0 : 
  631. temp = rCIPRCLRSA3;
  632. break;
  633. case 1 :
  634. default:
  635. temp = rCIPRCLRSA4;
  636. break;
  637. }
  638. *CamFrameAddr = temp;
  639. *LcdFrameAddr = LCDFRAMEBUFFER;
  640. for(i=0;i<size_y;i++)
  641. {
  642. memcpy(LcdFrameAddr, CamFrameAddr, size_x*2);
  643. *LcdFrameAddr += size_x*4; // added virtual screen
  644. *CamFrameAddr += size_x*2; 
  645. }
  646. }
  647. #endif
  648. void Test_CamPreview(void)
  649. {
  650. U8 flag;
  651. U32 i,j,k,value, *data;
  652. Uart_Printf("n[ Camera Preview Test ]n");
  653. //camera global variables
  654. camTestMode=CAM_TEST_MODE_PVIEW;
  655. camCodecCaptureCount=0;
  656. camPviewCaptureCount=0;
  657. camPviewStatus=CAM_STOPPED;
  658. camCodecStatus=CAM_STOPPED;
  659. flagCaptured_P=0;
  660. //Initialize LCD
  661. #if CAM_PVIEW_OUTPUT==CAM_RGB24B
  662. Lcd_Start(MODE_TFT_24BIT_240320);
  663. Lcd_EnvidOnOff(0);
  664. // for 240x320 24bit setting
  665. rLCDCON5 &= ~1; // halfword swap disable -> Camera data is halfword swap type, 24bit
  666. rLCDSADDR3 &= ~(0x7ff<<11); // offset size 0
  667. rLCDSADDR2=M5D( (LCDFRAMEBUFFER+(LCD_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*4))>>1 );
  668. Lcd_EnvidOnOff(1);
  669. data = (U32 *)LCDFRAMEBUFFER;
  670. for (i=0;i<240*320;i++) // 24bpp test
  671. {
  672. if (i<240*80) *data++ = 0x000000ff; // blue
  673. else if ((i<240*160)&&(i>=240*80)) *data++ = 0x0000ff00; //green
  674. else if ((i<240*240)&&(i>=240*160)) *data++ = 0x00ff0000; //red
  675. else if (i>=240*240) *data++ = 0xff000000; // black
  676. }
  677. #else // RGB16B
  678. Lcd_Start(MODE_TFT_16BIT_240320);
  679. Lcd_EnvidOnOff(0);
  680. // for 240x320 16bit haltword swap type setting
  681. rLCDCON5 |= 1; // halfword swap enable -> Camera data is halfword swap type, 16bit
  682. rLCDSADDR3 &= ~(0x7ff<<11); // offset size 0
  683. rLCDSADDR2=M5D( (LCDFRAMEBUFFER+(LCD_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>>1 );
  684. Lcd_EnvidOnOff(1);
  685. data = (U32 *)LCDFRAMEBUFFER;
  686. for (i=0;i<240*160;i++) // 16bpp test
  687. if (i<240*40) *data++ = 0x001f001f; // blue
  688. else if ((i<240*80)&&(i>=240*40)) *data++ = 0x07e007e0; //green
  689. else if ((i<240*120)&&(i>=240*80)) *data++ = 0xf800f800; //red
  690. else if (i>=240*120) *data++ = 0xf800001f; // blue & red
  691. }
  692. #endif
  693. Uart_Printf("nTFT 64K color mode test 1. Press any key!n");
  694. Uart_Getch(); 
  695.  
  696.  Uart_Printf(" preview sc control = %xn", rCIPRSCCTRL);
  697. // Initialize Camera interface
  698. switch(USED_CAM_TYPE)
  699. {
  700. case CAM_S5X532 : // defualt for test : data-falling edge, ITU601, YCbCr
  701. CamInit(640, 480, 240, 320, 112, 20,  CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P);
  702. break;
  703. case CAM_S5X3A1 : // defualt for test : data-falling edge, YCbCr
  704. CamInit(640, 480, 240, 320, 120, 100, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P);
  705. rCISRCFMT = rCISRCFMT & ~(1<<31); // ITU656
  706. // rCIGCTRL &= ~(1<<26); // inverse PCLK, test pattern
  707. break;
  708. default : 
  709. CamInit(640, 480, 240, 320, 0, 0,  CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P);
  710. break;
  711. }
  712. Uart_Printf(" preview sc control = %xn", rCIPRSCCTRL);
  713. // Start Capture
  714. rSUBSRCPND |= BIT_SUB_CAM_C|BIT_SUB_CAM_P;
  715. ClearPending(BIT_CAM);
  716. pISR_CAM = (U32)CamIsr;    
  717. CamPreviewIntUnmask();
  718. CamCaptureStart(CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT);
  719. Uart_Printf("Press Enter key to exit!n");
  720. while (1)
  721. {
  722. if (flagCaptured_P)
  723. {
  724. flagCaptured_P = 0;
  725. // Uart_Printf("Enter Cam A port, count = %dn",camCodecCaptureCount);
  726. }
  727. if (Uart_GetKey()== 'r') break;
  728. }
  729.     
  730. CamCaptureStop();
  731. Uart_Printf("nWait until the current frame capture is completed.n");
  732. while(camPviewStatus!=CAM_STOPPED)
  733. if (Uart_GetKey()== 'r') break;
  734. Uart_Printf(" CIS format = %xn", rCISRCFMT);
  735. Uart_Printf(" image cap = %xn", rCIIMGCPT);
  736. Uart_Printf(" preview sc control = %xn", rCIPRSCCTRL);
  737. Uart_Printf(" preview control = %xn", rCIPRCTRL);
  738. Uart_Printf(" codec sc control = %xn", rCICOSCCTRL);
  739. Uart_Printf(" codec control = %xn", rCICOCTRL);
  740. Uart_Printf(" pr addr1 = %xn", rCIPRCLRSA1);
  741. Uart_Printf(" pr addr2 = %xn", rCIPRCLRSA2);
  742. Uart_Printf("camCodecCaptureCount=%dn",camCodecCaptureCount);
  743. Uart_Printf("camPviewCaptureCount=%dn",camPviewCaptureCount);
  744. // CamPreviewIntMask();
  745. }
  746. void Test_CamCodec(void)
  747. {
  748. U8 flag, fBypass='1';
  749. U32 i,j,k,value, *data;
  750. Uart_Printf("n[ Camera Codec Test ]n");
  751. //camera global variables
  752. camTestMode=CAM_TEST_MODE_CODEC;
  753. camCodecCaptureCount=0;
  754. camPviewCaptureCount=0;
  755. camPviewStatus=CAM_STOPPED;
  756. camCodecStatus=CAM_STOPPED;
  757. flagCaptured_C=0;
  758. //Initialize LCD
  759. Lcd_Start(MODE_TFT_16BIT_240320);
  760. Glib_FilledRectangle(0,0,239,79,0x001f); // B
  761. Glib_FilledRectangle(0,80,239,159,0x07e0); // G
  762. Glib_FilledRectangle(0,160,239,239,0xf800); // R
  763. Glib_FilledRectangle(0,240,239,319,0xffff);   
  764. Uart_Printf("nTFT 64K color mode test 1. Press any key!n");
  765. Uart_Getch(); 
  766. // Initialize Camera interface
  767. switch(USED_CAM_TYPE)
  768. {
  769. case CAM_S5X532 : // defualt for test : data-falling edge, ITU601, YCbCr
  770. CamInit(240, 320, 240, 320, 112, 20,  CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P);
  771. break;
  772. case CAM_S5X3A1 : // defualt for test : data-falling edge, ITU601, YCbCr
  773. CamInit(240, 320, 240, 320, 0, 0, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P);
  774. rCISRCFMT &= ~(1<<31); // ITU656
  775. break;
  776. default : 
  777. CamInit(240, 320, 240, 320, 0, 0,  CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P);
  778. break;
  779. }
  780. // Start Capture
  781. rSUBSRCPND |= BIT_SUB_CAM_C|BIT_SUB_CAM_P;
  782. ClearPending(BIT_CAM);
  783. pISR_CAM = (U32)CamIsr;    
  784. CamCodecIntUnmask();
  785. Uart_Printf("Select Code mode : 1. Scaler mode(D)   2. Bypass moden");
  786. fBypass = Uart_Getch();
  787. if (fBypass=='2'){
  788. CamInit(CAM_SRC_HSIZE, CAM_SRC_VSIZE, 240, 320, 0, 0, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P);
  789. CamCaptureStart(CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT); //bypass
  790. }
  791. else
  792. CamCaptureStart(CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT); //scaler
  793. // for test simultanious
  794. // rCIIMGCPT |= CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT;
  795. // rCIPRSCCTRL |= CAM_PVIEW_SACLER_START_BIT;
  796. Uart_Printf("Press Enter key to exit!n");
  797. while (1)
  798. {
  799. if (flagCaptured_C)
  800. {
  801. flagCaptured_C = 0;
  802. if (fBypass=='2')
  803. Display_Cam_Image(CAM_SRC_HSIZE, CAM_SRC_VSIZE);
  804. else 
  805. Display_Cam_Image(240, 320);
  806. // Uart_Printf("Enter Cam B port, count = %dn",camPviewCaptureCount);
  807. }
  808. // if (camCodecCaptureCount>=1) 
  809. // { 
  810. // Uart_Printf("cnt = %dn", camCodecCaptureCount); 
  811. //     break;
  812. // }
  813. if (Uart_GetKey()== 'r') break;
  814. }
  815.     
  816. CamCaptureStop();
  817. Uart_Printf("nWait until the current frame capture is completed.n");
  818. while(camCodecStatus!=CAM_STOPPED)
  819. if (Uart_GetKey()== 'r') break;
  820. Uart_Printf(" CIS format = %xn", rCISRCFMT);
  821. Uart_Printf(" image cap = %xn", rCIIMGCPT);
  822. Uart_Printf(" preview sc control = %xn", rCIPRSCCTRL);
  823. Uart_Printf(" preview control = %xn", rCIPRCTRL);
  824. Uart_Printf(" codec sc control = %xn", rCICOSCCTRL);
  825. Uart_Printf(" codec control = %xn", rCICOCTRL);
  826. Uart_Printf(" codec status = %xn", rCICOSTATUS);
  827. Uart_Printf("camCodecCaptureCount=%dn",camCodecCaptureCount);
  828. Uart_Printf("camPviewCaptureCount=%dn",camPviewCaptureCount);
  829. // CamCodecIntMask();
  830. }
  831. void Test_YCbCr_to_RGB(void)
  832. {
  833. U8 *buffer_y, *buffer_cb, *buffer_cr;
  834. int size_x, size_y, R, G, B, rgb_data; 
  835. int x, y;
  836. int pos_x = 0;
  837. int pos_y = 0;
  838. U8 cSelType = 0;
  839. U8 *cBuffer;
  840. Lcd_Start(MODE_TFT_16BIT_240320);
  841. size_x = PQVGA_XSIZE;
  842. size_y = PQVGA_YSIZE;
  843. Uart_Printf("Select   1. 420[D] PQVGA    2. 422 PQVGA    3. 420 CIF  : n");
  844. cSelType = Uart_Getch();
  845. if (cSelType == 'r') cSelType = '1';
  846. switch (cSelType)
  847. {
  848. case '1' : 
  849. cBuffer = (U8 *)c420jpeg;
  850. break;
  851. case '2' : 
  852. cBuffer = (U8 *)c422jpeg;
  853. break;
  854. case '3' : 
  855. cBuffer = (U8 *)foreman_cif_420;
  856. size_x = CIF_XSIZE;
  857. size_y = CIF_YSIZE;
  858. break;
  859. }
  860. buffer_y = (U8 *)(cBuffer);
  861. buffer_cb = (U8 *)(cBuffer + size_x*size_y); // add y size
  862. buffer_cr = (U8 *)(buffer_cb + size_x*size_y/4); // add y,cb size
  863. if (cSelType == '2')
  864. buffer_cr = (U8 *)(buffer_cb + size_x*size_y/2); // add y,cb size
  865. Uart_Printf("End setting : Y-0x%x, Cb-0x%x, Cr-0x%xn", buffer_y, buffer_cb, buffer_cr);
  866. Uart_Printf("Address : Y-0x%x, foreman-0x%x, fa-0x%xn", *buffer_y, cBuffer, *cBuffer);
  867. Glib_FilledRectangle(0,0,239,159,0xaaaa);   
  868. Glib_FilledRectangle(0,160,239,320,0xf800);   
  869. Uart_Printf("nTFT 64K color mode test 1. Press any key!n");
  870. Uart_Getch(); 
  871. for (y=0;y<size_y;y++) // YCbCr 4:2:0 format
  872. for (x=0;x<size_x;x++)
  873. {
  874. R = YCbCrtoR(*buffer_y, *buffer_cb, *buffer_cr);
  875. G = YCbCrtoG(*buffer_y, *buffer_cb, *buffer_cr);
  876. B = YCbCrtoB(*buffer_y, *buffer_cb, *buffer_cr);
  877. if (R>255 ) R = 255;
  878. if (G>255 ) G = 255;
  879. if (B>255 ) B = 255;
  880. if (R<0 ) R = 0;
  881. if (G<0 ) G = 0;
  882. if (B<0 ) B = 0;
  883. // 5:6:5 16bit format
  884. rgb_data =(R&0xf8)<<8;  // R 5bits
  885. rgb_data|=(G&0xfc)<<3; // G 6bits
  886. rgb_data|=(B&0xf8)>>3; // B 5bits
  887. PutPixel(pos_x+x, pos_y+y, rgb_data);
  888. // next usable bits..
  889. buffer_y++;
  890. if (x%2) // when x is odd number
  891. {
  892. buffer_cb++;
  893. buffer_cr++;
  894. }
  895. if (cSelType != '2')
  896. if ( (x==(size_x-1)) && ((y%2)==0) ) // when x is last pixel & y is even number
  897. {
  898. buffer_cb -= size_x/2;
  899. buffer_cr -= size_x/2;
  900. }
  901. }
  902.     Uart_Printf("Virtual Screen Test(TFT 64K color). Press any key[ijkm\r]!n");
  903.     MoveViewPort(MODE_TFT_16BIT_240320); // user can adjust screen..
  904.     
  905.     Lcd_MoveViewPort(0,0,MODE_TFT_16BIT_240320); // return 0,0
  906.     Glib_ClearScr(0, MODE_TFT_16BIT_240320);
  907.     Lcd_EnvidOnOff(0);
  908.     Lcd_PowerEnable(0, 0);
  909.     Lcd_Port_Return();
  910.     
  911. }