00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "chip.h"
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 __STATIC_INLINE uint32_t _ISI_GetCFG2_Workaround(void)
00049 {
00050 uint32_t wrongfield;
00051 wrongfield = ISI->ISI_CFG2 >> (ISI_CFG2_YCC_SWAP_Pos - 1);
00052 return (ISI->ISI_CFG2 & 0x07FFFFFF) | (wrongfield << ISI_CFG2_YCC_SWAP_Pos);
00053 }
00054
00055
00056
00057
00058
00059
00060
00061
00062 void ISI_Enable(void)
00063 {
00064 ISI->ISI_CR |= ISI_CR_ISI_EN;
00065 while( (ISI->ISI_SR & ISI_CR_ISI_EN)!=ISI_CR_ISI_EN);
00066 }
00067
00068
00069
00070
00071
00072 void ISI_DmaChannelEnable(uint32_t channel)
00073 {
00074 ISI->ISI_DMA_CHER |= channel;
00075 }
00076
00077
00078
00079
00080
00081 void ISI_DmaChannelDisable(uint32_t channel)
00082 {
00083 ISI->ISI_DMA_CHDR |=channel;
00084 }
00085
00086
00087
00088
00089 void ISI_Disable(void)
00090 {
00091
00092 ISI->ISI_CR |= ISI_CR_ISI_DIS;
00093
00094
00095 while( (ISI->ISI_SR & ISI_SR_DIS_DONE) != ISI_SR_DIS_DONE);
00096 }
00097
00098
00099
00100
00101
00102
00103 void ISI_EnableInterrupt(uint32_t flag)
00104 {
00105 ISI->ISI_IER = flag;
00106 }
00107
00108
00109
00110
00111
00112 void ISI_DisableInterrupt(uint32_t flag)
00113 {
00114 ISI->ISI_IDR = flag;
00115 }
00116
00117
00118
00119
00120
00121 uint32_t ISI_StatusRegister(void)
00122 {
00123 return(ISI->ISI_SR);
00124 }
00125
00126
00127
00128
00129 void ISI_CodecPathFull(void)
00130 {
00131
00132
00133 ISI->ISI_CR |= ISI_CR_ISI_CDC;
00134 ISI->ISI_CFG1 |= ISI_CFG1_FULL;
00135 }
00136
00137
00138
00139
00140
00141 void ISI_SetFrameRate(uint32_t frame)
00142 {
00143 if( frame > 7 ) {
00144 TRACE_ERROR("rate too big\n\r");
00145 frame = 7;
00146 }
00147 ISI->ISI_CFG1 |= ISI_CFG1_FRATE(frame);
00148 }
00149
00150
00151
00152
00153
00154 uint8_t ISI_BytesForOnePixel(uint8_t bmpRgb)
00155 {
00156 uint8_t nbByte_Pixel;
00157
00158 if (bmpRgb == RGB) {
00159 if ((_ISI_GetCFG2_Workaround() & ISI_CFG2_RGB_MODE) == ISI_CFG2_RGB_MODE){
00160
00161 nbByte_Pixel = 2;
00162 } else {
00163
00164 nbByte_Pixel = 3;
00165 }
00166 } else {
00167
00168 nbByte_Pixel = 2;
00169 }
00170 return nbByte_Pixel;
00171 }
00172
00173
00174
00175
00176 void ISI_Reset(void)
00177 {
00178 uint32_t timeout=0;
00179
00180
00181
00182 ISI->ISI_CR = ISI_CR_ISI_SRST | ISI_CR_ISI_DIS;
00183
00184 while( (!(ISI->ISI_SR & ISI_SR_SRST))
00185 && (timeout < 0x5000) ) {
00186 timeout++;
00187 }
00188 if( timeout == 0x5000 ) {
00189 TRACE_ERROR("ISI-Reset timeout\n\r");
00190 }
00191 }
00192
00193
00194
00195
00196
00197
00198
00199 void ISI_SetBlank(uint8_t hBlank, uint8_t vBlank)
00200 {
00201 ISI->ISI_CFG1 |= ISI_CFG1_SLD(hBlank) + ISI_CFG1_SFD(vBlank);
00202 }
00203
00204
00205
00206
00207
00208
00209
00210 void ISI_SetSensorSize(uint32_t hSize, uint32_t vSize)
00211 {
00212
00213
00214
00215
00216 ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() | ISI_CFG2_IM_VSIZE(vSize - 1)
00217 | ISI_CFG2_IM_HSIZE(hSize - 1);
00218 }
00219
00220
00221
00222
00223
00224 void ISI_RgbPixelMapping(uint32_t wRgbPixelMapping)
00225 {
00226 ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() & (~ISI_CFG2_RGB_CFG_Msk);
00227 if (wRgbPixelMapping != ISI_CFG2_RGB_CFG_DEFAULT)
00228 ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() | wRgbPixelMapping
00229 | ISI_CFG2_RGB_MODE;
00230 else
00231 ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround();
00232 }
00233
00234
00235
00236
00237
00238 void ISI_RgbSwapMode(uint32_t swapMode)
00239 {
00240 ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() & (~ISI_CFG2_RGB_SWAP);
00241 if(swapMode) ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() | ISI_CFG2_RGB_SWAP;
00242 }
00243
00244
00245
00246
00247
00248 void ISI_YCrCbFormat(uint32_t wYuvSwapMode)
00249 {
00250 ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() & (~ISI_CFG2_YCC_SWAP_Msk);
00251 ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() | wYuvSwapMode;
00252 }
00253
00254
00255
00256
00257
00258 void ISI_setGrayScaleMode(uint32_t wPixelFormat)
00259 {
00260 ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() | ISI_CFG2_GRAYSCALE ;
00261 if(wPixelFormat) ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() | ISI_CFG2_GS_MODE;
00262
00263 }
00264
00265
00266
00267
00268
00269 void ISI_setInputStream(uint32_t wStreamMode)
00270 {
00271 ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() & (~ISI_CFG2_COL_SPACE);
00272 if(wStreamMode) ISI->ISI_CFG2 = _ISI_GetCFG2_Workaround() | ISI_CFG2_COL_SPACE;
00273 }
00274
00275
00276
00277
00278
00279
00280 void ISI_setPreviewSize(uint32_t hSize, uint32_t vSize)
00281 {
00282 if (hSize > 640) hSize = 640;
00283 if (vSize > 480) vSize = 480;
00284 ISI->ISI_PSIZE = ISI_PSIZE_PREV_VSIZE(vSize - 1) | ISI_PSIZE_PREV_HSIZE(hSize - 1);
00285 }
00286
00287
00288
00289
00290
00291 void ISI_calcScalerFactor(void)
00292 {
00293 uint32_t hLcdSize, hSensorSize;
00294 uint32_t hRatio;
00295 hLcdSize = ((ISI->ISI_PSIZE & ISI_PSIZE_PREV_HSIZE_Msk) >> ISI_PSIZE_PREV_HSIZE_Pos) +1 ;
00296 hSensorSize = ((_ISI_GetCFG2_Workaround() & ISI_CFG2_IM_HSIZE_Msk )
00297 >> ISI_CFG2_IM_HSIZE_Pos) + 1;
00298 hRatio = 1600 * hSensorSize / hLcdSize;
00299 ISI->ISI_PDECF = (hRatio/100);
00300 }
00301
00302
00303
00304
00305
00306
00307
00308 void ISI_setDmaInPreviewPath(uint32_t baseFrameBufDesc,
00309 uint32_t dmaCtrl, uint32_t frameBufferStartAddr)
00310 {
00311 ISI->ISI_DMA_P_DSCR = baseFrameBufDesc;
00312 ISI->ISI_DMA_P_CTRL = dmaCtrl;
00313 ISI->ISI_DMA_P_ADDR = frameBufferStartAddr;
00314 }
00315
00316
00317
00318
00319
00320
00321
00322 void ISI_setDmaInCodecPath(uint32_t baseFrameBufDesc,
00323 uint32_t dmaCtrl, uint32_t frameBufferStartAddr)
00324 {
00325 ISI->ISI_DMA_C_DSCR = baseFrameBufDesc;
00326 ISI->ISI_DMA_C_CTRL = dmaCtrl;
00327 ISI->ISI_DMA_C_ADDR = frameBufferStartAddr;
00328 }
00329
00330
00331
00332
00333
00334 void ISI_SetMatrix4Yuv2Rgb (ISI_Y2R* yuv2rgb)
00335 {
00336 ISI->ISI_Y2R_SET0 = ISI_Y2R_SET0_C0(yuv2rgb->C0)
00337 | ISI_Y2R_SET0_C1(yuv2rgb->C1)
00338 | ISI_Y2R_SET0_C2(yuv2rgb->C2)
00339 | ISI_Y2R_SET0_C3(yuv2rgb->C3);
00340
00341 ISI->ISI_Y2R_SET1 = ISI_Y2R_SET1_C4(yuv2rgb->C4)
00342 | ((yuv2rgb->Yoff == 1)? ISI_Y2R_SET1_Yoff: 0)
00343 | ((yuv2rgb->Croff == 1)? ISI_Y2R_SET1_Croff: 0)
00344 | ((yuv2rgb->Cboff == 1)? ISI_Y2R_SET1_Cboff: 0);
00345 }
00346
00347
00348
00349
00350
00351 void ISI_SetMatrix4Rgb2Yuv (ISI_R2Y* rgb2yuv)
00352 {
00353 ISI->ISI_R2Y_SET0 = ISI_R2Y_SET0_C0(rgb2yuv->C0)
00354 | ISI_R2Y_SET0_C1(rgb2yuv->C1)
00355 | ISI_R2Y_SET0_C2(rgb2yuv->C2)
00356 | ((rgb2yuv->Roff == 1)? ISI_R2Y_SET0_Roff: 0);
00357
00358 ISI->ISI_R2Y_SET1 = ISI_R2Y_SET1_C3(rgb2yuv->C3)
00359 | ISI_R2Y_SET1_C4(rgb2yuv->C4)
00360 | ISI_R2Y_SET1_C5(rgb2yuv->C5)
00361 | ((rgb2yuv->Goff == 1)? ISI_R2Y_SET1_Goff: 0);
00362
00363 ISI->ISI_R2Y_SET2 = ISI_R2Y_SET2_C6(rgb2yuv->C6)
00364 | ISI_R2Y_SET2_C7(rgb2yuv->C7)
00365 | ISI_R2Y_SET2_C8(rgb2yuv->C8)
00366 | ((rgb2yuv->Boff == 1)? ISI_R2Y_SET2_Boff: 0);
00367 }
00368