?? ide.c
字號(hào):
/*
;*****************************************************************************************************
;* Copyright (c) 2006 by JiaoJinXing.
;* All rights reserved.
;*
;*---- 文件信息 --------------------------------------------------------------------------------------
;* 文 件 名 : IDE.c
;* 創(chuàng) 建 人 : 焦進(jìn)星
;* 描 述 : 磁盤驅(qū)動(dòng)文件
;*
;*---- 歷史版本信息 ----------------------------------------------------------------------------------
;* 日 期 : 2008年 12 月 15 日
;* 創(chuàng) 建 人 : 焦進(jìn)星
;* 描 述 : 建立版本 V1.0.0
;*
;*---- 聯(lián)系方式 --------------------------------------------------------------------------------------
;* Email : wyoujtg@163.com
;* Web : http://wyoujtg.blog.163.com
;*****************************************************************************************************
;*/
#include "minifs.h"
/*
;*****************************************************************************************************
;* 描 述 : 移植時(shí)只需完成以下三個(gè)函數(shù)
;*****************************************************************************************************
;*/
/*
;*****************************************************************************************************
;* 函數(shù)名稱 : Init_IDE
;* 描 述 : 初始化IDE
;* 輸 入 : 無(wú)
;*
;* 輸 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 Init_IDE(void)
{
#ifdef WINDOWS
return TRUE;
#endif
#ifdef AVR_MMC
void PutStr(char *Str);
uint16 timeout = 0;
uint8 i = 0;
uint8 cmd[] = {0x40, 0x00, 0x00, 0x00, 0x00, 0x95};
SPI_Init();
DelayMs(500);
/* 發(fā)送一定數(shù)量的時(shí)鐘脈沖 */
for (i = 0; i < 0x10; i++)
{
SPI_SendData(0XFF);
}
/* 發(fā)送CMD0 */
if (MMC_SendCMD(cmd) != 0X01)
{
return FALSE;
}
/* 發(fā)送CMD1 */
cmd[0] = 0X41;
cmd[5] = 0XFF;
while (MMC_SendCMD(cmd) != 0X00)
{
if (timeout++ > 0XFFFE) /* 等待初始化完成 */
{
return FALSE; /* 容量大的MMC卡需要比較長(zhǎng)時(shí)間 */
}
}
SPI_HiSPD(); /* 提高M(jìn)CU SPI速度 */
return TRUE;
#endif
return FALSE;
}
/*
;*****************************************************************************************************
;* 函數(shù)名稱 : ReadIDESector
;* 描 述 : 讀IDE指定扇區(qū)
;* 輸 入 : SecIndex: 扇區(qū)號(hào); Buf: 扇區(qū)內(nèi)容存入的地址
;*
;* 輸 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 ReadIDESector(uint32 SecIndex, uint8 *Buf)
{
#ifdef WINDOWS
FILE *fp = fopen(DISK_MOUNT_FILE, "rb");
if (fp != NULL)
{
fseek(fp, (SecIndex*512), SEEK_SET);
fread(Buf, 1, 512, fp);
fclose(fp);
return TRUE;
}
#endif
#ifdef AVR_MMC
uint16 i;
uint8 cmd[] = {0x40, 0x00, 0x00, 0x00, 0x00, 0xff};
cmd[0] = 0X40 + 17; /* READ SINGLE BLOCK */
SecIndex = SecIndex << 9; /* address*512,取512的整數(shù)倍 */
cmd[1] = (SecIndex>>24);
cmd[2] = (SecIndex>>16);
cmd[3] = (SecIndex>>8);
cmd[4] = (SecIndex>>0);
if (MMC_SendCMD(cmd) != 0X00) /* 發(fā)送CMD17 */
{
return FALSE; /* 讀取失敗 */
}
while (SPI_SendData(0XFF) != 0XFE)
{
__asm__ __volatile__("nop"); /* 等待數(shù)據(jù)接受開始,受到0XFE表示開始 */
}
for (i = 0; i < 512; i++) /* 讀取數(shù)據(jù) */
{
*Buf++ = SPI_SendData(0XFF);
}
SPI_SendData(0XFF); /* 取走CRC字節(jié) */
SPI_SendData(0XFF);
return TRUE;
#endif
return FALSE;
}
/*
;*****************************************************************************************************
;* 函數(shù)名稱 : WriteIDESector
;* 描 述 : 寫IDE指定扇區(qū)
;* 輸 入 : SecIndex: 扇區(qū)號(hào); Buf: 要寫入的內(nèi)容
;*
;* 輸 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 WriteIDESector(uint32 SecIndex, uint8 *Buf)
{
#ifdef WINDOWS
FILE *fp = fopen(DISK_MOUNT_FILE, "rb+");
if (fp != NULL)
{
fseek(fp, (SecIndex*512), SEEK_SET);
fwrite(Buf, 1, 512, fp);
fclose(fp);
return TRUE;
}
#endif
#ifdef AVR_MMC
uint16 i;
uint8 temp;
uint8 cmd[] = {0x40, 0x00, 0x00, 0x00, 0x00, 0xff};
cmd[0] = 0x40 + 24; /* WRITE SINGLE BLOCK */
SecIndex = SecIndex << 9; /* address*512,取512的整數(shù)倍 */
cmd[1] = (SecIndex>>24);
cmd[2] = (SecIndex>>16);
cmd[3] = (SecIndex>>8);
cmd[4] = (SecIndex>>0);
if (MMC_SendCMD(cmd) != 0X00) /* 發(fā)送CMD24 */
{
return FALSE; /* 寫入失敗 */
}
SPI_SendData(0XFF); /* 發(fā)送填沖字節(jié) */
SPI_SendData(0XFE); /* 發(fā)送數(shù)據(jù)開始標(biāo)志0XFE */
for(i = 0; i < 512; i++) /* 寫入數(shù)據(jù) */
{
SPI_SendData(Buf[i]);
}
SPI_SendData(0XFF); /* 寫入CRC字節(jié) */
SPI_SendData(0XFF);
temp = SPI_SendData(0XFF); /* 讀取XXX0 0101字節(jié) */
temp = temp & 0X1F;
if (temp != 0X05)
{
return FALSE; /* 寫入失敗 */
}
while (SPI_SendData(0XFF) == 0X00)
{
__asm__ __volatile__("nop"); /* BUSY等待 */
}
return TRUE;
#endif
return FALSE;
}
/*
;*****************************************************************************************************
;* End of File
;*****************************************************************************************************
;*/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -