Skip to content

Commit

Permalink
Continuation of extracting peripheral configuration into drivers.
Browse files Browse the repository at this point in the history
  • Loading branch information
hydra committed Jun 4, 2014
1 parent 78ca635 commit 32622da
Show file tree
Hide file tree
Showing 17 changed files with 185 additions and 107 deletions.
2 changes: 0 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -242,8 +242,6 @@ STM32F30x_COMMON_SRC = startup_stm32f30x_md_gcc.S \
vcp/usb_pwr.c

NAZE32PRO_SRC = $(STM32F30x_COMMON_SRC) \
drivers/accgyro_mpu6050.c \
drivers/compass_hmc5883l.c \
$(COMMON_SRC)

STM32F3DISCOVERY_COMMON_SRC = $(STM32F30x_COMMON_SRC) \
Expand Down
14 changes: 8 additions & 6 deletions src/main/config/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,13 +376,21 @@ void validateAndFixConfig(void)
featureSet(FEATURE_RX_PARALLEL_PWM); // Consider changing the default to PPM
}

if (feature(FEATURE_RX_PPM)) {
if (feature(FEATURE_RX_PARALLEL_PWM)) {
featureClear(FEATURE_RX_PARALLEL_PWM);
}
}

if (feature(FEATURE_RX_PARALLEL_PWM)) {
#if defined(NAZE) || defined(OLIMEXINO)
if (feature(FEATURE_RSSI_ADC)) {
featureClear(FEATURE_RSSI_ADC);
}
if (feature(FEATURE_CURRENT_METER)) {
featureClear(FEATURE_CURRENT_METER);
}
#endif
}

if (feature(FEATURE_RX_MSP)) {
Expand All @@ -406,12 +414,6 @@ void validateAndFixConfig(void)
}
}

if (feature(FEATURE_RX_PPM)) {
if (feature(FEATURE_RX_PARALLEL_PWM)) {
featureClear(FEATURE_RX_PARALLEL_PWM);
}
}

#ifdef SONAR
if (feature(FEATURE_SONAR)) {
// sonar needs a free PWM port
Expand Down
25 changes: 19 additions & 6 deletions src/main/drivers/accgyro_mma845x.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,24 +81,37 @@ bool mma8452Detect(acc_t *acc)
return true;
}

static void mma8452Init(void)
static inline void mma8451ConfigureInterrupt(void)
{
#ifdef NAZE
// PA5 - ACC_INT2 output on NAZE rev3/4 hardware
// OLIMEXINO - The PA5 pin is wired up to LED1, if you need to use an mma8452 on an Olimexino use a different pin and provide support in code.

gpio_config_t gpio;

// PA5 - ACC_INT2 output on rev3/4 hardware
// OLIMEXINO - The PA5 pin is wired up to LED1, if you need to use an mma8452 on an Olimexino use a different pin and provide support in code.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

gpio.pin = Pin_5;
gpio.speed = Speed_2MHz;
gpio.mode = Mode_IN_FLOATING;
gpioInit(GPIOA, &gpio);
#endif

i2cWrite(MMA8452_ADDRESS, MMA8452_CTRL_REG3, MMA8452_CTRL_REG3_IPOL); // Interrupt polarity (active HIGH)
i2cWrite(MMA8452_ADDRESS, MMA8452_CTRL_REG4, MMA8452_CTRL_REG4_INT_EN_DRDY); // Enable DRDY interrupt (unused by this driver)
i2cWrite(MMA8452_ADDRESS, MMA8452_CTRL_REG5, 0); // DRDY routed to INT2
}

static void mma8452Init(void)
{

i2cWrite(MMA8452_ADDRESS, MMA8452_CTRL_REG1, 0); // Put device in standby to configure stuff
i2cWrite(MMA8452_ADDRESS, MMA8452_XYZ_DATA_CFG, MMA8452_FS_RANGE_8G);
i2cWrite(MMA8452_ADDRESS, MMA8452_HP_FILTER_CUTOFF, MMA8452_HPF_CUTOFF_LV4);
i2cWrite(MMA8452_ADDRESS, MMA8452_CTRL_REG2, MMA8452_CTRL_REG2_MODS_HR | MMA8452_CTRL_REG2_MODS_HR << 3); // High resolution measurement in both sleep and active modes
i2cWrite(MMA8452_ADDRESS, MMA8452_CTRL_REG3, MMA8452_CTRL_REG3_IPOL); // Interrupt polarity (active HIGH)
i2cWrite(MMA8452_ADDRESS, MMA8452_CTRL_REG4, MMA8452_CTRL_REG4_INT_EN_DRDY); // Enable DRDY interrupt (unused by this driver)
i2cWrite(MMA8452_ADDRESS, MMA8452_CTRL_REG5, 0); // DRDY routed to INT2

mma8451ConfigureInterrupt();

i2cWrite(MMA8452_ADDRESS, MMA8452_CTRL_REG1, MMA8452_CTRL_REG1_LNOISE | MMA8452_CTRL_REG1_ACTIVE); // Turn on measurements, low noise at max scale mode, Data Rate 800Hz. LNoise mode makes range +-4G.

acc_1G = 256;
Expand Down
19 changes: 18 additions & 1 deletion src/main/drivers/adc_stm32f10x.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,25 +26,35 @@ void adcInit(drv_adc_config_t *init)
{
ADC_InitTypeDef adc;
DMA_InitTypeDef dma;
uint8_t i;
GPIO_InitTypeDef GPIO_InitStructure;

uint8_t i;
uint8_t configuredAdcChannels = 0;

memset(&adcConfig, 0, sizeof(adcConfig));

GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

// configure always-present battery index (ADC4)
adcConfig[ADC_BATTERY].adcChannel = ADC_Channel_4;
adcConfig[ADC_BATTERY].dmaIndex = configuredAdcChannels++;
adcConfig[ADC_BATTERY].enabled = true;
adcConfig[ADC_BATTERY].sampleTime = ADC_SampleTime_239Cycles5;

if (init->enableRSSI) {
GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_1;

adcConfig[ADC_RSSI].adcChannel = ADC_Channel_1;
adcConfig[ADC_RSSI].dmaIndex = configuredAdcChannels++;
adcConfig[ADC_RSSI].enabled = true;
adcConfig[ADC_RSSI].sampleTime = ADC_SampleTime_239Cycles5;
}

#ifdef OLIMEXINO
GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_5;

adcConfig[ADC_EXTERNAL1].adcChannel = ADC_Channel_5;
adcConfig[ADC_EXTERNAL1].dmaIndex = configuredAdcChannels++;
adcConfig[ADC_EXTERNAL1].enabled = true;
Expand All @@ -54,14 +64,21 @@ void adcInit(drv_adc_config_t *init)
#ifdef NAZE
// optional ADC5 input on rev.5 hardware
if (hse_value == 12000000) {
GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_5;

adcConfig[ADC_EXTERNAL1].adcChannel = ADC_Channel_5;
adcConfig[ADC_EXTERNAL1].dmaIndex = configuredAdcChannels++;
adcConfig[ADC_EXTERNAL1].enabled = true;
adcConfig[ADC_EXTERNAL1].sampleTime = ADC_SampleTime_239Cycles5;
}
#endif

GPIO_Init(GPIOA, &GPIO_InitStructure);

if (init->enableCurrentMeter) {
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOB, &GPIO_InitStructure);

adcConfig[ADC_CURRENT].adcChannel = ADC_Channel_9;
adcConfig[ADC_CURRENT].dmaIndex = configuredAdcChannels++;
adcConfig[ADC_CURRENT].enabled = true;
Expand Down
22 changes: 14 additions & 8 deletions src/main/drivers/adc_stm32f30x.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <stdbool.h>
#include <stdint.h>
#include <string.h>

#include "platform.h"
#include "system.h"
Expand All @@ -14,7 +15,6 @@

extern adc_config_t adcConfig[ADC_CHANNEL_COUNT];
extern volatile uint16_t adcValues[ADC_CHANNEL_COUNT];
uint8_t adcChannelCount;

void adcInit(drv_adc_config_t *init)
{
Expand All @@ -23,6 +23,14 @@ void adcInit(drv_adc_config_t *init)
GPIO_InitTypeDef GPIO_InitStructure;

uint8_t i;
uint8_t adcChannelCount = 0;

memset(&adcConfig, 0, sizeof(adcConfig));

GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

adcConfig[ADC_BATTERY].adcChannel = ADC_Channel_6;
adcConfig[ADC_BATTERY].dmaIndex = adcChannelCount;
Expand All @@ -31,14 +39,19 @@ void adcInit(drv_adc_config_t *init)
adcChannelCount++;

if (init->enableCurrentMeter) {
GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_1;

adcConfig[ADC_CURRENT].adcChannel = ADC_Channel_7;
adcConfig[ADC_CURRENT].dmaIndex = adcChannelCount;
adcConfig[ADC_CURRENT].sampleTime = ADC_SampleTime_601Cycles5;
adcConfig[ADC_CURRENT].enabled = true;
adcChannelCount++;

}

if (init->enableRSSI) {
GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_2;

adcConfig[ADC_RSSI].adcChannel = ADC_Channel_8;
adcConfig[ADC_RSSI].dmaIndex = adcChannelCount;
adcConfig[ADC_RSSI].sampleTime = ADC_SampleTime_601Cycles5;
Expand All @@ -55,8 +68,6 @@ void adcInit(drv_adc_config_t *init)
RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div256); // 72 MHz divided by 256 = 281.25 kHz
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_ADC12, ENABLE);

// FIXME ADC driver assumes all the GPIO was already placed in 'AIN' mode

DMA_DeInit(DMA1_Channel1);

DMA_StructInit(&DMA_InitStructure);
Expand All @@ -76,11 +87,6 @@ void adcInit(drv_adc_config_t *init)

DMA_Cmd(DMA1_Channel1, ENABLE);

GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

GPIO_Init(GPIOC, &GPIO_InitStructure);

// calibrate
Expand Down
2 changes: 2 additions & 0 deletions src/main/drivers/barometer_bmp085.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ bool bmp085Detect(baro_t *baro)
if (bmp085InitDone)
return true;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

// PC13, PC14 (Barometer XCLR reset output, EOC input)
gpio.pin = Pin_13;
gpio.speed = Speed_2MHz;
Expand Down
2 changes: 2 additions & 0 deletions src/main/drivers/barometer_ms5611.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ bool ms5611Detect(baro_t *baro)
int i;

if (hse_value != 12000000) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

// PC13 (BMP085's XCLR reset input, which we use to disable it). Only needed when running at 8MHz
gpio_config_t gpio;
gpio.pin = Pin_13;
Expand Down
2 changes: 1 addition & 1 deletion src/main/drivers/bus_i2c_stm32f30x.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ void i2cInitPort(I2C_TypeDef *I2Cx)

void i2cInit(I2C_TypeDef *I2C)
{
i2cInitPort(I2C1);
i2cInitPort(I2C1); // hard coded to use I2C1 for now
}

uint16_t i2cGetErrorCounter(void)
Expand Down
2 changes: 2 additions & 0 deletions src/main/drivers/compass_hmc5883l.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,14 @@ void hmc5883lInit(void)
bool bret = true; // Error indicator

if (hse_value == 8000000) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// PB12 - MAG_DRDY output on rev4 hardware
gpio.pin = Pin_12;
gpio.speed = Speed_2MHz;
gpio.mode = Mode_IN_FLOATING;
gpioInit(GPIOB, &gpio);
} else if (hse_value == 12000000) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// PC14 - MAG_DRDY output on rev5 hardware
gpio.pin = Pin_14;
gpioInit(GPIOC, &gpio);
Expand Down
86 changes: 4 additions & 82 deletions src/main/drivers/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,6 @@ void systemInit(bool overclock)
SCB->CPACR = (0x3 << (10*2)) | (0x3 << (11*2));
#endif

gpio_config_t gpio;

#ifdef STM32F303xC
SetSysClock();
#endif
Expand All @@ -79,99 +77,23 @@ void systemInit(bool overclock)
// Configure NVIC preempt/priority groups
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

// Turn on clocks for stuff we use
#ifdef STM32F10X_MD
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_TIM1, ENABLE);
// Turn on clocks for stuff we use
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
#endif
#ifdef STM32F303xC

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE);
RCC_ClearFlag();

RCC_APB2PeriphClockCmd(
RCC_APB2Periph_TIM1 |
RCC_APB2Periph_TIM8 |
#ifdef CHEBUZZF3
RCC_APB2Periph_TIM15 |
#endif
RCC_APB2Periph_TIM16 |
RCC_APB2Periph_TIM17,
ENABLE
);
RCC_AHBPeriphClockCmd(
RCC_AHBPeriph_GPIOA |
RCC_AHBPeriph_GPIOB |
RCC_AHBPeriph_GPIOC |
RCC_AHBPeriph_GPIOD |
#ifdef CHEBUZZF3
RCC_AHBPeriph_GPIOF |
#endif
RCC_AHBPeriph_GPIOE,
ENABLE
);
#endif

RCC_ClearFlag();
enableGPIOPowerUsageAndNoiseReductions();

// Make all GPIO in by default to save power and reduce noise
gpio.mode = Mode_AIN;
gpio.pin = Pin_All;
#ifdef STM32F303xC
gpio.pin = Pin_All & ~(Pin_13|Pin_14|Pin_15); // Leave JTAG pins alone
gpioInit(GPIOA, &gpio);
gpio.pin = Pin_All;
#else
gpioInit(GPIOA, &gpio);
#endif
gpioInit(GPIOB, &gpio);
gpioInit(GPIOC, &gpio);
#ifdef STM32F303xC
gpioInit(GPIOD, &gpio);
gpioInit(GPIOE, &gpio);
#ifdef CHEBUZZF3
gpioInit(GPIOF, &gpio);
#endif
#endif

#ifdef STM32F10X_MD
// Turn off JTAG port 'cause we're using the GPIO for leds
#define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24)
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_NO_JTAG_SW;
#endif

#ifdef STM32F303xC
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_6);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_4);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_4);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_4);
#ifdef CHEBUZZF3
GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_3);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource10, GPIO_AF_3);
#endif
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_2);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_2);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_2);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_2);
#endif

#ifdef NAZE32PRO
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_6);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_6);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_2);
#endif

ledInit();
beeperInit();

Expand Down
1 change: 1 addition & 0 deletions src/main/drivers/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ void failureMode(uint8_t mode);
// bootloader/IAP
void systemReset(bool toBootloader);

void enableGPIOPowerUsageAndNoiseReductions(void);
// current crystal frequency - 8 or 12MHz
extern uint32_t hse_value;
Loading

0 comments on commit 32622da

Please sign in to comment.