打印

FAT和uboot的丁点总结

[复制链接]
5242|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linnaldf|  楼主 | 2008-9-19 20:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      告别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..

相关帖子

沙发
walnutcy| | 2008-9-19 21:35 | 只看该作者

别用ADS了,早就不再升级了,

使用特权

评论回复
板凳
bh3nvn| | 2008-9-20 11:18 | 只看该作者

别用ADS了,早就不再升级了

也不支持以后的Cortex系列

使用特权

评论回复
地板
linnaldf|  楼主 | 2008-9-20 13:49 | 只看该作者

这些是ARM的精髓,realview文档也有这些东西

难道这些原理对realview来说是另类?工具变了,实质的东西是不会变的,再说这些东西压根没多少人会去看,可能realview也有这些文档,这些都是ARM的精髓。

使用特权

评论回复
5
foxfoxes| | 2008-9-23 15:21 | 只看该作者

使用特权

评论回复
6
sodwell| | 2008-9-23 15:50 | 只看该作者

re

非常好!很有实用性!
thanks for your share!

使用特权

评论回复
7
lj33072315| | 2008-10-20 11:06 | 只看该作者

顶!!!!!!!!!!

使用特权

评论回复
8
Mindor| | 2010-2-28 08:06 | 只看该作者
谢了~其中的FAT文件系统说的挺好~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

70

帖子

1

粉丝