From e2709e4c88d04ed7791f88913ec679532fc5273f Mon Sep 17 00:00:00 2001 From: Wendal Chen Date: Mon, 22 Jan 2024 10:52:29 +0800 Subject: [PATCH 1/4] =?UTF-8?q?add:=20=E6=B7=BB=E5=8A=A0ulwip=E5=BA=93,?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BE=A7=E5=AF=B9=E6=8E=A5mac=E5=8C=85/ip?= =?UTF-8?q?=E5=8C=85,=E5=BD=93=E5=89=8D=E4=BB=A3=E7=A0=81=E8=BF=98?= =?UTF-8?q?=E4=B8=8D=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network/ulwip/binding/luat_lib_ulwip.c | 474 ++++++++++++++++++ components/network/zlink/include/luat_zlink.h | 51 ++ components/network/zlink/src/luat_zlink.c | 0 3 files changed, 525 insertions(+) create mode 100644 components/network/ulwip/binding/luat_lib_ulwip.c create mode 100644 components/network/zlink/include/luat_zlink.h create mode 100644 components/network/zlink/src/luat_zlink.c diff --git a/components/network/ulwip/binding/luat_lib_ulwip.c b/components/network/ulwip/binding/luat_lib_ulwip.c new file mode 100644 index 00000000..a2a60a13 --- /dev/null +++ b/components/network/ulwip/binding/luat_lib_ulwip.c @@ -0,0 +1,474 @@ +/* +@module ulwip +@summary 用户空间的lwip集成(开发中) +@version 1.0 +@date 2024.1.22 +@auther wendal +@tag LUAT_USE_ULWIP +@usage +--[[ +注意: 本库处于开发中, 接口随时可能变化 +用户空间的LWIP集成, 用于支持lwip的netif的网络集成, 实现在lua代码中直接控制MAC包/IP包的收发 + +总体数据路径如下 + +lua代码 -> ulwip.input -> lwip(netif->input) -> lwip处理逻辑 -> luatos socket框架 + +lua代码 <- ulwip回调函数 <- lwip(netif->low_level_output) <- lwip处理逻辑 <- luatos socket框架 + +应用示例: +1. Air601的wifi模块作为被控端, 通过UART/SPI收发MAC包, 实现Air780E/Air780EP集成wifi模块的功能 +2. 使用W5500/CH395/ENC28J60等以太网模块, 在用户lua代码中控制其mac包收发, 并集成到luatos socket框架中 +3. 通过蓝牙模块,集成lowpan6 +]] +*/ + +#include "luat_base.h" +#include "luat_msgbus.h" +#include "luat_timer.h" +#include "luat_mem.h" +#include "luat_zbuff.h" + +#include "lwip/opt.h" +#include "lwip/debug.h" +#include "lwip/stats.h" +#include "lwip/netif.h" +#include "lwip/etharp.h" +#include "lwip/dhcp.h" +#include "lwip/ethip6.h" + +#include "luat_network_adapter.h" + +#define LUAT_LOG_TAG "ulwip" +#include "luat_log.h" + +#define USERLWIP_NET_COUNT NW_ADAPTER_INDEX_LWIP_NETIF_QTY + +void net_lwip_set_link_state(uint8_t adapter_index, uint8_t updown); + +typedef struct ulwip_ctx +{ + int adapter_index; + int output_lua_ref; + struct netif *netif; + uint16_t mtu; + uint16_t flags; + uint8_t hwaddr[ETH_HWADDR_LEN]; +}ulwip_ctx_t; + +static ulwip_ctx_t nets[USERLWIP_NET_COUNT]; + +// 搜索adpater_index对应的netif +static struct netif* find_netif(int adapter_index) { + struct netif *netif = NULL; + for (size_t i = 0; i < USERLWIP_NET_COUNT; i++) + { + if (nets[i].adapter_index == adapter_index) + { + netif = nets[i].netif; + break; + } + } + return netif; +} + +// 回调函数, 用于lwip的netif输出数据 +static int netif_output_cb(lua_State *L, void* ptr) { + // LLOGD("netif_output_cb"); + rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1); + lua_geti(L, LUA_REGISTRYINDEX, nets[msg->arg2].output_lua_ref); + if (lua_isfunction(L, -1)) { + lua_pushinteger(L, msg->arg2); + // TODO ? 改成zbuff? + lua_pushlstring(L, ptr, msg->arg1); + luat_heap_free(ptr); + lua_call(L, 2, 0); + } + else { + // LLOGD("不是回调函数 %d", nets[msg->arg2].output_lua_ref); + luat_heap_free(ptr); + } + return 0; +} + +static err_t netif_output(struct netif *netif, struct pbuf *p) { + // LLOGD("lwip待发送数据 %p %d", p, p->tot_len); + rtos_msg_t msg = {0}; + msg.handler = netif_output_cb; + msg.arg1 = p->tot_len; + msg.arg2 = -1; + for (size_t i = 0; i < USERLWIP_NET_COUNT; i++) + { + if (nets[i].netif == netif) + { + msg.arg2 = i; + break; + } + } + if (msg.arg2 < 0) { + LLOGE("netif_output %p not found", netif); + return ERR_IF; + } + msg.ptr = luat_heap_malloc(p->tot_len); + if (msg.ptr == NULL) + { + LLOGE("malloc %d failed for netif_output", p->tot_len); + return ERR_MEM; + } + + size_t offset = 0; + do { + memcpy((char*)msg.ptr + offset, p->payload, p->len); + offset += p->len; + p = p->next; + } while (p); + luat_msgbus_put(&msg, 0); + return 0; +} + +static void netif_status_callback(struct netif *netif) +{ + LLOGD("netif status changed %s", ip4addr_ntoa(netif_ip4_addr(netif))); + for (size_t i = 0; i < USERLWIP_NET_COUNT; i++) + { + if (nets[i].netif == netif) + { + if (!ip_addr_isany(&netif->ip_addr)) { + LLOGD("设置网络状态为UP %d", i); + net_lwip_set_link_state(nets[i].adapter_index, 1); + } + else { + LLOGD("设置网络状态为DOWN %d", i); + net_lwip_set_link_state(nets[i].adapter_index, 0); + } + break; + } + } + +} + +static err_t luat_netif_init(struct netif *netif) { + for (size_t i = 0; i < USERLWIP_NET_COUNT; i++) + { + if (nets[i].netif == netif) + { + LLOGD("netif init %d %p", i, netif); + + netif->linkoutput = netif_output; + netif->output = etharp_output; + #if LWIP_IPV6 + netif->output_ip6 = ethip6_output; + #endif + netif->mtu = 1460; // TODO 支持配置 + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6; + memcpy(netif->hwaddr, nets[i].hwaddr, ETH_HWADDR_LEN); + netif->hwaddr_len = ETH_HWADDR_LEN; + return 0; + } + } + return ERR_IF; +} + +/* +初始化lwip netif +@api ulwip.setup(adapter_index, mac, output_lua_ref) +@int adapter_index 适配器编号 +@string mac 网卡mac地址 +@function output_lua_ref 回调函数, 参数为(adapter_index, data) +@return boolean 成功与否 +@usage +-- 初始化一个适配器, 并设置回调函数 +ulwip.setup(socket.LWIP_STA, string.fromHex("18fe34a27b69"), function(adapter_index, data) + log.info("ulwip", "output_lua_ref", adapter_index, data:toHex()) +end) +-- 注意, setup之后, netif的状态是down, 调用ulwip.updown(adapter_index, true)后, 才能正常收发数据 +*/ +static int l_ulwip_setup(lua_State *L) { + // 必须有适配器编号 + int adapter_index = luaL_checkinteger(L, 1); + // 设置MAC地址,必须的 + const char* mac = luaL_checkstring(L, 2); + if (adapter_index < 0 || adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) + { + LLOGE("非法的adapter_index %d", adapter_index); + return 0; + } + if (!lua_isfunction(L, 3)) { + LLOGE("output_lua_ref must be a function"); + return 0; + } + struct netif *netif = NULL; + for (size_t i = 0; i < USERLWIP_NET_COUNT; i++) + { + if (nets[i].netif == NULL) + { + netif = luat_heap_malloc(sizeof(struct netif)); + if (netif) { + memset(netif, 0, sizeof(struct netif)); + nets[i].adapter_index = adapter_index; + nets[i].netif = netif; + lua_pushvalue(L, 3); + memcpy(nets[i].hwaddr, mac, ETH_HWADDR_LEN); + nets[i].output_lua_ref = luaL_ref(L, LUA_REGISTRYINDEX); + break; + } + } + } + if (netif == NULL) + { + LLOGE("没有空余的netif了"); + return 0; + } + + // 已经分配netif, 继续初始化 + netif_add(netif, IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY, NULL, luat_netif_init, netif_input); + + netif->name[0] = 'u'; + netif->name[1] = 's'; + #if LWIP_IPV6 + netif_create_ip6_linklocal_address(netif, 1); + netif->ip6_autoconfig_enabled = 1; + #endif + netif_set_status_callback(netif, netif_status_callback); + netif_set_default(netif); + // netif_set_up(netif); + // netif_set_link_down(netif); + + // LLOGD("netif is up %d", netif_is_up(netif)); + + /* Start DHCP*/ + // dhcp_start(netif); + + lua_pushboolean(L, 1); + return 1; +} + +/* +设置netif的状态 +@api ulwip.updown(adapter_index, up) +@int adapter_index 适配器编号 +@boolean up true为up, false为down +@return boolean 成功与否 +@usage +-- 参考ulwip.setup +*/ +static int l_ulwip_updown(lua_State *L) { + // 必须有适配器编号 + int adapter_index = luaL_checkinteger(L, 1); + struct netif* netif = find_netif(adapter_index); + if (netif == NULL) { + LLOGE("没有找到netif"); + return 0; + } + if (lua_isboolean(L, 2)) { + if (lua_toboolean(L, 2)) { + netif_set_up(netif); + } + else { + netif_set_down(netif); + } + } + lua_pushboolean(L, netif_is_up(netif)); + return 1; +} + +/* +设置netif的物理链路状态 +@api ulwip.link(adapter_index, up) +@int adapter_index 适配器编号 +@boolean up true为up, false为down +@return boolean 当前状态 +@usage +-- 参考ulwip.setup +*/ +static int l_ulwip_link(lua_State *L) {// 必须有适配器编号 + int adapter_index = luaL_checkinteger(L, 1); + struct netif* netif = find_netif(adapter_index); + if (netif == NULL) { + LLOGE("没有找到netif"); + return 0; + } + if (lua_isboolean(L, 2)) + { + if (lua_toboolean(L, 2)) + { + netif_set_link_up(netif); + } + else { + netif_set_link_down(netif); + } + } + lua_pushboolean(L, netif_is_link_up(netif)); + return 1; +} + +/* +往netif输入数据 +@api ulwip.input(adapter_index, data) +@int adapter_index 适配器编号 +@string data 输入的数据 +@return boolean 成功与否 +@usage +-- 参考ulwip.setup +*/ +static int l_ulwip_input(lua_State *L) { + // 必须有适配器编号 + int adapter_index = luaL_checkinteger(L, 1); + int ret = 0; + struct pbuf *q = NULL; + const char* data = NULL; + size_t len = 0; + struct netif* netif = find_netif(adapter_index); + if (netif == NULL) { + LLOGE("没有找到netif %d", adapter_index); + return 0; + } + if (lua_type(L, 2) == LUA_TSTRING) + { + data = luaL_checklstring(L, 2, &len); + } + else if (lua_type(L, 2) == LUA_TUSERDATA) { + luat_zbuff_t* zb = (luat_zbuff_t*)luaL_checkudata(L, 2, "zbuff"); + data = (const char*)zb->addr; + len = zb->used; + } + else { + LLOGE("未知的数据格式, 当前仅支持zbuff和string"); + return 0; + } + struct pbuf *p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); + if (p == NULL) { + LLOGE("pbuf_alloc failed"); + return 0; + } + for (q = p; q != NULL; q = q->next) { + memcpy(q->payload, data, q->len); + data += q->len; + } + ret = netif->input(p, netif); + if(ret != ERR_OK) { + LLOGE("netif->input ret %d", ret); + LWIP_DEBUGF(NETIF_DEBUG, ("l_ulwip_input: IP input error\n")); + pbuf_free(p); + return 0; + } + lua_pushboolean(L, 1); + return 1; +} + +/* +启动或关闭dhcp +@api ulwip.dhcp(adapter_index, up) +@int adapter_index 适配器编号 +@boolean up true为启动, false为关闭 +@return boolean 当前状态 +@usage +-- 参考ulwip.setup +*/ +static int l_ulwip_dhcp(lua_State *L) { + // 必须有适配器编号 + int adapter_index = luaL_checkinteger(L, 1); + struct netif* netif = find_netif(adapter_index); + if (netif == NULL) { + LLOGE("没有找到netif"); + return 0; + } + if (lua_type(L, 2) == LUA_TBOOLEAN) + { + if (lua_toboolean(L, 2)) + { + dhcp_start(netif); + } + else { + dhcp_stop(netif); + } + lua_pushboolean(L, 1); + return 1; + } + return 0; +} + +/* +设置或获取ip信息 +@api ulwip.ip(adapter_index, ip, netmask, gw) +@int adapter_index 适配器编号 +@string ip IP地址, 仅获取时可以不填 +@string netmask 子网掩码, 仅获取时可以不填 +@string gw 网关地址, 仅获取时可以不填 +@return string ip地址, 子网掩码, 网关地址 +@usage +-- 获取现有值 +local ip, netmask, gw = ulwip.ip(socket.LWIP_STA) +-- 设置新值 +ulwip.ip(socket.LWIP_STA, "192.168.0.1", "255.255.255.0", "192.168.0.1") +*/ +static int l_ulwip_ip(lua_State *L) { + char* tmp = NULL; + // 必须有适配器编号 + int adapter_index = luaL_checkinteger(L, 1); + struct netif* netif = find_netif(adapter_index); + if (netif == NULL) { + LLOGE("没有找到netif %d", adapter_index); + return 0; + } + if (lua_type(L, 2) == LUA_TSTRING) + { + tmp = luaL_checkstring(L, 2); + ipaddr_aton(tmp, &netif->ip_addr); + tmp = luaL_checkstring(L, 3); + ipaddr_aton(tmp, &netif->netmask); + tmp = luaL_checkstring(L, 2); + ipaddr_aton(tmp, &netif->gw); + } + // 反馈IP信息 + tmp = ip_ntoa(&netif->ip_addr); + lua_pushstring(L, tmp); + tmp = ip_ntoa(&netif->netmask); + lua_pushstring(L, tmp); + tmp = ip_ntoa(&netif->gw); + lua_pushstring(L, tmp); + return 3; +} + +void net_lwip_register_adapter(uint8_t adapter_index); +void net_lwip_set_netif(uint8_t adapter_index, struct netif *netif); +/* +将netif注册到luatos socket中 +@api ulwip.reg(adapter_index) +@int adapter_index 适配器编号 +@return boolean 成功与否 +@usage +-- 参考ulwip.setup +*/ +static int l_ulwip_reg(lua_State *L) { + // 必须有适配器编号 + int adapter_index = luaL_checkinteger(L, 1); + struct netif* netif = find_netif(adapter_index); + if (netif == NULL) { + LLOGE("没有找到netif %d", adapter_index); + return 0; + } + net_lwip_set_netif(adapter_index, netif); + net_lwip_register_adapter(adapter_index); + lua_pushboolean(L, 1); + return 1; +} + +#include "rotable2.h" +static const rotable_Reg_t reg_ulwip[] = +{ + { "input" , ROREG_FUNC(l_ulwip_input)}, + { "setup" , ROREG_FUNC(l_ulwip_setup)}, + { "updown" , ROREG_FUNC(l_ulwip_updown)}, + { "link" , ROREG_FUNC(l_ulwip_link)}, + { "dhcp" , ROREG_FUNC(l_ulwip_dhcp)}, + { "ip" , ROREG_FUNC(l_ulwip_ip)}, + { "reg" , ROREG_FUNC(l_ulwip_reg)}, + { NULL, ROREG_INT(0)} +}; + +LUAMOD_API int luaopen_ulwip( lua_State *L ) { + luat_newlib2(L, reg_ulwip); + return 1; +} + diff --git a/components/network/zlink/include/luat_zlink.h b/components/network/zlink/include/luat_zlink.h new file mode 100644 index 00000000..514f9e00 --- /dev/null +++ b/components/network/zlink/include/luat_zlink.h @@ -0,0 +1,51 @@ +#ifndef LUAT_ZLINK_H +#define LUAT_ZLINK_H + +typedef void (*luat_zlink_output)(void *arg, const void *data, size_t len); + +int luat_pcap_init(luat_zlink_output output, void *arg); +int luat_pcap_write(const void *data, size_t len); +int luat_pcap_push(const void *data, size_t len); + +typedef struct luat_zlink_pkg +{ + uint8_t magic[4]; // ZINK + uint8_t pkgid[4]; // 包id, 自增 + uint8_t flags[2]; // 标志位, 预留,当前为0 + uint8_t len[2]; // 仅计算len之后的数据 + uint8_t cmd0; // 命令分类 + uint8_t cmd1; // 具体命令 + uint8_t data[0]; +}luat_zlink_pkg_t; + +enum { + // 基础指令 + LUAT_ZLINK_CMD_NONE = 0, // 空指令 + LUAT_ZLINK_CMD_VERSION, // 查询协议版本号 + LUAT_ZLINK_CMD_PING, // 心跳包 + LUAT_ZLINK_CMD_PONG, // 心跳包应答 + LUAT_ZLINK_CMD_REBOOT, // 重启模块 + + LUAT_ZLINK_CMD_MSG = 64, // 日志输出, 用于调试 + + // WLAN命令 + // WLAN 基础命令 + LUAT_ZLINK_CMD_WLAN_INIT = (1 << 8) + 1, + LUAT_ZLINK_CMD_WLAN_STATUS, + // WLAN设置命令 + LUAT_ZLINK_CMD_WLAN_SSID = (1 << 8) + 16, + LUAT_ZLINK_CMD_WLAN_PASSWORD, + LUAT_ZLINK_CMD_WLAN_MAC, + + // WLAN控制命令 + LUAT_ZLINK_CMD_WLAN_CONNECT = (1 << 8) + 32, + LUAT_ZLINK_CMD_WLAN_DISCONNECT, + LUAT_ZLINK_CMD_WLAN_SCAN, + + + // MAC包收发指令, 只有发送和收到(ACK),应该不需要其他的吧 + LUAT_ZLINK_CMD_MACPKG_SEND = (2 << 8) + 1, + LUAT_ZLINK_CMD_MACPKG_ACK, +}; + +#endif diff --git a/components/network/zlink/src/luat_zlink.c b/components/network/zlink/src/luat_zlink.c new file mode 100644 index 00000000..e69de29b From cf41f73588b94474cf1e216d395416a9da4ed3b3 Mon Sep 17 00:00:00 2001 From: Wendal Chen Date: Mon, 22 Jan 2024 10:53:05 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20asn1=5Foid=5Fnode=5Ffrom=5Fbase128?= =?UTF-8?q?=E5=9C=A8gcc=20-O3=E4=B8=8B=E7=BC=96=E8=AF=91=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/gmssl/src/asn1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/gmssl/src/asn1.c b/components/gmssl/src/asn1.c index 89883ae7..c282ffbe 100644 --- a/components/gmssl/src/asn1.c +++ b/components/gmssl/src/asn1.c @@ -962,7 +962,7 @@ static void asn1_oid_node_to_base128(uint32_t a, uint8_t **out, size_t *outlen) static int asn1_oid_node_from_base128(uint32_t *a, const uint8_t **in, size_t *inlen) { - uint8_t buf[5]; + uint8_t buf[5] = {0}; int n = 0; int i; From 57b447e3c621a58cf5fa0f0dd6770817dd43bf11 Mon Sep 17 00:00:00 2001 From: Dozingfiretruck <1473454180@qq.com> Date: Mon, 22 Jan 2024 12:18:49 +0800 Subject: [PATCH 3/4] =?UTF-8?q?update:volte=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E9=9F=B3=E9=87=8F=E3=80=81mic=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/cc/luat_lib_cc.c | 3 --- components/multimedia/luat_lib_multimedia_audio.c | 1 + demo/cc/main.lua | 9 ++++++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/components/cc/luat_lib_cc.c b/components/cc/luat_lib_cc.c index cbaac6fb..61aa40ff 100644 --- a/components/cc/luat_lib_cc.c +++ b/components/cc/luat_lib_cc.c @@ -170,9 +170,6 @@ static void luat_volte_task(void *param){ audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_BITS,16); audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_FORMAT,LUAT_CODEC_FORMAT_I2S); - audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_VOICE_VOL,70); - audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_MIC_VOL,80); - // // audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_MODE_STANDBY,LUAT_CODEC_MODE_ALL); audio_conf->codec_conf.codec_opts->stop(&audio_conf->codec_conf); } diff --git a/components/multimedia/luat_lib_multimedia_audio.c b/components/multimedia/luat_lib_multimedia_audio.c index a8b32411..66e673c6 100644 --- a/components/multimedia/luat_lib_multimedia_audio.c +++ b/components/multimedia/luat_lib_multimedia_audio.c @@ -374,6 +374,7 @@ static int l_audio_set_output_bus(lua_State *L) { luat_audio_conf_t* audio_conf = luat_audio_get_config(id); int tp = luaL_checkinteger(L, 2); if (audio_conf!=NULL && lua_istable(L,3) && tp==MULTIMEDIA_AUDIO_BUS_I2S){ + audio_conf->bus_type = MULTIMEDIA_AUDIO_BUS_I2S; lua_pushstring(L, "chip"); if (LUA_TSTRING == lua_gettable(L, 3)) { const char *chip = luaL_checklstring(L, -1,&len); diff --git a/demo/cc/main.lua b/demo/cc/main.lua index f9037358..f9db7d27 100644 --- a/demo/cc/main.lua +++ b/demo/cc/main.lua @@ -27,7 +27,7 @@ local function record(is_dl, point) log.info("下行数据,位于缓存", point+1, "缓存1数据量", down1:used(), "缓存2数据量", down2:used()) else log.info("上行数据,位于缓存", point+1, "缓存1数据量", up1:used(), "缓存2数据量", up2:used()) - end + end log.info("通话质量", cc.quality()) -- 可以在初始化串口后,通过uart.tx来发送走对应的zbuff即可 end @@ -56,12 +56,19 @@ sys.taskInit(function() local i2s_communication_format = 0 local i2s_channel_bits = 32 + local voice_vol = 70 + local mic_vol = 80 + i2c.setup(i2c_id,i2c.FAST) i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format,i2s_channel_bits) audio.setBus(multimedia_id, audio.BUS_I2S,{chip = "es8311",i2cid = i2c_id , i2sid = i2s_id}) --通道0的硬件输出通道设置为I2S audio.config(multimedia_id, 25, 0, 3, 100, 255, 0, 100) cc.init(multimedia_id) + + audio.vol(multimedia_id, voice_vol) + audio.micVol(multimedia_id, mic_vol) + sys.waitUntil("CC_READY") sys.wait(100) --cc.dial(0,"114") --拨打电话 From 54307b065af9e97fb9002b0efb5574b20c691c77 Mon Sep 17 00:00:00 2001 From: Dozingfiretruck <1473454180@qq.com> Date: Mon, 22 Jan 2024 12:36:39 +0800 Subject: [PATCH 4/4] =?UTF-8?q?update:=E8=B0=83=E6=95=B4codec=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E4=BD=8D=E7=BD=AE=EF=BC=8C=E4=B8=8D=E5=BA=94?= =?UTF-8?q?=E5=9C=A8volte=E5=88=9D=E5=A7=8B=E5=8C=96=EF=BC=8C=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E5=92=8Caudio=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/cc/luat_lib_cc.c | 20 +++++-------------- .../multimedia/luat_lib_multimedia_audio.c | 4 ++-- components/multimedia/luat_multimedia_audio.c | 11 ++++++++-- demo/cc/main.lua | 4 ++-- luat/include/luat_audio.h | 2 +- 5 files changed, 19 insertions(+), 22 deletions(-) diff --git a/components/cc/luat_lib_cc.c b/components/cc/luat_lib_cc.c index 61aa40ff..be657a6e 100644 --- a/components/cc/luat_lib_cc.c +++ b/components/cc/luat_lib_cc.c @@ -158,21 +158,11 @@ static void luat_volte_task(void *param){ luat_i2s_setup(&i2s_conf); luat_cc.i2s_conf = luat_i2s_get_config(audio_conf->codec_conf.i2s_id); - int ret = audio_conf->codec_conf.codec_opts->init(&audio_conf->codec_conf,LUAT_CODEC_MODE_SLAVE); - if (ret){ - LLOGE("no codec %s",audio_conf->codec_conf.codec_opts->name); - luat_rtos_task_delete(luat_cc.task_handle); - return; - }else{ - LLOGD("find codec %s",audio_conf->codec_conf.codec_opts->name); - - audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_RATE,16000); - audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_BITS,16); - audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_FORMAT,LUAT_CODEC_FORMAT_I2S); - - // // audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_MODE_STANDBY,LUAT_CODEC_MODE_ALL); - audio_conf->codec_conf.codec_opts->stop(&audio_conf->codec_conf); - } + audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_RATE,16000); + audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_BITS,16); + + audio_conf->codec_conf.codec_opts->stop(&audio_conf->codec_conf); + while (1){ luat_rtos_event_recv(luat_cc.task_handle, 0, &event, NULL, LUAT_WAIT_FOREVER); switch(event.id) diff --git a/components/multimedia/luat_lib_multimedia_audio.c b/components/multimedia/luat_lib_multimedia_audio.c index 66e673c6..ebb9d20b 100644 --- a/components/multimedia/luat_lib_multimedia_audio.c +++ b/components/multimedia/luat_lib_multimedia_audio.c @@ -394,8 +394,8 @@ static int l_audio_set_output_bus(lua_State *L) { } lua_pop(L, 1); } - luat_audio_set_bus_type(id,tp); - return 0; + lua_pushboolean(L, !luat_audio_set_bus_type(id,tp)); + return 1; } LUAT_WEAK void luat_audio_set_debug(uint8_t on_off) diff --git a/components/multimedia/luat_multimedia_audio.c b/components/multimedia/luat_multimedia_audio.c index 35f68a9f..57a20f0a 100644 --- a/components/multimedia/luat_multimedia_audio.c +++ b/components/multimedia/luat_multimedia_audio.c @@ -153,15 +153,22 @@ LUAT_WEAK uint8_t luat_audio_mic_vol(uint8_t multimedia_id, uint16_t vol){ return -1; } -LUAT_WEAK void luat_audio_set_bus_type(uint8_t multimedia_id,uint8_t bus_type){ +LUAT_WEAK int luat_audio_set_bus_type(uint8_t multimedia_id,uint8_t bus_type){ luat_audio_conf_t* audio_conf = luat_audio_get_config(multimedia_id); if (audio_conf){ if (bus_type == MULTIMEDIA_AUDIO_BUS_I2S){ audio_conf->bus_type = MULTIMEDIA_AUDIO_BUS_I2S; - audio_conf->codec_conf.codec_opts->init(&audio_conf->codec_conf,LUAT_CODEC_MODE_SLAVE); + if (audio_conf->codec_conf.codec_opts->init(&audio_conf->codec_conf,LUAT_CODEC_MODE_SLAVE)){ + LLOGE("no codec %s",audio_conf->codec_conf.codec_opts->name); + return -1; + }else{ + LLOGD("find codec %s",audio_conf->codec_conf.codec_opts->name); + } audio_conf->codec_conf.codec_opts->control(&audio_conf->codec_conf,LUAT_CODEC_SET_FORMAT,LUAT_CODEC_FORMAT_I2S); + return 0; } } + return -1; } diff --git a/demo/cc/main.lua b/demo/cc/main.lua index f9db7d27..8c9a63b2 100644 --- a/demo/cc/main.lua +++ b/demo/cc/main.lua @@ -64,11 +64,11 @@ sys.taskInit(function() audio.setBus(multimedia_id, audio.BUS_I2S,{chip = "es8311",i2cid = i2c_id , i2sid = i2s_id}) --通道0的硬件输出通道设置为I2S audio.config(multimedia_id, 25, 0, 3, 100, 255, 0, 100) - cc.init(multimedia_id) - audio.vol(multimedia_id, voice_vol) audio.micVol(multimedia_id, mic_vol) + cc.init(multimedia_id) + sys.waitUntil("CC_READY") sys.wait(100) --cc.dial(0,"114") --拨打电话 diff --git a/luat/include/luat_audio.h b/luat/include/luat_audio.h index 92dd2bcf..8a8cc9d1 100644 --- a/luat/include/luat_audio.h +++ b/luat/include/luat_audio.h @@ -148,7 +148,7 @@ uint8_t luat_audio_mic_vol(uint8_t multimedia_id, uint16_t vol); * * @param bus_type 见MULTIMEDIA_AUDIO_BUS,目前只有0=DAC 1=I2S 2=SOFT_DAC */ -void luat_audio_set_bus_type(uint8_t multimedia_id,uint8_t bus_type); +int luat_audio_set_bus_type(uint8_t multimedia_id,uint8_t bus_type); luat_audio_conf_t *luat_audio_get_config(uint8_t multimedia_id);