int rootOps(void* userData, UInt32 sector, void* buf, UInt8 op){ SD* sd = userData; switch(op){ case BLK_OP_SIZE: if(sector == 0){ //num blocks if(sd){ *(unsigned long*)buf = sdGetNumSec(sd); } else{ *(unsigned long*)buf = 0; } } else if(sector == 1){ //block size *(unsigned long*)buf = SD_BLOCK_SIZE; } else return 0; return 1; case BLK_OP_READ: return sdSecRead(sd, sector, buf); case BLK_OP_WRITE: return sdSecWrite(sd, sector, buf); } return 0; }
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; }