bootloader中显示nk加载进度

由于bootloader本身大小的限制,不可能将图片的c数组放到bootloader中去,要想实现显示加载的进度,只能对framebuffer进行操作。
在不理解的时候我很土的以为对framebuffer的操作是不太可能的。其实很简单,无非就是用数据填到framebuffer中的合适位置。我现在用的是水平方向填充的,例如320x240,16位真彩色,那么一行中需要320x2个byte。这样就可以很容易实现在framebuffer中画很简单的图了,例如矩形,和填充矩形。进度条无非也就是这样搞的。
首先要在bootloader的main函数中initdisplay,这个和cfw.c中一样可以拷贝过来用,如果你的bootloader的main执行是在还没有使能mmu时,那么就要修改framebuffer和lcd的控制器等的地址为物理地址才行。
接下来就是在配置好lcd(initdisplay)之后用固定颜色填充整个framebuffer,再在特定的位置填充别的颜色以实现进度条的矩形。
最后就是在bootloader从flash拷贝nk到ram中的实现函数中调用矩形填充函数,根据nk的大小和进度条的长度(象素数)决定每拷贝多少个512B填充进度条的一格(bootloader中读flash是以sector为单位的,1sector=512B);
下面是我实现画矩形和填充矩形的函数:
void DrawProcess()
{
int nlong = LCD_XSIZE_TFT*2;
int nXstart =LCD_XSIZE_TFT*2/4;
int nXend = LCD_XSIZE_TFT*2*3/4;
int nYstart = LCD_YSIZE_TFT*3/4;
int nhigh = 10;
int i = 0;
//top of rect
memset((void *)((unsigned char*)FRAMEBUF_DMA_BASE+ nlong * nYstart + nXstart), 0x00, nXend - nXstart);
//bottom of rect
memset((void *)((unsigned char*)FRAMEBUF_DMA_BASE+ nlong * (nYstart+nhigh) + nXstart), 0x00, nXend - nXstart);
for(i = 0; i < nhigh; i++)
{
//left of rect
memset((void *)((unsigned char*)FRAMEBUF_DMA_BASE+ nlong * (nYstart+i) + nXstart), 0x00, 2);
//right of rect
memset((void *)((unsigned char*)FRAMEBUF_DMA_BASE+ nlong * (nYstart+i) + nXend), 0x00, 2);
}
}
void DrawMark(int index)
{
int nXstart = LCD_XSIZE_TFT*2/4;
int nYstart = LCD_YSIZE_TFT*3/4;
int nlong = LCD_XSIZE_TFT*2;
int nMarkhigh = 10;
int i = 0;
for(i = 0; i < nMarkhigh; i++)
{
memset((void *)((unsigned char*)FRAMEBUF_DMA_BASE+ nlong * (nYstart+i) + nXstart+index), 0x00, 2);
}
}

本文出自 “bluefish” 博客,请务必保留此出处http://bluefish.blog.51cto.com/214870/58109

Database error: [Table 'ac_search_cache' is marked as crashed and should be repaired]

SELECT * FROM ac_search_cache WHERE hash = 'b85fd3c021ae0bea0bd4b118c76f94b062871c21' LIMIT 1;