move drivers into namespaces

pull/3/head
Clyne 4 years ago
parent 7f59ca704b
commit d060dce4ec

@ -18,7 +18,7 @@ constexpr static const ADCConfig adc_config = {
.difsel = 0 .difsel = 0
}; };
void adc_read_callback(ADCDriver *); static void adc_read_callback(ADCDriver *);
/*constexpr*/ static ADCConversionGroup adc_group_config = { /*constexpr*/ static ADCConversionGroup adc_group_config = {
.circular = false, .circular = false,
@ -46,61 +46,64 @@ constexpr static const GPTConfig gpt_config = {
static bool adc_is_read_finished = false; static bool adc_is_read_finished = false;
void adc_init()
{
palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG);
gptStart(gptd, &gpt_config);
adcStart(adcd, &adc_config);
adcSTM32EnableVREF(adcd);
}
adcsample_t *adc_read(adcsample_t *buffer, size_t count)
{
adc_is_read_finished = false;
adcStartConversion(adcd, &adc_group_config, buffer, count);
gptStartContinuous(gptd, 100); // 10kHz
while (!adc_is_read_finished);
return buffer;
}
void adc_read_callback([[maybe_unused]] ADCDriver *driver) void adc_read_callback([[maybe_unused]] ADCDriver *driver)
{ {
gptStopTimer(gptd); gptStopTimer(gptd);
adc_is_read_finished = true; adc_is_read_finished = true;
} }
void adc_set_rate(ADCRate rate) namespace adc
{ {
uint32_t val = 0; void init()
{
palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG);
gptStart(gptd, &gpt_config);
adcStart(adcd, &adc_config);
adcSTM32EnableVREF(adcd);
}
switch (rate) { adcsample_t *read(adcsample_t *buffer, size_t count)
case ADCRate::R2P5: {
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_2P5); adc_is_read_finished = false;
break; adcStartConversion(adcd, &adc_group_config, buffer, count);
case ADCRate::R6P5: gptStartContinuous(gptd, 100); // 10kHz
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_6P5); while (!adc_is_read_finished);
break; return buffer;
case ADCRate::R12P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_12P5);
break;
case ADCRate::R24P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_24P5);
break;
case ADCRate::R47P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_47P5);
break;
case ADCRate::R92P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_92P5);
break;
case ADCRate::R247P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_247P5);
break;
case ADCRate::R640P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_640P5);
break;
} }
adc_group_config.smpr[0] = val; void set_rate(rate r)
{
uint32_t val = 0;
switch (r) {
case rate::R2P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_2P5);
break;
case rate::R6P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_6P5);
break;
case rate::R12P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_12P5);
break;
case rate::R24P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_24P5);
break;
case rate::R47P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_47P5);
break;
case rate::R92P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_92P5);
break;
case rate::R247P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_247P5);
break;
case rate::R640P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_640P5);
break;
}
adc_group_config.smpr[0] = val;
}
} }

@ -14,20 +14,23 @@
#include "hal.h" #include "hal.h"
enum class ADCRate { namespace adc
R2P5, {
R6P5, enum class rate {
R12P5, R2P5,
R24P5, R6P5,
R47P5, R12P5,
R92P5, R24P5,
R247P5, R47P5,
R640P5 R92P5,
}; R247P5,
R640P5
};
void adc_init(); void init();
adcsample_t *adc_read(adcsample_t *buffer, size_t count); adcsample_t *read(adcsample_t *buffer, size_t count);
void adc_set_rate(ADCRate rate); void set_rate(rate r);
}
#endif // STMDSP_ADC_HPP_ #endif // STMDSP_ADC_HPP_

@ -34,24 +34,27 @@ constexpr static const GPTConfig gpt_config = {
.dier = 0 .dier = 0
}; };
void dac_init() namespace dac
{ {
palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG); void init()
//palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG); {
palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG);
dacStart(dacd, &dac_config); //palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
gptStart(gptd, &gpt_config);
} dacStart(dacd, &dac_config);
gptStart(gptd, &gpt_config);
void dac_write_start(dacsample_t *buffer, size_t count) }
{
dacStartConversion(dacd, &dac_group_config, buffer, count); void write_start(dacsample_t *buffer, size_t count)
gptStartContinuous(gptd, 1); {
} dacStartConversion(dacd, &dac_group_config, buffer, count);
gptStartContinuous(gptd, 1);
void dac_write_stop() }
{
gptStopTimer(gptd); void write_stop()
dacStopConversion(dacd); {
gptStopTimer(gptd);
dacStopConversion(dacd);
}
} }

@ -14,9 +14,12 @@
#include "hal.h" #include "hal.h"
void dac_init(); namespace dac
void dac_write_start(dacsample_t *buffer, size_t count); {
void dac_write_stop(); void init();
void write_start(dacsample_t *buffer, size_t count);
void write_stop();
}
#endif // STMDSP_DAC_HPP_ #endif // STMDSP_DAC_HPP_

@ -33,39 +33,39 @@ int main()
palSetPadMode(GPIOA, 5, PAL_MODE_OUTPUT_PUSHPULL); // LED palSetPadMode(GPIOA, 5, PAL_MODE_OUTPUT_PUSHPULL); // LED
adc_init(); adc::init();
dac_init(); dac::init();
usbserial_init(); usbserial::init();
static unsigned int dac_sample_count = 2048; static unsigned int dac_sample_count = 2048;
while (true) { while (true) {
if (usbserial_is_active()) { if (usbserial::is_active()) {
// Expect to receive a byte command 'packet'. // Expect to receive a byte command 'packet'.
if (char cmd[3]; usbserial_read(&cmd, 1) > 0) { if (char cmd[3]; usbserial::read(&cmd, 1) > 0) {
switch (cmd[0]) { switch (cmd[0]) {
case 'r': // Read in analog signal case 'r': // Read in analog signal
if (usbserial_read(&cmd[1], 2) < 2) if (usbserial::read(&cmd[1], 2) < 2)
break; break;
if (auto count = std::min(static_cast<unsigned int>(cmd[1] | (cmd[2] << 8)), adc_samples.size()); count > 0) { if (auto count = std::min(static_cast<unsigned int>(cmd[1] | (cmd[2] << 8)), adc_samples.size()); count > 0) {
adc_read(&adc_samples[0], count); adc::read(&adc_samples[0], count);
usbserial_write(adc_samples.data(), count * sizeof(adcsample_t)); usbserial::write(adc_samples.data(), count * sizeof(adcsample_t));
} }
break; break;
case 'W': case 'W':
if (usbserial_read(&cmd[1], 2) < 2) if (usbserial::read(&cmd[1], 2) < 2)
break; break;
if (auto count = std::min(static_cast<unsigned int>(cmd[1] | (cmd[2] << 8)), dac_samples.size()); count > 0) if (auto count = std::min(static_cast<unsigned int>(cmd[1] | (cmd[2] << 8)), dac_samples.size()); count > 0)
dac_sample_count = count; dac_sample_count = count;
else else
dac_write_stop(); dac::write_stop();
break; break;
case 'w': case 'w':
if (usbserial_read(&dac_samples[0], 2 * dac_sample_count) != 2 * dac_sample_count) if (usbserial::read(&dac_samples[0], 2 * dac_sample_count) != 2 * dac_sample_count)
break; break;
dac_write_start(&dac_samples[0], dac_sample_count); dac::write_start(&dac_samples[0], dac_sample_count);
break; break;
case 'i': // Identify ourself as an stmdsp device case 'i': // Identify ourself as an stmdsp device
usbserial_write("stmdsp", 6); usbserial::write("stmdsp", 6);
break; break;
default: default:
break; break;

@ -15,35 +15,38 @@
constexpr static const auto sdud = &SDU1; constexpr static const auto sdud = &SDU1;
void usbserial_init() namespace usbserial
{ {
palSetPadMode(GPIOA, 11, PAL_MODE_ALTERNATE(10)); void init()
palSetPadMode(GPIOA, 12, PAL_MODE_ALTERNATE(10)); {
palSetPadMode(GPIOA, 11, PAL_MODE_ALTERNATE(10));
sduObjectInit(sdud); palSetPadMode(GPIOA, 12, PAL_MODE_ALTERNATE(10));
sduStart(sdud, &serusbcfg);
sduObjectInit(sdud);
// Reconnect bus so device can re-enumerate on reset sduStart(sdud, &serusbcfg);
usbDisconnectBus(serusbcfg.usbp);
chThdSleepMilliseconds(1500); // Reconnect bus so device can re-enumerate on reset
usbStart(serusbcfg.usbp, &usbcfg); usbDisconnectBus(serusbcfg.usbp);
usbConnectBus(serusbcfg.usbp); chThdSleepMilliseconds(1500);
} usbStart(serusbcfg.usbp, &usbcfg);
usbConnectBus(serusbcfg.usbp);
bool usbserial_is_active() }
{
return sdud->config->usbp->state == USB_ACTIVE; bool is_active()
} {
return sdud->config->usbp->state == USB_ACTIVE;
size_t usbserial_read(void *buffer, size_t count) }
{
auto bss = reinterpret_cast<BaseSequentialStream *>(sdud); size_t read(void *buffer, size_t count)
return streamRead(bss, static_cast<uint8_t *>(buffer), count); {
} auto bss = reinterpret_cast<BaseSequentialStream *>(sdud);
return streamRead(bss, static_cast<uint8_t *>(buffer), count);
size_t usbserial_write(const void *buffer, size_t count) }
{
auto bss = reinterpret_cast<BaseSequentialStream *>(sdud); size_t write(const void *buffer, size_t count)
return streamWrite(bss, static_cast<const uint8_t *>(buffer), count); {
auto bss = reinterpret_cast<BaseSequentialStream *>(sdud);
return streamWrite(bss, static_cast<const uint8_t *>(buffer), count);
}
} }

@ -14,10 +14,14 @@
#include "hal.h" #include "hal.h"
void usbserial_init(); namespace usbserial
bool usbserial_is_active(); {
size_t usbserial_read(void *buffer, size_t count); void init();
size_t usbserial_write(const void *buffer, size_t count); bool is_active();
size_t read(void *buffer, size_t count);
size_t write(const void *buffer, size_t count);
}
#endif // STMDSP_USBSERIAL_HPP_ #endif // STMDSP_USBSERIAL_HPP_

Loading…
Cancel
Save