十六、编写底层接口程序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参数用于将控制处理的结果返回。
3、SD卡参数的获取方法
我原来写SD卡驱动的时候写了一个函数:u8 SD_GetCardInfo( CardInfo * CardInfoPtr )可以获得SD卡的信息:其原理是通过读取CSD寄存器共16个字节,然后通过数据分析得到四个信息,包含在CardInfo结构体中。
typedef struct {
u32 BlockNumber; //扇区的数量
u16 BlockLength; //扇区的数目
u32 Capacity; //SD卡的总容量
u8 EraseBlockCount; //可擦除的最大扇区数目
} CardInfo;
4、disk_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()这个函数了。看文件系统是怎么建立起来的。
用户562341 2010-3-30 17:47