main
Default mainpagebasic-isi-projectmain
Description Source Call Graph
Start Line: 743
int main(void)
{
    unsigned char CharReceive=0;
    unsigned char command=0;
    unsigned char nbByte_Pixels=0;
    unsigned char toggle_swapcc=0;
    unsigned int  reg_cr2=0;
    unsigned char toggle_HSYNC=0;
    unsigned char toggle_VSYNC=0;
    unsigned char toggle_POL=0;
    unsigned char toggle_SYNC=0;
    unsigned char toggle_BAR=0;

    EraseBufferLCD();

    PIO_Configure(pins, PIO_LISTSIZE(pins));
    PIO_InitializeInterrupts(0);
    TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
    printf("-- Basic ISI Project %s --\n\r", SOFTPACK_VERSION);
    printf("-- %s\n\r", BOARD_NAME);
    printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);

    S_Video.codec_hsize = 640;
    S_Video.codec_vsize = 480;
    S_Video.lcd_nbpp = 16; // 16-bit format of the LCD controller.
    // Allocate the frame buffers for the preview datapath
    AllocateFBD((AT91PS_VIDEO)&S_Video);

    IsiDescriptors.CurrentLcdIndex = 0;
    IsiDescriptors.DisplayCodec = 0;
    IsiDescriptors.nb_codec_ovf = 0;
    IsiDescriptors.nb_prev_ovf = 0;

    // Configure TWI
    // In IRQ mode: to avoid problems, the priority of the TWI IRQ must be max.
    // In polling mode: try to disable all IRQs if possible.
    // (in this example it does not matter, there is only the TWI IRQ active)
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TWI;
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_ISI;

#if defined (AT91C_ID_LCDC)
    // LCD Enable peripheral clock
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_LCDC;

#if defined(at91sam9261)
    AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_HCK1;
#endif
#endif

#if defined(at91sam9263)
    // ISI_MCK is mapped in PCK3: 24Mhz Sensor clock
    AT91C_BASE_PMC->PMC_PCKR[3] = AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK_8;
    AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK3;
    while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_PCK3RDY) == 0);
#elif defined(at91sam9m10)
    // ISI_MCK is mapped in PCK1: 24Mhz Sensor clock
    AT91C_BASE_PMC->PMC_PCKR[1] = AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK_16;
    AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK1;
    while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_PCK1RDY) == 0);
#else
    // ISI_MCK is mapped in PCK1: 24Mhz Sensor clock
    AT91C_BASE_PMC->PMC_PCKR[1] = AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK_8;
    AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK1;
    while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_PCK1RDY) == 0);
#endif

    TWI_ConfigureMaster(AT91C_BASE_TWI, TWCK, BOARD_MCK);
    TWID_Initialize(&twid, AT91C_BASE_TWI);
    AIC_ConfigureIT(AT91C_ID_TWI, 0, ISR_Twi);
    AIC_EnableIT(AT91C_ID_TWI);

    S_Video.Hblank = 0;
    S_Video.Vblank = 0;
    #if defined (AT91C_ID_LCDC)
    S_Video.lcd_hsize = BOARD_LCD_WIDTH;
    S_Video.lcd_vsize = 180;
    S_Video.lcd_fb_addr = (unsigned int)BuffCam;
    #endif
    // base address of the descriptor list for preview DMA
    S_Video.Isi_fbd_base = (int)&FbList[0];
    S_Video.codec_fb_addr = 0;
    S_Video.rgb_or_yuv = YUV;
    ISI_Init(&S_Video);

    S_Video.IsiPrevBuffIndex = 0;

    AIC_ConfigureIT(AT91C_ID_ISI, AT91C_AIC_PRIOR_HIGHEST, ISR_IsiHandler);
    AIC_EnableIT(AT91C_ID_ISI);

#if defined (AT91C_ID_LCDC)
    AIC_ConfigureIT(AT91C_ID_LCDC, AT91C_AIC_PRIOR_HIGHEST, ISR_LcdHandler);
    AIC_EnableIT(AT91C_ID_LCDC);
#endif

    while( ov965x_init(&twid) == 0 ) {
        printf("-I- Retry init\n\r");
    }
    printf("-I- Init passed\n\r");

    nbByte_Pixels = ISI_BytesForOnePixel(S_Video.rgb_or_yuv);


#if defined (AT91C_ID_LCDC)
    InitializeLcd();
    // LCD power off
    LCD_Disable(0);
    // DMA disable
    LCD_DisableDma();
    // DMA reset
    LCD_DMAReset();
    LCD_SetBitsPerPixel(AT91C_LCDC_PIXELSIZE_SIXTEENBITSPERPIXEL);
    LCD_SetFrameSize((S_Video.lcd_hsize * S_Video.lcd_vsize * S_Video.lcd_nbpp)/32);
    LCD_SetBurstLength(4);
    LCD_SetFrameBufferAddress(BuffCam);
    LCD_EnableDma();
    LCD_Enable(8);
    LCD_EnableInterrupts(AT91C_LCDC_EOFI  | // (LCDC) End of Frame Interrupt
                         AT91C_LCDC_UFLWI | // (LCDC) FIFO Underflow Interrupt
                         AT91C_LCDC_OWRI  | // (LCDC) Over Write Interrupt
                         AT91C_LCDC_MERI);  // (LCDC) Memory Error Interrupt
#endif

    printf("Source Size = [%d,%d]", S_Video.codec_hsize, S_Video.codec_vsize);
    if ( S_Video.rgb_or_yuv == RGB) {
        printf(" RGB\n\r");
    }
    else {
        printf(" YUV\n\r");
    }
    while(1)
    {
        printf("-- ====================================\n\r");
        printf("--           TEST ISI\n\r");
        printf("-- ====================================\n\r");
        TRACE_DEBUG("IP TWI version: 0x%X\n\r", *(unsigned int*)(((unsigned int)AT91C_BASE_TWI)+0xFC));
        TRACE_DEBUG("IP ISI version: 0x%X\n\r", *(unsigned int*)(((unsigned int)AT91C_BASE_ISI)+0xFC));
        #if defined (AT91C_ID_LCDC)
        TRACE_DEBUG("IP LCD version: 0x%X\n\r", *(unsigned int*)(((unsigned int)AT91C_BASE_LCDC)+0x8FC));
        #endif
        printf("-- 1: Sensor QVGA  [320x240]\n\r");
        printf("-- 2: Sensor CIF   [352x288]\n\r");
        printf("-- 3: Sensor VGA   [640x480]\n\r");
        printf("-- 4: Sensor SXGA [1280x1024]\n\r");
        printf("-- 5: Take a BMP photo in RGB\n\r");
        printf("-- 6: Take a BMP photo in YCbCr\n\r");
        printf("-- 7: end video\n\r");
        // Other cases are only for debug purpose
        #if defined (AT91C_ID_LCDC)
        TRACE_DEBUG("-- a: Test LCD: 24bpp\n\r");
        TRACE_DEBUG("-- b: Test LCD: 16bpp, mire, with bgr correction\n\r");
        TRACE_DEBUG("-- c: Test LCD mire:\n\r");
        #endif
        TRACE_DEBUG("-- d: Debug statistics ISI\n\r");
        TRACE_DEBUG("-- e: Select Mode [0:YUV, 1:RGB]\n\r");
        TRACE_DEBUG("-- f: Enable CODEC Path\n\r");
        TRACE_DEBUG("-- g: Debug toggle YCC_SWAP: Defines the YCC image data\n\r");
        TRACE_DEBUG("-- h: Debug toggle HSYNC\n\r");
        TRACE_DEBUG("-- i: Debug toggle VSYNC\n\r");
        TRACE_DEBUG("-- j: Debug toggle PIXCLK_POL\n\r");
        TRACE_DEBUG("-- k: Debug toggle EMB_SYNC\n\r");
        TRACE_DEBUG("-- l: Debug toggle Bar Color\n\r");
        printf("-- Enter: ");
        if( !USART_IsDataAvailable((AT91S_USART *)AT91C_BASE_DBGU) );
        command = DBGU_GetChar();
        printf(".\n\r");

        switch(command) {

            case '1': // QVGA
                S_Video.codec_hsize = 320;
                S_Video.codec_vsize = 240;
                main_Test(&S_Video);
                printf("-- Sensor QVGA    [%dx%d], LCD[%dx%d]\n\r", S_Video.codec_hsize,
                    S_Video.codec_vsize, S_Video.lcd_hsize, S_Video.lcd_vsize);
            break;

            case '2': // CIF
                S_Video.codec_hsize = 352;
                S_Video.codec_vsize = 288;
                main_Test(&S_Video);
                printf("-- Sensor VGA    [%dx%d], LCD[%dx%d]\n\r", S_Video.codec_hsize,
                    S_Video.codec_vsize, S_Video.lcd_hsize, S_Video.lcd_vsize);
            break;

            case '3': // VGA
                S_Video.codec_hsize = 640;
                S_Video.codec_vsize = 480;
                main_Test(&S_Video);
                printf("-- Sensor VGA    [%dx%d], LCD[%dx%d]\n\r", S_Video.codec_hsize,
                    S_Video.codec_vsize, S_Video.lcd_hsize, S_Video.lcd_vsize);
            break;

            case '4': // SXGA
                S_Video.codec_hsize = 1280;
                S_Video.codec_vsize = 1024;
                main_Test(&S_Video);
                printf("-- Sensor SXGA    [%dx%d], LCD[%dx%d]\n\r", S_Video.codec_hsize,
                    S_Video.codec_vsize, S_Video.lcd_hsize, S_Video.lcd_vsize);
            break;

            case '5':
                printf("-- Take a BMP photo in RGB\n\r");
                ISI_Disable();
                // convert ISI captor (YCrCb) to LCD (RGB)
                VIDEO_Ycc2Rgb((unsigned char *)BuffCam,
                              (unsigned short *)BuffTrans,
                              (S_Video.codec_hsize*S_Video.codec_vsize*S_Video.lcd_nbpp)/8);
                S_Video.rgb_or_yuv = RGB;
                WriteBMPheader((unsigned int*)BuffTransBMP,
                               S_Video.lcd_hsize,
                               S_Video.lcd_vsize,
                               S_Video.rgb_or_yuv,
                               nbByte_Pixels);
                #if defined (AT91C_ID_LCDC)
                LCD_Disable(0);
                LCD_DisableDma();
                LCD_DMAReset();
                LCD_SetSize(S_Video.lcd_hsize, S_Video.lcd_vsize);
                LCD_SetFrameSize((S_Video.lcd_hsize * S_Video.lcd_vsize * S_Video.lcd_nbpp)/32);
                LCD_SetFrameBufferAddress((void*)BuffTrans);
                LCD_EnableDma();
                LCD_Enable(8);
                #endif
                printf("BMP image at address 0x%8X, length:%d\n\r",
                                            (unsigned int)BuffTransBMP,
                                            (S_Video.lcd_hsize * S_Video.lcd_vsize * S_Video.lcd_nbpp)/32);
            break;

            case '6':
                printf("-- Take a BMP photo in YCbCr\n\r");
                ISI_Disable();
                S_Video.rgb_or_yuv = YUV;
                WriteBMPheader((unsigned int*)BuffCamBMP,
                               S_Video.lcd_hsize,
                               S_Video.lcd_vsize,
                               S_Video.rgb_or_yuv,
                               nbByte_Pixels);
                #if defined (AT91C_ID_LCDC)
                LCD_Disable(0);
                LCD_DisableDma();
                LCD_DMAReset();
                LCD_SetSize(S_Video.lcd_hsize, S_Video.lcd_vsize);
                LCD_SetFrameSize((S_Video.lcd_hsize * S_Video.lcd_vsize * S_Video.lcd_nbpp)/32);
                LCD_SetFrameBufferAddress((void*)BuffCam);
                LCD_EnableDma();
                LCD_Enable(8);
                #endif
                printf("BMP image at address 0x%8X, length:%d\n\r",
                                            (unsigned int)BuffCamBMP,
                                            (S_Video.lcd_hsize * S_Video.lcd_vsize * S_Video.lcd_nbpp)/32);
            break;

            case '7':
                printf("-- end video\n\r");
                #if !defined (BOARD_ISI_V200)
                    ISI_DisableInterrupt(AT91C_ISI_FO_P_EMP | AT91C_ISI_FO_C_EMP
                                       | AT91C_ISI_FO_C_OVF | AT91C_ISI_FO_P_OVF);
                #else
                    ISI_DisableInterrupt( AT91C_ISI_PXFR_DONE_1 | AT91C_ISI_CXFR_DONE_1
                                        | AT91C_ISI_C_OVR_1     | AT91C_ISI_P_OVR_1
                                        | AT91C_ISI_CRC_ERR_1   | AT91C_ISI_FR_OVR_1);
                #endif

                EraseBufferLCD();
                #if defined (AT91C_ID_LCDC)
                LCD_SetFrameBufferAddress((void*)BuffCam);
                #endif
                ISI_Reset();
            break;


            //------------------------------------------------------------------
            // Other cases are only for debug purpose
            //------------------------------------------------------------------
            #if defined (AT91C_ID_LCDC)
            case 97:  // 'a'
                printf("-- Test LCD: 24bpp\n\r");
                InitializeLcd();
                // LCD power off
                LCD_Disable(0);
                // DMA disable
                LCD_DisableDma();
                // DMA reset
                LCD_DMAReset();

                EraseBufferLCD();
                LCD_SetFrameSize((BOARD_LCD_WIDTH * BOARD_LCD_HEIGHT * 24)/32);
                LCD_SetFrameBufferAddress((void*)BuffCam);

                // DMA enable.
                LCD_EnableDma();
                // LCD power on
                LCD_Enable(8);

                #ifdef BOARD_LCD_RGB565
                    TestLCD_RGB_240_320_24bpp(BuffCam);
                #else
                    TestLCD_BGR_240_320_24bpp(BuffCam);
                #endif
            break;

            case 98: // 'b'
                printf("-- Test LCD: 16bpp, mire, with bgr correction\n\r");
                InitializeLcd();
                // LCD power off
                LCD_Disable(0);
                // DMA disable
                LCD_DisableDma();
                // DMA reset
                LCD_DMAReset();

                EraseBufferLCD();
                LCD_SetBitsPerPixel(AT91C_LCDC_PIXELSIZE_SIXTEENBITSPERPIXEL);
                LCD_SetFrameSize((BOARD_LCD_WIDTH * BOARD_LCD_HEIGHT * 16)/32);
                LCD_SetFrameBufferAddress((void*)BuffCam);

                // DMA enable.
                LCD_EnableDma();
                // LCD power on
                LCD_Enable(8);

                #ifdef BOARD_LCD_RGB565
                    TestLCD_RGB565_240_320_16bpp(BuffCam);
                #else
                    TestLCD_BGR555_240_320_16bpp(BuffCam);
                #endif
            break;

            case 99: // 'c'
                printf("-- Test LCD mire:\n\r");
                InitializeLcd();
                // LCD power off
                LCD_Disable(0);
                // DMA disable
                LCD_DisableDma();
                // DMA reset
                LCD_DMAReset();

                EraseBufferLCD();

                LCD_SetBitsPerPixel(AT91C_LCDC_PIXELSIZE_SIXTEENBITSPERPIXEL);
                LCD_SetFrameSize((BOARD_LCD_WIDTH * BOARD_LCD_HEIGHT * 16)/32);
                LCD_SetBurstLength(4);

                // this image should be see with the adaptator on the lcd
                LCD_DecodeRGB( (unsigned char*)image_2008,
                               (unsigned char*)BuffCam,
                               320,
                               240,
                               16);
                LCD_SetFrameBufferAddress((void*)BuffCam);

                // DMA enable.
                LCD_EnableDma();
                // LCD power on
                LCD_Enable(8);
            break;
            #endif

            case 100: // 'd'
                printf("-- statistics ISI\n\r");
                printf("IsiDescriptors.DisplayCodec = %d\n\r", IsiDescriptors.DisplayCodec);
                printf("IsiDescriptors.Fifo Codec Overflow   = %d\n\r", IsiDescriptors.nb_codec_ovf);
                printf("IsiDescriptors.Fifo Preview Overflow = %d\n\r", IsiDescriptors.nb_prev_ovf);
                printf("S_Video.codec_hsize: %d\n\r", S_Video.codec_hsize);
                printf("S_Video.codec_vsize: %d\n\r", S_Video.codec_vsize);
                printf("S_Video.lcd_hsize: %d\n\r", S_Video.lcd_hsize);
                printf("S_Video.lcd_vsize: %d\n\r", S_Video.lcd_vsize);

                #if !defined (BOARD_ISI_V200)
                    printf("ISI_CR1 0x%X\n\r", AT91C_BASE_ISI->ISI_CR1);
                    printf("ISI_CR2 0x%X\n\r", AT91C_BASE_ISI->ISI_CR2);
                    printf("ISI_SR  0x%X\n\r", AT91C_BASE_ISI->ISI_SR);
                    printf("ISI_PPFBD 0x%X\n\r", AT91C_BASE_ISI->ISI_PPFBD);
                    printf("ISI_PDECF %d\n\r", AT91C_BASE_ISI->ISI_PDECF);
                    printf("ISI_PSIZE 0x%X\n\r", AT91C_BASE_ISI->ISI_PSIZE);
                    printf("ISI_Y2RSET0 0x%X\n\r", AT91C_BASE_ISI->ISI_Y2RSET0);
                    printf("ISI_Y2RSET1 0x%X\n\r", AT91C_BASE_ISI->ISI_Y2RSET1);
                    printf("ISI_R2YSET0 0x%X\n\r", AT91C_BASE_ISI->ISI_R2YSET0);
                    printf("ISI_R2YSET1 0x%X\n\r", AT91C_BASE_ISI->ISI_R2YSET1);
                    printf("ISI_R2YSET2 0x%X\n\r", AT91C_BASE_ISI->ISI_R2YSET2);
                #else
                    printf("ISI_CFG1 0x%X\n\r", AT91C_BASE_ISI->ISI_CFG1);
                    printf("ISI_CFG2 0x%X\n\r", AT91C_BASE_ISI->ISI_CFG2);
                    printf("ISI_PSIZE 0x%X\n\r", AT91C_BASE_ISI->ISI_PSIZE);
                    printf("ISI_PDECF %d\n\r", AT91C_BASE_ISI->ISI_PDECF);
                    printf("ISI_Y2RSET0 0x%X\n\r", AT91C_BASE_ISI->ISI_Y2RSET0);
                    printf("ISI_Y2RSET1 0x%X\n\r", AT91C_BASE_ISI->ISI_Y2RSET1);
                    printf("ISI_R2YSET0 0x%X\n\r", AT91C_BASE_ISI->ISI_R2YSET0);
                    printf("ISI_R2YSET1 0x%X\n\r", AT91C_BASE_ISI->ISI_R2YSET1);
                    printf("ISI_R2YSET2 0x%X\n\r", AT91C_BASE_ISI->ISI_R2YSET2);
                    printf("ISI_CTRL 0x%X\n\r", AT91C_BASE_ISI->ISI_CTRL);
                    printf("ISI_SR   0x%X\n\r", AT91C_BASE_ISI->ISI_SR);
                    printf("ISI_IER  0x%X\n\r", AT91C_BASE_ISI->ISI_IER);
                    printf("ISI_IDR  0x%X\n\r", AT91C_BASE_ISI->ISI_IDR);
                    printf("ISI_IMR  0x%X\n\r", AT91C_BASE_ISI->ISI_IMR);

                    printf("ISI_DMACHER  0x%X\n\r", AT91C_BASE_ISI->ISI_DMACHER);
                    printf("ISI_DMACHDR  0x%X\n\r", AT91C_BASE_ISI->ISI_DMACHDR);
                    printf("ISI_DMACHSR  0x%X\n\r", AT91C_BASE_ISI->ISI_DMACHSR);
                    printf("ISI_DMAPADDR  0x%X\n\r", AT91C_BASE_ISI->ISI_DMAPADDR);
                    printf("ISI_DMAPCTRL  0x%X\n\r", AT91C_BASE_ISI->ISI_DMAPCTRL);
                    printf("ISI_DMAPDSCR  0x%X\n\r", AT91C_BASE_ISI->ISI_DMAPDSCR);
                    printf("ISI_DMACADDR  0x%X\n\r", AT91C_BASE_ISI->ISI_DMACADDR);
                    printf("ISI_DMACCTRL  0x%X\n\r", AT91C_BASE_ISI->ISI_DMACCTRL);
                    printf("ISI_DMACDSCR  0x%X\n\r", AT91C_BASE_ISI->ISI_DMACDSCR);

                    printf("ISI_WPCR  0x%X\n\r", AT91C_BASE_ISI->ISI_WPCR);
                    printf("ISI_WPSR  0x%X\n\r", AT91C_BASE_ISI->ISI_WPSR);
                #endif

                #if defined (AT91C_ID_LCDC)
                printf("LCDC_BA1   0x%X\n\r", AT91C_BASE_LCDC->LCDC_BA1);
                printf("LCDC_BA2   0x%X\n\r", AT91C_BASE_LCDC->LCDC_BA2);
                printf("LCDC_FRMP1 0x%X\n\r", AT91C_BASE_LCDC->LCDC_FRMP1);
                printf("LCDC_FRMP2 0x%X\n\r", AT91C_BASE_LCDC->LCDC_FRMP2);
                printf("LCDC_FRMA1 0x%X\n\r", AT91C_BASE_LCDC->LCDC_FRMA1);
                printf("LCDC_FRMA2 0x%X\n\r", AT91C_BASE_LCDC->LCDC_FRMA2);
                printf("LCDC_FRMCFG 0x%X\n\r", AT91C_BASE_LCDC->LCDC_FRMCFG);
                printf("LCDC_DMACON 0x%X\n\r", AT91C_BASE_LCDC->LCDC_DMACON);
                printf("LCDC_DMA2DCFG 0x%X\n\r", AT91C_BASE_LCDC->LCDC_DMA2DCFG);
                printf("LCDC_LCDCON1 0x%X\n\r", AT91C_BASE_LCDC->LCDC_LCDCON1&0x001FF001);
                printf("LCDC_LCDCON2 0x%X\n\r", AT91C_BASE_LCDC->LCDC_LCDCON2);
                printf("LCDC_TIM1 0x%X\n\r", AT91C_BASE_LCDC->LCDC_TIM1);
                printf("LCDC_TIM2 0x%X\n\r", AT91C_BASE_LCDC->LCDC_TIM2);
                printf("LCDC_LCDFRCFG 0x%X\n\r", AT91C_BASE_LCDC->LCDC_LCDFRCFG);
                printf("LCDC_MVAL     0x%X\n\r", AT91C_BASE_LCDC->LCDC_MVAL);
                printf("LCDC_PWRCON   0x%X\n\r", AT91C_BASE_LCDC->LCDC_PWRCON);
                printf("LCDC_CTRSTCON 0x%X\n\r", AT91C_BASE_LCDC->LCDC_CTRSTCON);
                printf("LCDC_CTRSTVAL 0x%X\n\r", AT91C_BASE_LCDC->LCDC_CTRSTVAL);
                printf("LCDC_ISR 0x%X\n\r", AT91C_BASE_LCDC->LCDC_ISR);
                printf("LCDC_GPR 0x%X\n\r", AT91C_BASE_LCDC->LCDC_GPR);
                #endif
           break;

            case 101: // 'e'
                printf("-- Select Mode [0:YUV, 1:RGB]: ");
                if ( !USART_IsDataAvailable((AT91S_USART *)AT91C_BASE_DBGU) ) {}
                CharReceive = DBGU_GetChar();
                printf("%c\n\r", CharReceive);
                if( ( CharReceive == 0x30 ) || ( CharReceive == 0x31 ) ) {
                    #if !defined (BOARD_ISI_V200)
                        ISI_DisableInterrupt(AT91C_ISI_FO_P_EMP);
                    #else
                        ISI_DisableInterrupt(AT91C_ISI_PXFR_DONE_1);
                    #endif
                    ISI_Reset();
                    S_Video.rgb_or_yuv = CharReceive-0x30;
                    if( S_Video.rgb_or_yuv == RGB ) {
                        // Values for RGB565
                        // 0x12 0x03
                        ov965x_write_reg(&twid, 0x12, 0x03);
                        // 0x3A 0xC0
                        ov965x_write_reg(&twid, 0x3A, 0xC0);
                        // 0x40 0xd0
                        ov965x_write_reg(&twid, 0x40, 0xD0);
                        // 0xC7 0x80
                        ov965x_write_reg(&twid, 0xC7, 0x80);
                    }
                    else {
                        // 0x12 0x62
                        ov965x_write_reg(&twid, 0x12, 0x62);
                        // 0x3a 0x80
                        ov965x_write_reg(&twid, 0x3A, 0x80);
                        // 0x40 0xc0
                        ov965x_write_reg(&twid, 0x40, 0xC0);
                        // 0xc7 0x80
                        ov965x_write_reg(&twid, 0xC7, 0x80);
                    }
                    ISI_Init(&S_Video);
                    #if !defined (BOARD_ISI_V200)
                        ISI_EnableInterrupt(AT91C_ISI_FO_P_EMP | AT91C_ISI_FO_P_OVF);
                    #else
                        ISI_DisableInterrupt(AT91C_ISI_PXFR_DONE_1 | AT91C_ISI_P_OVR_1);
                    #endif
                    ISI_Reset();
                    ISI_Enable();
                }
                else {
                    TRACE_ERROR("Mode not supported\n\r");
                    printf("-- Press a key\n\r");
                    if ( !USART_IsDataAvailable((AT91S_USART *)AT91C_BASE_DBGU) ) {}
                }
            break;

            case 102: // 'f'
                printf("-- Enable CODEC Path\n\r");
                ISI_Reset();
                ISI_CodecPathFull();
                ISI_Enable();
            break;

            case 103: // 'g'
                printf("-- toggle swapp CC\n\r");
                #if !defined (BOARD_ISI_V200)
                    reg_cr2 = AT91C_BASE_ISI->ISI_CR2;
                #else
                    reg_cr2 = AT91C_BASE_ISI->ISI_CFG2;
                #endif
                reg_cr2 &= ~AT91C_ISI_YCC_SWAP;
                if(toggle_swapcc == 0) {
                    printf("AT91C_ISI_YCC_SWAP_YCC_DEFAULT\n\r");
                    toggle_swapcc = 1;
                }
                else if(toggle_swapcc == 1) {
                    printf("AT91C_ISI_YCC_SWAP_YCC_MODE1\n\r");
                    reg_cr2 |= AT91C_ISI_YCC_SWAP_YCC_MODE1;
                    toggle_swapcc = 2;
                }
                else if(toggle_swapcc == 2) {
                    printf("AT91C_ISI_YCC_SWAP_YCC_MODE2\n\r");
                    reg_cr2 |= AT91C_ISI_YCC_SWAP_YCC_MODE2;
                    toggle_swapcc = 3;
                }
                else {
                    printf("AT91C_ISI_YCC_SWAP_YCC_MODE3\n\r");
                    reg_cr2 |= AT91C_ISI_YCC_SWAP_YCC_MODE3;
                    toggle_swapcc = 0;
                }
                #if !defined (BOARD_ISI_V200)
                    AT91C_BASE_ISI->ISI_CR2 = reg_cr2;
                #else
                    AT91C_BASE_ISI->ISI_CFG2 = reg_cr2;
                #endif
            break;

            case 104: // 'h'
                printf("-- toggle HSYNC\n\r");
                if(toggle_HSYNC == 0) {
                    printf("HSYNC active high\n\r");
                    #if !defined (BOARD_ISI_V200)
                        AT91C_BASE_ISI->ISI_CR1 &= ~AT91C_ISI_HSYNC_POL;
                    #else
                        AT91C_BASE_ISI->ISI_CFG1 &= ~AT91C_ISI_HSYNC_POL;
                    #endif
                    toggle_HSYNC = 1;
                }
                else if(toggle_HSYNC == 1) {
                    printf("HSYNC active low\n\r");
                    #if !defined (BOARD_ISI_V200)
                        AT91C_BASE_ISI->ISI_CR1 |= AT91C_ISI_HSYNC_POL;
                    #else
                        AT91C_BASE_ISI->ISI_CFG1 |= AT91C_ISI_HSYNC_POL;
                    #endif
                    toggle_HSYNC = 0;
                }
            break;

            case 105: // 'i'
                printf("-- toggle VSYNC\n\r");
                if(toggle_VSYNC == 0) {
                    printf("VSYNC active high\n\r");
                    #if !defined (BOARD_ISI_V200)
                        AT91C_BASE_ISI->ISI_CR1 &= ~AT91C_ISI_VSYNC_POL;
                    #else
                        AT91C_BASE_ISI->ISI_CFG1 &= ~AT91C_ISI_VSYNC_POL;
                    #endif
                    toggle_VSYNC = 1;
                }
                else if(toggle_VSYNC == 1) {
                    printf("VSYNC active low\n\r");
                    #if !defined (BOARD_ISI_V200)
                        AT91C_BASE_ISI->ISI_CR1 |= AT91C_ISI_VSYNC_POL;
                    #else
                        AT91C_BASE_ISI->ISI_CFG1 |= AT91C_ISI_VSYNC_POL;
                    #endif
                    toggle_VSYNC = 0;
                }
            break;

            case 106: // 'j'
                printf("-- toggle PIXCLK_POL\n\r");
                if(toggle_POL == 0) {
                    printf("PIXCLK rising edge\n\r");
                    #if !defined (BOARD_ISI_V200)
                        AT91C_BASE_ISI->ISI_CR1 &= ~AT91C_ISI_PIXCLK_POL;
                    #else
                        AT91C_BASE_ISI->ISI_CFG1 &= ~AT91C_ISI_PIXCLK_POL;
                    #endif
                    toggle_POL = 1;
                }
                else if(toggle_POL == 1) {
                    printf("PIXCLK falling edge\n\r");
                    #if !defined (BOARD_ISI_V200)
                        AT91C_BASE_ISI->ISI_CR1 |= AT91C_ISI_PIXCLK_POL;
                    #else
                        AT91C_BASE_ISI->ISI_CFG1 |= AT91C_ISI_PIXCLK_POL;
                    #endif
                    toggle_POL = 0;
                }
            break;

            case 107: // 'k'
                printf("-- toggle EMB_SYNC\n\r");
                if(toggle_SYNC == 0) {
                    printf("Synchronization by HSYNC, VSYNC\n\r");
                    #if !defined (BOARD_ISI_V200)
                        AT91C_BASE_ISI->ISI_CR1 &= ~AT91C_ISI_EMB_SYNC;
                    #else
                        AT91C_BASE_ISI->ISI_CFG1 &= ~AT91C_ISI_EMB_SYNC;
                    #endif
                    toggle_SYNC = 1;
                }
                else if(toggle_SYNC == 1) {
                    printf("Synchronization by embedded synchronization sequence SAV/EAV\n\r");
                    #if !defined (BOARD_ISI_V200)
                        AT91C_BASE_ISI->ISI_CR1 |= AT91C_ISI_EMB_SYNC;
                    #else
                        AT91C_BASE_ISI->ISI_CFG1 |= AT91C_ISI_EMB_SYNC;
                    #endif
                    toggle_SYNC = 0;
                }
            break;

            case 108: // 'l'
                printf("-- Debug Toggle Bar Color\n\r");
                if(toggle_BAR == 0) {
                    printf("Set Bar Color\n\r");
                    // Set register 8D bit 4 high (10hex)
                    ov965x_write_reg(&twid, 0x8D, 0x10);
                    toggle_BAR = 1;
                }
                else if(toggle_BAR == 1) {
                    printf("Remove Bar color\n\r");
                    ov965x_write_reg(&twid, 0x8D, 0x00);
                    toggle_BAR = 0;
                }
            break;

            default:
                printf("-%c ", command);
                printf("-%d\n\r", command);
                command = 0;
            break;
        }
    }
}