#include "../include/fb.h" #include "../include/io.h" #include "../include/spi.h" #include "../include/multicore.h" #include "../net/enc28j60.h" #include "kernel.h" void initProgress(void) { drawRect(0, 0, 301, 50, 0x0f, 0); drawString(309, 21, "Core 1", 0x0f, 1); drawRect(0, 60, 301, 110, 0x0f, 0); drawString(309, 81, "Core 2", 0x0f, 1); drawRect(0, 120, 301, 170, 0x0f, 0); drawString(309, 141, "Timer 1", 0x0f, 1); drawRect(0, 180, 301, 230, 0x0f, 0); drawString(309, 201, "Timer 3", 0x0f, 1); } void drawProgress(unsigned int core, unsigned int val) { unsigned char col = (core + 1) + ((core + 1) << 4); // val should be 0-100 if (val == 0) drawRect(1, (60 * core) + 1, 300, (60 * core) + 49, 0x00, 1); if (val > 0) drawRect(1, (60 * core) + 1, (val * 3), (60 * core) + 49, col, 1); } unsigned int c2_done = 0; void core2_main(void) { unsigned int core2_val = 0; clear_core2(); // Only run once while (core2_val <= 100) { wait_msec(0x100000); drawProgress(1, core2_val); core2_val++; } debugstr("Core 2 done."); debugcrlf(); c2_done = 1; while(1); } void core1_main(void) { unsigned int core1_val = 0; clear_core1(); // Only run once while (core1_val <= 100) { wait_msec(0x3FFFF); drawProgress(0, core1_val); core1_val++; } debugstr("Core 1 done."); debugcrlf(); while(1); } // TIMER FUNCTIONS const unsigned int timer1_int = CLOCKHZ; const unsigned int timer3_int = CLOCKHZ / 4; unsigned int timer1_val = 0; unsigned int timer3_val = 0; void timer_init() { timer1_val = REGS_TIMER->counter_lo; timer1_val += timer1_int; REGS_TIMER->compare[1] = timer1_val; timer3_val = REGS_TIMER->counter_lo; timer3_val += timer3_int; REGS_TIMER->compare[3] = timer3_val; } void handle_timer_1() { timer1_val += timer1_int; REGS_TIMER->compare[1] = timer1_val; REGS_TIMER->control_status |= SYS_TIMER_IRQ_1; unsigned int progval = timer1_val / timer1_int; if (progval <= 100) { drawProgress(2, progval); } else { debugstr("Timer 1 done."); debugcrlf(); } } void handle_timer_3() { timer3_val += timer3_int; REGS_TIMER->compare[3] = timer3_val; REGS_TIMER->control_status |= SYS_TIMER_IRQ_3; unsigned int progval = timer3_val / timer3_int; if (progval <= 100) drawProgress(3, progval); } unsigned long timer_get_ticks() { unsigned int hi = REGS_TIMER->counter_hi; unsigned int lo = REGS_TIMER->counter_lo; //double check hi value didn't change after setting it... if (hi != REGS_TIMER->counter_hi) { hi = REGS_TIMER->counter_hi; lo = REGS_TIMER->counter_lo; } return ((unsigned long)hi << 32) | lo; } void timer_sleep(unsigned int ms) { unsigned long start = timer_get_ticks(); while(timer_get_ticks() < start + (ms * 1000)); } void HAL_Delay(volatile unsigned int Delay) { timer_sleep(Delay); } unsigned int HAL_GetTick(void) { return timer_get_ticks(); } void main(void) { fb_init(); unsigned int i=0; while (i++<30) debugcrlf(); initProgress(); // Kick it off on core 1&2 start_core1(core1_main); start_core2(core2_main); // Kick off the timers irq_init_vectors(); enable_interrupt_controller(); irq_enable(); timer_init(); // Test the network card spi_init(); init_network(); arp_test(); // The work is done - wait for timers to get done debugstr("Core 0 done."); debugcrlf(); while (!c2_done); // Disable IRQs and loop endlessly irq_disable(); disable_interrupt_controller(); while(1); }