#ifndef __FONTUPD_H__
#define __FONTUPD_H__
#include "sys.h"
//字库信息结构体定义33字节
__packed typedef struct
{
u8 fontok; //字库存在标志,0XAA,字库正常;其他,字库不存在
u32 ugbkaddr; //unigbk的地址
u32 ugbksize; //unigbk的大小
u32 f12addr; //gbk12地址
u32 gbk12size; //gbk12的大小
u32 f16addr; //gbk16地址
u32 gbk16size; //gbk16的大小
u32 f24addr; //gbk24地址
u32 gkb24size; //gbk24的大小
}_font_info;
extern _font_info ftinfo; //汉字库信息结构体
//字库信息结构体定义 25字节
//第1个字节用于标记字库是否存在.后续分别保存起始地址和文件大小
__packed typedef struct
{
u8 fontflag; //字库存在标志,0XAA,字库正常;其他,字库不存在
u32 asc1206_addr; //asc1206的地址
u32 asc1206_size; //asc1206的大小
u32 asc1608_addr; //asc1608地址
u32 asc1608_size; //asc1608的大小
u32 asc2412_addr; //asc2412地址
u32 asc2412_size; //asc2412的大小
} _ascii_font;
extern _ascii_font ascii_font; //ascii字库信息结构体
u8 updata_HZ_fontx(u8 *fxpath,u8 fx); //更新指定字库
u8 update_HZ_font(u8* src); //更新全部字库
u8 HZ_font_init(void); //初始化字库
u8 updata_ascii_fontx(u8 *fxpath,u8 fx); //更新指定字库
u8 update_ascii_font(u8* src); //更新全部字库
u8 ascii_font_init(void); //初始化字库
u8 font_init(void);
void updateHZfont(void);
void updateasciifont(void);
#endif
#include "fontupd.h"
#include "malloc.h"
#include "ff.h"
#include "w25qxx.h"
#include "string.h"
#include "delay.h"
#include "usart.h"
/* ascii字库在flash中的地址及大小(字节)
fontflagaddr=15831040 ascii_font_size=25
asc1206_addr=15831065 asc1206_size=1140
asc1608_addr=15832205 asc1608_size=1520
asc2412_addr=15833725 asc2412_size=3420
*/
//W25Q128FVFIG容量有128Mbit = 16MB
//前面12M被fatfs占用了,从12M地址以后存放字库结构体、UNIGBK.bin、和三个字库
//地址: (1024*12)*1024 字节处,大小约 3.09M,不能动!
//15.10M以后,存放ASCII三个字库
//首地址: 1024*1024*15 + 1024*100 =15831040字节处 字库总大小25+ 6080字节,也不能动 !
//15.20M以后剩余0.8M字节空间,用户可以使用。
//汉字库区域占用的总扇区数大小(3个字库+unigbk表+字库信息=3238700字节,3238700/512=791)
//ascii字库区域占用的总扇区数大小 //(字库信息结构体+字库 = 25+ 6080字节,占12个W25QXX扇区)
#define ASCII_FONT_SECSIZE 12 //ascii字库占用扇区
#define ASCIIFONTINFOADDR 1024*1024*15 + 1024*100 //ascii字库起始地址
#define FONTSECSIZE 791 //汉字库占用扇区
#define FONTINFOADDR 1024*1024*12 //汉字库起始地址
_font_info ftinfo; //用来保存字库基本信息,地址,大小等
_ascii_font ascii_font; //用来保存字库基本信息,地址,大小等
//汉字库存放在磁盘中的路径
u8*const GBK24_PATH="/SYSTEM/FONT/GBK24.FON"; //GBK24的存放位置
u8*const GBK16_PATH="/SYSTEM/FONT/GBK16.FON"; //GBK16的存放位置
u8*const GBK12_PATH="/SYSTEM/FONT/GBK12.FON"; //GBK12的存放位置
u8*const UNIGBK_PATH="/SYSTEM/FONT/UNIGBK.BIN"; //UNIGBK.BIN的存放位置
//ascii字库存放在磁盘中的路径
u8*const ASC1206_PATH="/SYSTEM/FONT/ASC1206.dat"; //asc1206的存放位置
u8*const ASC1608_PATH="/SYSTEM/FONT/ASC1608.dat"; //asc1608的存放位置
u8*const ASC2412_PATH="/SYSTEM/FONT/ASC2412.dat"; //asc2412的存放位置
//更新某一个
//fxpath:路径
//fx:更新的内容 0,ungbk;1,gbk12;2,gbk16;3,gbk24;
//返回值:0,成功;其他,失败.
u8 updata_HZ_fontx(u8 *fxpath,u8 fx)
{
u32 flashaddr=0;
FIL * fftemp;
u8 *tempbuf;
u8 res;
u16 bread;
u32 offx=0;
u8 rval=0;
fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //分配内存