Beispiel #1
0
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]);
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
		}
	}
}
Beispiel #5
0
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) {
        ;
    }
}
Beispiel #6
0
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);
}
Beispiel #7
0
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");
*/
}
Beispiel #8
0
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;
}