diff --git a/drivers/sensors/sensor.c b/drivers/sensors/sensor.c index 412f4f94328..89afd4c935a 100644 --- a/drivers/sensors/sensor.c +++ b/drivers/sensors/sensor.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -121,6 +122,7 @@ struct sensor_upperhalf_s struct circbuf_s buffer; /* The circular buffer of data */ rmutex_t lock; /* Manages exclusive access to file operations */ struct list_node userlist; /* List of users */ + char name[NAME_MAX]; /* Upper topic name */ }; /**************************************************************************** @@ -308,6 +310,7 @@ again: } nxrmutex_lock(&upper->lock); + sminfo(upper->name, "update interval %" PRIu32, min_interval); /* The upper min_interval is updated by other threads, set to * driver again to avoid race condition. @@ -344,6 +347,7 @@ again: if (ret >= 0) { + sminfo(upper->name, "update batch %" PRIu32, min_latency); upper->state.min_latency = min_latency; } } @@ -421,6 +425,7 @@ update: return ret; } + sminfo(upper->name, "update batch %" PRIu32, min_latency); nxrmutex_lock(&upper->lock); /* The upper min_latency is updated by other threads, set to @@ -467,6 +472,7 @@ static void sensor_update_nonwakeup(FAR struct file *filep, if (nonwakeup != upper->state.nonwakeup) { upper->state.nonwakeup = nonwakeup; + sminfo(upper->name, "update nonwakeup %d", nonwakeup); nxrmutex_unlock(&upper->lock); if (lower->ops->set_nonwakeup) { @@ -582,6 +588,9 @@ static ssize_t sensor_do_samples(FAR struct sensor_upperhalf_s *upper, circbuf_peekat(&upper->timing, (user->bufferpos - 1) * TIMING_BUF_ESIZE, &user->state.generation, TIMING_BUF_ESIZE); + smdebug(upper->name, "do sample interval:%" PRIu32 ", " + "user.generation:%" PRIu32 ", ret:%zd", + upper->state.generation, user->state.generation, ret); return ret; } @@ -623,6 +632,10 @@ static ssize_t sensor_do_samples(FAR struct sensor_upperhalf_s *upper, delta = next_generation + generation - ((user->state.generation + user->state.interval) << 1); + smdebug(upper->name, "do sample interval:%" PRIu32 ", " + "generation:%" PRIu32 ", user generation:% "PRIu32 ", " + "next generation:%" PRIu32, user->state.interval, + generation, user->state.generation, next_generation); if (delta >= 0) { if (buffer != NULL) @@ -751,6 +764,13 @@ static int sensor_open(FAR struct file *filep) user->bufferpos = upper->timing.head / TIMING_BUF_ESIZE; } + sminfo(upper->name, "user address: %p, role type: %d, " + "user generation: %" PRIu32 ", upper generation: %" PRIu32 ", " + "nsubscribers: %" PRIu32 ", nadvertisers: %" PRIu32 ", persist: %d", + user, user->role, user->state.generation, + upper->state.generation, upper->state.nsubscribers, + upper->state.nadvertisers, lower->persist); + user->state.interval = UINT32_MAX; user->state.esize = upper->state.esize; user->state.nonwakeup = true; @@ -819,6 +839,9 @@ static int sensor_close(FAR struct file *filep) /* The user is closed, notify to other users */ + sminfo(upper->name, "user address: %p, " + "close subscriber: %" PRIu32 ", close advertiser:%" PRIu32, + user, upper->state.nsubscribers, upper->state.nadvertisers); sensor_pollnotify(upper, POLLPRI, SENSOR_ROLE_WR); nxrmutex_unlock(&upper->lock); @@ -895,6 +918,12 @@ static ssize_t sensor_read(FAR struct file *filep, FAR char *buffer, ret = -ENODATA; } + if (ret > 0) + { + smdebug(upper->name, "the number of read event is:%zd", + ret / upper->state.esize); + } + out: nxrmutex_unlock(&upper->lock); return ret; @@ -919,6 +948,7 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg) uint32_t arg1 = (uint32_t)arg; int ret = 0; + smdebug(upper->name, "sensor ioctl start, cmd:%d", cmd); switch (cmd) { case SNIOC_GET_STATE: @@ -1120,6 +1150,7 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg) break; } + smdebug(upper->name, "sensor ioctl end, ret:%d", ret); return ret; } @@ -1244,6 +1275,7 @@ static ssize_t sensor_push_event(FAR void *priv, FAR const void *data, } } + smdebug(upper->name, "the number of write event is:%lu", envcount); circbuf_overwrite(&upper->buffer, data, bytes); sensor_generate_timing(upper, envcount); list_for_every_entry(&upper->userlist, user, struct sensor_user_s, node) @@ -1456,9 +1488,10 @@ int sensor_custom_register(FAR struct sensor_lowerhalf_s *lower, } #endif + strlcpy(upper->name, basename((char *)path), sizeof(upper->name)); upper->state.nbuffer = lower->nbuffer; upper->lower = lower; - sninfo("Registering %s\n", path); + sminfo(upper->name, "Registering %s", path); ret = register_driver(path, &g_sensor_fops, 0666, upper); if (ret) { @@ -1537,7 +1570,7 @@ void sensor_custom_unregister(FAR struct sensor_lowerhalf_s *lower, upper = lower->priv; - sninfo("UnRegistering %s\n", path); + sminfo(upper->name, "UnRegistering"); unregister_driver(path); #ifdef CONFIG_SENSORS_RPMSG diff --git a/drivers/sensors/sensor_rpmsg.c b/drivers/sensors/sensor_rpmsg.c index 4c0714ea62c..4485b5b4246 100644 --- a/drivers/sensors/sensor_rpmsg.c +++ b/drivers/sensors/sensor_rpmsg.c @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -96,6 +97,7 @@ struct sensor_rpmsg_dev_s uint8_t nsubscribers; FAR void *upper; sensor_push_event_t push_event; + FAR const char *name; char path[1]; }; @@ -542,6 +544,7 @@ sensor_rpmsg_alloc_proxy(FAR struct sensor_rpmsg_dev_s *dev, sensor_rpmsg_ioctl(dev, SNIOC_BATCH, state.min_latency, 0, false); } + sminfo(dev->name, "create proxy:%p", proxy); return proxy; } @@ -626,10 +629,12 @@ sensor_rpmsg_alloc_stub(FAR struct sensor_rpmsg_dev_s *dev, if (dev->lower.persist) { + sminfo(dev->name, "push event persist:%p", stub); sensor_rpmsg_push_event_persist(dev, stub); } sensor_rpmsg_unlock(dev); + sminfo(dev->name, "create stub:%p", stub); return stub; } @@ -637,6 +642,7 @@ sensor_rpmsg_alloc_stub(FAR struct sensor_rpmsg_dev_s *dev, static void sensor_rpmsg_free_proxy(FAR struct sensor_rpmsg_dev_s *dev, FAR struct sensor_rpmsg_proxy_s *proxy) { + sminfo(dev->name, "free proxy:%p name:%s", proxy, proxy->ept->name); list_delete(&proxy->node); kmm_free(proxy); if (list_is_empty(&dev->proxylist)) @@ -1000,6 +1006,10 @@ static void sensor_rpmsg_push_event_one(FAR struct sensor_rpmsg_dev_s *dev, } } + smdebug(dev->name, "rpmsg push event, " + "readcount:%d to remote:%s i:%" PRIu32 ", l:%" PRIu32, + ret, rpmsg_get_cpuname(sre->ept.rdev), + state.interval, state.latency); cell->len = ret; cell->cookie = stub->cookie; cell->nbuffer = dev->lower.nbuffer; @@ -1108,7 +1118,7 @@ static int sensor_rpmsg_adv_handler(FAR struct rpmsg_endpoint *ept, proxy = sensor_rpmsg_alloc_proxy(dev, ept, msg); if (!proxy) { - snerr("ERROR: adv alloc proxy failed:%s\n", dev->path); + snerr("ERROR: adv create proxy failed:%s\n", dev->path); } else { @@ -1123,6 +1133,9 @@ static int sensor_rpmsg_adv_handler(FAR struct rpmsg_endpoint *ept, snerr("ERROR: adv rpmsg send failed:%s, %d, %s\n", dev->path, ret, rpmsg_get_cpuname(ept->rdev)); } + + sminfo(dev->name, "rpmsg adv proxy success, remote:%s", + rpmsg_get_cpuname(ept->rdev)); } return 0; @@ -1167,6 +1180,8 @@ static int sensor_rpmsg_unadv_handler(FAR struct rpmsg_endpoint *ept, if (proxy->ept == ept && proxy->cookie == msg->cookie) { sensor_rpmsg_free_proxy(dev, proxy); + sminfo(dev->name, "rpmsg unadv free proxy success, " + "remote:%s", rpmsg_get_cpuname(ept->rdev)); break; } } @@ -1229,6 +1244,11 @@ static int sensor_rpmsg_suback_handler(FAR struct rpmsg_endpoint *ept, sensor_rpmsg_advsub_one(dev, ept, SENSOR_RPMSG_UNSUBSCRIBE); snerr("ERROR: suback failed:%s\n", dev->path); } + else + { + sminfo(dev->name, "rpmsg suback success, remote:%s", + rpmsg_get_cpuname(ept->rdev)); + } return 0; } @@ -1314,6 +1334,8 @@ static int sensor_rpmsg_publish_handler(FAR struct rpmsg_endpoint *ept, sensor_rpmsg_unlock(dev); + smdebug(dev->name, "rpmsg receive data: cnt:%" PRIu32 ", " + "from remote:%s", cell->len, rpmsg_get_cpuname(ept->rdev)); written += sizeof(*cell) + cell->len + 0x7; written &= ~0x7; } @@ -1574,6 +1596,7 @@ sensor_rpmsg_register(FAR struct sensor_lowerhalf_s *lower, list_initialize(&dev->proxylist); strlcpy(dev->path, path, size + 1); + dev->name = basename(dev->path); dev->nadvertisers = !!lower->ops->activate; dev->push_event = lower->push_event; dev->upper = lower->priv; diff --git a/include/nuttx/sensors/sensor.h b/include/nuttx/sensors/sensor.h index c4e275bd15a..33094f46dc0 100644 --- a/include/nuttx/sensors/sensor.h +++ b/include/nuttx/sensors/sensor.h @@ -29,6 +29,7 @@ #include +#include #include #include #include @@ -161,6 +162,26 @@ #define SENSOR_BODY_COORDINATE_P7 7 +#ifdef CONFIG_SENSORS_MONITOR +# define smlog(level, name, fmt, ...) \ + do \ + { \ + if (level <= sensor_monitor_level(name)) \ + { \ + sninfo("[topic: %s] "fmt, name, ##__VA_ARGS__); \ + } \ + } \ + while (0) +#else +# define smlog(log_level, name, fmt,...) +#endif + +#define smerr(name, fmt, ...) smlog(LOG_ERR, name, fmt, ##__VA_ARGS__) +#define smwarn(name, fmt, ...) smlog(LOG_WARN, name, fmt, ##__VA_ARGS__) +#define smnotice(name, fmt, ...) smlog(LOG_NOTICE, name, fmt, ##__VA_ARGS__) +#define sminfo(name, fmt, ...) smlog(LOG_INFO, name, fmt, ##__VA_ARGS__) +#define smdebug(name, fmt, ...) smlog(LOG_DEBUG, name, fmt, ##__VA_ARGS__) + /**************************************************************************** * Inline Functions ****************************************************************************/