From 664fcb269892f4f3e2f9f014e9e9326585184aa5 Mon Sep 17 00:00:00 2001 From: Jiuzhu Dong Date: Mon, 27 Jun 2022 11:30:02 +0800 Subject: [PATCH] driver/syslog: support syslog rpmsg character buffer Signed-off-by: Jiuzhu Dong --- drivers/syslog/Kconfig | 26 +++++++------- drivers/syslog/syslog_rpmsg.c | 66 +++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 13 deletions(-) diff --git a/drivers/syslog/Kconfig b/drivers/syslog/Kconfig index 167a70527a..1c4a979ddb 100644 --- a/drivers/syslog/Kconfig +++ b/drivers/syslog/Kconfig @@ -186,6 +186,15 @@ config SYSLOG_COLOR_OUTPUT comment "SYSLOG channels" +config SYSLOG_DEVPATH + string "System log device" + default "/dev/ttyS1" + ---help--- + The full path to the system logging device. For the RAMLOG SYSLOG device, + this is normally "/dev/kmsg". For character SYSLOG devices, it should be + some other existing character device (or file) supported by the configuration + (such as "/dev/ttyS1")/ + if !ARCH_SYSLOG config SYSLOG_CHAR bool "Log to a character device" @@ -236,19 +245,6 @@ config SYSLOG_DEFAULT endif -if SYSLOG_CHAR - -config SYSLOG_DEVPATH - string "System log device" - default "/dev/ttyS1" - ---help--- - The full path to the system logging device. For the RAMLOG SYSLOG device, - this is normally "/dev/kmsg". For character SYSLOG devices, it should be - some other existing character device (or file) supported by the configuration - (such as "/dev/ttyS1")/ - -endif # SYSLOG_CHAR - if RAMLOG_SYSLOG config RAMLOG_BUFFER_SECTION @@ -286,6 +282,10 @@ config SYSLOG_RPMSG_OVERWRITE Allow syslog rpmsg overwrite, may cause syslog to lose some logs. Set 'n' if you don't want lost logs, but may harm performance. +config SYSLOG_RPMSG_CHARDEV + bool "SYSLOG rpmsg character device" + default !SYSLOG_RPMSG_WORK_DELAY + endif # SYSLOG_RPMSG config SYSLOG_RPMSG_SERVER diff --git a/drivers/syslog/syslog_rpmsg.c b/drivers/syslog/syslog_rpmsg.c index bb5e702358..8a1692ace9 100644 --- a/drivers/syslog/syslog_rpmsg.c +++ b/drivers/syslog/syslog_rpmsg.c @@ -87,6 +87,12 @@ static void syslog_rpmsg_device_destroy(FAR struct rpmsg_device *rdev, static int syslog_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept, FAR void *data, size_t len, uint32_t src, FAR void *priv_); +#ifdef CONFIG_SYSLOG_RPMSG_CHARDEV +static ssize_t syslog_rpmsg_file_read(FAR struct file *filep, + FAR char *buffer, size_t len); +static ssize_t syslog_rpmsg_file_write(FAR struct file *filep, + FAR const char *buffer, size_t len); +#endif /**************************************************************************** * Private Data @@ -94,6 +100,22 @@ static int syslog_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept, static struct syslog_rpmsg_s g_syslog_rpmsg; +#ifdef CONFIG_SYSLOG_RPMSG_CHARDEV +static const struct file_operations g_syslog_rpmsgfops = +{ + NULL, /* open */ + NULL, /* close */ + syslog_rpmsg_file_read, /* read */ + syslog_rpmsg_file_write, /* write */ + NULL, /* seek */ + NULL, /* ioctl */ + NULL /* poll */ +#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS + , NULL /* unlink */ +#endif +}; +#endif + /**************************************************************************** * Private Functions ****************************************************************************/ @@ -319,6 +341,39 @@ static int syslog_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept, return 0; } +#ifdef CONFIG_SYSLOG_RPMSG_CHARDEV +static ssize_t syslog_rpmsg_file_read(FAR struct file *filep, + FAR char *buffer, size_t len) +{ + FAR struct inode *inode = filep->f_inode; + FAR struct syslog_rpmsg_s *priv; + irqstate_t flags; + + /* Some sanity checking */ + + DEBUGASSERT(inode && inode->i_private); + priv = (FAR struct syslog_rpmsg_s *)inode->i_private; + + flags = enter_critical_section(); + if (!priv->suspend && !priv->transfer && + is_rpmsg_ept_ready(&priv->ept)) + { + priv->transfer = true; + work_queue(HPWORK, &priv->work, syslog_rpmsg_work, priv, 0); + } + + leave_critical_section(flags); + return 0; +} + +static ssize_t syslog_rpmsg_file_write(FAR struct file *filep, + FAR const char *buffer, size_t len) +{ + syslog(LOG_INFO, "%.*s", (int)len, buffer); + return len; +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -428,6 +483,17 @@ void syslog_rpmsg_init_early(FAR void *buffer, size_t size) int syslog_rpmsg_init(void) { +#ifdef CONFIG_SYSLOG_RPMSG_CHARDEV + int ret; + + ret = register_driver(CONFIG_SYSLOG_DEVPATH, &g_syslog_rpmsgfops, + 0666, &g_syslog_rpmsg); + if (ret < 0) + { + return ret; + } +#endif + return rpmsg_register_callback(&g_syslog_rpmsg, syslog_rpmsg_device_created, syslog_rpmsg_device_destroy,