int mmc_dump(char **argv, unsigned short argc){ int resp; char *buffer=NULL; unsigned long sector=0; int i; //check if sector given if(argc!=0){ //read sector if(1!=sscanf(argv[1],"%ul",§or)){ //print error printf("Error parsing sector \"%s\"\r\n",argv[1]); return -1; } } //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; } //read from SD card resp=mmcReadBlock(sector,(unsigned char*)buffer); //print response from SD card printf("%s\r\n",SD_error_str(resp)); //print out buffer for(i=0;i<512/16;i++){ printf(HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR "\r\n", buffer[i*16],buffer[i*16+1],buffer[i*16+2],buffer[i*16+3],buffer[i*16+4],buffer[i*16+5],buffer[i*16+6],buffer[i*16+7],buffer[i*16+8],buffer[i*16+9],buffer[i*16+10], buffer[i*16+11],buffer[i*16+12],buffer[i*16+13],buffer[i*16+14],buffer[i*16+15]); } //free buffer BUS_free_buffer(); return 0; }
int pictlist_Cmd(char **argv,unsigned short argc){ IMG_DAT *block; int found,i,num; int res; ticker time; unsigned short check; // locate pictures on SD card block=(IMG_DAT*)BUS_get_buffer(CTL_TIMEOUT_DELAY,1000); if(block==NULL){ printf("Error: Buffer busy\r\n"); return -2; } //print header printf("Slot\tImage\tBlocks\t Timestamp\r\n"); //look at all the images for(i = 0,num=0; i < NUM_IMG_SLOTS; i++){ //read from SD card res=mmcReadBlock(IMG_ADDR_START+i*IMG_SLOT_SIZE,(unsigned char*)block); if(res==MMC_SUCCESS){ //check block type if(block->magic==BT_IMG_START){ //calculate CRC check=crc16(block,sizeof(*block)-sizeof(block->CRC)); //check if CRC's match if(check==block->CRC){ num++; //time is at the beginning of data time=*(ticker*)block->dat; //print info printf("%4i\t%5i\t%6i\t%10lu\r\n",i,block->num,block->block,time); } } }else{ printf("Error Reading from SD card %s\r\n",SD_error_str(res)); break; } } BUS_free_buffer(); //check how many images were found switch(num){ case 0: printf("\r\nNo images found in memory\r\n"); break; case 1: printf("\r\n1 image in memory\r\n"); break; default: printf("\r\nThere are %i images in memory\r\n",num); break; } return 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_read(char **argv, unsigned short argc){ char *ptr=NULL,*buffer=NULL; int resp; //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; } //init buffer memset(buffer,0,513); //read from SD card resp=mmcReadBlock(0,(unsigned char*)buffer); //check for error if(resp!=MMC_SUCCESS){ //print error from SD card printf("%s\r\n",SD_error_str(resp)); return 1; } //force termination after last byte buffer[512]=0; //check for non printable chars for(ptr=(char*)buffer;ptr!=0;ptr++){ //check for non printable chars if(!isprint(*ptr)){ //check for null if(*ptr){ //not null, non printable char encountered printf("String prematurely terminated due to a non printable character.\r\n"); } //terminate string *ptr=0; //exit loop break; } } //print out the string printf("Here is the string you wrote:\r\n\'%s\'\r\n",buffer); //free buffer BUS_free_buffer(); return 0; }
int mmc_multiRTstCmd(char **argv, unsigned short argc){ unsigned char *ptr,*buffer; int resp; 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 -4; } if((end-start)*512>BUS_get_buffer_size()){ printf("Error : data size too large for buffer.\r\n"); return -5; } 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; } } //get buffer, set a timeout of 2 secconds buffer=BUS_get_buffer(CTL_TIMEOUT_DELAY,2048); #ifndef ACDS_BUILD //TESTING: set line high P8OUT|=BIT0; #endif if(!multi){ //write each block in sequence for(i=start,ptr=buffer;i<end;i++,ptr+=512){ if((resp=mmcReadBlock(i,ptr))!=MMC_SUCCESS){ printf("Error reading block %li. Aborting.\r\n",i); printf("%s\r\n",SD_error_str(resp)); //free buffer BUS_free_buffer(); return 1; } } }else{ //write all blocks with one command if((resp=mmcReadBlocks(start,end-start,buffer))!=MMC_SUCCESS){ printf("Error with read.\r\n"); printf("resp = 0x%04X\r\n%s\r\n",resp,SD_error_str(resp)); //free buffer BUS_free_buffer(); return 1; } } #ifndef ACDS_BUILD //TESTING: set line low P8OUT&=~BIT0; #endif //print out buffer for(i=0;i<(end-start)*512/16;i++){ printf(HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR HEXOUT_STR "\r\n", buffer[i*16],buffer[i*16+1],buffer[i*16+2],buffer[i*16+3],buffer[i*16+4],buffer[i*16+5],buffer[i*16+6],buffer[i*16+7],buffer[i*16+8],buffer[i*16+9],buffer[i*16+10], buffer[i*16+11],buffer[i*16+12],buffer[i*16+13],buffer[i*16+14],buffer[i*16+15]); } printf("Data read sucussfully\r\n"); //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; }
void parseSettings(char data[MSG_SIZE]) { int i; int settings_size; char cmdDelim[] = "#"; char *cmdParts = NULL; cmdParts = strtok( data, cmdDelim ); if (strcmp(cmdParts, "TEST") == 0) { cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "TEST") == 0) { //INITIAL TEST printTrace("INITIAL TEST\r\n"); for (i = 0; i < 15; i++) { startBlinking(50000); } } if (strcmp(cmdParts, "START") == 0) { printTrace("TEST READING ACTIVATED\r\n"); test_read = 1; } if (strcmp(cmdParts, "STOP") == 0) { printTrace("TEST READING STOPPED\r\n"); test_read = 0; } } if (strcmp(cmdParts, "ZERO") == 0) { cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "SET") == 0) { set_zero = pressure; } if (strcmp(cmdParts, "UNSET") == 0) { set_zero = 0; } } /* //AAT process if (strcmp(cmdParts, "DIAG") == 0) { cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "START") == 0) { aatDiag = 1; aatDiagStep = 0; } if (strcmp(cmdParts, "STOP") == 0) { aatDiag = 0; } if (strcmp(cmdParts, "STEP4") == 0) { printTrace("DIAG#3#DONE\r\n"); AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED3); aatDiagStep = 4; diagForce = maxForce; } } if (strcmp(cmdParts, "POSITION") == 0) { // POSITION SETTING cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "MAX") == 0) { //MAX POSITION maxPos = atoi(strtok( NULL, cmdDelim )); sprintf((char *)msg,"MAX POSITION IS SET TO: %d\r\n", maxPos); printTrace(msg); } if (strcmp(cmdParts, "MIN") == 0) { //MIN POSITION minPos = atoi(strtok( NULL, cmdDelim )); sprintf((char *)msg,"MIN POSITION IS SET TO: %d\r\n", minPos); printTrace(msg); } if (strcmp(cmdParts, "SET") == 0) { //CUR POSITION curPos = atoi(strtok( NULL, cmdDelim )); sprintf((char *)msg,"CURRENT POSITION IS SET TO: %d\r\n", curPos); printTrace(msg); } } if (strcmp(cmdParts, "FORCE") == 0) { // FORCE SETTING cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "MAX") == 0) { //MAX FORCE maxForce = atoi(strtok( NULL, cmdDelim )); sprintf((char *)msg,"MAX FORCE IS SET TO: %d\r\n", maxForce); printTrace(msg); } if (strcmp(cmdParts, "MIN") == 0) { //MIN FORCE minForce = atoi(strtok( NULL, cmdDelim )); sprintf((char *)msg,"MIN FORCE IS SET TO: %d\r\n", minForce); printTrace(msg); } if (strcmp(cmdParts, "SET") == 0) { //CUR FORCE curForce = atoi(strtok( NULL, cmdDelim )); sprintf((char *)msg,"CURRENT FORCE IS SET TO: %d\r\n", curForce); printTrace(msg); } //AAT process if (strcmp(cmdParts, "DIAGMIN") == 0) { //CUR FORCE minDiagForce = atoi(strtok( NULL, cmdDelim )); sprintf((char *)msg,"MINIMUM DIAG FORCE IS SET TO: %d\r\n", minDiagForce); printTrace(msg); } if (strcmp(cmdParts, "DIAGLOCK") == 0) { //CUR FORCE lockDiagForce = atoi(strtok( NULL, cmdDelim )); sprintf((char *)msg,"LOCK DIAG FORCE IS SET TO: %d\r\n", lockDiagForce); printTrace(msg); } } //AAT setting if (strcmp(cmdParts, "PRESSURE") == 0) { cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "SETLOCK") == 0) { //LOCK PRESSURE lockDiagPressure = pressure; sprintf((char *)msg,"LOCK PRESSURE IS SET TO: %d\r\n", lockDiagPressure); printTrace(msg); } } if (strcmp(cmdParts, "SETTINGS") == 0) { //SETTINGS cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "GET") == 0) { sprintf((char *)msg,"SETTINGS: %-80s\r\n", OUR_FLASH_ADDR); printTrace(msg); } if (strcmp(cmdParts, "SET") == 0) { for(int r = 0; r < 128; r++) { settings[r] = '\0'; } sprintf((char *)settings,"POSITION#MIN#%d~POSITION#MAX#%d~POSITION#SET#%d~FORCE#MIN#%d~FORCE#MAX#%d~FORCE#SET#%d", minPos, maxPos, curPos, minForce, maxForce, curForce); settings_size = strlen(settings) + 1; flashWrite(OUR_FLASH_ADDR, settings, settings_size); printTrace(settings); sprintf((char *)msg,"\r\nWrote %d bytes to flash at address 0x%08X.\r\n", (3 + settings_size) & ~3, OUR_FLASH_ADDR); printTrace(msg); } } if (strcmp(cmdParts, "READINGS") == 0) { // READINGS cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "START") == 0) { //START cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "TRACE") == 0) { sprintf((char *)msg,"READINGS STARTED\r\n", maxPos); printTrace(msg); dataReading = 0; } if (strcmp(cmdParts, "DATA") == 0) { dataReading = 1; } reading = 1; } if (strcmp(cmdParts, "STOP") == 0) { //STOP sprintf((char *)msg,"READINGS STOPPED\r\n", minPos); printTrace(msg); reading = 0; } } if (strcmp(cmdParts, "VALUES") == 0) { // GET CURRENT VALUES cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "GET") == 0) { sprintf((char *)msg,"POSITION#MIN#%d~POSITION#MAX#%d~POSITION#SET#%d~FORCE#MIN#%d~FORCE#MAX#%d~FORCE#SET#%d", minPos, maxPos, curPos, minForce, maxForce, curForce); printTrace(msg); } } if (strcmp(cmdParts, "LED") == 0) { // LEDs control cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "RED") == 0) { //GREEN LED cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "ON") == 0) { AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED1); } if (strcmp(cmdParts, "OFF") == 0) { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED1); } if (strcmp(cmdParts, "SET") == 0) { AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED1); AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED2); AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED3); } } if (strcmp(cmdParts, "YELLOW") == 0) {ne MMC_SUCCESS 0x00 //YELLOW LED cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "ON") == 0) { AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED2); } if (strcmp(cmdParts, "OFF") == 0) { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED2); } if (strcmp(cmdParts, "SET") == 0) { AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED2); AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED1); AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED3); } } if (strcmp(cmdParts, "GREEN") == 0) { //RED LED cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "ON") == 0) { AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED3); } if (strcmp(cmdParts, "OFF") == 0) { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED3); } if (strcmp(cmdParts, "SET") == 0) { AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED3); AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED2); AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED1); } } if (strcmp(cmdParts, "ALLOFF") == 0) { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED1); AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED2); AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED3); } } */ if (strcmp(cmdParts, "MMC") == 0) { cmdParts = strtok( NULL, cmdDelim ); if (strcmp(cmdParts, "READ") == 0) { //INITIAL TEST printTrace("STORED MMC VALUES:\r\n"); int blockIndex; for (blockIndex = 0; blockIndex < 2048; blockIndex++) { memset(&mmc_buffer, 0x00, 512); mmcReadBlock(blockIndex * 512, 512); pCDC.Write(&pCDC, mmc_buffer, 512); } printTrace("\r\n"); Delay(2500000); } if (strcmp(cmdParts, "CLEAR") == 0) { printTrace("CLEARING SD CARD...\r\n"); clearMMCCard(); printTrace("CLEARING DONE\r\n"); } if (strcmp(cmdParts, "START") == 0) { storingOnMMC = 1; } if (strcmp(cmdParts, "STOP") == 0) { storingOnMMC = 0; } } }
unsigned char mmcReadBuf(unsigned long sector) { return mmcReadBlock(sector << 9, 512, mmc_buffer); }