Beispiel #1
0
int WDMAConfig2(unsigned idx,
               unsigned inputFormat,
               unsigned srcWidth,
               unsigned srcHeight,
               unsigned clipX,
               unsigned clipY,
               unsigned clipWidth,
               unsigned clipHeight,
               DpColorFormat  out_formt,
               unsigned dstAddress,
               unsigned dstWidth,
               unsigned dstPitch,
               unsigned dstUVPitch,
               bool useSpecifiedAlpha,
               unsigned char alpha)
{
    unsigned int output_format=0;
    unsigned int byte_swap=0;
    unsigned int rgb_swap=0;
    unsigned int uv_swap=0;

    unsigned input_color_space;                         // check input format color space
    unsigned output_color_space;                        // check output format color space
    unsigned mode = 0xdeaddead;
    // unsigned bpp;
    unsigned char *yAddr, *uAddr, *vAddr;
    enum WDMA_OUTPUT_FORMAT outputFormat = wdma_fmt_convert(out_formt);

    ASSERT((WDMA_INPUT_FORMAT_ARGB == inputFormat) ||
           (WDMA_INPUT_FORMAT_YUV444 == inputFormat));

    // should use OVL alpha instead of sw config
    useSpecifiedAlpha = 0;
    alpha = 0xff;

    DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_SRC_SIZE, srcHeight<<16 | srcWidth);
    DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CLIP_COORD, clipY<<16 | clipX);
    DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CLIP_SIZE, clipHeight<<16 | clipWidth);

    DISP_REG_SET_FIELD(WDMA_CFG_FLD_In_Format, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, inputFormat);

    switch(outputFormat) {
        case WDMA_OUTPUT_FORMAT_RGB565:
        case WDMA_OUTPUT_FORMAT_RGB888:
        case WDMA_OUTPUT_FORMAT_ARGB:
        case WDMA_OUTPUT_FORMAT_XRGB:
        case WDMA_OUTPUT_FORMAT_UYVY:
        case WDMA_OUTPUT_FORMAT_GREY:
        case WDMA_OUTPUT_FORMAT_YV12:
        case WDMA_OUTPUT_FORMAT_NV12:
        case WDMA_OUTPUT_FORMAT_NV21:
            output_format = outputFormat;
            byte_swap =  0;
            rgb_swap =  0;
            uv_swap =  0;
            break;
        case WDMA_OUTPUT_FORMAT_YUYV:
        	output_format = WDMA_OUTPUT_FORMAT_UYVY;
        	byte_swap =  0;
        	rgb_swap =  0;
        	uv_swap =  1;
        	break;
        case WDMA_OUTPUT_FORMAT_BGR888:
            output_format =  WDMA_OUTPUT_FORMAT_RGB888;
            byte_swap =  0;
            rgb_swap =  1;
            uv_swap =  0;
            break;
        case WDMA_OUTPUT_FORMAT_BGRA:
            output_format =  WDMA_OUTPUT_FORMAT_ARGB;
            byte_swap =  1;
            rgb_swap =  0;
            uv_swap =  0;
            break;
        case WDMA_OUTPUT_FORMAT_ABGR:
            output_format =  WDMA_OUTPUT_FORMAT_ARGB;
            byte_swap =  0;
            rgb_swap =  1;
            uv_swap =  0;
            break;
        case WDMA_OUTPUT_FORMAT_RGBA:
            output_format =  WDMA_OUTPUT_FORMAT_ARGB;
            byte_swap =  1;
            rgb_swap =  1;
            uv_swap =  0;
            break;
        case WDMA_OUTPUT_FORMAT_XBGR:
            output_format =  WDMA_OUTPUT_FORMAT_XRGB;
            byte_swap =  0;
            rgb_swap =  1;
            uv_swap =  0;
            break;
        default:
        	printk("[DDP] error: invalid color format:0x%x\n", outputFormat);
            ASSERT(0);       // invalid format
    }
    DISP_REG_SET_FIELD(WDMA_CFG_FLD_Out_Format, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, output_format);
    DISP_REG_SET_FIELD(WDMA_CFG_FLD_BYTE_SWAP,  idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, byte_swap);
    DISP_REG_SET_FIELD(WDMA_CFG_FLD_RGB_SWAP,   idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, rgb_swap);
    DISP_REG_SET_FIELD(WDMA_CFG_FLD_UV_SWAP,    idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, uv_swap);


    // set DNSP for UYVY and YUV_3P format for better quality
    if(outputFormat==WDMA_OUTPUT_FORMAT_UYVY || outputFormat==WDMA_OUTPUT_FORMAT_YUYV)
    {
       DISP_REG_SET_FIELD(WDMA_CFG_FLD_DNSP_SEL, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 1);
    }
    else
    {
        DISP_REG_SET_FIELD(WDMA_CFG_FLD_DNSP_SEL, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 0);
    }

    switch (inputFormat) {
        case WDMA_INPUT_FORMAT_ARGB:
            input_color_space = WDMA_COLOR_SPACE_RGB;
            break;
        case WDMA_INPUT_FORMAT_YUV444:
            input_color_space = WDMA_COLOR_SPACE_YUV;
            break;
        default:
        	printk("[DDP] error: invalid color format:0x%x\n", inputFormat);
            ASSERT(0);
    }

    switch (outputFormat) {
        case WDMA_OUTPUT_FORMAT_RGB565:
        case WDMA_OUTPUT_FORMAT_RGB888:
        case WDMA_OUTPUT_FORMAT_ARGB:
        case WDMA_OUTPUT_FORMAT_XRGB:
        case WDMA_OUTPUT_FORMAT_BGR888:
        case WDMA_OUTPUT_FORMAT_BGRA:
        case WDMA_OUTPUT_FORMAT_ABGR:
        case WDMA_OUTPUT_FORMAT_RGBA:
        case WDMA_OUTPUT_FORMAT_XBGR:
            output_color_space = WDMA_COLOR_SPACE_RGB;
            break;
        case WDMA_OUTPUT_FORMAT_UYVY:
        case WDMA_OUTPUT_FORMAT_YUYV:
        case WDMA_OUTPUT_FORMAT_GREY:
        case WDMA_OUTPUT_FORMAT_YV12:
        case WDMA_OUTPUT_FORMAT_NV12:
        case WDMA_OUTPUT_FORMAT_NV21:
            output_color_space = WDMA_COLOR_SPACE_YUV;
            break;
        default:
        	printk("[DDP] error: invalid color format:0x%x\n", outputFormat);
            ASSERT(0);
    }

    if(WDMA_COLOR_SPACE_RGB == input_color_space &&
       WDMA_COLOR_SPACE_YUV == output_color_space) {        // RGB to YUV required
        mode = RGB2YUV_601;
    }
    else if(WDMA_COLOR_SPACE_YUV == input_color_space &&    // YUV to RGB required
            WDMA_COLOR_SPACE_RGB == output_color_space) {
        mode = YUV2RGB_601_16_16;
    }

    if(TABLE_NO > mode) {                                           // set matrix as mode
        DISP_REG_SET_FIELD(WDMA_C00_FLD_C00, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C00, coef[mode][0][0]);
        DISP_REG_SET_FIELD(WDMA_C00_FLD_C01, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C00, coef[mode][0][1]);
        DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C02, coef[mode][0][2]);

        DISP_REG_SET_FIELD(WDMA_C10_FLD_C10, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C10, coef[mode][1][0]);
        DISP_REG_SET_FIELD(WDMA_C10_FLD_C11, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C10, coef[mode][1][1]);
        DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C12 , coef[mode][1][2]);

        DISP_REG_SET_FIELD(WDMA_C20_FLD_C20, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C20, coef[mode][2][0]);
        DISP_REG_SET_FIELD(WDMA_C20_FLD_C21, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C20, coef[mode][2][1]);
        DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C22 , coef[mode][2][2]);

        DISP_REG_SET_FIELD(WDMA_PRE_ADD0_FLD_PRE_ADD_0, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD0, coef[mode][3][0]);
        DISP_REG_SET_FIELD(WDMA_PRE_ADD0_FLD_SIGNED_0, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD0, 0);
        DISP_REG_SET_FIELD(WDMA_PRE_ADD0_FLD_PRE_ADD_1, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD0, coef[mode][3][1]);
        DISP_REG_SET_FIELD(WDMA_PRE_ADD0_FLD_SIGNED_1, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD0, 0);

        DISP_REG_SET_FIELD(WDMA_PRE_ADD2_FLD_PRE_ADD_2, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD2, coef[mode][3][2]);
        DISP_REG_SET_FIELD(WDMA_PRE_ADD2_FLD_SIGNED_2, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD2, 0);

        DISP_REG_SET_FIELD(WDMA_POST_ADD0_FLD_POST_ADD_0, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_POST_ADD0, coef[mode][4][0]);
        DISP_REG_SET_FIELD(WDMA_POST_ADD0_FLD_POST_ADD_1, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_POST_ADD0, coef[mode][4][1]);
        DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_POST_ADD2 , coef[mode][4][2]);

        DISP_REG_SET_FIELD(WDMA_CFG_FLD_EXT_MTX_EN, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 1);
        DISP_REG_SET_FIELD(WDMA_CFG_FLD_CT_EN, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 1);
    }
    else
    {
        DISP_REG_SET_FIELD(WDMA_CFG_FLD_EXT_MTX_EN, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 0);
        DISP_REG_SET_FIELD(WDMA_CFG_FLD_CT_EN, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 0);
    }
    // YUV format parameters
    yAddr = (unsigned char*)dstAddress;
    switch(outputFormat) {
        case WDMA_OUTPUT_FORMAT_UYVY:
        case WDMA_OUTPUT_FORMAT_YUYV:
        case WDMA_OUTPUT_FORMAT_GREY:
            uAddr = yAddr;
            vAddr = yAddr;
            break;
        case WDMA_OUTPUT_FORMAT_YV12:
        	//TODO: remove this input parameter, just ignore and recalculate it now.
        	dstUVPitch = ALIGN_TO(dstPitch/2, 16);
            vAddr = yAddr + dstPitch*srcHeight;
            uAddr = vAddr + dstUVPitch*srcHeight/2;
            break;
        case WDMA_OUTPUT_FORMAT_NV12:
        case WDMA_OUTPUT_FORMAT_NV21:
            uAddr = yAddr + dstPitch*srcHeight;
            vAddr = uAddr;
            break;
        default:
        	break;
    }
    DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_DST_ADDR, dstAddress);
    DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_DST_W_IN_BYTE, dstPitch);
    if (WDMA_COLOR_SPACE_YUV == output_color_space) {
    	DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_DST_U_ADDR, (unsigned int)uAddr);
    	DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_DST_V_ADDR, (unsigned int)vAddr);
        DISP_REG_SET_FIELD(WDMA_BUF_ADDR_FLD_UV_Pitch, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_DST_UV_PITCH, dstUVPitch);
    }
    DISP_REG_SET_FIELD(WDMA_ALPHA_FLD_A_Sel,   idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_ALPHA, useSpecifiedAlpha);
    DISP_REG_SET_FIELD(WDMA_ALPHA_FLD_A_Value, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_ALPHA, alpha);

    return 0;
}
int WDMAConfig(unsigned idx,
               unsigned inputFormat, 
               unsigned srcWidth, 
               unsigned srcHeight,
               unsigned clipX, 
               unsigned clipY, 
               unsigned clipWidth, 
               unsigned clipHeight,
               DpColorFormat  out_formt, 
               unsigned dstAddress, 
               unsigned dstWidth,               
               bool useSpecifiedAlpha, 
               unsigned char alpha) 
{
    unsigned int output_format=0;
    unsigned int byte_swap=0;
    unsigned int rgb_swap=0;
    unsigned int uv_swap=0;

    unsigned input_color_space;                         // check input format color space
    unsigned output_color_space;                        // check output format color space
    unsigned mode = 0xdeaddead;    
    unsigned bpp;
    enum WDMA_OUTPUT_FORMAT outputFormat = wdma_fmt_convert(out_formt);
    
    ASSERT((WDMA_INPUT_FORMAT_ARGB == inputFormat) ||
           (WDMA_INPUT_FORMAT_YUV444 == inputFormat));    

    // should use OVL alpha instead of sw config
    useSpecifiedAlpha = 0;
    alpha = 0xff;
    
    DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_SRC_SIZE, srcHeight<<16 | srcWidth);
    DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CLIP_COORD, clipY<<16 | clipX);
    DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CLIP_SIZE, clipHeight<<16 | clipWidth);

    DISP_REG_SET_FIELD(WDMA_CFG_FLD_In_Format, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, inputFormat);


    switch(outputFormat) {
        case WDMA_OUTPUT_FORMAT_RGB565:
        case WDMA_OUTPUT_FORMAT_RGB888:
        case WDMA_OUTPUT_FORMAT_ARGB:
        case WDMA_OUTPUT_FORMAT_XRGB:
        case WDMA_OUTPUT_FORMAT_UYVY:
        case WDMA_OUTPUT_FORMAT_YUV444:
        case WDMA_OUTPUT_FORMAT_UYVY_BLK:
        case WDMA_OUTPUT_FORMAT_YUV420_P:
            output_format = outputFormat;
            byte_swap =  0;
            rgb_swap =  0;
            uv_swap =  0;
            break;
        case WDMA_OUTPUT_FORMAT_BGR888:
            output_format =  WDMA_OUTPUT_FORMAT_RGB888;
            byte_swap =  0;
            rgb_swap =  1;
            uv_swap =  0;            
            break;
        case WDMA_OUTPUT_FORMAT_BGRA:
            output_format =  WDMA_OUTPUT_FORMAT_ARGB;
            byte_swap =  1;
            rgb_swap =  0;
            uv_swap =  0;
            break;
        case WDMA_OUTPUT_FORMAT_ABGR:
            output_format =  WDMA_OUTPUT_FORMAT_ARGB;
            byte_swap =  0;
            rgb_swap =  1;
            uv_swap =  0;
            break;
        case WDMA_OUTPUT_FORMAT_RGBA:
            output_format =  WDMA_OUTPUT_FORMAT_ARGB;
            byte_swap =  1;
            rgb_swap =  1;
            uv_swap =  0;
            break;
        default:
            ASSERT(0);       // invalid format
    }
    DISP_REG_SET_FIELD(WDMA_CFG_FLD_Out_Format, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, output_format);
    DISP_REG_SET_FIELD(WDMA_CFG_FLD_BYTE_SWAP,  idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, byte_swap);
    DISP_REG_SET_FIELD(WDMA_CFG_FLD_RGB_SWAP,   idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, rgb_swap);
    DISP_REG_SET_FIELD(WDMA_CFG_FLD_UV_SWAP,    idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, uv_swap);


    // set DNSP for UYVY and YUV_3P format for better quality
    if(outputFormat==WDMA_OUTPUT_FORMAT_UYVY ||
       outputFormat==WDMA_OUTPUT_FORMAT_YUV420_P)
    {
       DISP_REG_SET_FIELD(WDMA_CFG_FLD_DNSP_SEL, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 1);
    }
    else
    {
        DISP_REG_SET_FIELD(WDMA_CFG_FLD_DNSP_SEL, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 0);
    }
    
    switch (inputFormat) {
        case WDMA_INPUT_FORMAT_ARGB:
            input_color_space = WDMA_COLOR_SPACE_RGB;
            break;
        case WDMA_INPUT_FORMAT_YUV444:
            input_color_space = WDMA_COLOR_SPACE_YUV;
            break;
        default:
            ASSERT(0);
    }

    switch (outputFormat) {
        case WDMA_OUTPUT_FORMAT_RGB565:
        case WDMA_OUTPUT_FORMAT_RGB888:
        case WDMA_OUTPUT_FORMAT_ARGB:
        case WDMA_OUTPUT_FORMAT_XRGB:
        case WDMA_OUTPUT_FORMAT_BGR888:
        case WDMA_OUTPUT_FORMAT_BGRA:
        case WDMA_OUTPUT_FORMAT_ABGR:
        case WDMA_OUTPUT_FORMAT_RGBA:
            output_color_space = WDMA_COLOR_SPACE_RGB;
            break;
        case WDMA_OUTPUT_FORMAT_UYVY:
        case WDMA_OUTPUT_FORMAT_YUV444:
        case WDMA_OUTPUT_FORMAT_UYVY_BLK:
        case WDMA_OUTPUT_FORMAT_YUV420_P:
            output_color_space = WDMA_COLOR_SPACE_YUV;
            break;
        default:
            ASSERT(0);
    }

    if(WDMA_COLOR_SPACE_RGB == input_color_space &&
       WDMA_COLOR_SPACE_YUV == output_color_space) {        // RGB to YUV required       
        mode = RGB2YUV_601;
    }
    else if(WDMA_COLOR_SPACE_YUV == input_color_space &&    // YUV to RGB required
            WDMA_COLOR_SPACE_RGB == output_color_space) {        
        mode = YUV2RGB_601_16_16;
    }

    if(TABLE_NO > mode) {                                           // set matrix as mode
        DISP_REG_SET_FIELD(WDMA_C00_FLD_C00, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C00, coef[mode][0][0]);
        DISP_REG_SET_FIELD(WDMA_C00_FLD_C01, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C00, coef[mode][0][1]);
        DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C02, coef[mode][0][2]);

        DISP_REG_SET_FIELD(WDMA_C10_FLD_C10, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C10, coef[mode][1][0]);
        DISP_REG_SET_FIELD(WDMA_C10_FLD_C11, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C10, coef[mode][1][1]);
        DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C12 , coef[mode][1][2]);

        DISP_REG_SET_FIELD(WDMA_C20_FLD_C20, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C20, coef[mode][2][0]);
        DISP_REG_SET_FIELD(WDMA_C20_FLD_C21, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C20, coef[mode][2][1]);
        DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_C22 , coef[mode][2][2]);

        DISP_REG_SET_FIELD(WDMA_PRE_ADD0_FLD_PRE_ADD_0, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD0, coef[mode][3][0]);
        DISP_REG_SET_FIELD(WDMA_PRE_ADD0_FLD_SIGNED_0, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD0, 0);
        DISP_REG_SET_FIELD(WDMA_PRE_ADD0_FLD_PRE_ADD_1, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD0, coef[mode][3][1]);
        DISP_REG_SET_FIELD(WDMA_PRE_ADD0_FLD_SIGNED_1, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD0, 0);

        DISP_REG_SET_FIELD(WDMA_PRE_ADD2_FLD_PRE_ADD_2, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD2, coef[mode][3][2]);
        DISP_REG_SET_FIELD(WDMA_PRE_ADD2_FLD_SIGNED_2, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_PRE_ADD2, 0);

        DISP_REG_SET_FIELD(WDMA_POST_ADD0_FLD_POST_ADD_0, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_POST_ADD0, coef[mode][4][0]);
        DISP_REG_SET_FIELD(WDMA_POST_ADD0_FLD_POST_ADD_1, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_POST_ADD0, coef[mode][4][1]);
        DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_POST_ADD2 , coef[mode][4][2]);
        
        DISP_REG_SET_FIELD(WDMA_CFG_FLD_EXT_MTX_EN, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 1);                         
        DISP_REG_SET_FIELD(WDMA_CFG_FLD_CT_EN, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 1);                              
    }
    else
    {
        DISP_REG_SET_FIELD(WDMA_CFG_FLD_EXT_MTX_EN, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 0);                         
        DISP_REG_SET_FIELD(WDMA_CFG_FLD_CT_EN, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_CFG, 0);  
    }



    switch(outputFormat) {
        case WDMA_OUTPUT_FORMAT_RGB565:
        case WDMA_OUTPUT_FORMAT_UYVY_BLK:
        case WDMA_OUTPUT_FORMAT_UYVY:
            bpp = 2;
            break;
        case WDMA_OUTPUT_FORMAT_YUV420_P:
            bpp = 1;
            break;            
        case WDMA_OUTPUT_FORMAT_RGB888:
        case WDMA_OUTPUT_FORMAT_BGR888:
        case WDMA_OUTPUT_FORMAT_YUV444:
            bpp = 3;
            break;
        case WDMA_OUTPUT_FORMAT_ARGB:
        case WDMA_OUTPUT_FORMAT_XRGB:
        case WDMA_OUTPUT_FORMAT_BGRA:
        case WDMA_OUTPUT_FORMAT_ABGR:            
        case WDMA_OUTPUT_FORMAT_RGBA:
            bpp = 4;
            break;
        default:
            ASSERT(0);  // invalid format
    }
    DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_DST_ADDR, dstAddress);
    DISP_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_DST_W_IN_BYTE, dstWidth * bpp);
    DISP_REG_SET_FIELD(WDMA_ALPHA_FLD_A_Sel,   idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_ALPHA, useSpecifiedAlpha);
    DISP_REG_SET_FIELD(WDMA_ALPHA_FLD_A_Value, idx*DISP_INDEX_OFFSET+DISP_REG_WDMA_ALPHA, alpha);
    
    return 0;
}