camproset.c
上传用户:jankzhpno
上传日期:2022-08-03
资源大小:4763k
文件大小:10k
源码类别:

Windows CE

开发平台:

Visual C++

  1. /******************************************************************************
  2.  Filename: camproset.c
  3.  Descriptions
  4.  - Camera Processor Initialization code using SCCB.
  5.  - SCCB(Serial Camera Contol Bus) H/W dependent code.
  6.  - Camera Processor Initialization code using IIC.
  7.  History
  8.   - July 23, 2003. Draft Version 0.0 by purnnamu
  9.   - Janualy 15, 2004. Modifed by Boaz
  10.   - Feb. 10, 2004. Modified by junon for S3C2440A
  11.  
  12.  Copyright (c) 2003 SAMSUNG Electronics.
  13.  # However, Anybody can use this code without our permission.  
  14.  ******************************************************************************/
  15. #include "def.h"
  16. #include "2440addr.h"
  17. #include "2440lib.h"
  18. #include "camproset.h"
  19. #include "camdef.h"
  20. #include "camdata.h"
  21. #define CAMWRDATA      (1)
  22. #define CAMRDDATA      (3)
  23. #define CAMSETRDADDR   (4)
  24. #define CAMIICBUFSIZE 0x20
  25. #if USED_CAM_TYPE==CAM_OV7620
  26. #define CAM_ID (0x42)
  27. #define CAM_NAME  "OV7620"
  28. #elif USED_CAM_TYPE==CAM_S5X433
  29. #define CAM_ID (0x42)
  30. #define CAM_NAME  "S5X433"
  31. #elif USED_CAM_TYPE==CAM_S5X532
  32. #define CAM_ID (0x5a)
  33. #define CAM_NAME  "S5X532"
  34. #elif USED_CAM_TYPE==CAM_S5X3A1
  35. #define CAM_ID (0x5a)
  36. #define CAM_NAME  "S5X3A1"
  37. #elif USED_CAM_TYPE==CAM_AU70H
  38. #define CAM_ID (0x22)
  39. #define CAM_NAME  "AU70H"
  40. #endif
  41. static U8 _CAMiicData[CAMIICBUFSIZE];
  42. static volatile int _CAMiicDataCount;
  43. static volatile int _CAMiicStatus;
  44. static volatile int _CAMiicMode;
  45. static int _CAMiicPt;
  46. volatile U32 save_GPECON;
  47. void * func_cammodule_test[][2]=
  48. {    
  49. //IIC 
  50. (void *)Camera_WriteByte,  "Write 1 byte data into Camera module register",
  51. (void *)Camera_ReadByte,   "Read 1 byte data from Camera module register",
  52. (void *)Camera_WriteBlock,   "Write a block of byte data into Camera module register",
  53. (void *)Camera_ReadBlock,   "Read a block of byte data from Camera module register",
  54. 0,0
  55. };
  56. void Camera_Iic_Test(void)
  57. {
  58. int i, camclk;
  59. CameraModuleSetting();
  60. Uart_Printf("n***** IIC Master Tx/Rx Test Program with %s Camera Module *****n", CAM_NAME);
  61. while(1)  {
  62. i=0;
  63. Uart_Printf("nn");
  64. while(1) {   //display menu
  65. Uart_Printf("%2d:%sn", i, func_cammodule_test[i][1]);
  66. i++;
  67. if((int)(func_cammodule_test[i][0])==0) {
  68. Uart_Printf("n");
  69. break;
  70. }
  71. if((i%4)==0)
  72. Uart_Printf("n");
  73. }
  74. Uart_Printf("nPress Enter key to exit : ");
  75. i = Uart_GetIntNum();
  76. if(i==-1) break; // return.
  77. if(i>=0 && (i<((sizeof(func_cammodule_test)-1)/8)) ) // select and execute...
  78. ( (void (*)(void)) (func_cammodule_test[i][0]) )();
  79. }
  80. Uart_Printf("n");
  81.     rINTMSK |= BIT_IIC;
  82. }
  83. void IicPortSet(void)
  84. {
  85. save_GPECON = rGPECON;
  86. rGPECON = rGPECON & ~(0xf<<28) | (0xa<<28); //GPE15:IICSDA , GPE14:IICSCL   
  87. }
  88. void IicPortReturn(void)
  89. {
  90. rGPECON = save_GPECON;
  91. }
  92. void Wr_CamIIC(U32 slvAddr, U32 addr, U8 data)
  93. {
  94. _CAMiicMode      = CAMWRDATA;
  95. _CAMiicPt        = 0;
  96. _CAMiicData[0]   = (U8)addr;
  97. _CAMiicData[1]   = data;
  98. _CAMiicDataCount = 2;
  99.     
  100. rIICDS        = slvAddr;            //0x5a: S5X532 Slave ID 
  101. rIICSTAT      = 0xf0; //Start Master TX Condition    
  102. rIICCON &= ~(1<<4);   //Clearing the pending bit isn't needed because the pending bit has been cleared.
  103. while(_CAMiicDataCount!=-1);
  104. }
  105. void Rd_CamIIC(U32 slvAddr,U32 addr,U8 *data)
  106. {
  107. /*IIC Slave Addr Write + IIC Reg Addr Write */
  108. _CAMiicMode      = CAMSETRDADDR;
  109. _CAMiicPt        = 0;
  110. _CAMiicData[0]   = (U8)addr;
  111. _CAMiicDataCount = 1;
  112. rIICDS   = slvAddr;
  113. rIICSTAT = 0xf0;   //Master Tx, Start
  114. rIICCON &= ~(1<<4);                    //Resumes IIC operation.  
  115. //Clearing the pending bit isn't needed because the pending bit has been cleared.
  116. while(_CAMiicDataCount!=-1);
  117.     
  118. _CAMiicMode      = CAMRDDATA;
  119. _CAMiicPt        = 0;
  120. _CAMiicDataCount = 1;
  121.     
  122. rIICDS   = slvAddr;
  123. rIICSTAT = 0xb0;                    //Master Rx,Start
  124. rIICCON &= ~(1<<4);                   //Resumes IIC operation.   
  125.     
  126. while(_CAMiicDataCount!=-1);
  127. *data = _CAMiicData[1];
  128. }
  129. void __irq Cam_IICInt(void)
  130. {
  131. U32 iicSt,i;
  132. ClearPending(BIT_IIC);
  133. iicSt   = rIICSTAT; 
  134. rINTMSK |= BIT_IIC;
  135. if(iicSt & 0x8){}           //When bus arbitration is failed.
  136. if(iicSt & 0x4){}           //When a slave address is matched with IICADD
  137. if(iicSt & 0x2){}           //When a slave address is 0000000b
  138. if(iicSt & 0x1){}           //When ACK isn't received
  139. switch(_CAMiicMode) {
  140. case CAMRDDATA:
  141. if((_CAMiicDataCount--)==0) {
  142. _CAMiicData[_CAMiicPt++] = rIICDS;
  143.             
  144. rIICSTAT = 0x90;      //Stop MasRx condition 
  145. rIICCON  &= ~(1<<4);      //Resumes IIC operation.
  146. Delay(1);                 //Wait until stop condtion is in effect., Too long time...  # need the time 2440:Delay(1), 24A0: Delay(2)
  147. //The pending bit will not be set after issuing stop condition.
  148. break;    
  149. }      
  150. _CAMiicData[_CAMiicPt++] = rIICDS;     //The last data has to be read with no ack.
  151. if((_CAMiicDataCount)==0)
  152. rIICCON &= ~((1<<7)|(1<<4));      //Resumes IIC operation with NOACK in case of S5X532 Cameara  
  153. // rIICCON = 0x6f; //Resumes IIC operation with NOACK in case of S5X532 Cameara
  154. else 
  155. rIICCON &= ~(1<<4);      //Resumes IIC operation with ACK
  156. break;
  157. case CAMWRDATA:
  158. if((_CAMiicDataCount--)==0) {
  159. rIICSTAT = 0xd0;                //stop MasTx condition 
  160. rIICCON  &= ~(1<<4);                //resumes IIC operation.
  161. Delay(1);                       //wait until stop condtion is in effect. # need the time 2440:Delay(1), 24A0: Delay(2)
  162. //The pending bit will not be set after issuing stop condition.
  163. break;    
  164. }
  165. rIICDS = _CAMiicData[_CAMiicPt++];        //_iicData[0] has dummy.
  166. for(i=0;i<10;i++);                  //for setup time until rising edge of IICSCL
  167. rIICCON &= ~(1<<4);                     //resumes IIC operation.
  168. break;
  169. case CAMSETRDADDR: //Uart_Printf("[S%d]",_iicDataCount);
  170. if((_CAMiicDataCount--)==0) {
  171. rIICSTAT = 0xd0;                //stop MasTx condition 
  172. rIICCON  &= ~(1<<4);                //resumes IIC operation.
  173. Delay(1);      //wait until stop condtion is in effect.
  174. break;                  //IIC operation is stopped because of IICCON[4]    
  175. }
  176. rIICDS = _CAMiicData[_CAMiicPt++];
  177. for(i=0;i<10;i++);          //for setup time until rising edge of IICSCL
  178. rIICCON &= ~(1<<4);             //resumes IIC operation.
  179. break;
  180. default:
  181. break;      
  182. }
  183. rINTMSK &= ~BIT_IIC;
  184. }
  185. void Camera_WriteByte(void)
  186. {
  187. unsigned int i, j, save_E, save_PE, RegAddr, RegData, pageNo;
  188.       
  189. #if (USED_CAM_TYPE==CAM_S5X532)||(USED_CAM_TYPE==CAM_S5X3A1)
  190. Uart_Printf("Input Write Page No of %sn=>", CAM_NAME);
  191. pageNo = (U8)Uart_GetIntNum();
  192. #endif
  193. Uart_Printf("Input Write Register Address of %sn=>", CAM_NAME);
  194. RegAddr = (U8)Uart_GetIntNum();
  195.     
  196. Uart_Printf("Input Write Transfer Data into %sn=>", CAM_NAME);
  197. RegData = (U8)Uart_GetIntNum();
  198. #if (USED_CAM_TYPE==CAM_S5X532)||(USED_CAM_TYPE==CAM_S5X3A1)
  199. Wr_CamIIC(CAM_ID, (U8)0xec, pageNo);  // set Page no
  200. #endif
  201. Wr_CamIIC(CAM_ID, (U8)RegAddr, RegData); // set register after setting page number
  202. }
  203. void Camera_ReadByte(void)
  204. {
  205. unsigned int i, j, save_E, save_PE, RegAddr, RegData, pageNo;
  206. static U8 rdata[8];
  207.       
  208. #if (USED_CAM_TYPE==CAM_S5X532)||(USED_CAM_TYPE==CAM_S5X3A1)
  209. Uart_Printf("Input Write Page No of %sn=>", CAM_NAME);
  210. pageNo = (U8)Uart_GetIntNum();
  211. Wr_CamIIC(CAM_ID, (U8)0xec, pageNo);  // set Page no
  212. #endif
  213. Uart_Printf("Input Read Register Address of %sn=>", CAM_NAME);
  214. RegAddr = (U8)Uart_GetIntNum();
  215. Rd_CamIIC(CAM_ID, RegAddr, &rdata[0]); 
  216. Uart_Printf("Register Addr: 0x%2x, data: 0x%2xn", RegAddr,rdata[0]);
  217. }
  218. void Camera_WriteBlock(void)
  219. {
  220. unsigned int i, j, save_E, save_PE, RegAddr, RegData;
  221. static U8 rdata[256]; 
  222. #if USED_CAM_TYPE==CAM_OV7620
  223. for(i=0; i<(sizeof(Ov7620_YCbCr8bit)/2); i++)
  224. Wr_CamIIC(CAM_ID, Ov7620_YCbCr8bit[i][0], Ov7620_YCbCr8bit[i][1]);
  225. #elif USED_CAM_TYPE==CAM_S5X532
  226. for(i=0; i<(sizeof(S5X532_YCbCr8bit)/2); i++)
  227. Wr_CamIIC(CAM_ID, S5X532_YCbCr8bit[i][0], S5X532_YCbCr8bit[i][1]);
  228. #elif USED_CAM_TYPE==CAM_S5X3A1
  229. for(i=0; i<(sizeof(S5X3A1_YCbCr8bit)/2); i++)
  230. Wr_CamIIC(CAM_ID, S5X3A1_YCbCr8bit[i][0], S5X3A1_YCbCr8bit[i][1]);
  231. #elif USED_CAM_TYPE==CAM_AU70H
  232. for(i=0; i<(sizeof(Au70h)/2); i++)
  233. Wr_CamIIC(CAM_ID, Au70h[i][0], Au70h[i][1]);
  234. #endif
  235.    Uart_Printf("nBlock TX Ended...n");
  236. }
  237. void Camera_ReadBlock(void)
  238. {
  239. unsigned int i, j, save_E, save_PE, RegAddr, RegData;
  240. static U8 rdata[256]; 
  241. #if USED_CAM_TYPE==CAM_OV7620
  242. for(i=0; i<(sizeof(Ov7620_YCbCr8bit)/2);i++)
  243. Rd_CamIIC(CAM_ID, Ov7620_YCbCr8bit[i][0], &rdata[i]); 
  244. for(i=0; i<(sizeof(Ov7620_YCbCr8bit)/2);i++)
  245. Uart_Printf("Addr: 0x%2x, W: 0x%2x, R: 0x%2xn", Ov7620_YCbCr8bit[i][0], Ov7620_YCbCr8bit[i][1], rdata[i]);
  246. #elif USED_CAM_TYPE==CAM_S5X532
  247.     for(i=0; i<(sizeof(S5X532_YCbCr8bit)/2);i++)
  248.     {     
  249. if(S5X532_YCbCr8bit[i][0] == 0xec)
  250. Wr_CamIIC(CAM_ID, S5X532_YCbCr8bit[i][0], S5X532_YCbCr8bit[i][1]);
  251. else
  252. Rd_CamIIC(CAM_ID, S5X532_YCbCr8bit[i][0], &rdata[i]); 
  253.     }
  254.    for(i=0; i<(sizeof(S5X532_YCbCr8bit)/2);i++)
  255. {
  256.    if(S5X532_YCbCr8bit[i][0] == 0xec)
  257.        Uart_Printf("Page: 0x%2xn",  S5X532_YCbCr8bit[i][1]);
  258. else
  259.    Uart_Printf("Addr: 0x%2x, W: 0x%2x, R: 0x%2xn", S5X532_YCbCr8bit[i][0], S5X532_YCbCr8bit[i][1], rdata[i]);
  260.    }      
  261. #elif USED_CAM_TYPE==CAM_S5X3A1
  262. for(i=0; i<(sizeof(S5X3A1_YCbCr8bit)/2);i++)
  263. if(S5X3A1_YCbCr8bit[i][0] == 0xec)
  264. Wr_CamIIC(CAM_ID, S5X3A1_YCbCr8bit[i][0], S5X3A1_YCbCr8bit[i][1]);
  265. else
  266. Rd_CamIIC(CAM_ID, S5X3A1_YCbCr8bit[i][0], &rdata[i]); 
  267. }
  268. for(i=0; i<(sizeof(S5X3A1_YCbCr8bit)/2);i++)
  269. {
  270. if(S5X3A1_YCbCr8bit[i][0] == 0xec)
  271.  Uart_Printf("Page: 0x%2xn",  S5X3A1_YCbCr8bit[i][1]);
  272. else
  273. Uart_Printf("Addr: 0x%2x, W: 0x%2x, R: 0x%2xn", S5X3A1_YCbCr8bit[i][0], S5X3A1_YCbCr8bit[i][1], rdata[i]);
  274. }   
  275. #elif USED_CAM_TYPE==CAM_AU70H
  276. for(i=0; i<(sizeof(Au70h)/2);i++)
  277. Rd_CamIIC(CAM_ID, Au70h[i][0], &rdata[i]); 
  278. for(i=0; i<(sizeof(Au70h)/2);i++)
  279. Uart_Printf("Addr: 0x%2x, W: 0x%2x, R: 0x%2xn", Au70h[i][0], Au70h[i][1], rdata[i]);
  280. #endif
  281. }
  282. int CameraModuleSetting(void)
  283. {
  284. unsigned int i, j, save_E, save_PE, RegAddr, RegData;
  285. static U8 rdata[256]; 
  286. int donestatus;
  287.       
  288. IicPortSet();
  289. // for camera init, added by junon
  290. pISR_IIC = (unsigned)Cam_IICInt; 
  291. rINTMSK &= ~(BIT_IIC);
  292. //Enable ACK, Prescaler IICCLK=PCLK/512, Enable interrupt, Transmit clock value Tx clock=IICCLK/16
  293. rIICCON  = (1<<7) | (1<<6) | (1<<5) | (0x3);
  294. rIICADD  = 0x10;                    //24A0 slave address = [7:1]
  295. rIICSTAT = 0x10;                    //IIC bus data output enable(Rx/Tx)
  296.     rIICLC = (1<<2)|(3);    // SDAOUT has 5clock cycle delay
  297. donestatus=1;
  298. Camera_WriteBlock();
  299. // Camera_ReadBlock();
  300. return donestatus;
  301. }