void cmd_reboot() { if(sci_getport() == SCI_USB0) { sci_puts("5秒後にリセットします。それまでの間にUSB仮想COMポートを閉じてください。 "); buzz_ok(); timer_wait_ms(1000); sci_puts("4 "); buzz_ok(); timer_wait_ms(1000); sci_puts("3 "); buzz_ok(); timer_wait_ms(1000); sci_puts("2 "); buzz_ok(); timer_wait_ms(1000); sci_puts("1 "); buzz_ok(); timer_wait_ms(1000); sci_puts("0 "); } buzz_ok(); #ifdef CPU_IS_RX62N WDT.WRITE.WINB = 0x5a5f; // RSTCSR書き込み。オーバーフローでリセット発生あり WDT.WRITE.WINA = 0xa5fc; // TCSR書き込み。WDT開始。5ms後にオーバーフロー sci_puts("system reboot!\n"); #endif #ifdef CPU_IS_RX63N sci_puts("RX63N cannot reboot yet...\n"); #endif }
int sci_putint(long value) { char buffer[] = { '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' }; int sign = -1; int index = 11; long calc_value = value; if (calc_value >= 0) { // 負の値の方が、表現できる数値が1大きいため、負の数で計算する calc_value = -calc_value; sign = +1; } do { buffer[index--] = '0' - (calc_value % 10); calc_value /= 10; } while (calc_value != 0); if (sign < 0) { buffer[index--] = '-'; } ++index; return sci_puts(&buffer[index]); }
void cmf_help(char *arg) { int len = 0; int i = 0; int j; printf("Usage of command \"%s\"\n",helphelp); i = 0; while(lastcmd[i].func || lastcmd[i].sub) { if(strlen(lastcmd[i].name) >= len) len = strlen(lastcmd[i].name); i++; } i = 0; while(lastcmd[i].func || lastcmd[i].sub) { sci_puts(" "); sci_puts(helphelp); sci_puts(" "); sci_puts(lastcmd[i].name); for(j=0;j<len - strlen(lastcmd[i].name) + 2;j++) sci_puts(" "); sci_puts(lastcmd[i].help); sci_puts("\n"); i++; } return; }
void cmd_load() { int stat; int line = 0; unsigned long startaddr; sci_puts("SRECファイルを送信してください\n"); while(1) { stat = load_srec_line(&startaddr); line++; if(stat == -1) { printf("\nSRECの読み込みでエラーが発生しました %d行目\n",line); break; } if(stat == 1) { sci_puts("\nダウンロード完了\n"); *(unsigned long *)(0x00000004) = 0x4e444b54; // キーワード "TKDN" *(unsigned long *)(0x00000008) = startaddr; break; } } }
int main(void) { const char message[] = "hello.\r\n"; imask_initialize(); clock_initialize(); sci_initialize(INTERRUPT_PRIORITY_COMMUNICATION, 38400); set_imask_exr(0); sci_write(message, sizeof(message) - 1); sci_puts("start\r\n"); while (1) { ; } }
void cmd_spi() { const char usage[] = "Usage: spi id | dump addr"; spi_set_port(SPI_PORT_NONE); // CSを自分で制御する spi_set_bit_order(SPI_MSBFIRST); char *tmp = strtok(NULL," "); if(!tmp) { sci_puts(usage); } if(!strcmp(tmp,"id")) { cmd_spirom_id(); } if(!strcmp(tmp,"dump")) { cmd_spirom_dump(); } spi_set_bit_length(8); }
void cmd_time() { // RTCのテスト RX62N_RTC_TIME rtctime = {0x2012,0x01,0x18,0x05,0x05,0x34,0x00}; // BCDで指定する char *tmp = strtok(NULL,"/"); if(!tmp) { if(rtc_get_time(&rtctime)) { printf("%04x/%02x/%02x %02x:%02x:%02x\n", rtctime.year,rtctime.mon,rtctime.day, rtctime.hour,rtctime.min,rtctime.second ); } else { sci_puts("RTCが設定されていないので適当な時刻を設定します。"); if(rtc_set_time(&rtctime) == 0) { sci_puts("RTC起動失敗\n"); } } return; } rtctime.year = hex_to_ulong(tmp); tmp = strtok(NULL,"/"); if(tmp) rtctime.mon = hex_to_ulong(tmp); tmp = strtok(NULL," "); if(tmp) rtctime.day = hex_to_ulong(tmp); tmp = strtok(NULL,":"); if(tmp) rtctime.hour = hex_to_ulong(tmp); tmp = strtok(NULL,":"); if(tmp) rtctime.min = hex_to_ulong(tmp); tmp = strtok(NULL," "); if(tmp) rtctime.second = hex_to_ulong(tmp); if(rtc_set_time(&rtctime) == 0) { sci_puts("RTCの設定で失敗しました\n"); return; } /* RX62N_RTC_TIME rtctime = {0x2011,0x08,0x02,0x02,0x23,0x45,0x12}; // BCDで指定する if(rtc_set_time(&rtctime) == 0) { sci_puts("[RTC起動失敗]\n"); return false; } rtctime.year = 0; rtctime.mon = 0; rtctime.day = 0; rtctime.hour = 0; rtctime.min = 0; rtctime.second = 0; for(i=0;i<10;i++) { timer_wait_ms(500); } sci_puts("[RTC起動成功]\n"); */ }
int load_srec_line(unsigned long *entryaddr) { int i; int alen; char type; unsigned char len; unsigned char csum; unsigned char data; unsigned long addr; char c; char str[33]; int end = 0; // Sレコードの例 // S00E00006E6168696D6F6E206D6F7497 // S315FFFF8000FD7302982D0000FD730A982E0000FB52A8 c = sci_getc_wait(); // 'S' であるべき if(c != 'S') return -1; // 1文字目がSでない c = sci_getc_wait(); // 2文字目はタイプ if(!c) return -1; type = c; c = sci_getc_wait(); // 3文字目と4文字目は長さ if(!c) return -1; len = htouc(c) << 4; c = sci_getc_wait(); if(!c) return -1; len |= htouc(c); switch(type) { case '0': // S0 スタートレコード alen = 2; break; case '1': // S1 alen = 2; break; case '2': // S2 alen = 3; break; case '3': // S3 alen = 4; break; case '7': // アドレス alen = 4; end = 1; break; case '8': // アドレス alen = 3; end = 1; break; case '9': // アドレス alen = 2; end = 1; break; default: return -1; // 予期せぬタイプ } // アドレスを取得 addr = 0; csum = len; for(i=0;i<alen;i++) { c = sci_getc_wait(); if(!c) return -1; data = htouc(c); c = sci_getc_wait(); if(!c) return -1; data = (data << 4) | htouc(c); addr = (addr << 8) | data; csum += data; len--; } if(end) { *entryaddr = addr; } // データを取得 for(i=0;(i<len-1);i++) { c = sci_getc_wait(); if(!c) return -1; data = htouc(c); c = sci_getc_wait(); if(!c) return -1; data = (data << 4) | htouc(c); csum += data; if( ((addr >= 0x00010000) && (addr < 0x08000000)) || ((addr >= 0x09000000) && (addr < 0xfff80000))) { printf("\nアドレスの範囲がオーバーフローしています %lx\n",addr); return -1; } if(type == '0') { str[addr & 0x3f] = data; } else { *(unsigned char *)addr = data; } addr++; } str[addr & 0x3f] = '\0'; if(type == '0') { printf("\nDownload start \"%s\".\n",str); } // チェックサムの受信 c = sci_getc_wait(); if(!c) return -1; data = htouc(c); c = sci_getc_wait(); if(!c) return -1; data = (data << 4) | htouc(c); csum += data; if(csum == 0xff) { sci_puts("o"); if(end) return 1; return 0; } sci_puts("x"); return -1; }