初级会员

- 积分
- 71
- 金钱
- 71
- 注册时间
- 2013-1-15
- 在线时间
- 6 小时
|
5金钱
u8 update_font(u16 x,u16 y,u8 size,u8 src)
{
u8 *gbk16_path;
u8 *gbk12_path;
u8 *unigbk_path;
u8 res;
if(src == 2)
{
//rx_upfontsign = 1;//set rx_upfontsign to uart
unigbk_path=(u8*)FONT_UARTSRC;
gbk12_path=(u8*)FONT_UARTSRC;
gbk16_path=(u8*)FONT_UARTSRC;
}
else if(src == 1)//从25qxx更新
{
unigbk_path=(u8*)UNIGBK_25QPATH;
gbk12_path=(u8*)GBK12_25QPATH;
gbk16_path=(u8*)GBK16_25QPATH;
}else if (src ==0)//从sd卡更新
{
unigbk_path=(u8*)UNIGBK_SDPATH;
gbk12_path=(u8*)GBK12_SDPATH;
gbk16_path=(u8*)GBK16_SDPATH;
}
res=0XFF;
ftinfo.fontok=0XFF;
SPI_Flash_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //清除之前字库成功的标志.防止更新到一半重启,导致的字库部分数据丢失.
SPI_Flash_Read((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //重新读出ftinfo结构体数据
//LCD_ShowString(x,y,240,320,size,"Updating UNIGBK.BIN");
printf("Updating UNIGBK.BIN\r\n");
res=updata_fontx(x+20*size/2,y,size,unigbk_path,0); //更新UNIGBK.BIN
if(res)return 1;
//LCD_ShowString(x,y,240,320,size,"Updating GBK12.BIN ");
printf("Updating GBK12.BIN\r\n");
res=updata_fontx(x+20*size/2,y,size,gbk12_path,1); //更新GBK12.FON
if(res)return 2;
//LCD_ShowString(x,y,240,320,size,"Updating GBK16.BIN ");
printf("Updating GBK16.BIN\r\n");
res=updata_fontx(x+20*size/2,y,size,gbk16_path,2); //更新GBK16.FON
if(res)return 3;
//全部更新好了
ftinfo.fontok=0XAA;
SPI_Flash_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //保存字库信息
return 0;//无错误.
}
//更新某一个
//x,y:坐标
//size:字体大小
//fxpath:路径
//fx:更新的内容 0,ungbk;1,gbk12;2,gbk16;
//返回值:0,成功;其他,失败.
u8 updata_fontx(u16 x,u16 y,u8 size,u8 *fxpath,u8 fx)
{
u32 flashaddr=0;
FIL * fftemp;
u8 *tempbuf;
u8 res;
u16 bread;
u32 offx=0;
u8 rval=0;
//u32 bread_size = 0;
fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //分配内存
if(fftemp==NULL)rval=1;
tempbuf=(u8 *)mymalloc(SRAMIN,4096); //分配4096个字节空间
if(tempbuf==NULL)rval=1;
if(strcmp((const char *)fxpath,"2:UART") == 0)
{
ptr_upfont = (u8 *)mymalloc(SRAMEX,750*1024);
if(ptr_upfont==NULL)rval=1;
ptr_upfont_start = ptr_upfont;
ptr_upfont_end = ptr_upfont_start;
rx_upfontsign = 1;
printf("malloc succeed ptr_upfont=0x%08x\r\n",ptr_upfont);
printf("please send font file to RAM...\r\n");
while(rx_upfontsign == 1);//wait load finish
printf("font load finished,totally %d bytes loaded\r\n",rx_upfont_size);
}
else
{
res=f_open(fftemp,(const TCHAR*)fxpath,FA_READ);
if(res)rval=2;//打开文件失败
}
printf("rval=%d\r\n",rval);
if(rval==0)
{
if(fx==0) //更新UNIGBK.BIN
{
ftinfo.ugbkaddr=FONTINFOADDR+sizeof(ftinfo);//信息头之后,紧跟UNIGBK转换码表
if(strcmp((const char *)fxpath,"2:UART") == 0)
{
ftinfo.ugbksize=rx_upfont_size; //UNIGBK大小
printf("ftinfo.ugbksize=0x%08x\r\n",ftinfo.ugbksize);
}
else
ftinfo.ugbksize=fftemp->fsize; //UNIGBK大小
flashaddr=ftinfo.ugbkaddr;
}else if(fx==1) //GBK12
{
ftinfo.f12addr=ftinfo.ugbkaddr+ftinfo.ugbksize; //UNIGBK之后,紧跟GBK12字库
if(strcmp((const char *)fxpath,"2:UART") == 0)
{
ftinfo.gbk12size=rx_upfont_size; //GBK12大小
printf("ftinfo.gbk12size=0x%08x\r\n",ftinfo.gbk12size);
}
else
ftinfo.gbk12size=fftemp->fsize; //GBK12大小
//ftinfo.gbk12size=fftemp->fsize; //GBK12字库大小
flashaddr=ftinfo.f12addr; //GBK12的起始地址
}else if(fx==2) //GBK16
{
ftinfo.f16addr=ftinfo.f12addr+ftinfo.gbk12size; //GBK12之后,紧跟GBK16字库
if(strcmp((const char *)fxpath,"2:UART") == 0)
{
ftinfo.gkb16size=rx_upfont_size; //GBK16大小
printf("ftinfo.gkb16size=0x%08x\r\n",ftinfo.gkb16size);
}
else
ftinfo.gkb16size=fftemp->fsize; //GBK16大小
//ftinfo.gkb16size=fftemp->fsize; //GBK16字库大小
flashaddr=ftinfo.f16addr; //GBK16的起始地址
}
printf("ftinfo.ugbkaddr=0x%08x\r\n",ftinfo.ugbkaddr);
printf("ftinfo.ugbksize=0x%08x\r\n",ftinfo.ugbksize);
printf("ftinfo.f12addr=0x%08x\r\n",ftinfo.f12addr);
printf("ftinfo.gbk12size=0x%08x\r\n",ftinfo.gbk12size);
printf("ftinfo.f16addr=0x%08x\r\n",ftinfo.f16addr);
printf("ftinfo.gbk16size=0x%08x\r\n",ftinfo.gkb16size);
res = FR_OK;
printf("wrrite font data to flash at address 0x%08x...",flashaddr);
while(res==FR_OK)//死循环执行
{
if(strcmp((const char *)fxpath,"2:UART") == 0)
{
//printf("read font data from uart rx buffera at addr 0x%08x...",ptr_upfont_start);
res = rx_read(ptr_upfont_end,tempbuf,4096,(u16 *)&bread);//read font data from rx buffer
//bread_size += 4096;
//printf("done!\r\n");
}
else
res=f_read(fftemp,tempbuf,4096,(UINT *)&bread); //读取数据
if(res!=FR_OK)break;
//执行错误
//printf("wrrite font data to flash at address 0x%08x...",offx+flashaddr);
SPI_Flash_Write(tempbuf,offx+flashaddr,4096); //从0开始写入4096个数据
//printf("done!\r\n");
offx+=bread;
//fupd_prog(x,y,size,fftemp->fsize,offx); //进度显示
//if(strcmp((const char *)fxpath,"2:UART") == 0)
//{
// if(bread_size >= rx_upfont_size) break;
//}
//else
//{
if(bread!=4096) break; //读完了.
//}
}
printf("done!\r\n");
if(strcmp((const char *)fxpath,"2:UART") != 0)
f_close(fftemp);
}
myfree(SRAMEX,ptr_upfont);
myfree(SRAMIN,fftemp); //释放内存
myfree(SRAMIN,tempbuf); //释放内存
return res;
}
|
最佳答案
查看完整内容[请看2#楼]
我在main.c中定义全局变量ftinfo
_font_info ftinfo;
int main(void)
在fontupd.c中extern引用,才算搞定了。。。
extern _font_info ftinfo;
|