原创 sd卡驱动+FAT文件系统(二) (转)

2010-8-30 09:21 3206 3 3 分类: 工程师职场

3、FatFS文件系统移植
   FatFS也是一个开源项目,首页http://elm-chan.org/fsw/ff/00index_e.html
   它是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C语言编写,所以具有良好的硬件平台独立性,可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。它支持FATl2、FATl6和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化
   整个移植过程十分顺利。
  
   主要是修改了diskio.c文件中的几个文件,结果如下:
       /*-----------------------------------------------------------------------*/
        /* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2007        */
        /*-----------------------------------------------------------------------*/
        /* This is a stub disk I/O module that acts as front end of the existing */
        /* disk I/O modules and attach it to FatFs module with common interface. */
        /*-----------------------------------------------------------------------*/
        #include "sd_raw.h"
        #include "diskio.h"
       
        /*-----------------------------------------------------------------------*/
        /* Correspondence between physical drive number and physical drive.      */
       
        #define ATA        0
        #define MMC        1
        #define USB        2
       
        /*-----------------------------------------------------------------------*/
        /* Inidialize a Drive                                                    */
       
        DSTATUS disk_initialize (
            BYTE drv                /* Physical drive nmuber (0..) */
        )
        {
            DSTATUS res = RES_OK;
            drv = drv;
           
            if(!sd_raw_init())
                res = RES_ERROR;
           
            return res;
        }
       
        /*-----------------------------------------------------------------------*/
        /* Return Disk Status                                                    */
       
        DSTATUS disk_status (
            BYTE drv        /* Physical drive nmuber (0..) */
        )
        {
            DSTATUS stat = RES_OK;
            drv = drv;
       
            return stat;
        }
       
       
       
        /*-----------------------------------------------------------------------*/
        /* Read Sector(s)                                                        */
       
        DRESULT disk_read (
            BYTE drv,        /* Physical drive nmuber (0..) */
            BYTE *buff,        /* Data buffer to store read data */
            DWORD sector,    /* Sector address (LBA) */
            BYTE count        /* Number of sectors to read (1..255) */
        )
        {
            DRESULT res = RES_OK;
            drv = drv;   
           
            if(!sd_raw_read((sector << 9), buff, (count << 9)))
                res = RES_ERROR;
           
            return res;
        }
       
       


        /*-----------------------------------------------------------------------*/
        /* Write Sector(s)                                                       */
       
        #if _READONLY == 0
        DRESULT disk_write (
            BYTE drv,            /* Physical drive nmuber (0..) */
            const BYTE *buff,    /* Data to be written */
            DWORD sector,        /* Sector address (LBA) */
            BYTE count            /* Number of sectors to write (1..255) */
        )
        {
            DRESULT res = RES_OK;
            drv = drv;
       
            if(!sd_raw_write((sector << 9), buff, (count << 9)))
                res = RES_ERROR;
           
            return res;
        }
        #endif /* _READONLY */
       
       
       
        /*-----------------------------------------------------------------------*/
        /* Miscellaneous Functions                                               */
       
        DRESULT disk_ioctl (
            BYTE drv,        /* Physical drive nmuber (0..) */
            BYTE ctrl,        /* Control code */
            void *buff        /* Buffer to send/receive control data */
        )
        {
            DRESULT res = RES_OK;
            struct sd_raw_info info;
            drv = drv;
           
            if(!sd_raw_get_info(&info))
                return RES_ERROR;
           
            switch(ctrl)
            {
                case CTRL_SYNC:
                    break;
                   
                case GET_SECTOR_SIZE:
                    *((DWORD *)buff) = 512;
                    break;
                       
                case GET_SECTOR_COUNT:
                    *((DWORD *)buff) = info.capacity >> 9;
                    break;
                   
                case GET_BLOCK_SIZE:
                    *((DWORD *)buff) = 512;
                    break;
            }
           
            return res;
        }
       
        DWORD get_fattime (void)
        {
            return (29 << 25) + (8 << 21) + (8 << 16);
        }


  经过测试,可以正确读出SD卡中的文件系统。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条