Пример #1
0
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);
}
Пример #2
0
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;
}
Пример #3
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);
	}
Пример #4
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;
}