DM368에서 Colorkey 값을 설정하여 OSD0 에 설정된 키값에 Tranparency 값을 적용하는 방법은 다음과 같다.


1. bootargs 수정


video=davincifb:vid0=OFF:vid1=OFF:osd1=0x0x8


2. /drivers/media/video/davinci/davinci_osd.c 수정


static void _davinci_disp_enable_color_key(enum davinci_osd_layer osdwin,
                       unsigned colorkey,
                       enum davinci_pix_format pixfmt)
{
    switch (pixfmt) {
    case PIXFMT_1BPP:
    case PIXFMT_2BPP:
    case PIXFMT_4BPP:
    case PIXFMT_8BPP:
        if (cpu_is_davinci_dm355() || cpu_is_davinci_dm365()) {
            printk("$[%s] (%s) PIXFMT_1~8, colorkey = 0x%x \r\n", __FILE__, __func__, colorkey);
            switch (osdwin) {
            case OSDWIN_OSD0:
                osd_merge(OSD_TRANSPBMPIDX_BMP0,
                      colorkey <<
                      OSD_TRANSPBMPIDX_BMP0_SHIFT,
                      OSD_TRANSPBMPIDX);
                break;
            case OSDWIN_OSD1:
                osd_merge(OSD_TRANSPBMPIDX_BMP1,
                      colorkey <<
                      OSD_TRANSPBMPIDX_BMP1_SHIFT,
                      OSD_TRANSPBMPIDX);
                break;
            }
        }
        break;
    case PIXFMT_RGB565:
        if (cpu_is_davinci_dm644x()) {
            osd_write(colorkey & OSD_TRANSPVAL_RGBTRANS,
                  OSD_TRANSPVAL);
        } else if (cpu_is_davinci_dm355() || cpu_is_davinci_dm365()) {
            osd_write(colorkey & OSD_TRANSPVALL_RGBL,
                  OSD_TRANSPVALL);
        }
        break;
    case PIXFMT_YCbCrI:
    case PIXFMT_YCrCbI:
        if (cpu_is_davinci_dm355() || cpu_is_davinci_dm365())
            osd_merge(OSD_TRANSPVALU_Y, colorkey, OSD_TRANSPVALU);
        break;
    case PIXFMT_RGB888:
        if (cpu_is_davinci_dm355() || cpu_is_davinci_dm365()) {
            osd_write(colorkey & OSD_TRANSPVALL_RGBL,
                  OSD_TRANSPVALL);
            osd_merge(OSD_TRANSPVALU_RGBU, colorkey >> 16,
                  OSD_TRANSPVALU);
        }
        break;
    default:
        break;
    }

    switch (osdwin) {
    case OSDWIN_OSD0:
        osd_set(OSD_OSDWIN0MD_TE0, OSD_OSDWIN0MD);
        break;
    case OSDWIN_OSD1:
        osd_set(OSD_OSDWIN1MD_TE1, OSD_OSDWIN1MD);
        break;
    }
}
 


3. 어플리케이션 에서 설정 예제


#include <video/davincifb_ioctl.h>

void fb_init(void){
    int fbfd;
    char enable = 1;
    vpbe_bitmap_blend_params_t blendparam = {
    .colorkey = 0x0/*0x000000:Black, Transparency RGB Color값을 설정*/,
    .enable_colorkeying = 1,
    .bf = 0,
    };
    vpbe_backg_color_t backg = {
    .clut_select = 0,
    .color_offset = 255,
    };

    fbfd = open("/dev/fb0",O_RDWR);
    if (fbfd < 0){
    perror("Failed to open the framebuffer device");
    exit(-1);
    }

    if (ioctl(fbfd,FBIO_ENABLE_DISABLE_WIN,
        &enable) < 0){
        perror("Failed to enable the OSD window");
        exit(-1);
    }
    if (ioctl(fbfd,FBIO_SET_BACKG_COLOR,
        &backg) < 0){
        perror("Failed to enable the OSD window: set background color");
        exit(-1);
    }

    if (ioctl(fbfd,FBIO_SET_BITMAP_BLEND_FACTOR,
        &blendparam) < 0){
        perror("Failed to set the blending factor");
        exit(-1);
    }

    close(fbfd);


Posted by 다크쌍피