cpu/esp32: PWM configuration approach changed

PWM channels are now configured using static array in header files instead of static variables in implementation.
This commit is contained in:
Gunar Schorcht
2019-05-06 13:32:52 +02:00
committed by Schorcht
parent 9fc9ff2523
commit e8828aded8
2 changed files with 21 additions and 23 deletions
+5 -3
View File
@@ -338,14 +338,16 @@ extern const unsigned i2c_bus_num;
* other purposes.
*/
/**
* @brief Maximum number of PWM devices
*/
#define PWM_NUMOF_MAX (2)
/**
* @brief Maximum number of channels per PWM device.
*/
#define PWM_CHANNEL_NUM_DEV_MAX (6)
/** Number of PWM devices determined from PWM0_GPIOS and PWM1_GPIOS. */
extern const unsigned pwm_dev_num;
/** @} */
/**
+16 -20
View File
@@ -40,7 +40,6 @@
#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_CPS_MAX (10000000UL) /* maximum 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,
.int_src = ETS_PWM0_INTR_SOURCE,
.signal_group = PWM0_OUT0A_IDX,
.gpio_num = sizeof(_pwm_channel_gpios_0) >> 2,
.gpios = _pwm_channel_gpios_0,
.gpio_num = sizeof(pwm0_channels) / sizeof(pwm0_channels[0]),
.gpios = pwm0_channels,
},
#endif
#ifdef PWM1_GPIOS
@@ -111,15 +110,12 @@ static const struct _pwm_hw_t _pwm_hw[] =
.mod = PERIPH_PWM1_MODULE,
.int_src = ETS_PWM1_INTR_SOURCE,
.signal_group = PWM1_OUT0A_IDX,
.gpio_num = sizeof(_pwm_channel_gpios_1) >> 2,
.gpios = _pwm_channel_gpios_1,
.gpio_num = sizeof(pwm1_channels) / sizeof(pwm1_channels[0]),
.gpios = pwm1_channels,
},
#endif
};
/* the number of PWM devices used */
const unsigned pwm_dev_num = sizeof(_pwm_hw) / sizeof(_pwm_hw[0]);
/* data structure dynamic channel configuration */
typedef struct {
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);
CHECK_PARAM_RET (pwm < pwm_dev_num, 0);
CHECK_PARAM_RET (pwm < PWM_NUMOF, 0);
CHECK_PARAM_RET (freq > 0, 0);
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)
{
CHECK_PARAM_RET (pwm < pwm_dev_num, 0);
CHECK_PARAM_RET (pwm < PWM_NUMOF, 0);
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);
CHECK_PARAM (pwm < pwm_dev_num);
CHECK_PARAM (pwm < PWM_NUMOF);
CHECK_PARAM (channel < _pwm_dev[pwm].chn_num);
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)
{
CHECK_PARAM (pwm < pwm_dev_num);
CHECK_PARAM (pwm < PWM_NUMOF);
periph_module_enable(_pwm_hw[pwm].mod);
_pwm_start(pwm);
}
void pwm_poweroff(pwm_t pwm)
{
CHECK_PARAM (pwm < pwm_dev_num);
CHECK_PARAM (pwm < PWM_NUMOF);
_pwm_stop (pwm);
periph_module_disable(_pwm_hw[pwm].mod);
}
@@ -385,7 +381,7 @@ static void _pwm_start(pwm_t pwm)
}
/* 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;
}
}
@@ -399,13 +395,13 @@ static void _pwm_stop(pwm_t pwm)
/* do some static initialization and configuration checks */
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 "
"supported\n", pwm_dev_num, PWM_NUMOF_MAX);
"supported\n", PWM_NUMOF, PWM_NUMOF_MAX);
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) {
LOG_TAG_ERROR("pwm", "Number of PWM channels of device %d is %d, "
"at maximum only %d channels per PWM device are "
@@ -415,8 +411,8 @@ static bool _pwm_configuration(void)
}
}
bool multiple_used = false;
for (unsigned i = 0; i < pwm_dev_num; i++) {
for (unsigned j = 0; j < pwm_dev_num; j++) {
for (unsigned i = 0; i < PWM_NUMOF; i++) {
for (unsigned j = 0; j < PWM_NUMOF; j++) {
if (i != j) {
for (unsigned k = 0; k < _pwm_hw[i].gpio_num >> 2; k++) {
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)
{
for (unsigned pwm = 0; pwm < pwm_dev_num; pwm++) {
for (unsigned pwm = 0; pwm < PWM_NUMOF; pwm++) {
ets_printf("\tPWM_DEV(%d)\tchannels=[ ", pwm);
for (int i = 0; i < _pwm_hw[pwm].gpio_num; i++) {
ets_printf("%d ", _pwm_hw[pwm].gpios[i]);