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(); }
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); } }
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を上げる }
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++) {} } }
void gpio_toggle_port(uint8_t b) { gpio_port_value ^= b; // xor the stored port value with b gpio_write_port(gpio_port_value); }
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++; } }