snd驱动以及优化
This commit is contained in:
@@ -52,7 +52,7 @@ static const unsigned char states[]['z'-'A'+1] = {
|
||||
S('o') = UINT, S('u') = UINT, S('x') = UINT, S('X') = UINT,
|
||||
S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL,
|
||||
S('E') = DBL, S('F') = DBL, S('G') = DBL, S('A') = DBL,
|
||||
S('c') = CHAR, S('C') = INT,
|
||||
S('c') = INT, S('C') = UINT,
|
||||
S('s') = PTR, S('S') = PTR, S('p') = UIPTR, S('n') = PTR,
|
||||
S('m') = NOARG,
|
||||
S('l') = LPRE, S('h') = HPRE, S('L') = BIGLPRE,
|
||||
@@ -62,7 +62,7 @@ static const unsigned char states[]['z'-'A'+1] = {
|
||||
S('o') = ULONG, S('u') = ULONG, S('x') = ULONG, S('X') = ULONG,
|
||||
S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL,
|
||||
S('E') = DBL, S('F') = DBL, S('G') = DBL, S('A') = DBL,
|
||||
S('c') = INT, S('s') = PTR, S('n') = PTR,
|
||||
S('c') = UINT, S('s') = PTR, S('n') = PTR,
|
||||
S('l') = LLPRE,
|
||||
}, { /* 2: ll-prefixed */
|
||||
S('d') = LLONG, S('i') = LLONG,
|
||||
@@ -438,7 +438,7 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
|
||||
unsigned st, ps;
|
||||
int cnt=0, l=0;
|
||||
size_t i;
|
||||
char buf[sizeof(uintmax_t)*3+3+LDBL_MANT_DIG/4];
|
||||
char buf[sizeof(uintmax_t)*3];
|
||||
const char *prefix;
|
||||
int t, pl;
|
||||
wchar_t wc[2], *ws;
|
||||
@@ -589,6 +589,7 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
|
||||
}
|
||||
p = MAX(p, z-a + !arg.i);
|
||||
break;
|
||||
narrow_c:
|
||||
case 'c':
|
||||
*(a=z-(p=1))=arg.i;
|
||||
fl &= ~ZERO_PAD;
|
||||
@@ -603,6 +604,7 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
|
||||
fl &= ~ZERO_PAD;
|
||||
break;
|
||||
case 'C':
|
||||
if (!arg.i) goto narrow_c;
|
||||
wc[0] = arg.i;
|
||||
wc[1] = 0;
|
||||
arg.p = wc;
|
||||
|
||||
@@ -53,3 +53,8 @@
|
||||
#define NET_DRV_WRITE ((umword_t)0) //!< 网络驱动写
|
||||
#define NET_DRV_READ ((umword_t)1) //!< 网络驱动读
|
||||
#define NET_DRV_MAP ((umword_t)2) //!< net map
|
||||
|
||||
#define SND_DRV_PROT 0x0009
|
||||
#define SND_DRV_WRITE ((umword_t)0) //!< snd驱动写
|
||||
#define SND_DRV_READ ((umword_t)1) //!< snd驱动读
|
||||
#define SND_DRV_MAP ((umword_t)2) //!< snd map
|
||||
|
||||
8
mkrtos_user/lib/sys_svr/inc/snd_drv_cli.h
Normal file
8
mkrtos_user/lib/sys_svr/inc/snd_drv_cli.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
#include "u_types.h"
|
||||
#include "u_rpc_svr.h"
|
||||
#include "u_slist.h"
|
||||
|
||||
int snd_drv_cli_write(obj_handler_t dm9000_obj, obj_handler_t shm_obj, int len);
|
||||
int snd_drv_cli_read(obj_handler_t dm9000_obj, obj_handler_t shm_obj);
|
||||
int snd_drv_cli_map(obj_handler_t dm9000_obj, obj_handler_t *sem_obj);
|
||||
9
mkrtos_user/lib/sys_svr/inc/snd_drv_svr.h
Normal file
9
mkrtos_user/lib/sys_svr/inc/snd_drv_svr.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
#include "u_types.h"
|
||||
#include "u_rpc_svr.h"
|
||||
#include "u_slist.h"
|
||||
#include "snd_drv_types.h"
|
||||
int snd_drv_write(obj_handler_t obj, int len);
|
||||
int snd_drv_read(obj_handler_t obj, int len);
|
||||
int snd_drv_map(obj_handler_t *hd);
|
||||
void snd_drv_init(snd_drv_t *ns);
|
||||
9
mkrtos_user/lib/sys_svr/inc/snd_drv_types.h
Normal file
9
mkrtos_user/lib/sys_svr/inc/snd_drv_types.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
#include "u_types.h"
|
||||
#include "u_rpc_svr.h"
|
||||
#include "u_slist.h"
|
||||
|
||||
typedef struct snd_drv
|
||||
{
|
||||
rpc_svr_obj_t svr;
|
||||
} snd_drv_t;
|
||||
73
mkrtos_user/lib/sys_svr/src/snd_drv_cli.c
Normal file
73
mkrtos_user/lib/sys_svr/src/snd_drv_cli.c
Normal file
@@ -0,0 +1,73 @@
|
||||
#include "rpc_prot.h"
|
||||
#include "snd_drv_cli.h"
|
||||
#include "snd_drv_types.h"
|
||||
#include "u_rpc.h"
|
||||
#include "u_rpc_svr.h"
|
||||
#include "u_arch.h"
|
||||
#include "u_rpc_buf.h"
|
||||
#include "u_hd_man.h"
|
||||
#include "u_rpc_buf.h"
|
||||
#include <u_env.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
RPC_GENERATION_CALL2(snd_drv_t, SND_DRV_PROT, SND_DRV_WRITE, write,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
|
||||
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
|
||||
int snd_drv_cli_write(obj_handler_t dm9000_obj, obj_handler_t shm_obj, int len)
|
||||
{
|
||||
rpc_obj_handler_t_t rpc_hd = {
|
||||
.data = shm_obj,
|
||||
};
|
||||
rpc_int_t rpc_len = {
|
||||
.data = len,
|
||||
};
|
||||
|
||||
msg_tag_t tag = snd_drv_t_write_call(dm9000_obj, &rpc_hd, &rpc_len);
|
||||
|
||||
return msg_tag_get_val(tag);
|
||||
}
|
||||
RPC_GENERATION_CALL2(snd_drv_t, SND_DRV_PROT, SND_DRV_READ, read,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
|
||||
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
|
||||
|
||||
int snd_drv_cli_read(obj_handler_t dm9000_obj, obj_handler_t shm_obj)
|
||||
{
|
||||
rpc_obj_handler_t_t rpc_hd = {
|
||||
.data = shm_obj,
|
||||
};
|
||||
rpc_int_t rpc_len = {
|
||||
.data = 0,
|
||||
};
|
||||
msg_tag_t tag = snd_drv_t_read_call(dm9000_obj, &rpc_hd, &rpc_len);
|
||||
|
||||
return msg_tag_get_val(tag);
|
||||
}
|
||||
RPC_GENERATION_CALL1(snd_drv_t, SND_DRV_PROT, SND_DRV_MAP, map,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)
|
||||
|
||||
int snd_drv_cli_map(obj_handler_t dm9000_obj, obj_handler_t *sem_obj)
|
||||
{
|
||||
assert(sem_obj);
|
||||
|
||||
obj_handler_t newfd;
|
||||
|
||||
newfd = handler_alloc();
|
||||
if (newfd == HANDLER_INVALID)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
rpc_obj_handler_t_t rpc_sem_obj = {
|
||||
.data = newfd,
|
||||
.del_map_flags = VPAGE_FLAGS_MAP,
|
||||
};
|
||||
msg_tag_t tag = snd_drv_t_map_call(dm9000_obj, &rpc_sem_obj);
|
||||
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
handler_free(newfd);
|
||||
return msg_tag_get_val(tag);
|
||||
}
|
||||
*sem_obj = newfd;
|
||||
return msg_tag_get_val(tag);
|
||||
}
|
||||
51
mkrtos_user/lib/sys_svr/src/snd_drv_svr.c
Normal file
51
mkrtos_user/lib/sys_svr/src/snd_drv_svr.c
Normal file
@@ -0,0 +1,51 @@
|
||||
#include "rpc_prot.h"
|
||||
#include "snd_drv_svr.h"
|
||||
#include "snd_drv_types.h"
|
||||
#include "u_rpc.h"
|
||||
#include "u_rpc_svr.h"
|
||||
#include "u_arch.h"
|
||||
#include "u_rpc_buf.h"
|
||||
#include "u_hd_man.h"
|
||||
#include "u_rpc_buf.h"
|
||||
#include <stdio.h>
|
||||
|
||||
RPC_GENERATION_OP2(snd_drv_t, SND_DRV_PROT, SND_DRV_WRITE, write,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
|
||||
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
|
||||
{
|
||||
return snd_drv_write(rpc_hd_get(0), len->data);
|
||||
}
|
||||
RPC_GENERATION_DISPATCH2(snd_drv_t, SND_DRV_PROT, SND_DRV_WRITE, write,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, svr_hd,
|
||||
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, type)
|
||||
|
||||
RPC_GENERATION_OP2(snd_drv_t, SND_DRV_PROT, SND_DRV_READ, read,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
|
||||
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
|
||||
{
|
||||
return snd_drv_read(rpc_hd_get(0), len->data);
|
||||
}
|
||||
|
||||
RPC_GENERATION_DISPATCH2(snd_drv_t, SND_DRV_PROT, SND_DRV_READ, read,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, shm_obj,
|
||||
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
|
||||
|
||||
RPC_GENERATION_OP1(snd_drv_t, SND_DRV_PROT, SND_DRV_MAP, map,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)
|
||||
{
|
||||
int ret = snd_drv_map(&cli_hd->data);
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("snd drv aailed to request map");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
RPC_GENERATION_DISPATCH1(snd_drv_t, SND_DRV_PROT, SND_DRV_MAP, map,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)
|
||||
|
||||
RPC_DISPATCH3(snd_drv_t, SND_DRV_PROT, typeof(SND_DRV_READ), SND_DRV_WRITE, write, SND_DRV_READ, read, SND_DRV_MAP, map)
|
||||
|
||||
void snd_drv_init(snd_drv_t *ns)
|
||||
{
|
||||
rpc_svr_obj_init(&ns->svr, rpc_snd_drv_t_dispatch, SND_DRV_PROT);
|
||||
}
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
int u_irq_request(int irq_no, void *stack, void *msg_buf, obj_handler_t *ret_irq_obj, void (*irq_func)(void), u_irq_prio_t prio)
|
||||
{
|
||||
static obj_handler_t irq_obj;
|
||||
obj_handler_t irq_obj;
|
||||
|
||||
irq_obj = handler_alloc();
|
||||
if (irq_obj == HANDLER_INVALID)
|
||||
@@ -28,16 +28,16 @@ int u_irq_request(int irq_no, void *stack, void *msg_buf, obj_handler_t *ret_irq
|
||||
}
|
||||
obj_handler_t th_hd;
|
||||
|
||||
if (ret_irq_obj)
|
||||
{
|
||||
*ret_irq_obj = irq_obj;
|
||||
}
|
||||
int ret = u_thread_create(&th_hd, stack, msg_buf, irq_func);
|
||||
if (ret < 0)
|
||||
{
|
||||
handler_free_umap(irq_obj);
|
||||
return ret;
|
||||
}
|
||||
if (ret_irq_obj)
|
||||
{
|
||||
*ret_irq_obj = irq_obj;
|
||||
}
|
||||
u_thread_run(th_hd, IRQ_THREAD_PRIO);
|
||||
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user