From: SnickerSun Date: Mon, 18 Mar 2024 07:43:56 +0000 (+0800) Subject: 优化cat1功耗,目前cat1可以自动休眠,cat1和bt已经实现互相唤醒功能 X-Git-Tag: release_V1.2.70_20241020_135402~1274^2~8^2~2 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=27b041ca1483cf8ec2a03ab98b5928a2a080b793;p=mirrors%2FFD230.git 优化cat1功耗,目前cat1可以自动休眠,cat1和bt已经实现互相唤醒功能 --- diff --git a/code/sdk/application/brandy/brandy_standard/thread_init.c b/code/sdk/application/brandy/brandy_standard/thread_init.c index d46b9897c..e4f269108 100755 --- a/code/sdk/application/brandy/brandy_standard/thread_init.c +++ b/code/sdk/application/brandy/brandy_standard/thread_init.c @@ -132,7 +132,7 @@ app_task_definition_t g_app_tasks[] = { { { "bt_sdk", 0, NULL, 0, NULL, BTH_SDK_STACK_SIZE, TASK_PRIORITY_SDK, 0, 0 }, (osThreadFunc_t)bt_acore_task_main, NULL, NULL, USE_DTCM_MEM }, #ifdef SUPPORT_AT_CMD - { { "at_cmd", 0, NULL, 0, NULL, 0xC00, TASK_PRIORITY_APP, 0, 0 }, + { { "at_cmd", 0, NULL, 0, NULL, 0x1C00, TASK_PRIORITY_APP, 0, 0 }, (osThreadFunc_t)at_cmd_task_process_handler, NULL, (CreateQueueFunction_t)at_cmd_task_queue_init, USE_DTCM_MEM }, #endif diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_at_cmd.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_at_cmd.cpp index 5dc852956..8fd0ceaf6 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_at_cmd.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_at_cmd.cpp @@ -170,7 +170,31 @@ static uint32_t cat1_nettest(uint8_t *para, uint32_t paraLen, char *strCommonCmd return ERRCODE_SUCC; } +static uint32_t cat1_wakeup(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + UNUSED(strCommonCmd); + uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN] = { 0 }; + uint32_t argc = 0; + + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != PPG_SUCCESS) { + printf("CAT1TEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + if (argc != 1) { + printf("CAT1TEST ATCMD Set Parameter Failed\n"); + return ERRCODE_FAIL; + } + // char *mode = (char*)argv[0]; + int enabled = atoi((char*)argv[0]); + if(enabled == 0) + uapi_cat1_wakeup_cat1(0); + else + uapi_cat1_wakeup_cat1(1); + printf("CAT1TEST ATCMD wakeup cat1 enabled = %d\n",enabled); + return ERRCODE_SUCC; +} #include "lwip/api_shell.h" static uint32_t cat1_ping(uint8_t *para, uint32_t paraLen, char *strCommonCmd) { @@ -183,10 +207,10 @@ static uint32_t cat1_ping(uint8_t *para, uint32_t paraLen, char *strCommonCmd) printf("CAT1TEST ATCMD Convert Command Failed\n"); return ERRCODE_FAIL; } - + uapi_cat1_wakeup_cat1(1); u32_t sret= OsShellPing( argc, (const char *)argv[0]); printf("CAT1TEST ATCMD ping ret = 0x%X\n",sret); - + uapi_cat1_wakeup_cat1(0); return ERRCODE_SUCC; } static uint32_t cat1_ifconfig(uint8_t *para, uint32_t paraLen, char *strCommonCmd) @@ -250,6 +274,7 @@ static const at_cmd_table_t g_cat1_cmd[] = { { (char *)"AT^CAT1GETTIME", at_cat1_gettime, (char *)"1" }, { (char *)"AT^CAT1NETTEST", cat1_nettest, (char *)"1" }, { (char *)"AT^PING", cat1_ping, (char *)"1" }, + { (char *)"AT^CAT1WAKECAT1", cat1_wakeup, (char *)"1" }, { (char *)"AT^IFCONFIG", cat1_ifconfig, (char *)"1" }, { (char *)"AT^CAT1GETVER", at_cat1_getver, (char *)"1" }, { (char *)"AT^CAT1RESETNETWORK", AT_cat1_reset_network, (char *)"1" }, diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ctl.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ctl.cpp index ccf20b416..838d0d87f 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ctl.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ctl.cpp @@ -6,7 +6,7 @@ #include "cat1_ctl.h" #include "gpio.h" #include "gpio_porting.h" - +#include "tcxo.h" #include "voice_call_volte_sample_wrapper.h" #include "wearable_log.h" @@ -92,24 +92,39 @@ void uapi_cat1_add_audio_vote(void) WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"\r\nCAT1 SERVICE MCU WAKEUP SUCCESS\r\n"); } +extern void restart_sleep_cat1_timer(void); void cat1_ring_isr_callback(pin_t pin, uintptr_t param) { - // WEARABLE_LOGW(WEARABLE_LOG_MODULE_MAIN_SERVICE,"cat1_ring_isr_callback %d 0x%X\n",pin,param); + WEARABLE_LOGW(WEARABLE_LOG_MODULE_MAIN_SERVICE,"cat1_ring_isr_callback %d 0x%X\n",pin,param); uapi_cat1_add_audio_vote(); + restart_sleep_cat1_timer(); } void uapi_cat1_wakeup_cat1(uint8_t wakeup) { - if( wakeup == 0) + + + if( wakeup == 1) { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_MAIN_SERVICE,"wakeup cat1\n"); uapi_gpio_set_dir(S_AGPIO_L30, GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_HIGH); + if(GPIO_LEVEL_HIGH != uapi_gpio_get_output_val(S_AGPIO_L30)) + { + uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_HIGH); + uapi_tcxo_delay_ms(100); //第一次唤醒 Cat1 需要延时等其正常运行 + } + // wstp_print("wakeup Cat1! L30 high \r\n"); }else{ + WEARABLE_LOGW(WEARABLE_LOG_MODULE_MAIN_SERVICE,"sleep cat1\n"); uapi_gpio_set_dir(S_AGPIO_L30, GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_LOW); + if(GPIO_LEVEL_LOW != uapi_gpio_get_output_val(S_AGPIO_L30)) + { + uapi_gpio_set_val(S_AGPIO_L30, GPIO_LEVEL_LOW); + } // wstp_print("sleep Cat1! L30 low\r\n"); } + } void uapi_cat1_pre_init(void) diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_server.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_server.cpp index b19b1827f..c7c232f00 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_server.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_server.cpp @@ -102,6 +102,7 @@ struct tcp_msg_t { static int g_listen_sock = 0; struct sockaddr_in sourceAddr = {0}; osTimerId_t g_timer_time_sync = NULL; +osTimerId_t g_timer_cat1_sleep = NULL; static uint8_t g_time_synced = 0; static struct tcp_msg_t *unpack_tlv_format(char *rx_buffer, int length) @@ -151,8 +152,8 @@ void udp_send_msg_toCat1(char cmd,char *content) { uapi_cat1_wakeup_cat1(1); - uart_port_register_irq(UART_BUS_0); - + // uart_port_register_irq(UART_BUS_0); + osal_irq_enable(UART_1_IRQN); char station_tx_buffer[256] = {0}; char station_head[2] = {0}; if( sourceAddr.sin_port != 0 ) { @@ -296,6 +297,33 @@ int cat1_handle_timesync(struct tcp_msg_t *msg) return 1; } + +static void timeout_handler_sleep_cat1(void) +{ + printf("sleep cat1\n"); + uapi_cat1_remove_audio_vote(); //接收到指令,让自己可以睡 + // uapi_cat1_wakeup_cat1(0);// 反馈给cat1,它也可以自己睡 + if(osTimerIsRunning(g_timer_cat1_sleep)==1 ) + { + osTimerStop(g_timer_cat1_sleep); + } +} +//目前只在 被cat1唤醒的中断函数里执行, +void restart_sleep_cat1_timer(void) +{ + if (g_timer_cat1_sleep == NULL) return ; + if(osTimerIsRunning(g_timer_cat1_sleep)==1 ) + { + osTimerStop(g_timer_cat1_sleep); + } + if(osTimerIsRunning(g_timer_cat1_sleep)==0 ) + { + // WEARABLE_LOGI(WEARABLE_LOG_MODULE_MAIN_SERVICE,"restart_sleep_cat1_timer \n"); + osTimerStart(g_timer_cat1_sleep,5000); //20秒后重试同步时间 + } +} + + static void time_sync_func(void) { @@ -306,7 +334,6 @@ static void time_sync_func(void) { osTimerStop(g_timer_time_sync); WEARABLE_LOGI(WEARABLE_LOG_MODULE_MAIN_SERVICE,"cat1 g_time_synced == 1 stop timer \n"); - } } @@ -511,10 +538,14 @@ errcode_t cat1_server_init(void) g_timer_time_sync = osTimerNew((osTimerFunc_t)time_sync_func, osTimerPeriodic, NULL, NULL); - if (g_timer_time_sync != NULL) - restart_time_sync(); - else - printf("g_timer_time_sync create failed\n"); + // if (g_timer_time_sync != NULL) + // restart_time_sync(); + // else + // printf("g_timer_time_sync create failed\n"); + + g_timer_cat1_sleep = osTimerNew((osTimerFunc_t)timeout_handler_sleep_cat1, osTimerPeriodic, NULL, NULL); + + return ERRCODE_SUCC; } diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/pyscript/cat1Service.py b/code/sdk/drivers/peripheral/slip/cat1Service/pyscript/cat1Service.py index c514dba8a..11c9ec0f4 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/pyscript/cat1Service.py +++ b/code/sdk/drivers/peripheral/slip/cat1Service/pyscript/cat1Service.py @@ -48,9 +48,9 @@ import atcmd import fota import request import ql_fs - +import pm PROJECT_NAME = "Cat1SlipUDPService" -PROJECT_VERSION = "PY_SRV_V3" +PROJECT_VERSION = "PY_SRV_V4" CONFIG_JSON="/usr/system_config.json" CURRENT_APP_TYPE="pysrv" @@ -59,8 +59,10 @@ CURRENT_APP_TYPE="pysrv" log.basicConfig(level=log.INFO) cat1service_log = log.getLogger("cat1service") - - +lpm_fd = pm.create_wakelock("system_lock", len("system_lock")) +pm.autosleep(1) +pm.wakelock_lock(lpm_fd) +cat1service_log.info("create_wakelock {}".format(pm.get_wakelock_num())) def get_versionkeyname_by_py(app_type): return str("{}version".format(app_type)) @@ -94,15 +96,36 @@ def get_version_from_json_config(app_type): set_version_to_json_config(CURRENT_APP_TYPE,PROJECT_VERSION) - -timer = osTimer() audio.set_qdai_cfg(1,0,0,1,0,0,1,1) -# GPIO21 - 86 KP_MKOUT1 唤醒主控 -# GPIO22 - 87 KP_MKIN 被主控唤醒 +# GPIO21 - 引脚 86 KP_MKOUT1 唤醒主控 +# GPIO22 - 引脚 87 KP_MKIN 被主控唤醒 + +# GPIOn - GPIO号,int类型,点此查看GPIO引脚编号与物理引脚的映射关系。 + +# direction - 输入输出模式,int类型,IN - 输入模式,OUT - 输出模式。 + +# pullMode - 上下拉模式,int类型,说明如下: +# PULL_DISABLE - 浮空模式 +# PULL_PU - 上拉模式 +# PULL_PD - 下拉模式 + +# level - 引脚电平,int类型,0 - 设置引脚为低电平, 1- 设置引脚为高电平。 +# recvDataPin = Pin(Pin.GPIO22, Pin.IN, Pin.PULL_PU, 0) def ExtIntfun(args): - print('### interrupt {} ###'.format(args)) # args[0]:gpio号 args[1]:上升沿或下降沿 -extint = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, ExtIntfun) + # cat1service_log.info('### interrupt {} ###'.format(args)) # args[0]:gpio号 args[1]:上升沿或下降沿 + if args[1] == 0: + cat1service_log.info("disable autosleep") + # pm.autosleep(0) + pm.wakelock_lock(lpm_fd) + elif args[1] == 1: + cat1service_log.info("enable autosleep") + pm.wakelock_unlock(lpm_fd) + # pm.autosleep(1) + # cat1service_log.info("recvDataPin={}".format(recvDataPin.read())) +extint = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, ExtIntfun) +extint.enable() + # 创建gpio对象 gpioWakeBT = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_DISABLE, 1) @@ -110,7 +133,7 @@ gpioWakeBT = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_DISABLE, 1) gpioWakeBT.set_dir(Pin.OUT) # 设置引脚电平 -# gpioWakeBT.write(1) +gpioWakeBT.write(0) UDP_CMD_GET_CAT1VER = '0' #获取 Cat1 版本号 UDP_CMD_DIAL_NUMB = '1' #拨打电话 @@ -170,6 +193,7 @@ class Cat1Service: self.__net_connected = 0 self.__value = None self.__wait_resp = 0 + self.__waiting_netstat = 0 slip.destroy() print('slip uart={0}'.format (self.__uart)) @@ -196,7 +220,10 @@ class Cat1Service: def __socket_reinit(self): return self.__socket_init() - + def bootup_msg_to_bt(self): + modem_ver = modem.getDevFwVersion() + self.reply_cmd('FF',"BOOTUP,pyVer,{},modemVer,{}".format(PROJECT_VERSION,modem_ver)) + def btmcu_cmd_handler(self,cmd,parm): print("btmcu_cmd_handler cmd {0} , args {1}".format(cmd,parm)) if cmd == "F0": @@ -286,16 +313,22 @@ class Cat1Service: return 0 def wait_network_ready(self): - stage, state = checkNet.waitNetworkReady(1) + if(self.__waiting_netstat == 1): + return 0 + self.__waiting_netstat = 1 + stage, state = checkNet.waitNetworkReady(30) + pm.wakelock_unlock(lpm_fd) if stage == 3 and state == 1: print('Network connection successful.') self.set_network_config() self.__net_connected = 1 + self.__waiting_netstat = 0 return 0 else: print('Network connection failed, stage={}, state={}'.format(stage, state)) self.reset_network_config() self.__net_connected = 0 + self.__waiting_netstat = 0 return -1 # 查询网卡状态 @@ -430,7 +463,10 @@ class Cat1Service: try: self.head = head self.content = content - + gpioWakeBT.write(1) + utime.sleep_ms(2) + gpioWakeBT.write(0) + utime.sleep_ms(20) # 消息处理 msg = self.__pack_tlv_format(self.head, self.content) @@ -451,6 +487,10 @@ class Cat1Service: def __Socket_UDP_noreply(self, head, content): self.head = head self.content = content + gpioWakeBT.write(1) + utime.sleep_ms(2) + gpioWakeBT.write(0) + utime.sleep_ms(20) # 消息处理 msg = self.__pack_tlv_format(self.head, self.content) # 向服务端发送消息 @@ -512,22 +552,15 @@ cat1service = Cat1Service() #voice call callback function def voice_callback(args): if args[0] == 10: - gpioWakeBT.write(0) - gpioWakeBT.write(1) print('voicecall incoming call, PhoneNO: ', args[6]) # gpioWakeBT.write(1) cat1service.notifyIncomingcall(args[6]) elif args[0] == 11: - gpioWakeBT.write(0) - gpioWakeBT.write(1) print('voicecall connected, PhoneNO: ', args[6]) cat1service.notifyConnecteCall() elif args[0] == 12: - gpioWakeBT.write(0) - gpioWakeBT.write(1) print('voicecall disconnect') cat1service.notifyDisconnectCall() - # gpioWakeBT.write(0) elif args[0] == 13: print('voicecall is waiting, PhoneNO: ', args[6]) elif args[0] == 14: @@ -543,13 +576,28 @@ voiceCall.setCallback(voice_callback) def checknet_cb(arg): print("start checktime!!") - cat1service.wait_network_ready() + _thread.start_new_thread(cat1service.wait_network_ready, ()) # time=utime.localtime() # zone=utime.getTimeZone() #(2024, 3, 2, 18, 31, 32, 5, 62),8 # cat1service.timesync("{0},{1}".format(time,zone)) -timer.start(10000,1,checknet_cb) +timer = osTimer() +# checknet_cb(()) +timer.start(30000,1,checknet_cb) + +def bootupmsg_cb(arg): + cat1service.bootup_msg_to_bt() + + +delaybootupmsg_timer = osTimer() +delaybootupmsg_timer.start(1000,0,bootupmsg_cb) + +# def checkpin_cb(arg): +# cat1service_log.info("recvDataPin={}".format(recvDataPin.read())) + +# timerCheckRevPin = osTimer() +# timerCheckRevPin.start(1000,1,checkpin_cb) # while True: diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/pyscript/current_img/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312_20240318-1541.zip b/code/sdk/drivers/peripheral/slip/cat1Service/pyscript/current_img/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312_20240318-1541.zip new file mode 100644 index 000000000..ebc517c2a Binary files /dev/null and b/code/sdk/drivers/peripheral/slip/cat1Service/pyscript/current_img/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312/EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312_20240318-1541.zip differ diff --git a/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c b/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c index cbc6aeef4..185ea95b0 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c @@ -9,7 +9,7 @@ #define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0])) #define CUSTOM_UTILS_MAX_ARGC 8 -#define CUSTOM_UTILS_MAX_ARGV_LEN 64 +#define CUSTOM_UTILS_MAX_ARGV_LEN 256 #define CUSTOM_UTILS_SUCCESS 0 #define CUSTOM_UTILS_FAILED (-1) @@ -94,6 +94,8 @@ void httpc_download_result(void *arg, httpc_result_t httpc_result, u32_t rx_cont { PRINT("httpc_download_result , httpc_result_t %d, rx_content_len %d , srv_res %d, err %d\n", httpc_result,rx_content_len,srv_res,err); + //通讯结束,休眠cat1 + uapi_cat1_wakeup_cat1(0); return ; } @@ -121,7 +123,8 @@ static uint32_t custom_start_ota_download(uint8_t *para, uint32_t paraLen, char return ERRCODE_FAIL; } - + //通讯开始,唤醒cat1 + uapi_cat1_wakeup_cat1(1); uint8_t *uri = (uint8_t*)argv[0]; uint8_t *otadatapath = (uint8_t*)argv[1]; PRINT("custom_start_ota_download %s to %s\r\n",uri,otadatapath);