示例#1
0
文件: main_avr.c 项目: iori-yja/uARM
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;	
}
示例#2
0
文件: main_avr.c 项目: iori-yja/uARM
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);
	}
示例#3
0
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;
}