Files
SDK_SG200x_V2/osdrv/interdrv/v2/base/cvi_log_proc.c
carbon 0545e9dc6d init version 2024-05-07
commit d1edce71135cc6d98c0a4b5729774542b676e769
Author: sophgo-forum-service <forum_service@sophgo.com>
Date:   Fri Mar 15 16:07:33 2024 +0800

    [fix] recommend using ssh method to clone repo.
    [fix] fix sensor driver repo branch name.
2024-05-07 19:36:36 +08:00

148 lines
4.1 KiB
C

#include <linux/version.h>
#include "cvi_log_proc.h"
#define LOG_PROC_NAME "log"
#define LOG_PROC_PERMS (0644)
#define MAX_PROC_STR_SIZE (32)
#define DEFAULT_LOG_LEVEL (4)
#define GENERATE_STRING(STRING) (#STRING),
static void *shared_mem;
static const char *const MOD_STRING[] = FOREACH_MOD(GENERATE_STRING);
/*************************************************************************
* Log proc functions
*************************************************************************/
static void _show_log_status(struct seq_file *m)
{
int i;
int32_t *log_level;
log_level = (int32_t *)(shared_mem + BASE_LOG_LEVEL_OFFSET);
seq_puts(m, "-----CURRENT LOG LEVEL-------------------------------------------------------------------------------------------------------------\n");
for (i = 0; i < CVI_ID_BUTT; ++i) {
seq_printf(m, "%-10s(%2d)\n", MOD_STRING[i], log_level[i]);
}
seq_puts(m, "\n-----------------------------------------------------------------------------------------------------------------------------------\n");
}
static int _log_proc_show(struct seq_file *m, void *v)
{
_show_log_status(m);
return 0;
}
static void _log_update_dbg_level(char *pcProcInputdata)
{
int32_t *log_level;
int32_t tmpLogLevel;
int i;
char cModPrefix[MAX_PROC_STR_SIZE];
log_level = (int32_t *)(shared_mem + BASE_LOG_LEVEL_OFFSET);
// check if set to all module
memset(cModPrefix, 0, sizeof(cModPrefix));
snprintf(cModPrefix, sizeof(cModPrefix), "%s=", "ALL");
if (strncmp(pcProcInputdata, cModPrefix, strlen(cModPrefix)) == 0) {
if (kstrtouint(pcProcInputdata + strlen(cModPrefix), 10, &tmpLogLevel) != 0) {
CVI_TRACE_BASE(CVI_BASE_DBG_ERR, "fail to set Mod(%s) debug level to %s\n",
"ALL", pcProcInputdata + strlen(cModPrefix));
} else {
for (i = 0; i < CVI_ID_BUTT; ++i)
log_level[i] = tmpLogLevel;
}
return;
}
// check if set to specific module
for (i = 0; i < CVI_ID_BUTT; ++i) {
memset(cModPrefix, 0, sizeof(cModPrefix));
snprintf(cModPrefix, sizeof(cModPrefix), "%s=", MOD_STRING[i]);
if (strncmp(pcProcInputdata, cModPrefix, strlen(cModPrefix)) == 0) {
if (kstrtouint(pcProcInputdata + strlen(cModPrefix), 10, &log_level[i]) != 0) {
CVI_TRACE_BASE(CVI_BASE_DBG_ERR, "fail to set Mod(%s) debug level to %s\n",
MOD_STRING[i], pcProcInputdata + strlen(cModPrefix));
}
break;
}
}
if (i == CVI_ID_BUTT) {
CVI_TRACE_BASE(CVI_BASE_DBG_ERR, "unknown module, user input:%s\n", pcProcInputdata);
}
}
static ssize_t _log_proc_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos)
{
char cProcInputdata[MAX_PROC_STR_SIZE] = {'\0'};
if (user_buf == NULL || count >= MAX_PROC_STR_SIZE) {
CVI_TRACE_BASE(CVI_BASE_DBG_ERR, "Invalid input value\n");
return -EINVAL;
}
if (copy_from_user(cProcInputdata, user_buf, count)) {
CVI_TRACE_BASE(CVI_BASE_DBG_ERR, "copy_from_user fail\n");
return -EFAULT;
}
_log_update_dbg_level(cProcInputdata);
return count;
}
static int _log_proc_open(struct inode *inode, struct file *file)
{
return single_open(file, _log_proc_show, NULL);
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0))
static const struct proc_ops _log_proc_fops = {
.proc_open = _log_proc_open,
.proc_read = seq_read,
.proc_write = _log_proc_write,
.proc_lseek = seq_lseek,
.proc_release = single_release,
};
#else
static const struct file_operations _log_proc_fops = {
.owner = THIS_MODULE,
.open = _log_proc_open,
.read = seq_read,
.write = _log_proc_write,
.llseek = seq_lseek,
.release = single_release,
};
#endif
int log_proc_init(struct proc_dir_entry *_proc_dir, void *shm)
{
int rc = 0;
int32_t *log_level;
int i;
/* create the /proc file */
if (proc_create_data(LOG_PROC_NAME, LOG_PROC_PERMS, _proc_dir, &_log_proc_fops, NULL) == NULL) {
CVI_TRACE_BASE(CVI_BASE_DBG_ERR, "log proc creation failed\n");
rc = -1;
}
shared_mem = shm;
log_level = (int32_t *)(shared_mem + BASE_LOG_LEVEL_OFFSET);
for (i = 0; i < CVI_ID_BUTT; ++i)
log_level[i] = DEFAULT_LOG_LEVEL;
return rc;
}
int log_proc_remove(struct proc_dir_entry *_proc_dir)
{
remove_proc_entry(LOG_PROC_NAME, _proc_dir);
shared_mem = NULL;
return 0;
}