main.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "fw.h"
  2. #include "io.h"
  3. #include "abcio.h"
  4. #include "sys.h"
  5. #include "console.h"
  6. volatile uint32_t timer_irq_count;
  7. IRQHANDLER(sysclock)
  8. {
  9. uint32_t count = timer_irq_count;
  10. count++;
  11. timer_irq_count = count;
  12. set_led(count >> 3); /* 4 Hz */
  13. }
  14. /* Configure ABC memory map */
  15. static void init_abc_memmap(void)
  16. {
  17. volatile uint32_t *pg = &ABCMEMMAP_PAGE(0);
  18. for (unsigned int addr = 0; addr < 0x10000; addr += 512) {
  19. if (addr >= 0x5800 && addr < 0x6000) {
  20. *pg++ = ABCMEMMAP_RD | addr;
  21. } else if (addr >= 0x8000 && addr < 0xc000) {
  22. *pg++ = ABCMEMMAP_RD | ABCMEMMAP_WR | addr;
  23. } else {
  24. *pg++ = addr; /* Disabled */
  25. }
  26. }
  27. }
  28. extern const char __dram_init_start[], __dram_init_end[], __dram_init_len[];
  29. extern const char __dram_bss_start[], __dram_bss_end[], __dram_bss_len[];
  30. static uint32_t romcopy_time[2];
  31. static unsigned int romcopy_state;
  32. IRQHANDLER(romcopy)
  33. {
  34. switch (romcopy_state++) {
  35. case 0:
  36. /* Copy testdata */
  37. ROMCOPY_RAMADDR = (size_t)__dram_init_start;
  38. ROMCOPY_ROMADDR = ROM_OFFSET;
  39. ROMCOPY_DATALEN = (size_t)__dram_init_len;
  40. break;
  41. case 1:
  42. /* Zero .dram.bss */
  43. romcopy_time[0] = rdtime() - time_zero;
  44. ROMCOPY_RAMADDR = (size_t)__dram_bss_start;
  45. ROMCOPY_ROMADDR = 0; /* Clear */
  46. ROMCOPY_DATALEN = (size_t)__dram_bss_len;
  47. break;
  48. default:
  49. romcopy_time[1] = rdtime() - romcopy_time[0];
  50. mask_irq(ROMCOPY_IRQ);
  51. return;
  52. }
  53. }
  54. static no_return killed(const char *how, size_t pc)
  55. {
  56. con_printf("ERROR: %s at 0x%08x\n", how, pc);
  57. con_flush();
  58. udelay(5000000);
  59. reset();
  60. }
  61. IRQHANDLER(BUSERR)
  62. {
  63. killed("misaligned", pc);
  64. }
  65. IRQHANDLER(EBREAK)
  66. {
  67. killed("invalid instruction", pc);
  68. }
  69. static uint32_t timer_irq_start;
  70. static void init(void)
  71. {
  72. static const char hello[] =
  73. "\n*** Hello, World! ***\n"
  74. "Firmware compiled on: " __DATE__ " " __TIME__ "\n\n";
  75. /* Start ROM copy engine */
  76. romcopy_state = 0;
  77. unmask_irqs((1U << ROMCOPY_IRQ)|(1U << EBREAK_IRQ)|(1U << BUSERR_IRQ));
  78. set_led(0);
  79. con_set_baudrate(115200);
  80. con_puts(hello);
  81. abc_init();
  82. init_abc_memmap();
  83. timer_irq_count = 0;
  84. timer_irq_start = rdtime();
  85. unmask_irq(SYSCLOCK_IRQ);
  86. read_rtc();
  87. abcdisk_init();
  88. }
  89. void main(void)
  90. {
  91. init();
  92. while (1) {
  93. wait_for_irq();
  94. abcdisk_io_poll();
  95. }
  96. }