📄 buxx_adsc.c
字号:
//-----------------------------------------------------------------------------
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 + -