📄 mstick.c
字号:
/*
* 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 + -