wip: generate a buildable image
Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
		
							
								
								
									
										15
									
								
								include/time.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								include/time.h
									
									
									
									
									
										Normal file
									
								
							@@ -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 */
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								input/top.bin
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								input/top.bin
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										163
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										163
									
								
								src/main.c
									
									
									
									
									
								
							@@ -3,46 +3,189 @@
 | 
				
			|||||||
#include <printf.h>
 | 
					#include <printf.h>
 | 
				
			||||||
#include <uart.h>
 | 
					#include <uart.h>
 | 
				
			||||||
#include <usb.h>
 | 
					#include <usb.h>
 | 
				
			||||||
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <generated/csr.h>
 | 
					#include <generated/csr.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void isr(void) {
 | 
					enum usb_responses {
 | 
				
			||||||
 | 
					    USB_STALL = 0b11,
 | 
				
			||||||
 | 
					    USB_ACK   = 0b00,
 | 
				
			||||||
 | 
					    USB_NAK   = 0b01,
 | 
				
			||||||
 | 
					    USB_NONE  = 0b10,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void isr(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    unsigned int irqs;
 | 
					    unsigned int irqs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    irqs = irq_pending() & irq_getmask();
 | 
					    irqs = irq_pending() & irq_getmask();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//    if (irqs & (1 << USB_INTERRUPT))
 | 
					    if (irqs & (1 << USB_INTERRUPT))
 | 
				
			||||||
//        usb_isr();
 | 
					        usb_isr();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (irqs & (1 << UART_INTERRUPT))
 | 
					    if (irqs & (1 << UART_INTERRUPT))
 | 
				
			||||||
        uart_isr();
 | 
					        uart_isr();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void rv_putchar(void *ignored, char c) {
 | 
					static void rv_putchar(void *ignored, char c)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    (void)ignored;
 | 
					    (void)ignored;
 | 
				
			||||||
    uart_write(c);
 | 
					    uart_write(c);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void init(void) {
 | 
					static void init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    irq_setmask(0);
 | 
					    irq_setmask(0);
 | 
				
			||||||
    irq_setie(1);
 | 
					    irq_setie(1);
 | 
				
			||||||
    uart_init();
 | 
					    uart_init();
 | 
				
			||||||
    usb_init();
 | 
					    usb_init();
 | 
				
			||||||
 | 
					    time_init();
 | 
				
			||||||
    init_printf(NULL, rv_putchar);
 | 
					    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)argc;
 | 
				
			||||||
    (void)argv;
 | 
					    (void)argv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    init();
 | 
					    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;
 | 
					    int i = 0;
 | 
				
			||||||
    printf("Hello, world!\n");
 | 
					    printf("Hello, world!\n");
 | 
				
			||||||
    while (1) {
 | 
					
 | 
				
			||||||
        printf("10 PRINT HELLO, WORLD\n");
 | 
					    int last_event = 0;
 | 
				
			||||||
        printf("20 GOTO 10\n");
 | 
					    while (1)
 | 
				
			||||||
        printf("i: %d\n", i++);
 | 
					    {
 | 
				
			||||||
 | 
					        // 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;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user