KDocs 研发资料库
  • 手表穿戴技术应用文档入口汇总
  • JL707N穿戴客述问题FAQ
  • 彩屏仓 硬件开发指南 与 量产作业流程规范
  • 彩屏仓 AC98N和JL701烧录升级注意事项
  • JL707 硬件开发资料
  • JL707 手表硬件设计注意事项 总结
  • 穿戴生产烧录OTA和key文件添加使用说明
  • JL707N-入门到进阶开发指导文档
  • 彩屏仓982相关
  • 彩屏仓耳机介绍
  • 杰理701_707双屏demo介绍
  • 707电子吧唧开发资料
  • GPIO相关
  • UART串口相关
  • SPI相关
  • nandflash相关
  • norflash相关
  • IIC相关
  • PWM相关
  • SD卡相关
  • 定时器TIMER
  • 文件系统接口设计说明文档
  • 音视频录像开发流程
  • rdec编码器
  • 穿戴功耗数据标准
  • 手表蓝牙开发文档
  • 701蓝牙PAN联网demo
  • BLE开发使用说明
  • 701手表2.0.0版本SDK EQ在线调试和离线调试方法 V1.1
  • JL707 手表喇叭输出声音大小评估方法 V1.0
  • JL707 手表音频EQ调试方法 V1.0
  • AC707N 手表通话写卡 软件配置方法
  • 录音功能
  • 701手表2.X.X系列SDK调试EQ配置方法及音频调试技巧V1.1
  • 701手表104版本SDK EQ在线调试和离线调试方法 V1.1
  • mic2dac示例
  • P11 SensorHub相关
  • 手表升级操作文档
  • AC707NGPU
  • DBI模块介绍
  • GPU模块介绍
  • 701N屏幕驱动配置说明
  • 701N_UI编辑工具用户手册
  • 支付宝资料
  • 支付宝硬件接入资料
  • 支付宝乘车码接入资料
  • CAT1 接入文档
  • 701N_WATCH_CAT1开发说明
  • Findmy功能
  • music模式相关
  • 707电池曲线
  • 707N内置FLASH挂载FAT文件系统251112_v1.2
  • AC707N_本地视频播放demo(AVI-MJPEG-PCM)
  • 光波导屏幕调试
  • 耳机研发和生产流程 指南
  • 707-NandFlash 代码和UI资源独立烧录方案
  • 彩屏仓时间同步补丁
  • 彩屏仓抖音点赞移植
  • 707LVGLv8双屏开发
  • 707N蓝牙互传图传demo
  • AVIPCM数据流接入AIVOICE
  • Flash分区操作demo
  • 手表发射问题
  • 701_707 双备份升级DEMO
  • 707_乘车码刷码失败问题_共性

701N_WATCH_CAT1开发说明

📎 原始文档:https://www.kdocs.cn/l/ctWzatr1raxqimage

701N WATCH

CAT1开发说明

珠海市杰理科技股份有限公司

Zhuhai Jieli Technology Co.,LTD

版权所有,未经许可,禁止外传
imagehttp://www.zh-jieli.com/
image

修改记录

版本更新日期描述
1.02024-3-1建立初始版本

image 目录
一、 概述.............................................................................................................. 5
二、 规格.............................................................................................................. 6
(一) 资源................................................................................................................................................. 6
(二) 功耗................................................................................................................................................. 6
1. 待机功耗(BLE 广播1 秒).................................................................................................... 6
2. 工作功耗(BLE 广播1 秒).................................................................................................... 6
(三) 网速................................................................................................................................................. 7
三、 工程配置...................................................................................................... 8
(一) 功能宏定义..................................................................................................................................... 8
(二) 引脚定义......................................................................................................................................... 8
1. 归芯............................................................................................................................................ 8
2. 展锐............................................................................................................................................ 9
(三) 4G工程下载.................................................................................................错误!未定义书签。
1. 归芯..........................................................................................................错误!未定义书签。
2. 展锐..........................................................................................................错误!未定义书签。
四、 控制............................................................................................................ 10
(一) 电源控制....................................................................................................................................... 10
五、 通话............................................................................................................ 12
(一) CAT1独立通话.............................................................................................................................12
1. 来电.......................................................................................................................................... 12
2. 去电.......................................................................................................................................... 16
3. mic 静音................................................................................................................................... 17
(二) CAT1和BT通话互斥处理..........................................................................................................18
1. CAT1 通话过程中BT来电处理............................................................................................. 18
2. BT通话过程中CAT1 来电处理............................................................................................. 19
六、 短信............................................................................................................ 20
(一) 接受短信.......................................................................................................................................20
(二) 发送短信.......................................................................................................................................21
1. 发送特定短信.......................................................................................................................... 21
2. 发送输入短信.......................................................................................................................... 24
七、 网络............................................................................................................ 25
(一) LWIP 网卡接入.............................................................................................................................25
1. 归芯.......................................................................................................................................... 25
2. 展锐.......................................................................................................................................... 25
3. 网络调试.................................................................................................................................. 25
八、 OTA ............................................................................................................ 27
(一) 编译环境.......................................................................................................................................27
1. 归芯.......................................................................................................................................... 27
2. 展锐.......................................................................................................................................... 27
3. l。g 的输出配置........................................................................................................................ 27
(二) 4G模块固件升级......................................................................................................................... 27
1. 获取4G 模块版本号............................................................................................................... 27
2. 4G 模块固件升级任务............................................................................................................ 29
image

一、概述

http://www.zh-jieli.com/
image

一、概述

1、 本SDK仅提供引脚对接图,其余资料请咨询展锐、 归芯公司获取;
2、 通话、短信、 网络、OTA等功能都已经调通,用户根据需求添加自己的应用,SDK 中有对应的参考;
image

二、规格

http://www.zh-jieli.com/
image

二、规格

(一)资源

RAM空间代码空间
归芯100.375KB248.23KB
展锐84.375KB170.175KB

空间统计包含4G模块代码及应用(通话、 短信、UI);
RAM空间统计方法:开启4G模块后跑到app_main()函数中的RAM大小差异;
代码空间统计方法:开启4G模块后编译生成的app.bin大小差异;

(二)功耗

1.待机功耗(BLE广播1秒)

模块关闭连接待机本底电信连接待机移动连接待机联通连接待机
归芯220uA450uA980uA970uA1.03mA
展锐250uA858uA1.70mA2.04mA1.67mA

功耗测试为整机环境,包含杰理芯片端功耗及外设功耗;归芯功耗测试使用开发板环境(含屏幕);
展锐功耗测试使用样机环境(不含屏幕);

2.工作功耗(BLE广播1秒)

通话
归芯92mA
展锐103mA

环境同待机功耗环境,DAC/MIC空载;使用电信卡,拨打 10000;

(三)网速

上行下行
归芯128KB/s124KB/s
展锐64KB/s65KB/s

搭建杰理服务器验证;
image

三、工程配置

http://www.zh-jieli.com/
image

三、工程配置

(一)功能宏定义

1、 打开TCFG_APP_CAT1_EN使能, 以使用CAT1模块。

  1. #define TCFG_APP_CAT1_EN 0 // 用于4G通话
    2、 根据需要选择CAT1服务商,现支持紫光展锐和归芯。
    image
  2. // cat1服务商
  3. #define TCFG_CAT1_UNISOC_ENABLE DISABLE // 展锐科技
  4. #define TCFG_CAT1_AICXTEK_ENABLE ENABLE // 归芯科技
    3、 根据需要选择CAT1功能,现支持通话、短信、 网络和固件升级功能,其中展锐支持领科ESIM。
    image
  5. #define TCFG_CAT1_FUNC_SMS_ENABLE ENABLE // 短信功能
  6. #define TCFG_CAT1_FUNC_NET_ENABLE ENABLE // 网络功能
  7. #define TCFG_CAT1_MODULE_UPDATE_ENABLE ENABLE // 升级模块
  8. #define UNISOC_ESIM_TEST 0 // 领科ESIM独立APP模式验证

(二)引脚定义

1.归芯

image

  1. #define TCFG_CAT1_AICXTEK_UART_TX IO_PORTA_12 // 串口tx
  2. #define TCFG_CAT1_AICXTEK_UART_RX IO_PORTA_13 // 串口 rx
  3. #define TCFG_CAT1_AICXTEK_GPIO_WKUP IO_PORTA_14 // 唤醒口。被CAT1激活
  4. #define TCFG_CAT1_AICXTEK_GPIO_ACTIVE IO_PORTA_15 // 激活CAT1 5.
  5. #define TCFG_CAT1_AICXTEK_GPIO_POWER IO_PORTC_06 // power_key
    开发板网络:
归芯STA-SPCS-PWRONS-RSTH-PWRONVBAT-GX318
杰理无PC6无VDDIO 3.3VVsystem
归芯WUP-OUTWART-RXUART-TXWUP-IN
杰理PA14PA12PA13PA15

2.展锐

  1. #define TCFG_CAT1_UNISOC_AP_REQ IO_PORTG_00
    image
  2. #define TCFG_CAT1_UNISOC_AP_ACK IO_PORTG_01
  3. #define TCFG_CAT1_UNISOC_CP_REQ IO_PORTG_06
    image
  4. #define TCFG_CAT1_UNISOC_CP_ACK IO_PORTG_07
  5. #define TCFG_CAT1_UNISOC_TP_ACK IO_PORTC_06
  6. #define TCFG_CAT1_UNISOC_CP_PBINT IO_PORTC_07
    image
  7. #define TCFG_HW_SPI2_ENABLE ENABLE_THIS_MOUDLE
  8. #define TCFG_HW_SPI2_PORT_CLK IO_PORTB_11
  9. #define TCFG_HW_SPI2_PORT_DO IO_PORTB_09
  10. #define TCFG_HW_SPI2_PORT_DI IO_PORTB_08
  11. #define TCFG_HW_SPI2_PORT_D2 NO_CONFIG_PORT
  12. #define TCFG_HW_SPI2_PORT_D3 NO_CONFIG_PORT
  13. #define TCFG_HW_SPI2_BAUD 2000000L
  14. #define TCFG_HW_SPI2_MODE SPI_MODE_BIDIR_ 1BIT
  15. #define TCFG_HW_SPI2_ROLE SPI_ROLE_SLAVE

(三)4G工程下载

1.归芯

下载工具请咨询归芯科技获取;
下载包在apps/common/cat1/aicxtek/aic_srv/portable/aic_pkg/ 文件夹中

2.展锐

下载工具请咨询展锐科技获取;
下载包在 apps/common/cat1/unisoc/pac/ 文件夹中
image

四、控制

http://www.zh-jieli.com/
image

四、控制

(一)电源控制

CAT1模块电源可通过上下电函数cat1_set_lte_onoff(int flag)来控制。
(1)归芯,可通过设置-通讯设置-LTE通讯开关,来控制CAT1上下电,也可通过拨号盘按“*”进入工程模式的电源控制选项来控制CAT1上下电。
imageimage

  1. void cat1_set_lte_onoff(int flag)
  2. {​
  3. if (cat1_ status .lte_enable == flag) {​
  4. return ; 5. ​}
    [6.](6. cat1_status.lte_enable = flag)[ cat1_status.lte_enable = flag](6. cat1_status.lte_enable = flag);

8. cat1_set_lte_can_touch(0);

  1. if (flag) {​
  2. aic_ctrl_power_on (flag) ; //归芯上下电接口 [12.](12. call_ctrl_set_call_sel)[ call_ctrl_set_call_sel](12. call_ctrl_set_call_sel)(CALL_SEL_CAT1); //切换通话模式
  3. ​} else {​
  4. aic_ctrl_power_on (flag) ; //归芯上下电接口 [15.](15. call_ctrl_set_call_sel)[ call_ctrl_set_call_sel](15. call_ctrl_set_call_sel)(CALL_SEL_BT); //切换通话模式 16. ​}
  5. ​}
    (2)展锐,可通过设置-通讯设置-LTE通讯开关,来控制CAT1上下电,也可通过拨号盘按“*”进入工程模式的MODEM CTRL选项里的PoweroffModem和Poweron Modem来控制CAT1上下电。
    imageimage
  6. void cat1_set_lte_onoff(int flag)
  7. {​
  8. if (cat1_ status .lte_enable == flag) {​
  9. return ; 5. ​}
    [6.](6. cat1_status.lte_enable = flag)[ cat1_status.lte_enable = flag](6. cat1_status.lte_enable = flag);

8. cat1_set_lte_can_touch(0);

  1. if (flag) {​
  2. //modem 上下电
    [12.](12. cat1_ctrl_poweron)[ cat1_ctrl_poweron](12. cat1_ctrl_poweron)(); // 展锐上下电接口
    [13.](13. cat1_set_lte_call_onoff)[ cat1_set_lte_call_onoff](13. cat1_set_lte_call_onoff)(flag);
    [14.](14. call_ctrl_set_call_sel)[ call_ctrl_set_call_sel](14. call_ctrl_set_call_sel)(CALL_SEL_CAT1); //切换通话模式
  3. ​} else {​
  4. //modem 上下电
    [17.](17. cat1_ctrl_poweroff)[ cat1_ctrl_poweroff](17. cat1_ctrl_poweroff)(); // 展锐上下电接口
    [18.](18. cat1_set_lte_call_onoff)[ cat1_set_lte_call_onoff](18. cat1_set_lte_call_onoff)(flag);
    [19.](19. call_ctrl_set_call_sel)[ call_ctrl_set_call_sel](19. call_ctrl_set_call_sel)(CALL_SEL_BT); //切换通话模式 20. ​} 21. ​}
    image

五、通话

http://www.zh-jieli.com/
image

五、通话

(一)CAT1独立通话

1.来电

(1)接听电话:
可通过cat1_call_answer()接口来进行接听电话操作归芯:
image

  1. bool cat1_call_answer(void)
  2. {​
  3. if (false == cat1_check_call_enable ()) {​ // 检查是否可以进入通话
  4. return false; 5. ​}
    [6.](6. int32_t)[ int32_t](6. int32_t) ret = aic_ srv_tele_call_answer(handleCallCallback); // 归芯接听电话接口
  5. if (ret) {​
  6. log_error ( "aic_srv_tele_call_answer err:%d \n " , ret) ; 9. ​}
  7. return true; 11. ​}
    image 展锐:
  8. bool cat1_call_answer(void)
  9. {​
    [3.](3. int)[ int](3. int) rpc_ret = 0;
    [4.](4. int32_t)[ int32_t](4. int32_t) ret = ual_tele_call_answer_call(&rpc_ret); // 展锐接听电话接口
  10. if (ret == UAL_TELE_CALL_RES_ERROR) {​
  11. log_error ( "ual_tele_call_answer_call error:%d\n " , ret) ;
  12. return false; 8. ​}
  13. return true; 10. ​}
    (2)挂断电话:
    可通过cat1_call_hangup()接口来挂断电话。归芯:
  14. bool cat1_call_hangup(void)
    image
  15. {​ 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
  16. ​}
    if (false == cat1_check_call_enable ()) {​
    return false;​}
    if ([cat1_info.call_status == TS_CALL_STATUS_INCOMING](cat1_info.call_status == TS_CALL_STATUS_INCOMING)) {​
    aic_srv_tele_call_reject(handleCallCallback); // 用于来电时,拒接电话
    ​} else if ([cat1_info.call_status == TS_CALL_STATUS_IDLE](cat1_info.call_status == TS_CALL_STATUS_IDLE)) {​​} else if ([cat1_info.call_status == TS_CALL_STATUS_RELEASED](cat1_info.call_status == TS_CALL_STATUS_RELEASED)) {​​} else {​ uint8_t cur_card_id = TS_CARD_ID_MAX; aic_srv_tele_sim_get_current_card (&cur_card_id);
    aic_srv_tele_call_release (cur_card_id , cat1_info .call_idx , handleCallCallback); // 挂断电话​}
    return true;
    展锐:
    image
  17. bool cat1_call_hangup(void)
  18. {​
    [3.](3. int)[ int](3. int) rpc_ret = 0;
    [4.](4. int32_t)[ int32_t](4. int32_t) status = ual_tele_call_get_current_call_state(&rpc_ret);
  19. log_info ( "%s ,%d \n " , func , LINE ) ;
  20. log_info ( "call state is %d\n " , status) ;
    [7.](7. int32_t)[ int32_t](7. int32_t) ret;
  21. if (status == UAL_TELE_CALL_STATE_INCOMING) {​
  22. ret = ual_tele_call_ reject_call(&rpc_ ret) ; //拒接电话
  23. if (ret == UAL_TELE_CALL_RES_ERROR) {​
  24. log_error ( "ual_tele_call_reject_call error:%d\n " , ret) ;
  25. return false; 13. ​}
  26. ​} else if (status == UAL_TELE_CALL_STATE_NULL) {​​}
  27. else if (status == UAL_TELE_CALL_STATE_OUTGOING || status == UAL_TELE_CALL_STATE_ACTIVE) {​
  28. ual_tele_call_data_info_t *current_call_info = NULL;
  29. current_call_info = malloc (sizeof (ual_tele_call_data_info_t ));
  30. ual_tele_call_get_current_call_info (current_call_info , &rpc_ret) ;

image 20. ret = ual_tele_call_ release_call(current_call_info->call_id , rpc_ret) ; //挂断当前电话
21. if (ret == UAL_TELE_CALL_RES_ERROR) {​
image 22. log_error ( "ual_tele_call_release_call error:%d\n " , ret) ;
image [23.](23. free)[ free](23. free)(current_call_info); 24. return false;
25. ​}
image

[26.](26. free)[ free](26. free)(current_call_info);

  1. ​}
    image
  2. return true;
  3. ​}
    (3)电话号码获取:
    可通过cat1_get_call_phone_num(char **phone_num)接口获取电话号码
    image
  4. bool cat1_get_call_phone_num (char **phone_num) 2. {​
  5. *phone_num = cat1_info .tele_num; 4.
  6. return true; 6. ​}
    (4)来电铃声:归芯:
    image [1.](1. case)[ case](1. case) TS_CALL_STATUS_INCOMING: {​
  7. /* incoming a call ,phone recieve a call */
  8. /* 1 .wheather exist a connected call , if exist , hangup it;if not exist , play local call ring */
  9. if (1 < call_info_list .call_number) {​
    [6.](6. int)[ int](6. int) ret = -1;
  10. uint8_t cur_card_id = TS_CARD_ID_MAX;
  11. aic_srv_tele_sim_get_current_card (&cur_card_id);
  12. ret = aic_srv_tele_call_release (cur_card_id , p_call_status->call_idx , NULL) ;
  13. log_info ( "handleCallCallback ,aic_ srv_tele_call_release return , ret = %d.\ r\n " , ret) ;
  14. return -1;
  15. ​} else {​
  16. if (false == app_cat1_check_ support()) {​
  17. // 当前条件不容许进入通话时,定时检查状态
  18. if (cat1_info .cat1_call_check_tmr == NULL) {​
    [16.](16. cat1_info.cat1_call_check_tmr = sys_timer_add)[ cat1_info.cat1_call_check_tmr = sys_timer_add](16. cat1_info.cat1_call_check_tmr = sys_timer_add)(NULL, cat1_call_check_func, 1000); 17. ​}
  19. break ;
  20. ​}
    [20.](20. app_task_switch_to)[ app_task_switch_to](20. app_task_switch_to)(APP_CAT1_TASK);
  21. /* play local ring */
  22. char *len_l st[TS_CALL_PHONE_NUMBER_LEN_MAX + 4 + 1 ] ; // 电话号码加铃声循环
  23. tone_play_stop();
    image
  24. number_to_play_list((char *)(cat1_info.phone_number), len_lst); // 播放来电铃声
  25. tone_file_list_play(len_l st , 1 ) ;

image 27. UI_ENABLE_PHONEBOOK // 电话本功能
image 28. set_call_log_date(NULL) ;
29. set_call_log_type(2 ) ;
30.
31. u8 call_name [PHONEBOOK_NAME
LEN + 1 ] = {​0 ​} ;
32. if (phonebook_get_name_by_number(cat1_info .phone_number , call_name)) {​
33. set_call_log_name (call_name) ; 34. ​}
35. set_call_log_number((u8 *)cat1_info.phone_number);
36. * #if TCFG_UI_ENABLE_PHONEBOOK / 37. ​} 38.
39. /
[2. to](2. to) ui task,display incoming call win */
40. ​}
41. break ;
展锐:
image [1.](1. case)[ case](1. case) MSG_UAL_TELE_CALL_MT_START_IND: //来电建立请求
2. ual_tele_call_mt_ start_ind_t *call_mt_start = {​0 ​} ;
[3.](3. call_mt_start =)[ call_mt_start =](3. call_mt_start =) (ual_tele_call_mt_start_ind_t *)(param.p_body);
[4.](4. cat1_info.call_id = call_mt_start-)[ cat1_info.call_id = call_mt_start-](4. cat1_info.call_id = call_mt_start-)>call_id;
5. memcpy(cat1_info .tele_num , call_mt_start->tele_num , sizeof (cat1_info .tele_num));
6. log_info ( "tele:MSG_UAL_TELE_CALL_MT_START_IND\n " ) ;
7.
[8.](8. call_number = ual_tele_call_get_call_count)[ call_number = ual_tele_call_get_call_count](8. call_number = ual_tele_call_get_call_count)(&rpc_ ret); //需要获取当前通话数量
9. if (call_number > 1 ) {​
10. ual_tele_call_ release_call(cat1_info.call_id, &rpc_ret); //挂断当前来电
11. return -1;
12. ​} else {​
13. if (false == app_cat1_check_support()) {​
14. // 当前条件不容许进入通话时,定时检查状态
15. if (cat1_info .cat1_call_check_tmr == NULL) {​
[16.](16. cat1_info.cat1_call_check_tmr = sys_timer_add)[ cat1_info.cat1_call_check_tmr = sys_timer_add](16. cat1_info.cat1_call_check_tmr = sys_timer_add)(NULL, cat1_call_check_func, 1000);
17. ​}
18. break ;
19. ​}

20.image
app_task_ switch_to(APP_CAT1_TASK) ;
21.
22.image
/* play local ring */
23.number_to_play_list((char * ) (cat1_info .tele_num) , len_lst) ;// 播放来电铃声

image

24. tone_file_list_play(len_l st , 1 ) ;

  1. #if TCFG_UI_ENABLE_PHONEBOOK // 电话本功能
  2. set_call_log_date(NULL) ;
  3. set_call_log_type(2 ) ;

image 30. u8 call_name [PHONEBOOK_NAME_LEN + 1 ] = {​0 ​} ;
31. if (phonebook_get_name_by_number (cat1_info .tele_num , call_name)) {​
32. set_call_log_name (call_name) ; 33. ​}
34. set_call_log_number((u8 * )cat1_info .tele_num) ;
35. #endif /* #if TCFG_UI_ENABLE_PHONEBOOK */
36. #if TCFG_UI_ENABLE_MOTO
37. UI_MOTO_RUN(1 ) ;
38. #endif 39. ​}
40. break ;

2.去电

(1)拨打电话

可通过cat1_call_number(int number_len, char *number)来拨打电话,其中int number_len为电话号码长度, char *number为电话号码。
归芯:
image

  1. bool cat1_call_number(int number_len , char *number)
  2. {​
  3. if (false == cat1_check_call_enable ()) {​
  4. return false; 5. ​}
  5. log_info ( "%s ,num :% s \n " , func , number) ; 7.
  6. ts_call_dial_info_t dial_info = {​0 ​} ;
  7. if (number_len > TS_CALL_PHONE_NUMBER_ LEN_MAX) {​
  8. number_len = TS_CALL_PHONE_NUMBER_ LEN_MAX; 11. ​}
  9. memcpy(dial_info.phone_number, number, number_len);
  10. /* dial_info .card_id = 0 ; */
    [14.](14. int32_t)[ int32_t](14. int32_t) ret = aic_ srv_tele_call_dial(&dial_info, handleCallCallback); //归芯拨打电话接口
  11. if (ret) {​
  12. log_error ( "aic_srv_tele_call_dial err:%d \n " , ret) ;
  13. ​}
  14. return true;
  15. ​}
    展锐:
  16. bool cat1_call_number(int num_len , char *number)
    image
  17. {​
    [3.](3. int)[ int](3. int) rpc_ret = 0;
    image
  18. if (num_len > UAL_TELE_CALL_TELE_NUM_MAX) {​
    image
  19. num_len = UAL_TELE_CALL_TELE_NUM_MAX; 6. ​}
    [7.](7. int32_t)[ int32_t](7. int32_t) ret = ual_tele_call_make_call(0, number, &rpc_ret); // 展锐拨打电话接口
  20. if (ret == UAL_TELE_CALL_RES_SUCCESS) {​
  21. log_info ( "ual_tele_call_make_call success:%d\n " , ret) ;
  22. return true; 11. ​}
  23. return false; 13. ​}

3.mic静音

可通过cat1_call_input_mute(u8 mute)来使能mic静音功能,其中mute为1代表静音,0代表非静音。归芯:
image

  1. void cat1_call_input_mute(u8 mute) 2. {​
  2. aic_audio_input_clear_enable (mute) ; 4. ​}
    image 展锐:
  3. void cat1_call_input_mute(u8 mute) 2. {​
  4. if (mute) {​
  5. set_mic_mute();
    [5.](5. cat1_info.is_mic_mute = 1)[ cat1_info.is_mic_mute = 1](5. cat1_info.is_mic_mute = 1); 6. ​} else {​
  6. clear_mic_mute();
    [8.](8. cat1_info.is_mic_mute = 0)[ cat1_info.is_mic_mute = 0](8. cat1_info.is_mic_mute = 0); 9. ​} 10. ​}

(二)CAT1和BT通话互斥处理

1.CAT1通话过程中BT来电处理

在CAT1通话过程中,不响应BT来电

image [1.](1. case)[ case](1. case) BT_STATUS_PHONE_ACTIVE:
2. log_info ( "BT_STATUS_PHONE_ACTIVE\n " ) ;
3. //当手机app与手表传输过程中不能响应通话事件
4. if ( this->smartbox_watch_upgrade_flag) {​
5. break ; 6. ​}
7. #if TCFG_APP_CAT1_EN
8. if (APP_CAT1_TASK == app_get_curr_task ()) {​ // cat1通话中,不响应
9. break ; 10. ​}
11. #endif /* #if TCFG_APP_CAT1_EN */
image [1.](1. case)[ case](1. case) BT_STATUS_PHONE_HANGUP:
2. log_info ( " BT_STATUS_PHONE_HANGUP\n " ) ;
3. //当手机app与手表传输过程中不能响应通话事件
4. if ( this->smartbox_watch_upgrade_flag) {​
5. // 添加这个判断是防止升级过程中出现挂断多次电话的情况
6. if (app_get_curr_task () != APP_SMARTBOX_ACTION_TASK) {​
7. this->smartbox_watch_upgrade_flag = 0 ; 8. ​}
9. break ; 10. ​}
11. #if TCFG_UI_ENABLE_MOTO
12. UI_MOTO_RUN(0 ) ;
13. #endif
[14.](14. bt_status_phone_hangup)[ bt_status_phone_hangup](14. bt_status_phone_hangup)(bt);
15. set_bt_esco_by_watch (0 ) ;
16. #if TCFG_UI_ENABLE
17. if (UI_GET_WINDOW_ID() != ID_WINDOW_PHONE) {​//判断手表在来电界面,退出界面
18. break ; 19. ​}
20. #if TCFG_APP_CAT1_EN
21. if (APP_CAT1_TASK == app_get_curr_task ()) {​ // cat1通话中,不响应

22.image
break ;
23.​}
24.#endif /* #if TCFG_APP_CAT1_EN */
25.ui_hide_main (ID_WINDOW_PHONE) ;

image 26. #endif /* #if TCFG_UI_ENABLE */

2.BT通话过程中CAT1来电处理

在BT通话过程中,不响应CAT1来电。
image [1.](1. int)[ int](1. int) app_cat1_check_support(void)
2. {​
3. u8 cur_task = app_get_curr_task ();
4. switch (cur_task) {​
[5.](5. case)[ case](5. case) APP POWERON TASK:
[6.](6. case)[ case](6. case) APP_POWEROFF_TASK:
[7.](7. case)[ case](7. case) APP WATCH UPDATE TASK:
[8.](8. case)[ case](8. case) APP_SMARTBOX_ACTION_TASK:
9. log_error ( "cur task :%d no support \n " , cur_task);
10. return false;
11. /* break ; */
12. default :
13. break ; 14. ​}
15. if (bt_must_work ()) {​ // 在蓝牙通话中,不响应cat1通话
16. log_error ( "bt busy \n " ) ;
17. return false; 18. ​}
19. return true;

20. ​}

image

六、短信

http://www.zh-jieli.com/
image

六、短信

(一)接受短信

归芯:
归 芯 的 短 信 接 收 在 cat1_aicxtek.c 文 件 中, 位 于 handleSmsCallback()回 调 函 数 的 TS_EVENT_SMS_READ_IN_SIM_RESP事件中获取短信内容、 时间、发件人等信息。
image [1.](1. case)[ case](1. case) TS_EVENT_SMS_READ_IN_SIM_RESP: {​
2. ts_ sms_read_in_sim_resp_t *p_sim = (ts_sms_read_in_sim_ resp_t * )p_param;
3. char *text = (char * ) (&p_ sim->text_start) ;
4. //在工模接收消息,不存flash,直接在工模送显
5. if (cat1_get_engineering_mode () == 1 ) {​
6. memcpy(cat1_ sms_info .number , p_sim->number , strlen(p_sim->number) + 1 ) ;
7. memcpy(cat1_ sms_info .content , text , strlen(text) + 1 ) ;
8. UI_MSG_POST( " sms_show " ) ;
9. ​} else {​
10. log_info ( "%s TS_EVENT_SMS_READ_IN_SIM_RESP , index :%d , textstart:0x%x \n " , func , 11. p_sim->index , p_sim->text_ start) ;
12. log_info ( "date:%d ,%d ,%d , time :%d ,%d ,%d \n " , p_sim->time_stamp.year ,
13. p_sim->time_ stamp.month, p_sim->time_stamp.day, p_sim->time_stamp.hour, 14. p_sim->time_ stamp.min , p_sim->time_ stamp.sec) ;
15. if (p_sim->text_start) {​
16. log_info ( "TS_EVENT_SMS_READ_IN_SIM_RESP , text:%s \n " , text) ;
17. void *msg = notice_info_create();
18. if (msg) {​
19. struct sys_time curtime;
20. curtime .year = p_sim->time_ stamp.year;
21. curtime .month = p_sim->time_ stamp.month ;
[22.](22. curtime.day = p_sim-)[ curtime.day = p_sim-](22. curtime.day = p_sim-)>time_stamp.day;
23. curtime .hour = p_sim->time_ stamp.hour;
24. curtime .min = p_sim->time_ stamp.min;
25. curtime .sec = p_sim->time_ stamp .sec;
26. u32 TimeStamp = timestamp_mytime_2_utc_ sec(&curtime) ;
27. notice_set_info_from (msg , "UID " , &TimeStamp , sizeof (TimeStamp));
28. notice_set_info_from (msg , "AppIdentifier " , "MobileSMS_RECEIVE " ,
29. sizeof ( "MobileSMS_RECEIVE " ));
30. notice_set_info_from (msg , "IDTitle " , p_sim->number , TS_SMS_NUM_MAX_LEN + 1 ) ;
31. notice_set_info_from (msg , "IDMessage " , text , strlen(text) + 1 ) ;
32. notice_add_info_from (msg) ;

33.image
notice_info_ release(msg) ;
34.UI_MSG_POST( "cat1_event:SMS=%4 " , 1 ) ;
35.image
​}
36.​}

image 37. ​}
[38.](38. int32_t)[ int32_t](38. int32_t) p_indexes[1 ] ;
39. p_indexes [0 ] = p_sim->index;
40. aic_srv_tele_sms_del_in_sim (p_sim->base_info .card_id , p_indexes , 1 , handleSmsCallback); 41. ​}
展锐:
展锐的短信接收在cat1_unisoc.c 的文件中,位于handleSMSCallback()回调函数的 MSG_UAL_TELE_SMS_RECEIVE_IND事件中获取短信内容、 时间、发件人等信息。
image [1.](1. case)[ case](1. case) MSG_UAL_TELE_SMS_RECEIVE_IND: // 获取信息内容
2. ual_tele_ sms_receive_ind_t *sms_receive_ind ;
3. sms_receive_ind = (ual_tele_sms_receive_ind_t * ) (param.p_body ) ; 4.
5. log_info ( "SMS RECEIVE ! !\n " ) ; 6.
7. char content[UAL_TELE_SMS_CONTENT_MAX_LEN] ;
[8.](8. int)[ int](8. int) len = Unicode2UTF8(content, sms_ receive_ind->content, (sms_receive_ind->content_len)*2); 9. content[len] = ' \0 ' ;
10.
[11.](11. int)[ int](11. int) utc_time = sms_receive_ind->time; 12.
13. void *msg = notice_info_create();
14. if (msg) {​
15. notice_set_info_from (msg , "UID " , &utc_time , sizeof (utc_time));
16. notice_set_info_from (msg , "AppIdentifier " , "MobileSMS_RECEIVE " ,
17. sizeof ( "MobileSMS_RECEIVE " ));
18. notice_set_info_from (msg , "IDTitle " , sms_receive_ind->sender_address ,
19. strlen (sms_receive_ind->sender_address) + 1 ) ;
20. notice_set_info_from (msg , "IDMessage " , content , strlen (content) + 1 ) ;
21. notice_add_info_from (msg) ; // 添加短信并送显
22. notice_info_ release(msg) ; 23. ​}
24. break ;

(二)发送短信

1.发送特定短信

现支持发送预制短信,需要先写入预制短信内容:
image

  1. const unsigned char sms_tab [15 + 1 ] = {​
  2. 0xE5 , 0xA5 , 0xBD , 0xE7 , 0x9A , 0x84 , 0xEF , 0xBC , 0x8C , 0xE6 , 0x94 , 0xB6 , 0xE5 , 0x88 , 0xB0 , 0x00
  3. ​} ; //好的,收到
    image

image 5. const unsigned char sms_tab1 [9 + 1 ] = {​
6. 0xE4 , 0xB8 , 0x80 , 0xE4 , 0xBC , 0x9A , 0xE8 , 0xA7 , 0x81 , 0x00
7. ​} ; //一会见 8.
9. const unsigned char sms_tab2 [18 + 1 ] = {​
10. 0xE7 , 0xA8 , 0x8D , 0xE7 , 0xAD , 0x89 , 0xEF , 0xBC , 0x8C , 0xE9 , 0xA9 , 0xAC , 0xE4 , 0xB8 , 0x8A , 0xE5 , 11. 0x88 , 0xB0 , 0x00
12. ​} ; //稍等,马上到 13.
14. const unsigned char sms_tab3 [21 + 1 ] = {​
15. 0xE5 , 0x9C , 0xA8 , 0xE5 , 0xBF , 0x99 , 0xEF , 0xBC , 0x8C , 0xE7 , 0xA8 , 0x8D , 0xE5 , 0x90 , 0x8E , 0xE8 , 16. 0x81 , 0x94 , 0xE7 , 0xB3 , 0xBB , 0x00
17. ​} ; //在忙,稍后联系 18.
19. const unsigned char sms_tab4 [6 + 1 ] = {​
20. 0xE6 , 0x98 , 0xAF , 0xE7 , 0x9A , 0x84 , 0x00
21. ​} ; //是的 22.
23. const unsigned char sms_tab5 [9 + 1 ] = {​
24. 0xE4 , 0xB8 , 0x8D , 0xE6 , 0x98 , 0xAF , 0xE7 , 0x9A , 0x84 , 0x00
25. ​} ; //不是的 26.
27. const unsigned char sms_tab6 [6 + 1 ] = {​
28. 0xE8 , 0xB0 , 0xA2 , 0xE8 , 0xB0 , 0xA2 , 0x00
29. ​} ; //谢谢
调用cat1_send_sms(int number_len, char *number, int content_len, char *content)发送短信,其中number_len 为电话号码长度,number为电话号码,content_len为短信内容长度,content为短信内容。
归芯:
image [1.](1. int)[ int](1. int) cat1_send_sms(int number_len, char *number, int content_len, char *content) 2. {​
[3.](3. int)[ int](3. int) res;
4. char *p_number = malloc(TS_SMS_NUM_MAX_LEN) ;
5. char *p_text = malloc (TS_SMS_PDU_MAX_LEN) ;
6.
7. if (number_len >= TS_SMS_NUM_MAX_LEN) {​
8. number_len = TS_SMS_NUM_MAX_ LEN - 1 ;
9. ​}
10. memcpy(p_number , number , number_len) ;
11. p_number [number_len] = ' \0 ' ;
image 12. log_info ( " sms number:%s\n " , p_number) ;
13.
image 14. if (content_len >= TS_SMS_PDU_MAX_LEN) {​
15. content_len = TS_SMS_PDU_MAX_LEN - 1 ;
image 16. ​}

17. memcpy(p_text , content , content_len) ;

image 18. p_text[content_len] = ' \0 ' ;
19. log_info ( " sms content:% s\n " , p_text) ; 20.
21. // 归芯发送短信需要填写的结构体
22. ts_ sms_send_info_t sms_info = {​0 ​} ;
[23.](23. sms_info.is_write_to_sim = false)[ sms_info.is_write_to_sim =](23. sms_info.is_write_to_sim = false)[ false](23. sms_info.is_write_to_sim = false);
24. sms_info .p_smsc = NULL;
25. sms_info .p_number = p_number;
26. sms_info .p_text = p_text;
27. res = aic_ srv_tele_sms_send (0 , &sms_info , handleSmsCallback); // 归芯发送短信接口 28.
[29.](29. free)[ free](29. free)(p_number);
[30.](30. free)[ free](30. free)(p_text); 31.
32. return res; 33. ​}
展锐:
image [1.](1. int)[ int](1. int) cat1_send_sms(int number_len, char *number, int content_len, char *content)
2. {​
[3.](3. int)[ int](3. int) rpc_ret = 0;
4. ual_tele_ sms_send_param_t sms_send_param_t = {​0 ​} ;
5. sms_send_param_t .dest_address .number_list_count = 1 ;
6. if (number_len >= UAL_TELE_SMS_NUMBER_MAX_LEN) {​
7. number_len = UAL_TELE_SMS_NUMBER_MAX_LEN - 1 ; 8. ​}
9. memcpy(sms_send_param_t .dest_address .number_addr [0 ], number , number_len) ; 10.
11. unsigned short *send_content = malloc (UAL_TELE_SMS_CONTENT_MAX_LEN * sizeof (unsigned short));
12. if (content_len >= UAL_TELE_SMS_CONTENT_MAX_ LEN) {​
13. content_len = UAL_TELE_SMS_CONTENT_MAX_ LEN - 1 ; 14. ​}
[15.](15. int)[ int](15. int) send_content_len = UTF82Unicode(content, send_content, content_len);
16. sms_send_param_t .content_len = send_content_len * 2 ;
17. memcpy(sms_send_param_t .content , send_content , send_content_len * 2 ) ; 18.
[19.](19. int)[ int](19. int) res = ual_tele_ sms_send(&sms_ send_param_t, &rpc_ret); // 展锐发送短信接口
image 20.
[21.](21. free)[ free](21. free)(send_content);
22.
23. return true;
24. ​}

2.发送输入短信

现支持输入字母、数字、符号,并可发送输入的内容。编制输入短信的代码位于ui_action_notice.c,
image [1.](1. case)[ case](1. case) CAT1_PIC_INPUT_ 1:
2. log_info ( "CAT1_PIC_INPUT_1 UP\n " ) ;
3. if (cat1_ send_sms_info->input_index == 0 ) {​
4. sms_content_add( 'a ' ) ; // 添加字符
5. ​} else if (cat1_ send_sms_info->input_index == 1 ) {​
6. sms_content_add( 'l ' ) ;
7. ​} else if (cat1_ send_sms_info->input_index == 2 ) {​
8. sms_content_add( 'w ' ) ;
9. ​} else if (cat1_ send_sms_info->input_index == 3 ) {​
10. sms_content_add( '1 ' ) ;
11. ​} else if (cat1_ send_sms_info->input_index == 4 ) {​
12. sms_content_add( ' , ' ) ; 13. ​}
14. break ;
image [1.](1. case)[ case](1. case) CAT1_PIC_INPUT_SURE: // 设置要发送的内容
2. log_info ( "CAT1_PIC_INPUT_SURE UP\n " ) ;
[3.](3. cat1_set_send_sms_content)[ cat1_set_send_sms_content](3. cat1_set_send_sms_content)(cat1_ send_ sms_info->input_content.content, 4. 0 , cat1_send_sms_info->input_content .index + 1 ) ;
5. memcpy(& (cat1_ send_sms_info->input_content) , 0 , sizeof (cat1_ send_sms_info->input_content))
;
[6.](6. cat1_send_sms_info-)[ cat1_send_sms_info-](6. cat1_send_sms_info-)>input_content.index = 0;
7. ui_hide (CAT1_LAYOUT_SMS_INPUT_SYSTEM) ;
8. ui_ show(CAT1_LAYOUT_SMS_SURE) ;

9. break ;

image

七、 网络

http://www.zh-jieli.com/
image

七、 网络

(一)LWIP 网卡接入

1.归芯

归芯4G模块上电时可直接使用网络服务,暂无关闭网络服务的接口。

2.展锐

可调用cat1_set_lte_net_onoff(int flag)来注册和去注册展锐的网络服务,flag表示是否注册网络服务, 1表示注册,0表示去注册。
image

  1. void cat1_set_lte_net_onoff(int flag)
  2. {​
    [3.](3. int)[ int](3. int) rpc_ret;
    [4.](4. cat1_status.lte_net_enable = flag)[ cat1_status.lte_net_enable = flag](4. cat1_status.lte_net_enable = flag);
    [5.](5. int)[ int](5. int) res;
  3. if (flag == 0 ) {​
    [7.](7. int)[ int](7. int) data_res = ual_tele_data_deactive(0, &rpc_ret); // 展锐数据服务去激活
  4. log_info ( "data res:%d\n " , data_res) ;
  5. res = ual_tele_data_unregister(cat1_info .client_data_handle , &rpc_ret) ;// 展锐网络监控去注册
  6. log_info ( "data unregister !\n " ) ;
  7. ​} else {​
    [12.](12. int)[ int](12. int) data_res = ual_tele_data_active(0, &rpc_ret); // 展锐数据服务激活
  8. log_info ( "data res:%d\n " , data_res) ;
  9. res = ual_tele_data_ register(handleDataCallback , &cat1_info .client_data_handle , &rpc_ret) ;
  10. log_info ( "data register !\n " ) ; 16. ​} 17. ​}

3. 网络调试

可仿照lte_network_test.c 的例程进行网络调试。

  1. static void lte_network_test_task (void *priv )
2.image
{​
3.#ifdef PING_TEST
4.ping_init ( "120 .24 .247 .138 " , 1000 , 10 , NULL , NULL) ;
5. #endif

image 6.
7. #ifdef TCP_TEST
image

8. tcp_client_test();

  1. #endif
    image
  2. #ifdef DNS_TEST
    image
  3. ip_addr_t host_ip;
  4. dns_gethostbyname("www.taobao.com", &host_ip, dns_found, NULL);
  5. #endif 15.
  6. #ifdef HTTP_TEST
  7. http_download("https://profile.jieliapp.com/");
  8. #endif 19.
  9. #ifdef HOST_TEST
    [21.](21. host_test)[ host_test](21. host_test)("www.taobao.com");
  10. #endif
  11. for ( ;😉 {​
  12. os_time_dly (100 * 60 * 60) ; 25. ​} 26. ​} 27.
  13. void lte_network_test(void)
  14. {​
  15. os_task_create(lte_network_test_task , NULL , 6 , 0x600 , 0 , "lte_network_test_task " ) ;
    image

八、OTA

http://www.zh-jieli.com/
image

八、OTA

(一)编译环境

1.归芯

使能归芯4G模块的固件升级功能
image

  1. #define TCFG_CAT1_MODULE_UPDATE_ENABLE ENABLE // 支持cat1模块的固件升级

2.展锐

使能展锐4G模块的固件升级功能
2. #define TCFG_CAT1_MODULE_UPDATE_ENABLE ENABLE // 支持cat1模块的固件升级

3.log 的输出配置

4G模块升级功能的log输出配置
image

  1. const char log_tag_const_v_CAT1_UPDATE AT( . LOG_TAG_CONST) = FALSE;
  2. const char log_tag_const_i_CAT1_UPDATE AT( . LOG_TAG_CONST) = FALSE;
  3. const char log_tag_const_d_CAT1_UPDATE AT( . LOG_TAG_CONST) = FALSE;
  4. const char log_tag_const_w_CAT1_UPDATE AT( . LOG_TAG_CONST) = FALSE;
  5. const char log_tag_const_e_CAT1_UPDATE AT( . LOG_TAG_CONST) = TRUE;
    image
  6. const char log_tag_const_v_SMART_CAT1 AT( . LOG_TAG_CONST) = FALSE;
  7. const char log_tag_const_i_SMART_CAT1 AT( . LOG_TAG_CONST) = FALSE;
  8. const char log_tag_const_d_SMART_CAT1 AT( . LOG_TAG_CONST) = FALSE;
  9. const char log_tag_const_w_SMART_CAT1 AT( . LOG_TAG_CONST) = FALSE;
  10. const char log_tag_const_e_SMART_CAT1 AT( . LOG_TAG_CONST) = TRUE;

(二)4G模块固件升级

1.获取4G模块版本号

cat1_module_update_init 接口会开启4G模块电源并保存模块的版本号,并且检查4G模块是否存在升级异常,然后关闭模块电源
image

  1. void cat1_module_update_init (void) 2. {​
    [3.](3. cat1_module_state_set)[ cat1_module_state_set](3. cat1_module_state_set)(GET_MODULE_VER);
  2. if (cat1_module_get_power_ state() == CAT1_POWER_STATE_POWEROFF) {​
    image
  3. // 启动电源
    [7.](7. cat1_ctrl_poweron)[ cat1_ctrl_poweron](7. cat1_ctrl_poweron)();
  4. // 创建定时器去检测是否可以获取版本号
  5. if (cat1_module_state_match (GET_MODULE_VER)) {​
    [10.](10. cat1_module_get_version_timer)[ cat1_module_get_version_timer](10. cat1_module_get_version_timer)(NULL); 11. ​}
  6. ​} else if (cat1_module_get_power_ state() == CAT1_POWER_STATE_POWERON) {​
  7. // 可以直接获取版本号
    [14.](14. cat1_module_save_version)[ cat1_module_save_version](14. cat1_module_save_version)();
  8. ​} else {​
    [16.](16. cat1_module_state_clr)[ cat1_module_state_clr](16. cat1_module_state_clr)(GET_MODULE_VER);
  9. log_error ( "cat1 module state not support get version\n " ) ; 18. ​}
  10. // 检查是否存在升级异常
    [20.](20. cat1_module_check_update_exception)[ cat1_module_check_update_exception](20. cat1_module_check_update_exception)(); 21. ​}

cat1_module_get_version 接口可以获取4G模块的版本号(字符串)

image

  1. char *cat1_module_get_version(void)
  2. {​
  3. u8 *ret = NULL;
  4. u16 ver_len = cat1_module_get_version_total_len();
  5. if (cat1_module_state_match (GET_MODULE_VER_OK)) {​
  6. ret = cat1_update .cat1_version;
  7. ​} else if (cat1_update .update_flag == CAT1_UPDATE_BEGIN_FLAG) {​ // flash保存的版本号不为空以及上一次升级失败了
  8. u8 *tmp_ver_p = (u8 * )zalloc(ver_len) ; 10.
  9. if (syscfg_read (CFG_CAT1_UPDATE_CAT1_VER , tmp_ver_p , ver_len) != ver_len) {​
  10. log_error ( "%s version read err\n " , func ) ;
  11. ret = NULL;
  12. ​} else {​
  13. if (cat1_update .cat1_version == NULL) {​
  14. cat1_update .cat1_version = zalloc (ver_len) ; // 不释放
  15. if (cat1_update .cat1_version == NULL) {​
  16. log_error ( "cat1_version zalloc err !!!\n " ) ;
    [19.](19. free)[ free](19. free)(tmp_ver_p);
  17. return NULL;
    image
  18. ​} 22. ​}
  19. memcpy(cat1_update .cat1_version , tmp_ver_p , ver_len) ;
  20. ret = cat1_update .cat1_version;
  21. ​}
    image [26.](26. free)[ free](26. free)(tmp_ver_p); 27. ​} 28.
  22. return ret; 30. ​}

2.4G模块固件升级任务

cat1_module_update_task 处理升级流程的各种状态、事件

image

  1. void cat1_module_update_task (void *p )
  2. {​
    [3.](3. int)[ int](3. int) msg [3 ] ;
    [4.](4. int)[ int](4. int) ret = 0;
  3. os_time_dly (2 ) ;//让出 cpu去回复ble消息
  4. log_info ( "cat1_module_update_task\n " ) ;
  5. while (1 ) {​
  6. if (os_taskq_pend (NULL , msg , sizeof (msg)) != OS_TASKQ) {​
  7. log_error ( "%s msg err\n " , func , LINE ) ;
  8. continue; 12. ​}
  9. if (msg[0 ] != Q_MSG) {​
  10. log_error ( "%s msg err %d\n " , func , LINE ) ;
  11. continue; 16. ​}
  12. log_debug( "cat1 update task msg 0x%x\n " , msg[1 ] ) ;
  13. switch (msg [1 ] ) {​
    [19.](19. case)[ case](19. case) CAT1_UPDATE_MSG_SUCC:
  14. break ;
    [21.](21. case)[ case](21. case) CAT1_UPDATE_MSG_FAIL:
  15. break ;
    [23.](23. case)[ case](23. case) CAT1_UPDATE_MSG_TIMEOUT:
  16. break ;

[25.](25. case)[ case](25. case) CAT1_UPDATE_MSG_DATA_TRANS_END:

image 26. puts( "CAT1_UPDATE_MSG_DATA_TRANS_END\n " ) ;
27. if (msg[2 ] == 0 ) {​ // msg[2 ] == 0 表示大数据传输成功
image 28. ret = cat1_module_fota_end ();
image 29. if (ret == 0 ) {​
30. log_info ( "aic fota update succ !\n " ) ;
31. smartbox_command_ set_cmd_notify_cat1_update_result (CAT1_UPDATE_STATE_END , CAT1_UPDATE_RESULT_SUCC) ;
image

32. ​} else {​

  1. log_debug( "aic fota update failed (ret=%d) , retry later ! %d\n " , ret , msg[2 ] ) ;
    image
  2. smartbox_command_ set_cmd_notify_cat1_update_result (CAT1_UPDATE_STATE_END , CAT1_UPDATE_RESULT_FAIL) ;
  3. ​}
    [36.](36. cat1_module_state_set)[ cat1_module_state_set](36. cat1_module_state_set)(MODULE_UPDATE_END);
  4. ​} else {​
  5. log_debug( "aic fota update failed (ret=%d) , retry later ! %d\n " , ret , msg[2 ] ) ;
  6. smartbox_command_set_cmd_notify_cat1_update_result (CAT1_UPDATE_STATE_END , CAT1_UPDATE_RESULT_FAIL) ;
  7. ret = 1 ; 41. ​}
  8. os_time_dly (20) ; // 让出 cpu给ble发送数据,经验值
  9. goto cat1_update_end ;
    [44.](44. case)[ case](44. case) CAT1_UPDATE_MSG_START:
  10. puts( "CAT1_UPDATE_MSG_START\n " ) ;
  11. if (cat1_module_state_match (MODULE_UPDATE_START) && \
  12. (msg[2 ] == CAT1_UPDATE_RESULT_SUCC)) {​
  13. // 通知升级开始
  14. smartbox_command_set_cmd_notify_cat1_update_result (CAT1_UPDATE_STATE_START , CAT1_UPDATE_RESULT_SUCC) ;
  15. if (cat1_update .timer == 0 ) {​
    [51.](51. cat1_update.timer = sys_timeout_add)[ cat1_update.timer = sys_timeout_add](51. cat1_update.timer = sys_timeout_add)(NULL, cat1_module_update_data_trans_timeout, CAT1_DATA_TRANS_TIMEOUT) ;
  16. ​}
  17. ​} else {​
  18. // 升级失败
  19. smartbox_command_set_cmd_notify_cat1_update_result (CAT1_UPDATE_STATE_END , CAT1_UPDATE_RESULT_FAIL) ;
  20. ret = 1 ;
  21. goto cat1_update_end ; 58. ​}
  22. break ;
    [60.](60. case)[ case](60. case) CAT1_UPDATE_MSG_BT_DISCONNECT:
  23. puts( "CAT1_UPDATE_MSG_BT_DISCONNECT\n " ) ;
    [62.](62. cat1_module_state_set)[ cat1_module_state_set](62. cat1_module_state_set)(MODULE_UPDATE_BT_DISCONNECT);
  24. ret = 1 ;
  25. goto cat1_update_end ;
    [65.](65. case)[ case](65. case) CAT1_UPDATE_MSG_STARTING:
  26. puts( "CAT1_UPDATE_MSG_STARTING\n " ) ;
  27. if (cat1_update .update_flag != CAT1_UPDATE_BEGIN_FLAG) {​
    image [68.](68. cat1_update.update_flag = CAT1_UPDATE_BEGIN_FLAG)[ cat1_update.update_flag = CAT1_UPDATE_BEGIN_FLAG](68. cat1_update.update_flag = CAT1_UPDATE_BEGIN_FLAG);
  28. if (syscfg_write(CFG_CAT1_UPDATE_FLAG_ID , &cat1_update .update_flag , sizeof (cat1_update .update_flag)) != sizeof (cat1_update .update_flag)) {​
    imageimage
  29. ​}
    image
  30. ​}
  31. if (cat1_module_update_call_disable () == 0 ) {​
  32. log_error ( "cat1 disable call err\n " ) ;
  33. ret = 1 ;
    [77.](77. cat1_module_post_update_result)[ cat1_module_post_update_result](77. cat1_module_post_update_result)(CAT1_UPDATE_MSG_START, CAT1_UPDATE_RESULT_FAIL);
  34. break ; 79. ​}
  35. #if SMART_BOX_EN
  36. extern void app_smartbox_prepare_update_ex_flash (void);
    [83.](83. app_smartbox_prepare_update_ex_flash)[ app_smartbox_prepare_update_ex_flash](83. app_smartbox_prepare_update_ex_flash)();
  37. #endif
  38. // 注册大数据传输回调函数
    [86.](86. cat1_module_update_bt_recv_data_register)[ cat1_module_update_bt_recv_data_register](86. cat1_module_update_bt_recv_data_register)(cat1_update.cb_priv, cat1_module_update_data_recv_callback);
  39. // 阻塞式等待电源启动完毕,会先产生AIC_CTRL_STATE_FOTA状态回调,再执行完该函数
  40. ret = cat1_module_fota_ start(cat1_update .fw_pack_size , CAT1_MODULE_START_UPDATE_TIMEOUT) ;

​}
if (ret) {​
log_error ( "aic start update err %d , or start timeout\n " , ret) ;
cat1_module_post_update_result (CAT1_UPDATE_MSG_START , CAT1_UPDATE_RESULT_FAIL) ;​} else {​
// 对于升级时断开蓝牙连接的情况,可能出现不会产生AIC_CTRL_STATE_FOTA 回调的问题
if (cat1_module_state_match (MODULE_UPDATE_STARTING)) {​ cat1_module_ state_set(MODULE_UPDATE_START) ; cat1_module_post_update_result (CAT1_UPDATE_MSG_START , CAT1_UPDATE_RESULT_SUCC) ;​}​} break ; default : puts( "msg undefined!\n " ) ; break ;​}
105.

106.image
cat1_update_end :
107.if (ret) {​
108.image
cat1_module_ state_set(MODULE_UPDATE_FAIL) ;
109.​} else {​

image [110.](110. cat1_module_state_set)[ cat1_module_state_set](110. cat1_module_state_set)(MODULE_UPDATE_SUCC);
111. ​}
image 112. if (cat1_update .timer) {​
113. sys_timeout_del (cat1_update .timer) ;
image [114.](114. cat1_update.timer = 0)[ cat1_update.timer = 0](114. cat1_update.timer = 0);
image 115. ​}
[116.](116. cat1_module_update_close)[ cat1_module_update_close](116. cat1_module_update_close)(); 117. while (1 ) {​
118. os_time_dly (1000) ; 119. ​} 120. ​}
cat1_module_update_data_recv_callback 接口负责把APP发来的固件包数据传输给4G模块
image

  1. // len: 是总长度
  2. // 本包数据的长度是data 的前2byte
  3. // data 的前2byte之外的数据是本包数据
  4. // return : priv [0 ] = 0 : succ , priv [0 ] = 1 : err
  5. static void cat1_module_update_data_recv_callback (void *priv , u8 *data , int len)
  6. {​
    [7.](7. int)[ int](7. int) ret = 0;
  7. u16 recv_len;
  8. if (!(cat1_module_state_match (MODULE_UPDATE_START) || cat1_module_ state_match (MODULE_UPDATE_DATA_TRANS))) {​
  9. // 还未准备好接受数据
  10. log_debug( "not ready to recv update data !\n " ) ;
  11. ret = 1 ;
  12. goto data_err; 15. ​} 16.
  13. if (cat1_module_state_match (MODULE_UPDATE_START)) {​
    [18.](18. cat1_update.w_offset = 0)[ cat1_update.w_offset = 0](18. cat1_update.w_offset = 0);
    [19.](19. cat1_update.packet_offset = 0)[ cat1_update.packet_offset = 0](19. cat1_update.packet_offset = 0);
  14. if (len != cat1_update .fw_pack_ size) {​
  15. log_error ( "fw pack size err %d , %d\n " , len , cat1_update .fw_pack_size) ;
  16. ret = 1 ;
  17. goto data_err;
  18. ​}
    [25.](25. cat1_module_state_set)[ cat1_module_state_set](25. cat1_module_state_set)(MODULE_UPDATE_DATA_TRANS);
  19. ​}
  20. memcpy(&recv_len , data , sizeof (recv_len));
    image
  21. if (cat1_update .timer) {​
  22. sys_timer_re_run(cat1_update .timer) ;
  23. ​}
    image

image 33. u32 packet_len = cat1_module_update_data_packet(data + sizeof (recv_len) , recv_len) ;
34. if (packet_len & BIT(31)) {​ // BIT(31)表示组包完成
35. packet_len = packet_len & (~ BIT(31));
36. ret = cat1_module_fota_trans_data(cat1_update .cat1_update_trans_buf , packet_len) ;
37. if (ret != 0 ) {​
38. log_error ( "aic fota trans data err !\n " ) ;
39. // 本包数据传输出错,需要出错处理
40. ret = 1 ;
41. goto data_err; 42. ​}
[43.](43. cat1_update.w_offset)[ cat1_update.w_offset](43. cat1_update.w_offset) += packet_len; 44. ​} 45.
46. data_err:
47. ((u8 * )priv ) [0 ] = ret; 48. ​}

Prev
CAT1 接入文档
Next
Findmy功能