Распечатка 9.2 Зависимые от оборудования определения драйвера кадрового буфера |
Предыдущая Содержание Следующая |
Распечатка 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; } }
|
Предыдущая Содержание Следующая |