原创 智林STM32开发板上的FatFS移植过程分析(十六)

2010-3-26 23:06 5606 8 9 分类: MCU/ 嵌入式

十六、编写底层接口程序disk_ioctl()函数<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


1、目的


1)为了调试f_mkfs函数,很快就要使用格式化文件系统命令,来格式化SD卡,这个函数里对disk_ioctl()函数有要求,比如获取SD卡的块总数、块的长度等


2添加命令format,格式化文件系统


2、函数输入参数分析


DRESULT disk_ioctl (


       BYTE drv,           /* Physical drive nmuber (0..) */


       BYTE ctrl,          /* Control code */


       void *buff            /* Buffer to send/receive control data */


)


第一个drv参数不用管它。第二个ctrl是控制代码,以下是代码类型:


/* Generic command */


#define CTRL_SYNC                    0     /* Mandatory for write functions */


#define GET_SECTOR_COUNT 1     /* Mandatory for only f_mkfs() */


#define GET_SECTOR_SIZE             2/* Mandatory for multiple sector size cfg */


#define GET_BLOCK_SIZE        3     /* Mandatory for only f_mkfs() */


#define CTRL_POWER                4


#define CTRL_LOCK                   5


#define CTRL_EJECT                  6


/* MMC/SDC command */


#define MMC_GET_TYPE          10


#define MMC_GET_CSD                   11


#define MMC_GET_CID                    12


#define MMC_GET_OCR                  13


#define MMC_GET_SDSTAT            14


第三个 Void *buf参数用于将控制处理的结果返回。


3SD卡参数的获取方法


我原来写SD卡驱动的时候写了一个函数:u8 SD_GetCardInfo( CardInfo * CardInfoPtr )可以获得SD卡的信息:其原理是通过读取CSD寄存器共16个字节,然后通过数据分析得到四个信息,包含在CardInfo结构体中。


typedef struct {


u32 BlockNumber;    //扇区的数量


u16 BlockLength;            //扇区的数目


u32 Capacity;                   //SD卡的总容量


u8 EraseBlockCount;             //可擦除的最大扇区数目


} CardInfo;


 


4disk_ioctl()函数的实现代码


DRESULT disk_ioctl (


       BYTE drv,           /* Physical drive nmuber (0..) */


       BYTE ctrl,          /* Control code */


       void *buff            /* Buffer to send/receive control data */


)


{


   CardInfo SDCard;


   if ( SD_GetCardInfo ( &SDCard ) ) return RES_NOTRDY;


   switch ( ctrl ){


         case GET_SECTOR_COUNT:


                    *(u32*)buff = (u32) SDCard.BlockNumber;


                       break;


               case GET_SECTOR_SIZE:


                    *(u16*)buff = (u16) SDCard.BlockLength;


                       break;


               case GET_BLOCK_SIZE:


                    *(u32*)buff = (u32) SDCard.EraseBlockCount;


                       break;


               default:


                    break;


       }


   return RES_OK;


}


编译,下载成功,明天可以调试 f_mkfs()这个函数了。看文件系统是怎么建立起来的。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户562341 2010-3-30 17:47

很强!!!
相关推荐阅读
nthq2004 2010-05-08 20:04
USB自定义设备驱动02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  本来还想编写应用程序测试一下自定...
nthq2004 2010-05-07 21:35
USB自定义设备驱动01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、USB设备驱动入门1、学习目...
nthq2004 2010-05-04 21:01
智林开发板上实现自定义的USB HID设备
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、自定义HID设备的相关概念1...
nthq2004 2010-05-01 21:58
U盘例程在智林开发板上的移植
 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 一、移植前的准备工作1、有哪些操...
nthq2004 2010-04-30 19:19
U盘实现流程跟踪分析02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   二、追踪USB大容量设备的实现...
nthq2004 2010-04-27 21:51
U盘实现流程跟踪分析01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   一、追踪USB大容量设备的实现...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条