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.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/lpc176x/gpio.c b/src/lpc176x/gpio.c
index 49363d2a..5f5f9375 100644
--- a/src/lpc176x/gpio.c
+++ b/src/lpc176x/gpio.c
@@ -32,6 +32,20 @@ static LPC_GPIO_TypeDef * const digital_regs[] = {
* General Purpose Input Output (GPIO) pins
****************************************************************/
+// Enable a peripheral clock
+void
+enable_peripheral_clock(uint32_t pclk)
+{
+ LPC_SC->PCONP |= 1<<pclk;
+ if (pclk < 16) {
+ uint32_t shift = pclk * 2;
+ LPC_SC->PCLKSEL0 = (LPC_SC->PCLKSEL0 & ~(0x3<<shift)) | (0x1<<shift);
+ } else {
+ uint32_t shift = (pclk - 16) * 2;
+ LPC_SC->PCLKSEL1 = (LPC_SC->PCLKSEL1 & ~(0x3<<shift)) | (0x1<<shift);
+ }
+}
+
// Set the mode and extended function of a pin
void
gpio_peripheral(int bank, int pin, int func, int pullup)
@@ -178,10 +192,9 @@ gpio_adc_setup(uint8_t pin)
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<<12))) {
+ if (!(LPC_SC->PCONP & (1<<PCLK_ADC))) {
// Power up ADC
- LPC_SC->PCONP |= 1<<12;
- LPC_SC->PCLKSEL0 = (LPC_SC->PCLKSEL0 & ~(0x3<<24)) | (0x1<<24);
+ enable_peripheral_clock(PCLK_ADC);
LPC_ADC->ADCR = adcr;
}