⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smmc_test.c

📁 FIC8120方案的 StartCell_Driver
💻 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 + -