diff --git a/include/time.h b/include/time.h new file mode 100644 index 0000000..3408390 --- /dev/null +++ b/include/time.h @@ -0,0 +1,15 @@ +#ifndef __TIME_H +#define __TIME_H + +#ifdef __cplusplus +extern "C" { +#endif + +void time_init(void); +int elapsed(int *last_event, int period); + +#ifdef __cplusplus +} +#endif + +#endif /* __TIME_H */ diff --git a/input/top.bin b/input/top.bin index 1407640..53450bd 100644 Binary files a/input/top.bin and b/input/top.bin differ diff --git a/src/main.c b/src/main.c index 43eb542..4635b5a 100644 --- a/src/main.c +++ b/src/main.c @@ -3,46 +3,189 @@ #include #include #include +#include #include -void isr(void) { +enum usb_responses { + USB_STALL = 0b11, + USB_ACK = 0b00, + USB_NAK = 0b01, + USB_NONE = 0b10, +}; + +void isr(void) +{ unsigned int irqs; - + irqs = irq_pending() & irq_getmask(); - -// if (irqs & (1 << USB_INTERRUPT)) -// usb_isr(); + + if (irqs & (1 << USB_INTERRUPT)) + usb_isr(); if (irqs & (1 << UART_INTERRUPT)) uart_isr(); } -static void rv_putchar(void *ignored, char c) { +static void rv_putchar(void *ignored, char c) +{ (void)ignored; uart_write(c); } -static void init(void) { +static void init(void) +{ irq_setmask(0); irq_setie(1); uart_init(); usb_init(); + time_init(); init_printf(NULL, rv_putchar); } -int main(int argc, char **argv) { +static uint32_t read_timer(void) +{ + timer0_update_value_write(1); + return timer0_value_read(); +} + +#ifdef CSR_USB_EP_0_OUT_EV_PENDING_ADDR +struct usb_status +{ + // uint32_t out_ev_status; + uint32_t out_ev_pending; + uint32_t in_ev_status; + uint32_t out_last_tok; + uint32_t out_obuf_empty; + uint32_t in_ibuf_empty; +}; + +static struct usb_status get_status(void) +{ + struct usb_status s; + // s.out_ev_status = usb_ep_0_out_ev_status_read(); + s.out_ev_pending = usb_ep_0_out_ev_pending_read(); + s.in_ev_status = usb_ep_0_in_ev_status_read(); + s.out_last_tok = usb_ep_0_out_last_tok_read(); + s.out_obuf_empty = usb_ep_0_out_obuf_empty_read(); + s.in_ibuf_empty = usb_ep_0_in_ibuf_empty_read(); + return s; +} + +static void get_print_status(void) +{ + static int loops; + int obufbuf_cnt = 0; + struct usb_status s = get_status(); + + // printf("i: %8d OEP: %02x OBE: %02x OLT: %02x\n", + // loops++, + // s.out_ev_pending, + // s.out_obuf_empty, + // s.out_last_tok); + + if (s.out_ev_pending & (1 << 1)) { + loops++; + uint8_t obufbuf[128]; + while (!usb_ep_0_out_obuf_empty_read()) { + uint32_t obh = usb_ep_0_out_obuf_head_read(); + obufbuf[obufbuf_cnt++] = obh; + usb_ep_0_out_obuf_head_write(1); + } + + int i; + printf("i: %d b: %d olt: %02x --", loops, obufbuf_cnt, s.out_last_tok);//obe: %d obh: %02x\n", i, obe, obh); + for (i = 0; i < obufbuf_cnt; i++) { + printf(" %02x", obufbuf[i]); + } + printf("\n"); + + usb_ep_0_out_ev_pending_write((1 << 1)); + + // Response + if (!usb_ep_0_in_ibuf_empty_read()) { + printf("USB ibuf still has data\n"); + return; + } + + uint32_t usb_in_pending = usb_ep_0_out_ev_pending_read(); + if (usb_in_pending) { + printf("USB EP0 in pending is: %02x\n", usb_in_pending); + return; + } + + for (i = 0; i < 0x20; i++) { + usb_ep_0_in_ibuf_head_write(i); + } + // Indicate that we respond with an ACK + usb_ep_0_in_respond_write(USB_ACK); + usb_ep_0_in_ev_pending_write(0xff); + } +} +#else +static void get_print_status(void) +{ + static int loops; + uint32_t obe = usb_obuf_empty_read(); + uint8_t obufbuf[128]; + int obufbuf_cnt = 0; + loops++; + + while (!usb_obuf_empty_read()) { + uint32_t obh = usb_obuf_head_read(); + obufbuf[obufbuf_cnt++] = obh; + usb_obuf_head_write(1); + } + if (obufbuf_cnt) { + int i; + printf("i: %d b: %d --", loops, obufbuf_cnt);//obe: %d obh: %02x\n", i, obe, obh); + for (i = 0; i < obufbuf_cnt; i++) { + printf(" %02x", obufbuf[i]); + } + printf("\n"); + } + // if (!obe) { + // uint32_t obh = usb_obuf_head_read(); + // usb_obuf_head_write(1); + // if (i < 300) + // printf("i: %8d obe: %d obh: %02x\n", i, obe, obh); + // } +} +#endif + +int main(int argc, char **argv) +{ (void)argc; (void)argv; init(); + printf("\nStatus: %d\n", usb_ep_0_out_ev_pending_read()); + get_print_status(); + usb_pullup_out_write(1); + usb_ep_0_out_ev_pending_write((1 << 1)); + printf("Status: %d\n", usb_ep_0_out_obuf_empty_read()); + get_print_status(); int i = 0; printf("Hello, world!\n"); - while (1) { - printf("10 PRINT HELLO, WORLD\n"); - printf("20 GOTO 10\n"); - printf("i: %d\n", i++); + + int last_event = 0; + while (1) + { + // unsigned int timer_val_ok = read_timer(); + // int elapsed(int *last_event, int period) + elapsed(&last_event, 1000); + + unsigned int timer_val_cur; + // timer_val_cur = read_timer(); + // printf("10 PRINT HELLO, WORLD\n"); + // printf("20 GOTO 10\n"); + // printf("i: %d\n", i++); + // timer_val_cur = read_timer(); + get_print_status(); + // while (timer0_value_read() != timer_val_ok) { + // ; + // } } return 0; } \ No newline at end of file diff --git a/src/usb.c b/src/usb.c index 421790d..6a98164 100644 --- a/src/usb.c +++ b/src/usb.c @@ -1,5 +1,9 @@ #include void usb_init(void) { - usb_pullup_out_write(1); + // usb_pullup_out_write(1); +} + +void usb_isr(void) { + } \ No newline at end of file