Exemple #1
0
void cmd_spirom_id() {
	unsigned long recv1;
	unsigned short recv2;

//	spi_init();
	spi_set_port(SPI_PORT_NONE); // CSを自分で制御する
	spi_set_bit_order(SPI_MSBFIRST);

	gpio_set_pinmode(SPI_ROM_PORT,1);
	gpio_write_port(SPI_ROM_PORT,0); // CSを下げる
	spi_set_bit_length(8);
	spi_transfer(0x9f); // コマンド送信
	spi_set_bit_length(24);
	recv1 = spi_transfer(0) & 0xffffff;
	printf("SPI ROM JEDEC ID=%08lx, ",recv1);
//	gpio_write_port(SPI_ROM_PORT,1); // CSを上げる

	gpio_write_port(SPI_ROM_PORT,0); // CSを下げる
	spi_set_bit_length(32);
	recv2 = spi_transfer(0x90000000) & 0xffff; // コマンド送信
	printf("ID=%04x\n",recv2);
	gpio_write_port(SPI_ROM_PORT,1); // CSを上げる

	gpio_set_pinmode(SPI_ROM_PORT,0);
//	spi_terminate();
}
Exemple #2
0
void buzz_ng() {
	int i;
	for(i=0;i<100;i++)
	{
		gpio_write_port(PIN_BUZZ,1);
		timer_wait_ms(4);
		gpio_write_port(PIN_BUZZ,0);
		timer_wait_ms(4);
	}
}
Exemple #3
0
void spirom_read(unsigned long addr,int len,unsigned char *rxdata)
{
	gpio_write_port(SPI_ROM_PORT,0); // CSを下げる
	spi_set_bit_length(32);
	spi_transfer(0x03000000 | addr); // コマンド送信

	spi_set_bit_length(8);
	while(len--) *rxdata++ = spi_transfer(0); // データ受信

	gpio_write_port(SPI_ROM_PORT,1); // CSを上げる
}
Exemple #4
0
static void empty_loop(void)
{
	int i;
	volatile int j;
	for(i=0;i<1000;i++)
	{
		gpio_write_port(PIN_BUZZ,i & 1);
		for(j=0;j<1000;j++) {}
	}
}
Exemple #5
0
void gpio_toggle_port(uint8_t b)
{
	gpio_port_value ^= b;	// xor the stored port value with b
	gpio_write_port(gpio_port_value);
}
Exemple #6
0
void cmd_memtest(char *arg)
{
	unsigned long *sdptr;
	unsigned long i;
	unsigned long loop;
	int errcnt;
	int sec,us,us2;
	const int TEST_SIZE = 0x01000000;

	printf("SDRAMメモリテストを開始します\n");
	
	us = timer_get_ms();
	memset((void *)0x08000000,0x55,0x01000000);
	us2 = timer_get_ms();

	printf("16MBytesをmemsetする時間は %d秒でした\n",(us2-us)/1000);

	us = timer_get_ms();
	memcpy((void *)0x08000000,(void *)0x09000000,0x01000000);
	us2 = timer_get_ms();
	printf("16MBytesをmemcpyする時間は %d.%06d秒でした\n",(us2-us)/1000);

	sdptr = (unsigned long *)0x08000000;
//	timer_start();
	for(i=0;i<16777216/4;i++)
	{
		volatile int t = *sdptr++;
	}
//	timer_check(&sec,&us);
//	timer_stop();
//	printf("16MBytesをfor文で読み出す時間は %d.%06d秒でした\n",sec,us);

	sdptr = (unsigned long *)0x08000000;
//	timer_start();
	for(i=0;i<16777216/4;i++)
	{
		*sdptr++ = i;
	}
//	timer_check(&sec,&us);
//	timer_stop();
//	printf("16MBytesにfor文で書き込む時間は %d.%06d秒でした\n",sec,us);
		
	{
		void (*func)(void);
		unsigned char *src,*dst;

//		timer_start();
		empty_loop();
//		timer_check(&sec,&us);
//		timer_stop();
//		printf("10^6回ループを内蔵RAM上で実行する時間は %d.%06d秒でした\n",sec,us);

		src = (unsigned char *)empty_loop;
		dst = (unsigned char *)0x08000000;
		memcpy(dst,src,(unsigned long)empty_loop_next - (unsigned long)empty_loop);

		func = (void (*)(void))0x08000000;
//		timer_start();
		func();
//		timer_check(&sec,&us2);
//		timer_stop();
		printf("10^6回ループをSDRAM上で実行する時間は %d.%06d秒でした\n",(int)sec,(int)us2);
		
		us2 *= 100;
		printf("約%d.%d倍の時間がかかっています\n",(int)(us2/us/100),(int)((us2/us)%100));
	}

	printf("読み書きチェックを行います\n");
	
	loop = 1;
	while(!sci_rxcount())
	{
		srand(loop);
		sdptr = (unsigned long *)0x08000000;
		for(i=0;i<TEST_SIZE / sizeof(long);i++)
		{
			*sdptr++ = myrand();
		}

		srand(loop);
		errcnt = 0;
		sdptr = (unsigned long *)0x08000000;
		for(i=0;i<TEST_SIZE / sizeof(long);i++)
		{
			if(*sdptr != myrand())
			{
				printf("Error:addr=%08x data=%02x\n",(unsigned int)sdptr,(unsigned char)*sdptr);
				errcnt++;
				if(sci_rxcount()) break;
				if(errcnt > 50) break;
			}
			sdptr++;
		}

		gpio_write_port(PIN_BUZZ,1);
		if(errcnt == 0)
		{
			printf("Memory test success loop=%d\n",(int)loop);
			for(i=0;i<500;i++)
			{
				int j;
				for(j=0;j<20000;j++) {}
				gpio_write_port(PIN_LED2,j & 1);
			}
		}
		else
		{
			printf("Memory test failed loop=%d\n",(int)loop);
			for(i=0;i<100;i++)
			{
				int j;
				for(j=0;j<100000;j++) {}
				gpio_write_port(PIN_LED2,j & 1);
			}
			break;
		}
		gpio_write_port(PIN_BUZZ,0);
		loop++;
	}
}