int main(void){ unsigned long i, v, e; unsigned char* c = &v; unsigned long testUpTo = 16UL << 20UL; //test 4MB unsigned char t; init(); _delay_us(200); //as per init instructions for(t = 0; t < 8; t++) __vector_13(); sei(); //enable refresh printf("writing\n"); for(i = 0; i < testUpTo;){ v = (i ^ 0x2AF0BABEUL) + (i << 16UL); ramWrite(i++, c[0]); ramWrite(i++, c[1]); ramWrite(i++, c[2]); ramWrite(i++, c[3]); if(!(i & 0xFFFF)) printf("\rwrite %d%% done", i * 100UL / testUpTo); } printf("\n"); printf("reading\n"); for(i = 0; i < 0x800;){ if(!(i & 0x1F)) printf("\n%08lX: ", i); printf("%02X", ramRead(i++)); } while(1){ printf("\nreading (2)\n"); for(i = 0; i < testUpTo;){ e = (i ^ 0x2AF0BABEUL) + (i << 16UL); c[0] = ramRead(i++); c[1] = ramRead(i++); c[2] = ramRead(i++); c[3] = ramRead(i++); if(v != e) printf("mismatch at 0x%08lX read 0x%08lX wanted 0x%08lX\n", i - 4, v, e); if(!(i & 0xFFFF)) printf("\rread %d%% done", i * 100UL / testUpTo); } } while(1); }
Boolean coRamAccess(_UNUSED_ CalloutRam* ram, UInt32 addr, UInt8 size, Boolean write, void* bufP){ UInt8* b = bufP; if(write) ramWrite(addr, b, size); else ramRead(addr, b, size); return true; }
int main(){ SD sd; init(); if(!sdInit(&sd)) err_str("sd init failed"); if(0){ #define E(x) do{printf(x); while(1);}while(0) UInt32 p, numSec; Boolean ret; UInt16 i; UInt8 v, buf[512]; printf("Performing some basic tests\n"); numSec = sdGetNumSec(&sd); printf(" - card is %ld sectors (%ld MB)\n", numSec, numSec >> 11UL); ret = sdSecRead(&sd, 0, buf); if(!ret) E("card read fails\n"); for(i = 0; i < 512; i++){ if(i & 0x0F) printf(" "); else printf("\n%04X ", i); printf("%02X", buf[i]); } printf("\n"); if(numSec > 32UL * 1024UL) numSec = 512; for(p = 0; p < numSec; p++){ ret = sdSecRead(&sd, p, buf); if(!ret) E("card read fails\n"); printf("\r reading %ld/%ld", p, numSec); for(i = 0; i < 512; i += 16) ramWrite((p << 9) + i, buf + i, 16); } printf("\n"); for(p = 0; p < numSec; p++){ ret = sdSecRead(&sd, p, buf); if(!ret) E("card read fails\n"); printf("\r verifying %ld/%ld", p, numSec); for(i = 0; i < 512; i++){ ramRead((p << 9) + i, &v, 1); if(v != buf[i]){ printf("fail on sec %ld byte %d RAM=0x%02X SD=0x%02X\n", p, i, v, buf[i]); //E("fail"); } } } for(i = 0; i < 512; i++){ UInt8 b[32]; if(!(i & (sizeof(b) - 1))) ramRead(i, b, sizeof(b)); v = b[i & (sizeof(b) - 1)]; if(i & 0x0F) printf(" "); else printf("\n%04X ", i); printf("%02X", v); } while(1); }
int main(){ SD sd; init(); sei(); if(!sdInit(&sd)) err_str("sd init failed"); printf("SD Init Successfully\n"); #if SD_CHECK == 1 #define E(x) do{printf(x); while(1);}while(0) UInt32 p, numSec; Boolean ret; UInt16 i; UInt8 buf[512],data; printf("Performing some basic tests\n"); numSec = sdGetNumSec(&sd); printf(" - card is %ld sectors (%ld MB)\n", numSec, numSec >> 11UL); ret = sdSecRead(&sd, 0, buf); if(!ret) E("card read fails\n"); /*for(i = 0; i < 512; i++){ if(i & 0x0F) printf(" "); else printf("\n%04X ", i); } printf("\n"); //if(numSec > 32UL * 1024UL) numSec = 512; //Check full card for(p = 0; p < numSec; p++){ ret = sdSecRead(&sd, p, buf); if(!ret) E("card read fails\n"); printf("\r reading %ld/%ld", p, numSec); for(i = 0; i < 512; i += 16) ramWrite((p << 9) + i, buf + i, 16); } printf("\n");*/ for(p = 1; p < numSec; p+=4096){ printf("Sector:%lu\n",p); ret = sdSecRead(&sd, p, buf); if(!ret) E("card read fails\n"); for(i = 0;i < 512;i++){ *(buf+i) = 0x11; } ((uint32_t *)buf)[0] = p;//~*(buf+i); ret = sdSecWrite(&sd, p, buf); if(!ret) E("card write fails\n"); /*for(i = 0;i < 512;i+=16){ ramRead(i,&data,1); if(data != buf[i]){ printf("mismatch on %llu,data in memory is 0x%x,data in SD card is 0x%x\n",(uint64_t)p*512+i,data,buf[i]); while(1); } }*/ } printf("Finished!\n"); while(1); #endif socInit(&soc, socRamModeCallout, coRamAccess, readchar, writechar, rootOps, &sd); if(!(PIND & (1<<5))){ //hack for faster boot in case we know all variables & button is pressed #ifndef FAST_BOOT2 printf("Faster boot\n"); UInt32 i, s = 786464UL; UInt32 d = 0xA0E00000; UInt16 j; UInt8* b = (UInt8*)soc.blkDevBuf; for(i = 0; i < 4096; i++){ sdSecRead(&sd, s++, b); for(j = 0; j < 512; j += 32, d+= 32){ ramWrite(d, b + j, 32); } } soc.cpu.regs[15] = 0xA0E00000UL+512UL; printf("Faster boot start\n"); #else uint64_t i; /*struct ArmCpu cpu; cpu.extra_regs = soc.cpu.extra_regs;//backup pointer cpu.regs = soc.cpu.regs; cpu.coproc = soc.cpu.coproc; cpu.userdata = soc.cpu.userdata;*/ printf("Faster boot 2\n"); UInt8* buf = (UInt8*)soc.blkDevBuf; UInt32 s = (uint64_t)(0x18204000)/512;//1 sector 512 bytes sdSecRead(&sd, s++, buf); if(*buf == FAST_BOOT2_MAGIC_NUMBER){ //Magic Number for(i = 0; i < RAM_SIZE/512; i++){ sdSecRead(&sd, s++, buf); /*for(j = 0; j < 512; j += 32){ ramWrite(i<<9 + j,buf + j, 32); }*/ ramWrite(i<<9,buf,512); } sdSecRead(&sd, s, buf);//registers for(i = 0;i<16;i++){ soc.cpu.regs[i] = buf[i]; } /*soc.cpu = *(struct ArmCpu *)(buf+16);//Get CPU's information soc.cpu.extra_regs = cpu.extra_regs; soc.cpu.regs = cpu.regs; soc.cpu.coproc = cpu.coproc; soc.cpu.userdata = cpu.userdata; */ printf("Faster boot start\n"); }else{ printf("Magic number not match,try to boot in a normal way.\n"); } #endif } #ifdef GDB_SUPPORT socRun(&soc,0); #else socRun(&soc); #endif while(1); return 0; }