OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5104|回复: 6

更新字库UNIGBK.BIN后:ftinfo.ftinfo.ugbkaddr和ftinfo.ftinfo.ugbksize不能保存,导致下次更新gbk12计算初定flashadd是0????

[复制链接]

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
发表于 2014-8-14 22:01:16 | 显示全部楼层 |阅读模式
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;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
 楼主| 发表于 2014-8-14 22:01:17 | 显示全部楼层
我在main.c中定义全局变量ftinfo
_font_info ftinfo;

int main(void)

在fontupd.c中extern引用,才算搞定了。。。

extern _font_info ftinfo;
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
 楼主| 发表于 2014-8-14 22:02:56 | 显示全部楼层
按理讲,ftinfo是全局变量啊??搞不懂
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
 楼主| 发表于 2014-8-14 22:52:45 | 显示全部楼层
没有sd卡,实现串口更新flash字库
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
 楼主| 发表于 2014-8-14 22:55:11 | 显示全部楼层



成功了!I did it!
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2013-1-15
在线时间
6 小时
 楼主| 发表于 2014-8-14 22:57:06 | 显示全部楼层
论坛维护的很好。这么快都更新答案了。赞一个!做事的态度值得学习!
回复

使用道具 举报

11

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2015-2-9
在线时间
9 小时
发表于 2015-2-9 17:17:34 | 显示全部楼层
光盘里的汉字示例不能使用~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 00:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表