📄 fsl_diu_fb.c
字号:
(unsigned int)gamma_table_base); /* Prep for DIU init - gamma table */ for (i = 0; i <= 2; i++) for (j = 0; j <= 255; j++) *gamma_table_base++ = j; if (gamma_fix == 1) { /* fix the gamma */ debug("Fix gamma table\n"); gamma_table_base = gamma.paddr; for (i = 0; i < 256*3; i++) { gamma_table_base[i] = (gamma_table_base[i] << 2) | ((gamma_table_base[i] >> 6) & 0x03); } } debug("update-lcdc: HW - %p\n Disabling DIU\n", hw); /* Program DIU registers */ hw->gamma = (unsigned int) gamma.paddr; hw->cursor= (unsigned int) cursor.paddr; hw->bgnd = 0x007F7F7F; /* BGND */ hw->bgnd_wb = 0; /* BGND_WB */ hw->disp_size = var->yres << 16 | var->xres; /* DISP SIZE */ hw->wb_size = 0; /* WB SIZE */ hw->wb_mem_addr = 0; /* WB MEM ADDR */ hw->hsyn_para = var->left_margin << 22 | /* BP_H */ var->hsync_len << 11 | /* PW_H */ var->right_margin; /* FP_H */ hw->vsyn_para = var->upper_margin << 22 | /* BP_V */ var->vsync_len << 11 | /* PW_V */ var->lower_margin; /* FP_V */ hw->syn_pol = 0; /* SYNC SIGNALS POLARITY */ hw->thresholds = 0x00037800; /* The Thresholds */ hw->int_status = 0; /* INTERRUPT STATUS */ hw->int_mask = 0; /* INT MASK */ hw->plut = 0x01F5F666; /* Pixel Clock configuration */ debug("DIU pixclock in ps - %d\n", var->pixclock); diu_set_pixel_clock(var->pixclock); fb_initialized = 1; if (splash_bmp) { info->logo_height = fsl_diu_display_bmp(splash_bmp, 0, 0, 0); info->logo_size = info->logo_height * info->line_length; debug("logo height %d, logo_size 0x%x\n", info->logo_height,info->logo_size); } /* Enable the DIU */ fsl_diu_enable_panel(info); enable_lcdc(); return 0;}char *fsl_fb_open(struct fb_info **info){ *info = &fsl_fb_info; return (char *) ((unsigned int)(*info)->screen_base + (*info)->logo_size);}void fsl_diu_close(void){ struct fb_info *info = &fsl_fb_info; fsl_diu_disable_panel(info);}static int fsl_diu_enable_panel(struct fb_info *info){ struct diu *hw = dr.diu_reg; struct diu_ad *ad = &fsl_diu_fb_ad; debug("Entered: enable_panel\n"); if (hw->desc[0] != (unsigned int)ad) hw->desc[0] = (unsigned int)ad; debug("desc[0] = 0x%x\n", hw->desc[0]); return 0;}static int fsl_diu_disable_panel(struct fb_info *info){ struct diu *hw = dr.diu_reg; debug("Entered: disable_panel\n"); if (hw->desc[0] != (unsigned int)&dummy_ad) hw->desc[0] = (unsigned int)&dummy_ad; return 0;}static int map_video_memory(struct fb_info *info, unsigned long bytes_align){ unsigned long offset; unsigned long mask; debug("Entered: map_video_memory\n"); /* allocate maximum 1280*1024 with 32bpp */ info->smem_len = 1280 * 4 *1024 + bytes_align; debug("MAP_VIDEO_MEMORY: smem_len = %d\n", info->smem_len); info->screen_base = malloc(info->smem_len); if (info->screen_base == NULL) { printf("Unable to allocate fb memory\n"); return -1; } info->smem_start = (unsigned int) info->screen_base; mask = bytes_align - 1; offset = (unsigned long)info->screen_base & mask; if (offset) { info->screen_base += offset; info->smem_len = info->smem_len - (bytes_align - offset); } else info->smem_len = info->smem_len - bytes_align; info->screen_size = info->smem_len; debug("Allocated fb @ 0x%08lx, size=%d.\n", info->smem_start, info->smem_len); return 0;}static void enable_lcdc(void){ struct diu *hw = dr.diu_reg; debug("Entered: enable_lcdc, fb_enabled = %d\n", fb_enabled); if (!fb_enabled) { hw->diu_mode = dr.mode; fb_enabled++; } debug("diu_mode = %d\n", hw->diu_mode);}static void disable_lcdc(void){ struct diu *hw = dr.diu_reg; debug("Entered: disable_lcdc, fb_enabled = %d\n", fb_enabled); if (fb_enabled) { hw->diu_mode = 0; fb_enabled = 0; }}/* * Align to 64-bit(8-byte), 32-byte, etc. */static int allocate_buf(struct diu_addr *buf, u32 size, u32 bytes_align){ u32 offset, ssize; u32 mask; debug("Entered: allocate_buf\n"); ssize = size + bytes_align; buf->paddr = malloc(ssize); if (!buf->paddr) return -1; memset(buf->paddr, 0, ssize); mask = bytes_align - 1; offset = (u32)buf->paddr & mask; if (offset) { buf->offset = bytes_align - offset; buf->paddr = (unsigned char *) ((u32)buf->paddr + offset); } else buf->offset = 0; return 0;}int fsl_diu_display_bmp(unsigned char *bmp, int xoffset, int yoffset, int transpar){ struct fb_info *info = &fsl_fb_info; unsigned char r, g, b; unsigned int *fb_t, val; unsigned char *bitmap; unsigned int palette[256]; int width, height, bpp, ncolors, raster, offset, x, y, i, k, cpp; if (!bmp) { printf("Must supply a bitmap address\n"); return 0; } raster = bmp[10] + (bmp[11] << 8) + (bmp[12] << 16) + (bmp[13] << 24); width = (bmp[21] << 24) | (bmp[20] << 16) | (bmp[19] << 8) | bmp[18]; height = (bmp[25] << 24) | (bmp[24] << 16) | (bmp[23] << 8) | bmp[22]; bpp = (bmp[29] << 8) | (bmp[28]); ncolors = bmp[46] + (bmp[47] << 8) + (bmp[48] << 16) + (bmp[49] << 24); bitmap = bmp + raster; cpp = info->var.bits_per_pixel / 8; debug("bmp = 0x%08x\n", (unsigned int)bmp); debug("bitmap = 0x%08x\n", (unsigned int)bitmap); debug("width = %d\n", width); debug("height = %d\n", height); debug("bpp = %d\n", bpp); debug("ncolors = %d\n", ncolors); debug("xres = %d\n", info->var.xres); debug("yres = %d\n", info->var.yres); debug("Screen_base = 0x%x\n", (unsigned int)info->screen_base); if (((width+xoffset) > info->var.xres) || ((height+yoffset) > info->var.yres)) { printf("bitmap is out of range, image too large or too much offset\n"); return 0; } if (bpp < 24) { for (i = 0, offset = 54; i < ncolors; i++, offset += 4) palette[i] = (bmp[offset+2] << 16) + (bmp[offset+1] << 8) + bmp[offset]; } switch (bpp) { case 1: for (y = height - 1; y >= 0; y--) { fb_t = (unsigned int *) ((unsigned int)info->screen_base + (((y+yoffset) * info->var.xres) + xoffset)*cpp); for (x = 0; x < width; x += 8) { b = *bitmap++; for (k = 0; k < 8; k++) { if (b & 0x80) *fb_t = palette[1]; else *fb_t = palette[0]; b = b << 1; } } for (i = (width / 2) % 4; i > 0; i--) bitmap++; } break; case 4: for (y = height - 1; y >= 0; y--) { fb_t = (unsigned int *) ((unsigned int)info->screen_base + (((y+yoffset) * info->var.xres) + xoffset)*cpp); for (x = 0; x < width; x += 2) { b = *bitmap++; r = (b >> 4) & 0x0F; g = b & 0x0F; *fb_t++ = palette[r]; *fb_t++ = palette[g]; } for (i = (width / 2) % 4; i > 0; i--) bitmap++; } break; case 8: for (y = height - 1; y >= 0; y--) { fb_t = (unsigned int *) ((unsigned int)info->screen_base + (((y+yoffset) * info->var.xres) + xoffset)*cpp); for (x = 0; x < width; x++) { *fb_t++ = palette[ *bitmap++ ]; } for (i = (width / 2) % 4; i > 0; i--) bitmap++; } break; case 24: for (y = height - 1; y >= 0; y--) { fb_t = (unsigned int *) ((unsigned int)info->screen_base + (((y+yoffset) * info->var.xres) + xoffset)*cpp); for (x = 0; x < width; x++) { b = *bitmap++; g = *bitmap++; r = *bitmap++; val = (r << 16) + (g << 8) + b; *fb_t++ = val; } for (; (x % 4) != 0; x++) /* 4-byte alignment */ bitmap++; } break; } return height;}void fsl_diu_clear_screen(void){ struct fb_info *info = &fsl_fb_info; memset(info->screen_base, 0, info->smem_len);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -