告别AVR单片机大半年了,用hpijs打印驱动做过HP deskjet 2368喷墨打印机、HP P2015激光打印机,ARM的MMU映射、中断处理,感慨ARM真的是难了很多,贴一贴嵌入式软件的一些经历,上个月搞FAT,写写文件名的总结: (1)有短文件名和长文件名之分,为8.3格式,短文件名存储时全部为大写字母,如abcd.txt,存储的时候8.3格式为A B C D 0x20 0x20 0x20 0x20 T X T。 (2)如果名字部分大于8个字符,一定当作长文件名处理,如果小于8个,用0x20表示,如果没有扩展名,则扩展名用0x20表示。 (3)如果文件名含有“.”,则视为长文件名,如abc.1.txt。 (4)如果文件名为大小写混合,则视为长文件名,如aBc.txt,123.tXt。 (5)长文件名目录项之后就是短文件名,每个长文件名目录项的开头字节如0x42 0x01,有0x40的是长文件名的最后一个目录项。 (6)文件名abcd.TXT、ABCD.txt、ABCD.TXT、abcd.txt表示的是同一个文件,你说windos会怎么显示这个文件名? 其实是用户怎名命名就怎么显示,即:如果用户命名为abcd.TXT,看到的就是abcd.TXT,不会看到ABCD.txt、ABCD.TXT、abcd.txt这三种显示。 再问,这个是长文件名吗? 不是,abcd.TXT、ABCD.txt、ABCD.TXT、abcd.txt都是短文件名,都是同一个文件名,符合8.3格式,是短文件名。 那么windows根据什么信息知道要给用户显示成abcd.TXT,而不是ABCD.txt、ABCD.TXT、abcd.txt呢? FAT规范没有提到这个显示的依据,其实windows是根据短目录项的第12字节来决定如何显示的,如0x00时显示为abcd.txt, 0x18时显示为ABCD.TXT, 好像是这样,具体数值怎么显示我忘记了。 其实windows也没有严格遵循FAT规范,如:FAT16规定保留扇区为0,其实不一定,windows将U盘格式化成FAT16格式的时候一般都会有保留扇区。 深入研究了FAT,感觉不会太难的。 前段时间搞基于USB的FAT16文件系统,像FAT1、FAT2怎么定位,根目录怎么定位,都可以很快算出来。 如果一个文件夹内长期使用,会长生许多以0xe5字节开头的无效目录项,比如:如果文件夹内只有一个文件,其实用一个目录项记录这个文件就可以了,但是文件夹的非0扇区可以达到到好几个扇区,甚至好几簇,针对这种情况,我编写了一个函数,专门用来清理U盘的指定文件夹,把0xe5、0x05开头的目录项,无效长目录项,等等,全部清理掉,腾出空间,而不影响原来的有效文件。 这个星期搞了uboot,原来只能从TFTP升级自身和ARM程序,每次都要插网线,设IP,很不方便, 现在uboot可以支持读取U盘文件,这样可以把程序文件拷贝到U盘,uboot从U盘读取文件,然后做uboot自我升级、应用程序升级、FPGA1和FPGA2的配置芯片m25p16、m25p20的升级,节省了原来用编程器给每块芯片烧写程序的大量时间,能提升生产效率。 在uboot的include/configs/目录下有一个对应开发板的配置头文件,如smdk2410.h,打开#define CONFIG_COMMANDS语句的USB和FAT功能开关,然后再加上以下语句: #define CONFIG_CMD_USB #define CONFIG_CMD_FAT
#define CONFIG_USB_OHCI #define CONFIG_USB_STORAGE #define CONFIG_USB_KEYBOARD #define CONFIG_DOS_PARTITION #define CFG_DEVICE_DEREGISTER #define CONFIG_SUPPORT_VFAT #define LITTLEENDIAN 这样就给uboot加上了读取U盘的功能,你只要把可以烧写flash的程序文件存到U盘,用fatload命令如fatload usb 0 0x30000000 zimage.img,就可以从U盘把zimage.img文件读取到0x30000000地址的SDRAM处。不过uboot不会自动打开USB功能,所以使用USB功能之前先用usb start命令打开USB功能。用fatls usb 0 命令还可以通过超级终端显示U盘内的文件情况。执行这些命令可以通过超级终端输入命令执行,也可以在程序中设定执行命令,如: char *s="usb start";//打开USB功能 run(s,0); s = "fatload usb 0 0x30000000 zimage.img" ; run(s,0); 这样就可以运行这条命令了。 给uboot增加命令很简单: int do_mycommand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { //这里加上你的命令要实现的功能就可以了 } U_BOOT_CMD( mycommand, 2, 1, do_mycommand , "mycommand - this is my command
", "mycommand
" " - do mycommand
" );
可以装virtualBOX虚拟机+fedora来编译uboot,还有交叉编译器cross-x.x.x.tar.bz2和uboot,用tar解压之后简单修改一下编译器路径就能编译。 有空把FAT和uboot的资料整理共享^_^! 争取10、11、12三个月把ADS的圣经ARM Architecture Reference Manual、ADS_AssemblerGuide_B、ADS_DeveloperGuide_D、ADS_LinkerGuide_A、ATPCS啃完,为自己加油o(∩_∩)o.. |