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

uCOS

开发平台:

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