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

📄 mstick.c

📁 s3c24a0固件测试代码 ? ? ? ? ?啊 
💻 C
📖 第 1 页 / 共 3 页
字号:
	Uart_Printf("Offset value ? ");
	offset = Uart_GetIntNum();
	
	for(i=0; i<ONEPAGE_SIZE; i++) {
		Write_Buffer[i]=(U8)(i+offset);
		#if DEBUG_LEVEL>1
			if(!(i%16)) Uart_Printf("\n%3x:  ", i);
			Uart_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 = (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);
		}

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



void Init_Mstick_Txdma(void)
{

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

	pISR_DMA = (unsigned)Dma_P_Irq;
	rINTMSK &= ~(BIT_DMA);
	rINTSUBMSK &= ~(BIT_SUB_DMA3);
	

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

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

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

	rDCON3 = 1<<31 | 0<<30 | 1<<29 | 0<<28 | 0<<27 | 5<<24 | 1<<23 | 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.
}

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


	pISR_DMA = (unsigned)Dma_P_Irq;
	rINTMSK &= ~(BIT_DMA);
	rINTSUBMSK &= ~(BIT_SUB_DMA3);
	
	rDISRC3 = MSTICK_DAT_FIFO;	// rDAT_FIFO address.
	//	[30:0]	: PDMA3 initial source address register.
	
	rDISRCC3 = (1<<1) | (1<<0);
	// LOC[1]	: Source location, 0:AHB, 1:APB
	// INC[0]	: Address increment, 0:Increment, 1:Fixed

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

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

	rDCON3 = 1<<31 | 0<<30 | 1<<29 | 0<<28 | 0<<27 | 5<<24 | 1<<23 | 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.
	// 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.

}


void __irq Dma_P_Irq(void)
{
	if(!(rDCON3&(5<<24))) {
		Uart_Printf("DMA irq source is not Mstick!!!\n");
	}
	else {
		Irq_Mstick_Dma();
	
		rINTSUBMSK |= BIT_SUB_DMA3;
		rINTMSK|= BIT_DMA;
		ClearPending(BIT_DMA);
	}
}


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

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

int Ms_Page_Write_Dma(U32 Block_Addr, U32 Page_Addr, U8 *Write_Buffer)
{
	//int i, cnt=0, j, dma_cnt=0;
	int i, dma_cnt=0;
	//unsigned short IntStatus1, IntStatus2;
	//U8 Extra_Buffer[EXTRA_SIZE], tmps[1];
	U8 Extra_Buffer[EXTRA_SIZE];
	//U16 Chksum, htmp;
	U16 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++)
	{
		*(U8 *)(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];
	}
	//Uart_Printf("Write checksum is [%04x]\n", Chksum);
	
	// 2. Write checksum.
	Extra_Buffer[1] = (U8)(Chksum>>8);
	Extra_Buffer[0] = (U8)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);
	//Uart_Printf("Page write cnt(%x).\n", Int_Status);

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

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

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

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

}



void Ms_Page_Read_Dma(U32 Block_Addr, U32 Page_Addr, U8 *Extra_Buffer, U8 *Read_Buffer)
{

	//int i, cnt=0, j, dma_cnt=0;
	int i, dma_cnt=0;
	//unsigned short IntStatus1, IntStatus2;
	//U16 Calc_Chksum, In_Chksum, htmp;
	//U8 Status_Buffer[10];
	//U32 tmps[320];
	
	for(i=0; i<ONEPAGE_SIZE; i++) *(U8 *)(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);
	//Uart_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++) {
		Uart_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.
	
	rDMASKTRIG3 = (1<<1);		// DMA On.
	while(Mstick_Dma_Done==0) {
		dma_cnt++;
	}
	while(!INT_P_END);

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

}



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

	// 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 = (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("\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");
	
}

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

	Uart_Printf("\n<<Page Write Dma>>\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);

	Init_IrDA_Mstick_Irq();

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

	if(Ms_Page_Write_Dma(blocknum, pagenum, Write_Buffer)==-1) {
		Uart_Printf("Write protect is enabled...exit...\n");
	}
}


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

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

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

	memory_cap = Uart_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)
		{
			Uart_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);
				Uart_Printf("...");
				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");
			}
		}
		else
		{
			Ms_Page_Read(0, pagenum, Extra_Buffer, Read_Buffer);
			Uart_Printf("...");
			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(%xH)[W:%4x, R:%4x]\n",i, Write_Buffer[i], Read_Buffer[i]);
					error ++;
				}
			}
			if(error!=0) {
				Uart_Printf("Error(%d)!\n", error);
			} else {	
				Uart_Printf("OK!\n");
			}

		}

	}
}


int Ms_Fmt_Page_Write(U32 Block_Addr, U32 Page_Addr, U8 *Write_Buffer, U8 *Extra_Buffer)
{
	int i, cnt=0;
	//unsigned short IntStatus1, IntStatus2;
	//static int offset=0;
	//U16 Chksum, htmp;
	U16 htmp;
	
	//Uart_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);
	//Uart_Printf("Page write cnt(%x).\n", Int_Status);

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

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

}


void Test_R_W_Hard(void)
{
	//U32 i,re_num,offset;
	U32 i;
	U32 blocknum, pagenum;
	U8 Write_Buffer[ONEPAGE_SIZE];
	U8 Read_Buffer[ONEPAGE_SIZE], Extra_Buffer[STATUS_SIZE];
	U16 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)
				{
				Uart_Printf("Write protect is enabled...\n");
				}
			}
		
		for(pagenum=0; pagenum<PAGE_IN_BLOCK_NUM; pagenum++) 
			{
				Uart_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 = (U16)Extra_Buffer[4] | (U16)(((U16)Extra_Buffer[5])<<8);
				if(Calc_Chksum!=In_Chksum) {
					while(1) Uart_Printf("Checksum ERROR(IN:%x,Calc:%x)\n", In_Chksum, Calc_Chksum);
				}
				
				Uart_Printf("Extra 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]);
				}
			}
		}
}
}

⌨️ 快捷键说明

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