1.新增log信息。
This commit is contained in:
29
Kconfig
29
Kconfig
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user