snd驱动以及优化

This commit is contained in:
zhangzheng
2024-12-27 08:25:51 +08:00
parent 7aa4ee1812
commit 49060a965b
42 changed files with 1934 additions and 59 deletions

View File

@@ -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;

View File

@@ -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

View 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);

View 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);

View 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;

View 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);
}

View 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);
}

View File

@@ -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;