701N_WATCH_CAT1开发说明
701N WATCH
CAT1开发说明
珠海市杰理科技股份有限公司
Zhuhai Jieli Technology Co.,LTD
版权所有,未经许可,禁止外传
http://www.zh-jieli.com/
修改记录
| 版本 | 更新日期 | 描述 |
|---|---|---|
| 1.0 | 2024-3-1 | 建立初始版本 |
目录
一、 概述.............................................................................................................. 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
一、概述
一、概述
1、 本SDK仅提供引脚对接图,其余资料请咨询展锐、 归芯公司获取;
2、 通话、短信、 网络、OTA等功能都已经调通,用户根据需求添加自己的应用,SDK 中有对应的参考;
二、规格
二、规格
(一)资源
| RAM空间 | 代码空间 | |
|---|---|---|
| 归芯 | 100.375KB | 248.23KB |
| 展锐 | 84.375KB | 170.175KB |
空间统计包含4G模块代码及应用(通话、 短信、UI);
RAM空间统计方法:开启4G模块后跑到app_main()函数中的RAM大小差异;
代码空间统计方法:开启4G模块后编译生成的app.bin大小差异;
(二)功耗
1.待机功耗(BLE广播1秒)
| 模块关闭 | 连接待机本底 | 电信连接待机 | 移动连接待机 | 联通连接待机 | |
|---|---|---|---|---|---|
| 归芯 | 220uA | 450uA | 980uA | 970uA | 1.03mA |
| 展锐 | 250uA | 858uA | 1.70mA | 2.04mA | 1.67mA |
功耗测试为整机环境,包含杰理芯片端功耗及外设功耗;归芯功耗测试使用开发板环境(含屏幕);
展锐功耗测试使用样机环境(不含屏幕);
2.工作功耗(BLE广播1秒)
| 通话 | |
|---|---|
| 归芯 | 92mA |
| 展锐 | 103mA |
环境同待机功耗环境,DAC/MIC空载;使用电信卡,拨打 10000;
(三)网速
| 上行 | 下行 | |
|---|---|---|
| 归芯 | 128KB/s | 124KB/s |
| 展锐 | 64KB/s | 65KB/s |
搭建杰理服务器验证;
三、工程配置
三、工程配置
(一)功能宏定义
1、 打开TCFG_APP_CAT1_EN使能, 以使用CAT1模块。
- #define TCFG_APP_CAT1_EN 0 // 用于4G通话
2、 根据需要选择CAT1服务商,现支持紫光展锐和归芯。
- // cat1服务商
- #define TCFG_CAT1_UNISOC_ENABLE DISABLE // 展锐科技
- #define TCFG_CAT1_AICXTEK_ENABLE ENABLE // 归芯科技
3、 根据需要选择CAT1功能,现支持通话、短信、 网络和固件升级功能,其中展锐支持领科ESIM。
- #define TCFG_CAT1_FUNC_SMS_ENABLE ENABLE // 短信功能
- #define TCFG_CAT1_FUNC_NET_ENABLE ENABLE // 网络功能
- #define TCFG_CAT1_MODULE_UPDATE_ENABLE ENABLE // 升级模块
- #define UNISOC_ESIM_TEST 0 // 领科ESIM独立APP模式验证
(二)引脚定义
1.归芯

- #define TCFG_CAT1_AICXTEK_UART_TX IO_PORTA_12 // 串口tx
- #define TCFG_CAT1_AICXTEK_UART_RX IO_PORTA_13 // 串口 rx
- #define TCFG_CAT1_AICXTEK_GPIO_WKUP IO_PORTA_14 // 唤醒口。被CAT1激活
- #define TCFG_CAT1_AICXTEK_GPIO_ACTIVE IO_PORTA_15 // 激活CAT1 5.
- #define TCFG_CAT1_AICXTEK_GPIO_POWER IO_PORTC_06 // power_key
开发板网络:
| 归芯 | STA-SPC | S-PWRON | S-RST | H-PWRON | VBAT-GX318 |
|---|---|---|---|---|---|
| 杰理 | 无 | PC6 | 无 | VDDIO 3.3V | Vsystem |
| 归芯 | WUP-OUT | WART-RX | UART-TX | WUP-IN |
|---|---|---|---|---|
| 杰理 | PA14 | PA12 | PA13 | PA15 |
2.展锐
- #define TCFG_CAT1_UNISOC_AP_REQ IO_PORTG_00

- #define TCFG_CAT1_UNISOC_AP_ACK IO_PORTG_01
- #define TCFG_CAT1_UNISOC_CP_REQ IO_PORTG_06

- #define TCFG_CAT1_UNISOC_CP_ACK IO_PORTG_07
- #define TCFG_CAT1_UNISOC_TP_ACK IO_PORTC_06
- #define TCFG_CAT1_UNISOC_CP_PBINT IO_PORTC_07

- #define TCFG_HW_SPI2_ENABLE ENABLE_THIS_MOUDLE
- #define TCFG_HW_SPI2_PORT_CLK IO_PORTB_11
- #define TCFG_HW_SPI2_PORT_DO IO_PORTB_09
- #define TCFG_HW_SPI2_PORT_DI IO_PORTB_08
- #define TCFG_HW_SPI2_PORT_D2 NO_CONFIG_PORT
- #define TCFG_HW_SPI2_PORT_D3 NO_CONFIG_PORT
- #define TCFG_HW_SPI2_BAUD 2000000L
- #define TCFG_HW_SPI2_MODE SPI_MODE_BIDIR_ 1BIT
- #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/ 文件夹中
四、控制
四、控制
(一)电源控制
CAT1模块电源可通过上下电函数cat1_set_lte_onoff(int flag)来控制。
(1)归芯,可通过设置-通讯设置-LTE通讯开关,来控制CAT1上下电,也可通过拨号盘按“*”进入工程模式的电源控制选项来控制CAT1上下电。

- void cat1_set_lte_onoff(int flag)
- {
- if (cat1_ status .lte_enable == flag) {
- 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);
- if (flag) {
- 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); //切换通话模式
- } else {
- 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. }
- }
(2)展锐,可通过设置-通讯设置-LTE通讯开关,来控制CAT1上下电,也可通过拨号盘按“*”进入工程模式的MODEM CTRL选项里的PoweroffModem和Poweron Modem来控制CAT1上下电。

- void cat1_set_lte_onoff(int flag)
- {
- if (cat1_ status .lte_enable == flag) {
- 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);
- if (flag) {
- //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); //切换通话模式 - } else {
- //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. }
五、通话
五、通话
(一)CAT1独立通话
1.来电
(1)接听电话:
可通过cat1_call_answer()接口来进行接听电话操作归芯:
- bool cat1_call_answer(void)
- {
- if (false == cat1_check_call_enable ()) { // 检查是否可以进入通话
- return false; 5. }
[6.](6. int32_t)[ int32_t](6. int32_t) ret = aic_ srv_tele_call_answer(handleCallCallback); // 归芯接听电话接口 - if (ret) {
- log_error ( "aic_srv_tele_call_answer err:%d \n " , ret) ; 9. }
- return true; 11. }
展锐: - bool cat1_call_answer(void)
- {
[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); // 展锐接听电话接口 - if (ret == UAL_TELE_CALL_RES_ERROR) {
- log_error ( "ual_tele_call_answer_call error:%d\n " , ret) ;
- return false; 8. }
- return true; 10. }
(2)挂断电话:
可通过cat1_call_hangup()接口来挂断电话。归芯: - bool cat1_call_hangup(void)

- { 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
- }
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;
展锐:
- bool cat1_call_hangup(void)
- {
[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); - log_info ( "%s ,%d \n " , func , LINE ) ;
- log_info ( "call state is %d\n " , status) ;
[7.](7. int32_t)[ int32_t](7. int32_t) ret; - if (status == UAL_TELE_CALL_STATE_INCOMING) {
- ret = ual_tele_call_ reject_call(&rpc_ ret) ; //拒接电话
- if (ret == UAL_TELE_CALL_RES_ERROR) {
- log_error ( "ual_tele_call_reject_call error:%d\n " , ret) ;
- return false; 13. }
- } else if (status == UAL_TELE_CALL_STATE_NULL) {}
- else if (status == UAL_TELE_CALL_STATE_OUTGOING || status == UAL_TELE_CALL_STATE_ACTIVE) {
- ual_tele_call_data_info_t *current_call_info = NULL;
- current_call_info = malloc (sizeof (ual_tele_call_data_info_t ));
- ual_tele_call_get_current_call_info (current_call_info , &rpc_ret) ;
20. ret = ual_tele_call_ release_call(current_call_info->call_id , rpc_ret) ; //挂断当前电话
21. if (ret == UAL_TELE_CALL_RES_ERROR) {
22. log_error ( "ual_tele_call_release_call error:%d\n " , ret) ;
[23.](23. free)[ free](23. free)(current_call_info); 24. return false;
25. }
[26.](26. free)[ free](26. free)(current_call_info);
- }

- return true;
- }
(3)电话号码获取:
可通过cat1_get_call_phone_num(char **phone_num)接口获取电话号码
- bool cat1_get_call_phone_num (char **phone_num) 2. {
- *phone_num = cat1_info .tele_num; 4.
- return true; 6. }
(4)来电铃声:归芯:
[1.](1. case)[ case](1. case) TS_CALL_STATUS_INCOMING: { - /* incoming a call ,phone recieve a call */
- /* 1 .wheather exist a connected call , if exist , hangup it;if not exist , play local call ring */
- if (1 < call_info_list .call_number) {
[6.](6. int)[ int](6. int) ret = -1; - uint8_t cur_card_id = TS_CARD_ID_MAX;
- aic_srv_tele_sim_get_current_card (&cur_card_id);
- ret = aic_srv_tele_call_release (cur_card_id , p_call_status->call_idx , NULL) ;
- log_info ( "handleCallCallback ,aic_ srv_tele_call_release return , ret = %d.\ r\n " , ret) ;
- return -1;
- } else {
- if (false == app_cat1_check_ support()) {
- // 当前条件不容许进入通话时,定时检查状态
- 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. } - break ;
- }
[20.](20. app_task_switch_to)[ app_task_switch_to](20. app_task_switch_to)(APP_CAT1_TASK); - /* play local ring */
- char *len_l st[TS_CALL_PHONE_NUMBER_LEN_MAX + 4 + 1 ] ; // 电话号码加铃声循环
- tone_play_stop();

- number_to_play_list((char *)(cat1_info.phone_number), len_lst); // 播放来电铃声
- tone_file_list_play(len_l st , 1 ) ;
27. UI_ENABLE_PHONEBOOK // 电话本功能
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 ;
展锐:
[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. | ![]() app_task_ switch_to(APP_CAT1_TASK) ; | |
|---|---|---|
| 21. | ||
| 22. | ![]() /* play local ring */ | |
| 23. | number_to_play_list((char * ) (cat1_info .tele_num) , len_lst) ; | // 播放来电铃声 |

24. tone_file_list_play(len_l st , 1 ) ;
- #if TCFG_UI_ENABLE_PHONEBOOK // 电话本功能
- set_call_log_date(NULL) ;
- set_call_log_type(2 ) ;
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为电话号码。
归芯:
- bool cat1_call_number(int number_len , char *number)
- {
- if (false == cat1_check_call_enable ()) {
- return false; 5. }
- log_info ( "%s ,num :% s \n " , func , number) ; 7.
- ts_call_dial_info_t dial_info = {0 } ;
- if (number_len > TS_CALL_PHONE_NUMBER_ LEN_MAX) {
- number_len = TS_CALL_PHONE_NUMBER_ LEN_MAX; 11. }
- memcpy(dial_info.phone_number, number, number_len);
- /* dial_info .card_id = 0 ; */
[14.](14. int32_t)[ int32_t](14. int32_t) ret = aic_ srv_tele_call_dial(&dial_info, handleCallCallback); //归芯拨打电话接口 - if (ret) {
- log_error ( "aic_srv_tele_call_dial err:%d \n " , ret) ;
- }
- return true;
- }
展锐: - bool cat1_call_number(int num_len , char *number)

- {
[3.](3. int)[ int](3. int) rpc_ret = 0;
- if (num_len > UAL_TELE_CALL_TELE_NUM_MAX) {

- 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); // 展锐拨打电话接口 - if (ret == UAL_TELE_CALL_RES_SUCCESS) {
- log_info ( "ual_tele_call_make_call success:%d\n " , ret) ;
- return true; 11. }
- return false; 13. }
3.mic静音
可通过cat1_call_input_mute(u8 mute)来使能mic静音功能,其中mute为1代表静音,0代表非静音。归芯:
- void cat1_call_input_mute(u8 mute) 2. {
- aic_audio_input_clear_enable (mute) ; 4. }
展锐: - void cat1_call_input_mute(u8 mute) 2. {
- if (mute) {
- 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 { - 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来电
[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 */
[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. | ![]() break ; |
|---|---|
| 23. | } |
| 24. | #endif /* #if TCFG_APP_CAT1_EN */ |
| 25. | ui_hide_main (ID_WINDOW_PHONE) ; |
26. #endif /* #if TCFG_UI_ENABLE */
2.BT通话过程中CAT1来电处理
在BT通话过程中,不响应CAT1来电。
[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. }

六、短信
六、短信
(一)接受短信
归芯:
归 芯 的 短 信 接 收 在 cat1_aicxtek.c 文 件 中, 位 于 handleSmsCallback()回 调 函 数 的 TS_EVENT_SMS_READ_IN_SIM_RESP事件中获取短信内容、 时间、发件人等信息。
[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. | ![]() notice_info_ release(msg) ; |
|---|---|
| 34. | UI_MSG_POST( "cat1_event:SMS=%4 " , 1 ) ; |
| 35. | ![]() } |
| 36. | } |
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事件中获取短信内容、 时间、发件人等信息。
[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.发送特定短信
现支持发送预制短信,需要先写入预制短信内容:
- const unsigned char sms_tab [15 + 1 ] = {
- 0xE5 , 0xA5 , 0xBD , 0xE7 , 0x9A , 0x84 , 0xEF , 0xBC , 0x8C , 0xE6 , 0x94 , 0xB6 , 0xE5 , 0x88 , 0xB0 , 0x00
- } ; //好的,收到

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为短信内容。
归芯:
[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 ' ;
12. log_info ( " sms number:%s\n " , p_number) ;
13.
14. if (content_len >= TS_SMS_PDU_MAX_LEN) {
15. content_len = TS_SMS_PDU_MAX_LEN - 1 ;
16. }
17. memcpy(p_text , content , content_len) ;
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. }
展锐:
[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); // 展锐发送短信接口
20.
[21.](21. free)[ free](21. free)(send_content);
22.
23. return true;
24. }
2.发送输入短信
现支持输入字母、数字、符号,并可发送输入的内容。编制输入短信的代码位于ui_action_notice.c,
[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 ;
[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 ;

七、 网络
七、 网络
(一)LWIP 网卡接入
1.归芯
归芯4G模块上电时可直接使用网络服务,暂无关闭网络服务的接口。
2.展锐
可调用cat1_set_lte_net_onoff(int flag)来注册和去注册展锐的网络服务,flag表示是否注册网络服务, 1表示注册,0表示去注册。
- void cat1_set_lte_net_onoff(int flag)
- {
[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; - if (flag == 0 ) {
[7.](7. int)[ int](7. int) data_res = ual_tele_data_deactive(0, &rpc_ret); // 展锐数据服务去激活 - log_info ( "data res:%d\n " , data_res) ;
- res = ual_tele_data_unregister(cat1_info .client_data_handle , &rpc_ret) ;// 展锐网络监控去注册
- log_info ( "data unregister !\n " ) ;
- } else {
[12.](12. int)[ int](12. int) data_res = ual_tele_data_active(0, &rpc_ret); // 展锐数据服务激活 - log_info ( "data res:%d\n " , data_res) ;
- res = ual_tele_data_ register(handleDataCallback , &cat1_info .client_data_handle , &rpc_ret) ;
- log_info ( "data register !\n " ) ; 16. } 17. }
3. 网络调试
可仿照lte_network_test.c 的例程进行网络调试。
- static void lte_network_test_task (void *priv )
| 2. | ![]() { |
|---|---|
| 3. | #ifdef PING_TEST |
| 4. | ping_init ( "120 .24 .247 .138 " , 1000 , 10 , NULL , NULL) ; |
| 5. #endif |
6.
7. #ifdef TCP_TEST
8. tcp_client_test();
- #endif

- #ifdef DNS_TEST

- ip_addr_t host_ip;
- dns_gethostbyname("www.taobao.com", &host_ip, dns_found, NULL);
- #endif 15.
- #ifdef HTTP_TEST
- http_download("https://profile.jieliapp.com/");
- #endif 19.
- #ifdef HOST_TEST
[21.](21. host_test)[ host_test](21. host_test)("www.taobao.com"); - #endif
- for ( ;😉 {
- os_time_dly (100 * 60 * 60) ; 25. } 26. } 27.
- void lte_network_test(void)
- {
- os_task_create(lte_network_test_task , NULL , 6 , 0x600 , 0 , "lte_network_test_task " ) ;

八、OTA
八、OTA
(一)编译环境
1.归芯
使能归芯4G模块的固件升级功能
- #define TCFG_CAT1_MODULE_UPDATE_ENABLE ENABLE // 支持cat1模块的固件升级
2.展锐
使能展锐4G模块的固件升级功能
2. #define TCFG_CAT1_MODULE_UPDATE_ENABLE ENABLE // 支持cat1模块的固件升级
3.log 的输出配置
4G模块升级功能的log输出配置
- const char log_tag_const_v_CAT1_UPDATE AT( . LOG_TAG_CONST) = FALSE;
- const char log_tag_const_i_CAT1_UPDATE AT( . LOG_TAG_CONST) = FALSE;
- const char log_tag_const_d_CAT1_UPDATE AT( . LOG_TAG_CONST) = FALSE;
- const char log_tag_const_w_CAT1_UPDATE AT( . LOG_TAG_CONST) = FALSE;
- const char log_tag_const_e_CAT1_UPDATE AT( . LOG_TAG_CONST) = TRUE;

- const char log_tag_const_v_SMART_CAT1 AT( . LOG_TAG_CONST) = FALSE;
- const char log_tag_const_i_SMART_CAT1 AT( . LOG_TAG_CONST) = FALSE;
- const char log_tag_const_d_SMART_CAT1 AT( . LOG_TAG_CONST) = FALSE;
- const char log_tag_const_w_SMART_CAT1 AT( . LOG_TAG_CONST) = FALSE;
- const char log_tag_const_e_SMART_CAT1 AT( . LOG_TAG_CONST) = TRUE;
(二)4G模块固件升级
1.获取4G模块版本号
cat1_module_update_init 接口会开启4G模块电源并保存模块的版本号,并且检查4G模块是否存在升级异常,然后关闭模块电源
- 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); - if (cat1_module_get_power_ state() == CAT1_POWER_STATE_POWEROFF) {

- // 启动电源
[7.](7. cat1_ctrl_poweron)[ cat1_ctrl_poweron](7. cat1_ctrl_poweron)(); - // 创建定时器去检测是否可以获取版本号
- 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. } - } else if (cat1_module_get_power_ state() == CAT1_POWER_STATE_POWERON) {
- // 可以直接获取版本号
[14.](14. cat1_module_save_version)[ cat1_module_save_version](14. cat1_module_save_version)(); - } else {
[16.](16. cat1_module_state_clr)[ cat1_module_state_clr](16. cat1_module_state_clr)(GET_MODULE_VER); - log_error ( "cat1 module state not support get version\n " ) ; 18. }
- // 检查是否存在升级异常
[20.](20. cat1_module_check_update_exception)[ cat1_module_check_update_exception](20. cat1_module_check_update_exception)(); 21. }
cat1_module_get_version 接口可以获取4G模块的版本号(字符串)

- char *cat1_module_get_version(void)
- {
- u8 *ret = NULL;
- u16 ver_len = cat1_module_get_version_total_len();
- if (cat1_module_state_match (GET_MODULE_VER_OK)) {
- ret = cat1_update .cat1_version;
- } else if (cat1_update .update_flag == CAT1_UPDATE_BEGIN_FLAG) { // flash保存的版本号不为空以及上一次升级失败了
- u8 *tmp_ver_p = (u8 * )zalloc(ver_len) ; 10.
- if (syscfg_read (CFG_CAT1_UPDATE_CAT1_VER , tmp_ver_p , ver_len) != ver_len) {
- log_error ( "%s version read err\n " , func ) ;
- ret = NULL;
- } else {
- if (cat1_update .cat1_version == NULL) {
- cat1_update .cat1_version = zalloc (ver_len) ; // 不释放
- if (cat1_update .cat1_version == NULL) {
- log_error ( "cat1_version zalloc err !!!\n " ) ;
[19.](19. free)[ free](19. free)(tmp_ver_p); - return NULL;

- } 22. }
- memcpy(cat1_update .cat1_version , tmp_ver_p , ver_len) ;
- ret = cat1_update .cat1_version;
- }
[26.](26. free)[ free](26. free)(tmp_ver_p); 27. } 28. - return ret; 30. }
2.4G模块固件升级任务
cat1_module_update_task 处理升级流程的各种状态、事件

- void cat1_module_update_task (void *p )
- {
[3.](3. int)[ int](3. int) msg [3 ] ;
[4.](4. int)[ int](4. int) ret = 0; - os_time_dly (2 ) ;//让出 cpu去回复ble消息
- log_info ( "cat1_module_update_task\n " ) ;
- while (1 ) {
- if (os_taskq_pend (NULL , msg , sizeof (msg)) != OS_TASKQ) {
- log_error ( "%s msg err\n " , func , LINE ) ;
- continue; 12. }
- if (msg[0 ] != Q_MSG) {
- log_error ( "%s msg err %d\n " , func , LINE ) ;
- continue; 16. }
- log_debug( "cat1 update task msg 0x%x\n " , msg[1 ] ) ;
- switch (msg [1 ] ) {
[19.](19. case)[ case](19. case) CAT1_UPDATE_MSG_SUCC: - break ;
[21.](21. case)[ case](21. case) CAT1_UPDATE_MSG_FAIL: - break ;
[23.](23. case)[ case](23. case) CAT1_UPDATE_MSG_TIMEOUT: - break ;
[25.](25. case)[ case](25. case) CAT1_UPDATE_MSG_DATA_TRANS_END:
26. puts( "CAT1_UPDATE_MSG_DATA_TRANS_END\n " ) ;
27. if (msg[2 ] == 0 ) { // msg[2 ] == 0 表示大数据传输成功
28. ret = cat1_module_fota_end ();
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) ;
32. } else {
- log_debug( "aic fota update failed (ret=%d) , retry later ! %d\n " , ret , msg[2 ] ) ;

- smartbox_command_ set_cmd_notify_cat1_update_result (CAT1_UPDATE_STATE_END , CAT1_UPDATE_RESULT_FAIL) ;
- }
[36.](36. cat1_module_state_set)[ cat1_module_state_set](36. cat1_module_state_set)(MODULE_UPDATE_END); - } else {
- log_debug( "aic fota update failed (ret=%d) , retry later ! %d\n " , ret , msg[2 ] ) ;
- smartbox_command_set_cmd_notify_cat1_update_result (CAT1_UPDATE_STATE_END , CAT1_UPDATE_RESULT_FAIL) ;
- ret = 1 ; 41. }
- os_time_dly (20) ; // 让出 cpu给ble发送数据,经验值
- goto cat1_update_end ;
[44.](44. case)[ case](44. case) CAT1_UPDATE_MSG_START: - puts( "CAT1_UPDATE_MSG_START\n " ) ;
- if (cat1_module_state_match (MODULE_UPDATE_START) && \
- (msg[2 ] == CAT1_UPDATE_RESULT_SUCC)) {
- // 通知升级开始
- smartbox_command_set_cmd_notify_cat1_update_result (CAT1_UPDATE_STATE_START , CAT1_UPDATE_RESULT_SUCC) ;
- 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) ; - }
- } else {
- // 升级失败
- smartbox_command_set_cmd_notify_cat1_update_result (CAT1_UPDATE_STATE_END , CAT1_UPDATE_RESULT_FAIL) ;
- ret = 1 ;
- goto cat1_update_end ; 58. }
- break ;
[60.](60. case)[ case](60. case) CAT1_UPDATE_MSG_BT_DISCONNECT: - 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); - ret = 1 ;
- goto cat1_update_end ;
[65.](65. case)[ case](65. case) CAT1_UPDATE_MSG_STARTING: - puts( "CAT1_UPDATE_MSG_STARTING\n " ) ;
- if (cat1_update .update_flag != CAT1_UPDATE_BEGIN_FLAG) {
[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); - if (syscfg_write(CFG_CAT1_UPDATE_FLAG_ID , &cat1_update .update_flag , sizeof (cat1_update .update_flag)) != sizeof (cat1_update .update_flag)) {


- }

- }
- if (cat1_module_update_call_disable () == 0 ) {
- log_error ( "cat1 disable call err\n " ) ;
- 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); - break ; 79. }
- #if SMART_BOX_EN
- 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)(); - #endif
- // 注册大数据传输回调函数
[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); - // 阻塞式等待电源启动完毕,会先产生AIC_CTRL_STATE_FOTA状态回调,再执行完该函数
- 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. | ![]() cat1_update_end : |
|---|---|
| 107. | if (ret) { |
| 108. | ![]() cat1_module_ state_set(MODULE_UPDATE_FAIL) ; |
| 109. | } else { |
[110.](110. cat1_module_state_set)[ cat1_module_state_set](110. cat1_module_state_set)(MODULE_UPDATE_SUCC);
111. }
112. if (cat1_update .timer) {
113. sys_timeout_del (cat1_update .timer) ;
[114.](114. cat1_update.timer = 0)[ cat1_update.timer = 0](114. cat1_update.timer = 0);
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模块
- // len: 是总长度
- // 本包数据的长度是data 的前2byte
- // data 的前2byte之外的数据是本包数据
- // return : priv [0 ] = 0 : succ , priv [0 ] = 1 : err
- static void cat1_module_update_data_recv_callback (void *priv , u8 *data , int len)
- {
[7.](7. int)[ int](7. int) ret = 0; - u16 recv_len;
- if (!(cat1_module_state_match (MODULE_UPDATE_START) || cat1_module_ state_match (MODULE_UPDATE_DATA_TRANS))) {
- // 还未准备好接受数据
- log_debug( "not ready to recv update data !\n " ) ;
- ret = 1 ;
- goto data_err; 15. } 16.
- 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); - if (len != cat1_update .fw_pack_ size) {
- log_error ( "fw pack size err %d , %d\n " , len , cat1_update .fw_pack_size) ;
- ret = 1 ;
- goto data_err;
- }
[25.](25. cat1_module_state_set)[ cat1_module_state_set](25. cat1_module_state_set)(MODULE_UPDATE_DATA_TRANS); - }
- memcpy(&recv_len , data , sizeof (recv_len));

- if (cat1_update .timer) {
- sys_timer_re_run(cat1_update .timer) ;
- }

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. }
















