Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

drivers/sensors: bug fix about sensor and sensor rpmsg driver #13694

Merged
merged 10 commits into from
Sep 28, 2024
67 changes: 39 additions & 28 deletions drivers/sensors/sensor.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ static void sensor_generate_timing(FAR struct sensor_upperhalf_s *upper,
static bool sensor_is_updated(FAR struct sensor_upperhalf_s *upper,
FAR struct sensor_user_s *user)
{
long delta = upper->state.generation - user->state.generation;
long delta = (long long)upper->state.generation - user->state.generation;

if (delta <= 0)
{
Expand Down Expand Up @@ -431,7 +431,7 @@ static void sensor_catch_up(FAR struct sensor_upperhalf_s *upper,
long delta;

circbuf_peek(&upper->timing, &generation, TIMING_BUF_ESIZE);
delta = generation - user->state.generation;
delta = (long long)generation - user->state.generation;
if (delta > 0)
{
user->bufferpos = upper->timing.tail / TIMING_BUF_ESIZE;
Expand Down Expand Up @@ -615,28 +615,31 @@ static int sensor_open(FAR struct file *filep)
}
}

if (filep->f_oflags & O_RDOK)
if ((filep->f_oflags & O_DIRECT) == 0)
{
if (upper->state.nsubscribers == 0 && lower->ops->activate)
if (filep->f_oflags & O_RDOK)
{
ret = lower->ops->activate(lower, filep, true);
if (ret < 0)
if (upper->state.nsubscribers == 0 && lower->ops->activate)
{
goto errout_with_open;
ret = lower->ops->activate(lower, filep, true);
if (ret < 0)
{
goto errout_with_open;
}
}
}

user->role |= SENSOR_ROLE_RD;
upper->state.nsubscribers++;
}
user->role |= SENSOR_ROLE_RD;
upper->state.nsubscribers++;
}

if (filep->f_oflags & O_WROK)
{
user->role |= SENSOR_ROLE_WR;
upper->state.nadvertisers++;
if (filep->f_oflags & SENSOR_PERSIST)
if (filep->f_oflags & O_WROK)
{
lower->persist = true;
user->role |= SENSOR_ROLE_WR;
upper->state.nadvertisers++;
if (filep->f_oflags & SENSOR_PERSIST)
{
lower->persist = true;
}
}
}

Expand Down Expand Up @@ -695,18 +698,21 @@ static int sensor_close(FAR struct file *filep)
}
}

if (filep->f_oflags & O_RDOK)
if ((filep->f_oflags & O_DIRECT) == 0)
{
upper->state.nsubscribers--;
if (upper->state.nsubscribers == 0 && lower->ops->activate)
if (filep->f_oflags & O_RDOK)
{
lower->ops->activate(lower, filep, false);
upper->state.nsubscribers--;
if (upper->state.nsubscribers == 0 && lower->ops->activate)
{
lower->ops->activate(lower, filep, false);
}
}
}

if (filep->f_oflags & O_WROK)
{
upper->state.nadvertisers--;
if (filep->f_oflags & O_WROK)
{
upper->state.nadvertisers--;
}
}

list_delete(&user->node);
Expand Down Expand Up @@ -816,8 +822,6 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
uint32_t arg1 = (uint32_t)arg;
int ret = 0;

sninfo("cmd=%x arg=%08lx\n", cmd, arg);

switch (cmd)
{
case SNIOC_GET_STATE:
Expand Down Expand Up @@ -950,8 +954,10 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
nxrmutex_lock(&upper->lock);
*(FAR unsigned int *)(uintptr_t)arg = user->event;
user->event = 0;
user->changed = false;
nxrmutex_unlock(&upper->lock);
}
break;

case SNIOC_FLUSH:
{
Expand Down Expand Up @@ -1329,7 +1335,7 @@ int sensor_custom_register(FAR struct sensor_lowerhalf_s *lower,
if (lower == NULL)
{
ret = -EIO;
goto drv_err;
goto rpmsg_err;
}
#endif

Expand All @@ -1345,6 +1351,11 @@ int sensor_custom_register(FAR struct sensor_lowerhalf_s *lower,
return ret;

drv_err:
#ifdef CONFIG_SENSORS_RPMSG
sensor_rpmsg_unregister(lower);
rpmsg_err:
#endif

nxrmutex_destroy(&upper->lock);

kmm_free(upper);
Expand Down
57 changes: 51 additions & 6 deletions drivers/sensors/sensor_rpmsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,9 +251,6 @@ static int sensor_rpmsg_ioctl_handler(FAR struct rpmsg_endpoint *ept,
static int sensor_rpmsg_ioctlack_handler(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len,
uint32_t src, FAR void *priv);
static void sensor_rpmsg_push_event_one(FAR struct sensor_rpmsg_dev_s *dev,
FAR struct sensor_rpmsg_stub_s *stub,
bool flushed);

/****************************************************************************
* Private Data
Expand Down Expand Up @@ -515,6 +512,43 @@ sensor_rpmsg_alloc_proxy(FAR struct sensor_rpmsg_dev_s *dev,
return proxy;
}

static
void sensor_rpmsg_push_event_persist(FAR struct sensor_rpmsg_dev_s *dev,
FAR struct sensor_rpmsg_stub_s *stub)
{
FAR struct sensor_rpmsg_cell_s *cell;
FAR struct sensor_rpmsg_data_s *msg;
FAR struct sensor_rpmsg_ept_s *sre;
uint32_t space;
int ret;

sre = container_of(stub->ept, struct sensor_rpmsg_ept_s, ept);
msg = rpmsg_get_tx_payload_buffer(&sre->ept, &space, true);
if (!msg)
{
snerr("ERROR: push event persist get buffer failed:%s\n",
rpmsg_get_cpuname(sre->ept.rdev));
return;
}

msg->command = SENSOR_RPMSG_PUBLISH;
cell = (FAR struct sensor_rpmsg_cell_s *)(msg + 1);
ret = file_read(&stub->file, cell->data, space - sizeof(*msg) -
sizeof(*cell));
if (ret > 0)
{
cell->len = ret;
cell->cookie = stub->cookie;
cell->nbuffer = dev->lower.nbuffer;
rpmsg_send_nocopy(&sre->ept, msg, sizeof(*msg) +
((sizeof(*cell) + ret + 0x7) & ~0x7));
}
else
{
rpmsg_release_tx_buffer(&sre->ept, msg);
}
}

static FAR struct sensor_rpmsg_stub_s *
sensor_rpmsg_alloc_stub(FAR struct sensor_rpmsg_dev_s *dev,
FAR struct rpmsg_endpoint *ept,
Expand Down Expand Up @@ -559,7 +593,7 @@ sensor_rpmsg_alloc_stub(FAR struct sensor_rpmsg_dev_s *dev,

if (dev->lower.persist)
{
sensor_rpmsg_push_event_one(dev, stub, false);
sensor_rpmsg_push_event_persist(dev, stub);
}

sensor_rpmsg_unlock(dev);
Expand Down Expand Up @@ -833,6 +867,7 @@ static void sensor_rpmsg_push_event_one(FAR struct sensor_rpmsg_dev_s *dev,
if (sre->buffer)
{
rpmsg_send_nocopy(&sre->ept, sre->buffer, sre->written);
sre->buffer = NULL;
}

msg = rpmsg_get_tx_payload_buffer(&sre->ept, &sre->space, true);
Expand Down Expand Up @@ -1150,7 +1185,13 @@ static int sensor_rpmsg_publish_handler(FAR struct rpmsg_endpoint *ept,
ret = file_open(&file, dev->path, SENSOR_REMOTE | O_CLOEXEC);
if (ret >= 0)
{
file_ioctl(&file, SNIOC_SET_BUFFER_NUMBER, cell->nbuffer);
ret = file_ioctl(&file, SNIOC_SET_BUFFER_NUMBER,
cell->nbuffer);
if (ret >= 0)
{
dev->lower.nbuffer = cell->nbuffer;
}

file_close(&file);
}
}
Expand Down Expand Up @@ -1302,7 +1343,11 @@ static void sensor_rpmsg_ns_unbind_cb(FAR struct rpmsg_endpoint *ept)
nxrmutex_unlock(&g_dev_lock);

nxrmutex_lock(&g_ept_lock);
list_delete(&sre->node);
if (list_in_list(&sre->node))
{
list_delete(&sre->node);
}

nxrmutex_unlock(&g_ept_lock);

nxrmutex_destroy(&sre->lock);
Expand Down
Loading