星期六,06月7日, 2008 – 21:03:41
囧 又发原理贴。我很恶俗啊。嗯嗯
这个原理很简单。UE打开固件,转到偏移0×728D0,就可以看见固件的索引区,即INDEX区了。里面有很多明文显示的路径名和文件名。没错。这些就是固件内包括的全部文件及其路径了。
那么解释一下,文件名很好理解。就是文件名。文件名之前的4字节,是该文件的大小,高字节在下。在这之前的4个字节,是该文件的相对偏移量,也是高字节在下。该偏移量的基准量是INDEX区的起始位置,即0×728D0。
举例来说,0×72990这个地方,是固件内第一个文件的名字,叫做APPDATA\PYTABLE.bin。在其前面的4个字节是4A A3 00 00,也就是说,这个文件的大小是0×0000A34A。再前面的4个字节是00 28 00 00,也就是说,这个文件的相对偏移量是0×00002800,也就是说,这个文件在固件内的绝对偏移量是0×00002800+0×728D0。
除了这8个字节和文件名以外,其他数据对解包无用。于是无视掉了。
就像同志们看见的,INDEX区也记录了目录。比如一上来就是APPDATA。其实也是一样的,前面的4字节是表示大小,目录的大小固定都是0。再前面的4字节记录的是偏移量,该值和该文件夹下第一个有效文件(不包括子文件夹内文件)的偏移量相同。对于APPDATA,其文件夹下第一个有效文件的偏移就是上面说的PYTABLE.BIN的偏移,因此其这4个字节也是00 28 00 00。
那么解包时,读取这些数据,记录文件夹、文件名、文件大小和文件偏移。建立相应的文件夹,从相应偏移量读取相应大小的数据,并将这些数据保存在相应的文件夹内,命名为相应名字,就完成了解包了。
解包出来的固件,其实没啥用。。。呃。。。本意是解包后美化固件可能更为简单,但是现在发现,要组包貌似很困难。。。期待高手帮助。。。
以上。再度原理完毕……
星期六,06月7日, 2008 – 09:05:13
呃,这个,思路很混乱。最近比较疲劳,又有点喝多了……(台下西红柿飞来:酒鬼去死……)
(擦去脸上西红柿)咳咳。嗯。言规正传。说一下M30的字库替换原理。
M30和其他嵌入式设备一样,字体是以点阵的形式存储在机器里面的。所谓的点阵字库就是,以0、1记录点是如何显示的,并将这些点组合起来……这句话我自己都看不懂了……举例来说:菜单中的第二项上面的字是一个24×24的字,那么在固件里面,该字的存储就是一个24×24bit的一串数据,这一串里面,每一个bit是0则该点为黑,是1则该点为白色。最后,将这些点排练成一个24×24的方形,那么那些点就会组合出一个字来……貌似还是很难理解……
呃,算了,点阵字库的话,大家百度一下好了。
实际反映出来,就是用ISE打开固件,以2.0修正版为例,将图片格式定为1位象素 2色模式,并将图片大小变为24×24,然后,跳转到0×02461054偏移量,就可以看见一只“一”字,再往下翻就是“丁七万丈”等等。这就是一套点阵字库。
想要修改字体,就把相应字的点阵改掉就可以了。比如“一”字,我不想让他显示为一个横杠,那就改掉这24×24的图片,把它变成随便什么样的形状,那么,刷机后,凡是24×24的“一”字,都会变成你改的那个样子。
这就是单独修改一个字或者几个字的修改法。
但是,一般大家修改都是想要批量修改,就是将整个字库的字都改掉。那么一个一个修改就太累了。于是再来讲一下字库的存储格式,
M30里面,字库的存储是以几个名字为OUFTxx.bin的文件形式存在的,具体可参看未打包固件的\RESOURCE\LANGUAGE\CHINESE下。xx是字体的大小,有24、16、12三种。以下说明都以24的为例,其他大小的基本一样。
每个bin文件内,最开始是文件头,28 0A 00 00 之类 ,然后是整个字库内字的UNICODE代码,以高位在下的方式记录,就是接下来的20 00 21 00,到00 4E 01 4E,一直到84 9F 99 9F 9F 9F。这些编码取出后,查询UNICODE码表就可以得出其中用到的所有的字,就是我以前发出来的那个貌似是水帖的东西。那个就是全字库。包括英文和符号,一共2600个字符。
接下来,就是点阵字库区。一个24×24的字,应该是24×24/8=72BYTE。但是实际查看可以发现,每个字是76BYTE,中间有4BYTE的附加数据。该数据的格式貌似是00 0x 00 18。猜想其中18应该是代表24的字库,0x这个数据不定,用处也不定。但是经过某兵兄的测试,该4字节数据,只要不动他,就是正常的。所以这4BYTE数据只要照搬到我们自己修改出来的字库里面就好了。
另外,现有的字库替换并没有动到英文字符和符号。用ISE可以看出,英文字符和符号的编码和中文字稍微有点不同。为了避免麻烦就没有去动。不过严格按照他的样子作出来的话,应该也都是通用的。
所以替换字库的流程如下:首先用一些专业字模生成工具生成标准汉字字模,我用的是 字模III。当然是破解版……呃……支持正版啊!……。软件的用法就不多说。软件生成的字库是标准的一个接一个的24×24字库。所以需要写个软件处理一下,将BIN文件的头、开头的编码数据和未修改的英文字符编码数据加上,然后,从原BIN文件读取一个4BYTE的附加数据,再从生成的字库中读取72BYTE的字模数据,一个一个的组起来,由此生成一个符合标准的OUFTxx.bin。
然后,在固件中找到相应的OUFTxx.bin的位置,将现有的数据替换为我们自己做好的OUFTxx.bin。然后刷机。就可以完成字库替换了。
嗯嗯。很混乱哪。我自己都快看不懂了。不过大致就是这个样子了。
另:在固件中替换OUFT这个活,其实很烦。要是能把固件解包再重打包就好了。。。。。。
再另:求高人写个通用的生成OUFT的程序。。。呃。。我们自己写的都是简易型,拿不出手的东西。。。
再再另:有啥问题跟帖提问或者PM吧。。尽量给你解释。但是,本身不是语言能说清楚的,自己试试就好了。
再再再另:不要乱搞!这个东西很核心的。字库替换如果出错,轻则显示不正常,重可能无法开机。本人就因为漏了一字节的数据,导致机器开机不能,也不能正常方法修复,最后是拆机短接清空flash修复的……嗯。以上。
星期日,04月13日, 2008 – 10:47:34
本文是群内兄弟7号兄研究出来的结果,本人只是总结了一下。呵呵。向7号同学致敬!
M30固件里面,菜单条的一个大黑边实在是很郁闷。但是实际上,可以通过美化固件,将菜单条的形状任意改变。
首先说一下原理。其实很简单的道理:M30固件里面,菜单条的形状是一个完整的矩形。但是显示出来的是圆角矩形。也就是说,有一部分图片并没有显出来。通过查看可以发现,没有显示出来的部分,颜色均为#FF00FF。那么就是说,只要是颜色为#FF00FF的像素点,固件在显示的时候,都将其做透明化处理。根据这个原理,就可以很轻松的实现任意修改固件内菜单的显示形状。
但是具体实现时有一点小困难。就是在M30固件内,其图片格式是32bit的BMP,也就是一个像素点是4BYTE数据。但是一般电脑内的图片,均为24bit的BMP,其一个像素点仅为3BYTE数据。每一个像素点缺少了8bit。而且,使用的工具Image Search Editor(以下简称ISE),其对图片的导入导出也是按照24bit来进行的。所以,可能会出现外面制作好的图片,导入其中却不能使用的问题。原因就是这个样子。
不过,ISE内还提供了另一种方法,就是将BMP文件导出为BIN,也可以将BIN文件导入覆盖BMP。这样就能完整的保存数据。其所使用的BIN文件,其实就是去除了文件头尾的BMP文件。所以,只要有制作好的32bit的BMP,简单的处理就可以将其转换为可用的BIN。
那么在具体实现时,可以如下操作:首先在PS里面,新建一个293*60的图片,格式设为8bitRGB。新建完成后,先在右下角 通道 一栏中新建一个Alpha通道。完成后,就不用管了。正常的制作处理图片即可。将需要透明的点变为#FF00FF就可以。保存的时候,选BMP,并勾选 Alpha通道 选项。出来的文件应该就是一个32bit的BMP了。文件大小应该是70376字节。
随后,用UE之类的工具打开该文件,将文件的前54字节和最后2字节去除。文件大小变为70320字节。另存为BIN。就是一个可以使用的BIN文件了。
为方便使用,7号兄使用Delphi写了一个专用工具,可以实现BIN和BMP的互转,那么就不用那么麻烦的自己去用UE修改。使用该工具,就可以将文件方便的转换为需要的格式。等下7号兄就可以将该工具上传了。呵呵。
这样。M30内菜单的可定制性大大加强。相信大家也能做出更为个性又绚烂多彩的固件吧~^_^
转换工具已经上传。内附使用说明,如有不明可以留言,我尽量答复。呵呵
转换工具下载