| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | #include "fw.h"#include "io.h"#include "abcio.h"#include "sys.h"#include "console.h"volatile uint32_t timer_irq_count;IRQHANDLER(sysclock){    uint32_t count = timer_irq_count;    count++;    timer_irq_count = count;    set_led(count >> 3); /* 4 Hz */}/* Configure ABC memory map */static void init_abc_memmap(void){    volatile uint32_t *pg = &ABCMEMMAP_PAGE(0);    for (unsigned int addr = 0; addr < 0x10000; addr += 512) {	if (addr >= 0x5800 && addr < 0x6000) {	    *pg++ = ABCMEMMAP_RD | addr;	} else if (addr >= 0x8000 && addr < 0xc000) {	    *pg++ = ABCMEMMAP_RD | ABCMEMMAP_WR | addr;	} else {	    *pg++ = addr;	/* Disabled */	}    }}extern const char __dram_init_start[], __dram_init_end[], __dram_init_len[];extern const char __dram_bss_start[], __dram_bss_end[], __dram_bss_len[];static uint32_t romcopy_time[2];static unsigned int romcopy_state;IRQHANDLER(romcopy){    switch (romcopy_state++) {    case 0:	/* Copy testdata */	ROMCOPY_RAMADDR = (size_t)__dram_init_start;	ROMCOPY_ROMADDR = 0x100000;	ROMCOPY_DATALEN = (size_t)__dram_init_len;	break;    case 1:	/* Zero .dram.bss */	romcopy_time[0] = rdtime() - time_zero;	ROMCOPY_RAMADDR = (size_t)__dram_bss_start;	ROMCOPY_ROMADDR = 0;	/* Clear */	ROMCOPY_DATALEN = (size_t)__dram_bss_len;	break;    default:	romcopy_time[1] = rdtime() - romcopy_time[0];	mask_irq(ROMCOPY_IRQ);	return;    }}static no_return killed(const char *how, size_t pc){    con_printf("ERROR: %s at 0x%08x\n", how, pc);    con_flush();    udelay(5000000);    reset();}IRQHANDLER(BUSERR){    killed("misaligned", pc);}IRQHANDLER(EBREAK){    killed("invalid instruction", pc);}static uint32_t timer_irq_start;static void init(void){    static const char hello[] =	"\n*** Hello, World! ***\n"	"Firmware compiled on: " __DATE__ " " __TIME__ "\n\n";    /* Start ROM copy engine */    romcopy_state = 0;    unmask_irqs((1U << ROMCOPY_IRQ)|(1U << EBREAK_IRQ)|(1U << BUSERR_IRQ));    set_led(0);    con_set_baudrate(115200);    con_puts(hello);    abc_init();    init_abc_memmap();    timer_irq_count = 0;    timer_irq_start = rdtime();    unmask_irq(SYSCLOCK_IRQ);    read_rtc();    abcdisk_init();}void main(void){    init();    while (1) {	wait_for_irq();	abcdisk_io_poll();    }}
 |