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

📄 mstick.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
			if(!(i%16)) printf("\n%3x:  ", i);
			printf("[%02x]", Write_Buffer[i]);
		#endif
	}

	// Write.
	Init_Mstick_Txdma();

	if(Ms_Page_Write_Dma(blocknum, pagenum, Write_Buffer) != -1) {

		// Read
		Init_Mstick_Rxdma();
	
		Ms_Page_Read_Dma(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);
		}

		// Verify.
		printf("Verify...");
		for(i=0, error=0;i<ONEPAGE_SIZE;i++) {
			if(Write_Buffer[i]!=Read_Buffer[i]) {
				printf("Err(%d)[W:%02x, R:%02x]\n",i, Write_Buffer[i], Read_Buffer[i]);
				error ++;
			}
		}
		printf("\n");
		
		if(error!=0) {
			printf("Error(%d)!\n", error);
		} else {	
			printf("OK!\n");
		}
	} else {
		printf("Write protect is enabled...exit...\n");
	}
}



void Init_Mstick_Txdma(void)
{

	printf("Init Mstick Tx Dma\n");

	pISR_DMA_SBUS = (unsigned)Dma_P_Irq;
	rINTMSK &= ~(BIT_DMA_SBUS);
	rINTSUBMSK &= ~(BIT_SUB_DMA1);
	

	rDISRC1 = DMA_TX_FIFO_ADDR;
	//	[30:0]	: PDMA3 initial source address register.
	
	rDISRCC1 = (0<<1) | (0<<0);
	// LOC[1]	: Source location, 0:AHB, 1:APB
	// INC[0]	: Address increment, 0:Increment, 1:Fixed

	rDIDST1 = MSTICK_DAT_FIFO;
	//	[30:0]	: PDMA3 initial destination address register.

	rDIDSTC1 = (1<<1) | (1<<0);
	// LOC[1]	: Source location, 0:AHB, 1:APB
	// INC[0]	: Address increment, 0:Increment, 1:Fixed

	rDCON1 = (1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(1<<20)|(ONEPAGE_SIZE/2)<<0;
	// DMD_HS[31]	: Mode select, 0:Demand, 1:Handshake.
	// SYNC[30]		: DREQ/DACK syncronization with 0:APB, 1:AHB. 
	// INT[29]		: CURR_TC Intr set, 0:Disable, 1:intr when CURR_TC=0.
	// TSZ[28]		: Transfer size. 0: Unit transfer, 1: burst transfer of length 4.
	// SERVMODE[27]	: Single/Whole service mode select, 0:single service, 1: whole service
	// Reserved[26:24]: Reserved with 000b.
	// SWHW_SEL[23]	: Select DMA source betwwen s/w(0) and h/w(1) request.
	// RELOAD[22]	: reload on/off, 0:auto reload, 1:no reload.
	// DSZ[21:20]	: Transfer data size, 0:byte, 1:Half word, 2:Word, 3:reserved.
	// TC[19:0]		: Initial transfer counter, max 1MB.
//	rDMASKTRIG1=(1<<1)|(0<<0);
	rDMAREQSEL1=(0xb<<1)|(0x1);

	
}

void Init_Mstick_Rxdma(void)
{
	//unsigned short Rx_Data_Fifo[ONEPAGE_SIZE/2];	// ONEPAGE_SIZE = 512.
	
	printf("Init Mstick Rx Dma\n");


	pISR_DMA_SBUS = (unsigned)Dma_P_Irq;
	rINTMSK &= ~(BIT_DMA_SBUS);
	rINTSUBMSK &= ~(BIT_SUB_DMA1);
	
	rDISRC1 = MSTICK_DAT_FIFO;	// rDAT_FIFO address.
	//	[30:0]	: PDMA3 initial source address register.
	
	rDISRCC1 = (1<<1) | (1<<0);
	// LOC[1]	: Source location, 0:AHB, 1:APB
	// INC[0]	: Address increment, 0:Increment, 1:Fixed

	rDIDST1 = DMA_RX_FIFO_ADDR;
	//	[30:0]	: PDMA3 initial destination address register.

	rDIDSTC1 = (0<<1) | (0<<0);
	// LOC[1]	: Source location, 0:AHB, 1:APB
	// INC[0]	: Address increment, 0:Increment, 1:Fixed

	rDCON1 = (1<<31) |(0<<30) |(1<<29) |(0<<28) |(0<<27)|(1<<22) |(1<<20) | (ONEPAGE_SIZE/2)<<0;
	// DMD_HS[31]	: Mode select, 0:Demand, 1:Handshake.
	// SYNC[30]		: DREQ/DACK syncronization with 0:APB, 1:AHB. 
	// INT[29]		: CURR_TC Intr set, 0:Disable, 1:intr when CURR_TC=0.
	// TSZ[28]		: Transfer size. 0: Unit transfer, 1: burst transfer of length 4.
	// SERVMODE[27]	: Single/Whole service mode select, 0:single service, 1: whole service
	// HWSRCSEL[26:24]: Select DMA request source for each PDMA, MSTICK: Ch0/Src6 or Ch3/Src5.
	// RELOAD[22]	: reload on/off, 0:auto reload, 1:no reload.
	// DSZ[21:20]	: Transfer data size, 0:byte, 1:Half word, 2:Word, 3:reserved.
	// TC[19:0]		: Initial transfer counter, max 1MB.
//	rDMASKTRIG1=(1<<1)|(0<<0);
	rDMAREQSEL1=(0xb<<1)|(0x1);

}

#if 0
void __irq Dma_P_Irq(void)
{
	if(!(rDCON1&(5<<24))) {
		printf("DMA irq source is not Mstick!!!\n");
	}
	else {
		Irq_Mstick_Dma();
	
		rINTSUBMSK |= BIT_SUB_DMA1;
		rINTMSK|= BIT_DMA_SBUS;
		ClearPending(BIT_DMA_SBUS);
	}
}

#else
void __irq Dma_P_Irq(void)
{
	Irq_Mstick_Dma();
	
	rINTSUBMSK |= BIT_SUB_DMA1;
	rINTMSK|= BIT_DMA_SBUS;
	ClearPending(BIT_DMA_SBUS);
}
#endif

void Irq_Mstick_Dma(void)
{
	Mstick_Dma_Done=1;
	Mstick_Dma_Done=1;

	//printf("Mstick_Dma interrupt.\n");
}

int Ms_Page_Write_Dma(unsigned int Block_Addr, unsigned int Page_Addr, unsigned char *Write_Buffer)
{
	//int i, cnt=0, j, dma_cnt=0;
	int i, dma_cnt=0;
	//unsigned short IntStatus1, IntStatus2;
	//unsigned char Extra_Buffer[EXTRA_SIZE], tmps[1];
	unsigned char Extra_Buffer[EXTRA_SIZE];
	//unsigned short Chksum, htmp;
	unsigned short Chksum;
	
	// Check if write protect...
	if(Check_Wp()==1) {	// Write protect is enabled.
		return -1;
	}

	// Init Write data.
	for(i=0; i<ONEPAGE_SIZE; i++)
	{
		*(unsigned char *)(DMA_TX_FIFO_ADDR+i) = Write_Buffer[i];
	}
	
	// 1. SET R/W address in device TPC
	Mstpc_Write_Rw_Reg_Addr(0x0, 0x0, 0x10, 0x6);

	// 2. Write_Reg TPC
	Mstpc_Write_Param_Reg(Block_Addr, 0x80, Page_Addr, DE_AREA);

	// make checksum...
	for(Chksum=0, i=0; i<ONEPAGE_SIZE; i++)
	{
		Chksum += Write_Buffer[i];
	}
	//printf("Write checksum is [%04x]\n", Chksum);
	
	// 2. Write checksum.
	Extra_Buffer[1] = (unsigned char)(Chksum>>8);
	Extra_Buffer[0] = (unsigned char)Chksum;
	Mstpc_Write_Status_Reg(CHKSUM_REG_START, CHKSUM_SIZE, Extra_Buffer);

	// 3. SET_CMD TPC
	Mstpc_Set_Command(BLOCK_WRITE);

	// 4.5.Get INT register
	Int_Status = Mstpc_Get_Int(1, INT_BREQ);
	//printf("Page write cnt(%x).\n", Int_Status);

	// 6. Write Page data.
	rTP_CMD = WRITE_PAGE_DATA | ONEPAGE_SIZE;

	// Write data through DMA
	rDMASKTRIG1 = (1<<1);		// DMA On.
	Led_Display(0xf);	// GPIO LOW
	while(Mstick_Dma_Done==0);
	
	Led_Display(0x0);	// GPIO HIGH
	while(!INT_P_END);

	rDMASKTRIG1 = (0<<1);		// DMA Off.

	// 7.8.GET INT.
	Int_Status = Mstpc_Get_Int(1, INT_CED);

	return 1;

}



void Ms_Page_Read_Dma(unsigned int Block_Addr, unsigned int Page_Addr, unsigned char *Extra_Buffer, unsigned char *Read_Buffer)
{

	//int i, cnt=0, j, dma_cnt=0;
	int i, dma_cnt=0;
	//unsigned short IntStatus1, IntStatus2;
	//unsigned short Calc_Chksum, In_Chksum, htmp;
	//unsigned char Status_Buffer[10];
	//unsigned int tmps[320];
	
	for(i=0; i<ONEPAGE_SIZE; i++) *(unsigned char *)(DMA_RX_FIFO_ADDR+i)=0x55;

	// 1. SET R/W address in device TPC
	Mstpc_Write_Rw_Reg_Addr(0x0, 0x00, 0x10, 0x6);

	// 2. Write_Reg TPC
	Mstpc_Write_Param_Reg(Block_Addr, 0x80, Page_Addr, DE_AREA);

	// 3. SET_CMD TPC
	Mstpc_Set_Command(BLOCK_READ);

	//#if CHKSUM_WRITE==1

	// 4.5. GET_INT
	Int_Status = Mstpc_Get_Int(1, INT_BREQ|INT_CED);
	//printf("Page read cnt(%x).\n", Int_Status);

	// 6. READ_REG, Read status register.
	//Mstpc_Read_Status_Reg(0x02,2, Status_Buffer);
	/*
	for(i=0; i<10; i++) {
		printf("[%x]", Status_Buffer[i]);
	}
	*/

	// 7. Read Extra Data Register
	if(Int_Status==INT_BREQ|INT_CED) {
		Mstpc_Read_Status_Reg(EXTRA_REG_START,EXTRA_SIZE, Extra_Buffer);
	}

	// 8. Read Page Data
	rTP_CMD = READ_PAGE_DATA | ONEPAGE_SIZE;

	// Get data through DMA.
	
	rDMASKTRIG1 = (1<<1);		// DMA On.
	while(Mstick_Dma_Done==0) {
		dma_cnt++;
	}
	while(!INT_P_END);

	rDMASKTRIG1 = (0<<1);		// DMA Off.
	
	for(i=0; i<ONEPAGE_SIZE; i++)
	{
		Read_Buffer[i] =*(unsigned char *)(DMA_RX_FIFO_ADDR+i);
	}

}



void Test_Ms_Page_Dma_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 Dma>>\n");
	printf("Block number ? ");
	blocknum = GetIntNum(); 
	printf("Page number ? ");
	pagenum = GetIntNum();
	printf("Ms_Page_Read(%d,%d)\n", blocknum, pagenum);

	// Init Mstick Dma IRQ.
	Init_IrDA_Mstick_Irq();

	// Init Mstick Rx dma.
	Init_Mstick_Rxdma();
	// Page read through DMA.
	Ms_Page_Read_Dma(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("\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");
	
}

void Test_Ms_Page_Dma_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 Dma>>\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);

	Init_IrDA_Mstick_Irq();

	for(i=0; i<ONEPAGE_SIZE; i++) {
		Write_Buffer[i]=i+offset;
		#if DEBUG_LEVEL>1
			if(!(i%16)) printf("\n%3x:  ", i);
			printf("[%02x]", Write_Buffer[i]);
		#endif
	}
	printf("\n");
	
	//printf("Block erase(%d,%d)\n", blocknum, pagenum);
	//Ms_Block_Erase(blocknum);
	
	printf("Ms_Page_Write.\n");
	Init_Mstick_Txdma();

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


void Write_Mstick_Format_Data(void)
{
	unsigned int i, error, pagenum=0, memory_cap;
	unsigned char Write_Buffer[ONEPAGE_SIZE], Read_Buffer[ONEPAGE_SIZE], Extra_Buffer[EXTRA_SIZE];

	printf("\n<<Memory stick Format>>\n");

	printf("Memory stick size select [0:32MB / 1:128MB / 2:32MBRead / 3:128MBRead] ? ");

	memory_cap = GetIntNum();

	Ms_Block_Erase(0);

	// Write 0-block, page 0-2.
	for(pagenum=0; pagenum<3; pagenum++) {
		for(i=0; i<ONEPAGE_SIZE; i++) {
			if(memory_cap%2) 	// 32MB
			Write_Buffer[i] = Format_Data_32MB[pagenum][i];
			else 	// 128MB
			Write_Buffer[i] = Format_Data_128MB[pagenum][i];
		}
		
		for(i=0; i<EXTRA_SIZE; i++){
			Extra_Buffer[i] = Format_Extra[pagenum][i];
		}

		if(memory_cap<2)
		{
			printf("Write Block:0, Page:%d.", pagenum);
			
			if(Ms_Fmt_Page_Write(0, pagenum, Write_Buffer, Extra_Buffer)!=-1) {
				Ms_Page_Read(0, pagenum, Extra_Buffer, Read_Buffer);
				printf("...");
				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");
			}
		}
		else
		{
			Ms_Page_Read(0, pagenum, Extra_Buffer, Read_Buffer);
			printf("...");
			for(i=0, error=0;i<ONEPAGE_SIZE;i++) {
				if(Write_Buffer[i]!=Read_Buffer[i]) {
					//if(error%4) printf("\n");
					//printf("Error(%xH)[W:%4x, R:%4x]\n",i, Write_Buffer[i], Read_Buffer[i]);
					error ++;
				}
			}
			if(error!=0) {
				printf("Error(%d)!\n", error);
			} else {	
				printf("OK!\n");
			}

		}

	}
}


int Ms_Fmt_Page_Write(unsigned int Block_Addr, unsigned int Page_Addr, unsigned char *Write_Buffer, unsigned char *Extra_Buffer)
{
	int i, cnt=0;
	//unsigned short IntStatus1, IntStatus2;
	//static int offset=0;
	//unsigned short Chksum, htmp;
	unsigned short htmp;
	
	//printf("write data.\n");

	// Check if write protect...
	if(Check_Wp()==1) {	// Write protect is enabled.
		return -1;
	}
	
	// 1. SET R/W address in device TPC
	Mstpc_Write_Rw_Reg_Addr(0x0, 0x0, 0x10, 0x6);

	// 2. Write_Reg TPC
	Mstpc_Write_Param_Reg(Block_Addr, PARAM_BAMD, Page_Addr, DE_AREA);

	Mstpc_Write_Status_Reg(EXTRA_REG_START, EXTRA_SIZE, Extra_Buffer);
	
	// SET_CMD TPC
	Mstpc_Set_Command(BLOCK_WRITE);

	// Get INT register
	Int_Status = Mstpc_Get_Int(1, INT_BREQ);
	//printf("Page write cnt(%x).\n", Int_Status);

	rTP_CMD = WRITE_PAGE_DATA | ONEPAGE_SIZE;
	for(i=0; i<ONEPAGE_SIZE; i+=2)
	{
		htmp = ((unsigned short)(Write_Buffer[i+1]))<<8 | (unsigned char)Write_Buffer[i];
		rDAT_FIFO = htmp;
		while(!TBE);
	}
	while(!INT_P_END);

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

}


void Test_R_W_Hard(void)
{
	//unsigned int i,re_num,offset;
	unsigned int i;
	unsigned int blocknum, pagenum;
	unsigned char Write_Buffer[ONEPAGE_SIZE];
	unsigned char Read_Buffer[ONEPAGE_SIZE], Extra_Buffer[STATUS_SIZE];
	unsigned short In_Chksum, Calc_Chksum;

	for(i=0; i<ONEPAGE_SIZE; i++) 
		{
	  	Write_Buffer[i]=i;
		}
while(1)
{
	for(blocknum=0;blocknum<8000;blocknum++)
		{
		Ms_Block_Erase(blocknum);
		for(pagenum=0; pagenum<PAGE_IN_BLOCK_NUM; pagenum++)
			{
			if(Ms_Page_Write(blocknum, pagenum, Write_Buffer)==-1)
				{
				printf("Write protect is enabled...\n");
				}
			}
		
		for(pagenum=0; pagenum<PAGE_IN_BLOCK_NUM; pagenum++) 
			{
				printf("\n\n\nMs_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) {
					while(1) printf("Checksum ERROR(IN:%x,Calc:%x)\n", In_Chksum, Calc_Chksum);
				}
				
				printf("Extra 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]);
				}
			}
		}
}
}

⌨️ 快捷键说明

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