2023-09-15 00:07:58 +08:00
|
|
|
/**
|
|
|
|
|
* @file log.c
|
|
|
|
|
* @author zhangzheng (1358745329@qq.com)
|
|
|
|
|
* @brief
|
|
|
|
|
* @version 0.1
|
|
|
|
|
* @date 2023-09-14
|
|
|
|
|
*
|
|
|
|
|
* @copyright Copyright (c) 2023
|
|
|
|
|
*
|
2023-08-20 20:52:23 +08:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "log.h"
|
|
|
|
|
#include "factory.h"
|
|
|
|
|
#include "kobject.h"
|
|
|
|
|
#include "globals.h"
|
2023-08-22 00:26:34 +08:00
|
|
|
#include "init.h"
|
2023-08-20 20:52:23 +08:00
|
|
|
#include "printk.h"
|
2023-09-03 15:55:06 +08:00
|
|
|
#include "types.h"
|
|
|
|
|
#include "util.h"
|
2023-09-15 00:07:58 +08:00
|
|
|
#include "irq_sender.h"
|
|
|
|
|
#include "uart/uart.h"
|
|
|
|
|
typedef struct log
|
|
|
|
|
{
|
|
|
|
|
irq_sender_t kobj;
|
|
|
|
|
} log_t;
|
2023-08-20 20:52:23 +08:00
|
|
|
static log_t log;
|
|
|
|
|
|
|
|
|
|
enum log_op
|
|
|
|
|
{
|
|
|
|
|
WRITE_DATA,
|
|
|
|
|
READ_DATA,
|
|
|
|
|
SET_FLAGS
|
|
|
|
|
};
|
2023-09-03 15:55:06 +08:00
|
|
|
static void log_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f);
|
2023-08-20 20:52:23 +08:00
|
|
|
|
2023-09-15 00:07:58 +08:00
|
|
|
static void log_trigger(irq_entry_t *irq)
|
|
|
|
|
{
|
|
|
|
|
uart_tigger(irq);
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-22 00:26:34 +08:00
|
|
|
static void log_reg(void)
|
2023-08-20 20:52:23 +08:00
|
|
|
{
|
2023-09-15 00:07:58 +08:00
|
|
|
// kobject_init(&log.kobj);
|
|
|
|
|
irq_sender_init(&log.kobj);
|
|
|
|
|
log.kobj.kobj.invoke_func = log_syscall;
|
|
|
|
|
global_reg_kobj(&log.kobj.kobj, LOG_PROT);
|
|
|
|
|
irq_alloc(37 /*USART1_IRQn*/, &log.kobj, log_trigger);
|
2023-08-20 20:52:23 +08:00
|
|
|
}
|
2023-08-22 00:26:34 +08:00
|
|
|
INIT_KOBJ(log_reg);
|
2023-08-20 20:52:23 +08:00
|
|
|
static msg_tag_t log_write_data(log_t *log, const char *data, int len)
|
|
|
|
|
{
|
2023-09-07 23:47:34 +08:00
|
|
|
for (int i = 0; i < len && data[i]; i++)
|
2023-08-20 20:52:23 +08:00
|
|
|
{
|
|
|
|
|
putc(data[i]);
|
|
|
|
|
}
|
|
|
|
|
return msg_tag_init(0);
|
|
|
|
|
}
|
2023-09-15 00:07:58 +08:00
|
|
|
static int log_read_data(log_t *log, uint8_t *data, int len)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < len; i++)
|
|
|
|
|
{
|
|
|
|
|
again:;
|
|
|
|
|
int c = getc();
|
|
|
|
|
|
|
|
|
|
if (c < 0 && i == 0)
|
|
|
|
|
{
|
|
|
|
|
int ret = irq_sender_wait(&log->kobj, thread_get_current());
|
|
|
|
|
if (ret < 0)
|
|
|
|
|
{
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
goto again;
|
|
|
|
|
}
|
|
|
|
|
else if (c < 0)
|
|
|
|
|
{
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
data[i] = (uint8_t)c;
|
|
|
|
|
}
|
|
|
|
|
return len;
|
|
|
|
|
}
|
2023-09-03 15:55:06 +08:00
|
|
|
static void
|
|
|
|
|
log_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f)
|
2023-08-20 20:52:23 +08:00
|
|
|
{
|
2023-09-07 23:47:34 +08:00
|
|
|
msg_tag_t tag = msg_tag_init4(0, 0, 0, -EINVAL);
|
2023-09-15 00:07:58 +08:00
|
|
|
if (sys_p.prot == LOG_PROT)
|
2023-08-20 20:52:23 +08:00
|
|
|
{
|
2023-09-15 00:07:58 +08:00
|
|
|
|
|
|
|
|
switch (sys_p.op)
|
|
|
|
|
{
|
|
|
|
|
case WRITE_DATA:
|
|
|
|
|
tag = log_write_data(
|
|
|
|
|
(log_t *)kobj, (const char *)(&f->r[1]),
|
|
|
|
|
MIN(in_tag.msg_buf_len * WORD_BYTES, WORD_BYTES * 5));
|
|
|
|
|
break;
|
|
|
|
|
case READ_DATA:
|
|
|
|
|
{
|
|
|
|
|
int ret = log_read_data((log_t *)kobj, (uint8_t *)(&f->r[1]), MIN(f->r[1], WORD_BYTES * 5));
|
|
|
|
|
tag = msg_tag_init4(0, 0, 0, ret);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SET_FLAGS:
|
|
|
|
|
printk("don't support set flags.\n");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
tag = msg_tag_init4(0, 0, 0, -ENOSYS);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
f->r[0] = tag.raw;
|
2023-08-20 20:52:23 +08:00
|
|
|
}
|
2023-09-15 00:07:58 +08:00
|
|
|
else if (sys_p.prot == IRQ_PROT)
|
2023-08-20 20:52:23 +08:00
|
|
|
{
|
2023-09-15 00:07:58 +08:00
|
|
|
irq_sender_syscall(kobj, sys_p, in_tag, f);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw;
|
|
|
|
|
return;
|
2023-08-20 20:52:23 +08:00
|
|
|
}
|
2023-09-03 15:55:06 +08:00
|
|
|
return;
|
2023-08-22 00:26:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void log_dump(void)
|
|
|
|
|
{
|
2023-08-20 20:52:23 +08:00
|
|
|
}
|