1.新增log信息。

This commit is contained in:
MacRsh
2023-12-12 21:57:44 +08:00
parent 0d047c80de
commit cb34e86821
4 changed files with 142 additions and 11 deletions

29
Kconfig
View File

@@ -1,7 +1,6 @@
mainmenu "mr-library" mainmenu "mr-library"
menu "Device configure" menu "Device configure"
config MR_CFG_HEAP_SIZE config MR_CFG_HEAP_SIZE
int "Heap size (Bytes)" int "Heap size (Bytes)"
default 4096 default 4096
@@ -15,6 +14,32 @@ menu "Device configure"
help help
"Enabling this option allows the use of assert statements in the code." "Enabling this option allows the use of assert statements in the code."
menu "Logging configure"
config MR_USING_LOG_ERROR
bool "Enable error log"
default y
help
"Enabling this option allows for the use of error log."
config MR_USING_LOG_WARN
bool "Enable warning log"
default y
help
"Enabling this option allows for the use of warning log."
config MR_USING_LOG_INFO
bool "Enable info log"
default y
help
"Enabling this option allows for the use of info log."
config MR_USING_LOG_DEBUG
bool "Enable debug log"
default y
help
"Enabling this option allows for the use of debug log."
endmenu
config MR_CFG_NAME_MAX config MR_CFG_NAME_MAX
int "Max length of device name" int "Max length of device name"
default 8 default 8
@@ -40,6 +65,7 @@ menu "Device configure"
default y default y
help help
"Enabling this option allows for the use of the console device." "Enabling this option allows for the use of the console device."
menu "Console configure" menu "Console configure"
depends on MR_USING_CONSOLE depends on MR_USING_CONSOLE
@@ -161,7 +187,6 @@ menu "Device configure"
default n default n
help help
"Enabling this option allows for the use of Timer devices." "Enabling this option allows for the use of Timer devices."
endmenu endmenu
source "driver/Kconfig" source "driver/Kconfig"

View File

@@ -97,7 +97,7 @@ int mr_dev_register(struct mr_dev *dev,
struct mr_dev_ops *ops, struct mr_dev_ops *ops,
struct mr_drv *drv); struct mr_drv *drv);
int mr_dev_isr(struct mr_dev *dev, int event, void *args); int mr_dev_isr(struct mr_dev *dev, int event, void *args);
int mr_dev_get_full_name(struct mr_dev *dev, char *buf, size_t bufsz); int mr_dev_get_path(struct mr_dev *dev, char *buf, size_t bufsz);
/** @} */ /** @} */
/** /**
@@ -109,6 +109,7 @@ int mr_dev_close(int desc);
ssize_t mr_dev_read(int desc, void *buf, size_t size); ssize_t mr_dev_read(int desc, void *buf, size_t size);
ssize_t mr_dev_write(int desc, const void *buf, size_t size); ssize_t mr_dev_write(int desc, const void *buf, size_t size);
int mr_dev_ioctl(int desc, int cmd, void *args); int mr_dev_ioctl(int desc, int cmd, void *args);
const char *mr_dev_get_name(int desc);
/** @} */ /** @} */
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -45,13 +45,38 @@ extern "C" {
* @param fmt The format of the message. * @param fmt The format of the message.
* @param ... The arguments of the format. * @param ... The arguments of the format.
*/ */
#define mr_log(fmt, ...) \ #define mr_log(level, fmt, ...) \
do{ \ do{ \
mr_printf("log > " \ mr_printf("log %s > " \
fmt".\r\n", \ fmt"\r\n", \
level, \
##__VA_ARGS__); \ ##__VA_ARGS__); \
} while(0) } while(0)
/**
* @brief This macro function logs a error-warning-debug-info message.
*/
#ifdef MR_USING_LOG_ERROR
#define mr_log_error(fmt, ...) mr_log("error", fmt, ##__VA_ARGS__)
#else
#define mr_log_error(fmt, ...)
#endif /* MR_USING_LOG_ERROR */
#ifdef MR_USING_LOG_WARN
#define mr_log_warn(fmt, ...) mr_log("warn", fmt, ##__VA_ARGS__)
#else
#define mr_log_warn(fmt, ...)
#endif /* MR_USING_LOG_WARN */
#ifdef MR_USING_LOG_INFO
#define mr_log_info(fmt, ...) mr_log("info", fmt, ##__VA_ARGS__)
#else
#define mr_log_info(fmt, ...)
#endif /* MR_USING_LOG_INFO */
#ifdef MR_USING_LOG_DEBUG
#define mr_log_debug(fmt, ...) mr_log("debug", fmt, ##__VA_ARGS__)
#else
#define mr_log_debug(fmt, ...)
#endif /* MR_USING_LOG_DEBUG */
/** /**
* @brief This macro function gets its structure from its member. * @brief This macro function gets its structure from its member.
* *

View File

@@ -172,8 +172,10 @@ MR_INLINE int dev_register(struct mr_dev *dev, const char *name)
{ {
if (dev_find_or_register(name, dev, MR_REGISTER) != MR_NULL) if (dev_find_or_register(name, dev, MR_REGISTER) != MR_NULL)
{ {
mr_log_debug("%s registered.", dev->name);
return MR_EOK; return MR_EOK;
} }
mr_log_warn("%s register failed.", name);
return MR_EINVAL; return MR_EINVAL;
} }
@@ -182,6 +184,7 @@ MR_INLINE int dev_open(struct mr_dev *dev, int oflags)
#ifdef MR_USING_RDWR_CTL #ifdef MR_USING_RDWR_CTL
if (mr_bits_is_set(dev->sflags, oflags) != MR_ENABLE) if (mr_bits_is_set(dev->sflags, oflags) != MR_ENABLE)
{ {
mr_log_warn("%s failed to open with flags 0x%x.", dev->name, oflags);
return MR_ENOTSUP; return MR_ENOTSUP;
} }
#endif /* MR_USING_RDWR_CTL */ #endif /* MR_USING_RDWR_CTL */
@@ -193,6 +196,10 @@ MR_INLINE int dev_open(struct mr_dev *dev, int oflags)
int ret = dev_open(dev->link, oflags); int ret = dev_open(dev->link, oflags);
if (ret != MR_EOK) if (ret != MR_EOK)
{ {
mr_log_warn("%s failed to open link %s, error: %s.",
dev->name,
((struct mr_dev *)dev->link)->name,
mr_strerror(ret));
return ret; return ret;
} }
} }
@@ -202,6 +209,7 @@ MR_INLINE int dev_open(struct mr_dev *dev, int oflags)
int ret = dev->ops->open(dev); int ret = dev->ops->open(dev);
if (ret != MR_EOK) if (ret != MR_EOK)
{ {
mr_log_warn("%s failed to open, error: %s.", dev->name, mr_strerror(ret));
return ret; return ret;
} }
} }
@@ -209,6 +217,7 @@ MR_INLINE int dev_open(struct mr_dev *dev, int oflags)
#ifdef MR_USING_RDWR_CTL #ifdef MR_USING_RDWR_CTL
else if (mr_bits_is_set(dev->sflags, MR_SFLAG_ONLY) == MR_ENABLE) else if (mr_bits_is_set(dev->sflags, MR_SFLAG_ONLY) == MR_ENABLE)
{ {
mr_log_warn("%s is exclusive and already opened.", dev->name);
return MR_EBUSY; return MR_EBUSY;
} }
#endif /* MR_USING_RDWR_CTL */ #endif /* MR_USING_RDWR_CTL */
@@ -227,13 +236,22 @@ MR_INLINE int dev_close(struct mr_dev *dev)
int ret = dev_close(dev->link); int ret = dev_close(dev->link);
if (ret != MR_EOK) if (ret != MR_EOK)
{ {
mr_log_warn("%s failed to close link %s, error: %s.",
dev->name,
((struct mr_dev *)dev->link)->name,
mr_strerror(ret));
return ret; return ret;
} }
} }
if (dev->ops->close != MR_NULL) if (dev->ops->close != MR_NULL)
{ {
return dev->ops->close(dev); int ret = dev->ops->close(dev);
if (ret != MR_EOK)
{
mr_log_warn("%s failed to close, error: %s.", dev->name, mr_strerror(ret));
return ret;
}
} }
} }
return MR_EOK; return MR_EOK;
@@ -251,6 +269,7 @@ MR_INLINE ssize_t dev_read(struct mr_dev *dev, int off, void *buf, size_t size,
{ {
/* Enable interrupt */ /* Enable interrupt */
mr_interrupt_enable(); mr_interrupt_enable();
mr_log_warn("%s is busy reading.", dev->name);
return ret; return ret;
} }
/* Enable interrupt */ /* Enable interrupt */
@@ -261,6 +280,18 @@ MR_INLINE ssize_t dev_read(struct mr_dev *dev, int off, void *buf, size_t size,
/* Read buffer from the device */ /* Read buffer from the device */
ssize_t ret = dev->ops->read(dev, off, buf, size, async); ssize_t ret = dev->ops->read(dev, off, buf, size, async);
#ifdef MR_USING_LOG_WARN
if (ret < 0)
{
mr_log_warn("%s failed to read, error: %s.", dev->name, mr_strerror(ret));
}
#endif /* MR_USING_LOG_WARN */
#ifdef MR_USING_LOG_DEBUG
if (ret >= 0)
{
mr_log_debug("%s read %d bytes.", dev->name, ret);
}
#endif /* MR_USING_LOG_DEBUG */
#ifdef MR_USING_RDWR_CTL #ifdef MR_USING_RDWR_CTL
dev_lock_release(dev, MR_LFLAG_RD); dev_lock_release(dev, MR_LFLAG_RD);
#endif /* MR_USING_RDWR_CTL */ #endif /* MR_USING_RDWR_CTL */
@@ -281,6 +312,7 @@ MR_INLINE ssize_t dev_write(struct mr_dev *dev, int offset, const void *buf, siz
{ {
/* Enable interrupt */ /* Enable interrupt */
mr_interrupt_enable(); mr_interrupt_enable();
mr_log_warn("%s is busy writing.", dev->name);
return ret; return ret;
} }
/* Enable interrupt */ /* Enable interrupt */
@@ -291,6 +323,18 @@ MR_INLINE ssize_t dev_write(struct mr_dev *dev, int offset, const void *buf, siz
/* Write buffer to the device */ /* Write buffer to the device */
ssize_t ret = dev->ops->write(dev, offset, buf, size, async); ssize_t ret = dev->ops->write(dev, offset, buf, size, async);
#ifdef MR_USING_LOG_WARN
if (ret < 0)
{
mr_log_warn("%s failed to write, error: %s.", dev->name, mr_strerror(ret));
}
#endif /* MR_USING_LOG_WARN */
#ifdef MR_USING_LOG_DEBUG
if (ret >= 0)
{
mr_log_debug("%s write %d bytes.", dev->name, ret);
}
#endif /* MR_USING_LOG_DEBUG */
#ifdef MR_USING_RDWR_CTL #ifdef MR_USING_RDWR_CTL
dev_lock_release(dev, MR_LFLAG_WR); dev_lock_release(dev, MR_LFLAG_WR);
if ((async == MR_ASYNC) && (ret != 0)) if ((async == MR_ASYNC) && (ret != 0))
@@ -309,6 +353,7 @@ static int dev_ioctl(struct mr_dev *dev, int desc, int off, int cmd, void *args)
{ {
if (dev->ops->ioctl == MR_NULL) if (dev->ops->ioctl == MR_NULL)
{ {
mr_log_warn("%s does not support ioctl.", dev->name);
return MR_ENOTSUP; return MR_ENOTSUP;
} }
@@ -334,6 +379,7 @@ static int dev_ioctl(struct mr_dev *dev, int desc, int off, int cmd, void *args)
*(int (**)(int desc, void *args))args = dev->rd_call.call; *(int (**)(int desc, void *args))args = dev->rd_call.call;
return MR_EOK; return MR_EOK;
} }
mr_log_warn("%s get read call failed, args is null.", dev->name);
return MR_EINVAL; return MR_EINVAL;
} }
case MR_CTL_GET_WR_CALL: case MR_CTL_GET_WR_CALL:
@@ -343,6 +389,7 @@ static int dev_ioctl(struct mr_dev *dev, int desc, int off, int cmd, void *args)
*(int (**)(int desc, void *args))args = dev->wr_call.call; *(int (**)(int desc, void *args))args = dev->wr_call.call;
return MR_EOK; return MR_EOK;
} }
mr_log_warn("%s get write call failed, args is null.", dev->name);
return MR_EINVAL; return MR_EINVAL;
} }
@@ -358,6 +405,7 @@ static int dev_ioctl(struct mr_dev *dev, int desc, int off, int cmd, void *args)
{ {
/* Enable interrupt */ /* Enable interrupt */
mr_interrupt_enable(); mr_interrupt_enable();
mr_log_warn("%s is busy reading or writing.", dev->name);
return ret; return ret;
} }
/* Enable interrupt */ /* Enable interrupt */
@@ -368,6 +416,18 @@ static int dev_ioctl(struct mr_dev *dev, int desc, int off, int cmd, void *args)
/* I/O control to the device */ /* I/O control to the device */
int ret = dev->ops->ioctl(dev, off, cmd, args); int ret = dev->ops->ioctl(dev, off, cmd, args);
#ifdef MR_USING_LOG_WARN
if (ret < 0)
{
mr_log_warn("%s failed to ioctl, error: %s.", dev->name, mr_strerror(ret));
}
#endif /* MR_USING_LOG_WARN */
#ifdef MR_USING_LOG_DEBUG
if (ret >= 0)
{
mr_log_debug("%s ioctl %d bytes.", dev->name, ret);
}
#endif /* MR_USING_LOG_DEBUG */
#ifdef MR_USING_RDWR_CTL #ifdef MR_USING_RDWR_CTL
dev_lock_release(dev, MR_LFLAG_RDWR); dev_lock_release(dev, MR_LFLAG_RDWR);
#endif /* MR_USING_RDWR_CTL */ #endif /* MR_USING_RDWR_CTL */
@@ -489,15 +549,15 @@ int mr_dev_isr(struct mr_dev *dev, int event, void *args)
} }
/** /**
* @brief This function get the full name of the device. * @brief This function get the path of the device.
* *
* @param dev The device. * @param dev The device.
* @param buf The buffer to store the full name. * @param buf The buffer to store the path.
* @param bufsz The size of the buffer. * @param bufsz The size of the buffer.
* *
* @return MR_EOK on success, otherwise an error code. * @return MR_EOK on success, otherwise an error code.
*/ */
int mr_dev_get_full_name(struct mr_dev *dev, char *buf, size_t bufsz) int mr_dev_get_path(struct mr_dev *dev, char *buf, size_t bufsz)
{ {
size_t len = 0; size_t len = 0;
@@ -507,7 +567,7 @@ int mr_dev_get_full_name(struct mr_dev *dev, char *buf, size_t bufsz)
*buf = '\0'; *buf = '\0';
if (dev->link != MR_NULL) if (dev->link != MR_NULL)
{ {
int ret = mr_dev_get_full_name(dev->link, buf, bufsz); int ret = mr_dev_get_path(dev->link, buf, bufsz);
if (ret != MR_EOK) if (ret != MR_EOK)
{ {
return ret; return ret;
@@ -561,6 +621,7 @@ static int desc_allocate(const char *name)
} }
if (desc < 0) if (desc < 0)
{ {
mr_log_warn("%s has no free descriptor.", name);
return MR_ENOMEM; return MR_ENOMEM;
} }
@@ -568,6 +629,7 @@ static int desc_allocate(const char *name)
struct mr_dev *dev = dev_find_or_register(name, MR_NULL, MR_FIND); struct mr_dev *dev = dev_find_or_register(name, MR_NULL, MR_FIND);
if (dev == MR_NULL) if (dev == MR_NULL)
{ {
mr_log_warn("%s not found.", name);
return MR_ENOTFOUND; return MR_ENOTFOUND;
} }
@@ -655,6 +717,7 @@ ssize_t mr_dev_read(int desc, void *buf, size_t size)
#ifdef MR_USING_RDWR_CTL #ifdef MR_USING_RDWR_CTL
if (mr_bits_is_set(desc_of(desc).oflags, MR_OFLAG_RDONLY) == MR_DISABLE) if (mr_bits_is_set(desc_of(desc).oflags, MR_OFLAG_RDONLY) == MR_DISABLE)
{ {
mr_log_warn("%s not supported read.", desc_of(desc).dev->name);
return MR_ENOTSUP; return MR_ENOTSUP;
} }
#endif /* MR_USING_RDWR_CTL */ #endif /* MR_USING_RDWR_CTL */
@@ -684,6 +747,7 @@ ssize_t mr_dev_write(int desc, const void *buf, size_t size)
#ifdef MR_USING_RDWR_CTL #ifdef MR_USING_RDWR_CTL
if (mr_bits_is_set(desc_of(desc).oflags, MR_OFLAG_WRONLY) == MR_DISABLE) if (mr_bits_is_set(desc_of(desc).oflags, MR_OFLAG_WRONLY) == MR_DISABLE)
{ {
mr_log_warn("%s not supported write.", desc_of(desc).dev->name);
return MR_ENOTSUP; return MR_ENOTSUP;
} }
#endif /* MR_USING_RDWR_CTL */ #endif /* MR_USING_RDWR_CTL */
@@ -718,6 +782,7 @@ int mr_dev_ioctl(int desc, int cmd, void *args)
desc_of(desc).offset = *(int *)args; desc_of(desc).offset = *(int *)args;
return MR_EOK; return MR_EOK;
} }
mr_log_warn("%s set offset failed, args is null.", desc_of(desc).dev->name);
return MR_EINVAL; return MR_EINVAL;
} }
@@ -728,6 +793,7 @@ int mr_dev_ioctl(int desc, int cmd, void *args)
*(int *)args = desc_of(desc).offset; *(int *)args = desc_of(desc).offset;
return MR_EOK; return MR_EOK;
} }
mr_log_warn("%s get offset failed, args is null.", desc_of(desc).dev->name);
return MR_EINVAL; return MR_EINVAL;
} }
@@ -737,3 +803,17 @@ int mr_dev_ioctl(int desc, int cmd, void *args)
} }
} }
} }
/**
* @brief Get the name of the device.
*
* @param desc The descriptor of the device.
*
* @return The name of the device.
*/
const char *mr_dev_get_name(int desc)
{
mr_assert(desc_is_valid(desc));
return desc_of(desc).dev->name;
}