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

📄 mstick.c

📁 s3c24a0固件测试代码 ? ? ? ? ?啊 
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
 * FILE : mstick.c
 * Description:
 *	- Memory Stick Test Program
 * History:
 *	04/23/2002	Generated by NJU
 *	05/06/2002	Modified by _JS_
 *	Jan/01/2003 Modified by DonGo for S3C5410
*  May/xx/2003 Modified by DonGo for S3C24A0
 */

/*
* Test device: 32MB memory stick
* 32MB Device = 2048 Blocks.
* 1-Block 	= 32 pages.
* 1-Page 	= 512 Bytes.
*/

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "option.h"
#include "24A0addr.h"
#include "24A0lib.h"
#include "24A0slib.h"
#include "def.h"
#include "Mstick.h"
#include "MstickFmt.h"



#define	MSTICK_CLK			(20000000)	//Hz
#define	MSTICK_DAT_FIFO		(0x46108008)	// For S3C24A0. the Data fifo is different for each. 
#define	DMA_TX_FIFO_ADDR	(_NONCACHE_STARTADDRESS)
#define	DMA_RX_FIFO_ADDR	(_NONCACHE_STARTADDRESS+16+512)

#define	BLOCK_IN_DEVICE_NUM		(2048)
#define	PAGE_IN_BLOCK_NUM		(32)
#define	BYTE_INPAGE				(512)

U8 Int_Status;
int Stick_Ins=0;
int Mstick_Dma_Done=0;

void * mstick_func[][2]=
{
	(void *)Ms_Attr_Read,				"ATTR read        ",
	(void *)Ms_Reset,					"Mstcik reset     ",
	(void *)Test_Ms_Status_Read,		"Status Read      ",
	(void *)Test_Ms_Status_Write,		"Status Write     ",
	(void *)Test_Ms_Block_Erase,		"Block Erase      ",
	(void *)Test_Ms_Block_Write,		"Block Write      ", 
	(void *)Test_Ms_Block_Read, 		"Block Read       ",
	(void *)Test_Ms_Rw,					"R/W test         ",
	(void *)Test_Ms_Dma_Rw,				"R/W test(Dma)    ",
	(void *)Test_Ms_Page_Read,			"Page Read        ",
	(void *)Test_Ms_Page_Write,			"Page Write       ",
	(void *)Test_Ms_Page_Dma_Read,		"Page Read(Dma)   ",
	(void *)Test_Ms_Page_Dma_Write,		"Page Write(Dma)  ",
	(void *)Test_Ms_Extra_Read,			"RD Extra data    ",
	(void *)Test_Ms_Extra_Write,		"WR Extra data    ",
	(void *)Write_Mstick_Format_Data,	"WR Format data   ",
	(void *)Test_R_W_Hard,	            "Block R/W repeat test",
	0,0
};

void Ch32_MEMORY_STICK(void)
{
	int i;

	Uart_Printf("\nStart Mstick_Main...\n");

	
	Uart_Printf("Mstick Host init.\n");
	Init_Mstick_Host(MSTICK_CLK);


	Uart_Printf("Mstick Irq init.\n");
	Init_IrDA_Mstick_Irq();


	Uart_Printf("Insert Memory stick\n");
	// Wait until memory stick is inserted.
	do {
		Uart_Printf(".");
		Delay(5000);
	} while(Stick_Ins==0);
	Delay(4000);
	//Ms_Reset();

	
	while(1) {
		PrintSubMessage();
		Uart_Printf("\nSelect(-1 to exit): ");
		i = Uart_GetIntNum();
		//Uart_Printf("IN:%d.\n\n", i);
		if(i==-1) break;
		if(i>=0 && (i<(sizeof(mstick_func)/8)) ) 
	    ( (void (*)(void)) (mstick_func[i][0]) )();	// execute selected function.
		}

}

void PrintSubMessage(void)
{
	int i;
	
	
	i=0;	
	Uart_Printf("\n\n");
	while(1)
	{   //display menu
	    Uart_Printf("%2d:%s",i,mstick_func[i][1]);
	    i++;
	    if((int)(mstick_func[i][0])==0)
	    {
			Uart_Printf("\n");
			break;
	    }
	    if((i%4)==0) Uart_Printf("\n");
	}
}

void Test_Ms_Block_Read(void)
{
	U32 i;
	U32 blocknum, pagenum;
	U8 Read_Buffer[ONEPAGE_SIZE], Extra_Buffer[STATUS_SIZE];
	U16 In_Chksum, Calc_Chksum;

	Uart_Printf("Input Block # for read block : ");
	blocknum = Uart_GetIntNum();

	for(pagenum=0; pagenum<PAGE_IN_BLOCK_NUM; pagenum++) {
		Uart_Printf("Ms_Page_Read(%d,%d)\n", blocknum, pagenum);
		Ms_Page_Read(blocknum, pagenum, Extra_Buffer, Read_Buffer);

		// Calc checksum...
		for(Calc_Chksum=0, i=0; i<ONEPAGE_SIZE; i++) {
			Calc_Chksum += Read_Buffer[i];
		}
		In_Chksum = (U16)Extra_Buffer[4] | (U16)(((U16)Extra_Buffer[5])<<8);
		if(Calc_Chksum!=In_Chksum) {
			Uart_Printf("Checksum ERROR(IN:%x,Calc:%x)\n", In_Chksum, Calc_Chksum);
		}
		
		#if 1

		Uart_Printf("\nExtra data is");
		for(i=0; i<EXTRA_SIZE; i++) {
			if(!(i%16)) Uart_Printf("\n%3x:  ", i);
			Uart_Printf("[%02x]", Extra_Buffer[i]);
		}

		Uart_Printf("\nRead Page data is");	
		for(i=0; i<ONEPAGE_SIZE; i++) {
			if(!(i%16)) Uart_Printf("\n%3x:  ", i);
			Uart_Printf("[%02x]", Read_Buffer[i]);
		}
		Uart_Printf("\n");
		#endif
	}

}

void Test_Ms_Block_Write(void)
{
	U32 i;
	U32 blocknum, pagenum;
	U8 Write_Buffer[ONEPAGE_SIZE];
	
	Uart_Printf("Input Block # for write block : ");
	blocknum = Uart_GetIntNum();

	for(i=0; i<ONEPAGE_SIZE; i++) 
		{
		Write_Buffer[i]=i;
		}

	for(pagenum=0; pagenum<PAGE_IN_BLOCK_NUM; pagenum++)
		{
		if(Ms_Page_Write(blocknum, pagenum, Write_Buffer)==-1)
			{
			Uart_Printf("Write protect is enabled...\n");
			}
		Uart_Printf("%d Page of %d BlockWriting is done ",pagenum,blocknum);
		}
}
 

void Test_Ms_Page_Read(void)
{
	U32 i;
	U32 blocknum, pagenum;
	U8 Read_Buffer[ONEPAGE_SIZE], Extra_Buffer[STATUS_SIZE];
	U16 In_Chksum, Calc_Chksum;

	Uart_Printf("\n<<page read>>\n");
	Uart_Printf("Block number ? ");
	blocknum = Uart_GetIntNum();
	Uart_Printf("Page number ? ");
	pagenum = Uart_GetIntNum();

	Uart_Printf("Ms_Page_Read(%d,%d)\n", blocknum, pagenum);
	
	Ms_Page_Read(blocknum, pagenum, Extra_Buffer, Read_Buffer);

	// Calc checksum...
	for(Calc_Chksum=0, i=0; i<ONEPAGE_SIZE; i++) {
		Calc_Chksum += Read_Buffer[i];
	}
	In_Chksum = (U16)Extra_Buffer[4] | (U16)(((U16)Extra_Buffer[5])<<8);
	if(Calc_Chksum!=In_Chksum) {
		Uart_Printf("Checksum ERROR(IN:%x,Calc:%x)\n", In_Chksum, Calc_Chksum);
	}
		
	#if 1
	Uart_Printf("\nExtra data is");
	for(i=0; i<EXTRA_SIZE; i++) {
		if(!(i%16)) Uart_Printf("\n%3x:  ", i);
		Uart_Printf("[%02x]", Extra_Buffer[i]);
	}

	Uart_Printf("\nRead Page data is");	
	for(i=0; i<ONEPAGE_SIZE; i++) {
		if(!(i%16)) Uart_Printf("\n%3x:  ", i);
		Uart_Printf("[%02x]", Read_Buffer[i]);
	}
	Uart_Printf("\n");
	#endif
}


void Test_Ms_Block_Erase(void)
{
	U32 blocknum;

	Uart_Printf("\n<<Block Erase>>\n");
	Uart_Printf("Block number ? ");
	blocknum = Uart_GetIntNum();
	
	Uart_Printf("Block erase(%d)\n", blocknum);
	Ms_Block_Erase(blocknum);
}
 

void Test_Ms_Status_Write(void)
{
	U32 i;
	U32 status_addr, status_size;
	U8 Status_Buffer[256];

	for(i=0; i<256; i++) Status_Buffer[i] = (U8)i;
	
	Uart_Printf("\n<<Status write>>\n");
	Uart_Printf("Input address : ");
	status_addr = Uart_GetIntNum();
	Uart_Printf("Input size : ");
	status_size = Uart_GetIntNum();

	Uart_Printf("Status write(%d,%d)\n", status_addr, status_size);
	Mstpc_Write_Status_Reg(status_addr, status_size, Status_Buffer);

	// Print status register.
	for(i=0; i<status_size; i++) {
		Uart_Printf("Status reg[%d]:%02x\n", i, Status_Buffer[i]);
	}
}


void Test_Ms_Status_Read(void)
{
	U32 i;
	U32 status_addr, status_size;
	U8 Status_Buffer[ONEPAGE_SIZE];

	Uart_Printf("\n<<Status read>>\n");
	Uart_Printf("Input address : ");
	status_addr = Uart_GetIntNum();
	Uart_Printf("Input size : ");
	status_size = Uart_GetIntNum();

	Uart_Printf("Status read(%02x,%02x)\n", status_addr, status_size);
	Mstpc_Read_Status_Reg(status_addr, status_size, Status_Buffer);

	// Print status register.
	Uart_Printf("Status register\n\t");
	for(i=0; i<(status_size); i++) {
		Uart_Printf("[%02x]", Status_Buffer[i]);
	}
	Uart_Printf("\n");
	
}


void Test_Ms_Extra_Write(void)
{
	U32 i;
	U32 blocknum, pagenum;
	//U16 Extra_Buffer[256];
	U8 Extra_Buffer[EXTRA_SIZE];
		
	Uart_Printf("\n<<Extra data write>>\n");
	Uart_Printf("Block number ? ");
	blocknum = Uart_GetIntNum();
	Uart_Printf("Page number ? ");
	pagenum = Uart_GetIntNum();

	Uart_Printf("\nMs_Extradata_write(%d,%d)\n", blocknum, pagenum);

	Uart_Printf("Write: ");
	for(i=0; i<EXTRA_SIZE; i++) {
		Extra_Buffer[i] = 0xff-(U8)i;
		Uart_Printf("[%02x]", Extra_Buffer[i]);
	}	
		
	Ms_Extra_Write(blocknum, pagenum, Extra_Buffer);
	
}


void Test_Ms_Extra_Read(void)
{
	U32 blocknum, pagenum;
	//U16 Read_Buffer[256];
	U8 Read_Buffer[ONEPAGE_SIZE];

	Uart_Printf("\n<<Extra data read>>\n");
	Uart_Printf("Block number ? ");
	blocknum = Uart_GetIntNum();
	Uart_Printf("Page number ? ");
	pagenum = Uart_GetIntNum();

	Uart_Printf("Ms_Extradata_Read(%d,%d)\n", blocknum, pagenum);
	Ms_Extra_Read(blocknum, pagenum, Read_Buffer);
}


void Test_Ms_Page_Write(void)
{
	U32 i, offset;
	U32 blocknum, pagenum;
	//U16 Write_Buffer[256];
	U8 Write_Buffer[ONEPAGE_SIZE];

	Uart_Printf("\n<<Page Write>>\n");
	Uart_Printf("Block number ? ");
	blocknum = Uart_GetIntNum();
	Uart_Printf("Page number ? ");
	pagenum = Uart_GetIntNum();
	Uart_Printf("Input Data offset : ");
	offset = Uart_GetIntNum();

	Uart_Printf("Page write(%d,%d)\n", blocknum, pagenum);

	for(i=0; i<ONEPAGE_SIZE; i++) {
		Write_Buffer[i]=i+offset;
		//if(!(i%8)) Uart_Printf("\n%3x:  ", i);
		//Uart_Printf("[%04x]", Write_Buffer[i]);
	}
	Uart_Printf("\n");
	
	//Uart_Printf("Block erase(%d,%d)\n", blocknum, pagenum);
	//Ms_Block_Erase(blocknum);
	
	Uart_Printf("Ms_Page_Write.\n");
	if(Ms_Page_Write(blocknum, pagenum, Write_Buffer)==-1) {
		Uart_Printf("Write protect is enabled...exit...\n");
	}
}


void Test_Ms_Rw(void)
{
	U32 i, error;
	static U32 sint=0x00;
	U32 blocknum, pagenum;
	U8 Write_Buffer[ONEPAGE_SIZE], Read_Buffer[ONEPAGE_SIZE], Extra_Buffer[EXTRA_SIZE];
	U16 In_Chksum, Calc_Chksum;
	
	Uart_Printf("\n<<Memory stick W/R test>>\n");
	Uart_Printf("Block number ? ");
	blocknum = Uart_GetIntNum();
	Uart_Printf("Page number ? ");
	pagenum = Uart_GetIntNum();

	//Uart_Printf("1. Init write buffer.");
	for(i=0; i<ONEPAGE_SIZE; i++) {
		Write_Buffer[i]=(U8)(i+sint);
		//if(!(i%8)) Uart_Printf("\n%3x:  ", i);
		//Uart_Printf("[%04x]", Write_Buffer[i]);
	}
	Uart_Printf("\n");
	
	//Uart_Printf("MS Block erase.\n");
	//Ms_Block_Erase(blocknum);
	
	Uart_Printf("Ms Page Write.\n");

	if(Ms_Page_Write(blocknum, pagenum, Write_Buffer)!=-1) {
		 
		Uart_Printf("Ms Page Read.\n");
		Ms_Page_Read(blocknum, pagenum, Extra_Buffer, Read_Buffer);
		// Calc checksum...
		for(Calc_Chksum=0, i=0; i<ONEPAGE_SIZE; i++) {
			Calc_Chksum += Read_Buffer[i];
		}
		In_Chksum = (U16)Extra_Buffer[4] | (U16)(((U16)Extra_Buffer[5])<<8);
		if(Calc_Chksum!=In_Chksum) {
			Uart_Printf("Checksum ERROR(IN:%x,Calc:%x)\n", In_Chksum, Calc_Chksum);
		}
		
		Uart_Printf("Verify...");
		for(i=0, error=0;i<ONEPAGE_SIZE;i++) {
			if(Write_Buffer[i]!=Read_Buffer[i]) {
				//if(error%4) Uart_Printf("\n");
				//Uart_Printf("Error[W:%4x, R:%4x]\n",Write_Buffer[i], Read_Buffer[i]);
				error ++;
			}
		}
		if(error!=0) {
			Uart_Printf("Error(%d)!\n", error);
		} else {	
			Uart_Printf("OK!\n");
		}
	} else {
		Uart_Printf("Write protect is enabled...exit...\n");
	}

}



/*
 *	function name 	: Init_Mstick_Host;
 *	purpose			: Initialize memory stick host controller register
 */
void Init_Mstick_Host(U32 Mstick_Freq)
{
	int div_val=8;

	// Find Mstick Frequency division value.
	for(div_val=0; div_val<3; div_val++) {
		if(((float)PCLK/(float)(1<<div_val))<=(float)Mstick_Freq) {
			break;
		}
	}
	Uart_Printf("[PCLK:%dHz], [div_val:%d]\n", PCLK, div_val);
	Uart_Printf("[MSTICK clk:%10.2fMHz]\n", (PCLK/(float)(1<<div_val))/1000000);

	rCLKCON = (rCLKCON & ~(3<<16)) | (1<<70) | (1<<16);	// SD clock off, Mstick clock on 
	Uart_Printf("rCLKCON:%x\b", rCLKCON);
	rMSPRE = CLK_EN | div_val;	// 1/4
	// PRE_EN [2]	: Prescaler control, 0:Disable, 1:Enable.
	// PRE_VAL[1:0]	: Prescaler value, 00:1/1, 01:1/2, 10:1/4, 11:1/8

	rMSFINTCON = DISABLE;
	// FIFO interrupt control, 0:only for XINT, 1:FIFO interrupt enablel


	// Reset Mstick host.
	rCTRL_STA = 1<<15;
	Delay(100);		// unit: 100us.
	rCTRL_STA = 0<<15;
	Delay(100);
	
	rCTRL_STA = 0<<15 | 0<<14 | 1<<13 | 0<<12 | 0<<11 | 7<<8;
	// RST[15]		: Internal logic reset. 0:clear reset, 1:reset
	// PWS[14]		: Power save mode, 0:normal mode, 1:Power save mode.
	// SIEN[13]		: Serial interface enable/disable. 0:disable, 1:enable.
	// Reserved[12]	: SBZ.
	// NOCRC[11]	: INT_CRC enable/disable. 0:enable, 1:disable.
	// BSYCNT[10:8]	: Busy timeout count. timeout time = BSYCNT*4+2[pclks].
	// INT_STA[7]	: interrupt status. 0:No interrupt, 1:interrupt generated
	// DRQ_STA[6]	: DMA request. 0:Not request, 1:requested.
	// reserved[5:4]
	// RBE_STA[3]	: Receive buffer empty(1:empty)
	// RBF_STA[2]	: Receive buffer full(1:full)
	// TBE_STA[1]	: Transmit buffer empty(1:empty)
	// TBF_STA[0]	: Transmit buffer full(1:full)
	
	rINS_CON = 1<<12;
	// INS_EN[12]		: INS port enable. 0:disbale, 1:enable.
	// INS_STA[4](R)	: INS port status. 0:High(No insert), 1:Low(Insert).

	rINTCTRL_STA = 1<<15 | 0<<14 | 1<<13;
	// INT_EN[15]		: Memory stick Interrupt enable/ disable control0 = Disable 1 = Enable
	// TR_INTEN[14]		: Data transfer interrupt enable/ disable control0 = Disable 1 = Enable
	// INS_INTEN[13]	: Insertion interrupt enable/ disable control0 = Disable 1 = Enable
	// Reserved[12:8]
	// INT_P_END(R)[7]	: Protocol end interrupt status(INT_P_END)0 = In progress 1 = Complete
	// INT_SIF(R)[6]	: Serial interface receive interrupt status0 = No interrupt 1 = Receive interrupt
	// INT_TR(R)[5]		: Data transfer request interrupt status0 = No request 1 = Request data transfer
	// INT_INS(R)[4]	: Insertion interrupt status 0 = No insertion 1 = Insertion
	// Reserved[3:2]
	// INT_CRC(R)[1]	: INT_CRC error interrupt status0 = No CRC error 1 = Occurred CRC error
	// INT_TOE(R)[0]	: Busy timeout error interrupt status0 = No timeout error 1 = Occurred timeout error


	rACMD_CON = 0<<15 | 0<<14;
	// ATPC_EN[15]		: Auto command operation enable/ disable control0 = Disable 1 = Enable
	// POL[14]			: Loading polarity control of the serial data input0 = Rising edge 1 = Falling edge

}


void Init_IrDA_Mstick_Irq(void)
{
	// Interrupt enable for memory stick insert interrupt.
	pISR_IrDA_MSTICK = (int)IrDA_Mstick_Irq;	// Set interrupt service routine.
	
	rINTMSK &= ~BIT_IrDA_MSTICK;	// Enable IrDA/Memory stick interrupt.
	rINTSUBMSK &= ~BIT_SUB_MSTICK;
}


/*
 *	function name 	: Ms_Reset
 *	purpose			: Memory stick(device) reset
 */
void Ms_Reset(void)
{
	Uart_Printf("Memory stick reset.\n");
	Mstpc_Set_Command(MS_RESET);

}


int MS_sleep(void)
{
	//int cnt=0;
	unsigned short IntStatus;

	Mstpc_Set_Command(MS_SLEEP);

	Int_Status = Mstpc_Get_Int(1, INT_CED);
	Uart_Printf("Page write cnt(%x).\n", Int_Status);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -