aboutsummaryrefslogtreecommitdiffstats
path: root/src/lpc176x/gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lpc176x/gpio.c')
-rw-r--r--src/lpc176x/gpio.c94
1 files changed, 0 insertions, 94 deletions
diff --git a/src/lpc176x/gpio.c b/src/lpc176x/gpio.c
index 5f5f9375..e48feb01 100644
--- a/src/lpc176x/gpio.c
+++ b/src/lpc176x/gpio.c
@@ -6,9 +6,7 @@
#include <string.h> // ffs
#include "LPC17xx.h" // LPC_PINCON
-#include "autoconf.h" // CONFIG_CLOCK_FREQ
#include "board/irq.h" // irq_save
-#include "board/misc.h" // timer_from_us
#include "command.h" // shutdown
#include "gpio.h" // gpio_out_setup
#include "internal.h" // gpio_peripheral
@@ -19,10 +17,6 @@
* Pin mappings
****************************************************************/
-#define GPIO(PORT, NUM) ((PORT) * 32 + (NUM))
-#define GPIO2PORT(PIN) ((PIN) / 32)
-#define GPIO2BIT(PIN) (1<<((PIN) % 32))
-
static LPC_GPIO_TypeDef * const digital_regs[] = {
LPC_GPIO0, LPC_GPIO1, LPC_GPIO2, LPC_GPIO3, LPC_GPIO4
};
@@ -160,91 +154,3 @@ gpio_in_read(struct gpio_in g)
LPC_GPIO_TypeDef *regs = g.regs;
return !!(regs->FIOPIN & g.bit);
}
-
-
-/****************************************************************
- * Analog to Digital Converter (ADC) pins
- ****************************************************************/
-
-static const uint8_t adc_pins[] = {
- GPIO(0, 23), GPIO(0, 24), GPIO(0, 25), GPIO(0, 26),
- GPIO(1, 30), GPIO(1, 31), GPIO(0, 3), GPIO(0, 2),
-};
-
-static const uint8_t adc_pin_funcs[] = {
- 1, 1, 1, 1, 3, 3, 2, 2
-};
-
-#define ADC_FREQ_MAX 13000000
-DECL_CONSTANT(ADC_MAX, 4095);
-
-struct gpio_adc
-gpio_adc_setup(uint8_t pin)
-{
- // Find pin in adc_pins table
- int chan;
- for (chan=0; ; chan++) {
- if (chan >= ARRAY_SIZE(adc_pins))
- shutdown("Not a valid ADC pin");
- if (adc_pins[chan] == pin)
- break;
- }
-
- uint32_t prescal = DIV_ROUND_UP(CONFIG_CLOCK_FREQ*4, ADC_FREQ_MAX) - 1;
- uint32_t adcr = (1<<21) | ((prescal & 0xff) << 8);
- if (!(LPC_SC->PCONP & (1<<PCLK_ADC))) {
- // Power up ADC
- enable_peripheral_clock(PCLK_ADC);
- LPC_ADC->ADCR = adcr;
- }
-
- gpio_peripheral(GPIO2PORT(pin), pin % 32, adc_pin_funcs[chan], 0);
-
- return (struct gpio_adc){ .cmd = adcr | (1 << chan) | (1 << 24) };
-}
-
-static uint32_t adc_status;
-
-// 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.
-uint32_t
-gpio_adc_sample(struct gpio_adc g)
-{
- uint32_t status = adc_status;
- if (status == g.cmd) {
- // Sample already underway - check if it is ready
- uint32_t val = LPC_ADC->ADGDR;
- if (val & (1<<31))
- // Sample ready
- return 0;
- goto need_delay;
- }
- if (status)
- // ADC busy on some other channel
- goto need_delay;
-
- // Start new sample
- adc_status = g.cmd;
- LPC_ADC->ADCR = g.cmd;
-
-need_delay:
- return (65 * DIV_ROUND_UP(CONFIG_CLOCK_FREQ*4, ADC_FREQ_MAX)
- + timer_from_us(10));
-}
-
-// Read a value; use only after gpio_adc_sample() returns zero
-uint16_t
-gpio_adc_read(struct gpio_adc g)
-{
- adc_status = 0;
- return (LPC_ADC->ADGDR >> 4) & 0x0fff;
-}
-
-// Cancel a sample that may have been started with gpio_adc_sample()
-void
-gpio_adc_cancel_sample(struct gpio_adc g)
-{
- if (adc_status == g.cmd)
- adc_status = 0;
-}