int mmc_multiWTstCmd(char **argv, unsigned short argc){ unsigned char *ptr; int stat; unsigned long i,start,end; unsigned short multi=1; if(argc<2){ printf("Error : too few arguments\r\n"); return -1; } if(argc>3){ printf("Error : too many arguments\r\n"); return -2; } //get start and end errno=0; start=strtoul(argv[1],NULL,0); end=strtoul(argv[2],NULL,0); if(errno){ printf("Error : could not parse arguments\r\n"); return 2; } if(argc>2){ if(!strcmp("single",argv[3])){ multi=0; }else if(!strcmp("multi",argv[3])){ multi=1; }else{ //unknown argument printf("Error : unknown argument \"%s\".\r\n",argv[3]); return -3; } } #ifndef ACDS_BUILD //TESTING: set line high P8OUT|=BIT0; #endif if(!multi){ //write each block in sequence for(i=start,ptr=NULL;i<end;i++,ptr+=512){ if((stat=mmcWriteBlock(i,ptr))!=MMC_SUCCESS){ printf("Error writing block %li. Aborting.\r\n",i); printf("%s\r\n",SD_error_str(stat)); return 1; } } }else{ //write all blocks with one command if((stat=mmcWriteMultiBlock(start,NULL,end-start))!=MMC_SUCCESS){ printf("Error with write. %i\r\n",stat); printf("%s\r\n",SD_error_str(stat)); return 1; } } #ifndef ACDS_BUILD //TESTING: set line low P8OUT&=~BIT0; #endif printf("Data written sucussfully\r\n"); return 0; }
void clearMMCCard() { if (initMMC() == MMC_SUCCESS) // card found { //card_state |= 1; memset(&mmc_buffer,0,512); mmcReadRegister (10, 16); mmc_buffer[7]=0; /*Clear first 1000 blocks*/ int blockClearCnt; for (blockClearCnt = 0; blockClearCnt < 2048; blockClearCnt++) { memset(&mmc_buffer,'0',512); mmcWriteBlock(512 * blockClearCnt); } /* // Fill first Block (0) with 'A' memset(&mmc_buffer,'0',512); //set breakpoint and trace mmc_buffer contents mmcWriteBlock(0); // Fill second Block (1)-AbsAddr 512 with 'B' memset(&mmc_buffer,'1',512); mmcWriteBlock(512); // Read first Block back to buffer memset(&mmc_buffer,0x00,512); mmcReadBlock(0,512); // Read first Block back to buffer memset(&mmc_buffer,0x00,512); mmcReadBlock(512,512); */ } }
void putCharToMMCBuffer(char c) { if (mmc_buffer_index < 512) { mmc_buffer[mmc_buffer_index] = c; mmc_buffer_index++; } else { mmc_buffer_index = 0; mmcWriteBlock(mmc_block_index); mmc_block_index += 512; memset(&mmc_buffer, 0x00, 512); mmcReadBlock(mmc_block_index - 512, 512); //pCDC.Write(&pCDC, mmc_buffer, 512); } }
int mmc_write(char **argv, unsigned short argc){ //pointer to buffer, pointer inside buffer, pointer to string unsigned char *buffer=NULL,*ptr=NULL,*string; //response from block write int resp; int i ; //get buffer, set a timeout of 2 secconds buffer=BUS_get_buffer(CTL_TIMEOUT_DELAY,2048); //check for error if(buffer==NULL){ printf("Error : Timeout while waiting for buffer.\r\n"); return -1; } //clear all bytes in buffer memset(buffer,0,512); //concatinate arguments into one big string with spaces in between for(ptr=buffer,i=1; i<=argc; i++){ string=(unsigned char*)argv[i]; while(*string!=0){ *ptr++=*string++; } *ptr++=' '; } //Terminate string *(ptr-1)=0; //write data resp=mmcWriteBlock(0,buffer); //check if write was successful if(resp==MMC_SUCCESS){ printf("data written to memeory\r\n"); }else{ printf("resp = 0x%04X\r\n%s\r\n",resp,SD_error_str(resp)); } //free buffer BUS_free_buffer(); return 0; }
//write LFSR pattern onto SD card sectors and read it back int mmc_TstCmd(char **argv, unsigned short argc){ int resp; char seed,*buffer=NULL; short lfsr; int j,count,tc,dat=DAT_LFSR,have_seed=0; unsigned long i,start,end; if(argc<2){ printf("Error : Too few arguments\r\n"); return 1; } errno=0; start=strtoul(argv[1],NULL,0); end=strtoul(argv[2],NULL,0); if(argc>=3){ //other arguments are optional for(i=3;i<=argc;i++){ if(!strcmp(argv[i],"LFSR")){ dat=DAT_LFSR; }else if(!strcmp(argv[i],"count")){ dat=DAT_COUNT; }else if(!strncmp("seed=",argv[i],sizeof("seed"))){ //parse seed seed=atoi(argv[i]+sizeof("seed")); have_seed=1; }else{ printf("Error : unknown argument \"%s\".\r\n",argv[i]); return 3; } } } if(!have_seed){ //seed LFSR from TAR seed=TAR; //not concerned about correct value so don't worry about diffrent clocks //make sure seed is not zero if(seed==0){ seed=1; } printf("seed = %i\r\n",(unsigned short)seed); } if(errno){ printf("Error : could not parse arguments\r\n"); return 2; } //get buffer, set a timeout of 2 secconds buffer=BUS_get_buffer(CTL_TIMEOUT_DELAY,2048); //check for error if(buffer==NULL){ printf("Error : Timeout while waiting for buffer.\r\n"); return -1; } #ifndef ACDS_BUILD //TESTING: set line high P8OUT|=BIT0; #endif //write to sectors for(i=start,lfsr=seed;i<=end;i++){ //fill with psudo random data for(j=0;j<512;j++){ buffer[j]=lfsr; //print out first few bytes /*if(j<20){ printf("0x%02X, ",buffer[j]); }*/ //get next in sequence lfsr=dat_next(lfsr,dat); } //printf("\r\n"); //write data resp=mmcWriteBlock(i,(unsigned char*)buffer); if(resp!=MMC_SUCCESS){ printf("Error : write failure for sector %i\r\nresp = 0x%04X\r\n%s\r\n",i,resp,SD_error_str(resp)); //free buffer BUS_free_buffer(); return -1; } } //read back sectors and check for correctness for(i=start,lfsr=seed,tc=0;i<=end;i++){ //clear block data memset(buffer,0,512); //read data from card resp=mmcReadBlock(i,(unsigned char*)buffer); if(resp!=MMC_SUCCESS){ printf("Error : read failure for sector %i\r\nresp = 0x%04X\r\n%s\r\n",i,resp,SD_error_str(resp)); //free buffer BUS_free_buffer(); return -1; } //compare to psudo random data for(j=0,count=0;j<512;j++){ //print out the first few bytes /*if(j<20){ printf("0x%02X =? 0x%02X, ",lfsr,buffer[j]); }*/ if(buffer[j]!=lfsr){ count++; //printf("Error found in byte %i in sector %i\r\n",j,i); //printf("Error b%i s%i\r\n",j,i); } //get next in sequence lfsr=dat_next(lfsr,dat); } //printf("\r\n"); if(count!=0){ printf("%i errors found in sector %i\r\n",count,i); tc+=count; } } #ifndef ACDS_BUILD //TESTING: set line low P8OUT&=~BIT0; #endif if(tc==0){ printf("All sectors read susussfully!\r\n"); } //free buffer BUS_free_buffer(); return 0; }
unsigned char mmcWriteBuf(unsigned long sector) { return mmcWriteBlock(sector << 9, 512, mmc_buffer); }