首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

FAT和uboot的丁点总结

告别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解压之后简单修改一下编译器路径就能编译。
继承事业,薪火相传
返回列表