Распечатка 9.2 Зависимые от оборудования определения драйвера кадрового буфера

Предыдущая  Содержание  Следующая V*D*V

Распечатка 9.2

 

/* sfb.h */

 

#define SFB_VIDEOMEMSTART 0xA00000

#define SFB_VIDEOMEMSIZE 0x12C000

#define SFB_MAX_X 640

#define SFB_MAX_Y 480

#define SFB_MIN_X 320

#define SFB_MIN_Y 240

 

/* Наше оборудование не поддерживает прозрачность */

#define TRANSP_OFFSET 0

#define TRANSP_LENGTH 0

 

/*

 * Оборудование имеет от 0 до 255 (256) программируемых регистров

 * цветовой палитры

 */

#define SFB_MAX_PALETTE_REG256

#define SFB_PALETTE_START 0xB2C100

 

/* Регистр режимов и режимы */

#define SFB_MODE_REG 0xB2C004

#define SFB_8BPP 0x1

#define SFB_16BPP 0x10

#define SFB_32BPP 0x100

 

/* Регистр разрешения экрана */

#define SFB_RESOLUTION_REG 0xB2C008

 

/*

 * Другой режим bits_per_pixel (8/16/24/32) является аппаратно

 * зависимым. Таким образом, этот режим должен быть обработан соответствующим образом.

 * Оборудование SFB поддерживает только режимы 8, 16 и 32 бита, Проверьте

 * соответствие режимов и внесите соответствующие коррективы

 */

 

static inline int sfb_check_bpp(struct fb_var_screeninfo *var)

{

    if (var->bits_per_pixel <= 8)

        var->bits_per_pixel = 8;

    else if (var->bits_per_pixel <= 16)

        var->bits_per_pixel = 16;

    else if (var->bits_per_pixel <= 32)

        var->bits_per_pixel = 32;

    else

        return -EINVAL;

    return 0;

}

 

static inline void sfb_fixup_var_modes(struct fb_var_screeninfo *var)

{

    switch (var->bits_per_pixel) {

    case 8:

        var->red.offset = 0;

        var->red.length = 3;

        var->green.offset = 3;

        var->green.length = 3;

        var->blue.offset = 6;

        var->blue.length = 2;

        var->transp.offset = TRANSP_OFFSET;

        var->transp.length = TRANSP_LENGTH;

        break;

 

    case 16: /*RGB565*/

        var->red.offset = 0;

        var->red.length = 5;

        var->green.offset = 5;

        var->green.length = 6;

        var->blue.offset = 11;

        var->blue.length = 5;

        var->transp.offset = TRANSP_OFFSET;

        var->transp.length = TRANSP_LENGTH;

        break;

 

    case 24:

    case 32: /* RGBX 888 */

        var->red.offset = 0;

        var->red.length = 8;

        var->green.offset = 8;

        var->green.length = 8;

        var->blue.offset = 16;

        var->blue.length = 8;

        var->transp.offset = TRANSP_OFFSET;

        var->transp.length = TRANSP_LENGTH;

        break;

    }

    var->red.msb_right = 0;

    var->green.msb_right = 0;

    var->blue.msb_right = 0;

    var->transp.msb_right = 0;

}

 

/* Программируем оборудование, базируясь на настройках пользователя */

static inline sfb_program_hardware(struct fb_info *info)

{

    *((unsigned int*)(SFB_RESOLUTION_REG)) =

        ((info->var.yres_virtual & 0xFFFF) << 0xFFFF) |

        (info->var.xres_virtual & 0xFFFF)

 

    switch(info->var.bits_per_pixel) {

    case 8:

        *((unsigned int*)(SFB_MODE_REG)) = SFB_8BPP;

        break;

 

    case 16:

        *((unsigned int*)(SFB_MODE_REG)) = SFB_16BPP;

        break;

 

    case 32:

        *((unsigned int*)(SFB_MODE_REG)) = SFB_32BPP;

        break;

    }

}

 

Предыдущая  Содержание  Следующая