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;
}
Esempio n. 2
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);
      */
    }
}
Esempio n. 3
0
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;
}
Esempio n. 6
0
File: mmc.c Progetto: MaxGekk/ZigZag
unsigned char mmcWriteBuf(unsigned long sector)
{
   return mmcWriteBlock(sector << 9, 512, mmc_buffer);
}