diff --git a/src/lpc176x/adc.c b/src/lpc176x/adc.c index 4ea4e815..e89d73a4 100644 --- a/src/lpc176x/adc.c +++ b/src/lpc176x/adc.c @@ -36,6 +36,22 @@ static struct { enum { ADC_DONE=0x0100 }; +// ADC hardware irq handler +void __visible +ADC_IRQHandler(void) +{ + uint32_t pos = adc_status.pos, chan = adc_status.chan & 0xff; + uint32_t result = (&LPC_ADC->ADDR0)[chan]; + if (pos >= ARRAY_SIZE(adc_status.samples)) + // All samples complete + return; + if (pos >= ARRAY_SIZE(adc_status.samples) - 2) + // Turn off burst mode + LPC_ADC->ADCR = adc_status.adcr | (1 << chan); + adc_status.samples[pos++] = (result >> 4) & 0x0fff; + adc_status.pos = pos; +} + struct gpio_adc gpio_adc_setup(uint8_t pin) { @@ -64,22 +80,6 @@ gpio_adc_setup(uint8_t pin) return (struct gpio_adc){ .chan = chan }; } -// ADC hardware irq handler -void __visible -ADC_IRQHandler(void) -{ - uint32_t pos = adc_status.pos, chan = adc_status.chan & 0xff; - uint32_t result = (&LPC_ADC->ADDR0)[chan]; - if (pos >= ARRAY_SIZE(adc_status.samples)) - // All samples complete - return; - if (pos >= ARRAY_SIZE(adc_status.samples) - 2) - // Turn off burst mode - LPC_ADC->ADCR = adc_status.adcr | (1 << chan); - adc_status.samples[pos++] = (result >> 4) & 0x0fff; - adc_status.pos = pos; -} - // Try to sample a value. Returns zero if sample ready, otherwise // returns the number of clock ticks the caller should wait before // retrying this function. diff --git a/src/lpc176x/serial.c b/src/lpc176x/serial.c index 63755467..f36a485c 100644 --- a/src/lpc176x/serial.c +++ b/src/lpc176x/serial.c @@ -12,35 +12,6 @@ #include "internal.h" // gpio_peripheral #include "sched.h" // DECL_INIT -DECL_CONSTANT_STR("RESERVE_PINS_serial", "P0.3,P0.2"); - -void -serial_init(void) -{ - // Setup baud - LPC_UART0->LCR = (1<<7); // set DLAB bit - enable_pclock(PCLK_UART0); - uint32_t pclk = SystemCoreClock; - uint32_t div = pclk / (CONFIG_SERIAL_BAUD * 16); - LPC_UART0->DLL = div & 0xff; - LPC_UART0->DLM = (div >> 8) & 0xff; - LPC_UART0->FDR = 0x10; - LPC_UART0->LCR = 3; // 8N1 ; clear DLAB bit - - // Enable fifo - LPC_UART0->FCR = 0x01; - - // Setup pins - gpio_peripheral(GPIO(0, 3), 1, 0); - gpio_peripheral(GPIO(0, 2), 1, 0); - - // Enable receive irq - NVIC_SetPriority(UART0_IRQn, 0); - NVIC_EnableIRQ(UART0_IRQn); - LPC_UART0->IER = 0x01; -} -DECL_INIT(serial_init); - // Write tx bytes to the serial port static void kick_tx(void) @@ -81,3 +52,32 @@ serial_enable_tx_irq(void) irq_restore(flag); } } + +DECL_CONSTANT_STR("RESERVE_PINS_serial", "P0.3,P0.2"); + +void +serial_init(void) +{ + // Setup baud + LPC_UART0->LCR = (1<<7); // set DLAB bit + enable_pclock(PCLK_UART0); + uint32_t pclk = SystemCoreClock; + uint32_t div = pclk / (CONFIG_SERIAL_BAUD * 16); + LPC_UART0->DLL = div & 0xff; + LPC_UART0->DLM = (div >> 8) & 0xff; + LPC_UART0->FDR = 0x10; + LPC_UART0->LCR = 3; // 8N1 ; clear DLAB bit + + // Enable fifo + LPC_UART0->FCR = 0x01; + + // Setup pins + gpio_peripheral(GPIO(0, 3), 1, 0); + gpio_peripheral(GPIO(0, 2), 1, 0); + + // Enable receive irq + NVIC_SetPriority(UART0_IRQn, 0); + NVIC_EnableIRQ(UART0_IRQn); + LPC_UART0->IER = 0x01; +} +DECL_INIT(serial_init); diff --git a/src/lpc176x/usbserial.c b/src/lpc176x/usbserial.c index b6779ed1..90e72cc4 100644 --- a/src/lpc176x/usbserial.c +++ b/src/lpc176x/usbserial.c @@ -260,6 +260,41 @@ usb_request_bootloader(void) NVIC_SystemReset(); } + +/**************************************************************** + * Setup and interrupts + ****************************************************************/ + +void __visible +USB_IRQHandler(void) +{ + uint32_t udis = LPC_USB->USBDevIntSt; + if (udis & DEV_STAT) { + LPC_USB->USBDevIntClr = DEV_STAT; + // XXX - should handle reset and other states + } + if (udis & EP_SLOW) { + uint32_t ueis = LPC_USB->USBEpIntSt; + if (ueis & (1<USBDevIntClr = EP_SLOW; + } +} + DECL_CONSTANT_STR("RESERVE_PINS_USB", "P0.30,P0.29,P2.9"); void @@ -295,33 +330,3 @@ usbserial_shutdown(void) usb_irq_enable(); } DECL_SHUTDOWN(usbserial_shutdown); - -void __visible -USB_IRQHandler(void) -{ - uint32_t udis = LPC_USB->USBDevIntSt; - if (udis & DEV_STAT) { - LPC_USB->USBDevIntClr = DEV_STAT; - // XXX - should handle reset and other states - } - if (udis & EP_SLOW) { - uint32_t ueis = LPC_USB->USBEpIntSt; - if (ueis & (1<USBDevIntClr = EP_SLOW; - } -}