aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2019-08-22 09:16:37 -0400
committerKevin O'Connor <kevin@koconnor.net>2019-08-22 09:58:58 -0400
commit6409eda0580810599422c2a8a2ddce171d9e47ad (patch)
tree38fa305af82a237da53f957475f4e0c43b7c8010
parent44f862388fd9275199276e70abcea1dd819450d8 (diff)
downloadkutter-6409eda0580810599422c2a8a2ddce171d9e47ad.tar.gz
kutter-6409eda0580810599422c2a8a2ddce171d9e47ad.tar.xz
kutter-6409eda0580810599422c2a8a2ddce171d9e47ad.zip
lpc176x: Move irq handler code above irq setup
Only code movement. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--src/lpc176x/adc.c32
-rw-r--r--src/lpc176x/serial.c58
-rw-r--r--src/lpc176x/usbserial.c65
3 files changed, 80 insertions, 75 deletions
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<<EP0OUT)) {
+ sie_select_and_clear(EP0OUT);
+ usb_notify_ep0();
+ }
+ if (ueis & (1<<EP0IN)) {
+ sie_select_and_clear(EP0IN);
+ usb_notify_ep0();
+ }
+ if (ueis & (1<<EP2OUT)) {
+ sie_select_and_clear(EP2OUT);
+ usb_notify_bulk_out();
+ }
+ if (ueis & (1<<EP5IN)) {
+ sie_select_and_clear(EP5IN);
+ usb_notify_bulk_in();
+ }
+ LPC_USB->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<<EP0OUT)) {
- sie_select_and_clear(EP0OUT);
- usb_notify_ep0();
- }
- if (ueis & (1<<EP0IN)) {
- sie_select_and_clear(EP0IN);
- usb_notify_ep0();
- }
- if (ueis & (1<<EP2OUT)) {
- sie_select_and_clear(EP2OUT);
- usb_notify_bulk_out();
- }
- if (ueis & (1<<EP5IN)) {
- sie_select_and_clear(EP5IN);
- usb_notify_bulk_in();
- }
- LPC_USB->USBDevIntClr = EP_SLOW;
- }
-}