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