X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=carlfw%2Fsrc%2Fmain.c;h=55acb44792e9fe776666d6bd218d2abfc037a4c5;hb=561a9e137c373ca302c20428dc9b0f4de66e27b3;hp=f62e5ee7b6ce612a1c786ebf4a049fe990e76c53;hpb=1386db71e21e2d9eacc21b0986f1f91fb441b519;p=carl9170fw.git diff --git a/carlfw/src/main.c b/carlfw/src/main.c index f62e5ee..55acb44 100644 --- a/carlfw/src/main.c +++ b/carlfw/src/main.c @@ -32,6 +32,18 @@ #define AR9170_WATCH_DOG_TIMER 0x100 +static void timer_init(const unsigned int timer, const unsigned int interval) +{ + /* Set timer to periodic mode */ + orl(AR9170_TIMER_REG_CONTROL, BIT(timer)); + + /* Set time interval */ + set(AR9170_TIMER_REG_TIMER0 + (timer << 2), interval - 1); + + /* Clear timer interrupt flag */ + orl(AR9170_TIMER_REG_INTERRUPT, BIT(timer)); +} + static void init(void) { led_init(); @@ -46,6 +58,7 @@ static void init(void) /* USB init */ usb_init(); + /* initialize DMA memory */ memset(&dma_mem, 0, sizeof(dma_mem)); /* fill DMA rings */ @@ -84,7 +97,45 @@ static void handle_fw(void) reboot(); } -static void __attribute__((noreturn)) main_loop(void) +static void timer0_isr(void) +{ + wlan_timer(); + +#ifdef CONFIG_CARL9170FW_GPIO_INTERRUPT + gpio_timer(); +#endif /* CONFIG_CARL9170FW_GPIO_INTERRUPT */ + +#ifdef CONFIG_CARL9170FW_DEBUG_LED_HEARTBEAT + set(AR9170_GPIO_REG_PORT_DATA, get(AR9170_GPIO_REG_PORT_DATA) ^ 1); +#endif /* CONFIG_CARL9170FW_DEBUG_LED_HEARTBEAT */ +} + +static void handle_timer(void) +{ + uint32_t intr; + + intr = get(AR9170_TIMER_REG_INTERRUPT); + + /* ACK timer interrupt */ + set(AR9170_TIMER_REG_INTERRUPT, intr); + +#define HANDLER(intr, flag, func) \ + do { \ + if ((intr & flag) != 0) { \ + intr &= ~flag; \ + func(); \ + } \ + } while (0) + + HANDLER(intr, BIT(0), timer0_isr); + + if (intr) + DBG("Unhandled Timer Event %x", (unsigned int) intr); + +#undef HANDLER +} + +static void __noreturn main_loop(void) { /* main loop */ while (1) { @@ -116,13 +167,10 @@ static void __attribute__((noreturn)) main_loop(void) * we put _start() there with the linker script carl9170.lds. */ -void __attribute__((noreturn)) start(void) +void start(void) { clock_set(true, AHB_40MHZ_OSC); - /* initialize firmware context and DMA memory */ - memset(&fw, 0, sizeof(fw)); - /* watchdog magic pattern check */ if ((get(AR9170_PWR_REG_WATCH_DOG_MAGIC) & 0xffff0000) == 0x12340000) { /* watch dog warm start */