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"
menu "Device configure"
config MR_CFG_HEAP_SIZE
int "Heap size (Bytes)"
default 4096
@@ -15,6 +14,32 @@ menu "Device configure"
help
"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
int "Max length of device name"
default 8
@@ -40,6 +65,7 @@ menu "Device configure"
default y
help
"Enabling this option allows for the use of the console device."
menu "Console configure"
depends on MR_USING_CONSOLE
@@ -161,7 +187,6 @@ menu "Device configure"
default n
help
"Enabling this option allows for the use of Timer devices."
endmenu
source "driver/Kconfig"

View File

@@ -97,7 +97,7 @@ int mr_dev_register(struct mr_dev *dev,
struct mr_dev_ops *ops,
struct mr_drv *drv);
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_write(int desc, const void *buf, size_t size);
int mr_dev_ioctl(int desc, int cmd, void *args);
const char *mr_dev_get_name(int desc);
/** @} */
#ifdef __cplusplus

View File

@@ -45,13 +45,38 @@ extern "C" {
* @param fmt The format of the message.
* @param ... The arguments of the format.
*/
#define mr_log(fmt, ...) \
#define mr_log(level, fmt, ...) \
do{ \
mr_printf("log > " \
fmt".\r\n", \
mr_printf("log %s > " \
fmt"\r\n", \
level, \
##__VA_ARGS__); \
} 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.
*

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)
{
mr_log_debug("%s registered.", dev->name);
return MR_EOK;
}
mr_log_warn("%s register failed.", name);
return MR_EINVAL;
}
@@ -182,6 +184,7 @@ MR_INLINE int dev_open(struct mr_dev *dev, int oflags)
#ifdef MR_USING_RDWR_CTL
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;
}
#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);
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;
}
}
@@ -202,6 +209,7 @@ MR_INLINE int dev_open(struct mr_dev *dev, int oflags)
int ret = dev->ops->open(dev);
if (ret != MR_EOK)
{
mr_log_warn("%s failed to open, error: %s.", dev->name, mr_strerror(ret));
return ret;
}
}
@@ -209,6 +217,7 @@ MR_INLINE int dev_open(struct mr_dev *dev, int oflags)
#ifdef MR_USING_RDWR_CTL
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;
}
#endif /* MR_USING_RDWR_CTL */
@@ -227,13 +236,22 @@ MR_INLINE int dev_close(struct mr_dev *dev)
int ret = dev_close(dev->link);
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;
}
}
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;
@@ -251,6 +269,7 @@ MR_INLINE ssize_t dev_read(struct mr_dev *dev, int off, void *buf, size_t size,
{
/* Enable interrupt */
mr_interrupt_enable();
mr_log_warn("%s is busy reading.", dev->name);
return ret;
}
/* 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 */
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
dev_lock_release(dev, MR_LFLAG_RD);
#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 */
mr_interrupt_enable();
mr_log_warn("%s is busy writing.", dev->name);
return ret;
}
/* 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 */
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
dev_lock_release(dev, MR_LFLAG_WR);
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)
{
mr_log_warn("%s does not support ioctl.", dev->name);
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;
return MR_EOK;
}
mr_log_warn("%s get read call failed, args is null.", dev->name);
return MR_EINVAL;
}
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;
return MR_EOK;
}
mr_log_warn("%s get write call failed, args is null.", dev->name);
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 */
mr_interrupt_enable();
mr_log_warn("%s is busy reading or writing.", dev->name);
return ret;
}
/* 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 */
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
dev_lock_release(dev, MR_LFLAG_RDWR);
#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 buf The buffer to store the full name.
* @param buf The buffer to store the path.
* @param bufsz The size of the buffer.
*
* @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;
@@ -507,7 +567,7 @@ int mr_dev_get_full_name(struct mr_dev *dev, char *buf, size_t bufsz)
*buf = '\0';
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)
{
return ret;
@@ -561,6 +621,7 @@ static int desc_allocate(const char *name)
}
if (desc < 0)
{
mr_log_warn("%s has no free descriptor.", name);
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);
if (dev == MR_NULL)
{
mr_log_warn("%s not found.", name);
return MR_ENOTFOUND;
}
@@ -655,6 +717,7 @@ ssize_t mr_dev_read(int desc, void *buf, size_t size)
#ifdef MR_USING_RDWR_CTL
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;
}
#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
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;
}
#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;
return MR_EOK;
}
mr_log_warn("%s set offset failed, args is null.", desc_of(desc).dev->name);
return MR_EINVAL;
}
@@ -728,6 +793,7 @@ int mr_dev_ioctl(int desc, int cmd, void *args)
*(int *)args = desc_of(desc).offset;
return MR_EOK;
}
mr_log_warn("%s get offset failed, args is null.", desc_of(desc).dev->name);
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;
}