driver/motor: Remove the unnecessary critical section operation

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
Signed-off-by: Jiuzhu Dong <dongjiuzhu1@xiaomi.com>
This commit is contained in:
Xiang Xiao 2021-11-15 22:32:55 +08:00 committed by Xiang Xiao
parent c0c1e46c5f
commit a29ee19af4
6 changed files with 20 additions and 103 deletions

View file

@ -2037,15 +2037,6 @@ static int stm32_foc_bind(FAR struct foc_dev_s *dev,
DEBUGASSERT(cb);
DEBUGASSERT(priv);
/* Do we support given FOC instance? */
if (dev->devno > CONFIG_MOTOR_FOC_INST)
{
mtrerr("Unsupported STM32 FOC instance %d\n", dev->devno);
ret = -EINVAL;
goto errout;
}
/* Validate callbacks */
DEBUGASSERT(cb->notifier);
@ -2053,8 +2044,6 @@ static int stm32_foc_bind(FAR struct foc_dev_s *dev,
/* Bind upper-half FOC device callbacks */
priv->cb = cb;
errout:
return ret;
}

View file

@ -175,7 +175,7 @@ static int sim_foc_pwm_setup(FAR struct foc_dev_s *dev, uint32_t freq)
DEBUGASSERT(dev);
DEBUGASSERT(sim);
mtrinfo("[PWM_SETUP] devno=%d freq=%d\n", dev->devno, freq);
mtrinfo("[PWM_SETUP] freq=%d\n", freq);
DEBUGASSERT(freq > 0);
@ -200,7 +200,7 @@ static int sim_foc_start(FAR struct foc_dev_s *dev, bool state)
irqstate_t flags;
int ret = OK;
mtrinfo("[FOC_START] devno=%d state=%d\n", dev->devno, state);
mtrinfo("[FOC_START] state=%d\n", state);
/* Start PWM */
@ -242,7 +242,7 @@ static int sim_foc_pwm_start(FAR struct foc_dev_s *dev, bool state)
{
DEBUGASSERT(dev);
mtrinfo("[PWM_START] devno=%d state=%d\n", dev->devno, state);
mtrinfo("[PWM_START] state=%d\n", state);
return OK;
}
@ -259,7 +259,7 @@ static int sim_foc_adc_setup(FAR struct foc_dev_s *dev)
{
DEBUGASSERT(dev);
mtrinfo("[ADC_SETUP] devno=%d\n", dev->devno);
mtrinfo("[ADC_SETUP]\n");
return OK;
}
@ -276,7 +276,7 @@ static int sim_foc_adc_start(FAR struct foc_dev_s *dev, bool state)
{
DEBUGASSERT(dev);
mtrinfo("[ADC_START] devno=%d state=%d\n", dev->devno, state);
mtrinfo("[ADC_START] state=%d\n", state);
return OK;
}
@ -297,7 +297,7 @@ static int sim_foc_notifier_cfg(FAR struct foc_dev_s *dev, uint32_t freq)
DEBUGASSERT(dev);
DEBUGASSERT(sim);
mtrinfo("[NOTIFIER_CFG] devno=%d freq=%d\n", dev->devno, freq);
mtrinfo("[NOTIFIER_CFG] freq=%d\n", freq);
DEBUGASSERT(freq > 0);
@ -336,7 +336,7 @@ static int sim_foc_configure(FAR struct foc_dev_s *dev,
DEBUGASSERT(cfg->pwm_freq > 0);
DEBUGASSERT(cfg->notifier_freq > 0);
mtrinfo("[FOC_SETUP] devno=%d\n", dev->devno);
mtrinfo("[FOC_SETUP]\n");
/* Configure ADC */
@ -385,7 +385,7 @@ static int sim_foc_setup(FAR struct foc_dev_s *dev)
{
DEBUGASSERT(dev);
mtrinfo("[FOC_SETUP] devno=%d\n", dev->devno);
mtrinfo("[FOC_SETUP]\n");
/* Get HW configuration */
@ -406,7 +406,7 @@ static int sim_foc_shutdown(FAR struct foc_dev_s *dev)
{
DEBUGASSERT(dev);
mtrinfo("[FOC_SHUTDOWN] devno=%d\n", dev->devno);
mtrinfo("[FOC_SHUTDOWN]\n");
return OK;
}
@ -426,7 +426,7 @@ static int sim_foc_ioctl(FAR struct foc_dev_s *dev, int cmd,
DEBUGASSERT(dev);
mtrinfo("[FOC_IOCTL] devno=%d cmd=%d\n", dev->devno, cmd);
mtrinfo("[FOC_IOCTL]cmd=%d\n", cmd);
switch (cmd)
{
@ -456,8 +456,7 @@ static int sim_foc_notifier_handler(FAR struct foc_dev_s *dev)
DEBUGASSERT(dev);
DEBUGASSERT(sim);
mtrinfo("[FOC_NOTIFIER_HANDLER] devno=%d cntr=%d\n",
dev->devno, sim->notifier_cntr);
mtrinfo("[FOC_NOTIFIER_HANDLER] cntr=%d\n", sim->notifier_cntr);
flags = enter_critical_section();
@ -500,7 +499,7 @@ static int sim_foc_pwm_duty_set(FAR struct foc_dev_s *dev,
DEBUGASSERT(duty[i] >= 0);
}
mtrinfo("[PWM_DUTY_SET] devno=%d duty= ", dev->devno);
mtrinfo("[PWM_DUTY_SET]\n");
#if CONFIG_MOTOR_FOC_PHASES == 2
mtrinfo("[%d %d]\n", duty[0], duty[1]);
@ -551,22 +550,11 @@ static int sim_foc_bind(FAR struct foc_dev_s *dev,
DEBUGASSERT(cb);
DEBUGASSERT(sim);
mtrinfo("[FOC_BIND] devno=%d\n", dev->devno);
/* Do we support given FOC instance? */
if (dev->devno > CONFIG_MOTOR_FOC_INST)
{
mtrerr("unsupported SIM FOC instance %d\n", dev->devno);
ret = -EINVAL;
goto errout;
}
mtrinfo("[FOC_BIND]\n");
/* Bind upper-half FOC controller callbacks */
sim->cb = cb;
errout:
return ret;
}
@ -582,7 +570,7 @@ static int sim_foc_fault_clear(FAR struct foc_dev_s *dev)
{
DEBUGASSERT(dev);
mtrinfo("[FAULT_CLEAR] devno=%d\n", dev->devno);
mtrinfo("[FAULT_CLEAR]\n");
return OK;
}
@ -600,8 +588,7 @@ static void sim_foc_trace(FAR struct foc_dev_s *dev, int type, bool state)
{
DEBUGASSERT(dev);
mtrinfo("[FOC_TRACE] devno=%d type=%d state=%d\n",
dev->devno, type, state);
mtrinfo("[FOC_TRACE] type=%d state=%d\n", type, state);
}
#endif /* CONFIG_MOTOR_FOC_TRACE */

View file

@ -68,10 +68,6 @@ static int foc_notifier(FAR struct foc_dev_s *dev,
* Private Data
****************************************************************************/
/* Device counter */
static uint8_t g_devno_cntr = 0;
/* File operations */
static const struct file_operations g_foc_fops =
@ -113,7 +109,6 @@ static int foc_open(FAR struct file *filep)
FAR struct foc_dev_s *dev = inode->i_private;
uint8_t tmp = 0;
int ret = OK;
irqstate_t flags;
/* Non-blocking operations not supported */
@ -147,10 +142,6 @@ static int foc_open(FAR struct file *filep)
if (tmp == 1)
{
/* Yes.. perform one time driver setup */
flags = enter_critical_section();
ret = foc_setup(dev);
if (ret == OK)
{
@ -158,8 +149,6 @@ static int foc_open(FAR struct file *filep)
dev->ocount = tmp;
}
leave_critical_section(flags);
}
else
{
@ -189,7 +178,6 @@ static int foc_close(FAR struct file *filep)
FAR struct inode *inode = filep->f_inode;
FAR struct foc_dev_s *dev = inode->i_private;
int ret = 0;
irqstate_t flags;
ret = nxsem_wait(&dev->closesem);
if (ret >= 0)
@ -211,10 +199,7 @@ static int foc_close(FAR struct file *filep)
/* Shutdown the device */
flags = enter_critical_section();
ret = foc_shutdown(dev);
leave_critical_section(flags);
nxsem_post(&dev->closesem);
}
}
@ -259,9 +244,6 @@ static int foc_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
FAR struct inode *inode = filep->f_inode;
FAR struct foc_dev_s *dev = inode->i_private;
int ret = 0;
irqstate_t flags;
flags = enter_critical_section();
switch (cmd)
{
@ -388,8 +370,6 @@ static int foc_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
}
}
leave_critical_section(flags);
return ret;
}
@ -462,7 +442,6 @@ static int foc_setup(FAR struct foc_dev_s *dev)
if (ret < 0)
{
mtrerr("foc_lower_bind failed %d\n", ret);
set_errno(EINVAL);
goto errout;
}
@ -606,8 +585,8 @@ static int foc_cfg_set(FAR struct foc_dev_s *dev, FAR struct foc_cfg_s *cfg)
memcpy(&dev->cfg, cfg, sizeof(struct foc_cfg_s));
mtrinfo("FOC %" PRIu8 " PWM=%" PRIu32 " notifier=%" PRIu32 "\n",
dev->devno, dev->cfg.pwm_freq, dev->cfg.notifier_freq);
mtrinfo("FOC PWM=%" PRIu32 " notifier=%" PRIu32 "\n",
dev->cfg.pwm_freq, dev->cfg.notifier_freq);
/* Call arch configuration */
@ -762,13 +741,6 @@ static int foc_notifier(FAR struct foc_dev_s *dev,
FOC_OPS_TRACE(dev, FOC_TRACE_NOTIFIER, true);
#endif
/* Disable pre-emption until all of the waiting threads have been
* restarted. This is necessary to assure that the sval behaves as
* expected in the following while loop
*/
sched_lock();
/* Copy currents */
memcpy(&dev->state.curr,
@ -817,10 +789,6 @@ static int foc_notifier(FAR struct foc_dev_s *dev,
}
}
/* Now we can let the restarted threads run */
sched_unlock();
#ifdef CONFIG_MOTOR_FOC_TRACE
FOC_OPS_TRACE(dev, FOC_TRACE_NOTIFIER, false);
#endif
@ -857,24 +825,10 @@ int foc_register(FAR const char *path, FAR struct foc_dev_s *dev)
DEBUGASSERT(dev->lower->ops);
DEBUGASSERT(dev->lower->data);
/* Check if the device instance is supported by the driver */
if (dev->devno > CONFIG_MOTOR_FOC_INST)
{
mtrerr("Unsupported foc devno %d\n\n", dev->devno);
set_errno(EINVAL);
ret = ERROR;
goto errout;
}
/* Reset counter */
dev->ocount = 0;
/* Store device number */
dev->devno = g_devno_cntr;
/* Assert the lower-half interface */
ret = foc_lower_ops_assert(dev->lower->ops);
@ -895,15 +849,10 @@ int foc_register(FAR const char *path, FAR struct foc_dev_s *dev)
if (ret < 0)
{
nxsem_destroy(&dev->closesem);
set_errno(ret);
ret = ERROR;
nxsem_destroy(&dev->statesem);
goto errout;
}
/* Increase device counter */
g_devno_cntr += 1;
errout:
return ret;
}

View file

@ -133,7 +133,6 @@ static int motor_open(FAR struct file *filep)
{
/* Yes.. perform one time hardware initialization. */
irqstate_t flags = enter_critical_section();
ret = lower->ops->setup(lower);
if (ret == OK)
{
@ -141,8 +140,6 @@ static int motor_open(FAR struct file *filep)
upper->ocount = tmp;
}
leave_critical_section(flags);
}
}
@ -165,7 +162,6 @@ static int motor_close(FAR struct file *filep)
FAR struct inode *inode = filep->f_inode;
FAR struct motor_upperhalf_s *upper = inode->i_private;
FAR struct motor_lowerhalf_s *lower = upper->lower;
irqstate_t flags;
int ret;
ret = nxsem_wait(&upper->closesem);
@ -188,10 +184,7 @@ static int motor_close(FAR struct file *filep)
/* Free the IRQ and disable the motor device */
flags = enter_critical_section(); /* Disable interrupts */
lower->ops->shutdown(lower); /* Disable the motor */
leave_critical_section(flags);
nxsem_post(&upper->closesem);
}
}

View file

@ -112,7 +112,6 @@ struct foc_dev_s
{
/* Fields managed by common upper-half FOC logic **************************/
uint8_t devno; /* FOC device instance number */
uint8_t ocount; /* The number of times the device
* has been opened
*/

View file

@ -18,8 +18,8 @@
*
****************************************************************************/
#ifndef __INCLUDE_NUTTX_DRIVERS_MOTOR_MOTOR_H
#define __INCLUDE_NUTTX_DRIVERS_MOTOR_MOTOR_H
#ifndef __INCLUDE_NUTTX_MOTOR_MOTOR_H
#define __INCLUDE_NUTTX_MOTOR_MOTOR_H
/* The motor driver is split into two parts:
*