⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buxx_adsc.c

📁 bu1566dsp芯片用来处理ov7660或其他30万摄像模组的图像预览.图像拍照(jpeg压缩)
💻 C
📖 第 1 页 / 共 5 页
字号:
//-----------------------------------------------------------------------------
int aDSC_greenled_set(const UINT16 ledon, const UINT16 ledoff,
                      const UINT16 slope, const UINT16 duty)
{
    int err_code = 0;

    if (ledon > maxGON)
        err_code = 0x5010;
    if (ledoff > maxGOFF)
        err_code = 0x5011;
    if (slope > maxGSLOPE)
        err_code = 0x5012;
    if (duty > maxGDUTY)
        err_code = 0x5013;

    data_write(PWMGCNT, (ledon << 8) | (ledoff));
    bit_write(PWMSLOPE, bGSLOPE, LOW);
    bit_write(PWMSLOPE, slope << 4, HIGH);
    bit_write(PWMDUTY, bGDUTY, LOW);
    bit_write(PWMDUTY, duty << 4, HIGH);

    if (err_code)
        DEBUG_WRITE((0, 0, "%x", err_code));
    return (err_code);

}



//-----------------------------------------------------------------------------
//                                Blue LED setup
//-----------------------------------------------------------------------------
int aDSC_blueled_set(const UINT16 ledon, const UINT16 ledoff,
                     const UINT16 slope, const UINT16 duty)
{
    int err_code = 0;

    if (ledon > maxGON)
        err_code = 0x5020;
    if (ledoff > maxGOFF)
        err_code = 0x5021;
    if (slope > maxGSLOPE)
        err_code = 0x5022;
    if (duty > maxGDUTY)
        err_code = 0x5023;

    data_write(PWMBCNT, (ledon << 8) | (ledoff));
    bit_write(PWMSLOPE, bBSLOPE, LOW);
    bit_write(PWMSLOPE, slope, HIGH);
    bit_write(PWMDUTY, bBDUTY, LOW);
    bit_write(PWMDUTY, duty, HIGH);

    if (err_code)
        DEBUG_WRITE((0, 0, "%x", err_code));
    return (err_code);

}



//-----------------------------------------------------------------------------
//                           3 color LED on/off 
//-----------------------------------------------------------------------------
int aDSC_3cled_on_off(const UINT16 rsw, const UINT16 gsw, const UINT16 bsw,
                      const UINT16 pwmclk, const UINT16 mode)
{
    UINT16 hwmode;
    int err_code = 0;

    if (pwmclk > maxPWMCLK)
        err_code = 0x5030;

    hwmode = hwmode_read();
    gl_dsc_status = sLEDMODE;
    aDSC_Quit_Preview();
    gl_dsc_status = mode;

    if (rsw == sRSW_OFF && gsw == sGSW_OFF && bsw == sBSW_OFF)
    {                           //LED OFF
        if (bit_read(PWMCNT1, bPWMWHT_EN))
        {                       //WHITE LED ON
            bit_write(PWMCNT1, bPWM3C_EN, LOW);
        }
        else
        {                       //ALL LED OFF
            bit_write(PWMCNT1, bPWM_EN | bPWM3C_EN, LOW);       //PWM OFF
        }
    }
    else
    {
        bit_write(PWMCNT1, bPWM_EN | bPWM3C_EN, HIGH);
    }
    data_write(PWMCNT2, mode | (pwmclk << 4) | rsw | gsw | bsw);

    if (err_code)
        DEBUG_WRITE((0, 0, "%x", err_code));
    return (err_code);
}



//-----------------------------------------------------------------------------
//                            White LED on/off  
//-----------------------------------------------------------------------------
int aDSC_whiteled_on_off(const UINT16 pwmwht_en, const UINT16 pwmwht_peri,
                         const UINT16 pwmwht_duty)
{
    UINT16 mode;
    int err_code = 0;

    if (pwmwht_peri > maxPWMWHT_PERI)
        err_code = 0x5040;
    if (pwmwht_duty > maxPWMWHT_DUTY)
        err_code = 0x5041;

    mode = hwmode_read();
    gl_dsc_status = sLEDMODE;
    aDSC_Quit_Preview();
    gl_dsc_status = mode;

    if (pwmwht_en == sPWMWHT_DISABLE)
    {                           //WHITE LED OFF
        if (bit_read(PWMCNT1, bPWM3C_EN))
        {                       //3C LED ON
            bit_write(PWMCNT1, bPWMWHT_EN, LOW);
        }
        else
        {                       //ALL LED OFF
            bit_write(PWMCNT1, bPWM_EN | bPWMWHT_EN, LOW);      //PWM OFF
        }
    }
    else
    {
        bit_write(PWMCNT1, bPWM_EN | bPWMWHT_EN, HIGH);
    }

    data_write(PWMWCNT, (pwmwht_peri << 8) | pwmwht_duty);

    if (err_code)
        DEBUG_WRITE((0, 0, "%x", err_code));
    return (err_code);
}

void aDSC_GIO_Write(UINT8 u8GioIndex, UINT8 u8Bit)
{
    bit_write(GIOCNT, 0x1<<u8GioIndex, LOW); //set GIO for output 
    bit_write(GIOOUT, 0x1<<u8GioIndex, u8Bit);   
}

UINT16 aDSC_GIO_Read(UINT8 u8GioIndex)
{
    bit_write(GIOCNT, 0x1<<u8GioIndex, HIGH); //set GIO for input
    return bit_read(GIOIN,0x1<<u8GioIndex);  
}

//-----------------------------------------------------------------------------
//                JPEG Encode dispose(Frame, Camera, Ringbuffer)                           
//-----------------------------------------------------------------------------
static int jpeg_encode(UINT16 * start_add, UINT32 * const jpeg_size,
                       const int entype, const UINT16 je_q,
                       const UINT16 hflip)
{

    int i;
    UINT32 je_size;
    int err_code = 0;
    int bank_count = 0;
    int count = 0;
    UINT16* p_u16StartAddr=start_add;
    UINT32 u32BufMaxSize=*jpeg_size;

#if BUSACCESS_BIT == 8 && ENDIAN == sLITTLE_END
    UINT16 reg_data;
#endif

#if BUSACCESS_BIT == 16 && ENDIAN == sLITTLE_END
    bit_write(MEMCNT, bSWAP_BYTE, HIGH);
#endif

    bit_write(MEMCNT, bADRINC, HIGH);

    //----- JPEG Encode
    bit_write(JPG_CNT, bSWRST | bRING_A_RST, HIGH);     // Reset JPEG core
    wait(1);                    // wait 1ms
    bit_write(JPG_CNT, bSWRST | bRING_A_RST, LOW);      // Clear Reset

    data_write(JE_CNT, bJE_HEAD | hflip | je_q);        // Full Header, HFLIP=0, Quality=3(nornal)

    mem_adr_abs_set(0x00000000);

    mode_change(sREADY);
    switch (entype)
    {
#if defined sCAMERAJPEG
    case sCAMERAJPEG:
        mode_change(sCAMERAJPEG);
        break;
#endif
    case sFRAMEJPEG:
        mode_change(sFRAMEJPEG);
        break;
    case sRINGBUFFER:
        mode_change(sRINGBUFFER);
        break;
    default:
        mode_change(sFRAMEJPEG);
        break;
    }

    if (entype == sRINGBUFFER)
    {
        UINT32 u32CurCodeSize=0;
        gl_bank_chk = 0;
        gl_je_end_chk = 0;
        data_write(JPG_INTST, 0x0000);  //Interrupt status clear
        bit_write(JPG_INTMSK, bJE_RING_INT | bJE_ED_INT, LOW);  // JE_RING_INT,JE_ED_INT Enable

   	bit_write(JPG_CNT, bJE_ST, HIGH);   // JPEG encode start
   	wait(1);

#if defined BUXX_POLLING
{
        UINT16 u16IntStatus=0;
        while ((u16IntStatus = data_read(JPG_INTST)) == 0);
        if (u16IntStatus & bJE_RING_INT)
        {                       // JE_RING_INT
            bit_write(JPG_INTST, bJE_RING_INT, LOW);      // JE_RING_INT clear
            gl_bank_chk++;
        }
        if (u16IntStatus & bJE_ED_INT)
        {
            bit_write(JPG_INTST, bJE_ED_INT, LOW);                // JE_ED_INT clear
            gl_je_end_chk++;
        }
}
#else
        while (gl_bank_chk == 0 && gl_je_end_chk == 0);
#endif
        mem_acs_read_st(RING_RD);

        while (1)
        {
            if (gl_bank_chk != 0 || (gl_bank_chk == 0 && gl_je_end_chk == 1))
            {
                if (gl_bank_chk == 0 && gl_je_end_chk == 1)
                {
                    while (data_read(JPG_ST1));
                    je_size = read_je_size() * 2 -  BANK_SIZE * (bank_count % BANK_NUM);
                    count = je_size;
                    reg_write(INDEX, RING_RD);
                    if (bank_count != 0)
                        count += 2;
                }
                else
                {
                    count = BANK_SIZE;
                    if (bank_count == 0)
                    {
                        count -= 2;
                    }
                    else
                    {
                        reg_write(INDEX, RING_RD);
                    }
                }
#if BUSACCESS_BIT == 8 && ENDIAN == sLITTLE_END
                hostcnt_bitwrite(bHOST_END, HIGH);
                reg_write(INDEX, RING_RD);
#endif

                //Check current JPEG code size
                u32CurCodeSize += count;
                if (u32CurCodeSize > u32BufMaxSize)
                {
                    err_code = 0x02;
                    goto ENC_END;
                }

                read_code(&start_add, count / 2);

#if BUSACCESS_BIT == 8 && ENDIAN == sLITTLE_END
                reg_data = hostcnt_bitread(0xffff);
                reg_data = ((reg_data & 0xff00) >> 8) | ((reg_data & 0x00ff) << 8);
                hostcnt_write(reg_data & (UINT16) (~(bHOST_END)));
#endif

                if (gl_bank_chk == 0 && gl_je_end_chk == 1)
                {
                    je_size += BANK_SIZE * bank_count;
                    if (je_size > *jpeg_size)
                    {
                        err_code = 0x02;
                        goto ENC_END;
                    }
                    *jpeg_size = je_size;
                    break;
                }
                else
                {
                    gl_bank_chk--;
                    bank_count++;
                    if (gl_bank_chk >= BANK_NUM)
                    {
                        err_code = 0x03;
                        goto ENC_END;
                    }
                }
            }
 #if defined BUXX_POLLING
{
            UINT16 u16IntStatus=0;
            while ((u16IntStatus = data_read(JPG_INTST)) == 0);
            if (u16IntStatus & bJE_RING_INT)
            {                       // JE_RING_INT
                bit_write(JPG_INTST, bJE_RING_INT, LOW);      // JE_RING_INT clear
                gl_bank_chk++;
            }
            if (u16IntStatus & bJE_ED_INT)
            {
                bit_write(JPG_INTST, bJE_ED_INT, LOW);                // JE_ED_INT clear
                gl_je_end_chk++;
            }
}
 #endif
        }
    }
    else
    {
    	int dummy_mode = gl_dsc_status;
	gl_dsc_status = sLEDMODE;   // Dummy set
	
	gl_check_int = 0;
	data_write(JPG_INTST, 0x0000);      //Interrupt status clear
	data_write(JPG_INTMSK, 0x0006);   //bJE_ED_MSK disable 

   	bit_write(JPG_CNT, bJE_ST, HIGH);   // JPEG encode start
   	wait(1);

#if defined BUXX_POLLING
	reg_write(INDEX, JPG_INTST);
	while (reg_read(REG) == 0);
#else
	while (gl_check_int == 0);
#endif
	data_write(JPG_INTMSK, 0xffff);     //mask all JPEG int 

	gl_dsc_status = dummy_mode;
        while (data_read(JPG_ST1));

#if defined sCAMERAJPEG
        if (entype == sCAMERAJPEG)
        {
            if (data_read(JPG_ST2))
            {
                err_code = 0x01;
                goto ENC_END;
            }
        }
#endif

        je_size = read_je_size() * 2;
	 mode_change(sREADY); //William add for BU1563 fm-encode failed 20050508
	 
        if (je_size > *jpeg_size)
        {
            err_code = 0x02;
            goto ENC_END;
        }
	
        mem_adr_abs_set(0x00000000);

#if BUSACCESS_BIT == 8 && ENDIAN == sLITTLE_END
        hostcnt_bitwrite(bHOST_END, HIGH);
#endif

        mem_acs_read_st(MEMACS_ABS);
        for (i = 0; i < je_size / 2; i++)
        {
            *start_add = reg_read(REG);
            start_add++;
        }

#if BUSACCESS_BIT == 8 && ENDIAN == sLITTLE_END
        reg_data = hostcnt_bitread(0xffff); //fix for compile 20050509
        reg_data = ((reg_data & 0xff00) >> 8) | ((reg_data & 0x00ff) << 8);
        hostcnt_write(reg_data & (UINT16) (~(bHOST_END)));      //rectangle increment丄auto increment on        
#endif

        *jpeg_size = je_size;
    }

//William add for fail-safe begin
	if(*(UINT16*)(start_add-1)==0x0000) 
	{
	    (*jpeg_size)-=2;
	}

	if(*(p_u16StartAddr+(*jpeg_size)/2-1)
#if ENDIAN == sLITTLE_END
		!=0xd9ff
#else
		!=0xffd9
#endif
	)	
	    err_code = 0x04;
//William add for fail-safe end

  ENC_END:
#if BUSACCESS_BIT == 16 && ENDIAN == sLITTLE_END
    bit_write(MEMCNT, bSWAP_BYTE, LOW);
#endif
    bit_write(MEMCNT, bADRINC, LOW);
    mode_change(sREADY);
    return err_code;
}



//-----------------------------------------------------------------------------
//                              JPEG Decode dispose
//-----------------------------------------------------------------------------
static int jpeg_HostDec(UINT8 * start_add, UINT32 * const jpeg_size, UINT16* p_u16Rgb_addr,
                       const CAMSET * const cam)
{

    JPEG_INFO jpeg_info = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    static QTABLE q_c;
    static QTABLE q_y;
    UINT32 code_offset;
    UINT16 reg_camif, reg_camtim, reg_cxsize, reg_cysize;
    UINT16 u16ClkCntReg=0,u16MemCntReg=0;
    UINT32 u32CurRgbSize=0;
    int err_code = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -