📄 smmc_test.c
字号:
/***************************************************************************
* Copyright Faraday Technology Corp 2002-2003. All rights reserved. *
*--------------------------------------------------------------------------*
* Name:SMC_TEST.c *
* Description: A test program for SmartMedia Card *
* Author: W.D.Shih *
****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "filectrl.h"
#include "command.h"
#include "fLib.h"
#include "smmc.h"
#include "cpe.h"
#include "serial.h"
#include "dma.h"
#include "fLib.h"
#include "cf.h"
#include "sd.h"
#define CF_DMA_CHANNEL 0
#define SD_DMA_CHANNEL 2
extern int ChipID;
extern SMCardStruct fLib_SMCard;//smmc.c
extern UINT32 CurrentDrive; //FILECTRL.c
extern FileSysStruct *FileSysTable[MAX_FILE_SYS_SUPPORT + 1];//FILECTRL.c
SMCardStruct tNANDCard;
//SMCardStruct *CurrCard;
extern CFCardStruct fLib_CFCard;
extern SDCardStruct fLib_SDCard;
extern BOOL CPRM_Order_Change;
BOOL fLib_DiskCopy(SMCardStruct *SMCard, SMCardStruct *tNANDCard);
UINT32 SMC_SectorReadCmd(CommandTableStruct_T *CmdTable);
UINT32 SMC_SectorWriteCmd(CommandTableStruct_T *CmdTable);
UINT32 SMC_DirCmd(CommandTableStruct_T *CmdTable);
UINT32 SMC_ChangeDirCmd(CommandTableStruct_T *CmdTable);
UINT32 SMC_MakeCmd(CommandTableStruct_T *CmdTable);
UINT32 SMC_DeleteCmd(CommandTableStruct_T *CmdTable);
UINT32 SMC_RenameCmd(CommandTableStruct_T *CmdTable);
UINT32 SMC_CopyCmd(CommandTableStruct_T *CmdTable);
UINT32 SMC_ReadFileCmd(CommandTableStruct_T *CmdTable);
static UINT32 QuitCmd(CommandTableStruct_T *CmdTable);
static BOOL ChangeDrive(char drive);
static const CommandTableStruct_T SM_CmdTable[] =
{
{{"sr", NULL,}, "sr sector_num sector_count\n",
0, 0, 2, 2, 0, 0, SMC_SectorReadCmd, 0, 0,
{
{IS_NUM|IS_USER_SYMBOL, NULL, 0, FALSE, "sector_num - which sector to read\n"},
{IS_NUM|IS_USER_SYMBOL, NULL, 0, FALSE, "sector_count - number of sectors to read\n"},
},
},
{{"sw", NULL,}, "sw pattern sector_num sector_count card_device_ID\n",
0, 0, 3, 3, 0, 0, SMC_SectorWriteCmd, 0, 0,
{
{IS_NUM|IS_USER_SYMBOL, NULL, 0, FALSE, "pattern - data to write\n"},
{IS_NUM|IS_USER_SYMBOL, NULL, 0, FALSE, "sector_num - which sector to write\n"},
{IS_NUM|IS_USER_SYMBOL, NULL, 0, FALSE, "sector_count - number of sectors to write\n"},
},
},
{{"dir", NULL,}, "dir [directory/file]\n",
0, 0, 1, 0, 0, 0, SMC_DirCmd, 0, 0,
{
{IS_STR, NULL, 0, FALSE, "[directory/file] - directory or file\n"},
},
},
{{"cd", NULL,}, "cd [directory]\n",
0, 0, 1, 1, 0, 0, SMC_ChangeDirCmd, 0, 0,
{
{IS_STR, NULL, 0, FALSE, "[directory] - directory\n"},
},
},
{{"mk", NULL,}, "mk [name] [-d]\n",
0, 0, 1, 1, 1, 0, SMC_MakeCmd, 0, 0,
{
{IS_STR, NULL, 0, FALSE, "[name] - file or directory name\n"},
},
{
{"-d", IS_NULL, {NULL,}, NULL, 0, FALSE, "[-d] - [name] is directory\n"},
},
},
{{"remove", "del", NULL,}, "remove/del [name] [-d]\n",
0, 0, 1, 1, 1, 0, SMC_DeleteCmd, 0, 0,
{
{IS_STR, NULL, 0, FALSE, "[name] - file or directory name\n"},
},
{
{"-d", IS_NULL, {NULL,}, NULL, 0, FALSE, "[-d] - [name] is directory\n"},
},
},
{{"rename", "ren", NULL,}, "rename/ren old_name new_name\n",
0, 0, 2, 2, 0, 0, SMC_RenameCmd, 0, 0,
{
{IS_STR, NULL, 0, FALSE, "old_name -\n"},
{IS_STR, NULL, 0, FALSE, "new_name -\n"},
},
},
{{"copy", "cp", NULL,}, "copy/cp src_file dst_file\n",
0, 0, 2, 2, 0, 0, SMC_CopyCmd, 0, 0,
{
{IS_STR, NULL, 0, FALSE, "src_file -\n"},
{IS_STR, NULL, 0, FALSE, "dst_file -\n"},
},
},
{{"quit","q", NULL,}, "quit/q\n",
0, 0, 1, 0, 0, 0, QuitCmd, 0, 0,
{
{IS_STR, NULL, 0, FALSE, "quit system\n"},
},
},
{NULL,
}
};
#define SMMC_DMA_CHANNEL 0
#define EXT_CPE_SMMC_BASE 0xb0f00000
#define READ_FILE_COMMAND 0xEF
#define QUIT_FILE_COMMAND 0xEE
int SMMC_main(int argc, int *argv[])
{
char Buf[80];
UINT32 mode;
UINT32 result;
UINT32 exit=FALSE;
printf("Select the mode: 1.PIO 2.DMA\r\n");
scanf("%d",&mode);
printf("\r");
fLib_DisableDCache();
#if ((CARD_TYPE & (SMMCard|NAND_FLASH))!=0)
Ext_CloseInt(IRQ_SMMC);
if (!Ext_ConnectInt(IRQ_SMMC, fLib_SMMC_InterruptHandler))
return FALSE;
Ext_SetIntTrig(IRQ_SMMC,LEVEL,H_ACTIVE);
Ext_EnableInt(IRQ_SMMC);
//fLib_InitDMA(FALSE, FALSE, 1 << SMMC_DMA_CHANNEL);
#endif
//configure NAND TYPE Flash
#if ((CARD_TYPE & NAND_FLASH)==NAND_FLASH)
///////////////////////////////////////////////////////////
//Initial first disk, On Board Flash
tNANDCard.Module = Module_0;
// Disk C 128MB = 0x4000000
if(mode==1)
fLib_SMCard_Init(&tNANDCard, EXT_CPE_SMMC_BASE, FALSE, 0x0, 'C');// 'C' Device size 0x8000000
else
fLib_SMCard_Init(&tNANDCard, EXT_CPE_SMMC_BASE, TRUE, 0x0, 'C');// 'C' Device size 0x8000000
#endif
//configure Smart Media cord
#if ((CARD_TYPE & SMMCard)==SMMCard)
// For Module Setting
fLib_SMCard.Module = Module_1; //Module_0;
if(mode==2)
fLib_SMCard_Init(&fLib_SMCard, EXT_CPE_SMMC_BASE, TRUE, 0x10000000, 'D');
else
fLib_SMCard_Init(&fLib_SMCard, EXT_CPE_SMMC_BASE, FALSE, 0x10000000, 'D'); // John Modified
#endif
//configure CF card
#if ((CARD_TYPE & CF_CARD)==CF_CARD)
//ivan for FPGA testing mode
if( ChipID == FPLAT_CPE120_ID2)
{
//ivan for new IP
if( ChipID == FPLAT_CPE120_ID2) //disale command interrupt
*(unsigned int *)(CPE_CF_BASE+4) |= 0x400;
fLib_CloseInt(IRQ_CFC_DMA);
if (!fLib_ConnectInt(IRQ_CFC_DMA, fLib_CFCntrInterruptHandler))
return FALSE;
//fLib_SetIntTrig(IRQ_CFC_CD,LEVEL,L_ACTIVE);
fLib_SetIntTrig(IRQ_CFC_DMA,LEVEL,H_ACTIVE); //ivan
fLib_EnableInt(IRQ_CFC_DMA);
}
else
{
fLib_CloseInt(IRQ_CFC_CD);
if (!fLib_ConnectInt(IRQ_CFC_CD, fLib_CFCntrInterruptHandler))
return FALSE;
fLib_SetIntTrig(IRQ_CFC_CD,LEVEL,L_ACTIVE);
fLib_EnableInt(IRQ_CFC_CD);
}
fLib_InitDMA(FALSE, FALSE, 1 << CF_DMA_CHANNEL);
// no-DMA, ATA-MEM
if(mode==1)
result=fLib_InitCFController(&fLib_CFCard, CPE_CF_BASE, FALSE, CF_DMA_CHANNEL, CF_MEM_MAP_MODE, 'E', SYS_CLK/2);
// DMA, ATA-MEM
else if(mode==2)
result=fLib_InitCFController(&fLib_CFCard, CPE_CF_BASE, TRUE, CF_DMA_CHANNEL, CF_MEM_MAP_MODE, 'E', SYS_CLK/2);
// DMA, ATA-IO
//if(!fLib_InitCFController(&fLib_CFCard, CPE_CF_BASE, TRUE , CF_DMA_CHANNEL, CF_IO_SECCH_MODE , 'C', SYS_CLK/2))
#endif
//configure SD card
#if ((CARD_TYPE & SD_CARD)==SD_CARD)
fLib_CloseInt(IRQ_SDC);
if (!fLib_ConnectInt(IRQ_SDC, fLib_SDCntrInterruptHandler))
return FALSE;
fLib_SetIntTrig(IRQ_SDC,EDGE,H_ACTIVE);
fLib_EnableInt(IRQ_SDC);
fLib_InitDMA(FALSE, FALSE, 1 << SD_DMA_CHANNEL);
//fLib_DisableDCache();
CPRM_Order_Change = FALSE;
// no DMA
if(mode==1)
result=fLib_SDHostInterfaceInit(&fLib_SDCard, CPE_SD_BASE, FALSE, SD_DMA_CHANNEL, 'F', SYS_CLK/2);
// DMA
else if(mode==2)
result=fLib_SDHostInterfaceInit(&fLib_SDCard, CPE_SD_BASE, TRUE, SD_DMA_CHANNEL, 'F', SYS_CLK/2);
#endif
if(fLib_InsertCommand(SM_CmdTable))
printf("Command initial\n");
fLib_InitUserSymbol(NULL);
ChangeDrive('C');
do{
printf("%c>>",(char)(CurrentDrive+'A'));
gets(Buf);
printf("\r");
if(Buf[1]==':'&& Buf[2]=='\0')
result=ChangeDrive(Buf[0]);
else
result=fLib_ExecuteCommand(Buf);
switch(result){
case QUIT_FILE_COMMAND:
exit=TRUE;
break;
case ERROR_COMMAND:
printf("bad command[0x%x]\n",ERROR_COMMAND);
break;
default:
exit=FALSE;
break;
}
printf("\n");
}while(!exit);
return result;
}
UINT32 SMC_SectorReadCmd(CommandTableStruct_T *CmdTable)
{
INT8 *Buf;
#if (SMMC_DEBUG==1)
int i;
#endif
// John add
/* if (((FileSysTable[CurrentDrive]->CardPtr)->MODULE_CONFIG & 0x01) == 0) { // eanble
printf("Module %d(3th parameter) doesn't be enabled !\n",CmdTable->Argu[2].Value);
return ERROR_COMMAND;
}*/
Buf = malloc(512 * 64);
if(!fLib_SMMC_ReadSector(FileSysTable[CurrentDrive]->CardPtr, CmdTable->Argu[0].Value, CmdTable->Argu[1].Value, 512, Buf))
printf("read error!!!\n");
else
printf("\nread OK!!!\n");
#if (SMMC_DEBUG==1)
for(i = 0; i < 512 * CmdTable->Argu[1].Value; i++)
{
if((i % 16) == 0)
printf("\n%0.4X ", i);
printf("%0.2X ", Buf[i]);
}
#endif
free(Buf);
return OK_COMMAND;
}
UINT32 SMC_SectorWriteCmd(CommandTableStruct_T *CmdTable)
{
INT8 *Buf;
int i;
Buf = malloc(512 * 64);
for(i = 0; i < 512*64;i++)
Buf[i] = CmdTable->Argu[0].Value + i;
if(!fLib_SMMC_WriteSector(FileSysTable[CurrentDrive]->CardPtr, CmdTable->Argu[1].Value, CmdTable->Argu[2].Value, 512, Buf))
{
printf("Write error!!!\n");
free(Buf);
return ERROR_COMMAND;
}
else
{
printf("Write OK!!!\n");
free(Buf);
return OK_COMMAND;
}
}
UINT32 SMC_DirCmd(CommandTableStruct_T *CmdTable)
{
INT8 *MsgStr;
MsgStr = malloc(0x800);
if(!fLib_DirDirectory((CmdTable->Argu[0].IsSet ? CmdTable->Argu[0].Str : NULL), MsgStr))
return ERROR_COMMAND;
printf(MsgStr);
free(MsgStr);
return OK_COMMAND;
}
UINT32 SMC_ChangeDirCmd(CommandTableStruct_T *CmdTable)
{
if(fLib_ChangeDirectory(CmdTable->Argu[0].Str))
{
printf("Change to %s directory OK!!!\n", CmdTable->Argu[0].Str);
return OK_COMMAND;
}
else
{
printf("Change to %s directory error!!!\n", CmdTable->Argu[0].Str);
}
return ERROR_COMMAND;
}
UINT32 SMC_MakeCmd(CommandTableStruct_T *CmdTable)
{
if(CmdTable->Opt[0].IsSet)
{
if(fLib_MakeDirectory(CmdTable->Argu[0].Str))
{
printf("Make %s directory OK!!!\n", CmdTable->Argu[0].Str);
return OK_COMMAND;
}
}
else
{
if(fLib_MakeEmptyFile(CmdTable->Argu[0].Str))
{
printf("Make %s file OK!!!\n", CmdTable->Argu[0].Str);
return OK_COMMAND;
}
}
printf("Make %s file or directory error!!!\n", CmdTable->Argu[0].Str);
return ERROR_COMMAND;
}
UINT32 SMC_DeleteCmd(CommandTableStruct_T *CmdTable)
{
if(CmdTable->Opt[0].IsSet)
{
if(fLib_DeleteDirectory(CmdTable->Argu[0].Str))
{
printf("Del %s directory OK!!!\n", CmdTable->Argu[0].Str);
return OK_COMMAND;
}
}
else
{
if(remove(CmdTable->Argu[0].Str) != -1)
{
printf("Del %s file OK!!!\n", CmdTable->Argu[0].Str);
return OK_COMMAND;
}
}
printf("Del %s directory or file error!!!\n", CmdTable->Argu[0].Str);
return ERROR_COMMAND;
}
UINT32 SMC_RenameCmd(CommandTableStruct_T *CmdTable)
{
if(rename(CmdTable->Argu[0].Str, CmdTable->Argu[1].Str) != 0)
{
printf("Can not rename %s file!!!\n", CmdTable->Argu[0].Str);
return ERROR_COMMAND;
}
printf("%s file has been rename to %s!\n", CmdTable->Argu[0].Str, CmdTable->Argu[1].Str);
return OK_COMMAND;
}
UINT32 SMC_CopyCmd(CommandTableStruct_T *CmdTable)
{
FILE *src, *dst;
INT8 *buf;
INT32 nRead;
UINT32 StartTime, EndTime;
if((src = fopen(CmdTable->Argu[0].Str, "r")) == NULL)
{
printf("Can not open %s file for reading\n", CmdTable->Argu[0].Str);
return ERROR_COMMAND;
}
if((dst = fopen(CmdTable->Argu[1].Str, "w")) == NULL)
{
printf("Can not open %s file for writting\n", CmdTable->Argu[1].Str);
fclose(src);
return ERROR_COMMAND;
}
buf = malloc(5000);
StartTime = clock();
while(!feof(src))
{
nRead = fread(buf, 1, 4096, src);
fwrite(buf, 1, nRead, dst);
}
EndTime = clock();
printf("Executes %d ticks\n", EndTime-StartTime);
fclose(dst);
fclose(src);
free(buf);
return OK_COMMAND;
}
BOOL fLib_DiskCopy(SMCardStruct *SMCard, SMCardStruct *tNANDCard)
{
UINT8 *Buf;
UINT32 i;
Buf = malloc(512*32*20);
for(i=0; i < SMCard->info_flash[2]; i++)
{
tNANDCard->look_up_table[i] = SMCard->look_up_table[i];
}
fLib_SMMC_ReadSector(SMCard, 0, (SMCard->info_flash[3])*20, (SMCard->info_flash[5]), Buf);
fLib_SMMC_WriteSector(tNANDCard, 0, (SMCard->info_flash[3])*20, (SMCard->info_flash[5]), Buf);
free(Buf);
return TRUE;
}
// quit file system
UINT32 QuitCmd(CommandTableStruct_T *CmdTable)
{
return QUIT_FILE_COMMAND;
}
//change drive
BOOL ChangeDrive(char drive)
{
char DriveIndex;
if ((drive>'a'))
drive -=0x20;
if((drive<'A')||(drive>'Z')){
return ERROR_COMMAND;
}
DriveIndex=drive-'A';
if(FileSysTable[DriveIndex]->init == FALSE){
printf("Drive %c is not found\n",drive);
return OK_COMMAND;
}
//CurrCard=FileSysTable[DriveIndex]->CardPtr;
CurrentDrive=DriveIndex;
return OK_COMMAND;
}
// End of file - SMC_TEST.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -