diff options
Diffstat (limited to 'stm32/z180-stamp-stm32.c')
-rw-r--r-- | stm32/z180-stamp-stm32.c | 381 |
1 files changed, 168 insertions, 213 deletions
diff --git a/stm32/z180-stamp-stm32.c b/stm32/z180-stamp-stm32.c index ce161d8..f55e076 100644 --- a/stm32/z180-stamp-stm32.c +++ b/stm32/z180-stamp-stm32.c @@ -1,15 +1,12 @@ /* */ -#include <errno.h> #include <stdio.h> -#include <unistd.h> #include <libopencmsis/core_cm3.h> #include <libopencm3/cm3/nvic.h> #include <libopencm3/cm3/systick.h> #include <libopencm3/stm32/rtc.h> -#include <libopencm3/stm32/usart.h> #include <libopencm3/stm32/rcc.h> #include <libopencm3/stm32/gpio.h> #include <libopencm3/stm32/timer.h> @@ -18,13 +15,13 @@ #define IDR 0x08 - +#include "debug.h" +#include "serial.h" #include "z80-if.h" #include "hdrom.h" -#define USART_CONSOLE USART1 -int _write(int fd, char *ptr, int len) __attribute__((used)); +#define ESCCHAR ('^'-0x40) #define S_10MS_TO (1<<0) @@ -94,7 +91,6 @@ static void clock_setup(void) USART1 TIM16 (RST-Pin) TIM1 (IOCS1) - TODO: USART1 --> USART_CONSOLE */ rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN @@ -174,55 +170,6 @@ static void gpio_setup(void) } -static void usart_setup(void) -{ - /* Setup GPIO pin GPIO_USART1_TX/LED_GREEN_PIN on GPIO port A for transmit. */ - /* TODO: USART1 --> USART_CONSOLE */ - - gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, - GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART1_TX); - - /* Setup UART parameters. */ -// usart_set_baudrate(USART_CONSOLE, 38400); - usart_set_baudrate(USART_CONSOLE, 115200); - usart_set_databits(USART_CONSOLE, 8); - usart_set_stopbits(USART_CONSOLE, USART_STOPBITS_1); - usart_set_mode(USART_CONSOLE, USART_MODE_TX_RX); - usart_set_parity(USART_CONSOLE, USART_PARITY_NONE); - usart_set_flow_control(USART_CONSOLE, USART_FLOWCONTROL_NONE); - - /* Finally enable the USART. */ - usart_enable(USART_CONSOLE); -} - -/*--------------------------------------------------------------------------*/ - -/** - * Use USART_CONSOLE as a console. - * This is a syscall for newlib - * @param fd - * @param ptr - * @param len - * @return - */ -int _write(int fd, char *ptr, int len) -{ - int i; - - if (fd == STDOUT_FILENO || fd == STDERR_FILENO) { - for (i = 0; i < len; i++) { - if (ptr[i] == '\n') { - usart_send_blocking(USART_CONSOLE, '\r'); - } - usart_send_blocking(USART_CONSOLE, ptr[i]); - } - return i; - } - errno = EIO; - return -1; -} - - /*--------------------------------------------------------------------------*/ void delay_systicks(int ticks) @@ -317,6 +264,7 @@ static uint16_t get_key_press(uint16_t key_mask) { return key_mask; } +/* static uint16_t get_key_rpt(uint16_t key_mask) { __disable_irq(); // read and clear atomic ! @@ -325,6 +273,7 @@ static uint16_t get_key_rpt(uint16_t key_mask) { __enable_irq(); return key_mask; } +*/ static uint16_t get_key_short(uint16_t key_mask) { __disable_irq(); @@ -365,26 +314,6 @@ static void key_timerproc() { key_rpt |= key_state & REPEAT_MASK; } - -#if 0 - -static char ds[30]; -int dsi = 0; - -ds[dsi++] = key_state & 1 ? '1' : '0'; -ds[dsi++] = key_in_last & 1 ? '1' : '0'; -ds[dsi++] = key_in & 1 ? '1' : '0'; -ds[dsi++] = ' '; - -//ds[dsi++] = key_state & 1 ? '1' : '0'; -//ds[dsi++] = key_in_last & 1 ? '1' : '0'; - -//ds[dsi++] = ' '; -//ds[dsi++] = ' '; -ds[dsi++] = 0; -puts(ds); -#endif - } /*--------------------------------------------------------------------------*/ @@ -466,7 +395,7 @@ static uint32_t z80_sram_cmp(uint32_t addr, int length, uint8_t wval, int inc) uint8_t rval; int errors = 0; - printf("SRAM: Check %#.5x byte... ", length); //fflush(stdout); + DBG_P(1, "SRAM: Check %#.5x byte... ", length); while (length--) { if ((rval = z80_read(addr)) != wval) { if (errors == 0) { @@ -482,7 +411,7 @@ static uint32_t z80_sram_cmp(uint32_t addr, int length, uint8_t wval, int inc) addr++; wval += inc; } - printf("Done.\n"); + DBG_P(1, "Done.\n"); return addr; } @@ -574,28 +503,137 @@ static void do_10ms(void) } } -void wait_for_z80_init_done(void) +static +void do_msg_init(int len, uint8_t* msg) +{ + uint8_t sub_fct; + + if (len > 0) { + len--; + switch (sub_fct = *msg++) { + case 0: + case 1: + case 2: + if (len == 3) { + uint32_t fifoadr = 0; + while (len--) + fifoadr = (fifoadr << 8) + msg[len]; + if (sub_fct == 0) + z80_init_msg_fifo(fifoadr); + else + z80_memfifo_init(sub_fct - 1, fifoadr); + } else { + /* garbage from z180 */ + } + break; + default: + /* garbage from z180 */ + break; + } + } +} + +static +void do_msg_char(int len, uint8_t* msg) +{ + uint8_t sub_fct; + + if (len > 0) { + len--; + switch (sub_fct = *msg++) { + case 1: /* console output */ + while (len--) + putchar(*msg++); + break; + } + } +} + +static +void do_message(int len, uint8_t *msg) +{ + uint8_t sub_fct; + + if (len > 0) { + len--; + switch (*msg++) { + case 0: /* init functions */ + do_msg_init(len, msg); + break; + case 1: /* character i/o functions */ + do_msg_char(len, msg); + break; + default: + /* no more functions definded yet*/ + break; + } + } else { + /* shoudn't happen */ + } +} + + +#define CTRBUF_LEN 20 + +static void check_msg_fifo(void) { - uint8_t buf, out_i, in_i, mask; - int to; - - timeout_1s = 10; - to = 0; - while (timeout_1s) { - if (to != timeout_1s) { - buf = z80_get_byte(tx_fifo - 0); - out_i = z80_get_byte(tx_fifo - 1); - in_i = z80_get_byte(tx_fifo - 2); - mask = z80_get_byte(tx_fifo - 3); - printf(" %.2x %.2x %.2x %.2x\n", buf, out_i, in_i, mask); - to = timeout_1s; - - if ((out_i == 0) && (mask == 0x7f)) - timeout_1s = 0; + int ch; + static int state; + static int msglen,idx; + static uint8_t buffer[CTRBUF_LEN]; + + while (state != 3 && (ch = z80_msg_fifo_getc()) >= 0) { + switch (state) { + case 0: /* wait for start of message */ + if (ch == 0x81) { + msglen = 0; + idx = 0; + state = 1; + } + break; + case 1: /* get msg len */ + if (ch > 0 && ch <= CTRBUF_LEN) { + msglen = ch; + state = 2; + } else + state = 0; + break; + case 2: /* get message */ + buffer[idx++] = ch; + if (idx == msglen) + state = 3; + break; } } + + if (state == 3) { + do_message(msglen, buffer); + state = 0; + } } + +void z80_load_mem(void) +{ + +DBG_P(1, "Loading z80 memory... \n"); + + unsigned sec = 0; + uint32_t sec_base = hdrom_start; + + while (sec < hdrom_sections) { + DBG_P(2, " From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n", + hdrom_address[sec], + hdrom_address[sec]+hdrom_length_of_sections[sec] - 1, + hdrom_length_of_sections[sec]); + + z80_write_block((unsigned char *) &hdrom[sec_base], /* src */ + hdrom_address[sec], /* dest */ + hdrom_length_of_sections[sec]); /* len */ + sec_base+=hdrom_length_of_sections[sec]; + sec++; + } +} /*--------------------------------------------------------------------------*/ int main(void) @@ -604,19 +642,20 @@ int main(void) //uint32_t rc; //uint8_t startval = 0; //int count; - int stat, ch; - uint8_t c; + int state = 0; + int ch; clock_setup(); gpio_setup(); tim3_setup(); setvbuf(stdout, NULL, _IONBF, 0); - usart_setup(); + serial_setup(); printf("\n(STM32F100+HD64180)_stamp Tester\n"); - z80_setup_io_infifo(); + DBG_P(1, "z80_setup_bus... "); + z80_setup_msg_fifo(); z80_setup_bus(); - printf("z80_setup_bus done.\n"); + DBG_P(1, "done.\n"); /* * If the RTC is pre-configured just allow access, don't reconfigure. @@ -626,158 +665,74 @@ int main(void) rtc_auto_awake(LSE, 0x7fff); systick_setup(); - ///* Setup the RTC interrupt. */ - //nvic_setup(); - - /* Enable the RTC interrupt to occur off the SEC flag. */ - //rtc_interrupt_enable(RTC_SEC); - printf("get bus..."); + DBG_P(1, "Get bus... "); z80_busreq(LOW); z80_reset(HIGH); z80_request_bus(); - printf(" got it!\n"); + DBG_P(1, "got it!\n"); z80_memset(0, 0x76, 0x80000); //z80_sram_fill(0, 512 * 1024, 0x76, 0); z80_sram_cmp(0, 512 * 1024, 0x76, 0); - z80_write_block((unsigned char *) hdrom, 0, hdrom_length); + z80_load_mem(); z80_reset(LOW); - printf("bus released!\n"); + DBG_P(1, "Bus released!\n"); z80_release_bus(); z80_reset(HIGH); - printf(" reset released!\n"); + DBG_P(1, "Reset released!\n"); - wait_for_z80_init_done(); - z80_memfifo_init(); ledset(0, BLINK1, 50); while (1) { -// static int tickstat = 0; - + if (Stat & S_10MS_TO) { Stat &= ~S_10MS_TO; do_10ms(); } - -// if (get_key_long(KEY0)) -// ledset(1, PULSE, 100); - if (get_key_short(KEY0)) { z80_reset_pulse(); - wait_for_z80_init_done(); - z80_memfifo_init(); } - -/* - switch (tickstat) { - + if ((ch = serial_getc()) >= 0) { + switch (state) { case 0: - if (BBIO_PERIPH(GPIOA+IDR, 0)) - { - tickstat = 1; - - LED_GREEN_ON(); - LED_GREEN_OFF(); - LED_GREEN_ON(); - delay_systicks(12); - LED_GREEN_OFF(); - } + if (ch == ESCCHAR) { + state = 1; + /* TODO: Timer starten */ + } else + z80_memfifo_putc(fifo_out, ch); break; - default: - if (!BBIO_PERIPH(GPIOA+IDR, 0)) - tickstat = 0; - } -*/ + case 1: + switch (ch) { - //BBIO_PERIPH(LED_PORT+0x0C, 9) = BBIO_PERIPH(GPIOA+0x08, 0); - - //BBIO_PERIPH(LED_PORT+0x0C, 9) = !z80_stat_halt(); - - //BBIO_PERIPH(LED_PORT+0x0C, 9) = (~key_state & KEY0) != 0; - - -/* - stat = z80_fifo_is_not_full(rx_fifo); - if(stat) { - z80_fifo_putc(rx_fifo, 'y'); - if (++count == 154) { - putchar('\n'); - putchar('\r'); - count = 0; - } - - } -*/ - - stat = usart_get_flag(USART_CONSOLE, USART_SR_RXNE); - if (stat) { - c = usart_recv(USART_CONSOLE) & 0xff; - switch (c) { - case 'H': + case 'h': /* test: green led on */ tim3_set(-1); break; - case 'L': + case 'l': /* test: green led off */ tim3_set(0); break; - case 'P': - tim3_set(24000000/1000000 * 5); /* 5 us */ + case 'p': /* test: pulse on led pin */ + tim3_set(24000000 / 1000000 * 5); /* 5 us */ + break; + case 'r': + z80_reset_pulse(); break; - default: - z80_memfifo_putc(fifo_out, c); - } - } - if (timeout_1s == 0) { - - while (!z80_memfifo_is_empty(fifo_in)) { -// LED_GREEN_ON(); - c = z80_memfifo_getc(fifo_in); - putchar(c); -// LED_GREEN_OFF(); + case ESCCHAR: + default: + z80_memfifo_putc(fifo_out, ch); + } + state = 0; + break; } - - timeout_1s = 1; } - - while ((ch = z80_io_infifo_getc()) >= 0) { - static int linepos; - if (linepos == 0) - printf("\n"); - printf(" 0x%.2X ", ch); - linepos = (linepos + 1) % 16; - } + check_msg_fifo(); } return 0; } - -#if 0 - -static char ds[30]; -int dsi = 0; - -ds[dsi++] = key_state1 & 1 ? '1' : '0'; -ds[dsi++] = key_in_last & 1 ? '1' : '0'; -ds[dsi++] = key_in & 1 ? '1' : '0'; -ds[dsi++] = ' '; -ds[dsi++] = key_state1 & 1 ? '1' : '0'; -ds[dsi++] = key_in_last & 1 ? '1' : '0'; - -ds[dsi++] = ' '; -ds[dsi++] = ' '; -ds[dsi++] = key_state & 1 ? '1' : '0'; -ds[dsi++] = ct1 & 1 ? '0' : '1'; -ds[dsi++] = ct0 & 1 ? '0' : '1'; -ds[dsi++] = ' '; -ds[dsi++] = key_state & 1 ? '1' : '0'; -//ds[dsi++] = '\r'; -//ds[dsi++] = '\n'; -ds[dsi++] = 0; -puts(ds); -#endif |