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

📄 buxx_adsc.c

📁 bu1566dsp芯片用来处理ov7660或其他30万摄像模组的图像预览.图像拍照(jpeg压缩)
💻 C
📖 第 1 页 / 共 5 页
字号:
            data_write(OVL_CNT, 0x0012);
            data_write(OVL_FRMST1, (((M_LCD_WSIZE - 32) / 2) << 8) | ((M_LCD_HSIZE - 32) / 2)); //95,60
        }

    reg_write(INDEX, OVL_CNT);
    if ((reg_read(REG) & 0x0002) != 0) //Overlay is on
    {
        if (wait_time >= 1000)
        {
            wait_time = 0;
            reg_write(INDEX, OVL_FRMST1);
            memcnt_data = reg_read(REG);

            if (x_step == 1)
            {
                if (((memcnt_data & 0xff00) >> 8) + 0x0020 >= M_LCD_WSIZE)
                    x_step = -1;
            }
            else
            {
                if ((memcnt_data & 0xff00) <= 0x0000)
                    x_step = 1;
            }

            if (y_step == 1)
            {
                if ((memcnt_data & 0x00ff) + 0x0021 > M_LCD_HSIZE)
                    y_step = -1;
            }
            else
            {
                if ((memcnt_data & 0x00ff) <= 0x0000)
                    y_step = 1;
            }


            reg_write(REG, memcnt_data + (x_step << 8) + y_step);
        }
        else
        {
            wait_time++;
        }
    }




    
    data_write(0xb0,p_exovl->ovlnum);// type, transparent,overlay1&2
    data_write(0xb1,((p_exovl->xsize<<8)|p_exovl->ysize));//size=
    u8OvlNum=p_exovl->ovlnum&0x0003;

    if(u8OvlNum==0x0002)
    {
        u16Temp=(p_exovl->fmstx<<8)|p_exovl->fmsty;
        data_write(0xb2,u16Temp);//X start &Y start in the frame
        u16Temp=(p_exovl->ovlstx<<8)|p_exovl->ovlsty;
        data_write(0xb7,u16Temp);// X start &Y start in the overlay memory
        u16Temp=(p_exovl->ovledx<<8)|p_exovl->ovledy;
        data_write(0xb8,u16Temp);// X end &Y end in the overlay memory
    }

    else if(u8OvlNum==0x0001)
    {
        data_write(0xb3,((p_exovl->fmstx<<8)|p_exovl->fmsty));// X start &Y start in the frame 
        data_write(0xb9,((p_exovl->ovlstx<<8)|p_exovl->ovlsty));// X start &Y start in the overlay memory
        data_write(0xba,((p_exovl->ovledx<<8)|p_exovl->ovledy)); // X end &Y end in the overlay memory	
    }

    data_write(0xbb,p_exovl->ovl_trans);//transparent coclor
    data_write(0xbc,p_exovl->ovl_trmsk);//transparent color mask
    data_write(0xbd,p_exovl->front_color);//front color
    data_write(0xbe,p_exovl->back_color);//background color

    data_write(0xb5,((p_exovl->mem_adr_ovr_stx)<<8|p_exovl->mem_adr_ovr_sty));// MEM_ADR_OVL_ST 
    data_write(0xb6,((p_exovl->mem_adr_ovr_edx)<<8|p_exovl->mem_adr_ovr_edy));// (edx,edy)=(,)

    reg_write(INDEX, 0xb4);
    for (cnt = 0; cnt <(p_exovl->xsize)*(p_exovl->ysize) ; cnt++)
    {
        reg_write( REG, *ovl_data);					//RGB Data are written
        ovl_data++;
    }

}
*/    
//-----------------------------------------------------------------------------
//                            interrupt dispose
//-----------------------------------------------------------------------------
void __irq aDSC_int_disp(void)
{
#if !defined	BUXX_POLLING
    UINT16 idx_push;
    UINT16 reg_data;

    switch (gl_dsc_status)
    {
    case sJPEGDECODE:
    case sLEDMODE:
        //no dispose
        break;
    case sRINGBUFFER:
    case sHOSTJPEGDEC://KRIS ADD 2006-3-6 16:20
        idx_push = reg_read(INDEX);

        reg_data = data_read(JPG_INTST);
        if (BUSACCESS_BIT == 8 && hostcnt_bitread(bHOST_END) != 0)
        {
            reg_data =
                ((reg_data & 0xff00) >> 8) | ((reg_data & 0x00ff) << 8);
        }

        if (reg_data & bJE_RING_INT)
        {                       // JE_RING_INT
            bit_write(JPG_INTST, bJE_RING_INT, LOW);    // JE_RING_INT clear
            gl_bank_chk++;
        }
        else if (reg_data & bJE_ED_INT)
        {
            bit_write(JPG_INTST, bJE_ED_INT, LOW);      // JE_ED_INT clear
            gl_je_end_chk++;
        }
        if (reg_data & bJD_ED_INT)//Kris add
        {
            bit_write(JPG_INTST, bJD_ED_INT, LOW);      // JD_ED_INT clear
            gl_jd_end_chk++;
        }
        reg_write(INDEX, idx_push);
        break;
    default:
        idx_push = reg_read(INDEX);
        mode_change(sREADY);

        reg_write(INDEX, idx_push);
        break;

    }
    gl_check_int = 1;
 
 #if 1   
//  INT=p0.16
 EXTINT = 0x01;  //清除EINT0 中断标志
  VICVectAddr = 0x00;   //通知中断结?

#else 
//  INT=p0.20
  
  VICVectAddr = 0;			// 向量中断结束
 EXTINT = 1<<3;			// 清除p0.20 EINT3中断标志,1<<3 等价于 0x08
#endif

#endif

}

//-----------------------------------------------------------------------------
//                             filter function setup
//-----------------------------------------------------------------------------
int aDSC_filter_set(const char *format, ...)
{
    int i;
    va_list ap;
    int filter = 0xff;
    char *cmp[] =
        { "disable", "thd", "gray", "sepia", "emboss", "edge1", "edge2",
        "nega", "camyd" };
    int fil_sel[] =
        { sDISABLE, sTHD, sGRAY, sSEPIA, sEMBOSS, sEDGE1, sEDGE2, sNEGA,
        sCAMYD };
    int temp1, temp2;
    UINT16 reg_data;
    int err_code = 0;

    reg_data = aDSC_Quit_Preview();

    va_start(ap, format);

    for (i = 0; i < 10; i++)
    {
        if (strcmp(format, cmp[i]) == 0)
        {
            filter = fil_sel[i];
            break;
        }
    }

    switch (filter)
    {
    case sDISABLE:
        data_write(CAMFLT, sDISABLE);   // IDX_ADR : 0x11 no processing
        break;
    case sTHD:
        data_write(CAMFLT, sTHD);       // IDX_ADR : 0x11 gradate in two grade
        temp1 = va_arg(ap, int);
        if (temp1 > maxFLTTHD)
            err_code = 0x2001;
        data_write(FLTTHD, temp1);      // IDX_ADR : 0x12
        break;
    case sGRAY:
        data_write(CAMFLT, sGRAY);      // IDX_ADR : 0x11 gray scale
        break;
    case sSEPIA:
        data_write(CAMFLT, sSEPIA);     // IDX_ADR : 0x11 sepia
        temp1 = va_arg(ap, int);
        if (temp1 > maxSEPIAR)
            err_code = 0x2002;
        temp2 = va_arg(ap, int);
        if (temp2 > maxSEPIAB)
            err_code = 0x2003;
        data_write(FLTSEP, (temp1 << 8) | temp2);       // IDX_ADR : 0x13 SEPIAR = 32d, SEPIAB = -16d
        temp1 = va_arg(ap, int);
        if (temp1 > maxSEPRNG)
            err_code = 0x2004;
        data_write(SEPRNG, temp1);      // IDX_ADR : 0x14
        break;
    case sEMBOSS:
        data_write(CAMFLT, sEMBOSS);    // IDX_ADR : 0x11 emboss
        temp1 = data_read(FLTCOEF) & 0xff00;
        temp2 = va_arg(ap, int);
        if (temp2 > maxFLTEBS)
            err_code = 0x2005;
        data_write(FLTCOEF, temp1 | temp2);     // IDX_ADR : 0x15
        break;
    case sEDGE1:
        data_write(CAMFLT, sEDGE1);     // IDX_ADR : 0x11 edge sampling1
        temp1 = va_arg(ap, int);
        if (temp1 > maxFLTTHD)
            err_code = 0x2006;
        data_write(FLTTHD, temp1);      // IDX_ADR : 0x12 Threshold = 0x01
        temp1 = data_read(FLTCOEF) & 0x00ff;
        temp2 = (va_arg(ap, int));
        if (temp2 > maxFLTEDG1)
            err_code = 0x2007;
        data_write(FLTCOEF, temp1 | (temp2 << 8));      // IDX_ADR : 0x15
        break;
    case sEDGE2:
        data_write(CAMFLT, sEDGE2);     // IDX_ADR : 0x11 edge sampling2
        temp1 = va_arg(ap, int);
        if (temp1 > maxFLTEDG2)
            err_code = 0x2008;
        temp2 = va_arg(ap, int);
        if (temp2 > maxEDG2OFS)
            err_code = 0x2009;
        data_write(FLTEDG2, temp1 << 8 | temp2);        // IDX_ADR : 0x16
        break;
    case sNEGA:
        data_write(CAMFLT, sNEGA);      // IDX_ADR : 0x11 negative
        break;
    case sCAMYD:
        temp1 = va_arg(ap, int);
        if (temp1 > maxCAMYD)
            err_code = 0x200a;
        data_write(CAMYD, temp1);
        break;
    default:
        err_code = 0x2000;
        data_write(CAMFLT, sDISABLE);   // IDX_ADR : 0x11 no processing
        break;
    }

    va_end(ap);
    if (reg_data == sNVIEWER)
        mode_change(sNVIEWER);

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

}



//-----------------------------------------------------------------------------
//                               I2C Dispose
//-----------------------------------------------------------------------------
int aDSC_i2c_set(const UINT16 seri_devtype, const UINT16 seri_devadr,
                 const UINT16 seri_2ndadr, const UINT16 seri_dat,
                 const UINT16 peri_sdc, const UINT16 seri_rw)
{
    int busy_flag = 1;
    int err_code = 0;

    if (seri_devadr > maxSERI_DEVADR)
        err_code = 0x2100;
    if (seri_2ndadr > maxSERI_2NDADR)
        err_code = 0x2101;
    if (seri_dat > maxSERI_DAT)
        err_code = 0x2102;
    if (peri_sdc > maxPERI_SDC)
        err_code = 0x2103;

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

    data_write(SERIDEVADR,
               sSERI_HZ | sSERI_PULL_ON | seri_devtype | sSERI_ENABLE |
               seri_devadr);
    data_write(SERI2NDADR, seri_2ndadr);
    data_write(SERICNT, (seri_dat << 8) | (peri_sdc << 4) | seri_rw);

    bit_write(SERICNT, bSERI_ST, HIGH); //serial transfer start
    while (busy_flag)
    {                           // SERI_BSY偺億乕儕儞僌
        busy_flag = bit_read(SERICNT, bSERI_BSY);
    }

    wait(1);                    //Tbuf

#if 0
    if (bit_read(SERICNT, bACK_STAT))
        err_code = 0x2104;
    if (err_code)
    {
        DEBUG_WRITE((0, 0, "%x", err_code));
        return err_code;
    }
#endif

    return 0;
}



//-----------------------------------------------------------------------------
//                      frame memory write(rgb565 data)
//-----------------------------------------------------------------------------
int aDSC_fmemory_write_rgb565(const UINT16 * rgb_data, const UINT16 st_x,
                              const UINT16 st_y)
{
    int cnt, write_count;
    UINT16 xsize, ysize;
    int err_code = 0;

    aDSC_Quit_Preview();

    xsize = *rgb_data;
    rgb_data++;
    ysize = *rgb_data;
    rgb_data++;

    bit_write(MEMCNT, bINCMTH | bADRINC, LOW);  //rectangle increment丄auto increment off
    err_code =
        mem_adrst_ed_set(st_x, st_y, st_x + xsize - 1, st_y + ysize - 1);
    if (err_code)
        err_code |= 0x3000;

    bit_write(MEMCNT, bINCMTH | bADRINC, HIGH); //rectangle increment丄auto increment on

    write_count = xsize * ysize;

    mem_acs_write_st(MEMACS_RGB);
    for (cnt = 0; cnt < write_count; cnt++)
    {
        reg_write(REG, *rgb_data);      //RGB Data are written
        rgb_data++;
    }

    bit_write(MEMCNT, bINCMTH | bADRINC, LOW);  //rectangle increment丄auto increment on

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

}

int aDSC_ExOvlMemory_write_rgb565(const UINT16 * rgb_data)
{
    int cnt, write_count;
    UINT16 xsize, ysize;
    int err_code = 0;

 //   aDSC_Quit_Preview();

    xsize = *rgb_data;
    rgb_data++;
    ysize = *rgb_data;
    rgb_data++;

    data_write(MEM_ADR_OVL_ST,0x0000);
    data_write(MEM_ADR_OVL_ED,((xsize-1)<<8)|(ysize-1));

    bit_write(MEMCNT, bINCMTH | bADRINC, HIGH); //rectangle increment丄auto increment on

    write_count = xsize * ysize;

    mem_acs_write_st(MEMACS_OVL);

    for (cnt = 0; cnt < write_count; cnt++)
    {
        reg_write(REG, *rgb_data);      //RGB Data are written
        rgb_data++;
    }

    bit_write(MEMCNT, bINCMTH | bADRINC, LOW); //rectangle increment丄auto increment off

    return err_code; 
}

int aDSC_fmemory_write_rgb565_2(const UINT16 * rgb_data, const UINT16 st_x,
                              const UINT16 st_y, const UINT16 xsize, const UINT16 ysize )
{
    int cnt, write_count;
    int err_code = 0;

    aDSC_Quit_Preview();

    bit_write(MEMCNT, bINCMTH | bADRINC, LOW);  //rectangle increment丄auto increment off
    err_code =
        mem_adrst_ed_set(st_x, st_y, st_x + xsize - 1, st_y + ysize - 1);
    if (err_code)
        err_code |= 0x3000;

    bit_write(MEMCNT, bINCMTH | bADRINC, HIGH); //rectangle increment丄auto increment on

    write_count = xsize * ysize;

    mem_acs_write_st(MEMACS_RGB);
    for (cnt = 0; cnt < write_count; cnt++)
    {
        reg_write(REG, *rgb_data);      //RGB Data are written
        rgb_data++;
    }

    bit_write(MEMCNT, bINCMTH | bADRINC, LOW);  //rectangle increment丄auto increment on

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

}

⌨️ 快捷键说明

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