支持简单的显示驱动&显示驱动框架

This commit is contained in:
zhangzheng
2024-11-21 15:31:20 +08:00
parent e9cba510eb
commit 3dcf66e0b2
45 changed files with 2689 additions and 196 deletions

View File

@@ -129,7 +129,11 @@
"at32f435_437_crm.h": "c",
"mk_char_dev.h": "c",
"unistd.h": "c",
"stat.h": "c"
"stat.h": "c",
"mk_drv.h": "c",
"mk_display_drv_impl.h": "c",
"at_surf_f437_board_font.h": "c",
"infones_types.h": "c"
},
"cortex-debug.showRTOS": false,
"cortex-debug.variableUseNaturalFormat": false,

View File

@@ -1,6 +1,6 @@
message("========use armv7_8.cmake")
set(CMAKE_C_FLAGS "-mcpu=${CONFIG_ARCH} -O0 -g3 -mfloat-abi=${CONFIG_FLOAT_TYPE} -mthumb -D=MKRTOS \
set(CMAKE_C_FLAGS "-mcpu=${CONFIG_ARCH} -O3 -g3 -mfloat-abi=${CONFIG_FLOAT_TYPE} -mthumb -D=MKRTOS \
-std=gnu11 -ffunction-sections -fdata-sections -fno-builtin -u=_printf_float \
-nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker \
-fno-stack-protector -Wl,--gc-sections -D__ARM_ARCH_7M__ \

View File

@@ -12,10 +12,18 @@
pin {
compatible = "at32f43x,pin";
regs = <
0x40020000 0x2000 /*GPIO*/
0x40013800 0x400 /*EXINT & SCFG*/
0x40013C00 0x400 /*EXINT & SCFG*/
0x40023800 0x400 /*CRM*/
0x40020000 0x2000 /*GPIO*/
0x40013800 0x400 /*EXINT & SCFG*/
0x40013C00 0x400 /*EXINT & SCFG*/
0x40023800 0x400 /*CRM*/
>;
};
disp {
compatible = "at32f43x,lcd";
regs = <
0xA0000000 0x1000 /*XMC_REG*/
0x40023800 0x400 /*CRM*/
0x60000000 0x100000 /*XMC_MEM*/
>;
};
};

View File

@@ -15,6 +15,15 @@
0x40020000 0x2000 /*GPIO*/
0x40013800 0x400 /*EXINT & SCFG*/
0x40013C00 0x400 /*EXINT & SCFG*/
0x40023800 0x400 /*CRM*/
>;
};
disp {
compatible = "at32f43x,lcd";
regs = <
0xA0000000 0x1000 /*XMC_REG*/
0x40023800 0x400 /*CRM*/
0x60000000 0x100000 /*XMC_MEM*/
>;
};
};

View File

@@ -21,6 +21,7 @@
#include "spinlock.h"
#include "string.h"
#include "thread.h"
#include "thread_arch.h"
#if IS_ENABLED(CONFIG_MMU)
#include "arch.h"
#endif
@@ -38,6 +39,7 @@ enum task_op_code
TASK_GET_PID, //!< 获取task的pid
TASK_COPY_DATA, //!< 拷贝数据到task的数据区域
TASK_SET_OBJ_NAME, //!< 设置对象的名字
TASK_COPY_DATA_TO, //!< 从当前task拷贝数据到目的task
};
static bool_t task_put(kobject_t *kobj);
static void task_release_stage1(kobject_t *kobj);
@@ -343,6 +345,56 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
tag = msg_tag_init4(0, 0, 0, 0);
}
break;
case TASK_COPY_DATA_TO: //!< 从当前task拷贝到目的task
{
int st0, st1;
int ret = 0;
obj_handler_t dst_task_hd;
addr_t src_addr;
addr_t dst_addr;
size_t copy_len;
int suc;
dst_task_hd = f->regs[0];
src_addr = f->regs[1];
dst_addr = f->regs[2];
copy_len = f->regs[3];
kobject_t *source_kobj = obj_space_lookup_kobj_cmp_type(&cur_task->obj_space, dst_task_hd, TASK_TYPE);
if (!source_kobj)
{
ret = -EINVAL;
goto copy_data_to_end;
}
task_t *dst_task_obj = container_of(source_kobj, task_t, kobj);
suc = task_lock_2(&tag_task->kobj.lock, &dst_task_obj->kobj.lock, &st0, &st1);
if (!suc)
{
tag = msg_tag_init4(0, 0, 0, -EINVAL);
break;
}
if (!is_rw_access(tag_task, (void *)src_addr, copy_len, FALSE))
{
ret = -EPERM;
goto copy_data_to_end;
}
if (!is_rw_access(dst_task_obj, (void *)dst_addr, copy_len, FALSE))
{
ret = -EPERM;
goto copy_data_to_end;
}
paddr_t src_paddr = (paddr_t)task_get_currnt_paddr((vaddr_t)src_addr);
paddr_t dst_paddr = (paddr_t)task_get_currnt_paddr((vaddr_t)dst_addr);
memcpy((void *)dst_paddr, (void *)src_paddr, copy_len);
copy_data_to_end:
task_unlock_2(&tag_task->kobj.lock, &dst_task_obj->kobj.lock, st0, st1);
tag = msg_tag_init4(0, 0, 0, ret);
}
break;
default:
break;
}
@@ -371,7 +423,7 @@ void task_init(task_t *task, ram_limit_t *ram, int is_knl)
knl_pdir_init(&task->mm_space.mem_dir, task->mm_space.mem_dir.dir, 3 /*TODO:*/);
#else
assert(task_vma_alloc(&task->mm_space.mem_vma, vma_addr_create(VPAGE_PROT_RO, 0, 0),
align_power_of_2(CONFIG_SYS_TEXT_SIZE), CONFIG_SYS_TEXT_ADDR, NULL) >=0 );
align_power_of_2(CONFIG_SYS_TEXT_SIZE), CONFIG_SYS_TEXT_ADDR, NULL) >= 0);
#endif
}

View File

@@ -913,7 +913,8 @@ again:;
if (to->status != THREAD_SUSPEND || to->ipc_status != THREAD_RECV)
{
/*TODO:这里应该挂起等待*/
if (to->ipc_status == THREAD_IPC_ABORT) {
if (to->ipc_status == THREAD_IPC_ABORT)
{
ref_counter_dec_and_release(&to->ref, &to->kobj);
return -ECANCELED;
}
@@ -1440,8 +1441,8 @@ static void thread_syscall(kobject_t *kobj, syscall_prot_t sys_p,
#else
if (!slist_in_list(&tag_th->sche.node))
{
tag_th->sche.prio = tge_prio;
thread_ready(tag_th, TRUE);
}
else
{

View File

@@ -15,3 +15,4 @@ msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t
msg_tag_t task_unmap(obj_handler_t task_han, vpage_t vpage);
msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr);
msg_tag_t task_copy_data(obj_handler_t task_obj, void *st_addr, umword_t size);
msg_tag_t task_copy_data_to(obj_handler_t task_obj, obj_handler_t dst_task_obj, void *st_addr, void *dst_addr, umword_t size);

View File

@@ -3,7 +3,8 @@
#include "u_prot.h"
#include "u_types.h"
enum task_op_code {
enum task_op_code
{
TASK_OBJ_MAP,
TASK_OBJ_UNMAP,
TASK_ALLOC_RAM_BASE,
@@ -12,6 +13,7 @@ enum task_op_code {
TASK_GET_PID,
TASK_COPY_DATA,
TASK_SET_OBJ_NAME,
TASK_COPY_DATA_TO, //!< 从当前task拷贝数据到目的task
};
msg_tag_t task_set_obj_name(obj_handler_t dst_task, obj_handler_t obj, const char *name)
@@ -68,7 +70,8 @@ msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *pid)
:
:
: ARCH_REG_0, ARCH_REG_1);
if (pid) {
if (pid)
{
*pid = r1;
}
@@ -90,7 +93,8 @@ msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx, int *obj
:
:
: ARCH_REG_0);
if (obj_type) {
if (obj_type)
{
*obj_type = r1;
}
@@ -148,7 +152,8 @@ msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *all
:
:
: ARCH_REG_0, ARCH_REG_1);
if (alloc_addr) {
if (alloc_addr)
{
*alloc_addr = r1;
}
@@ -172,3 +177,21 @@ msg_tag_t task_copy_data(obj_handler_t task_obj, void *st_addr, umword_t size)
return msg_tag_init(r0);
}
msg_tag_t task_copy_data_to(obj_handler_t task_obj, obj_handler_t dst_task_obj, void *st_addr, void *dst_addr, umword_t size)
{
register volatile umword_t r0 asm(ARCH_REG_0);
mk_syscall(syscall_prot_create(TASK_COPY_DATA_TO, TASK_PROT, task_obj).raw,
dst_task_obj,
st_addr,
dst_addr,
size,
0,
0);
asm __volatile__(""
:
:
: ARCH_REG_0, ARCH_REG_1);
return msg_tag_init(r0);
}

View File

@@ -7,3 +7,4 @@
int pm_run_app(const char *path, int flags);
int pm_kill_task(int pid, int flags);
int pm_watch_pid(obj_handler_t sig_hd, pid_t pid, int flags);
int pm_copy_data(pid_t src_pid, pid_t dst_pid, addr_t src_addr, addr_t dst_addr, size_t len);

View File

@@ -10,6 +10,7 @@
*/
#pragma once
#include "pm_cli.h"
#include "u_rpc_svr.h"
#include "u_slist.h"
#include "u_types.h"
@@ -34,3 +35,4 @@ void pm_svr_obj_init(pm_t *pm);
int pm_rpc_run_app(const char *path, int flags);
int pm_rpc_kill_task(int pid, int flags);
int pm_rpc_watch_pid(pm_t *pm, obj_handler_t sig_rcv_hd, pid_t pid, int flags);
int pm_rpc_copy_data(pid_t src_pid, pid_t dst_pid, umword_t src_addr, umword_t dst_addr, size_t len);

View File

@@ -35,10 +35,11 @@
#define META_PROT 0x0004 //!< 元协议
#define PM_PROT 0x0005 //!< 进程管理协议
#define PM_RUN_APP ((umword_t)0) //!< 启动应用程序
#define PM_KILL_TASK ((umword_t)1) //!< 删除进程
#define PM_WATCH_PID ((umword_t)2) //!< watch pid
#define PM_PROT 0x0005 //!< 进程管理协议
#define PM_RUN_APP ((umword_t)0) //!< 启动应用程序
#define PM_KILL_TASK ((umword_t)1) //!< 删除进程
#define PM_WATCH_PID ((umword_t)2) //!< watch pid
#define PM_COPY_DATA ((umword_t)3) //!< copy 进程数据
#define CONS_PROT 0x0006 //!< console协议
#define CONS_WRITE ((umword_t)0) //!< console删除

View File

@@ -27,119 +27,10 @@ int pm_run_app(const char *path, int flags)
return msg_tag_get_val(tag);
}
// RPC_GENERATION_CALL2(pm_t, PM_PROT, PM_KILL_TASK, kill_task,
// rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, pid,
// rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
msg_tag_t pm_t_kill_task_call(obj_handler_t hd, rpc_int_t *var0, rpc_int_t *var1)
{
void *buf;
ipc_msg_t *msg_ipc;
thread_msg_buf_get(2, (umword_t *)(&buf), ((void *)0));
msg_ipc = (ipc_msg_t *)buf;
int off = 0;
int off_buf = 0;
int ret = -1;
size_t op_val = ((uint16_t)1);
rpc_memcpy(msg_ipc->msg_buf, &op_val, sizeof(op_val));
off += rpc_align(sizeof(op_val), __alignof(((uint16_t)1)));
do
{
if (1 == 1)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_cli_msg_to_buf_rpc_int_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
do
{
if (1 == 2)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_cli_msg_to_buf_rpc_int_t(var0, (uint8_t *)((uint8_t *)msg_ipc->map_buf), off_buf);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off_buf = ret;
}
}
} while (0);
do
{
if (1 == 1)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_cli_msg_to_buf_rpc_int_t(var1, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
do
{
if (1 == 2)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_cli_msg_to_buf_rpc_int_t(var1, (uint8_t *)((uint8_t *)msg_ipc->map_buf), off_buf);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off_buf = ret;
}
}
} while (0);
msg_tag_t tag = thread_ipc_call(((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = ((((off_buf) / ((sizeof(void *)))) + (((off_buf) % ((sizeof(void *)))) ? 1 : 0))), .prot = (0x0005)}), hd, ipc_timeout_create2(0, 0));
if (((int16_t)((tag).prot)) < 0)
{
return tag;
}
off = 0;
do
{
if (1 == 1)
{
if (1 == 2 || 1 == 4)
{
int ret = rpc_cli_buf_to_msg_rpc_int_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off, tag.msg_buf_len * (sizeof(void *)));
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
do
{
if (1 == 1)
{
if (1 == 2 || 1 == 4)
{
int ret = rpc_cli_buf_to_msg_rpc_int_t(var1, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off, tag.msg_buf_len * (sizeof(void *)));
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
return tag;
}
RPC_GENERATION_CALL2(pm_t, PM_PROT, PM_KILL_TASK, kill_task,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, pid,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
int pm_kill_task(int pid, int flags)
{
rpc_int_t rpc_pid = {
@@ -170,5 +61,33 @@ int pm_watch_pid(obj_handler_t sig_hd, pid_t pid, int flags)
msg_tag_t tag = pm_t_watch_pid_call(u_get_global_env()->ns_hd, &rpc_sig_hd, &rpc_pid, &rpc_flags);
return msg_tag_get_val(tag);
}
RPC_GENERATION_CALL5(pm_t, PM_PROT, PM_COPY_DATA, copy_data,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, src_pid,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, dst_pid,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, src_addr,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, dst_addr,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
int pm_copy_data(pid_t src_pid, pid_t dst_pid, addr_t src_addr, addr_t dst_addr, size_t len)
{
rpc_umword_t_t rpc_src_pid = {
.data = src_pid,
};
rpc_umword_t_t rpc_dst_pid = {
.data = dst_pid,
};
rpc_umword_t_t rpc_src_addr = {
.data = src_addr,
};
rpc_umword_t_t rpc_dst_addr = {
.data = dst_addr,
};
rpc_umword_t_t rpc_len = {
.data = len,
};
msg_tag_t tag = pm_t_copy_data_call(u_get_global_env()->ns_hd, &rpc_src_pid, &rpc_dst_pid,
&rpc_src_addr, &rpc_dst_addr, &rpc_len);
return msg_tag_get_val(tag);
}

View File

@@ -62,8 +62,32 @@ RPC_GENERATION_DISPATCH3(pm_t, PM_PROT, PM_WATCH_PID, watch_pid,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, sig_hd,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, pid,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags)
/*PM_COPY_TO_DATA*/
RPC_GENERATION_OP5(pm_t, PM_PROT, PM_COPY_DATA, copy_data,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, src_pid,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, dst_pid,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, src_addr,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, dst_addr,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
{
int16_t ret = 0;
ret = pm_rpc_copy_data(src_pid->data, dst_pid->data, src_addr->data, dst_addr->data, len->data);
return ret;
}
RPC_GENERATION_DISPATCH5(pm_t, PM_PROT, PM_COPY_DATA, copy_data,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, src_pid,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, dst_pid,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, src_addr,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, dst_addr,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
/*dispatch*/
RPC_DISPATCH3(pm_t, PM_PROT, typeof(PM_RUN_APP), PM_RUN_APP, run_app, PM_KILL_TASK, kill_task, PM_WATCH_PID, watch_pid)
RPC_DISPATCH4(pm_t, PM_PROT, typeof(PM_RUN_APP),
PM_RUN_APP, run_app,
PM_KILL_TASK, kill_task,
PM_WATCH_PID, watch_pid,
PM_COPY_DATA, copy_data)
void pm_svr_obj_init(pm_t *pm)
{

View File

@@ -997,4 +997,5 @@ RPC_TYPE_INIT_WITHOUT_IMPL(rpc_obj_handler_t_t)
}
#include "u_rpc_1.h"
#include "u_rpc_2.h"
#include "u_rpc_3.h"
#include "u_rpc_3.h"
#include "u_rpc_5.h"

View File

@@ -0,0 +1,125 @@
#include "u_types.h"
#include "u_thread.h"
#include "u_err.h"
#include "u_prot.h"
#include "u_ipc.h"
#include "u_task.h"
#include <stddef.h>
#include <sys/types.h>
#include <errno.h>
#define RPC_GENERATION_CALL5(struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1, \
cli_type2, svr_type2, dir2, rpc_type2, name2, \
cli_type3, svr_type3, dir3, rpc_type3, name3, \
cli_type4, svr_type4, dir4, rpc_type4, name4) \
msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, cli_type0 *var0, cli_type1 *var1, cli_type2 *var2, cli_type3 *var3, cli_type4 *var4) \
{ \
void *buf; \
ipc_msg_t *msg_ipc; \
\
thread_msg_buf_get(-1, (umword_t *)(&buf), NULL); \
msg_ipc = (ipc_msg_t *)buf; \
\
int off = 0; \
int off_buf = 0; \
int ret = -1; \
umword_t op_val = op; \
/*拷贝op*/ \
rpc_memcpy(msg_ipc->msg_buf, &op_val, __alignof(op_val)); \
off += rpc_align(sizeof(op_val), __alignof(op)); \
\
RPC_CLI_MSG_TO_BUF_IN(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->map_buf, off_buf); \
RPC_CLI_MSG_TO_BUF_IN(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->map_buf, off_buf); \
RPC_CLI_MSG_TO_BUF_IN(rpc_type2, cli_type2, var2, dir2, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type2, cli_type2, var2, dir2, (uint8_t *)msg_ipc->map_buf, off_buf); \
RPC_CLI_MSG_TO_BUF_IN(rpc_type3, cli_type3, var3, dir3, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type3, cli_type3, var3, dir3, (uint8_t *)msg_ipc->map_buf, off_buf); \
RPC_CLI_MSG_TO_BUF_IN(rpc_type4, cli_type4, var4, dir4, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type4, cli_type4, var4, dir4, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \
msg_tag_t tag = thread_ipc_call(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), prot), hd, \
ipc_timeout_create2(0, 0)); \
\
if (msg_tag_get_val(tag) < 0) \
{ \
return tag; \
} /*拷贝返回的数据*/ \
off = 0; \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type2, cli_type2, var2, dir2, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type3, cli_type3, var3, dir3, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type4, cli_type4, var4, dir4, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
return tag; \
}
#define RPC_GENERATION_DISPATCH5(struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1, \
cli_type2, svr_type2, dir2, rpc_type2, name2, \
cli_type3, svr_type3, dir3, rpc_type3, name3, \
cli_type4, svr_type4, dir4, rpc_type4, name4) \
msg_tag_t struct_type##_##func_name##_dispatch(struct_type *obj, msg_tag_t tag, ipc_msg_t *ipc_msg) \
{ \
svr_type0 var0; \
svr_type1 var1; \
svr_type2 var2; \
svr_type3 var3; \
svr_type4 var4; \
size_t op_val; \
uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); \
int off = 0; \
\
RPC_TYPE_INIT_FUNC_CALL(svr_type0, &var0); \
RPC_TYPE_INIT_FUNC_CALL(svr_type1, &var1); \
RPC_TYPE_INIT_FUNC_CALL(svr_type2, &var2); \
RPC_TYPE_INIT_FUNC_CALL(svr_type3, &var3); \
RPC_TYPE_INIT_FUNC_CALL(svr_type4, &var4); \
\
/*取得op*/ \
op_val = *((typeof(op) *)value); \
if (op_val != op) \
{ \
return msg_tag_init4(0, 0, 0, -EPROTO); \
} \
off += sizeof(typeof(op)); \
off = rpc_align(off, __alignof(typeof(op))); \
\
RPC_SVR_BUF_TO_MSG_IN(rpc_type0, svr_type0, &var0, dir0, value, off, tag.msg_buf_len *WORD_BYTES); \
RPC_SVR_BUF_TO_MSG_IN(rpc_type1, svr_type1, &var1, dir1, value, off, tag.msg_buf_len *WORD_BYTES); \
RPC_SVR_BUF_TO_MSG_IN(rpc_type2, svr_type2, &var2, dir2, value, off, tag.msg_buf_len *WORD_BYTES); \
RPC_SVR_BUF_TO_MSG_IN(rpc_type3, svr_type3, &var3, dir3, value, off, tag.msg_buf_len *WORD_BYTES); \
RPC_SVR_BUF_TO_MSG_IN(rpc_type4, svr_type4, &var4, dir4, value, off, tag.msg_buf_len *WORD_BYTES); \
\
short ret_val = struct_type##_##func_name##_op(obj, &var0, &var1, &var2, &var3, &var4); \
\
if (ret_val < 0) \
{ \
return msg_tag_init4(0, 0, 0, ret_val); \
} \
off = 0; \
int off_map = 0; \
RPC_SVR_MSG_TO_BUF_OUT(rpc_type0, svr_type0, &var0, dir0, value, off); \
RPC_SVR_MSG_TO_BUF_OUT(rpc_type1, svr_type1, &var1, dir1, value, off); \
RPC_SVR_MSG_TO_BUF_OUT(rpc_type2, svr_type2, &var2, dir2, value, off); \
RPC_SVR_MSG_TO_BUF_OUT(rpc_type3, svr_type3, &var3, dir3, value, off); \
RPC_SVR_MSG_TO_BUF_OUT(rpc_type4, svr_type4, &var4, dir4, value, off); \
PRC_SVR_FILL_MAP_BUF(rpc_type0, svr_type0, &var0, dir0, ipc_msg->map_buf, off_map); \
PRC_SVR_FILL_MAP_BUF(rpc_type1, svr_type1, &var1, dir1, ipc_msg->map_buf, off_map); \
PRC_SVR_FILL_MAP_BUF(rpc_type2, svr_type2, &var2, dir2, ipc_msg->map_buf, off_map); \
PRC_SVR_FILL_MAP_BUF(rpc_type3, svr_type3, &var3, dir3, ipc_msg->map_buf, off_map); \
PRC_SVR_FILL_MAP_BUF(rpc_type4, svr_type4, &var4, dir4, ipc_msg->map_buf, off_map); \
return msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_map, WORD_BYTES), ret_val); \
}
#define RPC_GENERATION_OP5(struct_type, prot, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1, \
cli_type2, svr_type2, dir2, rpc_type2, name2, \
cli_type3, svr_type3, dir3, rpc_type3, name3, \
cli_type4, svr_type4, dir4, rpc_type4, name4) \
short struct_type##_##func_name##_op(struct_type *obj, svr_type0 *name0, svr_type1 *name1, svr_type2 *name2, svr_type3 *name3, svr_type4 *name4)

View File

@@ -60,7 +60,7 @@ void console_init(void)
cons_svr_obj_init(&cons_obj);
meta_reg_svr_obj(&cons_obj.svr, CONS_PROT);
u_thread_create(&cons_th, (char *)cons_stack + sizeof(cons_stack) - 8, NULL, console_read_func);
u_thread_run(cons_th, 16);
u_thread_run(cons_th, 3);
ulog_write_str(LOG_PROT, "cons svr init...\n");
}
/**

View File

@@ -39,7 +39,9 @@ int main(int argc, char *args[])
task_set_obj_name(TASK_THIS, TASK_THIS, "tk_init");
task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_init");
// #if 1
// thread_run(-1, 3);
// #endif
ulog_write_str(LOG_PROT, "init..\n");
u_env_default_init();
env = u_get_global_env();

View File

@@ -5,5 +5,5 @@
# net
cpiofs -m /bin
pin
nes
# nes
sh

View File

@@ -17,6 +17,7 @@
#include "u_task.h"
#include "u_hd_man.h"
#include "u_sig.h"
#include "pm.h"
#include <errno.h>
#include <malloc.h>
#include <stdio.h>
@@ -224,3 +225,22 @@ int pm_rpc_run_app(const char *path, int flags)
}
}
}
/**
* @brief 用于拷贝数据
*
* @param src_pid
* @param dst_pid
* @param src_addr
* @param dst_addr
* @param len
* @return int
*/
int pm_rpc_copy_data(pid_t src_pid, pid_t dst_pid, umword_t src_addr, umword_t dst_addr, size_t len)
{
msg_tag_t tag;
tag = task_copy_data_to(pm_hd2pid(src_pid), pm_hd2pid(dst_pid),
(void *)src_addr, (void *)dst_addr, len);
return msg_tag_get_val(tag);
}

View File

@@ -1,13 +1,19 @@
/**
* @file pm.h
* @author ATShining (1358745329@qq.com)
* @brief
* @brief
* @version 0.1
* @date 2023-11-28
*
*
* @copyright Copyright (c) 2023
*
*
*/
#pragma once
#include <u_types.h>
void pm_init(void);
static inline obj_handler_t pm_hd2pid(pid_t _pid)
{
return (obj_handler_t)_pid;
}

View File

@@ -11,6 +11,9 @@ int main(int argc, char *args[])
{
task_set_obj_name(TASK_THIS, TASK_THIS, "tk_sh");
task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_sh");
#if 1
thread_run(-1, 3);
#endif
for (int i = 0; i < argc; i++)
{
printf("args[%d]:%s\n", i, args[i]);

View File

@@ -32,6 +32,10 @@ target_include_directories(
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc
${CMAKE_CURRENT_SOURCE_DIR}/
${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_pin
${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_drv
${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_display
)
add_dependencies(
drv_test.elf

View File

@@ -8,43 +8,16 @@
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "mk_pin_drv.h"
#include "mk_display_drv.h"
#include <u_vmam.h>
#define PIN_TEST 0
void delay_ms(int ms)
{
u_sleep_ms(ms);
}
typedef union mk_pin_cfg
static int_fast16_t pin_test(void)
{
struct
{
uint16_t mode;
uint16_t pin;
};
uint32_t cfg_raw;
} mk_pin_cfg_t;
enum mk_pin_mode
{
MK_PIN_MODE_NONE = 1,
MK_PIN_MODE_OUTPUT,
MK_PIN_MODE_OUTPUT_OD,
MK_PIN_MODE_INPUT,
MK_PIN_MODE_INPUT_DOWN,
MK_PIN_MODE_INPUT_UP,
MK_PIN_MODE_IRQ_RISING,
MK_PIN_MODE_IRQ_FALLING,
MK_PIN_MODE_IRQ_EDGE,
MK_PIN_MODE_IRQ_LOW,
MK_PIN_MODE_IRQ_HIGH,
};
enum mk_pin_ioctl_op
{
MK_PIN_SET_MODE, //!< 设置模式
MK_PIN_GET_MODE, //!< 获取模式
MK_PIN_SET_OP_PIN, //!< 设置要操作的引脚,标记读写的起始引脚
};
int main(int argc, char *argv[])
{
printf("drv test init..\n");
int fd = open("/pin", O_RDWR, 0777);
int ret;
@@ -54,14 +27,15 @@ int main(int argc, char *argv[])
}
ioctl(fd, MK_PIN_SET_MODE, ((mk_pin_cfg_t){
.mode = MK_PIN_MODE_OUTPUT,
.pin = 12,
})
.cfg_raw);
ret = ioctl(fd, MK_PIN_GET_MODE, ((mk_pin_cfg_t){
.pin = 12,
})
.cfg_raw);
.mode = MK_PIN_MODE_OUTPUT,
.pin = 12,
.cfg = 0,
})
.cfg_raw);
ret = ioctl(fd, MK_PIN_GET_MODE, ((mk_pin_cfg_t){
.pin = 12,
})
.cfg_raw);
printf("ret = %d\n", ret);
assert(MK_PIN_MODE_OUTPUT == ret);
uint8_t val = 1;
@@ -83,4 +57,57 @@ int main(int argc, char *argv[])
lseek(fd, 12, SEEK_SET);
write(fd, &val, 1);
}
return 0;
}
static int display_test(void)
{
mk_display_cfg_t info;
int fd = open("/display", O_RDWR, 0777);
int ret;
if (fd < 0)
{
return fd;
}
ioctl(fd, MK_DISPLAY_SET_WIN, &((mk_display_win_t){
.x = 0,
.y = 0,
.w = 240,
.h = 320,
}));
ioctl(fd, MK_DISPLAY_GET_INFO, &info);
printf("display addr:0x%x\n", info.display_addr);
msg_tag_t tag;
addr_t addr;
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0),
512, info.display_addr, &addr);
if (msg_tag_get_val(tag) < 0)
{
printf("periph mem alloc failed..\n");
return -1;
}
int j = 0;
while (1)
{
for (int i = 0; i < 230; i++)
{
for (int i = 0; i < 320; i++)
{
*(volatile uint16_t *)(info.display_addr) = j++;
}
}
}
return 0;
}
int main(int argc, char *argv[])
{
printf("drv test init..\n");
#if PIN_TEST
pin_test();
#endif
display_test();
while (1)
{
u_sleep_ms(10000000);
}
}

View File

@@ -56,6 +56,8 @@ target_include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/infoNES
${CMAKE_CURRENT_SOURCE_DIR}/mapper
${CMAKE_CURRENT_SOURCE_DIR}/ports
${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_drv
${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_display
)
add_dependencies(
nes.elf

View File

@@ -1,16 +1,23 @@
#include <stdio.h>
#include <u_vmam.h>
#include <at32f435_437_conf.h>
#include <at_surf_f437_board_lcd.h>
// #include <at32f435_437_conf.h>
// #include <at_surf_f437_board_lcd.h>
#include <u_sleep.h>
#include <u_sys.h>
#include <u_thread.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#ifndef INFONES
#include <NES_Simulator/nes_main.h>
#else
#include <InfoNES.h>
#endif
#include "mk_display_drv.h"
static mk_display_cfg_t info;
static int fd;
void delay_ms(int ms)
{
u_sleep_ms(ms);
@@ -24,7 +31,7 @@ void nes_lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint
width = ex - sx + 1;
height = ey - sy + 1;
#if 0
lcd_windows_set(sx, sy, ex, ey);
for (i = 0; i < height; i++)
@@ -34,12 +41,36 @@ void nes_lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint
lcd_data_16bit_write(BGR565TORGB565(color[i * width + j]));
}
}
#else
ioctl(fd, MK_DISPLAY_SET_WIN, &((mk_display_win_t){
.x = sx,
.y = sy,
.w = width,
.h = height,
}));
for (int i = 0; i < width * height; i++)
{
*(volatile uint16_t *)(info.display_addr) = BGR565TORGB565(color[i]);
}
#endif
}
#endif
void NES_LCD_DisplayLine(int y_axes, uint16_t *Disaplyline_buffer)
{
lcd_color_fill(0, y_axes, 256, y_axes, Disaplyline_buffer);
// lcd_color_fill(0, y_axes, 256, y_axes, Disaplyline_buffer);
ioctl(fd, MK_DISPLAY_SET_WIN, &((mk_display_win_t){
.x = 0,
.y = y_axes,
.w = 256,
.h = 1,
}));
for (int i = 0; i < 256; i++)
{
*(volatile uint16_t *)(info.display_addr) = BGR565TORGB565(Disaplyline_buffer[i]);
}
}
#if 0
static int drv_iomem_init(void)
{
addr_t addr;
@@ -67,9 +98,11 @@ static int drv_iomem_init(void)
}
return 0;
}
#endif
int main(int argc, char *argv[])
{
printf("lcd drv init..\n");
#if 0
if (drv_iomem_init() < 0)
{
return -1;
@@ -77,7 +110,26 @@ int main(int argc, char *argv[])
lcd_init(LCD_DISPLAY_VERTICAL);
lcd_clear(BLACK);
#if 0
#endif
fd = open("/display", O_RDWR, 0777);
int ret;
if (fd < 0)
{
return fd;
}
ioctl(fd, MK_DISPLAY_GET_INFO, &info);
printf("dis_addr:0x%x\n", info.display_addr);
msg_tag_t tag;
addr_t addr;
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0),
512, info.display_addr, &addr);
if (msg_tag_get_val(tag) < 0)
{
printf("periph mem alloc failed..\n");
return -1;
}
#if 1
thread_run(-1, 3);
#endif
while (1)

View File

@@ -1,3 +1,4 @@
cmake_minimum_required(VERSION 3.13)
add_subdirectory(pin)
add_subdirectory(display)

View File

@@ -0,0 +1,86 @@
cmake_minimum_required(VERSION 3.13)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DAT32F437ZMT7 -DUSE_STDPERIPH_DRIVER -DAT_SURF_F437_V1 ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DAT32F437ZMT7 -DUSE_STDPERIPH_DRIVER -DAT_SURF_F437_V1 ")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -DAT32F437ZMT7 -DUSE_STDPERIPH_DRIVER -DAT_SURF_F437_V1 ")
file(
GLOB deps
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/drivers/src/*.c
# ${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/project/at_surf_f437_board/at_surf_f437_board_lcd.c
*.c
)
add_executable(
display.elf
${deps}
${START_SRC}
)
target_link_libraries(
display.elf
PUBLIC
-Bstatic
${LIBC_NAME}
mk_drv
mk_display
mk_char
--whole-archive
${START_LIB}
libc_be
sys
sys_util
sys_svr
--no-whole-archive
${GCC_LIB_PATH}/libgcc.a
)
target_include_directories(
display.elf
PUBLIC
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/util/inc
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/drivers/inc
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/cmsis/cm4/device_support
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/cmsis/cm4/core_support
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/project/at_surf_f437_board/
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/middlewares/i2c_application_library
${CMAKE_CURRENT_SOURCE_DIR}/
${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_display
${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_pin
)
add_dependencies(
display.elf
${START_LIB}
sys
sys_util
mk_char
mk_drv
mk_display
)
set_target_properties(
display.elf PROPERTIES LINK_FLAGS
"-T ${CMAKE_CURRENT_LIST_DIR}/${ARCH_NAME}/link.lds ${CORTEX_M_LINK_FLAGS} --gc-section -no-dynamic-linker "
#--no-warn-rwx-segments
)
add_custom_target(
display_dump ALL
COMMAND
${CMAKE_OBJDUMP} -s -S display.elf > ${CMAKE_SOURCE_DIR}/build/output/display.S
COMMAND
${CMAKE_READELF} -a display.elf > ${CMAKE_SOURCE_DIR}/build/output/display.txt
COMMAND
${CMAKE_OBJCOPY} -O binary -S display.elf display.bin
COMMAND
${CMAKE_SIZE} display.elf
COMMAND
${CMAKE_COMMAND} -E copy display.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/display
COMMAND
cp display.elf ${CMAKE_SOURCE_DIR}/build/output/display.elf
)
add_dependencies(display_dump display.elf)

View File

@@ -0,0 +1,124 @@
ENTRY(_start_)
SECTIONS
{
.text : {
. = ALIGN(4);
__text_start__ = .;
KEEP(*(.first))
*(.text)
*(.text.*)
KEEP(*(.init))
KEEP(*(.fini))
/* .ctors */
*crtbegin.o(.ctors)
*crtbegin?.o(.ctors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
*(SORT(.ctors.*))
*(.ctors)
/* .dtors */
*crtbegin.o(.dtors)
*crtbegin?.o(.dtors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
*(SORT(.dtors.*))
*(.dtors)
*(SORT(.rodata.*))
*(.rodata)
KEEP(*(.eh_frame*))
. = ALIGN(4);
__rel_start__ = .;
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
__rel_end__ = .;
}
.ARM.exidx : {
. = ALIGN(4);
__exdix_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
/* This is used by the startup in order to initialize the .data secion */
__exdix_end = .;
}
.permissions_table : {
. = ALIGN(4);
__permissions_table_start__ = .;
KEEP(*(.permissions_table))
__permissions_table_end__ = .;
}
PROVIDE(__ram_size__ = __bss_end__ - __data_start__);
.data : {
. = ALIGN(4);
__data_start__ = .;
__got_start__ = .;
*(.got)
__got_end__ = .;
. = ALIGN(4);
*(.data)
*(.data.*)
*(vtable)
*(.data*)
. = ALIGN(4);
/* preinit data */
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP(*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
/* init data */
PROVIDE_HIDDEN (__init_array_start = .);
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
/* finit data */
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE_HIDDEN (__fini_array_end = .);
. = ALIGN(4);
_shell_command_start = .;
KEEP(*(shellCommand))
_shell_command_end = .;
. = ALIGN(4);
/* All data end */
__data_end__ = .;
}
PROVIDE(__heap_size__ = __heap_end__ - __heap_start__);
PROVIDE(__stack_size__ = __stack_end__ - __stack_start__);
.bss : {
. = ALIGN(4);
/* This is used by the startup in order to initialize the .bss secion */
__bss_start__ = .;
*(.bss)
*(COMMON)
. = ALIGN(4);
__heap_start__ = .;
KEEP(*(.bss.heap))
__heap_end__ = .;
. = ALIGN(4);
__stack_start__ = .;
KEEP(*(.bss.stack))
__stack_end__ = .;
*(.bss.*)
/* This is used by the startup in order to initialize the .bss secion */
. = ALIGN(4);
__bss_end__ = .;
}
_end = .;
}

View File

@@ -0,0 +1,176 @@
/**
**************************************************************************
* @file at32f435_437_conf.h
* @brief at32f435_437 config header file
**************************************************************************
* Copyright notice & Disclaimer
*
* The software Board Support Package (BSP) that is made available to
* download from Artery official website is the copyrighted work of Artery.
* Artery authorizes customers to use, copy, and distribute the BSP
* software and its related documentation for the purpose of design and
* development in conjunction with Artery microcontrollers. Use of the
* software is governed by this copyright notice and the following disclaimer.
*
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
*
**************************************************************************
*/
/* define to prevent recursive inclusion -------------------------------------*/
#ifndef __AT32F435_437_CONF_H
#define __AT32F435_437_CONF_H
#ifdef __cplusplus
extern "C" {
#endif
#include <u_types.h>
/**
* @brief in the following line adjust the value of high speed external crystal (hext)
* used in your application
*
* tip: to avoid modifying this file each time you need to use different hext, you
* can define the hext value in your toolchain compiler preprocessor.
*
*/
#if !defined HEXT_VALUE
#define HEXT_VALUE ((uint32_t)8000000) /*!< value of the high speed external crystal in hz */
#endif
/**
* @brief in the following line adjust the high speed external crystal (hext) startup
* timeout value
*/
#define HEXT_STARTUP_TIMEOUT ((uint16_t)0x3000) /*!< time out for hext start up */
#define HICK_VALUE ((uint32_t)8000000) /*!< value of the high speed internal clock in hz */
#define LEXT_VALUE ((uint32_t)32768) /*!< value of the low speed external clock in hz */
/* module define -------------------------------------------------------------*/
#define CRM_MODULE_ENABLED
#define TMR_MODULE_ENABLED
#define ERTC_MODULE_ENABLED
#define GPIO_MODULE_ENABLED
#define I2C_MODULE_ENABLED
#define USART_MODULE_ENABLED
#define PWC_MODULE_ENABLED
#define CAN_MODULE_ENABLED
#define ADC_MODULE_ENABLED
#define DAC_MODULE_ENABLED
#define SPI_MODULE_ENABLED
#define EDMA_MODULE_ENABLED
#define DMA_MODULE_ENABLED
#define DEBUG_MODULE_ENABLED
#define FLASH_MODULE_ENABLED
#define CRC_MODULE_ENABLED
#define WWDT_MODULE_ENABLED
#define WDT_MODULE_ENABLED
#define EXINT_MODULE_ENABLED
#define SDIO_MODULE_ENABLED
#define XMC_MODULE_ENABLED
#define USB_MODULE_ENABLED
#define ACC_MODULE_ENABLED
#define MISC_MODULE_ENABLED
#define QSPI_MODULE_ENABLED
#define DVP_MODULE_ENABLED
#define SCFG_MODULE_ENABLED
#define EMAC_MODULE_ENABLED
/* includes ------------------------------------------------------------------*/
#ifdef CRM_MODULE_ENABLED
#include "at32f435_437_crm.h"
#endif
#ifdef TMR_MODULE_ENABLED
#include "at32f435_437_tmr.h"
#endif
#ifdef ERTC_MODULE_ENABLED
#include "at32f435_437_ertc.h"
#endif
#ifdef GPIO_MODULE_ENABLED
#include "at32f435_437_gpio.h"
#endif
#ifdef I2C_MODULE_ENABLED
#include "at32f435_437_i2c.h"
#endif
#ifdef USART_MODULE_ENABLED
#include "at32f435_437_usart.h"
#endif
#ifdef PWC_MODULE_ENABLED
#include "at32f435_437_pwc.h"
#endif
#ifdef CAN_MODULE_ENABLED
#include "at32f435_437_can.h"
#endif
#ifdef ADC_MODULE_ENABLED
#include "at32f435_437_adc.h"
#endif
#ifdef DAC_MODULE_ENABLED
#include "at32f435_437_dac.h"
#endif
#ifdef SPI_MODULE_ENABLED
#include "at32f435_437_spi.h"
#endif
#ifdef DMA_MODULE_ENABLED
#include "at32f435_437_dma.h"
#endif
#ifdef DEBUG_MODULE_ENABLED
#include "at32f435_437_debug.h"
#endif
#ifdef FLASH_MODULE_ENABLED
#include "at32f435_437_flash.h"
#endif
#ifdef CRC_MODULE_ENABLED
#include "at32f435_437_crc.h"
#endif
#ifdef WWDT_MODULE_ENABLED
#include "at32f435_437_wwdt.h"
#endif
#ifdef WDT_MODULE_ENABLED
#include "at32f435_437_wdt.h"
#endif
#ifdef EXINT_MODULE_ENABLED
#include "at32f435_437_exint.h"
#endif
#ifdef SDIO_MODULE_ENABLED
#include "at32f435_437_sdio.h"
#endif
#ifdef XMC_MODULE_ENABLED
#include "at32f435_437_xmc.h"
#endif
#ifdef ACC_MODULE_ENABLED
#include "at32f435_437_acc.h"
#endif
#ifdef MISC_MODULE_ENABLED
#include "at32f435_437_misc.h"
#endif
#ifdef EDMA_MODULE_ENABLED
#include "at32f435_437_edma.h"
#endif
#ifdef QSPI_MODULE_ENABLED
#include "at32f435_437_qspi.h"
#endif
#ifdef SCFG_MODULE_ENABLED
#include "at32f435_437_scfg.h"
#endif
#ifdef EMAC_MODULE_ENABLED
#include "at32f435_437_emac.h"
#endif
#ifdef DVP_MODULE_ENABLED
#include "at32f435_437_dvp.h"
#endif
#ifdef USB_MODULE_ENABLED
#include "at32f435_437_usb.h"
#endif
#ifdef __cplusplus
}
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,345 @@
#include "cons_cli.h"
#include "cpiofs.h"
#include "fs_svr.h"
#include "rpc_prot.h"
#include "u_env.h"
#include "u_log.h"
#include "u_rpc.h"
#include "u_rpc_svr.h"
#include "u_sys.h"
#include "mk_char_dev.h"
#include "mk_display_drv.h"
#include "fs_rpc.h"
#include <assert.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
static fs_t fs;
typedef struct file_desc
{
pid_t pid;
mk_char_dev_iter_t iter;
void *ptr_dev;
int offset;
int open_type;
} file_desc_t;
#define CPIO_FS_FD_NR 8
static file_desc_t fds[CPIO_FS_FD_NR];
static file_desc_t *fd_alloc(int pid, void *ptr_dev, int open_type, int *fd)
{
for (int i = 0; i < CPIO_FS_FD_NR; i++)
{
if (fds[i].ptr_dev == NULL)
{
fds[i].pid = pid;
fds[i].ptr_dev = ptr_dev;
fds[i].open_type = open_type;
if (fd)
{
*fd = i;
}
return fds + i;
}
}
return NULL;
}
static file_desc_t *fd_get(int pid, int fd)
{
if (fd < 0 || fd >= CPIO_FS_FD_NR)
{
return NULL;
}
if (fds[fd].ptr_dev == NULL)
{
return NULL;
}
if (fds[fd].pid != pid)
{
return NULL;
}
return &fds[fd];
}
static void fd_free(int fd)
{
if (fd < 0 || fd >= CPIO_FS_FD_NR)
{
return;
}
if (fds[fd].ptr_dev)
{
if (fds[fd].pid == thread_get_src_pid())
{
fds[fd].ptr_dev = NULL;
fds[fd].pid = -1;
}
}
}
void fs_svr_init(void)
{
msg_tag_t tag;
fs_init(&fs);
meta_reg_svr_obj(&fs.svr, FS_PROT);
}
int fs_svr_open(const char *path, int flags, int mode)
{
int pid = thread_get_src_pid();
msg_tag_t tag;
char *o_path;
mk_char_dev_t *char_dev;
int fd;
int ret = 0;
int is_open_dir = 0;
printf("%s path is %s\n", __func__, path);
if (path[0] == '/' && path[1] == '\0')
{
path++;
is_open_dir = 1;
}
if (is_open_dir == 0)
{
if (path[0] == '\0')
{
char_dev = mk_char_get_first();
}
else
{
char_dev = mk_char_find_char_dev(path);
}
if (!char_dev)
{
printf("[pin] not dev %s.\n", path);
return -ENODEV;
}
if (char_dev->ops->open)
{
ret = char_dev->ops->open(char_dev->dev);
}
if (ret < 0)
{
return ret;
}
// 找到指定文件
file_desc_t *fdp = fd_alloc(pid, char_dev, is_open_dir, &fd);
if (!fdp)
{
printf("[pin] not fd %s.\n", path);
if (char_dev->ops->release)
{
char_dev->ops->release(char_dev->dev);
}
return -ENOMEM;
}
}
else
{
file_desc_t *fdp = fd_alloc(pid, NULL, is_open_dir, &fd);
if (!fdp)
{
printf("[pin] not fd %s.\n", path);
return -ENOMEM;
}
}
printf("[pin] open success %s, fd is %d.\n", path, fd);
return fd;
}
int fs_svr_read(int fd, void *buf, size_t len)
{
int ret;
file_desc_t *fdp = fd_get(thread_get_src_pid(), fd);
if (!fdp)
{
return -ENOENT;
}
return -ENOSYS;
}
int fs_svr_write(int fd, void *buf, size_t len)
{
int ret;
file_desc_t *fdp = fd_get(thread_get_src_pid(), fd);
if (!fdp)
{
return -ENOENT;
}
return -ENOSYS;
}
void fs_svr_close(int fd)
{
file_desc_t *fdp = fd_get(thread_get_src_pid(), fd);
if (!fdp)
{
// return -ENOENT;
return;
}
if (fdp->open_type == 0)
{
mk_char_dev_t *char_dev;
char_dev = fdp->ptr_dev;
if (char_dev->ops->release)
{
char_dev->ops->release(char_dev->dev);
}
}
else
{
/*TODO:*/
}
fd_free(fd);
}
int fs_svr_lseek(int fd, int offs, int whence)
{
file_desc_t *file = fd_get(thread_get_src_pid(), fd);
int new_offs = 0;
if (!file)
{
return -ENOENT;
}
if (file->open_type != 0)
{
return -EACCES;
}
return -ENOSYS;
}
int fs_svr_ftruncate(int fd, off_t off)
{
return -ENOSYS;
}
void fs_svr_sync(int fd)
{
}
int fs_svr_readdir(int fd, dirent_t *dir)
{
int pid = thread_get_src_pid();
file_desc_t *file = fd_get(pid, fd);
int new_offs = 0;
mk_char_dev_t *char_dev;
if (!file)
{
return -ENOENT;
}
if (file->open_type == 0)
{
return -EACCES;
}
if (file->ptr_dev == NULL)
{
char_dev = mk_char_get_iter_first(&file->iter);
}
else
{
char_dev = mk_char_get_iter_next(&file->iter);
}
if (char_dev == NULL)
{
return -ENOENT;
}
printf("[pin] readdir %s.\n", mk_dev_get_dev_name(char_dev->dev));
file->ptr_dev = char_dev; // TODO: ref add.
dir->d_reclen = sizeof(*dir);
strncpy(dir->d_name, mk_dev_get_dev_name(char_dev->dev), MK_DEV_NAME_LEN);
dir->d_name[MK_DEV_NAME_LEN - 1] = 0;
dir->d_type = DT_CHR;
return sizeof(*dir);
}
int fs_svr_ioctl(int fd, int req, void *arg)
{
file_desc_t *file = fd_get(thread_get_src_pid(), fd);
int new_offs = 0;
int ret = -EIO;
// printf("%s fd:%d req:%d arg:0x%x\n", __func__, fd, req, (umword_t)arg);
if (!file)
{
return -ENOENT;
}
if (file->open_type != 0)
{
return -EACCES;
}
mk_char_dev_t *char_dev = file->ptr_dev;
if (char_dev->ops->ioctl)
{
ret = char_dev->ops->ioctl(char_dev->dev, req, (umword_t)arg);
}
return ret;
}
int fs_svr_mkdir(char *path)
{
return -ENOSYS;
}
int fs_svr_unlink(const char *path)
{
return -ENOSYS;
}
int fs_svr_renmae(char *oldname, char *newname)
{
return -ENOSYS;
}
int fs_svr_fstat(int fd, stat_t *stat)
{
file_desc_t *file = fd_get(thread_get_src_pid(), fd);
if (!file)
{
return -ENOENT;
}
return -ENOSYS;
}
int fs_svr_symlink(const char *src, const char *dst)
{
return -ENOSYS;
}
int fs_svr_fsync(int fd)
{
return -ENOSYS;
}
int fs_svr_rmdir(char *path)
{
return -ENOSYS;
}
int fs_svr_rename(char *old, char *new)
{
return -ENOSYS;
}
int fs_svr_stat(const char *path, struct stat *buf)
{
if (path == NULL || buf == NULL)
{
return -EINVAL;
}
return -ENOSYS;
}
ssize_t fs_svr_readlink(const char *path, char *buf, size_t bufsize)
{
return -ENOSYS;
}
int fs_svr_statfs(const char *path, struct statfs *buf)
{
return -ENOSYS;
}
void fs_svr_loop(void)
{
rpc_loop();
}

View File

@@ -0,0 +1,6 @@
#pragma once
#define FS_DEBUG 0
void fs_svr_init(void);
void fs_svr_loop(void);

View File

@@ -0,0 +1,17 @@
#define HEAP_SIZE (2048)
#define STACK_SIZE (1024 * 3)
#if defined(__CC_ARM)
#define HEAP_ATTR SECTION("HEAP") __attribute__((zero_init))
#define STACK_ATTR SECTION("STACK") __attribute__((zero_init))
#elif defined(__GNUC__)
#define HEAP_ATTR __attribute__((__section__(".bss.heap")))
#define STACK_ATTR __attribute__((__section__(".bss.stack")))
#elif defined(__IAR_SYSTEMS_ICC__)
#define HEAP_ATTR
#define STACK_ATTR
#endif
__attribute__((used)) HEAP_ATTR static char _____heap_____[HEAP_SIZE];
__attribute__((used)) STACK_ATTR static char _____stack_____[STACK_SIZE];

View File

@@ -0,0 +1,39 @@
#include <stdio.h>
#include <u_vmam.h>
#include <at32f435_437_conf.h>
#include <u_sleep.h>
#include <u_sys.h>
#include <mk_dtb_parse.h>
#include <mk_dev.h>
#include <mk_drv.h>
#include "fs_rpc.h"
#include "ns_cli.h"
#include <assert.h>
#include <sys/stat.h>
#include "mk_display_drv_impl.h"
int main(int argc, char *argv[])
{
obj_handler_t hd;
int ret;
printf("%s init..\n", argv[0]);
#if 1
thread_run(-1, 3);
#endif
mk_drv_init();
mk_dev_init();
drv_display_init();
dtb_parse_init();
ret = rpc_meta_init(THREAD_MAIN, &hd);
assert(ret >= 0);
fs_svr_init();
// mkdir("/dev", 0777);
ns_register("/display", hd, FILE_NODE);
while (1)
{
fs_svr_loop();
}
}

View File

@@ -0,0 +1,76 @@
#include <u_types.h>
#include <errno.h>
#include <libfdt.h>
#include <mk_dev.h>
#include <stdio.h>
#include <assert.h>
#include "mk_drv.h"
#include "mk_display_drv.h"
#include "mk_dtb_parse.h"
#include <u_prot.h>
#include <u_vmam.h>
#include "at32f435_437_gpio.h"
#include "at32f435_437_crm.h"
#include <at_surf_f437_board_lcd.h>
static int display_get_info(mk_display_t *drv, mk_display_cfg_t *cfg)
{
assert(drv);
assert(cfg);
cfg->mode = MK_DISPLAY_NO_BUFFER;
cfg->display_addr = XMC_LCD_DATA;
cfg->display_cmd_addr = XMC_LCD_COMMAND;
return 0;
}
static int display_set_win(mk_display_t *drv, mk_display_win_t *dis_win)
{
assert(drv);
assert(dis_win);
lcd_windows_set(dis_win->x, dis_win->y, dis_win->x + dis_win->w - 1, dis_win->y + dis_win->h - 1);
return 0;
}
static mk_display_ops_t pin_ops = {
.display_get_info = display_get_info,
.display_set_win = display_set_win,
};
static mk_display_dev_t pin_dev = {
.ops = &pin_ops,
};
static int display_probe(mk_dev_t *dev)
{
int ret;
/* ioremap */
ret = dev_regs_map(dev, dev->dtb);
if (ret < 0)
{
printf("display dev regs map failed.\n");
}
lcd_init(LCD_DISPLAY_VERTICAL);
/* 注册display设备 */
mk_display_register(dev, &pin_dev);
return 0;
}
static mk_drv_compatible_t drv_compatilbe[] =
{
{"at32f43x,lcd"},
{NULL},
};
static mk_drv_t display_drv =
{
.compatilbe = drv_compatilbe,
.probe = display_probe,
.data = NULL,
};
void drv_display_init(void)
{
mk_drv_register(&display_drv);
}

View File

@@ -0,0 +1,3 @@
#pragma once
void drv_display_init(void);

View File

@@ -35,7 +35,7 @@ static gpio_type *drv_pin_get_port_data(int pin)
return gpio_type_list[pin];
}
static int pin_configure(mk_pin_t *pin, int number, int mode)
static int pin_configure(mk_pin_t *pin, int number, mk_pin_mode_t cfg)
{
gpio_type *pin_port_data = drv_pin_get_port_data(number);
uint32_t exti_line = number & 0x0f;
@@ -48,7 +48,7 @@ static int pin_configure(mk_pin_t *pin, int number, int mode)
printf("pin_port_data is NULL.\n");
return -EINVAL;
}
printf("%s:%d number:%d mode:%d\n", __func__, __LINE__, number, mode);
printf("%s:%d number:%d mode:%d cfg:%d\n", __func__, __LINE__, number, cfg.mode, cfg.mux_cfg);
gpio_default_para_init(&gpio_init_struct);
exint_default_para_init(&exint_init_struct);
@@ -85,7 +85,7 @@ static int pin_configure(mk_pin_t *pin, int number, int mode)
{
crm_periph_clock_enable(CRM_GPIOH_PERIPH_CLOCK, TRUE);
}
switch (mode)
switch (cfg.mode)
{
case MK_PIN_MODE_NONE:
{
@@ -135,6 +135,24 @@ static int pin_configure(mk_pin_t *pin, int number, int mode)
gpio_init_struct.gpio_pull = GPIO_PULL_UP;
break;
}
case MK_PIN_MODE_MUX_OUTPUT:
{
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_pin_mux_config(pin_port_data, number % 16, cfg.mux_cfg);
break;
}
case MK_PIN_MODE_MUX_OUTPUT_OD:
{
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_pin_mux_config(pin_port_data, number % 16, cfg.mux_cfg);
break;
}
case MK_PIN_MODE_IRQ_RISING:
{
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
@@ -168,7 +186,7 @@ static int pin_configure(mk_pin_t *pin, int number, int mode)
}
}
if (mode >= MK_PIN_MODE_IRQ_RISING)
if (cfg.mode >= MK_PIN_MODE_IRQ_RISING)
{
crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE);
scfg_exint_line_config(number / 16, number % 16);
@@ -180,7 +198,7 @@ static int pin_configure(mk_pin_t *pin, int number, int mode)
// nvic_irq_enable(EXINT0_IRQn, 1, 0);TODO:这里需要在内核设置
}
pin->pins[number] = mode;
pin->pins[number] = cfg;
gpio_init_struct.gpio_pins = (1 << (number % 16));
gpio_init(pin_port_data, &gpio_init_struct);
return 0;
@@ -209,8 +227,6 @@ static int pin_write(mk_pin_t *pin, int number, uint8_t value)
return 0;
}
static mk_pin_ops_t pin_ops = {
.drv_pin_configure = pin_configure,
.drv_pin_read = pin_read,

View File

@@ -2,4 +2,5 @@ cmake_minimum_required(VERSION 3.13)
add_subdirectory(mk_drv)
add_subdirectory(mk_pin)
add_subdirectory(mk_display)
add_subdirectory(mk_char)

View File

@@ -0,0 +1,38 @@
cmake_minimum_required(VERSION 3.13)
file(GLOB_RECURSE deps *.c *.S)
add_library(
mk_display
STATIC
${deps}
)
target_link_libraries(
mk_display
PRIVATE
fdt
sys
sys_util
sys_svr
mk_drv
)
add_dependencies(
mk_display
fdt
sys
sys_util
sys_svr
mk_drv
)
target_include_directories(
mk_display
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/
${CMAKE_CURRENT_SOURCE_DIR}/../mk_drv
${CMAKE_SOURCE_DIR}/mkrtos_user/user/drv/lib/mk_char
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc/${ARCH_NAME}
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/util/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/libfdt/lib/contrib
)

View File

@@ -0,0 +1,146 @@
#include "mk_display_drv.h"
#include "u_types.h"
#include <mk_access.h>
#include <assert.h>
#include <errno.h>
#include <mk_char_dev.h>
#include <u_thread.h>
#include <u_task.h>
#include <stdio.h>
/**
* @brief 写pin操作
*
* @param pin pin设备
* @param buf 写的buf
* @param size 写入大小˝
* @return int 写入的个数
*/
static int mk_display_drv_write(mk_dev_t *_dev, void *buf, size_t size)
{
assert(buf);
assert(_dev);
return -ENOSYS;
}
/**
* @brief 读取pin数据
*
* @param pin
* @param buf
* @param size
* @return int
*/
static int mk_display_drv_read(mk_dev_t *_dev, void *buf, size_t size)
{
assert(buf);
assert(_dev);
return -ENOSYS;
}
/**
* @brief 控制pin状态
*
* @param pin
* @param cmd
* @param args
* @return int
*/
static int mk_display_drv_ioctl(mk_dev_t *_dev, int cmd, umword_t args)
{
assert(_dev);
pid_t src_pid = thread_get_src_pid();
mk_display_dev_t *dis_dev = _dev->priv_data;
mk_display_ops_t *ops = dis_dev->ops;
assert(ops);
int ret;
pid_t cur_pid;
switch (cmd)
{
case MK_DISPLAY_SET_WIN:
{
msg_tag_t tag;
mk_display_win_t dis_arg;
tag = task_get_pid(TASK_THIS, (umword_t *)(&cur_pid));
if (msg_tag_get_val(tag) < 0)
{
return msg_tag_get_val(tag);
}
// printf("%s:%d cmd:0x%x args:0x%x\n", __func__, __LINE__, cmd, args);
ret = mk_copy_mem_to_task(src_pid, (void *)args,
cur_pid, &dis_arg, sizeof(mk_display_win_t));
if (ret < 0)
{
return ret;
}
if (ops->display_set_win)
{
ret = ops->display_set_win(&dis_dev->display, &dis_arg);
}
else
{
return -EIO;
}
return ret;
}
break;
case MK_DISPLAY_GET_INFO:
{
mk_display_cfg_t cfg;
mk_display_cfg_t *arg_cfg = (void *)args;
msg_tag_t tag;
tag = task_get_pid(TASK_THIS, (umword_t *)(&cur_pid));
if (msg_tag_get_val(tag) < 0)
{
return msg_tag_get_val(tag);
}
if (ops->display_get_info)
{
ret = ops->display_get_info(&dis_dev->display, &cfg);
}
else
{
return -EIO;
}
if (ret >= 0)
{
ret = mk_copy_mem_to_task(cur_pid, &cfg, src_pid,
arg_cfg, sizeof(mk_display_cfg_t));
if (ret < 0)
{
return ret;
}
}
}
break;
default:
break;
}
return ret;
}
static mk_file_ops_t file_ops = {
.open = NULL,
.write = NULL,
.read = NULL,
.ioctl = mk_display_drv_ioctl,
.release = NULL,
};
int mk_display_register(mk_dev_t *dev, mk_display_dev_t *display_drv)
{
int ret = 0;
assert(dev);
assert(display_drv);
ret = mk_char_dev_register(dev, &file_ops);
if (ret < 0)
{
return ret;
}
mk_dev_set_priv_data(dev, display_drv);
return ret;
}

View File

@@ -0,0 +1,51 @@
#pragma once
#include <u_types.h>
#include "mk_drv.h"
#include "mk_dev.h"
typedef struct mk_display
{
/*None*/
} mk_display_t;
enum mk_display_mode
{
MK_DISPLAY_NO_BUFFER, //!< 无buffer模式
MK_DISPLAY_BUFFER, //!< buffer模式
};
typedef struct mk_display_cfg
{
addr_t display_addr; //!< 显示缓存的地址,物理地址
addr_t display_cmd_addr; //!< 命令地址
enum mk_display_mode mode; //!< 驱动显示模式
} mk_display_cfg_t;
typedef struct mk_display_win
{
int x;
int y;
int w;
int h;
} mk_display_win_t;
typedef struct mk_display_ops
{
int (*display_get_info)(mk_display_t *drv, mk_display_cfg_t *cfg);
int (*display_set_win)(mk_display_t *drv, mk_display_win_t *dis_win);
} mk_display_ops_t;
typedef struct mk_display_dev
{
mk_display_t display;
mk_display_ops_t *ops;
} mk_display_dev_t;
enum mk_display_ioctl
{
MK_DISPLAY_GET_INFO, //!< 直接获取显示的物理缓存
MK_DISPLAY_SET_WIN, //!< 设置显示窗口
};
int mk_display_register(mk_dev_t *dev, mk_display_dev_t *pin_dev);

View File

@@ -0,0 +1,9 @@
#include "mk_access.h"
#include <pm_cli.h>
int mk_copy_mem_to_task(pid_t src_pid, void *src, pid_t dst_pid, void *dst, size_t len)
{
return pm_copy_data(src_pid, dst_pid, (addr_t)src, (addr_t)dst, len);
}

View File

@@ -0,0 +1,6 @@
#pragma once
#include <u_types.h>
#include <sys/types.h>
int mk_copy_mem_to_task(pid_t src_pid, void *src, pid_t dst_pid, void *dst, size_t len);

View File

@@ -103,7 +103,10 @@ static int mk_pin_drv_ioctl(mk_dev_t *pin, int cmd, umword_t args)
}
if (ops->drv_pin_configure)
{
ret = ops->drv_pin_configure(&pin_dev->pins, cfg.pin, cfg.mode);
ret = ops->drv_pin_configure(&pin_dev->pins, cfg.pin, (mk_pin_mode_t){
.mode = cfg.mode,
.mux_cfg = cfg.cfg,
});
if (ret < 0)
{
return ret;
@@ -123,7 +126,7 @@ static int mk_pin_drv_ioctl(mk_dev_t *pin, int cmd, umword_t args)
{
return -EINVAL;
}
return pin_dev->pins.pins[cfg.pin];
return pin_dev->pins.pins[cfg.pin].raw;
}
break;
case MK_PIN_SET_OP_PIN:

View File

@@ -6,14 +6,26 @@
#define MK_PIN_MAX_NUM (16 * 8)
__ALIGN__(1)
typedef union mk_pin_mode
{
struct
{
uint8_t mode;
uint8_t mux_cfg;
uint8_t resv0;
uint8_t resv1;
};
uint32_t raw;
} mk_pin_mode_t;
typedef struct mk_pin
{
uint32_t pins[MK_PIN_MAX_NUM]; //!< 最大256引脚
mk_pin_mode_t pins[MK_PIN_MAX_NUM]; //!< 最大256引脚
} mk_pin_t;
typedef struct mk_pin_ops
{
int (*drv_pin_configure)(mk_pin_t *pin, int number, int mode);
int (*drv_pin_configure)(mk_pin_t *pin, int number, mk_pin_mode_t cfg);
int (*drv_pin_read)(mk_pin_t *pin, int number, uint8_t *value);
int (*drv_pin_write)(mk_pin_t *pin, int number, uint8_t value);
} mk_pin_ops_t;
@@ -32,7 +44,7 @@ enum mk_pin_ioctl_op
MK_PIN_SET_OP_PIN, //!< 设置要操作的引脚,标记读写的起始引脚
};
enum mk_pin_mode
enum mk_pin_mode_cfg
{
MK_PIN_MODE_NONE = 1,
MK_PIN_MODE_OUTPUT,
@@ -41,17 +53,23 @@ enum mk_pin_mode
MK_PIN_MODE_INPUT_DOWN,
MK_PIN_MODE_INPUT_UP,
MK_PIN_MODE_MUX_OUTPUT,
MK_PIN_MODE_MUX_OUTPUT_OD,
MK_PIN_MODE_IRQ_RISING,
MK_PIN_MODE_IRQ_FALLING,
MK_PIN_MODE_IRQ_EDGE,
MK_PIN_MODE_IRQ_LOW,
MK_PIN_MODE_IRQ_HIGH,
};
__ALIGN__(1)
typedef union mk_pin_cfg
{
struct
{
uint16_t mode;
uint8_t mode;
uint8_t cfg;
uint16_t pin;
};
uint32_t cfg_raw;