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 = ROM_OFFSET;
- 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();
- }
- }
|