Merge pull request #11292 from gschorcht/cpu/esp32/periph/conf/pwm

boards/esp32: changes the approach for configurations of PWM channels in board definitions
This commit is contained in:
Leandro Lanzieri 2019-05-13 16:11:05 +02:00 committed by GitHub
commit ab6d0fe08c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 25 deletions

View File

@ -136,6 +136,19 @@ static const i2c_conf_t i2c_config[] = {
* @{ * @{
*/ */
/**
* @brief Static array of GPIOs that can be used as channels of PWM0
*/
#ifdef PWM0_GPIOS
static const gpio_t pwm0_channels[] = PWM0_GPIOS;
#endif
/**
* @brief Static array of GPIOs that can be used as channels of PWM0
*/
#ifdef PWM1_GPIOS
static const gpio_t pwm1_channels[] = PWM1_GPIOS;
#endif
/** /**
* @brief Number of PWM devices * @brief Number of PWM devices
* *
@ -144,7 +157,13 @@ static const i2c_conf_t i2c_config[] = {
* *
* @note PWM_NUMOF definition must not be changed. * @note PWM_NUMOF definition must not be changed.
*/ */
#define PWM_NUMOF (pwm_dev_num) #if defined(PWM0_GPIOS) && defined(PWM1_GPIOS)
#define PWM_NUMOF (2)
#elif defined(PWM0_GPIOS) || defined(PWM1_GPIOS)
#define PWM_NUMOF (1)
#else
#define PWM_NUMOF (0)
#endif
/** @} */ /** @} */

View File

@ -122,7 +122,7 @@
*/ */
#ifndef PWM0_GPIOS #ifndef PWM0_GPIOS
#if !MODULE_ESP32_WROVER_KIT_CAMERA || DOXYGEN #if !MODULE_ESP32_WROVER_KIT_CAMERA || DOXYGEN
#define PWM0_GPIOS { LED0_PIN, LED2_PIN } /**< only available when camera is not connected */ #define PWM0_GPIOS { GPIO0, GPIO4 } /**< only available when camera is not connected */
#else #else
#define PWM0_GPIOS { } #define PWM0_GPIOS { }
#endif #endif

View File

@ -357,14 +357,16 @@ typedef struct {
* other purposes. * other purposes.
*/ */
/**
* @brief Maximum number of PWM devices
*/
#define PWM_NUMOF_MAX (2)
/** /**
* @brief Maximum number of channels per PWM device. * @brief Maximum number of channels per PWM device.
*/ */
#define PWM_CHANNEL_NUM_DEV_MAX (6) #define PWM_CHANNEL_NUM_DEV_MAX (6)
/** Number of PWM devices determined from PWM0_GPIOS and PWM1_GPIOS. */
extern const unsigned pwm_dev_num;
/** @} */ /** @} */
/** /**

View File

@ -40,7 +40,6 @@
#if defined(PWM0_GPIOS) || defined(PWM1_GPIOS) #if defined(PWM0_GPIOS) || defined(PWM1_GPIOS)
#define PWM_NUMOF_MAX (2) /* maximum number of PWM devices */
#define PWM_CLK (160000000UL) /* base clock of PWM devices */ #define PWM_CLK (160000000UL) /* base clock of PWM devices */
#define PWM_CPS_MAX (10000000UL) /* maximum cycles per second supported */ #define PWM_CPS_MAX (10000000UL) /* maximum cycles per second supported */
#define PWM_CPS_MIN (2500UL) /* minumum cycles per second supported */ #define PWM_CPS_MIN (2500UL) /* minumum cycles per second supported */
@ -101,8 +100,8 @@ static const struct _pwm_hw_t _pwm_hw[] =
.mod = PERIPH_PWM0_MODULE, .mod = PERIPH_PWM0_MODULE,
.int_src = ETS_PWM0_INTR_SOURCE, .int_src = ETS_PWM0_INTR_SOURCE,
.signal_group = PWM0_OUT0A_IDX, .signal_group = PWM0_OUT0A_IDX,
.gpio_num = sizeof(_pwm_channel_gpios_0) >> 2, .gpio_num = sizeof(pwm0_channels) / sizeof(pwm0_channels[0]),
.gpios = _pwm_channel_gpios_0, .gpios = pwm0_channels,
}, },
#endif #endif
#ifdef PWM1_GPIOS #ifdef PWM1_GPIOS
@ -111,15 +110,12 @@ static const struct _pwm_hw_t _pwm_hw[] =
.mod = PERIPH_PWM1_MODULE, .mod = PERIPH_PWM1_MODULE,
.int_src = ETS_PWM1_INTR_SOURCE, .int_src = ETS_PWM1_INTR_SOURCE,
.signal_group = PWM1_OUT0A_IDX, .signal_group = PWM1_OUT0A_IDX,
.gpio_num = sizeof(_pwm_channel_gpios_1) >> 2, .gpio_num = sizeof(pwm1_channels) / sizeof(pwm1_channels[0]),
.gpios = _pwm_channel_gpios_1, .gpios = pwm1_channels,
}, },
#endif #endif
}; };
/* the number of PWM devices used */
const unsigned pwm_dev_num = sizeof(_pwm_hw) / sizeof(_pwm_hw[0]);
/* data structure dynamic channel configuration */ /* data structure dynamic channel configuration */
typedef struct { typedef struct {
bool used; bool used;
@ -146,7 +142,7 @@ uint32_t pwm_init(pwm_t pwm, pwm_mode_t mode, uint32_t freq, uint16_t res)
{ {
DEBUG ("%s pwm=%u mode=%u freq=%u, res=%u\n", __func__, pwm, mode, freq, res); DEBUG ("%s pwm=%u mode=%u freq=%u, res=%u\n", __func__, pwm, mode, freq, res);
CHECK_PARAM_RET (pwm < pwm_dev_num, 0); CHECK_PARAM_RET (pwm < PWM_NUMOF, 0);
CHECK_PARAM_RET (freq > 0, 0); CHECK_PARAM_RET (freq > 0, 0);
if (_pwm_init_first_time) { if (_pwm_init_first_time) {
@ -203,7 +199,7 @@ uint32_t pwm_init(pwm_t pwm, pwm_mode_t mode, uint32_t freq, uint16_t res)
uint8_t pwm_channels(pwm_t pwm) uint8_t pwm_channels(pwm_t pwm)
{ {
CHECK_PARAM_RET (pwm < pwm_dev_num, 0); CHECK_PARAM_RET (pwm < PWM_NUMOF, 0);
return _pwm_hw[pwm].gpio_num; return _pwm_hw[pwm].gpio_num;
} }
@ -212,7 +208,7 @@ void pwm_set(pwm_t pwm, uint8_t channel, uint16_t value)
{ {
DEBUG("%s pwm=%u channel=%u value=%u\n", __func__, pwm, channel, value); DEBUG("%s pwm=%u channel=%u value=%u\n", __func__, pwm, channel, value);
CHECK_PARAM (pwm < pwm_dev_num); CHECK_PARAM (pwm < PWM_NUMOF);
CHECK_PARAM (channel < _pwm_dev[pwm].chn_num); CHECK_PARAM (channel < _pwm_dev[pwm].chn_num);
CHECK_PARAM (value <= _pwm_dev[pwm].res); CHECK_PARAM (value <= _pwm_dev[pwm].res);
@ -287,14 +283,14 @@ void pwm_set(pwm_t pwm, uint8_t channel, uint16_t value)
void pwm_poweron(pwm_t pwm) void pwm_poweron(pwm_t pwm)
{ {
CHECK_PARAM (pwm < pwm_dev_num); CHECK_PARAM (pwm < PWM_NUMOF);
periph_module_enable(_pwm_hw[pwm].mod); periph_module_enable(_pwm_hw[pwm].mod);
_pwm_start(pwm); _pwm_start(pwm);
} }
void pwm_poweroff(pwm_t pwm) void pwm_poweroff(pwm_t pwm)
{ {
CHECK_PARAM (pwm < pwm_dev_num); CHECK_PARAM (pwm < PWM_NUMOF);
_pwm_stop (pwm); _pwm_stop (pwm);
periph_module_disable(_pwm_hw[pwm].mod); periph_module_disable(_pwm_hw[pwm].mod);
} }
@ -385,7 +381,7 @@ static void _pwm_start(pwm_t pwm)
} }
/* sync all timers */ /* sync all timers */
for (unsigned i = 0; i < pwm_dev_num; i++) { for (unsigned i = 0; i < PWM_NUMOF; i++) {
_pwm_hw[i].regs->timer[0].sync.sync_sw = ~_pwm_hw[i].regs->timer[0].sync.sync_sw; _pwm_hw[i].regs->timer[0].sync.sync_sw = ~_pwm_hw[i].regs->timer[0].sync.sync_sw;
} }
} }
@ -399,13 +395,13 @@ static void _pwm_stop(pwm_t pwm)
/* do some static initialization and configuration checks */ /* do some static initialization and configuration checks */
static bool _pwm_configuration(void) static bool _pwm_configuration(void)
{ {
if (pwm_dev_num > PWM_NUMOF_MAX) { if (PWM_NUMOF > PWM_NUMOF_MAX) {
LOG_TAG_ERROR("pwm", "%d PWM devices were defined, only %d PWM are " LOG_TAG_ERROR("pwm", "%d PWM devices were defined, only %d PWM are "
"supported\n", pwm_dev_num, PWM_NUMOF_MAX); "supported\n", PWM_NUMOF, PWM_NUMOF_MAX);
return false; return false;
} }
for (unsigned i = 0; i < pwm_dev_num; i++) { for (unsigned i = 0; i < PWM_NUMOF; i++) {
if (_pwm_hw[i].gpio_num > PWM_CHANNEL_NUM_DEV_MAX) { if (_pwm_hw[i].gpio_num > PWM_CHANNEL_NUM_DEV_MAX) {
LOG_TAG_ERROR("pwm", "Number of PWM channels of device %d is %d, " LOG_TAG_ERROR("pwm", "Number of PWM channels of device %d is %d, "
"at maximum only %d channels per PWM device are " "at maximum only %d channels per PWM device are "
@ -415,8 +411,8 @@ static bool _pwm_configuration(void)
} }
} }
bool multiple_used = false; bool multiple_used = false;
for (unsigned i = 0; i < pwm_dev_num; i++) { for (unsigned i = 0; i < PWM_NUMOF; i++) {
for (unsigned j = 0; j < pwm_dev_num; j++) { for (unsigned j = 0; j < PWM_NUMOF; j++) {
if (i != j) { if (i != j) {
for (unsigned k = 0; k < _pwm_hw[i].gpio_num >> 2; k++) { for (unsigned k = 0; k < _pwm_hw[i].gpio_num >> 2; k++) {
for (unsigned l = 0; l < _pwm_hw[j].gpio_num >> 2; l++) { for (unsigned l = 0; l < _pwm_hw[j].gpio_num >> 2; l++) {
@ -440,7 +436,7 @@ static bool _pwm_configuration(void)
void pwm_print_config(void) void pwm_print_config(void)
{ {
for (unsigned pwm = 0; pwm < pwm_dev_num; pwm++) { for (unsigned pwm = 0; pwm < PWM_NUMOF; pwm++) {
ets_printf("\tPWM_DEV(%d)\tchannels=[ ", pwm); ets_printf("\tPWM_DEV(%d)\tchannels=[ ", pwm);
for (int i = 0; i < _pwm_hw[pwm].gpio_num; i++) { for (int i = 0; i < _pwm_hw[pwm].gpio_num; i++) {
ets_printf("%d ", _pwm_hw[pwm].gpios[i]); ets_printf("%d ", _pwm_hw[pwm].gpios[i]);