原创 bootloader中显示nk加载进度

2009-4-15 11:39 2183 3 3 分类: MCU/ 嵌入式
由于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);
 }
}

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条