not_at_all 发表于 2009-2-16 20:07:08

[恢复]-FAT文件系统读写程序(目前在fs2410开发板上经过sd卡测试,实现多级目录,文件的创

【楼主位】 superyongzhe 最后的骑士

积分:147
派别:
等级:------
来自:卡里姆多
    经过一个多月的努力,终于完成了fat文件系统的读写函数。期间由于过年,杂事较多,所以一再推迟。起初是模仿zlgfs,但当写到一半时觉得这样构架很难写。于是又返工,重新设计,十分郁闷。到最后从中能找到zlgfs影子的地方也就是几个结构体而已。虽然也有缓冲区,但其算法已经是比zlgfs复杂很多,是参考linux的缓冲区算法的,查找使用的是一个双向循环链表和一个hash表,弄了好久才把主要的bug除掉。

总之,主要就是实现了在fat16文件系统中的多级目录,及文件目录的读写,创建 。最后还写了一个文本文件的读写和bmp图片的读写,结合我以前在这个开发板上做的gui,实现了触摸屏显示24位bmp图片的功能。我测试时,只要在sd卡上存储上24位bmp图片就可以在lcd上显示,十分方便。

    其中包含fat文件系统读写程序在EasyFS目录中,此源代码是ads1.2工程,是在fs2410开发板上的。

点击此处下载 ourdev_418380.rar(文件大小:3.75M) (原文件名:EasySystem_2.rar)
点击此处下载 ourdev_612887.rar(文件大小:3.75M) (原文件名:EasySystem_2.rar)

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418381.JPG
(原文件名:ourdev_596204.JPG)

(原文件名:1--磁盘信息.jpg)


这是在添加文件系统的磁盘驱动程序时在串口中打印的磁盘信息。

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418382.jpg
(原文件名:ourdev_612928.jpg)

(原文件名:2.jpg)


这是测试文件显示和创建,先在串口中打印文件"11111\\maomaob.txt",然后创建文件"mao\\shuang\\pei\\chengmao.txt",并向其中写入"mao mao cheng pei"

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418400.jpg
(原文件名:ourdev_612929.jpg)

(原文件名:2--创建一个文本文件.jpg)


http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418383.jpg
(原文件名:ourdev_612930.jpg)

(原文件名:3.jpg)


这个上面的图标也是在存储在sd卡中的,其中左边和黑白条纹就是使用下面的这段代码创建的bmp图片。

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418384.jpg
(原文件名:ourdev_612931.jpg)

(原文件名:3--创建一个图片.jpg)


//填充图片
      for(uiCount=0;uiCount<60*100*3;uiCount+=3)
      {
                ucaBuffer=uiCount%60*90;      //B
                ucaBuffer=uiCount%60*90;      //G
                ucaBuffer=uiCount%60*90;      //R
      }
      EF_ListDir("bdir\\");//列出目录中的文件
      DA_CreateBMP("bdir\\mypic.bmp",60,100,ucaBuffer);//创建bmp图片
      EF_PrintFileInfoEx("bdir\\mypic.bmp");//显示bmp图片的信息
      EF_ListDir("bdir\\");

      DA_PrintBMP("bdir\\mypic.bmp",10,10);//显示bmp图片,上图的左上角黑白条文就是这里显示的。

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418385.jpg
(原文件名:ourdev_612938.jpg)

(原文件名:4--显示图片.jpg)


下面的几张图片就是这几个语句中显示的,从中可以看出,可以显示不同目录和名称的图片。同时这个函数可以自根据限定显示区域自动布局,缩放显示。

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418386.jpg
(原文件名:ourdev_612947.jpg)

(原文件名:4-1.jpg)


http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418387.jpg
(原文件名:ourdev_612948.jpg)

(原文件名:4-2.jpg)


http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418388.jpg
(原文件名:ourdev_612949.jpg)

(原文件名:4-3.jpg)

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418389.jpg
(原文件名:ourdev_612950.jpg)


(原文件名:4-4.jpg)


http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418396.jpg
(原文件名:ourdev_612951.jpg)

(原文件名:4-5.jpg)


http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418397.jpg
(原文件名:ourdev_612952.jpg)

(原文件名:4-6.jpg)



目前尚未实现长文件名。我本来是打算编写一个简单的读写程序,以便在单片机系统上也可以简单实用,可是由于没规划好,后来竟写成这样了比起复杂的来说,功能太简单,比起简单的来说,太麻烦。个人觉得如果是单片机上,没必要实现太复杂的缓冲,以及多级目录,甚至有的只需要读,连写和创建删除都没必要。所以这实在是高不成低不就的垃圾,仅仅供学习使用,没事么实际用处。欢迎任意复制,修改!


本贴被 superyongzhe 编辑过,最后修改时间:2009-02-07,01:27:24.
__________________________
大自然遵循着等价交换的不原则,如果不付出便什么也得不到。
2009-02-07,00:18:16   资料邮件          本主题状态:等待审核编辑删除   

【1楼】 pl30508
积分:21
派别:
等级:------
来自:
太感谢了
 
2009-02-07,09:45:35   资料邮件          本回复状态:等待审核编辑删除   

【2楼】 eiffel
积分:24
派别:
等级:------
来自:
顶一个,做得实在不错.
 
2009-02-07,09:53:31   资料邮件          本回复状态:等待审核编辑删除   

【3楼】 iam35200
积分:39
派别:
等级:------
来自:
MARK
 
2009-02-07,11:36:15   资料邮件          本回复状态:等待审核编辑删除   

【4楼】 kugel
积分:130
派别:
等级:------
来自:
顶,不错的东西
__________________________
http://shop36261348.taobao.com
PowerPC开发板、STM32开发板
Altera USB Blaster
2009-02-07,12:24:25   资料邮件          本回复状态:等待审核编辑删除   

【5楼】 wanghm35

积分:336
派别:
等级:------
来自:
不错!
 
2009-02-07,12:42:34   资料邮件          本回复状态:等待审核编辑删除   

【6楼】 superyongzhe 最后的骑士

积分:147
派别:
等级:------
来自:卡里姆多
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418398.jpg
(原文件名:ourdev_613290.jpg)

(原文件名:5--工程.jpg)


工程目录讲解:
Main         --主程序,包括系统硬件的初始化,及GUI,FS等的初始化。

MyApp      --应用程序,主要是基于GUI,FS,DataAccess,SystemTool和驱动编写的应用程序。这里面有俄罗斯方块游戏机
               RussiaBlock,电子琴Orgatron,贪吃蛇Snake(未完成),图片浏览器PicViewer。

SystemTool   --包括串口界面ComShell,串口和USB下载Download,NandFlash和NorFlash烧写的SysProg,以及从Nand启动系统的
               SysBoot,提供系统时钟节拍和定时Tick的SysTime,实现按键和触摸屏系统输入的SysInput,实现基于窗口消息的桌面
               系统SysWindow。

DataAccess   --基于EasyFS的特定格式文件读写,创建。目前实现了文本文件和24位BMP图片。

EasyFS       --包含了FAT16文件系统的读写程序。

EasyGUI      --各种各样的图形绘制和字体显示。

Drives       --包含开发板上的各种驱动,包括SD卡的驱动SDI,串口驱动UART,液晶驱动LCD等等。

这里面几乎包含了ARM裸机的大部分程序,可以做出很好玩的东西,比如mp3,只要再把声音和mp3解码搞定就可以了。由于有输入输出及窗口机制,做游戏机程序也很简单,比如我已经做成功的俄罗斯方块。如果不是这个开发板也可以很容易移植,里面的每个模块都是很独立的,我主要是没有时间写文档,要不然你很发现这些程序很好移植。

__________________________
大自然遵循着等价交换的不原则,如果不付出便什么也得不到。
2009-02-07,13:14:08   资料邮件          本回复状态:等待审核编辑删除   

【7楼】 superyongzhe 最后的骑士

积分:147
派别:
等级:------
来自:卡里姆多

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418399.jpg
(原文件名:ourdev_613327.jpg)
(原文件名:5-1 FS.jpg)


EasyFS各个文件说明:

EF_Disk    --主要管理物理磁盘驱动,包括初始化退出,读写,向上提供一个个逻辑磁盘如,首次添加的磁盘就是磁盘“A”,以此
             类推,因此这个FS可以同时操作多个物理磁盘,Flash等等。

EF_Cache   --实现FS的RAM缓冲,减少磁盘访问次数,向上提供磁盘的Cache的读写,隐藏真实磁盘的读写。

EF_FAT   --实现FAT表的读写,目前只支持FAT16。

EF_FDT   --实现FDT表的读写,查找等,支持多级目录。

EF_Dir   --实现多级目录和文件的读写和查找。

EF_File    --实现多级目录文件的读写。


原则上,应用程序只可以调用EF_Dir.c,EF_File.c和EasyFS.c中的部分函数,其他的函数只能在内部使用。


EasyFS的使用步骤如下:

1:编写驱动程序,如下
static uint32 EF_MyDisk(uint32 uiCommand, void *pvParameter)
{
      accessparam *pstParam=pvParameter;
         
      switch(uiCommand)
      {
                case EF_DISK_INIT://初始化
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                        if(!SDI_Init())
                        {
                              UART_TextOut("SD Card Initialized fail(Press any key to exit)\n");
                              UART_GetChar();
                              return EF_DISK_ERROR;
                        }
                        break;
               
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                case EF_DISK_READ://读一个扇区,512byte。
                        SDI_Read(pstParam->uiIndex,1,pstParam->pucBuffer);break;
               
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                case EF_DISK_WRITE://写一个扇区,区中的uiIndex是磁盘的绝对扇区号。
                        SDI_Write(pstParam->uiIndex,1,pstParam->pucBuffer);break;
               
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                case EF_DISK_EXIT:break;//
                default:break;
      }
      return EF_DISK_OK;
}

2:初始化,添加驱动到FS中。

uint32 EF_Init(void)
{
      uint8 ucDisk;
         
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//Initialize the logic disk.
      EF_DiskInit();
         
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//Initialize the cache.
      EF_CacheInit();         
         
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//Initialize the file struct.
      EF_FileInit();
//以上无需改动。
//******************************************************************************************************
//Add Memory Device Driver.
//******************************************************************************************************
      ucDisk=EF_AddDisk(EF_MyDisk);//添加驱动到FS中。
      if(ucDisk==EF_DISK_ERROR)
      {
                UART_TextOut("Disk %d cannot Add!\n",ucDisk);
                return EF_ERROR;
      }
      UART_TextOut("Disk %d is Add!\n",ucDisk);
         
      return EF_OK;
}

3:文件目录的存取

有OpenFile,CloseFile,ReadFile,WriteFile等。必须遵循先打开,再读写,最后关闭的步骤。




本贴被 superyongzhe 编辑过,最后修改时间:2009-02-07,13:31:04.
__________________________
大自然遵循着等价交换的不原则,如果不付出便什么也得不到。
2009-02-07,13:26:51   资料邮件          本回复状态:等待审核编辑删除   

【8楼】 eeyrw

积分:353
派别:
等级:------
来自:
支持FAT32不?
__________________________
http://hi.baidu.com/ecfan
来一来,看一看,走过路过,不要错过。。。
2009-02-07,14:59:10   资料邮件          本回复状态:等待审核编辑删除

luzhengmao 发表于 2009-2-16 23:26:27

FAT32还没支持?

superyongzhe 发表于 2009-2-17 09:16:33

恩,目前没有时间推出新版本。暂时只支持fat16,而且不支持长文件名。我做这个是为了存储图像,语音和一些日志文件的。现在正在搞wav格式,然后搞usb数字视频采集。搞完了再考虑升级吧,时间紧迫,请原谅!!

zzwuyu 发表于 2009-2-21 23:26:15

好东西,标记一下

robinyuan 发表于 2009-2-22 13:44:37

赶紧Mark
真是很不错啊

xywhsoft 发表于 2009-2-25 23:23:52

UI方案使用WinMO的应该不错
O(∩_∩)O哈哈~

LZ真强大啊

wanyou132 发表于 2009-3-26 13:57:20

mark

dzqqqq 发表于 2009-4-16 21:06:11

强,支持

bzddtq1985 发表于 2009-5-4 16:20:10

问个问题啊 我的板子也是fs2410的板子
把源代码生成的BIN文件通过usb下到板子上 插上SD卡
为什么得到下面的信息:
FCLK=200MHzHCLK=100MHzPCLK= 50MHz
Little Endian
FLASH_SADDR:00000000h
SRAM_SADDR :40000000h SRAM_EADDR:40000fffh
SDRAM_SADDR:30000000h SFR_BADDR :48000000h
ISR_BADDR:33ffff00h
Free RAM: 301e1d60h ~ 33ffa7ffh


ReadMode: Polling
Write Mode: Polling
SDI Initialized successful
SWI exception!!!

这里的SWI exception!!!就停在这个死循环这了 为什么得不到串口中打印的磁盘信息 也就是帖子的(原文件名:ourdev_596204.JPG)

高人指点一下

lycb543 发表于 2009-5-6 12:35:04

可不可以把程序所用到的资源发上来?例如说图片之类的
非常感谢~~

luxiwen 发表于 2009-5-16 12:11:33

我是新手。我有一张东芝的16MSD卡,测试FS文件系统时发现为FAT12,之后弹出下面信息。
#################################################
      Please select function :
      0 : Drives Test!
      1 : USB download file
      2 : Uart download file
      3 : Write Nand flash with download file
      4 : Set boot params
      5 : Select Operator System,1:linux 2:wince
      6 : Boot Operating System
      7 : IIC EEPROM Test
      8 : Data Access Test
      9 : Easy FS Test
      ESC: Back to the last menu.
#################################################
>9
Cannot Find in FDT (EF_FindFile)
Cannot open file
Cannot Open This File(DA_PrintText)
Write Clus Error(EF_WriteClus)
Write Clus Error(EF_WriteClus)
Write Clus Error(EF_WriteClus)
"MAO\SHUANG\PEI\CHENGMAO.TXT" has been created

提示文件已经创建,但是用读卡器放进电脑里面看不见有此文件,也看不到写入文本文件的信息。请问应如何解决,同时问问楼主用的是什么卡

superyongzhe 发表于 2009-5-17 20:02:29

目前只支持fat16

lysoft 发表于 2009-5-17 20:42:59

也不错~
最好能实现ExtFAT,MS主推这个

不过俺用的是Micro NandFlash File System,在2K页NAND上文件系统,带损耗均衡和ECC文件校验,稳定性还不错
和FAT相比,最大的特点是针对NANDFlash优化,使用Spare空间存放校验,基于Log的文件系统,可以避免写入时突然掉电导致数据混乱
本来也想用JFFS或是YAFFS,主要是资源不够,没办法在MCU上使用这类大文件系统,不好的地方就是只能使用NAND,而且没法通用

xinjie1023 发表于 2009-8-21 15:41:12

学习

xiaodong 发表于 2009-8-27 23:50:06

海贼王..呵呵

fy024 发表于 2009-8-28 00:09:19

mark

luck851 发表于 2009-8-30 15:58:23

mark

ecooly 发表于 2009-9-26 20:28:32

标记一下

a1z26 发表于 2009-9-26 21:21:22

mark。

1145557260 发表于 2009-9-28 16:40:20

看过,顶一下

ap0405209 发表于 2010-5-6 11:13:01

请问楼主是优龙的开发板吗??

flyword 发表于 2010-5-6 21:08:03

支持啊。。。

liangbmw 发表于 2010-5-16 21:06:23

wangyi1e 发表于 2010-5-16 21:12:46

标记一下,感谢楼主! 学习中

feixuehanyi 发表于 2010-6-9 01:59:40

标记一下

windy85118 发表于 2010-6-10 09:50:05

回复【11楼】superyongzhe 最后的骑士
目前只支持fat16
-----------------------------------------------------------------------


    我移植里面的SD卡驱动的时候,发现每次SD卡都能正确地初始化,但是当我试图用POL方式读取一个BLOCK的时候,状态寄存器老是返回time out,请问有没有谁遇到这个问题,有什么建议吗?

    另外,这个文件系统的Cache,好难读懂,我看了两天。。。(以前没看过HASH算法)

windy85118 发表于 2010-6-11 08:55:32

回复【25楼】windy85118
回复【11楼】superyongzhe 最后的骑士
目前只支持fat16
-----------------------------------------------------------------------
    我移植里面的sd卡驱动的时候,发现每次sd卡都能正确地初始化,但是当我试图用pol方式读取一个block的时候,状态寄存器老是返回time out,请问有没有谁遇到这个问题,有什么建议吗?
    另外,这个文件系统的cache,好难读懂,我看了两天。。。(以前没看过hash算法)
-----------------------------------------------------------------------

这个问题已经解决了,2440和2410有几个寄存器配置不同,开始没看到。。。

roy2002 发表于 2010-8-22 11:34:35

mark

tom919 发表于 2010-8-31 12:06:22

mark,tks

ruddy 发表于 2011-2-5 01:42:14

回复【26楼】windy85118
-----------------------------------------------------------------------

你好,想加你qq:675344786

ruddy 发表于 2011-2-5 01:46:52

回复【2楼】superyongzhe 最后的骑士
-----------------------------------------------------------------------

您好,正在学习您的fatfs想咨询一下细节,能否加个qq,我的qq是675344786,谢谢!祝您在新的一年心想事成!

yungemint 发表于 2011-3-10 16:49:55

mark.很奇怪论坛怎么没有帖子的收藏功能,要是有的话该多好,就不用mark了,呵呵

iwuiwu 发表于 2011-3-20 16:17:36

同上

qt_girl 发表于 2011-3-22 15:31:56

不错,多谢楼主分享哦!

178731 发表于 2011-4-5 14:36:58

mark

liubinghui 发表于 2011-4-6 12:37:44

牛人

huxinxin123 发表于 2011-5-18 16:18:11

回复【26楼】windy85118
-----------------------------------------------------------------------

我和你遇到同样的问题了,请问寄存器配置哪里不一样啊,求解

yytgdut 发表于 2011-5-22 22:37:30

mark

anthonyooo 发表于 2011-7-5 09:20:54

标记一下 学习楼主

dalsxl 发表于 2011-9-14 09:07:31

回复【25楼】windy85118
-----------------------------------------------------------------------

回复【25楼】windy85118
回复【11楼】superyongzhe 最后的骑士
目前只支持fat16
-----------------------------------------------------------------------
    我移植里面的sd卡驱动的时候,发现每次sd卡都能正确地初始化,但是当我试图用pol方式读取一个block的时候,状态寄存器老是返回time out,请问有没有谁遇到这个问题,有什么建议吗?
    另外,这个文件系统的cache,好难读懂,我看了两天。。。(以前没看过hash算法)
-----------------------------------------------------------------------

这个问题已经解决了,2440和2410有几个寄存器配置不同,开始没看到。。。
这个问题我现在也遇到了,驱动我看过了但没发现问题,我用的是2440的,寄存器改过了,但就是数据发送不出去!!!

dalsxl 发表于 2011-9-15 10:53:43

while(uiWriteCount<128*uiNumber)
        {   
          
                status=rSDIFSTA;
                if((status&0x2000)==0x2000)
                {
#ifdef SDI_WRITE_ENDIANCHANGE
            
                        uiTemp=uiaBuffer;
                        pucTemp=(U8 *)&uiTemp;
//                        pucTemp=(U8 *)(uiaBuffer+uiWriteCount);
//                        Uart_Printf("%08x,",*(uiaBuffer+uiWriteCount));
                        ucTemp=*pucTemp;
                        *pucTemp=*(pucTemp+3);
                        *(pucTemp+3)=ucTemp;
                        ucTemp=*(pucTemp+1);
                        *(pucTemp+1)=*(pucTemp+2);
                        *(pucTemp+2)=ucTemp;
//                        Uart_Printf("%08x,",*(uiaBuffer+uiWriteCount));
                        rSDIDAT=uiTemp;
                        //Uart_Printf("uitemp is %0x\n",uiTemp);
                  //Uart_Printf("POL write is OK13\n");
#else
                        rSDIDAT=uiaBuffer;
                        Uart_Printf("!!!!!!!!!!!!!!!!!!!!!\n");
                        Uart_Printf("uiBuffer [] is %0x\n",uiaBuffer);

#endif

                        uiWriteCount++;
                }
                //Uart_Printf("POL write is OK3\n");
                //Uart_Printf("uiWriteCount is %d",uiWriteCount);
               
               
        }
问一下,为什么我的函数在这里只执行16次就停下了,也就是赋uiaBuffer【】的前十六个值,程序就不在往下赋值,停在这,因为还有102个值,想问一下这个是那边出问题了!!!是个新手麻烦多指教,指教!!!!!!

dalsxl 发表于 2011-9-21 09:40:41

!!!有几个寄存器引发的“血案”,害得我弄了个吧星期,问题解决了!!!

program 发表于 2011-11-23 13:25:39

非常感谢,MARK

leijiayou 发表于 2012-2-28 10:28:57

mark!!!

cm00123 发表于 2012-7-18 12:20:26

谢谢分享
页: [1]
查看完整版本: [恢复]-FAT文件系统读写程序(目前在fs2410开发板上经过sd卡测试,实现多级目录,文件的创