支持简单的显示驱动&显示驱动框架
This commit is contained in:
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
@@ -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,
|
||||
|
||||
@@ -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__ \
|
||||
|
||||
@@ -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*/
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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*/
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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删除
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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"
|
||||
125
mkrtos_user/lib/sys_util/inc/u_rpc_5.h
Normal file
125
mkrtos_user/lib/sys_util/inc/u_rpc_5.h
Normal 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)
|
||||
@@ -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");
|
||||
}
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
# net
|
||||
cpiofs -m /bin
|
||||
pin
|
||||
nes
|
||||
# nes
|
||||
sh
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
add_subdirectory(pin)
|
||||
add_subdirectory(display)
|
||||
|
||||
86
mkrtos_user/user/drv/ATSURFF437/display/CMakeLists.txt
Normal file
86
mkrtos_user/user/drv/ATSURFF437/display/CMakeLists.txt
Normal 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)
|
||||
|
||||
124
mkrtos_user/user/drv/ATSURFF437/display/armv7_8m/link.lds
Normal file
124
mkrtos_user/user/drv/ATSURFF437/display/armv7_8m/link.lds
Normal 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 = .;
|
||||
}
|
||||
176
mkrtos_user/user/drv/ATSURFF437/display/at32f435_437_conf.h
Normal file
176
mkrtos_user/user/drv/ATSURFF437/display/at32f435_437_conf.h
Normal 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
|
||||
1045
mkrtos_user/user/drv/ATSURFF437/display/at_surf_f437_lcd.c
Normal file
1045
mkrtos_user/user/drv/ATSURFF437/display/at_surf_f437_lcd.c
Normal file
File diff suppressed because it is too large
Load Diff
345
mkrtos_user/user/drv/ATSURFF437/display/fs_rpc.c
Normal file
345
mkrtos_user/user/drv/ATSURFF437/display/fs_rpc.c
Normal 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();
|
||||
}
|
||||
6
mkrtos_user/user/drv/ATSURFF437/display/fs_rpc.h
Normal file
6
mkrtos_user/user/drv/ATSURFF437/display/fs_rpc.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#define FS_DEBUG 0
|
||||
|
||||
void fs_svr_init(void);
|
||||
void fs_svr_loop(void);
|
||||
17
mkrtos_user/user/drv/ATSURFF437/display/heap_stack.c
Normal file
17
mkrtos_user/user/drv/ATSURFF437/display/heap_stack.c
Normal 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];
|
||||
39
mkrtos_user/user/drv/ATSURFF437/display/main.c
Normal file
39
mkrtos_user/user/drv/ATSURFF437/display/main.c
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
void drv_display_init(void);
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
38
mkrtos_user/user/drv/lib/mk_display/CMakeLists.txt
Normal file
38
mkrtos_user/user/drv/lib/mk_display/CMakeLists.txt
Normal 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
|
||||
)
|
||||
146
mkrtos_user/user/drv/lib/mk_display/mk_display_drv.c
Normal file
146
mkrtos_user/user/drv/lib/mk_display/mk_display_drv.c
Normal 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;
|
||||
}
|
||||
51
mkrtos_user/user/drv/lib/mk_display/mk_display_drv.h
Normal file
51
mkrtos_user/user/drv/lib/mk_display/mk_display_drv.h
Normal 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);
|
||||
9
mkrtos_user/user/drv/lib/mk_drv/mk_access.c
Normal file
9
mkrtos_user/user/drv/lib/mk_drv/mk_access.c
Normal 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);
|
||||
}
|
||||
6
mkrtos_user/user/drv/lib/mk_drv/mk_access.h
Normal file
6
mkrtos_user/user/drv/lib/mk_drv/mk_access.h
Normal 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);
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user