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

📄 mstick.c

📁 三星s3c2460开发板完整功能测试代码
💻 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 "2460addr.h"
#include "2460lib.h"
#include "2460slib.h"
#include "def.h"
#include "Mstick.h"
#include "MstickFmt.h"
#include "PLL.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)

unsigned char 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 Ch29_MEMORY_STICK(void)
{
	int i;

	Ms_GPIO_Initial();
	
	printf("\nStart Mstick_Main...\n");

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


	printf("\nMstick Irq init.\n");
	Init_IrDA_Mstick_Irq();


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

	
	while(1) {
		PrintSubMessage();
		printf("\nSelect(-1 to exit): ");
		i = GetIntNum();
		//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 Ms_GPIO_Initial(void)
{
	printf("Memory stick GPIO initialize\n");
	rGPACON=(3<<16)|(3<<18)|(3<<20)|(3<<22);
	printf("rGPACON=%x\n",rGPACON);
}

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

void Test_Ms_Block_Read(void)
{
	unsigned int i;
	unsigned int blocknum, pagenum;
	unsigned char Read_Buffer[ONEPAGE_SIZE], Extra_Buffer[STATUS_SIZE];
	unsigned short In_Chksum, Calc_Chksum;

	printf("Input Block # for read block : ");
	blocknum = GetIntNum();

	for(pagenum=0; pagenum<PAGE_IN_BLOCK_NUM; pagenum++) {
		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 = (unsigned short)Extra_Buffer[4] | (unsigned short)(((unsigned short)Extra_Buffer[5])<<8);
		if(Calc_Chksum!=In_Chksum) {
			printf("Checksum ERROR(IN:%x,Calc:%x)\n", In_Chksum, Calc_Chksum);
		}
		
		#if 1

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

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

}

void Test_Ms_Block_Write(void)
{
	unsigned int i;
	unsigned int blocknum, pagenum;
	unsigned char Write_Buffer[ONEPAGE_SIZE];
	
	printf("Input Block # for write block : ");
	blocknum = 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)
			{
			printf("Write protect is enabled...\n");
			}
		printf("%d Page of %d BlockWriting is done ",pagenum,blocknum);
		}
}
 

void Test_Ms_Page_Read(void)
{
	unsigned int i;
	unsigned int blocknum, pagenum;
	unsigned char Read_Buffer[ONEPAGE_SIZE], Extra_Buffer[STATUS_SIZE];
	unsigned short In_Chksum, Calc_Chksum;

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

	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 = (unsigned short)Extra_Buffer[4] | (unsigned short)(((unsigned short)Extra_Buffer[5])<<8);
	if(Calc_Chksum!=In_Chksum) {
		printf("Checksum ERROR(IN:%x,Calc:%x)\n", In_Chksum, Calc_Chksum);
	}
		
	#if 1
	printf("\nExtra data is");
	for(i=0; i<EXTRA_SIZE; i++) {
		if(!(i%16)) printf("\n%3x:  ", i);
		printf("[%02x]", Extra_Buffer[i]);
	}

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


void Test_Ms_Block_Erase(void)
{
	unsigned int blocknum;

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

void Test_Ms_Status_Write(void)
{
	unsigned int i;
	unsigned int status_addr, status_size;
	unsigned char Status_Buffer[256];

	for(i=0; i<256; i++) Status_Buffer[i] = (unsigned char)i;
	
	printf("\n<<Status write>>\n");
	printf("Input address : ");
	status_addr = GetIntNum();
	printf("Input size : ");
	status_size = GetIntNum();

	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++) {
		printf("Status reg[%d]:%02x\n", i, Status_Buffer[i]);
	}
}


void Test_Ms_Status_Read(void)
{
	unsigned int i;
	unsigned int status_addr, status_size;
	unsigned char Status_Buffer[ONEPAGE_SIZE];

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

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

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


void Test_Ms_Extra_Write(void)
{
	unsigned int i;
	unsigned int blocknum, pagenum;
	//unsigned short Extra_Buffer[256];
	unsigned char Extra_Buffer[EXTRA_SIZE];
		
	printf("\n<<Extra data write>>\n");
	printf("Block number ? ");
	blocknum = GetIntNum();
	printf("Page number ? ");
	pagenum = GetIntNum();

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

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


void Test_Ms_Extra_Read(void)
{
	unsigned int blocknum, pagenum;
	//unsigned short Read_Buffer[256];
	unsigned char Read_Buffer[ONEPAGE_SIZE];

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

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


void Test_Ms_Page_Write(void)
{
	unsigned int i, offset;
	unsigned int blocknum, pagenum;
	//unsigned short Write_Buffer[256];
	unsigned char Write_Buffer[ONEPAGE_SIZE];

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

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

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

	i=Ms_Page_Write(blocknum, pagenum, Write_Buffer);
	printf("i=%d\n",i);
		

/*
	if((i=Ms_Page_Write(blocknum, pagenum, Write_Buffer))==-1) {
		printf("i=%d\n",i);
		printf("Write protect is enabled...exit...\n");

	}
*/

}


void Test_Ms_Rw(void)
{
	unsigned int i, error;
	static unsigned int sint=0x00;
	unsigned int blocknum, pagenum;
	unsigned char Write_Buffer[ONEPAGE_SIZE], Read_Buffer[ONEPAGE_SIZE], Extra_Buffer[EXTRA_SIZE];
	unsigned short In_Chksum, Calc_Chksum;
	
	printf("\n<<Memory stick W/R test>>\n");
	printf("Block number ? ");
	blocknum = GetIntNum();
	printf("Page number ? ");
	pagenum = GetIntNum();

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

	if(Ms_Page_Write(blocknum, pagenum, Write_Buffer)!=-1) {
		 
		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 = (unsigned short)Extra_Buffer[4] | (unsigned short)(((unsigned short)Extra_Buffer[5])<<8);
		if(Calc_Chksum!=In_Chksum) {
			printf("Checksum ERROR(IN:%x,Calc:%x)\n", In_Chksum, Calc_Chksum);
		}
		
		printf("Verify...");
		for(i=0, error=0;i<ONEPAGE_SIZE;i++) {
			if(Write_Buffer[i]!=Read_Buffer[i]) {
				//if(error%4) printf("\n");
				//printf("Error[W:%4x, R:%4x]\n",Write_Buffer[i], Read_Buffer[i]);
				error ++;
			}
		}
		if(error!=0) {
			printf("Error(%d)!\n", error);
		} else {	
			printf("OK!\n");
		}
	} else {
		printf("Write protect is enabled...exit...\n");
	}

}



/*
 *	function name 	: Init_Mstick_Host;
 *	purpose			: Initialize memory stick host controller register
 */
void Init_Mstick_Host(unsigned int 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;
		}
	}
	printf("[PCLK:%dHz], [div_val:%d]\n", PCLK, div_val);
	printf("[MSTICK clk:%10.2fMHz]\n", (PCLK/(float)(1<<div_val))/1000000);

	rPCLKCON =(rPCLKCON &~(1<<9))|(1<<8);	// SD clock off, Mstick clock on 
	printf("rCLKCON:%x\b", rPCLKCON);
	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_SDMMC_MS= (int)IrDA_Mstick_Irq;	// Set interrupt service routine.
	
	rINTMSK &= ~BIT_SDMMC_MS;	// Enable IrDA/Memory stick interrupt.
	rINTSUBMSK &= ~BIT_SUB_MSTICK;
}


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

}


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

⌨️ 快捷键说明

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