From 2ed5298067c51b8e5b2bf11cf1b5202f2239aa9d Mon Sep 17 00:00:00 2001 From: reeedstudio Date: Mon, 1 Sep 2014 09:40:38 +0800 Subject: [PATCH] v1.0.29 --- drivers/mtk/2K_XP_COM/usb2ser_2kXP.inf | 90 + drivers/mtk/2K_XP_COM/usb2ser_2kxp_64.cat | Bin 0 -> 7291 bytes drivers/mtk/2K_XP_COM/usb2ser_2kxp_comp.cat | Bin 0 -> 7189 bytes drivers/mtk/2K_XP_COM/usb2ser_XP64.inf | 89 + drivers/mtk/98ME_COM/GPRS_USB_Modem.inf | 357 +++ drivers/mtk/98ME_COM/USBCDC.INF | 47 + drivers/mtk/98_Mass/MTKUMSS.INF | 77 + drivers/mtk/98_Mass/UMSS.sys | Bin 0 -> 17668 bytes drivers/mtk/98_Mass/UMSSPDR.pdr | Bin 0 -> 9125 bytes drivers/mtk/InstallDriver.exe | Bin 0 -> 58880 bytes drivers/mtk/ReadMe.txt | 63 + drivers/mtk/UninstallDriver.exe | Bin 0 -> 57344 bytes drivers/mtk/Vista/usb2ser_Vista.inf | 91 + drivers/mtk/Vista/usb2ser_Vista64.inf | 90 + .../mtk/Vista/usb2servistawin7_32_comp.cat | Bin 0 -> 7289 bytes .../mtk/Vista/usb2servistawin7_64_comp.cat | Bin 0 -> 7293 bytes drivers/mtk/Win7/usb2ser_Win7.inf | 91 + drivers/mtk/Win7/usb2ser_Win764.inf | 90 + drivers/mtk/Win7/usb2servistawin7_32_comp.cat | Bin 0 -> 7281 bytes drivers/mtk/Win7/usb2servistawin7_64_comp.cat | Bin 0 -> 7285 bytes drivers/mtk/x64/install64.exe | Bin 0 -> 44544 bytes drivers/mtk/x86/install32.exe | Bin 0 -> 42496 bytes hardware/arduino/mtk/boards.txt | 44 + hardware/arduino/mtk/cores/arduino/Arduino.h | 126 + hardware/arduino/mtk/cores/arduino/Client.h | 45 + .../mtk/cores/arduino/HardwareSerial.h | 42 + .../arduino/mtk/cores/arduino/IPAddress.cpp | 74 + .../arduino/mtk/cores/arduino/IPAddress.h | 70 + hardware/arduino/mtk/cores/arduino/LTask.cpp | 120 + hardware/arduino/mtk/cores/arduino/LTask.h | 70 + .../arduino/mtk/cores/arduino/LTcpClient.cpp | 498 +++ .../arduino/mtk/cores/arduino/LTcpClient.h | 208 ++ .../arduino/mtk/cores/arduino/LTcpServer.cpp | 203 ++ .../arduino/mtk/cores/arduino/LTcpServer.h | 119 + hardware/arduino/mtk/cores/arduino/LUdp.cpp | 332 ++ hardware/arduino/mtk/cores/arduino/LUdp.h | 84 + hardware/arduino/mtk/cores/arduino/Print.cpp | 272 ++ hardware/arduino/mtk/cores/arduino/Print.h | 86 + .../arduino/mtk/cores/arduino/Printable.h | 40 + .../arduino/mtk/cores/arduino/RingBuffer.cpp | 43 + .../arduino/mtk/cores/arduino/RingBuffer.h | 42 + hardware/arduino/mtk/cores/arduino/Server.h | 28 + hardware/arduino/mtk/cores/arduino/Stream.cpp | 270 ++ hardware/arduino/mtk/cores/arduino/Stream.h | 102 + hardware/arduino/mtk/cores/arduino/Tone.h | 23 + .../arduino/mtk/cores/arduino/UARTClass.cpp | 221 ++ .../arduino/mtk/cores/arduino/UARTClass.h | 153 + hardware/arduino/mtk/cores/arduino/Udp.h | 88 + .../arduino/mtk/cores/arduino/WCharacter.h | 180 ++ .../arduino/mtk/cores/arduino/WInterrupts.c | 211 ++ .../arduino/mtk/cores/arduino/WInterrupts.h | 139 + hardware/arduino/mtk/cores/arduino/WMath.cpp | 68 + hardware/arduino/mtk/cores/arduino/WMath.h | 93 + .../arduino/mtk/cores/arduino/WString.cpp | 746 +++++ hardware/arduino/mtk/cores/arduino/WString.h | 224 ++ .../arduino/mtk/cores/arduino/avr/dtostrf.c | 29 + .../arduino/mtk/cores/arduino/avr/dtostrf.h | 29 + .../arduino/mtk/cores/arduino/avr/interrupt.h | 0 .../arduino/mtk/cores/arduino/avr/pgmspace.h | 44 + hardware/arduino/mtk/cores/arduino/binary.h | 534 ++++ .../mtk/cores/arduino/cxxabi-compat.cpp | 26 + hardware/arduino/mtk/cores/arduino/itoa.c | 170 ++ hardware/arduino/mtk/cores/arduino/itoa.h | 42 + hardware/arduino/mtk/cores/arduino/main.cpp | 95 + hardware/arduino/mtk/cores/arduino/message.h | 44 + hardware/arduino/mtk/cores/arduino/syscalls.h | 60 + .../arduino/mtk/cores/arduino/syscalls_mtk.c | 222 ++ hardware/arduino/mtk/cores/arduino/wiring.c | 92 + hardware/arduino/mtk/cores/arduino/wiring.h | 139 + .../arduino/mtk/cores/arduino/wiring_analog.c | 304 ++ .../arduino/mtk/cores/arduino/wiring_analog.h | 171 ++ .../mtk/cores/arduino/wiring_constants.h | 275 ++ .../mtk/cores/arduino/wiring_digital.c | 149 + .../mtk/cores/arduino/wiring_digital.h | 116 + .../mtk/cores/arduino/wiring_private.h | 42 + .../mtk/cores/arduino/wiring_pulse.cpp | 67 + .../arduino/mtk/cores/arduino/wiring_pulse.h | 56 + .../arduino/mtk/cores/arduino/wiring_shift.c | 71 + .../arduino/mtk/cores/arduino/wiring_shift.h | 90 + .../arduino/mtk/libraries/LAudio/LAudio.cpp | 111 + .../arduino/mtk/libraries/LAudio/LAudio.h | 154 + .../examples/AudioPlayer/AudioPlayer.ino | 90 + .../arduino/mtk/libraries/LAudio/keywords.txt | 31 + .../mtk/libraries/LAudio/utility/Audio.cpp | 126 + .../mtk/libraries/LAudio/utility/Audio.h | 56 + hardware/arduino/mtk/libraries/LBT/LBT.cpp | 23 + hardware/arduino/mtk/libraries/LBT/LBT.h | 88 + .../arduino/mtk/libraries/LBT/LBTClient.cpp | 241 ++ .../arduino/mtk/libraries/LBT/LBTClient.h | 591 ++++ .../arduino/mtk/libraries/LBT/LBTServer.cpp | 318 ++ .../arduino/mtk/libraries/LBT/LBTServer.h | 599 ++++ .../LBT/examples/BTSPP/BTClient/BTClient.ino | 96 + .../LBT/examples/BTSPP/BTServer/BTServer.ino | 92 + .../mtk/libraries/LBT/utility/BTClient.cpp | 916 ++++++ .../mtk/libraries/LBT/utility/BTClient.h | 55 + .../mtk/libraries/LBT/utility/BTServer.cpp | 784 +++++ .../mtk/libraries/LBT/utility/BTServer.h | 55 + .../mtk/libraries/LBattery/LBattery.cpp | 52 + .../arduino/mtk/libraries/LBattery/LBattery.h | 69 + .../LBattery/examples/Battery/Battery.ino | 18 + .../mtk/libraries/LBattery/keywords.txt | 26 + .../libraries/LBattery/utility/Battery.cpp | 51 + .../mtk/libraries/LBattery/utility/Battery.h | 50 + .../mtk/libraries/LDateTime/LDateTime.cpp | 57 + .../mtk/libraries/LDateTime/LDateTime.h | 141 + .../examples/DateTime/LDateTime/LDateTime.ino | 15 + .../mtk/libraries/LDateTime/keywords.txt | 24 + .../arduino/mtk/libraries/LEEPROM/LEEPROM.cpp | 111 + .../arduino/mtk/libraries/LEEPROM/LEEPROM.h | 119 + .../examples/LEEPROM_RW/LEEPROM_RW.ino | 35 + .../mtk/libraries/LEEPROM/utility/sysfile.cpp | 137 + .../mtk/libraries/LEEPROM/utility/sysfile.h | 61 + .../arduino/mtk/libraries/LGPRS/LGPRS.cpp | 353 +++ hardware/arduino/mtk/libraries/LGPRS/LGPRS.h | 80 + .../mtk/libraries/LGPRS/LGPRSClient.cpp | 28 + .../arduino/mtk/libraries/LGPRS/LGPRSClient.h | 20 + .../mtk/libraries/LGPRS/LGPRSServer.cpp | 21 + .../arduino/mtk/libraries/LGPRS/LGPRSServer.h | 14 + .../arduino/mtk/libraries/LGPRS/LGPRSUdp.cpp | 24 + .../arduino/mtk/libraries/LGPRS/LGPRSUdp.h | 16 + .../GPRSUdpNtpClient/GPRSUdpNtpClient.ino | 155 + .../examples/GPRSWebClient/GPRSWebClient.ino | 65 + .../examples/GPRSWebServer/GPRSWebServer.ino | 83 + hardware/arduino/mtk/libraries/LGPS/LGPS.cpp | 64 + hardware/arduino/mtk/libraries/LGPS/LGPS.h | 148 + .../mtk/libraries/LGPS/examples/GPS/GPS.ino | 121 + .../arduino/mtk/libraries/LGPS/keywords.txt | 29 + .../mtk/libraries/LGPS/utility/GPS.cpp | 126 + .../arduino/mtk/libraries/LGPS/utility/GPS.h | 51 + hardware/arduino/mtk/libraries/LGSM/LGSM.h | 212 ++ hardware/arduino/mtk/libraries/LGSM/LSMS.cpp | 386 +++ .../arduino/mtk/libraries/LGSM/LVoiceCall.cpp | 113 + .../LGSM/examples/LVoiceCall/LVoiceCall.ino | 60 + .../LVoiceCallStatus/LVoiceCallStatus.ino | 63 + .../arduino/mtk/libraries/LGSM/keywords.txt | 30 + .../mtk/libraries/LGSM/utility/VoiceCall.cpp | 253 ++ .../mtk/libraries/LGSM/utility/VoiceCall.h | 62 + .../arduino/mtk/libraries/LStorage/LFlash.cpp | 89 + .../arduino/mtk/libraries/LStorage/LFlash.h | 61 + .../arduino/mtk/libraries/LStorage/LSD.cpp | 89 + hardware/arduino/mtk/libraries/LStorage/LSD.h | 61 + .../mtk/libraries/LStorage/LStorage.cpp | 858 ++++++ .../arduino/mtk/libraries/LStorage/LStorage.h | 281 ++ .../arduino/mtk/libraries/LWiFi/LWiFi.cpp | 712 +++++ hardware/arduino/mtk/libraries/LWiFi/LWiFi.h | 225 ++ .../mtk/libraries/LWiFi/LWiFiClient.cpp | 29 + .../arduino/mtk/libraries/LWiFi/LWiFiClient.h | 21 + .../mtk/libraries/LWiFi/LWiFiServer.cpp | 20 + .../arduino/mtk/libraries/LWiFi/LWiFiServer.h | 15 + .../arduino/mtk/libraries/LWiFi/LWiFiUdp.cpp | 23 + .../arduino/mtk/libraries/LWiFi/LWiFiUdp.h | 17 + .../examples/ScanNetworks/ScanNetworks.ino | 35 + .../WiFiUdpNtpClient/WiFiUdpNtpClient.ino | 186 ++ .../WifiDownloadFile/WifiDownloadFile.ino | 139 + .../examples/WifiWebClient/WifiWebClient.ino | 78 + .../examples/WifiWebServer/WifiWebServer.ino | 117 + .../WifiXivelyConnection.ino | 84 + hardware/arduino/mtk/libraries/SPI/SPI.cpp | 257 ++ hardware/arduino/mtk/libraries/SPI/SPI.h | 273 ++ .../BarometricPressureSensor.ino | 143 + .../DigitalPotControl/DigitalPotControl.ino | 71 + .../arduino/mtk/libraries/SPI/keywords.txt | 31 + .../arduino/mtk/libraries/Servo/Servo.cpp | 254 ++ hardware/arduino/mtk/libraries/Servo/Servo.h | 240 ++ .../libraries/Servo/examples/Servo/Servo.ino | 22 + .../arduino/mtk/libraries/Servo/keywords.txt | 24 + hardware/arduino/mtk/libraries/Wire/Wire.cpp | 242 ++ hardware/arduino/mtk/libraries/Wire/Wire.h | 374 +++ .../LiquidCrystal_I2C.cpp | 308 ++ .../LiquidCrystal_I2C.h | 126 + .../LiquidCrystal_I2C.o | Bin 0 -> 41564 bytes .../example/LiquidCrystal_I2C1602V1/diff.txt | 69 + .../examples/SerialDisplay/SerialDisplay.pde | 34 + .../LiquidCrystal_I2C1602V1/keywords.txt | 46 + .../arduino/mtk/libraries/Wire/keywords.txt | 32 + hardware/arduino/mtk/platform.txt | 84 + hardware/arduino/mtk/programmers.txt | 0 .../mtk/system/libmtk/build_gcc/StubGen.bat | 73 + hardware/arduino/mtk/system/libmtk/chip.h | 33 + .../mtk/system/libmtk/debug/get_http_head.o | Bin 0 -> 1224 bytes .../libmtk/debug/get_http_head_by_index.o | Bin 0 -> 1280 bytes .../libmtk/debug/get_http_head_number.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/get_today_from_2000.o | Bin 0 -> 1228 bytes .../arduino/mtk/system/libmtk/debug/libmtk.a | Bin 0 -> 975864 bytes .../mtk/system/libmtk/debug/libmtk.log | 5 + .../arduino/mtk/system/libmtk/debug/rand.o | Bin 0 -> 1168 bytes .../arduino/mtk/system/libmtk/debug/srand.o | Bin 0 -> 1180 bytes .../arduino/mtk/system/libmtk/debug/strtoi.o | Bin 0 -> 1188 bytes .../mtk/system/libmtk/debug/stubgen.log | 5 + .../arduino/mtk/system/libmtk/debug/vm4res.o | Bin 0 -> 6312 bytes .../mtk/system/libmtk/debug/vm_accept.o | Bin 0 -> 1208 bytes .../mtk/system/libmtk/debug/vm_app_log.o | Bin 0 -> 1200 bytes .../libmtk/debug/vm_appcomm_dereg_msg_proc.o | Bin 0 -> 1268 bytes .../libmtk/debug/vm_appcomm_dispatch_msg.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_appcomm_init.o | Bin 0 -> 1208 bytes .../system/libmtk/debug/vm_appcomm_post_msg.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_appcomm_reg_msg_proc.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_appcomm_send_msg.o | Bin 0 -> 1264 bytes .../system/libmtk/debug/vm_ascii_to_ucs2.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_assert.o | Bin 0 -> 1200 bytes .../system/libmtk/debug/vm_asyn_http_req.o | Bin 0 -> 1236 bytes .../arduino/mtk/system/libmtk/debug/vm_atof.o | Bin 0 -> 1208 bytes .../libmtk/debug/vm_audio_bytes_duration.o | Bin 0 -> 1260 bytes .../debug/vm_audio_clear_interrupt_callback.o | Bin 0 -> 1292 bytes .../system/libmtk/debug/vm_audio_duration.o | Bin 0 -> 1232 bytes .../system/libmtk/debug/vm_audio_get_time.o | Bin 0 -> 1224 bytes .../libmtk/debug/vm_audio_is_app_playing.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_audio_is_calling.o | Bin 0 -> 1224 bytes .../libmtk/debug/vm_audio_mixed_close.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_audio_mixed_close_all.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_audio_mixed_get_time.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_audio_mixed_open.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_audio_mixed_pause.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_audio_mixed_play.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_audio_mixed_resume.o | Bin 0 -> 1248 bytes .../debug/vm_audio_mixed_set_speedup_mode.o | Bin 0 -> 1280 bytes .../debug/vm_audio_mixed_set_start_time.o | Bin 0 -> 1284 bytes .../system/libmtk/debug/vm_audio_mixed_stop.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_audio_pause.o | Bin 0 -> 1220 bytes .../debug/vm_audio_pitch_shifting_set_level.o | Bin 0 -> 1296 bytes .../debug/vm_audio_pitch_shifting_turn_off.o | Bin 0 -> 1284 bytes .../debug/vm_audio_pitch_shifting_turn_on.o | Bin 0 -> 1276 bytes .../system/libmtk/debug/vm_audio_play_beep.o | Bin 0 -> 1224 bytes .../system/libmtk/debug/vm_audio_play_bytes.o | Bin 0 -> 1284 bytes .../debug/vm_audio_play_bytes_no_block.o | Bin 0 -> 1320 bytes .../system/libmtk/debug/vm_audio_play_file.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_audio_play_file_ex.o | Bin 0 -> 1276 bytes .../vm_audio_register_interrupt_callback.o | Bin 0 -> 1304 bytes .../mtk/system/libmtk/debug/vm_audio_resume.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_audio_resume_bg_play.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_audio_set_volume_type.o | Bin 0 -> 1256 bytes .../mtk/system/libmtk/debug/vm_audio_stop.o | Bin 0 -> 1216 bytes .../system/libmtk/debug/vm_audio_stop_all.o | Bin 0 -> 1224 bytes .../libmtk/debug/vm_audio_suspend_bg_play.o | Bin 0 -> 1248 bytes .../vm_audio_terminate_background_play.o | Bin 0 -> 1288 bytes .../debug/vm_audio_vocal_removal_turn_off.o | Bin 0 -> 1276 bytes .../debug/vm_audio_vocal_removal_turn_on.o | Bin 0 -> 1276 bytes .../libmtk/debug/vm_base64_decode_basic.o | Bin 0 -> 1280 bytes .../libmtk/debug/vm_base64_encode_basic.o | Bin 0 -> 1296 bytes .../debug/vm_base64_part_decode_append.o | Bin 0 -> 1320 bytes .../debug/vm_base64_part_decode_finish.o | Bin 0 -> 1280 bytes .../libmtk/debug/vm_base64_part_decode_init.o | Bin 0 -> 1272 bytes .../debug/vm_base64_part_encode_append.o | Bin 0 -> 1320 bytes .../debug/vm_base64_part_encode_finish.o | Bin 0 -> 1284 bytes .../libmtk/debug/vm_base64_part_encode_init.o | Bin 0 -> 1276 bytes .../mtk/system/libmtk/debug/vm_bearer_close.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_bearer_open.o | Bin 0 -> 1228 bytes .../arduino/mtk/system/libmtk/debug/vm_bind.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_bridge_close.o | Bin 0 -> 1224 bytes .../system/libmtk/debug/vm_bridge_create.o | Bin 0 -> 1232 bytes .../libmtk/debug/vm_bt_cm_send_passkey.o | Bin 0 -> 1256 bytes .../debug/vm_bt_noti_check_channel_valid.o | Bin 0 -> 1284 bytes .../debug/vm_bt_noti_get_bt_device_addr.o | Bin 0 -> 1284 bytes .../mtk/system/libmtk/debug/vm_btcm_exit.o | Bin 0 -> 1212 bytes .../debug/vm_btcm_get_dev_info_by_index.o | Bin 0 -> 1288 bytes .../system/libmtk/debug/vm_btcm_get_dev_num.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_btcm_get_host_dev_info.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_btcm_get_power_status.o | Bin 0 -> 1252 bytes .../mtk/system/libmtk/debug/vm_btcm_init.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_btcm_search.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_btcm_search_abort.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_btcm_set_host_name.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_btcm_srv_get_visibility.o | Bin 0 -> 1260 bytes .../libmtk/debug/vm_btcm_srv_set_visibility.o | Bin 0 -> 1268 bytes .../system/libmtk/debug/vm_btcm_switch_off.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_btcm_switch_on.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_btspp_accept.o | Bin 0 -> 1248 bytes .../mtk/system/libmtk/debug/vm_btspp_bind.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_btspp_close.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_btspp_connect.o | Bin 0 -> 1284 bytes .../system/libmtk/debug/vm_btspp_connect_ex.o | Bin 0 -> 1304 bytes .../system/libmtk/debug/vm_btspp_disconnect.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_btspp_get_dev_addr.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_btspp_get_min_buf_size.o | Bin 0 -> 1256 bytes .../mtk/system/libmtk/debug/vm_btspp_open.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_btspp_read.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_btspp_reject.o | Bin 0 -> 1220 bytes .../debug/vm_btspp_set_security_level.o | Bin 0 -> 1272 bytes .../libmtk/debug/vm_btspp_set_service_name.o | Bin 0 -> 1268 bytes .../mtk/system/libmtk/debug/vm_btspp_write.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_cache_read_char.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_call_actions.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_call_reg_listener.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_calloc.o | Bin 0 -> 1196 bytes .../mtk/system/libmtk/debug/vm_callout.o | Bin 0 -> 1200 bytes .../mtk/system/libmtk/debug/vm_callout_ex.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_camera_startup.o | Bin 0 -> 1224 bytes .../debug/vm_cancel_all_http_sessions.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_cancel_asyn_http_req.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_cancel_kal_timer.o | Bin 0 -> 1232 bytes .../system/libmtk/debug/vm_cancel_send_sms.o | Bin 0 -> 1224 bytes .../system/libmtk/debug/vm_cbm_hold_bearer.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_cbm_release_bearer.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_ce_auth_app_ex.o | Bin 0 -> 1260 bytes .../mtk/system/libmtk/debug/vm_cell_close.o | Bin 0 -> 1204 bytes .../libmtk/debug/vm_cell_get_cur_cell_info.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_cell_get_nbr_cell_info.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_cell_get_nbr_num.o | Bin 0 -> 1228 bytes .../mtk/system/libmtk/debug/vm_cell_open.o | Bin 0 -> 1204 bytes .../libmtk/debug/vm_charbat_is_charging.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_che_deinit.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_che_init.o | Bin 0 -> 1204 bytes .../system/libmtk/debug/vm_che_key_action.o | Bin 0 -> 1256 bytes .../mtk/system/libmtk/debug/vm_che_process.o | Bin 0 -> 1284 bytes .../libmtk/debug/vm_che_rsa_private_decrypt.o | Bin 0 -> 1324 bytes .../libmtk/debug/vm_che_rsa_private_encrypt.o | Bin 0 -> 1324 bytes .../libmtk/debug/vm_che_rsa_public_decrypt.o | Bin 0 -> 1320 bytes .../libmtk/debug/vm_che_rsa_public_encrypt.o | Bin 0 -> 1320 bytes .../mtk/system/libmtk/debug/vm_che_set_iv.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_chset_convert.o | Bin 0 -> 1272 bytes .../mtk/system/libmtk/debug/vm_closesocket.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_command_close_port.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_command_open_port.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_command_reply.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_connect.o | Bin 0 -> 1212 bytes .../libmtk/debug/vm_create_array_stack.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_create_dyn_array.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_create_kal_timer.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_create_linked_stack.o | Bin 0 -> 1256 bytes .../mtk/system/libmtk/debug/vm_create_timer.o | Bin 0 -> 1224 bytes .../system/libmtk/debug/vm_create_timer_ex.o | Bin 0 -> 1240 bytes .../debug/vm_custom_set_bt_pairing_method.o | Bin 0 -> 1280 bytes .../debug/vm_da_display_download_list.o | Bin 0 -> 1260 bytes .../libmtk/debug/vm_da_http_dl_operation.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_da_http_start_download.o | Bin 0 -> 1264 bytes .../mtk/system/libmtk/debug/vm_delete_timer.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_delete_timer_ex.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_des_decrypt.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_des_encrypt.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_des_reset_key.o | Bin 0 -> 1228 bytes .../mtk/system/libmtk/debug/vm_des_set_key.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_destroy_stack.o | Bin 0 -> 1228 bytes .../libmtk/debug/vm_dhcp_client_get_mode.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_dhcp_client_set_mode.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_dhcp_server_get_mode.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_dhcp_server_get_param.o | Bin 0 -> 1260 bytes .../libmtk/debug/vm_dhcp_server_set_mode.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_dhcp_server_set_param.o | Bin 0 -> 1260 bytes .../system/libmtk/debug/vm_dialer_launch.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_dns_get_state.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_dns_start.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_dns_stop.o | Bin 0 -> 1196 bytes .../system/libmtk/debug/vm_dtacct_select.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_dtacct_set.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_dyn_array_add.o | Bin 0 -> 1232 bytes .../system/libmtk/debug/vm_dyn_array_del.o | Bin 0 -> 1232 bytes .../libmtk/debug/vm_dyn_array_del_all.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_em_send_command.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_enable_proxy.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_ends_with.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_exit_app.o | Bin 0 -> 1192 bytes .../mtk/system/libmtk/debug/vm_file_close.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_file_commit.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_file_copy.o | Bin 0 -> 1216 bytes .../system/libmtk/debug/vm_file_copy_abort.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_file_delete.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_file_get_attributes.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_file_get_modify_time.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_file_getfilesize.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_file_is_eof.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_file_mkdir.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_file_open.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_file_read.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_file_rename.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_file_rmdir.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_file_seek.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_file_set_attributes.o | Bin 0 -> 1256 bytes .../mtk/system/libmtk/debug/vm_file_tell.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_file_write.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_find_close.o | Bin 0 -> 1212 bytes .../system/libmtk/debug/vm_find_close_ext.o | Bin 0 -> 1228 bytes .../mtk/system/libmtk/debug/vm_find_first.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_find_first_ext.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_find_next.o | Bin 0 -> 1216 bytes .../system/libmtk/debug/vm_find_next_ext.o | Bin 0 -> 1232 bytes ...vm_fly_mode_is_network_service_available.o | Bin 0 -> 1316 bytes .../libmtk/debug/vm_fly_mode_is_switching.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_fly_mode_switch.o | Bin 0 -> 1264 bytes .../arduino/mtk/system/libmtk/debug/vm_free.o | Bin 0 -> 1184 bytes .../system/libmtk/debug/vm_free_dyn_array.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_fs_async_abort.o | Bin 0 -> 1232 bytes .../system/libmtk/debug/vm_fs_async_close.o | Bin 0 -> 1232 bytes .../system/libmtk/debug/vm_fs_async_commit.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_fs_async_delete.o | Bin 0 -> 1240 bytes .../debug/vm_fs_async_get_working_buf_size.o | Bin 0 -> 1284 bytes .../system/libmtk/debug/vm_fs_async_open.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_fs_async_read.o | Bin 0 -> 1272 bytes .../system/libmtk/debug/vm_fs_async_seek.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_fs_async_write.o | Bin 0 -> 1276 bytes .../system/libmtk/debug/vm_gb2312_string.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_gb2312_to_ucs2.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_get_apn_info.o | Bin 0 -> 1220 bytes .../debug/vm_get_asyn_http_req_handle.o | Bin 0 -> 1272 bytes .../libmtk/debug/vm_get_battery_level.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_get_cache_free_space.o | Bin 0 -> 1252 bytes .../mtk/system/libmtk/debug/vm_get_curr_utc.o | Bin 0 -> 1220 bytes .../debug/vm_get_current_lang_country_code.o | Bin 0 -> 1280 bytes .../libmtk/debug/vm_get_cust_apn_info.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_get_customer_name.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_get_default_apn_info.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_get_default_folder_path.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_get_disk_free_space.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_get_disk_info.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_get_encoded_dtacct_id.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_get_exec_filename.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_get_filename.o | Bin 0 -> 1220 bytes .../debug/vm_get_full_path_by_short_name.o | Bin 0 -> 1288 bytes .../mtk/system/libmtk/debug/vm_get_imei.o | Bin 0 -> 1192 bytes .../mtk/system/libmtk/debug/vm_get_imei_ext.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_get_imsi.o | Bin 0 -> 1192 bytes .../mtk/system/libmtk/debug/vm_get_language.o | Bin 0 -> 1212 bytes .../system/libmtk/debug/vm_get_language_ssc.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_get_malloc_stat.o | Bin 0 -> 1228 bytes .../mtk/system/libmtk/debug/vm_get_modules.o | Bin 0 -> 1224 bytes .../system/libmtk/debug/vm_get_mre_modules.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_get_mre_total_mem_size.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_get_mre_version.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_get_multi_tags.o | Bin 0 -> 1236 bytes .../debug/vm_get_multi_tags_by_lang_id.o | Bin 0 -> 1284 bytes .../mtk/system/libmtk/debug/vm_get_operator.o | Bin 0 -> 1212 bytes .../debug/vm_get_origin_release_verno.o | Bin 0 -> 1268 bytes .../mtk/system/libmtk/debug/vm_get_path.o | Bin 0 -> 1208 bytes .../libmtk/debug/vm_get_removable_driver.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_get_res_header.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_get_resource_offset.o | Bin 0 -> 1248 bytes .../debug/vm_get_resource_offset_from_file.o | Bin 0 -> 1292 bytes .../mtk/system/libmtk/debug/vm_get_rtc.o | Bin 0 -> 1204 bytes .../libmtk/debug/vm_get_sim_card_status.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_get_sys_property.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_get_sys_scene.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_get_sys_time_zone.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_get_system_driver.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_get_tag_by_lang_id.o | Bin 0 -> 1292 bytes .../system/libmtk/debug/vm_get_tick_count.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_get_time.o | Bin 0 -> 1204 bytes .../libmtk/debug/vm_get_total_mem_size.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_get_version.o | Bin 0 -> 1208 bytes .../mtk/system/libmtk/debug/vm_get_vm_tag.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_get_volume.o | Bin 0 -> 1208 bytes .../mtk/system/libmtk/debug/vm_getpeername.o | Bin 0 -> 1228 bytes .../mtk/system/libmtk/debug/vm_getsockname.o | Bin 0 -> 1228 bytes .../mtk/system/libmtk/debug/vm_getsockopt.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_global_free.o | Bin 0 -> 1216 bytes .../debug/vm_global_get_max_alloc_size.o | Bin 0 -> 1268 bytes .../system/libmtk/debug/vm_global_malloc.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_gps_close.o | Bin 0 -> 1204 bytes .../mtk/system/libmtk/debug/vm_gps_open.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_gps_set_mode.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_has_sim_card.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_htonl.o | Bin 0 -> 1196 bytes .../mtk/system/libmtk/debug/vm_htons.o | Bin 0 -> 1196 bytes .../system/libmtk/debug/vm_http_add_header.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_http_fetch_handle.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_http_free_handle.o | Bin 0 -> 1232 bytes .../libmtk/debug/vm_http_get_current_handle.o | Bin 0 -> 1260 bytes .../system/libmtk/debug/vm_http_recv_data.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_http_reg_receiver.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_http_reg_sender.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_http_request.o | Bin 0 -> 1224 bytes .../system/libmtk/debug/vm_http_send_data.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_http_set_body.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_http_set_current_handle.o | Bin 0 -> 1268 bytes .../mtk/system/libmtk/debug/vm_http_set_url.o | Bin 0 -> 1228 bytes ...vm_https_register_wps_cntxt_and_callback.o | Bin 0 -> 1380 bytes .../libmtk/debug/vm_https_send_cancel_req.o | Bin 0 -> 1256 bytes .../debug/vm_https_send_post_content_res.o | Bin 0 -> 1328 bytes .../debug/vm_https_send_read_content_req.o | Bin 0 -> 1288 bytes .../system/libmtk/debug/vm_https_send_req.o | Bin 0 -> 1296 bytes .../libmtk/debug/vm_https_send_req_ext.o | Bin 0 -> 1332 bytes .../debug/vm_https_send_set_channel_req.o | Bin 0 -> 1392 bytes .../debug/vm_https_send_unset_channel_req.o | Bin 0 -> 1280 bytes ..._idle_swatch_pedometer_register_callback.o | Bin 0 -> 1328 bytes .../mtk/system/libmtk/debug/vm_inet_addr.o | Bin 0 -> 1208 bytes .../libmtk/debug/vm_inet_ftpd_restart.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_inet_ftpd_start.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_inet_ftpd_stop.o | Bin 0 -> 1224 bytes .../debug/vm_inet_httpd_cgi_job_finish.o | Bin 0 -> 1272 bytes .../libmtk/debug/vm_inet_httpd_disable_ssl.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_inet_httpd_enable_ssl.o | Bin 0 -> 1284 bytes .../libmtk/debug/vm_inet_httpd_getenv.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_inet_httpd_read.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_inet_httpd_restart.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_inet_httpd_start.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_inet_httpd_stop.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_inet_httpd_write.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_inet_ntoa.o | Bin 0 -> 1208 bytes .../libmtk/debug/vm_inet_rtspd_register_cb.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_inet_rtspd_restart.o | Bin 0 -> 1252 bytes .../debug/vm_inet_rtspd_set_stream_identify.o | Bin 0 -> 1292 bytes .../system/libmtk/debug/vm_inet_rtspd_start.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_inet_rtspd_stop.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_is_empty_stack.o | Bin 0 -> 1232 bytes .../system/libmtk/debug/vm_is_exist_stack.o | Bin 0 -> 1236 bytes .../debug/vm_is_support_camera_sensor.o | Bin 0 -> 1260 bytes .../libmtk/debug/vm_is_support_gsensor.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_is_support_wifi.o | Bin 0 -> 1228 bytes .../mtk/system/libmtk/debug/vm_ivr_call.o | Bin 0 -> 1204 bytes .../system/libmtk/debug/vm_ivr_dial_number.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_ivr_end.o | Bin 0 -> 1196 bytes .../mtk/system/libmtk/debug/vm_listen.o | Bin 0 -> 1204 bytes .../system/libmtk/debug/vm_load_resource.o | Bin 0 -> 1228 bytes .../libmtk/debug/vm_load_resource_from_file.o | Bin 0 -> 1272 bytes .../vm_load_resource_use_outside_memory.o | Bin 0 -> 1340 bytes .../mtk/system/libmtk/debug/vm_lower_case.o | Bin 0 -> 1216 bytes .../debug/vm_magic_wrapper_for_customer.o | Bin 0 -> 1288 bytes .../mtk/system/libmtk/debug/vm_malloc.o | Bin 0 -> 1196 bytes .../mtk/system/libmtk/debug/vm_malloc_nc.o | Bin 0 -> 1208 bytes .../libmtk/debug/vm_malloc_nc_topmost.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_malloc_topmost.o | Bin 0 -> 1228 bytes .../mtk/system/libmtk/debug/vm_memcpy.o | Bin 0 -> 1204 bytes .../system/libmtk/debug/vm_midi_get_time.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_midi_pause.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_midi_play.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_midi_play_by_bytes.o | Bin 0 -> 1276 bytes .../libmtk/debug/vm_midi_play_by_bytes_ex.o | Bin 0 -> 1308 bytes .../mtk/system/libmtk/debug/vm_midi_play_ex.o | Bin 0 -> 1264 bytes .../mtk/system/libmtk/debug/vm_midi_resume.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_midi_set_type.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_midi_stop.o | Bin 0 -> 1208 bytes .../system/libmtk/debug/vm_midi_stop_all.o | Bin 0 -> 1216 bytes .../libmtk/debug/vm_mms_cancel_download.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_mms_cancel_send_mms.o | Bin 0 -> 1240 bytes .../vm_mms_clear_interrupt_event_handler.o | Bin 0 -> 1308 bytes .../mtk/system/libmtk/debug/vm_mms_delete.o | Bin 0 -> 1260 bytes .../mtk/system/libmtk/debug/vm_mms_download.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_mms_get_content.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_mms_get_msg_id_list.o | Bin 0 -> 1260 bytes .../mtk/system/libmtk/debug/vm_mms_launch.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_mms_send_mms.o | Bin 0 -> 1224 bytes .../vm_mms_set_interrupt_event_handler.o | Bin 0 -> 1308 bytes .../mtk/system/libmtk/debug/vm_mode_block.o | Bin 0 -> 1204 bytes .../mtk/system/libmtk/debug/vm_mode_unblock.o | Bin 0 -> 1208 bytes .../system/libmtk/debug/vm_nvram_get_data.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_nvram_set_data.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_peek_stack.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_phb_add_contact.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_phb_delete_contact.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_phb_get_contact.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_phb_get_contact_syn.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_phb_get_group_list.o | Bin 0 -> 1252 bytes .../debug/vm_phb_get_group_list_count.o | Bin 0 -> 1260 bytes .../debug/vm_phb_get_group_name_by_id.o | Bin 0 -> 1276 bytes .../libmtk/debug/vm_phb_get_total_contacts.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_phb_get_used_contacts.o | Bin 0 -> 1264 bytes .../debug/vm_phb_get_used_contacts_count.o | Bin 0 -> 1284 bytes .../libmtk/debug/vm_phb_search_contact.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_phb_search_contact_list.o | Bin 0 -> 1276 bytes .../libmtk/debug/vm_phb_search_contact_syn.o | Bin 0 -> 1268 bytes .../libmtk/debug/vm_phb_update_contact.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_pmng_delete_process.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_pmng_get_app_handle.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_pmng_get_current_handle.o | Bin 0 -> 1260 bytes .../system/libmtk/debug/vm_pmng_get_handle.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_pmng_reset_ctx.o | Bin 0 -> 1224 bytes .../vm_pmng_restore_default_event_filter.o | Bin 0 -> 1300 bytes .../libmtk/debug/vm_pmng_send_app_sys_event.o | Bin 0 -> 1268 bytes .../mtk/system/libmtk/debug/vm_pmng_set_bg.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_pmng_set_ctx.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_pmng_set_event_filter.o | Bin 0 -> 1260 bytes .../mtk/system/libmtk/debug/vm_pmng_set_fg.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_pmng_state.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_pn_dereg.o | Bin 0 -> 1196 bytes .../libmtk/debug/vm_pn_get_global_setting.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_pn_get_mps_info.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_pn_get_mps_info_ex.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_pn_get_object.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_pn_is_support.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_pn_query.o | Bin 0 -> 1208 bytes .../mtk/system/libmtk/debug/vm_pn_reg.o | Bin 0 -> 1204 bytes .../mtk/system/libmtk/debug/vm_pn_set_badge.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_pn_set_notify_style.o | Bin 0 -> 1256 bytes .../mtk/system/libmtk/debug/vm_popup_stack.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_post_msg.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_push_stack.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_query_operator_code.o | Bin 0 -> 1256 bytes .../mtk/system/libmtk/debug/vm_read_cache.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_read_from_uart.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_read_line.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_realloc.o | Bin 0 -> 1204 bytes .../system/libmtk/debug/vm_realloc_topmost.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_reboot_normal_start.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_record_pause.o | Bin 0 -> 1212 bytes .../system/libmtk/debug/vm_record_resume.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_record_start.o | Bin 0 -> 1268 bytes .../mtk/system/libmtk/debug/vm_record_stop.o | Bin 0 -> 1212 bytes .../arduino/mtk/system/libmtk/debug/vm_recv.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_recvfrom.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_reg_func_callback.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_reg_http_notification.o | Bin 0 -> 1256 bytes .../mtk/system/libmtk/debug/vm_reg_msg_proc.o | Bin 0 -> 1216 bytes .../libmtk/debug/vm_reg_sysevt_callback.o | Bin 0 -> 1248 bytes .../mtk/system/libmtk/debug/vm_reset_stack.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_resource_get_data.o | Bin 0 -> 1252 bytes .../debug/vm_resource_get_data_from_file.o | Bin 0 -> 1312 bytes .../system/libmtk/debug/vm_restore_irq_mask.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_safe_wstrcpy.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_save_irq_mask.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_select.o | Bin 0 -> 1244 bytes .../arduino/mtk/system/libmtk/debug/vm_send.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_send_msg.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_send_sms.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_sendto.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_set_active_sim_card.o | Bin 0 -> 1252 bytes .../debug/vm_set_app_desired_input_mode.o | Bin 0 -> 1276 bytes .../libmtk/debug/vm_set_cust_apn_info.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_set_kal_timer.o | Bin 0 -> 1268 bytes .../mtk/system/libmtk/debug/vm_set_ringtone.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_set_volume.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_setsockopt.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_setting_get_date_format.o | Bin 0 -> 1260 bytes .../debug/vm_setting_get_date_seperator.o | Bin 0 -> 1272 bytes .../libmtk/debug/vm_setting_get_time_format.o | Bin 0 -> 1260 bytes .../libmtk/debug/vm_setting_srv_command.o | Bin 0 -> 1300 bytes .../libmtk/debug/vm_settings_set_tone.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_settings_set_wallpaper.o | Bin 0 -> 1292 bytes .../mtk/system/libmtk/debug/vm_shutdown.o | Bin 0 -> 1208 bytes .../libmtk/debug/vm_shutdown_normal_start.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_sim_card_count.o | Bin 0 -> 1224 bytes .../libmtk/debug/vm_sim_get_active_sim_card.o | Bin 0 -> 1260 bytes .../libmtk/debug/vm_sim_get_card_status.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_sim_get_iccid.o | Bin 0 -> 1272 bytes .../mtk/system/libmtk/debug/vm_sim_get_imei.o | Bin 0 -> 1212 bytes .../system/libmtk/debug/vm_sim_get_imei_ext.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_sim_get_imsi.o | Bin 0 -> 1212 bytes .../system/libmtk/debug/vm_sim_get_operator.o | Bin 0 -> 1228 bytes .../libmtk/debug/vm_sim_get_prefer_sim_card.o | Bin 0 -> 1260 bytes .../mtk/system/libmtk/debug/vm_sim_has_card.o | Bin 0 -> 1212 bytes .../libmtk/debug/vm_sim_max_card_count.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_sim_query_operator_code.o | Bin 0 -> 1272 bytes .../libmtk/debug/vm_sim_set_active_card.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_sla_custom_logging.o | Bin 0 -> 1248 bytes .../mtk/system/libmtk/debug/vm_sms_add_msg.o | Bin 0 -> 1228 bytes .../vm_sms_clear_interrupt_event_handler.o | Bin 0 -> 1316 bytes ...sms_clear_interrupt_event_handler_forpay.o | Bin 0 -> 1340 bytes .../system/libmtk/debug/vm_sms_delete_msg.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_sms_delete_msg_forpay.o | Bin 0 -> 1268 bytes .../libmtk/debug/vm_sms_delete_msg_list.o | Bin 0 -> 1280 bytes .../system/libmtk/debug/vm_sms_get_box_size.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_sms_get_msg_id.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_sms_get_msg_id_list.o | Bin 0 -> 1260 bytes .../libmtk/debug/vm_sms_get_sc_address.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_sms_get_sc_address_syn.o | Bin 0 -> 1268 bytes .../system/libmtk/debug/vm_sms_is_sms_ready.o | Bin 0 -> 1228 bytes .../mtk/system/libmtk/debug/vm_sms_launch.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_sms_read_msg.o | Bin 0 -> 1264 bytes .../vm_sms_set_interrupt_event_handler.o | Bin 0 -> 1308 bytes ...m_sms_set_interrupt_event_handler_forpay.o | Bin 0 -> 1336 bytes .../libmtk/debug/vm_soc_get_account_localip.o | Bin 0 -> 1272 bytes .../libmtk/debug/vm_soc_get_host_by_name.o | Bin 0 -> 1280 bytes .../libmtk/debug/vm_soc_get_host_by_name_ex.o | Bin 0 -> 1312 bytes .../libmtk/debug/vm_soc_get_last_error.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_soc_svr_accept_sync.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_soc_svr_close_client.o | Bin 0 -> 1252 bytes .../debug/vm_soc_svr_close_client_sync.o | Bin 0 -> 1276 bytes .../system/libmtk/debug/vm_soc_svr_deinit.o | Bin 0 -> 1232 bytes .../libmtk/debug/vm_soc_svr_deinit_sync.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_soc_svr_get_soc_id.o | Bin 0 -> 1248 bytes .../mtk/system/libmtk/debug/vm_soc_svr_init.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_soc_svr_init_sync.o | Bin 0 -> 1248 bytes .../mtk/system/libmtk/debug/vm_soc_svr_read.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_soc_svr_read_sync.o | Bin 0 -> 1252 bytes .../mtk/system/libmtk/debug/vm_soc_svr_send.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_soc_svr_send_sync.o | Bin 0 -> 1252 bytes .../mtk/system/libmtk/debug/vm_socket.o | Bin 0 -> 1208 bytes .../mtk/system/libmtk/debug/vm_socket_ex.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_sprintf.o | Bin 0 -> 1216 bytes .../debug/vm_srv_bt_noti_check_connection.o | Bin 0 -> 1276 bytes .../debug/vm_srv_bt_noti_register_callback.o | Bin 0 -> 1300 bytes .../debug/vm_srv_bt_noti_send_cmd_ext.o | Bin 0 -> 1312 bytes .../libmtk/debug/vm_srv_bt_noti_send_ex.o | Bin 0 -> 1300 bytes .../libmtk/debug/vm_srv_funet_trigger.o | Bin 0 -> 1244 bytes .../debug/vm_srv_nw_info_get_protocol.o | Bin 0 -> 1268 bytes .../vm_srv_nw_info_get_service_availability.o | Bin 0 -> 1316 bytes .../vm_srv_sensor_acc_data_rigister_cb.o | Bin 0 -> 1296 bytes .../libmtk/debug/vm_srv_sensor_disable_mode.o | Bin 0 -> 1272 bytes .../libmtk/debug/vm_srv_sensor_enable_mode.o | Bin 0 -> 1268 bytes .../debug/vm_srv_sensor_hr_data_rigister_cb.o | Bin 0 -> 1292 bytes .../libmtk/debug/vm_srv_sensor_is_available.o | Bin 0 -> 1268 bytes .../libmtk/debug/vm_srv_sensor_start_listen.o | Bin 0 -> 1296 bytes .../libmtk/debug/vm_srv_sensor_stop_listen.o | Bin 0 -> 1264 bytes .../mtk/system/libmtk/debug/vm_sscanf.o | Bin 0 -> 1212 bytes .../libmtk/debug/vm_ssl_base64_decode.o | Bin 0 -> 1272 bytes .../libmtk/debug/vm_ssl_base64_encode.o | Bin 0 -> 1272 bytes .../mtk/system/libmtk/debug/vm_ssl_close.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_ssl_connect.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_ssl_get_verify_result.o | Bin 0 -> 1260 bytes .../system/libmtk/debug/vm_ssl_is_support.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_ssl_load_ca_chain_cert.o | Bin 0 -> 1272 bytes .../mtk/system/libmtk/debug/vm_ssl_read.o | Bin 0 -> 1212 bytes .../system/libmtk/debug/vm_ssl_sha1_hmac.o | Bin 0 -> 1272 bytes .../mtk/system/libmtk/debug/vm_ssl_write.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_sso_add_account.o | Bin 0 -> 1280 bytes .../mtk/system/libmtk/debug/vm_sso_cancel.o | Bin 0 -> 1216 bytes .../system/libmtk/debug/vm_sso_del_account.o | Bin 0 -> 1264 bytes .../system/libmtk/debug/vm_sso_get_account.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_sso_get_account_count.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_sso_get_account_name.o | Bin 0 -> 1260 bytes .../system/libmtk/debug/vm_sso_get_accounts.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_sso_get_credentials.o | Bin 0 -> 1260 bytes .../system/libmtk/debug/vm_sso_get_provider.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_sso_get_provider_count.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_sso_get_provider_icon.o | Bin 0 -> 1268 bytes .../libmtk/debug/vm_sso_get_provider_name.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_sso_get_providers.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_sso_login_account.o | Bin 0 -> 1288 bytes .../libmtk/debug/vm_sso_logout_account.o | Bin 0 -> 1276 bytes .../libmtk/debug/vm_sso_refresh_credentials.o | Bin 0 -> 1296 bytes .../mtk/system/libmtk/debug/vm_start_app.o | Bin 0 -> 1216 bytes .../libmtk/debug/vm_start_app_with_para.o | Bin 0 -> 1292 bytes .../system/libmtk/debug/vm_storage_close.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_storage_open.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_storage_read.o | Bin 0 -> 1264 bytes .../system/libmtk/debug/vm_storage_write.o | Bin 0 -> 1272 bytes .../system/libmtk/debug/vm_stream_connect.o | Bin 0 -> 1292 bytes .../libmtk/debug/vm_stream_disconnect.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_stream_set_volume.o | Bin 0 -> 1244 bytes .../debug/vm_string_equals_ignore_case.o | Bin 0 -> 1280 bytes .../mtk/system/libmtk/debug/vm_strtol.o | Bin 0 -> 1196 bytes .../system/libmtk/debug/vm_switch_backlight.o | Bin 0 -> 1232 bytes .../debug/vm_switch_power_saving_mode.o | Bin 0 -> 1268 bytes .../system/libmtk/debug/vm_sys_file_close.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_sys_file_delete.o | Bin 0 -> 1228 bytes .../libmtk/debug/vm_sys_file_get_space.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_sys_file_open.o | Bin 0 -> 1232 bytes .../system/libmtk/debug/vm_sys_file_read.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_sys_file_seek.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_sys_file_write.o | Bin 0 -> 1260 bytes .../mtk/system/libmtk/debug/vm_tcp_close.o | Bin 0 -> 1208 bytes .../system/libmtk/debug/vm_tcp_close_sync.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_tcp_connect.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_tcp_connect_ex.o | Bin 0 -> 1276 bytes .../system/libmtk/debug/vm_tcp_connect_sync.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_tcp_get_soc_id.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_tcp_read.o | Bin 0 -> 1212 bytes .../system/libmtk/debug/vm_tcp_read_sync.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_tcp_write.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_tcp_write_sync.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_thread_create.o | Bin 0 -> 1232 bytes .../debug/vm_thread_get_current_handle.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_thread_get_main_handle.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_thread_get_msg.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_thread_send_msg.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_tls_auto_rehandshake.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_tls_check_invalid_cert.o | Bin 0 -> 1268 bytes .../libmtk/debug/vm_tls_check_peer_name.o | Bin 0 -> 1256 bytes .../mtk/system/libmtk/debug/vm_tls_connect.o | Bin 0 -> 1224 bytes .../system/libmtk/debug/vm_tls_delete_conn.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_tls_delete_ctx.o | Bin 0 -> 1232 bytes .../system/libmtk/debug/vm_tls_get_cipher.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_tls_get_cipher_info.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_tls_get_peer_cert.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_tls_handshake.o | Bin 0 -> 1228 bytes .../libmtk/debug/vm_tls_log_plaintext.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_tls_new_conn.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_tls_new_ctx.o | Bin 0 -> 1264 bytes .../mtk/system/libmtk/debug/vm_tls_read.o | Bin 0 -> 1212 bytes .../system/libmtk/debug/vm_tls_rehandshake.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_tls_set_ciphers.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_tls_set_client_auth.o | Bin 0 -> 1260 bytes .../system/libmtk/debug/vm_tls_set_identity.o | Bin 0 -> 1240 bytes .../debug/vm_tls_set_null_client_auth.o | Bin 0 -> 1268 bytes .../system/libmtk/debug/vm_tls_set_verify.o | Bin 0 -> 1260 bytes .../mtk/system/libmtk/debug/vm_tls_shutdown.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_tls_soc_connect.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_tls_write.o | Bin 0 -> 1220 bytes .../mtk/system/libmtk/debug/vm_tmp_filename.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_ts_driver_free.o | Bin 0 -> 1228 bytes .../libmtk/debug/vm_ts_driver_get_handle.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_ts_driver_get_mem.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_ts_driver_load.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_ucs2_string_by_ascii.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_ucs2_to_ascii.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_ucs2_to_gb2312.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_udp_close.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_udp_create.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_udp_recvfrom.o | Bin 0 -> 1248 bytes .../mtk/system/libmtk/debug/vm_udp_sendto.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_update_cancel.o | Bin 0 -> 1228 bytes .../libmtk/debug/vm_update_check_launch.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_update_check_version.o | Bin 0 -> 1296 bytes .../system/libmtk/debug/vm_update_download.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_update_update_file.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_upnp_get_ext_ip.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_upnp_mapping_ports.o | Bin 0 -> 1276 bytes .../mtk/system/libmtk/debug/vm_upper_case.o | Bin 0 -> 1216 bytes .../libmtk/debug/vm_uriagent_uri_request.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_url_decode_gb2312.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_url_encode_gb2312.o | Bin 0 -> 1248 bytes .../libmtk/debug/vm_usb_get_cable_status.o | Bin 0 -> 1244 bytes .../libmtk/debug/vm_ust_get_current_time.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_ust_get_duration.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_vad_get_level.o | Bin 0 -> 1216 bytes .../mtk/system/libmtk/debug/vm_vad_is_on.o | Bin 0 -> 1200 bytes .../libmtk/debug/vm_vad_register_callback.o | Bin 0 -> 1256 bytes .../system/libmtk/debug/vm_vad_set_level.o | Bin 0 -> 1224 bytes .../libmtk/debug/vm_vad_switch_on_off.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_vdorec_pause.o | Bin 0 -> 1212 bytes .../libmtk/debug/vm_vdorec_power_down.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_vdorec_power_up.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_vdorec_preview.o | Bin 0 -> 1232 bytes .../system/libmtk/debug/vm_vdorec_record.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_vdorec_resume.o | Bin 0 -> 1220 bytes .../debug/vm_vdorec_rtsp_local_save_start.o | Bin 0 -> 1288 bytes .../debug/vm_vdorec_rtsp_local_save_stop.o | Bin 0 -> 1276 bytes .../libmtk/debug/vm_vdorec_save_to_file.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_vdorec_set_param.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_vdorec_stop.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_vibrator_off.o | Bin 0 -> 1208 bytes .../mtk/system/libmtk/debug/vm_vibrator_on.o | Bin 0 -> 1208 bytes .../system/libmtk/debug/vm_vibrator_once.o | Bin 0 -> 1216 bytes .../libmtk/debug/vm_video_close_buffer.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_video_close_file.o | Bin 0 -> 1228 bytes .../libmtk/debug/vm_video_get_cur_play_time.o | Bin 0 -> 1268 bytes .../libmtk/debug/vm_video_open_buffer.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_video_open_file.o | Bin 0 -> 1240 bytes .../mtk/system/libmtk/debug/vm_video_pause.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_video_play.o | Bin 0 -> 1264 bytes .../libmtk/debug/vm_video_play_by_filepath.o | Bin 0 -> 1264 bytes .../vm_video_play_stream_from_rtsp_link.o | Bin 0 -> 1300 bytes .../vm_video_play_stream_from_sdp_file.o | Bin 0 -> 1304 bytes .../mtk/system/libmtk/debug/vm_video_resume.o | Bin 0 -> 1212 bytes .../libmtk/debug/vm_video_seek_and_getframe.o | Bin 0 -> 1276 bytes .../libmtk/debug/vm_video_set_brightness.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_video_set_contrast.o | Bin 0 -> 1248 bytes .../system/libmtk/debug/vm_video_snapshot.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_video_stop.o | Bin 0 -> 1208 bytes .../mtk/system/libmtk/debug/vm_vsprintf.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_vwsprintf.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_wdt_feed.o | Bin 0 -> 1200 bytes .../mtk/system/libmtk/debug/vm_wdt_start.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_wdt_stop.o | Bin 0 -> 1200 bytes .../mtk/system/libmtk/debug/vm_wends_with.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_wifi_is_connected.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_wlan_connect.o | Bin 0 -> 1228 bytes .../system/libmtk/debug/vm_wlan_dereg_noti.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_wlan_disconnect.o | Bin 0 -> 1240 bytes .../debug/vm_wlan_get_connected_ap_info.o | Bin 0 -> 1284 bytes .../system/libmtk/debug/vm_wlan_get_ip_info.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_wlan_get_mac_address.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_wlan_get_para.o | Bin 0 -> 1232 bytes .../debug/vm_wlan_loc_get_connected_info.o | Bin 0 -> 1284 bytes .../system/libmtk/debug/vm_wlan_loc_search.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_wlan_loc_search_abort.o | Bin 0 -> 1260 bytes .../system/libmtk/debug/vm_wlan_mode_get.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_wlan_mode_set.o | Bin 0 -> 1236 bytes .../mtk/system/libmtk/debug/vm_wlan_perfer.o | Bin 0 -> 1220 bytes .../system/libmtk/debug/vm_wlan_prof_add.o | Bin 0 -> 1232 bytes .../libmtk/debug/vm_wlan_prof_connect.o | Bin 0 -> 1252 bytes .../system/libmtk/debug/vm_wlan_prof_delete.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_wlan_prof_get_reconn_id.o | Bin 0 -> 1268 bytes .../system/libmtk/debug/vm_wlan_prof_init.o | Bin 0 -> 1232 bytes .../system/libmtk/debug/vm_wlan_prof_query.o | Bin 0 -> 1240 bytes .../libmtk/debug/vm_wlan_prof_query_list.o | Bin 0 -> 1252 bytes .../libmtk/debug/vm_wlan_prof_set_reconn_id.o | Bin 0 -> 1268 bytes .../system/libmtk/debug/vm_wlan_prof_update.o | Bin 0 -> 1244 bytes .../system/libmtk/debug/vm_wlan_reg_noti.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_wlan_roaming_get.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_wlan_roaming_set.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_wlan_scan.o | Bin 0 -> 1216 bytes .../system/libmtk/debug/vm_wlan_scan_abort.o | Bin 0 -> 1236 bytes .../libmtk/debug/vm_wlan_scan_get_param.o | Bin 0 -> 1256 bytes .../libmtk/debug/vm_wlan_scan_set_param.o | Bin 0 -> 1280 bytes .../system/libmtk/debug/vm_wlan_set_para.o | Bin 0 -> 1236 bytes .../system/libmtk/debug/vm_wlan_sniffer_off.o | Bin 0 -> 1240 bytes .../system/libmtk/debug/vm_wlan_sniffer_on.o | Bin 0 -> 1244 bytes .../mtk/system/libmtk/debug/vm_wlan_status.o | Bin 0 -> 1212 bytes .../mtk/system/libmtk/debug/vm_write_cache.o | Bin 0 -> 1228 bytes .../mtk/system/libmtk/debug/vm_wstarts_with.o | Bin 0 -> 1224 bytes .../mtk/system/libmtk/debug/vm_wstrcat.o | Bin 0 -> 1208 bytes .../mtk/system/libmtk/debug/vm_wstrcmp.o | Bin 0 -> 1208 bytes .../libmtk/debug/vm_wstrcmp_ignore_case.o | Bin 0 -> 1256 bytes .../mtk/system/libmtk/debug/vm_wstrcpy.o | Bin 0 -> 1208 bytes .../mtk/system/libmtk/debug/vm_wstrlen.o | Bin 0 -> 1204 bytes .../mtk/system/libmtk/debug/vm_wstrncpy.o | Bin 0 -> 1212 bytes .../system/libmtk/debug/vm_xml_get_error.o | Bin 0 -> 1216 bytes .../system/libmtk/debug/vm_xml_new_parser.o | Bin 0 -> 1232 bytes .../mtk/system/libmtk/debug/vm_xml_parse.o | Bin 0 -> 1220 bytes .../libmtk/debug/vm_xml_set_data_handler.o | Bin 0 -> 1252 bytes .../debug/vm_xml_set_doctype_handlers.o | Bin 0 -> 1272 bytes .../debug/vm_xml_set_element_handlers.o | Bin 0 -> 1272 bytes .../arduino/mtk/system/libmtk/debug/vmdcl.o | Bin 0 -> 3508 bytes .../arduino/mtk/system/libmtk/debug/vmlog.o | Bin 0 -> 2240 bytes .../mtk/system/libmtk/debug/vmthread.o | Bin 0 -> 3640 bytes .../mtk/system/libmtk/include/vm4res.h | 627 ++++ .../mtk/system/libmtk/include/vmalarm.h | 104 + .../mtk/system/libmtk/include/vmappcomm.h | 246 ++ .../mtk/system/libmtk/include/vmappmgr.h | 365 +++ .../mtk/system/libmtk/include/vmatcmd.h | 240 ++ .../mtk/system/libmtk/include/vmbase64.h | 478 +++ .../mtk/system/libmtk/include/vmbitstream.h | 386 +++ .../mtk/system/libmtk/include/vmbridge.h | 192 ++ .../mtk/system/libmtk/include/vmbtcm.h | 453 +++ .../mtk/system/libmtk/include/vmbtgatt.h | 880 ++++++ .../mtk/system/libmtk/include/vmbtnotify.h | 187 ++ .../mtk/system/libmtk/include/vmbtspp.h | 322 ++ .../mtk/system/libmtk/include/vmcamera.h | 1038 +++++++ .../mtk/system/libmtk/include/vmcell.h | 129 + .../mtk/system/libmtk/include/vmcert.h | 195 ++ .../arduino/mtk/system/libmtk/include/vmche.h | 965 ++++++ .../mtk/system/libmtk/include/vmchset.h | 332 ++ .../mtk/system/libmtk/include/vmconn.h | 1186 ++++++++ .../mtk/system/libmtk/include/vmcontact.h | 402 +++ .../arduino/mtk/system/libmtk/include/vmda.h | 194 ++ .../mtk/system/libmtk/include/vmdatetime.h | 185 ++ .../arduino/mtk/system/libmtk/include/vmdcl.h | 517 ++++ .../mtk/system/libmtk/include/vmdcl_adc.h | 101 + .../mtk/system/libmtk/include/vmdcl_eint.h | 124 + .../mtk/system/libmtk/include/vmdcl_gpio.h | 251 ++ .../mtk/system/libmtk/include/vmdcl_i2c.h | 359 +++ .../mtk/system/libmtk/include/vmdcl_pmu.h | 269 ++ .../mtk/system/libmtk/include/vmdcl_pwm.h | 91 + .../mtk/system/libmtk/include/vmdcl_sio.h | 439 +++ .../mtk/system/libmtk/include/vmdcl_spi.h | 523 ++++ .../arduino/mtk/system/libmtk/include/vmdes.h | 116 + .../mtk/system/libmtk/include/vmdhcp.h | 185 ++ .../arduino/mtk/system/libmtk/include/vmdns.h | 60 + .../mtk/system/libmtk/include/vmeditor.h | 886 ++++++ .../mtk/system/libmtk/include/vmemcmd.h | 98 + .../mtk/system/libmtk/include/vmfota.h | 203 ++ .../mtk/system/libmtk/include/vmftpd.h | 150 + .../mtk/system/libmtk/include/vmgettag.h | 321 ++ .../mtk/system/libmtk/include/vmgfxold.h | 680 +++++ .../arduino/mtk/system/libmtk/include/vmgps.h | 352 +++ .../mtk/system/libmtk/include/vmgraph.h | 2676 +++++++++++++++++ .../mtk/system/libmtk/include/vmhttp.h | 966 ++++++ .../mtk/system/libmtk/include/vmhttpd.h | 359 +++ .../mtk/system/libmtk/include/vmhttps.h | 538 ++++ .../mtk/system/libmtk/include/vminput.h | 654 ++++ .../arduino/mtk/system/libmtk/include/vmio.h | 1325 ++++++++ .../mtk/system/libmtk/include/vmjava.h | 81 + .../mtk/system/libmtk/include/vmkeypad.h | 281 ++ .../arduino/mtk/system/libmtk/include/vmlog.h | 147 + .../mtk/system/libmtk/include/vmmagic.h | 78 + .../arduino/mtk/system/libmtk/include/vmmm.h | 963 ++++++ .../arduino/mtk/system/libmtk/include/vmmms.h | 1183 ++++++++ .../mtk/system/libmtk/include/vmmullang.h | 176 ++ .../arduino/mtk/system/libmtk/include/vmnat.h | 233 ++ .../mtk/system/libmtk/include/vmnvram.h | 115 + .../mtk/system/libmtk/include/vmnwsetting.h | 1639 ++++++++++ .../arduino/mtk/system/libmtk/include/vmota.h | 140 + .../mtk/system/libmtk/include/vmpayment.h | 103 + .../arduino/mtk/system/libmtk/include/vmpn.h | 316 ++ .../mtk/system/libmtk/include/vmpromng.h | 719 +++++ .../arduino/mtk/system/libmtk/include/vmpwr.h | 328 ++ .../arduino/mtk/system/libmtk/include/vmres.h | 335 +++ .../mtk/system/libmtk/include/vmrtspd.h | 176 ++ .../mtk/system/libmtk/include/vmsalui.h | 149 + .../mtk/system/libmtk/include/vmsensor.h | 352 +++ .../mtk/system/libmtk/include/vmsettings.h | 616 ++++ .../arduino/mtk/system/libmtk/include/vmsim.h | 417 +++ .../arduino/mtk/system/libmtk/include/vmsm.h | 310 ++ .../arduino/mtk/system/libmtk/include/vmsms.h | 822 +++++ .../arduino/mtk/system/libmtk/include/vmso.h | 150 + .../mtk/system/libmtk/include/vmsock.h | 1545 ++++++++++ .../mtk/system/libmtk/include/vmsrvmng.h | 51 + .../arduino/mtk/system/libmtk/include/vmssl.h | 328 ++ .../arduino/mtk/system/libmtk/include/vmsso.h | 446 +++ .../mtk/system/libmtk/include/vmstatusbar.h | 269 ++ .../mtk/system/libmtk/include/vmstdlib.h | 681 +++++ .../mtk/system/libmtk/include/vmstream.h | 172 ++ .../arduino/mtk/system/libmtk/include/vmsys.h | 330 ++ .../arduino/mtk/system/libmtk/include/vmtcp.h | 961 ++++++ .../arduino/mtk/system/libmtk/include/vmtel.h | 405 +++ .../mtk/system/libmtk/include/vmthread.h | 618 ++++ .../mtk/system/libmtk/include/vmtimer.h | 227 ++ .../arduino/mtk/system/libmtk/include/vmtls.h | 508 ++++ .../mtk/system/libmtk/include/vmtouch.h | 272 ++ .../mtk/system/libmtk/include/vmtsdcl.h | 335 +++ .../mtk/system/libmtk/include/vmtsdcl_eint.h | 80 + .../mtk/system/libmtk/include/vmtsdcl_gpio.h | 174 ++ .../mtk/system/libmtk/include/vmtsdcl_i2c.h | 116 + .../mtk/system/libmtk/include/vmtsdcl_rtc.h | 100 + .../mtk/system/libmtk/include/vmtsdcl_uart.h | 291 ++ .../mtk/system/libmtk/include/vmtsloader.h | 260 ++ .../mtk/system/libmtk/include/vmtssys.h | 503 ++++ .../mtk/system/libmtk/include/vmuart.h | 146 + .../arduino/mtk/system/libmtk/include/vmudp.h | 198 ++ .../mtk/system/libmtk/include/vmuiapp.h | 283 ++ .../mtk/system/libmtk/include/vmuimisc.h | 192 ++ .../arduino/mtk/system/libmtk/include/vmusb.h | 85 + .../arduino/mtk/system/libmtk/include/vmvad.h | 125 + .../mtk/system/libmtk/include/vmvdorec.h | 334 ++ .../mtk/system/libmtk/include/vmvibr.h | 75 + .../mtk/system/libmtk/include/vmvideo.h | 608 ++++ .../arduino/mtk/system/libmtk/include/vmwdt.h | 138 + .../arduino/mtk/system/libmtk/include/vmxml.h | 337 +++ .../source/modules/libmtk/get_http_head.c | 20 + .../modules/libmtk/get_http_head_by_index.c | 20 + .../modules/libmtk/get_http_head_number.c | 20 + .../modules/libmtk/get_today_from_2000.c | 19 + .../libmtk/source/modules/libmtk/rand.c | 17 + .../libmtk/source/modules/libmtk/srand.c | 17 + .../libmtk/source/modules/libmtk/strtoi.c | 20 + .../libmtk/source/modules/libmtk/vm4res.c | 252 ++ .../libmtk/source/modules/libmtk/vm_accept.c | 17 + .../libmtk/source/modules/libmtk/vm_app_log.c | 16 + .../libmtk/vm_appcomm_dereg_msg_proc.c | 19 + .../modules/libmtk/vm_appcomm_dispatch_msg.c | 19 + .../source/modules/libmtk/vm_appcomm_init.c | 19 + .../modules/libmtk/vm_appcomm_post_msg.c | 19 + .../modules/libmtk/vm_appcomm_reg_msg_proc.c | 19 + .../modules/libmtk/vm_appcomm_send_msg.c | 19 + .../source/modules/libmtk/vm_ascii_to_ucs2.c | 19 + .../libmtk/source/modules/libmtk/vm_assert.c | 17 + .../source/modules/libmtk/vm_asyn_http_req.c | 19 + .../libmtk/source/modules/libmtk/vm_atof.c | 17 + .../modules/libmtk/vm_audio_bytes_duration.c | 19 + .../vm_audio_clear_interrupt_callback.c | 17 + .../source/modules/libmtk/vm_audio_duration.c | 19 + .../source/modules/libmtk/vm_audio_get_time.c | 19 + .../modules/libmtk/vm_audio_is_app_playing.c | 19 + .../modules/libmtk/vm_audio_is_calling.c | 19 + .../modules/libmtk/vm_audio_mixed_close.c | 17 + .../modules/libmtk/vm_audio_mixed_close_all.c | 17 + .../modules/libmtk/vm_audio_mixed_get_time.c | 18 + .../modules/libmtk/vm_audio_mixed_open.c | 18 + .../modules/libmtk/vm_audio_mixed_pause.c | 18 + .../modules/libmtk/vm_audio_mixed_play.c | 18 + .../modules/libmtk/vm_audio_mixed_resume.c | 18 + .../libmtk/vm_audio_mixed_set_speedup_mode.c | 17 + .../libmtk/vm_audio_mixed_set_start_time.c | 18 + .../modules/libmtk/vm_audio_mixed_stop.c | 17 + .../source/modules/libmtk/vm_audio_pause.c | 19 + .../vm_audio_pitch_shifting_set_level.c | 19 + .../libmtk/vm_audio_pitch_shifting_turn_off.c | 19 + .../libmtk/vm_audio_pitch_shifting_turn_on.c | 19 + .../modules/libmtk/vm_audio_play_beep.c | 17 + .../modules/libmtk/vm_audio_play_bytes.c | 19 + .../libmtk/vm_audio_play_bytes_no_block.c | 18 + .../modules/libmtk/vm_audio_play_file.c | 19 + .../modules/libmtk/vm_audio_play_file_ex.c | 19 + .../vm_audio_register_interrupt_callback.c | 19 + .../source/modules/libmtk/vm_audio_resume.c | 19 + .../modules/libmtk/vm_audio_resume_bg_play.c | 17 + .../modules/libmtk/vm_audio_set_volume_type.c | 19 + .../source/modules/libmtk/vm_audio_stop.c | 19 + .../source/modules/libmtk/vm_audio_stop_all.c | 19 + .../modules/libmtk/vm_audio_suspend_bg_play.c | 17 + .../vm_audio_terminate_background_play.c | 17 + .../libmtk/vm_audio_vocal_removal_turn_off.c | 19 + .../libmtk/vm_audio_vocal_removal_turn_on.c | 19 + .../modules/libmtk/vm_base64_decode_basic.c | 19 + .../modules/libmtk/vm_base64_encode_basic.c | 19 + .../libmtk/vm_base64_part_decode_append.c | 19 + .../libmtk/vm_base64_part_decode_finish.c | 19 + .../libmtk/vm_base64_part_decode_init.c | 19 + .../libmtk/vm_base64_part_encode_append.c | 19 + .../libmtk/vm_base64_part_encode_finish.c | 19 + .../libmtk/vm_base64_part_encode_init.c | 19 + .../source/modules/libmtk/vm_bearer_close.c | 17 + .../source/modules/libmtk/vm_bearer_open.c | 17 + .../libmtk/source/modules/libmtk/vm_bind.c | 17 + .../source/modules/libmtk/vm_bridge_close.c | 19 + .../source/modules/libmtk/vm_bridge_create.c | 19 + .../modules/libmtk/vm_bt_cm_send_passkey.c | 17 + .../libmtk/vm_bt_noti_check_channel_valid.c | 17 + .../libmtk/vm_bt_noti_get_bt_device_addr.c | 17 + .../source/modules/libmtk/vm_btcm_exit.c | 18 + .../libmtk/vm_btcm_get_dev_info_by_index.c | 18 + .../modules/libmtk/vm_btcm_get_dev_num.c | 18 + .../libmtk/vm_btcm_get_host_dev_info.c | 18 + .../modules/libmtk/vm_btcm_get_power_status.c | 18 + .../source/modules/libmtk/vm_btcm_init.c | 18 + .../source/modules/libmtk/vm_btcm_search.c | 18 + .../modules/libmtk/vm_btcm_search_abort.c | 18 + .../modules/libmtk/vm_btcm_set_host_name.c | 18 + .../libmtk/vm_btcm_srv_get_visibility.c | 18 + .../libmtk/vm_btcm_srv_set_visibility.c | 18 + .../modules/libmtk/vm_btcm_switch_off.c | 18 + .../source/modules/libmtk/vm_btcm_switch_on.c | 18 + .../source/modules/libmtk/vm_btspp_accept.c | 18 + .../source/modules/libmtk/vm_btspp_bind.c | 18 + .../source/modules/libmtk/vm_btspp_close.c | 18 + .../source/modules/libmtk/vm_btspp_connect.c | 18 + .../modules/libmtk/vm_btspp_connect_ex.c | 18 + .../modules/libmtk/vm_btspp_disconnect.c | 18 + .../modules/libmtk/vm_btspp_get_dev_addr.c | 18 + .../libmtk/vm_btspp_get_min_buf_size.c | 18 + .../source/modules/libmtk/vm_btspp_open.c | 18 + .../source/modules/libmtk/vm_btspp_read.c | 18 + .../source/modules/libmtk/vm_btspp_reject.c | 18 + .../libmtk/vm_btspp_set_security_level.c | 18 + .../libmtk/vm_btspp_set_service_name.c | 18 + .../source/modules/libmtk/vm_btspp_write.c | 18 + .../modules/libmtk/vm_cache_read_char.c | 19 + .../source/modules/libmtk/vm_call_actions.c | 20 + .../modules/libmtk/vm_call_reg_listener.c | 20 + .../libmtk/source/modules/libmtk/vm_calloc.c | 20 + .../libmtk/source/modules/libmtk/vm_callout.c | 19 + .../source/modules/libmtk/vm_callout_ex.c | 19 + .../source/modules/libmtk/vm_camera_startup.c | 18 + .../libmtk/vm_cancel_all_http_sessions.c | 19 + .../modules/libmtk/vm_cancel_asyn_http_req.c | 19 + .../modules/libmtk/vm_cancel_kal_timer.c | 16 + .../modules/libmtk/vm_cancel_send_sms.c | 19 + .../modules/libmtk/vm_cbm_hold_bearer.c | 19 + .../modules/libmtk/vm_cbm_release_bearer.c | 19 + .../source/modules/libmtk/vm_ce_auth_app_ex.c | 19 + .../source/modules/libmtk/vm_cell_close.c | 19 + .../libmtk/vm_cell_get_cur_cell_info.c | 19 + .../libmtk/vm_cell_get_nbr_cell_info.c | 19 + .../modules/libmtk/vm_cell_get_nbr_num.c | 19 + .../source/modules/libmtk/vm_cell_open.c | 19 + .../modules/libmtk/vm_charbat_is_charging.c | 19 + .../source/modules/libmtk/vm_che_deinit.c | 18 + .../source/modules/libmtk/vm_che_init.c | 17 + .../source/modules/libmtk/vm_che_key_action.c | 18 + .../source/modules/libmtk/vm_che_process.c | 21 + .../libmtk/vm_che_rsa_private_decrypt.c | 21 + .../libmtk/vm_che_rsa_private_encrypt.c | 21 + .../libmtk/vm_che_rsa_public_decrypt.c | 21 + .../libmtk/vm_che_rsa_public_encrypt.c | 21 + .../source/modules/libmtk/vm_che_set_iv.c | 18 + .../source/modules/libmtk/vm_chset_convert.c | 19 + .../source/modules/libmtk/vm_closesocket.c | 17 + .../modules/libmtk/vm_command_close_port.c | 16 + .../modules/libmtk/vm_command_open_port.c | 17 + .../source/modules/libmtk/vm_command_reply.c | 18 + .../libmtk/source/modules/libmtk/vm_connect.c | 17 + .../modules/libmtk/vm_create_array_stack.c | 19 + .../modules/libmtk/vm_create_dyn_array.c | 19 + .../modules/libmtk/vm_create_kal_timer.c | 17 + .../modules/libmtk/vm_create_linked_stack.c | 19 + .../source/modules/libmtk/vm_create_timer.c | 19 + .../modules/libmtk/vm_create_timer_ex.c | 19 + .../libmtk/vm_custom_set_bt_pairing_method.c | 16 + .../libmtk/vm_da_display_download_list.c | 19 + .../modules/libmtk/vm_da_http_dl_operation.c | 19 + .../libmtk/vm_da_http_start_download.c | 19 + .../source/modules/libmtk/vm_delete_timer.c | 19 + .../modules/libmtk/vm_delete_timer_ex.c | 19 + .../source/modules/libmtk/vm_des_decrypt.c | 19 + .../source/modules/libmtk/vm_des_encrypt.c | 19 + .../source/modules/libmtk/vm_des_reset_key.c | 19 + .../source/modules/libmtk/vm_des_set_key.c | 20 + .../source/modules/libmtk/vm_destroy_stack.c | 19 + .../modules/libmtk/vm_dhcp_client_get_mode.c | 21 + .../modules/libmtk/vm_dhcp_client_set_mode.c | 21 + .../modules/libmtk/vm_dhcp_server_get_mode.c | 21 + .../modules/libmtk/vm_dhcp_server_get_param.c | 21 + .../modules/libmtk/vm_dhcp_server_set_mode.c | 21 + .../modules/libmtk/vm_dhcp_server_set_param.c | 21 + .../source/modules/libmtk/vm_dialer_launch.c | 19 + .../source/modules/libmtk/vm_dns_get_state.c | 21 + .../source/modules/libmtk/vm_dns_start.c | 21 + .../source/modules/libmtk/vm_dns_stop.c | 21 + .../source/modules/libmtk/vm_dtacct_select.c | 20 + .../source/modules/libmtk/vm_dtacct_set.c | 21 + .../source/modules/libmtk/vm_dyn_array_add.c | 19 + .../source/modules/libmtk/vm_dyn_array_del.c | 19 + .../modules/libmtk/vm_dyn_array_del_all.c | 19 + .../modules/libmtk/vm_em_send_command.c | 19 + .../source/modules/libmtk/vm_enable_proxy.c | 19 + .../source/modules/libmtk/vm_ends_with.c | 19 + .../source/modules/libmtk/vm_exit_app.c | 19 + .../source/modules/libmtk/vm_file_close.c | 19 + .../source/modules/libmtk/vm_file_commit.c | 19 + .../source/modules/libmtk/vm_file_copy.c | 19 + .../modules/libmtk/vm_file_copy_abort.c | 19 + .../source/modules/libmtk/vm_file_delete.c | 19 + .../modules/libmtk/vm_file_get_attributes.c | 19 + .../modules/libmtk/vm_file_get_modify_time.c | 19 + .../modules/libmtk/vm_file_getfilesize.c | 19 + .../source/modules/libmtk/vm_file_is_eof.c | 19 + .../source/modules/libmtk/vm_file_mkdir.c | 19 + .../source/modules/libmtk/vm_file_open.c | 19 + .../source/modules/libmtk/vm_file_read.c | 19 + .../source/modules/libmtk/vm_file_rename.c | 19 + .../source/modules/libmtk/vm_file_rmdir.c | 19 + .../source/modules/libmtk/vm_file_seek.c | 19 + .../modules/libmtk/vm_file_set_attributes.c | 19 + .../source/modules/libmtk/vm_file_tell.c | 19 + .../source/modules/libmtk/vm_file_write.c | 19 + .../source/modules/libmtk/vm_find_close.c | 19 + .../source/modules/libmtk/vm_find_close_ext.c | 19 + .../source/modules/libmtk/vm_find_first.c | 19 + .../source/modules/libmtk/vm_find_first_ext.c | 19 + .../source/modules/libmtk/vm_find_next.c | 19 + .../source/modules/libmtk/vm_find_next_ext.c | 19 + ...vm_fly_mode_is_network_service_available.c | 19 + .../modules/libmtk/vm_fly_mode_is_switching.c | 19 + .../modules/libmtk/vm_fly_mode_switch.c | 19 + .../libmtk/source/modules/libmtk/vm_free.c | 19 + .../source/modules/libmtk/vm_free_dyn_array.c | 19 + .../source/modules/libmtk/vm_fs_async_abort.c | 19 + .../source/modules/libmtk/vm_fs_async_close.c | 19 + .../modules/libmtk/vm_fs_async_commit.c | 19 + .../modules/libmtk/vm_fs_async_delete.c | 19 + .../libmtk/vm_fs_async_get_working_buf_size.c | 19 + .../source/modules/libmtk/vm_fs_async_open.c | 19 + .../source/modules/libmtk/vm_fs_async_read.c | 19 + .../source/modules/libmtk/vm_fs_async_seek.c | 19 + .../source/modules/libmtk/vm_fs_async_write.c | 19 + .../source/modules/libmtk/vm_gb2312_string.c | 19 + .../source/modules/libmtk/vm_gb2312_to_ucs2.c | 19 + .../source/modules/libmtk/vm_get_apn_info.c | 19 + .../libmtk/vm_get_asyn_http_req_handle.c | 19 + .../modules/libmtk/vm_get_battery_level.c | 19 + .../modules/libmtk/vm_get_cache_free_space.c | 19 + .../source/modules/libmtk/vm_get_curr_utc.c | 21 + .../libmtk/vm_get_current_lang_country_code.c | 19 + .../modules/libmtk/vm_get_cust_apn_info.c | 19 + .../modules/libmtk/vm_get_customer_name.c | 22 + .../modules/libmtk/vm_get_default_apn_info.c | 19 + .../libmtk/vm_get_default_folder_path.c | 18 + .../modules/libmtk/vm_get_disk_free_space.c | 19 + .../source/modules/libmtk/vm_get_disk_info.c | 19 + .../modules/libmtk/vm_get_encoded_dtacct_id.c | 19 + .../modules/libmtk/vm_get_exec_filename.c | 19 + .../source/modules/libmtk/vm_get_filename.c | 19 + .../libmtk/vm_get_full_path_by_short_name.c | 16 + .../source/modules/libmtk/vm_get_imei.c | 19 + .../source/modules/libmtk/vm_get_imei_ext.c | 19 + .../source/modules/libmtk/vm_get_imsi.c | 19 + .../source/modules/libmtk/vm_get_language.c | 20 + .../modules/libmtk/vm_get_language_ssc.c | 19 + .../modules/libmtk/vm_get_malloc_stat.c | 19 + .../source/modules/libmtk/vm_get_modules.c | 18 + .../modules/libmtk/vm_get_mre_modules.c | 18 + .../libmtk/vm_get_mre_total_mem_size.c | 19 + .../modules/libmtk/vm_get_mre_version.c | 19 + .../source/modules/libmtk/vm_get_multi_tags.c | 19 + .../libmtk/vm_get_multi_tags_by_lang_id.c | 19 + .../source/modules/libmtk/vm_get_operator.c | 20 + .../libmtk/vm_get_origin_release_verno.c | 22 + .../source/modules/libmtk/vm_get_path.c | 19 + .../modules/libmtk/vm_get_removable_driver.c | 19 + .../source/modules/libmtk/vm_get_res_header.c | 18 + .../modules/libmtk/vm_get_resource_offset.c | 19 + .../libmtk/vm_get_resource_offset_from_file.c | 19 + .../libmtk/source/modules/libmtk/vm_get_rtc.c | 21 + .../modules/libmtk/vm_get_sim_card_status.c | 20 + .../modules/libmtk/vm_get_sys_property.c | 19 + .../source/modules/libmtk/vm_get_sys_scene.c | 19 + .../modules/libmtk/vm_get_sys_time_zone.c | 20 + .../modules/libmtk/vm_get_system_driver.c | 19 + .../modules/libmtk/vm_get_tag_by_lang_id.c | 19 + .../source/modules/libmtk/vm_get_tick_count.c | 19 + .../source/modules/libmtk/vm_get_time.c | 19 + .../modules/libmtk/vm_get_total_mem_size.c | 19 + .../source/modules/libmtk/vm_get_version.c | 19 + .../source/modules/libmtk/vm_get_vm_tag.c | 19 + .../source/modules/libmtk/vm_get_volume.c | 19 + .../source/modules/libmtk/vm_getpeername.c | 17 + .../source/modules/libmtk/vm_getsockname.c | 17 + .../source/modules/libmtk/vm_getsockopt.c | 17 + .../source/modules/libmtk/vm_global_free.c | 19 + .../libmtk/vm_global_get_max_alloc_size.c | 19 + .../source/modules/libmtk/vm_global_malloc.c | 19 + .../source/modules/libmtk/vm_gps_close.c | 19 + .../source/modules/libmtk/vm_gps_open.c | 19 + .../source/modules/libmtk/vm_gps_set_mode.c | 19 + .../source/modules/libmtk/vm_has_sim_card.c | 19 + .../libmtk/source/modules/libmtk/vm_htonl.c | 17 + .../libmtk/source/modules/libmtk/vm_htons.c | 17 + .../modules/libmtk/vm_http_add_header.c | 19 + .../modules/libmtk/vm_http_fetch_handle.c | 19 + .../modules/libmtk/vm_http_free_handle.c | 19 + .../libmtk/vm_http_get_current_handle.c | 19 + .../source/modules/libmtk/vm_http_recv_data.c | 19 + .../modules/libmtk/vm_http_reg_receiver.c | 19 + .../modules/libmtk/vm_http_reg_sender.c | 19 + .../source/modules/libmtk/vm_http_request.c | 20 + .../source/modules/libmtk/vm_http_send_data.c | 19 + .../source/modules/libmtk/vm_http_set_body.c | 19 + .../libmtk/vm_http_set_current_handle.c | 19 + .../source/modules/libmtk/vm_http_set_url.c | 19 + ...vm_https_register_wps_cntxt_and_callback.c | 44 + .../modules/libmtk/vm_https_send_cancel_req.c | 18 + .../libmtk/vm_https_send_post_content_res.c | 30 + .../libmtk/vm_https_send_read_content_req.c | 29 + .../source/modules/libmtk/vm_https_send_req.c | 52 + .../modules/libmtk/vm_https_send_req_ext.c | 44 + .../libmtk/vm_https_send_set_channel_req.c | 60 + .../libmtk/vm_https_send_unset_channel_req.c | 19 + ..._idle_swatch_pedometer_register_callback.c | 16 + .../source/modules/libmtk/vm_inet_addr.c | 17 + .../modules/libmtk/vm_inet_ftpd_restart.c | 19 + .../modules/libmtk/vm_inet_ftpd_start.c | 19 + .../source/modules/libmtk/vm_inet_ftpd_stop.c | 19 + .../libmtk/vm_inet_httpd_cgi_job_finish.c | 18 + .../libmtk/vm_inet_httpd_disable_ssl.c | 18 + .../modules/libmtk/vm_inet_httpd_enable_ssl.c | 18 + .../modules/libmtk/vm_inet_httpd_getenv.c | 19 + .../modules/libmtk/vm_inet_httpd_read.c | 19 + .../modules/libmtk/vm_inet_httpd_restart.c | 19 + .../modules/libmtk/vm_inet_httpd_start.c | 19 + .../modules/libmtk/vm_inet_httpd_stop.c | 19 + .../modules/libmtk/vm_inet_httpd_write.c | 19 + .../source/modules/libmtk/vm_inet_ntoa.c | 17 + .../libmtk/vm_inet_rtspd_register_cb.c | 19 + .../modules/libmtk/vm_inet_rtspd_restart.c | 19 + .../vm_inet_rtspd_set_stream_identify.c | 18 + .../modules/libmtk/vm_inet_rtspd_start.c | 19 + .../modules/libmtk/vm_inet_rtspd_stop.c | 19 + .../source/modules/libmtk/vm_is_empty_stack.c | 19 + .../source/modules/libmtk/vm_is_exist_stack.c | 19 + .../libmtk/vm_is_support_camera_sensor.c | 19 + .../modules/libmtk/vm_is_support_gsensor.c | 19 + .../modules/libmtk/vm_is_support_wifi.c | 19 + .../source/modules/libmtk/vm_ivr_call.c | 19 + .../modules/libmtk/vm_ivr_dial_number.c | 19 + .../libmtk/source/modules/libmtk/vm_ivr_end.c | 19 + .../libmtk/source/modules/libmtk/vm_listen.c | 17 + .../source/modules/libmtk/vm_load_resource.c | 19 + .../libmtk/vm_load_resource_from_file.c | 19 + .../vm_load_resource_use_outside_memory.c | 19 + .../source/modules/libmtk/vm_lower_case.c | 19 + .../libmtk/vm_magic_wrapper_for_customer.c | 17 + .../libmtk/source/modules/libmtk/vm_malloc.c | 20 + .../source/modules/libmtk/vm_malloc_nc.c | 19 + .../modules/libmtk/vm_malloc_nc_topmost.c | 19 + .../source/modules/libmtk/vm_malloc_topmost.c | 20 + .../libmtk/source/modules/libmtk/vm_memcpy.c | 19 + .../source/modules/libmtk/vm_midi_get_time.c | 19 + .../source/modules/libmtk/vm_midi_pause.c | 19 + .../source/modules/libmtk/vm_midi_play.c | 19 + .../modules/libmtk/vm_midi_play_by_bytes.c | 19 + .../modules/libmtk/vm_midi_play_by_bytes_ex.c | 19 + .../source/modules/libmtk/vm_midi_play_ex.c | 19 + .../source/modules/libmtk/vm_midi_resume.c | 19 + .../source/modules/libmtk/vm_midi_set_type.c | 17 + .../source/modules/libmtk/vm_midi_stop.c | 19 + .../source/modules/libmtk/vm_midi_stop_all.c | 19 + .../modules/libmtk/vm_mms_cancel_download.c | 17 + .../modules/libmtk/vm_mms_cancel_send_mms.c | 19 + .../vm_mms_clear_interrupt_event_handler.c | 19 + .../source/modules/libmtk/vm_mms_delete.c | 18 + .../source/modules/libmtk/vm_mms_download.c | 19 + .../modules/libmtk/vm_mms_get_content.c | 20 + .../modules/libmtk/vm_mms_get_msg_id_list.c | 20 + .../source/modules/libmtk/vm_mms_launch.c | 19 + .../source/modules/libmtk/vm_mms_send_mms.c | 19 + .../vm_mms_set_interrupt_event_handler.c | 19 + .../source/modules/libmtk/vm_mode_block.c | 17 + .../source/modules/libmtk/vm_mode_unblock.c | 17 + .../source/modules/libmtk/vm_nvram_get_data.c | 19 + .../source/modules/libmtk/vm_nvram_set_data.c | 18 + .../source/modules/libmtk/vm_peek_stack.c | 19 + .../modules/libmtk/vm_phb_add_contact.c | 20 + .../modules/libmtk/vm_phb_delete_contact.c | 20 + .../modules/libmtk/vm_phb_get_contact.c | 20 + .../modules/libmtk/vm_phb_get_contact_syn.c | 20 + .../modules/libmtk/vm_phb_get_group_list.c | 19 + .../libmtk/vm_phb_get_group_list_count.c | 19 + .../libmtk/vm_phb_get_group_name_by_id.c | 19 + .../libmtk/vm_phb_get_total_contacts.c | 19 + .../modules/libmtk/vm_phb_get_used_contacts.c | 19 + .../libmtk/vm_phb_get_used_contacts_count.c | 19 + .../modules/libmtk/vm_phb_search_contact.c | 20 + .../libmtk/vm_phb_search_contact_list.c | 19 + .../libmtk/vm_phb_search_contact_syn.c | 20 + .../modules/libmtk/vm_phb_update_contact.c | 20 + .../modules/libmtk/vm_pmng_delete_process.c | 16 + .../modules/libmtk/vm_pmng_get_app_handle.c | 19 + .../libmtk/vm_pmng_get_current_handle.c | 20 + .../modules/libmtk/vm_pmng_get_handle.c | 20 + .../source/modules/libmtk/vm_pmng_reset_ctx.c | 19 + .../vm_pmng_restore_default_event_filter.c | 19 + .../libmtk/vm_pmng_send_app_sys_event.c | 19 + .../source/modules/libmtk/vm_pmng_set_bg.c | 19 + .../source/modules/libmtk/vm_pmng_set_ctx.c | 19 + .../modules/libmtk/vm_pmng_set_event_filter.c | 19 + .../source/modules/libmtk/vm_pmng_set_fg.c | 19 + .../source/modules/libmtk/vm_pmng_state.c | 16 + .../source/modules/libmtk/vm_pn_dereg.c | 19 + .../modules/libmtk/vm_pn_get_global_setting.c | 19 + .../modules/libmtk/vm_pn_get_mps_info.c | 19 + .../modules/libmtk/vm_pn_get_mps_info_ex.c | 19 + .../source/modules/libmtk/vm_pn_get_object.c | 19 + .../source/modules/libmtk/vm_pn_is_support.c | 19 + .../source/modules/libmtk/vm_pn_query.c | 19 + .../libmtk/source/modules/libmtk/vm_pn_reg.c | 19 + .../source/modules/libmtk/vm_pn_set_badge.c | 19 + .../modules/libmtk/vm_pn_set_notify_style.c | 19 + .../source/modules/libmtk/vm_popup_stack.c | 19 + .../source/modules/libmtk/vm_post_msg.c | 19 + .../source/modules/libmtk/vm_push_stack.c | 19 + .../modules/libmtk/vm_query_operator_code.c | 19 + .../source/modules/libmtk/vm_read_cache.c | 19 + .../source/modules/libmtk/vm_read_from_uart.c | 17 + .../source/modules/libmtk/vm_read_line.c | 19 + .../libmtk/source/modules/libmtk/vm_realloc.c | 20 + .../modules/libmtk/vm_realloc_topmost.c | 20 + .../modules/libmtk/vm_reboot_normal_start.c | 16 + .../source/modules/libmtk/vm_record_pause.c | 19 + .../source/modules/libmtk/vm_record_resume.c | 19 + .../source/modules/libmtk/vm_record_start.c | 19 + .../source/modules/libmtk/vm_record_stop.c | 19 + .../libmtk/source/modules/libmtk/vm_recv.c | 17 + .../source/modules/libmtk/vm_recvfrom.c | 17 + .../modules/libmtk/vm_reg_func_callback.c | 17 + .../modules/libmtk/vm_reg_http_notification.c | 19 + .../source/modules/libmtk/vm_reg_msg_proc.c | 19 + .../modules/libmtk/vm_reg_sysevt_callback.c | 19 + .../source/modules/libmtk/vm_reset_stack.c | 19 + .../modules/libmtk/vm_resource_get_data.c | 19 + .../libmtk/vm_resource_get_data_from_file.c | 19 + .../modules/libmtk/vm_restore_irq_mask.c | 16 + .../source/modules/libmtk/vm_safe_wstrcpy.c | 19 + .../source/modules/libmtk/vm_save_irq_mask.c | 19 + .../libmtk/source/modules/libmtk/vm_select.c | 17 + .../libmtk/source/modules/libmtk/vm_send.c | 17 + .../source/modules/libmtk/vm_send_msg.c | 19 + .../source/modules/libmtk/vm_send_sms.c | 19 + .../libmtk/source/modules/libmtk/vm_sendto.c | 17 + .../modules/libmtk/vm_set_active_sim_card.c | 19 + .../libmtk/vm_set_app_desired_input_mode.c | 20 + .../modules/libmtk/vm_set_cust_apn_info.c | 19 + .../source/modules/libmtk/vm_set_kal_timer.c | 16 + .../source/modules/libmtk/vm_set_ringtone.c | 19 + .../source/modules/libmtk/vm_set_volume.c | 19 + .../source/modules/libmtk/vm_setsockopt.c | 17 + .../libmtk/vm_setting_get_date_format.c | 19 + .../libmtk/vm_setting_get_date_seperator.c | 19 + .../libmtk/vm_setting_get_time_format.c | 19 + .../modules/libmtk/vm_setting_srv_command.c | 29 + .../modules/libmtk/vm_settings_set_tone.c | 19 + .../libmtk/vm_settings_set_wallpaper.c | 19 + .../source/modules/libmtk/vm_shutdown.c | 17 + .../modules/libmtk/vm_shutdown_normal_start.c | 17 + .../source/modules/libmtk/vm_sim_card_count.c | 19 + .../libmtk/vm_sim_get_active_sim_card.c | 19 + .../modules/libmtk/vm_sim_get_card_status.c | 17 + .../source/modules/libmtk/vm_sim_get_iccid.c | 19 + .../source/modules/libmtk/vm_sim_get_imei.c | 17 + .../modules/libmtk/vm_sim_get_imei_ext.c | 17 + .../source/modules/libmtk/vm_sim_get_imsi.c | 17 + .../modules/libmtk/vm_sim_get_operator.c | 17 + .../libmtk/vm_sim_get_prefer_sim_card.c | 19 + .../source/modules/libmtk/vm_sim_has_card.c | 17 + .../modules/libmtk/vm_sim_max_card_count.c | 19 + .../libmtk/vm_sim_query_operator_code.c | 17 + .../modules/libmtk/vm_sim_set_active_card.c | 17 + .../modules/libmtk/vm_sla_custom_logging.c | 17 + .../source/modules/libmtk/vm_sms_add_msg.c | 19 + .../vm_sms_clear_interrupt_event_handler.c | 19 + ...sms_clear_interrupt_event_handler_forpay.c | 19 + .../source/modules/libmtk/vm_sms_delete_msg.c | 19 + .../modules/libmtk/vm_sms_delete_msg_forpay.c | 19 + .../modules/libmtk/vm_sms_delete_msg_list.c | 19 + .../modules/libmtk/vm_sms_get_box_size.c | 19 + .../source/modules/libmtk/vm_sms_get_msg_id.c | 19 + .../modules/libmtk/vm_sms_get_msg_id_list.c | 19 + .../modules/libmtk/vm_sms_get_sc_address.c | 19 + .../libmtk/vm_sms_get_sc_address_syn.c | 19 + .../modules/libmtk/vm_sms_is_sms_ready.c | 17 + .../source/modules/libmtk/vm_sms_launch.c | 19 + .../source/modules/libmtk/vm_sms_read_msg.c | 19 + .../vm_sms_set_interrupt_event_handler.c | 19 + ...m_sms_set_interrupt_event_handler_forpay.c | 19 + .../libmtk/vm_soc_get_account_localip.c | 17 + .../modules/libmtk/vm_soc_get_host_by_name.c | 19 + .../libmtk/vm_soc_get_host_by_name_ex.c | 17 + .../modules/libmtk/vm_soc_get_last_error.c | 17 + .../modules/libmtk/vm_soc_svr_accept_sync.c | 17 + .../modules/libmtk/vm_soc_svr_close_client.c | 17 + .../libmtk/vm_soc_svr_close_client_sync.c | 17 + .../source/modules/libmtk/vm_soc_svr_deinit.c | 17 + .../modules/libmtk/vm_soc_svr_deinit_sync.c | 17 + .../modules/libmtk/vm_soc_svr_get_soc_id.c | 17 + .../source/modules/libmtk/vm_soc_svr_init.c | 17 + .../modules/libmtk/vm_soc_svr_init_sync.c | 17 + .../source/modules/libmtk/vm_soc_svr_read.c | 17 + .../modules/libmtk/vm_soc_svr_read_sync.c | 17 + .../source/modules/libmtk/vm_soc_svr_send.c | 17 + .../modules/libmtk/vm_soc_svr_send_sync.c | 17 + .../libmtk/source/modules/libmtk/vm_socket.c | 17 + .../source/modules/libmtk/vm_socket_ex.c | 17 + .../libmtk/source/modules/libmtk/vm_sprintf.c | 24 + .../libmtk/vm_srv_bt_noti_check_connection.c | 17 + .../libmtk/vm_srv_bt_noti_register_callback.c | 17 + .../libmtk/vm_srv_bt_noti_send_cmd_ext.c | 17 + .../modules/libmtk/vm_srv_bt_noti_send_ex.c | 17 + .../modules/libmtk/vm_srv_funet_trigger.c | 19 + .../libmtk/vm_srv_nw_info_get_protocol.c | 19 + .../vm_srv_nw_info_get_service_availability.c | 19 + .../vm_srv_sensor_acc_data_rigister_cb.c | 16 + .../libmtk/vm_srv_sensor_disable_mode.c | 19 + .../libmtk/vm_srv_sensor_enable_mode.c | 19 + .../vm_srv_sensor_hr_data_rigister_cb.c | 16 + .../libmtk/vm_srv_sensor_is_available.c | 19 + .../libmtk/vm_srv_sensor_start_listen.c | 19 + .../libmtk/vm_srv_sensor_stop_listen.c | 19 + .../libmtk/source/modules/libmtk/vm_sscanf.c | 24 + .../modules/libmtk/vm_ssl_base64_decode.c | 17 + .../modules/libmtk/vm_ssl_base64_encode.c | 17 + .../source/modules/libmtk/vm_ssl_close.c | 17 + .../source/modules/libmtk/vm_ssl_connect.c | 17 + .../modules/libmtk/vm_ssl_get_verify_result.c | 17 + .../source/modules/libmtk/vm_ssl_is_support.c | 17 + .../libmtk/vm_ssl_load_ca_chain_cert.c | 17 + .../source/modules/libmtk/vm_ssl_read.c | 17 + .../source/modules/libmtk/vm_ssl_sha1_hmac.c | 17 + .../source/modules/libmtk/vm_ssl_write.c | 17 + .../modules/libmtk/vm_sso_add_account.c | 19 + .../source/modules/libmtk/vm_sso_cancel.c | 19 + .../modules/libmtk/vm_sso_del_account.c | 19 + .../modules/libmtk/vm_sso_get_account.c | 19 + .../modules/libmtk/vm_sso_get_account_count.c | 19 + .../modules/libmtk/vm_sso_get_account_name.c | 19 + .../modules/libmtk/vm_sso_get_accounts.c | 19 + .../modules/libmtk/vm_sso_get_credentials.c | 19 + .../modules/libmtk/vm_sso_get_provider.c | 19 + .../libmtk/vm_sso_get_provider_count.c | 19 + .../modules/libmtk/vm_sso_get_provider_icon.c | 19 + .../modules/libmtk/vm_sso_get_provider_name.c | 19 + .../modules/libmtk/vm_sso_get_providers.c | 19 + .../modules/libmtk/vm_sso_login_account.c | 19 + .../modules/libmtk/vm_sso_logout_account.c | 19 + .../libmtk/vm_sso_refresh_credentials.c | 19 + .../source/modules/libmtk/vm_start_app.c | 17 + .../modules/libmtk/vm_start_app_with_para.c | 18 + .../source/modules/libmtk/vm_storage_close.c | 19 + .../source/modules/libmtk/vm_storage_open.c | 19 + .../source/modules/libmtk/vm_storage_read.c | 19 + .../source/modules/libmtk/vm_storage_write.c | 19 + .../source/modules/libmtk/vm_stream_connect.c | 19 + .../modules/libmtk/vm_stream_disconnect.c | 19 + .../modules/libmtk/vm_stream_set_volume.c | 17 + .../libmtk/vm_string_equals_ignore_case.c | 19 + .../libmtk/source/modules/libmtk/vm_strtol.c | 17 + .../modules/libmtk/vm_switch_backlight.c | 15 + .../libmtk/vm_switch_power_saving_mode.c | 19 + .../source/modules/libmtk/vm_sys_file_close.c | 16 + .../modules/libmtk/vm_sys_file_delete.c | 18 + .../modules/libmtk/vm_sys_file_get_space.c | 18 + .../source/modules/libmtk/vm_sys_file_open.c | 18 + .../source/modules/libmtk/vm_sys_file_read.c | 18 + .../source/modules/libmtk/vm_sys_file_seek.c | 18 + .../source/modules/libmtk/vm_sys_file_write.c | 18 + .../source/modules/libmtk/vm_tcp_close.c | 19 + .../source/modules/libmtk/vm_tcp_close_sync.c | 17 + .../source/modules/libmtk/vm_tcp_connect.c | 19 + .../source/modules/libmtk/vm_tcp_connect_ex.c | 19 + .../modules/libmtk/vm_tcp_connect_sync.c | 17 + .../source/modules/libmtk/vm_tcp_get_soc_id.c | 17 + .../source/modules/libmtk/vm_tcp_read.c | 19 + .../source/modules/libmtk/vm_tcp_read_sync.c | 17 + .../source/modules/libmtk/vm_tcp_write.c | 19 + .../source/modules/libmtk/vm_tcp_write_sync.c | 17 + .../source/modules/libmtk/vm_thread_create.c | 17 + .../libmtk/vm_thread_get_current_handle.c | 17 + .../libmtk/vm_thread_get_main_handle.c | 17 + .../source/modules/libmtk/vm_thread_get_msg.c | 16 + .../modules/libmtk/vm_thread_send_msg.c | 16 + .../modules/libmtk/vm_tls_auto_rehandshake.c | 19 + .../libmtk/vm_tls_check_invalid_cert.c | 19 + .../modules/libmtk/vm_tls_check_peer_name.c | 19 + .../source/modules/libmtk/vm_tls_connect.c | 19 + .../modules/libmtk/vm_tls_delete_conn.c | 19 + .../source/modules/libmtk/vm_tls_delete_ctx.c | 19 + .../source/modules/libmtk/vm_tls_get_cipher.c | 19 + .../modules/libmtk/vm_tls_get_cipher_info.c | 19 + .../modules/libmtk/vm_tls_get_peer_cert.c | 19 + .../source/modules/libmtk/vm_tls_handshake.c | 19 + .../modules/libmtk/vm_tls_log_plaintext.c | 19 + .../source/modules/libmtk/vm_tls_new_conn.c | 19 + .../source/modules/libmtk/vm_tls_new_ctx.c | 19 + .../source/modules/libmtk/vm_tls_read.c | 19 + .../modules/libmtk/vm_tls_rehandshake.c | 19 + .../modules/libmtk/vm_tls_set_ciphers.c | 19 + .../modules/libmtk/vm_tls_set_client_auth.c | 19 + .../modules/libmtk/vm_tls_set_identity.c | 19 + .../libmtk/vm_tls_set_null_client_auth.c | 19 + .../source/modules/libmtk/vm_tls_set_verify.c | 19 + .../source/modules/libmtk/vm_tls_shutdown.c | 19 + .../modules/libmtk/vm_tls_soc_connect.c | 19 + .../source/modules/libmtk/vm_tls_write.c | 19 + .../source/modules/libmtk/vm_tmp_filename.c | 19 + .../source/modules/libmtk/vm_ts_driver_free.c | 16 + .../modules/libmtk/vm_ts_driver_get_handle.c | 19 + .../modules/libmtk/vm_ts_driver_get_mem.c | 19 + .../source/modules/libmtk/vm_ts_driver_load.c | 21 + .../modules/libmtk/vm_ucs2_string_by_ascii.c | 19 + .../source/modules/libmtk/vm_ucs2_to_ascii.c | 19 + .../source/modules/libmtk/vm_ucs2_to_gb2312.c | 19 + .../source/modules/libmtk/vm_udp_close.c | 19 + .../source/modules/libmtk/vm_udp_create.c | 19 + .../source/modules/libmtk/vm_udp_recvfrom.c | 19 + .../source/modules/libmtk/vm_udp_sendto.c | 19 + .../source/modules/libmtk/vm_update_cancel.c | 18 + .../modules/libmtk/vm_update_check_launch.c | 18 + .../modules/libmtk/vm_update_check_version.c | 18 + .../modules/libmtk/vm_update_download.c | 18 + .../modules/libmtk/vm_update_update_file.c | 18 + .../modules/libmtk/vm_upnp_get_ext_ip.c | 17 + .../modules/libmtk/vm_upnp_mapping_ports.c | 17 + .../source/modules/libmtk/vm_upper_case.c | 19 + .../modules/libmtk/vm_uriagent_uri_request.c | 19 + .../modules/libmtk/vm_url_decode_gb2312.c | 18 + .../modules/libmtk/vm_url_encode_gb2312.c | 18 + .../modules/libmtk/vm_usb_get_cable_status.c | 19 + .../modules/libmtk/vm_ust_get_current_time.c | 21 + .../modules/libmtk/vm_ust_get_duration.c | 21 + .../source/modules/libmtk/vm_vad_get_level.c | 19 + .../source/modules/libmtk/vm_vad_is_on.c | 19 + .../modules/libmtk/vm_vad_register_callback.c | 17 + .../source/modules/libmtk/vm_vad_set_level.c | 19 + .../modules/libmtk/vm_vad_switch_on_off.c | 20 + .../source/modules/libmtk/vm_vdorec_pause.c | 19 + .../modules/libmtk/vm_vdorec_power_down.c | 19 + .../modules/libmtk/vm_vdorec_power_up.c | 19 + .../source/modules/libmtk/vm_vdorec_preview.c | 19 + .../source/modules/libmtk/vm_vdorec_record.c | 19 + .../source/modules/libmtk/vm_vdorec_resume.c | 19 + .../libmtk/vm_vdorec_rtsp_local_save_start.c | 18 + .../libmtk/vm_vdorec_rtsp_local_save_stop.c | 19 + .../modules/libmtk/vm_vdorec_save_to_file.c | 17 + .../modules/libmtk/vm_vdorec_set_param.c | 19 + .../source/modules/libmtk/vm_vdorec_stop.c | 19 + .../source/modules/libmtk/vm_vibrator_off.c | 19 + .../source/modules/libmtk/vm_vibrator_on.c | 19 + .../source/modules/libmtk/vm_vibrator_once.c | 19 + .../modules/libmtk/vm_video_close_buffer.c | 19 + .../modules/libmtk/vm_video_close_file.c | 19 + .../libmtk/vm_video_get_cur_play_time.c | 19 + .../modules/libmtk/vm_video_open_buffer.c | 19 + .../modules/libmtk/vm_video_open_file.c | 19 + .../source/modules/libmtk/vm_video_pause.c | 19 + .../source/modules/libmtk/vm_video_play.c | 19 + .../libmtk/vm_video_play_by_filepath.c | 19 + .../vm_video_play_stream_from_rtsp_link.c | 19 + .../vm_video_play_stream_from_sdp_file.c | 19 + .../source/modules/libmtk/vm_video_resume.c | 19 + .../libmtk/vm_video_seek_and_getframe.c | 19 + .../modules/libmtk/vm_video_set_brightness.c | 19 + .../modules/libmtk/vm_video_set_contrast.c | 19 + .../source/modules/libmtk/vm_video_snapshot.c | 19 + .../source/modules/libmtk/vm_video_stop.c | 19 + .../source/modules/libmtk/vm_vsprintf.c | 20 + .../source/modules/libmtk/vm_vwsprintf.c | 21 + .../source/modules/libmtk/vm_wdt_feed.c | 17 + .../source/modules/libmtk/vm_wdt_start.c | 19 + .../source/modules/libmtk/vm_wdt_stop.c | 17 + .../source/modules/libmtk/vm_wends_with.c | 19 + .../modules/libmtk/vm_wifi_is_connected.c | 19 + .../source/modules/libmtk/vm_wlan_connect.c | 17 + .../modules/libmtk/vm_wlan_dereg_noti.c | 17 + .../modules/libmtk/vm_wlan_disconnect.c | 17 + .../libmtk/vm_wlan_get_connected_ap_info.c | 17 + .../modules/libmtk/vm_wlan_get_ip_info.c | 17 + .../modules/libmtk/vm_wlan_get_mac_address.c | 17 + .../source/modules/libmtk/vm_wlan_get_para.c | 17 + .../libmtk/vm_wlan_loc_get_connected_info.c | 18 + .../modules/libmtk/vm_wlan_loc_search.c | 19 + .../modules/libmtk/vm_wlan_loc_search_abort.c | 19 + .../source/modules/libmtk/vm_wlan_mode_get.c | 17 + .../source/modules/libmtk/vm_wlan_mode_set.c | 17 + .../source/modules/libmtk/vm_wlan_perfer.c | 21 + .../source/modules/libmtk/vm_wlan_prof_add.c | 17 + .../modules/libmtk/vm_wlan_prof_connect.c | 17 + .../modules/libmtk/vm_wlan_prof_delete.c | 17 + .../libmtk/vm_wlan_prof_get_reconn_id.c | 17 + .../source/modules/libmtk/vm_wlan_prof_init.c | 17 + .../modules/libmtk/vm_wlan_prof_query.c | 17 + .../modules/libmtk/vm_wlan_prof_query_list.c | 17 + .../libmtk/vm_wlan_prof_set_reconn_id.c | 17 + .../modules/libmtk/vm_wlan_prof_update.c | 17 + .../source/modules/libmtk/vm_wlan_reg_noti.c | 17 + .../modules/libmtk/vm_wlan_roaming_get.c | 17 + .../modules/libmtk/vm_wlan_roaming_set.c | 17 + .../source/modules/libmtk/vm_wlan_scan.c | 17 + .../modules/libmtk/vm_wlan_scan_abort.c | 17 + .../modules/libmtk/vm_wlan_scan_get_param.c | 17 + .../modules/libmtk/vm_wlan_scan_set_param.c | 17 + .../source/modules/libmtk/vm_wlan_set_para.c | 17 + .../modules/libmtk/vm_wlan_sniffer_off.c | 17 + .../modules/libmtk/vm_wlan_sniffer_on.c | 17 + .../source/modules/libmtk/vm_wlan_status.c | 17 + .../source/modules/libmtk/vm_write_cache.c | 19 + .../source/modules/libmtk/vm_wstarts_with.c | 19 + .../libmtk/source/modules/libmtk/vm_wstrcat.c | 19 + .../libmtk/source/modules/libmtk/vm_wstrcmp.c | 19 + .../modules/libmtk/vm_wstrcmp_ignore_case.c | 19 + .../libmtk/source/modules/libmtk/vm_wstrcpy.c | 19 + .../libmtk/source/modules/libmtk/vm_wstrlen.c | 19 + .../source/modules/libmtk/vm_wstrncpy.c | 19 + .../source/modules/libmtk/vm_xml_get_error.c | 19 + .../source/modules/libmtk/vm_xml_new_parser.c | 19 + .../source/modules/libmtk/vm_xml_parse.c | 19 + .../modules/libmtk/vm_xml_set_data_handler.c | 19 + .../libmtk/vm_xml_set_doctype_handlers.c | 19 + .../libmtk/vm_xml_set_element_handlers.c | 19 + .../libmtk/source/modules/libmtk/vmdcl.c | 134 + .../libmtk/source/modules/libmtk/vmlog.c | 115 + .../libmtk/source/modules/libmtk/vmthread.c | 134 + .../mtk/system/libmtk/source/modules/makefile | 29 + .../arduino_due_x/linker_scripts/gcc/scat.ld | 134 + .../mtk/variants/arduino_due_x/pins_arduino.h | 21 + .../mtk/variants/arduino_due_x/variant.cpp | 313 ++ .../mtk/variants/arduino_due_x/variant.h | 99 + .../arduino/mtk/variants/linkit_one/libmtk.a | Bin 0 -> 975864 bytes .../linkit_one/linker_scripts/gcc/scat.ld | 134 + .../mtk/variants/linkit_one/pins_arduino.h | 21 + .../mtk/variants/linkit_one/variant.cpp | 343 +++ .../arduino/mtk/variants/linkit_one/variant.h | 104 + hardware/tools/mtk/FirmwareUpdater.exe | Bin 0 -> 591360 bytes hardware/tools/mtk/PackTag.exe | Bin 0 -> 184375 bytes hardware/tools/mtk/PushTool.exe | Bin 0 -> 274432 bytes .../mtk/firmware/Download_Agent/6261/EXT_RAM | Bin 0 -> 111148 bytes .../firmware/Download_Agent/6261/INT_SYSRAM | Bin 0 -> 820 bytes .../Download_Agent/6261/NAND_FLASH_TABLE | Bin 0 -> 5824 bytes .../Download_Agent/6261/NOR_FLASH_TABLE | Bin 0 -> 9324 bytes .../Download_Agent/Need DA version v5.1416 | 0 hardware/tools/mtk/firmware/Downloader.exe | Bin 0 -> 94208 bytes .../mtk/firmware/LinkIt_ONE/1.0.29/ALICE | Bin 0 -> 2213580 bytes .../mtk/firmware/LinkIt_ONE/1.0.29/ALICE.bin | Bin 0 -> 2625588 bytes .../firmware/LinkIt_ONE/1.0.29/EXT_BOOTLOADER | Bin 0 -> 36436 bytes .../tools/mtk/firmware/LinkIt_ONE/1.0.29/ROM | Bin 0 -> 1303276 bytes .../LinkIt_ONE/1.0.29/SEEED02A_DEMO_BB.cfg | 81 + ...V005_MT2502_MAUI_LINKIT_ONE_DEV_W14_35.bin | Bin 0 -> 7240 bytes .../tools/mtk/firmware/LinkIt_ONE/1.0.29/VIVA | Bin 0 -> 2213656 bytes .../mtk/firmware/LinkIt_ONE/1.0.29/VIVA.bin | Bin 0 -> 76 bytes .../LinkIt_ONE/1.0.29/backup/ROM.orig | Bin 0 -> 1303276 bytes .../LinkIt_ONE/1.0.29/backup/VIVA.orig | Bin 0 -> 2213656 bytes psvince.dll | Bin 0 -> 36864 bytes unins000.dat | Bin 0 -> 204665 bytes unins000.exe | Bin 0 -> 984225 bytes 1719 files changed, 80255 insertions(+) create mode 100644 drivers/mtk/2K_XP_COM/usb2ser_2kXP.inf create mode 100644 drivers/mtk/2K_XP_COM/usb2ser_2kxp_64.cat create mode 100644 drivers/mtk/2K_XP_COM/usb2ser_2kxp_comp.cat create mode 100644 drivers/mtk/2K_XP_COM/usb2ser_XP64.inf create mode 100644 drivers/mtk/98ME_COM/GPRS_USB_Modem.inf create mode 100644 drivers/mtk/98ME_COM/USBCDC.INF create mode 100644 drivers/mtk/98_Mass/MTKUMSS.INF create mode 100644 drivers/mtk/98_Mass/UMSS.sys create mode 100644 drivers/mtk/98_Mass/UMSSPDR.pdr create mode 100644 drivers/mtk/InstallDriver.exe create mode 100644 drivers/mtk/ReadMe.txt create mode 100644 drivers/mtk/UninstallDriver.exe create mode 100644 drivers/mtk/Vista/usb2ser_Vista.inf create mode 100644 drivers/mtk/Vista/usb2ser_Vista64.inf create mode 100644 drivers/mtk/Vista/usb2servistawin7_32_comp.cat create mode 100644 drivers/mtk/Vista/usb2servistawin7_64_comp.cat create mode 100644 drivers/mtk/Win7/usb2ser_Win7.inf create mode 100644 drivers/mtk/Win7/usb2ser_Win764.inf create mode 100644 drivers/mtk/Win7/usb2servistawin7_32_comp.cat create mode 100644 drivers/mtk/Win7/usb2servistawin7_64_comp.cat create mode 100644 drivers/mtk/x64/install64.exe create mode 100644 drivers/mtk/x86/install32.exe create mode 100644 hardware/arduino/mtk/boards.txt create mode 100644 hardware/arduino/mtk/cores/arduino/Arduino.h create mode 100644 hardware/arduino/mtk/cores/arduino/Client.h create mode 100644 hardware/arduino/mtk/cores/arduino/HardwareSerial.h create mode 100644 hardware/arduino/mtk/cores/arduino/IPAddress.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/IPAddress.h create mode 100644 hardware/arduino/mtk/cores/arduino/LTask.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/LTask.h create mode 100644 hardware/arduino/mtk/cores/arduino/LTcpClient.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/LTcpClient.h create mode 100644 hardware/arduino/mtk/cores/arduino/LTcpServer.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/LTcpServer.h create mode 100644 hardware/arduino/mtk/cores/arduino/LUdp.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/LUdp.h create mode 100644 hardware/arduino/mtk/cores/arduino/Print.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/Print.h create mode 100644 hardware/arduino/mtk/cores/arduino/Printable.h create mode 100644 hardware/arduino/mtk/cores/arduino/RingBuffer.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/RingBuffer.h create mode 100644 hardware/arduino/mtk/cores/arduino/Server.h create mode 100644 hardware/arduino/mtk/cores/arduino/Stream.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/Stream.h create mode 100644 hardware/arduino/mtk/cores/arduino/Tone.h create mode 100644 hardware/arduino/mtk/cores/arduino/UARTClass.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/UARTClass.h create mode 100644 hardware/arduino/mtk/cores/arduino/Udp.h create mode 100644 hardware/arduino/mtk/cores/arduino/WCharacter.h create mode 100644 hardware/arduino/mtk/cores/arduino/WInterrupts.c create mode 100644 hardware/arduino/mtk/cores/arduino/WInterrupts.h create mode 100644 hardware/arduino/mtk/cores/arduino/WMath.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/WMath.h create mode 100644 hardware/arduino/mtk/cores/arduino/WString.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/WString.h create mode 100644 hardware/arduino/mtk/cores/arduino/avr/dtostrf.c create mode 100644 hardware/arduino/mtk/cores/arduino/avr/dtostrf.h create mode 100644 hardware/arduino/mtk/cores/arduino/avr/interrupt.h create mode 100644 hardware/arduino/mtk/cores/arduino/avr/pgmspace.h create mode 100644 hardware/arduino/mtk/cores/arduino/binary.h create mode 100644 hardware/arduino/mtk/cores/arduino/cxxabi-compat.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/itoa.c create mode 100644 hardware/arduino/mtk/cores/arduino/itoa.h create mode 100644 hardware/arduino/mtk/cores/arduino/main.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/message.h create mode 100644 hardware/arduino/mtk/cores/arduino/syscalls.h create mode 100644 hardware/arduino/mtk/cores/arduino/syscalls_mtk.c create mode 100644 hardware/arduino/mtk/cores/arduino/wiring.c create mode 100644 hardware/arduino/mtk/cores/arduino/wiring.h create mode 100644 hardware/arduino/mtk/cores/arduino/wiring_analog.c create mode 100644 hardware/arduino/mtk/cores/arduino/wiring_analog.h create mode 100644 hardware/arduino/mtk/cores/arduino/wiring_constants.h create mode 100644 hardware/arduino/mtk/cores/arduino/wiring_digital.c create mode 100644 hardware/arduino/mtk/cores/arduino/wiring_digital.h create mode 100644 hardware/arduino/mtk/cores/arduino/wiring_private.h create mode 100644 hardware/arduino/mtk/cores/arduino/wiring_pulse.cpp create mode 100644 hardware/arduino/mtk/cores/arduino/wiring_pulse.h create mode 100644 hardware/arduino/mtk/cores/arduino/wiring_shift.c create mode 100644 hardware/arduino/mtk/cores/arduino/wiring_shift.h create mode 100644 hardware/arduino/mtk/libraries/LAudio/LAudio.cpp create mode 100644 hardware/arduino/mtk/libraries/LAudio/LAudio.h create mode 100644 hardware/arduino/mtk/libraries/LAudio/examples/AudioPlayer/AudioPlayer.ino create mode 100644 hardware/arduino/mtk/libraries/LAudio/keywords.txt create mode 100644 hardware/arduino/mtk/libraries/LAudio/utility/Audio.cpp create mode 100644 hardware/arduino/mtk/libraries/LAudio/utility/Audio.h create mode 100644 hardware/arduino/mtk/libraries/LBT/LBT.cpp create mode 100644 hardware/arduino/mtk/libraries/LBT/LBT.h create mode 100644 hardware/arduino/mtk/libraries/LBT/LBTClient.cpp create mode 100644 hardware/arduino/mtk/libraries/LBT/LBTClient.h create mode 100644 hardware/arduino/mtk/libraries/LBT/LBTServer.cpp create mode 100644 hardware/arduino/mtk/libraries/LBT/LBTServer.h create mode 100644 hardware/arduino/mtk/libraries/LBT/examples/BTSPP/BTClient/BTClient.ino create mode 100644 hardware/arduino/mtk/libraries/LBT/examples/BTSPP/BTServer/BTServer.ino create mode 100644 hardware/arduino/mtk/libraries/LBT/utility/BTClient.cpp create mode 100644 hardware/arduino/mtk/libraries/LBT/utility/BTClient.h create mode 100644 hardware/arduino/mtk/libraries/LBT/utility/BTServer.cpp create mode 100644 hardware/arduino/mtk/libraries/LBT/utility/BTServer.h create mode 100644 hardware/arduino/mtk/libraries/LBattery/LBattery.cpp create mode 100644 hardware/arduino/mtk/libraries/LBattery/LBattery.h create mode 100644 hardware/arduino/mtk/libraries/LBattery/examples/Battery/Battery.ino create mode 100644 hardware/arduino/mtk/libraries/LBattery/keywords.txt create mode 100644 hardware/arduino/mtk/libraries/LBattery/utility/Battery.cpp create mode 100644 hardware/arduino/mtk/libraries/LBattery/utility/Battery.h create mode 100644 hardware/arduino/mtk/libraries/LDateTime/LDateTime.cpp create mode 100644 hardware/arduino/mtk/libraries/LDateTime/LDateTime.h create mode 100644 hardware/arduino/mtk/libraries/LDateTime/examples/DateTime/LDateTime/LDateTime.ino create mode 100644 hardware/arduino/mtk/libraries/LDateTime/keywords.txt create mode 100644 hardware/arduino/mtk/libraries/LEEPROM/LEEPROM.cpp create mode 100644 hardware/arduino/mtk/libraries/LEEPROM/LEEPROM.h create mode 100644 hardware/arduino/mtk/libraries/LEEPROM/examples/LEEPROM_RW/LEEPROM_RW.ino create mode 100644 hardware/arduino/mtk/libraries/LEEPROM/utility/sysfile.cpp create mode 100644 hardware/arduino/mtk/libraries/LEEPROM/utility/sysfile.h create mode 100644 hardware/arduino/mtk/libraries/LGPRS/LGPRS.cpp create mode 100644 hardware/arduino/mtk/libraries/LGPRS/LGPRS.h create mode 100644 hardware/arduino/mtk/libraries/LGPRS/LGPRSClient.cpp create mode 100644 hardware/arduino/mtk/libraries/LGPRS/LGPRSClient.h create mode 100644 hardware/arduino/mtk/libraries/LGPRS/LGPRSServer.cpp create mode 100644 hardware/arduino/mtk/libraries/LGPRS/LGPRSServer.h create mode 100644 hardware/arduino/mtk/libraries/LGPRS/LGPRSUdp.cpp create mode 100644 hardware/arduino/mtk/libraries/LGPRS/LGPRSUdp.h create mode 100644 hardware/arduino/mtk/libraries/LGPRS/examples/GPRSUdpNtpClient/GPRSUdpNtpClient.ino create mode 100644 hardware/arduino/mtk/libraries/LGPRS/examples/GPRSWebClient/GPRSWebClient.ino create mode 100644 hardware/arduino/mtk/libraries/LGPRS/examples/GPRSWebServer/GPRSWebServer.ino create mode 100644 hardware/arduino/mtk/libraries/LGPS/LGPS.cpp create mode 100644 hardware/arduino/mtk/libraries/LGPS/LGPS.h create mode 100644 hardware/arduino/mtk/libraries/LGPS/examples/GPS/GPS.ino create mode 100644 hardware/arduino/mtk/libraries/LGPS/keywords.txt create mode 100644 hardware/arduino/mtk/libraries/LGPS/utility/GPS.cpp create mode 100644 hardware/arduino/mtk/libraries/LGPS/utility/GPS.h create mode 100644 hardware/arduino/mtk/libraries/LGSM/LGSM.h create mode 100644 hardware/arduino/mtk/libraries/LGSM/LSMS.cpp create mode 100644 hardware/arduino/mtk/libraries/LGSM/LVoiceCall.cpp create mode 100644 hardware/arduino/mtk/libraries/LGSM/examples/LVoiceCall/LVoiceCall.ino create mode 100644 hardware/arduino/mtk/libraries/LGSM/examples/LVoiceCallStatus/LVoiceCallStatus.ino create mode 100644 hardware/arduino/mtk/libraries/LGSM/keywords.txt create mode 100644 hardware/arduino/mtk/libraries/LGSM/utility/VoiceCall.cpp create mode 100644 hardware/arduino/mtk/libraries/LGSM/utility/VoiceCall.h create mode 100644 hardware/arduino/mtk/libraries/LStorage/LFlash.cpp create mode 100644 hardware/arduino/mtk/libraries/LStorage/LFlash.h create mode 100644 hardware/arduino/mtk/libraries/LStorage/LSD.cpp create mode 100644 hardware/arduino/mtk/libraries/LStorage/LSD.h create mode 100644 hardware/arduino/mtk/libraries/LStorage/LStorage.cpp create mode 100644 hardware/arduino/mtk/libraries/LStorage/LStorage.h create mode 100644 hardware/arduino/mtk/libraries/LWiFi/LWiFi.cpp create mode 100644 hardware/arduino/mtk/libraries/LWiFi/LWiFi.h create mode 100644 hardware/arduino/mtk/libraries/LWiFi/LWiFiClient.cpp create mode 100644 hardware/arduino/mtk/libraries/LWiFi/LWiFiClient.h create mode 100644 hardware/arduino/mtk/libraries/LWiFi/LWiFiServer.cpp create mode 100644 hardware/arduino/mtk/libraries/LWiFi/LWiFiServer.h create mode 100644 hardware/arduino/mtk/libraries/LWiFi/LWiFiUdp.cpp create mode 100644 hardware/arduino/mtk/libraries/LWiFi/LWiFiUdp.h create mode 100644 hardware/arduino/mtk/libraries/LWiFi/examples/ScanNetworks/ScanNetworks.ino create mode 100644 hardware/arduino/mtk/libraries/LWiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino create mode 100644 hardware/arduino/mtk/libraries/LWiFi/examples/WifiDownloadFile/WifiDownloadFile.ino create mode 100644 hardware/arduino/mtk/libraries/LWiFi/examples/WifiWebClient/WifiWebClient.ino create mode 100644 hardware/arduino/mtk/libraries/LWiFi/examples/WifiWebServer/WifiWebServer.ino create mode 100644 hardware/arduino/mtk/libraries/LWiFi/examples/WifiXivelyConnection/WifiXivelyConnection.ino create mode 100644 hardware/arduino/mtk/libraries/SPI/SPI.cpp create mode 100644 hardware/arduino/mtk/libraries/SPI/SPI.h create mode 100644 hardware/arduino/mtk/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino create mode 100644 hardware/arduino/mtk/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino create mode 100644 hardware/arduino/mtk/libraries/SPI/keywords.txt create mode 100644 hardware/arduino/mtk/libraries/Servo/Servo.cpp create mode 100644 hardware/arduino/mtk/libraries/Servo/Servo.h create mode 100644 hardware/arduino/mtk/libraries/Servo/examples/Servo/Servo.ino create mode 100644 hardware/arduino/mtk/libraries/Servo/keywords.txt create mode 100644 hardware/arduino/mtk/libraries/Wire/Wire.cpp create mode 100644 hardware/arduino/mtk/libraries/Wire/Wire.h create mode 100644 hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.cpp create mode 100644 hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.h create mode 100644 hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.o create mode 100644 hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/diff.txt create mode 100644 hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/examples/SerialDisplay/SerialDisplay.pde create mode 100644 hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/keywords.txt create mode 100644 hardware/arduino/mtk/libraries/Wire/keywords.txt create mode 100644 hardware/arduino/mtk/platform.txt create mode 100644 hardware/arduino/mtk/programmers.txt create mode 100644 hardware/arduino/mtk/system/libmtk/build_gcc/StubGen.bat create mode 100644 hardware/arduino/mtk/system/libmtk/chip.h create mode 100644 hardware/arduino/mtk/system/libmtk/debug/get_http_head.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/get_http_head_by_index.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/get_http_head_number.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/get_today_from_2000.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/libmtk.a create mode 100644 hardware/arduino/mtk/system/libmtk/debug/libmtk.log create mode 100644 hardware/arduino/mtk/system/libmtk/debug/rand.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/srand.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/strtoi.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/stubgen.log create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm4res.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_accept.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_app_log.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_dereg_msg_proc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_dispatch_msg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_init.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_post_msg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_reg_msg_proc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_send_msg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ascii_to_ucs2.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_assert.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_asyn_http_req.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_atof.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_bytes_duration.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_clear_interrupt_callback.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_duration.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_get_time.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_is_app_playing.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_is_calling.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_close_all.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_get_time.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_open.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_pause.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_play.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_resume.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_set_speedup_mode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_set_start_time.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_pause.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_pitch_shifting_set_level.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_pitch_shifting_turn_off.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_pitch_shifting_turn_on.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_beep.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_bytes.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_bytes_no_block.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_file.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_file_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_register_interrupt_callback.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_resume.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_resume_bg_play.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_set_volume_type.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_stop_all.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_suspend_bg_play.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_terminate_background_play.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_vocal_removal_turn_off.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_audio_vocal_removal_turn_on.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_base64_decode_basic.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_base64_encode_basic.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_decode_append.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_decode_finish.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_decode_init.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_encode_append.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_encode_finish.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_encode_init.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_bearer_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_bearer_open.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_bind.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_bridge_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_bridge_create.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_bt_cm_send_passkey.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_bt_noti_check_channel_valid.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_bt_noti_get_bt_device_addr.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_exit.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_get_dev_info_by_index.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_get_dev_num.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_get_host_dev_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_get_power_status.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_init.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_search.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_search_abort.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_set_host_name.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_srv_get_visibility.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_srv_set_visibility.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_switch_off.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btcm_switch_on.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_accept.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_bind.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_connect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_connect_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_disconnect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_get_dev_addr.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_get_min_buf_size.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_open.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_read.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_reject.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_set_security_level.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_set_service_name.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_btspp_write.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cache_read_char.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_call_actions.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_call_reg_listener.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_calloc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_callout.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_callout_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_camera_startup.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cancel_all_http_sessions.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cancel_asyn_http_req.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cancel_kal_timer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cancel_send_sms.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cbm_hold_bearer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cbm_release_bearer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ce_auth_app_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cell_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cell_get_cur_cell_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cell_get_nbr_cell_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cell_get_nbr_num.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_cell_open.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_charbat_is_charging.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_che_deinit.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_che_init.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_che_key_action.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_che_process.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_che_rsa_private_decrypt.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_che_rsa_private_encrypt.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_che_rsa_public_decrypt.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_che_rsa_public_encrypt.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_che_set_iv.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_chset_convert.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_closesocket.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_command_close_port.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_command_open_port.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_command_reply.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_connect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_create_array_stack.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_create_dyn_array.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_create_kal_timer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_create_linked_stack.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_create_timer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_create_timer_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_custom_set_bt_pairing_method.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_da_display_download_list.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_da_http_dl_operation.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_da_http_start_download.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_delete_timer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_delete_timer_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_des_decrypt.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_des_encrypt.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_des_reset_key.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_des_set_key.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_destroy_stack.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_client_get_mode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_client_set_mode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_server_get_mode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_server_get_param.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_server_set_mode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_server_set_param.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dialer_launch.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dns_get_state.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dns_start.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dns_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dtacct_select.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dtacct_set.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dyn_array_add.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dyn_array_del.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_dyn_array_del_all.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_em_send_command.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_enable_proxy.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ends_with.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_exit_app.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_commit.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_copy.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_copy_abort.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_delete.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_get_attributes.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_get_modify_time.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_getfilesize.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_is_eof.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_mkdir.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_open.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_read.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_rename.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_rmdir.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_seek.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_set_attributes.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_tell.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_file_write.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_find_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_find_close_ext.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_find_first.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_find_first_ext.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_find_next.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_find_next_ext.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fly_mode_is_network_service_available.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fly_mode_is_switching.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fly_mode_switch.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_free.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_free_dyn_array.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_abort.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_commit.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_delete.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_get_working_buf_size.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_open.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_read.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_seek.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_write.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_gb2312_string.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_gb2312_to_ucs2.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_apn_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_asyn_http_req_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_battery_level.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_cache_free_space.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_curr_utc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_current_lang_country_code.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_cust_apn_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_customer_name.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_default_apn_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_default_folder_path.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_disk_free_space.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_disk_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_encoded_dtacct_id.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_exec_filename.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_filename.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_full_path_by_short_name.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_imei.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_imei_ext.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_imsi.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_language.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_language_ssc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_malloc_stat.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_modules.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_mre_modules.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_mre_total_mem_size.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_mre_version.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_multi_tags.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_multi_tags_by_lang_id.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_operator.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_origin_release_verno.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_path.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_removable_driver.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_res_header.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_resource_offset.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_resource_offset_from_file.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_rtc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_sim_card_status.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_sys_property.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_sys_scene.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_sys_time_zone.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_system_driver.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_tag_by_lang_id.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_tick_count.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_time.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_total_mem_size.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_version.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_vm_tag.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_get_volume.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_getpeername.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_getsockname.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_getsockopt.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_global_free.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_global_get_max_alloc_size.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_global_malloc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_gps_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_gps_open.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_gps_set_mode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_has_sim_card.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_htonl.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_htons.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_add_header.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_fetch_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_free_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_get_current_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_recv_data.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_reg_receiver.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_reg_sender.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_request.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_send_data.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_set_body.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_set_current_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_http_set_url.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_https_register_wps_cntxt_and_callback.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_https_send_cancel_req.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_https_send_post_content_res.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_https_send_read_content_req.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_https_send_req.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_https_send_req_ext.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_https_send_set_channel_req.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_https_send_unset_channel_req.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_idle_swatch_pedometer_register_callback.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_addr.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_ftpd_restart.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_ftpd_start.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_ftpd_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_cgi_job_finish.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_disable_ssl.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_enable_ssl.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_getenv.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_read.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_restart.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_start.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_write.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_ntoa.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_rtspd_register_cb.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_rtspd_restart.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_rtspd_set_stream_identify.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_rtspd_start.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_inet_rtspd_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_is_empty_stack.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_is_exist_stack.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_is_support_camera_sensor.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_is_support_gsensor.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_is_support_wifi.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ivr_call.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ivr_dial_number.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ivr_end.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_listen.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_load_resource.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_load_resource_from_file.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_load_resource_use_outside_memory.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_lower_case.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_magic_wrapper_for_customer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_malloc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_malloc_nc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_malloc_nc_topmost.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_malloc_topmost.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_memcpy.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_midi_get_time.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_midi_pause.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_midi_play.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_midi_play_by_bytes.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_midi_play_by_bytes_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_midi_play_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_midi_resume.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_midi_set_type.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_midi_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_midi_stop_all.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mms_cancel_download.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mms_cancel_send_mms.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mms_clear_interrupt_event_handler.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mms_delete.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mms_download.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mms_get_content.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mms_get_msg_id_list.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mms_launch.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mms_send_mms.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mms_set_interrupt_event_handler.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mode_block.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_mode_unblock.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_nvram_get_data.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_nvram_set_data.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_peek_stack.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_add_contact.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_delete_contact.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_contact.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_contact_syn.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_group_list.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_group_list_count.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_group_name_by_id.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_total_contacts.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_used_contacts.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_used_contacts_count.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_search_contact.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_search_contact_list.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_search_contact_syn.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_phb_update_contact.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_delete_process.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_get_app_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_get_current_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_get_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_reset_ctx.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_restore_default_event_filter.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_send_app_sys_event.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_set_bg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_set_ctx.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_set_event_filter.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_set_fg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pmng_state.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pn_dereg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pn_get_global_setting.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pn_get_mps_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pn_get_mps_info_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pn_get_object.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pn_is_support.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pn_query.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pn_reg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pn_set_badge.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_pn_set_notify_style.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_popup_stack.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_post_msg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_push_stack.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_query_operator_code.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_read_cache.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_read_from_uart.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_read_line.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_realloc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_realloc_topmost.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_reboot_normal_start.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_record_pause.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_record_resume.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_record_start.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_record_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_recv.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_recvfrom.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_reg_func_callback.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_reg_http_notification.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_reg_msg_proc.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_reg_sysevt_callback.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_reset_stack.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_resource_get_data.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_resource_get_data_from_file.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_restore_irq_mask.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_safe_wstrcpy.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_save_irq_mask.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_select.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_send.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_send_msg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_send_sms.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sendto.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_set_active_sim_card.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_set_app_desired_input_mode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_set_cust_apn_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_set_kal_timer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_set_ringtone.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_set_volume.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_setsockopt.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_setting_get_date_format.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_setting_get_date_seperator.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_setting_get_time_format.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_setting_srv_command.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_settings_set_tone.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_settings_set_wallpaper.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_shutdown.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_shutdown_normal_start.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_card_count.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_active_sim_card.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_card_status.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_iccid.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_imei.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_imei_ext.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_imsi.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_operator.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_prefer_sim_card.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_has_card.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_max_card_count.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_query_operator_code.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sim_set_active_card.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sla_custom_logging.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_add_msg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_clear_interrupt_event_handler.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_clear_interrupt_event_handler_forpay.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_delete_msg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_delete_msg_forpay.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_delete_msg_list.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_box_size.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_msg_id.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_msg_id_list.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_sc_address.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_sc_address_syn.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_is_sms_ready.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_launch.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_read_msg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_set_interrupt_event_handler.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sms_set_interrupt_event_handler_forpay.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_get_account_localip.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_get_host_by_name.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_get_host_by_name_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_get_last_error.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_accept_sync.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_close_client.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_close_client_sync.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_deinit.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_deinit_sync.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_get_soc_id.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_init.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_init_sync.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_read.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_read_sync.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_send.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_send_sync.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_socket.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_socket_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sprintf.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_bt_noti_check_connection.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_bt_noti_register_callback.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_bt_noti_send_cmd_ext.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_bt_noti_send_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_funet_trigger.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_nw_info_get_protocol.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_nw_info_get_service_availability.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_acc_data_rigister_cb.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_disable_mode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_enable_mode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_hr_data_rigister_cb.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_is_available.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_start_listen.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_stop_listen.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sscanf.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ssl_base64_decode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ssl_base64_encode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ssl_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ssl_connect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ssl_get_verify_result.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ssl_is_support.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ssl_load_ca_chain_cert.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ssl_read.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ssl_sha1_hmac.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ssl_write.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_add_account.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_cancel.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_del_account.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_account.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_account_count.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_account_name.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_accounts.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_credentials.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_provider.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_provider_count.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_provider_icon.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_provider_name.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_providers.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_login_account.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_logout_account.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sso_refresh_credentials.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_start_app.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_start_app_with_para.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_storage_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_storage_open.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_storage_read.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_storage_write.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_stream_connect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_stream_disconnect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_stream_set_volume.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_string_equals_ignore_case.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_strtol.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_switch_backlight.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_switch_power_saving_mode.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_delete.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_get_space.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_open.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_read.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_seek.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_write.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tcp_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tcp_close_sync.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tcp_connect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tcp_connect_ex.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tcp_connect_sync.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tcp_get_soc_id.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tcp_read.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tcp_read_sync.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tcp_write.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tcp_write_sync.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_thread_create.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_thread_get_current_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_thread_get_main_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_thread_get_msg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_thread_send_msg.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_auto_rehandshake.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_check_invalid_cert.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_check_peer_name.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_connect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_delete_conn.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_delete_ctx.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_get_cipher.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_get_cipher_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_get_peer_cert.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_handshake.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_log_plaintext.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_new_conn.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_new_ctx.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_read.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_rehandshake.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_ciphers.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_client_auth.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_identity.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_null_client_auth.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_verify.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_shutdown.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_soc_connect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tls_write.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_tmp_filename.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_free.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_get_handle.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_get_mem.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_load.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ucs2_string_by_ascii.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ucs2_to_ascii.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ucs2_to_gb2312.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_udp_close.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_udp_create.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_udp_recvfrom.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_udp_sendto.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_update_cancel.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_update_check_launch.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_update_check_version.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_update_download.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_update_update_file.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_upnp_get_ext_ip.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_upnp_mapping_ports.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_upper_case.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_uriagent_uri_request.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_url_decode_gb2312.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_url_encode_gb2312.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_usb_get_cable_status.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ust_get_current_time.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_ust_get_duration.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vad_get_level.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vad_is_on.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vad_register_callback.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vad_set_level.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vad_switch_on_off.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_pause.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_power_down.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_power_up.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_preview.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_record.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_resume.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_rtsp_local_save_start.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_rtsp_local_save_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_save_to_file.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_set_param.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vibrator_off.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vibrator_on.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vibrator_once.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_close_buffer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_close_file.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_get_cur_play_time.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_open_buffer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_open_file.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_pause.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_play.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_play_by_filepath.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_play_stream_from_rtsp_link.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_play_stream_from_sdp_file.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_resume.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_seek_and_getframe.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_set_brightness.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_set_contrast.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_snapshot.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_video_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vsprintf.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_vwsprintf.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wdt_feed.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wdt_start.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wdt_stop.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wends_with.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wifi_is_connected.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_connect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_dereg_noti.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_disconnect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_get_connected_ap_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_get_ip_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_get_mac_address.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_get_para.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_loc_get_connected_info.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_loc_search.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_loc_search_abort.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_mode_get.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_mode_set.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_perfer.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_add.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_connect.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_delete.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_get_reconn_id.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_init.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_query.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_query_list.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_set_reconn_id.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_update.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_reg_noti.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_roaming_get.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_roaming_set.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_scan.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_scan_abort.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_scan_get_param.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_scan_set_param.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_set_para.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_sniffer_off.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_sniffer_on.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wlan_status.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_write_cache.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wstarts_with.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wstrcat.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wstrcmp.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wstrcmp_ignore_case.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wstrcpy.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wstrlen.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_wstrncpy.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_xml_get_error.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_xml_new_parser.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_xml_parse.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_xml_set_data_handler.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_xml_set_doctype_handlers.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vm_xml_set_element_handlers.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vmdcl.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vmlog.o create mode 100644 hardware/arduino/mtk/system/libmtk/debug/vmthread.o create mode 100644 hardware/arduino/mtk/system/libmtk/include/vm4res.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmalarm.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmappcomm.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmappmgr.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmatcmd.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmbase64.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmbitstream.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmbridge.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmbtcm.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmbtgatt.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmbtnotify.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmbtspp.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmcamera.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmcell.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmcert.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmche.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmchset.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmconn.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmcontact.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmda.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdatetime.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdcl.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdcl_adc.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdcl_eint.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdcl_gpio.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdcl_i2c.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdcl_pmu.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdcl_pwm.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdcl_sio.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdcl_spi.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdes.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdhcp.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmdns.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmeditor.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmemcmd.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmfota.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmftpd.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmgettag.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmgfxold.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmgps.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmgraph.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmhttp.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmhttpd.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmhttps.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vminput.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmio.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmjava.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmkeypad.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmlog.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmmagic.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmmm.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmmms.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmmullang.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmnat.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmnvram.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmnwsetting.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmota.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmpayment.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmpn.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmpromng.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmpwr.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmres.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmrtspd.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmsalui.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmsensor.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmsettings.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmsim.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmsm.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmsms.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmso.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmsock.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmsrvmng.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmssl.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmsso.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmstatusbar.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmstdlib.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmstream.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmsys.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtcp.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtel.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmthread.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtimer.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtls.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtouch.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtsdcl.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtsdcl_eint.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtsdcl_gpio.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtsdcl_i2c.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtsdcl_rtc.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtsdcl_uart.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtsloader.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmtssys.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmuart.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmudp.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmuiapp.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmuimisc.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmusb.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmvad.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmvdorec.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmvibr.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmvideo.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmwdt.h create mode 100644 hardware/arduino/mtk/system/libmtk/include/vmxml.h create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head_by_index.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head_number.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_today_from_2000.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/rand.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/srand.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/strtoi.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm4res.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_accept.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_app_log.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_dereg_msg_proc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_dispatch_msg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_init.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_post_msg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_reg_msg_proc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_send_msg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ascii_to_ucs2.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_assert.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_asyn_http_req.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_atof.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_bytes_duration.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_clear_interrupt_callback.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_duration.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_get_time.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_is_app_playing.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_is_calling.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_close_all.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_get_time.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_open.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_pause.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_play.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_resume.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_set_speedup_mode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_set_start_time.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pause.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_set_level.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_turn_off.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_turn_on.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_beep.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_bytes.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_bytes_no_block.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_file.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_file_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_register_interrupt_callback.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_resume.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_resume_bg_play.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_set_volume_type.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_stop_all.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_suspend_bg_play.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_terminate_background_play.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_vocal_removal_turn_off.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_vocal_removal_turn_on.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_decode_basic.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_encode_basic.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_append.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_finish.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_init.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_append.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_finish.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_init.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bearer_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bearer_open.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bind.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bridge_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bridge_create.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_cm_send_passkey.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_noti_check_channel_valid.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_noti_get_bt_device_addr.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_exit.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_dev_info_by_index.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_dev_num.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_host_dev_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_power_status.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_init.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_search.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_search_abort.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_set_host_name.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_srv_get_visibility.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_srv_set_visibility.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_switch_off.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_switch_on.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_accept.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_bind.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_connect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_connect_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_disconnect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_get_dev_addr.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_get_min_buf_size.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_open.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_read.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_reject.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_set_security_level.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_set_service_name.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_write.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cache_read_char.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_call_actions.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_call_reg_listener.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_calloc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_callout.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_callout_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_camera_startup.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_all_http_sessions.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_asyn_http_req.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_kal_timer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_send_sms.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cbm_hold_bearer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cbm_release_bearer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ce_auth_app_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_cur_cell_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_nbr_cell_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_nbr_num.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_open.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_charbat_is_charging.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_deinit.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_init.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_key_action.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_process.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_private_decrypt.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_private_encrypt.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_public_decrypt.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_public_encrypt.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_set_iv.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_chset_convert.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_closesocket.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_close_port.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_open_port.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_reply.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_connect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_array_stack.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_dyn_array.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_kal_timer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_linked_stack.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_timer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_timer_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_custom_set_bt_pairing_method.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_display_download_list.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_http_dl_operation.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_http_start_download.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_delete_timer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_delete_timer_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_decrypt.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_encrypt.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_reset_key.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_set_key.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_destroy_stack.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_client_get_mode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_client_set_mode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_get_mode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_get_param.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_set_mode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_set_param.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dialer_launch.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_get_state.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_start.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dtacct_select.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dtacct_set.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_add.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_del.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_del_all.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_em_send_command.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_enable_proxy.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ends_with.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_exit_app.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_commit.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_copy.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_copy_abort.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_delete.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_get_attributes.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_get_modify_time.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_getfilesize.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_is_eof.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_mkdir.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_open.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_read.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_rename.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_rmdir.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_seek.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_set_attributes.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_tell.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_write.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_close_ext.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_first.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_first_ext.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_next.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_next_ext.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_is_network_service_available.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_is_switching.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_switch.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_free.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_free_dyn_array.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_abort.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_commit.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_delete.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_get_working_buf_size.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_open.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_read.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_seek.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_write.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gb2312_string.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gb2312_to_ucs2.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_apn_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_asyn_http_req_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_battery_level.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_cache_free_space.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_curr_utc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_current_lang_country_code.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_cust_apn_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_customer_name.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_default_apn_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_default_folder_path.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_disk_free_space.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_disk_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_encoded_dtacct_id.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_exec_filename.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_filename.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_full_path_by_short_name.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imei.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imei_ext.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imsi.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_language.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_language_ssc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_malloc_stat.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_modules.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_modules.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_total_mem_size.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_version.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_multi_tags.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_multi_tags_by_lang_id.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_operator.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_origin_release_verno.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_path.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_removable_driver.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_res_header.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_resource_offset.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_resource_offset_from_file.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_rtc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sim_card_status.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_property.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_scene.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_time_zone.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_system_driver.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_tag_by_lang_id.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_tick_count.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_time.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_total_mem_size.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_version.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_vm_tag.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_volume.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getpeername.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getsockname.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getsockopt.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_free.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_get_max_alloc_size.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_malloc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_open.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_set_mode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_has_sim_card.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_htonl.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_htons.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_add_header.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_fetch_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_free_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_get_current_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_recv_data.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_reg_receiver.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_reg_sender.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_request.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_send_data.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_body.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_current_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_url.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_register_wps_cntxt_and_callback.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_cancel_req.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_post_content_res.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_read_content_req.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_req.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_req_ext.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_set_channel_req.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_unset_channel_req.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_idle_swatch_pedometer_register_callback.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_addr.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_restart.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_start.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_cgi_job_finish.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_disable_ssl.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_enable_ssl.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_getenv.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_read.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_restart.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_start.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_write.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ntoa.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_register_cb.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_restart.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_set_stream_identify.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_start.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_empty_stack.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_exist_stack.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_camera_sensor.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_gsensor.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_wifi.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_call.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_dial_number.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_end.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_listen.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource_from_file.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource_use_outside_memory.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_lower_case.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_magic_wrapper_for_customer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_nc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_nc_topmost.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_topmost.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_memcpy.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_get_time.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_pause.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_by_bytes.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_by_bytes_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_resume.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_set_type.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_stop_all.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_cancel_download.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_cancel_send_mms.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_clear_interrupt_event_handler.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_delete.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_download.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_get_content.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_get_msg_id_list.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_launch.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_send_mms.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_set_interrupt_event_handler.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mode_block.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mode_unblock.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_nvram_get_data.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_nvram_set_data.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_peek_stack.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_add_contact.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_delete_contact.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_contact.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_contact_syn.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_list.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_list_count.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_name_by_id.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_total_contacts.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_used_contacts.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_used_contacts_count.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact_list.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact_syn.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_update_contact.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_delete_process.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_app_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_current_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_reset_ctx.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_restore_default_event_filter.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_send_app_sys_event.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_bg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_ctx.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_event_filter.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_fg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_state.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_dereg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_global_setting.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_mps_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_mps_info_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_object.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_is_support.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_query.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_reg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_set_badge.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_set_notify_style.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_popup_stack.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_post_msg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_push_stack.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_query_operator_code.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_cache.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_from_uart.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_line.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_realloc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_realloc_topmost.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reboot_normal_start.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_pause.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_resume.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_start.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_recv.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_recvfrom.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_func_callback.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_http_notification.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_msg_proc.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_sysevt_callback.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reset_stack.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_resource_get_data.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_resource_get_data_from_file.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_restore_irq_mask.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_safe_wstrcpy.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_save_irq_mask.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_select.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send_msg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send_sms.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sendto.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_active_sim_card.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_app_desired_input_mode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_cust_apn_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_kal_timer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_ringtone.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_volume.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setsockopt.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_date_format.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_date_seperator.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_time_format.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_srv_command.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_settings_set_tone.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_settings_set_wallpaper.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_shutdown.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_shutdown_normal_start.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_card_count.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_active_sim_card.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_card_status.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_iccid.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imei.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imei_ext.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imsi.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_operator.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_prefer_sim_card.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_has_card.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_max_card_count.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_query_operator_code.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_set_active_card.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sla_custom_logging.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_add_msg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_clear_interrupt_event_handler.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_clear_interrupt_event_handler_forpay.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg_forpay.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg_list.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_box_size.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_msg_id.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_msg_id_list.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_sc_address.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_sc_address_syn.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_is_sms_ready.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_launch.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_read_msg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_set_interrupt_event_handler.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_set_interrupt_event_handler_forpay.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_account_localip.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_host_by_name.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_host_by_name_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_last_error.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_accept_sync.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_close_client.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_close_client_sync.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_deinit.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_deinit_sync.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_get_soc_id.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_init.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_init_sync.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_read.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_read_sync.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_send.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_send_sync.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_socket.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_socket_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sprintf.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_check_connection.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_register_callback.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_send_cmd_ext.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_send_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_funet_trigger.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_nw_info_get_protocol.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_nw_info_get_service_availability.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_acc_data_rigister_cb.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_disable_mode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_enable_mode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_hr_data_rigister_cb.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_is_available.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_start_listen.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_stop_listen.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sscanf.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_base64_decode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_base64_encode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_connect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_get_verify_result.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_is_support.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_load_ca_chain_cert.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_read.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_sha1_hmac.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_write.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_add_account.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_cancel.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_del_account.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account_count.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account_name.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_accounts.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_credentials.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_count.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_icon.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_name.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_providers.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_login_account.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_logout_account.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_refresh_credentials.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_start_app.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_start_app_with_para.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_open.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_read.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_write.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_connect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_disconnect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_set_volume.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_string_equals_ignore_case.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_strtol.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_switch_backlight.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_switch_power_saving_mode.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_delete.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_get_space.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_open.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_read.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_seek.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_write.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_close_sync.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect_ex.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect_sync.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_get_soc_id.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_read.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_read_sync.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_write.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_write_sync.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_create.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_current_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_main_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_msg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_send_msg.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_auto_rehandshake.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_check_invalid_cert.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_check_peer_name.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_connect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_delete_conn.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_delete_ctx.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_cipher.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_cipher_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_peer_cert.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_handshake.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_log_plaintext.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_new_conn.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_new_ctx.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_read.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_rehandshake.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_ciphers.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_client_auth.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_identity.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_null_client_auth.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_verify.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_shutdown.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_soc_connect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_write.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tmp_filename.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_free.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_get_handle.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_get_mem.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_load.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_string_by_ascii.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_to_ascii.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_to_gb2312.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_close.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_create.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_recvfrom.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_sendto.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_cancel.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_check_launch.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_check_version.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_download.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_update_file.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upnp_get_ext_ip.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upnp_mapping_ports.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upper_case.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_uriagent_uri_request.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_url_decode_gb2312.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_url_encode_gb2312.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_usb_get_cable_status.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ust_get_current_time.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ust_get_duration.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_get_level.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_is_on.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_register_callback.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_set_level.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_switch_on_off.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_pause.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_power_down.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_power_up.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_preview.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_record.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_resume.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_rtsp_local_save_start.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_rtsp_local_save_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_save_to_file.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_set_param.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_off.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_on.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_once.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_close_buffer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_close_file.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_get_cur_play_time.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_open_buffer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_open_file.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_pause.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_by_filepath.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_stream_from_rtsp_link.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_stream_from_sdp_file.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_resume.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_seek_and_getframe.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_set_brightness.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_set_contrast.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_snapshot.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vsprintf.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vwsprintf.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_feed.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_start.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_stop.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wends_with.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wifi_is_connected.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_connect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_dereg_noti.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_disconnect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_connected_ap_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_ip_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_mac_address.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_para.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_get_connected_info.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_search.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_search_abort.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_mode_get.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_mode_set.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_perfer.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_add.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_connect.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_delete.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_get_reconn_id.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_init.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_query.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_query_list.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_set_reconn_id.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_update.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_reg_noti.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_roaming_get.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_roaming_set.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_abort.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_get_param.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_set_param.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_set_para.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_sniffer_off.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_sniffer_on.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_status.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_write_cache.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstarts_with.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcat.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcmp.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcmp_ignore_case.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcpy.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrlen.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrncpy.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_get_error.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_new_parser.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_parse.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_data_handler.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_doctype_handlers.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_element_handlers.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmdcl.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmlog.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmthread.c create mode 100644 hardware/arduino/mtk/system/libmtk/source/modules/makefile create mode 100644 hardware/arduino/mtk/variants/arduino_due_x/linker_scripts/gcc/scat.ld create mode 100644 hardware/arduino/mtk/variants/arduino_due_x/pins_arduino.h create mode 100644 hardware/arduino/mtk/variants/arduino_due_x/variant.cpp create mode 100644 hardware/arduino/mtk/variants/arduino_due_x/variant.h create mode 100644 hardware/arduino/mtk/variants/linkit_one/libmtk.a create mode 100644 hardware/arduino/mtk/variants/linkit_one/linker_scripts/gcc/scat.ld create mode 100644 hardware/arduino/mtk/variants/linkit_one/pins_arduino.h create mode 100644 hardware/arduino/mtk/variants/linkit_one/variant.cpp create mode 100644 hardware/arduino/mtk/variants/linkit_one/variant.h create mode 100644 hardware/tools/mtk/FirmwareUpdater.exe create mode 100644 hardware/tools/mtk/PackTag.exe create mode 100644 hardware/tools/mtk/PushTool.exe create mode 100644 hardware/tools/mtk/firmware/Download_Agent/6261/EXT_RAM create mode 100644 hardware/tools/mtk/firmware/Download_Agent/6261/INT_SYSRAM create mode 100644 hardware/tools/mtk/firmware/Download_Agent/6261/NAND_FLASH_TABLE create mode 100644 hardware/tools/mtk/firmware/Download_Agent/6261/NOR_FLASH_TABLE create mode 100644 hardware/tools/mtk/firmware/Download_Agent/Need DA version v5.1416 create mode 100644 hardware/tools/mtk/firmware/Downloader.exe create mode 100644 hardware/tools/mtk/firmware/LinkIt_ONE/1.0.29/ALICE create mode 100644 hardware/tools/mtk/firmware/LinkIt_ONE/1.0.29/ALICE.bin create mode 100644 hardware/tools/mtk/firmware/LinkIt_ONE/1.0.29/EXT_BOOTLOADER create mode 100644 hardware/tools/mtk/firmware/LinkIt_ONE/1.0.29/ROM create mode 100644 hardware/tools/mtk/firmware/LinkIt_ONE/1.0.29/SEEED02A_DEMO_BB.cfg create mode 100644 hardware/tools/mtk/firmware/LinkIt_ONE/1.0.29/SEEED02A_DEMO_BOOTLOADER_V005_MT2502_MAUI_LINKIT_ONE_DEV_W14_35.bin create mode 100644 hardware/tools/mtk/firmware/LinkIt_ONE/1.0.29/VIVA create mode 100644 hardware/tools/mtk/firmware/LinkIt_ONE/1.0.29/VIVA.bin create mode 100644 hardware/tools/mtk/firmware/LinkIt_ONE/1.0.29/backup/ROM.orig create mode 100644 hardware/tools/mtk/firmware/LinkIt_ONE/1.0.29/backup/VIVA.orig create mode 100644 psvince.dll create mode 100644 unins000.dat create mode 100644 unins000.exe diff --git a/drivers/mtk/2K_XP_COM/usb2ser_2kXP.inf b/drivers/mtk/2K_XP_COM/usb2ser_2kXP.inf new file mode 100644 index 00000000..06733f6e --- /dev/null +++ b/drivers/mtk/2K_XP_COM/usb2ser_2kXP.inf @@ -0,0 +1,90 @@ +;/***************************************************************************** +;* Copyright Statement: +;* -------------------- +;* This software is protected by Copyright and the information contained +;* herein is confidential. The software may not be copied and the information +;* contained herein may not be used or disclosed except with the written +;* permission of MediaTek Inc. (C) 2010 +;* +;* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +;* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +;* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +;* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +;* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +;* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +;* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +;* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +;* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +;* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +;* +;* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +;* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +;* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +;* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +;* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +;* +;* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +;* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +;* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +;* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +;* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +;* +;*****************************************************************************/ +; +; usb2ser_2kXP.inf +; + +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} + +Provider=%MTK% +DriverVer=07/28/2010,1.1032.0 +CatalogFile=usb2ser_2kXP_Comp.cat + +[Manufacturer] +%MTK%=MTK + +[MTK] +%MTK6218%=Reader,USB\Vid_0e8d&Pid_0003 +%MTK_COM%=Reader,USB\Vid_0e8d&Pid_0023&MI_00 +%MTK_CAT%=Reader,USB\Vid_0e8d&Pid_0023&MI_02 + +[DestinationDirs] +DefaultDestDir=12 + +[Reader.NT] +include=mdmcpq.inf +AddReg=Reader.NT.AddReg +CopyFiles=FakeModemCopyFileSection + +[Reader.NT.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[Reader.NT.Services] +AddService = usbser, 0x00000002, Service_Inst + +[Service_Inst] +DisplayName = %Serial.SvcDesc% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\usbser.sys +LoadOrderGroup = Base + +[SourceDisksNames] + +[SourceDisksFiles] + + +[Strings] +MTK = "MediaTek Inc." +MTK6218 = "MTK USB Port" +MTK_COM = "MTK USB Modem Port" +MTK_CAT = "MTK USB Debug Port" +Serial.SvcDesc = "USB Serial emulation modem driver" \ No newline at end of file diff --git a/drivers/mtk/2K_XP_COM/usb2ser_2kxp_64.cat b/drivers/mtk/2K_XP_COM/usb2ser_2kxp_64.cat new file mode 100644 index 0000000000000000000000000000000000000000..85be693dd6fb9f9796c64e3c58e41f3868062cad GIT binary patch literal 7291 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 literal 0 HcmV?d00001 diff --git a/drivers/mtk/2K_XP_COM/usb2ser_XP64.inf b/drivers/mtk/2K_XP_COM/usb2ser_XP64.inf new file mode 100644 index 00000000..fa212f4b --- /dev/null +++ b/drivers/mtk/2K_XP_COM/usb2ser_XP64.inf @@ -0,0 +1,89 @@ +;/***************************************************************************** +;* Copyright Statement: +;* -------------------- +;* This software is protected by Copyright and the information contained +;* herein is confidential. The software may not be copied and the information +;* contained herein may not be used or disclosed except with the written +;* permission of MediaTek Inc. (C) 2010 +;* +;* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +;* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +;* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +;* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +;* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +;* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +;* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +;* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +;* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +;* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +;* +;* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +;* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +;* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +;* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +;* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +;* +;* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +;* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +;* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +;* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +;* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +;* +;*****************************************************************************/ +; +; usb2ser_XP64.inf +; + +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} + +Provider=%MTK% +DriverVer=07/28/2010,1.1032.0 +CatalogFile=usb2ser_2kXP_64.cat + +[Manufacturer] +%MTK%=MTK,NTamd64 + +[MTK.NTamd64] +%MTK6218%=Reader,USB\Vid_0e8d&Pid_0003 +%MTK_COM%=Reader,USB\Vid_0e8d&Pid_0023&MI_00 +%MTK_CAT%=Reader,USB\Vid_0e8d&Pid_0023&MI_02 + +[DestinationDirs] +DefaultDestDir=12 + +[Reader.NTamd64] +include=mdmcpq.inf +AddReg=Reader.NTamd64.AddReg +CopyFiles=FakeModemCopyFileSection + +[Reader.NTamd64.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[Reader.NTamd64.Services] +AddService = usbser, 0x00000002, Service_Inst + +[Service_Inst] +DisplayName = %Serial.SvcDesc% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\usbser.sys +LoadOrderGroup = Base + +[SourceDisksNames] + +[SourceDisksFiles] + +[Strings] +MTK = "MediaTek Inc." +MTK6218 = "MTK USB Port" +MTK_COM = "MTK USB Modem Port" +MTK_CAT = "MTK USB Debug Port" +Serial.SvcDesc = "USB Serial emulation modem driver" diff --git a/drivers/mtk/98ME_COM/GPRS_USB_Modem.inf b/drivers/mtk/98ME_COM/GPRS_USB_Modem.inf new file mode 100644 index 00000000..7a70f575 --- /dev/null +++ b/drivers/mtk/98ME_COM/GPRS_USB_Modem.inf @@ -0,0 +1,357 @@ +[Version] +Signature="$CHICAGO$" +Class=Modem +Provider=%COMPANY% +ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318} + +[Manufacturer] +%COMPANY% = Models + +[Models] +%Modem1%=Modem1, USB\MTKUSB + +[Modem1] +AddReg = All, MfgAddReg, Modem1.AddReg, USB + +[Strings] +Company ="MediaTek" +Modem1="MTK GPRS USB Modem" + +[All] +HKR,,FriendlyDriver,0,Unimodem.vxd +HKR,,DevLoader,0,*vcomm +HKR,,ConfigDialog,0,modemui.dll +HKR,,EnumPropPages,0,modemui.dll,EnumPropPages +HKR,,PortSubClass,1,02 + +[USB] +HKR,, DeviceType, 1, 01 +HKR,,PortDriver,,wdmmdmld.vxd +HKR,,Contention,0, + +[Modem1.AddReg] +HKR,, Properties, 1, 80,01,00,00, 00,00,00,00, 00,00,00,00, 00,00,00,00, 00,00,00,00, 10,01,00,00, 00,C2,01,00, 40,83,00,00 + +[MfgAddReg] +HKR, Init, 1,, "AT" +HKR, Init, 2,, "ATE0V1" + +HKR, Monitor, 1,, "ATS0=0" +HKR, Monitor, 2,, "None" +HKR, Answer, 1,, "ATA" +HKR, Hangup, 1,, "ATH" +HKR,, Reset,, "ATZ" + +HKR, Settings, Prefix,, "AT" +HKR, Settings, Terminator,, "" +HKR, Settings, DialPrefix,, "D" +HKR, Settings, Pulse,, "P" +HKR, Settings, Tone,, "T" + +HKR, Responses, "", 1, 01, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "", 1, 01, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "OK", 1, 00, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "RING", 1, 08, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "NO CARRIER", 1, 04, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "ERROR", 1, 03, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "NO DIALTONE", 1, 05, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "BUSY", 1, 06, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "NO ANSWER", 1, 07, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "CONNECT", 1, 02, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "0", 1, 00, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "2", 1, 08, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "3", 1, 04, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "4", 1, 03, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "6", 1, 05, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "7", 1, 06, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "8", 1, 07, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "OK", 1, 00, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "RING", 1, 08, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "NO CARRIER", 1, 04, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "ERROR", 1, 03, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "NO DIALTONE", 1, 05, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "NO DIAL TONE",1, 05, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "BUSY", 1, 06, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "NO ANSWER", 1, 07, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "FAX", 1, 03, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "DATA", 1, 03, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "VOICE", 1, 03, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "RINGING", 1, 01, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "DIALING", 1, 01, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "RRING", 1, 01, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "DELAYED", 1, 1d, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "BLACKLISTED", 1, 1c, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "+FCERROR", 1, 03, 00, 00,00,00,00, 00,00,00,00 + +HKR, Responses, "CONNECT", 1, 02, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "CONNECT/ARQ", 1, 02, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "CONNECT/REL", 1, 02, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "CONNECT/MNP", 1, 02, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "CONNECT/LAP-M", 1, 02, 02, 00,00,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT/V42BIS", 1, 02, 03, 00,00,00,00, 00,00,00,00 +HKR, Responses, "CONNECT/V42b", 1, 02, 03, 00,00,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 300", 1, 02, 00, 2C,01,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 300/ARQ", 1, 02, 02, 2C,01,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 300/REL", 1, 02, 02, 2C,01,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 300/MNP", 1, 02, 02, 2C,01,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 300/LAP-M", 1, 02, 02, 2C,01,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 300/V42BIS", 1, 02, 03, 2C,01,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 300/V42b", 1, 02, 03, 2C,01,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 600", 1, 02, 00, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 600/ARQ", 1, 02, 02, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 600/REL", 1, 02, 02, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 600/MNP", 1, 02, 02, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 600/LAP-M", 1, 02, 02, 58,02,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 600/V42BIS", 1, 02, 03, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 600/V42b", 1, 02, 03, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 0600", 1, 02, 00, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 0600/ARQ", 1, 02, 02, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 0600/REL", 1, 02, 02, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 0600/MNP", 1, 02, 02, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 0600/LAP-M", 1, 02, 02, 58,02,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 0600/V42BIS", 1, 02, 03, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 0600/V42b", 1, 02, 03, 58,02,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200", 1, 02, 00, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/ARQ", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/REL", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/MNP", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/LAP-M", 1, 02, 02, B0,04,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 1200/V42BIS", 1, 02, 03, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/V42b", 1, 02, 03, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/75", 1, 02, 00, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/75/ARQ", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/75/REL", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/75/MNP", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/75/LAP-M", 1, 02, 02, B0,04,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 1200/75/V42BIS", 1, 02, 03, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200/75/V42b", 1, 02, 03, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200TX/75RX", 1, 02, 00, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200TX/75RX/ARQ", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200TX/75RX/REL", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200TX/75RX/MNP", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200TX/75RX/LAP-M", 1, 02, 02, B0,04,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 1200TX/75RX/V42BIS",1, 02, 03, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 1200TX/75RX/V42b", 1, 02, 03, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75/1200", 1, 02, 00, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75/1200/ARQ", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75/1200/REL", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75/1200/MNP", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75/1200/LAP-M", 1, 02, 02, B0,04,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 75/1200/V42BIS", 1, 02, 03, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75/1200/V42b", 1, 02, 03, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75TX/1200RX", 1, 02, 00, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75TX/1200RX/ARQ", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75TX/1200RX/REL", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75TX/1200RX/MNP", 1, 02, 02, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75TX/1200RX/LAP-M", 1, 02, 02, B0,04,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 75TX/1200RX/V42BIS",1, 02, 03, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 75TX/1200RX/V42b", 1, 02, 03, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 2400", 1, 02, 00, 60,09,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 2400/ARQ", 1, 02, 02, 60,09,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 2400/REL", 1, 02, 02, 60,09,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 2400/MNP", 1, 02, 02, 60,09,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 2400/LAP-M", 1, 02, 02, 60,09,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 2400/V42BIS", 1, 02, 03, 60,09,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 2400/V42b", 1, 02, 03, 60,09,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 4800", 1, 02, 00, C0,12,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 4800/ARQ", 1, 02, 02, C0,12,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 4800/REL", 1, 02, 02, C0,12,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 4800/MNP", 1, 02, 02, C0,12,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 4800/LAP-M", 1, 02, 02, C0,12,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 4800/V42BIS", 1, 02, 03, C0,12,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 4800/V42b", 1, 02, 03, C0,12,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 7200", 1, 02, 00, 20,1C,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 7200/ARQ", 1, 02, 02, 20,1C,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 7200/REL", 1, 02, 02, 20,1C,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 7200/MNP", 1, 02, 02, 20,1C,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 7200/LAP-M", 1, 02, 02, 20,1C,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 7200/V42BIS", 1, 02, 03, 20,1C,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 7200/V42b", 1, 02, 03, 20,1C,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 9600", 1, 02, 00, 80,25,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 9600/ARQ", 1, 02, 02, 80,25,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 9600/REL", 1, 02, 02, 80,25,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 9600/MNP", 1, 02, 02, 80,25,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 9600/LAP-M", 1, 02, 02, 80,25,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 9600/V42BIS", 1, 02, 03, 80,25,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 9600/V42b", 1, 02, 03, 80,25,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 12000", 1, 02, 00, E0,2E,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 12000/ARQ", 1, 02, 02, E0,2E,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 12000/REL", 1, 02, 02, E0,2E,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 12000/MNP", 1, 02, 02, E0,2E,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 12000/LAP-M", 1, 02, 02, E0,2E,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 12000/V42BIS", 1, 02, 03, E0,2E,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 12000/V42b", 1, 02, 03, E0,2E,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 14400", 1, 02, 00, 40,38,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 14400/ARQ", 1, 02, 02, 40,38,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 14400/REL", 1, 02, 02, 40,38,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 14400/MNP", 1, 02, 02, 40,38,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 14400/LAP-M", 1, 02, 02, 40,38,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 14400/V42BIS", 1, 02, 03, 40,38,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 14400/V42b", 1, 02, 03, 40,38,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 16800", 1, 02, 00, A0,41,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 16800/ARQ", 1, 02, 02, A0,41,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 16800/REL", 1, 02, 02, A0,41,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 16800/MNP", 1, 02, 02, A0,41,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 16800/LAP-M", 1, 02, 02, A0,41,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 16800/V42BIS", 1, 02, 03, A0,41,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 16800/V42b", 1, 02, 03, A0,41,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 19200", 1, 02, 00, 00,4B,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 19200/ARQ", 1, 02, 02, 00,4B,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 19200/REL", 1, 02, 02, 00,4B,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 19200/MNP", 1, 02, 02, 00,4B,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 19200/LAP-M", 1, 02, 02, 00,4B,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 19200/V42BIS", 1, 02, 03, 00,4B,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 19200/V42b", 1, 02, 03, 00,4B,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 21600", 1, 02, 00, 60,54,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 21600/ARQ", 1, 02, 02, 60,54,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 21600/REL", 1, 02, 02, 60,54,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 21600/MNP", 1, 02, 02, 60,54,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 21600/LAP-M", 1, 02, 02, 60,54,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 21600/V42BIS", 1, 02, 03, 60,54,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 21600/V42b", 1, 02, 03, 60,54,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 24000", 1, 02, 00, C0,5D,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 24000/ARQ", 1, 02, 02, C0,5D,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 24000/REL", 1, 02, 02, C0,5D,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 24000/MNP", 1, 02, 02, C0,5D,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 24000/LAP-M", 1, 02, 02, C0,5D,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 24000/V42BIS", 1, 02, 03, C0,5D,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 24000/V42b", 1, 02, 03, C0,5D,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 26400", 1, 02, 00, 20,67,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 26400/ARQ", 1, 02, 02, 20,67,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 26400/REL", 1, 02, 02, 20,67,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 26400/MNP", 1, 02, 02, 20,67,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 26400/LAP-M", 1, 02, 02, 20,67,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 26400/V42BIS", 1, 02, 03, 20,67,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 26400/V42b", 1, 02, 03, 20,67,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 28800", 1, 02, 00, 80,70,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 28800/ARQ", 1, 02, 02, 80,70,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 28800/REL", 1, 02, 02, 80,70,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 28800/MNP", 1, 02, 02, 80,70,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 28800/LAP-M", 1, 02, 02, 80,70,00,00, 00,00,00,00 +;HKR, Responses, "CONNECT 28800/V42BIS", 1, 02, 03, 80,70,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 28800/V42b", 1, 02, 03, 80,70,00,00, 00,00,00,00 +HKR, Responses, "CONNECT 38400", 1, 02, 00, 00,00,00,00, 00,96,00,00 +HKR, Responses, "CONNECT 38400/ARQ", 1, 02, 02, 00,00,00,00, 00,96,00,00 +HKR, Responses, "CONNECT 38400/REL", 1, 02, 02, 00,00,00,00, 00,96,00,00 +HKR, Responses, "CONNECT 38400/MNP", 1, 02, 02, 00,00,00,00, 00,96,00,00 +HKR, Responses, "CONNECT 38400/LAP-M", 1, 02, 02, 00,00,00,00, 00,96,00,00 +;HKR, Responses, "CONNECT 38400/V42BIS", 1, 02, 03, 00,00,00,00, 00,96,00,00 +HKR, Responses, "CONNECT 38400/V42b", 1, 02, 03, 00,00,00,00, 00,96,00,00 +HKR, Responses, "CONNECT 57600", 1, 02, 00, 00,00,00,00, 00,E1,00,00 +HKR, Responses, "CONNECT 57600/ARQ", 1, 02, 02, 00,00,00,00, 00,E1,00,00 +HKR, Responses, "CONNECT 57600/REL", 1, 02, 02, 00,00,00,00, 00,E1,00,00 +HKR, Responses, "CONNECT 57600/MNP", 1, 02, 02, 00,00,00,00, 00,E1,00,00 +HKR, Responses, "CONNECT 57600/LAP-M", 1, 02, 02, 00,00,00,00, 00,E1,00,00 +;HKR, Responses, "CONNECT 57600/V42BIS", 1, 02, 03, 00,00,00,00, 00,E1,00,00 +HKR, Responses, "CONNECT 57600/V42b", 1, 02, 03, 00,00,00,00, 00,E1,00,00 +HKR, Responses, "CONNECT 115200", 1, 02, 00, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115200/ARQ", 1, 02, 02, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115200/REL", 1, 02, 02, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115200/MNP", 1, 02, 02, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115200/LAP-M", 1, 02, 02, 00,00,00,00, 00,C2,01,00 +;HKR, Responses, "CONNECT 115200/V42BIS", 1, 02, 03, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115200/V42b", 1, 02, 03, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115,200", 1, 02, 00, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115,200/ARQ", 1, 02, 02, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115,200/REL", 1, 02, 02, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115,200/MNP", 1, 02, 02, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115,200/LAP-M", 1, 02, 02, 00,00,00,00, 00,C2,01,00 +;HKR, Responses, "CONNECT 115,200/V42BIS", 1, 02, 03, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 115,200/V42b", 1, 02, 03, 00,00,00,00, 00,C2,01,00 +HKR, Responses, "CONNECT 230400", 1, 02, 00, 00,00,00,00, 00,84,03,00 +HKR, Responses, "CONNECT 230400/ARQ", 1, 02, 02, 00,00,00,00, 00,84,03,00 +HKR, Responses, "CONNECT 230400/REL", 1, 02, 02, 00,00,00,00, 00,84,03,00 +HKR, Responses, "CONNECT 230400/MNP", 1, 02, 02, 00,00,00,00, 00,84,03,00 +HKR, Responses, "CONNECT 230400/LAP-M", 1, 02, 02, 00,00,00,00, 00,84,03,00 +;HKR, Responses, "CONNECT 230400/V42BIS", 1, 02, 03, 00,00,00,00, 00,84,03,00 +HKR, Responses, "CONNECT 230400/V42b", 1, 02, 03, 00,00,00,00, 00,84,03,00 +HKR, Responses, "CONNECT 31200 EC", 1,02,02,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200 EC/V42", 1,02,02,E0,79,00,0,0,0,0,0 +;HKR, Responses, "CONNECT 31200 EC/V42BIS", 1,02,03,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200 REL", 1,02,02,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200 REL/MNP5", 1,02,03,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200 REL/V42", 1,02,02,E0,79,00,0,0,0,0,0 +;HKR, Responses, "CONNECT 31200 REL/V42BIS", 1,02,03,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200", 1,02,00,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200/ARQ", 1,02,02,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200/LAP-M", 1,02,02,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200/MNP", 1,02,02,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200/REL", 1,02,02,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200/REL-LAPM V.42 BIS", 1,02,03,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200/REL-LAPM", 1,02,02,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200/V42B", 1,02,03,E0,79,00,0,0,0,0,0 +;HKR, Responses, "CONNECT 31200/V42BIS", 1,02,03,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600 EC", 1,02,02,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600 EC/V42", 1,02,02,40,83,00,0,0,0,0,0 +;HKR, Responses, "CONNECT 33600 EC/V42BIS", 1,02,03,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600 REL", 1,02,02,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600 REL/MNP5", 1,02,03,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600 REL/V42", 1,02,02,40,83,00,0,0,0,0,0 +;HKR, Responses, "CONNECT 33600 REL/V42BIS", 1,02,03,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600", 1,02,00,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600/ARQ", 1,02,02,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600/LAP-M", 1,02,02,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600/MNP", 1,02,02,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600/REL", 1,02,02,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600/REL-LAPM V.42 BIS", 1,02,03,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600/REL-LAPM", 1,02,02,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600/V42B", 1,02,03,40,83,00,0,0,0,0,0 +;HKR, Responses, "CONNECT 33600/V42BIS", 1,02,03,40,83,00,0,0,0,0,0 +HKR, Responses, "CONNECT 31200/REL-MNP",1,02,02,E0,79,00,0,0,0,0,0 +HKR, Responses, "CONNECT 33600/REL-MNP",1,02,02,40,83,00,0,0,0,0,0 + +HKR, Responses, "CARRIER 300", 1, 01, 00, 2C,01,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 1200", 1, 01, 00, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 1200/75", 1, 01, 00, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 75/1200", 1, 01, 00, B0,04,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 2400", 1, 01, 00, 60,09,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 4800", 1, 01, 00, C0,12,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 7200", 1, 01, 00, 20,1C,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 9600", 1, 01, 00, 80,25,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 12000", 1, 01, 00, E0,2E,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 14400", 1, 01, 00, 40,38,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 16800", 1, 01, 00, A0,41,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 19200", 1, 01, 00, 00,4B,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 21600", 1, 01, 00, 60,54,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 24000", 1, 01, 00, C0,5D,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 26400", 1, 01, 00, 20,67,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 28800", 1, 01, 00, 80,70,00,00, 00,00,00,00 +HKR, Responses, "CARRIER 31200 V.23",1,01,00,E0,79,00,0,0,0,0,0 +HKR, Responses, "CARRIER 31200",1,01,00,E0,79,00,0,0,0,0,0 +HKR, Responses, "CARRIER 31200/VFC", 1,01,00,E0,79,00,0,0,0,0,0 +HKR, Responses, "CARRIER 33600 V.23",1,01,00,40,83,00,0,0,0,0,0 +HKR, Responses, "CARRIER 33600",1,01,00,40,83,00,0,0,0,0,0 +HKR, Responses, "CARRIER 33600/VFC", 1,01,00,40,83,00,0,0,0,0,0 + +HKR, Responses, "COMPRESSION: CLASS 5", 1, 01, 03, 00,00,00,00, 00,00,00,00 +HKR, Responses, "COMPRESSION: MNP5", 1, 01, 03, 00,00,00,00, 00,00,00,00 +;HKR, Responses, "COMPRESSION: V.42BIS", 1, 01, 03, 00,00,00,00, 00,00,00,00 +HKR, Responses, "COMPRESSION: V.42 BIS", 1, 01, 03, 00,00,00,00, 00,00,00,00 +;HKR, Responses, "COMPRESSION: V.42bis", 1, 01, 03, 00,00,00,00, 00,00,00,00 +HKR, Responses, "COMPRESSION: V.42 bis", 1, 01, 03, 00,00,00,00, 00,00,00,00 +HKR, Responses, "COMPRESSION: ADC", 1, 01, 01, 00,00,00,00, 00,00,00,00 +HKR, Responses, "COMPRESSION: NONE", 1, 01, 00, 00,00,00,00, 00,00,00,00 + +HKR, Responses, "AUTOSTREAM: LEVEL 1", 1, 01, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "AUTOSTREAM: LEVEL 2", 1, 01, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "AUTOSTREAM: LEVEL 3", 1, 01, 00, 00,00,00,00, 00,00,00,00 + +HKR, Responses, "PROTOCOL: NONE", 1, 01, 00, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: ERROR-CONTROL/LAPB", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: ERROR-CONTROL/LAPB/HDX", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: ERROR-CONTROL/LAPB/AFT", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: X.25/LAPB", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: X.25/LAPB/HDX", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: X.25/LAPB/AFT", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: LAPM", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: LAP-M", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: LAPM/HDX", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: LAP-M/HDX", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: LAPM/AFT", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: LAP-M/AFT", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: ALT", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: ALT-CELLULAR", 1, 01, 0A, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: MNP", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: MNP2", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: MNP3", 1, 01, 02, 00,00,00,00, 00,00,00,00 +HKR, Responses, "PROTOCOL: MNP4", 1, 01, 02, 00,00,00,00, 00,00,00,00 diff --git a/drivers/mtk/98ME_COM/USBCDC.INF b/drivers/mtk/98ME_COM/USBCDC.INF new file mode 100644 index 00000000..dd183b36 --- /dev/null +++ b/drivers/mtk/98ME_COM/USBCDC.INF @@ -0,0 +1,47 @@ +[Version] +CatalogFile=usbcdc.cat +Signature=$CHICAGO$ +Class=USB +Provider=%String0% +LayoutFile=layout.inf,layout1.inf,layout2.inf + +[DestinationDirs] +DefaultDestDir=10 +USB.Drvrs=10,SYSTEM32\DRIVERS +USB.VxD=11 + +[Manufacturer] +%String0%=Microsoft +%MTK%=MTK + +[MTK] +%String1%=MTKUSB,USB\VID_0E8D&PID_0003,USB\Vid_0e8d&Pid_0023&MI_00,USB\Vid_0e8d&Pid_0023&MI_02 + +[MTKUSB] +CopyFiles=USB.Drvrs,USB.VxD +AddReg=MTKUSB.AddReg + +[USB.Drvrs] +usbser.sys +ccport.sys + +[USB.VxD] +wdmmdmld.vxd + +[MTKUSB.AddReg] +HKR,,DevLoader,0,*ntkern +HKR,,NTMPDriver,,"usbser.sys,ccport.sys" + +[MTKUSB.HW] +AddReg=MTKAddReg.HW + +[MTKAddReg.HW] +HKR,,ChildID,2,"USB\MTKUSB" + +[PreCopySection] +HKR,,NoSetupUI,,1 + +[Strings] +String0 = "Microsoft Corporation" +String1 = "USB Serial" +MTK = "MediaTek Inc." diff --git a/drivers/mtk/98_Mass/MTKUMSS.INF b/drivers/mtk/98_Mass/MTKUMSS.INF new file mode 100644 index 00000000..21383d18 --- /dev/null +++ b/drivers/mtk/98_Mass/MTKUMSS.INF @@ -0,0 +1,77 @@ +[Version] +Signature="$CHICAGO$" +Class=HDC +provider=%MSFT% + +[Manufacturer] +%MTK%=MTK + +[MTK] +%USB\VID_054C&PID_0023.DeviceDesc%=MTK.install,USB\VID_0e8d&PID_0002 +%UMSS\DISK.DeviceDesc%=umsspdr.install,UMSS\DISK + +[PreCopySection] +HKR,,NoSetupUI,,1 + +[DestinationDirs] +; \\SYSTEM32\DRIVERS +umss.files = 10,System32\Drivers + +; \\SYSTEM\IOSUBSYS +umsspdr.files = 12 + +[MTK.install] +CopyFiles=umss.files, umsspdr.files +AddReg=umss.addreg + +[umss.addreg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,UMSS.SYS + + +; If the device does not correctly indicate which protocol it uses, +; one of the following sections should be added to indicate which protocol +; the driver should use. + +; Indicate that the device uses the C/B/I protocol +[cbi.addreg.HW] +HKR,,DeviceProtocol,0x10001,00 + +; Indicate that the device uses the C/B protocol +[cb.addreg.HW] +HKR,,DeviceProtocol,0x10001,01 + +; Indicate that the device uses the BULK ONLY protocol +[bulkonly.addreg.HW] +HKR,,DeviceProtocol,0x10001,50 + +; Install the port driver +[umsspdr.install] +AddReg=umsspdr.addreg + +[umsspdr.addreg] +HKR,,DevLoader,,*ios +HKR,,PortDriver,,umsspdr.pdr + + + +[umss.files] +umss.sys + +[umsspdr.files] +umsspdr.pdr + +[SourceDisksNames] +1000 = "USB Mass Storage Sample Driver Disk","",, + +[SourceDisksFiles] +UMSS.SYS = 1000 +UMSSPDR.PDR = 1000 + +;---------------------------------------------------------------; + +[Strings] +MSFT="Microsoft" +MTK="MediaTek Inc." +USB\VID_054C&PID_0023.DeviceDesc="USB Mass Storage Drive" +UMSS\DISK.DeviceDesc="USB Mass Storage Device" diff --git a/drivers/mtk/98_Mass/UMSS.sys b/drivers/mtk/98_Mass/UMSS.sys new file mode 100644 index 0000000000000000000000000000000000000000..c1876ac6fba25d3d9573b4c4515068d5521f1cea GIT binary patch literal 17668 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≪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 literal 0 HcmV?d00001 diff --git a/drivers/mtk/Vista/usb2ser_Vista.inf b/drivers/mtk/Vista/usb2ser_Vista.inf new file mode 100644 index 00000000..cb46f439 --- /dev/null +++ b/drivers/mtk/Vista/usb2ser_Vista.inf @@ -0,0 +1,91 @@ +;/***************************************************************************** +;* Copyright Statement: +;* -------------------- +;* This software is protected by Copyright and the information contained +;* herein is confidential. The software may not be copied and the information +;* contained herein may not be used or disclosed except with the written +;* permission of MediaTek Inc. (C) 2010 +;* +;* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +;* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +;* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +;* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +;* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +;* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +;* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +;* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +;* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +;* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +;* +;* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +;* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +;* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +;* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +;* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +;* +;* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +;* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +;* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +;* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +;* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +;* +;*****************************************************************************/ +; +; usb2ser_Vista_Win7.inf +; +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} + +Provider=%MTK% +DriverVer=07/28/2010,1.1032.0 + +CatalogFile=usb2serVistaWin7_32_Comp.cat + +[Manufacturer] +%MTK%=MTK + +[MTK] +%MTK6218%=Reader,USB\Vid_0e8d&Pid_0003,USB\Vid_0e8d&Pid_1003 +%MTK_COM%=Reader,USB\Vid_0e8d&Pid_0023&MI_00 +%MTK_CAT%=Reader,USB\Vid_0e8d&Pid_0023&MI_02 + +[Reader_Install.NTx86] + +[DestinationDirs] +DefaultDestDir=12 + +[Reader.NT] +Include=mdmcpq.inf +AddReg=Reader.NT.AddReg +CopyFiles=FakeModemCopyFileSection + +[Reader.NT.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[Reader.NT.Services] +AddService = usbser, 0x00000002, Service_Inst + +[Service_Inst] +DisplayName = %Serial.SvcDesc% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\usbser.sys +LoadOrderGroup = Base + +[SourceDisksNames] + +[SourceDisksFiles] + +[Strings] +MTK = "MediaTek Inc." +MTK6218 = "MTK USB Port" +MTK_COM = "MTK USB Modem Port" +MTK_CAT = "MTK USB Debug Port" +Serial.SvcDesc = "USB Serial emulation modem driver" diff --git a/drivers/mtk/Vista/usb2ser_Vista64.inf b/drivers/mtk/Vista/usb2ser_Vista64.inf new file mode 100644 index 00000000..0b751c82 --- /dev/null +++ b/drivers/mtk/Vista/usb2ser_Vista64.inf @@ -0,0 +1,90 @@ +;/***************************************************************************** +;* Copyright Statement: +;* -------------------- +;* This software is protected by Copyright and the information contained +;* herein is confidential. The software may not be copied and the information +;* contained herein may not be used or disclosed except with the written +;* permission of MediaTek Inc. (C) 2010 +;* +;* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +;* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +;* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +;* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +;* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +;* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +;* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +;* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +;* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +;* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +;* +;* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +;* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +;* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +;* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +;* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +;* +;* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +;* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +;* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +;* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +;* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +;* +;*****************************************************************************/ +; +; usb2ser_Vista64_Win7.inf +; +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} + +Provider=%MTK% +DriverVer=07/28/2010,1.1032.0 + +CatalogFile=usb2serVistaWin7_64_Comp.cat + +[Manufacturer] +%MTK%=MTK,NTamd64 + +[MTK.NTamd64] +%MTK6218%=Reader,USB\Vid_0e8d&Pid_0003,USB\Vid_0e8d&Pid_1003 +%MTK_COM%=Reader,USB\Vid_0e8d&Pid_0023&MI_00 +%MTK_CAT%=Reader,USB\Vid_0e8d&Pid_0023&MI_02 + +[DestinationDirs] +DefaultDestDir=12 + +[Reader.NTamd64] +Include=mdmcpq.inf +AddReg=Reader.NTamd64.AddReg +CopyFiles=FakeModemCopyFileSection + +[Reader.NTamd64.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[Reader.NTamd64.Services] +AddService = usbser, 0x00000002, Service_Inst + +[SourceDisksNames] + +[SourceDisksFiles] + + +[Service_Inst] +DisplayName = %Serial.SvcDesc% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\usbser.sys +LoadOrderGroup = Base + +[Strings] +MTK = "MediaTek Inc." +MTK6218 = "MTK USB Port" +MTK_COM = "MTK USB Modem Port" +MTK_CAT = "MTK USB Debug Port" +Serial.SvcDesc = "USB Serial emulation modem driver" diff --git a/drivers/mtk/Vista/usb2servistawin7_32_comp.cat b/drivers/mtk/Vista/usb2servistawin7_32_comp.cat new file mode 100644 index 0000000000000000000000000000000000000000..ec8a27e22c9ce92a7b9f6f6dd9ddad534430bd52 GIT binary patch literal 7289 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�b!ib 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 UKfUsfjhK(r(#sYjPPY#K54;6A^#A|> literal 0 HcmV?d00001 diff --git a/drivers/mtk/Win7/usb2ser_Win7.inf b/drivers/mtk/Win7/usb2ser_Win7.inf new file mode 100644 index 00000000..cb46f439 --- /dev/null +++ b/drivers/mtk/Win7/usb2ser_Win7.inf @@ -0,0 +1,91 @@ +;/***************************************************************************** +;* Copyright Statement: +;* -------------------- +;* This software is protected by Copyright and the information contained +;* herein is confidential. The software may not be copied and the information +;* contained herein may not be used or disclosed except with the written +;* permission of MediaTek Inc. (C) 2010 +;* +;* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +;* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +;* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +;* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +;* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +;* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +;* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +;* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +;* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +;* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +;* +;* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +;* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +;* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +;* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +;* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +;* +;* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +;* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +;* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +;* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +;* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +;* +;*****************************************************************************/ +; +; usb2ser_Vista_Win7.inf +; +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} + +Provider=%MTK% +DriverVer=07/28/2010,1.1032.0 + +CatalogFile=usb2serVistaWin7_32_Comp.cat + +[Manufacturer] +%MTK%=MTK + +[MTK] +%MTK6218%=Reader,USB\Vid_0e8d&Pid_0003,USB\Vid_0e8d&Pid_1003 +%MTK_COM%=Reader,USB\Vid_0e8d&Pid_0023&MI_00 +%MTK_CAT%=Reader,USB\Vid_0e8d&Pid_0023&MI_02 + +[Reader_Install.NTx86] + +[DestinationDirs] +DefaultDestDir=12 + +[Reader.NT] +Include=mdmcpq.inf +AddReg=Reader.NT.AddReg +CopyFiles=FakeModemCopyFileSection + +[Reader.NT.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[Reader.NT.Services] +AddService = usbser, 0x00000002, Service_Inst + +[Service_Inst] +DisplayName = %Serial.SvcDesc% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\usbser.sys +LoadOrderGroup = Base + +[SourceDisksNames] + +[SourceDisksFiles] + +[Strings] +MTK = "MediaTek Inc." +MTK6218 = "MTK USB Port" +MTK_COM = "MTK USB Modem Port" +MTK_CAT = "MTK USB Debug Port" +Serial.SvcDesc = "USB Serial emulation modem driver" diff --git a/drivers/mtk/Win7/usb2ser_Win764.inf b/drivers/mtk/Win7/usb2ser_Win764.inf new file mode 100644 index 00000000..0b751c82 --- /dev/null +++ b/drivers/mtk/Win7/usb2ser_Win764.inf @@ -0,0 +1,90 @@ +;/***************************************************************************** +;* Copyright Statement: +;* -------------------- +;* This software is protected by Copyright and the information contained +;* herein is confidential. The software may not be copied and the information +;* contained herein may not be used or disclosed except with the written +;* permission of MediaTek Inc. (C) 2010 +;* +;* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +;* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +;* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +;* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +;* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +;* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +;* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +;* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +;* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +;* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +;* +;* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +;* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +;* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +;* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +;* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +;* +;* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +;* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +;* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +;* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +;* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +;* +;*****************************************************************************/ +; +; usb2ser_Vista64_Win7.inf +; +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} + +Provider=%MTK% +DriverVer=07/28/2010,1.1032.0 + +CatalogFile=usb2serVistaWin7_64_Comp.cat + +[Manufacturer] +%MTK%=MTK,NTamd64 + +[MTK.NTamd64] +%MTK6218%=Reader,USB\Vid_0e8d&Pid_0003,USB\Vid_0e8d&Pid_1003 +%MTK_COM%=Reader,USB\Vid_0e8d&Pid_0023&MI_00 +%MTK_CAT%=Reader,USB\Vid_0e8d&Pid_0023&MI_02 + +[DestinationDirs] +DefaultDestDir=12 + +[Reader.NTamd64] +Include=mdmcpq.inf +AddReg=Reader.NTamd64.AddReg +CopyFiles=FakeModemCopyFileSection + +[Reader.NTamd64.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[Reader.NTamd64.Services] +AddService = usbser, 0x00000002, Service_Inst + +[SourceDisksNames] + +[SourceDisksFiles] + + +[Service_Inst] +DisplayName = %Serial.SvcDesc% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\usbser.sys +LoadOrderGroup = Base + +[Strings] +MTK = "MediaTek Inc." +MTK6218 = "MTK USB Port" +MTK_COM = "MTK USB Modem Port" +MTK_CAT = "MTK USB Debug Port" +Serial.SvcDesc = "USB Serial emulation modem driver" diff --git a/drivers/mtk/Win7/usb2servistawin7_32_comp.cat b/drivers/mtk/Win7/usb2servistawin7_32_comp.cat new file mode 100644 index 0000000000000000000000000000000000000000..e959107d3d5c600f77bc970a0f939d30f3e86bb1 GIT binary patch literal 7281 zcmdU!2UJr@xW{io2t}lW5g{}|q)tLf=pAWFwE(gZ0!RrYCIKu+iGZMD1uG(=o>fE_ z1*swk3!+#MD+;KfOOc|2N>OKQtMN z(2$_%^4d`d3kiU2U?D*W6Y)c$;cXT)NP*We@H!HCsp>ykk=7JD2?g13%ya{ z2#qFq0(ZPKvKfw(?c|6NCP$KpXdz^nqYuYf3-*-&?}N!aYdFp%cm?2L4NpDTVQbhw zLs-@p9$V08G?K$X+W`*R3OLTG3xzQOMtD`k4T*xir@=l4!;=cH+3=SRM?wK{h8>B9 zCvAH81PPNB0q)Q&{?3*(ki=tQt2`0w>9Ux~S7P&BDFdK~mw_)a3Jz8Ttc3-SnYtVh zo9QP-39uUk*kP_C8FK4V`_76Cz~M1mXP9Xf30VV68*odm{jTH+;EWeU?2*+7w2tUa zmnTm-!P?1}9|&JOfL$abfru)?fX$i8;kvUf%;7eZTY~sk)^-0c)+a~wJNLzK-S=DD ziPP3K|GMo{?}$5*zMl|3SS0*?i(Kd8z6%6;l7up($1%X+NzUOxqtIy4uz81Fsu7iQ zV$W>l*KAss3+B&43B?OR!60aWrC6Son0XRP)^x^3X6U*Qwt^aUsRF^!kfg9Yl***D z=)r6SYdVvmO~3=$slrm<-=Q-p>`;0nK@rGv@AF9DzTJ1H)7c7^QS1;pGnBm%;1|pX z2EdSD00=-&kK_$eW(bq|fCS*5H`qAIM`#2qfnMoBkN{#_i~JITt0}CI(8zUcSdAzI z9?ayE;ByZOjG#vb&NNI=;!hf;3>2ptCiAUfo}m#zEH)*A0j(;yT3bS5D$N}q6feTV zL5Xl_Dv0KwP)I8&a{QMDE64S?hCB9V9@S&#B+E6472+=L4O{!obXyz<`_zi}2ELGY zO)9T(x);woG8lDr$MrK0FN89JH!KP6E-o2NF1tOD_eK2FJTIlCI(IEvR$&%JUycZj zaP)lE_O89^_}1$Q&*PoZq>K;M+5D^UAvE9+G zlO*bTY4oy8I&DDZsKiL4=;LJJVNNv5pgwa`?k#_8A8$d5Zplc7Pm*QQn&gbg0(njQ zTl6gJ7h&D;s=LC`Jdo-qIVd$aB8!0p98ftGj1UmS^24=?mzR%+A0*~-b5WSYBOvi$ zf~ZduV=$DNt?U*jd1?8siN+Jm|9_9;h#=RH9VRBJV)x8GQv04;0MXeMR|Nj>e}sU_gMivM1t>uZHbV=d3qb^a7_5I21YAau0g0#& z(L^LnGD>$UN#G_yV&Ojmsri%M1W}Ax?&9iBSOQd_KfxqE(mIq862w%n@vv2}^;ls< zvLq9=49H|lEkip)B0&Wxa|`lF$bJtuEe|f;6g+~M(V^6!zr^9MtP|P@L8%_(dNI|9oTi@NgCiUsL?GXPbk7L1E#D?%6o!+>P->ucgA-mp{BP$u{q^GoHd*;s{9mFb4=~ znW!yHnMeu{1go6RuN z(V;SF+7UCWsy3A#p~DCd<>u-znDoFXDx0OlW-+J~ZI}h@XUGb_0iYfP5Pq9v;}%>-6jEx1*K|d{J*!r*4Vf^qT&4 zn?nBnter=y{A6;Zz~UFVag@DsOPAI<>@l+5nl{k>aBG{3roM5Pr6np45t{e@k;9@p zR_U7yhP2Xsm%hB39=}&Ay2yWAa!DRtoNA@E#%R0o4vSYMb+`7dmbF_IzPoYX@>RUZ z%@JT>yW;u6)XEQ{Z`)*^tKo~>-p9O9?W_<;6mP{FHQ7R1RYF>wou(DxoLK8sQvTAt zGBckJa{ro$B0~X1h6h(QK@mlmlLU#S{|KP|Oe+!rApTA(!jID_DrtVB((2I2Kza;I z!JfhljG-`tpsb8wKMc_OVYat&K4ABgqHIu1=>(UzL8e zTfVy|O-(@@mnoHh*xY9PdZw+?P`@NYRK#WDrG>+>Mh6Od4&wTnnYwqX-S4#1JoeUN z-{cO5Q6k5WXJ6^6^^XX&B=0y9kaUz-&KwF?I(S^!%0AvR{M4xV&5iDbgS}ciE6%oc z{q*^UT+?NNtSchH@1Oe0+*I2BsLdlRo-~+%F*Un39q1v?Kaq;&Oz{~ zKmLq^?m`7or(#y;stYK&gFd?+_s5zlOU;NdX~=VNIA!4!7Q|oyoWXnvQ(RKva%qMX zJUp}CT!K8j{|$ZiI~ny&o{5h$41A1~*J;GQ8tax=OFQmUq4B*2n~tr(c{vHN1-<8O z?N4=;*6geu_RS006NWld>7?X%X+-^W#gKB&jS~%n&YweuWm~-jUaQqOqp!^uaeM5O zt#$bPlk$z$yUKVd=r2R8l>TRuf+A_H`W;I&{oZHXqkUZ4BV<%zN+rvy2EKATqT1fN z>cg29QgX^c`ZC&~d*YVk!?G`H%Kh~CYHxX_pg$N+EJ;YVigFS$kJ9H0>5d!li$Dpf z(p#jlziz8EPFa>KD)v=7v%3jvah7RXS z0rqJ|ZmI6GLr_p|iTyzP|1vVTa?KDbGku6c5-{M>5X?z}#GHSGhCj$PxYAGYj`;U^ z7ZpGYWkF^4m)a~%_tRElMVCl!R6(9%-2@5*Uo$^by~&Kj7T{_=M_` zcfwx%S?A0x8r>hxP)`Srl*V6U?i(;n`L&5M^&4ILcT2PnofLggj~tztj2_GipBZdU z%eg-!j29QP@)&pE3RdJe=QyU=|9v?Jy#X$JaK(db9gH&g!NroS1qfPzJgM<~XGje- zo*Qrh%V*M1<5~Ulk)Hb+X2fd19%JKtyz*xWDB*q?W$w{Ixy;$cdY zWEXtA zcDzr_!;$lZ)Hs}f$v<^;EJekqj<)(9frDv=y6z5)#e>A_|6%Z<1u5Tf{%uboC$SRX zX2W~}JcN0(;R`_&4B*Y|ETB>I2*PuA8qg>y_#rv7XCZ(gz;MXW;jetFw^}C_J^9j< zx=5I>R`X&5_-T#_Ap&>{XJHHu!$Bd5^=}NaUWwJERr6MP40$Gb=tm1i@b|h$JD9%Bi+a*_ z@o>-LR=y-g^21WoWD^u&(`z%4FTeC?rmDT|<#g=B4p>x`bsz4qOe^+FUc?$oD=Wb` zuC-beg%z*T`fZ5!LjXgizS-=UcHWz28}cibdm+iKpzI=9<7!wokS=3%hV9>zsIl(u zgr;|mmfN`yxgndqO8r-^)J_;vGOeYaBvTYO#3gKAG5|ia6oZS7h#l>_Usf(x+IR%~ zqN)TKG?0TLujt zzc#lrk<7EE^;OZ0aeGa9p#aZq@c+2YX87xDI|NSqWZ>98| z0z96sTOkndb&>qWd883bEZ^|)a$Igw>xF(CnW|n~G5)hyM(Sam^};-FT}?u}iw!1Se^h3y}l06P($<&Ps z)x;5tSI4m)c3yWd$7`6h6~4}QaOos=0Og^FHT$zVCAYOJ)m>M}uw0 zezzFKjm~Gu_yd;AH)s?J&j)yLT$%zHv@{n2SXf6Kk0uUs9IdDlc%8<&8X+Xa z5V1h45j-r`P_l%Q1^jOV?+p+mgaGReU;(hz5YdMhr^N^%!WKPPX8`YrP}YN&K7t^4 z7Rm(>zKn-P;gx}s96#cOxIx8CSmm)ibuhT5b_yi-aN+ zBxtTbArfIA{%~9d5`@qZKO_n^GoV89jAedEG?XKtH99lD!5ppR&sxzaEZz;c0IdZz zQU!8xGKlF+ae}HD2$eG)R2hV<|XT#Ea3lH zAwL?8cL%O=4#>CAGd9pC25@c`&@Ti;8+y$K%0}>R*4JRB&I+~?;T?d*3SRnf(pIp) z5$tON%MLUejpVb?wt$7U1ojKYLSapTv79R6fx-RvE!JQ4G6ec^((pw_LT81;Q5dkykF^@H zo_kUV52t~L69zM30moANN{cj*l*4iYV%{nu;xY3IVNaj0daeZya=eHgvH^kG5&gOT zq}f35nF)YE7zhAPk%R;yst665Gg|{@0#tRzOim91XU>17UGM**ea55CU)gR6%oo^B znA5KH*S62TBR!72f2I-t_cd~Yi}NlJ7)hebAc7nLEKFiP28}|ag~Ip_In^O5XM`Ww z$a`$xQ~(x#1|}321PdBo6R6`b>#%&HN>)_bHhSo$5T=4!fVu+S$cU)m7#cvQGN{2! z1uH6@rh}IQGP9kReBDB&lbNB^2)rVY=d@!)CBL-0QmIS@i%4b&l^)962IM3b14Ceh zHw1W~uTS)XaApKW13(1u&kJmu!APhCCyHL@h8G3G9F2=ac{h+5A)yhQm~a>&2zs!R zTa?>1C@`EF5jbxcujn5bwhSoF8Ycb4F!#{#AO@2hPJ>z%oUJS%YAP-C4~h%Huuy^= zMCC=ZP$;C67%}xjv!(qO$>uh@m2P$K&xloO5voL-T$^_dt<>vSjn7mo-xv5)-Z`PN zeogyMu8EPz+LWeK_s)jWg10UY?k}$xNxbyaaM4GRlYE{^>bf`0JJw^DMqLOG47YcG z^!Rnxy9p3FBh`vr;fTPAKe}0D%kVuy~AVzrsHBvhwouk9F3xx z+`jcb57=oSG#4JS$ejfA7OcdgY_@(Hm?>C#OQ zay~bCK{|~xta4a%qDAQEM1e6@6vOaZ_V$9-jkrOsQnp^jM3#4gMS@3SRz#`1mR&0~ z&+2Jd|4!BP&1ein_7g0W8uW-V5QPqvRl)KDUfd$MUvY79V-|t<0!}Ro8=ni}bK-=& zZ_!3V=|`8j#EPABOrLH!PXGUpIF=xC1xYbA-7Va{@@>H26LTQ+dDmTn!oqce09lUJ z0$6dZ7`1<`SGi%rx)p;+9O)RXg-2zgd9}q)h`QgH!1xYK!0`PI36vT4Wuz?^) z5JjP;v0MNHe-=g)Tx~F#P)L@eFup#;j8)3NDnDKCFPhWI#OOzQh z+E;O6JzrO9xyjP@sp9XiSN!OrxRkmmG7wnOgwZs?TJAlDS6;>r z(0pxY?oBL9Mxr#Teg&ORB`u%^XEm}Q^)e^ zgY0wFRP#3O5j1HM4ccl~b+crbu~VtPM;90vFp_ zTie~0)98+%N&Bvc80P*mt_c3tBb{pG7`xXJdBTb$v`kVluJHij;&bzBZYyd|CwKJ+ z6Vt|&4&=3#M!UNh-=|xjTlN+LR1pNI%vpfqCF8QRA#@=K&##>IZvp`aqey^AFo4iR zz|UZm-mHk{h#jyk*DpDp*RoZ12b(I{dLS zseMWyL-a)vQB5T3lcV#Qs2q*`tDc@-ABujS73-MzXy=xZNaRtK6=jNAyycZdK4={oz3JWXA>`?sz>LHF4I+~#Y7;)( zPif;?QG<$dUXGbas1RqTZLIZG*D}3X`0=2Zfvl5w9qEA_*=&Vj*?O@h(b*rk+5C&5!);OK?%r=~~E25n7d;Vpgw#E&lk1hwql zm(eCKA7)kVuoZmYG8TJex_xGslU;_D1mbbOj~Lb*B#_6h04BgFpO|mJ)(c@WX~w#` z0d$H^`24P_6F?2urEL!7)augc)WFC9CPSCWpaqb1U=^^NM^^Y90Qn#w&C3AI)|yio z9Uc993WMkiG%mwQ(DV~DEXyIZ{Ky_IDg3kB~2``BOai=Z`J!=E%hQ_Ia5@vqAapogQq9O z>B&K}oCaoh%dk2zUthxI9)ue@lFY4un-8-VTKc{|5 zQYhY^mzsOoPda}IP<~nvOWr4|uHLYEud&sx=gTictfn9$nZ2a=keT&VQ?`xL=#UsqNYH89IjON2;{&AwIg*37>3VH-u5Dcuw|xz` zmjz>C7$#Ka*i#twA<;v`Q)V8jcu-FBQLa5t4=@e z`{u)S*;^NQ@~Q=c-#qk{zM-_Ix1rOi(N|ciN-uHZa?w=5y2;xyqMkujd#rIm&ql!g zp`E8z>q#jHttn?bTYnZMo8z7S^H9u+WlQEsm^j395x8XG66VF?09?V`akIFj!oj6^ zq`+W4f4A^rxc(db>^C&(3q2E=q8WM{FWaOU)BC<()Q57+yGrwG4mOuxf$MSxz$9Lj z*w~%yyI7yvFy>nnv^NZOs%DLn{kaK^!m80_`PYv(k2rh?8I$SsN*+{hvr4~&A)`NzGT1|p#CQdhI}Li4Yx%v&YNx#Q8Q?drS`k2!R}JiS$yM#@ zTt9xQgP6$9p{}AFY!|VZ8k6a+uk_RBZfJF9qsNV=m&YYqMy?Swi!|U4>5m=u3rF#* zQai+PSCeW?*sBVJgg@zI_us;qpQf*<_mtE0&piA(V!2YjHG9z7;W)jNs6|;fRdMqA z)}Bu)sAR$74ux8zb7egN$mVChoqaaq6pQK(Dbn65m1L&m`*VHGfW;*U z0qos8-BQi8MNp7#3I7W1|I3iUp=(BvnHfMRBmzSY8iEBPh|m8=(C}Au4es=_ct`mA zco*qU31vWL_m|u(S?}F0LRFt&L1bx>;-JT+XPe&b`1G;QxXX=gw>&yN{6t1=wyh22 z&UI&Fy7NmSc$iE&erw&Ji4dFWXOOU~)FfEbvm zGkY2G%Q$|rVywL8xkbdSD&y**;q2xXqk4OcM~=%c^m{@&-N112hPOz{e*ZK3cgEFK zycX~r$~$9b-r{<19`$sgr!@Z>=Dq;NibXmE>1*4ZhcZOFMo$Rcy@ni~p2;43CO-49 zIY;My7hya(Fe{IB16`$LTc z21tHR^YLKte4o=7yeOE!n?GGZqxkRw3r-u*s3q`2a{ktbp z>Epbkp+9skJ`cWGpn@OISrXE5k}!?SNziYZOIRzwWOEQFfqxvt>HJ|BM~4Ik=!OJP zbOVEe$&nPMPB??Mbz#iH92}N~LIfCtD@&HRU;pJINoQ2*L3Xbv?u|p(9gtbBn?P>} zVX}i1F&9%}cuQ(i?R(!HP1n`GyVv>d!$kMO9N@lj_p97}&y?R}K$*TzO zO-24*xaup{6eb_UK1KQ-rP_;Dj5myTDQ%K^#jdF55wGy5+0t#?R9%$OVA&e6%H!nW zLj&4($0vEO6O)>R3(Ye%RX^|v?n=Gdk-~rK)zNd!A0Ka_a82a{pa zy3W*>>pHo)H{HG8c}jcl$X<;b8?KsA>QDLT(MB#iI37Q9@@2R0cX6^>_FHNCC09^R{u)u=}EI+ofjA zx_YYa(xwArpPZU{drp7vR9chT_I=^8yVuygJ*|u%qu8QqnX<+F+y?Bd{iWdfH&?eC zjgqS)CT>$&zrV5RTBk;LY}ZP?DAOk%{+bRCw=;_wuE*MY3SP-DUs2fKI%5@hQ;fGY zN_-c4dZj?{ySC_PyT%Q+Kl+V_OAh$d=9R7?pQbCN$|)Zl;6GRQ{H@dS#ER(^=+T?} PCb@dkS{t&A`aAvy?aD@F literal 0 HcmV?d00001 diff --git a/drivers/mtk/x64/install64.exe b/drivers/mtk/x64/install64.exe new file mode 100644 index 0000000000000000000000000000000000000000..a38364293587b6e609ecb01628a5b88257383ced GIT binary patch literal 44544 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 X_tzITZBwWv$iE;{K_d|}e|PzJSzRHR literal 0 HcmV?d00001 diff --git a/drivers/mtk/x86/install32.exe b/drivers/mtk/x86/install32.exe new file mode 100644 index 0000000000000000000000000000000000000000..ea51980cfbbc4703923023e80bd8e6f2b183b206 GIT binary patch literal 42496 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 QNBN7gb+*0TJ-F8RpUD75-v9sr literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/boards.txt b/hardware/arduino/mtk/boards.txt new file mode 100644 index 00000000..99ce0382 --- /dev/null +++ b/hardware/arduino/mtk/boards.txt @@ -0,0 +1,44 @@ + +linkit_one.name=LinkIt ONE +linkit_one.vid.0=0x0E8D +linkit_one.pid.0=0x0023 +linkit_one.upload.tool=bossac +linkit_one.upload.protocol=mtk-one +linkit_one.upload.maximum_size=10485760 +linkit_one.upload.use_1200bps_touch=true +linkit_one.upload.wait_for_upload_port=true +linkit_one.upload.native_usb=true +linkit_one.build.mcu=arm7tdmi-s +linkit_one.build.f_cpu=84000000L +linkit_one.build.usb_product="LinkIt ONE" +linkit_one.build.board=MTK_ONE +linkit_one.build.core=arduino +linkit_one.build.extra_flags=-D__COMPILER_GCC__ -D__LINKIT_ONE__ -D__LINKIT_ONE_RELEASE__ -mthumb {build.usb_flags} +linkit_one.build.ldscript=linker_scripts/gcc/scat.ld +linkit_one.build.variant=linkit_one +linkit_one.build.variant_system_lib=libmtk.a +linkit_one.build.vid=0x0E8D +linkit_one.build.pid=0x0023 + + + +# linkit_one_dbg.name=LinkIt ONE (Debug) +# linkit_one_dbg.vid.0=0x0E8D +# linkit_one_dbg.pid.0=0x0023 +# linkit_one_dbg.upload.tool=bossac +# linkit_one_dbg.upload.protocol=mtk-one +# linkit_one_dbg.upload.maximum_size=10485760 +# linkit_one_dbg.upload.use_1200bps_touch=true +# linkit_one_dbg.upload.wait_for_upload_port=true +# linkit_one_dbg.upload.native_usb=true +# linkit_one_dbg.build.mcu=arm7tdmi-s +# linkit_one_dbg.build.f_cpu=84000000L +# linkit_one_dbg.build.usb_product="LinkIt ONE" +# linkit_one_dbg.build.board=MTK_ONE +# linkit_one_dbg.build.core=arduino +# linkit_one_dbg.build.extra_flags=-D__COMPILER_GCC__ -D__LINKIT_ONE__ -D__LINKIT_ONE_DEBUG__ -mthumb {build.usb_flags} +# linkit_one_dbg.build.ldscript=linker_scripts/gcc/scat.ld +# linkit_one_dbg.build.variant=linkit_one +# linkit_one_dbg.build.variant_system_lib=libmtk.a +# linkit_one_dbg.build.vid=0x0E8D +# linkit_one_dbg.build.pid=0x0023 diff --git a/hardware/arduino/mtk/cores/arduino/Arduino.h b/hardware/arduino/mtk/cores/arduino/Arduino.h new file mode 100644 index 00000000..a174456f --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/Arduino.h @@ -0,0 +1,126 @@ +/* + Arduino.h - Main include file for the Arduino SDK + Copyright (c) 2005-2013 Arduino Team. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Arduino_h +#define Arduino_h + +#include +#include +#include +#include + +// some libraries and sketches depend on this +// AVR stuff, assuming Arduino.h or WProgram.h +// automatically includes it... +#include + +#include "binary.h" +#include "itoa.h" +#include "vmdcl.h" + +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus + +// Includes Atmel CMSIS +#include + +#include "wiring_constants.h" + +void yield(void); + +/* sketch */ +extern void setup( void ) ; +extern void loop( void ) ; +extern boolean changePinType(uint32_t ulPin, uint32_t ulPinType, VM_DCL_HANDLE* handle); +extern void spiPinsRest(void); +extern void setPinHandle(uint32_t ulPin, VM_DCL_HANDLE handle); + +typedef enum _EExt_Interrupts +{ + EXTERNAL_INT_0=0, + EXTERNAL_INT_1=1, + EXTERNAL_NUM_INTERRUPTS +} EExt_Interrupts ; + +typedef void (*voidFuncPtr)( void ) ; + +#define PIO_MAX_NUM 19 + +typedef enum _EPioType +{ + PIO_DIGITAL, + PIO_ANALOG, + PIO_EINT, + PIO_PWM, + PIO_SPI, + PIO_UART, + PIO_I2C, + PIO_END +} EPioType ; + +/* Types used for the tables below */ +typedef struct _PinDescription +{ + VM_DCL_HANDLE ulHandle; + uint32_t ulGpioId ; + EPioType ulPinType ; + uint32_t ulPupd; +} PinDescription ; + +/* Pins table to be instanciated into variant.cpp */ +extern PinDescription g_APinDescription[] ; + +#ifdef __cplusplus +} // extern "C" + +#include "WCharacter.h" +#include "WString.h" +#include "Tone.h" +#include "WMath.h" +#include "HardwareSerial.h" +#include "wiring_pulse.h" + +#endif // __cplusplus + +// Include board variant +#include "variant.h" + +#include "wiring.h" +#include "wiring_digital.h" +#include "wiring_analog.h" //jianying add +#include "wiring_shift.h" +#include "WInterrupts.h" + +#include "message.h" + +// USB Device +//#define USB_VID 0x2341 // arduino LLC vid +#define USB_PID_LEONARDO 0x0034 +#define USB_PID_MICRO 0x0035 +#define USB_PID_DUE 0x003E +//#include "USB/USBDesc.h" +//#include "USB/USBCore.h" +//#include "USB/USBAPI.h" + +boolean noStopInterrupts(void); +extern void spiPinsRest(void); +extern void setPinHandle(uint32_t ulPin, VM_DCL_HANDLE handle); + +#endif // Arduino_h diff --git a/hardware/arduino/mtk/cores/arduino/Client.h b/hardware/arduino/mtk/cores/arduino/Client.h new file mode 100644 index 00000000..b8e5d935 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/Client.h @@ -0,0 +1,45 @@ +/* + Client.h - Base class that provides Client + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef client_h +#define client_h +#include "Print.h" +#include "Stream.h" +#include "IPAddress.h" + +class Client : public Stream { + +public: + virtual int connect(IPAddress ip, uint16_t port) =0; + virtual int connect(const char *host, uint16_t port) =0; + virtual size_t write(uint8_t) =0; + virtual size_t write(const uint8_t *buf, size_t size) =0; + virtual int available() = 0; + virtual int read() = 0; + virtual int read(uint8_t *buf, size_t size) = 0; + virtual int peek() = 0; + virtual void flush() = 0; + virtual void stop() = 0; + virtual uint8_t connected() = 0; + virtual operator bool() = 0; +protected: + uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); }; +}; + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/HardwareSerial.h b/hardware/arduino/mtk/cores/arduino/HardwareSerial.h new file mode 100644 index 00000000..5674e57a --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/HardwareSerial.h @@ -0,0 +1,42 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef HardwareSerial_h +#define HardwareSerial_h + +#include + +#include "Stream.h" + +class HardwareSerial : public Stream +{ + public: + virtual void begin(unsigned long); + virtual void end(); + virtual int available(void) = 0; + virtual int peek(void) = 0; + virtual int read(void) = 0; + virtual void flush(void) = 0; + virtual size_t write(uint8_t) = 0; + using Print::write; // pull in write(str) and write(buf, size) from Print + virtual operator bool() = 0; +}; + +extern void serialEventRun(void) __attribute__((weak)); + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/IPAddress.cpp b/hardware/arduino/mtk/cores/arduino/IPAddress.cpp new file mode 100644 index 00000000..22a0e427 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/IPAddress.cpp @@ -0,0 +1,74 @@ +/* + IPAddress.cpp - Base class that provides IPAddress + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include + +IPAddress::IPAddress() +{ + memset(_address, 0, sizeof(_address)); +} + +IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) +{ + _address[0] = first_octet; + _address[1] = second_octet; + _address[2] = third_octet; + _address[3] = fourth_octet; +} + +IPAddress::IPAddress(uint32_t address) +{ + memcpy(_address, &address, sizeof(_address)); +} + +IPAddress::IPAddress(const uint8_t *address) +{ + memcpy(_address, address, sizeof(_address)); +} + +IPAddress& IPAddress::operator=(const uint8_t *address) +{ + memcpy(_address, address, sizeof(_address)); + return *this; +} + +IPAddress& IPAddress::operator=(uint32_t address) +{ + memcpy(_address, (const uint8_t *)&address, sizeof(_address)); + return *this; +} + +bool IPAddress::operator==(const uint8_t* addr) const +{ + return memcmp(addr, _address, sizeof(_address)) == 0; +} + +size_t IPAddress::printTo(Print& p) const +{ + size_t n = 0; + for (int i =0; i < 3; i++) + { + n += p.print(_address[i], DEC); + n += p.print('.'); + } + n += p.print(_address[3], DEC); + return n; +} + diff --git a/hardware/arduino/mtk/cores/arduino/IPAddress.h b/hardware/arduino/mtk/cores/arduino/IPAddress.h new file mode 100644 index 00000000..622efb76 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/IPAddress.h @@ -0,0 +1,70 @@ +/* + IPAddress.h - Base class that provides IPAddress + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef IPAddress_h +#define IPAddress_h + +#include + +// A class to make it easier to handle and pass around IP addresses + +class IPAddress : public Printable { +private: + uint8_t _address[4]; // IPv4 address + // Access the raw byte array containing the address. Because this returns a pointer + // to the internal structure rather than a copy of the address this function should only + // be used when you know that the usage of the returned uint8_t* will be transient and not + // stored. + uint8_t* raw_address() { return _address; }; + +public: + // Constructors + IPAddress(); + IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet); + IPAddress(uint32_t address); + IPAddress(const uint8_t *address); + + // Overloaded cast operator to allow IPAddress objects to be used where a pointer + // to a four-byte uint8_t array is expected + operator uint32_t() const { return *((uint32_t*)_address); }; + bool operator==(const IPAddress& addr) const { return (*((uint32_t*)_address)) == (*((uint32_t*)addr._address)); }; + bool operator==(const uint8_t* addr) const; + + // Overloaded index operator to allow getting and setting individual octets of the address + uint8_t operator[](int index) const { return _address[index]; }; + uint8_t& operator[](int index) { return _address[index]; }; + + // Overloaded copy operators to allow initialisation of IPAddress objects from other types + IPAddress& operator=(const uint8_t *address); + IPAddress& operator=(uint32_t address); + + virtual size_t printTo(Print& p) const; + + friend class EthernetClass; + friend class UDP; + friend class Client; + friend class Server; + friend class DhcpClass; + friend class DNSClient; +}; + +const IPAddress INADDR_NONE(0,0,0,0); + + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/LTask.cpp b/hardware/arduino/mtk/cores/arduino/LTask.cpp new file mode 100644 index 00000000..63d50e29 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/LTask.cpp @@ -0,0 +1,120 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "vmsys.h" +#include "vmthread.h" +#include "LTask.h" +#include "arduino.h" + + +_LTaskClass::_LTaskClass() +{ + m_handle = 0; + m_signal = 0; +} + +void _LTaskClass::begin(void) +{ + vm_mutex_create(&m_mutex); + m_handle = vm_thread_get_main_handle(); + m_signal = vm_signal_init(); +} + +void _LTaskClass::sendMsg(VMUINT32 msg_id, void* user_data) +{ + if(m_handle == 0) + { + begin(); + } + if(m_handle != 0) + { + vm_thread_send_msg(m_handle, msg_id, user_data); + } +} + +void _LTaskClass::stop(void) +{ + m_handle = 0; + vm_signal_clean(m_signal); + vm_signal_deinit(m_signal); + m_signal = 0; +} + +void _LTaskClass::mutexLock() +{ + if(m_handle == 0) + { + begin(); + } + + vm_mutex_lock(&m_mutex); +} + +void _LTaskClass::mutexUnlock() +{ + if(m_handle == 0) + { + begin(); + } + + vm_mutex_unlock(&m_mutex); +} + +void _LTaskClass::post_signal() +{ + if(m_handle == 0) + { + begin(); + } + + vm_signal_post(m_signal); +} + +void _LTaskClass::remoteCall(remote_call_ptr func, void* userdata) +{ + if(m_handle == 0) + { + begin(); + } + mutexLock(); + m_msg.remote_func = (remote_call_ptr)func; + m_msg.userdata = userdata; + m_msg.signal = m_signal; + sendMsg(VM_MSG_ARDUINO_CALL, &m_msg); + vm_signal_wait(m_signal); + mutexUnlock(); +} + +_LTaskClass LTask = _LTaskClass(); + diff --git a/hardware/arduino/mtk/cores/arduino/LTask.h b/hardware/arduino/mtk/cores/arduino/LTask.h new file mode 100644 index 00000000..550f3ebe --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/LTask.h @@ -0,0 +1,70 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + + +#ifndef _LTaskClass_h +#define _LTaskClass_h + +#include "vmsys.h" +#include "vmthread.h" +#include "message.h" + +class _LTaskClass +{ +private: + vm_thread_mutex_struct m_mutex; + msg_struct m_msg; + VM_THREAD_HANDLE m_handle; + VM_SIGNAL_ID m_signal; + void sendMsg(VMUINT32 msg_id, void* user_data); + +public: + _LTaskClass(); + + void begin(void); + void mutexLock(); + void mutexUnlock(); + void stop(void); + void remoteCall(remote_call_ptr func, void* userdata); + +public: + void post_signal(); + +}; + +extern _LTaskClass LTask; + +#endif + diff --git a/hardware/arduino/mtk/cores/arduino/LTcpClient.cpp b/hardware/arduino/mtk/cores/arduino/LTcpClient.cpp new file mode 100644 index 00000000..fa3e5625 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/LTcpClient.cpp @@ -0,0 +1,498 @@ +#include +#include "LTask.h" +#include "LTcpClient.h" +#include "vmconn.h" +#include "vmtcp.h" +#include "vmlog.h" + +#define APN_ID VM_TCP_APN_WIFI + +SharedHandle::SharedHandle(): + m_handle(INVALID_HANDLE), + m_serverHandle(INVALID_HANDLE), + m_pSharedCount(NULL) +{ +} + +SharedHandle::SharedHandle(VMINT handle): + m_handle(handle), + m_serverHandle(INVALID_HANDLE), + m_pSharedCount(new VMINT(1)) +{ + vm_log_info("SharedHandle create: c:%d, s:%d", m_handle, m_serverHandle); +} + +SharedHandle::SharedHandle(VMINT clientHandle, VMINT serverHandle): + m_handle(clientHandle), + m_serverHandle(serverHandle), + m_pSharedCount(new VMINT(1)) +{ + vm_log_info("SharedHandle create: c:%d, s:%d", m_handle, m_serverHandle); +} + +SharedHandle::SharedHandle(const SharedHandle& rhs): + m_handle(rhs.m_handle), + m_serverHandle(rhs.m_serverHandle), + m_pSharedCount(rhs.m_pSharedCount) +{ + incRef(); +} + +SharedHandle::~SharedHandle() +{ + decRef(); +} + +void SharedHandle::invalidateHandle() +{ + m_handle = INVALID_HANDLE; + m_serverHandle = INVALID_HANDLE; +} + +SharedHandle& SharedHandle::operator =(const SharedHandle& rhs) +{ + decRef(); + m_handle = rhs.m_handle; + m_serverHandle = rhs.m_serverHandle; + m_pSharedCount = rhs.m_pSharedCount; + incRef(); + + return *this; +} + +SharedHandle::operator bool() const +{ + return (m_handle != INVALID_HANDLE); +} + +boolean SharedHandle::releaseTcpHandle(void *userData) +{ + SharedHandle *pThis = (SharedHandle*)userData; + vm_log_info("SharedHandle release: c=%d, s=%d", pThis->m_handle, pThis->m_serverHandle); + if (pThis->m_serverHandle != -1) + { + VMINT ret = vm_soc_svr_close_client(pThis->m_handle); + } + else + { + vm_tcp_close(pThis->m_handle); + } + return true; +} + +void SharedHandle::releaseHandle() +{ + if(m_handle == INVALID_HANDLE) + { + invalidateHandle(); + return; + } + + LTask.remoteCall(&releaseTcpHandle, (void*)this); + invalidateHandle(); +} + +void SharedHandle::incRef() +{ + if(m_pSharedCount != NULL) + { + (*m_pSharedCount)++; + } +} + +void SharedHandle::decRef() +{ + if(m_pSharedCount == NULL) + { + return; + } + + if(*m_pSharedCount) + *m_pSharedCount -= 1; + + if(*m_pSharedCount <= 0) + { + releaseHandle(); + delete m_pSharedCount; + m_pSharedCount = NULL; + } +} + +LTcpClient::LTcpClient(): + m_handle(), + m_peekByte(-1), + m_apn(APN_ID), + m_peekBuffered(false) +{ + +} + +LTcpClient::LTcpClient(const LTcpClient &rhs): + m_handle(rhs.m_handle), + m_apn(rhs.m_apn), + m_peekByte(-1), + m_peekBuffered(false) +{ +} + +LTcpClient::LTcpClient(VMINT handle): + m_handle(handle), + m_peekByte(-1), + m_apn(APN_ID), + m_peekBuffered(false) +{ +} + +LTcpClient::LTcpClient(VMINT handle, VMINT serverHandle): + m_handle(handle, serverHandle), + m_peekByte(-1), + m_apn(APN_ID), + m_peekBuffered(false) +{ +} + +LTcpClient::~LTcpClient() +{ +} + +struct LTcpConnectContext +{ + const char *ipAddr; + VMINT port; + LTcpClient *pInstance; +}; + +void LTcpClient::connectCallback(VMINT handle, VMINT event, void *userData) +{ + LTcpClient *pThis = (LTcpClient*)userData; + vm_log_info("connectCallback handle=%d event=%d userData=%d", handle, event, userData); + switch(event) + { + case VM_TCP_EVT_CONNECTED: + pThis->m_handle = SharedHandle(handle); + LTask.post_signal(); + break; + case VM_TCP_EVT_CAN_WRITE: + break; + case VM_TCP_EVT_CAN_READ: + break; + case VM_TCP_EVT_PIPE_BROKEN: + pThis->m_handle.invalidateHandle(); + LTask.post_signal(); + break; + case VM_TCP_EVT_HOST_NOT_FOUND: + pThis->m_handle.invalidateHandle(); + LTask.post_signal(); + break; + case VM_TCP_EVT_PIPE_CLOSED: + pThis->m_handle.invalidateHandle(); + LTask.post_signal(); + break; + } + return; +} + +boolean LTcpClient::connectIP(void *userData) +{ + LTcpConnectContext *pContext = (LTcpConnectContext*)userData; + // async api + vm_log_info("connectIP, IP=%s, port=%d", pContext->ipAddr, pContext->port); + VMINT clientHandle = vm_tcp_connect_ex(pContext->ipAddr, + pContext->port, + pContext->pInstance->getAPN(), + pContext->pInstance, + &connectCallback); + vm_log_info("vm_tcp_connect returns %d", clientHandle); + return false; +} + +int LTcpClient::connect(IPAddress ip, uint16_t port) +{ + vm_log_info("connect(IPAddress)"); + char ipAddr[50] = {0}; + sprintf(ipAddr, + "%d.%d.%d.%d", + ip[0], + ip[1], + ip[2], + ip[3]); + vm_log_info("connect to %s", ipAddr); + return connect(ipAddr, port); +} + +int LTcpClient::connect(const char *host, uint16_t port) +{ + vm_log_info("LTcpClient::connect(char) to %s:%d", host, port); + + if(connected()) + { + vm_log_info("LTcpClient::connect() while already connected. stop() first."); + stop(); + } + + LTcpConnectContext context; + context.ipAddr = host; + context.port = port; + context.pInstance = this; + LTask.remoteCall(&connectIP, &context); + return connected(); +} + +struct LTcpReadWriteContext +{ + VMINT handle; + VMINT serverHandle; + void *buf; + VMINT len; + VMINT lenProcessed; // bytes read or written + LTcpClient *pInst; + + LTcpReadWriteContext(): + handle(-1), + serverHandle(-1), + buf(NULL), + len(0), + lenProcessed(0), + pInst(NULL) + { + + } +}; + +boolean LTcpClient::wifiWrite(void *userData) +{ + vm_log_info("wifiWrite"); + LTcpReadWriteContext *pContext = (LTcpReadWriteContext*)userData; + if (pContext->serverHandle != -1) + { + pContext->lenProcessed = vm_soc_svr_send(pContext->serverHandle, + pContext->handle, + pContext->buf, + pContext->len); + } + else + { + pContext->lenProcessed = vm_tcp_write(pContext->handle, + pContext->buf, + pContext->len); + } + + vm_log_info("wifiWrite wrote %d", pContext->lenProcessed); + return true; +} + +size_t LTcpClient::write(uint8_t b) +{ + vm_log_info("wifiWrite arduino (byte)"); + LTcpReadWriteContext c; + c.handle = m_handle.m_handle; + c.serverHandle = m_handle.m_serverHandle; + c.buf = &b; + c.len = 1; + c.pInst = this; + LTask.remoteCall(&wifiWrite, &c); + + vm_log_info("written %d bytes", c.lenProcessed); + return c.lenProcessed; +} + +size_t LTcpClient::write(const uint8_t *buf, size_t size) +{ + vm_log_info("wifiWrite arduino (buffered)"); + LTcpReadWriteContext c; + c.handle = m_handle.m_handle; + c.serverHandle = m_handle.m_serverHandle; + c.buf = (void*)buf; + c.len = size; + c.pInst = this; + LTask.remoteCall(&wifiWrite, &c); + + vm_log_info("written %d bytes", c.lenProcessed); + return c.lenProcessed; +} + +int LTcpClient::available() +{ + return (peek() == -1) ? 0 : 1; +} + +boolean LTcpClient::wifiRead(void *userData) +{ + LTcpReadWriteContext *pContext = (LTcpReadWriteContext*)userData; + LTcpClient *pThis = pContext->pInst; + + pContext->lenProcessed = 0; + + // parameter check + if(pContext->len <= 0) + { + return true; + } + + vm_log_info("wifiRead len=%d", pContext->len); + + // check peek state + if(pThis->m_peekBuffered) + { + // insert the peeked byte + *((VMINT8*)pContext->buf) = pThis->m_peekByte; + pContext->lenProcessed += 1; + pContext->len--; + // clear peek state + pThis->m_peekByte = -1; + pThis->m_peekBuffered = false; + } + + VMINT readResult = VM_TCP_READ_EOF; + + // actually read from TCP socket + if (pContext->serverHandle != -1) + { + readResult = vm_soc_svr_read(pContext->serverHandle, + pContext->handle, + pContext->buf, + pContext->len); + } + else + { + readResult = vm_tcp_read(pContext->handle, + pContext->buf, + pContext->len); + } + + if (readResult > 0) + { + pContext->lenProcessed += readResult; + } + + if (readResult == VM_TCP_READ_EOF) + { + // we may cache a peek byte even if the socket is disconnected + vm_log_info("wifiRead socket disconnected"); + } + + vm_log_info("wifiRead %d bytes", pContext->lenProcessed); + return true; +} + +int LTcpClient::read() +{ + // read a single byte + LTcpReadWriteContext c; + uint8_t ret = 0; + c.handle = m_handle.m_handle; + c.serverHandle = m_handle.m_serverHandle; + c.buf = &ret; + c.len = 1; + c.pInst = this; + LTask.remoteCall(&wifiRead, &c); + if(c.lenProcessed > 0) + { + return (int)ret; + } + else + { + // if no data available, return -1 + return -1; + } +} + +int LTcpClient::read(uint8_t *buf, size_t size) +{ + // read a single byte + LTcpReadWriteContext c; + uint8_t ret = 0; + c.handle = m_handle.m_handle; + c.serverHandle = m_handle.m_serverHandle; + c.buf = buf; + c.len = size; + c.pInst = this; + vm_log_info("wifiRead call with buf=%d, size=%d", c.buf, c.len); + LTask.remoteCall(&wifiRead, &c); + vm_log_info("LTcpClient::read return %d", c.lenProcessed); + return c.lenProcessed; +} + +boolean LTcpClient::wifiPeek(void *userData) +{ + LTcpClient *pThis = (LTcpClient*)userData; + + if(pThis->m_peekBuffered) + { + return true; + } + + // read and store the peeked byte + LTcpReadWriteContext cntx; + cntx.buf = &pThis->m_peekByte; + cntx.len = sizeof(pThis->m_peekByte); + cntx.handle = pThis->m_handle.m_handle; + cntx.serverHandle = pThis->m_handle.m_serverHandle; + cntx.lenProcessed = 0; + cntx.pInst = pThis; + if(!wifiRead(&cntx)) + { + vm_log_error("read fail in wifiPeek"); + } + + if (cntx.lenProcessed > 0) + { + pThis->m_peekBuffered = true; + } + else + { + pThis->m_peekBuffered = false; + } + + return true; +} + +int LTcpClient::peek() +{ + // peek() must return -1 when there is no data to read + if (m_handle == -1) + { + vm_log_info("peek() with invalid handle, return -1"); + return -1; + } + + LTask.remoteCall(&wifiPeek, this); + + if (m_peekBuffered) + { + return (int)m_peekByte; + } + else + { + return -1; + } +} + +void LTcpClient::stop() +{ + // release reference to handle + m_handle = SharedHandle(); +} + +uint8_t LTcpClient::connected() +{ + return bool(m_handle); +} + +LTcpClient::operator bool() +{ + return connected(); +} + +void LTcpClient::flush() +{ + // both read() and write() are inherently flush()ed. + // so we simply return here. + return; +} + +VMINT LTcpClient::getAPN() const +{ + return m_apn; +} + diff --git a/hardware/arduino/mtk/cores/arduino/LTcpClient.h b/hardware/arduino/mtk/cores/arduino/LTcpClient.h new file mode 100644 index 00000000..8fc87a49 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/LTcpClient.h @@ -0,0 +1,208 @@ +#ifndef LTcpClient_h +#define LTcpClient_h +#include "Arduino.h" +#include "Print.h" +#include "Client.h" +#include "IPAddress.h" + + +/* DOM-NOT_FOR_SDK-BEGIN */ +// partially mimic the behavior of std::shard_ptr +// since we don't have tr1/0x/11 support right now. +class SharedHandle +{ +public: + SharedHandle(); + explicit SharedHandle(VMINT handle); + SharedHandle(VMINT clientHandle, VMINT serverHandle); + SharedHandle(const SharedHandle& rhs); + ~SharedHandle(); + + void invalidateHandle(); + + SharedHandle& operator =(const SharedHandle& rhs); + operator bool() const; + + friend class LTcpClient; + +protected: + static const VMINT INVALID_HANDLE = -1; + void releaseHandle(); + void incRef(); + void decRef(); + static boolean releaseTcpHandle(void *userData); + +private: + VMINT m_handle; + VMINT m_serverHandle; + VMINT *m_pSharedCount; +}; +/* DOM-NOT_FOR_SDK-END */ + +//LTcpClient Class +class LTcpClient : public Client { + +public: + // DESCRIPTION + // Constructs a LTcpClient object which can be used to connect to the remote TCP server. + // + // + // PARAMETERS + // N/A + // + // RETURNS + // N/A + LTcpClient(); + + /* DOM-NOT_FOR_SDK-BEGIN */ + LTcpClient(const LTcpClient &rhs); + LTcpClient(VMINT handle); + LTcpClient(VMINT handle, VMINT serverHandle); + ~LTcpClient(); + /* DOM-NOT_FOR_SDK-END */ + + // DESCRIPTION + // Connects to a TCP server. + // + // PARAMETERS + // IPAddress: IPAddress object, e.g. IPAddress server (172, 21, 84, 11), that denotes server address + // port: TCP port to be connected + // + // RETURNS + // 1 if connected, 0 otherwise. + virtual int connect(IPAddress ip, uint16_t port); + + // DESCRIPTION + // Connects to a TCP server. + // + // PARAMETERS + // IPAddress: String, e.g. "172.21.84.11", that denotes server address + // port: TCP port to be connected + // + // RETURNS + // 1 if connected, 0 otherwise. + virtual int connect(const char *host, uint16_t port); + + // DESCRIPTION + // Writes data to server after connected to one. + // + // PARAMETERS + // byte: Single byte to be sent + // + // RETURNS + // Total written bytes. + virtual size_t write(uint8_t); + + + // DESCRIPTION + // Writes data to server after connected to one. + // + // PARAMETERS + // byteArray: byteArray to be sent + // size: Size of byteArray, in bytes + // + // RETURNS + // Total written bytes. + virtual size_t write(const uint8_t *buf, size_t size); + + // DESCRIPTION + // Queries if there are incoming data from server side and returns the number of byte available for read after connecting to a server. + // + // PARAMETERS + // N/A + // + // RETURNS + // 0: There is no data available for read + // >0: Size of the data available to read, in bytes + virtual int available(); + + // DESCRIPTION + // Reads the data sent from the server side and returns one single byte if there is no parameter given. If the buffer and buffer size are given, store the data in the buffer passed in. + // + // PARAMETERS + // N/A + // + // RETURNS + // The data byte + virtual int read(); + + // DESCRIPTION + // Reads the data sent from the server side and returns one single byte if there is no parameter given. If the buffer and buffer size are given, store the data in the buffer passed in. + // + // PARAMETERS + // buf: uint8_t buffer to store the incoming data + // size: Buffer size in bytes + // + // RETURNS + // The actual read data in bytes are returned. + // >0: Total bytes read + // 0: There are no data to read + virtual int read(uint8_t *buf, size_t size); + + // DESCRIPTION + // Queries the first unread byte sent from the connected server side. + // This byte is not considered as read; therefore this method will return the same byte until read() is called. + // + // PARAMETERS + // N/A + // + // RETURNS + // The first unread byte sent from server + virtual int peek(); + + // DESCRIPTION + // Drops all data sent from server side to this client object. + // + // PARAMETERS + // N/A + // + // RETURNS + // N/A + virtual void flush(); // flush is not currrently supported. + + // DESCRIPTION + // Disconnects from the connected TCP server. + // + // PARAMETERS + // N/A + // + // RETURNS + // N/A + virtual void stop(); + + // DESCRIPTION + // Queries if this client object has been connected to a TCP server. + // + // PARAMETERS + // N/A + // + // RETURNS + // 1: Currently connected to a server + // 0: Not connected to a server + virtual uint8_t connected(); + + /* DOM-NOT_FOR_SDK-BEGIN */ + virtual operator bool(); + /* DOM-NOT_FOR_SDK-END */ + +public: + friend class LTcpServer; + +protected: + /* DOM-NOT_FOR_SDK-BEGIN */ + SharedHandle m_handle; // Manages underlying TCP resource handles. Reference counted, copy-constructable. + VMINT m_apn; // APN id to use. Child class should change this. + VMINT8 m_peekByte; // buffer to store the peek byte + boolean m_peekBuffered; // is the buffer valid or not + + static boolean connectIP(void *userData); + static void connectCallback(VMINT handle, VMINT event, void *userData); + static boolean wifiRead(void *userData); + static boolean wifiWrite(void *userData); + static boolean wifiPeek(void *userData); + + VMINT getAPN() const; + /* DOM-NOT_FOR_SDK-END */ +}; + +#endif // LTcpClient_h \ No newline at end of file diff --git a/hardware/arduino/mtk/cores/arduino/LTcpServer.cpp b/hardware/arduino/mtk/cores/arduino/LTcpServer.cpp new file mode 100644 index 00000000..b94562ce --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/LTcpServer.cpp @@ -0,0 +1,203 @@ +#include "arduino.h" +#include "LTcpServer.h" +#include "LTcpClient.h" +#include "LTask.h" +#include "vmconn.h" +#include "vmtcp.h" +#include "vmlog.h" +#include "vmsock.h" +#include "vmnwsetting.h" + +LTcpServer::LTcpServer(uint16_t port): + m_port(port), + m_handle(-1), + m_apn(VM_TCP_APN_WIFI) +{ +} + +void LTcpServer::serverCallback(VMINT handle, VMINT event, VMINT param, void *user_data) +{ + LTcpServer *pThis = (LTcpServer*)user_data; + vm_log_info("serverCallback handle=%d, evt=%d, param=%d", handle, event, param); + switch(event) + { + case VM_SOC_SVR_EVT_ACTIVED: + // server ready + pThis->m_handle = handle; + LTask.post_signal(); + break; + case VM_SOC_SVR_EVT_DEACTIVATED: + pThis->m_handle = -1; + LTask.post_signal(); + break; + case VM_SOC_SVR_EVT_ACCEPT: + vm_log_info("new client handle=%d", param); + pThis->m_clients.push_back(param); + break; + case VM_SOC_SVR_EVT_READ: + break; + case VM_SOC_SVR_EVT_WRITE: + break; + case VM_SOC_SVR_EVT_CLOSED: + break; + case VM_SOC_SVR_EVT_FAILED: + vm_log_info("open server on port=%d failed param=%d", pThis->m_port, param); + pThis->m_handle = -1; + LTask.post_signal(); + break; + } + +} + +boolean LTcpServer::initServer(void *userData) +{ + LTcpServer* pThis = (LTcpServer*)userData; + pThis->m_handle = vm_soc_svr_init(pThis->getAPN(), pThis->m_port, pThis, &serverCallback); + vm_log_info("initServer on port=%d ret=%d", pThis->m_port, pThis->m_handle); + if (pThis->m_handle < 0 && pThis->m_handle != -8) + { + pThis->m_handle = -1; + return true; + } + return false; +} + +void LTcpServer::begin() +{ + LTask.remoteCall(initServer, this); + return; +} + +boolean LTcpServer::deinitServer(void *userData) +{ + LTcpServer* pThis = (LTcpServer*)userData; + if(pThis->m_handle > 0) + { + VMINT ret = vm_soc_svr_deinit(pThis->m_handle); + vm_log_info("vm_soc_svr_deinit on handle=%d ret=%d", pThis->m_handle, ret); + } + return false; +} + +void LTcpServer::end() +{ + LTask.remoteCall(deinitServer, this); + return; +} + +struct LTcpAcceptConnectionContext +{ + LTcpServer *pInst; + VMINT hClient; + VMINT status; +}; + +boolean LTcpServer::acceptConnection(void *userData) +{ + LTcpAcceptConnectionContext *pCntx = (LTcpAcceptConnectionContext*)userData; + vm_log_info("acceptConnection() client count=%d", pCntx->pInst->m_clients.size()); + if (pCntx->pInst->m_clients.size() > 0) + { + const VMINT hClient = pCntx->pInst->m_clients.back(); + pCntx->pInst->m_clients.pop_back(); + pCntx->hClient = hClient; + } + else + { + pCntx->hClient = -1; + } + return true; +} + +void LTcpServer::availableImpl(VMINT& hClient, VMINT& hServer) +{ + vm_log_info((char*)__FUNCTION__); + // use async to open server port + LTcpAcceptConnectionContext cntx; + cntx.pInst = this; + cntx.hClient = -1; + LTask.remoteCall(&acceptConnection, &cntx); + + hClient = cntx.hClient; + hServer = m_handle; + + return; +} + +size_t LTcpServer::write(uint8_t data) +{ + return write(&data, 1); +} + +struct LTcpServerWriteContext +{ + LTcpServer *pInst; + VMINT totalWritten; + const uint8_t *buf; + size_t size; +}; + +boolean LTcpServer::wifiServerWrite(void *userData) +{ + LTcpServerWriteContext *pCntx = (LTcpServerWriteContext*)userData; + LTcpServer *pThis = pCntx->pInst; + pCntx->totalWritten = 0; + for(int i = 0; i < pThis->m_clients.size(); ++i) + { + VMINT written = vm_tcp_write_sync(pThis->m_clients[i], (void*)pCntx->buf, (VMINT)pCntx->size); + if(written > 0) + { + pCntx->totalWritten += written; + } + } +} + +size_t LTcpServer::write(const uint8_t *buf, size_t size) +{ + LTcpServerWriteContext cntx; + cntx.pInst = this; + cntx.totalWritten = 0; + cntx.buf = buf; + cntx.size = size; + LTask.remoteCall(&wifiServerWrite, &cntx); + return cntx.totalWritten; +} + +struct LTcpServerIPContext +{ + VMINT handle; + IPAddress result; +}; + +boolean wifiServerIP(void *userData) +{ + LTcpServerIPContext *pCntx = (LTcpServerIPContext*)userData; + VMUINT8 ip[VM_WLAN_PROF_MAX_IP_ADDR_LEN] = {0}; + // note that vm_soc_get_account_localip() + // does not take "server handle" as input + // but take "socket ID" as input instead. + const VMINT sockID = vm_soc_svr_get_soc_id(pCntx->handle); + VMINT ret = vm_soc_get_account_localip(sockID, ip); + vm_log_info("get socket IP ret=%d", ret); + pCntx->result = IPAddress(ip); + return true; +} + +IPAddress LTcpServer::serverIP() +{ + if (-1 == m_handle) + { + return IPAddress(); + } + + LTcpServerIPContext cntx; + + cntx.handle = m_handle; + LTask.remoteCall(&wifiServerIP, &cntx); + return cntx.result; +} + +VMINT LTcpServer::getAPN() const +{ + return m_apn; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/cores/arduino/LTcpServer.h b/hardware/arduino/mtk/cores/arduino/LTcpServer.h new file mode 100644 index 00000000..16571dce --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/LTcpServer.h @@ -0,0 +1,119 @@ +#ifndef LTcpServer_h +#define LTcpServer_h +#include "Arduino.h" +#include "Print.h" +#include "Client.h" +#include "Server.h" +#include + +class LTcpClient; + +//LTcpServer Class +class LTcpServer : public Server { +public: + + /* DOM-NOT_FOR_SDK-BEGIN */ + VMINT m_port; // server port + VMINT m_handle; // server handle; + VMINT m_apn; // APN used. Child classes should properly set APN in the constructor. + /* DOM-NOT_FOR_SDK-END */ + +public: + + // DESCRIPTION + // Creates a TCP server port on the device that can be connected by remote TCP clients. + // Call LTcpServer.begin() to start the server port. + // + // PARAMETERS + // port: uint16_t port number. Click here to learn more about common TCP port definitions. + // + // RETURNS + // N/A + LTcpServer(uint16_t port); + + /* DOM-NOT_FOR_SDK-BEGIN */ + // DESCRIPTION + // Checks if there is a client connected. + // If there is one, an LTcpClient object will be returned to represent the connection between this server object and the remote client. Call LTcpClient.read()/LTcpClient.write() to exchange data with the connected client. + // + // PARAMETERS + // N/A + // + // RETURNS + // An pointer to LTcpClient object representing the connection between this server object and the remote client. + // This object will turn to false if there is no incoming connection. + void availableImpl(VMINT& hClient, VMINT& hServer); + /* DOM-NOT_FOR_SDK-END */ + + // DESCRIPTION + // Starts listening to a TCP port that accepts client connections. + // + // PARAMETERS + // N/A + // + // RETURNS + // N/A + void begin(); + + // DESCRIPTION + // Close all + // Stops listening to a TCP port that accepts client connections. + // + // PARAMETERS + // N/A + // + // RETURNS + // N/A + void end(); + + // DESCRIPTION + // Writes data to all clients connected to this server object. + // + // PARAMETERS + // byte: Write a single byte to all connected clients. + // + // RETURNS + // Actual written bytes. + // Since this counts all bytes written to all connected clients, this value can be bigger than the size parameter passed to this method. + virtual size_t write(uint8_t); + + // DESCRIPTION + // Writes data to all clients connected to this server object. + // + // PARAMETERS + // buf: Write an array of bytes to all connected clients. + // size: buf size in bytes + // + // RETURNS + // Actual written bytes. + // Since this counts all bytes written to all connected clients, this value can be bigger than the size parameter passed to this method. + virtual size_t write(const uint8_t *buf, size_t size); + + // DESCRIPTION + // returns the IP address of the server. An IP address is only valid after begin() is called. + // + // PARAMETERS + // N/A + // + // RETURNS + // IP address of the server + IPAddress serverIP(); + + using Print::write; + /* DOM-NOT_FOR_SDK-END */ + +protected: + /* DOM-NOT_FOR_SDK-BEGIN */ + VMINT getAPN() const; + + static boolean initServer(void *userData); + static boolean deinitServer(void *userData); + static boolean acceptConnection(void *userData); + static void serverCallback(VMINT handle, VMINT event, VMINT param, void *user_data); + static boolean wifiServerWrite(void *userData); + + std::vector m_clients; + /* DOM-NOT_FOR_SDK-END */ +}; + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/LUdp.cpp b/hardware/arduino/mtk/cores/arduino/LUdp.cpp new file mode 100644 index 00000000..990d7fa9 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/LUdp.cpp @@ -0,0 +1,332 @@ +#include +#include "LTask.h" +#include "vmconn.h" +#include "vmtcp.h" +#include "vmlog.h" +#include "vmsim.h" +#include "vmudp.h" +#include "LUDP.h" + +LUDP::LUDP(): + m_port(-1), + m_sendToPort(-1), + m_serverHandle(-1), + m_sendToIP(INADDR_NONE), + m_recvIP(INADDR_NONE), + m_recvPort(-1), + m_writePos(0), + m_recvPos(0) +{ + +} + +void LUDP::udpCallback(VMINT hdl, VMINT event) +{ + switch(event) + { + case VM_UDP_EVT_WRITE: + break; + case VM_UDP_EVT_READ: + break; + case VM_UDP_EVT_PIPE_BROKEN: + case VM_UDP_EVT_PIPE_CLOSED: + vm_log_error("udpCallback error! evt=%d hdl=%d", event, hdl); + break; + } +} + +boolean LUDP::udpBegin(void* userdata) +{ + LUDP* pThis = (LUDP*)userdata; + + pThis->m_serverHandle = vm_udp_create(pThis->m_port, + pThis->getAPN(), + &udpCallback, + 0 // don't loopback + ); + + if(pThis->m_serverHandle < 0) + { + // fail immediately + pThis->m_serverHandle = -1; + return true; + } + else + { + // no need to wait for VM_UDP_EVT_WRITE??? + return true; + } +} + +uint8_t LUDP::begin(uint16_t port) +{ + m_port = port; + LTask.remoteCall(&udpBegin, this); + + if(m_serverHandle == -1) + { + // create failed. + return 0; + } + else + { + return 1; + } +} + +boolean LUDP::udpStop(void* userdata) +{ + LUDP* pThis = (LUDP*)userdata; + vm_udp_close(pThis->m_serverHandle); + pThis->m_serverHandle = -1; + return true; +} + +void LUDP::stop() +{ + if(m_serverHandle == -1) + return; + + LTask.remoteCall(&udpStop, this); + return; +} + +int LUDP::beginPacket(IPAddress ip, uint16_t port) +{ + m_sendToPort = port; + m_sendToIP = ip; + + m_writeBuffer.resize(INIT_WRITE_BUFFER_SIZE); + m_writePos = 0; + + vm_log_info("beginPacket(IP)"); + return 1; +} + +struct LUDPSendContext +{ + LUDP *pThis; + VMINT sentComplete; +}; + +boolean LUDP::udpSend(void* userdata) +{ + LUDPSendContext *pCntx = (LUDPSendContext*)userdata; + LUDP* pThis = pCntx->pThis; + VMINT remainBuffer = pThis->m_writePos; + VMUINT8 *pBuf = &pThis->m_writeBuffer[0]; + + vm_sockaddr_struct sendto = {0}; + sendto.addr[0] = pThis->m_sendToIP[0]; + sendto.addr[1] = pThis->m_sendToIP[1]; + sendto.addr[2] = pThis->m_sendToIP[2]; + sendto.addr[3] = pThis->m_sendToIP[3]; + sendto.addr_len = 4; + sendto.port = pThis->m_sendToPort; + + vm_log_info("send packet len:%d to %d.%d.%d.%d:%d", + remainBuffer, + sendto.addr[0], + sendto.addr[1], + sendto.addr[2], + sendto.addr[3], + sendto.port); + + while(remainBuffer > 0) + { + VMINT sentBytes = 0; + sentBytes = vm_udp_sendto(pThis->m_serverHandle, + pBuf, + remainBuffer, + &sendto); + + vm_log_info("vm_udp_sendto returns %d", sentBytes); + + + if(sentBytes <= 0) + { + vm_log_error("vm_udp_sendto sent no content"); + break; + } + + pBuf += sentBytes; + remainBuffer -= sentBytes; + } + + // check if buffer is completely sent + if(remainBuffer <= 0) + { + pCntx->sentComplete = 1; + } + else + { + pCntx->sentComplete = 0; + } + + return true; +} + +int LUDP::endPacket() +{ + vm_log_info("endPacket"); + LUDPSendContext cntx; + cntx.pThis = this; + cntx.sentComplete = 0; + LTask.remoteCall(&udpSend, &cntx); + + // release buffer + m_writePos = 0; + m_writeBuffer.clear(); + + // reset socket address + m_sendToIP = INADDR_NONE; + m_sendToPort = -1; + return cntx.sentComplete; +} + +size_t LUDP::LUDP::write(uint8_t byte) +{ + if(m_writePos >= m_writeBuffer.size()) + { + m_writeBuffer.resize(m_writeBuffer.size() + INIT_WRITE_BUFFER_SIZE); + } + m_writeBuffer[m_writePos] = byte; + m_writePos++; + + return 1; +} + +size_t LUDP::write(const uint8_t *buffer, size_t size) +{ + if((m_writePos + size) >= m_writeBuffer.size()) + { + m_writeBuffer.resize(m_writeBuffer.size() + size); + } + + for(size_t i = 0; i < size; ++i) + { + m_writeBuffer[m_writePos] = buffer[i]; + m_writePos++; + } + + return size; +} + +boolean LUDP::udpRecv(void* userdata) +{ + LUDP *pThis = (LUDP*)userdata; + vm_sockaddr_struct recvfrom = {0}; + + // allocate buffer for receiving + pThis->m_recvBuffer.resize(INIT_RECV_BUFFER_SIZE); + const VMINT receivedSize = vm_udp_recvfrom(pThis->m_serverHandle, + &pThis->m_recvBuffer[0], + pThis->m_recvBuffer.size(), + &recvfrom); + + if(receivedSize > 0) + { + // content retrieved + pThis->m_recvBuffer.resize(receivedSize); + pThis->m_recvIP = IPAddress(recvfrom.addr[0], + recvfrom.addr[1], + recvfrom.addr[2], + recvfrom.addr[3]); + pThis->m_recvPort = recvfrom.port; + pThis->m_recvPos = 0; + } + else + { + // nothing to read + pThis->m_recvBuffer.clear(); + } + + return true; +} + +int LUDP::parsePacket() +{ + if(m_serverHandle == -1) + { + return 0; + } + + // is the receiving buffer has content? + int remainBytes = available(); + if(remainBytes) + { + return remainBytes; + } + + // is incoming packet ready? + flush(); + LTask.remoteCall(&udpRecv, this); + return available(); +} + +void LUDP::flush() +{ + m_recvBuffer.clear(); + m_recvPos = 0; + m_recvIP = INADDR_NONE; + m_recvPort = -1; +} + +int LUDP::available() +{ + if(m_recvIP == INADDR_NONE) + return 0; + + if(m_recvBuffer.size() == 0) + return 0; + + const int remainBytes = m_recvBuffer.size() - m_recvPos; + + if(remainBytes > 0) + { + return remainBytes; + } + else + { + return 0; + } +} + +int LUDP::read() +{ + if(!available()) + { + return -1; + } + + VMUINT8 byte = m_recvBuffer[m_recvPos]; + m_recvPos++; + + return (int)byte; +} + +int LUDP::read(unsigned char* buffer, size_t len) +{ + if(!available() || len <= 0) + { + return -1; + } + + const size_t readLen = std::min(m_recvBuffer.size() - m_recvPos, len); + + memcpy(buffer, &m_recvBuffer[m_recvPos], readLen); + m_recvPos += readLen; + + return readLen; +} + +int LUDP::peek() +{ + if(!available()) + { + return -1; + } + + VMUINT8 byte = m_recvBuffer[m_recvPos]; + return (int)byte; +} diff --git a/hardware/arduino/mtk/cores/arduino/LUdp.h b/hardware/arduino/mtk/cores/arduino/LUdp.h new file mode 100644 index 00000000..6e402684 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/LUdp.h @@ -0,0 +1,84 @@ +#ifndef ludp_h +#define ludp_h + +#include +#include + +#define UDP_TX_PACKET_MAX_SIZE 24 + +class LUDP : public UDP { +protected: + uint16_t m_port; // local port to listen on + VMINT m_serverHandle; + + IPAddress m_sendToIP; // remote IP address for outgoing packet whilst it's being processed + uint16_t m_sendToPort; // remote port for the outgoing packet whilst it's being processed + std::vector m_writeBuffer; + VMINT m_writePos; + + IPAddress m_recvIP; // remote IP address for outgoing packet whilst it's being processed + uint16_t m_recvPort; // remote port for the outgoing packet whilst it's being processed + std::vector m_recvBuffer; + VMINT m_recvPos; + + static const VMINT INIT_WRITE_BUFFER_SIZE = 32; + static const VMINT INIT_RECV_BUFFER_SIZE = 1024; // typical MTU of web is 512 bytes, 1KB buffer should be sufficient + + static boolean udpBegin(void* userdata); + static boolean udpStop(void* userdata); + static boolean udpSend(void* userdata); + static boolean udpRecv(void* userdata); + static void udpCallback(VMINT hdl, VMINT event); + +protected: + // child class shoudl return proper APN enum + virtual VMINT getAPN() const = 0; + +public: + LUDP(); // Constructor + virtual uint8_t begin(uint16_t); // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use + virtual void stop(); // Finish with the UDP socket + + // Sending UDP packets + + // Start building up a packet to send to the remote host specific in ip and port + // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port + virtual int beginPacket(IPAddress ip, uint16_t port); + + // different DNS lookup should be defined by child classes + virtual int beginPacket(const char *host, uint16_t port) = 0; + + // Finish off this packet and send it + // Returns 1 if the packet was sent successfully, 0 if there was an error + virtual int endPacket(); + // Write a single byte into the packet + virtual size_t write(uint8_t); + // Write size bytes from buffer into the packet + virtual size_t write(const uint8_t *buffer, size_t size); + + using Print::write; + + // Start processing the next available incoming packet + // Returns the size of the packet in bytes, or 0 if no packets are available + virtual int parsePacket(); + // Number of bytes remaining in the current packet + virtual int available(); + // Read a single byte from the current packet + virtual int read(); + // Read up to len bytes from the current packet and place them into buffer + // Returns the number of bytes read, or 0 if none are available + virtual int read(unsigned char* buffer, size_t len); + // Read up to len characters from the current packet and place them into buffer + // Returns the number of characters read, or 0 if none are available + virtual int read(char* buffer, size_t len) { return read((unsigned char*)buffer, len); }; + // Return the next byte from the current packet without moving on to the next byte + virtual int peek(); + virtual void flush(); // Finish reading the current packet + + // Return the IP address of the host who sent the current incoming packet + virtual IPAddress remoteIP() { return m_recvIP; }; + // Return the port of the host who sent the current incoming packet + virtual uint16_t remotePort() { return m_recvPort; }; +}; + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/Print.cpp b/hardware/arduino/mtk/cores/arduino/Print.cpp new file mode 100644 index 00000000..b3ae8046 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/Print.cpp @@ -0,0 +1,272 @@ +/* + Print.cpp - Base class that provides print() and println() + Copyright (c) 2008 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 23 November 2006 by David A. Mellis + */ + +#include +#include +#include +#include +#include "Arduino.h" + +#include "Print.h" + +// Public Methods ////////////////////////////////////////////////////////////// + +/* default implementation: may be overridden */ +size_t Print::write(const uint8_t *buffer, size_t size) +{ + size_t n = 0; + while (size--) { + n += write(*buffer++); + } + return n; +} + +size_t Print::print(const __FlashStringHelper *ifsh) +{ + return print(reinterpret_cast(ifsh)); +} + +size_t Print::print(const String &s) +{ + return write(s.c_str(), s.length()); +} + +size_t Print::print(const char str[]) +{ + return write(str); +} + +size_t Print::print(char c) +{ + return write(c); +} + +size_t Print::print(unsigned char b, int base) +{ + return print((unsigned long) b, base); +} + +size_t Print::print(int n, int base) +{ + return print((long) n, base); +} + +size_t Print::print(unsigned int n, int base) +{ + return print((unsigned long) n, base); +} + +size_t Print::print(long n, int base) +{ + if (base == 0) { + return write(n); + } else if (base == 10) { + if (n < 0) { + int t = print('-'); + n = -n; + return printNumber(n, 10) + t; + } + return printNumber(n, 10); + } else { + return printNumber(n, base); + } +} + +size_t Print::print(unsigned long n, int base) +{ + if (base == 0) return write(n); + else return printNumber(n, base); +} + +size_t Print::print(double n, int digits) +{ + return printFloat(n, digits); +} + +size_t Print::println(const __FlashStringHelper *ifsh) +{ + size_t n = print(ifsh); + n += println(); + return n; +} + +size_t Print::print(const Printable& x) +{ + return x.printTo(*this); +} + +size_t Print::println(void) +{ + size_t n = print('\r'); + n += print('\n'); + return n; +} + +size_t Print::println(const String &s) +{ + size_t n = print(s); + n += println(); + return n; +} + +size_t Print::println(const char c[]) +{ + size_t n = print(c); + n += println(); + return n; +} + + +size_t Print::println(char c) +{ + size_t n = print(c); + n += println(); + return n; +} + +size_t Print::println(unsigned char b, int base) +{ + size_t n = print(b, base); + n += println(); + return n; +} + +size_t Print::println(int num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t Print::println(unsigned int num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t Print::println(long num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t Print::println(unsigned long num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t Print::println(double num, int digits) +{ + size_t n = print(num, digits); + n += println(); + return n; +} + +size_t Print::println(const Printable& x) +{ + size_t n = print(x); + n += println(); + return n; +} + + +#include +size_t Print::printf(const char *fmt, ...) +{ + va_list args; + char buf[256] = {0}; + + va_start(args, fmt); + vsprintf(buf, fmt, args); + va_end(args); + + return write(buf, strlen(buf)); +} + +// Private Methods ///////////////////////////////////////////////////////////// + +size_t Print::printNumber(unsigned long n, uint8_t base) { + char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte. + char *str = &buf[sizeof(buf) - 1]; + + *str = '\0'; + + // prevent crash if called with base == 1 + if (base < 2) base = 10; + + do { + unsigned long m = n; + n /= base; + char c = m - base * n; + *--str = c < 10 ? c + '0' : c + 'A' - 10; + } while(n); + + return write(str); +} + +size_t Print::printFloat(double number, uint8_t digits) +{ + size_t n = 0; + + if (isnan(number)) return print("nan"); + if (isinf(number)) return print("inf"); + if (number > 4294967040.0) return print ("ovf"); // constant determined empirically + if (number <-4294967040.0) return print ("ovf"); // constant determined empirically + + // Handle negative numbers + if (number < 0.0) + { + n += print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i=0; i 0) { + n += print("."); + } + + // Extract digits from the remainder one at a time + while (digits-- > 0) + { + remainder *= 10.0; + int toPrint = int(remainder); + n += print(toPrint); + remainder -= toPrint; + } + + return n; +} diff --git a/hardware/arduino/mtk/cores/arduino/Print.h b/hardware/arduino/mtk/cores/arduino/Print.h new file mode 100644 index 00000000..5a799a31 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/Print.h @@ -0,0 +1,86 @@ +/* + Print.h - Base class that provides print() and println() + Copyright (c) 2008 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Print_h +#define Print_h + +#include +#include // for size_t + +#include "WString.h" +#include "Printable.h" + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 + +class Print +{ + private: + int write_error; + size_t printNumber(unsigned long, uint8_t); + size_t printFloat(double, uint8_t); + protected: + void setWriteError(int err = 1) { write_error = err; } + public: + Print() : write_error(0) {} + + int getWriteError() { return write_error; } + void clearWriteError() { setWriteError(0); } + + virtual size_t write(uint8_t) = 0; + size_t write(const char *str) { + if (str == NULL) return 0; + return write((const uint8_t *)str, strlen(str)); + } + virtual size_t write(const uint8_t *buffer, size_t size); + size_t write(const char *buffer, size_t size) { + return write((const uint8_t *)buffer, size); + } + + size_t print(const __FlashStringHelper *); + size_t print(const String &); + size_t print(const char[]); + size_t print(char); + size_t print(unsigned char, int = DEC); + size_t print(int, int = DEC); + size_t print(unsigned int, int = DEC); + size_t print(long, int = DEC); + size_t print(unsigned long, int = DEC); + size_t print(double, int = 2); + size_t print(const Printable&); + + size_t println(const __FlashStringHelper *); + size_t println(const String &s); + size_t println(const char[]); + size_t println(char); + size_t println(unsigned char, int = DEC); + size_t println(int, int = DEC); + size_t println(unsigned int, int = DEC); + size_t println(long, int = DEC); + size_t println(unsigned long, int = DEC); + size_t println(double, int = 2); + size_t println(const Printable&); + size_t println(void); + /* format param */ + size_t printf(const char *fmt, ...); +}; + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/Printable.h b/hardware/arduino/mtk/cores/arduino/Printable.h new file mode 100644 index 00000000..2a1b2e9f --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/Printable.h @@ -0,0 +1,40 @@ +/* + Printable.h - Interface class that allows printing of complex types + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Printable_h +#define Printable_h + +#include + +class Print; + +/** The Printable class provides a way for new classes to allow themselves to be printed. + By deriving from Printable and implementing the printTo method, it will then be possible + for users to print out instances of this class by passing them into the usual + Print::print and Print::println methods. +*/ + +class Printable +{ + public: + virtual size_t printTo(Print& p) const = 0; +}; + +#endif + diff --git a/hardware/arduino/mtk/cores/arduino/RingBuffer.cpp b/hardware/arduino/mtk/cores/arduino/RingBuffer.cpp new file mode 100644 index 00000000..f0b3ed1d --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/RingBuffer.cpp @@ -0,0 +1,43 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "RingBuffer.h" +#include + +RingBuffer::RingBuffer( void ) +{ + memset( _aucBuffer, 0, SERIAL_BUFFER_SIZE ) ; + _iHead=0 ; + _iTail=0 ; +} + +void RingBuffer::store_char( uint8_t c ) +{ + int i = (uint32_t)(_iHead + 1) % SERIAL_BUFFER_SIZE ; + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if ( i != _iTail ) + { + _aucBuffer[_iHead] = c ; + _iHead = i ; + } +} + diff --git a/hardware/arduino/mtk/cores/arduino/RingBuffer.h b/hardware/arduino/mtk/cores/arduino/RingBuffer.h new file mode 100644 index 00000000..28309df4 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/RingBuffer.h @@ -0,0 +1,42 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _RING_BUFFER_ +#define _RING_BUFFER_ + +#include + +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which head is the index of the location +// to which to write the next incoming character and tail is the index of the +// location from which to read. +#define SERIAL_BUFFER_SIZE 64 + +class RingBuffer +{ + public: + uint8_t _aucBuffer[SERIAL_BUFFER_SIZE] ; + int _iHead ; + int _iTail ; + + public: + RingBuffer( void ) ; + void store_char( uint8_t c ) ; +} ; + +#endif /* _RING_BUFFER_ */ diff --git a/hardware/arduino/mtk/cores/arduino/Server.h b/hardware/arduino/mtk/cores/arduino/Server.h new file mode 100644 index 00000000..77c415cc --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/Server.h @@ -0,0 +1,28 @@ +/* + Server.h - Base class that provides Server + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef server_h +#define server_h + +class Server : public Print { +public: + virtual void begin() =0; +}; + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/Stream.cpp b/hardware/arduino/mtk/cores/arduino/Stream.cpp new file mode 100644 index 00000000..aafb7fcf --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/Stream.cpp @@ -0,0 +1,270 @@ +/* + Stream.cpp - adds parsing methods to Stream class + Copyright (c) 2008 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Created July 2011 + parsing functions based on TextFinder library by Michael Margolis + */ + +#include "Arduino.h" +#include "Stream.h" + +#define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait +#define NO_SKIP_CHAR 1 // a magic char not found in a valid ASCII numeric field + +// private method to read stream with timeout +int Stream::timedRead() +{ + int c; + _startMillis = millis(); + do { + c = read(); + if (c >= 0) return c; + } while(millis() - _startMillis < _timeout); + return -1; // -1 indicates timeout +} + +// private method to peek stream with timeout +int Stream::timedPeek() +{ + int c; + _startMillis = millis(); + do { + c = peek(); + if (c >= 0) return c; + } while(millis() - _startMillis < _timeout); + return -1; // -1 indicates timeout +} + +// returns peek of the next digit in the stream or -1 if timeout +// discards non-numeric characters +int Stream::peekNextDigit() +{ + int c; + while (1) { + c = timedPeek(); + if (c < 0) return c; // timeout + if (c == '-') return c; + if (c >= '0' && c <= '9') return c; + read(); // discard non-numeric + } +} + +// Public Methods +////////////////////////////////////////////////////////////// + +void Stream::setTimeout(unsigned long timeout) // sets the maximum number of milliseconds to wait +{ + _timeout = timeout; +} + + // find returns true if the target string is found +bool Stream::find(char *target) +{ + return findUntil(target, NULL); +} + +// reads data from the stream until the target string of given length is found +// returns true if target string is found, false if timed out +bool Stream::find(char *target, size_t length) +{ + return findUntil(target, length, NULL, 0); +} + +// as find but search ends if the terminator string is found +bool Stream::findUntil(char *target, char *terminator) +{ + return findUntil(target, strlen(target), terminator, strlen(terminator)); +} + +// reads data from the stream until the target string of the given length is found +// search terminated if the terminator string is found +// returns true if target string is found, false if terminated or timed out +bool Stream::findUntil(char *target, size_t targetLen, char *terminator, size_t termLen) +{ + size_t index = 0; // maximum target string length is 64k bytes! + size_t termIndex = 0; + int c; + + if( *target == 0) + return true; // return true if target is a null string + while( (c = timedRead()) > 0){ + + if(c != target[index]) + index = 0; // reset index if any char does not match + + if( c == target[index]){ + //////Serial.print("found "); Serial.write(c); Serial.print("index now"); Serial.println(index+1); + if(++index >= targetLen){ // return true if all chars in the target match + return true; + } + } + + if(termLen > 0 && c == terminator[termIndex]){ + if(++termIndex >= termLen) + return false; // return false if terminate string found before target string + } + else + termIndex = 0; + } + return false; +} + + +// returns the first valid (long) integer value from the current position. +// initial characters that are not digits (or the minus sign) are skipped +// function is terminated by the first character that is not a digit. +long Stream::parseInt() +{ + return parseInt(NO_SKIP_CHAR); // terminate on first non-digit character (or timeout) +} + +// as above but a given skipChar is ignored +// this allows format characters (typically commas) in values to be ignored +long Stream::parseInt(char skipChar) +{ + boolean isNegative = false; + long value = 0; + int c; + + c = peekNextDigit(); + // ignore non numeric leading characters + if(c < 0) + return 0; // zero returned if timeout + + do{ + if(c == skipChar) + ; // ignore this charactor + else if(c == '-') + isNegative = true; + else if(c >= '0' && c <= '9') // is c a digit? + value = value * 10 + c - '0'; + read(); // consume the character we got with peek + c = timedPeek(); + } + while( (c >= '0' && c <= '9') || c == skipChar ); + + if(isNegative) + value = -value; + return value; +} + + +// as parseInt but returns a floating point value +float Stream::parseFloat() +{ + return parseFloat(NO_SKIP_CHAR); +} + +// as above but the given skipChar is ignored +// this allows format characters (typically commas) in values to be ignored +float Stream::parseFloat(char skipChar){ + boolean isNegative = false; + boolean isFraction = false; + long value = 0; + char c; + float fraction = 1.0; + + c = peekNextDigit(); + // ignore non numeric leading characters + if(c < 0) + return 0; // zero returned if timeout + + do{ + if(c == skipChar) + ; // ignore + else if(c == '-') + isNegative = true; + else if (c == '.') + isFraction = true; + else if(c >= '0' && c <= '9') { // is c a digit? + value = value * 10 + c - '0'; + if(isFraction) + fraction *= 0.1; + } + read(); // consume the character we got with peek + c = timedPeek(); + } + while( (c >= '0' && c <= '9') || c == '.' || c == skipChar ); + + if(isNegative) + value = -value; + if(isFraction) + return value * fraction; + else + return value; +} + +// read characters from stream into buffer +// terminates if length characters have been read, or timeout (see setTimeout) +// returns the number of characters placed in the buffer +// the buffer is NOT null terminated. +// +size_t Stream::readBytes(char *buffer, size_t length) +{ + size_t count = 0; + while (count < length) { + int c = timedRead(); + if (c < 0) break; + *buffer++ = (char)c; + count++; + } + return count; +} + + +// as readBytes with terminator character +// terminates if length characters have been read, timeout, or if the terminator character detected +// returns the number of characters placed in the buffer (0 means no valid data found) + +size_t Stream::readBytesUntil(char terminator, char *buffer, size_t length) +{ + if (length < 1) return 0; + size_t index = 0; + while (index < length) { + int c = timedRead(); + if (c < 0 || c == terminator) break; + *buffer++ = (char)c; + index++; + } + return index; // return number of characters, not including null terminator +} + +String Stream::readString() +{ + String ret; + int c = timedRead(); + while (c >= 0) + { + ret += (char)c; + c = timedRead(); + } + return ret; +} + +String Stream::readStringUntil(char terminator) +{ + String ret; + int c = timedRead(); + while (c >= 0 && c != terminator) + { + ret += (char)c; + c = timedRead(); + } + return ret; +} + diff --git a/hardware/arduino/mtk/cores/arduino/Stream.h b/hardware/arduino/mtk/cores/arduino/Stream.h new file mode 100644 index 00000000..5cf5ddf0 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/Stream.h @@ -0,0 +1,102 @@ +/* + Stream.h - base class for character-based streams. + Copyright (c) 2010 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + parsing functions based on TextFinder library by Michael Margolis +*/ + +#ifndef Stream_h +#define Stream_h + +#include +#include "Print.h" + +// compatability macros for testing +/* +#define getInt() parseInt() +#define getInt(skipChar) parseInt(skipchar) +#define getFloat() parseFloat() +#define getFloat(skipChar) parseFloat(skipChar) +#define getString( pre_string, post_string, buffer, length) +readBytesBetween( pre_string, terminator, buffer, length) +*/ + +class Stream : public Print +{ + protected: + unsigned long _timeout; // number of milliseconds to wait for the next char before aborting timed read + unsigned long _startMillis; // used for timeout measurement + int timedRead(); // private method to read stream with timeout + int timedPeek(); // private method to peek stream with timeout + int peekNextDigit(); // returns the next numeric digit in the stream or -1 if timeout + + public: + virtual int available() = 0; + virtual int read() = 0; + virtual int peek() = 0; + virtual void flush() = 0; + + Stream() {_timeout=1000;} + +// parsing methods + + void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second + + bool find(char *target); // reads data from the stream until the target string is found + bool find(uint8_t *target) { return find ((char *)target); } + // returns true if target string is found, false if timed out (see setTimeout) + + bool find(char *target, size_t length); // reads data from the stream until the target string of given length is found + bool find(uint8_t *target, size_t length) { return find ((char *)target, length); } + // returns true if target string is found, false if timed out + + bool findUntil(char *target, char *terminator); // as find but search ends if the terminator string is found + bool findUntil(uint8_t *target, char *terminator) { return findUntil((char *)target, terminator); } + + bool findUntil(char *target, size_t targetLen, char *terminate, size_t termLen); // as above but search ends if the terminate string is found + bool findUntil(uint8_t *target, size_t targetLen, char *terminate, size_t termLen) {return findUntil((char *)target, targetLen, terminate, termLen); } + + + long parseInt(); // returns the first valid (long) integer value from the current position. + // initial characters that are not digits (or the minus sign) are skipped + // integer is terminated by the first character that is not a digit. + + float parseFloat(); // float version of parseInt + + size_t readBytes( char *buffer, size_t length); // read chars from stream into buffer + size_t readBytes( uint8_t *buffer, size_t length) { return readBytes((char *)buffer, length); } + // terminates if length characters have been read or timeout (see setTimeout) + // returns the number of characters placed in the buffer (0 means no valid data found) + + size_t readBytesUntil( char terminator, char *buffer, size_t length); // as readBytes with terminator character + size_t readBytesUntil( char terminator, uint8_t *buffer, size_t length) { return readBytesUntil(terminator, (char *)buffer, length); } + // terminates if length characters have been read, timeout, or if the terminator character detected + // returns the number of characters placed in the buffer (0 means no valid data found) + + // Arduino String functions to be added here + String readString(); + String readStringUntil(char terminator); + + protected: + long parseInt(char skipChar); // as above but the given skipChar is ignored + // as above but the given skipChar is ignored + // this allows format characters (typically commas) in values to be ignored + + float parseFloat(char skipChar); // as above but the given skipChar is ignored +}; + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/Tone.h b/hardware/arduino/mtk/cores/arduino/Tone.h new file mode 100644 index 00000000..5789b082 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/Tone.h @@ -0,0 +1,23 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_TONE_ +#define _WIRING_TONE_ + + +#endif /* _WIRING_TONE_ */ diff --git a/hardware/arduino/mtk/cores/arduino/UARTClass.cpp b/hardware/arduino/mtk/cores/arduino/UARTClass.cpp new file mode 100644 index 00000000..948abce1 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/UARTClass.cpp @@ -0,0 +1,221 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include +#include +#include "UARTClass.h" +#include "variant.h" +#include "vmlog.h" + +static VM_DCL_HANDLE usb_device_handle = -1; + +typedef struct +{ + VMINT result; +}vm_uart_ctrl_com_response; + +// Constructors //////////////////////////////////////////////////////////////// + +UARTClass::UARTClass( int usbNum, RingBuffer* pRx_buffer ) +{ + _rx_buffer = pRx_buffer ; + _usbNum = usbNum; + uart_handle = -1; +} + +void UartIrqHandler(void* parameter, VM_DCL_EVENT event, VM_DCL_HANDLE device_handle) +{ + if(event == VM_UART_READY_TO_READ) + { + char data[32]; + int i; + VM_DCL_STATUS status; + VM_DCL_BUFF_LEN returned_len; + + status = vm_dcl_read(device_handle,(VM_DCL_BUFF*)data,32,&returned_len,vm_dcl_get_ownerid()); + if(statusstore_char(data[i]); + //Serial._rx_buffer->store_char(data[i]); + } + } + else + { + for(i=0;istore_char(data[i]); + } + } + } + else + { + //vm_log_info((char*)"VM_UART_READY_TO_NO_EVENT"); + } +} +// Public Methods ////////////////////////////////////////////////////////////// + +void UARTClass::begin( const uint32_t dwBaudRate ) +{ + + vm_sio_ctrl_dcb_t data; + + if(_usbNum == 2) + { + if(!changePinType(0, PIO_UART, &uart_handle)) + return; + + if(uart_handle == VM_DCL_HANDLE_INVALID) + uart_handle = vm_dcl_open(vm_uart_port1,vm_dcl_get_ownerid()); + + } + else + { + uart_handle = vm_dcl_open(vm_usb_port1,vm_dcl_get_ownerid()); + } + + if(VM_DCL_HANDLE_INVALID==uart_handle) + { + vm_log_info((char*)"UARTClass failed"); + return; + } + + data.u4OwenrId = vm_dcl_get_ownerid(); + data.rUARTConfig.u4Baud = dwBaudRate; + data.rUARTConfig.u1DataBits = 8; + data.rUARTConfig.u1StopBits = 1; + data.rUARTConfig.u1Parity = 0; + data.rUARTConfig.u1FlowControl = 1; + data.rUARTConfig.ucXonChar = 0x11; + data.rUARTConfig.ucXoffChar = 0x13; + data.rUARTConfig.fgDSRCheck = 0; + vm_dcl_control(uart_handle,VM_SIO_CMD_SET_DCB_CONFIG,(void *)&data); + vm_dcl_registercallback(uart_handle,VM_UART_READY_TO_READ,(VM_DCL_CALLBACK)UartIrqHandler,(void*)NULL); + //vm_dcl_registercallback(uart_handle,VM_UART_READY_TO_WRITE ,(VM_DCL_CALLBACK)UartIrqHandler,(void *)NULL); + + if(_usbNum == 2) + { + setPinHandle(0, uart_handle); + } + else + { + usb_device_handle = uart_handle; + } + + //vm_log_info((char*)"UARTClass begin successful"); +} + +void UARTClass::end( void ) +{ + // clear any received data + _rx_buffer->_iHead = _rx_buffer->_iTail ; + vm_dcl_close(uart_handle); + + if(_usbNum == 2) + { + g_APinDescription[0].ulHandle = VM_DCL_HANDLE_INVALID; + g_APinDescription[0].ulPinType = PIO_DIGITAL; + } + else + { + usb_device_handle = -1; + } +} + +int UARTClass::available( void ) +{ + return (uint32_t)(SERIAL_BUFFER_SIZE + _rx_buffer->_iHead - _rx_buffer->_iTail) % SERIAL_BUFFER_SIZE ; +} + +int UARTClass::peek( void ) +{ + if ( _rx_buffer->_iHead == _rx_buffer->_iTail ) + return -1 ; + + return _rx_buffer->_aucBuffer[_rx_buffer->_iTail] ; +} + +int UARTClass::read( void ) +{ + // if the head isn't ahead of the tail, we don't have any characters + if ( _rx_buffer->_iHead == _rx_buffer->_iTail ) + return -1 ; + + uint8_t uc = _rx_buffer->_aucBuffer[_rx_buffer->_iTail] ; + _rx_buffer->_iTail = (unsigned int)(_rx_buffer->_iTail + 1) % SERIAL_BUFFER_SIZE ; + return uc ; +} + +void UARTClass::flush( void ) +{ + while(read()!=-1); +} + +size_t UARTClass::write( const uint8_t uc_data ) +{ + + VM_DCL_STATUS status; + VM_DCL_BUFF_LEN writen_len = 0; + int count = 0; + + if(uart_handle != -1) + { + status = vm_dcl_write(uart_handle,(VM_DCL_BUFF*)&uc_data,1,&writen_len,vm_dcl_get_ownerid()); + + while((status + +/***************************************************************************** + * Class UARTClass + ****************************************************************************/ +// UARTClass is designed for LinkIt One board connecte with other hardware device through UART +// EXAMPLE: +// +// #define SENSOR 0 +// int val = 0; +// void setup(){ +// Serial.begin(9600); +// } +// void loop(){ +// val = analogRead(SENSOR); +// Serial.println(val); +// delay(100); +// } +// +class UARTClass : public HardwareSerial +{ + protected: + RingBuffer *_rx_buffer ; + protected: + int _usbNum ; + VM_DCL_HANDLE uart_handle; + + public: +// Constructor / Destructor + UARTClass( int usbNum, RingBuffer* pRx_buffer ) ; + +// Method + public: + + // sets the data rate in bits per sencond for serial data transmission + // + // RETURNS + // none + // + // EXAMPLE + // + // void setup(){ + // Serial.begin(115200); + // } + // void loop(){} + // +void begin( const uint32_t dwBaudRate //[IN] in bits per sencond(baud rate) + ) ; + + // disables serial communication, allowing the RX and TX pins to be used for + // general input and output + // + // RETURNS + // none +void end( void ) ; + + // get the number of bytes(characters)avaiable for reading from the serial port. + // + // RETURNS + // the bumbers of bytes available to read + // + // EXAMPLE + // + // int numberscomingBytes = 0; + // void setup(){ + // Serial.begin(115200); + // } + // void loop(){ + // if(Serial.available()>0){ + // numberscomingBytes = Serial.read(); + // Serial.print(numberscomingBytes); + // } + // } + // +int available( void ) ; + + // returns the next byte of incoming serial data without removing it from the + // internal serial buffer + // + // RETURNS + // the first byte of incoming serial data available, -1 if no data is available +int peek( void ) ; + + // reads incoming serial data + // + // RETURNS + // the first byte of incoimng serial data avaiable, -a if no data is available + // + // EXAMPLE + // + // int incomingdata = 0; + // void setup() { + // Serial.begin(9600); + // } + // void loop() { + // if (Serial.available() > 0) { + // incomingdata = Serial.read(); + // Serial.print("received data: "); + // Serial.println(incomingdata, DEC); + // } + // } + // +int read( void ) ; + + // waits for the transmission of outgoing serial data to complete + // + // RETURNS none +void flush( void ) ; + +// write a char +// +// RETURNS +// the number of write +size_t write( const uint8_t c //[IN] input char + ) ; + + friend void UartIrqHandler(void* parameter, VM_DCL_EVENT event, VM_DCL_HANDLE device_handle); + + // pull in write(str) and write(buf, size) from Print + using Print::write ; + + // UART always active + operator bool(); +}; + +#endif // _UART_CLASS_ diff --git a/hardware/arduino/mtk/cores/arduino/Udp.h b/hardware/arduino/mtk/cores/arduino/Udp.h new file mode 100644 index 00000000..dc5644b9 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/Udp.h @@ -0,0 +1,88 @@ +/* + * Udp.cpp: Library to send/receive UDP packets. + * + * NOTE: UDP is fast, but has some important limitations (thanks to Warren Gray for mentioning these) + * 1) UDP does not guarantee the order in which assembled UDP packets are received. This + * might not happen often in practice, but in larger network topologies, a UDP + * packet can be received out of sequence. + * 2) UDP does not guard against lost packets - so packets *can* disappear without the sender being + * aware of it. Again, this may not be a concern in practice on small local networks. + * For more information, see http://www.cafeaulait.org/course/week12/35.html + * + * MIT License: + * Copyright (c) 2008 Bjoern Hartmann + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * bjoern@cs.stanford.edu 12/30/2008 + */ + +#ifndef udp_h +#define udp_h + +#include +#include + +class UDP : public Stream { + +public: + virtual uint8_t begin(uint16_t) =0; // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use + virtual void stop() =0; // Finish with the UDP socket + + // Sending UDP packets + + // Start building up a packet to send to the remote host specific in ip and port + // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port + virtual int beginPacket(IPAddress ip, uint16_t port) =0; + // Start building up a packet to send to the remote host specific in host and port + // Returns 1 if successful, 0 if there was a problem resolving the hostname or port + virtual int beginPacket(const char *host, uint16_t port) =0; + // Finish off this packet and send it + // Returns 1 if the packet was sent successfully, 0 if there was an error + virtual int endPacket() =0; + // Write a single byte into the packet + virtual size_t write(uint8_t) =0; + // Write size bytes from buffer into the packet + virtual size_t write(const uint8_t *buffer, size_t size) =0; + + // Start processing the next available incoming packet + // Returns the size of the packet in bytes, or 0 if no packets are available + virtual int parsePacket() =0; + // Number of bytes remaining in the current packet + virtual int available() =0; + // Read a single byte from the current packet + virtual int read() =0; + // Read up to len bytes from the current packet and place them into buffer + // Returns the number of bytes read, or 0 if none are available + virtual int read(unsigned char* buffer, size_t len) =0; + // Read up to len characters from the current packet and place them into buffer + // Returns the number of characters read, or 0 if none are available + virtual int read(char* buffer, size_t len) =0; + // Return the next byte from the current packet without moving on to the next byte + virtual int peek() =0; + virtual void flush() =0; // Finish reading the current packet + + // Return the IP address of the host who sent the current incoming packet + virtual IPAddress remoteIP() =0; + // Return the port of the host who sent the current incoming packet + virtual uint16_t remotePort() =0; +protected: + uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); }; +}; + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/WCharacter.h b/hardware/arduino/mtk/cores/arduino/WCharacter.h new file mode 100644 index 00000000..e84b3485 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/WCharacter.h @@ -0,0 +1,180 @@ +/* + WCharacter.h - Character utility functions for Wiring & Arduino + Copyright (c) 2010 Hernando Barragan. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef Character_h +#define Character_h + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// WCharacter.h prototypes +#if defined ( __GNUC__ ) +inline boolean isAlphaNumeric(int c) __attribute__((always_inline)); +inline boolean isAlpha(int c) __attribute__((always_inline)); +inline boolean isAscii(int c) __attribute__((always_inline)); +inline boolean isWhitespace(int c) __attribute__((always_inline)); +inline boolean isControl(int c) __attribute__((always_inline)); +inline boolean isDigit(int c) __attribute__((always_inline)); +inline boolean isGraph(int c) __attribute__((always_inline)); +inline boolean isLowerCase(int c) __attribute__((always_inline)); +inline boolean isPrintable(int c) __attribute__((always_inline)); +inline boolean isPunct(int c) __attribute__((always_inline)); +inline boolean isSpace(int c) __attribute__((always_inline)); +inline boolean isUpperCase(int c) __attribute__((always_inline)); +inline boolean isHexadecimalDigit(int c) __attribute__((always_inline)); +inline int toAscii(int c) __attribute__((always_inline)); +inline int toLowerCase(int c) __attribute__((always_inline)); +inline int toUpperCase(int c)__attribute__((always_inline)); +#elif defined ( __ICCARM__ ) +#endif + +// Checks for an alphanumeric character. +// It is equivalent to (isalpha(c) || isdigit(c)). +inline boolean isAlphaNumeric(int c) +{ + return ( isalnum(c) == 0 ? false : true); +} + + +// Checks for an alphabetic character. +// It is equivalent to (isupper(c) || islower(c)). +inline boolean isAlpha(int c) +{ + return ( isalpha(c) == 0 ? false : true); +} + + +// Checks whether c is a 7-bit unsigned char value +// that fits into the ASCII character set. +inline boolean isAscii(int c) +{ +/* return ( isascii(c) == 0 ? false : true); */ + return ( (c & ~0x7f) != 0 ? false : true); +} + + +// Checks for a blank character, that is, a space or a tab. +inline boolean isWhitespace(int c) +{ + return ( isblank (c) == 0 ? false : true); +} + + +// Checks for a control character. +inline boolean isControl(int c) +{ + return ( iscntrl (c) == 0 ? false : true); +} + + +// Checks for a digit (0 through 9). +inline boolean isDigit(int c) +{ + return ( isdigit (c) == 0 ? false : true); +} + + +// Checks for any printable character except space. +inline boolean isGraph(int c) +{ + return ( isgraph (c) == 0 ? false : true); +} + + +// Checks for a lower-case character. +inline boolean isLowerCase(int c) +{ + return (islower (c) == 0 ? false : true); +} + + +// Checks for any printable character including space. +inline boolean isPrintable(int c) +{ + return ( isprint (c) == 0 ? false : true); +} + + +// Checks for any printable character which is not a space +// or an alphanumeric character. +inline boolean isPunct(int c) +{ + return ( ispunct (c) == 0 ? false : true); +} + + +// Checks for white-space characters. For the avr-libc library, +// these are: space, formfeed ('\f'), newline ('\n'), carriage +// return ('\r'), horizontal tab ('\t'), and vertical tab ('\v'). +inline boolean isSpace(int c) +{ + return ( isspace (c) == 0 ? false : true); +} + + +// Checks for an uppercase letter. +inline boolean isUpperCase(int c) +{ + return ( isupper (c) == 0 ? false : true); +} + + +// Checks for a hexadecimal digits, i.e. one of 0 1 2 3 4 5 6 7 +// 8 9 a b c d e f A B C D E F. +inline boolean isHexadecimalDigit(int c) +{ + return ( isxdigit (c) == 0 ? false : true); +} + + +// Converts c to a 7-bit unsigned char value that fits into the +// ASCII character set, by clearing the high-order bits. +inline int toAscii(int c) +{ +/* return toascii (c); */ + return (c & 0x7f); +} + + +// Warning: +// Many people will be unhappy if you use this function. +// This function will convert accented letters into random +// characters. + +// Converts the letter c to lower case, if possible. +inline int toLowerCase(int c) +{ + return tolower (c); +} + + +// Converts the letter c to upper case, if possible. +inline int toUpperCase(int c) +{ + return toupper (c); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/WInterrupts.c b/hardware/arduino/mtk/cores/arduino/WInterrupts.c new file mode 100644 index 00000000..e07afd67 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/WInterrupts.c @@ -0,0 +1,211 @@ +/* + Copyright (c) 2011-2012 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "vmdcl.h" +#include "vmdcl_gpio.h" +#include "vmdcl_eint.h" +#include "vmlog.h" +#include "WInterrupts.h" + +typedef struct _Exinterrupts_Struct +{ + VM_DCL_HANDLE handle; + uint32_t pin; + uint32_t eint; + uint32_t first; + voidFuncPtr cb; +}Exinterrupts_Struct; + + +static Exinterrupts_Struct gExinterruptsPio[EXTERNAL_NUM_INTERRUPTS] = { + {VM_DCL_HANDLE_INVALID, 2, 20, 0, NULL}, + {VM_DCL_HANDLE_INVALID, 3, 11, 0, NULL} +}; + +#ifdef __cplusplus +extern "C" { +#endif + +static void eint_callback(void* parameter, VM_DCL_EVENT event, VM_DCL_HANDLE device_handle) +{ + int i; + + for(i=0; i EXTERNAL_NUM_INTERRUPTS) + return ; + + if(!changePinType(gExinterruptsPio[pin].pin, PIO_EINT, &eint_handle)) + return; + + memset(&eint_config,0, sizeof(vm_eint_ctrl_config_t)); + memset(&sens_data,0, sizeof(vm_eint_ctrl_set_sensitivity_t)); + memset(&deboun_time,0, sizeof(vm_eint_ctrl_set_hw_deounce_t)); + + if(eint_handle == VM_DCL_HANDLE_INVALID) + eint_handle = vm_dcl_open(VM_DCL_EINT,gExinterruptsPio[pin].eint); + + if(VM_DCL_HANDLE_INVALID == eint_handle) + { + vm_log_info("open EINT error"); + return; + } + + setPinHandle(gExinterruptsPio[pin].pin, eint_handle); + gExinterruptsPio[pin].handle = eint_handle; + gExinterruptsPio[pin].cb = callback; + + status = vm_dcl_control(eint_handle ,VM_EINT_CMD_MASK,NULL); /* Usually, before we config eint, we mask it firstly. */ + if(status != VM_DCL_STATUS_OK) + { + vm_log_info("VM_EINT_CMD_MASK = %d", status); + } + + status = vm_dcl_registercallback(eint_handle , VM_EVENT_EINT_TRIGGER,(VM_DCL_CALLBACK)eint_callback,(void*)NULL ); /* register callback function,Note: the last paramter fill NULL */ + if(status != VM_DCL_STATUS_OK) + { + vm_log_info("VM_EVENT_EINT_TRIGGER = %d", status); + } + if(gExinterruptsPio[pin].first == 0) + { + + if (mode == CHANGE) + { + sens_data.sensitivity = 0; /* 1 means level sensitiv, 0 means edge sensitive. */ + eint_config.act_polarity = 0; /* 1 means positive active, 0 means negative active. */ + eint_config.auto_unmask = 1; /* 1 means unmask after callback, 0 means not unmask. user unmask it themselves. */ + } + else + { + // Select mode of operation + if (mode == LOW) + { + sens_data.sensitivity = 1; /* 1 means level sensitiv, 0 means edge sensitive. */ + eint_config.act_polarity = 0; /* 1 means positive active, 0 means negative active. */ + eint_config.auto_unmask = 0; /* 1 means unmask after callback, 0 means not unmask. user unmask it themselves. */ + + } + + if (mode == HIGH) + { + sens_data.sensitivity = 1; /* Not support use low */ + eint_config.act_polarity = 1; /* 1 means positive active, 0 means negative active. */ + eint_config.auto_unmask = 0; /* 1 means unmask after callback, 0 means not unmask. user unmask it themselves. */ + } + + if (mode == FALLING) + { + sens_data.sensitivity = 0; /* 1 means level sensitiv, 0 means edge sensitive. */ + eint_config.act_polarity = 0; /* 1 means positive active, 0 means negative active. */ + eint_config.auto_unmask = 1; /* 1 means unmask after callback, 0 means not unmask. user unmask it themselves. */ + } + + if (mode == RISING) + { + sens_data.sensitivity = 0; /* 1 means level sensitiv, 0 means edge sensitive. */ + eint_config.act_polarity = 1; /* 1 means positive active, 0 means negative active. */ + eint_config.auto_unmask = 1; /* 1 means unmask after callback, 0 means not unmask. user unmask it themselves. */ + } + } + + status = vm_dcl_control(eint_handle ,VM_EINT_CMD_SET_SENSITIVITY,(void *)&sens_data); /* set eint sensitivity */ + if(status != VM_DCL_STATUS_OK) + { + vm_log_info("VM_EINT_CMD_SET_SENSITIVITY = %d", status); + } + + deboun_time.debounce_time = 1; /* debounce time 1ms */ + status = vm_dcl_control(eint_handle ,VM_EINT_CMD_SET_HW_DEBOUNCE,(void *)&deboun_time); /* set debounce time */ + if(status != VM_DCL_STATUS_OK) + { + vm_log_info("VM_EINT_CMD_SET_HW_DEBOUNCE = %d", status); + } + + status = vm_dcl_control(eint_handle ,VM_EINT_CMD_MASK,NULL); /* Usually, before we config eint, we mask it firstly. */ + if(status != VM_DCL_STATUS_OK) + { + vm_log_info("VM_EINT_CMD_MASK = %d", status); + } + + eint_config.debounce_en = 1; /* 1 means enable hw debounce, 0 means disable. */ + + status = vm_dcl_control(eint_handle ,VM_EINT_CMD_CONFIG,(void *)&eint_config); /* Please call this api finally, because we will unmask eint in this command. */ + if(status != VM_DCL_STATUS_OK) + { + vm_log_info("VM_EINT_CMD_CONFIG = %d", status); + } + + if (mode == CHANGE) + { + eint_config.act_polarity = 1; /* 1 means positive active, 0 means negative active. */ + status = vm_dcl_control(eint_handle ,VM_EINT_CMD_CONFIG,(void *)&eint_config); /* Please call this api finally, because we will unmask eint in this command. */ + if(status != VM_DCL_STATUS_OK) + { + vm_log_info("VM_EINT_CMD_CONFIG chage= %d", status); + } + } + gExinterruptsPio[pin].first ++; + } + else + { + status = vm_dcl_control(eint_handle,VM_EINT_CMD_UNMASK,NULL); /* call this function to unmask this eint. */ + if(status != VM_DCL_STATUS_OK) + { + vm_log_info("VM_EINT_CMD_CONFIG = %d", status); + } + } +} + +void detachInterrupt(uint32_t pin) +{ + if(VM_DCL_HANDLE_INVALID != gExinterruptsPio[pin].handle) + { + vm_dcl_close(gExinterruptsPio[pin].handle); + } + gExinterruptsPio[pin].handle = VM_DCL_HANDLE_INVALID; + gExinterruptsPio[pin].cb = NULL; + + g_APinDescription[gExinterruptsPio[pin].pin].ulHandle = VM_DCL_HANDLE_INVALID; + g_APinDescription[gExinterruptsPio[pin].pin].ulPinType= PIO_DIGITAL; +} + + diff --git a/hardware/arduino/mtk/cores/arduino/WInterrupts.h b/hardware/arduino/mtk/cores/arduino/WInterrupts.h new file mode 100644 index 00000000..6fdca470 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/WInterrupts.h @@ -0,0 +1,139 @@ +/* + Copyright (c) 2011-2012 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_INTERRUPTS_ +#define _WIRING_INTERRUPTS_ + +#include "Arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Definitions Interrupt callback type +typedef void (*callback_ptr)(void); + +/***************************************************************************** +* FUNCTION + * attachInterrupt + * DESCRIPTION + * Sets up Interrupt Service Routine (ISR). + * When an interrupt arrives, the ISR will be called automatically. This interrupt service cannot preempt execution. + * When the next interrupt arrives, it will wait for ISR to finish the previous interrupt before its execution starts. + * There are two external interrupts on LinkIt One development board, interrupt 0 (at pin 2) and interrupt 1 (at pin 3). + * PARAMETERS + * pin : [IN] Interrupt id, should be 0, and 1; 0 corresponds to pin2 (D2), 1 corresponds to pin3 (D3). + * callback : [IN] Interrupt callback + * mode : [IN] Interrupt trigger mode, it should be LOW/HIGH/RISING/FALLING/CHANGE + * RETURNS + * None + * RETURN VALUES + * None + * Example + * + * + * int pin = 13; + * volatile int state = LOW; + * + * void setup() + * { + * pinMode(pin, OUTPUT); + * attachInterrupt(0, blink, RISING); + * } + * + * void loop() + * { + * digitalWrite(pin, state); + * } + * + * void blink() + * { + * state = !state; + * } + * + * + *****************************************************************************/ +void attachInterrupt(uint32_t pin, callback_ptr callback, uint32_t mode); + +/***************************************************************************** +* FUNCTION + * detachInterrupt + * DESCRIPTION + * Disables ISR. + * PARAMETERS + * pin : [IN] Interrupt id, should be 0, and 1 + * RETURNS + * None + * RETURN VALUES + * None + *****************************************************************************/ +void detachInterrupt(uint32_t pin); + +/***************************************************************************** + * + * FUNCTION + * interrupts + * DESCRIPTION + * Enables interrupt (after it is disabled by noInterrupts()). + * By default, interrupts make some essential tasks executed in background. Disabling interrupts + * will make some communication functions unable to work normally and external interaction ignored. + * Therefore, please pay particular attention when using this function and enable the interrupt again as soon as possible + * PARAMETERS + * None + * RETURNS + * None + * RETURN VALUES + * None + * Example + * + * + * void setup() {} + * + * void loop() + * { + * noInterrupts(); + * // critical, time-sensitive code here + * interrupts(); + * // other code here + * } + * + * + *****************************************************************************/ +void interrupts(void); + + +/***************************************************************************** + * + * FUNCTION + * noInterrupts + * DESCRIPTION + * Disables interrupt (which can be enabled again by interrupts()). + * PARAMETERS + * None + * RETURNS + * None + * RETURN VALUES + * None + *****************************************************************************/ +void noInterrupts(void ); + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_INTERRUPTS_ */ diff --git a/hardware/arduino/mtk/cores/arduino/WMath.cpp b/hardware/arduino/mtk/cores/arduino/WMath.cpp new file mode 100644 index 00000000..ec2e29b2 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/WMath.cpp @@ -0,0 +1,68 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +extern "C" { + #include "stdlib.h" + #include "stdint.h" +} +#include "WMath.h" + +extern void randomSeed( uint32_t dwSeed ) +{ + if ( dwSeed != 0 ) + { + srand( dwSeed ) ; + } +} + +extern long random( long howbig ) +{ + if ( howbig == 0 ) + { + return 0 ; + } + + return rand() % howbig; +} + +extern long random( long howsmall, long howbig ) +{ + if (howsmall >= howbig) + { + return howsmall; + } + + long diff = howbig - howsmall; + + return random(diff) + howsmall; +} + +extern long map(long x, long in_min, long in_max, long out_min, long out_max) +{ + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + +extern uint16_t makeWord( uint16_t w ) +{ + return w ; +} + +extern uint16_t makeWord( uint8_t h, uint8_t l ) +{ + return (h << 8) | l ; +} diff --git a/hardware/arduino/mtk/cores/arduino/WMath.h b/hardware/arduino/mtk/cores/arduino/WMath.h new file mode 100644 index 00000000..7f7fd115 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/WMath.h @@ -0,0 +1,93 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_MATH_ +#define _WIRING_MATH_ + +/***************************************************************************** + * + * FUNCTION + * map + * DESCRIPTION + * Re-maps a number from one range to another. + * That is, a value of fromLow would get mapped to toLow, a value of fromHigh to toHigh, values in-between to values in-between, etc. + * PARAMETERS + * value: the number to map + * fromLow: the lower bound of the value's current range + * fromHigh: the upper bound of the value's current range + * toLow: the lower bound of the value's target range + * toHigh: the upper bound of the value's target range + * RETURNS + * The mapped value. + * RETURN VALUES + * long + *****************************************************************************/ +extern long map(long value, long fromLow, long fromHigh, long toLow, long toHigh); + +/***************************************************************************** + * FUNCTION + * random + * DESCRIPTION + * The random function generates pseudo-random numbers. + * PARAMETERS + * max: upper bound of the random value, exclusive + * RETURNS + * a random number limit to max-1 (long) + * RETURN VALUES + * long + *****************************************************************************/ +extern long random(long max) ; + +/***************************************************************************** + * FUNCTION + * random + * DESCRIPTION + * The random function generates pseudo-random numbers. + * That is, a value of fromLow would get mapped to toLow, a value of fromHigh to toHigh, values in-between to values in-between, etc. + * PARAMETERS + * min: lower bound of the random value, inclusive (optional) + * max: upper bound of the random value, exclusive + * RETURNS + * a random number between min and max-1 (long) + * RETURN VALUES + * long + *****************************************************************************/ +extern long random(long min, long max) ; + +/***************************************************************************** + * FUNCTION + * randomSeed + * DESCRIPTION + * randomSeed() initializes the pseudo-random number generator, causing it to start at an arbitrary point in its random sequence. + * This sequence, while very long, and random, is always the same. + * PARAMETERS + * dwSeed: pass a number to generate the seed. + * RETURNS + * no returns + * RETURN VALUES + * long + *****************************************************************************/ +extern void randomSeed( uint32_t dwSeed ) ; + +extern uint16_t makeWord( uint16_t w ) ; +extern uint16_t makeWord( uint8_t h, uint8_t l ) ; + +#define word(...) makeWord(__VA_ARGS__) + + +#endif /* _WIRING_MATH_ */ diff --git a/hardware/arduino/mtk/cores/arduino/WString.cpp b/hardware/arduino/mtk/cores/arduino/WString.cpp new file mode 100644 index 00000000..939ca0e2 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/WString.cpp @@ -0,0 +1,746 @@ +/* + WString.cpp - String library for Wiring & Arduino + ...mostly rewritten by Paul Stoffregen... + Copyright (c) 2009-10 Hernando Barragan. All rights reserved. + Copyright 2011, Paul Stoffregen, paul@pjrc.com + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "WString.h" +#include "itoa.h" +#include "avr/dtostrf.h" + +/*********************************************/ +/* Constructors */ +/*********************************************/ + +String::String(const char *cstr) +{ + init(); + if (cstr) copy(cstr, strlen(cstr)); +} + +String::String(const String &value) +{ + init(); + *this = value; +} + +String::String(const __FlashStringHelper *pstr) +{ + init(); + *this = pstr; +} + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +String::String(String &&rval) +{ + init(); + move(rval); +} +String::String(StringSumHelper &&rval) +{ + init(); + move(rval); +} +#endif + +String::String(char c) +{ + init(); + char buf[2]; + buf[0] = c; + buf[1] = 0; + *this = buf; +} + +String::String(unsigned char value, unsigned char base) +{ + init(); + char buf[1 + 8 * sizeof(unsigned char)]; + utoa(value, buf, base); + *this = buf; +} + +String::String(int value, unsigned char base) +{ + init(); + char buf[2 + 8 * sizeof(int)]; + itoa(value, buf, base); + *this = buf; +} + +String::String(unsigned int value, unsigned char base) +{ + init(); + char buf[1 + 8 * sizeof(unsigned int)]; + utoa(value, buf, base); + *this = buf; +} + +String::String(long value, unsigned char base) +{ + init(); + char buf[2 + 8 * sizeof(long)]; + ltoa(value, buf, base); + *this = buf; +} + +String::String(unsigned long value, unsigned char base) +{ + init(); + char buf[1 + 8 * sizeof(unsigned long)]; + ultoa(value, buf, base); + *this = buf; +} + +String::String(float value, unsigned char decimalPlaces) +{ + init(); + char buf[33]; + *this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); +} + +String::String(double value, unsigned char decimalPlaces) +{ + init(); + char buf[33]; + *this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); +} + +String::~String() +{ + free(buffer); +} + +/*********************************************/ +/* Memory Management */ +/*********************************************/ + +inline void String::init(void) +{ + buffer = NULL; + capacity = 0; + len = 0; +} + +void String::invalidate(void) +{ + if (buffer) free(buffer); + buffer = NULL; + capacity = len = 0; +} + +unsigned char String::reserve(unsigned int size) +{ + if (buffer && capacity >= size) return 1; + if (changeBuffer(size)) { + if (len == 0) buffer[0] = 0; + return 1; + } + return 0; +} + +unsigned char String::changeBuffer(unsigned int maxStrLen) +{ + char *newbuffer = (char *)realloc(buffer, maxStrLen + 1); + if (newbuffer) { + buffer = newbuffer; + capacity = maxStrLen; + return 1; + } + return 0; +} + +/*********************************************/ +/* Copy and Move */ +/*********************************************/ + +String & String::copy(const char *cstr, unsigned int length) +{ + if (!reserve(length)) { + invalidate(); + return *this; + } + len = length; + strcpy(buffer, cstr); + return *this; +} + +String & String::copy(const __FlashStringHelper *pstr, unsigned int length) +{ + if (!reserve(length)) { + invalidate(); + return *this; + } + len = length; + strcpy_P(buffer, (PGM_P)pstr); + return *this; +} + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +void String::move(String &rhs) +{ + if (buffer) { + if (capacity >= rhs.len) { + strcpy(buffer, rhs.buffer); + len = rhs.len; + rhs.len = 0; + return; + } else { + free(buffer); + } + } + buffer = rhs.buffer; + capacity = rhs.capacity; + len = rhs.len; + rhs.buffer = NULL; + rhs.capacity = 0; + rhs.len = 0; +} +#endif + +String & String::operator = (const String &rhs) +{ + if (this == &rhs) return *this; + + if (rhs.buffer) copy(rhs.buffer, rhs.len); + else invalidate(); + + return *this; +} + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +String & String::operator = (String &&rval) +{ + if (this != &rval) move(rval); + return *this; +} + +String & String::operator = (StringSumHelper &&rval) +{ + if (this != &rval) move(rval); + return *this; +} +#endif + +String & String::operator = (const char *cstr) +{ + if (cstr) copy(cstr, strlen(cstr)); + else invalidate(); + + return *this; +} + +String & String::operator = (const __FlashStringHelper *pstr) +{ + if (pstr) copy(pstr, strlen_P((PGM_P)pstr)); + else invalidate(); + + return *this; +} + +/*********************************************/ +/* concat */ +/*********************************************/ + +unsigned char String::concat(const String &s) +{ + return concat(s.buffer, s.len); +} + +unsigned char String::concat(const char *cstr, unsigned int length) +{ + unsigned int newlen = len + length; + if (!cstr) return 0; + if (length == 0) return 1; + if (!reserve(newlen)) return 0; + strcpy(buffer + len, cstr); + len = newlen; + return 1; +} + +unsigned char String::concat(const char *cstr) +{ + if (!cstr) return 0; + return concat(cstr, strlen(cstr)); +} + +unsigned char String::concat(char c) +{ + char buf[2]; + buf[0] = c; + buf[1] = 0; + return concat(buf, 1); +} + +unsigned char String::concat(unsigned char num) +{ + char buf[1 + 3 * sizeof(unsigned char)]; + itoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +unsigned char String::concat(int num) +{ + char buf[2 + 3 * sizeof(int)]; + itoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +unsigned char String::concat(unsigned int num) +{ + char buf[1 + 3 * sizeof(unsigned int)]; + utoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +unsigned char String::concat(long num) +{ + char buf[2 + 3 * sizeof(long)]; + ltoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +unsigned char String::concat(unsigned long num) +{ + char buf[1 + 3 * sizeof(unsigned long)]; + ultoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +unsigned char String::concat(float num) +{ + char buf[20]; + char* string = dtostrf(num, 4, 2, buf); + return concat(string, strlen(string)); +} + +unsigned char String::concat(double num) +{ + char buf[20]; + char* string = dtostrf(num, 4, 2, buf); + return concat(string, strlen(string)); +} + +unsigned char String::concat(const __FlashStringHelper * str) +{ + if (!str) return 0; + int length = strlen_P((const char *) str); + if (length == 0) return 1; + unsigned int newlen = len + length; + if (!reserve(newlen)) return 0; + strcpy_P(buffer + len, (const char *) str); + len = newlen; + return 1; +} + +/*********************************************/ +/* Concatenate */ +/*********************************************/ + +StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(rhs.buffer, rhs.len)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr) +{ + StringSumHelper &a = const_cast(lhs); + if (!cstr || !a.concat(cstr, strlen(cstr))) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, char c) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(c)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, int num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, long num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, float num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, double num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(rhs)) a.invalidate(); + return a; +} + +/*********************************************/ +/* Comparison */ +/*********************************************/ + +int String::compareTo(const String &s) const +{ + if (!buffer || !s.buffer) { + if (s.buffer && s.len > 0) return 0 - *(unsigned char *)s.buffer; + if (buffer && len > 0) return *(unsigned char *)buffer; + return 0; + } + return strcmp(buffer, s.buffer); +} + +unsigned char String::equals(const String &s2) const +{ + return (len == s2.len && compareTo(s2) == 0); +} + +unsigned char String::equals(const char *cstr) const +{ + if (len == 0) return (cstr == NULL || *cstr == 0); + if (cstr == NULL) return buffer[0] == 0; + return strcmp(buffer, cstr) == 0; +} + +unsigned char String::operator<(const String &rhs) const +{ + return compareTo(rhs) < 0; +} + +unsigned char String::operator>(const String &rhs) const +{ + return compareTo(rhs) > 0; +} + +unsigned char String::operator<=(const String &rhs) const +{ + return compareTo(rhs) <= 0; +} + +unsigned char String::operator>=(const String &rhs) const +{ + return compareTo(rhs) >= 0; +} + +unsigned char String::equalsIgnoreCase( const String &s2 ) const +{ + if (this == &s2) return 1; + if (len != s2.len) return 0; + if (len == 0) return 1; + const char *p1 = buffer; + const char *p2 = s2.buffer; + while (*p1) { + if (tolower(*p1++) != tolower(*p2++)) return 0; + } + return 1; +} + +unsigned char String::startsWith( const String &s2 ) const +{ + if (len < s2.len) return 0; + return startsWith(s2, 0); +} + +unsigned char String::startsWith( const String &s2, unsigned int offset ) const +{ + if (offset > len - s2.len || !buffer || !s2.buffer) return 0; + return strncmp( &buffer[offset], s2.buffer, s2.len ) == 0; +} + +unsigned char String::endsWith( const String &s2 ) const +{ + if ( len < s2.len || !buffer || !s2.buffer) return 0; + return strcmp(&buffer[len - s2.len], s2.buffer) == 0; +} + +/*********************************************/ +/* Character Access */ +/*********************************************/ + +char String::charAt(unsigned int loc) const +{ + return operator[](loc); +} + +void String::setCharAt(unsigned int loc, char c) +{ + if (loc < len) buffer[loc] = c; +} + +char & String::operator[](unsigned int index) +{ + static char dummy_writable_char; + if (index >= len || !buffer) { + dummy_writable_char = 0; + return dummy_writable_char; + } + return buffer[index]; +} + +char String::operator[]( unsigned int index ) const +{ + if (index >= len || !buffer) return 0; + return buffer[index]; +} + +void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index) const +{ + if (!bufsize || !buf) return; + if (index >= len) { + buf[0] = 0; + return; + } + unsigned int n = bufsize - 1; + if (n > len - index) n = len - index; + strncpy((char *)buf, buffer + index, n); + buf[n] = 0; +} + +/*********************************************/ +/* Search */ +/*********************************************/ + +int String::indexOf(char c) const +{ + return indexOf(c, 0); +} + +int String::indexOf( char ch, unsigned int fromIndex ) const +{ + if (fromIndex >= len) return -1; + const char* temp = strchr(buffer + fromIndex, ch); + if (temp == NULL) return -1; + return temp - buffer; +} + +int String::indexOf(const String &s2) const +{ + return indexOf(s2, 0); +} + +int String::indexOf(const String &s2, unsigned int fromIndex) const +{ + if (fromIndex >= len) return -1; + const char *found = strstr(buffer + fromIndex, s2.buffer); + if (found == NULL) return -1; + return found - buffer; +} + +int String::lastIndexOf( char theChar ) const +{ + return lastIndexOf(theChar, len - 1); +} + +int String::lastIndexOf(char ch, unsigned int fromIndex) const +{ + if (fromIndex >= len) return -1; + char tempchar = buffer[fromIndex + 1]; + buffer[fromIndex + 1] = '\0'; + char* temp = strrchr( buffer, ch ); + buffer[fromIndex + 1] = tempchar; + if (temp == NULL) return -1; + return temp - buffer; +} + +int String::lastIndexOf(const String &s2) const +{ + return lastIndexOf(s2, len - s2.len); +} + +int String::lastIndexOf(const String &s2, unsigned int fromIndex) const +{ + if (s2.len == 0 || len == 0 || s2.len > len) return -1; + if (fromIndex >= len) fromIndex = len - 1; + int found = -1; + for (char *p = buffer; p <= buffer + fromIndex; p++) { + p = strstr(p, s2.buffer); + if (!p) break; + if ((unsigned int)(p - buffer) <= fromIndex) found = p - buffer; + } + return found; +} + +String String::substring(unsigned int left, unsigned int right) const +{ + if (left > right) { + unsigned int temp = right; + right = left; + left = temp; + } + String out; + if (left > len) return out; + if (right > len) right = len; + char temp = buffer[right]; // save the replaced character + buffer[right] = '\0'; + out = buffer + left; // pointer arithmetic + buffer[right] = temp; //restore character + return out; +} + +/*********************************************/ +/* Modification */ +/*********************************************/ + +void String::replace(char find, char replace) +{ + if (!buffer) return; + for (char *p = buffer; *p; p++) { + if (*p == find) *p = replace; + } +} + +void String::replace(const String& find, const String& replace) +{ + if (len == 0 || find.len == 0) return; + int diff = replace.len - find.len; + char *readFrom = buffer; + char *foundAt; + if (diff == 0) { + while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { + memcpy(foundAt, replace.buffer, replace.len); + readFrom = foundAt + replace.len; + } + } else if (diff < 0) { + char *writeTo = buffer; + while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { + unsigned int n = foundAt - readFrom; + memcpy(writeTo, readFrom, n); + writeTo += n; + memcpy(writeTo, replace.buffer, replace.len); + writeTo += replace.len; + readFrom = foundAt + find.len; + len += diff; + } + strcpy(writeTo, readFrom); + } else { + unsigned int size = len; // compute size needed for result + while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { + readFrom = foundAt + find.len; + size += diff; + } + if (size == len) return; + if (size > capacity && !changeBuffer(size)) return; // XXX: tell user! + int index = len - 1; + while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) { + readFrom = buffer + index + find.len; + memmove(readFrom + diff, readFrom, len - (readFrom - buffer)); + len += diff; + buffer[len] = 0; + memcpy(buffer + index, replace.buffer, replace.len); + index--; + } + } +} + +void String::remove(unsigned int index){ + if (index >= len) { return; } + int count = len - index; + remove(index, count); +} + +void String::remove(unsigned int index, unsigned int count){ + if (index >= len) { return; } + if (count <= 0) { return; } + if (index + count > len) { count = len - index; } + char *writeTo = buffer + index; + len = len - count; + strncpy(writeTo, buffer + index + count,len - index); + buffer[len] = 0; +} + +void String::toLowerCase(void) +{ + if (!buffer) return; + for (char *p = buffer; *p; p++) { + *p = tolower(*p); + } +} + +void String::toUpperCase(void) +{ + if (!buffer) return; + for (char *p = buffer; *p; p++) { + *p = toupper(*p); + } +} + +void String::trim(void) +{ + if (!buffer || len == 0) return; + char *begin = buffer; + while (isspace(*begin)) begin++; + char *end = buffer + len - 1; + while (isspace(*end) && end >= begin) end--; + len = end + 1 - begin; + if (begin > buffer) memcpy(buffer, begin, len); + buffer[len] = 0; +} + +/*********************************************/ +/* Parsing / Conversion */ +/*********************************************/ + +long String::toInt(void) const +{ + if (buffer) return atol(buffer); + return 0; +} + +float String::toFloat(void) const +{ + if (buffer) return float(atof(buffer)); + return 0; +} diff --git a/hardware/arduino/mtk/cores/arduino/WString.h b/hardware/arduino/mtk/cores/arduino/WString.h new file mode 100644 index 00000000..74024309 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/WString.h @@ -0,0 +1,224 @@ +/* + WString.h - String library for Wiring & Arduino + ...mostly rewritten by Paul Stoffregen... + Copyright (c) 2009-10 Hernando Barragan. All right reserved. + Copyright 2011, Paul Stoffregen, paul@pjrc.com + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef String_class_h +#define String_class_h +#ifdef __cplusplus + +#include +#include +#include +#include + +// When compiling programs with this class, the following gcc parameters +// dramatically increase performance and memory (RAM) efficiency, typically +// with little or no increase in code size. +// -felide-constructors +// -std=c++0x + +class __FlashStringHelper; +#define F(string_literal) (reinterpret_cast(PSTR(string_literal))) + +// An inherited class for holding the result of a concatenation. These +// result objects are assumed to be writable by subsequent concatenations. +class StringSumHelper; + +// The string class +class String +{ + // use a function pointer to allow for "if (s)" without the + // complications of an operator bool(). for more information, see: + // http://www.artima.com/cppsource/safebool.html + typedef void (String::*StringIfHelperType)() const; + void StringIfHelper() const {} + +public: + // constructors + // creates a copy of the initial value. + // if the initial value is null or invalid, or if memory allocation + // fails, the string will be marked as invalid (i.e. "if (s)" will + // be false). + String(const char *cstr = ""); + String(const String &str); + String(const __FlashStringHelper *str); + #ifdef __GXX_EXPERIMENTAL_CXX0X__ + String(String &&rval); + String(StringSumHelper &&rval); + #endif + explicit String(char c); + explicit String(unsigned char, unsigned char base=10); + explicit String(int, unsigned char base=10); + explicit String(unsigned int, unsigned char base=10); + explicit String(long, unsigned char base=10); + explicit String(unsigned long, unsigned char base=10); + explicit String(float, unsigned char decimalPlaces=2); + explicit String(double, unsigned char decimalPlaces=2); + ~String(void); + + // memory management + // return true on success, false on failure (in which case, the string + // is left unchanged). reserve(0), if successful, will validate an + // invalid string (i.e., "if (s)" will be true afterwards) + unsigned char reserve(unsigned int size); + inline unsigned int length(void) const {return len;} + + // creates a copy of the assigned value. if the value is null or + // invalid, or if the memory allocation fails, the string will be + // marked as invalid ("if (s)" will be false). + String & operator = (const String &rhs); + String & operator = (const char *cstr); + String & operator = (const __FlashStringHelper *str); + #ifdef __GXX_EXPERIMENTAL_CXX0X__ + String & operator = (String &&rval); + String & operator = (StringSumHelper &&rval); + #endif + + // concatenate (works w/ built-in types) + + // returns true on success, false on failure (in which case, the string + // is left unchanged). if the argument is null or invalid, the + // concatenation is considered unsucessful. + unsigned char concat(const String &str); + unsigned char concat(const char *cstr); + unsigned char concat(char c); + unsigned char concat(unsigned char c); + unsigned char concat(int num); + unsigned char concat(unsigned int num); + unsigned char concat(long num); + unsigned char concat(unsigned long num); + unsigned char concat(float num); + unsigned char concat(double num); + unsigned char concat(const __FlashStringHelper * str); + + // if there's not enough memory for the concatenated value, the string + // will be left unchanged (but this isn't signalled in any way) + String & operator += (const String &rhs) {concat(rhs); return (*this);} + String & operator += (const char *cstr) {concat(cstr); return (*this);} + String & operator += (char c) {concat(c); return (*this);} + String & operator += (unsigned char num) {concat(num); return (*this);} + String & operator += (int num) {concat(num); return (*this);} + String & operator += (unsigned int num) {concat(num); return (*this);} + String & operator += (long num) {concat(num); return (*this);} + String & operator += (unsigned long num) {concat(num); return (*this);} + String & operator += (float num) {concat(num); return (*this);} + String & operator += (double num) {concat(num); return (*this);} + String & operator += (const __FlashStringHelper *str){concat(str); return (*this);} + + friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs); + friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr); + friend StringSumHelper & operator + (const StringSumHelper &lhs, char c); + friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, int num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, long num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, float num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, double num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs); + + // comparison (only works w/ Strings and "strings") + operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; } + int compareTo(const String &s) const; + unsigned char equals(const String &s) const; + unsigned char equals(const char *cstr) const; + unsigned char operator == (const String &rhs) const {return equals(rhs);} + unsigned char operator == (const char *cstr) const {return equals(cstr);} + unsigned char operator != (const String &rhs) const {return !equals(rhs);} + unsigned char operator != (const char *cstr) const {return !equals(cstr);} + unsigned char operator < (const String &rhs) const; + unsigned char operator > (const String &rhs) const; + unsigned char operator <= (const String &rhs) const; + unsigned char operator >= (const String &rhs) const; + unsigned char equalsIgnoreCase(const String &s) const; + unsigned char startsWith( const String &prefix) const; + unsigned char startsWith(const String &prefix, unsigned int offset) const; + unsigned char endsWith(const String &suffix) const; + + // character acccess + char charAt(unsigned int index) const; + void setCharAt(unsigned int index, char c); + char operator [] (unsigned int index) const; + char& operator [] (unsigned int index); + void getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index=0) const; + void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const + {getBytes((unsigned char *)buf, bufsize, index);} + const char * c_str() const { return buffer; } + + // search + int indexOf( char ch ) const; + int indexOf( char ch, unsigned int fromIndex ) const; + int indexOf( const String &str ) const; + int indexOf( const String &str, unsigned int fromIndex ) const; + int lastIndexOf( char ch ) const; + int lastIndexOf( char ch, unsigned int fromIndex ) const; + int lastIndexOf( const String &str ) const; + int lastIndexOf( const String &str, unsigned int fromIndex ) const; + String substring( unsigned int beginIndex ) const { return substring(beginIndex, len); }; + String substring( unsigned int beginIndex, unsigned int endIndex ) const; + + // modification + void replace(char find, char replace); + void replace(const String& find, const String& replace); + void remove(unsigned int index); + void remove(unsigned int index, unsigned int count); + void toLowerCase(void); + void toUpperCase(void); + void trim(void); + + // parsing/conversion + long toInt(void) const; + float toFloat(void) const; + +protected: + char *buffer; // the actual char array + unsigned int capacity; // the array length minus one (for the '\0') + unsigned int len; // the String length (not counting the '\0') +protected: + void init(void); + void invalidate(void); + unsigned char changeBuffer(unsigned int maxStrLen); + unsigned char concat(const char *cstr, unsigned int length); + + // copy and move + String & copy(const char *cstr, unsigned int length); + String & copy(const __FlashStringHelper *pstr, unsigned int length); + #ifdef __GXX_EXPERIMENTAL_CXX0X__ + void move(String &rhs); + #endif +}; + +class StringSumHelper : public String +{ +public: + StringSumHelper(const String &s) : String(s) {} + StringSumHelper(const char *p) : String(p) {} + StringSumHelper(char c) : String(c) {} + StringSumHelper(unsigned char num) : String(num) {} + StringSumHelper(int num) : String(num) {} + StringSumHelper(unsigned int num) : String(num) {} + StringSumHelper(long num) : String(num) {} + StringSumHelper(unsigned long num) : String(num) {} + StringSumHelper(float num) : String(num) {} + StringSumHelper(double num) : String(num) {} +}; + +#endif // __cplusplus +#endif // String_class_h diff --git a/hardware/arduino/mtk/cores/arduino/avr/dtostrf.c b/hardware/arduino/mtk/cores/arduino/avr/dtostrf.c new file mode 100644 index 00000000..7f90154f --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/avr/dtostrf.c @@ -0,0 +1,29 @@ +/* + dtostrf - Emulation for dtostrf function from avr-libc + Copyright (c) 2013 Arduino. All rights reserved. + Written by Cristian Maglie + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include + +char *dtostrf (double val, signed char width, unsigned char prec, char *sout) { + char fmt[20]; + sprintf(fmt, "%%%d.%df", width, prec); + sprintf(sout, fmt, val); + return sout; +} + diff --git a/hardware/arduino/mtk/cores/arduino/avr/dtostrf.h b/hardware/arduino/mtk/cores/arduino/avr/dtostrf.h new file mode 100644 index 00000000..0bf9f57c --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/avr/dtostrf.h @@ -0,0 +1,29 @@ +/* + dtostrf - Emulation for dtostrf function from avr-libc + Copyright (c) 2013 Arduino. All rights reserved. + Written by Cristian Maglie + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +char *dtostrf (double val, signed char width, unsigned char prec, char *sout); + +#ifdef __cplusplus +} +#endif diff --git a/hardware/arduino/mtk/cores/arduino/avr/interrupt.h b/hardware/arduino/mtk/cores/arduino/avr/interrupt.h new file mode 100644 index 00000000..e69de29b diff --git a/hardware/arduino/mtk/cores/arduino/avr/pgmspace.h b/hardware/arduino/mtk/cores/arduino/avr/pgmspace.h new file mode 100644 index 00000000..9b344c9b --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/avr/pgmspace.h @@ -0,0 +1,44 @@ +#ifndef __PGMSPACE_H_ +#define __PGMSPACE_H_ 1 + +#include + +#define PROGMEM +#define PGM_P const char * +#define PSTR(str) (str) + +#define _SFR_BYTE(n) (n) + +typedef void prog_void; +typedef char prog_char; +typedef unsigned char prog_uchar; +typedef int8_t prog_int8_t; +typedef uint8_t prog_uint8_t; +typedef int16_t prog_int16_t; +typedef uint16_t prog_uint16_t; +typedef int32_t prog_int32_t; +typedef uint32_t prog_uint32_t; + +#define memcpy_P(dest, src, num) memcpy((dest), (src), (num)) +#define strcpy_P(dest, src) strcpy((dest), (src)) +#define strcat_P(dest, src) strcat((dest), (src)) +#define strcmp_P(a, b) strcmp((a), (b)) +#define strstr_P(a, b) strstr((a), (b)) +#define strlen_P(a) strlen((a)) +#define sprintf_P(s, f, ...) sprintf((s), (f), __VA_ARGS__) + +#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) +#define pgm_read_word(addr) (*(const unsigned short *)(addr)) +#define pgm_read_dword(addr) (*(const unsigned long *)(addr)) +#define pgm_read_float(addr) (*(const float *)(addr)) + +#define pgm_read_byte_near(addr) pgm_read_byte(addr) +#define pgm_read_word_near(addr) pgm_read_word(addr) +#define pgm_read_dword_near(addr) pgm_read_dword(addr) +#define pgm_read_float_near(addr) pgm_read_float(addr) +#define pgm_read_byte_far(addr) pgm_read_byte(addr) +#define pgm_read_word_far(addr) pgm_read_word(addr) +#define pgm_read_dword_far(addr) pgm_read_dword(addr) +#define pgm_read_float_far(addr) pgm_read_float(addr) + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/binary.h b/hardware/arduino/mtk/cores/arduino/binary.h new file mode 100644 index 00000000..aec4c733 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/binary.h @@ -0,0 +1,534 @@ +/* + binary.h - Definitions for binary constants + Copyright (c) 2006 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Binary_h +#define Binary_h + +#define B0 0 +#define B00 0 +#define B000 0 +#define B0000 0 +#define B00000 0 +#define B000000 0 +#define B0000000 0 +#define B00000000 0 +#define B1 1 +#define B01 1 +#define B001 1 +#define B0001 1 +#define B00001 1 +#define B000001 1 +#define B0000001 1 +#define B00000001 1 +#define B10 2 +#define B010 2 +#define B0010 2 +#define B00010 2 +#define B000010 2 +#define B0000010 2 +#define B00000010 2 +#define B11 3 +#define B011 3 +#define B0011 3 +#define B00011 3 +#define B000011 3 +#define B0000011 3 +#define B00000011 3 +#define B100 4 +#define B0100 4 +#define B00100 4 +#define B000100 4 +#define B0000100 4 +#define B00000100 4 +#define B101 5 +#define B0101 5 +#define B00101 5 +#define B000101 5 +#define B0000101 5 +#define B00000101 5 +#define B110 6 +#define B0110 6 +#define B00110 6 +#define B000110 6 +#define B0000110 6 +#define B00000110 6 +#define B111 7 +#define B0111 7 +#define B00111 7 +#define B000111 7 +#define B0000111 7 +#define B00000111 7 +#define B1000 8 +#define B01000 8 +#define B001000 8 +#define B0001000 8 +#define B00001000 8 +#define B1001 9 +#define B01001 9 +#define B001001 9 +#define B0001001 9 +#define B00001001 9 +#define B1010 10 +#define B01010 10 +#define B001010 10 +#define B0001010 10 +#define B00001010 10 +#define B1011 11 +#define B01011 11 +#define B001011 11 +#define B0001011 11 +#define B00001011 11 +#define B1100 12 +#define B01100 12 +#define B001100 12 +#define B0001100 12 +#define B00001100 12 +#define B1101 13 +#define B01101 13 +#define B001101 13 +#define B0001101 13 +#define B00001101 13 +#define B1110 14 +#define B01110 14 +#define B001110 14 +#define B0001110 14 +#define B00001110 14 +#define B1111 15 +#define B01111 15 +#define B001111 15 +#define B0001111 15 +#define B00001111 15 +#define B10000 16 +#define B010000 16 +#define B0010000 16 +#define B00010000 16 +#define B10001 17 +#define B010001 17 +#define B0010001 17 +#define B00010001 17 +#define B10010 18 +#define B010010 18 +#define B0010010 18 +#define B00010010 18 +#define B10011 19 +#define B010011 19 +#define B0010011 19 +#define B00010011 19 +#define B10100 20 +#define B010100 20 +#define B0010100 20 +#define B00010100 20 +#define B10101 21 +#define B010101 21 +#define B0010101 21 +#define B00010101 21 +#define B10110 22 +#define B010110 22 +#define B0010110 22 +#define B00010110 22 +#define B10111 23 +#define B010111 23 +#define B0010111 23 +#define B00010111 23 +#define B11000 24 +#define B011000 24 +#define B0011000 24 +#define B00011000 24 +#define B11001 25 +#define B011001 25 +#define B0011001 25 +#define B00011001 25 +#define B11010 26 +#define B011010 26 +#define B0011010 26 +#define B00011010 26 +#define B11011 27 +#define B011011 27 +#define B0011011 27 +#define B00011011 27 +#define B11100 28 +#define B011100 28 +#define B0011100 28 +#define B00011100 28 +#define B11101 29 +#define B011101 29 +#define B0011101 29 +#define B00011101 29 +#define B11110 30 +#define B011110 30 +#define B0011110 30 +#define B00011110 30 +#define B11111 31 +#define B011111 31 +#define B0011111 31 +#define B00011111 31 +#define B100000 32 +#define B0100000 32 +#define B00100000 32 +#define B100001 33 +#define B0100001 33 +#define B00100001 33 +#define B100010 34 +#define B0100010 34 +#define B00100010 34 +#define B100011 35 +#define B0100011 35 +#define B00100011 35 +#define B100100 36 +#define B0100100 36 +#define B00100100 36 +#define B100101 37 +#define B0100101 37 +#define B00100101 37 +#define B100110 38 +#define B0100110 38 +#define B00100110 38 +#define B100111 39 +#define B0100111 39 +#define B00100111 39 +#define B101000 40 +#define B0101000 40 +#define B00101000 40 +#define B101001 41 +#define B0101001 41 +#define B00101001 41 +#define B101010 42 +#define B0101010 42 +#define B00101010 42 +#define B101011 43 +#define B0101011 43 +#define B00101011 43 +#define B101100 44 +#define B0101100 44 +#define B00101100 44 +#define B101101 45 +#define B0101101 45 +#define B00101101 45 +#define B101110 46 +#define B0101110 46 +#define B00101110 46 +#define B101111 47 +#define B0101111 47 +#define B00101111 47 +#define B110000 48 +#define B0110000 48 +#define B00110000 48 +#define B110001 49 +#define B0110001 49 +#define B00110001 49 +#define B110010 50 +#define B0110010 50 +#define B00110010 50 +#define B110011 51 +#define B0110011 51 +#define B00110011 51 +#define B110100 52 +#define B0110100 52 +#define B00110100 52 +#define B110101 53 +#define B0110101 53 +#define B00110101 53 +#define B110110 54 +#define B0110110 54 +#define B00110110 54 +#define B110111 55 +#define B0110111 55 +#define B00110111 55 +#define B111000 56 +#define B0111000 56 +#define B00111000 56 +#define B111001 57 +#define B0111001 57 +#define B00111001 57 +#define B111010 58 +#define B0111010 58 +#define B00111010 58 +#define B111011 59 +#define B0111011 59 +#define B00111011 59 +#define B111100 60 +#define B0111100 60 +#define B00111100 60 +#define B111101 61 +#define B0111101 61 +#define B00111101 61 +#define B111110 62 +#define B0111110 62 +#define B00111110 62 +#define B111111 63 +#define B0111111 63 +#define B00111111 63 +#define B1000000 64 +#define B01000000 64 +#define B1000001 65 +#define B01000001 65 +#define B1000010 66 +#define B01000010 66 +#define B1000011 67 +#define B01000011 67 +#define B1000100 68 +#define B01000100 68 +#define B1000101 69 +#define B01000101 69 +#define B1000110 70 +#define B01000110 70 +#define B1000111 71 +#define B01000111 71 +#define B1001000 72 +#define B01001000 72 +#define B1001001 73 +#define B01001001 73 +#define B1001010 74 +#define B01001010 74 +#define B1001011 75 +#define B01001011 75 +#define B1001100 76 +#define B01001100 76 +#define B1001101 77 +#define B01001101 77 +#define B1001110 78 +#define B01001110 78 +#define B1001111 79 +#define B01001111 79 +#define B1010000 80 +#define B01010000 80 +#define B1010001 81 +#define B01010001 81 +#define B1010010 82 +#define B01010010 82 +#define B1010011 83 +#define B01010011 83 +#define B1010100 84 +#define B01010100 84 +#define B1010101 85 +#define B01010101 85 +#define B1010110 86 +#define B01010110 86 +#define B1010111 87 +#define B01010111 87 +#define B1011000 88 +#define B01011000 88 +#define B1011001 89 +#define B01011001 89 +#define B1011010 90 +#define B01011010 90 +#define B1011011 91 +#define B01011011 91 +#define B1011100 92 +#define B01011100 92 +#define B1011101 93 +#define B01011101 93 +#define B1011110 94 +#define B01011110 94 +#define B1011111 95 +#define B01011111 95 +#define B1100000 96 +#define B01100000 96 +#define B1100001 97 +#define B01100001 97 +#define B1100010 98 +#define B01100010 98 +#define B1100011 99 +#define B01100011 99 +#define B1100100 100 +#define B01100100 100 +#define B1100101 101 +#define B01100101 101 +#define B1100110 102 +#define B01100110 102 +#define B1100111 103 +#define B01100111 103 +#define B1101000 104 +#define B01101000 104 +#define B1101001 105 +#define B01101001 105 +#define B1101010 106 +#define B01101010 106 +#define B1101011 107 +#define B01101011 107 +#define B1101100 108 +#define B01101100 108 +#define B1101101 109 +#define B01101101 109 +#define B1101110 110 +#define B01101110 110 +#define B1101111 111 +#define B01101111 111 +#define B1110000 112 +#define B01110000 112 +#define B1110001 113 +#define B01110001 113 +#define B1110010 114 +#define B01110010 114 +#define B1110011 115 +#define B01110011 115 +#define B1110100 116 +#define B01110100 116 +#define B1110101 117 +#define B01110101 117 +#define B1110110 118 +#define B01110110 118 +#define B1110111 119 +#define B01110111 119 +#define B1111000 120 +#define B01111000 120 +#define B1111001 121 +#define B01111001 121 +#define B1111010 122 +#define B01111010 122 +#define B1111011 123 +#define B01111011 123 +#define B1111100 124 +#define B01111100 124 +#define B1111101 125 +#define B01111101 125 +#define B1111110 126 +#define B01111110 126 +#define B1111111 127 +#define B01111111 127 +#define B10000000 128 +#define B10000001 129 +#define B10000010 130 +#define B10000011 131 +#define B10000100 132 +#define B10000101 133 +#define B10000110 134 +#define B10000111 135 +#define B10001000 136 +#define B10001001 137 +#define B10001010 138 +#define B10001011 139 +#define B10001100 140 +#define B10001101 141 +#define B10001110 142 +#define B10001111 143 +#define B10010000 144 +#define B10010001 145 +#define B10010010 146 +#define B10010011 147 +#define B10010100 148 +#define B10010101 149 +#define B10010110 150 +#define B10010111 151 +#define B10011000 152 +#define B10011001 153 +#define B10011010 154 +#define B10011011 155 +#define B10011100 156 +#define B10011101 157 +#define B10011110 158 +#define B10011111 159 +#define B10100000 160 +#define B10100001 161 +#define B10100010 162 +#define B10100011 163 +#define B10100100 164 +#define B10100101 165 +#define B10100110 166 +#define B10100111 167 +#define B10101000 168 +#define B10101001 169 +#define B10101010 170 +#define B10101011 171 +#define B10101100 172 +#define B10101101 173 +#define B10101110 174 +#define B10101111 175 +#define B10110000 176 +#define B10110001 177 +#define B10110010 178 +#define B10110011 179 +#define B10110100 180 +#define B10110101 181 +#define B10110110 182 +#define B10110111 183 +#define B10111000 184 +#define B10111001 185 +#define B10111010 186 +#define B10111011 187 +#define B10111100 188 +#define B10111101 189 +#define B10111110 190 +#define B10111111 191 +#define B11000000 192 +#define B11000001 193 +#define B11000010 194 +#define B11000011 195 +#define B11000100 196 +#define B11000101 197 +#define B11000110 198 +#define B11000111 199 +#define B11001000 200 +#define B11001001 201 +#define B11001010 202 +#define B11001011 203 +#define B11001100 204 +#define B11001101 205 +#define B11001110 206 +#define B11001111 207 +#define B11010000 208 +#define B11010001 209 +#define B11010010 210 +#define B11010011 211 +#define B11010100 212 +#define B11010101 213 +#define B11010110 214 +#define B11010111 215 +#define B11011000 216 +#define B11011001 217 +#define B11011010 218 +#define B11011011 219 +#define B11011100 220 +#define B11011101 221 +#define B11011110 222 +#define B11011111 223 +#define B11100000 224 +#define B11100001 225 +#define B11100010 226 +#define B11100011 227 +#define B11100100 228 +#define B11100101 229 +#define B11100110 230 +#define B11100111 231 +#define B11101000 232 +#define B11101001 233 +#define B11101010 234 +#define B11101011 235 +#define B11101100 236 +#define B11101101 237 +#define B11101110 238 +#define B11101111 239 +#define B11110000 240 +#define B11110001 241 +#define B11110010 242 +#define B11110011 243 +#define B11110100 244 +#define B11110101 245 +#define B11110110 246 +#define B11110111 247 +#define B11111000 248 +#define B11111001 249 +#define B11111010 250 +#define B11111011 251 +#define B11111100 252 +#define B11111101 253 +#define B11111110 254 +#define B11111111 255 + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/cxxabi-compat.cpp b/hardware/arduino/mtk/cores/arduino/cxxabi-compat.cpp new file mode 100644 index 00000000..7370b0be --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/cxxabi-compat.cpp @@ -0,0 +1,26 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +extern "C" void __cxa_pure_virtual(void) ; + +/* We compile with nodefaultlibs, so we need to provide an error + * handler for an empty pure virtual function */ +extern "C" void __cxa_pure_virtual(void) { + while(1) + ; +} diff --git a/hardware/arduino/mtk/cores/arduino/itoa.c b/hardware/arduino/mtk/cores/arduino/itoa.c new file mode 100644 index 00000000..fc357660 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/itoa.c @@ -0,0 +1,170 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "itoa.h" +#include + +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus + +#if 0 +/* reverse: reverse string s in place */ +static void reverse( char s[] ) +{ + int i, j ; + char c ; + + for ( i = 0, j = strlen(s)-1 ; i < j ; i++, j-- ) + { + c = s[i] ; + s[i] = s[j] ; + s[j] = c ; + } +} + +/* itoa: convert n to characters in s */ +extern void itoa( int n, char s[] ) +{ + int i, sign ; + + if ( (sign = n) < 0 ) /* record sign */ + { + n = -n; /* make n positive */ + } + + i = 0; + do + { /* generate digits in reverse order */ + s[i++] = n % 10 + '0'; /* get next digit */ + } while ((n /= 10) > 0) ; /* delete it */ + + if (sign < 0 ) + { + s[i++] = '-'; + } + + s[i] = '\0'; + + reverse( s ) ; +} + +#else + +extern char* itoa( int value, char *string, int radix ) +{ + return ltoa( value, string, radix ) ; +} + +extern char* ltoa( long value, char *string, int radix ) +{ + char tmp[33]; + char *tp = tmp; + long i; + unsigned long v; + int sign; + char *sp; + + if ( string == NULL ) + { + return 0 ; + } + + if (radix > 36 || radix <= 1) + { + return 0 ; + } + + sign = (radix == 10 && value < 0); + if (sign) + { + v = -value; + } + else + { + v = (unsigned long)value; + } + + while (v || tp == tmp) + { + i = v % radix; + v = v / radix; + if (i < 10) + *tp++ = i+'0'; + else + *tp++ = i + 'a' - 10; + } + + sp = string; + + if (sign) + *sp++ = '-'; + while (tp > tmp) + *sp++ = *--tp; + *sp = 0; + + return string; +} + +extern char* utoa( unsigned long value, char *string, int radix ) +{ + return ultoa( value, string, radix ) ; +} + +extern char* ultoa( unsigned long value, char *string, int radix ) +{ + char tmp[33]; + char *tp = tmp; + long i; + unsigned long v = value; + char *sp; + + if ( string == NULL ) + { + return 0; + } + + if (radix > 36 || radix <= 1) + { + return 0; + } + + while (v || tp == tmp) + { + i = v % radix; + v = v / radix; + if (i < 10) + *tp++ = i+'0'; + else + *tp++ = i + 'a' - 10; + } + + sp = string; + + + while (tp > tmp) + *sp++ = *--tp; + *sp = 0; + + return string; +} +#endif /* 0 */ + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus diff --git a/hardware/arduino/mtk/cores/arduino/itoa.h b/hardware/arduino/mtk/cores/arduino/itoa.h new file mode 100644 index 00000000..59af1094 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/itoa.h @@ -0,0 +1,42 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _ITOA_ +#define _ITOA_ + +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus + +#if 0 + +extern void itoa( int n, char s[] ) ; + +#else + +extern char* itoa( int value, char *string, int radix ) ; +extern char* ltoa( long value, char *string, int radix ) ; +extern char* utoa( unsigned long value, char *string, int radix ) ; +extern char* ultoa( unsigned long value, char *string, int radix ) ; +#endif /* 0 */ + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // _ITOA_ diff --git a/hardware/arduino/mtk/cores/arduino/main.cpp b/hardware/arduino/mtk/cores/arduino/main.cpp new file mode 100644 index 00000000..2691f7e8 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/main.cpp @@ -0,0 +1,95 @@ +/* + main.cpp - Main loop for Arduino sketches + Copyright (c) 2005-2013 Arduino Team. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#define ARDUINO_MAIN +#include "Arduino.h" +#include "vmsys.h" +#include "vmthread.h" +#include "vmpromng.h" +#include "vmlog.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +extern "C" void vm_thread_change_priority(VM_THREAD_HANDLE thread_handle, VMUINT32 new_priority); + +unsigned char* spi_w_data = NULL; +unsigned char* spi_r_data= NULL; +unsigned char* spi_data_memory= NULL; +vm_call_listener_func g_call_status_callback = NULL; + +void __handle_sysevt(VMINT message, VMINT param) +{ + //vm_log_info("receive msg = %d", message); + if(message == VM_MSG_ARDUINO_CALL) + { + msg_struct* pMsg = (msg_struct*)param; + if(pMsg->remote_func(pMsg->userdata)) + { + //vm_log_info("post signal"); + vm_signal_post(pMsg->signal); + } + return ; + } +} + +void __call_listener_func(vm_call_listener_data* data) +{ + if(g_call_status_callback) + { + g_call_status_callback(data); + } +} + +VMINT32 __arduino_thread(VM_THREAD_HANDLE thread_handle, void* user_data) +{ + init(); + + delay(1); + + //#if defined(USBCON) + // USBDevice.attach(); + //#endif + + setup(); + + for (;;) + { + loop(); + if (serialEventRun) serialEventRun(); + } +} + +/* + * \brief Main entry point of Arduino application + */ +void vm_main( void ) +{ + VM_THREAD_HANDLE handle; + spi_w_data = (unsigned char*)vm_malloc_nc(2); + spi_r_data = (unsigned char*)vm_malloc_nc(2); + spi_data_memory = (unsigned char*)vm_malloc_nc(64*1024); + memset(spi_data_memory,0, 64*1024); + vm_reg_sysevt_callback(__handle_sysevt); + vm_call_reg_listener(__call_listener_func); + handle = vm_thread_create(__arduino_thread, NULL, 0); + vm_thread_change_priority(handle, 245); +} + diff --git a/hardware/arduino/mtk/cores/arduino/message.h b/hardware/arduino/mtk/cores/arduino/message.h new file mode 100644 index 00000000..2e3cf153 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/message.h @@ -0,0 +1,44 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _MESSAGE_ +#define _MESSAGE_ +#include "arduino.h" +#include "vmsys.h" +#include "vmthread.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define VM_MSG_ARDUINO_CALL 3000 + +typedef boolean (*remote_call_ptr)(void* user_data); + +typedef struct _msg_struct +{ + VM_SIGNAL_ID signal; + remote_call_ptr remote_func; + void* userdata; +}msg_struct; + +#ifdef __cplusplus +} +#endif + +#endif /* _MESSAGE_ */ diff --git a/hardware/arduino/mtk/cores/arduino/syscalls.h b/hardware/arduino/mtk/cores/arduino/syscalls.h new file mode 100644 index 00000000..845b4b5d --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/syscalls.h @@ -0,0 +1,60 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/** + * \file syscalls.h + * + * Implementation of newlib syscall. + * + */ + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ +#include +#include +#include +#include + +/*---------------------------------------------------------------------------- + * Exported functions + *----------------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif + +extern caddr_t _sbrk( int incr ) ; + +extern int link( char *cOld, char *cNew ) ; + +extern int _close( int file ) ; + +extern int _fstat( int file, struct stat *st ) ; + +extern int _isatty( int file ) ; + +extern int _lseek( int file, int ptr, int dir ) ; + +extern int _read(int file, char *ptr, int len) ; + +extern int _write( int file, char *ptr, int len ) ; + +#ifdef __cplusplus +} +#endif + diff --git a/hardware/arduino/mtk/cores/arduino/syscalls_mtk.c b/hardware/arduino/mtk/cores/arduino/syscalls_mtk.c new file mode 100644 index 00000000..72d9d9e7 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/syscalls_mtk.c @@ -0,0 +1,222 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/** + * \file syscalls_mtk.c + * + * Implementation of newlib syscall. + * + */ + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + + +#include "syscalls.h" + +#include +#include +//#include "sam.h" +#if defined ( __GNUC__ ) /* GCC CS3 */ + #include + #include +#endif + +#include "vmsys.h" +#include "vmlog.h" +#include "vmdatetime.h" + +/*---------------------------------------------------------------------------- + * Exported variables + *----------------------------------------------------------------------------*/ + +#undef errno +extern int errno ; +extern int _end ; + +unsigned int g_size = 1024*200; +unsigned char * base_address = NULL; + +#define RESERVED_MEMORY_SIZE 270*1024 + +/*---------------------------------------------------------------------------- + * Exported functions + *----------------------------------------------------------------------------*/ +extern void _exit( int status ) ; +extern void _kill( int pid, int sig ) ; +extern int _getpid ( void ) ; + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_total_heap_size_t)(void); +_vm_get_total_heap_size_t _vm_get_total_heap_size = NULL; +VMUINT vm_get_total_heap_size(void) +{ + if (NULL == _vm_get_total_heap_size) + _vm_get_total_heap_size = (_vm_get_total_heap_size_t)vm_get_sym_entry((char*)"vm_get_total_heap_size"); + + if (NULL != _vm_get_total_heap_size) + return _vm_get_total_heap_size(); + return 0; +} + +typedef VMINT (*_vm_set_time_t)(vm_time_t* time); +_vm_set_time_t _vm_set_time = NULL; + +VMINT vm_set_time(vm_time_t* time) +{ + if (NULL == _vm_set_time) + _vm_set_time = (_vm_set_time_t)vm_get_sym_entry("vm_set_time"); + + if (NULL != _vm_set_time) + return _vm_set_time(time); + + return (VMINT )-1; +} + +extern caddr_t _sbrk ( int incr ) +{ + static unsigned char *heap = NULL ; + static unsigned char *base = NULL ; + unsigned char *prev_heap ; + + if ( heap == NULL ) + { + base = (unsigned char *)base_address; + if(base == NULL) + { + vm_log_fatal("malloc failed"); + } + else + { + heap = base; + vm_log_info("init memory success"); + } + } + + if (heap + incr > base + g_size) { + vm_log_fatal("memory not enough"); + } + + prev_heap = heap; + + heap += incr ; + + return (caddr_t) prev_heap ; +} + + +extern int link( char *cOld, char *cNew ) +{ + return -1 ; +} + +extern int _close( int file ) +{ + return -1 ; +} + +extern int _fstat( int file, struct stat *st ) +{ + st->st_mode = S_IFCHR ; + + return 0 ; +} + +extern int _isatty( int file ) +{ + return 1 ; +} + +extern int _lseek( int file, int ptr, int dir ) +{ + return 0 ; +} + +extern int _read(int file, char *ptr, int len) +{ + return 0 ; +} + +extern int _write( int file, char *ptr, int len ) +{ + return len ; +} + +extern void _exit( int status ) +{ + for ( ; ; ) ; +} + +extern void _kill( int pid, int sig ) +{ + return ; +} + +extern int _getpid ( void ) +{ + return -1 ; +} + +int __cxa_guard_acquire(int *g) {return !*(char *)(g);}; +void __cxa_guard_release (int *g) {*(char *)g = 1;}; + +typedef void (**__init_array) (void); + +void __libc_init_array(void); + +void gcc_entry(unsigned int entry, unsigned int init_array_start, unsigned int count) +{ + __init_array ptr; + int i; + VMUINT size = 0; + + vm_get_sym_entry = (vm_get_sym_entry_t)entry; + + size = vm_get_total_heap_size(); + + if(size == 0) + { + base_address = vm_malloc(g_size); + vm_log_info("defalut heap size = %d", g_size); + } + else + { + if(size > RESERVED_MEMORY_SIZE) + size -= RESERVED_MEMORY_SIZE; + + base_address = vm_malloc(size); + vm_log_info("heap size = %d", size); + g_size = size; +} + + vm_log_info("init lib arrays"); + + __libc_init_array(); + + ptr = (__init_array)init_array_start; + + for (i = 1; i < count; i++) + { + ptr[i](); + } + vm_main(); +} + diff --git a/hardware/arduino/mtk/cores/arduino/wiring.c b/hardware/arduino/mtk/cores/arduino/wiring.c new file mode 100644 index 00000000..ea6ca00c --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring.c @@ -0,0 +1,92 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "Arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +boolean no_interrupt = 1; + +uint32_t millis( void ) +{ +// todo: ensure no interrupts + return vm_get_tick_count() ; +} + +// Interrupt-compatible version of micros +// Theory: repeatedly take readings of SysTick counter, millis counter and SysTick interrupt pending flag. +// When it appears that millis counter and pending is stable and SysTick hasn't rolled over, use these +// values to calculate micros. If there is a pending SysTick, add one to the millis counter in the calculation. +uint32_t micros( void ) +{ + return vm_ust_get_current_time(); +} + +// original function: +// uint32_t micros( void ) +// { +// uint32_t ticks ; +// uint32_t count ; +// +// SysTick->CTRL; +// do { +// ticks = SysTick->VAL; +// count = GetTickCount(); +// } while (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk); +// +// return count * 1000 + (SysTick->LOAD + 1 - ticks) / (SystemCoreClock/1000000) ; +// } + + +void delay( uint32_t ms ) +{ + vm_thread_sleep(ms); +} + +void delayMicroseconds(uint32_t usec){ + VMUINT32 timeStop; + VMUINT32 timeStart; + VMUINT32 Freq = 0; + + timeStart = vm_ust_get_current_time(); + while( Freq < usec) + { + timeStop = vm_ust_get_current_time(); + Freq = timeStop - timeStart + 1; + } +} +void interrupts(void) +{ + no_interrupt = 0; +} + +void noInterrupts(void ) +{ + no_interrupt = 1; +} + +boolean noStopInterrupts(void) +{ + return no_interrupt; +} + +#ifdef __cplusplus +} +#endif diff --git a/hardware/arduino/mtk/cores/arduino/wiring.h b/hardware/arduino/mtk/cores/arduino/wiring.h new file mode 100644 index 00000000..e3a573bb --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring.h @@ -0,0 +1,139 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_ +#define _WIRING_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * + */ +extern void init( void ) ; + +/***************************************************************************** + * FUNCTION + * millis + * DESCRIPTION + * Time from returning to LinkIt to enable the current program to the present(unit:ms). + * PARAMETERS + * none + * RETURNS + * uint32_t:Time from LinkIt enabling the current program to the present in ms. + * EXAMPLE + * + * uint32_t t; + * void setup() + * { + * + * } + * void loop() + * { + * t = millis(); + * delay(2000); + * } + * +*****************************************************************************/ +extern uint32_t millis( void ) ; + +/***************************************************************************** + * FUNCTION + * micros + * DESCRIPTION + * Time from returning to LinkIt to enable the current program to the present(unit:us) + * PARAMETERS + * none + * RETURNS + * uint32_t:Time from LinkIt enabling the current program to the present in us. + * EXAMPLE + * + * uint32_t t; + * void setup() + * { + * + * } + * void loop() + * { + * t = micros(); + * delay(2000); + * } + * +*****************************************************************************/ +extern uint32_t micros( void ) ; + +/***************************************************************************** + * FUNCTION + * delay + * DESCRIPTION + * Pauses the program by setting up parameter to designate time to pause(unit:ms) + * PARAMETERS + * dwMs: Time to pause in ms + * RETURNS + * none + * EXAMPLE + * + * int led = 13; + * void setup() + * { + * pinMode(led,OUTPUT); + * } + * void loop() + * { + * digitalWrite(led,HIGH); + * delay(1000); + * digitalWrite(led,LOW); + * delay(1000); + * } + * +*****************************************************************************/ +extern void delay( uint32_t dwMs ) ; + +/***************************************************************************** + * FUNCTION + * delayMicroseconds + * DESCRIPTION + * Pauses the program by setting up parameter to designate time to pause(unit:us) + * PARAMETERS + * usec: Time to pause in us + * RETURNS + * none + * EXAMPLE + * + * int led = 13; + * void setup() + * { + * pinMode(led,OUTPUT); + * } + * void loop() + * { + * digitalWrite(led,HIGH); + * delayMicroseconds(1000); + * digitalWrite(led,LOW); + * delayMicroseconds(1000); + * } + * +*****************************************************************************/ +void delayMicroseconds(uint32_t usec); + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_ */ diff --git a/hardware/arduino/mtk/cores/arduino/wiring_analog.c b/hardware/arduino/mtk/cores/arduino/wiring_analog.c new file mode 100644 index 00000000..6b608169 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring_analog.c @@ -0,0 +1,304 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "Arduino.h" +#include "vmdcl.h" +#include "vmlog.h" +#include "vmdcl_adc.h" +#include "vmdcl_pwm.h" +#include "vmdcl_gpio.h" +#include "vmthread.h" +#include "vmsys.h" + +#ifdef __cplusplus +extern "C" { +#endif + +static int _readResolution = 10; +static int _writeResolution = 8; + +static VM_SIGNAL_ID signalid = 0; +static uint32_t adc_result = 0; + +#define PWM_RESOLUTION 8 + +#ifdef __LINKIT_V1__ +#define ADC_PIN_NUM 4 +#else +#define ADC_PIN_NUM 3 +#endif + +typedef struct _ADCPinDescription +{ + uint32_t ulPin; + uint32_t channel; +}ADCPinDescription; + +ADCPinDescription g_ADCPinArray[ADC_PIN_NUM] = +{ + { 14, 12 }, + { 15, 15 }, +#ifdef __LINKIT_V1__ + { 16, 13 }, + { 17, 14 } +#else + { 16, 13 } +#endif +}; + +/**/ +void analogReadResolution(int res) { + _readResolution = res; +} + +void analogWriteResolution(int res) { + _writeResolution = res; +} + +static inline uint32_t mapResolution(uint32_t value, uint32_t from, uint32_t to) { + if (from == to) + return value; + if (from > to) + return value >> (from-to); + else + return value << (to-from); +} + +long mapVolt(long x, long in_min, long in_max, long out_min, long out_max) +{ + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + +eAnalogReference analog_reference = AR_DEFAULT; + +void analogReference(eAnalogReference ulMode) +{ + analog_reference = ulMode;//only for compatiable, nouse. +} + +void adcCallback(void* parameter, VM_DCL_EVENT event, VM_DCL_HANDLE device_handle) +{ + VM_DCL_CB_ILM_DATA_T *data; + vm_bmt_adc_measure_done_conf_struct * result; + + if(parameter!=NULL) + { + data = (VM_DCL_CB_ILM_DATA_T*)parameter; + result = (vm_bmt_adc_measure_done_conf_struct *)(data->vm_local_para_ptr); + + if( result != NULL ) + { + double *p; + + p =(double*)&(result->adc_value); + + adc_result = (unsigned int)*p; + //vm_log_info("analogRead_callback:the result is:adc_result=%d;",adc_result); + } + } + + vm_signal_post(signalid); + +} + +uint32_t findADCChannel(uint32_t ulPin) +{ + int i; + + for(i = 0; i906) + adc_result = 906; + + adc_result = mapVolt(adc_result, 0, 906, 0, 1023); + + return adc_result; + +} + +void analogOutputInit(void) { + return; +} + +void analogWrite(uint32_t ulPin, uint32_t ulValue) { + + VM_DCL_HANDLE pwm_handle; + + if(ulPin == 9) + { + VM_PWM_SET_CLOCK_T pwm_clock; + VM_PWM_SET_COUNTER_THRESHOLD_T pwm_config_adv; + + if(!changePinType(ulPin, PIO_PWM, &pwm_handle)) + return; + + if(pwm_handle == VM_DCL_HANDLE_INVALID) + { + pwm_handle = vm_dcl_open(VM_DCL_PWM4,vm_dcl_get_ownerid()); + vm_dcl_control(pwm_handle,VM_PWM_CMD_START,0); + setPinHandle(ulPin, pwm_handle); + } + + pwm_config_adv.counter = 1022; + pwm_config_adv.threshold = ulValue; + pwm_clock.source_clk = 1; + pwm_clock.source_clk_div =1; + vm_dcl_control(pwm_handle,VM_PWM_CMD_SET_CLK,(void *)(&pwm_clock)); + vm_dcl_control(pwm_handle,VM_PWM_CMD_SET_COUNTER_AND_THRESHOLD,(void *)(&pwm_config_adv)); + } + else if(ulPin == 3) + { + VM_PWM_SET_CLOCK_T pwm_clock; + VM_PWM_SET_COUNTER_THRESHOLD_T pwm_config_adv; + + if(!changePinType(ulPin, PIO_PWM, &pwm_handle)) + return; + + if(pwm_handle == VM_DCL_HANDLE_INVALID) + { + pwm_handle = vm_dcl_open(VM_DCL_PWM1,vm_dcl_get_ownerid()); + vm_dcl_control(pwm_handle,VM_PWM_CMD_START,0); + setPinHandle(ulPin, pwm_handle); + } + + pwm_config_adv.counter = 1022; + pwm_config_adv.threshold = ulValue; + pwm_clock.source_clk = 1; + pwm_clock.source_clk_div =1; + vm_dcl_control(pwm_handle,VM_PWM_CMD_SET_CLK,(void *)(&pwm_clock)); + vm_dcl_control(pwm_handle,VM_PWM_CMD_SET_COUNTER_AND_THRESHOLD,(void *)(&pwm_config_adv)); + } + else + { + pinMode(ulPin, OUTPUT); + + if (ulValue < 128) + digitalWrite(ulPin, LOW); + else + digitalWrite(ulPin, HIGH); + } + +} + + +void analogWriteAdvance(uint32_t ulPin, uint32_t ulClock, uint32_t ulDiv, uint32_t ulCycle, uint32_t ulDuty ) +{ + VM_DCL_HANDLE pwm_handle; + + if(ulPin == 9) + { + VM_PWM_SET_CLOCK_T pwm_clock; + VM_PWM_SET_COUNTER_THRESHOLD_T pwm_config_adv; + + if(!changePinType(ulPin, PIO_PWM, &pwm_handle)) + return; + + if(pwm_handle == VM_DCL_HANDLE_INVALID) + { + pwm_handle = vm_dcl_open(VM_DCL_PWM4,vm_dcl_get_ownerid()); + vm_dcl_control(pwm_handle,VM_PWM_CMD_START,0); + setPinHandle(ulPin, pwm_handle); + } + + pwm_clock.source_clk = ulClock; + pwm_clock.source_clk_div = ulDiv; + pwm_config_adv.counter = ulCycle; + pwm_config_adv.threshold = ulDuty; + vm_dcl_control(pwm_handle,VM_PWM_CMD_SET_CLK,(void *)(&pwm_clock)); + vm_dcl_control(pwm_handle,VM_PWM_CMD_SET_COUNTER_AND_THRESHOLD,(void *)(&pwm_config_adv)); + } + if(ulPin == 3) + { + VM_PWM_SET_CLOCK_T pwm_clock; + VM_PWM_SET_COUNTER_THRESHOLD_T pwm_config_adv; + + if(!changePinType(ulPin, PIO_PWM, &pwm_handle)) + return; + + if(pwm_handle == VM_DCL_HANDLE_INVALID) + { + pwm_handle = vm_dcl_open(VM_DCL_PWM1,vm_dcl_get_ownerid()); + vm_dcl_control(pwm_handle,VM_PWM_CMD_START,0); + setPinHandle(ulPin, pwm_handle); + } + + pwm_clock.source_clk = ulClock; + pwm_clock.source_clk_div = ulDiv; + pwm_config_adv.counter = ulCycle; + pwm_config_adv.threshold = ulDuty; + vm_dcl_control(pwm_handle,VM_PWM_CMD_SET_CLK,(void *)(&pwm_clock)); + vm_dcl_control(pwm_handle,VM_PWM_CMD_SET_COUNTER_AND_THRESHOLD,(void *)(&pwm_config_adv)); + } +} + +#ifdef __cplusplus +} +#endif diff --git a/hardware/arduino/mtk/cores/arduino/wiring_analog.h b/hardware/arduino/mtk/cores/arduino/wiring_analog.h new file mode 100644 index 00000000..6c7112d4 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring_analog.h @@ -0,0 +1,171 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_ANALOG_ +#define _WIRING_ANALOG_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* DOM-NOT_FOR_SDK-BEGIN */ +/* + * \brief SAM3 products have only one reference for ADC + */ +typedef enum _eAnalogReference +{ + AR_DEFAULT, +} eAnalogReference ; + +#define PWM_SOURCE_CLOCK_13MHZ 0x00 +#define PWM_SOURCE_CLOCK_32KHZ 0x01 + +#define PWM_CLOCK_DIV1 0x00 +#define PWM_CLOCK_DIV2 0x01 +#define PWM_CLOCK_DIV4 0x02 +#define PWM_CLOCK_DIV8 0x03 + +/* + * \brief Configures the reference voltage used for analog input (i.e. the value used as the top of the input range). + * This function is kept only for compatibility with existing AVR based API. + * + * \param ulMmode Should be set to AR_DEFAULT. + */ +extern void analogReference( eAnalogReference ulMode ) ; + +/* + * \brief Set the resolution of analogRead return values. Default is 10 bits (range from 0 to 1023). + * + * \param res + */ +extern void analogReadResolution(int res); + +/* + * \brief Set the resolution of analogWrite parameters. Default is 8 bits (range from 0 to 255). + * + * \param res + */ +extern void analogWriteResolution(int res); + +extern void analogOutputInit( void ) ; +/* DOM-NOT_FOR_SDK-END */ + + /***************************************************************************** + * FUNCTION + * analogWrite + * DESCRIPTION + * Outputs analog value(PWM wave)to the assigned analog output pin. + * PARAMETERS + * ulPin : [IN] Analog output pin number; 8, 9 + * ulValue : [IN] duty cycle,0~1023 + * RETURNS + * void + * EXAMPLE + * + * uint32_t analogPin = 9; + * void setup() + * {} + * void loop() + * { + * analogWrite(analogPin,128); + * } + * +*****************************************************************************/ +extern void analogWrite( uint32_t ulPin, uint32_t ulValue ); + + /***************************************************************************** + * FUNCTION + * analogWriteAdvance + * DESCRIPTION + * Outputs analog value (PWM wave) to the assigned analog output pin. + * Note: Only the analog output pins D8 and D9 support analog output. + * You can define your own PWM output wave accuracy (max. 13-bit) and frequency in this function. + * PARAMETERS + * ulPin : [IN] analog output pin number; 8, 9 + * ulClock : [IN] define base clock frequency, can be PWM_SOURCE_CLOCK_13MHZ or PWM_SOURCE_CLOCK_32KHZ + * ulDiv : [IN] define clock frequency divider, can be PWM_CLOCK_DIV1, PWM_CLOCK_DIV2, PWM_CLOCK_DIV4 or PWM_CLOCK_DIV8 + * ulCycle : [IN] the cycle, between 0 and 8191 + * ulDuty : [IN] the duty cycle,between 0 and 8191, but must be smaller than cycle + * RETURNS + * void + * EXAMPLE + * + * uint32_t pwmPin = 9; // use Digital pin D9 + * + * int cycle = 9; // Divide output into 9+1 = 10 portions + * int sourceClock = PWM_SOURCE_CLOCK_13MHZ; // + * int divider = PWM_CLOCK_DIV8; // The PWM frequency will be 13MHz / 8 / 10 = 162.5KHz + * + * int duty = 0; + * int offset = 1; + * + * void setup() + * { + * pinMode(pwmPin, OUTPUT); + * } + * + * void loop() + * { + * analogWriteAdvance(pwmPin, sourceClock, divider, cycle, duty); + * + * duty += offset; + * if (duty == cycle) + * { + * offset = -1; + * } + * else if(duty == 0) + * { + * offset = 1; + * } + * delay(1000); + * } + * +*****************************************************************************/ +extern void analogWriteAdvance(uint32_t pin, uint32_t sourceClock, uint32_t clockDivider, uint32_t cycle, uint32_t dutyCycle); + +/***************************************************************************** + * FUNCTION + * analogRead + * DESCRIPTION + * Reads the value of an assigned analog input pin. + * PARAMETERS + * ulPin : [IN] Analog input pin number to be read;A0,A1,A2 or A3 + * RETURNS + * uint32_t:0 to 1023 + * EXAMPLE + * + * uint32_t analogPin = A0; + * uint32_t readVal = 0; + * void setup() + * { + * Serial.begin(9600); + * } + * void loop() + * { + * readVal = analogRead(analogPin); + * Serial.println(readVal); + * } + * +*****************************************************************************/ +extern uint32_t analogRead( uint32_t ulPin ) ; + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_ANALOG_ */ diff --git a/hardware/arduino/mtk/cores/arduino/wiring_constants.h b/hardware/arduino/mtk/cores/arduino/wiring_constants.h new file mode 100644 index 00000000..8ec9f6c0 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring_constants.h @@ -0,0 +1,275 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_CONSTANTS_ +#define _WIRING_CONSTANTS_ + +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus + +/* DOM-NOT_FOR_SDK-BEGIN */ +#define HIGH 0x1 +#define LOW 0x0 + +#define INPUT 0x0 +#define OUTPUT 0x1 +#define INPUT_PULLUP 0x2 + +#define true 0x1 +#define false 0x0 + +#define PI 3.1415926535897932384626433832795 +#define HALF_PI 1.5707963267948966192313216916398 +#define TWO_PI 6.283185307179586476925286766559 +#define DEG_TO_RAD 0.017453292519943295769236907684886 //»¡¶Èת½Ç¶È +#define RAD_TO_DEG 57.295779513082320876798154814105 //½Ç¶Èת»¡¶È +#define EULER 2.718281828459045235360287471352 + +#define SERIAL 0x0 +#define DISPLAY 0x1 + +enum BitOrder { + LSBFIRST = 0, + MSBFIRST = 1 +}; + +// LOW 0 +// HIGH 1 +#define CHANGE 2 +#define FALLING 3 +#define RISING 4 + +#define DEFAULT 1 +#define EXTERNAL 0 + +// undefine stdlib's abs if encountered +#ifdef abs +#undef abs +#endif // abs +/* DOM-NOT_FOR_SDK-END */ + +#ifndef min +/***************************************************************************** + * + * FUNCTION + * min + * DESCRIPTION + * Calculates the minimum of two numbers. + * PARAMETERS + * x: the first number, any data type + * y: the second number, any data type + * RETURNS + * The smaller of the two numbers. + * RETURN VALUES + * depend on input value + *****************************************************************************/ +#define min(a,b) ((a)<(b)?(a):(b)) +#endif // min + +#ifndef max +/***************************************************************************** + * + * FUNCTION + * max + * DESCRIPTION + * Calculates the maximum of two numbers. + * PARAMETERS + * x: the first number, any data type + * y: the second number, any data type + * RETURNS + * The larger of the two numbers. + * RETURN VALUES + * depend on input value + *****************************************************************************/ +#define max(a,b) ((a)>(b)?(a):(b)) +#endif // max + +/***************************************************************************** + * + * FUNCTION + * abs + * DESCRIPTION + * Computes the absolute value of a number. + * PARAMETERS + * x: the number + * RETURNS + * x: if x is greater than or equal to 0. + * -x: if x is less than 0. + * RETURN VALUES + * depend on input value + *****************************************************************************/ +#define abs(x) ((x)>0?(x):-(x)) + +/***************************************************************************** + * + * FUNCTION + * constrain + * DESCRIPTION + * Constrains a number to be within a range. + * PARAMETERS + * x: the number to constrain, all data types + * a: the lower end of the range, all data types + * b: the upper end of the range, all data types + * RETURNS + * x: if x is between a and b + * a: if x is less than a + * b: if x is greater than b + * RETURN VALUES + * depend on input value + *****************************************************************************/ +#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) + +/* DOM-NOT_FOR_SDK-BEGIN */ +#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) //ËÄÉáÎåÈë +#define radians(deg) ((deg)*DEG_TO_RAD) // ½Ç¶Èת»¡¶È +#define degrees(rad) ((rad)*RAD_TO_DEG) //»¡¶Èת½Ç¶È +#define sq(x) ((x)*(x)) //ƽ·½ +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** + * FUNCTION + * lowByte + * DESCRIPTION + * Extracts the high-order (leftmost) byte of a word (or the second lowest byte of a larger data type). + * PARAMETERS + * x: a value of any type + * RETURNS + * byte + * RETURN VALUES + * depend on input value + *****************************************************************************/ +#define lowByte(w) ((uint8_t) ((w) & 0xff)) + +/***************************************************************************** + * FUNCTION + * highByte + * DESCRIPTION + * Extracts the high-order (leftmost) byte of a word (or the second lowest byte of a larger data type). + * PARAMETERS + * x: a value of any type + * RETURNS + * byte + * RETURN VALUES + * depend on input value + *****************************************************************************/ +#define highByte(w) ((uint8_t) ((w) >> 8)) + +/***************************************************************************** + * FUNCTION + * bitRead + * DESCRIPTION + * Reads a bit of a number. + * PARAMETERS + * x: the number from which to read + * n: which bit to read, starting at 0 for the least-significant (rightmost) bit + * RETURNS + * the value of the bit (0 or 1). + * RETURN VALUES + * depend on input value + *****************************************************************************/ +#define bitRead(value, bit) (((value) >> (bit)) & 0x01) + +/***************************************************************************** + * FUNCTION + * bitSet + * DESCRIPTION + * Sets (writes a 1 to) a bit of a numeric variable. + * PARAMETERS + * x: the numeric variable whose bit to set + * n: which bit to set, starting at 0 for the least-significant (rightmost) bit + * RETURNS + * none + *****************************************************************************/ +#define bitSet(value, bit) ((value) |= (1UL << (bit))) + +/***************************************************************************** + * FUNCTION + * bitClear + * DESCRIPTION + * Clears (writes a 0 to) a bit of a numeric variable. + * PARAMETERS + * x: the numeric variable whose bit to clear + * n: which bit to clear, starting at 0 for the least-significant (rightmost) bit + * RETURNS + * none + *****************************************************************************/ +#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) + +/***************************************************************************** + * FUNCTION + * bitWrite + * DESCRIPTION + * Writes a bit of a numeric variable. + * PARAMETERS + * x: the numeric variable to which to write + * n: which bit of the number to write, starting at 0 for the least-significant (rightmost) bit + * b: the value to write to the bit (0 or 1) + * RETURNS + * the value of the bit + * RETURN VALUES + * depend on input value + *****************************************************************************/ +#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) + +/* DOM-NOT_FOR_SDK-BEGIN */ +typedef unsigned int word; +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** + * FUNCTION + * bit + * DESCRIPTION + * Computes the value of the specified bit (bit 0 is 1, bit 1 is 2, bit 2 is 4, etc.). + * PARAMETERS + * b: the bit whose value to compute + * RETURNS + * the value of the bit + * RETURN VALUES + * depend on input value + *****************************************************************************/ +#define bit(b) (1UL << (b)) + +/***************************************************************************** + * FUNCTION + * _BV + * DESCRIPTION + * Converts a bit number into a byte value, same with bit. + * he bit shift is performed by the compiler which then inserts the + * result into the code. Thus, there is no run-time overhead when using + * PARAMETERS + * bit: the bit whose value to compute + * RETURNS + * the value of the bit + * RETURN VALUES + * depend on input value + *****************************************************************************/ +#define _BV(bit) (1 << (bit)) + +/* DOM-NOT_FOR_SDK-BEGIN */ +// TODO: to be checked +typedef uint8_t boolean ; +typedef uint8_t byte ; +/* DOM-NOT_FOR_SDK-END */ + + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif /* _WIRING_CONSTANTS_ */ diff --git a/hardware/arduino/mtk/cores/arduino/wiring_digital.c b/hardware/arduino/mtk/cores/arduino/wiring_digital.c new file mode 100644 index 00000000..2c9562b7 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring_digital.c @@ -0,0 +1,149 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "Arduino.h" +#include "vmdcl.h" +#include "vmdcl_gpio.h" +#include "Vmlog.h" + +#ifdef __cplusplus + extern "C" { +#endif + +extern void pinMode( uint32_t ulPin, uint32_t ulMode ) +{ + VM_DCL_HANDLE gpio_handle; + vm_gpio_ctrl_set_pupd_r0_r1_t pupd; + //vm_log_info("pinMode(): pin = %d , pin_internal = %d, mode = %d", ulPin, g_APinDescription[ulPin].ulGpioId, ulMode); + + if(!changePinType(ulPin, PIO_DIGITAL, &gpio_handle)) + return; + + if(gpio_handle == VM_DCL_HANDLE_INVALID) + gpio_handle = vm_dcl_open(VM_DCL_GPIO, g_APinDescription[ulPin].ulGpioId); + + // set PIN direction + switch ( ulMode ) + { + case INPUT: + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_DIR_IN, NULL); + + if( g_APinDescription[ulPin].ulPupd) + { + pupd.fgSetPupd = 0; + pupd.fgSetR0 = 1; + pupd.fgSetR1 = 0; + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_PUPD_R0_R1, &pupd); + } + else + { + vm_dcl_control(gpio_handle,VM_GPIO_CMD_ENABLE_PULL, NULL); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_PULL_LOW, NULL); + } + break ; + + case INPUT_PULLUP: + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_DIR_IN, NULL); + + if( g_APinDescription[ulPin].ulPupd) + { + pupd.fgSetPupd = 1; + pupd.fgSetR0 = 1; + pupd.fgSetR1 = 0; + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_PUPD_R0_R1, &pupd); + } + else + { + vm_dcl_control(gpio_handle,VM_GPIO_CMD_ENABLE_PULL, NULL); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_PULL_HIGH, NULL); + } + break ; + + case OUTPUT: + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_DIR_OUT, NULL); + break ; + + default: + break ; + } + + g_APinDescription[ulPin].ulHandle = gpio_handle; + +} + +extern void digitalWrite( uint32_t ulPin, uint32_t ulVal ) +{ + //vm_log_info("digitalWrite(): pin = %d , value = %d", ulPin, ulVal); + + if (ulPin > PIO_MAX_NUM ) + { + return; + } + + // write PIN + switch (ulVal) + { + case HIGH: + vm_dcl_control(g_APinDescription[ulPin].ulHandle,VM_GPIO_CMD_WRITE_HIGH, NULL); + break; + + case LOW: + vm_dcl_control(g_APinDescription[ulPin].ulHandle,VM_GPIO_CMD_WRITE_LOW, NULL); + break; + + default: + break; + } + +} + +extern int digitalRead( uint32_t ulPin ) +{ + vm_gpio_ctrl_read_t data; + + //vm_log_info("digitalRead(): pin = %d", ulPin); + + if (ulPin > PIO_MAX_NUM ) + { + //vm_log_info("digitalRead(): pin mapping failed, return LOW as default."); + return LOW; + } + + vm_dcl_control(g_APinDescription[ulPin].ulHandle, VM_GPIO_CMD_READ,(void *)&data); + + if ( data.u1IOData == VM_GPIO_IO_LOW ) + { + //vm_log_info("digitalRead(): result = LOW"); + return LOW ; + } + else if ( data.u1IOData == VM_GPIO_IO_HIGH ) + { + //vm_log_info("digitalRead(): result = HIGH"); + return HIGH ; + } + else + { + //vm_log_info("digitalRead(): read failed, return LOW as default."); + return LOW ; + } +} + +#ifdef __cplusplus +} +#endif + diff --git a/hardware/arduino/mtk/cores/arduino/wiring_digital.h b/hardware/arduino/mtk/cores/arduino/wiring_digital.h new file mode 100644 index 00000000..95715cb8 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring_digital.h @@ -0,0 +1,116 @@ +/* + * digital I/O for Arduino Due + * Copyright (c) 2011 Cristian Maglie . + * All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef _WIRING_DIGITAL_ +#define _WIRING_DIGITAL_ + +#ifdef __cplusplus + extern "C" { +#endif + + // DESCRIPTION + // Sets up modes for assigned pins. + // LinkIt One supports 3 pin modes: + // INPUT: Used for reading voltage (HIGH or LOW) or sensor. In INPUT mode when the circuit is at high impedance, similar to serially connecting a big resistance in the circuit, the pin can read accurate voltage value. However, this pin may not have enough voltage to activate peripheral devices, e.g. LED. + // INPUT_PULLUP: Similar to INPUT mode, used for reading voltage of sensor. However in this mode, the pin is often at high voltage when the sensor is disabled and turns to low voltage when the sensor is enabled, which is opposite to its behavior in INPUT mode. + // OUTPUT: Used for controlling peripheral devices. In OUTPUT mode when the circuit is at low impedance, the pin has enough voltage to activate or control other devices but cannot read the voltage of sensor. + // RETURNS + // N/A + // EXAMPLE + // + // #define LED 13 + // void setup() + // { + // pinMode(LED, OUTPUT); + // } + // void loop() + // { + // digitalWrite(LED, HIGH); + // delay(3000); + // digitalWrite(LED, LOW); + // delay(3000); + // } + // +extern void pinMode( + uint32_t dwPin, // [IN] Pin number that needs to be set with a mode + uint32_t dwMode // [IN] Mode of pin (INPUT, INPUT_PULLUP or OUTPUT) + ) ; + + // DESCRIPTION + // Sets assigned pins to high voltage (3.3V) or low voltage (0V). + // RETURNS + // N/A + // EXAMPLE + // + // #define LED 13 + // void setup() + // { + // pinMode(LED, OUTPUT); + // } + // void loop() + // { + // digitalWrite(LED, HIGH); + // delay(3000); + // digitalWrite(LED, LOW); + // delay(3000); + // } + // +extern void digitalWrite( + uint32_t dwPin, // [IN] Pin number that needs to be set with a value + uint32_t dwVal // [IN] HIGH or LOW + ) ; + + // DESCRIPTION + // Reads voltage of assigned pin, HIGH or LOW. + // RETURNS + // HIGH or LOW + // EXAMPLE + // + // #define LED 13 + // #define BUTTON 16 + // void setup() + // { + // pinMode(LED, OUTPUT); + // pinMode(BUTTON, INPUT); + // } + // void loop() + // { + // int result = 0; + // int n= digitalRead(BUTTON); + // if (n == HIGH) + // { + // digitalWrite(LED, LOW); + // delay(2000); + // } + // else + // { + // digitalWrite(LED, HIGH); + // delay(2000); + // } + // } + // +extern int digitalRead( + uint32_t ulPin // [IN] Pin number that needs to read voltage + ) ; + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_DIGITAL_ */ diff --git a/hardware/arduino/mtk/cores/arduino/wiring_private.h b/hardware/arduino/mtk/cores/arduino/wiring_private.h new file mode 100644 index 00000000..573da03d --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring_private.h @@ -0,0 +1,42 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef WiringPrivate_h +#define WiringPrivate_h + +#include +#include +#include + +#ifdef __cplusplus +extern "C"{ +#endif + +// Includes Atmel CMSIS +#include + +#include "wiring_constants.h" + +#ifdef __cplusplus +} // extern "C" + +#include "HardwareSerial.h" + +#endif + +#endif diff --git a/hardware/arduino/mtk/cores/arduino/wiring_pulse.cpp b/hardware/arduino/mtk/cores/arduino/wiring_pulse.cpp new file mode 100644 index 00000000..89b80175 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring_pulse.cpp @@ -0,0 +1,67 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "Arduino.h" +#include "wiring_private.h" +#include "Vmlog.h" + +/* Measures the length (in microseconds) of a pulse on the pin; state is HIGH + * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds + * to 3 minutes in length, but must be called at least a few dozen microseconds + * before the start of the pulse. */ +uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) +{ + uint32_t init_time = micros(); + uint32_t curr_time = init_time; + uint32_t max_time = init_time + timeout; + int pin_state = 0; + + /* read GPIO info */ + pin_state = digitalRead(pin); + + // wait for any previous pulse to end + while ((pin_state == state) && (curr_time < max_time)) + { + curr_time = micros(); + pin_state = digitalRead(pin); + } + + // wait for the pulse to start + while ((pin_state != state) && (curr_time < max_time)) + { + curr_time = micros(); + init_time = curr_time; + pin_state = digitalRead(pin); + } + + // wait for the pulse to stop + while ((pin_state == state) && (curr_time < max_time)) + { + curr_time = micros(); + pin_state = digitalRead(pin); + } + + if (curr_time < max_time) + { + return (curr_time - init_time); + } + else + { + return 0; + } +} diff --git a/hardware/arduino/mtk/cores/arduino/wiring_pulse.h b/hardware/arduino/mtk/cores/arduino/wiring_pulse.h new file mode 100644 index 00000000..e2cfae84 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring_pulse.h @@ -0,0 +1,56 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_PULSE_ +#define _WIRING_PULSE_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include + +// DESCRIPTION +// Duration of acquiring voltage (HIGH or LOW) of a pin. The accuracy is us; range is approx. 10us to 3 mins. +// RETURNS +// N/A +// EXAMPLE +// +// #define BUTTON 13 +// unsigned long duration; +// void setup() +// { +// pinMode(BUTTON, INPUT); +// } +// void loop() +// { +// duration = pulseIn(BUTTON, HIGH); +// } +// +uint32_t pulseIn( + uint32_t ulPin, // [IN] Pin number measured + uint32_t ulState, // [IN] Voltage type measured (HIGH or LOW) + uint32_t ulTimeout = 1000000L // [IN] The longest time allowed by the function before the measurement starts; unit: us (If not set, default will be 1s.) + ) ; + + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_PULSE_ */ diff --git a/hardware/arduino/mtk/cores/arduino/wiring_shift.c b/hardware/arduino/mtk/cores/arduino/wiring_shift.c new file mode 100644 index 00000000..670fd246 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring_shift.c @@ -0,0 +1,71 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "Arduino.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +uint32_t shiftIn( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder ) +{ + uint8_t value = 0 ; + uint8_t i ; + + for ( i = 0 ; i < 8 ; ++i ) + { + digitalWrite( ulClockPin, HIGH); + + if ( ulBitOrder == LSBFIRST ) + { + value |= digitalRead( ulDataPin ) << i; + } + else + { + value |= digitalRead( ulDataPin ) << (7 - i); + } + + digitalWrite( ulClockPin, LOW ) ; + } + + return value ; +} + +void shiftOut( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder, uint32_t ulVal ) +{ + uint8_t i ; + + for ( i=0 ; i < 8 ; i++ ) + { + if ( ulBitOrder == LSBFIRST ) + { + digitalWrite( ulDataPin, !!(ulVal & (1 << i)) ) ; + } + else + { + digitalWrite( ulDataPin, !!(ulVal & (1 << (7 - i))) ) ; + } + + digitalWrite( ulClockPin, HIGH ) ; + digitalWrite( ulClockPin, LOW ) ; + } +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/hardware/arduino/mtk/cores/arduino/wiring_shift.h b/hardware/arduino/mtk/cores/arduino/wiring_shift.h new file mode 100644 index 00000000..a48aae90 --- /dev/null +++ b/hardware/arduino/mtk/cores/arduino/wiring_shift.h @@ -0,0 +1,90 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_SHIFT_ +#define _WIRING_SHIFT_ + +#ifdef __cplusplus + extern "C" { +#endif + +// DESCRIPTION +// Reads data of a byte by bits on the assigned pin. +// Every bit of data is read from the data pin. +// You can select to combine the read 8-bit data into a byte from MSB or LSB. +// Every clock cycle (meaning the clock goes through a complete high voltage and low voltage) reads a bit of data; every bit of data is read when the clock signal is at high voltage. +// RETURNS +// Data read (one byte) +// EXAMPLE +// +// #define DATA 13 +// #define CLOCK 15 +// void setup() +// { +// pinMode(DATA, INPUT); +// pinMode(CLOCK, OUTPUT); +// } +// void loop() +// { +// byte data; +// data = shiftIn(DATA, CLOCK, LSBFIRST); +// delay(1000); +// } +// +extern uint32_t shiftIn( + uint32_t ulDataPin, // [IN] Data input pin, for reading every bit of data + uint32_t ulClockPin, // [IN] Clock pin. Periodically switches between high voltage and low voltage when dataPin outputs data + uint32_t ulBitOrder // [IN] Data input order. Can be MSBFIRST (MSB first) or LSBFIRST (LSB first) + ) ; + + +// DESCRIPTION +// Outputs a byte of data by bits on the assigned pin. +// Every bit of data is outputted from the data pin. +// You can select to start output from MSB or LSB of the data. +// Every clock cycle (meaning the clock goes through a complete high voltage and low voltage) outputs a bit of data. +// RETURNS +// N/A +// EXAMPLE +// +// #define DATA 13 +// #define CLOCK 15 +// void setup() +// { +// pinMode(DATA, INPUT); +// pinMode(CLOCK, OUTPUT); +// } +// void loop() +// { +// shiftOut(DATA, CLOCK, LSBFIRST, 100); +// delay(1000); +// } +// +extern void shiftOut( + uint32_t ulDataPin, // [IN] Data output pin, for outputting every bit of data + uint32_t ulClockPin, // [IN] Clock pin. Periodically switches between high voltage and low voltage when dataPin outputs data + uint32_t ulBitOrder, // [IN] Data output order. Can be MSBFIRST (MSB first) or LSBFIRST (LSB first) + uint32_t ulVal // [IN] Value to be outputted by bits (one byte) + ) ; + + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_SHIFT_ */ diff --git a/hardware/arduino/mtk/libraries/LAudio/LAudio.cpp b/hardware/arduino/mtk/libraries/LAudio/LAudio.cpp new file mode 100644 index 00000000..310ead31 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LAudio/LAudio.cpp @@ -0,0 +1,111 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include +#include +#include "vmsys.h" +#include "vmmm.h" +#include "vmchset.h" +#include "vmstdlib.h" +#include "LAudio.h" +#include "audio.h" + +static int status_result = 0 ; + +void LAudioClass::onCallback(int result) { + status_result = result; +} + +void LAudioClass::playFile(StorageEnum drv, char *songName) +{ + strcpy((char*)m_path, songName); + m_drv = drv; + m_type = true; + remoteCall(audioPlay, (void*)this->onCallback); +} + +void LAudioClass::playFile(StorageEnum drv, wchar_t* songName) +{ + wcscpy((wchar_t*)m_path, songName); + m_drv = drv; + m_type = false; + remoteCall(audioPlay, (void*)this->onCallback); +} + +void LAudioClass::setVolume(unsigned char volume){ + m_volume = volume; + remoteCall(audioSetVolume, NULL); +} + +void LAudioClass::pause(){ + remoteCall(audioPause, NULL); +} + +void LAudioClass::resume(){ + remoteCall(audioResume, NULL); +} + +void LAudioClass::stop(){ + remoteCall(audioStop, NULL); +} + +AudioStatus LAudioClass::getStatus(){ + AudioStatus status = (AudioStatus)status_result; + status_result = 0; + return status; +} + +VMSTR LAudioClass::getFile(){ + return m_path; +} + +unsigned char LAudioClass::getVolume(){ + return m_volume; +} + +char LAudioClass::getDriver() +{ + return m_drv; +} + +boolean LAudioClass::getType() +{ + return m_type; +} + +//void setPlayMode(playMode_t playmode) { _playmode = playmode;} + + +LAudioClass LAudio; + diff --git a/hardware/arduino/mtk/libraries/LAudio/LAudio.h b/hardware/arduino/mtk/libraries/LAudio/LAudio.h new file mode 100644 index 00000000..d6151116 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LAudio/LAudio.h @@ -0,0 +1,154 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef _LAUDIO_H +#define _LAUDIO_H + +#include "chip.h" +#include "vmsys.h" +#include "LTask.h" +#include "arduino.h" + +// playing status +typedef enum +{ + AudioCommonFailed = -1, // Playback fails (e.g. the audio file is corrupted). + AudioStop = 1, // Playback is stopped. + AudioPause = 2, // Playback is paused (and can resume). + AudioResume = 3, // Playback resumes + AudioEndOfFile = 5 // Playback is finished. +}AudioStatus; + +// storage location +typedef enum +{ + storageFlash, // Flash + storageSD // SD +}StorageEnum; + +// LAudio class interface +class LAudioClass : public _LTaskClass { + +// Constructor / Destructor +public: + LAudioClass() { }; + +public: + // DESCRIPTION + // Plays an audio file on SD card or flash storage. + // RETURNS + // N/A + // EXAMPLE + // + // #include + // void setup() + // { + // LAudio.begin(); + // LAudio.playFile(storageFlash, (char*)"sample.mp3"); + // LAudio.setVolume(2); + // delay(2000); + // LAudio.pause(); + // delay(2000); + // LAudio.resume(); + // delay(2000); + // LAudio.stop(); + // } + // + void playFile( + StorageEnum drv, // [IN] Storage, can be storageSD (SD card) or storageFlash (flash storage) + char *songName // [IN] Path of audio file in ascii (char*) + ); + + // DESCRIPTION + // Plays an audio file on SD card or flash storage. + // RETURNS + // N/A + void playFile( + StorageEnum drv, // [IN] Storage, can be storageSD (SD card) or storageFlash (flash storage) + wchar_t* songName // [IN] Path of audio file in unicode (wchar_t*) encoding + ); + + // DESCRIPTION + // Adjusts the playback volume; range is from 0 (silent) to 6 (max). + // RETURNS + // N/A + void setVolume( + unsigned char volume // [IN] Volume level, can be 0 to 6; 0 as silent and 6 as max volume + ); + + // DESCRIPTION + // Pauses the playback. It only works when there is an active playback ongoing (by playFile()). + // RETURNS + // N/A + void pause(void); + + // DESCRIPTION + // Resumes playback. It only works when the playback has been paused. + // RETURNS + // N/A + void resume(void); + + // DESCRIPTION + // Stops playback. + // RETURNS + // N/A + void stop(void); + + // DESCRIPTION + // Queries the current playback status. + // RETURNS + // AudioStatus: Playback status, can be: + // AudioStop: Playback is stopped. + // AudioPause: Playback is paused (and can resume). + // AudioResume: Playback resumes + // AudioEndOfFile: Playback is finished. + // AudioCommonFailed: Playback fails (e.g. the audio file is corrupted). + AudioStatus getStatus(void); + +public: + VMSTR getFile(); + char getDriver(); + boolean getType(); + unsigned char getVolume(); + static void onCallback(int result); +private: + char m_path[256]; + unsigned char m_volume; + char m_drv; + boolean m_type; +}; + +extern LAudioClass LAudio; + +#endif diff --git a/hardware/arduino/mtk/libraries/LAudio/examples/AudioPlayer/AudioPlayer.ino b/hardware/arduino/mtk/libraries/LAudio/examples/AudioPlayer/AudioPlayer.ino new file mode 100644 index 00000000..6e6fffe8 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LAudio/examples/AudioPlayer/AudioPlayer.ino @@ -0,0 +1,90 @@ +#include + +#define KEY 5 +char buff[120]; +unsigned char KEY_NUM = 0; + +enum{Play,SetVolume,Pause,Resume,Stop}; + +unsigned char Status_Value = Play; + +void Scan_KEY() +{ + if( digitalRead(KEY) == 0 ) + { + delay(20); //延时20ms,去抖动 + if( digitalRead(KEY) == 0 ) //查看按键是å¦æŒ‰ä¸‹ + { + KEY_NUM = 1; + while(digitalRead(KEY) == 0); //æ¾æ‰‹æ£€æµ‹ + } + } +} + +void setup() +{ + LAudio.begin(); + pinMode(KEY,INPUT_PULLUP); + Serial.begin(115200); + Change_Status(Play); + pinMode(8, OUTPUT); + +} + +void Change_Status(unsigned char status) +{ + switch(status) + { + case Play: + LAudio.playFile( storageFlash,(char*)"LS8Mo.wav"); + LAudio.setVolume(2); + Serial.println("playOne"); + break; + case SetVolume: + LAudio.setVolume(6); + Serial.println("setVolume"); + break; + case Pause: + LAudio.pause(); + Serial.println("pause"); + break; + case Resume: + LAudio.resume(); + Serial.println("resume"); + break; + case Stop: + LAudio.stop(); + Serial.println("stop"); + break; + default: + break; + } +} + +void loop() +{ + //digitalWrite(8, HIGH); + //digitalWrite(8,LOW); + + AudioStatus status; + Scan_KEY(); + status = LAudio.getStatus(); + if(status == AudioEndOfFile) + { + Status_Value = Play; + Change_Status(Status_Value); + } + if(KEY_NUM == 1) + { + KEY_NUM = 0; + Change_Status(Status_Value); + Status_Value++; + if(Status_Value == Stop+1) + { + Status_Value = Play; + } + } + + delay(1000); +} + diff --git a/hardware/arduino/mtk/libraries/LAudio/keywords.txt b/hardware/arduino/mtk/libraries/LAudio/keywords.txt new file mode 100644 index 00000000..4990c67a --- /dev/null +++ b/hardware/arduino/mtk/libraries/LAudio/keywords.txt @@ -0,0 +1,31 @@ +####################################### +# Syntax Coloring Map For LAudioClass +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +LAudio KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +begin KEYWORD2 +playFile KEYWORD2 +setVolume KEYWORD2 +pause KEYWORD2 +resume KEYWORD2 +stop KEYWORD2 +getStatus KEYWORD2 + +####################################### +# Object (KEYWORD3) +####################################### +LAudio KEYWORD3 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/hardware/arduino/mtk/libraries/LAudio/utility/Audio.cpp b/hardware/arduino/mtk/libraries/LAudio/utility/Audio.cpp new file mode 100644 index 00000000..395d4e1a --- /dev/null +++ b/hardware/arduino/mtk/libraries/LAudio/utility/Audio.cpp @@ -0,0 +1,126 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#include "vmsys.h" +#include "vmmm.h" +#include "vmchset.h" +#include "LAudio.h" +#include "Audio.h" +#include "vmlog.h" +#include "vmio.h" +#include "vmstdlib.h" + +typedef void (*call_func_ptr)(int result); +call_func_ptr g_callback = NULL; + + +void audio_callback(VMINT result) +{ + if(g_callback) + g_callback(result); + return; +} + +boolean audioPlay(void* user_data) +{ + VMWCHAR path[256]; + VMCHAR path_a[256]; + + VMINT drv ; + VMCHAR driver_str[2] = {0}; + + if(LAudio.getDriver() ==0) + { + drv = vm_get_system_driver(); + } + else + { + drv = vm_get_removable_driver(); + } + + if(drv >=0) + { + + if( LAudio.getType()) + { + sprintf(path_a,"%c:\\%s", drv, LAudio.getFile()); + vm_ascii_to_ucs2(path, 256, path_a); + } + else + { + sprintf(path_a,"%c:\\", drv); + vm_ascii_to_ucs2(path, 256, path_a); + vm_wstrcat(path, (VMWSTR)LAudio.getFile()); + } + } + else + { + vm_log_info("AudioPlay get driver error"); + return true; + } + + + + g_callback = (call_func_ptr)user_data; + vm_audio_play_file(path, audio_callback); + vm_set_volume(LAudio.getVolume()); + return true; +} + +boolean audioPause(void* user_data) +{ + vm_audio_pause(audio_callback); + return true; +} + +boolean audioResume(void* user_data) +{ + vm_audio_resume(audio_callback); + return true; +} + +boolean audioStop(void* user_data) +{ + vm_audio_stop(audio_callback); + return true; +} + +boolean audioSetVolume(void* user_data) +{ + vm_set_volume(LAudio.getVolume()); + return true; +} + + diff --git a/hardware/arduino/mtk/libraries/LAudio/utility/Audio.h b/hardware/arduino/mtk/libraries/LAudio/utility/Audio.h new file mode 100644 index 00000000..efe6ee5c --- /dev/null +++ b/hardware/arduino/mtk/libraries/LAudio/utility/Audio.h @@ -0,0 +1,56 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef _VMAUDIO_H +#define _VMAUDIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "chip.h" +#include "LAudio.h" + +boolean audioPlay(void* user_data); +boolean audioPause(void* user_data); +boolean audioResume(void* user_data); +boolean audioSetVolume(void* user_data); +boolean audioStop(void* user_data); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/hardware/arduino/mtk/libraries/LBT/LBT.cpp b/hardware/arduino/mtk/libraries/LBT/LBT.cpp new file mode 100644 index 00000000..3f404d9a --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/LBT.cpp @@ -0,0 +1,23 @@ +#include +#include "LBT.h" +LBTRingBuffer::LBTRingBuffer( void ) +{ + memset( _aucBuffer, 0, LBT_SERIAL_BUFFER_SIZE ) ; + _iHead=0 ; + _iTail=0 ; +} + +void LBTRingBuffer::store_char( uint8_t c ) +{ + int i = (uint32_t)(_iHead + 1) % LBT_SERIAL_BUFFER_SIZE ; + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if ( i != _iTail ) + { + _aucBuffer[_iHead] = c ; + _iHead = i ; + } +} diff --git a/hardware/arduino/mtk/libraries/LBT/LBT.h b/hardware/arduino/mtk/libraries/LBT/LBT.h new file mode 100644 index 00000000..2989249c --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/LBT.h @@ -0,0 +1,88 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef LBT_H +#define LBT_H + +#if defined(__LINKIT_ONE_DEBUG__) +#define LBT_DEBUG +#endif + +#include +#include "LTask.h" +#include "Vmbtcm.h" +#include + +#define LBT_DEVICE_NAME_LENGTH 56 + +#define LBT_PIN_CODE_BUFFER_SIZE (20) + +struct BTBase +{ + _LTaskClass *ptr; +}; + +struct LBTAddress +{ + uint8_t lap[3]; + uint8_t uap; + uint8_t nap[2]; +}; + +typedef struct +{ + LBTAddress address; + char name[56]; +} LBTDeviceInfo; + + + +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which head is the index of the location +// to which to write the next incoming character and tail is the index of the +// location from which to read. +#define LBT_SERIAL_BUFFER_SIZE (1024*6) + +class LBTRingBuffer +{ + public: + uint8_t _aucBuffer[LBT_SERIAL_BUFFER_SIZE] ; + int _iHead ; + int _iTail ; + + public: + LBTRingBuffer( void ) ; + void store_char( uint8_t c ) ; +} ; +#endif //#ifndef LBT_H diff --git a/hardware/arduino/mtk/libraries/LBT/LBTClient.cpp b/hardware/arduino/mtk/libraries/LBT/LBTClient.cpp new file mode 100644 index 00000000..8008b128 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/LBTClient.cpp @@ -0,0 +1,241 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "arduino.h" +#include "vmlog.h" +#include "BTClient.h" +#include "LBTClient.h" +#include "vmthread.h" +#include "LBT.h" +extern int addrStr2Mac(const char *MACAddr, LBTAddress &address); +extern void app_log_file(char *fmt, ...); +#ifdef LBT_DEBUG +#define APP_LOG(...) app_log_file(__VA_ARGS__); \ + vm_log_info(__VA_ARGS__) +#else +#define APP_LOG(...) +#endif + +vm_thread_mutex_struct client_mutex = {0}; +LBTClientClass::LBTClientClass(LBTRingBuffer* pRx_buffer) : m_post_write(0), m_post_read(0) +{ + _rx_buffer = pRx_buffer; +} + +boolean LBTClientClass::begin(const uint8_t* pinCode) +{ + _LTaskClass::begin(); + + m_signal_write = vm_signal_init(); + m_signal_read = vm_signal_init(); + + LBTClientBeginContext c; + c.ptr = this; + c.result = false; + c.is_set_pin = false; + //boolean result = true; + //APP_LOG("begin"); + if(pinCode!= NULL) + { + int len = strlen((char*)pinCode); + if(len > LBT_PIN_CODE_BUFFER_SIZE - 1) + { + len = LBT_PIN_CODE_BUFFER_SIZE - 1; + } + c.is_set_pin = true; + memcpy(_pincode_buffer, pinCode, len+1); + } + + + remoteCall(btClientBegin, &c); + + //APP_LOG("begin = %d", result); + + return c.result; +} + +void LBTClientClass::end(void) +{ + _LTaskClass::stop(); + vm_signal_clean(m_signal_write); + vm_signal_deinit(m_signal_write); + vm_signal_clean(m_signal_read); + vm_signal_deinit(m_signal_read); + remoteCall(btClientEnd, (void*)NULL); +} + +boolean LBTClientClass::connect(const char *MACAddr) +{ + LBTClientConnectContext c; + + LBTAddress addr = {0}; + c.address = &addr; + if (0 > addrStr2Mac(MACAddr, *(c.address))) + return false; + + remoteCall(btClientConnect, (void*)&c); + + return c.result; +} + + +boolean LBTClientClass::connect(LBTAddress &address) +{ + LBTClientConnectContext c; + c.address = &address; + remoteCall(btClientConnect, (void*)&c); + + return c.result; +} + +boolean LBTClientClass::connected(void) +{ + boolean result = true; + remoteCall(btClientConnected, &result); + + return result; +} + +int LBTClientClass::scan(size_t time_out) +{ + LBTClientScanContext c; + c.time_out= time_out; + remoteCall(btClientScan, (void*)&c); + + return c.number; +} + +boolean LBTClientClass::getDeviceInfo(size_t index, LBTDeviceInfo* device_info) +{ + LBTClientGetDeviceInfoContext c; + c.index = index; + c.device_info = device_info; + remoteCall(btClientGetDeviceInfo, (void*)&c); + + return c.result; +} + +size_t LBTClientClass::write(const uint8_t *buf, size_t size) +{ + LBTClientReadWriteContext c; + c.buf = (void*)buf; + c.len = size; + + if (!m_post_write) + { + APP_LOG((char*)"LBTClientClass::write wait"); + vm_signal_wait(m_signal_write); // wait for VM_SRV_SPP_EVENT_READY_TO_WRITE + APP_LOG((char*)"LBTClientClass::write wait ok"); + } + m_post_write = 0; + vm_signal_clean(m_signal_write); + + remoteCall(btClientWrite, (void*)&c); + m_post_write = 1; + + return c.lenProcessed; +} + +void LBTClientClass::post_signal_write() +{ + APP_LOG((char*)"LBTClientClass::post_signal_write"); + vm_signal_post(m_signal_write); + m_post_write = 1; +} + +void LBTClientClass::post_signal_read() +{ + APP_LOG((char*)"LBTClientClass::post_signal_read"); + vm_signal_post(m_signal_read); + m_post_read = 1; +} + +int LBTClientClass::available(void) +{ + return (uint32_t)(LBT_SERIAL_BUFFER_SIZE + _rx_buffer->_iHead - _rx_buffer->_iTail) % LBT_SERIAL_BUFFER_SIZE; +} + +int LBTClientClass::peek(void) +{ + if(_rx_buffer->_iHead == _rx_buffer->_iTail) + return -1; + return _rx_buffer->_aucBuffer[_rx_buffer->_iTail]; +} + +int LBTClientClass::read(void) +{ + + if(_rx_buffer->_iHead == _rx_buffer->_iTail) + return -1; + if(client_mutex.guard == 0) + { + vm_mutex_create(&client_mutex); + } + vm_mutex_lock(&client_mutex); + uint8_t uc = _rx_buffer->_aucBuffer[_rx_buffer->_iTail]; + _rx_buffer->_iTail = (unsigned int)(_rx_buffer->_iTail + 1) % LBT_SERIAL_BUFFER_SIZE; + vm_mutex_unlock(&client_mutex); + return uc; +} + +void LBTClientClass::flush(void) +{ + while(read()!=-1); +} + +size_t LBTClientClass::write(const uint8_t data) +{ + LBTClientReadWriteContext c; + c.buf = (void*)&data; + c.len = 1; + + if (!m_post_write) + { + APP_LOG((char*)"LBTClientClass::write wait"); + vm_signal_wait(m_signal_write); // wait for VM_SRV_SPP_EVENT_READY_TO_WRITE + APP_LOG((char*)"LBTClientClass::write wait ok"); + } + m_post_write = 0; + vm_signal_clean(m_signal_write); + + remoteCall(btClientWrite, (void*)&c); + m_post_write = 1; + + return c.lenProcessed; +} + +LBTRingBuffer LBTClient_rx_buffer; +LBTClientClass LBTClient(&LBTClient_rx_buffer); + + diff --git a/hardware/arduino/mtk/libraries/LBT/LBTClient.h b/hardware/arduino/mtk/libraries/LBT/LBTClient.h new file mode 100644 index 00000000..21515be6 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/LBTClient.h @@ -0,0 +1,591 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef LBTCLIENT_H +#define LBTCLIENT_H + +#include "LTask.h" +#include "LBT.h" + +struct LBTClientBeginContext : BTBase +{ + void* name; + boolean result; + boolean is_set_pin; + LBTClientBeginContext(): + name(NULL), + result(false) + { + + } +}; + +struct LBTClientConnectContext : BTBase +{ + LBTAddress* address; + boolean result; + + LBTClientConnectContext(): + address(NULL), + result(false) + { + + } +}; + +struct LBTClientScanContext : BTBase +{ + size_t time_out; + size_t number; + + LBTClientScanContext(): + time_out(20), + number(0) + { + + } +}; + +struct LBTClientGetDeviceInfoContext : BTBase +{ + size_t index; + LBTDeviceInfo* device_info; + boolean result; + + LBTClientGetDeviceInfoContext(): + index(0), + device_info(NULL), + result(false) + { + + } +}; + +struct LBTClientReadWriteContext : BTBase +{ + void *buf; + VMUINT len; + VMINT lenProcessed; // bytes read or written + + LBTClientReadWriteContext(): + buf(NULL), + len(1), + lenProcessed(0) + { + + } +}; + + +// LBTClient class interface +class LBTClientClass : public _LTaskClass, public Stream { + +public: + LBTRingBuffer *_rx_buffer; + uint8_t _pincode_buffer[LBT_PIN_CODE_BUFFER_SIZE]; +// Constructor +public: + LBTClientClass(LBTRingBuffer* pRx_buffer); + +// Method +public: + + // DESCRIPTION + // init BT module and setup a SPP client instance + // RETURNS + // true: success + // false: fail + // EXAMPLE + // + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTClient.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Client successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Client begin successfully"); + // } + // } + // + // void loop() + // { + // + // } + // + boolean begin(const uint8_t* pinCode = NULL); + + // DESCRIPTION + // close corresponding SPP client instance and end BT module + // RETURNS + // None + // EXAMPLE + // + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTClient.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Client successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Client begin successfully"); + // } + // + // LBTClient.end(); + // } + // + // void loop() + // { + // + // } + // + void end(void); + + // DESCRIPTION + // connect SPP server with BT address + // RETURNS + // true: success + // false: fail + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTClient.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Client successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Client begin successfully"); + // // start scan, at most scan 15 seconds + // int num = LBTClient.scan(15); + // + // if(num > 0) + // { + // LBTDeviceInfo info = {0}; + // if( LBTClient.getDeviceInfo(0, &info) ) + // { + // bool conn_result = LBTClient.connect(info.address); + // if( !conn_result ) + // { + // Serial.println("Cannot connect to Spp Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Connect to Spp Server successfully"); + // } + // } + // else + // { + // Serial.println("Device index not correct"); + // // don't do anything else + // while(true); + // } + // } + // } + // } + // + boolean connect( + LBTAddress &address //[IN] BT address to connect + ); + + // DESCRIPTION + // connect SPP server with BT address + // RETURNS + // true: success + // false: fail + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTClient.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Client successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Client begin successfully"); + // // start scan, at most scan 15 seconds + // int num = LBTClient.scan(15); + // + // if(num > 0) + // { + // LBTDeviceInfo info = {0}; + // bool conn_result = LBTClient.connect("1234:56:abcdef"); + // if( !conn_result ) + // { + // Serial.println("Cannot connect to Spp Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Connect to Spp Server successfully"); + // } + // } + // } + // } + // + boolean connect( + const char *MACAddr //[IN] BT address to connect + ); + // DESCRIPTION + // check if any SPP server is conneccted + // RETURNS + // true: yes + // false: no + // EXAMPLE + // + // #include + // #include + // + // LBTDeviceInfo info = {0}; + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTClient.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Client successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Client begin successfully"); + // // start scan, at most scanned 15 seconds + // int num = LBTClient.scan(15); + // + // if(num > 0) + // { + // if( LBTClient.getDeviceInfo(0, &info) ) + // { + // Serial.println("Get device info of interested server"); + // } + // else + // { + // Serial.println("Device index not correct"); + // // don't do anything else + // while(true); + // } + // } + // } + // } + // + boolean connected(void); + + // DESCRIPTION + // scan BT devices around, at most scanned 10 devices + // RETURNS + // number of devices scanned + // EXAMPLE + // + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTClient.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Client successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Client begin successfully"); + // // start scan, at most scanned 15 seconds + // int num = LBTClient.scan(15); + // Serial.print("Scaned Device number:"); + // Serial.println(num); + // } + // } + // + // void loop() + // { + // + // } + // + int scan( + size_t time_out = 20 // [IN] time out duration in seconds of the scan process + ); + + // DESCRIPTION + // get scanned device information + // RETURNS + // true: success + // false : fail. Possible reasons are index not reasonable or never scanned before + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTClient.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Client successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Client begin successfully"); + // // start scan, at most scanned 15 seconds + // int num = LBTClient.scan(15); + // Serial.print("Scaned Device number:"); + // Serial.println(num); + // + // for(int i = 0; i < num; ++i) + // { + // LBTDeviceInfo info = {0}; + // bool success = LBTClient.getDeviceInfo(i, &info); + // if( success ) + // { + // Serial.print("Device"); + // Serial.println(i); + // Serial.print(" name:"); + // Serial.println(info.name); + // } + // } + // } + // } + // + // void loop() + // { + // + // } + // + boolean getDeviceInfo( + size_t index, // [IN] device index of the scanned result + LBTDeviceInfo* dev_info // [OUT] device info acquired + ); + + // DESCRIPTION + // read data from SPP server + // RETURNS + // number of bytes read + // 0 for no data to read + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTClient.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Client successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Client begin successfully"); + // // start scan, at most scanned 15 seconds + // int num = LBTClient.scan(15); + // + // if(num > 0) + // { + // LBTDeviceInfo info = {0}; + // if( LBTClient.getDeviceInfo(0, &info) ) + // { + // bool conn_result = LBTClient.connect(info.address); + // if( !conn_result ) + // { + // Serial.println("Cannot connect to Spp Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Connect to Spp Server successfully"); + // } + // } + // else + // { + // Serial.println("Device index not correct"); + // // don't do anything else + // while(true); + // } + // } + // } + // } + // + // void loop() + // { + // char buffer[10]; + // int read_size = LBTClient.read((uint8_t*)buffer, 10); + // if(read_size > 0) + // { + // Serial.print("size read: "); + // Serial.println(read_size); + // Serial.println(buffer); + // } + // } + // + + int read(void); + + // DESCRIPTION + // write data to SPP server + // RETURNS + // number of bytes written + // 0 for no buffer to write + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTClient.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Client successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Client begin successfully"); + // // start scan, at most scanned 15 seconds + // int num = LBTClient.scan(15); + // + // if(num > 0) + // { + // LBTDeviceInfo info = {0}; + // if( LBTClient.getDeviceInfo(0, &info) ) + // { + // bool conn_result = LBTClient.connect(info.address); + // if( !conn_result ) + // { + // Serial.println("Cannot connect to Spp Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Connect to Spp Server successfully"); + // } + // } + // else + // { + // Serial.println("Device index not correct"); + // // don't do anything else + // while(true); + // } + // } + // } + // } + // + // void loop() + // { + // char* buffer = "LinkIt BT Client"; + // int write_size = LBTClient.write((uint8_t*)buffer, strlen(write_buf)); + // if(write_size > 0) + // { + // Serial.print("write read: "); + // Serial.println(write_size); + // } + //} + // + + size_t write( + const uint8_t* buf, // [IN] daat to write + size_t size = 1 // [IN] size of the buffer + ); + + // get the number of bytes(characters)avaiable for reading from the serial port. + // + // RETURNS + // the bumbers of bytes available to read + int available(void); + + // returns the next byte of incoming serial data without removing it from the + // internal serial buffer + // + // RETURNS + // the first byte of incoming serial data available, -1 if no data is available + int peek(void); + + // waits for the transmission of outgoing serial data to complete + // + // RETURNS none + void flush(void); + +// write a char +// +// RETURNS +// the number of write + size_t write(const uint8_t data //[IN] input char + ); + + using Print::write; + + void post_signal_write(); + void post_signal_read(); + +private: + int m_post_write; + VM_SIGNAL_ID m_signal_write; + int m_post_read; + VM_SIGNAL_ID m_signal_read; + +}; + +extern LBTClientClass LBTClient; + +#endif //#ifndef LBTCLIENT_H diff --git a/hardware/arduino/mtk/libraries/LBT/LBTServer.cpp b/hardware/arduino/mtk/libraries/LBT/LBTServer.cpp new file mode 100644 index 00000000..abb5f380 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/LBTServer.cpp @@ -0,0 +1,318 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "arduino.h" +#include "BTServer.h" +#include "LBTServer.h" +#include "vmlog.h" +#include "vmthread.h" +#include "LBT.h" +extern int addrStr2Mac(const char *MACAddr, LBTAddress &address); +extern void app_log_file(char *fmt, ...); +#ifdef LBT_DEBUG +#define APP_LOG(...) app_log_file(__VA_ARGS__); \ + vm_log_info(__VA_ARGS__) +#else +#define APP_LOG(...) +#endif + +vm_thread_mutex_struct server_mutex = {0}; +LBTServerClass::LBTServerClass(LBTRingBuffer* pRx_buffer) : m_post_write(0), m_post_read(0) +{ + _rx_buffer = pRx_buffer; +} + + +boolean LBTServerClass::begin(const uint8_t* buf, const uint8_t* pinCode) +{ + APP_LOG((char*)"LBTServerClass::begin"); + _LTaskClass::begin(); + LBTServerBeginContext c; + c.is_set_pin = false; + if(pinCode!= NULL) + { + int len = strlen((char*)pinCode); + if(len > LBT_PIN_CODE_BUFFER_SIZE - 1) + { + len = LBT_PIN_CODE_BUFFER_SIZE - 1; + } + c.is_set_pin = true; + memcpy(_pincode_buffer, pinCode, len+1); + } + + m_signal_write = vm_signal_init(); + m_signal_read = vm_signal_init(); + + + c.name = (void*)buf; + c.ptr = this; + remoteCall(btServerBegin, &c); + return c.result; +} + +void LBTServerClass::end(void) +{ + _LTaskClass::stop(); + + vm_signal_clean(m_signal_write); + vm_signal_deinit(m_signal_write); + vm_signal_clean(m_signal_read); + vm_signal_deinit(m_signal_read); + remoteCall(btServerEnd, (void*)NULL); +} + +boolean LBTServerClass::accept(size_t time_out) +{ + LBTServerAcceptContext c; + c.time_out = time_out; + c.address = NULL; + remoteCall(btServerAccept, (void*)&c); + + return c.result; +} + + +boolean LBTServerClass::accept(size_t time_out, const char *MACAddr) +{ + LBTServerAcceptContext c; + c.time_out = time_out; + LBTAddress addr = {0}; + c.address = &addr; + if (0 > addrStr2Mac(MACAddr, *(c.address))) + return false; + remoteCall(btServerAccept, (void*)&c); + + return c.result; +} + +boolean LBTServerClass::connected(void) +{ + boolean result = true; + remoteCall(btServerConnected, &result); + + return result; + +} + +boolean LBTServerClass::getHostDeviceInfo(LBTDeviceInfo* device_info) +{ + LBTServerGetHostDeviceInfoContext c; + c.device_info = device_info; + remoteCall(btServerGetHostDeviceInfo, (void*)&c); + + return c.result; +} + +size_t LBTServerClass::write(const uint8_t *buf, size_t size) +{ + LBTServerReadWriteContext c; + c.buf = (void*)buf; + c.len = size; + + if (!m_post_write) + { + APP_LOG((char*)"LBTServerClass::write wait"); + vm_signal_wait(m_signal_write); // wait for VM_SRV_SPP_EVENT_READY_TO_WRITE + APP_LOG((char*)"LBTServerClass::write wait ok"); + } + vm_signal_clean(m_signal_write); + m_post_write = 0; + + remoteCall(btServerWrite, (void*)&c); + m_post_write = 1; + + return c.lenProcessed; +} + +void LBTServerClass::post_signal_write() +{ + APP_LOG((char*)"LBTServerClass::post_signal_write"); + vm_signal_post(m_signal_write); + m_post_write = 1; +} + +void LBTServerClass::post_signal_read() +{ + APP_LOG((char*)"LBTServerClass::post_signal_read"); + vm_signal_post(m_signal_read); + m_post_read = 1; +} + +uint8_t a2x(char ch) +{ + + switch(ch) + { + case '0': + return 0; + case '1': + return 1; + case '2': + return 2; + case '3': + return 3; + case '4': + return 4; + case '5': + return 5; + case '6': + return 6; + case '7': + return 7; + case '8': + return 8; + case '9': + return 9; + case 'A': + case 'a': + return 10; + case 'B': + case 'b': + return 11; + case 'C': + case 'c': + return 12; + case 'D': + case 'd': + return 13; + case 'E': + case 'e': + return 14; + case 'F': + case 'f': + return 15; + default: + break;; + } + + + return -1; + +} + +int addrStr2Mac(const char *MACAddr, LBTAddress &address) +{ + if (14 != strlen(MACAddr)) + { + return -1; + } + + if (MACAddr[4] != ':' || MACAddr[7] != ':') + { + return -2; + } + + char tmp[13] = {0}; + strncpy(tmp, MACAddr, 4); + strncpy(tmp + 4, MACAddr + 5, 2); + strncpy(tmp + 6, MACAddr + 8, 6); + + for (int i = 0; i < 12; ++i) + { + if (0 > a2x(tmp[i])) + return -3; + } + + address.nap[1] = a2x(tmp[0])*16 + a2x(tmp[1]); + address.nap[0] = a2x(tmp[2])*16 + a2x(tmp[3]); + address.uap = a2x(tmp[4])*16 + a2x(tmp[5]); + address.lap[2] = a2x(tmp[6])*16 + a2x(tmp[7]); + address.lap[1] = a2x(tmp[8])*16 + a2x(tmp[9]); + address.lap[0] = a2x(tmp[10])*16 + a2x(tmp[11]); + + return 0; +} + + +int LBTServerClass::available(void) +{ + return (uint32_t)(LBT_SERIAL_BUFFER_SIZE + _rx_buffer->_iHead - _rx_buffer->_iTail) % LBT_SERIAL_BUFFER_SIZE; +} + +int LBTServerClass::peek(void) +{ + if(_rx_buffer->_iHead == _rx_buffer->_iTail) + return -1; + return _rx_buffer->_aucBuffer[_rx_buffer->_iTail]; +} + +int LBTServerClass::read(void) +{ + + if(_rx_buffer->_iHead == _rx_buffer->_iTail) + { + return -1; + } + if(server_mutex.guard == 0) + { + vm_mutex_create(&server_mutex); + } + vm_mutex_lock(&server_mutex); + uint8_t uc = _rx_buffer->_aucBuffer[_rx_buffer->_iTail]; + _rx_buffer->_iTail = (unsigned int)(_rx_buffer->_iTail + 1) % LBT_SERIAL_BUFFER_SIZE; + vm_mutex_unlock(&server_mutex); + return uc; + +} + +void LBTServerClass::flush(void) +{ + while(read()!=-1); +} + +size_t LBTServerClass::write(const uint8_t data) +{ + LBTServerReadWriteContext c; + c.buf = (void*)&data; + c.len = 1; + + if (!m_post_write) + { + APP_LOG((char*)"LBTServerClass::write wait"); + vm_signal_wait(m_signal_write); // wait for VM_SRV_SPP_EVENT_READY_TO_WRITE + APP_LOG((char*)"LBTServerClass::write wait ok"); + } + vm_signal_clean(m_signal_write); + m_post_write = 0; + + remoteCall(btServerWrite, (void*)&c); + m_post_write = 1; + + return c.lenProcessed; +} + + +LBTRingBuffer LBTServer_rx_buffer; +LBTServerClass LBTServer(&LBTServer_rx_buffer); + diff --git a/hardware/arduino/mtk/libraries/LBT/LBTServer.h b/hardware/arduino/mtk/libraries/LBT/LBTServer.h new file mode 100644 index 00000000..01ae1ea9 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/LBTServer.h @@ -0,0 +1,599 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef LBTSERVER_H +#define LBTSERVER_H + +#include "LTask.h" +#include "LBT.h" + + + +struct LBTServerBeginContext : BTBase +{ + void* name; + boolean result; + boolean is_set_pin; + LBTServerBeginContext(): + name(NULL), + result(false) + { + + } +}; + +struct LBTServerAcceptContext : BTBase +{ + size_t time_out; + boolean result; + LBTAddress *address; + + LBTServerAcceptContext(): + time_out(20), + result(false), + address(NULL) + { + + } +}; + +struct LBTServerGetHostDeviceInfoContext : BTBase +{ + LBTDeviceInfo* device_info; + boolean result; + + LBTServerGetHostDeviceInfoContext(): + device_info(NULL), + result(false) + { + + } +}; + +struct LBTServerReadWriteContext : BTBase +{ + void *buf; + VMINT len; + VMINT lenProcessed; // bytes read or written + + LBTServerReadWriteContext(): + buf(NULL), + len(1), + lenProcessed(0) + { + + } +}; + + +// LBTServer class interface +class LBTServerClass : public _LTaskClass,public Stream{ +public: + LBTRingBuffer *_rx_buffer; + uint8_t _pincode_buffer[LBT_PIN_CODE_BUFFER_SIZE]; +// Constructor +public: + LBTServerClass(LBTRingBuffer* pRx_buffer); + +// Method +public: + + // DESCRIPTION + // init BT module and setup a SPP server instance + // RETURNS + // true: success + // false: fail + // EXAMPLE + // + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTServer.begin("LBTServer"); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Server begin successfully"); + // } + // } + // + // void loop() + // { + // + // } + // + // connected + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTServer.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Server begin successfully"); + // } + // + // } + // + // void loop() + // { + // ¡¡¡¡ if(!LBTServer.connected()) + // { + // // waiting for Spp Client to connect + // bool connected = LBTServer.accept(20); + // + // if( !connected ) + // { + // Serial.println("No connection request yet"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Connected"); + // } + // } + // else + // { + // char buffer[10]; + // int read_size = LBTServer.read((uint8_t*)buffer, 10); + // if(read_size > 0) + // { + // Serial.print("size read: "); + // Serial.println(read_size); + // Serial.println(buffer); + // } + // } + // } + // + boolean begin( + const uint8_t* name = NULL, //[IN] device name to set + const uint8_t* pinCode = NULL + ); + + // DESCRIPTION + // close corresponding SPP server instance and end BT module + // RETURNS + // None + // EXAMPLE + // + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTServer.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Server begin successfully"); + // } + // + // LBTServer.end(); + // } + // + // void loop() + // { + // + // } + // + // getHostDeviceInfo + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTServer.begin("LBTServer"); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Server begin successfully"); + // LBTDeviceInfo info = {0}; + // bool success = LBTServer.getHostDeviceInfo(i, &info); + // if( success ) + // { + // Serial.print("Device name:" ); + // Serial.println(info.name); + // } + // } + // } + // + // void loop() + // { + // + // } + // + void end(void); + + // DESCRIPTION + // accept SPP client's connection request. + // returns as long as the connection is made or timeout + // RETURNS + // true: success + // false: fail + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTServer.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Server begin successfully"); + // } + // + // // waiting for Spp Client to connect + // bool connected = LBTServer.accept(20); + // + // if( !connected ) + // { + // Serial.println("No connection request yet"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Connected"); + // } + // } + // + // void loop() + // { + // + // } + // + boolean accept( + size_t time_out = 20 //[IN] time out duration while waiting for SPP client's connection request + ); + + // DESCRIPTION + // accept SPP client's connection request. + // returns as long as the connection is made or timeout + // RETURNS + // true: success + // false: fail + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTServer.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Server begin successfully"); + // } + // + // // waiting for Spp Client to connect + // bool connected = LBTServer.accept(20, "1234:56:abcdef"); + // + // if( !connected ) + // { + // Serial.println("No connection request yet"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Connected"); + // } + // } + // + // void loop() + // { + // + // } + // + boolean accept( + size_t time_out, //[IN] time out duration while waiting for SPP client's connection request + const char *MACAddr); + + // DESCRIPTION + // check if any SPP client is conneccted + // RETURNS + // true: yes + // false: no + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTServer.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Server begin successfully"); + // } + // + // } + // + // void loop() + // { + // ¡¡¡¡ if(!LBTServer.connected()) + // { + // // waiting for Spp Client to connect + // bool connected = LBTServer.accept(20); + // + // if( !connected ) + // { + // Serial.println("No connection request yet"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Connected"); + // } + // } + // else + // { + // char buffer[10]; + // int read_size = LBTServer.read((uint8_t*)buffer, 10); + // if(read_size > 0) + // { + // Serial.print("size read: "); + // Serial.println(read_size); + // Serial.println(buffer); + // } + // } + // } + // + boolean connected(void); + + // DESCRIPTION + // get scanned device information + // RETURNS + // true: success + // false : fail. Possible reasons are index not reasonable or never scanned before + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTServer.begin("LBTServer"); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Server begin successfully"); + // LBTDeviceInfo info = {0}; + // bool success = LBTServer.getHostDeviceInfo(i, &info); + // if( success ) + // { + // Serial.print("Device name:" ); + // Serial.println(info.name); + // } + // } + // } + // + // void loop() + // { + // + // } + // + boolean getHostDeviceInfo( + LBTDeviceInfo* dev_info // [OUT] device info acquired + ); + + // DESCRIPTION + // read data from SPP client + // RETURNS + // number of bytes read + // 0 for no data to read + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTServer.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Server begin successfully"); + // } + // + // // waiting for Spp Client to connect + // bool connected = LBTServer.accept(20); + // + // if( !connected ) + // { + // Serial.println("No connection request yet"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Connected"); + // } + // } + // + // void loop() + // { + // char buffer[10]; + // int read_size = LBTServer.read((uint8_t*)buffer, 10); + // if(read_size > 0) + // { + // Serial.print("size read: "); + // Serial.println(read_size); + // Serial.println(buffer); + // } + // } + // + + int read(void); + + // DESCRIPTION + // write data to SPP client + // RETURNS + // number of bytes written + // 0 for write fail + // EXAMPLE + // + // #include + // #include + // + // void setup() + // { + // Serial.begin(9600); + // bool success = LBTServer.begin(); + // if( !success ) + // { + // Serial.println("Cannot begin Bluetooth Server successfully"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Bluetooth Server begin successfully"); + // } + // + // // waiting for Spp Client to connect + // bool connected = LBTServer.accept(20); + // + // if( !connected ) + // { + // Serial.println("No connection request yet"); + // // don't do anything else + // while(true); + // } + // else + // { + // Serial.println("Connected"); + // } + // } + // + // void loop() + // { + // char* buffer = "LinkIt BT Server"; + // int write_size = LBTServer.write((uint8_t*)buffer, strlen(buffer)); + // if(write_size > 0) + // { + // Serial.print("Size written: "); + // Serial.println(write_size); + // } + // } + // + size_t write( + const uint8_t* buf, // [IN] daat to write + size_t size = 1 // [IN] size of the buffer + ); + + // get the number of bytes(characters)avaiable for reading from the serial port. + // + // RETURNS + // the bumbers of bytes available to read + int available(void); + + // returns the next byte of incoming serial data without removing it from the + // internal serial buffer + // + // RETURNS + // the first byte of incoming serial data available, -1 if no data is available + int peek(void); + + // waits for the transmission of outgoing serial data to complete + // + // RETURNS none + void flush(void); + +// write a char +// +// RETURNS +// the number of write + size_t write(const uint8_t data //[IN] input char + ); + + using Print::write; + + void post_signal_write(); + void post_signal_read(); +private: + int m_post_write; + VM_SIGNAL_ID m_signal_write; + int m_post_read; + VM_SIGNAL_ID m_signal_read; +}; + +extern LBTServerClass LBTServer; + +#endif //#ifndef LBTSERVER_H diff --git a/hardware/arduino/mtk/libraries/LBT/examples/BTSPP/BTClient/BTClient.ino b/hardware/arduino/mtk/libraries/LBT/examples/BTSPP/BTClient/BTClient.ino new file mode 100644 index 00000000..898add31 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/examples/BTSPP/BTClient/BTClient.ino @@ -0,0 +1,96 @@ +#include +#include + + +static LBTDeviceInfo info = {0}; +boolean find = 0; +#define SPP_SVR "ARD_SPP" // it should be the prefer server's name, customize it yourself. +#define ard_log Serial.printf +int read_size = 0; +void setup() +{ + Serial.begin(9600); + ard_log("LBT start"); + // begin BT + bool success = LBTClient.begin(); + if( !success ) + { + ard_log("Cannot begin Bluetooth Client successfully"); + delay(0xffffffff); + } + else + { + ard_log("Bluetooth Client begin successfully"); + // scan the devices around + int num = LBTClient.scan(30); + ard_log("scanned device number [%d]", num); + for (int i = 0; i < num; i++) + { + memset(&info, 0, sizeof(info)); + // to check the prefer master(server)'s name + if (!LBTClient.getDeviceInfo(i, &info)) + { + continue; + } + ard_log("getDeviceInfo [%02x:%02x:%02x:%02x:%02x:%02x][%s]", + info.address.nap[1], info.address.nap[0], info.address.uap, info.address.lap[2], info.address.lap[1], info.address.lap[0], + info.name); + if (0 == strcmp(info.name, SPP_SVR)) + { + find = 1; + ard_log("found"); + break; + } + } + + } +} + +void loop() +{ + + // to check if the connection is ready + if(find && !LBTClient.connected()) + { + ard_log("Diconnected, try to connect"); + // do connect + bool conn_result = LBTClient.connect(info.address); + ard_log("connect result [%d]", conn_result); + + if( !conn_result ) + { + ard_log("Cannot connect to SPP Server successfully"); + delay(0xffffffff); + } + else + { + ard_log("Connect to SPP Server successfully"); + } + + char buffer[32] = {0}; + int write_size = LBTClient.write((uint8_t*)"123456789012", 12); + ard_log("client first spec write_size [%d]", write_size); + + // to read the data from master(server) + while(1) + { + if(LBTClient.available()) + { + read_size = LBTClient.readBytes(buffer,32); + break; + } + delay(100); + } + ard_log("read size [%d][%s]", read_size, buffer); + + + write_size = LBTClient.write((uint8_t*)"LinkIt BT Client", 16); + ard_log("write_size [%d]", write_size); + + + find = 0; + } + ard_log("loop client"); + delay(2000); + +} diff --git a/hardware/arduino/mtk/libraries/LBT/examples/BTSPP/BTServer/BTServer.ino b/hardware/arduino/mtk/libraries/LBT/examples/BTSPP/BTServer/BTServer.ino new file mode 100644 index 00000000..d210fb8d --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/examples/BTSPP/BTServer/BTServer.ino @@ -0,0 +1,92 @@ +#include +#include +#define SPP_SVR "ARD_SPP" // it is the server's visible name, customize it yourself. +#define ard_log Serial.printf + +int read_size = 0; +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + ard_log("start BTS"); + + bool success = LBTServer.begin((uint8_t*)SPP_SVR); + if( !success ) + { + ard_log("Cannot begin Bluetooth Server successfully"); + // don't do anything else + delay(0xffffffff); + } + else + { + LBTDeviceInfo info; + if (LBTServer.getHostDeviceInfo(&info)) + { + ard_log("LBTServer.getHostDeviceInfo [%02x:%02x:%02x:%02x:%02x:%02x]", + info.address.nap[1], info.address.nap[0], info.address.uap, info.address.lap[2], info.address.lap[1], info.address.lap[0]); + } + else + { + ard_log("LBTServer.getHostDeviceInfo failed"); + } + ard_log("Bluetooth Server begin successfully"); + } + + // waiting for Spp Client to connect + bool connected = LBTServer.accept(1800); + + if( !connected ) + { + ard_log("No connection request yet"); + // don't do anything else + delay(0xffffffff); + } + else + { + ard_log("Connected"); + } +} + +int sent = 0; +void loop() { + // put your main code here, to run repeatedly: + if (!sent) + { + char buffer[32] = {0}; + //int read_size = LBTServer.read((uint8_t*)buffer, 32); + //vm_log_info("spec read size [%d][%s]", read_size); + + char* buffer_w = "LinkIt BT Server"; + int write_size = LBTServer.write((uint8_t*)buffer_w, strlen(buffer_w)); + ard_log("write_size [%d]", write_size); + + + memset(buffer, 0, sizeof(buffer)); + while(1) + { + if(LBTServer.available()) + { + read_size = LBTServer.readBytes((uint8_t*)buffer, 32); + break; + } + delay(100); + } + ard_log("read size [%d][%s]", read_size, buffer); + + memset(buffer, 0, sizeof(buffer)); + while(1) + { + if(LBTServer.available()) + { + read_size = LBTServer.readBytes((uint8_t*)buffer, 32); + break; + } + delay(100); + } + ard_log("read size [%d][%s]", read_size, buffer); + + + sent = 1; + } + ard_log("loop server"); + delay(2000); +} diff --git a/hardware/arduino/mtk/libraries/LBT/utility/BTClient.cpp b/hardware/arduino/mtk/libraries/LBT/utility/BTClient.cpp new file mode 100644 index 00000000..0d5a6ca7 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/utility/BTClient.cpp @@ -0,0 +1,916 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "arduino.h" +#include "LBT.h" +#include "Vmbtcm.h" +#include "Vmbtspp.h" +#include "vmlog.h" +#include "BTClient.h" +#include "LBTClient.h" +#include "vmtimer.h" +#include "vmstdlib.h" +#include "vmio.h" +#include "vmchset.h" +#include "vmlog.h" +#include "vmthread.h" + +#define BT_NAME "SPP" +#define LOG_BUF_SIZE 96 +#define FILE_PATH_SIZE 16 +#define SPP_DATA "Hello SPP!" +#ifdef LBT_DEBUG +#define APP_LOG(...) app_log_file(__VA_ARGS__); \ + vm_log_info(__VA_ARGS__) +#else +#define APP_LOG(...) +#endif +static VMINT flag_delete_log; +extern vm_thread_mutex_struct client_mutex; + +void app_log_file(char *fmt, ...) +{ + va_list args; + VMINT drv, hdl; + VMUINT written; + VMINT ret; + vm_time_t time = {0}; + char buf[LOG_BUF_SIZE] = {0}; + VMWCHAR wpath[FILE_PATH_SIZE] = {0}; + VMCHAR path[FILE_PATH_SIZE] = {0}; + + buf[LOG_BUF_SIZE - 2] = '\r'; + buf[LOG_BUF_SIZE - 1] = '\n'; + + va_start( args, fmt ); + vm_get_time(&time); + //ret = va_arg(args, int); + vm_sprintf(buf+strlen(buf), "[%02d:%02d:%02d]", time.hour, time.min, time.sec); + vm_vsprintf(buf+strlen(buf), fmt, args); + + drv = vm_get_removable_driver() > 0 ? vm_get_removeable_driver() : vm_get_system_driver(); + vm_sprintf(path, "%c:\\%s", drv, BT_NAME".log"); + + //vm_log_debug(path); + vm_gb2312_to_ucs2(wpath, sizeof(wpath), path); + //file[0] = (VMWCHAR)drv; + //vm_wsprintf(file, FILE_PATH_SIZE, L"%c:\\%s", + //vm_wstrcat(&file[1], (VMWSTR)L":\\spp_svr.log"); + hdl = vm_file_open(wpath, MODE_APPEND, 0); + if (hdl < 0) + hdl = vm_file_open(wpath, MODE_CREATE_ALWAYS_WRITE, 0); + else + { + if (!flag_delete_log) + { + vm_file_close(hdl); + vm_file_delete(wpath); + flag_delete_log = 1; + hdl = vm_file_open(wpath, MODE_CREATE_ALWAYS_WRITE, 0); + //return; + } + } + //vm_file_seek(hdl, 0, BASE_END); + vm_file_write(hdl, buf, LOG_BUF_SIZE, &written); + vm_file_close(hdl); + + va_end( args ); +} + + +//APP_LOG("receive msg = %d", message); +//APP_LOG((char*)"open failed"); + +#define SPP_UUID 0x1101 +#define MAX_DEVICE_SCANNED 10 + +typedef enum{ + BT_CLIENT_IDLE = 0, + BT_CLIENT_BEGINING = 1, // not even power on, need to power on first + BT_CLIENT_POWERING_ON = 2, // waiting for power on to process + BT_CLIENT_READY = 3, // power on and init done + BT_CLIENT_ENDING = 4, // not event powr off, need to power off first + BT_CLIENT_POWERING_OFF = 5 // waiting for power off to process +}bt_client_status; + +class btClientContext +{ + public: + LBTClientClass *ptr; + VMINT search_tid; + VMINT btcm_hdl; + VMINT btspp_hdl; + VMINT btspp_buf_size; + void* btspp_buf; + + bt_client_status client_status; + size_t scan_number; + VMINT conn_id; + boolean* waiting_result_p; + size_t* scan_number_p; + + btClientContext(int x, int y); +}; + +btClientContext::btClientContext(int x, int y) +{ + btcm_hdl = x; // -1 + btspp_hdl = -1; + btspp_buf_size = -0; + btspp_buf = NULL; + //client_status(BT_CLIENT_IDLE), + scan_number = 0; + conn_id = -1; + waiting_result_p = NULL; + scan_number_p = NULL; + client_status = (bt_client_status)y; // BT_CLIENT_IDLE; + APP_LOG("btClientContext::btClientContext, [%d,%d] [%d,%d]", x, y, btcm_hdl, client_status); +} + + +btClientContext g_clientContext(-1, 0); + +static VMINT bt_client_init_spp(); +static boolean bt_client_end_spp(); + +static void bt_client_btcm_cb(VMUINT evt, void * param, void * user_data) +{ + + APP_LOG("[BTC]bt_client_btcm_cb, evt = %d, client_status = %d", evt, g_clientContext.client_status); + + switch (evt) + { + case VM_SRV_BT_CM_EVENT_ACTIVATE: + { + // waiting for power on to process + if (g_clientContext.client_status == BT_CLIENT_POWERING_ON) + { + VMINT ret = bt_client_init_spp(); + + if(ret<0) + { + *(g_clientContext.waiting_result_p) = false; + g_clientContext.waiting_result_p = NULL; + + if(bt_client_end_spp()) + { + + //LTask.post_signal(); + g_clientContext.ptr->post_signal(); + + } + } + else + { + *(g_clientContext.waiting_result_p) = true; + g_clientContext.waiting_result_p = NULL; + + //LTask.post_signal(); + g_clientContext.ptr->post_signal(); + + } + + } + else if (g_clientContext.client_status == BT_CLIENT_ENDING) + { + VMINT ret = vm_btcm_switch_off(); + + if(VM_SRV_BT_CM_RESULT_SUCCESS == ret) + { + //wait for callback to process + g_clientContext.client_status = BT_CLIENT_POWERING_OFF; + } + else + { + if(g_clientContext.btcm_hdl >= 0) + { + vm_btcm_exit(g_clientContext.btcm_hdl); + g_clientContext.btcm_hdl = -1; + } + + g_clientContext.client_status = BT_CLIENT_IDLE; + + //LTask.post_signal(); + g_clientContext.ptr->post_signal(); + + } + } + + break; + } + + case VM_SRV_BT_CM_EVENT_DEACTIVATE: + { + if (g_clientContext.client_status == BT_CLIENT_BEGINING) + { + VMINT ret = vm_btcm_switch_on(); + + if(VM_SRV_BT_CM_RESULT_SUCCESS == ret) + { + //wait for callback to process + g_clientContext.client_status = BT_CLIENT_POWERING_ON; + } + else + { + *(g_clientContext.waiting_result_p) = false; + g_clientContext.waiting_result_p = NULL; + + if(bt_client_end_spp()) + { + + //LTask.post_signal(); + g_clientContext.ptr->post_signal(); + + } + } + } + else if(g_clientContext.client_status == BT_CLIENT_POWERING_OFF) + { + if(g_clientContext.btcm_hdl >= 0) + { + vm_btcm_exit(g_clientContext.btcm_hdl); + g_clientContext.btcm_hdl = -1; + } + + g_clientContext.client_status = BT_CLIENT_IDLE; + + //LTask.post_signal(); + g_clientContext.ptr->post_signal(); + + } + + break; + } + + case VM_SRV_BT_CM_EVENT_INQUIRY_IND: + { + vm_srv_bt_cm_inquiry_indication_struct *ind = (vm_srv_bt_cm_inquiry_indication_struct *)param; + + if (ind->discovered_dev_num > 0) + { + g_clientContext.scan_number = ind->discovered_dev_num; + } + + + APP_LOG("[BTC]bt_client_btcm_cb, scan_number = %d, discovered_dev_num = %d", g_clientContext.scan_number, ind->discovered_dev_num); + vm_srv_bt_cm_dev_struct dev_info ; + *(g_clientContext.scan_number_p) = g_clientContext.scan_number; + for (int i = 0; i < ind->discovered_dev_num; i++) + { + if( VM_BT_CM_ERR_SUCCESS == vm_btcm_get_dev_info_by_index(i, VM_SRV_BT_CM_DISCOVERED_DEV, &dev_info) ) + { + LBTAddress addr; + addr.nap[0] = (dev_info.bd_addr.nap & 0x00ff); + addr.nap[1] = (dev_info.bd_addr.nap & 0xff00) >> 8; + addr.uap = dev_info.bd_addr.uap; + addr.lap[0] = (dev_info.bd_addr.lap & 0x0000ff); + addr.lap[1] = (dev_info.bd_addr.lap & 0x00ff00) >> 8; + addr.lap[2] = (dev_info.bd_addr.lap & 0xff0000) >> 16; + + APP_LOG("[BTC]VM_SRV_BT_CM_EVENT_INQUIRY_IND, name: %s", dev_info.name); + + + APP_LOG("[BTC]VM_SRV_BT_CM_EVENT_INQUIRY_IND, address: %02x:%02x:%02x:%02x:%02x:%02x:", + addr.nap[1], + addr.nap[0], + addr.uap, + addr.lap[2], + addr.lap[1], + addr.lap[0]); + + } + } + /*if (10 == g_clientContext.scan_number) + { + vm_btcm_search_abort(); + g_clientContext.ptr->post_signal(); + }*/ + + break; + } + + case VM_SRV_BT_CM_EVENT_INQUIRY_COMPLETE: + { + vm_srv_bt_cm_inquiry_complete_struct *cmpl = (vm_srv_bt_cm_inquiry_complete_struct *)param; + + *(g_clientContext.scan_number_p) = g_clientContext.scan_number; + + //LTask.post_signal(); + g_clientContext.ptr->post_signal(); + + break; + } + + case VM_SRV_BT_CM_EVENT_PAIR_IND: + { + vm_srv_bt_cm_pair_ind_struct *event = (vm_srv_bt_cm_pair_ind_struct *)param; + vm_bt_cm_send_passkey(&event->dev_addr, (VMUINT8*)LBTClient._pincode_buffer, VM_TRUE); + break; + } + + default: + { + break; + } + } + + +} + +static int bt_client_spp_read(void* data) +{ + //char readdata[LBT_SERIAL_BUFFER_SIZE]; + VMINT ret = 0; + VMINT i = 0; + if(g_clientContext.conn_id < 0) + { + //not connected yet + + APP_LOG((char*)"[BTC]bt_client_spp_read : not connected yet"); + + return true; + } + char *readdata = new char[LBT_SERIAL_BUFFER_SIZE]; + if(readdata == NULL) + { + APP_LOG((char*)"[BTC]bt_client_spp_read : allocate memory fail"); + return false; + } + ret = vm_btspp_read(g_clientContext.conn_id, (void*)readdata, LBT_SERIAL_BUFFER_SIZE); + + APP_LOG("[BTC]bt_client_spp_read, ret: %d", ret); + + if (ret < 0) + { + APP_LOG((char*)"[BTC]bt_client_spp_read : read data fail"); + + } + else + { + if(client_mutex.guard == 0) + { + vm_mutex_create(&client_mutex); + } + vm_mutex_lock(&client_mutex); + for(i=0;istore_char(readdata[i]); + } + vm_mutex_unlock(&client_mutex); + APP_LOG((char*)"[BTC]bt_client_spp_read : read data success"); + } + delete[] readdata; + return ret; +} + +static void bt_client_spp_cb(VMUINT evt, void * param, void * user_data) +{ + vm_srv_spp_event_cntx* cntx = (vm_srv_spp_event_cntx*)param; + + switch(evt) + { + case VM_SRV_SPP_EVENT_CONNECT: + { + if (cntx->ret) + { + //connect successfully + if(g_clientContext.waiting_result_p != NULL) + { + *(g_clientContext.waiting_result_p) = true; + } + g_clientContext.conn_id = cntx->conn_id; + } + else + { + //connnet fail + if(g_clientContext.waiting_result_p != NULL) + { + *(g_clientContext.waiting_result_p) = false; + } + } + + if(g_clientContext.waiting_result_p != NULL) + { + g_clientContext.waiting_result_p = NULL; + + //LTask.post_signal(); + g_clientContext.ptr->post_signal(); + + } + else + { + // reconnection + } + break; + } + + case VM_SRV_SPP_EVENT_DISCONNECT: + { + g_clientContext.conn_id = -1; + break; + } + + case VM_SRV_SPP_EVENT_READY_TO_WRITE: + { + g_clientContext.ptr->post_signal_write(); + break; + } + + case VM_SRV_SPP_EVENT_READY_TO_READ: + { + bt_client_spp_read(NULL); + +#if(0) + g_clientContext.ptr->post_signal_read(); +#endif + break; + } + + } + +} + +static VMINT bt_client_init_spp() +{ + VMUINT evt_mask = VM_SRV_SPP_EVENT_CONNECT | + VM_SRV_SPP_EVENT_READY_TO_WRITE | + VM_SRV_SPP_EVENT_READY_TO_READ | + VM_SRV_SPP_EVENT_DISCONNECT; + + g_clientContext.btspp_hdl = vm_btspp_open(evt_mask,bt_client_spp_cb,NULL); + + if(g_clientContext.btspp_hdl < 0) + { + APP_LOG((char*)"[BTC]bt_client_init_spp fail : btspp_open"); + + return g_clientContext.btspp_hdl; + } + + vm_btspp_set_security_level(g_clientContext.btspp_hdl,VM_SRV_SPP_SEC_NAN); + + VMINT min_buf_size = vm_btspp_get_min_buf_size(); + g_clientContext.btspp_buf = vm_calloc(min_buf_size); + g_clientContext.btspp_buf_size = min_buf_size; + + if(g_clientContext.btspp_buf == NULL) + { + APP_LOG((char*)"[BTC]bt_client_init_spp fail : alloc buffer"); + + return -1; + } + + APP_LOG("[BTC]bt_client_init_spp done, btspp_hdl=%d", g_clientContext.btspp_hdl); + + return 0; + +} + +static boolean bt_client_end_spp() +{ + if(g_clientContext.btspp_hdl >= 0) + { + vm_btspp_close(g_clientContext.btspp_hdl); + g_clientContext.btspp_hdl = -1; + } + + if(g_clientContext.btspp_buf != NULL) + { + vm_free(g_clientContext.btspp_buf); + g_clientContext.btspp_buf = NULL; + } + + if(g_clientContext.conn_id >= 0) + { + g_clientContext.conn_id = -1; + } + + VMINT ret = vm_btcm_get_power_status(); + + APP_LOG("[BTC]bt_client_end_spp, power status = %d", ret); + + if (VM_SRV_BT_CM_POWER_ON == ret) + { + VMINT ret = vm_btcm_switch_off(); + + if(VM_SRV_BT_CM_RESULT_SUCCESS == ret) + { + //wait for callback to process + g_clientContext.client_status = BT_CLIENT_POWERING_OFF; + + APP_LOG("[BTC]bt_client_end_spp, wait for power off bt 1"); + + return false; + } + } + else if (VM_SRV_BT_CM_POWER_SWITCHING_ON == ret) + { + g_clientContext.client_status = BT_CLIENT_ENDING; + + APP_LOG("[BTC]bt_client_end_spp, wait for power on bt"); + + return false; + } + else if (VM_SRV_BT_CM_POWER_SWITCHING_OFF == ret) + { + g_clientContext.client_status = BT_CLIENT_POWERING_OFF; + + APP_LOG("[BTC]bt_client_end_spp, wait for power off bt 2"); + + return false; + } + + // VM_SRV_BT_CM_POWER_OFF + if(g_clientContext.btcm_hdl >= 0) + { + vm_btcm_exit(g_clientContext.btcm_hdl); + g_clientContext.btcm_hdl = -1; + } + + g_clientContext.client_status = BT_CLIENT_IDLE; + + APP_LOG("[BTC]bt_client_end_spp, done"); + + return true; + +} + +boolean btClientBegin(void *userData) +{ + + APP_LOG("[Kinse][BTC]btClientBegin, 1"); + + APP_LOG("[Kinse][BTC]btClientBegin = %d, status[%d]" , g_clientContext.btcm_hdl, g_clientContext.client_status); + + LBTClientBeginContext* c = (LBTClientBeginContext*) userData; + g_clientContext.ptr = (LBTClientClass*)c->ptr; + if(c->is_set_pin == true) + { + vm_custom_set_bt_pairing_method(VM_PIN_AND_SSP); + } + if(g_clientContext.btcm_hdl >= 0) + { + //already inited + c->result = false; + APP_LOG((char*)"[BTC]btClientBegin fail : already inited"); + return true; + } + + g_clientContext.btcm_hdl = vm_btcm_init( + bt_client_btcm_cb, + VM_SRV_BT_CM_EVENT_ACTIVATE | + VM_SRV_BT_CM_EVENT_DEACTIVATE | + VM_SRV_BT_CM_EVENT_INQUIRY_IND | + VM_SRV_BT_CM_EVENT_PAIR_IND | + VM_SRV_BT_CM_EVENT_SECURITY_USER_CONFIRM | + VM_SRV_BT_CM_EVENT_INQUIRY_COMPLETE, + NULL); + + APP_LOG("[Kinse][BTC]btClientBegin, 2 = %d" ,g_clientContext.btcm_hdl); + + if(g_clientContext.btcm_hdl < 0) + { + //init btcm fail + c->result = false; + APP_LOG((char*)"[BTC]btClientBegin fail : btcm_init fail"); + return true; + } + + //return true; + + VMINT ret = vm_btcm_get_power_status(); + + APP_LOG("[BTC]btClientBegin, power status = %d", ret); + + if (VM_SRV_BT_CM_POWER_OFF == ret) + { + ret = vm_btcm_switch_on(); + + if(VM_SRV_BT_CM_RESULT_SUCCESS == ret) + { + //wait for callback to process + g_clientContext.client_status = BT_CLIENT_POWERING_ON; + g_clientContext.waiting_result_p = &(c->result); + + APP_LOG("[BTC]btClientBegin, wait for power on bt 1, btcm_hdl=%d", g_clientContext.btcm_hdl); + + return false; + } + } + else if (VM_SRV_BT_CM_POWER_SWITCHING_OFF == ret) + { + g_clientContext.client_status = BT_CLIENT_BEGINING; + g_clientContext.waiting_result_p = &(c->result); + + APP_LOG("[BTC]btClientBegin, wait for power off bt, btcm_hdl=%d", g_clientContext.btcm_hdl); + + return false; + } + else if (VM_SRV_BT_CM_POWER_SWITCHING_ON == ret) + { + g_clientContext.client_status = BT_CLIENT_POWERING_ON; + g_clientContext.waiting_result_p = &(c->result); + + APP_LOG("[BTC]btClientBegin, wait for power on bt 2, btcm_hdl=%d", g_clientContext.btcm_hdl); + + return false; + } + else if (VM_SRV_BT_CM_POWER_ON == ret) + { + ret = bt_client_init_spp(); + } + + if(ret<0) + { + c->result = false; + APP_LOG((char*)"[BTC]btClientBegin fail : init app fail"); + return bt_client_end_spp(); + } + + //success + g_clientContext.client_status = BT_CLIENT_READY; + c->result = true; + + APP_LOG("[BTC]btClientBegin done, btcm_hdl=%d", g_clientContext.btcm_hdl); + + return true; + +} + + +boolean btClientEnd(void *userData) +{ + APP_LOG("[BTC]btClientEnd"); + + return bt_client_end_spp();; +} + +boolean btClientConnect(void *userData) +{ + LBTClientConnectContext* pContext = (LBTClientConnectContext*)userData ; + + if(g_clientContext.conn_id != -1) + { + //someone connected + APP_LOG((char*)"[BTC]btClientConnect fail : already connected = %d", g_clientContext.conn_id); + + pContext->result = false; + return true; + } + + vm_srv_bt_cm_bt_addr btspp_addr = {0}; + btspp_addr.lap = ((0x000000ff & (VMUINT)pContext->address->lap[2]) << 16) | + ((0x000000ff & (VMUINT)pContext->address->lap[1]) << 8) | + (0x000000ff & (VMUINT)pContext->address->lap[0]); + btspp_addr.uap = pContext->address->uap; + btspp_addr.nap = ((0x00ff & (VMUINT16)pContext->address->nap[1]) << 8) | (0x00ff & (VMUINT16)pContext->address->nap[0]); + VMUINT8 *tmp = (VMUINT8*)&btspp_addr.nap; + APP_LOG("[BTC]btClientConnect nap 0x%x, 0x%x", tmp[1], tmp[0]); + APP_LOG("[BTC]btClientConnect nap:%x, uap:%x, lap:%x", btspp_addr.nap, btspp_addr.uap, btspp_addr.lap); + + VMINT ret = vm_btspp_connect( + g_clientContext.btspp_hdl, + &btspp_addr, + g_clientContext.btspp_buf, + g_clientContext.btspp_buf_size/2, + g_clientContext.btspp_buf_size/2, + SPP_UUID); + + //LBTAddress tmp_addr = {0}; + + //memcpy(&tmp_addr, &btspp_addr, sizeof(LBTAddress)); + + APP_LOG("[BTC]btClientConnect ret[%d], address: %02x:%02x:%02x:%02x:%02x:%02x:", + ret, + pContext->address->nap[1], + pContext->address->nap[0], + pContext->address->uap, + pContext->address->lap[2], + pContext->address->lap[1], + pContext->address->lap[0]); + + + if( ret < 0) + { + //connect fail + pContext->result = false; + return true; + } + + // wait for connect result + g_clientContext.waiting_result_p = &(pContext->result); + return false; +} + +boolean btClientConnected(void *userData) +{ + boolean* result = (boolean*) userData; + + APP_LOG("[BTC]btClientConnected, conn_id = %d", g_clientContext.conn_id); + + if(g_clientContext.conn_id != -1) + { + //connected + *result = true; + } + else + { + //not connected yet + *result = false; + } + + return true; +} + +static void bt_client_timeout_cb(VMINT tid) +{ + APP_LOG("[BTC]bt_client_timeout_cb %d", tid); + if (tid == g_clientContext.search_tid) + { + vm_btcm_search_abort(); + vm_delete_timer(g_clientContext.search_tid); + g_clientContext.search_tid = 0; + //g_clientContext.ptr->post_signal(); + } +} +boolean btClientScan(void *userData) +{ + LBTClientScanContext* pContext = (LBTClientScanContext*)userData ; + + g_clientContext.scan_number = 0; + + APP_LOG("[BTC]btClientScan, time_out = %d", pContext->time_out); + + if(pContext->time_out == 0) + { + pContext->number = g_clientContext.scan_number; + return true ; + } + + VMINT ret = vm_btcm_search(MAX_DEVICE_SCANNED, pContext->time_out, 0xFFFFFFFF, 1); + + if (ret < 0) + { + pContext->number = g_clientContext.scan_number; + + APP_LOG((char*)"[BTC]btClientScan fail : btcm_search fail"); + + return true; + } + + g_clientContext.search_tid = vm_create_timer(pContext->time_out*1000, bt_client_timeout_cb); + APP_LOG("[BTC]search_tid = %d, timeout = %d", g_clientContext.search_tid, pContext->time_out*1000); + g_clientContext.scan_number_p = &(pContext->number); + return false; +} + +boolean btClientGetDeviceInfo(void *userData) +{ + + LBTClientGetDeviceInfoContext* pContext = (LBTClientGetDeviceInfoContext*)userData; + + if(pContext->index < 0 || pContext->index >= g_clientContext.scan_number) + { + //invalid range + + APP_LOG((char*)"[BTC]btClientGetDeviceInfo : invalid range = %d", pContext->index); + + pContext->result = false; + return true; + } + + vm_srv_bt_cm_dev_struct dev_info ; + + if( VM_BT_CM_ERR_SUCCESS == vm_btcm_get_dev_info_by_index(pContext->index, VM_SRV_BT_CM_DISCOVERED_DEV, &dev_info) ) + { + pContext->device_info->address.nap[0] = (dev_info.bd_addr.nap & 0x00ff); + pContext->device_info->address.nap[1] = (dev_info.bd_addr.nap & 0xff00) >> 8; + pContext->device_info->address.uap = dev_info.bd_addr.uap; + pContext->device_info->address.lap[0] = (dev_info.bd_addr.lap & 0x0000ff); + pContext->device_info->address.lap[1] = (dev_info.bd_addr.lap & 0x00ff00) >> 8; + pContext->device_info->address.lap[2] = (dev_info.bd_addr.lap & 0xff0000) >> 16; + + strcpy(pContext->device_info->name, (const char*)dev_info.name); + + APP_LOG("[BTC]btClientGetDeviceInfo, name: %s", dev_info.name); + + APP_LOG("[BTC]btClientGetDeviceInfo, bd_addr: nap:%x, uap:%x, lap:%x", + dev_info.bd_addr.nap, + dev_info.bd_addr.uap, + dev_info.bd_addr.lap); + + + APP_LOG("[BTC]btClientGetDeviceInfo, address: %02x:%02x:%02x:%02x:%02x:%02x:", + pContext->device_info->address.nap[1], + pContext->device_info->address.nap[0], + pContext->device_info->address.uap, + pContext->device_info->address.lap[2], + pContext->device_info->address.lap[1], + pContext->device_info->address.lap[0]); + + pContext->result = true; + } + else + { + // fail to get the device info + APP_LOG((char*)"[BTC]btClientGetDeviceInfo : get_dev_info_by_index fail"); + pContext->result = false; + } + + return true; + +} + +boolean btClientRead(void *userData) +{ + + LBTClientReadWriteContext* pContext = (LBTClientReadWriteContext*)userData; + + if(g_clientContext.conn_id < 0) + { + //not connected yet + + APP_LOG((char*)"[BTC]btClientRead : not connected yet"); + + pContext->lenProcessed = 0; + return true; + } + + VMINT ret = vm_btspp_read(g_clientContext.conn_id, pContext->buf, pContext->len); + + APP_LOG("[BTC]btClientRead, ret: %d", ret); + + if (ret < 0) + { + //read fail + pContext->lenProcessed = 0; + } + else + { + pContext->lenProcessed = ret; + } + + return true; +} + +boolean btClientWrite(void *userData) +{ + LBTClientReadWriteContext* pContext = (LBTClientReadWriteContext*)userData; + + if(g_clientContext.conn_id < 0) + { + //not connected yet + + APP_LOG((char*)"[BTC]btClientWrite : not connected yet"); + + pContext->lenProcessed = 0; + return true; + } + + VMINT ret = vm_btspp_write(g_clientContext.conn_id, pContext->buf, pContext->len); + + APP_LOG("[BTC]btClientWrite, ret: %d", ret); + + if (ret < 0) + { + //read fail + pContext->lenProcessed = 0; + } + else + { + pContext->lenProcessed = ret; + } + + return true; +} + diff --git a/hardware/arduino/mtk/libraries/LBT/utility/BTClient.h b/hardware/arduino/mtk/libraries/LBT/utility/BTClient.h new file mode 100644 index 00000000..fad22c87 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/utility/BTClient.h @@ -0,0 +1,55 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef BT_CLIENT_H +#define BT_CLIENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +boolean btClientBegin(void *userData); +boolean btClientEnd(void *userData); +boolean btClientConnect(void *userData); +boolean btClientConnected(void *userData); +boolean btClientScan(void *userData); +boolean btClientGetDeviceInfo(void *userData); +boolean btClientRead(void *userData); +boolean btClientWrite(void *userData); + +#ifdef __cplusplus +} +#endif + +#endif //#ifndef BT_CLIENT_H \ No newline at end of file diff --git a/hardware/arduino/mtk/libraries/LBT/utility/BTServer.cpp b/hardware/arduino/mtk/libraries/LBT/utility/BTServer.cpp new file mode 100644 index 00000000..142cf807 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/utility/BTServer.cpp @@ -0,0 +1,784 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "arduino.h" +#include "LBT.h" +#include "Vmbtcm.h" +#include "Vmtimer.h" +#include "Vmbtspp.h" +#include "vmlog.h" +#include "BTServer.h" +#include "LBTServer.h" +#include "vmthread.h" +#include "vmstdlib.h" +#include "vmio.h" +#include "vmchset.h" + +#define BT_NAME "SPP" +#define LOG_BUF_SIZE 96 +#define FILE_PATH_SIZE 16 +#define SPP_DATA "Hello SPP!" +#ifdef LBT_DEBUG +#define APP_LOG(...) app_log_file(__VA_ARGS__); \ + vm_log_info(__VA_ARGS__) +#else +#define APP_LOG(...) +#endif +static VMINT flag_delete_log; +extern vm_thread_mutex_struct server_mutex; + +extern void app_log_file(char *fmt, ...); + + + +//vm_log_info("receive msg = %d", message); +//vm_log_warn((char*)"open failed"); + +#define SPP_UUID 0x1101 + +typedef enum +{ + BT_SERVER_IDLE = 0, + BT_SERVER_BEGINING = 1, // not even power on, need to power on first + BT_SERVER_POWERING_ON = 2, // waiting for power on to process + BT_SERVER_READY = 3, // power on and init done + BT_SERVER_ENDING = 4, // not event powr off, need to power off first + BT_SERVER_POWERING_OFF = 5 // waiting for power off to process +}bt_server_status; + +struct btServerContext +{ + LBTServerClass *ptr; + VMINT btcm_hdl; + VMINT btspp_hdl; + VMINT btspp_buf_size; + void* btspp_buf; + VMINT accept_tid; + + bt_server_status server_status; + VMINT conn_id; + boolean waiting_for_accept; + boolean* waiting_result_p; + void* device_name_p; + LBTAddress address; + boolean mac_only; + + btServerContext(): + btcm_hdl(-1), + btspp_hdl(-1), + btspp_buf_size(0), + btspp_buf(NULL), + accept_tid(-1), + server_status(BT_SERVER_IDLE), + conn_id(-1), + waiting_for_accept(false), + waiting_result_p(NULL), + device_name_p(NULL) + { + APP_LOG("[BTC]btServerContext, server_status[%d]", server_status); + } + +}; + +btServerContext g_serverContext; + +static VMINT bt_server_init_spp(uint8_t* name); +static boolean bt_server_end_spp(); + +static void bt_server_btcm_cb(VMUINT evt, void * param, void * user_data) +{ + + APP_LOG("[BTC]bt_server_btcm_cb, evt = %d, client_status = %d", evt, g_serverContext.server_status); + + switch (evt) + { + case VM_SRV_BT_CM_EVENT_ACTIVATE: + { + // waiting for power on to process + if (g_serverContext.server_status == BT_SERVER_POWERING_ON) + { + VMINT ret = bt_server_init_spp((uint8_t*)g_serverContext.device_name_p); + APP_LOG("[BTC]bt_server_init_spp[%d]", ret); + + if(ret<0) + { + *(g_serverContext.waiting_result_p) = false; + g_serverContext.waiting_result_p = NULL; + + if(bt_server_end_spp()) + { + //LTask.post_signal(); + g_serverContext.ptr->post_signal(); + } + } + else if (ret == 0) + { + *(g_serverContext.waiting_result_p) = true; + g_serverContext.waiting_result_p = NULL; + //LTask.post_signal(); + g_serverContext.ptr->post_signal(); + } + + } + else if (g_serverContext.server_status == BT_SERVER_ENDING) + { + VMINT ret = vm_btcm_switch_off(); + + if(VM_SRV_BT_CM_RESULT_SUCCESS == ret) + { + //wait for callback to process + g_serverContext.server_status = BT_SERVER_POWERING_OFF; + } + else + { + if(g_serverContext.btcm_hdl >= 0) + { + vm_btcm_exit(g_serverContext.btcm_hdl); + g_serverContext.btcm_hdl = -1; + } + + g_serverContext.server_status = BT_SERVER_IDLE; + //LTask.post_signal(); + g_serverContext.ptr->post_signal(); + } + } + + break; + } + + case VM_SRV_BT_CM_EVENT_DEACTIVATE: + { + if (g_serverContext.server_status == BT_SERVER_BEGINING) + { + VMINT ret = vm_btcm_switch_on(); + + if(VM_SRV_BT_CM_RESULT_SUCCESS == ret) + { + //wait for callback to process + g_serverContext.server_status = BT_SERVER_POWERING_ON; + } + else + { + *(g_serverContext.waiting_result_p) = false; + g_serverContext.waiting_result_p = NULL; + + if(bt_server_end_spp()) + { + //LTask.post_signal(); + g_serverContext.ptr->post_signal(); + } + } + } + else if(g_serverContext.server_status == BT_SERVER_POWERING_OFF) + { + if(g_serverContext.btcm_hdl >= 0) + { + vm_btcm_exit(g_serverContext.btcm_hdl); + g_serverContext.btcm_hdl = -1; + } + + g_serverContext.server_status = BT_SERVER_IDLE; + //LTask.post_signal(); + g_serverContext.ptr->post_signal(); + } + + break; + } + + case VM_SRV_BT_CM_EVENT_SET_VISIBILITY: + { + APP_LOG("[BTC] VM_SRV_BT_CM_EVENT_SET_VISIBILITY"); + //LTask.post_signal(); + g_serverContext.ptr->post_signal(); + break; + } + + case VM_SRV_BT_CM_EVENT_SET_NAME: + { + break; + } + + case VM_SRV_BT_CM_EVENT_PAIR_IND: + { + vm_srv_bt_cm_pair_ind_struct *event = (vm_srv_bt_cm_pair_ind_struct *)param; + vm_bt_cm_send_passkey(&event->dev_addr, (VMUINT8*)LBTServer._pincode_buffer, VM_TRUE); + break; + } + default: + { + break; + } + } + + +} + +static void bt_server_accept_timeout_cb(VMINT tid) +{ + APP_LOG("bt_server_accept_timeout_cb tid[%d][%d]", tid, g_serverContext.accept_tid); + if (tid == g_serverContext.accept_tid && g_serverContext.waiting_for_accept) + { + g_serverContext.waiting_for_accept = false; + vm_delete_timer(g_serverContext.accept_tid); + g_serverContext.accept_tid = -1; + + *(g_serverContext.waiting_result_p) = false; + g_serverContext.waiting_result_p = NULL; + + //LTask.post_signal(); + g_serverContext.ptr->post_signal(); + } +} + +static int bt_server_spp_read(void* data) +{ + + VMINT ret = 0; + VMINT i = 0; + if(g_serverContext.conn_id < 0) + { + //not connected yet + + APP_LOG((char*)"[BTC]bt_server_spp_read : not connected yet"); + + return true; + } + char *readdata = new char[LBT_SERIAL_BUFFER_SIZE]; + if(readdata == NULL) + { + APP_LOG((char*)"[BTC]bt_server_spp_read : allocate memory fail"); + return false; + } + ret = vm_btspp_read(g_serverContext.conn_id, (void*)readdata, LBT_SERIAL_BUFFER_SIZE); + + APP_LOG("[BTC]bt_server_spp_read, ret: %d", ret); + + if (ret < 0) + { + APP_LOG((char*)"[BTC]bt_server_spp_read : read data fail"); + + } + else + { + + if(server_mutex.guard == 0) + { + vm_mutex_create(&server_mutex); + } + vm_mutex_lock(&server_mutex); + for(i=0;istore_char(readdata[i]); + } + vm_mutex_unlock(&server_mutex); + + APP_LOG((char*)"[BTC]btServerRead : read data success"); + } + delete[] readdata; + return ret; +} + +static void bt_server_spp_cb(VMUINT evt, void * param, void * user_data) +{ + vm_srv_spp_event_cntx* cntx = (vm_srv_spp_event_cntx*)param; + + switch(evt) + { + case VM_SRV_SPP_EVENT_CONNECT: + { + if (cntx->ret) + { + //connect successfully + if(g_serverContext.waiting_result_p != NULL) + { + *(g_serverContext.waiting_result_p) = true; + } + g_serverContext.conn_id = cntx->conn_id; + } + else + { + //connnet fail + if(g_serverContext.waiting_result_p != NULL) + { + *(g_serverContext.waiting_result_p) = false; + } + } + + if(g_serverContext.waiting_result_p != NULL) + { + g_serverContext.waiting_result_p = NULL; + //LTask.post_signal(); + g_serverContext.ptr->post_signal(); + bt_server_accept_timeout_cb(g_serverContext.accept_tid); + } + else + { + // reconnection + } + + break; + } + + case VM_SRV_SPP_EVENT_DISCONNECT: + { + g_serverContext.conn_id = -1; + APP_LOG((char*)"[BTS]VM_SRV_SPP_EVENT_DISCONNECT"); + break; + } + + case VM_SRV_SPP_EVENT_AUTHORIZE: + { + if (g_serverContext.mac_only) + { + vm_srv_bt_cm_bt_addr curr_addr = {0}; + vm_srv_bt_cm_bt_addr tmp = {0}; + vm_btspp_get_dev_addr(cntx->conn_id, &curr_addr); + tmp.nap = (VMUINT16)((g_serverContext.address.nap[1] << 8) | g_serverContext.address.nap[0]); + tmp.uap = (VMUINT8)g_serverContext.address.uap; + tmp.lap = (VMUINT)((g_serverContext.address.lap[2] << 16) | (g_serverContext.address.lap[1] << 8) | g_serverContext.address.lap[0]); + APP_LOG("[BTS AUTH] tmp addr: nap:%x, uap:%x, lap:%x", + tmp.nap, + tmp.uap, + tmp.lap); + APP_LOG("[BTS AUTH] curr_addr: nap:%x, uap:%x, lap:%x", + curr_addr.nap, + curr_addr.uap, + curr_addr.lap); + //if (0 != memcmp(&tmp, &curr_addr, sizeof(vm_srv_bt_cm_bt_addr))) + if ((tmp.nap != curr_addr.nap) || + (tmp.uap != curr_addr.uap) || + (tmp.lap != curr_addr.lap)) + { + vm_btspp_reject(cntx->conn_id); + break; + } + } + + if(g_serverContext.waiting_for_accept) + { + VMINT ret = vm_btspp_accept(cntx->conn_id, g_serverContext.btspp_buf, g_serverContext.btspp_buf_size, g_serverContext.btspp_buf_size); + g_serverContext.waiting_for_accept = false; + vm_delete_timer(g_serverContext.accept_tid); + g_serverContext.accept_tid = -1; + } + else + { + vm_btspp_reject(cntx->conn_id); + } + + + + break; + } + + case VM_SRV_SPP_EVENT_BIND_FAIL: + { + break; + } + + case VM_SRV_SPP_EVENT_READY_TO_WRITE: + { + //g_serverContext.ptr->post_signal(); + g_serverContext.ptr->post_signal_write(); + break; + } + + case VM_SRV_SPP_EVENT_READY_TO_READ: + { + bt_server_spp_read(NULL); + #if(0) + g_serverContext.ptr->post_signal_read(); + #endif + break; + } + + + } + +} + +static VMINT bt_server_init_spp(uint8_t* name) +{ + + VMUINT evt_mask = VM_SRV_SPP_EVENT_BIND_FAIL | + VM_SRV_SPP_EVENT_AUTHORIZE | + VM_SRV_SPP_EVENT_CONNECT | + VM_SRV_SPP_EVENT_READY_TO_WRITE | + VM_SRV_SPP_EVENT_READY_TO_READ | + VM_SRV_SPP_EVENT_DISCONNECT; + + + g_serverContext.btspp_hdl = vm_btspp_open(evt_mask,bt_server_spp_cb,NULL); + + if(g_serverContext.btspp_hdl < 0) + { + APP_LOG((char*)"[BTC]bt_server_init_spp hdl[%d]", g_serverContext.btspp_hdl); + return g_serverContext.btspp_hdl; + } + vm_btspp_set_security_level(g_serverContext.btspp_hdl,VM_SRV_SPP_SEC_NAN); + + VMINT min_buf_size = vm_btspp_get_min_buf_size(); + g_serverContext.btspp_buf = vm_calloc(min_buf_size); + g_serverContext.btspp_buf_size = min_buf_size / 2; + + if(g_serverContext.btspp_buf == NULL) + { + APP_LOG((char*)"[BTC]bt_server_init_spp fail : alloc buffer"); + return -1; + } + + VMINT ret = vm_btspp_bind(g_serverContext.btspp_hdl, SPP_UUID); + + if(ret < 0) + { + APP_LOG((char*)"[BTC]bt_server_init_spp fail : btspp_bind"); + return -1; + } + + if(name != NULL) + { + ret = vm_btcm_set_host_name((VMUINT8*)name); + } + + if(ret < 0) + { + APP_LOG((char*)"[BTC]bt_server_init_spp fail : btcm_set_host_name"); + return -1; + } + + if (VM_SRV_BT_CM_VISIBILITY_ON == vm_btcm_srv_get_visibility()) + { + ret = 0; + } + else + { + ret = vm_btcm_srv_set_visibility(VM_SRV_BT_CM_VISIBILITY_ON); + if (VM_SRV_BT_CM_RESULT_SUCCESS == ret) + { + ret = 1; + } + } + APP_LOG("[BTC]bt_server_init_spp ret[%d], btspp_hdl=%d", ret, g_serverContext.btspp_hdl); + return ret; + +} + +static boolean bt_server_end_spp() +{ + if(g_serverContext.btspp_hdl >= 0) + { + vm_btspp_close(g_serverContext.btspp_hdl); + g_serverContext.btspp_hdl = -1; + } + + if(g_serverContext.btspp_buf != NULL) + { + vm_free(g_serverContext.btspp_buf); + g_serverContext.btspp_buf = NULL; + } + + if(g_serverContext.conn_id >= 0) + { + g_serverContext.conn_id = -1; + } + + VMINT ret = vm_btcm_get_power_status(); + + if (VM_SRV_BT_CM_POWER_ON == ret) + { + VMINT ret = vm_btcm_switch_off(); + + if(VM_SRV_BT_CM_RESULT_SUCCESS == ret) + { + //wait for callback to process + g_serverContext.server_status = BT_SERVER_POWERING_OFF; + return false; + } + } + else if (VM_SRV_BT_CM_POWER_SWITCHING_ON == ret) + { + g_serverContext.server_status = BT_SERVER_ENDING; + return false; + } + else if (VM_SRV_BT_CM_POWER_SWITCHING_OFF == ret) + { + g_serverContext.server_status = BT_SERVER_POWERING_OFF; + return false; + } + + // VM_SRV_BT_CM_POWER_OFF + if(g_serverContext.btcm_hdl >= 0) + { + vm_btcm_exit(g_serverContext.btcm_hdl); + g_serverContext.btcm_hdl = -1; + } + + g_serverContext.server_status = BT_SERVER_IDLE; + + return true; + +} + +boolean btServerBegin(void *userData) +{ + LBTServerBeginContext* pContext = (LBTServerBeginContext*)userData ; + + boolean* result = (boolean*) userData; + APP_LOG("btServerBegin 1"); + + g_serverContext.ptr = (LBTServerClass*)pContext->ptr; + if(pContext->is_set_pin == true) + { + vm_custom_set_bt_pairing_method(VM_PIN_AND_SSP); + } + if(g_serverContext.btcm_hdl >= 0) + { + //already inited + pContext->result = false; + APP_LOG("btServerBegin 2"); + return true; + } + + g_serverContext.btcm_hdl = vm_btcm_init( + bt_server_btcm_cb, + VM_SRV_BT_CM_EVENT_ACTIVATE | + VM_SRV_BT_CM_EVENT_DEACTIVATE | + VM_SRV_BT_CM_EVENT_SET_VISIBILITY | + VM_SRV_BT_CM_EVENT_PAIR_IND | + VM_SRV_BT_CM_EVENT_SECURITY_USER_CONFIRM | + VM_SRV_BT_CM_EVENT_SET_NAME, + NULL); + + if(g_serverContext.btcm_hdl < 0) + { + //init btcm fail + pContext->result = false; + APP_LOG("btServerBegin 3 hdl[%d]", g_serverContext.btcm_hdl); + return true; + } + + VMINT ret = vm_btcm_get_power_status(); + + if (VM_SRV_BT_CM_POWER_OFF == ret) + { + ret = vm_btcm_switch_on(); + + if(VM_SRV_BT_CM_RESULT_SUCCESS == ret) + { + //wait for callback to process + g_serverContext.server_status = BT_SERVER_POWERING_ON; + g_serverContext.waiting_result_p = &(pContext->result); + g_serverContext.device_name_p = pContext->name; + APP_LOG("btServerBegin 4"); + return false; + } + } + else if (VM_SRV_BT_CM_POWER_SWITCHING_OFF == ret) + { + g_serverContext.server_status = BT_SERVER_BEGINING; + g_serverContext.waiting_result_p = &(pContext->result); + g_serverContext.device_name_p = pContext->name; + APP_LOG("btServerBegin 5"); + return false; + } + else if (VM_SRV_BT_CM_POWER_SWITCHING_ON == ret) + { + g_serverContext.server_status = BT_SERVER_POWERING_ON; + g_serverContext.waiting_result_p = &(pContext->result); + g_serverContext.device_name_p = pContext->name; + APP_LOG("btServerBegin 6"); + return false; + } + else if (VM_SRV_BT_CM_POWER_ON == ret) + { + ret = bt_server_init_spp((uint8_t*)pContext->name); + if (ret > 0) + { + return false; + } + } + + if(ret<0) + { + pContext->result = false; + APP_LOG("btServerBegin 7 ret[%d]", ret); + return bt_server_end_spp(); + } + + //success + g_serverContext.server_status = BT_SERVER_READY; + pContext->result = true; + + APP_LOG("btServerBegin 8"); + return true; +} + + +boolean btServerEnd(void *userData) +{ + return bt_server_end_spp(); +} + +boolean btServerAccept(void *userData) +{ + LBTServerAcceptContext* pContext = (LBTServerAcceptContext*)userData ; + + if(g_serverContext.conn_id != -1) + { + //someone connected + pContext->result = false; + return true; + } + + if (pContext->address) + { + g_serverContext.mac_only = true; + memcpy(&(g_serverContext.address), pContext->address, sizeof(LBTAddress)); + APP_LOG("pContext->address [%02x:%02x:%02x:%02x:%02x:%02x]", + g_serverContext.address.nap[1], g_serverContext.address.nap[0], + g_serverContext.address.uap, + g_serverContext.address.lap[2], g_serverContext.address.lap[1], g_serverContext.address.lap[0]); + } + + g_serverContext.waiting_for_accept = true; + g_serverContext.waiting_result_p = &(pContext->result); + + g_serverContext.accept_tid = vm_create_timer(pContext->time_out*1000, bt_server_accept_timeout_cb); + APP_LOG("vm_create_timer [%d] timeout[%d]", g_serverContext.accept_tid, pContext->time_out*1000); + + return false; +} + +boolean btServerConnected(void *userData) +{ + boolean* result = (boolean*) userData; + + if(g_serverContext.conn_id != -1) + { + //connected + *result = true; + } + else + { + //not connected yet + *result = false; + } + + return true; +} + +boolean btServerGetHostDeviceInfo(void *userData) +{ + + LBTServerGetHostDeviceInfoContext* pContext = (LBTServerGetHostDeviceInfoContext*)userData; + + vm_srv_bt_cm_dev_struct dev_info ; + + if( VM_BT_CM_ERR_SUCCESS == vm_btcm_get_host_dev_info(&dev_info) ) + { + pContext->device_info->address.nap[0] = (dev_info.bd_addr.nap & 0x00ff); + pContext->device_info->address.nap[1] = (dev_info.bd_addr.nap & 0xff00) >> 8; + pContext->device_info->address.uap = dev_info.bd_addr.uap; + pContext->device_info->address.lap[0] = (dev_info.bd_addr.lap & 0x0000ff); + pContext->device_info->address.lap[1] = (dev_info.bd_addr.lap & 0x00ff00) >> 8; + pContext->device_info->address.lap[2] = (dev_info.bd_addr.lap & 0xff0000) >> 16; + + strcpy(pContext->device_info->name, (const char*)dev_info.name); + + pContext->result = true; + } + else + { + // fail to get the device info + pContext->result = false; + } + + return true; + +} + +boolean btServerRead(void *userData) +{ + + LBTServerReadWriteContext* pContext = (LBTServerReadWriteContext*)userData; + + if(g_serverContext.conn_id < 0) + { + //not connected yet + pContext->lenProcessed = 0; + return true; + } + + VMINT ret = vm_btspp_read(g_serverContext.conn_id, pContext->buf, pContext->len); + + if (ret < 0) + { + //read fail + pContext->lenProcessed = 0; + } + else + { + pContext->lenProcessed = ret; + } + + return true; +} + +boolean btServerWrite(void *userData) +{ + LBTServerReadWriteContext* pContext = (LBTServerReadWriteContext*)userData; + + if(g_serverContext.conn_id < 0) + { + //not connected yet + pContext->lenProcessed = 0; + return true; + } + + VMINT ret = vm_btspp_write(g_serverContext.conn_id, pContext->buf, pContext->len); + APP_LOG("vm_btspp_write ret[%d] [%s]", ret, pContext->buf); + + if (ret < 0) + { + //read fail + pContext->lenProcessed = 0; + } + else + { + pContext->lenProcessed = ret; + } + + return true; +} + diff --git a/hardware/arduino/mtk/libraries/LBT/utility/BTServer.h b/hardware/arduino/mtk/libraries/LBT/utility/BTServer.h new file mode 100644 index 00000000..625f42e1 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBT/utility/BTServer.h @@ -0,0 +1,55 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef BT_SERVER_H +#define BT_SERVER_H + +#ifdef __cplusplus +extern "C" { +#endif + + +boolean btServerBegin(void *userData); +boolean btServerEnd(void *userData); +boolean btServerAccept(void *userData); +boolean btServerConnected(void *userData); +boolean btServerGetHostDeviceInfo(void *userData); +boolean btServerRead(void *userData); +boolean btServerWrite(void *userData); + +#ifdef __cplusplus +} +#endif + +#endif //#ifndef BT_SERVER_H \ No newline at end of file diff --git a/hardware/arduino/mtk/libraries/LBattery/LBattery.cpp b/hardware/arduino/mtk/libraries/LBattery/LBattery.cpp new file mode 100644 index 00000000..68093ccc --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBattery/LBattery.cpp @@ -0,0 +1,52 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "arduino.h" +#include "Battery.h" +#include "LBattery.h" + +int LBatteryClass::level(void) +{ + remoteCall(batteryLevel, (void*)&m_level); + return m_level; +} + +boolean LBatteryClass::isCharging(void) +{ + remoteCall(batteryIsCharging, (void*)&m_charging); + return m_charging; +} + +LBatteryClass LBattery; + diff --git a/hardware/arduino/mtk/libraries/LBattery/LBattery.h b/hardware/arduino/mtk/libraries/LBattery/LBattery.h new file mode 100644 index 00000000..c6af13c4 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBattery/LBattery.h @@ -0,0 +1,69 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef _LBATTERY_H +#define _LBATTERY_H + +#include "LTask.h" + + +// LBattery class interface, With this library, you can get battery infomation like charging status and battery level +class LBatteryClass : public _LTaskClass { + +// Constructor / Destructor +public: + LBatteryClass() { }; + +// Method +public: + // DESCRIPTION + // Get the battery level of the board. + // RETURNS + // battery level, return value maybe one of 0,33,66,100 + int level(); + + // DESCRIPTION + // Charging or not. + // RETURNS + // true means current is charging, false means not charging + boolean isCharging(); + +private: + int m_level; + boolean m_charging; +}; + +extern LBatteryClass LBattery; + +#endif diff --git a/hardware/arduino/mtk/libraries/LBattery/examples/Battery/Battery.ino b/hardware/arduino/mtk/libraries/LBattery/examples/Battery/Battery.ino new file mode 100644 index 00000000..815a40cb --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBattery/examples/Battery/Battery.ino @@ -0,0 +1,18 @@ +#include + +char buff[256]; + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); +} + +void loop() { + // put your main code here, to run repeatedly: + sprintf(buff,"battery level = %d", LBattery.level() ); + Serial.println(buff); + sprintf(buff,"is charging = %d",LBattery.isCharging() ); + Serial.println(buff); + delay(1000); +} + diff --git a/hardware/arduino/mtk/libraries/LBattery/keywords.txt b/hardware/arduino/mtk/libraries/LBattery/keywords.txt new file mode 100644 index 00000000..f3eccecc --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBattery/keywords.txt @@ -0,0 +1,26 @@ +####################################### +# Syntax Coloring Map For LBatteryClass +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +LBattery KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +level KEYWORD2 +isCharging KEYWORD2 + +####################################### +# Object (KEYWORD3) +####################################### +LBattery KEYWORD3 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/hardware/arduino/mtk/libraries/LBattery/utility/Battery.cpp b/hardware/arduino/mtk/libraries/LBattery/utility/Battery.cpp new file mode 100644 index 00000000..246712e0 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBattery/utility/Battery.cpp @@ -0,0 +1,51 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "arduino.h" +#include "vmpwr.h" +#include "Battery.h" + +boolean batteryLevel(void* user_data) +{ + int level = vm_get_battery_level(); + *(int*)user_data = level; + return true; +} + +boolean batteryIsCharging(void* user_data) +{ + VMBOOL charging = vm_charbat_is_charging(); + *(boolean*)user_data = charging; + return true; +} diff --git a/hardware/arduino/mtk/libraries/LBattery/utility/Battery.h b/hardware/arduino/mtk/libraries/LBattery/utility/Battery.h new file mode 100644 index 00000000..922dd617 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LBattery/utility/Battery.h @@ -0,0 +1,50 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef _BATTERY_H +#define _BATTERY_H + +#ifdef __cplusplus +extern "C" { +#endif + +boolean batteryIsCharging(void* user_data); +boolean batteryLevel(void* user_data); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/hardware/arduino/mtk/libraries/LDateTime/LDateTime.cpp b/hardware/arduino/mtk/libraries/LDateTime/LDateTime.cpp new file mode 100644 index 00000000..68ed6c80 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LDateTime/LDateTime.cpp @@ -0,0 +1,57 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "vmsys.h" +#include "LDatetime.h" + +LDateTimeClass::LDateTimeClass() +{ +} + +int LDateTimeClass::getTime(datetimeInfo *time) +{ + return vm_get_time((vm_time_t *)time);//return value:-1:failed, time is null; 0:success +} + +int LDateTimeClass::setTime(datetimeInfo *time) +{ + return vm_set_time((vm_time_t *)time); +} + +int LDateTimeClass::getRtc(unsigned int *rtc) +{ + return vm_get_rtc(rtc);//return value:-2:failed, rtc is null; 0:success +} + +LDateTimeClass LDateTime; \ No newline at end of file diff --git a/hardware/arduino/mtk/libraries/LDateTime/LDateTime.h b/hardware/arduino/mtk/libraries/LDateTime/LDateTime.h new file mode 100644 index 00000000..a02a93f4 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LDateTime/LDateTime.h @@ -0,0 +1,141 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + + +#ifndef _LINKITDateTime_h +#define _LINKITDateTime_h + +//datetimeInfo struct +typedef struct +{ + int year;//year + int mon;//month,begin from 1 + int day;//day,begin from 1 + int hour;//hour,24-hour + int min;//minute + int sec;//second +}datetimeInfo; + +// LDatetimeClass is designed to get system time related function +class LDateTimeClass +{ + +// Constructor / Destructor +public: + LDateTimeClass(); + +// Method +public: + + // Return current system time + // + // RETURNS + // if succeed, return 0, otherwise return -1 + // + // EXAMPLE + // + // #include + // datetimeInfo t; + // unsigned int rtc; + // void setup() + // { + // + // } + // void loop() + // { + // LDateTime.getTime(&t); + // LDateTime.getRtc(&rtc); + // delay(1000); + // } + // + int getTime( + datetimeInfo *time // [OUT] vm_time_t structure + ); + + // Set system time + // + // RETURNS + // if succeed, return 0, otherwise return -1 + // + // EXAMPLE + // + // #include + // datetimeInfo t; + // void setup() + // { + // + // } + // void loop() + // { + // LDateTime.getTime(&t); + // delay(1000); + // } + // + int setTime( + datetimeInfo *time // [OUT] vm_time_t structure + ); + + // Get the time since the Epoch (00:00:00 UTC, January 1, 1970), + // measured in seconds. + // + // RETURNS + // if succeed, return 0, otherwise failure. + // + // EXAMPLE + // + // #include + // datetimeInfo t; + // unsigned int rtc; + // void setup() + // { + // + // } + // void loop() + // { + // LDateTime.getTime(&t); + // LDateTime.getRtc(&rtc); + // delay(1000); + // } + // + int getRtc( + unsigned int *rtc // [OUT] point to the time in seconds. + ); +}; + +//LDateTime object +extern LDateTimeClass LDateTime; + +#endif + diff --git a/hardware/arduino/mtk/libraries/LDateTime/examples/DateTime/LDateTime/LDateTime.ino b/hardware/arduino/mtk/libraries/LDateTime/examples/DateTime/LDateTime/LDateTime.ino new file mode 100644 index 00000000..b264f7ef --- /dev/null +++ b/hardware/arduino/mtk/libraries/LDateTime/examples/DateTime/LDateTime/LDateTime.ino @@ -0,0 +1,15 @@ +#include + +datetimeInfo t; +unsigned int rtc; + +void setup() { + // put your setup code here, to run once: +} + +void loop() { + // put your main code here, to run repeatedly: + LDateTime.getTime(&t); + LDateTime.getRtc(&rtc); + delay(1000); +} diff --git a/hardware/arduino/mtk/libraries/LDateTime/keywords.txt b/hardware/arduino/mtk/libraries/LDateTime/keywords.txt new file mode 100644 index 00000000..50ec5afa --- /dev/null +++ b/hardware/arduino/mtk/libraries/LDateTime/keywords.txt @@ -0,0 +1,24 @@ +####################################### +# Syntax Coloring Map For LDateTime +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### +datetimeInfo KEYWORD1 +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +getTime KEYWORD2 +getRtc KEYWORD2 + +####################################### +# Object (KEYWORD3) +####################################### +LDateTime KEYWORD3 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/hardware/arduino/mtk/libraries/LEEPROM/LEEPROM.cpp b/hardware/arduino/mtk/libraries/LEEPROM/LEEPROM.cpp new file mode 100644 index 00000000..26f08d11 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LEEPROM/LEEPROM.cpp @@ -0,0 +1,111 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "vmsys.h" +#include "LEEPROM.h" +#include "sysfile.h" +#include "vmlog.h" +#define APP_LOG(...) vm_log_info(__VA_ARGS__); \ + Serial.println(__VA_ARGS__) + +//extern void app_log_file(char *fmt, ...); + + +LEEPROMClass::LEEPROMClass(int init) : _LTaskClass(), m_init(init) +{ + //Serial.println("LEEPROMClass::LEEPROMClass"); + //APP_LOG((char*)"LEEPROMClass::LEEPROMClass"); + //_LTaskClass::begin(); + //APP_LOG((char*)"LEEPROMClass::LEEPROMClass"); +} + +/* + +LEEPROMClass::~LEEPROMClass() +{ + //APP_LOG((char*)"LEEPROMClass::~LEEPROMClass"); + //_LTaskClass::stop(); + //APP_LOG((char*)"LEEPROMClass::~LEEPROMClass"); +} +*/ +VMUINT8 LEEPROMClass::read(int addr) +{ + APP_LOG((char*)"LEEPROMClass::read [%d]", addr); + if (!m_init) + { + _LTaskClass::begin(); + m_init = 1; + } + + if (0 > addr || 1024 <= addr) + { + APP_LOG((char*)"LEEPROMClass::read e1"); + return 0; + } + g_fs_data.addr = addr; + APP_LOG((char*)"remoteCall onRead s"); + remoteCall(onRead, (void*)NULL); + APP_LOG((char*)"remoteCall onRead e"); + return getReadData(); +} + +void LEEPROMClass::write(int addr, uint8_t value) +{ + APP_LOG((char*)"LEEPROMClass::write @[%d] value[%d]", addr, value); + if (!m_init) + { + _LTaskClass::begin(); + m_init = 1; + } + + if (0 > addr || 1024 <= addr) + { + APP_LOG((char*)"LEEPROMClass::write e1"); + return; + } + g_fs_data.addr = addr; + g_fs_data.value = value; + APP_LOG((char*)"remoteCall onWrite s"); + remoteCall(onWrite, (void*)NULL); + APP_LOG((char*)"remoteCall onWrite e"); + //return 0; +} + +LEEPROMClass & getEEPROM(void) +{ + + static LEEPROMClass EEPROM_internal(0); + return EEPROM_internal; +} + diff --git a/hardware/arduino/mtk/libraries/LEEPROM/LEEPROM.h b/hardware/arduino/mtk/libraries/LEEPROM/LEEPROM.h new file mode 100644 index 00000000..52cfc5b7 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LEEPROM/LEEPROM.h @@ -0,0 +1,119 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _LINKITEEPROM_H +#define _LINKITEEPROM_H + +#include "LTask.h" + +//#include "vmsys.h" +/***************************************************************************** + * Class LEEPROMClass + ****************************************************************************/ +// LEEPROMClass is reading and writing to "permanent" storage +// +// EXAMPLE: +// +// #include +// void setup() { +// // put your setup code here, to run once: +// +// } +// +// void loop() { +// // put your main code here, to run repeatedly: +// byte a = 1; +// EEPROM.write(0, a); +// byte b = EEPROM.read(0); +// if (a == b) +// { +// // do something. +// delay(2000); +// } +// } +// +class LEEPROMClass : public _LTaskClass +{ +private: + int m_init; + +// Method +public: + LEEPROMClass(int init); + //~LEEPROMClass(); + // DESCRIPTION + //Write a byte to the EEPROM. + // RETURNS + // VMUINT8 + // EXAMPLE + // + // #include + // int a = 0; + // int value; + // void setup() + // { + // Serial.begin(9600); + // } + // void loop() + // { + // value = EEPROM.read(a); + // + // Serial.print(a); + // Serial.print("\t"); + // Serial.print(value); + // Serial.println(); + // a = a + 1; + // if (a == 512) + // a = 0; + // delay(500); + // } + // + VMUINT8 read( + int addr // addr:the location to read from, starting from 0 (int) + ); + + // DESCRIPTION + //Write a byte to the EEPROM. + // RETURNS + // VMUINT8 + // EXAMPLE + // + // #include + // + // void setup() + // { + // for (int i = 0; i < 512; i++) + // EEPROM.write(i, i); + // } + // + // void loop() + // { + // } + // + void write( + int addr, // addr:the location to write to, starting from 0 (int) + uint8_t value // value:the value to write, from 0 to 255 (byte) + ); +}; + +//extern LEEPROMClass EEPROM; +extern LEEPROMClass & getEEPROM(void); +#define EEPROM getEEPROM() + +#endif + diff --git a/hardware/arduino/mtk/libraries/LEEPROM/examples/LEEPROM_RW/LEEPROM_RW.ino b/hardware/arduino/mtk/libraries/LEEPROM/examples/LEEPROM_RW/LEEPROM_RW.ino new file mode 100644 index 00000000..7e9f1a00 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LEEPROM/examples/LEEPROM_RW/LEEPROM_RW.ino @@ -0,0 +1,35 @@ +#include + +#define ard_log Serial.printf + +void setup() { + // put your setup code here, to run once: + + Serial.begin(9600); + ard_log("setup"); + delay(5000); +} + +void loop() { + // put your main code here, to run repeatedly: + ard_log("loop"); + delay(2000); + + byte a = 1; + + + EEPROM.write(0, a); + ard_log("written"); + delay(1000); + byte b = EEPROM.read(0); + ard_log("read [%d]", b); + if (a == b) + { + // do something. + delay(1000); + } + + + + +} diff --git a/hardware/arduino/mtk/libraries/LEEPROM/utility/sysfile.cpp b/hardware/arduino/mtk/libraries/LEEPROM/utility/sysfile.cpp new file mode 100644 index 00000000..c5751d9f --- /dev/null +++ b/hardware/arduino/mtk/libraries/LEEPROM/utility/sysfile.cpp @@ -0,0 +1,137 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "arduino.h" +#include "vmio.h" +#include "vmlog.h" +#include "sysfile.h" +#include "LEEPROM.h" + +#define APP_LOG(...) vm_log_info(__VA_ARGS__); \ + Serial.println(__VA_ARGS__) +fs_data_t g_fs_data; + + +boolean onRead(void* user_data) +{ + VMINT hdl, ret; + fs_data_t *tmp_fs_data = (fs_data_t*)&g_fs_data; + VMUINT read = 0; + + APP_LOG((char*)"EEPROM onRead -s"); + if (0 > tmp_fs_data->addr) + { + setReadData(0); + APP_LOG((char*)"EEPROM fs_data->addr[%d] -e1", tmp_fs_data->addr); + return true; + } + + hdl = vm_sys_file_open(MODE_READ, 1); + if (0 > hdl) + { + setReadData(0); + APP_LOG((char*)"EEPROM hdl[%d] -e2", hdl); + return true; + } + + ret = vm_sys_file_seek(hdl, tmp_fs_data->addr, BASE_BEGIN); + APP_LOG((char*)"EEPROM vm_sys_file_seek [%d][%d]", tmp_fs_data->addr, ret); + + ret = vm_sys_file_read(hdl, &(tmp_fs_data->value), 1, &read); + APP_LOG((char*)"EEPROM vm_sys_file_read [%d][%d] v[%d]", read, ret, tmp_fs_data->value); + + setReadData(tmp_fs_data->value); + + vm_sys_file_close(hdl); + + APP_LOG((char*)"EEPROM onRead -e"); + return true; +} +boolean onWrite(void* user_data) +{ + VMINT hdl, ret; + fs_data_t *tmp_fs_data = (fs_data_t*)&g_fs_data; + VMUINT written = 0; + + APP_LOG((char*)"EEPROM onWrite -s"); + if (0 > tmp_fs_data->addr) + { + setReadData(0); + APP_LOG((char*)"EEPROM fs_data->addr[%d] -e1", tmp_fs_data->addr); + return true; + } + + hdl = vm_sys_file_open(MODE_WRITE, 1); + if (0 > hdl) + { + hdl = vm_sys_file_open(MODE_CREATE_ALWAYS_WRITE, 1); + if (0 > hdl) + { + APP_LOG((char*)"EEPROM MODE_CREATE_ALWAYS_WRITE FAILED"); + return true; + } + APP_LOG((char*)"EEPROM MODE_CREATE_ALWAYS_WRITE OK"); + } + + APP_LOG((char*)"EEPROM vm_sys_file_open [%d]", hdl); + + ret = vm_sys_file_seek(hdl, tmp_fs_data->addr, BASE_BEGIN); + APP_LOG((char*)"EEPROM vm_sys_file_seek [%d][%d]", tmp_fs_data->addr, ret); + + ret = vm_sys_file_write(hdl, &(tmp_fs_data->value), 1, &written); + APP_LOG((char*)"EEPROM vm_sys_file_write [%d][%d] v[%d]", written, ret, tmp_fs_data->value); + + setReadData(tmp_fs_data->value); + + vm_sys_file_close(hdl); + + APP_LOG((char*)"EEPROM onWrite -e"); + return true; +} + +// be called in arduino task. +VMUINT8 getReadData() +{ + APP_LOG((char*)"getReadData [%d]", g_fs_data.value); + return g_fs_data.value; +} + +// mmi task set data +void setReadData(VMUINT8 data_read) +{ + g_fs_data.value = data_read; + APP_LOG((char*)"setReadData [%d]", data_read); +} + + diff --git a/hardware/arduino/mtk/libraries/LEEPROM/utility/sysfile.h b/hardware/arduino/mtk/libraries/LEEPROM/utility/sysfile.h new file mode 100644 index 00000000..36827198 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LEEPROM/utility/sysfile.h @@ -0,0 +1,61 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef _SYSFILE_H +#define _SYSFILE_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + VMINT addr; + VMUINT8 value; +}fs_data_t; + +extern fs_data_t g_fs_data; + +boolean onRead(void* user_data); +boolean onWrite(void* user_data); + +VMUINT8 getReadData(); +void setReadData(VMUINT8 data_read); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/hardware/arduino/mtk/libraries/LGPRS/LGPRS.cpp b/hardware/arduino/mtk/libraries/LGPRS/LGPRS.cpp new file mode 100644 index 00000000..0e61039b --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/LGPRS.cpp @@ -0,0 +1,353 @@ +#include +#include "LTask.h" +#include "LGPRS.h" +#include "IPAddress.h" +#include "vmnwsetting.h" +#include "vmconn.h" +#include "vmsim.h" +#include "vmcell.h" +#include "vmlog.h" +#include "vmtcp.h" +#include "vmsettings.h" + +class LGPRSConnectContext; + +LGPRSClass::LGPRSClass(): + m_simCardReady(0) +{ + +} + +static void gprsSettingCallback(VMINT32 result, void *user_data) +{ + vm_log_info("gprsSettingCallback result=%d", result); + + // Is there GSM? + VMINT protocol = vm_srv_nw_info_get_protocol(VM_SIM_SIM1); + vm_log_info("SIM protocol=%d", protocol); + + // Is there GPRS? + // VMINT networkReady = vm_srv_nw_info_channel_supports(VM_SIM_SIM1, VM_GPRS); + //vm_log_info("SIM GPRS ready? %d", networkReady); + + // get APN info + vm_apn_info_ext apnInfo; + VMINT apnRet = vm_get_apn_info(&apnInfo); + vm_log_info("vm_get_apn_info = %d", apnRet); + vm_log_info("operator ID= %s", apnInfo.operator_id); + vm_log_info("operator Name= %s", apnInfo.operator_name); + + // retrieve cell info + VMINT openResult = vm_cell_open(); + vm_log_info("open cell = %d", openResult); + vm_cell_info_struct *pCell = vm_cell_get_cur_cell_info(); + if (pCell) + { + vm_log_info("cell rxlev=%d", pCell->rxlev); + vm_log_info("cell arfcn=%d", pCell->arfcn); + vm_log_info("cell bsic=%d", pCell->bsic); + vm_log_info("cell mcc=%d", pCell->mcc); + vm_log_info("cell mnc=%d", pCell->mnc); + vm_log_info("cell lac=%d", pCell->lac); + vm_log_info("cell ci=%d", pCell->ci); + } + else + { + vm_log_info("no cell info"); + } + + vm_cell_close(); + + // release blocking signal + LTask.post_signal(); +} + + +boolean LGPRSClass::gprsCheckSIM(void *userData) +{ + LGPRSClass *pThis =(LGPRSClass*)userData; + vm_log_info("Has SIM? %d", vm_has_sim_card()); + vm_log_info("SIM count? %d", vm_sim_card_count()); + vm_log_info("IMEI=%s", vm_get_imei()); + + // Is there SIM card ready? + VMINT simCardCount = vm_sim_card_count(); + if (simCardCount > 0) + { + pThis->m_simCardReady = 1; + } + + vm_set_active_sim_card(VM_SIM_SIM1); + + VMINT simStatus = vm_get_sim_card_status(VM_SIM_SIM1); + vm_log_info("SIM card state=%d", simStatus); + + + // Let's enable GPRS + VMINT32 result = vm_setting_srv_command(VM_SETTING_CELLULAR_GPRS_SERVICE, + VM_OPERATION_GPRS_SERVICE_ON, + NULL, + NULL, + NULL, + NULL); + if (result == VM_SETTING_RESULT_OK) + { + vm_log_info("vm_setting_srv_command OK"); + } + else if (result == VM_SETTING_RESULT_INVALID) + { + vm_log_info("vm_setting_srv_command INVALID"); + } + else + { + vm_log_info("vm_setting_srv_command failed."); + } + + // Is there GSM? + VMINT protocol = vm_srv_nw_info_get_protocol(VM_SIM_SIM1); + vm_log_info("SIM protocol=%d", protocol); + + // Is there GPRS? + // VMINT networkReady = vm_srv_nw_info_channel_supports(VM_SIM_SIM1, VM_GPRS); + //vm_log_info("SIM GPRS ready? %d", networkReady); + + // get APN info + vm_apn_info_ext apnInfo; + VMINT apnRet = vm_get_apn_info(&apnInfo); + vm_log_info("vm_get_apn_info = %d", apnRet); + vm_log_info("operator ID= %s", apnInfo.operator_id); + vm_log_info("operator Name= %s", apnInfo.operator_name); + + // retrieve cell info + VMINT openResult = vm_cell_open(); + vm_log_info("open cell = %d", openResult); + vm_cell_info_struct *pCell = vm_cell_get_cur_cell_info(); + if (pCell) + { + vm_log_info("cell rxlev=%d", pCell->rxlev); + vm_log_info("cell arfcn=%d", pCell->arfcn); + vm_log_info("cell bsic=%d", pCell->bsic); + vm_log_info("cell mcc=%d", pCell->mcc); + vm_log_info("cell mnc=%d", pCell->mnc); + vm_log_info("cell lac=%d", pCell->lac); + vm_log_info("cell ci=%d", pCell->ci); + } + else + { + vm_log_info("no cell info"); + } + + vm_cell_close(); + + + return true; +} + +struct LGPRSAttachContext +{ + vm_dtcnt_info_t info; + VMINT result; + VMUINT32 dataAccount; +}; + +boolean gprsSetCustomAPN(void *userData) +{ + LGPRSAttachContext *pCntx = (LGPRSAttachContext*)userData; + VMUINT32 dtacct = 0; + VMINT ret = 0; + #if 0 + ret = vm_set_cust_apn_info(&pCntx->info, &dtacct); + #endif + + if(0 != ret) + { + vm_log_error("vm_set_cust_apn_info fails with %d", ret); + pCntx->result = ret; + return true; + } + + // we have only 1 SIM card + ret = vm_dtacct_set(VM_SIM_SIM1, dtacct); + if(0 != ret) + { + vm_log_error("vm_dtacct_set fails with %d", ret); + pCntx->result = ret; + return true; + } + + pCntx->result = 0; + return true; +} + +int LGPRSClass::attachGPRS(const char *apn, const char *username, const char *password) +{ + LTask.remoteCall(&gprsCheckSIM, this); + if(!m_simCardReady) + { + return m_simCardReady; + } + + // setup custom APN + LGPRSAttachContext cntx; + memset(&cntx, 0, sizeof(cntx)); + strncpy((char*)cntx.info.APN, apn, VM_SRV_DTCNT_PROF_MAX); + strncpy((char*)cntx.info.UserName, username, VM_SRV_DTCNT_PROF_MAX); + strncpy((char*)cntx.info.Passwd, password,VM_SRV_DTCNT_PROF_MAX); + + // currently we don't configure proxy and DNS + + LTask.remoteCall(&gprsSetCustomAPN, &cntx); + + if(cntx.result == 0) + { + m_customAPN = true; + return 1; + } + else + { + m_customAPN = false; + return 0; + } +} + +int LGPRSClass::attachGPRS() +{ + m_customAPN = false; + LTask.remoteCall(&gprsCheckSIM, this); + return m_simCardReady; +} + +VMINT LGPRSClass::getAPN() const +{ + if(m_customAPN) + { + return VM_APN_USER_DEFINE; + } + else + { + return VM_TCP_APN_CMNET; + } +} + +struct LGPRSResolveContext +{ + const char *domainName; + vm_soc_dns_result dns; + VMINT resolveState; + + LGPRSResolveContext(): + domainName(NULL), + resolveState(VM_E_SOC_INVAL) + { + memset(&dns, 0, sizeof(dns)); + } + + ~LGPRSResolveContext() + { + } +}; + +static VMINT gprsResolveCallback(VMINT jobId, vm_soc_dns_result *pDNS, void *userData) +{ + vm_log_info("gprsResolveCallback"); + LGPRSResolveContext *pContext = (LGPRSResolveContext*)userData; + unsigned char* ipArray = (unsigned char*)&pDNS->address[0]; + vm_log_info("DNS resolve callback, cause=%d, num=%d, address=%d.%d.%d.%d", + pDNS->error_cause, + pDNS->num, + ipArray[0], + ipArray[1], + ipArray[2], + ipArray[3]); + + // TODO: since we don't know the definition of error_cause yet, + // treat all as OK. + if(pDNS && pDNS != &pContext->dns) + { + vm_log_info("pDNS != pContext->dns"); + pContext->dns = *pDNS; + } + pContext->resolveState = VM_E_SOC_SUCCESS; + LTask.post_signal(); +} + + +static boolean gprsResolveDomainName(void *userData) +{ + LGPRSResolveContext *pContext = (LGPRSResolveContext*)userData; + + vm_log_info("vm_soc_get_host_by_name_ex: %s", pContext->domainName); + pContext->resolveState = vm_soc_get_host_by_name_ex(VM_TCP_APN_CMNET, + pContext->domainName, + &pContext->dns, + &gprsResolveCallback, + pContext); + vm_log_info("vm_soc_get_host_by_name_ex ret = %d", pContext->resolveState); + + if (pContext->resolveState > 0) + { + // not done yet + return false; + } + + switch(pContext->resolveState) + { + case VM_E_SOC_SUCCESS: // Get IP address successfully, result is filled. + return true; + case VM_E_SOC_WOULDBLOCK: // wait response from network, result could be gotten from callback. + // need to wait, return directly + // so MMI message loop may continue. + return false; + case VM_E_SOC_INVAL: // invalid arguments: null domain_name, etc. + case VM_E_SOC_ERROR: // unspecified error + case VM_E_SOC_LIMIT_RESOURCE: // socket resources not available + case VM_E_SOC_INVALID_ACCOUNT: // invalid data account id + return true; + } +} + + +int LGPRSClass::hostByName(const char* aHostname, IPAddress& aResult) +{ + vm_log_info("hostByName"); + LGPRSResolveContext context; + // no memory copy since we're blocking call + context.domainName = aHostname; + LTask.remoteCall(&gprsResolveDomainName, (void*)&context); + + vm_log_info("context.resolveState = %d", context.resolveState); + unsigned char* ipArray = (unsigned char*)&context.dns.address[0]; + vm_log_info("Arduino DNS resolve callback, cause=%d, num=%d, address=%d.%d.%d.%d", + context.dns.error_cause, + context.dns.num, + ipArray[0], + ipArray[1], + ipArray[2], + ipArray[3]); + // parse result + if (VM_E_SOC_SUCCESS == context.resolveState) + { + // TODO: why are there multiple ip addresses? + + aResult = context.dns.address[0]; + + vm_log_info("get IP=%d.%d.%d.%d", + aResult[0], + aResult[1], + aResult[2], + aResult[3]); + return 1; + } + else + { + return 0; + } +} + + +IPAddress LGPRSClass::localIP() +{ +} + +LGPRSClass LGPRS; + diff --git a/hardware/arduino/mtk/libraries/LGPRS/LGPRS.h b/hardware/arduino/mtk/libraries/LGPRS/LGPRS.h new file mode 100644 index 00000000..0a9d2a33 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/LGPRS.h @@ -0,0 +1,80 @@ +#ifndef LGPRS_h +#define LGPRS_h + +#include "Arduino.h" +#include "IPAddress.h" +#include "vmnwsetting.h" +#include "vmconn.h" + +class LGPRSConnectContext; + +//LGPRS Class +class LGPRSClass +{ +public: + + /* DOM-NOT_FOR_SDK-BEGIN */ + LGPRSClass(); + /* DOM-NOT_FOR_SDK-END */ + + // DESCRIPTION + // Sets up the Access Point Name (APN) information used to connect to GPRS network. Use the data provided by your telecom operator to set it up + // + // PARAMETERS + // APNName: char array, Access Point Name (APN) provided by the telecom operator + // userName: char array, user name, provided by the telecom operator. Pass NULL if the telecom operator does not provide the username information. + // password: char array, password provided by the telecom operator. Pass NULL if the telecom operator does not provide the password information. + // + // RETURN + // 1: APN setup succeeded + // 0: Otherwise + int attachGPRS(const char *apn, const char *username, const char *password); + + // DESCRIPTION + // Automatically detect Access Point Name (APN) information from SIM card and use it to connect to GPRS network. + // + // PARAMETERS + // APNName: char array, Access Point Name (APN) provided by the telecom operator + // userName: char array, user name, provided by the telecom operator. Pass NULL if the telecom operator does not provide the username information. + // password: char array, password provided by the telecom operator. Pass NULL if the telecom operator does not provide the password information. + // + // RETURN + // 1: APN setup succeeded + // 0: Otherwise + int attachGPRS(); + + // DESCRIPTION + // Queries the IP address of the LinkIt device after connecting to GPRS network through LGPRS.attachGPRS(). + // + // PARAMETERS + // N/A + // + // RETURN + // The IP address dispatched by the GPRS network. The value is meaningless before LGPRS.attachGPRS() succeeds. + IPAddress localIP(); + + // DESCRIPTION + // Resolve the given hostname to an IP address. + // + // PARAMETERS + // param aHostname: Name to be resolved + // param aResult: IPAddress structure to store the returned IP address + // + // RETURNS + // 1 if aIPAddrString was successfully converted to an IP address, + // else error code + int hostByName(const char* aHostname, IPAddress& aResult); + + VMINT getAPN() const; + friend class LGPRSServer; + friend class LGPRSClient; + +private: + boolean m_simCardReady; + boolean m_customAPN; + static boolean gprsCheckSIM(void *userData); +}; + +extern LGPRSClass LGPRS; + +#endif // #ifndef LGPRS_h \ No newline at end of file diff --git a/hardware/arduino/mtk/libraries/LGPRS/LGPRSClient.cpp b/hardware/arduino/mtk/libraries/LGPRS/LGPRSClient.cpp new file mode 100644 index 00000000..69fdea9b --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/LGPRSClient.cpp @@ -0,0 +1,28 @@ +#include "LGPRSClient.h" +#include +#include +#include "LGPRS.h" + +LGPRSClient::LGPRSClient(): + LTcpClient() +{ + m_apn = LGPRS.getAPN(); +} + +LGPRSClient::LGPRSClient(const LTcpClient &rhs): + LTcpClient(rhs) +{ + m_apn = LGPRS.getAPN(); +} + +LGPRSClient::LGPRSClient(VMINT handle): + LTcpClient(handle) +{ + m_apn = LGPRS.getAPN(); +} + +LGPRSClient::LGPRSClient(VMINT handle, VMINT serverHandle): + LTcpClient(handle, serverHandle) +{ + m_apn = LGPRS.getAPN(); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/libraries/LGPRS/LGPRSClient.h b/hardware/arduino/mtk/libraries/LGPRS/LGPRSClient.h new file mode 100644 index 00000000..d8ca9275 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/LGPRSClient.h @@ -0,0 +1,20 @@ +#ifndef LGPRSClient_h +#define LGPRSClient_h +#include "Arduino.h" +#include +#include +#include + +//LGPRSClient Class +class LGPRSClient : public LTcpClient { +public: + LGPRSClient(); + + /* DOM-NOT_FOR_SDK-BEGIN */ + LGPRSClient(const LTcpClient &rhs); + LGPRSClient(VMINT handle); + LGPRSClient(VMINT handle, VMINT serverHandle); + /* DOM-NOT_FOR_SDK-END */ +}; + +#endif // LGPRSClient_h \ No newline at end of file diff --git a/hardware/arduino/mtk/libraries/LGPRS/LGPRSServer.cpp b/hardware/arduino/mtk/libraries/LGPRS/LGPRSServer.cpp new file mode 100644 index 00000000..698ec6ea --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/LGPRSServer.cpp @@ -0,0 +1,21 @@ +#include "LGPRSServer.h" +#include +#include +#include "LGPRS.h" + +LGPRSServer::LGPRSServer(uint16_t port): + LTcpServer(port) +{ + m_apn = LGPRS.getAPN(); +} + +LGPRSClient LGPRSServer::available() +{ + VMINT hClient = -1; + VMINT hServer = -1; + availableImpl(hClient, hServer); + // return a special client object that has server handle + // Note that we rely on move-constructor optimization + // to prevent temp object destructor, which stop() the connection. + return LGPRSClient(hClient, hServer); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/libraries/LGPRS/LGPRSServer.h b/hardware/arduino/mtk/libraries/LGPRS/LGPRSServer.h new file mode 100644 index 00000000..d8a73081 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/LGPRSServer.h @@ -0,0 +1,14 @@ +#ifndef LGPRSServer_h +#define LGPRSServer_h +#include +#include +#include "LGPRSClient.h" + +//LGPRSServer Class +class LGPRSServer : public LTcpServer { +public: + LGPRSServer(uint16_t port); + LGPRSClient available(); +}; + +#endif \ No newline at end of file diff --git a/hardware/arduino/mtk/libraries/LGPRS/LGPRSUdp.cpp b/hardware/arduino/mtk/libraries/LGPRS/LGPRSUdp.cpp new file mode 100644 index 00000000..d7314bb2 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/LGPRSUdp.cpp @@ -0,0 +1,24 @@ +#include +#include "LGPRSUdp.h" +#include "LGPRS.h" +#include "vmtcp.h" + +VMINT LGPRSUDP::getAPN() const +{ + return VM_TCP_APN_CMNET; +} + +int LGPRSUDP::beginPacket(const char *host, uint16_t port) +{ + // DNS loopup and bypass to IP version + int ret = LGPRS.hostByName(host, m_sendToIP); + if(ret) + { + return beginPacket(m_sendToIP, port); + } + else + { + return 0; + } +} + diff --git a/hardware/arduino/mtk/libraries/LGPRS/LGPRSUdp.h b/hardware/arduino/mtk/libraries/LGPRS/LGPRSUdp.h new file mode 100644 index 00000000..c3170349 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/LGPRSUdp.h @@ -0,0 +1,16 @@ +#ifndef lgprsudp_h +#define lgprsudp_h + +#include +#include + +class LGPRSUDP : public LUDP { +public: + virtual int beginPacket(const char *host, uint16_t port); + using LUDP::beginPacket; + +protected: + virtual VMINT getAPN() const; +}; + +#endif diff --git a/hardware/arduino/mtk/libraries/LGPRS/examples/GPRSUdpNtpClient/GPRSUdpNtpClient.ino b/hardware/arduino/mtk/libraries/LGPRS/examples/GPRSUdpNtpClient/GPRSUdpNtpClient.ino new file mode 100644 index 00000000..b2c13b1e --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/examples/GPRSUdpNtpClient/GPRSUdpNtpClient.ino @@ -0,0 +1,155 @@ +#include +#include + +/* + + Udp NTP Client + + Get the time from a Network Time Protocol (NTP) time server + Demonstrates use of UDP sendPacket and ReceivePacket + For more on NTP time servers and the messages needed to communicate with them, + see http://en.wikipedia.org/wiki/Network_Time_Protocol + + created 4 Sep 2010 + by Michael Margolis + modified 9 Apr 2012 + by Tom Igoe + + modified 14 Aug 2014 + by Pablo Sun + for LinkIt LGPRS UDP example + + This code is in the public domain. + + */ +unsigned int localPort = 2390; // local port to listen for UDP packets + +#define TIME_SERVER "time-c.nist.gov" // a list of NTP servers: http://tf.nist.gov/tf-cgi/servers.cgi + +const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message + +byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets + +// A LGPRSUDP instance to let us send and receive packets over UDP with LinkIt +LGPRSUDP Udp; + +void setup() +{ + // Open serial communications and wait for port to open: + Serial.begin(115200); + + Serial.println("setup()"); + + // attempt to connect to Wifi network: + while(!LGPRS.attachGPRS()) + { + delay(1000); + Serial.println("retry WiFi AP"); + } + Serial.println("Connected to wifi"); + + delay(10000); + + Serial.println("\nStarting connection to server..."); + while(!Udp.begin(localPort)) + { + Serial.println("retry begin"); + delay(1000); + } + + Serial.println("setup() done"); +} + +void loop() +{ + sendNTPpacket(); // send an NTP packet to a time server + // wait to see if a reply is available + delay(1000); + Serial.println( Udp.parsePacket() ); + if ( Udp.parsePacket() ) { + Serial.println("packet received"); + // We've received a packet, read the data from it + memset(packetBuffer, 0xcd, NTP_PACKET_SIZE); + Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer + for(int i = 0; i < NTP_PACKET_SIZE; ++i) + { + Serial.print(packetBuffer[i], HEX); + } + Serial.println(); + + + //the timestamp starts at byte 40 of the received packet and is four bytes, + // or two words, long. First, esxtract the two words: + unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); + unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); + // combine the four bytes (two words) into a long integer + // this is NTP time (seconds since Jan 1 1900): + unsigned long secsSince1900 = highWord << 16 | lowWord; + Serial.print("Seconds since Jan 1 1900 = " ); + Serial.println(secsSince1900); + + // now convert NTP time into everyday time: + Serial.print("Unix time = "); + // Unix time starts on Jan 1 1970. In seconds, that's 2208988800: + const unsigned long seventyYears = 2208988800UL; + // subtract seventy years: + unsigned long epoch = secsSince1900 - seventyYears; + // print Unix time: + Serial.println(epoch); + + + // print the hour, minute and second: + Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT) + Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day) + Serial.print(':'); + if ( ((epoch % 3600) / 60) < 10 ) { + // In the first 10 minutes of each hour, we'll want a leading '0' + Serial.print('0'); + } + Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute) + Serial.print(':'); + if ( (epoch % 60) < 10 ) { + // In the first 10 seconds of each minute, we'll want a leading '0' + Serial.print('0'); + } + Serial.println(epoch % 60); // print the second + } + // wait ten seconds before asking for the time again + delay(10000); +} + +// send an NTP request to the time server at the given address +unsigned long sendNTPpacket() +{ + Serial.println("sendNTPpacket"); + // set all bytes in the buffer to 0 + memset(packetBuffer, 0, NTP_PACKET_SIZE); + // Initialize values needed to form NTP request + // (see URL above for details on the packets) + //Serial.println("2"); + packetBuffer[0] = 0b11100011; // LI, Version, Mode + packetBuffer[1] = 0; // Stratum, or type of clock + packetBuffer[2] = 6; // Polling Interval + packetBuffer[3] = 0xEC; // Peer Clock Precision + // 8 bytes of zero for Root Delay & Root Dispersion + packetBuffer[12] = 49; + packetBuffer[13] = 0x4E; + packetBuffer[14] = 49; + packetBuffer[15] = 52; + + //Serial.println("3"); + + // all NTP fields have been given values, now + // you can send a packet requesting a timestamp: + Udp.beginPacket(TIME_SERVER, 123); //NTP requests are to port 123 + //Serial.println("4"); + Udp.write(packetBuffer, NTP_PACKET_SIZE); + //Serial.println("5"); + Udp.endPacket(); + //Serial.println("6"); +} + + + + + diff --git a/hardware/arduino/mtk/libraries/LGPRS/examples/GPRSWebClient/GPRSWebClient.ino b/hardware/arduino/mtk/libraries/LGPRS/examples/GPRSWebClient/GPRSWebClient.ino new file mode 100644 index 00000000..aec3f12e --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/examples/GPRSWebClient/GPRSWebClient.ino @@ -0,0 +1,65 @@ +#include +#include +#include + +char server[] = "arduino.cc"; +char path[] = "/asciilogo.txt"; +int port = 80; // HTTP + +LGPRSClient client; + +void setup() +{ + // setup Serial po + Serial.begin(115200); + + Serial.println("Attach to GPRS network by auto-detect APN setting"); + while (!LGPRS.attachGPRS()) + { + delay(500); + } + + // if you get a connection, report back via serial: + Serial.print("Connect to "); + Serial.println(server); + if (client.connect(server, port)) + { + Serial.println("connected"); + // Make a HTTP request: + client.print("GET "); + client.print(path); + client.println(" HTTP/1.1"); + client.print("Host: "); + client.println(server); + client.println("Connection: close"); + client.println(); + } + else + { + // if you didn't get a connection to the server: + Serial.println("connection failed"); + } +} + +void loop() +{ + // if there are incoming bytes available + // from the server, read them and print them: + if (client.available()) + { + char c = client.read(); + Serial.print(c); + } + + // if the server's disconnected, stop the client: + if (!client.available() && !client.connected()) + { + Serial.println(); + Serial.println("disconnecting."); + client.stop(); + + // do nothing forevermore: + for (;;) + ; + } +} diff --git a/hardware/arduino/mtk/libraries/LGPRS/examples/GPRSWebServer/GPRSWebServer.ino b/hardware/arduino/mtk/libraries/LGPRS/examples/GPRSWebServer/GPRSWebServer.ino new file mode 100644 index 00000000..aedb96bf --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPRS/examples/GPRSWebServer/GPRSWebServer.ino @@ -0,0 +1,83 @@ +#include +#include +#include + +LGPRSServer server(80); // port 80 (http) + +void setup() +{ + // setup Serial port + Serial.begin(115200); + + // detect APN + while(!LGPRS.attachGPRS()) + { + delay(500); + } + + Serial.println("Connected to GPRS network"); + + // start server + server.begin(); + + //Get IP. + for(int i = 0; i < 5; ++i) + { + IPAddress localIP = server.serverIP(); + Serial.println("Server IP address="); + Serial.println(localIP); + delay(1000); + } +} + +void loop() { + delay(50); + // checking incoming clients + LGPRSClient client = server.available(); + + if (client) + { + while (client.connected()) + { + if (client.available()) + { + Serial.println("Receiving request!"); + bool sendResponse = false; + while (int i = client.read()) { + if ((char)i == '\n') + { + sendResponse = true; + break; + } + if(i!=-1) + Serial.print((char)i); + } + + // if you've gotten to the end of the line (received a newline + // character) + if (sendResponse) + { + // send a standard http response header + client.println("HTTP/1.1 200 OK"); + client.println("Content-Type: text/html"); + client.println(); + client.println(""); + // output the value of each analog input pin + for (int analogChannel = 0; analogChannel < 6; analogChannel++) { + client.print("analog input "); + client.print(analogChannel); + client.print(" is "); + client.print(analogRead(analogChannel)); + client.println("
"); + } + client.println(""); + //necessary delay + delay(1000); + client.stop(); + } + } + } + } +} + + diff --git a/hardware/arduino/mtk/libraries/LGPS/LGPS.cpp b/hardware/arduino/mtk/libraries/LGPS/LGPS.cpp new file mode 100644 index 00000000..ffbbac17 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPS/LGPS.cpp @@ -0,0 +1,64 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "arduino.h" +#include "GPS.h" +#include "LGPS.h" + +extern void handle_gps_evt(int message, int param); + +void LGPSClass::powerOn(gpsTypeEnum type) +{ + begin(); + remoteCall(gpsPowerOn, (void*)&type); +} + +void LGPSClass::powerOff(void){ + remoteCall(gpsPowerOff, (void*)NULL); +} + +void LGPSClass::setMode(gpsModeEnum mode){ + remoteCall(gpsSetMode, (void*)&mode); +} + +void LGPSClass::getData(gpsSentenceInfoStruct* info){ + memcpy(info, &m_info, sizeof(gpsSentenceInfoStruct)); +} + +void LGPSClass::setData(gpsSentenceInfoStruct* info) { + memcpy(&m_info, info, sizeof(gpsSentenceInfoStruct)); +} + +LGPSClass LGPS; + diff --git a/hardware/arduino/mtk/libraries/LGPS/LGPS.h b/hardware/arduino/mtk/libraries/LGPS/LGPS.h new file mode 100644 index 00000000..2ad77da6 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPS/LGPS.h @@ -0,0 +1,148 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef _LGPS_H +#define _LGPS_H + +#include "LTask.h" + +#define GPS_MAX_GPGGA_SENTENCE_LENGTH 100 +#define GPS_MAX_GPGSA_SENTENCE_LENGTH 80 +#define GPS_MAX_GPRMC_SENTENCE_LENGTH 100 +#define GPS_MAX_GPVTG_SENTENCE_LENGTH 80 +#define GPS_MAX_GPGSV_SENTENCE_LENGTH 400 +#define GPS_MAX_GLGSV_SENTENCE_LENGTH 400 +#define GPS_MAX_BDGSV_SENTENCE_LENGTH 400 +#define GPS_MAX_BDGSA_SENTENCE_LENGTH 80 +#define GPS_MAX_GLGSA_SENTENCE_LENGTH 80 + +// gps sentence infomation +typedef struct +{ + unsigned char GPGGA[GPS_MAX_GPGGA_SENTENCE_LENGTH+1]; // data of GPGGA + unsigned char GPGSA[GPS_MAX_GPGSA_SENTENCE_LENGTH+1]; // data of GPGSA + unsigned char GPRMC[GPS_MAX_GPRMC_SENTENCE_LENGTH+1]; // data of GPRMC + unsigned char GPVTG[GPS_MAX_GPVTG_SENTENCE_LENGTH+1]; // data of GPVTG + unsigned char GPGSV[GPS_MAX_GPGSV_SENTENCE_LENGTH+1]; // data of GPGSV + unsigned char GLGSV[GPS_MAX_GLGSV_SENTENCE_LENGTH+1]; // data of GLGSV + unsigned char GLGSA[GPS_MAX_GLGSA_SENTENCE_LENGTH+1]; // data of GLGSA + unsigned char BDGSV[GPS_MAX_BDGSV_SENTENCE_LENGTH+1]; // data of BDGSV + unsigned char BDGSA[GPS_MAX_BDGSA_SENTENCE_LENGTH+1]; // data of BDGSA +} gpsSentenceInfoStruct; + +// gps mode +typedef enum +{ + GPS_START_MODE_NULL, + GPS_HOT_START, // GPS selects this mode when it remembers its last calculated position and the last recorded satellites is still in view. If you are at same location when the GPS was turned off, the GPS is capable of positioning in the shortest time. + GPS_WARM_START, // GPS selects this mode when it remembers its last calculated position but the last recorded satellites is not in view. The GPS then needs more time to locate the satellites and position. + GPS_COLD_START, // GPS selects this mode when it only has the current time. It takes longer time to locate the GPS information. + GPS_FULL_START, // GPS selects this mode when it has no information. There will be a full restart and it will take the longest time. + GPS_START_TYPE_END +}gpsModeEnum; + +/*gps type */ +typedef enum +{ + GPS_ONLY, /* GPS_ONLY */ + GPS_GLONASS, /* GPS+GLONASS */ + GPS_BEIDOU, /* GPS+BEIDOU */ + GPS_TYPE_END +} gpsTypeEnum; + +// LGPS class interface, With this library, you can get GPS data. Basic flow of controlling GPS: +class LGPSClass : public _LTaskClass { + +// Constructor / Destructor +public: + LGPSClass() { }; + +// Method +public: + // DESCRIPTION + // Turns on GPS device. + // RETURNS + // N/A + // EXAMPLE + // + // #include + // gpsSentenceInfoStruct info; + // void setup() + // { + // LGPS.powerOn(); + // delay(500); + // LGPS.setMode(GPS_HOT_START); + // } + // void loop() + // { + // LGPS.getData(&info); + // delay(2000); + // } + // + void powerOn(gpsTypeEnum type = GPS_GLONASS); + + // DESCRIPTION + // Turns off GPS. + // Note: Turning off GPS when GPS data are not required can save power. + // RETURNS + // N/A + void powerOff(void); + + // DESCRIPTION + // Sets up GPS start mode. + // RETURNS + // N/A + void setMode( + gpsModeEnum mode // [IN] please refer the enum gpsModeEnum + ); + + // DESCRIPTION + // get GPS data + // RETURNS + // N/A + void getData( + gpsSentenceInfoStruct* info // [IN] please refer the struct gpsSentenceInfoStruct + ); + +public: + void setData(gpsSentenceInfoStruct* info); + +private: + gpsSentenceInfoStruct m_info; + +}; + +extern LGPSClass LGPS; + +#endif diff --git a/hardware/arduino/mtk/libraries/LGPS/examples/GPS/GPS.ino b/hardware/arduino/mtk/libraries/LGPS/examples/GPS/GPS.ino new file mode 100644 index 00000000..525d3c87 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPS/examples/GPS/GPS.ino @@ -0,0 +1,121 @@ +#include + +gpsSentenceInfoStruct info; +char buff[256]; + +static unsigned char getComma(unsigned char num,const char *str) +{ + unsigned char i,j = 0; + int len=strlen(str); + for(i = 0;i < len;i ++) + { + if(str[i] == ',') + j++; + if(j == num) + return i + 1; + } + return 0; +} + +static double getDoubleNumber(const char *s) +{ + char buf[10]; + unsigned char i; + double rev; + + i=getComma(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + rev=atof(buf); + return rev; +} + +static double getIntNumber(const char *s) +{ + char buf[10]; + unsigned char i; + double rev; + + i=getComma(1, s); + i = i - 1; + strncpy(buf, s, i); + buf[i] = 0; + rev=atoi(buf); + return rev; +} + +void parseGPGGA(const char* GPGGAstr) +{ + /* Refer to http://www.gpsinformation.org/dale/nmea.htm#GGA + * Sample data: $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47 + * Where: + * GGA Global Positioning System Fix Data + * 123519 Fix taken at 12:35:19 UTC + * 4807.038,N Latitude 48 deg 07.038' N + * 01131.000,E Longitude 11 deg 31.000' E + * 1 Fix quality: 0 = invalid + * 1 = GPS fix (SPS) + * 2 = DGPS fix + * 3 = PPS fix + * 4 = Real Time Kinematic + * 5 = Float RTK + * 6 = estimated (dead reckoning) (2.3 feature) + * 7 = Manual input mode + * 8 = Simulation mode + * 08 Number of satellites being tracked + * 0.9 Horizontal dilution of position + * 545.4,M Altitude, Meters, above mean sea level + * 46.9,M Height of geoid (mean sea level) above WGS84 + * ellipsoid + * (empty field) time in seconds since last DGPS update + * (empty field) DGPS station ID number + * *47 the checksum data, always begins with * + */ + double latitude; + double longitude; + int tmp, hour, minute, second, num ; + if(GPGGAstr[0] == '$') + { + tmp = getComma(1, GPGGAstr); + hour = (GPGGAstr[tmp + 0] - '0') * 10 + (GPGGAstr[tmp + 1] - '0'); + minute = (GPGGAstr[tmp + 2] - '0') * 10 + (GPGGAstr[tmp + 3] - '0'); + second = (GPGGAstr[tmp + 4] - '0') * 10 + (GPGGAstr[tmp + 5] - '0'); + + sprintf(buff, "UTC timer %2d-%2d-%2d", hour, minute, second); + Serial.println(buff); + + tmp = getComma(2, GPGGAstr); + latitude = getDoubleNumber(&GPGGAstr[tmp]); + tmp = getComma(4, GPGGAstr); + longitude = getDoubleNumber(&GPGGAstr[tmp]); + sprintf(buff, "latitude = %10.4f, longitude = %10.4f", latitude, longitude); + Serial.println(buff); + + tmp = getComma(7, GPGGAstr); + num = getIntNumber(&GPGGAstr[tmp]); + sprintf(buff, "satellites number = %d", num); + Serial.println(buff); + } + else + { + Serial.println("Not get data"); + } +} + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + LGPS.powerOn(); + Serial.println("LGPS Power on, and waiting ..."); + delay(3000); +} + +void loop() { + // put your main code here, to run repeatedly: + Serial.println("LGPS loop"); + LGPS.getData(&info); + Serial.println((char*)info.GPGGA); + parseGPGGA((const char*)info.GPGGA); + delay(2000); +} diff --git a/hardware/arduino/mtk/libraries/LGPS/keywords.txt b/hardware/arduino/mtk/libraries/LGPS/keywords.txt new file mode 100644 index 00000000..0f64ff44 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPS/keywords.txt @@ -0,0 +1,29 @@ +####################################### +# Syntax Coloring Map For LGPSClass +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +LGPS KEYWORD1 +vm_gps_sentence_info KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +powerOn KEYWORD2 +powerOff KEYWORD2 +setMode KEYWORD2 +getData KEYWORD2 + +####################################### +# Object (KEYWORD3) +####################################### +LGPS KEYWORD3 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/hardware/arduino/mtk/libraries/LGPS/utility/GPS.cpp b/hardware/arduino/mtk/libraries/LGPS/utility/GPS.cpp new file mode 100644 index 00000000..7555c790 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPS/utility/GPS.cpp @@ -0,0 +1,126 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "arduino.h" +#include "vmgps.h" +#include "vmlog.h" +#include "GPS.h" +#include "LGPS.h" + +typedef void (*vm_gps_handler_t)(vm_gps_sentence_info* info); +vm_gps_handler_t _gps_handle = NULL; + +static void _gps_callback(VMINT msg, void* data) +{ + switch(msg) + { + case VM_GPS_OPEN_CNF: + { + VMINT result = (VMINT)data; + if(result == true) + { + vm_log_info((char*)"open success"); + } + else + { + vm_log_warn((char*)"open failed"); + } + } + break; + case VM_GPS_CLOSE_CNF: + // app cannot receive this msg now, ignore this. + break; + case VM_GPS_SET_MODE_CNF: + { + VMINT result = (VMINT)data; + if(result == true) + { + vm_log_info((char*)"set mode success"); + } + else + { + vm_log_warn((char*)"set mode failed"); + } + } + break; + case VM_GPS_SENTENCE_DATA: + { + LGPS.setData((gpsSentenceInfoStruct*)data); + } + break; + } + } + +boolean gpsPowerOn(void* user_data) +{ + VMINT result; + vm_gps_type_enum* type = (vm_gps_type_enum*)user_data; + + result = vm_gps_open( 1, *type, _gps_callback); + + if(result == VM_GPS_OPEN_SUCCESS) + { + // this is first time to open GPS, need to get the message VM_GPS_OPEN_CNF + vm_log_info((char*)"gps open success"); + } + else if(result == VM_GPS_OPEN_ALREADY_OPEN) + { + // GPS had been opened before, can get data, no need to wait VM_GPS_OPEN_CNF + // if need you can set mode + // vm_gps_set_mode(); + vm_log_info((char*)"gps already open"); + + } + else + { + // open failed + vm_log_info((char*)"gps open failed"); + } + return true; +} + +boolean gpsPowerOff(void* user_data) +{ + vm_gps_close(); + return true; +} + +boolean gpsSetMode(void* user_data) +{ + vm_gps_mode_enum* mode = (vm_gps_mode_enum*)user_data; + vm_gps_set_mode(*mode); + return true; +} + + diff --git a/hardware/arduino/mtk/libraries/LGPS/utility/GPS.h b/hardware/arduino/mtk/libraries/LGPS/utility/GPS.h new file mode 100644 index 00000000..22dcefe4 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGPS/utility/GPS.h @@ -0,0 +1,51 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef _GPS_H +#define _GPS_H + +#ifdef __cplusplus +extern "C" { +#endif + +boolean gpsPowerOn(void* user_data); +boolean gpsPowerOff(void* user_data); +boolean gpsSetMode(void* user_data); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/hardware/arduino/mtk/libraries/LGSM/LGSM.h b/hardware/arduino/mtk/libraries/LGSM/LGSM.h new file mode 100644 index 00000000..ce8fc3f4 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGSM/LGSM.h @@ -0,0 +1,212 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + + +#ifndef _LINKITGSM_h +#define _LINKITGSM_h + +#include +#include "LTask.h" + +#define LGSM_MAX_SMS_LEN 500 + +// Class of LinkIt SMS support +class LSMSClass : public Stream +{ +// Constructor / Destructor +public: + LSMSClass(void); + ~LSMSClass(void); + +// Method +public: + using Print::write; // pull in write(str) and write(buf, size) from Print + + // DESCRIPTION + // Step two of sending an SMS: Write one byte at a time into the SMS content. + // You can also use print() to write a string into SMS content at a time. + // RETURNS + // 1: Succeed, 0: Fail + size_t write( + uint8_t c // [IN] byte to write + ); + + // DESCRIPTION + // Step one of sending an SMS: Input the destination number. + // RETURNS + // 1: Succeed, 0: Fail + int beginSMS( + const char* to // [IN] SMS destination number + ); + + // DESCRIPTION + // Checks if SMS module is ready or not. + // RETURNS + // 1 if ready, 0 if not + int ready(); + + // DESCRIPTION + // The last step of sending an SMS: Confirm and send out the SMS. + // RETURNS + // 1: Sending succeeds. 0: Send fails. + int endSMS(); + + // DESCRIPTION + // Checks if there is any unread SMS. + // RETURNS + // 1: There is unread SMS. 0: There is no unread SMS. + int available(); + + // DESCRIPTION + // Returns the source number of the unread SMS. + // RETURNS + // Length of the returning SMS number + // If there is no unread SMS, it will return 0. + // If the size of input array is too small, it will return the required size without filling the input array. Please call again with larger array. + int remoteNumber( + char* number, // [OUT] array to save SMS number + int nlength // [IN] size of the array + ); + + // DESCRIPTION + // Reads the content of the unread SMS, one byte at a time. + // The difference between read() and peek() is that read() moves the cursor but peak() does not. + // RETURNS + // One byte of SMS content. Will be -1 if it reaches the end of SMS. + int read(); + + // DESCRIPTION + // Reads the content of the unread SMS, one byte at a time without moving the cursor. + // Repeatedly calling peek() will return the same result. + // RETURNS + // One byte of SMS content. Will be -1 if it reaches the end of SMS. + int peek(); + + // DESCRIPTION + // Deletes the unread SMS. + // It only works when there is unread SMS checked by available(). + void flush(); + +private: + + // member for write SMS + String _toNumber; // maximum length for TP-DA/OA should be 12 octets (14 chars) + String _toContent; + + // member for read SMS + int _msgId; // current SMS id + char *_msgNumber; // number data of current SMS + char *_msgContent; // content data of current SMS + + int _msgPos; // current position of content (for sequential read/peak) + + +}; + +extern LSMSClass LSMS; + +enum LVoiceCall_voiceCall_st { IDLE_CALL, CALLING, RECEIVINGCALL, TALKING}; + +// Class of LinkIt Voice call support +class LVoiceCallClass : public _LTaskClass +{ +// Constructor / Destructor +public: + LVoiceCallClass(void); + ~LVoiceCallClass(void); + +// Method +public: + + // DESCRIPTION + // Check if the previous voice operation has executed successfully + // RETURNS + // 1: if previous operation executed successfully. 0: if not. + int ready(); + + // DESCRIPTION + // Make a voice call to a specified number + // RETURNS + // 1: Callout succeed, 0: Fail + int voiceCall( + const char* to, // [IN] The number to call. + unsigned long timeout=30000 // [IN] timeout count + ); + + // DESCRIPTION + // Checks status of the voice call. + // RETURNS + // 0 IDLE_CALL, 1 CALLING, 2 RECEIVINGCALL, 3 TALKING + char getVoiceCallStatus(void); + + // DESCRIPTION + // Accepts an incoming voice call. + // RETURNS + // 1: Answer succeeds. 0: Answer fails. + int answerCall(void); + + + // DESCRIPTION + // Retrieves the calling number. + // RETURNS + // 1: Retrieve succeeds. 0: Retrieve fails. + int retrieveCallingNumber( + char* number, // [OUT] array to save call number + int nlength // [IN] size of the array + ); + + // DESCRIPTION + // Hang up an established call or during incoming rings. + // RETURNS + // 1: Hang succeeds. 0: Hang fails. + int hangCall(void); + +private: + + +}; + +extern LVoiceCallClass LVoiceCall; + +#undef LINKITGSM_DEBUG + +#ifdef LINKITGSM_DEBUG +#define LGSMLOG(x) Serial.println(x) +#else +#define LGSMLOG(x) +#endif + +#endif + diff --git a/hardware/arduino/mtk/libraries/LGSM/LSMS.cpp b/hardware/arduino/mtk/libraries/LGSM/LSMS.cpp new file mode 100644 index 00000000..c7445fd1 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGSM/LSMS.cpp @@ -0,0 +1,386 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "LGSM.h" + +#include +#include +#include +#include + +/***************************************************************************** +* +* structure data between Arduino / MMI thread +* +*****************************************************************************/ + +struct linkit_sms_send_struct +{ + const char *number; + const char *content; + int result; +}; + +struct linkit_sms_unread_msg_struct +{ + int id; + char *number; + char *content; +}; + + +boolean linkit_sms_ready_handler(void* userdata); +boolean linkit_sms_send_handler(void* userdata); + +boolean linkit_sms_get_unread_handler(void* userdata); +boolean linkit_sms_delete_handler(void* userdata); + +/***************************************************************************** +* +* LSMSClass class +* +*****************************************************************************/ + +LSMSClass::LSMSClass(): + _msgId(-1), + _msgPos(0) +{ + +} + +LSMSClass::~LSMSClass() +{ + +} + +int LSMSClass::ready() +{ + int result; + LTask.remoteCall(linkit_sms_ready_handler, &result); + return result; +} + +int LSMSClass::beginSMS(const char* to) +{ + _toNumber = to; + _toContent = ""; + return 1; +} + +size_t LSMSClass::write(uint8_t c) +{ + _toContent += (char)c; +} + +int LSMSClass::endSMS() +{ + linkit_sms_send_struct data; + + data.content = _toContent.c_str(); + data.number = _toNumber.c_str(); + + LTask.remoteCall(linkit_sms_send_handler, &data); + + LGSMLOG("[LOG]endSMS():"); + LGSMLOG(data.result); + + if(data.result == 1) + return 1; + else + return 0; +} + +int LSMSClass::available() +{ + linkit_sms_unread_msg_struct data; + + LTask.remoteCall(linkit_sms_get_unread_handler, &data); + + if (data.id < 0) + return false; + + _msgId = data.id; + _msgNumber = data.number; + _msgContent = data.content; + _msgPos = 0; + + return true; +} + +int LSMSClass::remoteNumber(char* number, int nlength) +{ + int len; + + if (_msgId < 0) + return 0; + + len = strlen(_msgNumber); + + if (len+1 > nlength) + return len+1; + + strcpy(number, _msgNumber); + return len; +} + +int LSMSClass::read() +{ + int result; + + if(_msgId < 0) + return -1; + + result = _msgContent[_msgPos]; + if (result) + _msgPos++; + else + result = -1; + + return result; +} + +int LSMSClass::peek() +{ + if(_msgId < 0) + return -1; + + return _msgContent[_msgPos]; +} + +void LSMSClass::flush() +{ + if(_msgId < 0) + return; + + LTask.remoteCall(linkit_sms_delete_handler, (void*)_msgId); + _msgId = -1; +} + +/***************************************************************************** +* +* LSMS MMI part (running on MMI thread) +* +*****************************************************************************/ + +boolean linkit_sms_ready_handler(void* userdata) +{ + int result; + + LGSMLOG("[LOG]vm_sim_card_count:"); + LGSMLOG(vm_sim_card_count()); + LGSMLOG("[LOG]vm_sms_is_sms_ready:"); + LGSMLOG(vm_sms_is_sms_ready()); + + result = false; + if(vm_sim_card_count() > 0 && vm_sms_is_sms_ready()) + result = true; + + *((int*)userdata) = result; + return true; +} + +linkit_sms_send_struct *g_linkit_sms_send_data; + +char *g_linkit_sms_number_buf = 0; +char *g_linkit_sms_content_buf = 0; + +void linkit_sms_send_callback(VMINT result) +{ + LGSMLOG("[LOG]linkit_sms_send_callback"); + g_linkit_sms_send_data->result = result; + LTask.post_signal(); +} + +boolean linkit_sms_send_handler(void* userdata) +{ + linkit_sms_send_struct *data = (linkit_sms_send_struct*)userdata; + VMWCHAR *number; + VMWCHAR *content; + VMINT size; + + LGSMLOG("[LOG]linkit_sms_send_handler"); + LGSMLOG("[LOG]Number:"); + LGSMLOG(data->number); + LGSMLOG("[LOG]Content:"); + LGSMLOG(data->content); + + // ascii to ucs2 + size = (strlen(data->number)+1)*sizeof(VMWCHAR); + number = (VMWCHAR *)vm_malloc(size); + vm_ascii_to_ucs2(number, size, (VMCHAR*)data->number); + + size = (strlen(data->content)+1)*sizeof(VMWCHAR); + content = (VMWCHAR *)vm_malloc(size); + vm_ascii_to_ucs2(content, size, (VMCHAR*)data->content); + + // send and wait for result + g_linkit_sms_send_data = data; + size = vm_send_sms(number, content, linkit_sms_send_callback); + LGSMLOG("[LOG]vm_send_sms:"); + LGSMLOG(size); + + // TODO: can we free them now, or need to wait for callback? + vm_free(number); + vm_free(content); + + if(!size) // send fail + { + data->result = false; + return true; + } + + return false; +} + +void linkit_sms_read_callback(vm_sms_callback_t* callback_data) +{ + linkit_sms_unread_msg_struct *dest = (linkit_sms_unread_msg_struct*)callback_data->user_data; + vm_sms_read_msg_cb_t *msg = (vm_sms_read_msg_cb_t*)callback_data->action_data; + + LGSMLOG("[LOG]linkit_sms_read_callback"); + LGSMLOG(callback_data->result); + + if (callback_data->result) + { + if(g_linkit_sms_number_buf) + { + vm_free(g_linkit_sms_number_buf); + g_linkit_sms_number_buf = 0; + } + if(g_linkit_sms_content_buf) + { + vm_free(g_linkit_sms_content_buf); + g_linkit_sms_content_buf = 0; + } + + int size = vm_wstrlen((VMWCHAR*)msg->msg_data->number); + g_linkit_sms_number_buf = (char*)vm_malloc(size+1); + vm_ucs2_to_ascii(g_linkit_sms_number_buf, size, (VMWCHAR*)msg->msg_data->number); + + // assume dcs = UCS2 + g_linkit_sms_content_buf = (char*)vm_malloc(msg->msg_data->content_buff_size/2+1); + vm_ucs2_to_ascii(g_linkit_sms_content_buf, msg->msg_data->content_buff_size/2, (VMWCHAR*)msg->msg_data->content_buff); + + dest->number = g_linkit_sms_number_buf; + dest->content = g_linkit_sms_content_buf; + + LGSMLOG("[LOG]Number:"); + LGSMLOG(g_linkit_sms_number_buf); + LGSMLOG("[LOG]Content:"); + LGSMLOG(g_linkit_sms_content_buf); + } + else + { + dest->id = -1; + } + + vm_free(msg->msg_data->content_buff); + vm_free(msg->msg_data); + + LTask.post_signal(); +} + +void linkit_sms_get_unread_callback(vm_sms_callback_t* callback_data) +{ + linkit_sms_unread_msg_struct *dest = (linkit_sms_unread_msg_struct*)callback_data->user_data; + vm_sms_query_msg_cb_t *list = (vm_sms_query_msg_cb_t*)callback_data->action_data; + int result; + + LGSMLOG("[LOG]linkit_sms_get_unread_callback"); + if (callback_data->result) + { + if (list->msg_num > 0) + { + // continue to read this message + vm_sms_msg_data_t *buf = (vm_sms_msg_data_t*)vm_malloc(sizeof(vm_sms_msg_data_t)); + + buf->content_buff = (VMINT8*)vm_malloc((LGSM_MAX_SMS_LEN+1)*sizeof(VMWCHAR)); + buf->content_buff_size = LGSM_MAX_SMS_LEN*sizeof(VMWCHAR); + + dest->id = list->msg_id_list[0]; + result = vm_sms_read_msg(dest->id, 0, buf, linkit_sms_read_callback, dest); + if(result >= 0) + { + return; // continue wait + } + else + { + LGSMLOG("[LOG]vm_sms_read_msg() fail!!:"); + LGSMLOG(dest->id); + LGSMLOG(result); + } + } + } + + LTask.post_signal(); +} + +boolean linkit_sms_get_unread_handler(void* userdata) +{ + linkit_sms_unread_msg_struct *dest = (linkit_sms_unread_msg_struct*)userdata; + vm_sms_query_t param; + int result; + + dest->id = -1; + + param.sort_flag = VM_SMS_SORT_SIM_ID; + param.order_flag = VM_SMS_ORDER_ASC; + param.status = (vm_sms_status_enum)(VM_SMS_STATUS_UNREAD | VM_SMS_STATUS_READ); + + LGSMLOG("[LOG]linkit_sms_get_unread_handler"); + result = vm_sms_get_msg_id_list(¶m, linkit_sms_get_unread_callback, userdata); + if(result < 0) + { + LGSMLOG(result); + return true; + } + return false; +} + + +void linkit_sms_delete_callback(vm_sms_callback_t* callback_data) +{ + LTask.post_signal(); +} + +boolean linkit_sms_delete_handler(void* userdata) +{ + VMUINT16 msg_id = (VMUINT16)((VMUINT32)userdata); + + vm_sms_delete_msg(msg_id, linkit_sms_delete_callback, userdata); + + return false; +} + +LSMSClass LSMS; \ No newline at end of file diff --git a/hardware/arduino/mtk/libraries/LGSM/LVoiceCall.cpp b/hardware/arduino/mtk/libraries/LGSM/LVoiceCall.cpp new file mode 100644 index 00000000..d6b4e137 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGSM/LVoiceCall.cpp @@ -0,0 +1,113 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "LGSM.h" + +#include +#include +#include +#include "VoiceCall.h" + +/***************************************************************************** +* +* LVoiceCallClass class +* +*****************************************************************************/ +LVoiceCallClass::LVoiceCallClass() +{ + registerCallback(); +} + +LVoiceCallClass::~LVoiceCallClass() +{ + +} + +int LVoiceCallClass::ready() +{ + int result = 0; + remoteCall(callready, (void*)&result); + return result; +} + +int LVoiceCallClass::voiceCall(const char* to, unsigned long timeout) +{ + call_info_struct callInfo; + strcpy(callInfo.num, to); + remoteCall(callvoiceCall, (void*)&callInfo); + return callInfo.result; +} + +char LVoiceCallClass::getVoiceCallStatus(void) +{ + char status; + remoteCall(callgetVoiceCallStatus, (void*)&status); + return status; +} + +int LVoiceCallClass::answerCall(void) +{ + int ret; + remoteCall(callanswerCall, &ret); + return ret; +} + +int LVoiceCallClass::retrieveCallingNumber(char* number, int nlength ) +{ + call_info_struct callInfo; + + memset(number, 0, nlength); + + remoteCall(callretrieveCallingNumber, (void*)&callInfo); + + if(callInfo.result == 1) + { + strcpy(number, callInfo.num); + return 1; + } + else + { + return 0; + } +} + +int LVoiceCallClass::hangCall(void) +{ + int ret; + remoteCall(callhangCall, (void*)&ret); + return ret; +} + +LVoiceCallClass LVoiceCall; + diff --git a/hardware/arduino/mtk/libraries/LGSM/examples/LVoiceCall/LVoiceCall.ino b/hardware/arduino/mtk/libraries/LGSM/examples/LVoiceCall/LVoiceCall.ino new file mode 100644 index 00000000..ba165d1b --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGSM/examples/LVoiceCall/LVoiceCall.ino @@ -0,0 +1,60 @@ +#include + +String remoteNumber = ""; // the number you will call +char charbuffer[20]; + +void setup() +{ + // initialize serial communications + Serial1.begin(115200); + Serial1.println("Make Voice Call"); + Serial1.println("Enter phone number to call."); +} + +void loop() +{ + // add any incoming characters to the String: + while (Serial1.available() > 0) + { + char inChar = Serial1.read(); + // if it's a newline, that means you should make the call: + if (inChar == '\n') + { + // make sure the phone number is not too long: + if (remoteNumber.length() < 20) + { + // let the user know you're calling: + Serial1.print("Calling to : "); + Serial1.println(remoteNumber); + Serial1.println(); + + // Call the remote number + remoteNumber.toCharArray(charbuffer, 20); + + // Check if the receiving end has picked up the call + if(LVoiceCall.voiceCall(charbuffer)) + { + Serial1.println("Call Established. Enter line to end"); + // Wait for some input from the line + while(Serial1.read() !='\n'); + // And hang up + LVoiceCall.hangCall(); + } + Serial1.println("Call Finished"); + remoteNumber=""; + Serial1.println("Enter phone number to call."); + } + else + { + Serial1.println("That's too long for a phone number. I'm forgetting it"); + remoteNumber = ""; + } + } + else + { + // add the latest character to the message to send: + if(inChar!='\r') + remoteNumber += inChar; + } + } +} diff --git a/hardware/arduino/mtk/libraries/LGSM/examples/LVoiceCallStatus/LVoiceCallStatus.ino b/hardware/arduino/mtk/libraries/LGSM/examples/LVoiceCallStatus/LVoiceCallStatus.ino new file mode 100644 index 00000000..17b6e870 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGSM/examples/LVoiceCallStatus/LVoiceCallStatus.ino @@ -0,0 +1,63 @@ +#include + +// PIN Number +#define PINNUMBER "" + +char numtel[20]; // buffer for the incoming call + +void setup() +{ + // initialize serial communications + Serial1.begin(115200); + Serial1.println("Receive Voice Call"); + + // connection state + boolean notConnected = true; + + // This makes sure the modem notifies correctly incoming events + LVoiceCall.hangCall(); + + Serial1.println("Waiting Call"); +} + +void loop() +{ + // Check the status of the voice call + switch (LVoiceCall.getVoiceCallStatus()) + { + case IDLE_CALL: // Nothing is happening + + break; + + case CALLING: // This should never happen, as we are not placing a call + + Serial1.println("CALLING"); + break; + + case RECEIVINGCALL: // Yes! Someone is calling us + + Serial1.println("RECEIVING CALL"); + + // Retrieve the calling number + LVoiceCall.retrieveCallingNumber(numtel, 20); + + // Print the calling number + Serial1.print("Number:"); + Serial1.println(numtel); + + // Answer the call, establish the call + LVoiceCall.answerCall(); + break; + + case TALKING: // In this case the call would be established + + Serial1.println("TALKING. Enter line to interrupt."); + while(Serial1.read()!='\n') + delay(100); + LVoiceCall.hangCall(); + Serial1.println("HANG. Waiting Call."); + break; + } + delay(1000); +} + diff --git a/hardware/arduino/mtk/libraries/LGSM/keywords.txt b/hardware/arduino/mtk/libraries/LGSM/keywords.txt new file mode 100644 index 00000000..7b523fc8 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGSM/keywords.txt @@ -0,0 +1,30 @@ +####################################### +# Syntax Coloring Map For LVoiceCallClass +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +LVoiceCall KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +ready KEYWORD2 +voiceCall KEYWORD2 +getVoiceCallStatus KEYWORD2 +answerCall KEYWORD2 +retrieveCallingNumber KEYWORD2 +hangCall KEYWORD2 + +####################################### +# Object (KEYWORD3) +####################################### +LVoiceCall KEYWORD3 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/hardware/arduino/mtk/libraries/LGSM/utility/VoiceCall.cpp b/hardware/arduino/mtk/libraries/LGSM/utility/VoiceCall.cpp new file mode 100644 index 00000000..e5eedf35 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGSM/utility/VoiceCall.cpp @@ -0,0 +1,253 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "vmtel.h" +#include "vmlog.h" +#include "LGSM.h" +#include "vmchset.h" +#include "string.h" +#include "VoiceCall.h" + +extern vm_call_listener_func g_call_status_callback; + +static vm_ucm_id_info_struct g_uid_info; +static int g_call_status = IDLE_CALL; +static char g_number[42]; + +static void __call_listener_func(vm_call_listener_data* data) +{ + if(data->type_op == VM_UCM_INCOMING_CALL_IND) + { + vm_ucm_incoming_call_ind_struct* ind = (vm_ucm_incoming_call_ind_struct*)data->data; + g_uid_info.call_id = ind->uid_info.call_id; + g_uid_info.group_id = ind->uid_info.group_id; + g_uid_info.call_type = ind->uid_info.call_type; + strcpy(g_number, (char*)ind->num_uri); + g_call_status = RECEIVINGCALL; + } + else if(data->type_op == VM_UCM_OUTGOING_CALL_IND) + { + vm_ucm_outgoing_call_ind_struct* ind = (vm_ucm_outgoing_call_ind_struct*)data->data; + g_uid_info.call_id = ind->uid_info.call_id; + g_uid_info.group_id = ind->uid_info.group_id; + g_uid_info.call_type = ind->uid_info.call_type; + strcpy(g_number, (char*)ind->num_uri); + g_call_status = TALKING; + } + else if(data->type_op == VM_UCM_CALL_END) + { + g_call_status = IDLE_CALL; + } + else + { + vm_log_info("bad operation type"); + } +} + +void registerCallback(void) +{ + g_call_status_callback = __call_listener_func; +} + +static void _call_voiceCall_callback(vm_call_actions_callback_data* data) +{ + VMINT* result = (VMINT*)data->userdata; + + if(data->type_act == VM_UCM_DIAL_ACT) + { + + if(data->data_act_rsp.result_info.result == VM_UCM_RESULT_OK) + { + *result = 1; + g_call_status = CALLING; + LVoiceCall.post_signal(); + } + else + { + *result = 0; + g_call_status = IDLE_CALL; + } + } + else if(data->type_act == VM_UCM_ACCEPT_ACT) + { + if(data->data_act_rsp.result_info.result == VM_UCM_RESULT_OK) + { + *result = 1; + g_call_status = TALKING; + LVoiceCall.post_signal(); + } + else + { + *result = 0; + g_call_status = IDLE_CALL; + } + } + else if(data->type_act == VM_UCM_HOLD_ACT) + { + // not use + } + else if(data->type_act == VM_UCM_END_SINGLE_ACT) + { + *result = 1; + LVoiceCall.post_signal(); + g_call_status = IDLE_CALL; + } + else + { + // not use + } +} + +boolean callvoiceCall(void* user_data) +{ + VMINT ret; + call_info_struct* callInfo_p = (call_info_struct*)user_data; + vm_ucm_dial_act_req_struct req; + vm_call_actions_data data; + + req.call_type = VM_UCM_VOICE_CALL_TYPE; + req.is_ip_dial = 0; + req.module_id = 0; + vm_ascii_to_ucs2((VMWSTR)req.num_uri, VM_UCM_MAX_NUM_URI_LEN, (VMSTR)callInfo_p->num); + + req.phb_data = NULL; + + data.type_act = VM_UCM_DIAL_ACT; + data.data_act = (void*)&req; + data.userdata = (void*)&callInfo_p->result; + data.callback = _call_voiceCall_callback; + + ret = vm_call_actions(&data); + + if(ret == 0) + { + return false; + } + else + { + callInfo_p->result = 0; + return true; + } +} + +boolean callanswerCall(void* user_data) +{ + VMINT ret; + VMINT* result = (VMINT*)user_data; + vm_ucm_single_call_act_req_struct req; + vm_call_actions_data data; + + req.action_uid.call_type = g_uid_info.call_type; + req.action_uid.call_id = g_uid_info.call_id; + req.action_uid.group_id = g_uid_info.group_id; + + data.type_act = VM_UCM_ACCEPT_ACT; + data.data_act = (void*)&req; + data.userdata = result; + data.callback = _call_voiceCall_callback; + ret = vm_call_actions(&data); + + if(ret == 0) + { + return false; + } + else + { + *result = 0; + return true; + } +} + +boolean callretrieveCallingNumber(void* user_data) +{ + call_info_struct* callInfo = (call_info_struct*)user_data; + callInfo->result = 0; + + if(g_call_status == RECEIVINGCALL || g_call_status == TALKING) + { + strcpy((char*)callInfo->num, (char*)g_number); + callInfo->result = 1; + } + + return true; +} + +boolean callready(void* user_data) +{ + VMINT* result = (VMINT*)user_data; + *result = 1; + return true; +} + +boolean callgetVoiceCallStatus(void* user_data) +{ + char* status = (char*)user_data; + *status = g_call_status; + return true; +} + +boolean callhangCall(void* user_data) +{ + VMINT ret; + VMINT* result = (VMINT*)user_data; + vm_ucm_single_call_act_req_struct req; + vm_call_actions_data data; + + if(IDLE_CALL == g_call_status) + return true; + + req.action_uid.call_type = g_uid_info.call_type; + req.action_uid.call_id = g_uid_info.call_id; + req.action_uid.group_id = g_uid_info.group_id; + + data.type_act = VM_UCM_END_SINGLE_ACT; + data.data_act = (void*)&req; + data.userdata = user_data; + data.callback = _call_voiceCall_callback; + ret = vm_call_actions(&data); + /* + if(ret == 0) + { + return false; + } + else + */ + { + *result = 1; + return true; + } +} + + + diff --git a/hardware/arduino/mtk/libraries/LGSM/utility/VoiceCall.h b/hardware/arduino/mtk/libraries/LGSM/utility/VoiceCall.h new file mode 100644 index 00000000..694f5235 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LGSM/utility/VoiceCall.h @@ -0,0 +1,62 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef _VOICECALL_H +#define _VOICECALL_H + +#ifdef __cplusplus +extern "C" { +#endif + +boolean callvoiceCall(void* user_data); +boolean callanswerCall(void* user_data); +boolean callretrieveCallingNumber(void* user_data); +boolean callready(void* user_data); +boolean callgetVoiceCallStatus(void* user_data); +boolean callhangCall(void* user_data); + +void registerCallback(void); + +typedef struct +{ + VMINT result; + char num[42]; +}call_info_struct; + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/hardware/arduino/mtk/libraries/LStorage/LFlash.cpp b/hardware/arduino/mtk/libraries/LStorage/LFlash.cpp new file mode 100644 index 00000000..5dd79d69 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LStorage/LFlash.cpp @@ -0,0 +1,89 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "LFlash.h" + +#include "vmio.h" + +static boolean _get_drv_handler(void* userdata); + +/***************************************************************************** +* +* LFlash class +* +*****************************************************************************/ + +LFlashClass::LFlashClass() +{ + +} + +LFlashClass::~LFlashClass() +{ + +} + +boolean LFlashClass::begin() +{ + int drv; + LTask.remoteCall(_get_drv_handler, &drv); + + if(drv > 0) + { + initDrv(drv); + return true; + } + else + { + return false; + } +} + +LFlashClass LFlash; + +/***************************************************************************** +* +* MMI part (running on MMI thread) +* +*****************************************************************************/ + +static boolean _get_drv_handler(void* userdata) +{ +#ifdef LINKITSTORAGE_DEBUG + Serial.print("vm_get_system_driver()="); + Serial.println(vm_get_system_driver()); +#endif + *((int*)userdata) = vm_get_system_driver(); + return true; +} diff --git a/hardware/arduino/mtk/libraries/LStorage/LFlash.h b/hardware/arduino/mtk/libraries/LStorage/LFlash.h new file mode 100644 index 00000000..a7533885 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LStorage/LFlash.h @@ -0,0 +1,61 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + + +#ifndef _LINKITFLASH_h +#define _LINKITFLASH_h + +#include "LStorage.h" + +// Class of LinkIt Flash support +class LFlashClass : public LDrive +{ +// Constructor / Destructor +public: + LFlashClass(void); + ~LFlashClass(void); + + // DESCRIPTION + // Initialzes the Flash module + // RETURNS + // true if succeed, false if failed + virtual boolean begin(); + +}; + +extern LFlashClass LFlash; + +#endif + diff --git a/hardware/arduino/mtk/libraries/LStorage/LSD.cpp b/hardware/arduino/mtk/libraries/LStorage/LSD.cpp new file mode 100644 index 00000000..b664f6c0 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LStorage/LSD.cpp @@ -0,0 +1,89 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "LSD.h" + +#include "vmio.h" + +static boolean _get_drv_handler(void* userdata); + +/***************************************************************************** +* +* LSD class +* +*****************************************************************************/ + +LSDClass::LSDClass() +{ + +} + +LSDClass::~LSDClass() +{ + +} + +boolean LSDClass::begin() +{ + int drv; + LTask.remoteCall(_get_drv_handler, &drv); + + if(drv > 0) + { + initDrv(drv); + return true; + } + else + { + return false; + } +} + +LSDClass LSD; + +/***************************************************************************** +* +* MMI part (running on MMI thread) +* +*****************************************************************************/ + +static boolean _get_drv_handler(void* userdata) +{ +#ifdef LINKITSTORAGE_DEBUG + Serial.print("vm_get_removable_driver()="); + Serial.println(vm_get_removable_driver()); +#endif + *((int*)userdata) = vm_get_removable_driver(); + return true; +} diff --git a/hardware/arduino/mtk/libraries/LStorage/LSD.h b/hardware/arduino/mtk/libraries/LStorage/LSD.h new file mode 100644 index 00000000..90fbbc52 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LStorage/LSD.h @@ -0,0 +1,61 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + + +#ifndef _LINKITSD_h +#define _LINKITSD_h + +#include "LStorage.h" + +// Class of LinkIt SD support +class LSDClass : public LDrive +{ +// Constructor / Destructor +public: + LSDClass(void); + ~LSDClass(void); + + // DESCRIPTION + // Initialzes the SD module + // RETURNS + // true if succeed, false if failed + virtual boolean begin(); + +}; + +extern LSDClass LSD; + +#endif + diff --git a/hardware/arduino/mtk/libraries/LStorage/LStorage.cpp b/hardware/arduino/mtk/libraries/LStorage/LStorage.cpp new file mode 100644 index 00000000..2645d5e5 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LStorage/LStorage.cpp @@ -0,0 +1,858 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#include "LStorage.h" + +#include "vmio.h" +#include "vmchset.h" +#include "vmstdlib.h" + +/***************************************************************************** +* +* Utility +* +*****************************************************************************/ + +#ifdef LINKITSTORAGE_DEBUG +static void _printwstr(VMWCHAR *filepath_buf) +{ + int i = 0; + while(filepath_buf[i]) + { + Serial.write(filepath_buf[i]); + i++; + } + Serial.println(); +} +#endif + +static boolean _conv_path(char drv, const char* filepath, VMWCHAR *filepath_buf) +{ + int i; + + memset(filepath_buf, 0, (LS_MAX_PATH_LEN)*sizeof(VMWCHAR)); + + filepath_buf[i++] = drv; + filepath_buf[i++] = ':'; + if(filepath[0] != '/') + filepath_buf[i++] = '/'; + + if (vm_ascii_to_ucs2(filepath_buf+i, (LS_MAX_PATH_LEN-i)*sizeof(VMWCHAR), (char*)filepath) < 0) + return false; + + i = 0; + while(filepath_buf[i]) + { + if(filepath_buf[i] == '/') + filepath_buf[i] = '\\'; + i++; + } + +#ifdef LINKITSTORAGE_DEBUG + Serial.print("[conv1]"); + _printwstr(filepath_buf); +#endif + + return true; +} + +static boolean _conv_path_back(const VMWCHAR* filepath, char *filepath_buf) +{ + int i = 0; + + memset(filepath_buf, 0, (LS_MAX_PATH_LEN)*sizeof(char)); + + if (vm_ucs2_to_ascii(filepath_buf, (LS_MAX_PATH_LEN)*sizeof(char), (VMWCHAR*)filepath+2) < 0) + return false; + + while(filepath_buf[i]) + { + if(filepath_buf[i] == '\\') + filepath_buf[i] = '/'; + i++; + } + +#ifdef LINKITSTORAGE_DEBUG + Serial.print("[conv2]"); + LSLOG(filepath_buf); +#endif + + return true; +} + +VMUINT mode_map(uint8_t mode) +{ + if(mode == FILE_WRITE) + return MODE_CREATE_ALWAYS_WRITE; + else + return MODE_READ; +} + +/***************************************************************************** +* +* structure data between Arduino / MMI thread +* +*****************************************************************************/ + +struct linkit_file_general_struct +{ + VMUINT fd; + VMINT result; + VMUINT value; +}; + +struct linkit_file_flush_struct +{ + VMUINT fd; + VMINT result; + void *buf; + VMUINT nbyte; +}; + +struct linkit_file_read_struct +{ + VMUINT fd; + VMINT result; + void *buf; + VMUINT nbyte; + boolean peek_mode; + +}; + +struct linkit_file_seek_struct +{ + VMUINT fd; + VMINT result; + VMINT pos; +}; + +struct linkit_file_find_struct +{ + VMUINT findhdl; + char *findpath; + VMWCHAR drv; + uint8_t mode; + + uint8_t is_dir; + VMUINT fd; + VMINT result; // 0: ok, <0: error + char name[LS_MAX_PATH_LEN]; +}; + +boolean linkit_file_read_handler(void* userdata); +boolean linkit_file_seek_handler(void* userdata); +boolean linkit_file_position_handler(void* userdata); +boolean linkit_file_size_handler(void* userdata); +boolean linkit_file_close_handler(void* userdata); +boolean linkit_file_available_handler(void* userdata); +boolean linkit_file_flush_handler(void* userdata); +boolean linkit_file_find_handler(void* userdata); +boolean linkit_file_find_close_handler(void* userdata); + +struct linkit_drv_general_op_struct +{ + const char *filepath; + VMINT op; + VMINT result; + VMWCHAR drv; +}; + +struct linkit_drv_open_struct +{ + const char *filepath; + VMINT mode; + VMINT result; + VMUINT fd; + VMINT is_dir; + VMWCHAR drv; +}; + +boolean linkit_drv_general_handler(void* userdata); +boolean linkit_drv_read_handler(void* userdata); + +struct linkit_file_handle_struct +{ + VMINT _hdl; + VMINT _ref; +}; + +#define HDL(fd) ((linkit_file_handle_struct*)fd)->_hdl +#define REF(fd) ((linkit_file_handle_struct*)fd)->_ref + +/***************************************************************************** +* +* LFile class +* +*****************************************************************************/ + + +LFile::LFile() +{ + _fd = 0; + _isDir = false; + _name[0] = 0; + _drv = 0; + _bufPos = 0; +} + +LFile::LFile(unsigned int fd, boolean isdir, char drv, const char* name) +{ + _fd = fd; + _isDir = isdir; + _drv = drv; + strncpy(_name, name, LS_MAX_PATH_LEN); + _bufPos = 0; +} + +LFile::~LFile() +{ + close(); +} + +size_t LFile::write(uint8_t v) +{ + if(!_fd || _isDir) + return 0; + + _buf[_bufPos++] = v; + if(_bufPos == LS_WRITE_BUF_SIZE) + flush(); + return 1; +} + +int LFile::read() +{ + uint8_t buf[1]; + int result; + + if(!_fd || _isDir) + return -1; + + result = _read(buf, 1, false); + if(result < 0) + return result; + + return buf[0]; +} + +int LFile::peek() +{ + uint8_t buf[1]; + int result; + + if(!_fd || _isDir) + return -1; + + result = _read(buf, 1, true); + if(result < 0) + return result; + + return buf[0]; +} + +int LFile::available() +{ + linkit_file_general_struct data; + + if(!_fd || _isDir) + return -1; + + data.fd = _fd; + + LTask.remoteCall(linkit_file_available_handler, &data); + + return data.result; +} + +void LFile::flush() +{ + linkit_file_flush_struct data; + + if(!_fd || _isDir || _bufPos == 0) + return; + + data.fd = _fd; + data.buf = _buf; + data.nbyte = _bufPos; + + LTask.remoteCall(linkit_file_flush_handler, &data); + + _bufPos = 0; +} + +int LFile::read(void *buf, uint16_t nbyte) +{ + return _read(buf, nbyte, false); +} + +int LFile::_read(void *buf, uint16_t nbyte, boolean peek_mode) +{ + linkit_file_read_struct data; + + if(!_fd || _isDir) + return -1; + + data.fd = _fd; + data.buf = buf; + data.nbyte = nbyte; + data.peek_mode = peek_mode; + + LTask.remoteCall(linkit_file_read_handler, &data); + + return data.result; +} + +boolean LFile::seek(uint32_t pos) +{ + linkit_file_seek_struct data; + + if(!_fd || _isDir) + return false; + + data.fd = _fd; + data.pos = pos; + + LTask.remoteCall(linkit_file_seek_handler, &data); + + return data.result; +} + +uint32_t LFile::position() +{ + linkit_file_general_struct data; + + if(!_fd || _isDir) + return 0; + + data.fd = _fd; + + LTask.remoteCall(linkit_file_position_handler, &data); + + return data.value; +} + +uint32_t LFile::size() +{ + linkit_file_general_struct data; + + if(!_fd || _isDir) + return 0; + + data.fd = _fd; + + LTask.remoteCall(linkit_file_size_handler, &data); + + return data.value; +} + +void LFile::close() +{ + linkit_file_general_struct data; + + if(!_fd || _isDir) + return; + + flush(); + + data.fd = _fd; + + if(_isDir) + LTask.remoteCall(linkit_file_find_close_handler, &data); + else + LTask.remoteCall(linkit_file_close_handler, &data); + + _fd = 0; +} + +LFile::operator bool() +{ + return _fd ? true : false; +} + +LFile& LFile::operator=(const LFile& other) +{ + memcpy(this, &other, sizeof(LFile)); + if(_fd) + REF(_fd)++; + + return *this; +} + +char * LFile::name() +{ + int i, len = strlen(_name); + if (len == 1) + return _name; + + for(i=len-2;i--;i>=0) + if(_name[i]=='/') + break; + + i++; + return _name+i; +} + +boolean LFile::isDirectory(void) +{ + if(_isDir) + return true; + + return false; +} + +LFile LFile::openNextFile(uint8_t mode) +{ + linkit_file_find_struct data; + if (!_isDir) + return LFile(); + + data.mode = mode; + data.drv = _drv; + data.findpath = _name; + data.findhdl = _fd; + + LTask.remoteCall(linkit_file_find_handler, &data); + + _fd = data.findhdl; + + if (data.result < 0) + { + return LFile(); + } + + return LFile(data.fd, data.is_dir, _drv, data.name); +} + +void LFile::rewindDirectory(void) +{ + linkit_file_general_struct data; + if (!_isDir || !_fd) + return; + + data.fd = _fd; + LTask.remoteCall(linkit_file_find_close_handler, &data); + _fd = 0; +} + +/***************************************************************************** +* +* LFile MMI part (running on MMI thread) +* +*****************************************************************************/ + +boolean linkit_file_read_handler(void* userdata) +{ + linkit_file_read_struct *data = (linkit_file_read_struct*)userdata; + VMUINT read; + + data->result = vm_file_read(HDL(data->fd), data->buf, data->nbyte, &read); + + if(data->peek_mode) + { + // peek mode, rewind back + vm_file_seek(HDL(data->fd), -read, BASE_CURR); + } + + return true; +} + +boolean linkit_file_seek_handler(void* userdata) +{ + linkit_file_seek_struct *data = (linkit_file_seek_struct*)userdata; + + data->result = vm_file_seek(HDL(data->fd), data->pos, BASE_BEGIN); + + return true; +} + +boolean linkit_file_position_handler(void* userdata) +{ + linkit_file_general_struct *data = (linkit_file_general_struct*)userdata; + + data->result = vm_file_tell(HDL(data->fd)); + + if(data->result >= 0) + data->value = data->result; + else + data->value = 0; + + return true; +} + +boolean linkit_file_size_handler(void* userdata) +{ + linkit_file_general_struct *data = (linkit_file_general_struct*)userdata; + VMUINT size; + + data->result = vm_file_getfilesize(HDL(data->fd), &size); + if (data->result == 0) + data->value = size; + else + data->value = 0; + + return true; +} + +boolean linkit_file_close_handler(void* userdata) +{ + linkit_file_general_struct *data = (linkit_file_general_struct*)userdata; + + REF(data->fd)--; + if(REF(data->fd) == 0) + { + vm_file_close(HDL(data->fd)); + free((void*)data->fd); + data->fd = 0; + } + + return true; +} + +boolean linkit_file_available_handler(void* userdata) +{ + linkit_file_general_struct *data = (linkit_file_general_struct*)userdata; + + VMUINT size = 0; + VMINT pos = 0; + + vm_file_getfilesize(HDL(data->fd), &size); + pos = vm_file_tell(HDL(data->fd)); + + if(!size || pos < 0) + { + data->result = pos; + } + else + { + size -= pos; + data->result = size > 0x7FFF ? 0x7FFF : 0; // follow Arduino File.cpp's rule + } + + return true; +} + +boolean linkit_file_flush_handler(void* userdata) +{ + linkit_file_flush_struct *data = (linkit_file_flush_struct*)userdata; + + if(data->nbyte) + { + VMUINT written; + vm_file_write(HDL(data->fd), data->buf, data->nbyte, &written); + } + + data->result = vm_file_commit(HDL(data->fd)); + + return true; +} + +boolean linkit_file_find_handler(void* userdata) +{ + linkit_file_find_struct *data = (linkit_file_find_struct*)userdata; + VMWCHAR filepath_buf[LS_MAX_PATH_LEN]; + vm_fileinfo_t info; + VMINT attr; + VMINT findhdl; + + data->result = -1; + + if(!_conv_path(data->drv, data->findpath, filepath_buf)) + return true; + + int len = vm_wstrlen(filepath_buf); + if(filepath_buf[len-1] != '\\') + { + filepath_buf[len] = '\\'; + filepath_buf[len+1] = 0; + len++; + } + + if(!data->findhdl) + { + filepath_buf[len] = '*'; + filepath_buf[len+1] = 0; + +#ifdef LINKITSTORAGE_DEBUG + Serial.print("[find]"); + _printwstr(filepath_buf); +#endif + + findhdl = vm_find_first(filepath_buf, &info); + if(findhdl < 0) + return true; + + // skip . and .. + while( (info.filename[0] == '.' && info.filename[1] == 0) || + (info.filename[0] == '.' && info.filename[1] == '.' && info.filename[2] == 0) ) + { + data->result = vm_find_next(findhdl, &info); + if(data->result < 0) + { + vm_find_close(findhdl); + return true; + } + } + + data->findhdl = (VMUINT)malloc(sizeof(linkit_file_handle_struct)); + HDL(data->findhdl) = findhdl; + REF(data->findhdl) = 1; + } + else + { + findhdl = HDL(data->findhdl); + data->result = vm_find_next(findhdl, &info); + if(data->result < 0) + return true; + } + + vm_wstrcpy(filepath_buf+len, info.filename); + + attr = vm_file_get_attributes(filepath_buf); + if (attr >= 0 && attr & VM_FS_ATTR_DIR) + { + LSLOG("[find]dir"); + data->is_dir = true; + data->result = 0; + } + else if(attr < 0) // special case for SD label entry + { +#ifdef LINKITSTORAGE_DEBUG + Serial.print("[find]SD label?:"); + _printwstr(filepath_buf); +#endif + data->is_dir = true; + data->result = 0; + } + else + { + LSLOG("[find]file"); + data->is_dir = false; + data->result = vm_file_open(filepath_buf, mode_map(data->mode), TRUE); + if(data->result < 0) + { + REF(data->findhdl)--; + if(REF(data->findhdl) == 0) + { + vm_find_close(HDL(data->findhdl)); + free((void*)data->findhdl); + data->findhdl = 0; + } + } + else + { + data->fd = (VMUINT)malloc(sizeof(linkit_file_handle_struct)); + HDL(data->fd) = data->result; + REF(data->fd) = 1; + } + } + _conv_path_back(filepath_buf, data->name); + + return true; +} + +boolean linkit_file_find_close_handler(void* userdata) +{ + linkit_file_general_struct *data = (linkit_file_general_struct*)userdata; + + REF(data->fd)--; + if(REF(data->fd) == 0) + { + vm_find_close(HDL(data->fd)); + free((void*)data->fd); + data->fd = 0; + } + + return true; +} + +/***************************************************************************** +* +* LDrive class +* +*****************************************************************************/ + + +boolean LDrive::general_op(int op, char *filepath) +{ + linkit_drv_general_op_struct data; + + data.filepath = filepath; + data.op = op; + data.drv = _drv; + + LTask.remoteCall(linkit_drv_general_handler, &data); + + return data.result; +} + +LFile LDrive::open(const char *filename, uint8_t mode) +{ + linkit_drv_open_struct data; + + data.filepath = filename; + data.mode = mode; + data.drv = _drv; + + LTask.remoteCall(linkit_drv_read_handler, &data); + + if (!data.result) // fail, return empty object + { + LSLOG("open() fail"); + return LFile(); + } + + return LFile(data.fd, data.is_dir, _drv, filename); +} + +/***************************************************************************** +* +* LFile MMI part (running on MMI thread) +* +*****************************************************************************/ + +static int recur_mkdir(VMWCHAR* path) +{ + int result; + VMWCHAR *pos; + + // check if already exist + result = vm_file_get_attributes(path); + if(result >= 0) + return -1; // already exist + + pos = path+3; + while(*pos) + { + if(*pos == '\\') + { + *pos = 0; + vm_file_mkdir(path); + *pos = '\\'; + } + pos++; + } + vm_file_mkdir(path); + + // check if final path exist + result = vm_file_get_attributes(path); + if(result >= 0) + result = 0; // succeed + + return result; +} + +boolean linkit_drv_general_handler(void* userdata) +{ + linkit_drv_general_op_struct *data = (linkit_drv_general_op_struct*)userdata; + VMWCHAR filepath_buf[LS_MAX_PATH_LEN]; + int result; + + data->result = false; + + if(!_conv_path(data->drv, data->filepath, filepath_buf)) + return true; + + switch(data->op) + { + case 1: // exists + result = vm_file_get_attributes(filepath_buf); + break; + + case 2: // mkdir + result = recur_mkdir(filepath_buf); + break; + + case 3: // remove + result = vm_file_delete(filepath_buf); + break; + + case 4: // rmdir + result = vm_file_rmdir(filepath_buf); + break; + } + +#ifdef LINKITSTORAGE_DEBUG + Serial.print("[gen_op]"); + Serial.print(data->op); + Serial.print(":"); + Serial.println(result); +#endif + + data->result = result < 0 ? false : true; + return true; +} + +boolean linkit_drv_read_handler(void* userdata) +{ + linkit_drv_open_struct *data = (linkit_drv_open_struct*)userdata; + VMWCHAR filepath_buf[LS_MAX_PATH_LEN]; + VMINT attr; + VMINT fd; + + data->result = false; + + if(!_conv_path(data->drv, data->filepath, filepath_buf)) + { + return true; + } + + // identify if this is a file or dir + attr = vm_file_get_attributes(filepath_buf); + + if (attr >= 0 && attr & VM_FS_ATTR_DIR) + { + data->is_dir = true; + data->fd = 0; + data->result = true; + LSLOG("open ok (dir)"); + } + else + { + data->is_dir = false; + fd = vm_file_open(filepath_buf, mode_map(data->mode), TRUE); + if (fd > 0) + { + LSLOG("open ok (file)"); + data->result = true; + + data->fd = (VMUINT)malloc(sizeof(linkit_file_handle_struct)); + HDL(data->fd) = fd; + REF(data->fd) = 1; + } + } + + return true; +} + + diff --git a/hardware/arduino/mtk/libraries/LStorage/LStorage.h b/hardware/arduino/mtk/libraries/LStorage/LStorage.h new file mode 100644 index 00000000..577cc9bf --- /dev/null +++ b/hardware/arduino/mtk/libraries/LStorage/LStorage.h @@ -0,0 +1,281 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + + +#ifndef _LINKITSTORAGE_h +#define _LINKITSTORAGE_h + +#include +#include "LTask.h" + +#define LS_WRITE_BUF_SIZE 128 +#define LS_MAX_PATH_LEN 260 + +#ifndef FILE_READ +#define FILE_READ 0x01 +#endif + +#ifndef FILE_WRITE +#define FILE_WRITE 0x13 +#endif + +// Class of LinkIt File support +class LFile : public Stream +{ + friend class LSDClass; + +// Constructor / Destructor +public: + LFile(unsigned int fd, boolean isdir, char drv, const char *name); // wraps an underlying SdFile + LFile(void); // 'empty' constructor + ~LFile(void); // destructor + +// Method +public: + using Print::write; // pull in write(str) and write(buf, size) from Print + + // DESCRIPTION + // Writes data info the file opened with FILE_WRITE mode. Similar to print(). + // RETURNS + // Number of bytes written + virtual size_t write( + uint8_t v // [IN] byte to write + ); + + //virtual size_t write(const uint8_t *buf, size_t size); + + // DESCRIPTION + // Reads single byte from the file and moves the file cursor 1 step. + // In contrast, peek() reads from the file without moving the file cursor + // RETURNS + // One byte of content the file cursor points to + virtual int read(); + + // DESCRIPTION + // Reads single byte from file without moving the file cursor. + // Due to the cursor is kept at the same place, repeatedly calling peek() will always get the same result. + // In contrast, read() moves the file cursor 1 step further. + // RETURNS + // One byte of content the file cursor points to + virtual int peek(); + + // DESCRIPTION + // Queries if there are still data to be read (if it reaches the end of file or not). + // RETURNS + // Number of bytes to be read, or 0 if it is the end of file + virtual int available(); + + // DESCRIPTION + // Makes sure the data are written into SD/flash storage to prevent data corruption in case of sudden power-off. + // Note: close() also guarantees flush() will be done. + virtual void flush(); + + // DESCRIPTION + // read array of bytes from file + // RETURNS + // number of bytes read + int read( + void *buf, // [OUT] buffer to retrieve data + uint16_t nbyte // [IN] size of buffer + ); + + // DESCRIPTION + // Changes the cursor position; can be number from 0 to the size of file. + // Use read() to retrieve the content on the current position and move cursor at the same time. + // Use peek() to retrieve content on the current position without moving the cursor. + // Use position() to get the current cursor position. + // RETURNS + // true: Succeed + // false: Fail. The position is not changed. + boolean seek( + uint32_t pos // [IN] new cursor position + ); + + // DESCRIPTION + // Returns the position of file cursor. + // Use read() to retrieve content from the current position and move cursor at the same time. + // Use peek() to retrieve content from the current position without moving the cursor. + // Use seek() to change the cursor position. + // RETURNS + // Current position of file cursor + uint32_t position(); + + // DESCRIPTION + // Returns the size of file. + // RETURNS + // Size of file + uint32_t size(); + + // DESCRIPTION + // Closes the file to release resource to prevent leakage. + // Make sure the data are completely written to the SD/flash storage. + void close(); + +/* DOM-NOT_FOR_SDK-BEGIN */ + operator bool(); + + LFile& operator=(const LFile& other); +/* DOM-NOT_FOR_SDK-END */ + + // DESCRIPTION + // Returns the name of file. + // RETURNS + // Name of file + char * name(); + + // DESCRIPTION + // Folder is a special type of file. isDirectory() is used for knowing if an LFile object is a file or a folder. + // RETURNS + // true: Folder + // false: File + boolean isDirectory(void); + + // DESCRIPTION + // Folder is a special type of file. openNextFile() is used for enumerating sub-files in a folder. + // It returns the next sub-file or sub-folder in the folder. + // RETURNS + // Next sub-file or sub-folder in the folder + LFile openNextFile( + uint8_t mode = FILE_READ // [IN] open mode, can be FILE_READ or FILE_WRITE + ); + + // DESCRIPTION + // Folder is a special type of file. rewindDirectory() is used with openNextFile() to rewind the enumeration and start from the beginning; so that the next openNextFile() call will return the first sub-file (or sub-folder). + void rewindDirectory(void); + +private: + int _read(void *buf, uint16_t nbyte, boolean peek_mode); + +private: + unsigned int _fd; + char _name[LS_MAX_PATH_LEN]; + boolean _isDir; + char _drv; + + uint8_t _buf[LS_WRITE_BUF_SIZE]; + uint8_t _bufPos; +}; + + +// Base Class of LinkIt SD/Flash +class LDrive +{ +// Constructor / Destructor +protected: + LDrive(void) { _drv = 0; }; + ~LDrive(void) {}; + +// Method +public: + + // DESCRIPTION + // Initialzes the SD or Flash module + // RETURNS + // true if succeed, false if failed + virtual boolean begin() = 0; + + // DESCRIPTION + // Opens a file (or folder). + // When the file path does not exist: If FILE_WRITE mode is given, an empty file will be created; if FILE_READ mode is given, it will simply return "fail". + // FILE_READ: Read only, cannot write, starting from the beginning of file (so that you can read its content from the beginning) + // FILE_WRITE: Can read and write, starting from the end of file (so that when you write data it will append to tail). + // RETURNS + // An LFile object to represent the file (or folder) + // If the opening fails. it will return an empty LFile object. An empty LFile object can be evaluated as false, so you can use "if (f)" to test the result. + LFile open( + const char *filename, // [IN] file to open + uint8_t mode = FILE_READ // [IN] mode of opening, FILE_READ by default if not specified. + ); + + // DESCRIPTION + // Tests the given file exists or not. + // RETURNS + // true: It exists. + // false: It does not exist. + boolean exists( + char *filepath // [IN] File (or folder) to check + ) { return general_op(1, filepath); } + + // DESCRIPTION + // Creates folder. It can create multiple sub folders at once; for example, LSD.mkdir("a/b/c") can create a, b, c, 3 folders at the same time. + // RETURNS + // true: Succeed + // false: Fail + boolean mkdir( + char *filepath // [IN] Name of the folder to be created. Use "/" to seperate sub-folders. + ) { return general_op(2, filepath); } + + // DESCRIPTION + // Deletes a file. + // RETURNS + // true: Succeed + // false: Fail + boolean remove( + char *filepath // [IN] file to be deleted + ) { return general_op(3, filepath); } + + // DESCRIPTION + // Deletes a folder. The folder must be empty, or it will fail. + // RETURNS + // true: Succeed + // false: Fail + boolean rmdir( + char *filepath // [IN] folder to be deleted + ) { return general_op(4, filepath); } + +protected: + char getDrv() {return _drv;} + void initDrv(char drv_letter) { _drv = drv_letter; }; + +private: + + boolean general_op(int op, char *filepath); + +private: + char _drv; + +}; + + +#undef LINKITSTORAGE_DEBUG + +#ifdef LINKITSTORAGE_DEBUG +#define LSLOG(x) Serial.println(x) +#else +#define LSLOG(x) +#endif + +#endif + diff --git a/hardware/arduino/mtk/libraries/LWiFi/LWiFi.cpp b/hardware/arduino/mtk/libraries/LWiFi/LWiFi.cpp new file mode 100644 index 00000000..0ec00a93 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/LWiFi.cpp @@ -0,0 +1,712 @@ +#include +#include "LTask.h" +#include "LWiFi.h" +#include "vmhttp.h" +#include "vmlog.h" +#include "vmtcp.h" + +LWiFiLoginInfo::LWiFiLoginInfo(): + m_enc(LWIFI_OPEN), + m_password(NULL) +{ +} + +LWiFiLoginInfo::LWiFiLoginInfo(LWiFiEncryption enc, const String &password): + m_enc(enc), + m_password(password) +{ +} + +LWiFiLoginInfo::LWiFiLoginInfo(LWiFiEncryption enc, const String &password, const String &username): + m_enc(enc), + m_password(password), + m_username(username) +{ +} + +struct LWiFiContext +{ + VM_SIGNAL_ID sig; + + LWiFiContext() + { + sig = vm_signal_init(); + } + + ~LWiFiContext() + { + vm_signal_deinit(sig); + sig = 0; + } +}; + +LWiFiClass::LWiFiClass() +{ + memset(&m_apInfo, 0, sizeof(m_apInfo)); + memset(&m_ipInfo, 0, sizeof(m_ipInfo)); + memset(&m_scanInfo, 0, sizeof(m_scanInfo)); + memset(&m_apParam, 0, sizeof(m_apParam)); +} + +static void onWifiInitialized(void *userData, vm_wlan_req_res_enum result) +{ + if (result != VM_WLAN_REQ_RES_DONE) + { + vm_log_error("onWifiInitialized: result error code %d", result); + } + LTask.post_signal(); +} + +boolean wifiInitialize(void *userData) +{ + // enable WiFi (as mobile station) and wait for callback + if (VM_WLAN_SET_MODE_STA != vm_wlan_mode_get()) + { + vm_wlan_mode_set(VM_WLAN_SET_MODE_STA, &onWifiInitialized, NULL); + return false; + } + + // already initialized + return true; +} + +void LWiFiClass::begin() +{ + LTask.remoteCall(&wifiInitialize, NULL); + return; +} + +static void onWifiUninitialized(void *userData, vm_wlan_req_res_enum result) +{ + if (result != VM_WLAN_REQ_RES_DONE) + { + vm_log_error("onWifiUninitialized: result error code %d", result); + } + LTask.post_signal(); +} + +boolean wifiUnitinialize(void *userData) +{ + // enable WiFi (as mobile station) and wait for callback + if (VM_WLAN_SET_MODE_OFF != vm_wlan_mode_get()) + { + vm_wlan_mode_set(VM_WLAN_SET_MODE_OFF, &onWifiUninitialized, NULL); + return false; + } + + // already initialized + return true; +} + +void LWiFiClass::end() +{ + LTask.remoteCall(&wifiUnitinialize, NULL); + return; +} + +//------------------------------------ +// Begin() connection methods +//------------------------------------ +struct LWiFiConnectContext +{ + vm_wlan_ap_info_struct apInfo; + vm_wlan_conned_ap_info_struct connectedInfo; + vm_wlan_ip_info_struct ipInfo; + vm_wlan_conn_res_struct result; + + LWiFiConnectContext() + { + memset(&apInfo, 0, sizeof(apInfo)); + memset(&ipInfo, 0, sizeof(ipInfo)); + memset(&result, 0, sizeof(result)); + memset(&connectedInfo, 0, sizeof(connectedInfo)); + } + + ~LWiFiConnectContext() + { + } +}; + +static void onWifiConnected(void *user_data, vm_wlan_conn_res_struct *conn_res) +{ + vm_log_info("onWifiConnected (MMI)"); + LWiFiConnectContext *pContext = (LWiFiConnectContext*)user_data; + + // connect result + pContext->result = *conn_res; + + vm_log_info("onWifiConnected result=%d", conn_res->result); + + if (VM_WLAN_RESULT_SUCCESS != pContext->result.result) + { + vm_log_info("FAILED ret=%d cause=%d", conn_res->result, conn_res->cause); + // connect fail, + // wakeup Arduino thread directly + LTask.post_signal(); + } + else + { + // connect OK, + // retrieve AP & IP info. + // in DHCP case, we may need to wait for IP ready + vm_wlan_get_connected_ap_info((void*)&pContext->connectedInfo, VM_WLAN_AP_INFO_ALL); + + // We should then wait for IP info, which will be callbacked + } + return; +} + +static void onWiFiIPReady(void *userData, vm_wlan_noti_struct *noti) +{ + vm_log_info("onWiFiIPReady notify_type=%d", noti->type); + LWiFiConnectContext *pContext = (LWiFiConnectContext*)userData; + + if (VM_WLAN_NOTI_IP_AVAILABLE == noti->type) + { + vm_wlan_get_ip_info(&pContext->ipInfo); + VMUINT8 *ip_addr = pContext->ipInfo.ip_addr; + vm_log_info("get localIP address = %d, %d, %d, %d", + ip_addr[0], + ip_addr[1], + ip_addr[2], + ip_addr[3]); + + // unregister to prevent receiving duplicated data + vm_wlan_dereg_noti(VM_WLAN_NOTI_IP_AVAILABLE, &onWiFiIPReady, pContext); + + // IP ready, + // notify Arduino thread to wake up + pContext->result.result = VM_WLAN_RESULT_SUCCESS; + LTask.post_signal(); + } +} + +static void onWiFiEnabled(void *userData, vm_wlan_req_res_enum result) +{ + LWiFiConnectContext *pContext = (LWiFiConnectContext*)userData; + + vm_log_info("onWiFiEnabled result=%d", result); + + do + { + if (VM_WLAN_REQ_RES_DONE != result) + { + vm_log_info("wifi status change error=%d", result); + break; + } + + vm_log_info("vm_wlan_reg_noti"); + + // register IP callback + vm_wlan_reg_noti(VM_WLAN_NOTI_IP_AVAILABLE, &onWiFiIPReady, pContext); + + vm_log_info("vm_wlan_connect"); + // connect to AP + VMINT connectRet = vm_wlan_connect(&pContext->apInfo, &onWifiConnected, pContext); + + vm_log_info("vm_wlan_connect ret =%d", connectRet); + if (connectRet != VM_WLAN_RESULT_PROCESSING) + { + vm_log_info("vm_wlan_connect fails ret=%d", connectRet); + break; + } + + vm_log_info("start waiting connect & IP address"); + return; + } + while (0); + + // fail and allow arduino thread to keep going + vm_log_info("vm_wlan_mode_set cb result=%d", result); + pContext->result.result = VM_WLAN_RESULT_FAILED; + LTask.post_signal(); +} + +static boolean wifiBegin(void* userData) +{ + vm_log_info("wifiBegin (in MMI)"); + + + LWiFiConnectContext *pContext = (LWiFiConnectContext*)userData; + + const VMINT wlanStatus = vm_wlan_status(); + // check if we already connected + if (wlanStatus & VM_WLAN_STA_STATUS_CONNECTED) + { + pContext->result.result = VM_WLAN_RESULT_STATE_ERROR; + return true; + } + + // first we enable WiFi and wait for callback + if (VM_WLAN_SET_MODE_STA != vm_wlan_mode_get()) + { + vm_wlan_mode_set(VM_WLAN_SET_MODE_STA, &onWiFiEnabled, pContext); + } + else + { + onWiFiEnabled(pContext, VM_WLAN_REQ_RES_DONE); + } + + // block Arduino thread + return false; +} + +int LWiFiClass::wifiConnectImpl(LWiFiConnectContext &context) +{ + vm_log_info("wifiConnectImpl"); + LTask.remoteCall(&wifiBegin, &context); + + // return 1 when success. 0 when fail + if (VM_WLAN_RESULT_SUCCESS == context.result.result) + { + // copy resulting information + m_apInfo = context.connectedInfo; + m_ipInfo = context.ipInfo; + return 1; + } + else + { + vm_log_info("wifiConnectImpl fails=%d", context.result.result); + return 0; + } + +} + +int LWiFiClass::connect(const char* ssid) +{ + // connect to open network + LWiFiConnectContext context; + strncpy((char*)context.apInfo.ssid, ssid, VM_WLAN_PROF_MAX_SSID_LEN); + memset(context.apInfo.password, 0, sizeof(context.apInfo.password)); + context.apInfo.auth_mode = VM_WLAN_AUTH_MODE_OPEN; + + return wifiConnectImpl(context); +} + +int LWiFiClass::connect(const char* ssid, const LWiFiLoginInfo &loginInfo) +{ + LWiFiConnectContext context; + switch (loginInfo.m_enc) + { + case LWIFI_OPEN: + context.apInfo.auth_mode = VM_WLAN_AUTH_MODE_OPEN; + break; + case LWIFI_WEP: + context.apInfo.auth_mode = VM_WLAN_AUTH_MODE_WEP; + break; + case LWIFI_WPA: + context.apInfo.auth_mode = VM_WLAN_AUTH_MODE_WPA_ONLY_PSK; + break; + } + strncpy((char*)context.apInfo.ssid, ssid, VM_WLAN_PROF_MAX_SSID_LEN); + strncpy((char*)context.apInfo.password, loginInfo.m_password.c_str(), VM_WLAN_PROF_PSWD_MAX_LEN); + + return wifiConnectImpl(context); +} + +int LWiFiClass::connectWEP(const char* ssid, const char* key) +{ + // connect with WEP + LWiFiConnectContext context; + strncpy((char*)context.apInfo.ssid, ssid, VM_WLAN_PROF_MAX_SSID_LEN); + strncpy((char*)context.apInfo.password, key, VM_WLAN_PROF_PSWD_MAX_LEN); + context.apInfo.auth_mode = VM_WLAN_AUTH_MODE_WEP; + + return wifiConnectImpl(context); +} + +int LWiFiClass::connectWPA(const char* ssid, const char *passphrase) +{ + // connect with WPA + LWiFiConnectContext context; + strncpy((char*)context.apInfo.ssid, ssid, VM_WLAN_PROF_MAX_SSID_LEN); + strncpy((char*)context.apInfo.password, passphrase, VM_WLAN_PROF_PSWD_MAX_LEN); + // There are only 4 modes supported in LINKIT: + // VM_WLAN_AUTH_MODE_OPEN + // VM_WLAN_AUTH_MODE_WEP + // VM_WLAN_AUTH_MODE_WPA2_ONLY + // VM_WLAN_AUTH_MODE_WPA_ONLY_PSK; + // and the "VM_WLAN_AUTH_MODE_WPA_ONLY_PSK" mode + // will automatically switch between WPA2 and WPA / WPA_PSK. + // so we use this mode. + context.apInfo.auth_mode = VM_WLAN_AUTH_MODE_WPA_ONLY_PSK; + + return wifiConnectImpl(context); +} + +//------------------------------------ +// scanNetworks methods +//------------------------------------ +struct LWiFiScanContext +{ + vm_wlan_scan_result_struct result; + + LWiFiScanContext() + { + memset(&result, 0, sizeof(result)); + } + + ~LWiFiScanContext() + { + + } + + static void scanCallback(VMUINT32 job_id, void *user_data, vm_wlan_scan_result_struct *scan_res) + { + LWiFiScanContext *pContext = (LWiFiScanContext*)user_data; + pContext->result = *scan_res; + // result collected. + vm_log_info("scanCallback scan_res=%d", scan_res->result); + LTask.post_signal(); + } + + static boolean mmiCall(void *userData) + { + LWiFiScanContext *pContext = (LWiFiScanContext*)userData; + const VMINT job = vm_wlan_scan(&scanCallback, pContext); + vm_log_info("vm_wlan_scan ret=%d", job); + if (job > 0) + { + // started scan, + // let Arduino thread wait for signal. + return false; + } + else + { + // failed to scan, post signal to continue; + // return true; + return false; + } + + } +}; + +int8_t LWiFiClass::scanNetworks() +{ + vm_log_info("scanNetworks"); + LWiFiScanContext context; + LTask.remoteCall(&LWiFiScanContext::mmiCall, &context); + m_scanInfo = context.result; + vm_log_info("scanNetworks ret=%d", m_scanInfo.ap_list_num); + return m_scanInfo.ap_list_num; +} + +char* LWiFiClass::SSID(uint8_t networkItem) +{ + if (networkItem >= m_scanInfo.ap_list_num) + { + return NULL; + } + + // length check + vm_wlan_scan_ap_info_struct &apInfo = m_scanInfo.ap_list[networkItem]; + + if (apInfo.ssid_len < VM_WLAN_WNDRV_SSID_MAX_LEN && apInfo.ssid_len >= 0) + { + apInfo.ssid[apInfo.ssid_len] = '\0'; + } + + return (char*)m_scanInfo.ap_list[networkItem].ssid; +} + +int32_t LWiFiClass::RSSI(uint8_t networkItem) +{ + if (networkItem >= m_scanInfo.ap_list_num) + { + return 0; + } + + return m_scanInfo.ap_list[networkItem].rssi; +} + +//------------------------------------ +// status/domain resolve methods +//------------------------------------ + +static boolean wifiStatus(void *userData) +{ + vm_wlan_sta_status_enum *pStatus = (vm_wlan_sta_status_enum*)userData; + *pStatus = (vm_wlan_sta_status_enum)vm_wlan_status(); +} + +LWifiStatus LWiFiClass::status() +{ + vm_wlan_sta_status_enum wlanStatus = VM_WLAN_STA_STATUS_INACTIVE; + LTask.remoteCall(&wifiStatus, &wlanStatus); + + if (wlanStatus & VM_WLAN_STA_STATUS_BUSY) + { + // this should not happen to Arduino, + // since we block until state change done. + // so it should not return BUSY + return LWIFI_STATUS_DISCONNECTED; + } + + if (wlanStatus & VM_WLAN_STA_STATUS_INACTIVE) + { + return LWIFI_STATUS_DISABLED; + } + + if (wlanStatus & VM_WLAN_STA_STATUS_CONNECTED) + { + return LWIFI_STATUS_CONNECTED; + } + + if (wlanStatus & VM_WLAN_STA_STATUS_ACTIVE) + { + return LWIFI_STATUS_DISCONNECTED; + } + + if (wlanStatus & VM_WLAN_STA_STATUS_INVALID_MAC) + { + return LWIFI_STATUS_DISABLED; + } + + if (wlanStatus & VM_WLAN_STA_STATUS_SNIFFER) + { + return LWIFI_STATUS_DISCONNECTED; + } +} + +struct LWiFiResolveContext +{ + const char *domainName; + vm_soc_dns_result dns; + VMINT resolveState; + + LWiFiResolveContext(): + domainName(NULL), + resolveState(VM_E_SOC_INVAL) + { + memset(&dns, 0, sizeof(dns)); + } + + ~LWiFiResolveContext() + { + } +}; + +static VMINT wifiResolveCallback(VMINT jobId, vm_soc_dns_result *pDNS, void *userData) +{ + vm_log_info("wifiResolveCallback"); + LWiFiResolveContext *pContext = (LWiFiResolveContext*)userData; + unsigned char* ipArray = (unsigned char*)&pDNS->address[0]; + vm_log_info("DNS resolve callback, cause=%d, num=%d, address=%d.%d.%d.%d", + pDNS->error_cause, + pDNS->num, + ipArray[0], + ipArray[1], + ipArray[2], + ipArray[3]); + + // TODO: since we don't know the definition of error_cause yet, + // treat all as OK. + if (pDNS && pDNS != &pContext->dns) + { + vm_log_info("pDNS != pContext->dns"); + pContext->dns = *pDNS; + } + pContext->resolveState = VM_E_SOC_SUCCESS; + LTask.post_signal(); +} + +static boolean wifiResolveDomainName(void *userData) +{ + LWiFiResolveContext *pContext = (LWiFiResolveContext*)userData; + + vm_log_info("vm_soc_get_host_by_name_ex: %s", pContext->domainName); + pContext->resolveState = vm_soc_get_host_by_name_ex(VM_TCP_APN_WIFI, + pContext->domainName, + &pContext->dns, + &wifiResolveCallback, + pContext); + vm_log_info("vm_soc_get_host_by_name_ex ret = %d", pContext->resolveState); + + if (pContext->resolveState > 0) + { + // not done yet + return false; + } + + switch (pContext->resolveState) + { + case VM_E_SOC_SUCCESS: // Get IP address successfully, result is filled. + return true; + case VM_E_SOC_WOULDBLOCK: // wait response from network, result could be gotten from callback. + // need to wait, return directly + // so MMI message loop may continue. + return false; + case VM_E_SOC_INVAL: // invalid arguments: null domain_name, etc. + case VM_E_SOC_ERROR: // unspecified error + case VM_E_SOC_LIMIT_RESOURCE: // socket resources not available + case VM_E_SOC_INVALID_ACCOUNT: // invalid data account id + return true; + } +} + +int LWiFiClass::hostByName(const char* aHostname, IPAddress& aResult) +{ + vm_log_info("hostByName"); + LWiFiResolveContext context; + // no memory copy since we're blocking call + context.domainName = aHostname; + LTask.remoteCall(&wifiResolveDomainName, (void*)&context); + + vm_log_info("context.resolveState = %d", context.resolveState); + unsigned char* ipArray = (unsigned char*)&context.dns.address[0]; + vm_log_info("Arduino DNS resolve callback, cause=%d, num=%d, address=%d.%d.%d.%d", + context.dns.error_cause, + context.dns.num, + ipArray[0], + ipArray[1], + ipArray[2], + ipArray[3]); + // parse result + if (VM_E_SOC_SUCCESS == context.resolveState) + { + // TODO: why are there multiple ip addresses? + + aResult = context.dns.address[0]; + + vm_log_info("get IP=%d.%d.%d.%d", + aResult[0], + aResult[1], + aResult[2], + aResult[3]); + return 1; + } + else + { + return 0; + } +} + +//------------------------------------ +// property methods +//------------------------------------ +struct LWiFiDisconnectContext +{ + VM_SIGNAL_ID sigDisconnect; + vm_wlan_req_res_enum result; + + LWiFiDisconnectContext(): + result((vm_wlan_req_res_enum)VM_WLAN_REQ_RES_FAILED) + { + sigDisconnect = vm_signal_init(); + } + + ~LWiFiDisconnectContext() + { + vm_signal_deinit(sigDisconnect); + } +}; + +static void LWiFiOnDisconnect(void *userData, vm_wlan_req_res_enum res) +{ + LWiFiDisconnectContext *pContext = (LWiFiDisconnectContext*)userData; + pContext->result = res; + vm_signal_post(pContext->sigDisconnect); +} + +static boolean wifiDisconnect(void* userData) +{ + LWiFiDisconnectContext *pContext = (LWiFiDisconnectContext*)userData; + vm_wlan_disconnect(&LWiFiOnDisconnect, pContext); +} + +int LWiFiClass::disconnect(void) +{ + LWiFiDisconnectContext context; + + LTask.remoteCall(&wifiDisconnect, &context); + + vm_signal_wait(context.sigDisconnect); + + return 0; +} + + +static boolean wifiMacAddress(void* userData) +{ + vm_log_info("wifiMacAddress called"); + LWiFiClass *pThis = (LWiFiClass*)userData; + vm_wlan_prof_str_info_qry_struct qry; + qry.dest = pThis->m_macAddress; + qry.dest_len = VM_WLAN_WNDRV_MAC_ADDRESS_LEN; + qry.req_len = VM_WLAN_WNDRV_MAC_ADDRESS_LEN; + pThis->m_lastError = vm_wlan_get_mac_address(&qry); + vm_log_info("wifiMacAddress called, result = %d", pThis->m_lastError); + vm_log_info("req_len=%d", qry.req_len); + return true; +} + +uint8_t* LWiFiClass::macAddress(uint8_t* mac) +{ + // clear mac address + //vm_log_info("macAddress called"); + memset(m_macAddress, 0, VM_WLAN_LOC_MAC_ADDR_LEN); + LTask.remoteCall(&wifiMacAddress, this); + if (mac) + { + memcpy(mac, m_macAddress, VM_WLAN_LOC_MAC_ADDR_LEN); + } + return (uint8_t*)&m_macAddress[0]; +} + +IPAddress LWiFiClass::localIP() +{ + return IPAddress(m_ipInfo.ip_addr); +} + +IPAddress LWiFiClass::subnetMask() +{ + return IPAddress(m_ipInfo.netmask); +} + +IPAddress LWiFiClass::gatewayIP() +{ + return IPAddress(m_ipInfo.gateway); +} + +boolean wifiSSID(void *userData) +{ + LWiFiClass *pThis = (LWiFiClass*)userData; + VMINT ret = vm_wlan_get_para(VM_WLAN_SET_MODE_STA, (void*)&pThis->m_apParam); + vm_log_info("wifiSSID ret = %d", ret); + if (ret != VM_WLAN_RESULT_SUCCESS) + { + memset(pThis->m_apParam.ssid, 0, sizeof(pThis->m_apParam.ssid)); + } + return true; +} + +char* LWiFiClass::SSID() +{ + LTask.remoteCall(&wifiSSID, this); + return m_apParam.ssid; +} + +uint8_t* LWiFiClass::BSSID(uint8_t* bssid) +{ + memcpy(bssid, m_apInfo.bssid, VM_WLAN_WNDRV_MAC_ADDRESS_LEN); + return bssid; +} + +static boolean wifiConnectedAPRSSI(void *userdata) +{ + VMINT *rssi_out = (VMINT*)userdata; + vm_wlan_get_connected_ap_info(rssi_out, VM_WLAN_AP_INFO_RSSI); + return true; +} + +int32_t LWiFiClass::RSSI() +{ + VMINT rssi_out = 0; + LTask.remoteCall(&wifiConnectedAPRSSI, &rssi_out); + return (int32_t)rssi_out; +} + +//------------------------------------ +// singleton +//------------------------------------ +LWiFiClass LWiFi; diff --git a/hardware/arduino/mtk/libraries/LWiFi/LWiFi.h b/hardware/arduino/mtk/libraries/LWiFi/LWiFi.h new file mode 100644 index 00000000..9cc09f1a --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/LWiFi.h @@ -0,0 +1,225 @@ +#ifndef LWiFi_h +#define LWiFi_h + +#include "Arduino.h" +#include "IPAddress.h" +#include "vmnwsetting.h" +#include "vmconn.h" +#include "WString.h" + +class LWiFiConnectContext; + +enum LWiFiEncryption +{ + LWIFI_OPEN, // Open networks + LWIFI_WEP, // WEP encrypted networks + LWIFI_WPA, // WPA1 and WPA2 networks +}; + +enum LWifiStatus +{ + LWIFI_STATUS_DISABLED, // the LWiFi module is not enabled. use LWiFi.begin() to enable it. + LWIFI_STATUS_DISCONNECTED, // the LWiFi module is not connect to any AP, or the connection is lost due to bad signal strength + LWIFI_STATUS_CONNECTED, // the LWiFi module is connected to an AP +}; + +//LWiFiLoginInfo Class +class LWiFiLoginInfo +{ +public: + LWiFiEncryption m_enc; + String m_password; + String m_username; + +public: + LWiFiLoginInfo(); + LWiFiLoginInfo(LWiFiEncryption enc, const String &password); + LWiFiLoginInfo(LWiFiEncryption enc, const String &password, const String &username); +}; + +//LWifi Class +class LWiFiClass +{ +public: + + + LWiFiClass(); + + // DESCRIPTION + // turn on and initializes the WiFi module + // + // PARAMETERS + // N/A + void begin(); + + // DESCRIPTION + // uninitialize and turn off the WiFi module + // + // PARAMETERS + // N/A + void end(); + + // DESCRIPTION + // Start Wifi connection for OPEN networks + // + // PARAMETERS + // ssid: Pointer to the SSID string. + int connect(const char* ssid); + + // DESCRIPTION + // Start Wifi connection to networks + // The login information are stored in loginInfo. + // + // PARAMETERS + // ssid: Pointer to the SSID string. + // loginInfo: an LWiFiKey that stores login information + int connect(const char* ssid, const LWiFiLoginInfo &loginInfo); + + // DESCRIPTION + // Start Wifi connection with WEP encryption. + // Configure a key into the device. The key type (WEP-40, WEP-104) + // is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104). + // + // PARAMETERS + // ssid: Pointer to the SSID string. + // key_idx: The key index to set. Valid values are 0-3. + // key: Key input buffer. + int connectWEP(const char* ssid, const char* key); + + // DESCRIPTION + // Start Wifi connection with WPA/WPA-2 passphrase + // + // PARAMETERS + // ssid: Pointer to the SSID string. + // passphrase: Passphrase. Valid characters in a passphrase + // must be between ASCII 32-126 (decimal). + int connectWPA(const char* ssid, const char *passphrase); + + // DESCRIPTION + // Disconnect from the WiFi AP + // + // RETURNS + // currently it always returns 0 + int disconnect(void); + + // DESCRIPTION + // Get the interface MAC address. + // + // RETURNS + // pointer to uint8_t array with length VM_WLAN_LOC_MAC_ADDR_LEN + uint8_t* macAddress(uint8_t* mac); + + // DESCRIPTION + // Get the interface IP address. + // + // RETURNS + // Ip address value + IPAddress localIP(); + + // DESCRIPTION + // Get the interface subnet mask address. + // + // RETURNS + // subnet mask address value + IPAddress subnetMask(); + + // DESCRIPTION + // Get the gateway ip address. + // + // RETURNS + // gateway ip address value + IPAddress gatewayIP(); + + // DESCRIPTION + // Return the current SSID associated with the network + // + // RETURNS + // ssid string + char* SSID(); + + // DESCRIPTION + // Return the current BSSID associated with the network. + // It is the MAC address of the Access Point + // + // RETURNS + // pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + uint8_t* BSSID(uint8_t* bssid); + + // DESCRIPTION + // Return the current RSSI /Received Signal Strength in dBm) + // associated with the network + // + // RETURNS + // signed value + int32_t RSSI(); + + // DESCRIPTION + // Start scan WiFi networks available + // + // RETURNS + // Number of discovered networks + int8_t scanNetworks(); + + // DESCRIPTION + // Return the SSID discovered during the network scan. + // + // PARAMETERS + // networkItem: specify from which network item want to get the information + // + // RETURNS + // ssid string of the specified item on the networks scanned list + char* SSID(uint8_t networkItem); + + // DESCRIPTION + // Return the RSSI of the networks discovered during the scanNetworks + // + // PARAMETERS + // networkItem: specify from which network item want to get the information + // + // RETURNS + // signed value of RSSI of the specified item on the networks scanned list + int32_t RSSI(uint8_t networkItem); + + // DESCRIPTION + // Return Connection status. + // + // RETURNS + // one of the value defined in LWifiStatus. + // It can be + // LWIFI_STATUS_DISABLED: the LWiFi module is not enabled. use LWiFi.begin() to enable it. + // LWIFI_STATUS_DISCONNECTED: the LWiFi module is not connect to any AP, or the connection is lost due to bad signal strength + // LWIFI_STATUS_CONNECTED: the LWiFi module is connected to an AP + LWifiStatus status(); + + // DESCRIPTION + // Resolve the given hostname to an IP address. + // + // PARAMETERS + // param aHostname: Name to be resolved + // param aResult: IPAddress structure to store the returned IP address + // + // RETURNS + // 1 if aIPAddrString was successfully converted to an IP address, + // else error code + int hostByName(const char* aHostname, IPAddress& aResult); + + + friend class LWiFiClient; + friend class LWiFiServer; + +public: + // TODO: should we use compilation firewall here? + char m_macAddress[VM_WLAN_LOC_MAC_ADDR_LEN]; + vm_wlan_ip_info_struct m_ipInfo; // IP info after being connected + vm_wlan_conned_ap_info_struct m_apInfo; // This stores BSSID and RSSI of connectd AP + vm_wlan_cfg_ap_struct m_apParam; // This stores SSID for connected AP + vm_wlan_scan_result_struct m_scanInfo; // Info of scanned APs + VMINT m_lastError; + +private: + int wifiConnectImpl(LWiFiConnectContext &context); +}; + +extern LWiFiClass LWiFi; + +#endif // #ifndef LWiFi_h diff --git a/hardware/arduino/mtk/libraries/LWiFi/LWiFiClient.cpp b/hardware/arduino/mtk/libraries/LWiFi/LWiFiClient.cpp new file mode 100644 index 00000000..74744545 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/LWiFiClient.cpp @@ -0,0 +1,29 @@ +#include "LWiFiClient.h" +#include +#include + +#if 1 +LWiFiClient::LWiFiClient(): + LTcpClient() +{ + m_apn = VM_TCP_APN_WIFI; +} + +LWiFiClient::LWiFiClient(const LTcpClient &rhs): + LTcpClient(rhs) +{ + m_apn = VM_TCP_APN_WIFI; +} + +LWiFiClient::LWiFiClient(VMINT handle): + LTcpClient(handle) +{ + m_apn = VM_TCP_APN_WIFI; +} + +LWiFiClient::LWiFiClient(VMINT handle, VMINT serverHandle): + LTcpClient(handle, serverHandle) +{ + m_apn = VM_TCP_APN_WIFI; +} +#endif diff --git a/hardware/arduino/mtk/libraries/LWiFi/LWiFiClient.h b/hardware/arduino/mtk/libraries/LWiFi/LWiFiClient.h new file mode 100644 index 00000000..b464e689 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/LWiFiClient.h @@ -0,0 +1,21 @@ +#ifndef LWiFiClient_h +#define LWiFiClient_h +#include "Arduino.h" +#include +#include +#include + +//LWiFiClient Class +class LWiFiClient : public LTcpClient +{ +public: + LWiFiClient(); + + /* DOM-NOT_FOR_SDK-BEGIN */ + LWiFiClient(const LTcpClient &rhs); + LWiFiClient(VMINT handle); + LWiFiClient(VMINT handle, VMINT serverHandle); + /* DOM-NOT_FOR_SDK-END */ +}; + +#endif // LWiFiClient_h diff --git a/hardware/arduino/mtk/libraries/LWiFi/LWiFiServer.cpp b/hardware/arduino/mtk/libraries/LWiFi/LWiFiServer.cpp new file mode 100644 index 00000000..42d728f1 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/LWiFiServer.cpp @@ -0,0 +1,20 @@ +#include "LWiFiServer.h" +#include +#include + +LWiFiServer::LWiFiServer(uint16_t port): + LTcpServer(port) +{ + m_apn = VM_TCP_APN_WIFI; +} + +LWiFiClient LWiFiServer::available() +{ + VMINT hClient = -1; + VMINT hServer = -1; + availableImpl(hClient, hServer); + // return a special client object that has server handle + // Note that we rely on move-constructor optimization + // to prevent temp object destructor, which stop() the connection. + return LWiFiClient(hClient, hServer); +} diff --git a/hardware/arduino/mtk/libraries/LWiFi/LWiFiServer.h b/hardware/arduino/mtk/libraries/LWiFi/LWiFiServer.h new file mode 100644 index 00000000..329d20e4 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/LWiFiServer.h @@ -0,0 +1,15 @@ +#ifndef LWifiServer_h +#define LWifiServer_h +#include +#include +#include "LWiFiClient.h" + +//LWiFiServer Class +class LWiFiServer : public LTcpServer +{ +public: + LWiFiServer(uint16_t port); + LWiFiClient available(); +}; + +#endif diff --git a/hardware/arduino/mtk/libraries/LWiFi/LWiFiUdp.cpp b/hardware/arduino/mtk/libraries/LWiFi/LWiFiUdp.cpp new file mode 100644 index 00000000..6150c2df --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/LWiFiUdp.cpp @@ -0,0 +1,23 @@ +#include +#include "LWiFiUdp.h" +#include "LWiFi.h" +#include "vmtcp.h" + +VMINT LWiFiUDP::getAPN() const +{ + return VM_TCP_APN_WIFI; +} + +int LWiFiUDP::beginPacket(const char *host, uint16_t port) +{ + // DNS loopup and bypass to IP version + if (LWiFi.hostByName(host, m_sendToIP)) + { + return beginPacket(m_sendToIP, port); + } + else + { + return 0; + } +} + diff --git a/hardware/arduino/mtk/libraries/LWiFi/LWiFiUdp.h b/hardware/arduino/mtk/libraries/LWiFi/LWiFiUdp.h new file mode 100644 index 00000000..f635d7c4 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/LWiFiUdp.h @@ -0,0 +1,17 @@ +#ifndef lwifiudp_h +#define lwifiudp_h + +#include +#include + +class LWiFiUDP : public LUDP +{ +public: + virtual int beginPacket(const char *host, uint16_t port); + using LUDP::beginPacket; + +protected: + virtual VMINT getAPN() const; +}; + +#endif diff --git a/hardware/arduino/mtk/libraries/LWiFi/examples/ScanNetworks/ScanNetworks.ino b/hardware/arduino/mtk/libraries/LWiFi/examples/ScanNetworks/ScanNetworks.ino new file mode 100644 index 00000000..11508515 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/examples/ScanNetworks/ScanNetworks.ino @@ -0,0 +1,35 @@ +#include +#include + +void setup() +{ + LTask.begin(); + Serial.begin(115200); +} + +// scan WiFi AP every 5 secs +void loop() +{ + // turn on wifi + LWiFi.begin(); + Serial.println("scan start"); + int apNum = LWiFi.scanNetworks(); + Serial.println("scan end"); + Serial.println(apNum); + for (int i = 0; i < apNum; ++i) + { + Serial.print("AP "); + Serial.print(i); + Serial.print(": "); + Serial.print(LWiFi.SSID(i)); + Serial.print(" dB="); + Serial.println(LWiFi.RSSI(i)); + } + + // turn off wifi + LWiFi.end(); + Serial.println("Finish"); + delay(5000); +} + + diff --git a/hardware/arduino/mtk/libraries/LWiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino b/hardware/arduino/mtk/libraries/LWiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino new file mode 100644 index 00000000..2345efed --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino @@ -0,0 +1,186 @@ +#include +#include + +/* + + Udp NTP Client + + Get the time from a Network Time Protocol (NTP) time server + Demonstrates use of UDP sendPacket and ReceivePacket + For more on NTP time servers and the messages needed to communicate with them, + see http://en.wikipedia.org/wiki/Network_Time_Protocol + + created 4 Sep 2010 + by Michael Margolis + modified 9 Apr 2012 + by Tom Igoe + + modified 14 Aug 2014 + by Pablo Sun + for LinkIt ONE LWiFi UDP example + + This code is in the public domain. + + */ +#include +#include + +char ssid[] = "yourssid"; // your network SSID (name) +char pass[] = "yourpassword"; // your network password + +unsigned int localPort = 2390; // local port to listen for UDP packets + +IPAddress timeServer(129, 6, 15, 28); // time.nist.gov NTP server + +const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message + +byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets + +// A UDP instance to let us send and receive packets over UDP +LWiFiUDP Udp; + +void setup() +{ + // Open serial communications and wait for port to open: + Serial.begin(115200); + + Serial.println("setup()"); + + // attempt to connect to Wifi network: + LWiFi.begin(); + while (!LWiFi.connectWPA(ssid, pass)) + { + delay(1000); + Serial.println("retry WiFi AP"); + } + Serial.println("Connected to wifi"); + printWifiStatus(); + + delay(10000); + + Serial.println("\nStarting connection to server..."); + Udp.begin(localPort); + + Serial.println("setup() done"); +} + +void loop() +{ + sendNTPpacket(timeServer); // send an NTP packet to a time server + // wait to see if a reply is available + delay(1000); + Serial.println( Udp.parsePacket() ); + if ( Udp.parsePacket() ) + { + Serial.println("packet received"); + // We've received a packet, read the data from it + memset(packetBuffer, 0xcd, NTP_PACKET_SIZE); + Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer + for (int i = 0; i < NTP_PACKET_SIZE; ++i) + { + Serial.print(packetBuffer[i], HEX); + } + Serial.println(); + + + //the timestamp starts at byte 40 of the received packet and is four bytes, + // or two words, long. First, esxtract the two words: + unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); + unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); + // combine the four bytes (two words) into a long integer + // this is NTP time (seconds since Jan 1 1900): + unsigned long secsSince1900 = highWord << 16 | lowWord; + Serial.print("Seconds since Jan 1 1900 = " ); + Serial.println(secsSince1900); + + // now convert NTP time into everyday time: + Serial.print("Unix time = "); + // Unix time starts on Jan 1 1970. In seconds, that's 2208988800: + const unsigned long seventyYears = 2208988800UL; + // subtract seventy years: + unsigned long epoch = secsSince1900 - seventyYears; + // print Unix time: + Serial.println(epoch); + + + // print the hour, minute and second: + Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT) + Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day) + Serial.print(':'); + if ( ((epoch % 3600) / 60) < 10 ) + { + // In the first 10 minutes of each hour, we'll want a leading '0' + Serial.print('0'); + } + Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute) + Serial.print(':'); + if ( (epoch % 60) < 10 ) + { + // In the first 10 seconds of each minute, we'll want a leading '0' + Serial.print('0'); + } + Serial.println(epoch % 60); // print the second + } + // wait ten seconds before asking for the time again + delay(10000); +} + +// send an NTP request to the time server at the given address +unsigned long sendNTPpacket(IPAddress& address) +{ + Serial.println("sendNTPpacket"); + // set all bytes in the buffer to 0 + memset(packetBuffer, 0, NTP_PACKET_SIZE); + // Initialize values needed to form NTP request + // (see URL above for details on the packets) + //Serial.println("2"); + packetBuffer[0] = 0b11100011; // LI, Version, Mode + packetBuffer[1] = 0; // Stratum, or type of clock + packetBuffer[2] = 6; // Polling Interval + packetBuffer[3] = 0xEC; // Peer Clock Precision + // 8 bytes of zero for Root Delay & Root Dispersion + packetBuffer[12] = 49; + packetBuffer[13] = 0x4E; + packetBuffer[14] = 49; + packetBuffer[15] = 52; + + //Serial.println("3"); + + // all NTP fields have been given values, now + // you can send a packet requesting a timestamp: + Udp.beginPacket(address, 123); //NTP requests are to port 123 + //Serial.println("4"); + Udp.write(packetBuffer, NTP_PACKET_SIZE); + //Serial.println("5"); + Udp.endPacket(); + //Serial.println("6"); +} + + +void printWifiStatus() +{ + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(LWiFi.SSID()); + + // print your LWiFi shield's IP address: + IPAddress ip = LWiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = LWiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} + + + + + + + + + + diff --git a/hardware/arduino/mtk/libraries/LWiFi/examples/WifiDownloadFile/WifiDownloadFile.ino b/hardware/arduino/mtk/libraries/LWiFi/examples/WifiDownloadFile/WifiDownloadFile.ino new file mode 100644 index 00000000..8507e81b --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/examples/WifiDownloadFile/WifiDownloadFile.ino @@ -0,0 +1,139 @@ +#include +#include +#include +#include +#include +#include + +#define WIFI_AP "your_ap_ssid" +#define WIFI_PASSWORD "your_password" +#define WIFI_AUTH LWIFI_WEP // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP according to your WiFi AP configuration + +// This sample connects to HTTP server and download a file to LinkIt ONE internal storage + +#define SITE_URL "www.yourwebsite.com" +#define FILE_NAME "/url_to_file.zip" +#define DOWNLOAD_FILENAME "file_downloaded.zip" + +#define TEMP_BUF_SIZE (2048) +uint8_t buf[TEMP_BUF_SIZE] = {0}; + +void setup() +{ + LTask.begin(); + LWiFi.begin(); + Serial.begin(115200); + LFlash.begin(); + + // keep retrying until connected to AP + Serial.println("Connecting to AP"); + while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD))) + { + delay(1000); + } + + LWiFiClient c; + + // keep retrying until connected to website + Serial.println("Connecting to WebSite"); + while (0 == c.connect(SITE_URL, 80)) + { + Serial.println("Re-Connecting to WebSite"); + delay(1000); + } + + Serial.println("send GET request"); + c.println("GET " FILE_NAME " HTTP/1.0"); + c.println("User-Agent: Wget/1.11.4"); + c.println("Accept: */*"); + c.println("Host: " SITE_URL); + c.println("Connection: Close"); + c.println(); + + Serial.println("waiting server response"); + int peekByte = -1; + while (peekByte == -1 && c.connected()) + { + peekByte = c.peek(); + delay(200); + } + + // wait for header finish (\r\n\r\n) + Serial.println("skipping header:"); + int lineFeedCount = 0; + while (lineFeedCount < 2) + { + int value = c.read(); + if (value == -1) + { + delay(10); + continue; + } + + Serial.print((char)value); + + if (value == '\r') + { + value = -1; + while (value == -1) + { + value = c.read(); + Serial.print((char)value); + } + + if (value == '\n') + { + lineFeedCount++; + } + else + { + lineFeedCount = 0; + } + } + else + { + lineFeedCount = 0; + } + } + + Serial.println("start downloading file"); + LFile f = LFlash.open(DOWNLOAD_FILENAME, FILE_WRITE); + int totalSize = 0; + while (c.connected()) + { + size_t bytesRead = c.read(buf, TEMP_BUF_SIZE); + if (bytesRead) + { + const size_t bytesWrite = f.write((const uint8_t *)&buf[0], (size_t)bytesRead); + if (bytesWrite > 0) + { + totalSize += bytesWrite; + Serial.print("\r"); + Serial.print(totalSize); + Serial.print(" bytes"); + } + else + { + Serial.println("error writing file"); + break; + } + } + else + { + Serial.println("server disconnected"); + break; + } + delay(100); + } + f.flush(); + f.close(); + Serial.println(); + Serial.println("download finished"); +} + +void loop() +{ + delay(1000); +} + + diff --git a/hardware/arduino/mtk/libraries/LWiFi/examples/WifiWebClient/WifiWebClient.ino b/hardware/arduino/mtk/libraries/LWiFi/examples/WifiWebClient/WifiWebClient.ino new file mode 100644 index 00000000..5a1f6c9c --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/examples/WifiWebClient/WifiWebClient.ino @@ -0,0 +1,78 @@ +#include +#include +#include + +#define WIFI_AP "your_ap_ssid" +#define WIFI_PASSWORD "your_password" +#define WIFI_AUTH LWIFI_WEP // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP. +#define SITE_URL "www.yourwebsite.com" + +LWiFiClient c; + +void setup() +{ + LTask.begin(); + LWiFi.begin(); + Serial.begin(115200); + + // keep retrying until connected to AP + Serial.println("Connecting to AP"); + while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD))) + { + delay(1000); + } + + // keep retrying until connected to website + Serial.println("Connecting to WebSite"); + while (0 == c.connect(SITE_URL, 80)) + { + Serial.println("Re-Connecting to WebSite"); + delay(1000); + } + + // send HTTP request, ends with 2 CR/LF + Serial.println("send HTTP GET request"); + c.println("GET / HTTP/1.1"); + c.println("Host: " SITE_URL); + c.println("Connection: close"); + c.println(); + + // waiting for server response + Serial.println("waiting HTTP response:"); + while (!c.available()) + { + delay(100); + } +} + +boolean disconnectedMsg = false; + +void loop() +{ + // Make sure we are connected, and dump the response content to Serial + while (c) + { + int v = c.read(); + if (v != -1) + { + Serial.print((char)v); + } + else + { + Serial.println("no more content, disconnect"); + c.stop(); + while (1) + { + delay(1); + } + } + } + + if (!disconnectedMsg) + { + Serial.println("disconnected by server"); + disconnectedMsg = true; + } + delay(500); +} + diff --git a/hardware/arduino/mtk/libraries/LWiFi/examples/WifiWebServer/WifiWebServer.ino b/hardware/arduino/mtk/libraries/LWiFi/examples/WifiWebServer/WifiWebServer.ino new file mode 100644 index 00000000..2297c0a3 --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/examples/WifiWebServer/WifiWebServer.ino @@ -0,0 +1,117 @@ +#include +#include +#include +#include + +#define WIFI_AP "your_ap_ssid" +#define WIFI_PASSWORD "your_password" +#define WIFI_AUTH LWIFI_WEP // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP according to your WiFi AP configuration + +LWiFiServer server(80); + +void setup() +{ + LTask.begin(); + LWiFi.begin(); + Serial.begin(115200); + + // keep retrying until connected to AP + Serial.println("Connecting to AP"); + while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD))) + { + delay(1000); + } + + printWifiStatus(); + + Serial.println("Start Server"); + server.begin(); + Serial.println("Server Started"); +} + +int loopCount = 0; + +void loop() +{ + // put your main code here, to run repeatedly: + delay(500); + loopCount++; + LWiFiClient client = server.available(); + if (client) + { + Serial.println("new client"); + // an http request ends with a blank line + boolean currentLineIsBlank = true; + while (client.connected()) + { + if (client.available()) + { + // we basically ignores client request, but wait for HTTP request end + int c = client.read(); + Serial.print((char)c); + + if (c == '\n' && currentLineIsBlank) + { + Serial.println("send response"); + // send a standard http response header + client.println("HTTP/1.1 200 OK"); + client.println("Content-Type: text/html"); + client.println("Connection: close"); // the connection will be closed after completion of the response + client.println("Refresh: 5"); // refresh the page automatically every 5 sec + client.println(); + client.println(""); + client.println(""); + // output the value of each analog input pin + client.print("loop"); + client.print(" is "); + client.print(loopCount); + client.println("
"); + client.println(""); + client.println(); + break; + } + if (c == '\n') + { + // you're starting a new line + currentLineIsBlank = true; + } + else if (c != '\r') + { + // you've gotten a character on the current line + currentLineIsBlank = false; + } + } + } + // give the web browser time to receive the data + delay(500); + + // close the connection: + Serial.println("close connection"); + client.stop(); + Serial.println("client disconnected"); + } +} + +void printWifiStatus() +{ + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(LWiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = LWiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + Serial.print("subnet mask: "); + Serial.println(LWiFi.subnetMask()); + + Serial.print("gateway IP: "); + Serial.println(LWiFi.gatewayIP()); + + // print the received signal strength: + long rssi = LWiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} diff --git a/hardware/arduino/mtk/libraries/LWiFi/examples/WifiXivelyConnection/WifiXivelyConnection.ino b/hardware/arduino/mtk/libraries/LWiFi/examples/WifiXivelyConnection/WifiXivelyConnection.ino new file mode 100644 index 00000000..f130363b --- /dev/null +++ b/hardware/arduino/mtk/libraries/LWiFi/examples/WifiXivelyConnection/WifiXivelyConnection.ino @@ -0,0 +1,84 @@ +/***************** + * This sample connectes to Xively.com API by LinkIt ONE WiFi module and keeps updating a feed in Xively. + * You need to apply an Xively API key and create the feed first. + */ +#include +#include +#include + +#define SITE_URL "api.xively.com" // Xively API URL +#define APIKEY "apikey" // replace your xively api key here +#define FEEDID 0000 // replace your feed ID +#define USERAGENT "chrome" // user agent is the project name + +#define WIFI_AP "yourssid" // replace your WiFi AP SSID +#define WIFI_PASSWORD "yourpassword" // replace your WiFi AP password +#define WIFI_AUTH LWIFI_WEP // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP according to your AP + +void setup() +{ + Serial.begin(115200); + // Initializes LinkIt ONE WiFi module + LWiFi.begin(); + + Serial.print("Connecting to WiFi AP:"); + Serial.println(WIFI_AP); + while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD))) + { + delay(1000); + } +} + +unsigned long time = 0; + +void loop() +{ + + // in this sketch, we send to process time of loop() + // to Xively server. + // The feed is created on Xively first. + unsigned long t1 = millis(); + + Serial.print("try connect "); + Serial.println(SITE_URL); + LWiFiClient c; + while (!c.connect(SITE_URL, 80)) + { + Serial.println("retry connect"); + delay(100); + } + + String data = "Time,"+String(time); + Serial.println("send PUT request"); + Serial.println(data); + + // construct a HTTP PUT request + // and set CSV data to the Xively feed. + c.print("PUT /v2/feeds/"); + c.print(FEEDID); + c.println(".csv HTTP/1.1"); + c.println("Host: api.xively.com"); + c.print("X-ApiKey: "); + c.println(APIKEY); + c.print("User-Agent: "); + c.println(USERAGENT); + c.print("Content-Length: "); + int thisLength = data.length(); + c.println(thisLength); + c.println("Content-Type: text/csv"); + c.println("Connection: close"); + c.println(); + c.println(data); + + // this is required delay, to allow server response + delay(1000); + // disconnect from server + c.stop(); + // add delay to prevent connect again too fast + delay(300); + + unsigned long t2 = millis(); + time = t2-t1; + Serial.print("Total time spend (we will send this to server next time): "); + Serial.println(time); +} diff --git a/hardware/arduino/mtk/libraries/SPI/SPI.cpp b/hardware/arduino/mtk/libraries/SPI/SPI.cpp new file mode 100644 index 00000000..678bc454 --- /dev/null +++ b/hardware/arduino/mtk/libraries/SPI/SPI.cpp @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2010 by Cristian Maglie + * SPI Master library for arduino. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of either the GNU General Public License version 2 + * or the GNU Lesser General Public License version 2.1, both as + * published by the Free Software Foundation. + */ + +#include "SPI.h" +#include "vmdcl_spi.h" +#include "Vmlog.h" + +static char buff[128]; + +extern char* spi_w_data ; +extern char* spi_r_data; +extern unsigned char* spi_data_memory; + +SPIClass::SPIClass() +{ + spi_handle = VM_DCL_HANDLE_INVALID; +} + +void SPIClass::begin() +{ + if(!changePinType(11, PIO_SPI, &spi_handle)) + return; + + if(spi_handle == VM_DCL_HANDLE_INVALID) + { + spi_handle = vm_dcl_open(vm_spi_port1,0); + setPinHandle(11, spi_handle); + } + + // default control data + conf_data.clk_high_time = 3; + conf_data.clk_low_time = 3; + conf_data.cs_hold_time = 15; + conf_data.cs_idle_time = 15; + conf_data.cs_setup_time= 15; + conf_data.clk_polarity = VM_SPI_CPOL_B0; + conf_data.clk_fmt = VM_SPI_CPHA_B0; + conf_data.rx_endian = VM_SPI_ENDIAN_LITTLE; + conf_data.tx_endian = VM_SPI_ENDIAN_LITTLE; + conf_data.rx_msbf = VM_SPI_MSBF_MSB; + conf_data.tx_msbf = VM_SPI_MSBF_MSB; + + vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); + + spi_data.mode = VM_SPI_MODE_DEASSERT; + spi_data.bEnable = VM_FALSE; + vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_MODE,(void *)&spi_data); + + + // Default speed set to 4Mhz + setClockDivider(SPI_CLOCK_DIV4); + setDataMode(SPI_MODE0); + setBitOrder(MSBFIRST); +} + +void SPIClass::end() +{ + vm_dcl_close(spi_handle); + spiPinsRest(); + spi_handle = VM_DCL_HANDLE_INVALID; +} + +void SPIClass::setBitOrder(BitOrder _bitOrder) +{ + if(VM_DCL_HANDLE_INVALID==spi_handle) + { + return; + } + + if (MSBFIRST == _bitOrder) + { + conf_data.rx_endian = VM_SPI_ENDIAN_BIG; + conf_data.tx_endian = VM_SPI_ENDIAN_BIG; + + } + else if (LSBFIRST == _bitOrder) + { + conf_data.rx_endian = VM_SPI_ENDIAN_LITTLE; + conf_data.tx_endian = VM_SPI_ENDIAN_LITTLE; + } + else + { + return; + } + + vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); + +} + +void SPIClass::setDataMode(uint8_t _mode) +{ + if(VM_DCL_HANDLE_INVALID==spi_handle) + { + return; + } + + if (_mode == SPI_MODE0) + { + conf_data.clk_polarity = VM_SPI_CPOL_B0; + conf_data.clk_fmt = VM_SPI_CPHA_B0; + } + else if (_mode == SPI_MODE1) + { + conf_data.clk_polarity = VM_SPI_CPOL_B0; + conf_data.clk_fmt = VM_SPI_CPHA_B1; + } + else if (_mode == SPI_MODE2) + { + conf_data.clk_polarity = VM_SPI_CPOL_B1; + conf_data.clk_fmt = VM_SPI_CPHA_B0; + } + else if (_mode == SPI_MODE3) + { + conf_data.clk_polarity = VM_SPI_CPOL_B1; + conf_data.clk_fmt = VM_SPI_CPHA_B1; + } + else + { + return; + } + + vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); +} + +void SPIClass::setClockDivider(uint8_t _divider) +{ + if(VM_DCL_HANDLE_INVALID == spi_handle) + { + return; + } + + if (_divider == SPI_CLOCK_DIV2) + { + conf_data.clk_high_time = 1; + conf_data.clk_low_time = 1; + } + else if (_divider == SPI_CLOCK_DIV4) + { + conf_data.clk_high_time = 3; + conf_data.clk_low_time = 3; + } + else if (_divider == SPI_CLOCK_DIV8) + { + conf_data.clk_high_time = 7; + conf_data.clk_low_time = 7; + } + else if (_divider == SPI_CLOCK_DIV16) + { + conf_data.clk_high_time = 15; + conf_data.clk_low_time = 15; + } + else if (_divider == SPI_CLOCK_DIV32) + { + conf_data.clk_high_time = 31; + conf_data.clk_low_time = 31; + } + else if (_divider == SPI_CLOCK_DIV64) + { + conf_data.clk_high_time = 63; + conf_data.clk_low_time = 63; + } + else if (_divider == SPI_CLOCK_DIV128) + { + conf_data.clk_high_time = 127; + conf_data.clk_low_time = 127; + } + else + { + return; + } + + vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); +} + +byte SPIClass::transfer(uint8_t _data) +{ + VM_SPI_CTRL_WRITE_AND_READE_T write_and_read; + + if(VM_DCL_HANDLE_INVALID == spi_handle) + { + return 0; + } + + if(spi_w_data) + { + *spi_w_data = _data; + write_and_read.pu1InData = (VMUINT8*)spi_r_data; + write_and_read.u4DataLen = 1; + write_and_read.pu1OutData = (VMUINT8*)spi_w_data; + write_and_read.uCount = 1; + vm_dcl_control(spi_handle,VM_SPI_IOCTL_WRITE_AND_READ,(void *)&write_and_read); + } + + return *spi_r_data; +} + + + +uint32_t SPIClass::write(uint8_t* _data, uint32_t size) +{ + uint8_t* p = _data; + //VM_SPI_CTRL_WRITE_AND_READE_T write_and_read; + + VM_DCL_BUFF_LEN count, datalen; + VM_DCL_STATUS status; + + if(size > 65536) + { + for(;size>65536;) + { + memcpy(spi_data_memory, p, 65536); + count = 64; + datalen = 1024; + status = vm_dcl_write(spi_handle,(VM_DCL_BUFF*)spi_data_memory,datalen,&count,0); + + if(status < VM_DCL_STATUS_OK) + return 0; + + p = &p[65536]; + size = size -65536; + } + } + + if(size > 1024) + { + count = size/1024; + datalen = 1024; + } + else + { + count = 1; + datalen = size; + } + + memcpy(spi_data_memory, _data, size); + //write_and_read.pu1InData = (VMUINT8*)spi_data_memory; + //write_and_read.pu1OutData = (VMUINT8*)spi_data_memory; + //write_and_read.u4DataLen = datalen; + //write_and_read.uCount = count; + //vm_dcl_control(spi_handle,VM_SPI_IOCTL_WRITE_AND_READ,(void *)&write_and_read); + status = vm_dcl_write(spi_handle,(VM_DCL_BUFF*)spi_data_memory,datalen,&count,0); + if(status == VM_DCL_STATUS_OK) + return size; + else + return 0; + +} + +SPIClass SPI; + diff --git a/hardware/arduino/mtk/libraries/SPI/SPI.h b/hardware/arduino/mtk/libraries/SPI/SPI.h new file mode 100644 index 00000000..79d53510 --- /dev/null +++ b/hardware/arduino/mtk/libraries/SPI/SPI.h @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2010 by Cristian Maglie + * SPI Master library for arduino. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of either the GNU General Public License version 2 + * or the GNU Lesser General Public License version 2.1, both as + * published by the Free Software Foundation. + */ + +#ifndef _SPI_H_INCLUDED +#define _SPI_H_INCLUDED + +#include "variant.h" +#include "vmdcl_spi.h" +#include + +// SPI clock is 1/4 of system clock +#define SPI_CLOCK_DIV4 0x00 +// SPI clock is 1/16 of system clock +#define SPI_CLOCK_DIV16 0x01 +// SPI clock is 1/64 of system clock +#define SPI_CLOCK_DIV64 0x02 +// SPI clock is 1/128 of system clock +#define SPI_CLOCK_DIV128 0x03 +// SPI clock is 1/2 of system clock +#define SPI_CLOCK_DIV2 0x04 +// SPI clock is 1/8 of system clock +#define SPI_CLOCK_DIV8 0x05 +// SPI clock is 1/32 of system clock +#define SPI_CLOCK_DIV32 0x06 + +// SPI data transfer mode 0 +#define SPI_MODE0 0x02 +// SPI data transfer mode 1 +#define SPI_MODE1 0x00 +// SPI data transfer mode 2 +#define SPI_MODE2 0x03 +// SPI data transfer mode 3 +#define SPI_MODE3 0x01 + +// SPI class interface +class SPIClass { + +// Constructor / Destructor +public: + SPIClass(void); + +// Method +public: + // DESCRIPTION + // Sends a byte of data to slave and receives a byte of data from the slave at the same time. + // RETURNS + // Data returned from slave to master + // EXAMPLE + // + // #include + // #define SS_PIN 10 + // + // void setup() + // { + // pinMode(SS_PIN, OUTPUT); + // SPI.begin(); + // } + // void loop() + // { + // byte ret_val; + // digitalWrite(SS_PIN, LOW); + // ret_val = SPI.transfer(100); + // digitalWrite(SS_PIN, HIGH); + // delay(1000); + // } + // + byte transfer( + uint8_t _data // [IN] Data sent from master to slave + ); + + // DESCRIPTION + // Initlize SPI, setting up the mode and initial status of pins. + // RETURNS + // N/A + // EXAMPLE + // + // #include + // #define SS_PIN 10 + // + // void setup() + // { + // pinMode(SS_PIN, OUTPUT); + // SPI.begin(); + // } + // void loop() + // { + // byte ret_val; + // digitalWrite(SS_PIN, LOW); + // ret_val = SPI.transfer(100); + // digitalWrite(SS_PIN, HIGH); + // delay(1000); + // } + // + void begin(void); + + // DESCRIPTION + // Disables SPI data transmission. + // RETURNS + // N/A + // EXAMPLE + // + // #include + // #define SS_PIN 10 + // int value = 0; + // + // void setup() + // { + // pinMode(SS_PIN, OUTPUT); + // SPI.begin(); + // } + // void loop() + // { + // for (value = 0; value < 255; value++) + // { + // digitalWrite(SS_PIN, LOW); + // SPI.transfer(value); + // digitalWrite(SS_PIN, HIGH); + // delay(1000); + // } + // SPI.end(); + // } + // + void end(void); + + // DESCRIPTION + // Sets up order of data transmission, can be MSBFIRST (MSB first) or LSBFIRST (LSB first) + // RETURNS + // N/A + // EXAMPLE + // + // #include + // #define SS_PIN 10 + // + // void setup() + // { + // pinMode(SS_PIN, OUTPUT); + // SPI.begin(); + // SPI.setBitOrder(MSBFIRST); + // } + // void loop() + // { + // byte ret_val; + // digitalWrite(SS_PIN, LOW); + // ret_val = SPI.transfer(100); + // digitalWrite(SS_PIN, HIGH); + // delay(1000); + // } + // + void setBitOrder( + BitOrder bit_order // [IN] Data transmission order (MSBFIRST or LSBFIRST) + ); + + // DESCRIPTION + // Sets up SPI data transmission mode. + // RETURNS + // N/A + // EXAMPLE + // + // #include + // #define SS_PIN 10 + // + // void setup() + // { + // pinMode(SS_PIN, OUTPUT); + // SPI.begin(); + // SPI.setDataMode(SPI_MODE1); + // } + // void loop() + // { + // byte ret_val; + // digitalWrite(SS_PIN, LOW); + // ret_val = SPI.transfer(100); + // digitalWrite(SS_PIN, HIGH); + // delay(1000); + // } + // + void setDataMode( + uint8_t mode // [IN] SPI data transmission mode (SPI_MODE0 ~ SPI_MODE3) + ); + + // DESCRIPTION + // Sets up clock divider to control the speed of data transmission. + // RETURNS + // N/A + // EXAMPLE + // + // #include + // #define SS_PIN 10 + // + // void setup() + // { + // pinMode(SS_PIN, OUTPUT); + // SPI.begin(); + // SPI.setClockDivider(SPI_CLOCK_DIV8); + // } + // void loop() + // { + // byte ret_val; + // digitalWrite(SS_PIN, LOW); + // ret_val = SPI.transfer(100); + // digitalWrite(SS_PIN, HIGH); + // delay(1000); + // } + // + void setClockDivider( + uint8_t clock_div // [IN] Clock divider (SPI_CLOCK_DIV2 ~ SPI_CLOCK_DIV128) + ); + + // DESCRIPTION + // write block memory to slave, and size need to be 2^X. + // RETURNS + // size to write, 0 means failed + // EXAMPLE + // + // #include + // #define SS_PIN 10 + // + // void setup() + // { + // pinMode(SS_PIN, OUTPUT); + // SPI.begin(); + // SPI.setClockDivider(SPI_CLOCK_DIV8); + // } + // void loop() + // { + // byte ret_val; + // uint8_t mem[64]; + // memset(mem, 0, 64); + // digitalWrite(SS_PIN, LOW); + // SPI.write(mem, 64); + // digitalWrite(SS_PIN, HIGH); + // delay(1000); + // } + // + uint32_t write( + uint8_t* _data, // [IN] the porint of data sent from master to slave + uint32_t size // [IN] data size to send, this size need to be 2^X. + ); + + private: + + // SPI config data + vm_spi_config_para_t conf_data; + + // SPI handle + VM_DCL_HANDLE spi_handle; + + // Specify a SPI mode. + vm_spi_mode_t spi_data; + + // write buffer + VMUINT8 write_buff; + + // write buffer length + VMUINT32 write_len; + + // read buffer + VMUINT8 read_buff; + + // read buffer length + VMUINT32 read_len; +}; + +extern SPIClass SPI; + +#endif diff --git a/hardware/arduino/mtk/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino b/hardware/arduino/mtk/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino new file mode 100644 index 00000000..8104fcbc --- /dev/null +++ b/hardware/arduino/mtk/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino @@ -0,0 +1,143 @@ +/* + SCP1000 Barometric Pressure Sensor Display + + Shows the output of a Barometric Pressure Sensor on a + Uses the SPI library. For details on the sensor, see: + http://www.sparkfun.com/commerce/product_info.php?products_id=8161 + http://www.vti.fi/en/support/obsolete_products/pressure_sensors/ + + This sketch adapted from Nathan Seidle's SCP1000 example for PIC: + http://www.sparkfun.com/datasheets/Sensors/SCP1000-Testing.zip + + Circuit: + SCP1000 sensor attached to pins 6, 7, 10 - 13: + DRDY: pin 6 + CSB: pin 7 + MOSI: pin 11 + MISO: pin 12 + SCK: pin 13 + + created 31 July 2010 + modified 14 August 2010 + by Tom Igoe + */ + +// the sensor communicates using SPI, so include the library: +#include + +//Sensor's memory register addresses: +const int PRESSURE = 0x1F; //3 most significant bits of pressure +const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure +const int TEMPERATURE = 0x21; //16 bit temperature reading +const byte READ = 0b11111100; // SCP1000's read command +const byte WRITE = 0b00000010; // SCP1000's write command + +// pins used for the connection with the sensor +// the other you need are controlled by the SPI library): +const int dataReadyPin = 6; +const int chipSelectPin = 7; + +void setup() { + Serial.begin(9600); + + // start the SPI library: + SPI.begin(); + + // initalize the data ready and chip select pins: + pinMode(dataReadyPin, INPUT); + pinMode(chipSelectPin, OUTPUT); + + //Configure SCP1000 for low noise configuration: + writeRegister(0x02, 0x2D); + writeRegister(0x01, 0x03); + writeRegister(0x03, 0x02); + // give the sensor time to set up: + delay(100); +} + +void loop() { + //Select High Resolution Mode + writeRegister(0x03, 0x0A); + + // don't do anything until the data ready pin is high: + if (digitalRead(dataReadyPin) == HIGH) { + //Read the temperature data + int tempData = readRegister(0x21, 2); + + // convert the temperature to celsius and display it: + float realTemp = (float)tempData / 20.0; + Serial.print("Temp[C]="); + Serial.print(realTemp); + + + //Read the pressure data highest 3 bits: + byte pressure_data_high = readRegister(0x1F, 1); + pressure_data_high &= 0b00000111; //you only needs bits 2 to 0 + + //Read the pressure data lower 16 bits: + unsigned int pressure_data_low = readRegister(0x20, 2); + //combine the two parts into one 19-bit number: + long pressure = ((pressure_data_high << 16) | pressure_data_low) / 4; + + // display the temperature: + Serial.println("\tPressure [Pa]=" + String(pressure)); + } +} + +//Read from or write to register from the SCP1000: +unsigned int readRegister(byte thisRegister, int bytesToRead ) { + byte inByte = 0; // incoming byte from the SPI + unsigned int result = 0; // result to return + Serial.print(thisRegister, BIN); + Serial.print("\t"); + // SCP1000 expects the register name in the upper 6 bits + // of the byte. So shift the bits left by two bits: + thisRegister = thisRegister << 2; + // now combine the address and the command into one byte + byte dataToSend = thisRegister & READ; + Serial.println(thisRegister, BIN); + // take the chip select low to select the device: + digitalWrite(chipSelectPin, LOW); + // send the device the register you want to read: + SPI.transfer(dataToSend); + // send a value of 0 to read the first byte returned: + result = SPI.transfer(0x00); + // decrement the number of bytes left to read: + bytesToRead--; + // if you still have another byte to read: + if (bytesToRead > 0) { + // shift the first byte left, then get the second byte: + result = result << 8; + inByte = SPI.transfer(0x00); + // combine the byte you just got with the previous one: + result = result | inByte; + // decrement the number of bytes left to read: + bytesToRead--; + } + // take the chip select high to de-select: + digitalWrite(chipSelectPin, HIGH); + // return the result: + return(result); +} + + +//Sends a write command to SCP1000 + +void writeRegister(byte thisRegister, byte thisValue) { + + // SCP1000 expects the register address in the upper 6 bits + // of the byte. So shift the bits left by two bits: + thisRegister = thisRegister << 2; + // now combine the register address and the command into one byte: + byte dataToSend = thisRegister | WRITE; + + // take the chip select low to select the device: + digitalWrite(chipSelectPin, LOW); + + SPI.transfer(dataToSend); //Send register location + SPI.transfer(thisValue); //Send value to record into register + + // take the chip select high to de-select: + digitalWrite(chipSelectPin, HIGH); +} + diff --git a/hardware/arduino/mtk/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino b/hardware/arduino/mtk/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino new file mode 100644 index 00000000..b135a74f --- /dev/null +++ b/hardware/arduino/mtk/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino @@ -0,0 +1,71 @@ +/* + Digital Pot Control + + This example controls an Analog Devices AD5206 digital potentiometer. + The AD5206 has 6 potentiometer channels. Each channel's pins are labeled + A - connect this to voltage + W - this is the pot's wiper, which changes when you set it + B - connect this to ground. + + The AD5206 is SPI-compatible,and to command it, you send two bytes, + one with the channel number (0 - 5) and one with the resistance value for the + channel (0 - 255). + + The circuit: + * All A pins of AD5206 connected to +5V + * All B pins of AD5206 connected to ground + * An LED and a 220-ohm resisor in series connected from each W pin to ground + * CS - to digital pin 10 (SS pin) + * SDI - to digital pin 11 (MOSI pin) + * CLK - to digital pin 13 (SCK pin) + + created 10 Aug 2010 + by Tom Igoe + + Thanks to Heather Dewey-Hagborg for the original tutorial, 2005 + +*/ + + +// inslude the SPI library: +#include + + +// set pin 10 as the slave select for the digital pot: +const int slaveSelectPin = 10; + +void setup() { + // set the slaveSelectPin as an output: + pinMode (slaveSelectPin, OUTPUT); + // initialize SPI: + SPI.begin(); +} + +void loop() { + // go through the six channels of the digital pot: + for (int channel = 0; channel < 6; channel++) { + // change the resistance on this channel from min to max: + for (int level = 0; level < 255; level++) { + digitalPotWrite(channel, level); + delay(10); + } + // wait a second at the top: + delay(100); + // change the resistance on this channel from max to min: + for (int level = 0; level < 255; level++) { + digitalPotWrite(channel, 255 - level); + delay(10); + } + } + +} + +void digitalPotWrite(int address, int value) { + // take the SS pin low to select the chip: + digitalWrite(slaveSelectPin, LOW); + // send in the address and value via SPI: + SPI.transfer(address); + SPI.transfer(value); + // take the SS pin high to de-select the chip: + digitalWrite(slaveSelectPin, HIGH); +} diff --git a/hardware/arduino/mtk/libraries/SPI/keywords.txt b/hardware/arduino/mtk/libraries/SPI/keywords.txt new file mode 100644 index 00000000..47738f9f --- /dev/null +++ b/hardware/arduino/mtk/libraries/SPI/keywords.txt @@ -0,0 +1,31 @@ +####################################### +# Syntax Coloring Map SPI +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +SPI KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +begin KEYWORD2 +end KEYWORD2 +transfer KEYWORD2 +#setBitOrder KEYWORD2 +setDataMode KEYWORD2 +setClockDivider KEYWORD2 + + +####################################### +# Constants (LITERAL1) +####################################### +SPI_MODE0 LITERAL1 +SPI_MODE1 LITERAL1 +SPI_MODE2 LITERAL1 +SPI_MODE3 LITERAL1 + +SPI_CONTINUE LITERAL1 +SPI_LAST LITERAL1 diff --git a/hardware/arduino/mtk/libraries/Servo/Servo.cpp b/hardware/arduino/mtk/libraries/Servo/Servo.cpp new file mode 100644 index 00000000..ec868808 --- /dev/null +++ b/hardware/arduino/mtk/libraries/Servo/Servo.cpp @@ -0,0 +1,254 @@ +/* + Copyright (c) 2013 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#if defined(ARDUINO_ARCH_MTK) + +#include +#include +#include "vmsys.h" +#include "vmtimer.h" +#include "vmlog.h" + +/* 32K or 13M hz */ +#define MTK_SERVO_CLOCK 32000 + +#if defined(MTK_SERVO_CLOCK) && (MTK_SERVO_CLOCK == 32000) +#define MTK_SERVO_CLOCK_VALUE 1 +#elif defined(MTK_SERVO_CLOCK) && (MTK_SERVO_CLOCK == 13000000) +#define MTK_SERVO_CLOCK_VALUE 0 +#else +#error "specified mtk clock value error" +#endif + /* CLOCK */ /* HZ */ +#define MTK_SERVO_CYCLE (MTK_SERVO_CLOCK / (1000/(REFRESH_INTERVAL/1000))) + + + + + +#define usToTicks(_us) ((_us) / 4615) // converts microseconds to tick +#define ticksToUs(_ticks) ((unsigned)_ticks * 4615) // converts from ticks back to microseconds + +#define TRIM_DURATION 0 // compensation ticks to trim adjust for digitalWrite delays + +static servo_t servos[MAX_SERVOS]; // static array of servo structures + +uint8_t ServoCount = 0; // the total number of attached servos + +static volatile int8_t Channel[_Nbr_16timers ]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) + +// convenience macros +#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / SERVOS_PER_TIMER)) // returns the timer controlling this servo +#define SERVO_INDEX_TO_CHANNEL(_servo_nbr) (_servo_nbr % SERVOS_PER_TIMER) // returns the index of the servo on this timer +#define SERVO_INDEX(_timer,_channel) ((_timer*SERVOS_PER_TIMER) + _channel) // macro to access servo index by timer and channel +#define SERVO(_timer,_channel) (servos[SERVO_INDEX(_timer,_channel)]) // macro to access servo class by timer and channel + + +#define SERVO_MIN() ( 1000/(REFRESH_INTERVAL/1000) - this->min * 4) // minimum value in uS for this servo + +#define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4) // minimum value in uS for this servo +#define SERVO_MAX() (MAX_PULSE_WIDTH - this->max * 4) // maximum value in uS for this servo + +/************ static functions common to all instances ***********************/ + +typedef struct +{ + volatile unsigned int TC_RA; + volatile unsigned int TC_CV; +}TC_CHANNEL_T; + +static TC_CHANNEL_T TC_CHANNEL[MAX_SERVOS] = {{0, REFRESH_INTERVAL}}; + +static void Servo_Handler(timer16_Sequence_t timer, uint8_t channel) +{ + // clear interrupt + timer = 0; + channel = 0; + + delayMicroseconds(TC_CHANNEL[channel].TC_RA); + if (Channel[timer] < 0) { + //tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // channel set to -1 indicated that refresh interval completed so reset the timer + } else { + if (SERVO_INDEX(timer,Channel[timer]) < ServoCount && SERVO(timer,Channel[timer]).Pin.isActive == true) { + digitalWrite(SERVO(timer,Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated + } + } + + Channel[timer]++; // increment to the next channel + if( SERVO_INDEX(timer,Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { + TC_CHANNEL[channel].TC_RA = TC_CHANNEL[channel].TC_CV + SERVO(timer,Channel[timer]).ticks; + if(SERVO(timer,Channel[timer]).Pin.isActive == true) { // check if activated + digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,HIGH); // its an active channel so pulse it high + } + } + else { + // finished all channels so wait for the refresh period to expire before starting over + if( (TC_CHANNEL[channel].TC_CV) + 4 < REFRESH_INTERVAL ) { // allow a few ticks to ensure the next OCR1A not missed + TC_CHANNEL[channel].TC_RA = (unsigned int)REFRESH_INTERVAL; + } + else { + TC_CHANNEL[channel].TC_RA = TC_CHANNEL[channel].TC_CV + 4; // at least REFRESH_INTERVAL has elapsed + } + Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel + } +} + +void initISR(timer16_Sequence_t timer) +{ + +} + + +void finISR(timer16_Sequence_t timer) +{ + +} + + +static boolean isTimerActive(timer16_Sequence_t timer) +{ + // returns true if any servo is active on this timer + for(uint8_t channel=0; channel < SERVOS_PER_TIMER; channel++) { + if(SERVO(timer,channel).Pin.isActive == true) + return true; + } + return false; +} + + + +/****************** end of static functions ******************************/ + +Servo::Servo() +{ + if (ServoCount < MAX_SERVOS) { + this->servoIndex = ServoCount++; // assign a servo index to this instance + //servos[this->servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values + servos[this->servoIndex].ticks = DEFAULT_PULSE_WIDTH; // store default values + } else { + this->servoIndex = INVALID_SERVO; // too many servos + } +} + +uint8_t Servo::attach(int pin) +{ + return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); +} + +uint8_t Servo::attach(int pin, int min, int max) +{ + timer16_Sequence_t timer; + + if (this->servoIndex < MAX_SERVOS) { + pinMode(pin, OUTPUT); // set servo pin to output + servos[this->servoIndex].Pin.nbr = pin; + // todo min/max check: abs(min - MIN_PULSE_WIDTH) /4 < 128 + //this->min = (int)(((float)MIN_PULSE_WIDTH/REFRESH_INTERVAL) * MTK_SERVO_CYCLE); + this->min = (MIN_PULSE_WIDTH - min)/4; // + this->max = (MAX_PULSE_WIDTH - max)/4; // + // initialize the timer if it has not already been initialized + timer = SERVO_INDEX_TO_TIMER(servoIndex); + if (isTimerActive(timer) == false) { + initISR(timer); + } + servos[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive + } + return this->servoIndex; +} + +void Servo::detach() +{ + timer16_Sequence_t timer; + + servos[this->servoIndex].Pin.isActive = false; + timer = SERVO_INDEX_TO_TIMER(servoIndex); + if(isTimerActive(timer) == false) { + finISR(timer); + } +} + +void Servo::write(int value) +{ + // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) + if (value < MIN_PULSE_WIDTH) + { + if (value < 0) + value = 0; + else if (value > 180) + value = 180; + vm_log_info("Servo::write 1 value[%d]", value); + value = map(value, 0, 180, SERVO_MIN(), SERVO_MAX()); + vm_log_info("Servo::write 2 value[%d]", value); + } + writeMicroseconds(value); +} + +void Servo::writeMicroseconds(int value) +{ + // calculate and store the values for the given channel + byte channel = this->servoIndex; + if( (channel < MAX_SERVOS) ) // ensure channel is valid + { + if (value < SERVO_MIN()) // ensure pulse width is valid + value = SERVO_MIN(); + else if (value > SERVO_MAX()) + value = SERVO_MAX(); + + value = value - TRIM_DURATION; + //value = usToTicks(value); // convert to ticks after compensating for interrupt overhead + servos[channel].ticks = value; // + + int curr_min = (int)(((float)MIN_PULSE_WIDTH/REFRESH_INTERVAL) * MTK_SERVO_CYCLE); + int curr_max = (int)(((float)MAX_PULSE_WIDTH/REFRESH_INTERVAL) * MTK_SERVO_CYCLE); + + int duty = map(value, SERVO_MIN(), SERVO_MAX(), curr_min, curr_max); + analogWriteAdvance(servos[this->servoIndex].Pin.nbr, + MTK_SERVO_CLOCK_VALUE, + 0, + MTK_SERVO_CYCLE, + duty); + vm_log_info("Servo::writeMicroseconds [%d:%d][%d,%d,%d,%d]", curr_min, curr_max, + servos[this->servoIndex].Pin.nbr, MTK_SERVO_CLOCK_VALUE, MTK_SERVO_CYCLE, duty); + } +} + +int Servo::read() // return the value as degrees +{ + //return map(readMicroseconds()+1, SERVO_MIN(), SERVO_MAX(), 0, 180); + return map(servos[this->servoIndex].ticks, SERVO_MIN(), SERVO_MAX(), 0, 180); +} +/* +int Servo::readMicroseconds() +{ + unsigned int pulsewidth; + if (this->servoIndex != INVALID_SERVO) + pulsewidth = ticksToUs(servos[this->servoIndex].ticks) + TRIM_DURATION; + else + pulsewidth = 0; + + return pulsewidth; +} +*/ + +bool Servo::attached() +{ + return servos[this->servoIndex].Pin.isActive; +} + +#endif // ARDUINO_ARCH_MTK + diff --git a/hardware/arduino/mtk/libraries/Servo/Servo.h b/hardware/arduino/mtk/libraries/Servo/Servo.h new file mode 100644 index 00000000..d03b4bde --- /dev/null +++ b/hardware/arduino/mtk/libraries/Servo/Servo.h @@ -0,0 +1,240 @@ +/* + Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + Copyright (c) 2009 Michael Margolis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + A servo is activated by creating an instance of the Servo class passing + the desired pin to the attach() method. + The servos are pulsed in the background using the value most recently + written using the write() method. + + Note that analogWrite of PWM on pins associated with the timer are + disabled when the first servo is attached. + Timers are seized as needed in groups of 12 servos - 24 servos use two + timers, 48 servos will use four. + The sequence used to sieze timers is defined in timers.h + + The methods are: + + Servo - Class for manipulating servo motors connected to Arduino pins. + + attach(pin ) - Attaches a servo motor to an i/o pin. + attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds + default min is 544, max is 2400 + + write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) + writeMicroseconds() - Sets the servo pulse width in microseconds + read() - Gets the last written servo pulse width as an angle between 0 and 180. + readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) + attached() - Returns true if there is a servo attached. + detach() - Stops an attached servos from pulsing its i/o pin. + */ + +#ifndef Servo_h +#define Servo_h + +#include "vmsys.h" +#define timer16_Sequence_t VMINT + +#define Servo_VERSION 2 // software version of this library + +#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo +#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo +#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached +#define REFRESH_INTERVAL 20000 // minumim time to refresh servos in microseconds + +#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer +#define _Nbr_16timers 4 +#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER) + +#define INVALID_SERVO 255 // flag indicating an invalid servo index + +typedef struct { + VMUINT8 nbr :6 ; // a pin number from 0 to 63 + VMUINT8 isActive :1 ; // true if this channel is enabled, pin not pulsed if false +} ServoPin_t ; + +typedef struct { + ServoPin_t Pin; + volatile unsigned int ticks; +} servo_t; + +// DESCRIPTION +//Servo Library allows RC servo control on LinkIt circuit board. +//Servo integrates gears and axes, which is capable of accurate control. +// +//A standard servo system positions an axis in different angles, normally between 0 and 180 degree. +//Rotating servo continuously will set the rotation of axis to different speeds. +// +//Note: +//Only pin (D3, D9) with PWM functionality can be used by servo. +// +// EXAMPLE +// +//#include +//Servo myservo; +// +//int potpin = 0; +//int val; +// +//void setup() +//{ +// myservo.attach(9); // servo connect to pin 9 +//} +// +//void loop() +//{ +// val = analogRead(potpin); // read from Pot pin +// val = map(val, 0, 1023, 0, 180); // map from 0~1023 to 0~180 +// myservo.write(val); // control servo +// delay(200); +//} +// +class Servo +{ +public: + Servo(); + + // DESCRIPTION + // Attaches servo motor to a digital pin. Only digital pins supporting PWM (D3, D9) can use this function. + // RETURNS + // channel number or 0 if failure + // EXAMPLE + // + // #include + // + // Servo myservo; + // + // void setup() + // { + // myservo.attach(9); + // } + // + // void loop() + // { + // + // } + // + VMUINT8 attach( + int pin //pin which needs servo attachment + ); + + // DESCRIPTION + // Attaches servo motor to a digital pin. Only digital pins supporting PWM (D3, D9) can use this function. + // RETURNS + // channel number or 0 if failure + // EXAMPLE + // + // #include + // + // Servo myservo; + // + // void setup() + // { + // myservo.attach(9); + // } + // + // void loop() + // { + // + // } + // + VMUINT8 attach( + int pin, //pin which needs servo attachment + int min, //(optional)lower bound of PW, ms; PWM when servo motor is at 0 degree (default: 544) + int max //(optional)upper bound of PW, ms, PWM when servo motor is at 180 degree (default: 2400) + ); + + //Servo motor and pin detached. If all servo motors are bound, you can use PWM output and analogWrite to output. + void detach(); + + // DESCRIPTION + // Writes a value to servo to control corresponding lever. + // Sets up the lever angle for a standard servo motor to move the lever to the corresponding angle. For a continuously rotating servo motor, sets up its rotation speed (0: rotate towards one direction in full speed; 180: rotate towards another direction in full speed; 90: stay intact) + // RETURNS + // void + // EXAMPLE + // + // #include + // + // Servo myservo; + // + // void setup() + // { + // myservo.attach(9); + // myservo.write(90); // set servo to mid-point + // } + // + // void loop() + // { + // + // } + // + void write( + int value //angle written to servo, 0 ~ 180 + ); + + + // DESCRIPTION + // Writes an us value to servo to control corresponding lever. + // Sets up the rotation angle of a standard servo motor. In terms of parameters for a standard servo, 1000 means rotating counterclockwise in full speed, 2000 clockwise in full speed and 1500 in the middle. + // + // The following is extracted from the official website of Arduino: + // Some customers do not operate following the standard method, for example setting the response value of servo between 700 and 2300. You can try enlarge the limits to adjust the range of rotation. However, such operation may shorten the life of servo and should be avoided. + // RETURNS + // void + // EXAMPLE + // + // #include + // + // Servo myservo; + // + // void setup() + // { + // myservo.attach(9); + // myservo.writeMicroseconds(1500); // set servo to mid-point + // } + // + // void loop() + // { + // + // } + // + void writeMicroseconds( + int value //value of microseconds + ); + + // DESCRIPTION + // Reads the current rotation angle of servo motor. + // RETURNS + // Rotation angle of servo, 0 ~ 180 degree + int read(); + + // DESCRIPTION + // Detects if servo has been attached with a pin. + // RETURNS + // True if pin is attached; otherwise false + bool attached(); + +private: + VMUINT8 servoIndex; // index into the channel data for this servo + VMINT8 min; // minimum is this value times 4 added to MIN_PULSE_WIDTH + VMINT8 max; // maximum is this value times 4 added to MAX_PULSE_WIDTH +}; + +#endif diff --git a/hardware/arduino/mtk/libraries/Servo/examples/Servo/Servo.ino b/hardware/arduino/mtk/libraries/Servo/examples/Servo/Servo.ino new file mode 100644 index 00000000..9423cdc5 --- /dev/null +++ b/hardware/arduino/mtk/libraries/Servo/examples/Servo/Servo.ino @@ -0,0 +1,22 @@ +#include +int i; +Servo myservo; + +void setup() { + //Serial.begin(115200); + myservo.attach(9); + myservo.write(90); + +} + +void loop() { + delay(1000); + vm_log_info("loop"); + + i += 3; + if (i == 180) + i = 0; + myservo.write(i); + +} + diff --git a/hardware/arduino/mtk/libraries/Servo/keywords.txt b/hardware/arduino/mtk/libraries/Servo/keywords.txt new file mode 100644 index 00000000..ca5ba79e --- /dev/null +++ b/hardware/arduino/mtk/libraries/Servo/keywords.txt @@ -0,0 +1,24 @@ +####################################### +# Syntax Coloring Map Servo +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Servo KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +attach KEYWORD2 +detach KEYWORD2 +write KEYWORD2 +read KEYWORD2 +attached KEYWORD2 +writeMicroseconds KEYWORD2 +readMicroseconds KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/hardware/arduino/mtk/libraries/Wire/Wire.cpp b/hardware/arduino/mtk/libraries/Wire/Wire.cpp new file mode 100644 index 00000000..0d24643a --- /dev/null +++ b/hardware/arduino/mtk/libraries/Wire/Wire.cpp @@ -0,0 +1,242 @@ +/* + * TwoWire.h - TWI/I2C library for Arduino Due + * Copyright (c) 2011 Cristian Maglie . + * All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +extern "C" { +#include +#include +#include +#include "vmsys.h" +#include "vmdcl.h" +#include "vmdcl_i2c.h" +#include "vmlog.h" +} + +#include "Wire.h" + +VM_DCL_HANDLE i2c_handle = -1; /* Declare a VM_DCL_HANDLE variable. */ + +TwoWire::TwoWire() : + rxBufferIndex(0), rxBufferLength(0), txAddress(0), + txBufferLength(0), srvBufferIndex(0), srvBufferLength(0), status( + UNINITIALIZED) { + // Empty +} + +void TwoWire::begin(void) { + + if(!changePinType(18, PIO_I2C, &i2c_handle)) + return; + + if(i2c_handle == VM_DCL_HANDLE_INVALID) + i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + else + i2c_handle = g_APinDescription[18].ulHandle; + + if(VM_DCL_HANDLE_INVALID == i2c_handle) + { + vm_log_info("begin, failed.i2c_handle:%d",i2c_handle); + } + + setPinHandle(18, i2c_handle); + + status = MASTER_IDLE; +} + +void TwoWire::begin(uint8_t address) { + status = SLAVE_IDLE;// can not porting use dcl +} + +void TwoWire::begin(int address) { + begin((uint8_t) address);// can not porting use dcl +} + +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) { + + // perform blocking read into buffer + int readed = 0; + VM_DCL_STATUS ret = 0; + vm_i2c_ctrl_config_t conf_data; + vm_i2c_ctrl_single_read_t read_data; + + if(i2c_handle==-1) + { + vm_log_info("requestFrom,i2c handle is invalid.i2c_handle:%d",i2c_handle); + return 0; + } + + if (quantity > BUFFER_LENGTH) + quantity = BUFFER_LENGTH; + conf_data.Reserved0 = (VM_DCL_I2C_OWNER)0; + conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + conf_data.fgGetHandleWait = 0; + conf_data.Reserved1 = 0; + conf_data.u1DelayLen = 0; + conf_data.u1SlaveAddress = address<<1; + conf_data.u4FastModeSpeed = 100; + conf_data.u4HSModeSpeed = 0; + ret = vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + read_data.pu1Data = &(rxBuffer[0]); + read_data.u4DataLen = quantity; + ret = vm_dcl_control(i2c_handle,VM_I2C_CMD_SINGLE_READ,(void *)&read_data); + rxBufferIndex = 0; + rxBufferLength = quantity; + + return quantity; +} + +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) { + return requestFrom((uint8_t) address, (uint8_t) quantity, (uint8_t) true); +} + +uint8_t TwoWire::requestFrom(int address, int quantity) { + return requestFrom((uint8_t) address, (uint8_t) quantity, (uint8_t) true); +} + +uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop) { + return requestFrom((uint8_t) address, (uint8_t) quantity, (uint8_t) sendStop); +} + +void TwoWire::beginTransmission(uint8_t address) { + if(i2c_handle==-1) + { + vm_log_info("beginTransmission:i2c handle is invalid,return"); + return; + } + status = MASTER_SEND; + + // save address of target and empty buffer + txAddress = address<<1; + txBufferLength = 0; +} + +void TwoWire::beginTransmission(int address) { + beginTransmission((uint8_t) address); +} + +uint8_t TwoWire::endTransmission(uint8_t sendStop) { + vm_i2c_ctrl_config_t conf_data; + vm_i2c_ctrl_single_write_t write_data; + VM_DCL_STATUS ret = 0; + int32_t sent = 0; + + if(i2c_handle==-1) + { + vm_log_info("endTransmission,i2c handle is invalid.i2c_handle:%d",i2c_handle); + return 0; + } + + if(0 < txBufferLength) { + conf_data.Reserved0 = (VM_DCL_I2C_OWNER)0; + conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + conf_data.fgGetHandleWait = 0; + conf_data.Reserved1 = 0; + conf_data.u1DelayLen = 0; + conf_data.u1SlaveAddress = txAddress; + + conf_data.u4FastModeSpeed = 100; + conf_data.u4HSModeSpeed = 0; + ret = vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + + write_data.pu1Data = &(txBuffer[0]); + write_data.u4DataLen = txBufferLength; + ret = vm_dcl_control(i2c_handle,VM_I2C_CMD_SINGLE_WRITE,(void *)&write_data); + sent = txBufferLength; + } + + txBufferLength = 0; + + status = MASTER_IDLE; + return sent; +} + +// This provides backwards compatibility with the original +// definition, and expected behaviour, of endTransmission +// +uint8_t TwoWire::endTransmission(void) +{ + return endTransmission(true); +} + +size_t TwoWire::write(uint8_t data) { + if (status == MASTER_SEND) { + if (txBufferLength >= BUFFER_LENGTH) + return 0; + txBuffer[txBufferLength++] = data; + return 1; + } else { + if (srvBufferLength >= BUFFER_LENGTH) + return 0; + srvBuffer[srvBufferLength++] = data; + return 1; + } +} + +size_t TwoWire::write(const uint8_t *data, size_t quantity) { + if (status == MASTER_SEND) { + for (size_t i = 0; i < quantity; ++i) { + if (txBufferLength >= BUFFER_LENGTH) + return i; + txBuffer[txBufferLength++] = data[i]; + } + } else { + for (size_t i = 0; i < quantity; ++i) { + if (srvBufferLength >= BUFFER_LENGTH) + return i; + srvBuffer[srvBufferLength++] = data[i]; + } + } + return quantity; +} + +int TwoWire::available(void) { + return rxBufferLength - rxBufferIndex; +} + +int TwoWire::read(void) { + if (rxBufferIndex < rxBufferLength) + return rxBuffer[rxBufferIndex++]; + return -1; +} + +int TwoWire::peek(void) { + if (rxBufferIndex < rxBufferLength) + return rxBuffer[rxBufferIndex]; + return -1; +} + +void TwoWire::flush(void) { + // Do nothing, use endTransmission(..) to force + // data transfer. +} + +void TwoWire::onReceive(void(*function)(int)) { + onReceiveCallback = function; +} + +void TwoWire::onRequest(void(*function)(void)) { + onRequestCallback = function; +} + +void TwoWire::onService(void) { + // Retrieve interrupt status +} +// Preinstantiate Objects ////////////////////////////////////////////////////// +TwoWire Wire = TwoWire(); + diff --git a/hardware/arduino/mtk/libraries/Wire/Wire.h b/hardware/arduino/mtk/libraries/Wire/Wire.h new file mode 100644 index 00000000..86d62941 --- /dev/null +++ b/hardware/arduino/mtk/libraries/Wire/Wire.h @@ -0,0 +1,374 @@ +/* + * TwoWire.h - TWI/I2C library for Arduino Due + * Copyright (c) 2011 Cristian Maglie . + * All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef TwoWire_h +#define TwoWire_h +// Include Atmel CMSIS driver +//#include + +#include "Stream.h" +#include "variant.h" + +#define BUFFER_LENGTH 8 + + +// TwoWire class interface +class TwoWire : public Stream +{ +// Constructor / Destructor +public: + TwoWire(); + +// Method +public: + // DESCRIPTION + // Sets up the host address for I2C communication. LinkIt One supports void TwoWire:begin(void), + // which means joining the I2C bus as a host. In normal condition, + // to use the Wire library,this function must be called and called only once. + // EXAMPLE + // + // #include + // void setup() + // { + // Wire.begin(); + // } + // void loop() + // { + // + // } + // + void begin(); +/* DOM-NOT_FOR_SDK-BEGIN */ + // DESCRIPTION + // Initiate the wire library and join the I2C bus as a master.This should normally + // be called only once + void begin( + uint8_t address // [IN] the 7-bit address of the device + ); + + // DESCRIPTION + // Initiate the wire library and join the I2C bus as a master.This should normally + // be called only once + void begin( + int address // [IN] the 7-bit address of the device + ); +/* DOM-NOT_FOR_SDK-END */ + + // DESCRIPTION + // Enables the communication with the slave at assigned address.After that, + // the data are written by write() and transmitted by endTransmission(). + // RETURNS + // none + // EXAMPLE + // + // #include + // void setup() + // { + // Wire.begin(); + // } + // void loop() + // { + // Wire.beginTransmission(0x27); + // Wire.write('a'); + // Wire.endTransmission(); + // } + // + void beginTransmission( + uint8_t address // [IN] Address of the assigned slave,a 7-bit address,from 0 to 127. + ); + + + // DESCRIPTION + // Enables the communication with the slave at assigned address.After that, + // the data are written by write() and transmitted by endTransmission(). + void beginTransmission( + int address // [IN] Address of the assigned slave,a 7-bit address,from 0 to 127. + ); + + + // DESCRIPTION + // Ends the communication with the slave assigned by beginTransmission() and + // transmits the data buffered by write() to the slave. + // RETURNS + // Number of bytes of data sent to slave(unit:byte) + // EXAMPLE + // + // #include + // void setup() + // { + // Wire.begin(); + // } + // void loop() + // { + // Wire.beginTransmission(0x27); + // Wire.write('a'); + // Wire.endTransmission(); + // } + // + uint8_t endTransmission(void); +/* DOM-NOT_FOR_SDK-BEGIN */ + // DESCRIPTION + // end a transmission to a slave device that was begun by beginTransmission()and transmit the bytes + // that were queued by write() + // RETURNS + // the number of byte that were sent to the slave device. + // SEE ALSO + // beginTransmission + uint8_t endTransmission( + uint8_t sendStop + ); +/* DOM-NOT_FOR_SDK-END */ + + // DESCRIPTION + // For master to request data from slave, and master can get data by + // available() and read(). + // RETURNS + // Number of bytes returned from slave + // EXAMPLE + // + // #include + // void setup() + // { + // Wire.begin(); + // } + // void loop() + // { + // Wire.requestFrom(0x27,6); + // while((Wire.available())) + // { + // int c = Wire.read(); + // } + // } + // + uint8_t requestFrom( + uint8_t address, // [IN]address:the 7-bit slave address + uint8_t quantity // [IN]quantity:number of bytes requested + ); + + // DESCRIPTION + // For master to request data from slave, and master can get data by + // available() and read(). + // RETURNS + // Number of bytes returned from slave + uint8_t requestFrom( + int address, // [IN]address:the 7-bit slave address + int quantity // [IN]quantity:number of bytes requested + ); +/* DOM-NOT_FOR_SDK-BEGIN */ + // DESCRIPTION + // used by the master to request bytes from a slave device.the bytes may then be retrieved with the + // available() and read() function + // RETURNS + // the number of bytes returned from the slave device + uint8_t requestFrom( + uint8_t address, // Param 1 + uint8_t quantity, // Param 2 + uint8_t sendStop // Param 3 + ); + + // DESCRIPTION + // used by the master to request bytes from a slave device.the bytes may then be retrieved with the + // available() and read() function + // RETURNS + // the number of bytes returned from the slave device + uint8_t requestFrom( + int address, // Param 1 + int quantity, // Param 2 + int sendStop // Param 3 + ); + /* DOM-NOT_FOR_SDK-END */ + + // DESCRIPTION + // Writes data into the queue and is called between beginTransmission() and endTransmission() + // RETURNS + // Number of bytes of data written in + // EXAMPLE + // + // #include + // void setup() + // { + // Wire.begin(); + // } + // void loop() + // { + // Wire.beginTransmission(0x27); + // Wire.write('a'); + // Wire.endTransmission(); + // } + // + virtual size_t write( + uint8_t data// [IN]A byte of data to be written. + ); + + + // DESCRIPTION + // Writes data into the queue and is called between beginTransmission() and endTransmission() + // RETURNS + // Number of bytes of data written in + // EXAMPLE + // + // #include + // uint8_t data[3]={0,1,2}; + // void setup() + // { + // Wire.begin(); + // } + // void loop() + // { + // Wire.beginTransmission(0x27); + // Wire.write(data,3); + // Wire.endTransmission(); + // } + // + + virtual size_t write( + const uint8_t * data, //[IN]address to be written data + size_t quantity //[IN]Number of bytes of data written in + ); + + + // DESCRIPTION + // Returns the number of bytes read() can read + // RETURNS + // Number of bytes that can be read + // EXAMPLE + // + // #include + // void setup() + // { + // Wire.begin(); + // } + // void loop() + // { + // Wire.requestFrom(0x27,6); + // while((Wire.available())) + // { + // int c = Wire.read(); + // } + // } + // + virtual int available(void); + + + // DESCRIPTION + // Reads a byte of data which are sent from master to slave or from + // slave to master(the master requests it by requestFrom()) + // RETURNS + // The byte of data read + // EXAMPLE + // + // #include + // void setup() + // { + // Wire.begin(); + // } + // void loop() + // { + // Wire.requestFrom(0x27,6); + // while((Wire.available())) + // { + // int c = Wire.read(); + // } + // } + // + virtual int read(void); + /* DOM-NOT_FOR_SDK-BEGIN */ + // todo + virtual int peek(void); + + // todo + virtual void flush(void); + + // todo + void onReceive(void(*)(int)); + + // todo + void onRequest(void(*)(void)); + + // todo + inline size_t write(unsigned long n) { return write((uint8_t)n); } + + // todo + inline size_t write(long n) { return write((uint8_t)n); } + + // todo + inline size_t write(unsigned int n) { return write((uint8_t)n); } + + // todo + inline size_t write(int n) { return write((uint8_t)n); } + + // todo + using Print::write; + + // todo + void onService(void); +/* DOM-NOT_FOR_SDK-END */ +//Implementation +private: + // RX Buffer + uint8_t rxBuffer[BUFFER_LENGTH]; + uint8_t rxBufferIndex; + uint8_t rxBufferLength; + + // TX Buffer + uint8_t txAddress; + uint8_t txBuffer[BUFFER_LENGTH]; + uint8_t txBufferLength; + + // Service buffer + uint8_t srvBuffer[BUFFER_LENGTH]; + uint8_t srvBufferIndex; + uint8_t srvBufferLength; + + // Callback user functions + void (*onRequestCallback)(void); + void (*onReceiveCallback)(int); + + // Called before initialization + //void (*onBeginCallback)(void); + + // TWI instance + //Twi *twi; + + // TWI state + enum TwoWireStatus { + UNINITIALIZED, + MASTER_IDLE, + MASTER_SEND, + MASTER_RECV, + SLAVE_IDLE, + SLAVE_RECV, + SLAVE_SEND + }; + TwoWireStatus status; + + // TWI clock frequency + static const uint32_t TWI_CLOCK = 100000; + + // Timeouts ( + static const uint32_t RECV_TIMEOUT = 100000; + static const uint32_t XMIT_TIMEOUT = 100000; +}; + +//the Wire object +extern TwoWire Wire; + +#endif + diff --git a/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.cpp b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.cpp new file mode 100644 index 00000000..a5673329 --- /dev/null +++ b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.cpp @@ -0,0 +1,308 @@ +//YWROBOT +//last updated on 21/12/2011 +//Tim Starling Fix the reset bug (Thanks Tim) +//wiki doc http://www.dfrobot.com/wiki/index.php?title=I2C/TWI_LCD1602_Module_(SKU:_DFR0063) +//Support Forum: http://www.dfrobot.com/forum/ +//Compatible with the Arduino IDE 1.0 +//Library version:1.1 + + +#include "LiquidCrystal_I2C.h" +#include +//#if defined(ARDUINO) && ARDUINO >= 100 + +#include "Arduino.h" + +inline size_t LiquidCrystal_I2C::write(uint8_t value) { + send(value, Rs); + return 0; +} + +#include "Wire.h" + +// When the display powers up, it is configured as follows: +// +// 1. Display clear +// 2. Function set: +// DL = 1; 8-bit interface data +// N = 0; 1-line display +// F = 0; 5x8 dot character font +// 3. Display on/off control: +// D = 0; Display off +// C = 0; Cursor off +// B = 0; Blinking off +// 4. Entry mode set: +// I/D = 1; Increment by 1 +// S = 0; No shift +// +// Note, however, that resetting the Arduino doesn't reset the LCD, so we +// can't assume that its in that state when a sketch starts (and the +// LiquidCrystal constructor is called). + +LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows) +{ + _Addr = lcd_Addr; + _cols = lcd_cols; + _rows = lcd_rows; + _backlightval = LCD_NOBACKLIGHT; +} + +void LiquidCrystal_I2C::init(){ + init_priv(); +} + +void LiquidCrystal_I2C::init_priv() +{ + Wire.begin(); + _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; + begin(_cols, _rows); +} + +void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { + if (lines > 1) { + _displayfunction |= LCD_2LINE; + } + _numlines = lines; + + // for some 1 line displays you can select a 10 pixel high font + if ((dotsize != 0) && (lines == 1)) { + _displayfunction |= LCD_5x10DOTS; + } + + // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! + // according to datasheet, we need at least 40ms after power rises above 2.7V + // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50 + delay(50); + + // Now we pull both RS and R/W low to begin commands + expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1) + delay(1000); + + //put the LCD into 4 bit mode + // this is according to the hitachi HD44780 datasheet + // figure 24, pg 46 + + // we start in 8bit mode, try to set 4 bit mode + write4bits(0x03 << 4); + delayMicroseconds(4500); // wait min 4.1ms + + // second try + write4bits(0x03 << 4); + delayMicroseconds(4500); // wait min 4.1ms + + // third go! + write4bits(0x03 << 4); + delayMicroseconds(150); + + // finally, set to 4-bit interface + write4bits(0x02 << 4); + + + // set # lines, font size, etc. + command(LCD_FUNCTIONSET | _displayfunction); + + // turn the display on with no cursor or blinking default + _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; + display(); + + // clear it off + clear(); + + // Initialize to default text direction (for roman languages) + _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; + + // set the entry mode + command(LCD_ENTRYMODESET | _displaymode); + + home(); + +} + +/********** high level commands, for the user! */ +void LiquidCrystal_I2C::clear(){ + command(LCD_CLEARDISPLAY);// clear display, set cursor position to zero + delayMicroseconds(2000); // this command takes a long time! +} + +void LiquidCrystal_I2C::home(){ + command(LCD_RETURNHOME); // set cursor position to zero + delayMicroseconds(2000); // this command takes a long time! +} + +void LiquidCrystal_I2C::setCursor(uint8_t col, uint8_t row){ + int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 }; + if ( row > _numlines ) { + row = _numlines-1; // we count rows starting w/0 + } + command(LCD_SETDDRAMADDR | (col + row_offsets[row])); +} + +// Turn the display on/off (quickly) +void LiquidCrystal_I2C::noDisplay() { + _displaycontrol &= ~LCD_DISPLAYON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} +void LiquidCrystal_I2C::display() { + _displaycontrol |= LCD_DISPLAYON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +// Turns the underline cursor on/off +void LiquidCrystal_I2C::noCursor() { + _displaycontrol &= ~LCD_CURSORON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} +void LiquidCrystal_I2C::cursor() { + _displaycontrol |= LCD_CURSORON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +// Turn on and off the blinking cursor +void LiquidCrystal_I2C::noBlink() { + _displaycontrol &= ~LCD_BLINKON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} +void LiquidCrystal_I2C::blink() { + _displaycontrol |= LCD_BLINKON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +// These commands scroll the display without changing the RAM +void LiquidCrystal_I2C::scrollDisplayLeft(void) { + command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT); +} +void LiquidCrystal_I2C::scrollDisplayRight(void) { + command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT); +} + +// This is for text that flows Left to Right +void LiquidCrystal_I2C::leftToRight(void) { + _displaymode |= LCD_ENTRYLEFT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// This is for text that flows Right to Left +void LiquidCrystal_I2C::rightToLeft(void) { + _displaymode &= ~LCD_ENTRYLEFT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// This will 'right justify' text from the cursor +void LiquidCrystal_I2C::autoscroll(void) { + _displaymode |= LCD_ENTRYSHIFTINCREMENT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// This will 'left justify' text from the cursor +void LiquidCrystal_I2C::noAutoscroll(void) { + _displaymode &= ~LCD_ENTRYSHIFTINCREMENT; + command(LCD_ENTRYMODESET | _displaymode); +} + +// Allows us to fill the first 8 CGRAM locations +// with custom characters +void LiquidCrystal_I2C::createChar(uint8_t location, uint8_t charmap[]) { + location &= 0x7; // we only have 8 locations 0-7 + command(LCD_SETCGRAMADDR | (location << 3)); + for (int i=0; i<8; i++) { + write(charmap[i]); + } +} + +// Turn the (optional) backlight off/on +void LiquidCrystal_I2C::noBacklight(void) { + _backlightval=LCD_NOBACKLIGHT; + expanderWrite(0); +} + +void LiquidCrystal_I2C::backlight(void) { + _backlightval=LCD_BACKLIGHT; + expanderWrite(0); +} + +/*********** mid level commands, for sending data/cmds */ + +inline void LiquidCrystal_I2C::command(uint8_t value) { + send(value, 0); +} + + +/************ low level data pushing commands **********/ + +// write either command or data +void LiquidCrystal_I2C::send(uint8_t value, uint8_t mode) { + uint8_t highnib=value&0xf0; + uint8_t lownib=(value<<4)&0xf0; + write4bits((highnib)|mode); + write4bits((lownib)|mode); +} + +void LiquidCrystal_I2C::write4bits(uint8_t value) { + expanderWrite(value); + pulseEnable(value); +} + +void LiquidCrystal_I2C::expanderWrite(uint8_t _data){ + Wire.beginTransmission(_Addr); + Wire.write((int)(_data) | _backlightval); + Wire.endTransmission(); +} + +void LiquidCrystal_I2C::pulseEnable(uint8_t _data){ + expanderWrite(_data | En); // En high + delayMicroseconds(1); // enable pulse must be >450ns + + expanderWrite(_data & ~En); // En low + delayMicroseconds(50); // commands need > 37us to settle +} + + +// Alias functions + +void LiquidCrystal_I2C::cursor_on(){ + cursor(); +} + +void LiquidCrystal_I2C::cursor_off(){ + noCursor(); +} + +void LiquidCrystal_I2C::blink_on(){ + blink(); +} + +void LiquidCrystal_I2C::blink_off(){ + noBlink(); +} + +void LiquidCrystal_I2C::load_custom_character(uint8_t char_num, uint8_t *rows){ + createChar(char_num, rows); +} + +void LiquidCrystal_I2C::setBacklight(uint8_t new_val){ + if(new_val){ + backlight(); // turn backlight on + }else{ + noBacklight(); // turn backlight off + } +} + +void LiquidCrystal_I2C::printstr(const char c[]){ + //This function is not identical to the function used for "real" I2C displays + //it's here so the user sketch doesn't have to be changed + print(c); +} + + +// unsupported API functions +void LiquidCrystal_I2C::off(){} +void LiquidCrystal_I2C::on(){} +void LiquidCrystal_I2C::setDelay (int cmdDelay,int charDelay) {} +uint8_t LiquidCrystal_I2C::status(){return 0;} +uint8_t LiquidCrystal_I2C::keypad (){return 0;} +uint8_t LiquidCrystal_I2C::init_bargraph(uint8_t graphtype){return 0;} +void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end){} +void LiquidCrystal_I2C::draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_row_end){} +void LiquidCrystal_I2C::setContrast(uint8_t new_val){} + + \ No newline at end of file diff --git a/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.h b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.h new file mode 100644 index 00000000..faf19fbe --- /dev/null +++ b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.h @@ -0,0 +1,126 @@ +//YWROBOT +#ifndef LiquidCrystal_I2C_h +#define LiquidCrystal_I2C_h + +#include +#include "Print.h" +#include + +// commands +#define LCD_CLEARDISPLAY 0x01 +#define LCD_RETURNHOME 0x02 +#define LCD_ENTRYMODESET 0x04 +#define LCD_DISPLAYCONTROL 0x08 +#define LCD_CURSORSHIFT 0x10 +#define LCD_FUNCTIONSET 0x20 +#define LCD_SETCGRAMADDR 0x40 +#define LCD_SETDDRAMADDR 0x80 + +// flags for display entry mode +#define LCD_ENTRYRIGHT 0x00 +#define LCD_ENTRYLEFT 0x02 +#define LCD_ENTRYSHIFTINCREMENT 0x01 +#define LCD_ENTRYSHIFTDECREMENT 0x00 + +// flags for display on/off control +#define LCD_DISPLAYON 0x04 +#define LCD_DISPLAYOFF 0x00 +#define LCD_CURSORON 0x02 +#define LCD_CURSOROFF 0x00 +#define LCD_BLINKON 0x01 +#define LCD_BLINKOFF 0x00 + +// flags for display/cursor shift +#define LCD_DISPLAYMOVE 0x08 +#define LCD_CURSORMOVE 0x00 +#define LCD_MOVERIGHT 0x04 +#define LCD_MOVELEFT 0x00 + +// flags for function set +#define LCD_8BITMODE 0x10 +#define LCD_4BITMODE 0x00 +#define LCD_2LINE 0x08 +#define LCD_1LINE 0x00 +#define LCD_5x10DOTS 0x04 +#define LCD_5x8DOTS 0x00 + +// flags for backlight control +#define LCD_BACKLIGHT 0x08 +#define LCD_NOBACKLIGHT 0x00 + +#define En B00000100 // Enable bit +#define Rw B00000010 // Read/Write bit +#define Rs B00000001 // Register select bit + +class LiquidCrystal_I2C : public Print { +public: + LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows); + void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS ); + void clear(); + void home(); + void noDisplay(); + void display(); + void noBlink(); + void blink(); + void noCursor(); + void cursor(); + void scrollDisplayLeft(); + void scrollDisplayRight(); + void printLeft(); + void printRight(); + void leftToRight(); + void rightToLeft(); + void shiftIncrement(); + void shiftDecrement(); + void noBacklight(); + void backlight(); + void autoscroll(); + void noAutoscroll(); + void createChar(uint8_t, uint8_t[]); + void setCursor(uint8_t, uint8_t); +#if defined(ARDUINO) && ARDUINO >= 100 + virtual size_t write(uint8_t); +#else + virtual void write(uint8_t); +#endif + void command(uint8_t); + void init(); + +////compatibility API function aliases +void blink_on(); // alias for blink() +void blink_off(); // alias for noBlink() +void cursor_on(); // alias for cursor() +void cursor_off(); // alias for noCursor() +void setBacklight(uint8_t new_val); // alias for backlight() and nobacklight() +void load_custom_character(uint8_t char_num, uint8_t *rows); // alias for createChar() +void printstr(const char[]); + +////Unsupported API functions (not implemented in this library) +uint8_t status(); +void setContrast(uint8_t new_val); +uint8_t keypad(); +void setDelay(int,int); +void on(); +void off(); +uint8_t init_bargraph(uint8_t graphtype); +void draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end); +void draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end); + + +private: + void init_priv(); + void send(uint8_t, uint8_t); + void write4bits(uint8_t); + void expanderWrite(uint8_t); + void pulseEnable(uint8_t); + uint8_t _Addr; + uint8_t _displayfunction; + uint8_t _displaycontrol; + uint8_t _displaymode; + uint8_t _numlines; + uint8_t _cols; + uint8_t _rows; + uint8_t _backlightval; +}; + +#endif diff --git a/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.o b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/LiquidCrystal_I2C.o new file mode 100644 index 0000000000000000000000000000000000000000..bca78e0d24dfc30341ef0d5e91cf127ee829e126 GIT binary patch literal 41564 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 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/diff.txt b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/diff.txt new file mode 100644 index 00000000..586578de --- /dev/null +++ b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/diff.txt @@ -0,0 +1,69 @@ +1,6c1 +< //YWROBOT +< //last updated on 26/11/2010 +< //Tim Starling Fix the reset bug (Thanks Tim) +< //wiki doc http://www.dfrobot.com/wiki/index.php?title=I2C/TWI_LCD1602_Module_(SKU:_DFR0063) +< //Support Forum: http://www.dfrobot.com/forum/ +< +--- +> // LiquidCrystal_I2C V2.0 +10d4 +< #include "WProgram.h" +12c6 +< +--- +> #include "Arduino.h" +67c61 +< delay(50); +--- +> delayMicroseconds(50000); +77,90c71,84 +< // we start in 8bit mode, try to set 4 bit mode +< write4bits(0x03 << 4); +< delayMicroseconds(4500); // wait min 4.1ms +< +< // second try +< write4bits(0x03 << 4); +< delayMicroseconds(4500); // wait min 4.1ms +< +< // third go! +< write4bits(0x03 << 4); +< delayMicroseconds(150); +< +< // finally, set to 4-bit interface +< write4bits(0x02 << 4); +--- +> // we start in 8bit mode, try to set 4 bit mode +> write4bits(0x03); +> delayMicroseconds(4500); // wait min 4.1ms +> +> // second try +> write4bits(0x03); +> delayMicroseconds(4500); // wait min 4.1ms +> +> // third go! +> write4bits(0x03); +> delayMicroseconds(150); +> +> // finally, set to 4-bit interface +> write4bits(0x02); +225c219 +< inline void LiquidCrystal_I2C::write(uint8_t value) { +--- +> inline size_t LiquidCrystal_I2C::write(uint8_t value) { +226a221 +> return 0; +235,238c230,233 +< uint8_t highnib=value&0xf0; +< uint8_t lownib=(value<<4)&0xf0; +< write4bits((highnib)|mode); +< write4bits((lownib)|mode); +--- +> uint8_t highnib=value>>4; +> uint8_t lownib=value & 0x0F; +> write4bits((highnib)|mode); +> write4bits((lownib)|mode); +248c243 +< Wire.send((int)(_data) | _backlightval); +--- +> Wire.write((int)(_data) | _backlightval); diff --git a/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/examples/SerialDisplay/SerialDisplay.pde b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/examples/SerialDisplay/SerialDisplay.pde new file mode 100644 index 00000000..a237475d --- /dev/null +++ b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/examples/SerialDisplay/SerialDisplay.pde @@ -0,0 +1,34 @@ +/* + * Displays text sent over the serial port (e.g. from the Serial Monitor) on + * an attached LCD. + * YWROBOT + *Compatible with the Arduino IDE 1.0 + *Library version:1.1 + */ +#include +#include + +LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display + +void setup() +{ + lcd.init(); // initialize the lcd + lcd.backlight(); + Serial.begin(9600); +} + +void loop() +{ + // when characters arrive over the serial port... + if (Serial.available()) { + // wait a bit for the entire message to arrive + delay(100); + // clear the screen + lcd.clear(); + // read all the available characters + while (Serial.available() > 0) { + // display each character to the LCD + lcd.write(Serial.read()); + } + } +} diff --git a/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/keywords.txt b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/keywords.txt new file mode 100644 index 00000000..8c450a9e --- /dev/null +++ b/hardware/arduino/mtk/libraries/Wire/example/LiquidCrystal_I2C1602V1/keywords.txt @@ -0,0 +1,46 @@ +########################################### +# Syntax Coloring Map For LiquidCrystal_I2C +########################################### + +########################################### +# Datatypes (KEYWORD1) +########################################### + +LiquidCrystal_I2C KEYWORD1 + +########################################### +# Methods and Functions (KEYWORD2) +########################################### +init KEYWORD2 +begin KEYWORD2 +clear KEYWORD2 +home KEYWORD2 +noDisplay KEYWORD2 +display KEYWORD2 +noBlink KEYWORD2 +blink KEYWORD2 +noCursor KEYWORD2 +cursor KEYWORD2 +scrollDisplayLeft KEYWORD2 +scrollDisplayRight KEYWORD2 +leftToRight KEYWORD2 +rightToLeft KEYWORD2 +shiftIncrement KEYWORD2 +shiftDecrement KEYWORD2 +noBacklight KEYWORD2 +backlight KEYWORD2 +autoscroll KEYWORD2 +noAutoscroll KEYWORD2 +createChar KEYWORD2 +setCursor KEYWORD2 +print KEYWORD2 +blink_on KEYWORD2 +blink_off KEYWORD2 +cursor_on KEYWORD2 +cursor_off KEYWORD2 +setBacklight KEYWORD2 +load_custom_character KEYWORD2 +printstr KEYWORD2 +########################################### +# Constants (LITERAL1) +########################################### diff --git a/hardware/arduino/mtk/libraries/Wire/keywords.txt b/hardware/arduino/mtk/libraries/Wire/keywords.txt new file mode 100644 index 00000000..e75e929e --- /dev/null +++ b/hardware/arduino/mtk/libraries/Wire/keywords.txt @@ -0,0 +1,32 @@ +####################################### +# Syntax Coloring Map For Wire +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +begin KEYWORD2 +beginTransmission KEYWORD2 +endTransmission KEYWORD2 +requestFrom KEYWORD2 +send KEYWORD2 +receive KEYWORD2 +onReceive KEYWORD2 +onRequest KEYWORD2 + +####################################### +# Instances (KEYWORD2) +####################################### + +Wire KEYWORD2 +Wire1 KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/hardware/arduino/mtk/platform.txt b/hardware/arduino/mtk/platform.txt new file mode 100644 index 00000000..4af85daf --- /dev/null +++ b/hardware/arduino/mtk/platform.txt @@ -0,0 +1,84 @@ + +# Arduino MTK Core and platform. +# +# For more info: +# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification + +name=Arduino ARM (32-bits) Boards +version=1.5.6 + +# MTK compile variables +# ---------------------- + +compiler.path={runtime.ide.path}/hardware/tools/g++_arm_none_eabi/bin/ +compiler.c.cmd=arm-none-eabi-gcc +compiler.c.flags=-c -g -O2 -fvisibility=hidden -fpic -mthumb -mlittle-endian -nostdlib -nostdlib -Dprintf=iprintf +compiler.c.elf.cmd=arm-none-eabi-g++ +compiler.c.elf.flags=-O2 -Wl,--gc-sections +compiler.S.flags=-c -g -x assembler-with-cpp +compiler.cpp.cmd=arm-none-eabi-g++ +compiler.cpp.flags=-c -g -O2 -fvisibility=hidden -fpic -mthumb -mlittle-endian -nostdlib -fno-non-call-exceptions -fno-rtti -fno-exceptions -Dprintf=iprintf +compiler.ar.cmd=arm-none-eabi-ar +compiler.ar.flags=rcs +compiler.objcopy.cmd=arm-none-eabi-objcopy +compiler.objcopy.remove.flags=--strip-debug +# compiler.elf2hex.flags=-O binary +# compiler.elf2hex.cmd=arm-none-eabi-objcopy +# compiler.ldflags= +compiler.size.cmd=arm-none-eabi-size +compiler.define=-DARDUINO= +# this can be overriden in boards.txt +build.extra_flags= + + +compiler.libmtk.c.flags="-I{build.system.path}/libmtk" "-I{build.system.path}/libmtk/include" + +# USB Flags +# --------- +build.usb_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} -DUSBCON '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}' + +# Default usb manufacturer will be replaced at compile time using +# numeric vendor ID if available or by board's specific value. +build.usb_manufacturer="Unknown" + + +# MTK compile patterns +# --------------------- + +## Compile c files +recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {build.extra_flags} {compiler.libmtk.c.flags} {includes} "{source_file}" -o "{object_file}" + +## Compile c++ files +recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {build.extra_flags} {compiler.libmtk.c.flags} {includes} "{source_file}" -o "{object_file}" + +## Create archives +recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} "{build.path}/{archive_file}" "{object_file}" + +## Combine gc-sections, archives, and objects +recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mcpu={build.mcu} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -lm -fpic -msvr4-struct-return -pie -Wl,--entry=gcc_entry -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-unresolved-symbols -Wl,--start-group "{build.path}/syscalls_mtk.c.o" {object_files} "{build.variant.path}/{build.variant_system_lib}" "{build.path}/{archive_file}" -Wl,--end-group + +## Get debug infomation +#recipe.objcopy.get.pattern="{compiler.path}{compiler.objcopy.cmd}" --only-keep-debug "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.vxp.dbg" + +## Remove debug infomation +recipe.objcopy.eep.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.objcopy.remove.flags} "{build.path}/{build.project_name}.elf" + +## Create hex +recipe.objcopy.hex.pattern="{runtime.ide.path}/hardware/tools/mtk/PackTag.exe" "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.vxp" + +## Compute size +recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf" +recipe.size.regex=\.text\s+([0-9]+).* + + +# MTK Uploader tools +# ------------------- + +tools.bossac.cmd=pushtool +tools.bossac.cmd.windows=pushtool.exe +tools.bossac.path={runtime.ide.path}/hardware/tools/mtk + +tools.bossac.upload.params.verbose=-v -v -v -v +tools.bossac.upload.params.quiet= +tools.bossac.upload.pattern="{path}/{cmd}" {upload.verbose} -t arduino -clear -port {serial.port.file} -app "{build.path}/{build.project_name}.vxp" + diff --git a/hardware/arduino/mtk/programmers.txt b/hardware/arduino/mtk/programmers.txt new file mode 100644 index 00000000..e69de29b diff --git a/hardware/arduino/mtk/system/libmtk/build_gcc/StubGen.bat b/hardware/arduino/mtk/system/libmtk/build_gcc/StubGen.bat new file mode 100644 index 00000000..4399aab9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/build_gcc/StubGen.bat @@ -0,0 +1,73 @@ +@echo off +set GCC_PATH=C:\Program Files\CodeSourcery\Sourcery G++ Lite\bin +path %GCC_PATH%;%path%; + +rd ..\debug/s/q +md ..\debug + +cd ..\source\modules + +SET P_COUNT=16 +set LOG_FILE=..\..\debug\stubgen.log +if {%*}=={} (set mods=*) else (set mods=%*) + +REM ------------------------------Thumb code compile----------------------------- +SET CODE=ARM +SET COMPILER=GCC + +for /d %%i in (%mods%) do call:sub_run_module "make %COMPILER%%CODE% %%i" "make %%i.a -j%P_COUNT% COMPILER=%COMPILER% CODE=%CODE% MODULE=%%i" 2 "..\..\debug\%%i.log" + +copy ..\..\debug\*.a ..\..\..\..\variants\linkit_one /y + +cd ..\..\build_gcc + +rem *************************************************************************** +rem *** run Sub module +rem *** %1 = submodule description +rem *** %2 = command line +rem *** %3 = error direction (1 or 2) +rem *** %4 = log filename +rem *** %5 = log pattern +:sub_run_module +echo -----------------%~1---------------- +echo =========================================================================== >> %LOG_FILE% +rem Reset the value of SUB_MODULE_RET to FAIL +set SUB_MODULE_RET=FAIL + +echo [%Time%] %~1 >> %LOG_FILE% + +%~2 %3> %~4 + +echo [%Time%] Executed %~1 >> %LOG_FILE% + +rem Check if the program return success or not +IF %ERRORLEVEL% EQU 0 SET SUB_MODULE_RET=OK +IF %ERRORLEVEL% EQU 1 SET SUB_MODULE_RET=OK + +IF NOT "%SUB_MODULE_RET%"=="OK" ( + echo Failed!! [%ERRORLEVEL%] >> %LOG_FILE% + call:sub_parse_error %~4 %~5 +)ELSE ( + echo Succeed. [%ERRORLEVEL%][%Time%] >> %LOG_FILE% +) + +echo. >> %LOG_FILE% +goto:eof + + + +rem ************************************************************ +rem **************** Parse Error function ********************** +rem ************************************************************ +:sub_parse_error +echo log = [%1], error summarized: >> %LOG_FILE% +echo. >> %LOG_FILE% + +IF .%2==. ( + FINDSTR /I /N /R "\" %1 > ~tmp.str +) ELSE ( + FINDSTR /I /N /R "\<%2\>" %1 > ~tmp.str +) +type ~tmp.str >> %LOG_FILE% +del ~tmp.str +goto:eof \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/chip.h b/hardware/arduino/mtk/system/libmtk/chip.h new file mode 100644 index 00000000..72b4f408 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/chip.h @@ -0,0 +1,33 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _LIB_MTK_ +#define _LIB_MTK_ + +/* + * Core and peripherals registers definitions + */ +#include "include/vmsys.h" +//#include "include/vmtsdcl.h" + +//#include "include/vmtsdcl_i2c.h" +//#include "include/vmtsdcl_gpio.h" +//#include "include/vmtsdcl_eint.h" + + +#endif /* _LIB_MTK_ */ diff --git a/hardware/arduino/mtk/system/libmtk/debug/get_http_head.o b/hardware/arduino/mtk/system/libmtk/debug/get_http_head.o new file mode 100644 index 0000000000000000000000000000000000000000..b60ed6ec6fb32d910fad015f34b98bdcf754a1ba GIT binary patch literal 1224 zcma)6OOMh}6h5~+rZ}2`31$ErB{~`qrzsvU)F$N+Sq+pQ&wA>_+ zn;BBD4l+zXhaZF+Zz|v8QKiriDi@RwHMqIxcSNo11;kkIcSp^+?ytCjXu)2p z#kn)+9CLe28~?w!f;Jj&(6iHw+a4$Id;Ah&$m0Z`u#iL~jjku3jK_5^_aRcecVT{Z zA0(A@6hA%gNJUP5z?NO)fPVAU>cbJ*^IYLqoR6(5%CjRS4f1g35@ zN=3tL)N0LY%WM@(M%9E@LzC9R@6p6B%9+3{UH%u)+~T+idWT}`00v?L2mFX~e8B$z DGI@YK literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/get_http_head_by_index.o b/hardware/arduino/mtk/system/libmtk/debug/get_http_head_by_index.o new file mode 100644 index 0000000000000000000000000000000000000000..a54cf8ccd031913223ed271bed6a43033955e37b GIT binary patch literal 1280 zcma)6&ubGw6n?WwYGM_ew$e1Nb&(2*vFoM=EM6o{Gl`fQXbR>aY&OYa0!>plQ)y1U z=-q<{>8XE&f`=Xi{{j6E1P=vI^%lJ7d%HW`SSt8n=6&yb-^`nxAG=?yaK;!&V~~O% z0@(3_NX`|cU=pG*`tX!<{^|WpbwZsf@2|b%pXX=QWaqMaz~6GXJ^95@)9OvNz~N+J zbm`~~Kj5Pylm>nT@ z%#Llf&F0YTZny0{6qE{u2U@Du-*sBHGt^3%j8^FiTU$1=#*6Gyc4Z~4<@B7Mh5S8~ zTej8g0!t%|5@j(q9iC-Z*<2{W=2?<0D0dj>gJDltP4vR?d`BY3 z-qMA=CqQpo!UDZH7=Z5dDIj%L&w<|R_j>j=O0br03E^~`yTTs$ANC*a25M;QCwwjK z|CW!*g?)Steay$?zF|T`PaKUWT@>3bKMtWMJ9PV?^NtxHgB0nZg%clS0xfV|)rH zH;}xD+!buJzA0?9Px4z4LLC#Y3HT=K%2@hwJ`6v9OP+kltsXF;zba5Z49Oskh{1L2 zgYOuho%9hm9}J0r76gdS=ELrJ2NJJd=ae`*zr1ChAOsiSE<#e#m}!N<_}ip?dxlLK z#XUcueT^&FpZ{?67Ay)_Y=d4Y7}({X6w1{N;~#1;OO@(szG7B6uN61V&HQSmXu`{$ mNweb%HSvu(LvX`${}S$=&f@}Uy@^SH2KppkqBg~N_$UTL4YZ2xVPC z5>_A#xv#4)SB;OQMC@KKlz<1J@5uz5#m{q7Wg4zVUPNl2TdKO;gR|(llF(j5^7IGW zY!yy_o>X>ZA|IpGlgb-gm^~qm%${v^&BO7aZ98tbS}Z=%l8xcm>DbOhtEN(#(HFM1 zqi6JYnRF(X+t#u?%QKLFgcB^=YWIO{BMs#b_8vD&d(YDiSW?0)!q$T~*)4WEpt2Z? zvkm1T13sDzgw;kAj)y(T9Q!R7_6GsHYY7W@do%*>49OsMhG&6yhJ%59h!V`jEg_tK zdo1jc|6%_DcTq#-UGlY5<5xZ>2>SdEV#MbJQw(T`6HclbzEFW=Q8?kV5j{>u~VJow<3jI3>*{jo6IY1iHrUq{Q4vPgaJ4E z+!MHvf#SgnwW8h9IquG;EUr%akQ<+c(cYLF$S%i&uz4Zwo4<5br*1;?u%F7LpWfUPcYqp0JM-!Inc2l|y-FsnwrkT=YF yrP3%j&1Sw}ludX)Fll9cohH67X9BMI?;nC{8N-b|LsVA)N{Dg1Jao@gJoLX>k%-d( literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/get_today_from_2000.o b/hardware/arduino/mtk/system/libmtk/debug/get_today_from_2000.o new file mode 100644 index 0000000000000000000000000000000000000000..c566febdc2a632bb45ab9676554b92ae9e322063 GIT binary patch literal 1228 zcmah}&2G~`5T13M;?hb@OHrNhXQ3daq_vz7i3lOl{HMYtQWK$yi|Zt&i9`rETSNpB zufT(Fo`Pe;tv8sly|EirVx`^ho0)HCytB5y)XX|#48&lNfzSeI`bNCq2{Nz( z3M9U-K3_FIRc|M?0c7N#FjFrQXVRI{Q1+GPt0PstF@V|Hg?0>?*)NtpE}#E?C<+K{ zsErecTYTKNr`BtCJhJkJVE{BLl_y%JJwA1Njyu&F*{o&`xufNcobf)ln=2N#wSr#I zb5MGOxopSo4uNeWjh7A&9(Sq-`@3yek`%VgHsnoqlWoORmSib*SK48qPo^VocM-Yk z<3KRid82dZBL}^2a~t&TWCFU2&&O?2=kx;Tz42(|yhRDt(rwP&VfU0f6LF~j<2{s6 zOP2yE^|cvr0y*Hf5SIf^@C^eRBKc@P=@gs~0y~CCeAV;<~!m4fy958e2>tr`#K?mb7V(z%dbf$ z>7|IDk{jr}j=nXV^n3}N)F*LPq+nnm+8a@qV$l)x%kbxKG#2x!ho0D_3RF*qtuTy? zK?>LKywU8Wk9+ZOOC0Wm2C~Jt4EHa^{d(28Z!y1k%X~o$uE7pcQqi6biNPMC7}U3y z!ayYZB(SNk>k_V4e6)HG(j3x#(9Md0OX)?W**Y|?l7iJRTji2zwd(bDtz&gcWwU0% nhml2j@!PcU>vE^ynT!7h>SGcgs)(qr06axZ;fu3JHeUEY?2~{k literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/libmtk.a b/hardware/arduino/mtk/system/libmtk/debug/libmtk.a new file mode 100644 index 0000000000000000000000000000000000000000..4b3feb1efee82d4ae14da2b78d512187c4adf70a GIT binary patch literal 975864 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

bq;^`+$Y& z=^L;xxxUJBY}58_F7u2u(hi-}Wh(~sAcg^7%l zyMH)ZXnmL%6z@Dt49TEaNG6hnWFns}GLi3ufQfs9P7zNg`u7hX(YG$rKiti+hLWYv zVm@q+{obF&M**`zw5Mx%hY3QO5qXe&f^7u|-Ov%SGzRv8XTZ3fzn% z<7TM06F(8^alhM!coAVfTzn6DK3x0|dOlptGB5V;Ax#m<7xBy14$sqXZ08koiem)L z_1dZHe&gsE!eLdfm2=^GDbfAK*qCk}uNFpd(~ooU0CcIvIOO7&!nnE(aoO?zhrnON zHr9riRET{jnG`Qq3u9tJD!<9k37j+ec@W#^SnUG`HmZ)D#LtafYgu?YSZ`TBsC-T- zE~;-i^-BUVR%_L*8hSyPl&w8A&}KM!pU`A4Yx;dOnQYi0@f?#Yn?? zxf{p?NVn|D_6%;%NXEHlMy9RX7b)C%7^$hi{39cu!Iq3XiY*yAOTT91-fWEA@7EpR1rsQG7R_r*}e)RoL z=8TmVono=L_9OM=Skx1@Yd=!Y$9_ByJspK%_@9@hXgDRrw2mgK{?pAJZxTSsg|#vu<4tNp)~ zi5A*)AWG@ZP@|3>0_Vy+?A%u~DibqC$NscsqW}6X$?IHgJ+xKL5lK({vbDqWjQ6=$5>neCHLrtVjh(t~SNupsKR#AG zy1!WXxrlzTz~j-z)8eKdw+nYcky?yH4o>KZ>Yw-dvyQ(J`1yRucptmKcA}tNuCp-E zj>o(s|Ek!sO|gb8+Y~41S8a-;V~KU+w*2$&tA0jjXQZ!sgXZ*BS&EOR8*{DJa$}|W zmB!rk;w-1J?L)iJyw?q*T)WV>FZwK=6I-N&xICnuFp&Dm8cv+d7Lj}rzijRBJUo0*5>neCHHTs~46{?$JbXCZ zN5^pCqmDnizvzsQ)N_4Lg>l^U<2+>EQ;TuPLlalO_l}2YY5xm>pZ7h&!-T?{#>Rvw znQG7EWKtScoEw>0!E6GeUKVT-S$DxGtiM3^>d~%aMz9-3M?BaNFa`M=8tJPe2 zv9Zv6zPW%)>PtrQo{I2Uq_~Xq9piXfM-Ts{)VPeKo*awH;;z8WIKoKkjo>FjJ??iI zN&fgS@-683FmfYo#+Ptx5y==?m{Yuu=6dbaH6yv-$gpD*x^wUp3y&CO zxQgoD)WR?~{Wv3k5xUf395V9pFs^2z{aylg3iH8!-gldkk%F57$B1rLDn=u#yd)1N za6aVWL2SvxD*f7qJfK?+H4@W#=s#C?(l>=0F!v6*I5Ryn*Hkk_HddFXXZq82oWea7 z;qymvx%e)2lo6iR-+YFVEs>Jqa*=v+EUJs!2mP`!hE>c%Wn#42a8C) zh+npLcpffBIX9#@$Fi%%PF-^`S~ngpJS3`W>vFPKcr>!VsGgH7b!oZ3QkS;h$-qtF z*R1sEN9&dn-gldeZoy4KqpO~kj1X0^2!Z^$;rnUgCkjgzgJzO)yo z^rII(e{{H99JDd&Od?q}X{Y)hv@!OkjZq408V{vhXKZ7X^b8=(p4P zzOAlG^5Naq0ZDz%@@+Nau-=^K+v<*m*aM8og+B)=lM_<;P1}*}6|7rNV9UBSZAx9Y z-Xk3@iiqj#91n(w=VRwa)vZsi+MU$6xISd3j}7@IpjAfpq_Oi1bZn8*>avr1NHP?0 zyX>UiNT_vlv$I!ij-Be((Ym->m-cIO%u=_OHb<#j=WTPGu?uc0FYQ8}nUQv6ADi+( zwmz6^VSRFQICf`iFm~q$?-$A+ToL<3ikCHR zhuOPyqPfyooIcUFHsyeeXwSmKfv)FJegfB#&}VF8a^9|6XPL)rz{T4N-Q;3ea6Pyf z>Sk_jj1nTft#M2m4?XS08?rBEwt0N|bNc+eb+}_3v*gK+SRA2Cv|9QircMEQ?EpYK&Zzw zZ^pLBZ^%Ui*I;==r{os{^0Y-p`<{mi4y7ws z`s;EM*vk1?LCR@|=i%f7kpzbd{|5d}oaBBZ!-cZ(z%{Jmo1mgIUc6Y~@v?AoH}rXp z!pXWxTzv=ijN?BM`1yQ9I2kRtX^f0&XSO1p=s1^jHjY;k*Vt-1rboKK)B9zv_qWs- z`#8%S&>s-u;``8+JQ6&I+z6{&M*5Bif7wclPAT&)BdI6HqMo>2MpADF6#}6i({ydg ziwN^!4{&qc6c5}+IhvC;+(cMNj$t8I-px~ zOB`;Se%zL%Ey`Yu~$ObKL`f(IgoB=Bp0iA4#-9Fkz6Dn11=`d)7Z97EnVH|b?T(= zsymPA8G5sj*gx}6m;bTzTs#JeeOQm?`&*wjUr*A{(Sbscvz zcE}h)>Ir|TFYXH5j3Z-GsaM8NgnHcne+63!{}voR_2@r?o_@x3OgTTi=EHO2p4+g) zr)_Zr7gT}n7R1?xAI}dagvuwmR(K1O*zsTJ2tfPp@>ZTvBNAE{uYB3I(_yv=g%C`l_|L+4o^EJZ6 zGKE(MG&G}C(?ZzConDe$WI&om49YaSCU=JnThCHaV zKf=&1erw2c?#p(@8t$nGpF@gUhdzrPWrU~k@f0IlA|;0G+KittgL-l-s*Bs@BlYg2 zLLk&*nl2yDAk2r4{~dZheEeJJ`S9`ophE4#$DKIwS)?f<`67PV+TnTlNJbkOD%=AP z^HhtSy5=MI8yPPAjPbxVtm2y>-5+iHdAw>E;HDqv<4)*Oi*d+Db8h;*Qb)MRb~wHm zc#wS&J}SV>6n3@>J7)`@c&dhq zbv=3Sp2YR4+c9pBOmUmexJjLb5yox6xEx+*qj{>;m%L+rMTE~4#pT^a>?k8VjdyF% zu|-ON%eyrw$+4&}Za!;_Blh4L+iKF}UbWb%Yu-iYqs=#8?W82H?o8-G*2H;7dy{9uIM-4~ zmI9k%0E${3?kOHH@5nyII^qd_j6EXrClIHCyPIO)C4ZyR-oEp$!`AdGDPrGcn_u?B@>TSIa6O2K zm^pJeSI)`lXYo06AGY0ZO1s*V%tf9P2ruWWo2F%k9kM#(Z*xFmNp)3yDI%C47`jUZDxSt|q48>)j?^x1af#(tC!@zf-XPBVVLQrfzhaV%%hk;qv>9gMtk}o{AEp~Vw2Hs~U zhMeN}AS}09?9?>_qu-~v-0#r6tEk3moAwbm{Wt?Zj#$)U95S$qtq4#P z>;HH**vb2D_jlNZ){}#(d}p-(?8B&hBoC`Nm*nvWSOsAoYAW z_zLuVIM~Z}z886+fk?iHU$%C59u7v^?S=~XBVogRJ9W)L?l&?V8LQ5Ijp+Vj;US|8 zS5d8dRSU!1^y3`lJ)#!lkc0m=jH_+_!;T-dGbMaJYz|t5HU)#0W>$;Pj*8GUd5qMk7?eFcAG#tCm`fLmuu6(BzTZWp&`f^;lZL!1ia4^X(tcC}$ zQ}3Q#n1zF47YYaSertTf6xt19p*aAvk9nBF!{l%1+O`$?&rOr`tw?ZLOPqm1x0d+-z^TOuXTwFjvu$D+EpD{wQ8v=dUV zgr5lYxZkx0&mqi*gKt64hl4+Yo(~7Jd@J%Fk*0{`i}+=0hv(s7be@@^LKz7&Pqo;o zYYvuWm)Z_HYwWr6)D)d@)7n0)hH1Fz$L&GhS86d1?LpdCBHQ8cU27^{cvEobl=Q3? zViGHuuVf>ir{wX0`(yzX-*!Xq^;VMmkGrvyIAr3r*oHx&O@W~l?Hm-8 zs5sYj{_U>>17bY+cjMNTF$wm3qc#03n+*GrhlhFHfrzc<+K7X?vd$ou_)U^o*k-9K zKX1j0lEdt!y>bJLI8 zi0sRx7UPhI2gA6!jqqv5kI@}U_*_QX48ua3g2NM`V&)zc6Vs=zygzwvuC{gM3Ge=s zS)HwsaW(62Y(KR9b6>4}@BSU7PtI|*lymjM$8J;Wr96xkQyy4f*DI!c=61Cj-`!Y^ zZ`=Br`oz(~u77-g=#e9j|L}_aE@CEce&Xm8!Psw;Yy7yFJ?ectN0(h!Y{$pH!;UiY zFs%+vyUi9UF>W22dU7o4i<|Fd#*sQS^~(5(P>=iFI`khP%*S5*3+VaOq3^&!?0n%d zDcst8EO~xQ@)S<|cU21dPtvo3l+zB+!^d(Y!68*Au7zQC>Y9&_g!||icGhEd>(s?a z9t$tc`_)Z9&d0qt3bh!Ad~|s@hj5YYaJ(3Jc;A!xXcb^@R9bQJQ`1gF^|`P<%{Bqn zr=P->eJ^|u=)RZzd-rDQe;y6Y&-8IP$@S?w58WAAzjP#6zjX6wHizq%Zd2=*UVT4x zJoeIZb7i`ul2EV}>%p}ZsVB#xs<U`PhmdLeIxm%reLIIix8f`67PV+TnR@#RnxJwH;F9s7-y< zPF>rI4@dNeoq7J<`CW^J=(ygZnlF}ikrp@oxUI;%rxxRoh4!-tXY8UF*jzaTIDX4jIY& zEwUYsx_Gdq|BHd2_uXcs0#4^|l~sAp$UqgRieq&ihci*hRyX!vZ!~Fac9*|VS!teF zdcHY*Y@ykhU71H8lgi>gOSY(wgm zL{Z`0Ii$s9mfN?S zukX1k$*Z?j=t*oll)h)iArlW8b!GcK?fBdEJ)1(CO2e>pXU1R{(`PKs#NNbpq1yI6 z`;XI3vJW?4u0mw#(#e&XW@G92@zrJvH=++&Xxe_-v+!-apv%afH2ZK3I<`pZbM3=5 zDDj;yB5tuC#6Dbu!iXqgOFgD}Gunq=x2{9-#R^hRJ3LRlI66nePwyI{PQgtFVx*X7 zr(z^J?iBk~Xd9B{>|d#3%l?%b{U{{6$0zn@`=-x-uIi)uA&HF3*`WRvC!4X{^3n;l zE)*`aFIhRIE?oZ!vs}CJAF-nhl{8kKvC^Vb%D&4=>dCRFCvKOO)Z0mgK&ZzwT~>Yz zVLo-~KZBmBTblE8+YmQmzW?9Du|*_b#4lSrJP#}FyyDgIyJBOT*{SO`MD8~-?DV4y z$JWW)ZIt0Es(WMJwQl(UV;#}wjh)HLz3 z_DXl42=kj9tzt`#*03c<*=9wK2K_E8tr^wrV&?pZ;i*4t(f^~B%05moHoB+cJ-#t{ zKJ2ZBwyNC@-(3eL@km*0k-4=*=jKI~~6 zTZGI=5<5H(FSkY#9a8h4b>b!86Gnz3a}u!+Cc3{En>UBY%fib?pwDX*UVg$HT-CG5 z77_CDmje%<%Lp$4o6cP>z)@xfA_^ppce}?Aj3)NEwB_AiP>+&69x-WL&cqwr4sEk| zce~PyvxJ@G zM=pKHzr)OwK-%%|Pdxd@K4M#>JiGQH_2gL87k342#*z0F^?d5q7oq3FzxSZ$!@m!q zcLYBXxejjacE&8@a(Y#_uF6HIoDDr_2aL~;ST?)ia`zXVaXWfF6!ZR+T+)dojZvh% zNiD`eX?ONh^h%|EB$rm)b_&dNnMI?knvU*~@51LKKvhP7qnxc4{E zN%Q5blaU?1c^L`5dAThZ!Od@8?h3wn`KQa@k1^8v-evX0)yDD)M{Tw+qJF?f-1)eD z_{Tlu;|_I3`j6#=<;$&4UqF}-AA31p&S`xK>OV>nv%?P0V;|mUl7dUmCtD4}?9_FA zI@(t0^3ZQS*(`kgxH>DtM{{nvZ~6=2xoZEjfj`DatI(#w(NfJ!MmsLgHHC@$63275 zWukvybW%OJ%VTxO!PS}OqMo|44>`#84iP?Y6t|x2+aGP0b*3XF&$Sb&C&!|mxGO;% zu@kB1!@*ae=flBX)|1t@_Bc<9*%62kpG#QOHGO7u%_84o11@a&K70H)p5E zYukPvuNDTl>Brj@AA>Hn7>9PE{XH)2Lc>(e!D)n1_>VNzdooPQ4_e8+cp@EzaqWa7Fig|)W|W^EN-Z3~NR zHGX5Me>rH{dkl|U4*J@IYj{>{k&@wZa1BbrKI)6R0ypCb2iM^CsV|?0o(~7#fu7-l z;gQ?F@?+@v)R(iYFYpr56p?%pzijRBJRG$1idV<`Xs*{zU2~B8jkseI-ElfaXI`ZTv(;4k7})M6ZR@Nsi+)m~`lIk`9=>`&rgSa3a980zM+2u);_mmQh7w;~^* zcrwv{uAHQAR^m+T^lfwM8Ux^A3zH}g#%{}FDO_@S=sQQwM%aaR8Rz-2Jh}Dba|rX{ z;aku%d}z zaY%hTG$)Cxw@>I%eJ~~Cg=<)S>uiGDc^LH=9kXBeNuLS>?6arM8n-Fg=S(feAwz3n zTwRxT$M8HC?C0}g*R7)kHwB_m<*XESViyX`Pui6W*s`v@j4j9HwCKkmjoo`Id-p4g zQvapbwf9`pn4B)#m96=i=NdChCl`4={n+Qi`i_Wj$>pK%S}itPnWmHwmxt7oV^L4s zE)S`F#p;bUui-w&V>tE|KTomkgY;o;yBk6qkX6afv!#Sjugi5Fqhd%ejJ#oz+RG|0pfY z4m&)LO}Nb@1=mpF9{d~5*r{s66$gP&1m!Wst(LN)gpI8 z`)Ko(WS83Js{>cVG~D##ypuXG<6Ki6II@sZ8u=p1nQgylY>#iB_l{Oz>V=YC2bQjw z^l{o%oyC#1#4fH;Wma1la8NzfE(d+*0NV%-^8GK;j)P~R;8XYgL+F{hpk^x5cKesF zAnXWt1R^DzTifniho^$TEeNO0#q;C&^1B_FgrV%h4jEg_KuIrD2po2J9=k7U$LV!S zJ8>|&MuA(`b?w09bxNz@Mc8Mb+!o011*ye2en1oO?`f^NuzkpBdVK6WFrdkG7%pEgq`AXfi~tH=TLo-tB&KIy)oGTMznA?)}`YrF$n| zs-3UDgH;C}n7ga=TAiy7+!3rg@acNt>d&p~J`=tA!0m@_pZu326C)gny&XL!XH<{L zmG{}_{0~=bdmEQ#uRox#je&j0Mz;5guxwLYHol1+WrVZL^OjL>GkzZp{KA2Y@Y|wq zujUr@Z9O>_^~KF+k#WREya+eTj0p9(-?b4hAi+iFQtGy zvYAIcITn@0U4ff%gn88CvoAtD?su8@GQxbA_eapP%bA>?YY%=OdWIGHm zWyb}G2je2e4R8(AMhe(~_22;QgM(KYEnfRx3*2|pi>utaj+LfBh$evF_j}I#=A1b* zyK`p5^-A46Aou*4-#IgLX3l4R=YQ6EaL5AYTdV$$J^MyRv(3R9^^n7^ zvhP%VZf<31nq48?$UwWS3yWL^ej5kM$euL4k1Vo{lnR%Dl#_E&UfeDNDd)q$mmufE zz)sG=>r|b%#tc?Qo`&|ZZE!Q{#7BeFeHbWpV#c|OI_^(;;1;!37-@W! z9Fzjvnu8*hk%M70TxS{wbsd;7mg|k{vTblSrEM^{H^QOUHppCv)suT|gDP8M_2gdL zpl;_gxuaeDO&UYJNo|7yqn7n#Db?B91|?Q{+aUDAjANxoyw~$e8aLB?jqJWR3J)i( zk$9gzGp^hEQ7Fcuf)tY^ja8 zbz{oOxhN`bw{A>1pStlm$obTbUxysqeZ{jcfGly7B&OYZ?0QF`Cpy zxS8`r^qsO>=hXC>sp-YV<(a9~h5v;V>`ML5yvK$|E(ib8lY{Knu#J=qmxGiO_EBEk zE(a-Bra)jQ$28r3l9v$X!@*9r5&nnZ9%xCvSV78Zhv(@VE=Lm7d(j*2+o|h*l6xca z`Szl(g=x6y$NNcSFM7ry2R|3a)!(~$$DgmpG7-tc4GZ)ZQZ9bT4~q3 zx}^0Qn(KvX8##JGXAlde7;UlH+oca>7Q+iQDBQ z*r7N91v1N`*U&2d`f(jm#+xz@bwn96 z#Uz-P{Vvk~8$1BR=N^t9lmgp|dm@vmo*YI}dDcqj3wVbWpqD)75sw60j;7BeNm{pX zxeM znAgd=Ze4C7xChG{IwijtkcW9u{jE>wZx1G>uJt`vzl*NRs%{?l$O3KL^qX^!aq@D{F0d`QXNzUwUL+p#E~UOZ-&kH+RFz$jFSUJdDeMp_w!WOuby8|=Tq6>vhO*R-7=1()pO6P*ycw{!`0|~KK0ylIHixy_d4VZ z3$*^ht99$S?HCX9MV=@yk}u*H+YZm8^VxaDyJNk#mChHf7su#^*3$o zt52@y-UC5OF%H>xzmBMWspC~0|Nk8L@%n{2pN38IO0F)<8EUve=}*(|(5^?x)enzz z+YfEG_VJAFTWpW}Gy4`7561g)U-|&wV?FjyUBAlG9_Lgx^f>3&o<~K_XPp?X57;Tr znfjy4p_1ZYfD%~O59d}}DR+cXCaq3I@EGGaI-YHepZ}ULN&6MIvHxPe(Wp;N&(2QG z&rQ$Ht>DpjA@}U|dVWV~T<-bK^LS224}Ybkx%wUD_E)ckC$Ur4bz8R$ zZ#a~tqZHep{hrA2qG~fd8iu*)$LqFyMwDV4>UaM-jH}xOOj_En2jA-VL)!G5Lfevn z(c+y+=Zi+gbuu4Q`Zp%B^>6I;ULPTei*;)sckV4xxc?@#I#%JzT^n_^kI2?XwuXDS ziw^kSJGw{r;-tMc86QKa1LDq4&NXJ{r{<@ZW*575{ImTo3ZGmqUc`Yi@-D63`z$lq zGE!1pE>cd;MR9SvT%_C(1p-4krg=Sb@fo>^;2tb*=#>0oKprmIdBvRKbF4BkW$e^7 z7kS*6eEZTJ2@`PBk8|-CAxkO7Ar~JC<7y7t-{=7xTL_NxxktEY7u+;5+Opa7#26u} zxDK+h2Ah2!Y%gcu2kY^=?_+Ev+uAX*ZBzP~m*l?Rq`L9Y#>5-B=ESK_4rj!LNbEvA zkzVwP#O={B%#2T65{fZa&j(;in{_g`A8PBy)b!>+}K#+zU>Iq177s+NTo79j-HT_(Q)r_FiGS8HgS%e;vgr>%$#0X znOkavIPAuHvw5Elms}ox4=-dH??D<5?J^JXkT)(5DaUtQjJPWZV0jT9Qf^p;U{j9A zT^?RQm=6!%f}9Tz+cEy{d7N7e?;*+9;dyxY@kpY5g?r#P_iLxFdC23&lnT3y2dN-7v3~1#$#lrV?q+R zF6M8me&ap+#>TU8(tm&Vr22Hb+Zk8pW}cXuoo-C?*>s`)XzNLQFKJv}`tI}2c0t=n z337Q!IXM^Q#qIKva)T5I4CR=n%gc3y`S9{>$Qgd z@I--;^u#Z=9iE4m(KQ77R9i$%5?47FdenI7A>)NB-yU>F!!+!xCy(R2WWO<`7>B%k zFpR7D_&LWv6ZrYuBfJa?Z5k#+!OV0tF@4$?$0ic{UYhET*KQl*%G_g9xc9jQ>_?!o zzYCdY-f6=omx&kgQkIcHX*%SyDih6*loFSTl;e9YM%*qFDQA~k$}!FBk%`a9%?9^i zc|)h<7X$Jz(atO86rW?2i78{Ju60NrH|9EOW3&ryIu@-$p0)qQK9SDL)@_V?D~ao} zHfN)Ey*g>_nRfQS@XlA~mb$i2+J}q2x?(%HIA{v4Vrdc=UxJK}uGq=7XFAmlRnZk{kX2kXT+;u9O{a>`=m{w^`T-=yz?+IB!l|Cq%d(TvEQXB6aDvXPikvy zFB89fdTzDRm33zy9{R2^(+(aEgyl`^mPtIk02v=1cCxLpZrw+eOy+y>>)hrrEZDF6z)!k+HpY#4T$6 z30cVR?^U%UhJ`kbhM{2Qc0?1?ryX(c{%m^TnD?B#PV}vC684GZSzVp!!gj=CVaYXZ zdoB}w_j>O!u{jf0t$dDZYUY3)o<~2l+ZL#aajZ@)Ox{ji>xa>?Jo(ljH1!KN{dj$u zec6-}Cgxd#Pz@xJLYt1npm1l^5ak43JUoz%hyLqUC-HFNwd`}0W!$!m@sL--9=FXq z?v2gSbr;E>W;&wp+SO+zp}>|B;`XahPR>P9aaZ7G9C>b(^BJ474mqFt^4pNxi+?e4 zeePJrcJwuOYHW__&y~B?ch9xC?vad8cD}JWhr=}7^y55~u{n%$RbzAFh1Z9SPI1q} zNGA#02lJP8>MHEywQTk!?*-blPTk2p@LH~67=DUQuPk?nTawJ%IgPF{TVuETc^-*xEa z$)D9;ocw<6^OGN&|Gif@2XJus!erqW?znX83p-vMxbTs07M{QDg}$%faPG!$6rZmQ z-#5H-_*aGtSMJ`}^2)Y1&P~2Jc}33?Ja}UA_GA4AKRSQBR=Bcb6yn>ye_Pd z+kGs>AoJY%c&$_@lyNL=T+bUpe6geyQ#b6#zqH#?PR>PHal85_@GK6z zPDfxQJ@Jcehv#9comb4MJxI7AiL0CoJ;;}mI&MNrq28~<+~dWI*w{s?q3EJfSRj8YC#aTtvrJ1=!@b=5NwXW1t`Rx_M zcbCRx>Yw328R2P6U4x8mq?EZ#U4xLEi}K=jnM%1~3Iv97Ow(oRO9=B}YA448eJ!{L zT9PkTkaF7Ld6;VF70+@vQZ>4uox0XjdEA&%VW;uHRZ{UyP*Lr*Z2NgWez&x7(~mQC z1cH=e95VG09Z~)ATXfv<>q4pDk0?`}!kfxaM?O0<-2^<=^BI?gW<7OS|GNCMI;#_P z*gK)a-Wkzhf7jAsZ@qN$3zgx*^E;unQfIwqLnca;p$Hz=cB9c!G-(is#Q;2wT=t_L%9jqk}p<}a@yf}xEkeR zU*Qu-bv`_aox0{Kj~i1e>^2^_N-DkyDi*j-g)v3NVd`Gmxar5aN?n&yj6<%v^SBpv zLh5$_zrPds`P>t@>K0%>y1KD)GB%bBu9107eU$e>eY6gn`Y7uQS|1%xUIV$bJ~}x3%kyj@I6qmqe~VftXeX#Tw6URD0JeOl|KM*P8yfn^ zeBsLWjkA*zsQv%w(z}<(aox7*fB3km`zwa7VC6K6q5KebAw%tNjj+sR=nrt9jO4y^X}Y@Uw-DyT(7%A34@0-$Bt8rs@?_{i zTzID#TE#tUBTqy7Sl{0ah8~gR!>29jH)km0Yyv~w0_?|7H #*)E3Rq;=T)?kyN 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 Th|WX`n??24@i4ri7=PkFhP-J@ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/srand.o b/hardware/arduino/mtk/system/libmtk/debug/srand.o new file mode 100644 index 0000000000000000000000000000000000000000..3246bad9c2d9067218c4add2139bfb3b4d962a83 GIT binary patch literal 1180 zcma)6&2G~`5T13ClC~7ustBh<#X>=H30*lQ5>bT&X?~$Dk&+yGGfrZWNTdO0i-2)`6Hu}P8)Vlc*d@ku|8#XGP&Hgk>y#Qf&4R+ zyPn(X0oz6x%hwN|H;ad_cN(yu#n~cTk8ZGg?0!UN3AV|$w5JUCaMTxW3%&5A?<(Yb zAGq+o2;d!8xWHS(A#i^{0jV=Q3%ot(_q}73U@h(n;rCi6!W+_y|DQcX8MSgDlv6+L z5R;3B_yPLG5R?0c2?ITGw4QWv9FM~|f}ZR&n5UE6Hh?rzq@UHPTBKIkLQHFRi9|ca zLF<%}j`A-=(jMA-1osz*NqN7P9Yf?yhZH6CXU?I7L z++7^>eycdBPwHC{f{BSbfzVW46)Qi>N8$Rf;>kyX>Qg3iqXOllH};I)_BP6MlO?lH zCw(l)Ptq9EH%x6lABBx+5|OM&J(f2Ae09oXHUhU`3n8g!&AP@QB~!snecPLh55k!G zx~AbATvXnMlz>zRxLvSt%D*jCYjsN|!Kv7_{k-ke%H>9>=`{2EcFBRyedoO=9K3%H f-XMPjj=J;Ip9B_vfnHz6e+~LgJP<{SaU=f$m{4ww literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/strtoi.o b/hardware/arduino/mtk/system/libmtk/debug/strtoi.o new file mode 100644 index 0000000000000000000000000000000000000000..6fb7756f86974803ec9af669792b5463df806956 GIT binary patch literal 1188 zcma)6&u1T-Z%5j%+Btos##-$RyT*j(RYlT@h-QWD-<^M zJkRqS6z`$jcI@5|*d~UN;%@VPr_y|~-G&7%%3^FSe1)yEtDyu-vJ|_nZ86}J=}6c; zL^Pb?Kt-Vecf5w13R8zhUB+&D%;=f@a?~!DbZdK}(41QtM^)u;7De1L2 z{tqSwl1s>4#!l;tW2bXcd&Lm8u&_sg*Oafy70&Zv`2AP$grS*xz=ZyDpn7<=jzGcS z5+)CQVt#hgM`m@uj5)16Xy@x;SPzOANk7x)&d;xInG}Rz5!C&oF>4xwJN{UCZoyh* z-t_8puB#e8<%i1qupwY$AGldI@KJnTZnSm{uL@S(Y?X?p)vDFn)sEFEmdvUJ??=`v mM_Bj;TKEmQQ?TS@WI?`3-27w2#4`SK5L0+5=>8<|W&Q(5#&Pff literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/stubgen.log b/hardware/arduino/mtk/system/libmtk/debug/stubgen.log new file mode 100644 index 00000000..b3ca29c3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/debug/stubgen.log @@ -0,0 +1,5 @@ +=========================================================================== +[10:09:30.53] make GCCARM libmtk +[10:10:06.53] Executed make GCCARM libmtk +Succeed. [0][10:10:06.53] + diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm4res.o b/hardware/arduino/mtk/system/libmtk/debug/vm4res.o new file mode 100644 index 0000000000000000000000000000000000000000..b319b40731ae9d6b693aa9561d47723a94f78bc3 GIT binary patch literal 6312 zcmcJSZERat8OM(kJ99Rta@Ul(!E9C+g!^XVE^FP9LGxy3i?>#7q(#+)?ZmgWnUfUf zX0&W#1qG=BG!3y2A*xV>f+!M$50EdY5)o9QA1aZcfvSl~)u)<3F5vLd>^>gmk(-Cf&j66iLuv~75s zj4@X5g~eXqN;E9iZ&ngAPV4inL*J)34^x~!Rhq(Cigahy^Wm?}IMx#0G4#g3T=KWO+Qak3w(xxN?WEZI$Vyju zPk48@KPlEfQwdyoD>8RQue5~Q=#6fXPncN$*Tz}3Hn4Z-_C`}UGA^QjU&T9A z|2`*{%)2=DN_B1c!-iTL_`7(G;$$h#9T}(oU986WA&c`fmpF?QXQ5%7>exQ08{0*f zv3-qV-TWA1+g+-TE$`B&Q<$TCC)UfF-1h!wPXS;Zk9CXK_|(LNHAyCvE0(kA z$s3!ot!Z@p<84on8S17MZH{`W(*T`&_4Q9ut4b<$VdxV=WSi7A_`}Xm`=@CKH`9)7 zl*Iy@8f_n)!=BrvVW2mYw~H7)X01iMAmue1?4W-^x8{0*f+L67Ox_{7KsnEv>)#_g zRU@h^#%{Z^GiKs;_3?-{g6eoZQXg;(lzxFR#_<+o_+MoV{awb;15T$^ z{4ita#~H&v%NY9GjG-?whW>BH&;!m5Q2oy{hHf*4|8>UD|I8SAw{xTP{4j=oi81_t z${4!Wxv$EYb@tPkCcUnCx7JVIgE;asz7JzeGWC8e@BpB&Eg^P4LU>k0oosJ@`yL3q7GP>7VCJ4c#w9?IqZK= z?RRN6{_oTIA8E%tLBC7wrznBZAENUdV`x93y`b%T>Aa2JH^Ub34C8MRzt8v`;z4@9 zj6LS^9mbfuo!)AHw~=p-*!1rS;-4_?A->1#$B3V$=iAs%6MvJ~jQ{Jzt4yCK#zrB; z_9n0RF)_{!|AyGlc$GN7_!cqd-Pr$!xSer3jV;9Z2yvM47l|W`XNfx*UnY(+zD~TK z@jc=$#sTUGz6Yj1kJAa>8N)qv(!+S1_$cEU;sM69#F$HJHaPp;y4_{;VB%blu7qLjl&@v4&#u(;Rp_KLwE+4NtjwO>P2S+j^y?yDy3@lLlQ6-k4TB>}WyVMo_wPimmE>+=c zJXvYKRmso%|NjO5eUjA`>5Yng7DWxY?%$#=Ozp7D^f-S3n=Yv7)@44+RU4;~m8$Ty zn=bEJklNxtqZRdFFsQrb#!mn08I(_q`qML)Hr;g>0e^btvNH{Jb0~lGxRKk<*kt5- zJ2qL>O{Dy>#67!Tx_TSeZ1qO9$!c;)Y4equJIni28>*q1dIF52egq6+zH6TWwf5~w zsx>dvtJb=Xlv?9L2ZXpl>lpM|YN21G7W#Lo>qpt6CU(g1#Gw-$O0p9|a#$wJ`JrtuJaF-=WZ9>JNPgp!=zX zKfX8c4}$4KgIXB+h}K87{xbN8s)eCn()xnd7s1b{S{V8*t^ZZ)x51xNwJ`K9`i3Ka zH?_#00MmyJwJ`K^T7O;Z7r<03E^Ga&)~{*(I{5Rd7KVSIMa2(Ni}>we`YHV%P&Ndf literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_accept.o b/hardware/arduino/mtk/system/libmtk/debug/vm_accept.o new file mode 100644 index 0000000000000000000000000000000000000000..0e5aebbc81e86f3c10aa3b81e01802edd7429a1a GIT binary patch literal 1208 zcma)5O>fgc5S?|B)}d5QN)bu0z-o(>kk)caB%)kUKAj4eR80;M2V5tyNF+jv<02vs zTsU&%z#rk(8-DhIs^V>;;j$ zYe>Tyh%oycdmL-Nt$t5#NyWj6v@U(D!~NB-s+5toCAdt@W*5SRsELQs#?wwB5g)+i z#_WB)a0=<4-}*b9@~&K%OTN~I{LTjO)PXW3I(%VuSL=veZB znp0op_H%_oM$RjFB?qMkXg4jhI|Pd zJHj3VWilN(W*5=1JsfamTQ3yHdgFl7Hysm{?qmXrJ*I%%IVBHDZ#)`VFVTXv6w`6+ zVfWmzCbaSY8+Xx0tzGf$)ZdQJ3Bo?VjTrSg!6!_}h@{c`rA$77C*dKiBHAAiVOXE1kui5K)j(TZo%|6uAEYt9F%OU}=fjY=lK1Mh18sSIe#$&U2v%Vm zDY@vKO@YClmvU$7TX`vN`7!l1F5nzoR;35K4(#?p(JLxWr6-j}^F*B+z|iz&xuhG- ydc9R^8|_kAuNjnoZaD_tLj!M;Jq06J5^GSelDH8%H;FX>9WjN6?orV6gMn2}r!A)~d~4Ir*zYqNnOtto z%JMAFK>iWhJ>P4zfvq8p<#%@;*NZzZHfk_s#Mv}kiY~L8>{i5N3AV!S80!ppf6x(L z15pGLTbc#_As7Bf0es&R9`HuL4?O5nLhcOD0&jLZ9seC#uow4)2-=M!;rG?c{0H1c z4~=t5d1Sw}Jxp>}mZ668RrVMf(<|Put)Zvb|9zds0e% zV@&^piH+h6YBzAv^DW?_Iq7#r3hP+#h^Wwgb*^z-kHW=YtrJFu-9sgEr32NYFdvqY zF`)O#jkNK*lRq}BkII-YhY7ODdK3~@>arirSjOc2^#aHnA7mVaHSRCnz$2e@UYx|Mg_YN=G)uDkX8mb2}W n;lLLzo+nD1lN)5`0iX*o`3G#r{;+qHYph)O z%lnHi;{q8jO#dsXXw9a?z?iM&_tsvDMQhW&Zb&$3g&sZ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_dispatch_msg.o b/hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_dispatch_msg.o new file mode 100644 index 0000000000000000000000000000000000000000..abe873ec69e7bd1d29a9ccda84e8eda8b8a9f7ad GIT binary patch literal 1240 zcmah|TWb?R6h4z|n$#e+^|q-}SE!N_J8WveAcCg3Y>L|knmiOATsO(m1dNHhQ)%$Q zS0DW|f?$6{|AmjOKJ`t{+1W|bLh!)M_nmXTnKRcfRlCL*17!@dF!ccH(n%CTK^D@G zf~D{2*J=B6<$lKKK~_73^E($yC+q~Qbh4Buue@@SSJyw$|v~=s! zz;Q>T&Tuery8U3}icZfN1cv}tx%}M7Hit)k$MeUAmCG4+UwFornKwV?H}l2fhEd=J zo`=#?oX_>#b|2UV(nM*0_gSm5yR+GZg;_UI0!D_CBBlYjIZyzu!I*UZ6Jie|&%vI?{zm zO6OXMIDr=Ndx(n>C-{L01Ce4ho^&Z}k0L*gNOmk?(#z`u$YF%^vpQ9a#EP59Y0MS{ z(P%zBWU?b25A@ z+{EBDjNQOS>s!J`=cM+E6iiHfB@&sct9*sCaSeX|RdK?2SbZ9aU#dWP4d~vc#$XK{ zI#X%0vy(m%=2aG-Fg%<($gbu!xcrx7y;qYlSLau+ObX(V4A(*`8nY5(K=-4J&h4#o z5Xm1#KAr1w4Es4Bmv>-YzlRVb?}$@V{qn_3-^)11=3s6(*Q-pReVG*$j8h72ZmmWx&QzG literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_init.o b/hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_init.o new file mode 100644 index 0000000000000000000000000000000000000000..ee9df06bb5a609708888642cc7bdfd0e4bfbfd6c GIT binary patch literal 1208 zcmah|&2G~`5S~q(CM80oEtI67;zL2H(yp8mi3lOlG(S#-+el3g6&K^ARuhRd!P%ll z9Julbya(dehv-}MNa2(l%y_-2>kBJ+=lf>9-Ps+_eyv*##u%uox(1b|tszSi^Y(Ye=iy{T>%3c58AuD)XwjZekxV!6Djmw1U6q4E;< zaa^Z60Je!RQ8_wz)u|oqZ?|C~mST%+S$oJHvB&W&%ds`K9@}ETC)1&Dx@d(bZC@eJ z{m6xTA%LGa!U5i$On`eMBBUCE(hKkn0p(Cbk&2Ljnc(xY@sQm15ajp%sJWKN=_kA?g*BnCR~ zq3;2HbUr#S)k)nIA+~4e5Xe4sgm))> z!jG#cwlL&w38H9RgY`RcnQwRQi|((wObX(V#8)lvPHUE949YU(&s4X=2)6@HbzO?# z9C@(32O9!5PJmlg1E3L>{g@Eu6OKCWzVYHq&jtljc?M%SLIE? aj%@GOE{6xBp2?=cKkphg%NyeOlm7vWk$lkr literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_post_msg.o b/hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_post_msg.o new file mode 100644 index 0000000000000000000000000000000000000000..ba3a9f442bedef9ddb0c112e2644f9033a90388e GIT binary patch literal 1264 zcmaJ=L2nX46n?Wn1*@?XOaZZO8ce8dH%ldvcu`6_i*YMSA=-nceWY2%FOnvRwITxGoFs#+JcOAp*^>(_Q zj?wG(9i!9V1<*>R$8xsX-M4ov`#{!~mSnx{Sn{fxQ{U!Ra)rX8oLBNn4vG))S*B$+ z+Q1f(hKgI8k810i&sM51C52gp%?9J_Hk%71SdyjKytK?f=^u0)vw`T?F17@-tv$uD z-aDW)O~(YK(eHy|cPSxvPRWBpo3-Ac1$!x`l^X@&F>m@o@Gh_Y(swp+x>spXfzy!Byn6W|c&YV;pfJ zUXYLKPdxNwI6*=^M2Nm+6tHJc=s%IT|C_4_U)1#p8^o}%eVMsEDJ8!&qG#~oDvH-p zyM=@HH-m%DNxUmksA1s)5idkvkqaEvgYf&W&?!FSZ(t+whnDfiX7^HCa-(&RY z{^&l)^)QW5RhC$9<%Q5h7 h8hE?x1287E8J=SjH}x9#l9&dlBc|}jX;O|K{2%o8lwtq? literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_reg_msg_proc.o b/hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_reg_msg_proc.o new file mode 100644 index 0000000000000000000000000000000000000000..00ba1b8bbcd1cc5bba33668a38627ae4437c285f GIT binary patch literal 1256 zcmaJ=O>fgc5S?{CNLrz!6^JB6#Xvy`p_Wr3sJPI42XF~$a>xneq*fA%5aYOrhyz#t z0yq8yw;p;#;sU>d6R6yJgBh>aF_qGhc4yw3=bhcz^@qCFV2pt<202(DfF1{tk}Jr; zD#XD0l6acX-q*6}8>49UVixX1zpL4N7EUs!){%4+YsR0%Tc3KV)XE4>lBZHuehIl> zKiJJ)<@e9y#(h!D^U3CMXX?}x9sTvpjoXxlyjZwp*=9|x!f!i zWNqx2^0r!3-xRlsJ3D!~q?D8*l<(nshH3Q2!15SI%KLi{y0yK>TOEi>F&1a*;Y;i? zyAn#VG|R9J=`I6hHlH{~AH8F9KN68`zET|Xode2&;TWLwXERXjDFIR!l@chlVe>Ug zu$E#tjy>)lI_B)m0ndTgFh?zpdK&6;*Ne%8z4$8nxEGWAiU}D#ar8auVmNMjIE0?; zBX|DHuM?nv4C#Y9QH#VPRxze;wuwZe^-^xcC(=>=k>@!J@EHTDAxzY5A%Qh5!GFVm zzb(!P-5S>k8T`el=ObQ|AnBz5pTxygBv+72;Gq2_aZsPcSuuoNOayx)>QXLfK|TzB zXdAwT-0D8W^@A0tUKr@!7RF!$!LCmPS0{bM&HHJ@*B1bzv-vRG{x8q#J@>h@>x);$ z1tGWq;(qCyb%_Dpk1*=n3jxp*o_d)2x+dYgFq|NQ}62Caz(4_q#l}%j{m5Rf0;c8eMvdDr)k_^4fmB=1@{~od_)>yy!?MP C?~iu? literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_send_msg.o b/hardware/arduino/mtk/system/libmtk/debug/vm_appcomm_send_msg.o new file mode 100644 index 0000000000000000000000000000000000000000..083fe763e5106679e1ddbcb42908365844ab72e2 GIT binary patch literal 1264 zcmaJ=O>YuW6upm+3Zk(TOaZY@8ce8dCqpHXxKW^eV5B7}M7uByvcj#+;h*H`{vEO!nyGt}?49rQ~-_=m~tdg5pio z?%<&P&EueR67Px>s#y3y#17F{Q=wzl{Wo+@t0W!H{5_Vq~xMC3oZuF5k=6sy%Gr`<#;2< zLFXED;XLEg%KMNoA<+Q2lvi-d?&OQ*U1gRP)IzD8%a+tK=asFhTFvH4TPisZbW_E< hsp9Q22B6MpGd{;CZt4y0B@zIrA;$2>X;6+I{2yO3lkxxn literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ascii_to_ucs2.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ascii_to_ucs2.o new file mode 100644 index 0000000000000000000000000000000000000000..66218aeec6cb54e23c4095c20b63619dbed7373b GIT binary patch literal 1236 zcma)5Pmj_-6n|6xY;j{2Hkbu$w9z#IahtM|NVq6}%f_ylg#+=@Eo>tsBH9)s@!-Xy zM?ZicLT~#Gyyz$J=*5`z#!cU&ozmdNm(2X$pWnPU^JeC4OK&sAfD3~>tSx|nXT-`Y zLLRn3gyrYt!({hO^LsWeRmXAZvh<-1x3|8kQbD>Q!9{MlJQvPIO*~3;o(wXX)EF*y zmhak?Q^^1P#%>PkzkXDCK_5l!RC_fwOlLHi81BrNkDS9*NNY5za=tg4+at?f$Xc-| z>l4?K57mfKaCD?8>&91P$ zNQPxuj$IS(Fi@Pu)HR2QuI=HNYqs@Fajn-bC}*Z?f--a*Q0y5Q#4agiP)4)q)OwB- ztfiQ)YfpxA*K+(r{Rdn}4z)P$bE(e*UnhwA`c=e)uM>R2fQ(2!T2DL?$1UHEAd`GWhupyItP z&%=2skH=~72eoitIFC>WSO7^(uA=i2`gU;8{*pMTPyDQ?!UGJ1uZicQSXjdTDEy{v z1QJ=DJTNhTxB}ISLbzAdsXe4OgC*hY#E-4wK^X1a+CXhH9tCnT; z1h#-a3bAO-uD~GtFR5>jad08q^bP83O2B#Z(<&p_cVYhw6uqJ1RD0CubWhZOcwlIH zw_ekYZoA!U^^Jb5uD1-LJ+)i|f2D!{%3gr6S-|UG7B@q0DYFfrBj)hI&|Wim(SHGd C`h@%d literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_assert.o b/hardware/arduino/mtk/system/libmtk/debug/vm_assert.o new file mode 100644 index 0000000000000000000000000000000000000000..c9fa451231078a4cc072769f3526cfd8e8254202 GIT binary patch literal 1200 zcma)5%Wl&^6usj-NLw1(0>UX4SXGe{(vF-Gi3%Y>-T~YOHCc33*GVlBiI8AV5fKYE zd_cE+2rIhiC-g7aAkpr+gL`9-lV-(8Gw0lMkLQl(@wH-B8Dk(DgEUMcfVv;V@?%39 z79at`AIUdK^GjJvt##wtq6UxS=Z2Qi;6l9`p0ZP@C0-}$-}hB@z6%%0D@D@}A$@uN z``1}@OBM=nsdiTV)VFNUb6i1MtyFrZr<;Rgx8t}Yy_U`DW=}Z!mXR|)<~DQN+ZjF2 z^E?NICup}FyWInpK^iOU?L2LjcV2BaA+99Y99xOrVRzZRh{{rIl|4{47;taY7j_#_ zxIT6zbDj5GIG+XZBU{+O+nxv99Z*2-9M1#q4ElZN16r^aw}o(f?PKA1wDA9H5794>?BtJ)^I;m}+misBhsQLQ#BEvr>1niY%k?;K&_ jJGAg6xg)T`DX|9aRSFmK5>Z_MC?l@o<)C|{;-UTn*GP6F literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_asyn_http_req.o b/hardware/arduino/mtk/system/libmtk/debug/vm_asyn_http_req.o new file mode 100644 index 0000000000000000000000000000000000000000..6d4f096dc3478558c9ef97e93931f616658d67a0 GIT binary patch literal 1236 zcma)5Pj3=I6o0coyV#gQgDK!fH(C=AyICrUgp2Z@#;usbfq2<2bR#5E+GT1a9=v$; z=m+pa=&j$ti+%!+UW}zM-P`-}~EZgdjfMt&u{66O-D99lXJc;l5xL{yP%y`Sp>g{a2kqG67HIwH6f|c-4yp560kpwnJho3z zg0(b@b7#~)=l0b5sQ-YQsG%0Gd0Ogo&*KDPk6%ZOdYs@RCR9X<(R$L!IPQ3U2$Afa z3;yi>PJkRnNFUURS|k=+M^0<@D2PV;B^Jz`NJsgH9=cJ04@jtnFj2RK0jzl{;-8VY zcgu|kUEI|P8T>{T?2FJ5O1=sphMVgcyn?Y!9CW@I4(gNmR;2I<6T#mk_M=?Tg7Gl? zqGR|LT70?h;{L%3R4@Ejuc%YoD6jcTg1eJGvdH^s^wUcR*=jxvbbprS*6aF#)&0dS za|Iz-2YM)^qBUC*gW$WQzCFbujC{*;sIPGe=ha864Pb}E&M|04RmZ9Pq}pm9>i_7# zY#QxK*)ZFUMyK92yXA^eH%a!~<|e*M6W^6H19P>2+rJbZhVD{w1HeE`pF literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_atof.o b/hardware/arduino/mtk/system/libmtk/debug/vm_atof.o new file mode 100644 index 0000000000000000000000000000000000000000..409ba84fc70e750f0a0aeb205929a222a010d88d GIT binary patch literal 1208 zcma)5O>fgc5S?|L(v}L63QAHUuuzd)LRU_SM8pB=ruiti1T{g*&2>^kA`t@477=ma zZZ{``*mFov|n0&o!sc7z1StOqh89UFoFDp}>U8 zFdwqYx9qd5^J%A$zcWY|;9mNtS%5R+ymF$SWEx9PmzrO?x!mFa&Q{K~f^h)m>95qT z);#_Fy-q*X@3A5gW*Rc@iSes2)TmY;8D@KY6!iUIYBY*P!x;+S*tAO4`_e|KQdu|3 zyv$2rKfnW?@AZbj){&;|{k?~soxRJygwd|{I@8Zxa<5a}rYBtnGHzT!?jl&QW=3}DZ9D*gkB{I+C7>9SI%WbhYRH}+&ta!Icx z;u$P%VQ>*+S8>tvWpL5#)Vm^uElj*55}E3&e1*xl4u9w|VoQbHV;AcuJ5WCz?@Q7c zTtRm$4kfFTJ{{)cH2O4$nO)55urf;`ll^9Mx>#R*W%5u8E`foRRCH!pquW0-np^UI zlHZEbG}o+#`-hQBca`^HO~BeAaHneFWh*T5<96(Ar{+@j lwJ%(}gD&2pU5%rvkhSV{L+_0>0B-PJvB%X)<|2ErI5U=aa4aROgv zCP=_0$T0mJd=RX^DgB6sHSdq@GP(`p9P z&TufWPEdliRFiYN-yY-sR}T1}@G9o0&3;!yy>7Waf!Fn~AO>8Y;0q=cMB?as(#be( zy0L^v_Q8Sq>|7~83K`Nb>qIRQ3tvN@zS$=djn<3IJZB;u#!>xH~-)GL)nxoI@>1-)#L`kBQI{6`J^%j^jlYs$@f8pRFL{v(?JI${hT K(IblS^8W!Z%aMQp literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_clear_interrupt_callback.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_clear_interrupt_callback.o new file mode 100644 index 0000000000000000000000000000000000000000..a50858504a604104d06a7cb658feee293782e531 GIT binary patch literal 1292 zcma)5&2G~`5T3P@lC~I2%O7 zfl53Dcf=cT>!EKz-+~KB?X5SMvAs#iC5*KD&3yB%XFa?7sc4iKV<3$|62=k0p&x`Z zo*)T}5P|IXrB_SF$3i^zpcRh8qwqyC4wupE>=`?Qa^z*C^5q~JU1-7O&1)sD9YONy z;`h(<5|>2+TrQuN-gixF&}{ciyW?1{**+GI>kdwYX&2DHJp5bZ8Jx00ZSdBKY4Rph~{kA6ma3+ICX-n4`TywUFicY73&I?Xe{?OwO* z9HRtlaZ3od-53a`PaFR~yN@zz^IRaOUK@c=5DNUei1UF@@Cy?fB5|~ybP*g6gIGl* zJN4%ASQfaOJ7Hy)@&1rc8ViGPGF>?{IdW98or`KHKfV96(q3ciR6Ev z@Q(FAVfb)0gq^Ofqp zK6@dUWuv;AGt6qKR4dladT!S!nzZhXBTRg^CcZp(2}07V5@Vv2zv{L$z=7Mkz(z=<=rS}C4_^Eb z`YpV8>!FEXKtF}Irk?Cg-(z+F>BX1Kyx;r1-_DzTGxMQnl^A27j6o7+5x|iQLYavm z2`dnW?AO&7tJeEMB6g=6O2AI&dolqR@yqO~b{Z~6o<}O5o4UT-g^TE=mM~sI^85$8 z+uT3@c~;s}g?t|^pOsGfwlnJV26kuUIifc>rd&Cne`F-1=k}$nXqLL+$~}9oK2~fNdiTH6yk2W0 z+#zlJ|Liu(sI^PJocep@V{$o{nCQ5@7K^{)sai-{8gzNxw@R(_rj!mmGyCm)zppD}@d zDo{QMo3k_`20G4&n5y^Vilv`Y1-7+Z%z%|%GNGkef zU1M{5lYOg6>13upw*8p;x~5SR7auKe!kgSE@Dhsu1k5Ro%~7cC}Qh w7aMjXw{I0~(!FwpjqlRNm*tJYzET2fQx9Xfp{MBe6@UWzI9?jMUpgN4U&;o9`~Uy| literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_get_time.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_get_time.o new file mode 100644 index 0000000000000000000000000000000000000000..e20aae3326a8e11b617c9aa49f8cfc6644210e04 GIT binary patch literal 1224 zcma)5&2G~`5T13M;?hb@ODmj$z=t5Egsz+ti3%Y>ew_-JNJ$P=FRqhVBoZOuI292{ zyaJEG3vi+j0Z+lP;no|>c)f8*FO0PNeKYgz&hFUzxoX!KV<3$|7Ge*eE}Uc`6l7ry zG)R40f4OddtlUi-eaNamV5VQCE|d$+(vGzH>4~o2>cec~$~c4U>?g~dl`elhlm#SO zx^+Hu+(~aRa$b9Z6AXqP<*ah~sgZ4sCVtoRr-qfw8TKIXi~}=ozR&OH4-fZ@0x$49 z6d$A9_1w+?*dEekv3dNYT{%A5Z^4S9u~oLEZnGVBJE5~Q+hzBZM-2FQIt<(nV&Dtx zOXhoTc;I~qfcMPBtf%_wJNS)^e;N8)1=)FY=*5Ymu_=Cty|NIe z%}os6#MlN7I$sJ0^-10pDVUfzClZ;gD}9NJaTR|5k#WLASUrv;{;5ED6?Wn@G6p)% z@qHI}Cw(%^$4inx-#xbFyb4B~L?-H0=CS4dL@J!AZ_OpY z8~N1NO@*4c{AhU>G67_I!0ob$Q}I=~-e{WFh2U6rqg1q=My=MWww-pdWLF*1(fh}D h>EO%qr{G*GfwifJX*}Q|qP_;upn|u23Z(6zVDp#&78S@saRFU7)WD~fvE>j6HYuI3Nny_ zBrJVTy-iu4%Ma6f7c%M@T->`{I#o`SW@0B%dv~B|x4Uq0^HTo+nLlUezn;p;C7PP~ zsb@Q*j@P%nq3sL?_Tb1Fd&h?WW~ua2&oufYzwP>C-OOfn%L`n6%g7lYbDOzBVMEXJ zJkLS#InL*}PRj$ffizy+-+j?6@9u0iU_nW;MYf{eVRza6n8wm5|x_ot%7uN@n#R%zVb+Q(TB{z`M zm@NvT(R^CSL`OQxzm8Bu0lp!j8q#Fl8V0cDK*oO}5pPLEq;6U0qzulH9ZWn?lU&j( zGjW>Sz~Bvx-NHueTf#=?B=?FG3`~3_5}B+keTlPi6@LGfal%+weHw{fsX%!Z=-#Hr zU=1BQQ(?2SlRh5iWfq?>Jf1qpuIE*_`j3*Fq{9v!XDd`;kWH z_Fg)Op%Npl)dK!)Of@vn$x=xq#>7&7md0&K3Nej0>jImy2^3uxQ=*A4 z;Dh)A#+yDw-@*$otX}oPM9Rinlj0~ri5Fv|ccB8e1y zLk8jygT&YP%ee8OayO;+AfueZ+3oYhN$4b|M|Yz2*9Xbu%^sXxKUd#C=J)B(?~mo; z67{71eqdVTt}`^9k=e2Oedp*9Krfe{shQ?*>~?H-qUzbKYB-*)Zfbe$U4A29EUv2s zUf_8sJ;Ajs+iE+&){#a^`@2tDmEE0_Q1E9@3q4JTQOrP=*ZjsYJ{2AMsHmD!^wX)I)~sTSozVzLoknB;p(iMf#S6Puk!IvV&k9n(D|N!K-+iWpFLa=~0;{t! zG6rd!X-`GWuTK7mUzb%p!fw;NgY3=(jc1F0U_7nJ|PQ3OS_Y+QP9MVm>1E zgZAxJzzHbF8|eq_>rx2kD=sbXz?uhZUEoGp!>P1at~d6ztE^z^Mq|5Vn2lPkS#6oE r(za1G$$4mdCf-dGZz(07b+!9-QZt;}8D_@oR%( literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_close.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_close.o new file mode 100644 index 0000000000000000000000000000000000000000..bc9a5aee933e06cc39a91e558ae584067eb6474b GIT binary patch literal 1240 zcma)5&2G~`5T13C;JST+zO zVHs2~zpuPrvAz@&@q3+E0v^WBk_kB1F3l5m0u}X@TK%@KX-geAzkaDC^mmZFIQ#wU zw9I7@fvc6%^5>rI4BOql-RmB@ZM${QAGkrfQYbvtllA`4Yq{P?ucT7C)%9I{$H*9; zGU<$IZtGc|=wHn(O8^quubI= z13nn_e5Z-%dm(lt^V|dOyN5pTw&Od%n}Y#xuTKuCGdv5t)$jG(4=BM}-0^*{+Z_7t zK>XN$z+Kc(YZru;`fCYJ5Ec9m;-cULKQN&qQjFGefP?l))cl z`(rPxNiOM?skn+CH!!$_u^TvOf2%mCPx4=pf{BSEBEn={=}VlBN8#eHj1xwJ>XS%h zrUK=oGrgkS(m9&rCDUIgeJse2)97zb9AsDXQMf;o59?8nL%aHYdCS6V1g=3EDXD19 zy22nIrh=LJHr;dbyCP40T~lzL_i%X&wtU!X1GfqWPPsRQYHiP$s|CAa)$%#Zu9eI6 vQp0ZK@>a3i3=@panxzPu6G^9qH%jN`_h;eNDbfES1xczKHClif-pF(#Jsu~fH`6doF1rVDI@1jH_jf%xDL z@YTQKTNC{W{TDu3^`&omFSEl(6XGN@=iGD8&fUE`^QmZ;7-OIYgA`0709yu;%-E2E zIK*J(Yy4H*{#e*Z>MclVXK;S&V&#;bf)(A5mfsvD64zUBe)U2>hScw~pFbX|%@tY+ z>qA#KgJ!!Yy6vIc6pc==?+T~W8C$G;{+XVt_6A)(Qvv+f`T!#n>`i({8Yv>~=W8l5Cyb4LxSS`=hS! z)DeA8VoNd4?Qq{6`oNox?*Om&`@p>(1>`n)26&^_?Yi&Kg0;Bg`(C>~@ZG-pxc}ol zv`|}@0xR{l5O4x5;CB$015WTA6FMSk^gQ`uI3EOY7?H+M!eo`d5Fm{T`DcBq7MT?{ zkkd0eB;ug`HpWaY1qszqL)9&#fHmJM{TmW_o}{9DtJ0@z@CVt^B$72L zB!6f|*Kl(K#Ve>?!%6SAf|L5Bz7;8CF!7m4FjQR?E1cCe`1M!mgyC`ZsS=*6KzVJh zSM;{@zp1Bk%Aqpl^a_!<=3o&?! zs0Q`zSOtg_p9C@Wbv1aLK*Smn(O>fgc5S?{CNLrz!6^JBQ#Xvy`p_Wr3sJPI42XF~$a>xneBo>K;NpKw0hyz#t z0yq8yw;p;#;sU>d6R6yJgBjcFm`LeJyYt@6+nx2S?GH7z&KLu346?9b09}_vijE)) z>kxy6Xs--gvqz=@(5O@%O4;^!X7vqgE;aIb zNgdgSw5t@9w}qX;-d;{B%0;;VrF*!aZs@%cupGij>G0q|r+V;srwvgd#^P)lha6ePYuPrAY>)@Kt%KZ~PC>TDL`Yqbiy-&MrfIxE z3D%Nz+qOo%nQcs$9`GD`4Rh4usHdSmcRWlk?BT2E;~pmW6%!JAiqU$~#c{1Yo_Dea)ok&OdN1k`10G|<14Q{+{69ZUt!sFi% zxbK!5;kpf1$7S#rQP*c~O`@b10`Vknu3&HtV+kB|z9bIn6Mt5Ou#bsgZ+KnG1uYm4 z!yh_^Zy~3;PjUZX1*#VYy0?Wf*g~@J2ZFnkKH}v4H1g{Uf@nD(hTH$;-Fnac*z*4T zEpr7SxB&cqY0aj?;r>AK=U=`1mS_kJjGWZgy#PRa~ E0qDMuKL7v# literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_open.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_open.o new file mode 100644 index 0000000000000000000000000000000000000000..a72941cd97cdb9ca6706efb06c56e1333c4d9abb GIT binary patch literal 1236 zcmaJ=U2hUW6uq-Rg*K_QsVN}prq+a(cCu6wi7~N!qi&@s#PGIVU{gq>)MYRwn)u?6 z(Ep)teQ4qz&|l$OQ=jac-plR)C8U$goO91TGk14BKIQcSV+>?t5QA|9uz+rT!E`qBq`PpY}S7uyw>Q~WHzmc1+N4qNqvSeQlF zePxRQ?+rS_tRo8B!IosU^_C0kQ~+<9!USIL^?=)53do({N#Kocr(+$X1#59r2)kYH z3#&Kvb2o$!Fh^TE=Xz*=_gzllb@^SyfXfNKVM0YDjpmcjkNuGwdl0F8c3?C*#|RKd zh5VB~S&Ph)YshJiJTF>r1-oqIqx^FhrTzs8)sRirEunxlPo(|>iF2nMMf#Q;pR~bW zWVKP`)TEI7%7pI6#WfV?QM-+uzAuQK_DTLLQb=LqBN4aBx-ynHse9qiKdBRXhSkT4 z=UN5Idtr5)M#dn5Y#}8V z%~@6$>>|oW`}Rf#h!h{WG41P;g5!)w%NwvRV7&=k&uTcNUuR3@18tTSjG|u7q;;cQ yC{*%Qqngg>d4rrsmN4*b8u+^G0T?sN4EHgNAGM3$5?TPrAx7}x&>aimf&T}cT8AnC literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_pause.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_pause.o new file mode 100644 index 0000000000000000000000000000000000000000..46a10cb9f8c5890b747852eac058e0376f717c5c GIT binary patch literal 1244 zcma)5&uSQhwORgiQIr7eEJr%obq@(y#AEo~*63QW)%v(bT<~)-A??}YE5+14B5IQM? zKge1$OXMVz^vZ(&IxeoGa}|9zu+#pc*r`tPtVm%W11CiMCi6;L;-WtYzyC@IXd0h|(cYRH$gakNuze{m@)?t5QA|9uz+rT!E`qBq`PpY}S7uyw>Q~WHzmc1+N4qNqvSeQlF zePxRQ?+rS_tRo8B!IosUb{cfB=APJ)3M&71#59r2)kYH z3#&Kvb2o$!Fh^TE=Xz*=_gzllb@^SyfXfNKVM0YDjpmcjkNuGwdl0F8c3?C*#|RKd zh5VB~S&Ph)YshJiJTF>r1-oqIqx^FhrTzs8)sRirEunxlPo(|>iF2nMMf#Q;pR~bW zWVKP`)TEI7%7pI6#WfV?QM-+uzAuQK_DTLLQb=LqBN4aBx-ynHse9qiKdBRXhSkT4 z=UN5Idtr5)M#dn5Y#}8V z%~@6$>>|oW`}Rf#h!h{WG41P;g5!)w%NwvRV7&=k&uTcNUuR3@18tTSjG|u7q;;cQ yC{*%Qqngg>d4rrsmN4*b8u+^G0T?sN4EHgNAGM3$5?TPrAx7}x&>aimf&T}xQinPK literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_resume.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_resume.o new file mode 100644 index 0000000000000000000000000000000000000000..9f555d44bc91fbb2a7543e12e10eaa0e91ba7dd1 GIT binary patch literal 1248 zcma)5&uw%kB{VTjR_146LzQ^nU5)Qs(=KJ3FzMVHaJNuz*R2X9*gFy=B89-Acq3qO< zf(-~m?(62`P2+tj5xd?CCE!-*dny5^@w42qavZKk9z|-OTdKO=gVX4llF*(*>f{Hz z(JGw$oK*H?BOjyHN#&hmTBB}%U^@LHyKB1kaOBujuNI5^jv{G$z1yt_v|ANc-QhQ;O*fMxI3VP+!>w)-WfQK{TeOUi(8)O z_S+-R9@57DFRr1Dj(5$s(-}YYIYH3pR}dpUCzxPCLnMu!Ctn!HO+ODHQhX9Ho5iOD zNTWjjMW5_NX32Hr^o;yww4RDX2KlId-$$u`K|(!b$i6icu;&}8e?ubfl~AN_OZcP> zej{tmGSQP#@+%Aad0bpaaUHb_IB0)S9CS|dU6H~*7CsX3L-v)q#6>*_zy3&_Ffi>t zR|5ZZpn4Eu^D;6937q$5+T!Zu4^8W{GUjwY=CNE4LULY2Ci)pOZFzlp%Y-2S=YS(6 z7d^ABFer)Abf$BAwv@m0b2`^81?QDNF7H6ngJc)DQPgqDKPlGghx%$Wm{p@*$Qx$8 zQfZW%W;0(f$|iYV*q(|1r-^@fgc5S?|BlC~2BZaYAZuy}^v_P0}3bNV_v{=Iy@qc<+sd zNwO4MXZMw747fYCJ+p(}a{}L!kt05HPaJr_Ez>iBcU%{^Gax|h9M1#q4s2WOBL%g% z>3L4SGxCHx_n`lQ53oipUI;nVXFZI`MZ@?W`o%CN_X`Uuddksy;>B@14sirM*^xg_ zr{Hx0WHCkjS)SA)wv085Y0Wkz(T;GaIHVDe>aRmD^T!yFhBT>L#{_B)W&S4y!QBcn zlD8W0Bn|#z)SjR~lOXYxnS25_*D$$+xm!5sdJy0j&nl2!6dp~>7%_N)b77L3-JSR`zdk7=ri(na`Fa$tep7)S^*FHk{pBqS zsu8&1pM_YoW=&yNdQ5%W52*f3_%OuO*Hs1QYd&D!g$)ljEZ}-c!>Rb8RB!BQ*DV91 zrZ;wqy3wdso0XQ)D(>hNgI0Z_Kg8HJ@T+siU|b{bKVJ$D{tC~VT*mi~ejP7YnJ`|8 Ee;S{gEC2ui literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_set_start_time.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_mixed_set_start_time.o new file mode 100644 index 0000000000000000000000000000000000000000..ee53bfbec037df75623f8c8d41910bbd854d265b GIT binary patch literal 1284 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 vYgSvLRV70o*{O^ccc)4DXkC);<*F>3B literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_beep.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_beep.o new file mode 100644 index 0000000000000000000000000000000000000000..ae3733b376f464a798c85447be6cf317e8c11ea2 GIT binary patch literal 1224 zcmah|-EI;=6g~q>p%NplwL)!lO{&?3cCu6wi7_hWXKCD)q;S!Avo0_Zk|K3kOo2HKTXI&`#lO`8;*PPQZ%q#A~k((&?LBIJ5p#@RdIz@ z+Iru2+)<}DaE=b$vC|Ub2$NQ+^h7rrgOS%3-dMM?S>5jWLfkqriXIPUvy3(@x^ zc9rFcL+*=XA9%<0UErX`aj-73XO9v zq|!{wp-rHL_8r9e&?fkd2_2DQ^gZzsxE_Rl6p`du!iAPc2av@G@uzvJ7m<~1qD|jy zQ4oddEd`cT#H0N45M>nL6B^V*iRxR!0QRJl4dg3od5@&8cnj#Ny;0^nt^+bcQ9Qzk z3L^eS$Hd?@v~S>|{iSfxoTlq-U}B6hC90nC6;8)B`1wc038TTEPa@Gv9VoBC@+6HG zgA8h#sg&vJ#E%7emBlLzs}l#U*}Mk#FXd&w7ZYuW6ul29@}aSBPx^p=OXvAa`Q@Qkx+G0VZ#l$9KL_3i-@zO9 zT9KmCoOD-$?u`@o;l<7?e!#mOSI3tPtmOnRD-cCbz>?F_kd1xCVU%#-0^4iZI z$9zjH%t2pvHT$fl>8+hgU29bJwpMIgMiU^LO5F)Z^7WQkGR$^38;gb2ie-eCmALXW zz7$_siG~w$LXJc77S5#`da(j5itb2qbNzN9y?%cw4_=p#`PsNKw1*A5Uv zhV+9vQH#XFSJ0<1%S58ld=ov-?np=Zdk)$xz$bL5hA>e#hXmGa2>v%Zv}a*LH->~* z8|7|dV(`rf9ifW^j;-Jz1<3%$m$A|MMzPU34bE4_#B=0?iTOku_2bwRO AfB*mh literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_bytes_no_block.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_bytes_no_block.o new file mode 100644 index 0000000000000000000000000000000000000000..b2f67bbf0e95df78b95854bc011f01f59ad8099d GIT binary patch literal 1320 zcma)5OHUI~6h5~PEZ_^o@S4b|U`i_E6l)~9kUqGragc;Ik=-!UPHbaKaXJ{9m}uh0 zrLI)g{s0!bW5G|rzn}|U)*Xo^a!&8uwy+@Hl=rGS;^Rab^{`kgb%Bf#J_jy4s z%D0j1V)jMNw6;o>y17}knx@_KoQAnkH|=V@_^d6#W@9ncsCbS# zugCT0@wxcI!mOIm5?UORw=uzTEV}}17GXHKx_q~gS$;T|hrU3B^|Rs72)oQigJW!* zO|UD0n+&u@v*uYgTF(`>ERpL}HP6}hKr30E1)AMxfacc8A$43!fL5&6YR(2qu$E?d zo?EfEa0~th|HDk7hOVT~*V4Vb^f8%`k0;Ug`t9dB2KO&Ie^>+?6kg%*y)_)UJ=4320jq*o2)B+X?yt){Qf6- zvcY!sE)zUff#M-hyJ18OuH#tlaJ{pWKHQFX!sy@VI*3ljL&wgTcB`UlyOVQre)-CT zAP8sR4nk5<&TxRistC15I=Ajx#W^}tWj3tv&o;se1ztzP5<~G4Rt*}`4IBuYd>l_;t4{ibYuW6uocw5LykisR}sJQELKXCqpIL7^CHz>Qqc&!EPL26cP{|1|xCd*1url z-!O5}MR#uXSGdyDT@x32FK^yJTNl3My>srl=e;}gKHin|GGh!xV~~V-1km6?AUiW8 zVHrX&`V@H_(cc#3__c0OJ}1M?;8#sf$#9rB8tqH_p-T8sxcZ?Pi!F8GFnT1($}>p* z_{Od`^FO~Il<$aQE=DT{<<|qloOF6aW7IdN#`9j^!epgTxThrR!-?It?5R>orxm^D zSjwiB(OzXXGFw|IC97uD4CHR3-L%YB4_FFmAh)-Bw^7{P*{DNM3b8O-^{=t>?4mEm z;w-@~OSc%Pj!8l!nzF`}C96zdv7+VIQyOqF;qf?9r F{ue$~hJpY9 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_file_ex.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_play_file_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..559fe6cced787627d87c5d005d9c31b1383f8242 GIT binary patch literal 1276 zcma)5&u3=-gG z06TW#&rA&o2tfcQpB@V#zI0DO!#d`s_Lf=#+soYQs0*+TF zmk!^FeK9%o90rQPhr!aHdNva7!14T~D&C4n0}@ByS-g?|btL2_91Ij2#n*jJAGNy! zZKtP?wP)R)p&7eWFBS^-Vu|WtWVQ@*94n?$v2xckV(V&JeU)BIXS2yzhG%#ha(B?K z8+x+~EQ!>g+upic+t_-rR)slFfCbrtZ;4%H%iai!vK6-Kxy^tN$9+q0B3h=69m!0i z$1P*m0^Zgw9e8s%1a1x}A$OW*fVT$yzVQ+**o*6yWphpd-U)B-BHO>{~(sd+td6CldS4*^2aqZJ)HkG8XD5ncb68@_T0V1U_6v z@gizhaM1qdanL!*cSQV%>{G-@2%v$uf)}VwIez$m=jE4F literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_register_interrupt_callback.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_register_interrupt_callback.o new file mode 100644 index 0000000000000000000000000000000000000000..503e7a794ed446dd2bde1149358c09164450a286 GIT binary patch literal 1304 zcma)5&2G~`5T13C)@@a2D-cPEz(PfG30*lQ5)lGHnqRnTsyHEi=-*e1~uY9 zuRH>8z>O2P9(V*055Wz}EjO5ny-m_nM%ta3Z@$@Ck7qv=%@Sh_q%hE7>;W7GPAoGb z=&%GTWWO%IUN+wsl8Jk*SP~w@zUxW2h!3;p%DGxrU#XQ(2l4n~3ofn=m85nE`tKj0 z{rSaZkx;Lczm?u~EW6+Ix|Z)Ac|GC!mUoQ1-#-yn!)~`7yYXg3FX!`5G`-gC`wiD0 zXysH&GdWI3v4ZV zgWY7eB5{^r>+Fv5kOA)vI>L5P3qQ~;Y58uO3-?q2Z`#5J?(}-V{VqAgPV)@#Mz_;( zkCB44xGjY5Iep>w!VjH6-9-+ydM@Nrzs=Al6%Fm%s24(;)DQz2YQiX=cq*>@p&vm_ zayHt>Tku-}QV0=$k|%2sTiOQNl(S7B${8-5j8KS2@#moqVfc&&)sQ0VRuI6NClddO zMlfRmB6+I;Ptsr>0|%F0P?KEZD-(De4>u58MC>{)y59;e>XZCdG@*ilFJy!w>q=kh zNjwUF|4E#5WK?~OM5ZcGJUZ1Yx-Io2dzmtMI`LyuJ;M=(>9=z=9tE2Du>|#~$AMfu zUrt#NjleuSLz7sPv!*a`g3xHEzMWq2KZZW_bydNAmWRw6upwZh3Ea#ZxaIcpmFm7R zQ!ZF#v$~Trt!k-ME7q-gZpSQIlzQX}3tz8=@6R8AHOobU-Y4+Gp5p!EO8_rWuj8;4 I$j2f151pW*eEWndvgFzO~5r82;w6Gv# zVFhAP{I>dh)%Z}&q;3zR8Q6~g$Y$U)eO5eDj$)1Yvv~7MH!fE16$!Ld=J^9J* zbjv5dj_bR!kS7z3 z{7$}D+|mlX!1GYLk9jQH>WzSHp&Bh6>^`XZsI$b|}2 zPlYSN0OVgs{K&TjvlBnM@cVAWsdIo@*ssFI1;40g__lC<`N{+#0+;ZIi?dVAy27C7 z$BMq~hp_2k>g$?YbMDv6i;56uXGUH||9 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_resume_bg_play.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_resume_bg_play.o new file mode 100644 index 0000000000000000000000000000000000000000..6c67e65f849d96051e068c828c6ef39fffdee6c5 GIT binary patch literal 1240 zcmah|TW=CU6g~q>p%Nplx22l8Ce_ejCrc%f7!##jmd33lg@?w6P8Zk|k|K3kOo{F!cax(uw5*K?ahL zfYkTo+ob)u{4i~FA)}qa#l6eaDLVx#z8$Z<-_!NmUAVY;X&gZ2&)NB}r)qMAmTrCO z3un~n4TR?oM}1ec4#n}2GX}6qrI$vgF&KGm*BcvFHfz{D-!(SPocS@gkt-C|jXclu z92B49e2(k1dcf9^#)`W;FPi0@?TrR3L=tR~Eo*n!U3NdJvou>_tC436_;B3!ofe|+ zN$e`-xkuc0Pki7V$9I6YhC|@qfE-ficpi9r(C@n+P=d9%YiG)cnuMZ%L5z^1WRGOk$+_Ecz m)Q7Gw@Q(`oW!@OXoN~cF(zrl+OL`KZfVhH>=oR^R`TqcQor$gh literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_set_volume_type.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_set_volume_type.o new file mode 100644 index 0000000000000000000000000000000000000000..bb47c4f5611410c80c8fa0110a917a4f626ce055 GIT binary patch literal 1256 zcma)6O>fgc5S?|B;nTqm(eq=vMPQxS2X zcYXm9e}h{O+~5emf*X`uB@Qs--OWd(NQ|^QZ{EE1tjD{4SFnnVF;K=J0iy_@CW1&h z5F}t8bjW;Kc(Gu;&BtS_twDW%c+3wms*SAl)hy9Lg`-3Alkd$({Cq|;$?RyQ^8yKZz(y-dT zYiyb+^EkDU%4F7!G*9ysWFO%I$93v$VCx7Y*}dJzwfye$jVjD&I-6z7;T!BGyA_JE z7+Ya?w1*6MZ_x3bI(pv|zNL`o9&+D(;{$Ixz5~48>jC$=6p%W_)4&_uPRD(X60F4? z-}l<}zVG(r%l(JDiyCV0jMP$(Es4p6CBBV*R$_8rF=3!5j@FY-$8k@_A@pRY!91G8 zrvykMMf!1_szqvrO~kZjlSs5v9B~5DNJsgn(n}gXBA^<|RNXQXSo28nUl53MB^ae! z5;`S=KZy2+k*G-_>9sNbDn8sqat^ucIB0*1IH*tRT@k_-Cf*Z}rs}F#`EfoBzyB(p zd?=_sVnP!YC?B5a744S3cV@U`{OP2R1o>ea#wYCbA*8 z0x5)~qBYAJgB_6yX6oC)rTAFJ)Yl~q=V_OhH(`~&ES Bj>rH2 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_stop.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_stop.o new file mode 100644 index 0000000000000000000000000000000000000000..6bd43ff2aba2fb2c8ae4f7640e94f45e49859acd GIT binary patch literal 1216 zcma)5Pj3=I6o0eqR%nw-o0^5nTo&@!-Xe z;KiF?!dnyj5%g1dYihjorth&k!1m-z-u~X7-@G^bX69qrtT4tv3WF5PJpj{lwCt3S zf)xlu?%V2FZ+ex&xL6^kwR;4FHsB=zTzI{nFR zwhE`ePAYq{k&n^pN#)(Zvd7*2&>D&18;Vzp#rt}yF&w)c$DQcabXqt2!qNAPjPW+J zo5|(2^(@cw4CL=3-FEDDAJ{gUTK@3hUbA%Yc((ydN|;61y1K!xu+316#aV(~Q|>U} zqsc(nZA9UE*prs)yyC)nFMxM#VFPcEM!?-6ImFKJEbz{7FmPTY1$%K@2)ExJ3uiF^KAmvx33~be4F4aCUiuK(R$*AQE&Nv2$AHI2eYqtgaB!b5Py*; zdl6aM2HLbno)y)LqDmni9#UlA8V0cE^k^yf9o4%}qUz*cmy(}hPVoZvxCw+;FaTR|5m2tw*^v~y!P@n_l z)#-oC84Nbic`yqsRwuqT&Ck;4Z_XXGF6LE82J&7%a~8W;U*0m05Q0l^8%<)-nstQ* z&VuH)k1B=yBj2I9t||BpJXqd=Edg6y;AYXlPyT7KRzEa?B(SPxy^uGpdZp4RH?3yA rV3sZ7yl{kt@6o~+WO%5n^lwpoEyfi$ZrQh6nr)@Qr;8 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_stop_all.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_stop_all.o new file mode 100644 index 0000000000000000000000000000000000000000..afe8c0cc1b720022561021cced1c1306066b3539 GIT binary patch literal 1224 zcma)5&2G~`5S~q(;?hb@ODmj$z=t5Egsz+ti3lMjDa);8HhZ9x^NQtK#+ko zP$Btk{q?%_v2s79_aLMEfSGokyo_C{rh2H>Pfs-MP7h`q*ZLV`WpQwtZwyvS3fXv#{1lUu29(1^E}UU zP<)DV$939$V0%at#m3RIR^{k$zX>Zbm94TZWt;7=yK#-B*e-hzd%}Q^r$gUqBl@1e zo@Aao;J*982i|pj2Y7ot2JVf>A$5-Dfpq)2Lcoh0^M6yo;=Ck;G09lNXeo-fDkyvsAIjuRM zAR6tr9WXJGj`A-<6j6XLNT`N1S(omHHP2=II}-6PiHOu~3Z0a}6|$4LCu)*Q`q)C8 zHa9SM8)F+d=zK{W)F*jYq+np;f=FnxuJk1?#ufPeN5%=`LG>sS|EB`w71)W=$QWoi zNB3Rao%D$yA1z4$efP+g^9txu5}Bx1na7s*mw%ZM#NiguJ0umY*@`iEAyUCieQPZF zozSPgZpNsI%a4|KAnilC3*0IjI2GTN>&Fe_rVwn?IxZD0`?ywXR$F$fShA`%>E61& jjqlRNm*q{tzEJ{eQx8*kzyhMS2En;^@uzu3K7Q=K#!rBI literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_suspend_bg_play.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_suspend_bg_play.o new file mode 100644 index 0000000000000000000000000000000000000000..25458e044b990d415cb9dba668dc74e15617e60a GIT binary patch literal 1248 zcmah|%Wl&^6upx;O-h7F%PT1rSg1g%(2-pt5g{a+=HV3FMryLC*tkw&HIbSowH?%m z1s}kcUtw1XKB0fXk^-CV;NFZUk4h0E&75=3J)Ub{&wMJGWyToD!5|Hj2*4CUBs(&s zAr3J}e2u@0n;(m-DYXr0*zYrjU3i+pfvKE;o z*O1dQnazEaap7n*fCh@C6CgkVDq3pnx^|QvZfToF}13-;(f28~j0bFpfk` z3dtXu(iPlXL-7V`w{X(?C2&%oA!BoiIGAK2gFm6)3OF z^orh={x|hhjOpFU9~tFk7LPDIo&?CQ=M{K1lNa^2#@hA$vnn$ckPDLe0%8ihrO14eB_K!Y!(Vn)l{uN^qQ_WQq4?8wL08Y zH+4gQXKWa`Tw2X)S?d%GJoSPDegGFw${vRmvPeqcgHq!^tiT?E%d-wz^^od}rh;!^@- zFhcrSovcM-$#vv(W|M+wbYF7J#6~*GKlf2Y0X`$48q#Fl3I?#|v5bF1BIZg&q;5s% zqzwKbJD7N)Cb^^!%*3zaXUp|q_BmFFGPHkb)_$HHm<<0zcNl3 z99N%4f^!upufY7=Gf1PHdMa%8cG8E&d6~r#hV`j~>~dZKV=gc1ZBJsC@0U|11VISH zGo+;2#fgc5S?|L;?hV>3katmutY#9p{t}sB0@-zPp86dq$Y=oi|ZsViPXg4I1v#@ z{UaRs6Wn^|3U}@t3AaidU?%p)X)hUR_q~~UyW<`2o>h!0V+@2bNI~cUG<_$Un+Z~| z1`5Q##$LyakL9}wtqUpnJ51G!__=hh=*pf_dvm0!H@YxgztD~$HT}Vo$Hm{j9*Y73 zbyXktO>5NYIp)}DTc@UL_nk4KH*yE2b8-TpmrBpIRKpp$ZQGq_dOEEcJ`peH-_~+G$Fop)iu+o&)#?G;Mj9;~?mugm_xE-hup%jJm2Jv5*)4WEqOt_rV)vvc z4ES);_pBD8=la+c%(YLsXMga3cP!5W-Wm>pyAC;|&hi}aw$tz11C(GbZh4;DYmGd6 zC=R$B@1um;yAnvL$F+bH$N|5DxEgSRpP0}PDMsr_r{H)P_z^_1Pd?0N|5pN}F+%!9 zov1}(!86Ed%`OGeXg`feV5Fn`%K(Egd`3bwgo(OzHmvzh#J?f&@0A}Bx(#0^WbhZ+ z(cJTEl1qANAs)lcGZ?&%v2`5ueQ_MrCvjG!@B$NGhy*6;3SZ!2T!ugYM4T`(s~$!o zmnu+Rh6iC98G}bShv!|~o%GRJK3oz7y2znj&C9^UBr?BVc^aF9dQ5#A;1EXsS>RA#Hzb^wJYe32qzB0kaHEvLsc=xL)ekevmVv1o^(y$b u(lnceqERtv)mz&$@y(j}>f8yKOUloBoxl&LbE<3j-x0U)a=juSFU5bFXPGGg literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_audio_vocal_removal_turn_on.o b/hardware/arduino/mtk/system/libmtk/debug/vm_audio_vocal_removal_turn_on.o new file mode 100644 index 0000000000000000000000000000000000000000..d41ab0bf1fce17a49a1df01a51907fe5f6c515c0 GIT binary patch literal 1276 zcmah|-*3`T6h60<**TK2sj*C>jbRBBY04xSF(%5-ve-#7h*^B;3N%6jR7)WeHU1;| zXZW^vU-jL0AH}yNKIl2L7b*|iNqWEUob#P~dVhVa7*)m?aAS~yr3cXTooH?@NWlh3 z5dRW;7Bk+JZzq&4q{MG9lh5O4!kMH?hf?k3i7a31!ff+gIfc~hJ4>DxfBn4A8*tQR zeKIhuai`~)6Q^zUP1hbc6GU(94ozo>LcLUaq@)_o*lpYHRMFFE#prpqvae;eH`z=! zpWjn*YEI2U;UUT`+iLZI?IDd8j*kwS<)gz)1J(qIt+Q?MI=jJcMr4*?JM50|fPp%i z4m_)c=(#?2Idkp4>e+8SP&<}qf!Z34Ky@8*NS#%4pthaCz#gImd#RS^xxLodvqyY^ zm*ZWO(DtqcQrhEMzzM{F-$GmuIKdB0D2NoJdeTYw?FN1Xk?g$>i_t$yfHX!(AJ*|+ zB<5U0PBr@!M5Fl>B7u>P@=pQ`!teOvQ(LV9DB8A78_)H`)-k19v!*LOQ|K)MQ$h`Y968WzK z~WKaR)EgQ}Xdr`~$yjm!JRu literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_base64_decode_basic.o b/hardware/arduino/mtk/system/libmtk/debug/vm_base64_decode_basic.o new file mode 100644 index 0000000000000000000000000000000000000000..b81c2a1035f5c28fb483b792194f4ab96413bd9f GIT binary patch literal 1280 zcma)5&ukxEiXcr#Fxx`-}~M-`(|f%_R3Yx7y}UuQs8C) zJ9gsF%?v3BLlCAPpK#7Ue^{yo5=)i6jraUZY&j9{T}AsYz4|mOuVU8s=laZ=@%aGQUtnwnemd)qWQcljvSt#5=yKd<1 zKCm=We_?C$USnhP;aVL6o*)acMc*>J%vQWn7GrU?>bb>09*qZ<-bS=c8+(G8#zE9XG&3h$a%5JJ=rWcY-HdWaBxD=1*k9ijg~V*hitB770sCv32Sh2}|S_oS5ko;f{*4_8n; zkJ=?1w7&%$bWY-3kwOy-Z-_V{`iflOyzYZv$3iFc&bqsb_pc6A_d(n(BV%wCXZJnk zpH6=NtnM!HgXAX2PS<_2@9kRbe!Uan^z+4EW*fY44sIhQ7p+^h@gDn zBy_G356)*_T)6{D3zA)st0e`e!sAkDqewXBi(nPF*o iLp8i(<`}fIo6(l&Ok=n~+HW)r&_aykPt>IxKmH#>>X(B6 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_base64_encode_basic.o b/hardware/arduino/mtk/system/libmtk/debug/vm_base64_encode_basic.o new file mode 100644 index 0000000000000000000000000000000000000000..5075abd7cd2d858a4d7ce213b0b4aa311a8ad2c2 GIT binary patch literal 1296 zcma)6&rcIU6n@hdEZ{E?LxELR1F=nI-D0DS9<)E0*0@MQo5;ar*_MrMLaA;C1Brvwr{wy>Z~^QU3)!=&{BN2NQg+v(r|BiIdEH-}~OT^JZse_r<)$8DpRtgD7+( zfNdG{CEJE53_%!LA0Kkg_dkqTQ`*@5_xyKmhkwl#`DFFwZohU)8`a)&h@bvE_|DYe z&1Eg7-PWLW=^(g!a_=?Y;jO*EUN}EkDD!j61BLPGN)B4X2SvWkBP$U7_T_M+I1b+kLKQ?3DvA?-^qE!-^S7Vga!p+69218gKT%FeT~V1$jc33f4X zm4VURstc!#C_IT(#XNV-5bmY`W7QE380BUY46i`}xf4bbj7pBor3&x~3DrQ`7ZP~~rJ{Vp(x+^2 z1ry7iNYa00F& zB^Nz25@5h(sy))aJvtKC{h0Q3IDq5vAFfe>X#vx#U|3lbhxCJNVR6a)ha2p?wU|j; z_9ExS`I22qXRLXf%#U4R;}?oQ1>tRheS9%m67A_YE_e+wG9)k91YRORF&_ROC>ow^ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_decode_append.o b/hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_decode_append.o new file mode 100644 index 0000000000000000000000000000000000000000..cb485efa4b86880fb88e4ae3eddac92c24f3185e GIT binary patch literal 1320 zcma)5OHWfl6h6}j7VrgPc-_cV!IV_4w^)_vLQ2cD#)~AhiR>=7?Tsa&wB8PeCMKG= zaj7enwLgG`?pW{>@Gs~>mvu*?37*rr(-s!QNoLM>zVn?q^L({vamE;^#vlqE58$nI z!ikn33jGj)=GUj3^ZhTw)`T|v_%r{T-r?WVIX+%~v)iMc(}uK<9Af7W`aYQ&yuYSR zYY#MNUOf!%p51%LcX)FzuoubnWefb$YHxP5yq1RMz+sNR<|Atm{qgN+s=V;)=RVJ? zMfo<8na{ka*afHV-c8sw#}jtREmlje?bK@SW~n91q*C|wXs){D6X@ueA%F?}jdg;+j4tfF+*2@M%L+mme4vw%< zHpZ?5ZZa_Hjf!vzXoV+jSs~BeFoe4;z$iJw0i#f_gW*-lA$8nHfKjYgD()squ$JKn z;jI_8gj@GF_#b8hHFPCCzLxIgrH{#kd_0b}*T-ZcVE`R1agf<2 zkUAxUTNqevd$K0Eqz`oQ^EkPQWFK-Du+#c3VyAObdqoH}416HqH&s{p%69W1_4x!-rb^PPL<-nsLkq?H+CAO?dZ%p!mTHwa`W zh9s;(2u5Ec&m!9Uq8z{33(A*dxD))Q$|)I66KA7i={QsgKMhwuw_>r?9-KzcBw0Ct z!o)N+q3Ew7z31J8DLKliAMf?WL3~&+-i9?qPvp8tp!?6w*MhzW<AagBC-8gx8e-Vv1V1sMAd*J)f{eh^3ycNw`T#e#k~K*8PjeR zbiJ6?EUqtZnQQRD3fxCZE~?p(7}VX=WTtcLEyQClrgL4Fa9;KU^A2n|u+;^w6;zyZ z&kNOBU0qrOdPS?{bDCZ&mm8&~-pu8-l1?SBOh?DRRmcC$8iT&9v3tgG+&~fEGq#4` N8!>^GN~0Jr!#|FwmInX; literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_decode_init.o b/hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_decode_init.o new file mode 100644 index 0000000000000000000000000000000000000000..840b6ee39288e6e76e9cffcffdfe1f770523ae54 GIT binary patch literal 1272 zcma)5&ucDB_Oi{Jx zko@`W{8nS{*N>CZwk+mhqf4F|n#a~t&La0t5Fr-0lUJqvoP z-|IO?Xu(>#&AHocj<_@QKJGu@I(q1sgPxbpy6$lTzsIj3hCNR39TOTNX*8dFA?&xk z*oR2%y@2T`eknj274pyfWGymFZXl;QTO?wm_0$Oy1NkWb&_kgDd_qDsWRrC(C}7Qj z)W0AR_e&_!w<>(n20lzQrje*gA^DX#eH|A!P+UT71v~98f}PGuek)QaVB!N2ugSVH zmN>8b;rF@J34N35GsX8;1Xp~ezV)7ozsT2j~rs>5Bfft8oa-z zO=}M{XkI-G?w;Ly$9H&hFR&NM^kobD(rRyZw7iyv=D=Z&zvd%r5dHD(XsW#M>*qet zt3~-Xl9|uEsMrOk?%qw(N|w%PYEGL(jxwy0tD` zeb$Vd&*L-kxw&aQVI+(=ByVGa<2r?PVABZ0$(5yh`SjAGnH=;4BCMAUhKAT>HXIyb zqil>_3EX60)EgDy6wnG!+Ok5PyI}}-TYyn=gabyQUI)Xgl0)jakpQDutyJ7ilwd8x z5yD$9YzepSZ}30N1ZwC?dVDS2%S#`V3Hf*&ZLg2XM8W_%TH+|5bP?=Rz8^$OZC9H1 zD6bzNh79Sub*dJL6*du5&McAGXg-~Q-$+OChrab`I6y!(R8w`cNMOyH;{PC!Z&5Nz zHz0LN2DdP<+V*5ka!DWP;^%R46Ujd0E?}qiUBpi3r1pvsY8d!Hz;CLq@|Er8L-6}Z z@nnOo>K!I{tOCVDpm)NE7+lA(+~&GxCw;gTZ->#p(Qy!+jE9b$G3{1I)pk4QLYk47Q*~^^g7V~yKxnM2Yl=93KHh!)6j}Tr1?9&R%b&ui(HgKII{qn($;iD4d H<74;-cax}8 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_encode_finish.o b/hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_encode_finish.o new file mode 100644 index 0000000000000000000000000000000000000000..43c85d8a10150309bb7d8d0329aa368963746eaf GIT binary patch literal 1284 zcma)6zi-n(6n^ImMs{XY#A5XY`vooGc9n$J%kyN^VV6pY5em zb8R@88N9Eo??d|cx6|dl%|E|3RKW<7*1q++>onZJdysbyU0*ofL9^HLoadc`PS6f* zRlq`@^E?NId$_>$+(rjj25F+Ov;DAM z+TL2-g$XUmrr3OZfn8x&V=1=Cme_UeE(0F)yTWZC3SVMdG2eU1h4)4PZ@Iz+-UtHV zevblj=Xf4?v)Ao<2WY`s+!ey_G>(K9L~t5kN&b*Em~w95`HdEp5MzgGN@5Plz=iwesg XFX9iT`<9x<_l>xOm+C3Scp3fytT~v^ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_encode_init.o b/hardware/arduino/mtk/system/libmtk/debug/vm_base64_part_encode_init.o new file mode 100644 index 0000000000000000000000000000000000000000..b2907cefb9de2c8415f7dcc174df6cf521b95245 GIT binary patch literal 1276 zcma)6&uO0l?7*9u z8xpVq63jjap9E`fia#RTa<1o-ugV|GaL@lmm6P&q8P1}!*{SPPsz?Wc>a%7z9O}W@ z=ImWL+k(WeujhA~`@etYL_r6oN~`i}ptp^&`7ooO7#7#fVQ17e_5QHW(NrlEa1;L`%P1Ko4fzLXH%z152bM(Y%^x2=Y7`F-cI)7C zNi4v&JlpIVyY3FN2#c~E*L?=ccsk%l8g|@mn`MvY}B8_o;86aEFdw?$b zvf1?-3t@eIam#Fj8~i|ThFmmf%f;ZxPR&O;x9(azabi3^2)S^)`0*+oh;xW{LD32- z4*8=(wRWujX9nmMt+t=n^jf)GFE#W=eqSr;G~v0)b$qG#-@vUY=oc5I?G>>{aPxH6 R!W#e@ViYgbQ;P8-`~^s0l~n)$ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_bearer_close.o b/hardware/arduino/mtk/system/libmtk/debug/vm_bearer_close.o new file mode 100644 index 0000000000000000000000000000000000000000..0d40a87d8d82e9cd288ed6c5424aace951010937 GIT binary patch literal 1220 zcmaJ=&2G~`5T13MlC)AuTYi!d6^j-rZRpA=k%$ly z8{P8huao+&Eab^VZ1!x+u^qF2IGNf2jY{RAmTgatoWAYMv_>wc86(%$cJ;je zHoucE7PqtlFYr8+?qeRywt6FATc}1$2YU}X)xD=XZCFrZEY4QdYwS9^8A-AfOS5(5 z9s@p|ja{pU(shI!O3kqkxof|7fe$R#0^XZWfjbid#Ln{q@cv{xwqGL!YjMkUol)<| zwWpzj{RiGgAGLMC<4|v3csdEy({G`Sdpe1)=+ID-jpB(H!+F=k5tKAO3E{8e3ITFx zA%2i2YY|!MI_eZ7?~3vzaLPeE@;~;Zw0}m0YRDn$Hqn4J-$?s+RK$A{7Rg%?JV}E; zsC9iLY7!*A60ob7Tu0*~+OFcH{n37@Px7p&LIEBACJ@WI8Dsrg; z)l*?D7=Zj6h#&d3V0Pk1=YHRfICTL~3;R`AzvLJ74Br;cFJGA;MBobkaB+5uSydPm z{aDer{SY=iOnqHZa1DJ}-iJ*WHV43sijGTZztU_S=wTX|4Wm^q8D^_qZ`V3zr&Km- pCb3@Gu8Dur#9!sizzn6I_b!DO`ULAImjJ3L)A(5ET_y37{{iTafKdPd literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_bearer_open.o b/hardware/arduino/mtk/system/libmtk/debug/vm_bearer_open.o new file mode 100644 index 0000000000000000000000000000000000000000..501898399db73cf842f3ec5ec4fd2219edf9e54c GIT binary patch literal 1228 zcma)5O>YuW6upnH4pvhjZ3G;3qBVlp$xw+BVq*BFaVn;;ASPxyz(h!-)M08QF5I|u z>C&Iz)?N2*^%uBwV@%zVxX^of^Y~izCG*a?=bm}@&7Jq&mGuf^48&lNfO!Pa>(t6eed3E6@LHBiGnUl)x+xRfzh^1+p>+}v2}!rYO$D85{==B-LdSkQca~4 zz3*7cu9ntbrFYWVY*NXn88r?0duTT;v)u=lMC#8U>_2Fh_V;!g5b#JW$RfT?w#6=c zqb$ba?3(8;19dbWIA$Bsu{rhxv#pn^W4&=e?V64WYI`&S)gDqn?zEZ#wKE(HtRu8w zE!A`!yWc)>tdaXc=YZ?zq4ow`FZHruOJ3pPVgBM3LzD-wRL zxFURE?h`ini)^tk!bj+txd1NW;u?wOT1M zPw0f+>6gzH?@|TI`yet;BV(|Ib7`h6u1je4chC^wB}zMz*4GQF@I18<~(cgh}vvAj5yrryPHV|0$9>wJH4JS&2AD=6h4=~g7v4gRRKwz7)(IyWT+$(7aE{kFis^YBz9pk3@{OrQgoOaS#{$B zxNu>*V(A0uj)jRYpz$G^xT-tiM$cj9cBaI5l6%iN-}l{n?wpxBM-`Pb#y}W@G`JZ+ z%T9v%xgZV85Qf?3XPomdpVsQ3BX-;`t~c`I4waJn(O zIDN;D`E2T&hO3b$k=pOQLM+;Y)0J6+zvZzOq))zgQ?1g^6D|(n_;9sVeLc|H{evz* zwOoE6r5nRTvtyWJshZ77YTq)XEhVSC%5CNfg^ZM!^KuS~_i(*#=mo4Ls1#(xnbdcMl z5y<9{5>n^nJjk8lU|<}e1Z&B<{9 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_bridge_close.o b/hardware/arduino/mtk/system/libmtk/debug/vm_bridge_close.o new file mode 100644 index 0000000000000000000000000000000000000000..708cc3808f388017b50e47257adcdd2a3fa4f2e9 GIT binary patch literal 1224 zcmaJ=%Wl&^6usj-NLrz!<&^}hSWu*dP|GP1L~J1M0B%z?S!8FN#A+fnBseZ2V!@VA zfIr{|*mY5fAAql51u84LgL^X`*Y$#tJolV)&&(aq<9%IkFvdVM23a^~0DGK7ic3Ql zRv`wnFNqfk{asB?-yTKf%QD=He$(Wf45yj1*|BsSYsR0)Tc3KV)XE4>lV_5wyoBt} z@9a*m^6SS*9^TZK|7rxewqT7dEcoX51x{uo#eVWhmj^Qc?fdA8Mos1##ywjRF9uCW`T6ic%V z+mP-vQ0I$@WA-sRHjg8LZ0k^UthWxRL(?%q?a$|++EXIrE~rIN2h+*KdW9COrJ9ao zkNZcCH4psQf9NgD(bh&?5AAQ)#T3FWzKJpJVhW!zpYxkS7pALXC8k*fe75l{`$MBNq&SaT-yuL$^^;)?LC zai6fkA4ENm@tQ=*FZuKsPOhQ2f?5JUS|6>K_DTFJLMUOvTLf}Zmva8**TeApuRj+G zj0#<-K=s0K#XkW3*O5Q

`6k1X?E8hQGhAPVNguyG;J>+N}3aDH*ixFH0W@Rjp_ zr!ngigOWFv@7r#G8!o4PU6Zg6JXm!An+|LaLDj1ocIDk_tG%xUZD2I@cBQNv?M9P?7Z)N@0)qEZ)Vm)Y;@%IgZq$kE4wbokU_~0H^UYC9OV( z%#UyEMyK@i`$_GtEav%m{iODKWOkil|Ijvjj%{(u>u&1RSw>?ZQ=;15qqaG&r2@@)M;%GkUBKY0(;sAQG_rlFb zag+c#WJvGV$yy|qSVv5Ac8Ely^)_522GUXff#(Ga@DTykkS6OkkieP~$$vp0?v-Gq zZcXT<41Oc(%p*~gLeeWf{vs}}Be{ZH3_sdm96#!l{8xl<9~1s#l65KPH$NYQUw{0$ zfLndR1kP2UdckwOqTOzy{Na3xe|6G_-26O^acU7DTFwW7?$5$Ry=QY`d3|}ygdhMH zfF25|XwJIAU{9pnk@~h+OZ3t5^3>Ng1;^z_tMy=u!&VYuW6upnHf{iIO7y&0r6cZ5pGE@=?8^bq^Q!#}FX-uXAOoUWQotYYm3lrng zr9Z*H;I2Qwo%#!0x-q8i*y+8zd4Nq9eaXCY?zv~)eRJo%w>7QK7y~&Nq+uBWJQIOG zKR2Xd9fC0X9DW>by{Z0)N0s6*pj=fx*5TgTH&w|fw-q=`%x0&a(_kaG6Kd{vW3k8( z&NgQ6>xBbI|N74Ebj!bg7G*&fgN=j6tFhj5^!`}4&7*;SY}odpIi-A~QYj|W?a7JN zH?3*1k<2p-PvkGz!PL4 zw&{zqYwWr=#^Nl&ZhG!B;P!Ov7(GPC5;&C1GGB1VeC+@q7>)tFXWPK72?gZN@jUSU zWIQ&H(1NwN;W*Z)cjA~fZTxcM7TT!I0oP8w?z)`7=kgnfA(s<;!9)^~Gj=FBR{96)5k6_%e-*fr4{&p{=e?e*ZkbNMlUrV>!;}eUMrvk%@Yp zg?4^@dCG*r3v0lUl8fHi^stq^iN5U%>wKm@9=b90HR8ef!i&rMka8e30IpS3oJvnB z&DNfJu^IG+)+(1Yy;ZNbYaP8)Dr+^Jyw6QX$NQ<{4YQ`8UswwFLH&&5=ICt2)&Vrc M1RkKL6yuNo2QEg9ng9R* literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_bt_noti_check_channel_valid.o b/hardware/arduino/mtk/system/libmtk/debug/vm_bt_noti_check_channel_valid.o new file mode 100644 index 0000000000000000000000000000000000000000..c2fe52ce0a5a6f9ef21bd9f93cb4c63d0581a130 GIT binary patch literal 1284 zcma)5U2hUW6uq+x722fIrba-bn_3epGFd7~i7`>WQMbhuVt6oF7uX1q4_&5>#28=v z6F&InU+}FD{RirQF!8OaZ++8y*&U#Ls7^9-&OP_c+}-*3P&7)6F_4Wx9A*)~b2sp( zCx$pIK>#vem!B*f?+UTVddDAw+y3wI7@R~;Gl$Aypd5T0tbA&O!;2j_37sl2?FGb- zf3Ta4-0`oY(v~dbVW@mmI_R5CVGf3(YqmOe>lKdHU|{#m1FP32FfWR3@{jrFojCAbS_>mTfh=z&4TkvwJ(+^}^1hWDORS01L8J z-x|BZuBu@cVNrHnxx;{u#(iNm5ryMoM>5Cmabdp|z}uFvfHy}Y;LeZ&a;JD2cx%}2 z+XJ*zoaV^0qxCfGvXPJS4?L9m7bH|eHd(iV0@i#j^>0Yr z`{gRqx8nMw4OC1trjc8dLh>tf`Wh~-qqvCLW$g5QA?&nI@?Vic0TZ8zcum%ovBY`Z z2fzPFolu=rpDF5@3Y7Q3`Yer%P0r{3RGVL&{QgOPn#MRj3y_`9`yhEH@76P>+WGb6 zEprVjT!L++Yo0O zSzwlpYA$P-)l#Wetef?0&M2BR>7^}9e6c3JIcE&!#l`7UX|E&rBM%Y7OL*>xQM_Dq J55ssV{sK03n9=|M literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_bt_noti_get_bt_device_addr.o b/hardware/arduino/mtk/system/libmtk/debug/vm_bt_noti_get_bt_device_addr.o new file mode 100644 index 0000000000000000000000000000000000000000..60d45b684c43eea4f8d8cd71e86680853f8fa20f GIT binary patch literal 1284 zcma)6-EI;=6h5>36xtZtMk656RWX9Jlcf@Eys`YFZp9QXxZ5tU5sVaErj4W*-uepq z1ipZGz33xod<7G)H1)1`dJen8PcKL(nfbo+op0t0vom}s>Ltb)$i^T6(+FVS34EEc zApt88fWg<$i;#X?h(+#n{IM%Bc;Nr0#gZ{Ni=Gcol#@U?_&iwo)Ch-{J8-souEf-R zNc{fJ?ly9New~&c$zm?9mQPDZJ)mS-J z%O0uaR7%ym!cw=iwDvB&ncm(`su`Z)X~;fAyJ?xtF0dq0Uv_WzalNqnY_kS_CBTAg z-FuZ?W7j=l7GY6#Q`um^hohb_n~1`8up^mmz2(AsFMzjAVFGUshrsPV1>{ci4DeRJ z*Ru}Lg0;9Qgxzf(3TsFkzg)Y8Hacp*Yp3(ByPUx5@*9XjmlOQNgo;QS%_m;~`#m@I zAX5A2z+`kjD?kbr^3VEYEiy~4A*VT8Bx0lWR3dI8ALXCA=*sW~3DuBI)~%p`H3w4v zfyB9Ejv{?)j!)WP2@{P;F)hmr)C0r~R#Br*o3O6)99O@tKI*WL+6c zoYlSX_n*`WJ>%+A#WPod@?N+-O(SCv$8l$(&8|*<-#9->V|;%aAiJ3N!p2Y!n~60iElbg5$ym%v%r_5N`w5^BNA>m-$L{ zPg^_*jIv(MWp$%kD%Fa0qn^#_MT6$hKLoy417Dmy0%Kum+}{rN2yVK77+%3|ju^#@ JrBjR-;y=;Bm{tG) literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_exit.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_exit.o new file mode 100644 index 0000000000000000000000000000000000000000..9a31a7950292c08469d4afeba476643887e1e736 GIT binary patch literal 1212 zcma)5&2G~`5T13MlC)B3%U=>Au%JjOp)03EB0@-z{{SvQO%CB?oYZO}5dzK@HR8a9 zN8p0QYjCSX9|4|%TUErRH<-zK9jB*`wEkwk`F3YLyZfnX)fi)-j6nuw5r8FwXnrcl zz!Jou@O}CDvh}f&PTuNA({MNXGn0ms)M?>RJB-!i&*F`*okU`>4<{?9TH1IGnd4vV zcBgdw`>3|13i-HFKdOBg+Fj8b+U~(XOzC>L{Lsj>M*CjR^(IC=n>DO~aE&c9XTHyE z<_d)kBhT|Z2gUn1!Ev4L0N4h)(c;ebgLY;6>1GQSv>1!CHT^QX!mdRUEXh*rhIWqu zA5VtD=^_eGVqbZl`-ThmKmgx$gaf=g9s~DA6p%W{^T2zf;n01H60F4?A-q9%U$|rc zht2^vQA2HA@U_(2m%dM+`~G#rxbG8u!-RoI9L*p=HnX0o0Y5NFp{w@eBma3Q!aG-pj?!8wzH z`bOuajN(^*Kz&`+@Ed-xya($7)^~whWfMQe7v)BC$DGrEUALO0qGdO0wN|xlw~HmK oYLjHo6*j&`8{d;R0Xw{~>{${w@C557mH;YYuW6upnH4ieMS)Cf4yQ89wFlc5qNYz&`6<5WyxLEKDdU=)lL9i~l57j9g- zbmebw>#jdSS1w)Z!kD^ar}r}RfObKA$-Hy!x#zw6xbud$RjtMt13nm}U>*T<-5{8o z8d4Ae0Vbc<9f~K5zYnQjU)k+;>GzKUFX*A5?yE-w-E=ww{e|V|UF%5iA3PuG<`}VS9g|NjmkUy= zIXtvGmOYl#Oh(fBjwNj?S>;W3E1S=!rJS6TvrxQ`cEd8vKCm>>U~zBvVXLycv(*3~a14;m(FkOFNCCOC zat`Fqa4@hA(1NvO!*T4sdFWUpI{5#M8)&0;hdev=yzOy#9 z0@i%Z^>0Yrd*&+K7j=Ey1`$jw_J#WheKQw;h?^@YUP5gZA3EO}KGY}vTaki>iH}6Q z!S~}a$3;B=fBtfv&_Dg*QgKYr5~`|fusY;F34J0 z!KwJ9TyN|t%NK#JYK>A+(;Kx~v)a;I#gbOlX$}2J;PU2hUW6uq-Rg*K_QsVN}prq+Z?J6S4;#F$vVQMb|*Vt88@*c1}C=rS}CO?>f3 z=>O2SJ~Z(U=&$gtsZaJz?`3y@65=E?=iGD8%$=Q`-H%1R#25qF7$jg40UWqNAU!f9 zUjfwINT5XNW|eHc9}Uot1WFArHglv(kxeG)2ocjx1rctrO#TU;~u%`A2G^)*Co2%NeTWWKz|;!cup& zl=e2Ylgeba)HF}?6l5RZTBc<-yTG=P2C|3y59@{fr#m%RP=YMPR{d-223z+#bH2O?gRb!9AZTKB{6zfvdkjjB%+ z-<1lK_rv-mjf_DI$H!xBdUf&#M)`3X<6Dye*=*hq8&~pfJ$oh+3^VoWT*QMY0W2X5;wtU@A1muVyM;Kj3d zZ~hbBdg$Ft{VTjR_12rd$L=hfCM3RO=KJ1z-^?3k-|)F+)EQ$Sje!Pp51{KgvBFHC z!3xBo_+$0Os`06sP2U~FvT#3ks%7Ckb5T52j^mBQ^F;GoHB9bDeiwI3ES@z9lT+_GALw9g{=qJTCz6jYlKr03}$9 zTSB-)`%pL&I{5$D9hA`(FZpu1=T|-_i2D2{V#4PHr0 zky-V?#r?w-s9qFq&C|#js5n0fV&UCMADiWaH2NEJ2ifI(6kluDyn03uy1c*aGEWeJ zE3@xPDq6Fyuo=qbbZ@qF5XqOVP4~K{;Jonh@*Zpo*z5y0DmqT3mz8E~Uthcc%!bh_ zmkhI2ueWO*vr{S?HIwx8$AItD#Fyqy!CY7p&qQ~d#)Ix6rd9x|h#71q>bn#+!9S88 Bk*oj! literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_get_power_status.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_get_power_status.o new file mode 100644 index 0000000000000000000000000000000000000000..0901f0cc044cf3780201891cbe03608689b30614 GIT binary patch literal 1252 zcmaJ>+invv5FO`IwzN_&fJjOOD-=XZsI^-n5g{bVbyL_9)a0S!WwS|FBoZO*#sMOb z_yB%@AK|TU@B#1@JQAMh8_dM(+@xU1K4)f*J@%}-kPkxT4=1NvwSSfu5{(`+n2&2fCF?>2_Oq`krALr{=Di z$?WK9p5`WG@8Ja3a~o}7J4mD1!-M;^!omJ-6_!F8TV|V)%j^of8ji6z+hW&4cNy^B zpd;J{qVOfQ6!X1TTzKyU@MBlFz#F|DaKB3isZE{+-t2Zd-fNU#F7689w;O%o$(^ec z{uggxluEl4sHnc>fD=RlehqOs-~`_=pd*rx=95mtek-uUh}1qv7?1KZ0;JGG`e~iY zMPkJbYq+?9&Wq?=^hRRK3jv?d^Svs4lZF){pH8n?w14(MgO&`lwcqRZ4sJb3Zw z(W6KI1#i83)xW@_7h~#;#Dl)a?kr1BzGUb7-h1E7n|(9$wyrlAV<3z{1{NMb$8o}i zxgZ0pAi?Z&>~XC1ruIF#A(sXb`I7vh0e4rvs&ZDoCBs>2HaiWRN}9A2Z9eNJ67d0? zt+=S)lxds9-r8K%bupSTrRB- zxs~2l^Xkj|R=!xwrVC0z$wT=*PB1OAHw2bN8ZPheKIqhTcedIP2}mr;)d8-aTal*x3&%^o7R9UKT|ThA44z2=}Cn%o4XH<^H9kI5l*UMYamACE@XF-owO zVsdT|dneqQxIgqCa1%Au-iWKE9(P?%5OVo-#Hh;&K4Bt_NHLmEItjl!t{+4sd+&fZ zI!6hR!wBj9I#G+nf~&}B&Nc(-bSd8pAP}ui-kG$I$q%X`r?*3 zf*`DT_l4%H2bg!xq@cdhc?l!`sq0W*;{hD~4_4{JCWp;KQ1q&bLwT>-Z0)N{8Zb1y zRVnL6tI=rJJ4UBm(d!0Djx28AYc%jZ*;6q53p+ha;s$6xiB$j{F@=}p3Hf-q{{WU` Be$)T} literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_search.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_search.o new file mode 100644 index 0000000000000000000000000000000000000000..1d4dc5ae4f41557eb8c7382e6c89c170a9e6cd4d GIT binary patch literal 1248 zcma)5O>YuW6upm+3ZiMDZ3M(RF&IJYWT-@m8v~RF#;KS>Vi%fWfQgV4(P3(2)r~*E zg$vVFe}W6$v1sBS(6v9HiL1IJZuDMeUI$otlX>UdbI*JC&6|0LWtB6=Km>ynxEVm# zPW-v4Aq61_z~t*Q&iTog)!I^GwR*VyiGPc&CF0%7i6j1z!|l*_C6P|tNR&97ZA>nW zKky?y8GFWoO7L;8`e!d64R_&eWm4zwd9(?s(;qC^EdDy>ViOJqD$UBz4K_Z4ojW@3$loBjjgjQ-YAQ)INR{tVIU7jeM@g4TBeO%!AxUcwv2Zc$Q|9% zL2eC)Ae#e9$eopQAh!qozVQkz*h|(e%j~rdEMw@r(0{;n^w5znIbJ&VeTNhH9DWrs z=x~A)EJ%o?(R}g+@VV*aUPOxH>F5sj=LN{1ME+Ty=tXY9734H$i$siLd{&4!K|ZQK zbkLFEGZN|{LiDYofIVLe{U;LpU$YhA3)?cNOnk2deuZ;+ByySjW+QkJ;79@1NG) zDSn8$39`ky53bGC?S6D^>{wi1{AG643m4!PQgYFph=;*FyEGl?+|-5qg_F~{hCMjW zUs$;fNehx4kkyicL*YrOTH93?T%c9dTCt#NHO}khhSn$))v`vWmxiU`jnwc?nIq8V a7pK;Ab}`)8bHr!}potjApQS@Ne&l}}dy4G< literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_search_abort.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_search_abort.o new file mode 100644 index 0000000000000000000000000000000000000000..d804ec8f3e7691d2f564fa1ea4a80730726a2071 GIT binary patch literal 1236 zcmah|U279T6uqjXLms8=YW1;^Z4XbwZV-+QJC`$@J`apNt6;q=7g@cXaS2@_HEnUYwjKzVhcS9Dr> zkF)#E?@sM{>~da(y9;?yuQt^#?=QbHVMxFg$Ri~et=Uo-R75J8sc-W= zr??;Isjr&~&dYvWvkMsxnG-Obs)bYeMYY*Fw3d3owVhU_?6|E)qh0T~opQygyJUS8 la2Nkh7yqwt4DPZ*qL*nrSP9RguK_$k+{TaR8O8Y0{{cjLg<=2z literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_set_host_name.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_set_host_name.o new file mode 100644 index 0000000000000000000000000000000000000000..845f06c37da8648415d859abe883661a53a86803 GIT binary patch literal 1248 zcma)6&u?|LuMvXBBG8klFmI1W=B$A&P zGOz|wD12Riyl%X&q!QQrkrdpDe9xrdG*ex2Ez=qvxjow*Y4vPYGX}!e zcJ!S7Cbyj{6t=WH&+{A<@1WhXt?mHW7Sc#@fA4O)viESi1uIIF#n@)}BD=&chg6ne zNp@Aa&47C&M_64%;riH@%(Y)}VZRf=4=iB;?|L3^cSs4jb36~cH*_5P5G~k?TSB;l z?vb!P+W7y)HMG(3t^{^EyOk4LzC_^ zCG<}Rs)r#lDY%sBD>SDA(Byb~CE61lwfWk^2mc z!MMk52a)>%yOR0tnZeyR9E^_5Z7`g{01UrR0lBkA4vcoc*K=Q@1#1~L=f39*xjT@X z`#;`B3mxrJV5Re|2b@3&_$|ccfD?SdgpNoW%_pCV{caFP5vjcsFdN0s2#`jF{PR9p zi_DT|kkgz!60y;GTT>GSA(6Zr9YL~RA&G2$j(sHYU;Mfd~4r;yA5 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_srv_set_visibility.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_srv_set_visibility.o new file mode 100644 index 0000000000000000000000000000000000000000..71f5d592a820cd6d7a323e58ec8d38b75c1d67f0 GIT binary patch literal 1268 zcma)6&ub5k61GjY-HnK?(-5rR;gBSk+ zkKX(zy!Ft#7ft*hyfyXKo4&{HEQF-Sm&|YP@M0YK&Pi)sV?PHryQPikZ9?RMGXzcVXXDT;x zIa#y0CGVFD{8JxA{0kDQAxzY5VgPHt5%F(Gyx#I6 zLbu`Rgbe;5>js`zlU&kE3-LH^u3~T%V^?v|`QkX}p2TlO3VWFNM8r2ySNH-K<6-zs z#|SJms~)(x|6&EI7ly5Q8X1GzI6nzui@TFPGRp^P^fPk@*>XM%)aY~b>S;k>d4JJm zo*)EQfZhzLXw9a?;J{1GX1cfjl0Wu+y4MW}=gS|j(t`|#Odk}jqT*CKs5Dzg>OWS1 z-q2d*lBT!n^>(eJcS>cgrqhB~__u&BRmZpHOhLcAC>@XPH;ISeLrkmzR1s6yP}F+~ GY=pm4xs+W1 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_switch_off.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_switch_off.o new file mode 100644 index 0000000000000000000000000000000000000000..e2f88dd48d2d1e58fdc5af10ef18e3fe2b85f369 GIT binary patch literal 1228 zcmah|%Wl&^6usj(#if<{pny{Z<0h#~A`t@46o^3L z7x)mitmsF;SFmi@bqDumJaL*LF_Pz;d+wRJp4aEHTVafWY79~kMF3S9#Is{V3KqbC zP%o=GpRzc49cjj!}KFZ<<#+Fj_jZ4j?u9$&v?!(_eR00fmm~ zyz6-_(e8PJ_g&HMc>SXzOghElLn~G99|vte7+Ov`ZMj|HTibTVew*3KoJoh*gCtZ-DAK9!=7li5Je!d zqgdd-;==zRfFCwR6L@Pd03P%yAa{mmfw%j;p8pyxSc^A>2)eCf;SbcJ{*SlNLR&f) zT4`UaAt%s7egknncPETvh}1qwnDp}a0Me+Cf7+*Nky&vYIgQyS z5gX07HfFLTALXBfC{=(jNT`NtsxGY!YrawXcO>#INk#cqq)*x46xseHk~JwLzc!`Q zpJ}YqjbX9xO$|-&Q+ki4%ebIG6o6k zqxDYDPX72f9}S7aMid~M&FgUcTwc~IO|;qh)h&~T7+e~k5xHp0s>a~)WUSn`#!T#o zG41P$hW*7y%iE9?kURwL7H#bE&x_UCp8XFec#c~u5X}XEM~Lfqah_6)2mTkeRe~4* literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_switch_on.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btcm_switch_on.o new file mode 100644 index 0000000000000000000000000000000000000000..f00441268c98caee7389231452bd861bfb56b5f3 GIT binary patch literal 1224 zcma)5&2G~`5T13M;?hb@ODmj$z=t5Egj!CCM1+tazfOfqq$G!`7dLS&5{We6Yzq-c zyaJEG3vi+j0Z+lP;no|>c)f8*FO0PNeKYgz&hFUzx#rXvV<3$|7Ge*eA)I6(6l7rq zG)R40eYxsce#H$~cDX^e4+4moI-klm#T( zx_v%$d)ynkvgT2DF+$AidEAd-C&Fq_5a1IS^7^z%Adi^P&!$Z5?U z1<`1~&5((Sbd-M{p@;%}K|(d8$+~nmtoc^PzatUt{q*vzR zw7G@Bn;2WeLFY^1pgzgFA_WT*=R_itb)_$HKCZ&=KQd032&>1D#6J}%ufkTGM#ezL zIlk}w?xatK`FKeZ=)1?Zm{-AwlgLE9>MXXnzx>ODAOSak-XW=I&4$9@nMj2*^{utw zdy!9lU00}yi;vdyAj2VZ0;W^3a4Nm3G@32zx)5C3X_iZl+pO2ywT{~R}oWSVYuUAUyXr{xmPh$B+FN+kb$I literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_accept.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_accept.o new file mode 100644 index 0000000000000000000000000000000000000000..3ed59504420525838e1093e8916665475bf34736 GIT binary patch literal 1248 zcmaJ=Pj3=I6o12?3RcrnszTk=jll%OZk9?S@nR_LfRPqcn%INMvcN`2ir_Lea_Yqo z;K76GsUN|E-g;=_7tpgGpoyn?BVP19b_ce5@Fg?v{oeb%c{6Wjj<%|tF$Pi?q+x~t zIt~cuCxkT2Lj=ZOUvSRPzQk*DO1yHk`H6o^E-NdY>&h|z$l?C{cU{RSca;){i`DV9 z(+~WZk52=qk#h7|wDM=akcf5QVsTvO?|GsD>GK~f)!6uT&gCXt9Vs`;Z+k{l3IdwH@Jv8An}O*!l2L^;8+NQNuK zqxch7yKeZ52Gx)v>sHW#H3!oF6AkCBIUdQ2IXp>&1q|#@kyDc(@dF;eii_*$yo$aB z9JD{$FZD^D6-{`Kf$1g?%eoZviq{{4-+#Tapf4+UsRGptLEM{w{F{hp=kTsh{O}|` zO9?}A2GH`yL$G=&?$ql{eg5_3D{}}zxPrgmIXmSn1sD{jxlZ49eAsX?^)(j2+4o_! z7Ni8E+MrcSI!?u%Ql+-5`)Od5tF?_{)u?e^-`X?wiW}7}gIKRDVc?%M@K@O*Fnr5T YdY8lteTnrG^8gLhEBIL2gz=L90f!2V@&Et; literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_bind.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_bind.o new file mode 100644 index 0000000000000000000000000000000000000000..e3f3e42dcf75c100bce381ff7a208f23d8b73b60 GIT binary patch literal 1220 zcma)5O>fgc5S?{CNLrz!RZ){*fdvI6gj!CCAmT#v9g0h;CWlBIjGb5{h%~`*5fKNj z`~`i$*Xxa2gQ46H*M1z0Lvf^6%Y3xv@83Mw_6aFA}q?*gB$D$+YBUFlBL)+ z=`I6xG99|6h3GmQ`+_<4E7i5%x}f$<*96s?Oh9!;l#n~8=0WX_hC}-ZE!aynUDp{{ z$F4o0jsIU@A|KTsdB|0Ok4UJ82+_BJ0`?pW{VNjwO>sr|*0@jD z;19CSJmWnnCBL+!M{scs#TC?IIB0*gUpgo8u1KMPg_lIU5Pd~1a9Iz+@4rGP49vPO zlz^`T)q_Cqu?PkmnC#Al<<-d_n$_oJ%r_SavWxW~$i6!7cQDs3t}nhaZV137xQ&!t z^vt@%e0M?TwueIm<fgc5S?|LlC)B3BPyH_z=9%DLRU_SAVNrx?*J}AO%AyrCh zegYTn`~_~6=ud!O!L2Id(i_ZVz4f{%@ z*(#j;KCbM@LIJK-k1Ox{R@?W6L#uNz@ElB3i^Yd}sxdfpJB~ZjtLe0E_IyX*F*3%x z%yuT1+tRZ<%QKL_hj!bs+dW`gNW=NP-3QIm?$hlCEGZEdWij;<+hCVN8jG_8yQbV_ zz`ar5x7&!mE3hk>>l|?3`QQWJw|yIU+w*|C0}9BU;aT9FLBH?3MGMyAw(q;W_Mz{1 z!3&)OuA_(Ax)gY+w=V-upa%R3Vl?0c-!P#gl1BT<7r}Weh(m}pJ`0$v;u8X-Q6c}V zPu3!{()@fnnS7oKqBswP^52N_@oW~B5O?| zQIkUQD>J%^hZ`s^qjnJ|Js&+U^+~=fQpjSWPb3(!u8bwl>MH#CCw0QmxcXEH%~hbh z3bAP#8G{X6A5FB`)5#wm=O<~5wP}ECF|WeaxxA=nPPE1Ig&3K>--PPJFw})=00$; literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_connect.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_connect.o new file mode 100644 index 0000000000000000000000000000000000000000..ef939ad672678d89e6dc9bfb9973446e7a8292e5 GIT binary patch literal 1284 zcma)5&ubGw6n?WwYMLT8rIP+wY?KNqvFoM=EcKvinn@~YBWc0jwwrXZ0rSJnR$34$ z(nF8Zi&g}|o3|eHmV@BQTm26d1U<%E!Gpe+*=e@%;=s=Lz3+W9Z+3p{X7Zdd2C^}T zK{o=}7eOG|F~nd1g3$hOpD*(a|N8#f(RnrWZdmnyjuiUTmpqai*xy|^j z!D|lj@NwwPUCs{Rg|1GiSJX6z_T>}hNNqjmhx{#Xx0F^e+n)<9-dfupnb?GO_@v19 z_~1IkzI|bn>+?T)FRuqvSLj4WnGI)vU79NoCXNxoB*qzGas!dncNW z$D{d*V?}55g#IWootT}SiYB$BmVnd^9AH{zsRC>YX&_Zxy1BZrv^c#2eM*q^vmyU5 zyT~HG5jM)k*d^r}1FgAJb<7f?V+-7r%(fnCjl~BD3T=avC#3A~u?DxWhz8KFZ&AQK$gNNT`NvvThCqtl5zI zZzSR_3Pt+D!Y6HT9TRJ(k*G-_`4x|T2PfB2454-bKU&`)ezZ^WUy(us6W(Kzbt&g< zUfmDB{&;h~PW7(hJ5zz``OoYXtu}&oaj|KfcXsjzI{EI50T}BB$a?dBp!?HpqTb%A z&^y1pWy0Wtb3hM;Tr_4#VK66Bou2mXUQcYgG3{$u!M^v=YGs&oU~&Vrd|JmYwVcis ziuyl3FtYi=d@64gIA6)E8mp=Ke8wQ#1Isb+RT}uN>>V(A3yA$2#l>yo8b$^Ho*<6l Kg?UOb9`s-8Qkzi# literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_connect_ex.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_connect_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..6a58226434ef0c7f7015b385f8bc2fb8ee53df55 GIT binary patch literal 1304 zcmaJ=O-vI(6n?X9p_K@Q)X+lJN-!xYY_{0MMoqL7rd1c403jqEmbPqw#8TW21`-lH zV8X!zK@vqxOgw44aL^k!FC6u5xN@yGJn4Jgowg9-Bs<^tzW2?%+4Y@dWMdG8 zMg*{H2cAUD5QR4ILiL-$r};P^<<+k*_FKa3p8{d`;T!H+4dpI|{h#-EFx$4ZG5U^w z5548R3++4aIm7}#+CMztk2%{>UcqZEJP_^+r#V!wop|=|9BlJF{*iy-)dS_goAEvL zW&g}1gB=S{^`A`eP41tC=+RHsKRa@KJS`XNU@|kCc~&wCqO!bf6w6CXW>FaCDnKTk zz7>g1mRGEzX{|*vu~ti)&BgL-AyCAd*lMY8+BGaIU@>RevrK`m4& zpju@L$Q@S`pcc!elDUKytfl6Kuoep|!mOP6x&MS$F-OPK;&|wcb{$UOc6cwM&*20o zn1~>fM&rrn#qYWkyAY`z+EDN9s{jx~h5XGvS&Ph)YshKLFp1b`zCexH9r-AK*Fjqa z_=SXO$R_J%QNWtZQg6kCeJ^cA`Z{f&w83pm%+w>hCWYiznsgl}*HFBGS_gi#K0ki6 zPx4=p!a63_i8xKxm9fNT-3`D0N}bSEtKLvtrz%k14c(12G6p@^Kd)=evyy_ekqN{ExpoO91TGk14BJ{I&MV+>?t5Qj+waOehs)W{Hr zB?v@aCor|7b}-aOnn9M^PlW) zJ$wG^thgr&dAL$KE57X-4dDz1MyumA`@Npk6ab}M?vWa=_D}4lWe?R-BBAOXVX1ps zQhSr!O{UY^YKo_L5;6~PEz>d^9bnr?1DT_Phqe5{)7>g8C_xrtYyNe1gKhZ2EW)Df zwz9*3JHxIp8;HVou`QWxz2?GtCxEw1VFGVB4sg3q0lAYr1-#kscC8*-uogFkuse+t zVL3BD_n+_%=4fjdJP+;fp~ngQ9>0kg@;Jd)OsI&Y(R}g+vETDzA0o9+E{sR_7y%Nf zkbl}IYmr%U4LQw`=SAzSW0#G5lz-x()ITGk8nVf{WfZXHKgF`&O{iKFNPY3TaGyAmTMySH=>jbwB+6D|JHOsQN_l zU8z8MKWt3W$QVR%d_2~sS0{g9lpm)tzBLJu&F1~Ec_r`G)5qHE`tp{!1|M959i-%< zIco}oeMH%4-(Jc9k>X=7rhQ#iaGdjKc@wq-Y_)*vISq%*i(I*Kq|LK}QPL~fjBZql x#cH8u)G}GUV370J5(d6a17DXt1Y=H_(LP4-qxSJz!b<>o#3)`Ix?^EH@P8#lhmHUM literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_get_dev_addr.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_get_dev_addr.o new file mode 100644 index 0000000000000000000000000000000000000000..9b2b72114e46a0410b7649e0dbc7feb06ce5e43d GIT binary patch literal 1252 zcma)6&uW^P+!+Cr!QertdL33n3hQ$;|uS_r9HPn4RT)&8RcRKn8;h%qxJlC_;sq zAOq_Vf$^8vlbG?YswQvr!|Fv9Zim0?YF34_)cN>CIf*o)kE6{`?L=a&4`=anMb(}| z=GPB)vt9oE^R#|Xnt3_iIISNK&5k=6kIfghYxeA8)9Upc>NhHt2U_NEbmVkxXR0-F zIn5ZjwzjS3^*8yg{LW5REARr(L+LKcE!*l0fMpSeN(a05Th-l1TZa%8Q4dr4iVY1jar8XtA~sA1#_hp?xTn!iJPUpC)NSzj-~Jd8C2to F{|ARBi^Tu{ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_get_min_buf_size.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_get_min_buf_size.o new file mode 100644 index 0000000000000000000000000000000000000000..9e87727730fe5fd98f5df06a7a62a8d80137a9c8 GIT binary patch literal 1256 zcma)6O>fgc5S?|L;?hb@3katautbnjLM^96B0@-zPp85qsL7$?;@YVpkw_D42N6Kx zA8_W6aO;f=NB9*S2`74knXESnks@`Z-S=kZ?aq2X{IOzH8Dk)fK^mqWz%%Z|b7Mgo zRzQKom(?e$*8B2SQfot6{thGcEO9EGDyFih)Se%z>ZLY}*3PseNRNK7)KT%*&pV=k zKvOl}bZs{b`hEMQ7uwy8n3fE z*?fLm%jr2i3x#_qcRa`K0NX|yFC6UOZb{eoGDQuZ-$d}m_b~UE5B->;+q`M6C zVAu^E7culXwgvOOS9<8Z4M9J4LI-p=2tfCH_s-5v`uI3M9TJCIQwQ06UdC5CYrI~05}Kc1+%hhR!G-a;l8VM` zNDQpWSiW!WoG-36?d!UP{ldqqw;&Zl>KJsZWMEf#TB_9#jKu@MHm!QGVA=I*wNYu> t%|g+t*rccb0=`olUz$Gzdtpgj6YXsh4?K^kt^hnl+{DZDn0&kh{{YZVj-vno literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_open.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_open.o new file mode 100644 index 0000000000000000000000000000000000000000..7426e1d70b42bba053a983c7ffde54ea8620ecc7 GIT binary patch literal 1224 zcma)5J#W)c6ur;+s6#a~5=5HdxQK{> zg^`hwAHW}A>&^epl6Nj4|NBAPtKQpyei^ z{LGMsRS;qNCHg4Zcw70Aj7x=HSh^&AtikP-Z>p4$u1j#5noduI6Hya)BlV~4L?YIM z)3xdQ+Rg!_e|={++NIw=3%sF+qIRIY9vB^GJQ^9pk#$76RxTIhbaQxYcP)D&YuT)< z_Z>^#R&(mB+*WR9CnM*Typn_BU9_8)+35qzAPp7w_wKbSd%Igr2n!;Mu=QY^U1l4B z1WU3MyDHpapo}L2$Lt_Fwu?Q^Z0n`sSZ^Fq4o$}dr86FbVh<@HcTUNJ(j5*4))88; zmts1O-R~Sb)|d`{zPN@q8gJOM(~R35CkT4{3Sz|L1fQ`WBa%k7H#8F=)T&jJXT>sQ$o1R|WWlgnIDced{P-&k@(ZB5}Vf zSK+>x>*F@~i)?u=+(#(PT>uwxa}~u4sIB2e=cDt|ocOaMh5J}|LBtEbAI~{1>p}SQ zkL!ei*^@7nfUg79gFw%*2nKOXDsy3Zck+j3^?4cdjYWd&Y&{5)ukQA1&9$@p^RLV` z1YiYjAte{xvo0{-yP&x}#ES>z&%A`@8WV8!{jf?GHXYbJ1Vt~axD+3k>y3TYZvsQp z8>OOdG-|bGwPm!5CB15p=egw=_&*x>N7)lFd|P8bnp+YNLElhf6+lN!;eek|jxYE> D8CZbr literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_read.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_read.o new file mode 100644 index 0000000000000000000000000000000000000000..77ebd180053432e60b7b2c1f79afe9628d14e44f GIT binary patch literal 1224 zcma)5O^?!06uqx}OmQ>=6U+cM+URINoTiKL_ zUApuK_y^q0-mU%umu`$1cO)+KUfKtAR^FuVoO|x+yRWzH+p1n;i~$b@X;@|eEjJ0} z=Y}+_g9x+F(Ff7So67fOTq^X#(go>54Q{S|Ri%t{Rf5yhY<41?h?=+`sXuNf60ts< zZp_}*_KqO^^BcR?F8%sZ;0-+#wIl7-(C9dm@z}5}vq!pCE*Io>xU}i+#>)>$&1suN_c&relKAnM^>jN0g8|r{qEDj)p_)1zNC| zVmgjJ=o~xNgbx0HaRqHO-mqt<8Mi%75cK#Z#E8cUK4C#dB#rJTpNQ9WFApG6ymw)- zx~~!-iwgNyeY_W$IaiU>J-Z}g(0spS~>KN|Q)*;6olTVp?(TM`dJ-%w&5Ku1jBfFDtgFZds) CCxDdz literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_reject.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_reject.o new file mode 100644 index 0000000000000000000000000000000000000000..8c870d6a7563c50ab511b3611f783839a8c103f3 GIT binary patch literal 1220 zcmaJ=&2AGh5FT$fC26ISmcOJ#Wd%h_3AHvQ5)ndz{0G=JsL3I>B}rE#h>);x5fKM2 zJOUT)yaKmM^bz1GxK%}5dV`sGz1{8sOZLn+^UaJswm(*_8ep4rBHB(|F@cCz)Ivz)9j%OB*jBbNrLt z>XeRu9o4o~Ax|diN40k&yCJc~iE6aCw{yQ;*?F?nf(0$c;%rsF%&xF&kt9p8HMXwZ zWx%Jik?8hN3RlX3(p={?7tVVDe7`HYzVu&f6Z2prr9h3V)SX2#`e! z@q;{7i^xhhQKuMnSClV-Qw`#g|B)w^{WB_5Lk(58fd;HOQTFes$oC{Iink(piUxmB z>-b34BuIQMVAnCZiN-~=UBpTIqy18!)LBu5JUaYMAXatB7aT#m4!{2feUVU9szVHS}S5A2tMR>;t#TCN9O@a-+FthG}5et!Alc+09z5Rc+htV#%u7 o#Cqun8~>z@zsj9~9ZEm%T?#MsG1gBm0aQ?~;bWn9mBdT_2i~24Y5)KL literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_set_security_level.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_set_security_level.o new file mode 100644 index 0000000000000000000000000000000000000000..5029d462f5e7587c429badefdcbcf2e98c68c4ce GIT binary patch literal 1272 zcmaJ>O>YuW6uoZ-5ZV~prbfVtPHIh{*vU|dHg1$})M+t=1q+jLpreq0;P9vt7jFFl zZruA9+;!1^pziz!t~7Pmo!&b$50C{ndGFkF?s@MHZ{F~}WRw|WAc8>>W(?q&M}k?` zkc3qT!|+S=Nz`~(RN`BmkaAgpozOR3NhxrixEP*Fr{PNEaisdG8H=rS;C$^uQq<>= z{PmsPZ03LeJS*Q7&3s&|oRv@dW{Z!8Lvv(v9PP2w_o}STPXLd9D`zbZ6Wwi|C?%q3m{_De`|Es2%`%zq4Slh2-H>nBSfJLAO3FBd7N{i^X~Xc4kG)ynauo z+T#A=mU#vlF1cqfgc5S_J?khDTct0IzMz@kM;2(_FNLB)mUJAg}2lS2+j#!f8~i8R4>D8dJ*Na0(TQFqwhQFmY&z&^|OXK}3qO7+Vdk zu`BGVoMb7MW;dj}3^Z>%@GTp??{eQ0$aP+8zVp@xZQt@O&}`2G%^gxe>bzC}tvehH zoCB0#EzR=S$$Aa}w{05Gt7XNFXp#SH!~4 z^C9^2SMcQJN%a{c|5t(XA-FzEBVwT9yn}<={O+U=Px2y*Eez|k0MYq;2*22Qo^skl^e}H zeenV?>qfIwG|XnL)~dG6cClnsP13)j|H61+;+N)*!CY7ppJ@k23NO5ZKDi7){g%dN KqW4N-6Z`|)l#)gO literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_write.o b/hardware/arduino/mtk/system/libmtk/debug/vm_btspp_write.o new file mode 100644 index 0000000000000000000000000000000000000000..de7b619313cd3d937fd7c04ff35a94dd1068c0af GIT binary patch literal 1228 zcma)5O>YuW6uocwC|FH_v=MOBiLDXDPKHX95EH}a&^Q%SSP&C41v(KD5geu}apA_L zOPBrxx9+-ktG~dd8)NE@#D(6=o5$D6m&`loo_prqH+SB9TQ(|;F%W}60_G7wg9pCM z)R2I62*BiX=s~FVru03wDd)O=`GWkR0yo#bYI0J(Cc{~LGC7q_1A1UTSbf}#M#Eh= z+nBtoWRD>6^Bdc47JmK6iGnT$^dtRc-)uXh;m~|#_Z$loda;;O67|7}-LdSkqNh@d zff;2_OKUIEyXkB;sbtiQnuh#sw70BQy9X?Z)R#XzxZ5Zl?C;jWF9leTMZBAAi(T|Y zS&YTm73mfObu{iftu~@#bL- z@W2|}KuRupCn7Pp!&B3l`ev-ePu!UL8kTTgzOZTsb{yC_2GuBPIOQJ}tF=RI#RaBr z)CzgStW_%Ya>H!o3r5)_(^Jba@kW|>r|dD9%ZpQK>Rk*sM&~HH&i5C`!}5q?{K@|S Dd{=_z literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_cache_read_char.o b/hardware/arduino/mtk/system/libmtk/debug/vm_cache_read_char.o new file mode 100644 index 0000000000000000000000000000000000000000..f79ccee8b87a699205adc6322a43084edd415687 GIT binary patch literal 1240 zcma)5O>YuW6uocw5L!)XQx$Ncqt*n(z6_OUV~mz>s#7tA1-o$=CPE^D!_-Jzxb-iX z_%}>kbkUt#{S~e>b=Sm&-piW@v~}T2-aF@>d)~V<@8ezBs4&JrHU=q}MF33^gmM!@ z3Kk&(!%s_(myEY1HF2#QR?n$$GyGLo(<&S$kB0loexw?G6s>(|#p4TIIE)=Bs`d<0 zKfbZ+t-{am2bDXrn2)jQLFIMdv@N^qn66`WOuK8jn5-6y_q0@Fu;<#2JJzb1jArya zN88Y|`m5}Ec5^eW<#>)~A%7d~mSeShz|u%V`Q4qn&C<^HdIQ2rghkm(aFv~B7XxvY zU`cjaxy68w#(mFfBYLjDu4JzBf_u&z4|vD&Ea2_Y2)H|-fZSQ018xucedi@wuokyG z&+WDMJZI$p)PKMg^w9Q(eJ|~C)8_<1pI<_Z`kdf1CNxCSXg>KO*l+l80Fl~z0n3iBo2)BiiSv38e*KX; zVPH~yrUZ^vpnMQ6%+kmhByilCYV)g;KQzft(-^C>0NKfW5Uw7}i+WF|+R63hEfavxoFOc!r;MluGqKvyGZ-!_<7pbWd+C6kCxl8=D}JAxKY$`$UiC8>bv?soM2Xs zdLeI^^-85tZko+}!6=(#eC~KAzDyI}mOBRXbP@WDE$j*Ws1jm)5rFPi5-*NHF&_9| D0*-~6 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_call_actions.o b/hardware/arduino/mtk/system/libmtk/debug/vm_call_actions.o new file mode 100644 index 0000000000000000000000000000000000000000..1d64b3fe0b69786f83280be5393c655fde820d2d GIT binary patch literal 1220 zcma)5&2G~`5T13ClC)B3%U=?rVnLBoLRU_SM1+ta{{h?vH96#FoYW$bk_MbDBI3Y> zN8rMpSKwBOJ_0-ix2lLsZ!nYfx~@-*w4T3j=3CG1eyo{w#uzAJkcD#(z?4p`Fb8B| z3F1)vw)|q*{7}uLZVzG^xEK48&A@5;tazjy#T$v|iRPDXGPyW_)0HzVqrZae$xn8t zTR!=9T;Enio?dAj*WZn;zC9XQc3%u92UCDXrSeG6wkL;f-*IPpBbU?7p>XtVBX7LT zZ{>@{O})SiJP)M@*vEG4-VoR(nz7Q}&cjZ1=h;>p7PL4^u(jw_c8%SLBw323*}8V0 z0iVvs!tS9KuG9l%xz30S=e+>FZwniEZ#o6;PRJp2o)>`kC*!emfDq*3wh->HcPJd( z_W#N)1kzX+yaJl-OV1`1_3WFd6P``#D<*W*6r*~=#c|#B{0M52Pg40`d4vEtj1WGE zQ(OdAwt+U)sI#JeE4Y*pj`B}Dt>T~2APyypw}}Dde52yu(UA8^Mig#U;uH-2pw;y~ z$w@BZwLm zZo47h@_d@>s)patgXMkL5U{Zi+^iV*DeYF8tvw?Q1FK=S$|cik)$8qA$Lf^IX3Zkh mYe!i4CM|qb?hLF@`}yorc%V;_Ke+@@MV-dWLiZ|(hx`v$Mt}wY literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_call_reg_listener.o b/hardware/arduino/mtk/system/libmtk/debug/vm_call_reg_listener.o new file mode 100644 index 0000000000000000000000000000000000000000..a71da8ba8286178b21b52cade37d25c623b13e4d GIT binary patch literal 1244 zcma)5&u=*54+ z#DBvZhu*yEU*WB(w!r zSb-p9zpcJrH9r+&kq4bX3?2o3#A9#~z08iaaj+746{>z|>iTjAF2a{u%y^*H1_g*IJu%rc9h^_l?vpejrPiGMp zWgFUK27EZ`3%i9VT!|gUT&Kr{^HBglw1o}4H5>wW2V{^s%`?E;gMQyRMhWKPwh(T& zbt0Uhcd-9}`>3JvE_qt2@f(j5_&t6PG30TAF$N4o^3iDW~x9mSt}sQh1%P!82p-YPmU=R4*9jzqpI=~22hsZ%oe zgRD8VWKJ?kug&>y;^HZEE~D=jcG_PUJJm^@6)Egu;FO5hR9=cc$Z|{{w^-i1Ppd literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_calloc.o b/hardware/arduino/mtk/system/libmtk/debug/vm_calloc.o new file mode 100644 index 0000000000000000000000000000000000000000..41220bd91782eaa1299acdae0edc423a27a84522 GIT binary patch literal 1196 zcma)5&2G~`5T13M;UW~SXGfylCGQ*i3lM<{sXu~YI5ia_2>u-;cv$&Fq-1$W|K(mR2YwA^Yja`rFEXmf{O(n~Kk0(Rl>0tJ~ zF!v<#+yVF9cRug~$9I5t#$({#hzPlJJP*7(8V=o8Xu)3G@qMq~IrQBz9sK{|7TRc> z3&Kt_wFIW53VZ|eqQI1nv0z{(jjku3hU>QAG0YT4!5(els{_cOME+Ty>_u*gO~iD~ z4v82?xGoY9K|ZQK6j{h{jDUK`kbN5{V9(c5|BN8~jzUHHRzsh(!4E|HQx^6lN`7TV z|AWLtaS64{xafQ$v%{Ywt`^&E^tj6F1Y#<~TU9+Yz$cCk0r@58p zcuR1a>#BnL^k?N=*z{rZ0Jv2)aVtJ6H=289WB|KvHA_XyZq{n8YTIrXOIFpU`b*ch k@jtZjPx2;UPj87mXjVx)$OFv!GQcCu>-ce0h~rEB2dlYsfB*mh literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_callout.o b/hardware/arduino/mtk/system/libmtk/debug/vm_callout.o new file mode 100644 index 0000000000000000000000000000000000000000..86938c035c57d1a70760b036a58db31126a447a0 GIT binary patch literal 1200 zcma)5L2nX46n?WnrLC=PQ{z&JZnP#;+R0K$B*sK36i~O46ij+s7rGG=5M2f%@nC;| z2e1ARZ&M80cV-f-nOp$|RN@ z8B#D0amamNc(LGoDkc+mTCpVDkDaEHaAscQj@dDkGTEy#d4wW$V%0EgP`dLL#v!lTTWZ}*0!Co-)FWmx!i`8 znMAHW~2#uq(U< zq6j3mGz18$>- z#yO+BG*d@$f~ev*5oZ-A_=*J!ku>Td)A|o2@;{P__AN`Fw!trC2jfikq?G)| zg#HH;8^t-)uHmBRTf#+i((j5CHnHFlQK9?lT;rr3h4a5!Cyb1`hf3s92dYP5F)Slv zK<||sYm;{;e{57AmoZ-r6J*o%C?qb`Wj~s+jOqL9zf4vma0TunB^O<@V&Hj@rO{4v zD^BIFR8DhUHgFFQD{sQOfb~P*PQk`4|FTf2?%NX%aLZ10C-1n`QmM9EckB5bXV)de n8(+A15?wq?!4TZ=rqqt+mB5F2jA+gSJVji?LDI9C_+kG6%iDK~ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_callout_ex.o b/hardware/arduino/mtk/system/libmtk/debug/vm_callout_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..6692a6db2dc9fa873247008c52ec49883606ee37 GIT binary patch literal 1220 zcma)5O>YuW6uocw5ZV}MQ&Yf+PP7^j`!ZCb#Es<}>r|S;g2cr*(1~C`a2QO93%C9R z-TN2ZbpufVErmpNx?`7rz(^YTs-Z}T&Gw;56Z{|Z;t1!ku1cM|jGJpdo31nx6 zB&@~t*KH?rxmSdo63%w zQQu~^Gr3$!$?`1EK>h*R4by1%fTfTI@`wA6nx*}x+YJaxAr@xq{tb4GZTey?&Jyf~ zbe{nqPY1TqMzk#lyMkF}pWEiK4gAQk4dCtZ7`Qd0gxndP1>PAB2Id>IU@vaiw$*D- zY;#N-zg*lz8y#)XwbS`FT~6S4`E|sw%L%?dIB0*gUpgo8u1Fz=h1W#f5Pd~1a9Q`mpMOFp^v$|2 z6rZO9)%`&4u?PkmnC#Al<<-d_nAPWH%r_SavWs;;$ey~>?_jQ7Twi=;j==|4;4V^f z(KG83^V|iU+a3-Pl)rEjI@dJ`XU`AIJFsQL))8>6sN$4=UaZv*Rjs#Y)LHN9S` xG|ElAnJ;K%ojk8hTgU%V$3M!Ng6>%w`|aY0<0eXou~h*2mJ)ct8s&Jw{{fRtekA|^ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_camera_startup.o b/hardware/arduino/mtk/system/libmtk/debug/vm_camera_startup.o new file mode 100644 index 0000000000000000000000000000000000000000..a19148f2674905297dc67caf597505f54941587d GIT binary patch literal 1224 zcma)5&2G~`5T13M;?hb@ODmj$z=t5Egsz+ti3lMqTBjcj`~@q3;>HLP6Dum{33_RPHbKEInU7I%ySFYr8+ zo+91#-0lF_4ywsg>)=_Zda%FSh9yN~%WOm4WLxZRLT72V%^oOE81V6QDBLch@I&lN z&G*i@@IDCOC$4aTcgJJk{)h}>=Xn8mZ!{cwZ;^tvxGRJ|=uU(;rj7rfJVY9`bSa`! zUmKB5pho&V#N|jQ_=*7ok$kkCcp8pJk)1#!`4qzS99|zl4n4%5=gC?`mb!^Lt=S_d z3gz1jv~VIG#a~7kdI7$mLN%nwx^ydA|z3|42V!A~<>MN&HiR;wo&#VbmDt zILGIm&rbYg5RaE6f$lw)#kdMa97HXwSH1Qv=9jN5BqZP#&_5&=t=Ui*ya+?VOnqxD z*uBW6zOF0O#Klj`dyo;3IRS20Oq@z@Dvf5#yh#MdvYX|S?KJE4cCF)dN@cs|5bx9z j4*p9Af0jQ5=SB&vO+8HG28)RL3IzM!#z*stY`pBh0;Yhg literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_cancel_all_http_sessions.o b/hardware/arduino/mtk/system/libmtk/debug/vm_cancel_all_http_sessions.o new file mode 100644 index 0000000000000000000000000000000000000000..852cc17560684c42df734bc1c153e1a6651f980a GIT binary patch literal 1256 zcma)5OK;Oa5S~q(CM80o<&~5QEL2cR=*lUPh!7H_c{mkrgPI&FF2+d>iIhjNx6p_K ze}ccltrAy`{TCc5aOn+Zyxt`A5HXT>=KJQGo%MMAscO|2W1x&d7N!Wmk|0(H1X)Nz z0#aX+FOt^B%4$aMLRLG4vm58B6Ltb-d^=u$wVzI3?ZVmRbNw}Bf1UpLeqU{_yqPxN z5A2RJ?6`f~>G$of5Qnz!`hIUT^a0Fr`H7xwj*h&J>y33Ym(#7DaP>_iZ@kNIF$F0iF_C^yHA_=z0mbGi_I=dN7vkY5dw<8Z3aDO}y zP8+@Or0=T8bNgJl#{&3)BOKsu-v{oE2#`9@3&1<0!N47&1bcBu2(Q;Z5-uM5f9(zm zX{-xj0nN4&#^kgxzJ-1Az@CSS|B8XUPm)o(C8<*~_>Iy21j(KR zNgtWvHQd}l@)B}a@S*di@S!=Wcf}A2n4mK%Q+*XyewNqZ=O4wBj|SbRO!S`)l-Gd1 z@6;IFML;u^HoH6NV?kbJ@d^jua~4zm)HHZ71sKVG&nMi){nag#f+)m;*^`QDmLm*a z%2cq@+}>QkA3{uXU5em3=jY`eSQD^z0Ng4YxRiFw^~RntuLNwTY?7|37{hcN@Fxg?Mp z8se}BK}dgH+Fml==VOsOtw0PO1b)P0a2~x#pC~86Qs_mf{JE~G3oSSgUnnu{HN?+; zvb*){*{{>$rflS4xO7^4+cBF~w`m`kR)5enTS6R~j(r4B%H^JD@oMkbY1+;}DyhA!kiLhA-3Yb#;&s) zK9xmSl&vZc8Sws~Bdi9Za9nK3%&`x+u-^&b`l>EwsegzlTQCvXnDh}FT7zdq`d{<0i3k#np@j~{MT;inehu?pt zPUstUA1l5~9jNXHy0>vKSVgim5++wCe_&W2m66{b6U?UTez1ZELICOvzEyk1(V!wY+>R*YT{q!48WYxZg{2<+~70Zm%0d$M~vb}MDL^G<^Kax Ct&UCr literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_cancel_kal_timer.o b/hardware/arduino/mtk/system/libmtk/debug/vm_cancel_kal_timer.o new file mode 100644 index 0000000000000000000000000000000000000000..fdeaf4ce2f82ac05829b0fcd49c8513ee1c06a7b GIT binary patch literal 1232 zcmaJ=T~8B16uq#+Yd7r@GjLHiox#TQ;<@rMexAjVAIV zeDPoS;v0$l1pb9jCJv{m?eEx}%to07Prt1xiaw=t5ZQ&Z5X4?Fa z-biP&Yet4=cp7q#a4pAm8f{=}2*bIZ?Z@@P_KS@gOlc7|%@*|~cAG7SqAbSZ?4GvH zfcFPo;WRJ{FUT#0Jh#Jz`$+)bbA$uD(eDHIdPK;b<{9A4UbpKWpapwzM+mRoI23Mw z;^nTP_pwIDIwd`HwwA<{bcyd^o|c%>4=fm%Nu%e<7s2sB@(^Zv)U$RHoppUEs`_=bRbs8D??C}7X`O8w<>!6+bO+!m5DPJ>XW}#3}bWU#aexS6RU>Th* literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_cancel_send_sms.o b/hardware/arduino/mtk/system/libmtk/debug/vm_cancel_send_sms.o new file mode 100644 index 0000000000000000000000000000000000000000..0e0050e6741fd721c7529cf38f1670f243877fc8 GIT binary patch literal 1224 zcma)5&2G~`5S~q(CM80&rIe&pV5EXlrCm8C5)nc`njfdaZKNiLii>fQ6^Ya&V7sUh z2VQ^&;RO(vK1APw0|yGH9*|(h>rK*>10#9on{U3|SzD!yl%4=!83mNSU&Q~rLPT47#@!fds)nO`ivkT|fFZ9=t`E~Z=+e5Xu z@@C3>-?!V&pe>GUPYgP?*Y_}KmP$|bOk;TLwuL*=&1_b;dcM%Njhyi=x0NdtHuOBt z^Bfc(q1+Kps|RcYVXSzt_qbW!+udrwTqMEf*^;)*Zn4|Z6ic&Jb~m!gfP169@3heS zuJm1nTyeyGapD8-IKBhC<$1u}AqAw)@jUSMu-_L0lwd9H_`cg~9s7dz{hxLZb=1ze zP)|KAhnSoe;ydW)Lrm^7CUo?~(R|V+@Ou!(QS@Xd(v3%XbO2doNI$JpwMeY6ftcoO z6NyIaEeA*rq@(=v&`TEJ69THCOx3L+fi>SM{wo4`k0hgXi&Cd#@Ey_NIFdCfBzoT*{uLo?Vq!!fG*wr{%1`qe{QRSM^3kCBgo$3NKzR*TCTTYuW6uocw5L!)XQx$Ncqt*n(z6_OUV~mz>)Tx-lg55X+6Co*r!_-Jzxb-iX z_%}>kbkUt#{S~e>b=Sm&-piW@v~}T2-aF@>d)~V<@8ezBs4&JrHU=q}MF33^gmM!@ z3Kk&(!%s_3mW;P0HF2#QR?n$$GyGLo(<&S$kB0loexw?G9Ibt5#p4TIIE)=Bs`eaG zKfbZ+t-{am2bDXrn2)jQLFIMdY}|!9! z5-iCsE4LW%(YWtfHlpVW>`LZ3yWDf$c)&ZBX92fIBjE0U0&-`04tRUe?>jHig0;Bi zd2Y|%^PG|YQ~v>1&_mlB_Pw;nO`j74eSQfs>T`n6n9vYOqxs~EV87wV0Yqx=1x!bA zlmHo2$UpCswa6^Fj-2Lfkcf@eTb(d5kdN{YeH1FdM!*nG!fwf$~APFiRt2kicFX}y;YA4s1w@erU zaAtBwT7gL;h*8R^QS8;RLg4 z)C+mTtXC?Ha?@<)3r5)_;|s?#@nxF$w%jq8r;E^MY++B}N0kucivV=Dl6Y|pit)hz E0-4H&3IG5A literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_cbm_release_bearer.o b/hardware/arduino/mtk/system/libmtk/debug/vm_cbm_release_bearer.o new file mode 100644 index 0000000000000000000000000000000000000000..b207ac25cc148016909c66b4a7e1398a18d7f6cb GIT binary patch literal 1240 zcma)5UuzRV5T8vh^=b=EtKy{=y@v>?vCE|f3?gX$UW!)(O&&^Lu6OBTg2w3ODh36? z&)`=Pd?@%8^i%j~#FxJ5O!hVxOCB89{rzUx`tyC3RKgE0om7~~-K037M0ic>)j zRzQdJ=hY{x&b!)H#_T~(`vw!^Jbjip(`|iEZyp^Q#+4pS*3Qji$W6Yp>~ZDik2|V> zLff$44BW0ia0Br|cq8HZ!V5$|dAnMDVCLGx)1WJYv1#Y?rqd6FxoZ`y*M*%zskCht zd65^Od=KTG@ccfoZKSF4!T$YDZGUg44ND1~Ewc^nD!az6Ck>Wio9t%dE(1Oq4?@pJ z3ry1A-Zmpnphf%!;&Q|ZzF@*cq!_IyosQ#neH+$%rQ% zNI8hq$LEoc?Su6M&I=zd??N_&>OW{|n|ghPMC! literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ce_auth_app_ex.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ce_auth_app_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..e28d818e648dcec08c3b4e0ca0889e5796c17c02 GIT binary patch literal 1260 zcma)5L2nX46n?Wn1*@@?Hd5Twjll$p-7J;F#+VpNnZ-yY0TO#KSr*s`NwIZVnsVyJ zAK<}*>8U@W-Z+?e^`O7NV-rvHM!e{I>`oWy#h1*y?|tu^eY0<7j*Df^7z1GpQs74b zdu|ZQO#~^JhcJvkz2uyKK8sc6CdvLq)uH{}!lfy3JTH%(5<_v8YHi`DUs z(R+Tv$0KPJ)+5g&rQf@o@n{Dw7RELHj>j92I{(g+jjf;OTx`PgVZEUr_KcQgm;2+tT!mZTB_+dcDFfjtUhi0|LiWxsO@u}oO-|KVRAta z-$5VoFuAXoP|y=c>q!^Jao>vr=*dnevp=~<43I&J^wT;~i_`*Zh-u9Rk!YtlmI!!8 zI?6xwyhp7^+?i67UHypG&0 z9JId$9MmWAuLz-zi9-UOiMk>dewq)$uRnq(ADC44nZQ34C?AAnKaGe%9B2POroT@5 z&?N6K2?3qEZ?pLzD1H)=Td#A;&3<3pGFK3QYp{lpRJ3MMV(`RGO=jv_btZ0kG4(Yn zQ4?n$t=fX51Iae1<${J&{zaiwscKh+VCdz_R=#XhIIk7!Mm@h(E*hkJZ8-+MO9Nk) eJp|)Q39L;$T)_>#LLZ+8XrNEvrD;=)hy53lq>wNG literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_cell_close.o b/hardware/arduino/mtk/system/libmtk/debug/vm_cell_close.o new file mode 100644 index 0000000000000000000000000000000000000000..4168c5dbacce86e59e1c3bf13a11264141a6ed5a GIT binary patch literal 1204 zcma)5Pj3=I6n_Itp%Npl)k1A_57p3MC%ctIVoZecXQ^&WQaChvSQokx42UjMQ{us^ zAHZ*7y!Au$Tl8r4#7*C0c7W~4m(0B1`@P@Jn|(9$wQAQGW1x&d7UmH^Q3kR6RFH)v zBp~%O`6_9DscdHSE@ZU}xVk$@owIYW;`{OX>*I9#b{DR0PV~2s{d4i_@{w9xc`I#w z9ylGZ-*-Cw;m9N2Dwm(>+2-)n?|A-Lw{kh%?g>xdHB94^xnmXz+j^eoxe28wD0e-# z-2=9bFjhJ`c-pEQ?C&&TDUx8zY*kxhci4I~%`$9*-H$wGz(?bOaNFpGFMU@b-|KVX zoeAJ4u5f|3M=Mc^e1@C^agP^RkEk-(ZC75@W)yhD;vx)rHYGPp!^Jd0#a3P~SX;3pUuNZvs1 z77p4U?U(wb{uLo!Pk{FX0#kKWto$Oc!SBC{Cm)?wpEJ==1Zr7f;b z`q(tDvUr7IeI6jXp4VVAl$Z62Gw%BO>Xu1C6yiW{kW@t+s}UAD3+mfT9Lgwu69m-P zl?cwE2g^IKC1C3WxLr1IDjk;VjUyv00>`o&dnMax)N0LY%W0MN?5abWcb;(YJv#WJ e{4qG8rLi9MErXk&`;txq6wq&AgP&832mB8d-gy52 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_cell_get_cur_cell_info.o b/hardware/arduino/mtk/system/libmtk/debug/vm_cell_get_cur_cell_info.o new file mode 100644 index 0000000000000000000000000000000000000000..36519e9b725373b227b77fef08f7e13c2b722098 GIT binary patch literal 1256 zcma)6OK;Oa5T13M;?hce0KzE+ED@xX(3Mjn5g{bV)2VO?YI3N!xK3(Fq@)4IK|~<& z4>YM$A9rK{ ziI#4?={YU0+jU-gfzulL!s(p8=#$1O79SX?dVlD*Jbz?Z>9k>Y0?*hpGv@2eZYG!8 zF|s_%GmyWBa@TX49bh|1X=EQYfeWt%jUH4f!?1<&YD6#e{)KF&a-g4cqO|k0Fx17clL`F#@D9Li$;qtVLqU zP2@CYkAi44-}Z!wj&ziN6rzX%d_qDsq{+JUZCLY_jDJBQ?v#i~-G|eH1$MH za!Ieu#5J7U#Nb7Ytzo0}tz)BolHZCHa+vr?Bs5u9`Vwd3D*XB*$B^8a?R2bOP zv0~qvbH2RVw67Zq_6r{`Z$UDE)N%3Wk2|t} zL{l^0^z4?`?bIeEEMjc-0>W@18fIrqHuU{zga%m-)+E>qOxVS8NbY~u&XhRCD|6cq1=hhKkWoG>=29z|mRRG@qu zu19HP40PM0=aW1J5IBD*z7>x9~DOCLb@sUznhc#{d8T literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_cell_get_nbr_num.o b/hardware/arduino/mtk/system/libmtk/debug/vm_cell_get_nbr_num.o new file mode 100644 index 0000000000000000000000000000000000000000..dc91468695b043844ffe7f8496532a6baf607899 GIT binary patch literal 1228 zcmah}+iuf95S>k&;?hb@OHrM0vrv#y(ppZ5M1+uNu1c_KtL^l9*16+ZgO+Oz#(e;zRC=MN8^f{NcHD_-WHPGR^&E9i&+6~9yV-nxTg_=X zEenNbxR>qNtuC-_q_M*B;qzws@L;zAOA(nZvkhsJ-DO)*g(X;$J&f!y&_1TB8wY?vMgfXSEz??P0&~3{Zkzn(cXRw>9>hkvP=<@exX> zrAxk)`dafjf#mahh|4}F_=W`)k#e-2bTVE~{5Xn8<1>f(%pV^>1~a4&>x37H1=o?& znmtP5p#3&yj8CMa`YRuK7T_xq@(@G#(%I1Soyh+{!rvvH5xRA*6Ee6&b~2B+CxxVs zgz~hxj>+4YTf>X)FOC=WNt_ia=vWB%M)*=KJi>Vi{`?KsqBHj(6TRj@eiCd2Wn>JJ zI0xqq?@s#ItR5_h!Gj<`cC#+Q<7;*9SDxo??l0alE{MV{*g;AvTC)*hu#YGP_3e!a z5Gg+QW9sXA1m^`Gt=5K=2dOjA%#w~%;iy!rAM1;xU>Rn;STL=6wc4mOt!ANURxDD| lPXND73%@RR0@ebXSsxR4Q+d1>Wd-0RViI4ReTwmc{{wx6gP{Nb literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_cell_open.o b/hardware/arduino/mtk/system/libmtk/debug/vm_cell_open.o new file mode 100644 index 0000000000000000000000000000000000000000..b36123e62b506b7fb460fee05b99781dfe273932 GIT binary patch literal 1204 zcmah|&2G~`5T13M;?hb@TYlVvz=t5Eq+K~B5)ndz{5lmbk(wL|7uQLxCQ{NA$3;XS z@d6xq6~v_v0Z+k!1L4*K63k@1vC|79dB2%&zTMfKU4N|FHO3f7V~~L;0;q@}nV$+W zuml>UzAV33w%=FoZWvw2sNZ0sU#2dU3(eB@wEF8qU0?6QWaZL0g3RPQOCObf{dgz~ zNVIh8?ZD}H{k}6i^G>IJHVu>ZJK+27k~!h)i)MYg8iU^m(Agw8hDCcCF>GvK4~AaL7=fiJKt zJ>To|z`8^zTDWRW3#TqkRhSo$XVG-sDc zG+Hk;^~69r%0CNHumGRXp&HU;T{;`qJd^xabi_LnjMS|Pos_{(^bTi{s7WE|l^FjA z0~5*X$gSW<`=k9*pX6E5g>6inkQ17$D`SaqUWMO(B~O@`R*#s(Tm{OjbG@S7uA@9U zZ+vyqC#U&n#U$K{0`#utRiJkfnW$Hp5m(ojuS^IMaBcQpXwI6#X7@}A>RbFRQv8Y% zXw=tL1;_Xg%R7(`AbkwnE}J+MUzY2Q19MITj%7DWMcZlAYRziPX%$O$)gj4=7dZGg hI`}{NV{qaNi=J)Z1`1eLUjlfFxQUPCImLLn{{X*>czpl> literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_charbat_is_charging.o b/hardware/arduino/mtk/system/libmtk/debug/vm_charbat_is_charging.o new file mode 100644 index 0000000000000000000000000000000000000000..ac69683bdcaae4656cde50021bfc96e9e6d59bd3 GIT binary patch literal 1240 zcmah|O>fgc5S?|LCM80o<;w|QJ`|KHba6@~B7{WKd^i;@k(wMTgk+r5N+OX4oGog^ zffINB3=$Ik5&ah&TR8OwGhS~Jsv<_(eQ(}8@7TNRPc^5`7y}gyaxlvP8ZwC&LqiTy zkc9Nt)Qgn!v3fgW_93Sq!|9E)^pSRyv=dv2#;aY!xY~!)%V*{r$o)D#`SCz4uFy8@ z4@0-x_kxZm+`%}cy}^DD4R)pS)XcR;2SL{lCZ?Uwo6bP^=DJm|-WS#irP8Wd?am zgVr-bCMWVy{dt5^1^9x5dZNxx#r}ho8TdP8bWj&y?6-9jLBDc2-8l;115T zr!wYOCx1Mwt14b$FlPy}^L0Hu@0msR+n5UH*H^bp8e))uM@Y%Ffn!-?P)Afj`}SHT zh?Ebboc47|!};PLmv>=Bz{(zQr()q$epzWWcdUQ7!L^;{X4!F@^?Iw;cH8Amr{zE zm^q%~StvY0x$C*D98Ew77O54s z5Yw71BGHaei6Jn(r0=6G8AV1&q=y1v({zKZp({QBadY z(rZ&ZZEhhshujSubUr#S^+|mzLa;FLmVh)>SH;Rt^D(&it9bJIxO&LwkqVTL0ewek z3|276Pl)N=Ngp5QCuxjV!vN9Md<;^Nd{B>i9N5+U)n685b+`ui5t545ENd)s7u2^M z9LgwuB?Ic~l7@5S!SXh&3s~;}w~H1|g}q{}zHdcE;8gAUcENV)l}e-Bbee^2yX=tW mjVBy@j}E>le*{isYph3oOX4A(qEE~NJV(EV4K7iP7yJ*iJ9|a| literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_che_init.o b/hardware/arduino/mtk/system/libmtk/debug/vm_che_init.o new file mode 100644 index 0000000000000000000000000000000000000000..b8f7db44a6ba9ff2f04981259a2e9f1119af11ce GIT binary patch literal 1204 zcmaJ=Pj3=I6o0e)k+xb}V&j4v-55+j>}07VHpWCLu%K>>DJ1r`F0c_2DY#6H#Df<< zfCn#r5Ks2dkI--7#l-g3o4&{Hz?OrP?Ee0|-_F~enf+X~OvV_faAkb-4#;s~3uF-}B=9X*};9Bj({4lUPJ=g9Z_60z#Tz;%)o5Lfo<9ZXlme1=}U%2{~Q83;YHVfO^ zIlah>ya1(#IEUjp?LM#^(pYJK_fe~|`+TzraV5c)STcHpZLpgWm8Dpk-Bunj;N!_a zIBi7X`Ph@pbKh~{eiXpFj&Ojt$7A5$kOZX*ya>EA91Pq;j9@SB2;ueHN5UO1eAIvB z9jwuk#)Ay4>#KkhL<4>caVg*g->{$~l1I-|E`is*Kt~X1eDPs+_qPuqj}GO-IoXTC zk{ihB8M#k1-&MTipd8ho1}OcnNT`P#vTq#?>^YMDPbB_X@*SC5_j57^e~=x_l;4vi z<&}_6lN)F*qjw!IdcQTiXr1J@A_W5rT_VAdeWjKd_M>qASNepJY4^DkxzvH`(dj$P z6AY3lp3IE!?39m9>$5WIjk!R!SdT*bQr+)o&Ai3=wq?Dp(k_rRbZ#ih) zOeqjazYa95>$-yX(9g;{kP(pS0=LQr-b#DrdSl-RN5HOGjh&KZH%zlxZP~5Tj#afO n@zxbK{);yLP2L3T(6rO_N@4S7*i&5rs34~CfY4b|aby1h29J3S literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_che_key_action.o b/hardware/arduino/mtk/system/libmtk/debug/vm_che_key_action.o new file mode 100644 index 0000000000000000000000000000000000000000..fc6fd67be23dac722f25d2b2665f784c56d74c39 GIT binary patch literal 1256 zcma)5L2nX46n+D=ZbhvS8UZ)DF*TvZZk9?SF(!u6&SKn(DJ1q_vRz;!L@By#8#(pj z5Afi@H2w$=dh5Z&i^tx*>&c|vh!=g2*#Sx~zGUZp?|a|On|(8Luwik=7)WD~fpG-T z62VMwWXe6Ui5*^t8KSUi$o3+zfb$x{@Zn+OSFY%=K-2mo~mEuMhT_ a5?Gshn8FRxok&Ijo}y3VrP-kv5Bnd>rjHE( literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_che_process.o b/hardware/arduino/mtk/system/libmtk/debug/vm_che_process.o new file mode 100644 index 0000000000000000000000000000000000000000..e7f0607541d08c2c0603f1ab5864f8c6e3b1c4c3 GIT binary patch literal 1284 zcma)5&rcIk5T3U!wH1*c(%8Z(tHD@O*=(Uvq6aN)U#l*VP!c(4mbPqc6Kio<3?wFU z;NXD+>IL*>Jb2`wHx3^B12pmI!59-g)*A;CoaydcN>5JG_kHutw{NCz-#*RioG}I> z7{uT(1K4zuj%3pigH8xSF!eJ?b5L_RNHlc8~L-@hyGZSfuchBx-4yBNQ z6{~DoYf3I2SM;iFDq~tgdz2VWOiYX@Nj0e^AT^HmqFF3efsG*TNX<@NnafPw94$aV z3bGLE^Y^nbJMD|GC>vmBrArLd<+Yk!EFs#KgB8In^MPuct2U^MMY{-U3FlF*Iwj;z zs7X-E^;*q*h!*Un7H!+AmR4+&=KjwZLLa@Bfa|Asv*mIEzsm;^LoO%yi3J6bG$OX3Qe)vPs}f2$YFx4z3zuI zN9s<$O;2mzU)(as;Dcju5h=OonLdfZWvA3!>D=_T{GOZBx%Nu99{pg|G7Q@=ya=kE z)^JHpr}HzjTAK@uoIW#|(v2C;3)wkiE;XrV4Km#~Z3DkZ1HUP24UD6kQ)@cAC=Rxc S80iGqKpeo!@{DqP$^QV4Mw=7> literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_che_rsa_private_decrypt.o b/hardware/arduino/mtk/system/libmtk/debug/vm_che_rsa_private_decrypt.o new file mode 100644 index 0000000000000000000000000000000000000000..cf9965a2309c14b0509023cb251606fb45c6667f GIT binary patch literal 1324 zcma)5O=uHA6n?YW)HGFWN~M2Gn@WU~*kw}#EqahN%_NnyfwW+6+fA~VfU$M6EeQw} z>A_>|MJs~f&07z8%R%tuO>Z9cq{n#cP2bDxG_g?e!OZvG_r94oJNsrYo#Tu#kj5Yi z-3Z`71pY)v5QPBPh&zRJ`5+q);nm$cy9VNLxslJC=A@R965V{hq*e;j+sCn~|i zR~%xY&%xJsI6H*rhBl*J)lwYV(b(mdYBfe2K#>UyCa-D%*Z`NF^i0C>3E7Ei9`?_m4T+qvwYk^*@*Fkr-C?IuQ zPk>(9s@3cVD8X8~<+@I_xZ~P&@8kXhrcgt_rq9#T|9R^91ghsxAohDc!9_nn7?C(y zPr3k(YhLU_Bx?ycokbe}#E>C@~ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_che_rsa_private_encrypt.o b/hardware/arduino/mtk/system/libmtk/debug/vm_che_rsa_private_encrypt.o new file mode 100644 index 0000000000000000000000000000000000000000..db582af9a103bf28f42bf5f274f613dd3eebf5a5 GIT binary patch literal 1324 zcma)6O-vI(6n?YaVksIa!SJ_%Vro)S*=(^1L=UEvPKzltDI{=Pwq;|RSitQ-+QbB7 zICw-ZiZLZ9cq{n*WrtfukXeGh;l9}(l?|n0GcK6Nhr*oV!2GSTr zp%Vcdx`98@7DS;B0?>ND#+P}Te|z`jspFKYw}b%(VB<+n7`qzrqT>#db7dBJL~n~i88c8rv-k% z`!^u^{R@k1%>VrHffwWfJ)FyIWcI3Nscf50%`$hK%AO@`)7~mMjU9oaOe%Fd99`Mo zbxO9=2xnrkaIPZk@Qe{R9>%BRb8}PSgr3mjki3O*%eIOYU{mP&lZB<()rF(9u2$_Wlwd9062hqzcZFT^9_~M20yXq$dOR(CpQoNrpnCooVz1{DT=oNm5s9Pq zqzmA<;l(~gvZf1Xv)cv$F=R;Jt&_D#EPVrgS~Ei=8ttdGJ$E7<oH+?o`UUg_eqxVeF35V@;3=zRS+=sn42MHlLr zct(zAvaXCJcJnIy`Ym}vU%PsT@%>eS@+ypX(&#am#F^UKweH)X-AR-{L z33@JN;FMfWW%C8&A1lDj W5j=byakvlQ5#lH|)MJXV5&i&x&Z^M> literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_che_rsa_public_decrypt.o b/hardware/arduino/mtk/system/libmtk/debug/vm_che_rsa_public_decrypt.o new file mode 100644 index 0000000000000000000000000000000000000000..50254d5a0a69bc395b8e8d75484f502481b9fdc3 GIT binary patch literal 1320 zcma)5O=uHA6n?WwYMLT8rP9CEu38}_cG=WGiykCRGf8FJKw7Z3%_dz;ps{tcl>~%} z^x#QKFIo`#V@s-UKmwx^H$O~eFJ}zd9*+(^_T(JzhZW_CLrR{3j*s{uYbJrnFHl4nu#MXEA z?6PGym25n&=vBv3=Cy?OFfo@{T%1*sYEn%=>L$uf%Pdua&7vDh6;>BEmRDEi)?q*j zvq3fz9Ay{TSYVt@ut|1Vy1_uLH*1brLUe2oE5fs_ZPl?F4yaqEV}e?$*Fm*+C?Iu0 zO@dn9snx6pD8X8)={R<^wC7lL+W7z3G|K2|27Ec)&okdA2>SjM;-K#nghK!dB5^dI zbYc9i`*8q~tmQ#x^x6O*jtuF0b)puDg|DGcbLNReqxEFh^9IsU{*I3x3-Apcsv%6& z%^`s`cLg87gx8ZEBXm(uCuFdIiOo*r)ufR0QV*ZQ#Wf@&$X&pX_BV_los;-ibfJNX z=j8Y%>WWxkFCT>8e*{k$aI1Hjz&{lzAB0QYGA{nfUbG?z-n{jow;Tjd-t^{CPkM~E-t2q3J4q}Qe6aJq_q}iCO=jL?FQaqD7zkq! zgKh+H;02+iD~Q1WgrWWM0bk)6{^P^5(=tm{VAJS^QibKY)y3tdnIiN_ zVb;%vg2U`G8wrfEF*eSwO1BuO^=8d6ONfr`VMTbhwW&H*!vS@}bWBi7^*X5bHU*?k zs7X-E+qIgtg%Yf#nvP>vOS_I$r;Y!gO`?phrq7qt{XF-5f}rnDAolw{K{y1UAQDIO zNf*ZNrXL3o$yy$CMz0M3;>eJ`S0`$bSoj+HG-sAbG+Iw~J#Qc#jxEp&G(O z-5e5Fb4Tz2On5!%F+vyhbV3Gmm{{vXUQG%~FZJ*_TwFskg4`wiXn%wF(K(6ViY_!T z@q!%RL|qXJ?B#>-=da)i18(&$6ZoeB<%4jgn?{d;f}`8lF5kO4=|gVbO}Rq|Zgd0m z&gO&o%6rYLx8I@8t}nXG69nLbd#|LTIYSZyy))N4x6+wdv^Jez{(gPWul2_gg>w<6-e zg#!=3fd}9fxb?;h^bI(2;L@JR4Q8_5B<`sr?S9{U^Lb~z_I|3ERmK>|V33Ac2CyfR zaDHM)!y+g!{tKzr%ljHFzI|U=Uqtsp;B$M$j zoG*<(R||)bzBv2y`;lzsp<)~wCw;5awXLD;TD=p}jZ$e-OE(6`PRDjenvu? z4Lzs7&#mVQg^ZTxd7gvfL$tT-R=Wo*gEU;+-+kOH@9wNOAQDj60$UCx*bTN4OtKVP zWw!zk81Uh!@3z{At|PE3nPb1ZPh=`21Y zKo%A9&--LAGE1%_r)M@u#Gv)APnejNf{ek>eDjjE3*XI<$4HIUtRRun`)QWmw%Zs1R)Cd zkdlj@Sq?DYx1e)-ibDqFFTI4$H6Fm(cVT%4)?8RS0&bRcoQls&wfes9H-TlC_3ff* z)vMJ;rD-*b+h)Zg&nvw3cpojiQO*b~-_qD`3r7k!QASKI0?@y-iU({`jvx3x{i%OX literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_chset_convert.o b/hardware/arduino/mtk/system/libmtk/debug/vm_chset_convert.o new file mode 100644 index 0000000000000000000000000000000000000000..4e590f6937301b111931a855af5c0c7b58b3a19c GIT binary patch literal 1272 zcma)6%}*0i5TDl%EZ`Sd(-t;T6q1t4W{XWEc+h^m*0@+ho5*e1mW|tlQr#{D5)w`P z2lS?#{R4W?TMr!k1N7!u4|=oSIGE^6cVD~Ii<7)JGr#%0nc4TT&kHJNjDZja2^e|+ zM~)Lr_X!D@gb?&TJm#FAypO1JQsluq{yTrnzve4^)_mC+lP*YM=?#bE#ZMD&6$xHn zmzJbE67=Rz{hjmOSNxdwy1s6xI8mzcE1Tn`n7NgQ-qdM@zu?g=NPPRu7R~IB?2tiyOQnT)Fq+la3yDdkyeIkmdF z6i>@(IR%+pxIj1bS_9Y;n!(J*`t53d{r++V#(W_*&ZYxlc9li^Q5It}?3(W;1G#XXrl$3{fl99JJ>^X(z#4Ccwy*=5ygZ43qiD%fgc5S?|LlC)B3BPyH_z=9%DLM^965FsSUcc3moO%Ayr<0KY|Xb9L_M8ts$ zKY^x&ILjR=N0DmuNwoH*rD@AOI9)qalKKlso&4-x zZxv2{9anZ_p#aya$CY;jyK^w~U4Phl<#J3^i^cnTsxdtDI<7a;tLe0E^|`C>m>KhJ zW;>J1ZRuGfYh)mQ2knmQwEMuekcRX7d-s~9y~o=PSW+S^%3|sTw!tojG!|zGc15|( z!0<-{?z9oPC$J}(=N=f`eb2$@I@|%H?fYPOLkh^9F|uHEhJ%6o8ZB7Ma5(q+?L+SR z!3+HdTtyGHbt&*tZ=VI6Kn?gM#Av_?zG6a0B#riyFM{(%5Qh+Hd=fBO#U}(vqeA{! zpR7e@$xY<6M}8|hZw;p$G|k+sZa7eJN~7Gg uoB4uOw#oF;|BmV=NsedE@ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_command_close_port.o b/hardware/arduino/mtk/system/libmtk/debug/vm_command_close_port.o new file mode 100644 index 0000000000000000000000000000000000000000..f9d61d9d7bdc8a9f723de763781a824ecc93bd94 GIT binary patch literal 1244 zcma)5&2G~`5T13C)@@a2D-ceJz(PSv30*lQ5*9*&G{1n`peBcki|Zs7iD;VQY!ML$ zDxLx!gj)`kc!9nJC#3d7Z!i;k;}GS*NW1gRH{b58$Ge}4R*5kN(io&5i~wHyK`c8G zq+khDFuyOqTDCqF67hTOSOOlz&Ql4v(5}oO8$wxqsaC%2YuaKPF0NfE3H<<4m*>BJ zo|U*P68M$!S?NR9ZuYue=cr{j4|{#rKJIyf^5uN~iJq$UPQ0e;4fJw4ty>-8>RU#} zc%RwKnC6C_1Ylo|2G1pks|%1 zPSzr|#0FwovqdD@DGrT5V5Fn`v%m*5d__Ptq{+G!B(UbO}xU%uVi2`q(HxPGd~>Bedy!6p~>QkzbE`?A!GI@|OA82+RY$MN-k4 zHHAUJPmN~k+ncHQT@X`WR~4LRK3v{}q<~}#xRp0>%I)SW)jeaj80@lD-OgEdwN$DV w>vlc2Z53_OzIBC-@6*N?<_*A}SqjfV{fy&bpQ6{60G^{?#|uQ?qT!GK3!gZN)&Kwi literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_command_open_port.o b/hardware/arduino/mtk/system/libmtk/debug/vm_command_open_port.o new file mode 100644 index 0000000000000000000000000000000000000000..1c2e93f4fb48e14555e8bb9faf3f6b55d19e4d98 GIT binary patch literal 1248 zcma)5y>1gh5T5n#g(z|y1#u2mupme_#;0?zz)C~>?}!VIViy+8PhoRmb4~NF6r;jJ*NS}-?+ez0-rM*P5IX<aYu+7A-npNLtGueDTmB=YMB@2aTxWF)t&Hz{nVX$y~_@Y%lJjgU5A{W-+$KwtY_-DAU={Haci+i`%|HmibPx&5t%HJ;OFY=}f1fSYvXComFz6P|fBD zDX66wwrveMr?xqDf9yZZ1LRPPLoS#4+;TCQfQ#>=U2!p)ADBp>r5LRzo`m0H*Y~5P z@r4_2=En(;#t88jc|wcG0;`B=%`OFT(0;Om_(VL)zjQ5+0(?V28e$0DItEa4BH}+0 z@Vmt$f*0jHL4&`D+MdTX$tAvTA-;~As~Eh4u?T)t-#UKOC-JWcVILD`1l%EXg)i)4 zJOEczhBy3Gs2A&d_I literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_command_reply.o b/hardware/arduino/mtk/system/libmtk/debug/vm_command_reply.o new file mode 100644 index 0000000000000000000000000000000000000000..0d1013c352676e34d1d05897ee14055f0527bf07 GIT binary patch literal 1232 zcma)5J#Q015S{gR2$6AQ6x*EOgo0#aaykbKEDH%7f1D#O7{x9kn#5k4ENk->|Kdqp6$Hs@1ZbZI4gwo@GyEEuWY5 zp<~J0YC(Nd*eaAtIk~75l>$^A;snz&yF*|(gyG8m-s4VfZ+EK=kwA>Cu=P-q-DDfV z6ic%VyB&DIK$%QOj@d=;*xU~UvaKV0Tt)I4a&i1d=>K8b%t2v0EKKPFL^a(?skA-MeG z&jsD;3nqA_0@Vv$=@spE1Le==Q~axwKJ4b_X^b*6>E)@fi2#nvk5=iyrURROQ1q&bL*+%a+1gkC(Sf1q zt(}T)v>J_ey<>DLJ9^z9*=x%&@KqZ4uIwoo%LRD<(zv-A?jf}bKzAyG7e=QT5Be`= C&4lg% literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_connect.o b/hardware/arduino/mtk/system/libmtk/debug/vm_connect.o new file mode 100644 index 0000000000000000000000000000000000000000..8115ab5c8db9bac0afa5bc96474d2bf34e111628 GIT binary patch literal 1212 zcma)5&u8~(yt!{QP4xVeq4VwGJBKp*zUO~*30FBnrcl>oSyB>)OseP8bjAs z_w=m(GP|42=hJFV%V}9C-bcG-TiqeBG}2J<=-@%SaG^PTHkUl(7MwpXwHNJa%Z(1XuZj3WRKB;wKU6h zoniOHwWr=;{sV5Ihg!Sld8xl0j}rtvegiS=ae_~nP!UO^_sJ*YbH|GVh&0}FSkC-2 z0%TAj|Ef>aBD3H+a(ZWvL>#o<%oo-JAKfMvW`>nak>Q+qQK)kFA-3UF!AKS z;LU%+TMs>W^P+!+Cr!QertdL33n4xDl9~6t?|nPpFwDHKS#`!3s9=zRc?HmsMWiqj zWMCCyF#fXkXw7<8)l=8{QT@CQH>2N8J*&e>`gDAx9mN{)hw6jX8JX7T(CfM0)M(^# zhBXkbv2Etf*ZHmd&Q8`S@B+_6={Cw8*Xa&`Wf4Y7`+IlW)x8H>Er@C{7H1pb3+y7h z6iTubOS3E5Ee3ot9SWz5S$Hz{74qDdT)1xq@B>FUz`K(PaBoBfsq?%5yf+#S-B&0< zFYXB84Z4TIozTYrFRr4DjyUSe>73g>rWE$^Wz2COQ~HVx12b{-J?UaNZuoTwGsQ=l zf?58Z06Anxzo=7QBv#l&Oy6u1i9zcnXGl(@qyBwAOBUcW0`gFye0PyR&#~gaA&_@V zGD^2DbxH<*5p{w}dQwSxZGlhV;wF+S$gSa^{UvbFIjP@@5Q^CNK)?^>t7?@O`7r#U zZ3GdTxd$b#zvw`IVMxu}h#2TN7Xxl_b<#&>{h*CC-H&-J_rtI`Zz7U@PXcaveRa#E zAOz=tBP11lv!OAl%GPYAb9=f}&)y_*bgt_f&SySc-h)j6n+L$HiiuO{ab>r;Z=Nj% zyJ0oUCChHs>#bVbZkNhd%_i-0SJ?PIZG2(g6znsta34h+DcmgWJ-G@%cPxz;$f6qm F_0)CF4W@von_3f)cC%CxNiUYaOXF5dA%=L_F0d&iQgqoGi6&k= zdh`SMCA{$syyz$J=*5_NR59nfbk$x3h2GSF|c)47f2!!Q2CAIZhxq z6Qp1rM3{aFKMvR5mVd;f$%9@nc|G~53isE(DamwlI|-MG>2xAYL{&Tr)tMw|`BO;!`p)jQiobsz@P;mm>Z$sApm!|OuuZ)?KGzM)GR6REsdONv8p8{#V_IWL z&1594Z=2G-l2u-1_p+%onn4zOg~>8nyv)do%*s8j?fmtegY6GaL-e zbCh5&*|2S^-@dTT(bCIZ;oiX#lzor*k zuFr3oBk;i*>>?!oPjih3xUTqVwho{nCh+1s IB_BWdKMS{u3jhEB literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_create_kal_timer.o b/hardware/arduino/mtk/system/libmtk/debug/vm_create_kal_timer.o new file mode 100644 index 0000000000000000000000000000000000000000..a684b667ce834f3feb5abb620d3980d48434d65e GIT binary patch literal 1236 zcmaJ=U2hUW6uq-Rg*K_QsVN}prq+Z?J6S4;#F$vVQMb|*Vt88@Iw`~=x=f8k6JPuh z`akro4^8|7`YU{E>XUubd)XbJggD8}IrrQ%b9d+CW6>-z#y~X&2^dEJdu|X&4-E-e zfFNYPEk0c|-xuQ1wRRv5cLP5XaX61%WKOh`U^(<8RQb|~MCRLY9=_1x`U^;${baWr zxwBuVrEOKn!*Kbu^tNlY9AQggy|j-k+35-gpq$S?&=a-ZvC|UHKrbhgy4jIJ-!@Xl zo77e+liASIJk3*(y@zYr!ftkeZ6FO~_jm8t3%ifEYA~k-S%@wBSJ*YS>Wi=_i?N&9 zCIj9dbfw)yl#YvS#T;?OrFbWSAK20c-t6~*J3R`>o#JWWtzNe)UZDkRaa&5K(>#`< zKlO9}32$MJwsy|*(EjduoWSq#>xdzb6MV&ljz}8KCtncz9WVAFQv2k>XmpPeAc+e3 zCw;0GnH4vX(;RhPwB8DK)yPNrM; zMv+^SLh@@9dJq>kP@G5YDt7w5Fm~D}^{+@FgNYAByr$}^SmC7Zhu?pdPUss}A1l5~ z6)5kA)o~gbgBXqvN804-v9HQ%_uY6$0&Z(4t`5y0ib{w!;3?AEP@CA4^Y5{@&Et; literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_create_linked_stack.o b/hardware/arduino/mtk/system/libmtk/debug/vm_create_linked_stack.o new file mode 100644 index 0000000000000000000000000000000000000000..a72c48fd5288696ad0ef7b081f4a7df490a16445 GIT binary patch literal 1256 zcma)5O>YuW6uocw5ZV}MqY)5wqBQ}r<4}nR;L`X});nhf7xH9oC zxbsiA>!M2&H~K4FY3i;!y_Yv{AfzU~Z+*Y^rto|yyncdz_t2r&FWub5v<(6%A2Eft?1BKn4`>pcMqs=A+l@JTFb^ir+ zkzMk|Sezx;RpmAVZ89BltAmj{BK9S6?0t>fZ#ZZ@i(8;|CKJ${5fM^nwH#>O(Qs%V zpai`%i*sktIpp@l{jvWD*HA-S9CWp`&n*{I@Vodj#;}Vie8GZ>k#h7s=|b3Vy4;76 z+6NK5Q5+{g1~a5z)JZQAOROWNZ?-6jjpmEZkQhiu^@na0S%6On$U`>iTgL=?j%EHU z0&%xQM(WmtPRig9qPE9`CsEQX3;8Hcu48fqa}n&cz9@FuC;6`kA&-Uk1l%TlC6{qA z?}y*C46pfS?jFVY7ahpY4~cmh5rZo@=DpnF?4%FO>RuVSIwy#h>;Bn!&n3d|nU`3e zU*0ky@WDB_gOF78&AP&%DoV4F_U-u+AG)0ObxpzX?1!s$VS~d)4>Y5s<4|~7syBA^ zf2hH%8I5AWFdNlsv(hqKg`!b0N&M30CcaP;-w3XRo_o%@XXcLQ@xEa+8Dk(DgB+YOfIUGXrKKSU zs}O_Pm&CJ#@vfdt-yB7=7qf6D`c2Q~vv86*ogFDhu~z(Py#1-4O0A6GBzdZ2)#s4= z`JLVBSAYFDZr+#0+?Z?~H{VRmp<`RzHu-pBI{>X(?V+0MP7j@-?JU$*p`aRLZmZjR zQGZ?BDwfN6wWO7_B2@0-JeF+@#=!CjBbEJ~2fg~vldUd9l^Bb&_3&kOgZ z1ysoI_sLphmRLtjW41}eM)M_?NOa_*{3ACC72qQRsv(=K+eQIv&ZPbofw)sbk-jzI zlQ#H+sP8dRlPLKWpB}@>bre@nOW;TAqxI50$$v!%WlVUBKrZW2&folc7=Hit=R$!| zp>q|eUKlR<2cZ8d^2eU$pPl@XW!_68PoEJ)!F(7t&gDhDJx>eHFK?MJgx~_ca`Epp zW?f-W_Qr~R+YNBj<+QJB3ig2qs|{h3!{z~KMoq`AvRi9+_Vu6*%$CuqRt&S#Y<3$x svsbAa4U=3iY;NM4H1SnA3orxIFZV8u2U^GasZ{{FPZ_){25~&(e@``mTL1t6 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_create_timer_ex.o b/hardware/arduino/mtk/system/libmtk/debug/vm_create_timer_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..c55ec2eaaf8e5465e6a5c8b0412cf38b04b33c89 GIT binary patch literal 1240 zcma)5&u zLl$Ns27^zDCkgxQnx4MaiR$NcxEcLw={X$^Ge?7cZ9i6vKaSTwG*hXW4jd+rG~IX( z*&pB7^=A3!_k-#kRm{g^?V$Rm=d?ZU3hsz*k9!W^!(^>exo2dz`@3G7dn2Qk&l`4E zaAVmjSg#99g_V_@Q8bHY0ZO;g?sB))1(rh^DQ#`sZLDoPTH1!F7GrTXA6{VR*~L(b zrCEku)^0H{hohcwTZqDw*ip>mFHOPs1eiOnaKUU1hhTbr3dmhBi(t0U(LA8$Krp`}`7O+~)+JF<~H*M)S!R!+yh$Lx|MgO9)1J zlmK~D$Up53c9o2si~h0}T%e*IB8 zVQ5@^qJ)lBpnMoEOw!00q;XsgwCUB!9~tL^G{*WQKz1@8hO5W&vfi^mJGs8PWzrCW zGvhNN7tNX17(58(%6*%@i?om2&(prnX*iyKv}PL?1uX7>X;&;9N>3~G%`NL6PH<}W zX1QcLo7L*}dc$dy%J#ZL#ur>T_%a=QTiytq(?#erRh5499@>Ay zTmK1fJ@oFSe}XqpChe^^eQ$RMCTy2`?2z2MgLYzCLVVqN!W^9q>^wMzs{YpGpI!0N2}kP@%T~~E^l8eN%a6yR~LVN zpO?8534E+_UjAYm?V&3Mw&7aBXbI!U>^Z&up$p~Y#D19)0!PhqMhJSaY!Q`)!zhO=1(yo4QW!hiV4&_lKGz)_;<_C zNZzW?lQj5?QFDxZO@hQ%rt&e|T*KrN=I-F2^TlvbpX9e<2yd})N^I^E6 zV~j22sgEJalOL`^#JA zS3_{iI}5RB&6>h)^qBhA_o?1Y_&C7S*Hs1QIS-h(VMD-12e@9)aLRuyRBQX%yk%fi z^xAG-H)`c_z0@!o`CYwa(5gfHo4_|~;Hz^+V9b&CzAu3Xe~ssjFXQiyejP7YkuYA0 Ef2pUNi~s-t literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_da_display_download_list.o b/hardware/arduino/mtk/system/libmtk/debug/vm_da_display_download_list.o new file mode 100644 index 0000000000000000000000000000000000000000..7722dc1001fa2779cf491e8be47e8cb69269900f GIT binary patch literal 1260 zcmah|O>fgc5S?|L;?hb@3y7ptV4)zTgj!CCM1+tapH78KswRhui|fROL`s@syOand z{sag92)Ew2a)4jKk#M3nnDKg(w1+U#?t3%)W@kS?R?Qk?41_Vrz|;fS<4!yu3No++ z3M9TPKVLTAS2j{=7c%m97$?sYXVRHsC_761&Pi*n}TRG-$uxIM>-mR8X=DYd`3bwgo(PeH>`Oq;$M;QH^n1Dx5{-w27izp zOgvtbT+&N3aRn#WF?bbYE7)j#32byuVy{S{fCHb1L?-GAU*K$9hTnfhoG=zvpGIOA zD$uwLbiY$$a2K8FerIPVeLNhW>f_;k&ia%;H5o4cCtj~I5nP^MyfQ9`!If|=q@tWP ziNW3^m!I3KOa5u()48rn*w6XAS_jerq#e-AvW{KxMY-PC*XN~xWtfdp(X<-1TC>`+ tTE&uCwJ77Y8(8>PE&OfX2&_3}!#$<&(hIo8fgc5S?{CNLrz!6^JB6#Xvy`p_Wr3sJPI42XF~$a>xneBo>L()WO*zA`V>n z3*7h<+DHSTp`4-ul=}rB+68nmm)T@=M75 z{LXInD!+c5H13OHo=-MU8gC~0(9lPmPxaw}ZcRH$R3#XTy7Q$ zvNqk&Q4w~DJ7){<$JiEVH*80usnv5^8Vg~Zf)=JRtKU|jK$e{_!7I! zu7px7%`$95y30VB%_rRGqvy8kMg36y~~nV5$t z!CH#JxjpV5adUR=fd7HlFh?zpdK&6;*Ne%8z4$8nxEGWAf(aQtar8auVmNMjIE0?; zgX{d+y-t7vGNcdcL@g4FSjCvW*(MT=)=N2&JCTm^k38?P0G}|R8p1@~77|!}M%1NT(1Lsz ze$zI53pv$&i0cO{P`xnFy)BHv27+Cm2(C{0h?Dozh_5dIM(6WkxcyJwt@qsL&aW?C znJWmv1rYa3->gdv=zfGz-(CoSp0MR%>g$?>^O7G|8Neoo%^@gSRmG|NtlDbttIOn| zH??-9tm*AWqf_td-Eu{%>!f~VavlFs9se?W4*HUEPEXUg!5Z!>wF=HTGWduz!g%?A E0Wu$tcK`qY literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_da_http_start_download.o b/hardware/arduino/mtk/system/libmtk/debug/vm_da_http_start_download.o new file mode 100644 index 0000000000000000000000000000000000000000..0c37ef7987d13394cb7b7c512e3a112f004605b4 GIT binary patch literal 1264 zcma)5&uEk}y}_`|{e*y@v}UM@e?Gp+HF)3cqaUe9KA zb0}?n%g7n;a+|qAVMEXJJkLS#G0H95>JEWzAdM9FcAm5=J1;g{u%Ja*jID-mu$$~w zD8Z5}#qMg481Tt-B&{x@bX*)L=GgmO+8-tGz9lW--N^*FGbV@BIi3gJ8;?fz0ZOnI zx1@B2-6LsF=-~fn_fSSxyx_^{o?m;MAnftmh%t{7oMJ*pq!_IyT@=Ry&krGzeR08` z-QNk2#R%zxI#r9riW|sjjrwo2UmAxp(oz1ohbsOZ3Dr=h>NYTdH4jz%Cla@}+=$Yx zxH=_+zsNei=hh^b^jaVu$IT54E@JFD4mw{P2i=qUR-~|viLXRFQ+1WEFc=TRA3BC_ zp;>j`#r=a7s9qTET&9sR&~bj|$AY_)J~GSuY4q1F9b{MYVSKGYbL*LY=<5Ee%UnSS zuFd`{sc6lr#%8FN)4g?-gGjz=ZMxSL4d=O!m-k>@!g?RLSvGJg?v@+PJ!Ad?5OuRz zDw?8MtF@|a(Jq$Esv!MaTMB%q0$-Xl1u?fIo{8=@i3iWs|H(q=vx8MMNC9 z@CaPE^9tN5(MN!%;8qoJ=?!M$^>(`lEZH;P%r`Uk*#1~E>x?l_gFyz)5r8Q{v@j=R zUjj+5AvVCvOja2LA9mN{)XYuBjZX&TbgwvHXEp5Dn%*ju- z(Ji0+I0tqUH9di%oDN$8$_6J^}fNqj|zfs$+#PrMk;J06apr141#f0b7VkVOme zgFID>$V$(lPBH4PDBlWBHHb(4$DUO7&!|uhHB{Xu8nEUYW&e(fd{5G%c&n19Xz&NM zu8(9*g2dMXb{&)F(71@U%Q$I&v|s9zIxDJBK!?8x#Hud&f+J|x;rHL5FA|E1T&O_x zbhr`>K>l^ak9=D&JMp7)zwbtzJO`+S{W`2)@XLCpZwu#FuS^mma0!37JUhj#X$*>f ztnAxf2wNVezOHJxhCVFs!=`}E0dTXD!=MtR6{Da+U z6^?%%Rkl!LDg{ z8Sv3~Ani7ybX@Ey=7>Em#eoFgwWSTbJsJUbh7^!H!?VCU!@)qjMhn*BwvFqc>*%4aUGTiLzdIf$2zvY~V#MPFUofE~l1B5%7sh_uivx(%KDywK?lA(SQ6c}V zPt_u`;s$b>qt1)gTf?pz`6&O`L#2O0LN!!Vb!#YK%{NN_hQz&7uA+P^u20$EH?o!= zxiu*yzc!xH~&)hm@oxoI`? s1+#3C@s*GkzDx_>mNN$Hd=dH#+Q&E^?i0k=5YuG7=CAgx)r}5Z3JAEm>NOsW~oGp7Xy?5asO*>ct=6 z!Gmf12_E&v!Nfn%oBu#hCiO+0YOk<{N)Mf{Ojj%Wkm~@kG4PXZ_za^);X^o^Y4kBXzvYoSBz~Rz_?ed*@K7z)ORsxY+a6$VIl}`N6Qx4o zK|E3IA381D8OBSgRNU;kc6`f78?Vxv>1;L`&*&LF4Y|8$Z`h4y7g!Q$Ah)-3zqY;e zXtN3{ipo}5*uTcs*=1jZMOlnpQ|>U(2g9D*Xd=3fz>Z{&{X%!`H!kSyhT8zWIT(QM z^eG^BTF-#q>i2r~OSE7uz2Uk}w|VH=1Mh?W1FoZoj(f%P(wTQWPT=?W6~tAK6O1qs zMq);LMyie95v*ZSHnzKbBHd^n}go%NClz-@CibV1s7WFDl{sC*#SIkCqIMBG?T_|L=On)s zDVUh(5%HR=D`ScCx*vZ3l{%qsQhlcQ7AjEQ58+uF8H05kYg280b@B%$`Dq&C$Sgp% zocF`kg}kWOo@&eM%UdQ4J~#unkdlk$gcSz&L~1h9xtUAxGcTrd4JkM-K3Kg48!l|L zK{pEq4!PYzxw2<0xxgx!m3+>$Dx6n~HLI4(n?;LE&u!Pj7ir;}a)w|nE>5NC?4r0a Tx(ksYz*EE+UY0t=_>=zu6vT=@ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_des_encrypt.o b/hardware/arduino/mtk/system/libmtk/debug/vm_des_encrypt.o new file mode 100644 index 0000000000000000000000000000000000000000..beaeeb04e9b2fd60b5b1e823abb4ef7e047fce27 GIT binary patch literal 1244 zcma)5&uS_IkUf^)556<=9 z@nb&dhx(eOJ=RKpc60H?7MxxfRQOvSuR-e9$&a6#Y6AgkR?T|dcA8$-@%9^j??7O} zDij_hQ}^3EU{&FIUHvRw!*H3?l3UAy|!@ch{BiHQq1>W8p3-cz-YR{1*6{W zg5h^4Aa};dg3;)-+ulA}u$JKp;qTQCh1U%}=s(~(dZ^v=ftPyT3OGR|;8zeA0#4A! zL=urSdY^n6J~x9nj7a07gwZU2Ex;No0_8Vy(# zu-XK}E|@swpA<^v9dpJ7j%AlO^R`pwyi%+>)%>Pibjb9=6As=;y#K=Qfit~0m8RY$ VaAR~9;!%KSh%0zlY82y7{s&2{ie~@- literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_des_reset_key.o b/hardware/arduino/mtk/system/libmtk/debug/vm_des_reset_key.o new file mode 100644 index 0000000000000000000000000000000000000000..5a9f4c4b96b6070c291deefcb13b14b81216deac GIT binary patch literal 1228 zcma)5O>YuG7=CAg3T;x`rlx>IH(C=acCu6wNn@gXqi%&14&2rSCPEa^-K~*$@Zyiq z|KQbI4^8|7`YXIO^<;1QzRV76@!}*i&-?MrJTvdie5jaJ#u%u^APsX5pedb5Zc0eQ z3Pd6Qb@j=r`M#V=+!#bsa69rnor1IEdHz^Cj@Dw2WA)FSczk&PXKUwLN`D6F(;w_+ zr+E7Fq`Iesd|a!YRNs!QzHlu^xWcnuh{-fnE0y;3bZdO%^n^3fYnhC04n3jo8Cl~^ zb~l^P@8~(6<5?)&#R;~syF*|*XhsT$2lv|LgGak9Skj^_#x}y6>4 z|4{z{*O5b|UGlk9-==R9gnj!eV$8P*zFD`zT>H%4-D3V1)QV zp3)++vJJFpj=C>eZxg#}#H0KJA65Jl8l<6`(ye0vHD9avH#Fp%k`cvQmpny--)MDa zp423l_*x(y#l;N_E@SL6cG}+>cB+#)E1HnUMDUuFF6DwP7!Sj*KfzpRsy>f|E+~** z_(H8{w_8ZRKbsOjbg#H8r5p6(ze=# rqFJ$s_8fmd{z?n~l`{crQ9#x&ft!1Xdx)<9lo6BoVCZed@uL3%hya2k literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_des_set_key.o b/hardware/arduino/mtk/system/libmtk/debug/vm_des_set_key.o new file mode 100644 index 0000000000000000000000000000000000000000..9cf01a395ecf89bb9d41cd70646d116f62c8c534 GIT binary patch literal 1220 zcma)5O>fgc5S?|LlC)AuBPyH_z=9%DLRU_SAVNrx?*J}AO%Ayr<0KY|AOvg|5pm$c zPvF9xzrd{${R!|ZxK%}5dV`s)H(w`K^1e53o_Flo-H#Qs$`}JV7^Gnq0hl5P=O%_U ztU(0w-_{?mn;*)l#Fc(H1vkP!(kVDep5_mg!$>XqC|dv0*0j|=oWxF*l>Qvj$3NNC zcJcVvQFT`q3NThXs=gaqJ;$>=$G2WOV@%XarMr5%IXZB=jyu+CnT&1@d`I6kvc}u& zPBx$4)^j|^vrxE&cH6N#17O=o!-f65JFW8G!<{CqC=nKAarGSAWamQ~ORyxnq}*h{ zz46euJBYq3urHbGyyCv|-Ur^ZeH(bk^MJb}3do)1IpE#VaOk{73)bSc@4JJ}f$w<1 z5B&#RMh~@hCGb*jp9Y*j4fqAbXut`+VnRnGjov3;1fOd`973e=Nx*a#TL_Rrh5YkA zS&Ph)8_4M$xmUDa3?DhjNBR2!O8qkusv(E0TSozFzLENOB;q^?Mfx^`Puk!Qvi39* zH7O*&GN-G!xPjs-YG?7G@1yUfKFNPY3OP&+i3CH|m9fNmU4`F&rA`={RG%rKg$k5c zAwEkZW3Y+yy{R_8I{Cws{4|ZRHVcp~=T*44kQepLskXenJY~WVf-`U(DY@vKxWeGJ zNKIzy+iWe-$7eyF`nsXuym(=G7q)!Z>H#-P22O=1rFvuESaN|?GaJQ%X*H_VW~F7d t3PrPGk?95Ad%Ter-YIts*5cw+ntGSO4|{;9tpSt~lXzI@Txqz;{{WV2et`f0 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_destroy_stack.o b/hardware/arduino/mtk/system/libmtk/debug/vm_destroy_stack.o new file mode 100644 index 0000000000000000000000000000000000000000..0266f4f5d4719d6882814e30f68a152681e7d853 GIT binary patch literal 1228 zcma)5O>YuG7=CAg3T;x`rlx>IH(C=acCu6wNn@gXqi%&14&2rSHbNB9-Kmjy@Zyiq z|KQbI4^8|7`YXIO^<;1QzRV76@!}*i&-?MrJTvdie5jaJ#u%u^APsX5pedb5Zc0eQ z3Pd6Qb@j=r`M#V=+!#bsa69rnor1IEdHz^Cj@Dw2WA)FSczk&PXKUwLN`D6F(;w_+ zr+E7Fq`Iesd|a!YRNs!QzT*jZJh41s_g+j>wNhzcPq)TLZqIQidM%UD&7pAgJtJ$p z$?j(J`5isSb36-$yEwsi?CucQ4w{j|;laIj`QXuR3zoDfi?NOHCcDD6LUER0Np?-U z!+?8}k+8dn!j(8smg~Ia!g(iv_ibSV?|L3^cT5hkvpfg9Hy(|gS4crEZVTZKyGO$D z{6qZ*Tt^O-cFE^beVe{b5cch>h%w(L_<{)?kzzETcv0-Pd_ROp?W2U*D6bJ9gAw8f zc}k1O$~MrZIqJS>y-n<@5s&f@d{psIXpn|#O1F*y)O@Yt-_Ve6N=6iKUGfwSexucy zc~X;H;%k9;6c;xzxQwyO*lB-j*r`tHtY|_W6Txdzx|9pHU_1=J{seQOsroz;x}ZRM z;S05*-EJZM{%lHcb>c^+`B@tMCCKtsEx0_@!fyUI$RtyT> z`T)L)cL85PpTbKc-tUS9H7waQsq*>a&R(*M_>(@FkUb`?(AT|EMk|%{+A-*8Pi#UZLw|TAp<@b z_5!zw82AD^lKI{#54`sQ@U|Pcz?*{saKBFmsWUtayw&gZaJ|4W7k7ie?>5f^Zy-1J zf4qYdD(g}xrP@|QPN0VT7UFWq2}T$&5Xnd1lTO2aFSKKb)IJKBj^YRb(&!=mtWM@4 zvE(Ll`eu)u*l0d|!o)y2ia!fccmcj3p&YWwytFsWc_#hekcj&vJW{tIbW#R?kR4Ag zk&{f)D>Hr-CpXb~6@6>iX?^S1sZMgQNFj@X&qTr|^GaLdtY3xSf2E%=Hpw1&VsjZN zt^%D~)EI1|5$$(&cGAZu@kk$syODwHa$JS`b8(TcH1%DcU*0kyh`|+*=S$ygDs1lV zQQclm=Mr`7hc?x9L&0&u!{seV29Rt6w~HnY`NLwhc4RJ+gJapXLf&?2l}f$ba2ol7 pU3N%Ke*%1?4!$yf2+o3ZlbR-Q!8u%)z5?(RaSJcebF%U9{{d=sid6sr literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_client_set_mode.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_client_set_mode.o new file mode 100644 index 0000000000000000000000000000000000000000..e64a2f770ba59a4645c7ebbbaa4979ae046c55e5 GIT binary patch literal 1252 zcmaJ>&u-g@Z4#H;=l-kN%A;z8eIcYu=MOJ=|Keec_OvopK%eO5cb(V58aTr0_1g|WIiG*1Cu;pex8=A)y_`(y zW>+}+mXR{vq&8ET%!Z!kX`X`YeVosB>}D6(2BvCuZ}&mHu=`}Q1`A4vh1qKGGP}aA z1~e9BF}9}MW55T)p0JyU!u7BtGuPSY!g(ivw{2kqZw>~)-98a=r+6B8tKaM4dVymv zZVTadn}@;~%sk+K=yj~o_AdAy+T-VbP7w6-YlvY#C-{a19g#G;pL`)4w|yQ!r1Qk9?H+7fh&!4B5AW0`@$R`gcsc_sUbG zZ^iRT8~nknF=k#*qU2Ym^ouyTf#M=+mvGSfA~p=A&(78>5!5Wh7u`oS5`PETWYd6c_jy*QG516cA(h64CQ$c=-PS D##D{w literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_server_get_mode.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_server_get_mode.o new file mode 100644 index 0000000000000000000000000000000000000000..d8cc284f017e16cbd575167eda9fe106824de000 GIT binary patch literal 1244 zcmah}-D(p-6h5=r)U7S_N5xH*xCCKtsEx0_@!0b}ZBTMP=` z`T)L)cL85PpTbKc-tUS9H7waQsq*>a&R(*M_>(@FkUb`?(AT|EMk|%{X&G>(m)|{<-Hnuf4$O_1hkRRV+R+QuY3s-}3ySVWrcC-3>fr&&-(bGP{{v zZpX;-EYCpx5w7QYZnFz)2WdQibnv)QI@sT>!;+%0WwxnaXE)f*n9dSxi)||p8Sufd z7r0Htz!%t&%=g~#zWQTTm4?ody5jx#oZwAyUnw}8_13Q zAMc=q%DNOvskYUS6R07-g}5AYf)NG`MDo#m(rMW5g?0>)+D8G?Q5+#a8a6bN0xIjn>mAObn!>__Gj&7vKvL$|0M~OMAndr_%ooiMUU~BXt`>CuQ&l+40m8 zImslwGUHcqaTA?a(YJ=3zHc2n)k*FZDP%G5nMl}VUTI65^{epvuk;hfCfOrTY%T-E zRiJZ=8iQ>#qW#XUPWt#H9_iz7H!_f2j;nBgE-vzwroPMT%UdP{F}MQqd}+?6!shNC z)$P@EEm6mQXj5G`6dV^kT;76Y0LeCRyJ+H&KP*;jN9H0qIF?;2!roNPS&fAC$3wEzGB literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_server_get_param.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_server_get_param.o new file mode 100644 index 0000000000000000000000000000000000000000..47b58bd30fc38ce77e5d31623c521090e3455e49 GIT binary patch literal 1260 zcma)6&u8LO3a zS~YsEt?p>LcBF6X+3cp8;Tf(&?lDfVY^&7+wuv;9JJ^5HDDJ=5uET;7W)Zd;Tw}M` z?LdshS%TeFwixiyxbIpmMAs46mCUi8Y=OEr=>c-_BcV%<984v9w+#L0Tq#aG@o=~><>IUfJp6= z0Dlz636Mq)>8Euv7l|d;kkcG_ZnRz!yKJPR_;U}X|0@#8A)CxwMF-{_O8<8x;%*6# z)U61el)+zQP2UnZ$t1lp<&Wax8afxzcN079FN&S&B)=6Y>|)?E5wFR-(v~>w55gbX zhTj5{?7oTXPiLTf!E3dm-O_nK^QTO&PWsR!?uXG{zcP@`#)I(iT3qBaeBbQ)@|Fof z0B(SelvFflRbj9vLX(l|b~s}nc{bH`MZt02x^pqS0RI3( C{g3+q literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_server_set_mode.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dhcp_server_set_mode.o new file mode 100644 index 0000000000000000000000000000000000000000..58d3ee8e1cfcab922397fb80808b2ca72d999841 GIT binary patch literal 1252 zcmaJ>&u-g@Z4#H;=l-kN%A;z8eIcYu=MOJ=|Keec_OyEC)>gT4aE_UHGdZr|_mykU9 z$!<0CC%=x%Te6Xl(aLf8&@nsR_P#l=-9y_&5T?`b*Z`G6;h~nS_Yd5*?GCj{Dy11c zVQX7@T7R3~OlPwjT83wM8gln>KFhXRJzyJ{hH`tm4;sbYC!2LxP{J(2R)d$>6?QeC zvKWiAHRT=yJ{UT}Y9R{O!>-I+`!yH#I|0072@7~@FaYlMiI6+ZGr-$@$Fbj_1$%Kz z2)EZd5cXi^1^+{@V~v(~!S~P_KlgKjpr2nujQBahH!Ns~q|yE43*)%$^8g~nM-RqV zZz};(sE~i!Cwq}u<~rtdkK8kwPsJgFd{lqrqtw4(LOo>2zEu>k=f2dxW8$4FPm#VA z&nIp02eamwc|D1eUzyS`;^aDti>O_~LC+V(LF**n6;s&8!Y4}nkbNbWIIRca_g|?K z21eZ{O5j`vst1AgZ4wODkZg~I>DkF28r8>T!pU-$mNZaN$ywpC%|vi#IMX9f;p$%Xia1IfRFLH)Fpr-VjK?fUj=-*Dj{TOq_Inq2$8s&;t6Iye6c^Xfxrn}-*lB-J>{KWDtw>=P1D}a_P3D!h#A$yJ{?Io3 z7MNuBOUs!**RXmj;oR*YIc zXPC8exn63Rja=R+nIwOM{{wubCcZOg4CcIqqONh=^e*l#wggZ_OyEVLI~T(X@DGNK BkShQH literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dialer_launch.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dialer_launch.o new file mode 100644 index 0000000000000000000000000000000000000000..e0f7b78744cc0c23c9cede435c4b6875f3c30565 GIT binary patch literal 1228 zcma)5O>YuG7=CAAE3`?aO-%ubZnP#;>}07VlEy^&M%@-tIB;7R*a!&}T^1wp;Kd)I z|G}%b9-8dD^peVHBD;>Ag3p7-OKd1l_3`A{;-j4_anK@t`oKwUU$W=2TD z8iXMGb^XP<@xGXd-RY?bxUYUsCg37|nLSlbLzVFJaP@O58eQ$dMdVURXfGjo{)63Z z<1h zV8F-Ip=-4fT}NO~T8=&7uKmsh-nCo{czZks?u^JGcA95^cSggZeS#F!;+E?={r1GQ z$KIj-18yUSO1t85slIj3CJ1`=O~kNg6MVshhDb4*PrMNJd!8Rar1nw3d=%FRkirP@ z{XD5fWNGVY(;RtUwB8nW*@#E^Cmzc9Cp1VyHmO_10BXLL@o#8|HzgvHw;_0v2EWm2 z%{`$>F7Xv#JcNtu7+l5Jb?mgi2zIKIJS&=z#f1Nwq%P(B%^wfKuRs1=V5Yu^1g|V!U!C~sEI&`9A740VE$4$k?`P43o-q$BuPE^wou+7sJgx#XUsV0E&old@%I3qIl7N0r;_jw*UYD literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dns_get_state.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dns_get_state.o new file mode 100644 index 0000000000000000000000000000000000000000..3ca87b0d0fd5676ea32972d730cf2cc52ca267e1 GIT binary patch literal 1220 zcmah|&2AGh5FRI+lF~{|OHnrg!5)H?5^8NqB%%rl^1G?n(yGa!;LPZLw37SD=BpE3ztxB7+Ldt%x#>@qJ*`~+dZ+}H zwRG$K(CM9xo!6dl#=;d|kg}@PJtNl|o%>zSpBPp?Z`cFj8M|h|d{@{hluFx1kr#OZ z%8zk^>$#l)ux*5i^6|lwcI{w)rv*!~BwJ=1+9tcrw&FTVvkbczd&Gc`Cqv-dG*#|MososH96F zmFn6IF&QnychD|}n9Ns97-%U*^NE+l{vh<@XsLaYW;V*}1IS~9_)(tHBC^6JVw$r{ zL2R_%W`N{CJjy={t&9SEK|mU+DP1}nYQ9zR?+D~uk`cvQmpny-OGGC#Pim4&{8%JT zi<=m{iLo{8w7(Q~s*^e^LNGBAy(XngxoC^VHTeA}nu`bO^GN)f0_kbjYDK%%=07}eEc>uhww=R9qg8J^?Q+GgJ46fq|77Uk fzw#&GEDFf_rEzm5+=IRX@DyzZAIx*|@uL3%u&I8! literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dns_start.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dns_start.o new file mode 100644 index 0000000000000000000000000000000000000000..6f1308e722c1ca11c21d295b7f1f0d2bc34b552f GIT binary patch literal 1220 zcma)5&uR;f|i!t>^;z8eIcb26mU$XOk@4av4&Ayp=Thr@|F%ZTe4GRyT?Kq+Q zT#$w}2*d1i^l`NLrusdxDHjJT@+J909qz7vRppF)ONO)LY<4Q0hPCi+r17j1kH-dZ zwmy4TFC0Sp=Qnn{Q~vd%CmOV{r*=$N5 zax1l?=G2$D?OdUdN#&Kil7rHHoM2jJcL*$lG*mj+d(f`#?QXYVMGCVB+X!y5E9_bz z&JrxiZbY5xIgqCa1%Au-W69%J?^-iAn5Yzh!K|)e8NNukzzETbYcANxPAbU?7ait z=o}?L79*th>qIRQ3$7xkIXe_YqxGV5<_x5x{392gD8NS~R704k+rR+Ud?DgrkU00s zi3nZH(Fqy+LFVs^&=E?W3g99xu43>4#@6wp{n37@PvT#Z!b40P5phkdCwzhaco2U7 z6>-AA{LdGWz)}Uu2bX$9ow|(jsyD^II_X36yq8A*>cT;GJ|6_S7YlRhwY|Xk^~Ei7 z1OZs}?hDP?keGMQq@cdhc?l!`sq0W*V-k-32dng8i^EnQ6uqM2P};9Fng{BV1`JJa zmP@+Ptk+w$w$Uz?^_oGFBa0jO8V!6;_7n{N!cNZ;xB=Qvd<{THOyVVZLOveuKNxp^ AH~;_u literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dns_stop.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dns_stop.o new file mode 100644 index 0000000000000000000000000000000000000000..7022cef41cc742711c4396522084f3117534b885 GIT binary patch literal 1196 zcmah|O>fgc5S?|L;?hV>0~JX?;6spHLRU_SM1+uNKAj4eN=>9zTwEuyNF>sL?II$O zxN_j%Aa4B;@GE*G+;W2%+grQ6Fw*XuH}iI8KkP4Uv%?qzVGJ~g8NhBx($zqq!5S!# z{gHW@F+a8L71S|k@=sXgm)UdaTrreArTh9gpT9MR#rje`0d4V%l};MJFCK{o0*$=! zVQP&|JskW@qluap$U0F01CmchnudqQ9?fS8BB_waTl!0`(_Y!*=Y! z1lSh3>H6XR(|&7zZ@UL8lEPM5PQJ}H*_~9L6g!D*&*(9SWjRy-eVR z6X_`bBEm2V@D&~EAx!k8vtdts*wDTsgx^reg>D0>*c)Xoa2%5pna~kRB8a#|qGRwT z`s+Aoe_0%KPsw^3CPo+&Ch7?;Fd3KO&tDNIOa&*8BdIGLC@%+lh!qTSNaFJ*tCKz* zoRt|zWB;QK?-g_30+drnw-Rd-dh;mTSpK?;ztpe5jP~9 z6F(~-Ldl2H2)NnQajL&+b`K8qqy#L(JZRKS>!8!=wfk1T-Z0x1Dc(4~h5w?3f0H{0 bD^WJMuL3r&VbA;;z;nbRejvNV@nQb~*iLsW literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dtacct_select.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dtacct_select.o new file mode 100644 index 0000000000000000000000000000000000000000..864bbe8cd4299a2d5333742b8a5d14fbfae62451 GIT binary patch literal 1232 zcma)6O>fgc5S?{CNLoGSc4bP}t_AIBRXI?3cpAI=izlB_(3 z%#UyEMyK@i`)Td2DCT3Lep-7yG8iMIUfm z+12vetNc!WZ!fD9)PkCa;vHOI+GckEEQ>T!JUqD9t{gntX+czqu{hfZZ?em5E0km@ zmS$I_+YHpnbjZyvB6mFO3+C8ID!1QoP{qwq!^Gantuhh-B|Qn9bg+ z1ju28^g*4dMPk7<H8d%+0I!Y!+DFU)(ZJ5P}Op z9}1~x&4$Ea-%GhO^=-bF*GJROQ(xC5oR>dZ)q-sf+dWYAvW8RfX}Qrn)c(+k+5fKZv zd;;wG1$JFj;s@X>Sb@rl?%>|olSfy*(#$#c+~c|98T&)os4&Jr27@HbGk^m(31p{+ zB&D6NKp_Xh6kDQL}Otfk`tr>k`Ydd;I zf0NnHx3%diHAMQVBmi8ZSHz25lSeUK*H`o=n>5H*AOR#Io zT?TwS83?P5C>$4ik~#J(F6?&#c-ImZ@b-8N+!<0r?hMZY?+gb6`!!my7q^6P`t2iO zk7?rfv^ijOYLX7?Ha(x{Ms z(IVEk1PwIreY4^F} zTk1e{KhS&3gTV$SyE9>Nb@B(M^;sG7&3S_CeBBS~Qr+!$Fw@SjFTXO^;DbwW8!5Ty znRSIN-36W79u66lKl2hg*EI#_r5~1eU`xPO7r0T>amqg}*6N4)vI)$pQ7_~TvtFq* w%1yJGFBoN$JTGkg?I!~h|0rhy=F-yGZx=@#H&H^2tpd=ul)wWvD8~!_4>do1-2eap literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dyn_array_add.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dyn_array_add.o new file mode 100644 index 0000000000000000000000000000000000000000..bc64776cfeb91c5fdc23fd482c08766863bd0bdf GIT binary patch literal 1232 zcma)5&uP?7Z)N@0)qEZ)Vm)Y;@%IgZq$kE4wbokU_~0H^UYC9OV( z%#UyEMyK@i`$_GtEav%m{iODKWb|i;hH2a8%rN_XH&ri}_tZ>ld}Q}5d#2WNIaMDz zmb#u>u&1RSw>?ZQ=;15qqaG&r2@@)M;%GkUBKY0(;sAQG_rlFb zag+c#WJvGV$yy|qSVK&6c8Ely^)_522GUXff#(Ga@DTykkS6OkkieP~$$vp0?v-Gq zZcXT<41Oc(%p*~gLeeWf{vs}}A-RHF3_sdm96#!l{8xl<9~1s#l65KPH$NYQUw{0$ zfLndR1kP2UdckwOqTOzy{Na3xe|6G_-26O^acU7DTFwW7?$5$Ry=QY`d3|}ygdhMH zfF25|XwJIAU{9pnk@~h+OZ3t7^3>Ng1;^z_%X_fpz*Zl)Ue<6ZJ}ozz2iiY6FzR}< zRMd@Tt=6ixjdro5R}GTAup9$lrGf9to`JDkK=dz(o2%d+5~~1or&4%fbc*qy{{rv$ Bg9HEo literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dyn_array_del.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dyn_array_del.o new file mode 100644 index 0000000000000000000000000000000000000000..10055ef5c087bb0a7e3fdab4c5b165de3ccd787e GIT binary patch literal 1232 zcma)5&uu_2D#jrli!D zkpB6d-D($q{Wz)Km&H6EtDRKe42|CO&@gS=oEkmrz)jUkrCl}M939zR%bu#WY*y6= zj-_sEIqh|BE4QBm$6v<9H6)jiTfvX^7sHSGB>xp5Jj8_mm}Fhb`OVJ<;rCyE zF5p(5Gl6pzs9x|~uV}X$D1SVg;$NNgAvZruW1O4^h!*ofp!+j7QSZf!SX^J;G9d`S zC7_2wDw?yVFxV9-cci|}*Ajg+y*%}GRl#xb(ef^AI5VSC(Vot2FRk*;6nU3yA(DaC2qcLwp&4?o<*lj7~8g^gk~1 BgERmD literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_dyn_array_del_all.o b/hardware/arduino/mtk/system/libmtk/debug/vm_dyn_array_del_all.o new file mode 100644 index 0000000000000000000000000000000000000000..e3368219c0d87112b6718338c6d3d2618d7b1330 GIT binary patch literal 1244 zcma)5&u&OCB_)Y#vl$e3!pBHKzbsG z!x{u3^KJdry78$Hi#+HAVz3wZ5s$%T^eQt}#=&yvWvKF{p{lDLxC~z@G3^-Q7eCo{ zBX{xZytFS9c^EFAmp=5(_UOd49LE}&ZM$b$z1}2T&gY+M@!H_jY1z(5D<=|~(RFQY zUr*`pQ^`~&v#X_fnx`Q97$;b^)$9V>MH?T;?-w&hyDo5LY+XFvw2Q#=j4HR$*46O>>sZn>`0 zZJxUJ&^y?Fz4MlFdbSUd+GhdNQCuZJ z0zIUk*U4NYmRv_pbL5@TdMb9=NJsH!9!mdLB$PuonYV%t%=u3GzatUvN_eDhL+GRo z{vc~iEs>K<(kpZRo4B}+&QASXhTk?J;IbF#Z$oa(xv;JEDL@)qp4u+s)^YuG7=CB@5LykisS3E!RciubCrc&T7^CGIbt|TD;I=NX5fb@u*&2xlul@xS z|AvW&9(wbtzrvHI-kNyO_hoi~wjP{h=6T-deP-U-nb~(Gqs$ls*%%~Y9sx8&5Xepq zNmzyuj6Ox4M2xpZHGZudRL`k!Gx$|kQz{%Ljz;^+ey9?D9Ik$7#$rodIE)@Cs`ea` zKfbZ+&HT^r2jx4mn1|8ILHTvxwEO1R9(2t1u-~@^9ZXgVg?n1EKHPKKwlmQx>9l6_ zTwB}JGy1E{MrLa(rDb`RXCQYQ?Urq|dcaah1G(LuyN%+`qm4QQl@JTFRsR}0&o266 zEY1?_vT}<7A5Z$O)k1U~fnCWQ`z3enH!kpwh}7N-n2q8p z0n(_Df6*svky&ybInCK55gV|Lmr#pfr~O5-(>cj+MGE&ZF(KkLSy#pq7j-}U`XhBh z-?aK%@g1u`c|Tm3r;#y;KV49z$F;?dRvXgl~Ts@W-^`6bNlk3Y@CJa6} zGrc2n(VSI%}(1u5T11s8bGu_{}LKetD;gMWo6SyjjBp*$ZuOiB$5L+*9jJhL}r>bz{*3NjniSeN$dFT6PzTMd!d;O(iRT*QTj6oJA44^JaBJT^b zFbhd2{Fr+`XMHYb(oedH46G$CvKhEcT^G*S8Pt;RlJ#%9snkptE^l9J8T|ufuP%Q7 zI&o&3gUdQ!DdM%gJt)6i84Z}1(n(Jnv zu&U>Io|{m7j_WwC)9wLVMVKh=Y`tiex8ANdVMZx4sSy#WzYn>-J^GwAo-LzG}G?g-)a+Q-5jMh^BL z`WSQ6(y2g0eYFBiE*{`V=%)ir?mH%Q^c17{q)X!SG~hAxWT*Z(8RY8&$YF@|VV$Z) zYK0BNG-rc?Xs7th69|lSlz$!gAPip-Pz`0OZXE+y^GL;iB9Pybj40iL)F~PKL9{z& zvL;c|YoRzTZeVZ*V|VbO{n37@PwK1)!NA0L6UbFv%7rZ)kHgj9a4r^^6}wS^>c!!1 zcmnDlATNw#;nhi>@blv|^7Motiss|6d?PRGQIDlX*H>Se%*Nmr-fnqznzN{}(B5R< zwx!e`sgHKRsjmwfj*$z?JFp^PWe>PjGH@tvm+FljBPs*CW;Hg8mffgUo0XQ`DsEa8 on^gO*u<=gfUqE;xup`U+`%B|SUSa*zEWjJ|OZc&riQ`ND2Z~yMTmS$7 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ends_with.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ends_with.o new file mode 100644 index 0000000000000000000000000000000000000000..57a7600b6d540667bdf0a9f917c85fc6b795c3b9 GIT binary patch literal 1216 zcma)5&2G~`5T12@NLrz^M0bEiwIfRpO603#(z^({FxtSmZ zs}O~WCXy$-B+P0B3 zUS+qk`FvW-={Y?Mg}XSxcI?goSQ=rdu(xx+Ro;2L)r7DTVNtdbyvQ!GD}gvmuq3;t z++mTF4tme#Ht3zn1ax;q0jaZk4)pG5ICKtBg0*y;b9c}= zS1!9F`=O+j^>jtg5NDK4xlIdAe=vnV+6<` zL;6LXtVLpp4a78On@BWTZ*7LeKsw4l^t@mJJ|dtR(q!E_5?FIA`L77Xof3@HtqYx$ z!5>6zKN2-5B)zi0M{sci$ra>c_|g7oztkuBuLvQJiG2c|$+|L@evuEt@4u2KADC62 zGl8WFln*ZTigtSe<&XR+i>s49G|T&Gj4#gvL}&9spnEYlQE%5L&aN+SnGgivoPS?v z&W6JLb0!7#jm}FN#m~Kf`ns;*xcFf8E^Knx?165U3>*s2O7+H`v7`a3W;Tii(`rl;ZhT|_ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_exit_app.o b/hardware/arduino/mtk/system/libmtk/debug/vm_exit_app.o new file mode 100644 index 0000000000000000000000000000000000000000..abee06d466841091448bf7cb305e646931cdc43f GIT binary patch literal 1192 zcmah|&utp?XRv$t^JB715=cyBR0%m+C-a6RNWNr=N?8do%2!-FLKYu({#TA+v z^TXJ7XCq-dM@Il=t@d0mbSB4M-}UCYSuE<-NVxijQ8M0_)=QPjnqKB*UV`dVtl_v$ zZv<=&X{@@p`>b2v-C6IzQY68aSz5czR@vQXhGkifJ%~JEz^C)EaC(TslQ>k&bKi2| z&IIs*BOKtp=@hs(A&1l@UIyNujK}UflwdFJ2;q%-$HJYem-#j5Xw z0)7v1Ip73eFrgz-jGiZ50@tI!k0O%IBwXzBlK~VlLi(^y^&+w226B34gMw&O@4C6J8nX0FJh2gjczy7K?Vbp)~MI?Hu1LZaU3=0K=G&(d>Y2oUm zkNJ6(#VZV}3kTWNyau^TdD(C4B6hXDx@A%jg*fDql4=WAI>JI{lXGigTp7*rb>Prk zS0cEFepcRxyny@wxK%T7tG=qW+IvP=0=8+jx2u-jZZrU5qTiyP^C%#fBJTk3%|1fCz!O*Ov)27oAzPV**><^jEOfI)! zW_gxpApZd6p6@j~z%~%-`MuqTjpFXJ%{t6z2AgHe@fCKRt;P~8$=29S?LGrO81{tM zL@$ESw-pNfE*JhM0sO!d9`NR106geZKYOzt}-O!UOjdeRvFJ zF|FAm672}bA^~Znqx=);B@JH@Pz`0OZWRfv`Cjoq5rqFz$SB=Xs8cfdgJ^#og*7Q8 zy*9d>m4dd{~cq9NOjm)n687V{irTA|w^9S=LzOE~sxi zIFwQRQU=u5B@O4ugXJw)7qET++$q>Nfgc5S?|BlC)AuBPyH_z=9%DLRU_SAVNrx??7FGnjCUL#z_r{)DUpCh=>Ch zegYTn`~_~6=ud!O!L2Id(i_ZVz4OB-{%9NG0Jkah5yMj>6T*lSu7LOV^jXa2h?+lEw>2o&03i zTZNNf$CYhW$j4~)xbm)Vzw8~jc4yG<_XH-Y#o~P<)fgOl9oHKf)pXjhdcrlf&5Zdr zvz5u^HjOOL@(kqfpxtqub`RJl(olYH_g=HK`*^DXOInykSS)yft+R^(oyA##UD0kc z;KNa0IBi7XN$e`-xd&Xh?*;IEM>xRS!y#~QKmoZkJPVw*>Apq_*5Zy3Uax&9+@b$L z{{dIgLv3C1z0})hJ|_tJ{1Rfs=LBCdVIY!5?~^Z#&ka8gAkz3GVKU1j1W2Po{#l=@ zMP|iKRXXQ7889U{!n#QtZ-Hj!tcLICk%|MPnE!2158Nu6IOU%fYxO;I!3B2Jsu%K>U9VIc<)+=t s7p$^PrdO`8@sG6epYldv&o54;sdsVQ*ds)J1)zkOz{^7SO2|RI}$f z>bjoS-{sfx#bQ=1Xay|~rN=nIcIo)vw5}@U1m4g?MRBH z*$TTWJz}5@M}5z3qxW3yy8^k+k>)ucJkSno&jzhM9D?Q!C?IuSD}dG+^!v_Rlwd8* z_B^-OKJlEP|3g=B_fSKvo%6NS-%Jdh?jA39m#9RCGeyD(SE5<;$IO$5fg_5d=qs=EPR-c!o@$q zlaEZQPnpO}1B&-{`!AQT)mesIN&0$MA#IIH%nGS;wLDvRrTM>N6U!470IW yGOb3f)~vRyR%z3$S|mAiJPTi=h40B7ffZhu_biPYs9@dH0^ipPUJ{dHJly|U0DZ>* literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_copy_abort.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_copy_abort.o new file mode 100644 index 0000000000000000000000000000000000000000..e188831e60558345ec709d5dfb5a76c1498f8534 GIT binary patch literal 1232 zcma)5O>fgc5S?}G;HD5)nc`nop=pq$Y>njFTD?sUgMLA|ej- zM{wa^aN$-7eggaoZcxOfH<+<^n>6LXNW1UNo3}gmuKlj$lo?~7fZ!weVW;vao!e_iCb+W2`k3eR1%KkC%Gf-$gG%8%<6}oczmi2#}`kur1cC^KfZzW z^E+2fB+gd8lwWt<=bb&@ZT0pCuGj1Z0*jSG;hvSM_YQ)V9}KKYI&C=};alr=#(tGq z%j9y)R+eXZ2J&~%?)hG`18fB3B+bC{5UaP}|X0k~(uP?C6>}o8|5^RxO*H#(u z{-7(oCZY%;Y%3P{dtCT$1n^x?c)*+eKJcJN3Ar;o3%u3qcKw%V!Cu@GBIq;^gx{Ah z^&fBpJ#?%S(o1LSNKT+jehqO_a)OUounW6%hf{Qg0BMxSKk8Gx z$gQ}IoYt(9h;fKxfrt$9QT?GrDZ_gt)I){pTSWnT?koK>5_)G9$~T9CdN!*4#<4?0 zhVl_=N<`Fgk&WUM@=KKCn8iWoG`e3F3j@?tsQpx~a8%df*B_-5#=PKfB#rXc}D~qZzxDehExoFM2#^6Cz z3THaE##rvloX&Ml!}IVSKS?<2;i0UjYP;)heD954JYTW5oU literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_delete.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_delete.o new file mode 100644 index 0000000000000000000000000000000000000000..3cea728de1a448271db6bb5bc756015278721abc GIT binary patch literal 1220 zcma)5O>fgc5S?|LlC)AuBPyH_z=9%DLM^965FsSUcc3moO%Ayr<0OVeN(eYxM8ts$ zKYep}yLw>}gTv1{F60&WF=BolBNKg%8|N1;miNx1r@scEZSIE|bs3H=2mPkyrN z&HTx)qM zopd(4t!Ipkk%rtIv^%cT>H*tE8q6K+-)j{2AMey*MG3Jmi>epcCc7BWSd7Kl73DSq zV>BLcr-jHpfnCWww{LLwJqM%Xa0iUmXat5gq=4LMBLhZzI2gFE(So%MhjXvjI^^!i zf1&??tLUM&uJ~T+?K7Vfs6M}h81^~AS4`-Lq|tuzg>c^R;{YO!PXeZ^_=Er{RLDQ? zleNe!xrvEsVi^3ycN+AKh}oLAxULSEFfrrPrP@|Foh0M5Zpq~xMKQH8-> zk(#X3x7k^ukI(%)^>stRb@7Ka+OWl8s{@8rFmcH}EmUg<=8_BSidDlG*_+XC^wKaeuVjM3E-75`0@<08mehmNs literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_get_attributes.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_get_attributes.o new file mode 100644 index 0000000000000000000000000000000000000000..e4626872e2007d079eac5bcb3e1ec30fd32543b1 GIT binary patch literal 1252 zcmah}&u;k(O z(pa1&*cIg#13nn`gwsM4o{t^LJa?B1_pJcF;|K?MYcK%r^(i2ChG&7d`@Np~5-nJZ zpICSBZvTU;XrS$#3yieKPXbO54)`U+Xut`+VnRnGjh-i81pAF34k1$e;KO+Ij}jn_ z3i+pfvKE;oH;~ga^2}&H4ZCdQqx}5rxw7wX2+9&z0NMQpLABhA_)|IiuX*~?T{z#oLG^##P zLMJLvJ`9OT8X1GjIBtx!>DkGzj`HI)#`+{cHk%KR&U<3<>se!Ac7A!wd_xG%z-^@D zqGy&B2Bx1HjkIr1XX0KE)4nb#IG+CD@;0mpSlIz?6%8EnkBimXw($=)*cGc*$Xj;J yH0$Mt-N+ZLvQ1|C9pD#g<2U9F!9KkhEs6FtjthQ(s4W1L5EFQb=)P%q_O>fgc5S?{CNLrz!6^JBQ#Xvy`p_Wr3sJPI42XF~$a>xneBrdU3li;|Bhyz#t z0yq8yw;p;#;sU>d6R6yJgPGXtm`LeJyYt@6+nx2S?GH7z&KLu346-n109}_viZekL zRv`xCFNvoK^?g-L-xx;4iz3{Kepket2&b8|@v(3mYs8<#o1eO=)XES}lV^e`y@c$q zAM9qg{QKug{XQ?|`DEjy{?^hC%tJ$aWjLBO8kh%D%`q(lpi!wjl(Oy7k=-}!snp2l zCDn8cXOil#6l!O80O--Ozg`upGijX@BoQr@Hres|`^h#^P)}e2HCV zS3)V4W*N32++`q7rk11k&^xy4haB0)q3js%9FPaPql4U=OhC3rL`Yqbiy-$$mSwy~ z3D%Nz$Fa@ckz-629`GD`4Rh4usHdSmcRWlk?BT2E;~pmW6%!JAiqU$~#cJCTm^k38>20X`$38r*o@CI+zPn8&{% zaNjLA!gXt|j?3ULqOQ-}nnX!21ma2DT*2T9#u7N_d`TSCC;qGmVHXp@-tfAV3tBK9 zhCg%+-$JwMKE?fm6{ubq=-%eWU<1jn9|-PF`p7Krr;%Tu6GV&oFx>tx@78U2hUW6uq;22(1R%)D&>lO|1z?yICsH#+WGIs9Q0G7~a-}u7#usE?XmN;;Vnb z#J^$ULm&F)tNsd~H1(~C4|?y;4p2gzWagZE?%BDsvorg?q?Z|EAR2=tOd@~=4+2@& zkc34D!QgY`QAB@Rl;dlipnO4w8^LdyoRZ-raXL7XjzX32!*KOuGZtIuz)AE}l9gwW z{P~?-YvzCbI4<83#XO8wj?1rl#`ErhW$arH;jsJ00;m)Uca&tke`vQYd!$s-X+`fk zma?T~w3nI9%=UIl$*Ng31G$?xmuZ=;F0d5RKyG*EcB8oSV6zTEDa68T*}uXrvQ=M< z#aV(~kv15p!%@#MTZoR$u_Ksm9jK1=+5vUXbWBiN!y%}4p8|4c)GVm&ey?Y}KnvDV zO~Y@) zMfjGuPuSoOvgSDAH7O*&G^L-%$u$%gP>W!v^+mDMK8bfl3U@K_j)>PpT@eeM*8TAN zuh0p7ZuN=cJ5z!3epsEPkugZ%cz>)-&rbe;n;)k!zB~z#&F1~Eb|%m3JsE4W^NUl) z4L&#r8%W7T&n!!9YHfVqo^q=@(mw8cG41P;gyWn`tF~d?f%QF5^@4^&?s1`7+tub- z!Kmo9d`>rN<#N5$FdDhMUNXpuKLG>prh&K19)U5ZjJwu2E~h+_Z% literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_is_eof.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_is_eof.o new file mode 100644 index 0000000000000000000000000000000000000000..7b504a6c3a85b238b5af1508b02c8530182aeb55 GIT binary patch literal 1220 zcma)5O>fgc5S?|LlC)AuBPyH_z=9%DLRU_SAVNrx?*J}AO%AyrnvdI=dLsSb`DmF&c1!ub9vgNu&Mbi{QKw#34i)p9D-+@d*JksE~iw zCu@;easxT-k>85Wi{X@me3X9}pwvGjp&D|?x^)z=<{PPhMJ%^hZ`s^qjnxAJs&+U^+~=fQpjPVPb3(!u8bwl>MH#HD|N!qxcXEH%~hbh z3h`+g8H06PA565_)5#wm=O<~5wP}ECF|WeqxxA=nPPE1Ig$?<>--PPyRhNI#vX99WZ+VGR;o94jRhB2HM3DHm{y}&ZB|-V ut57s67MWf-zJ-6Jh5wW{0&D(oDowph;DbFv)K&n>h)KLGbgwl0$o~KcxqcM@ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_mkdir.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_mkdir.o new file mode 100644 index 0000000000000000000000000000000000000000..ec0c263dc385ae91e8cf807e8671263e0e50163b GIT binary patch literal 1216 zcma)5O>fgc5S?|LlC)AutD+_$0t*UC30>JG5)ndze23yTsL3G`2je7$1R4U)77=ma z!cXABjX%My68#DAE4WofTzZ3<*qg*XG1B_IdGoxp-d%qzn-#_w$Y79$Sq5NwNjN(( zq+tmnko&g$c-j0=N+quK!YQ~F{*g|>Y4R+0q#Q-6(Vb}RODi54BU1IB@I7_f3yQ17? zz(?bOu-k~j^{^+I>l|?5ycfW`wy=S>MnmJPW)t91NV-Xu)3G7Q*ef4}~+L zh5uh%MH_AFf^Vn2ed2Qh)#sNHqdq72iUkdkGe9{JgkhP|n z*OOB6D|5Pvlj|rhqIMAnt&i4A`y{^=DP*zml87I&ugoRR>ni;ID|N!qr29+>1v*e& z1^SLzFj&Ln{#2Nso&4cReOktReU>0QUsoX&sC)g)sdj#TdCNRQ2rj@)q~xM^RuvXF z3);6G95N_>>L;|XD+)dXKP>OShJcMOaI>i6BfnRy)%W$F39PDFFXTzpG literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_open.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_open.o new file mode 100644 index 0000000000000000000000000000000000000000..4d4ec9cc7a5437e6019c852fcb3084afda665c8d GIT binary patch literal 1220 zcma)5zi-n(6n^I7=a7z1t$(lGY`+O8AH z&je{$0THI3V~=CaH`VXSb*b22k}gRf>Tq}Yt14xrTN0e5rqfg5RMf=nXybV&k%;%< zY<2psUf6^5&u{E@r~K*3L#|frob_c*RNF$})od@me&h};tmIRSS*;;s=U18Tk z36^9jc0;(wKp9Vlj@dd-SPYoBH4Qv z{Lwv1fGkExAJp+$B<5U2PII;>h(_zhX3QN(NBKt{x>10SNT>!kUble(ta;4iUy!)> z%8hVc+|_Xz{6QA%3)c|}z6#(XF0Nwm0>)PHqy5o-sZac0k-|ev91!u0ug86k!FU*c z|K)MQ(Cp9Wk$UyB`StlN za|Iz-_U{YLSreFl&ZMBe(Rpzr|C#4dU*iIf!3V4KV8elpeNgm@ibLs1rP16~7c^jK zdb3>8jb^>xs1lBeY3;r;_{ C5Pq}( literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_read.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_read.o new file mode 100644 index 0000000000000000000000000000000000000000..874a63fca8292f250010db41a7156349700464da GIT binary patch literal 1240 zcma)5Pj3=I6o11%K{PF;Dj=yFg9(V;ER{s!#Q)9Bv1{EAdqPX1vJZY-4(9 z@{S+#>BKehmjjOil|TErNT>^EtJ6Av%Og!lp8jBoX5rT<7n`urUv8FP57g(qzOEX& z)|t`eV)4F|tPc;3wr-52ayl(ld!{aJDH-KeW;2t^rKGH!l{1jPixV_mYxRJo(Dml` zcJ4K{cOGum!RPX`09*5{vn%YHJHnzY#x`7c7|5gXz|>lZreR@Mc!u7WP5q4taz`^Y zkXxe>$i|QYQfK5W$nD`^pua!~){-^TGS{BGH?8|1$~;cMI_n@eyilzMmowr zu+gUBBRW(=n5bJp0&Bh${7-bOyJj&$7qWCh1}m7@pGQ_r3Q6x;;3ZsKLGmJUEBMj= zXus4a@vrE@E+!7hu}#z!vA{*%1Hbs5~JIgyO zdf}=Qpm#p+0lF8CS@pVe;{5vJmRSNfT$tY%nzQC&^K&Kz^^ML;7{yQRfchG8;kfu< zR9QdA-z78~H-Dq>|)7H&uL%D!wOU4C>;- YR?niifoE7Z5(H=>#_*DKD8|G62Yxh%LjV8( literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_rename.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_rename.o new file mode 100644 index 0000000000000000000000000000000000000000..73febc25824480c124cccb3a47d0f4bb5b113658 GIT binary patch literal 1224 zcma)5%Wl&^6usj-NLrz^5fx4_U_lWHp(Ce65V4_o2XIN%WRVRrPHIS`x(SYph*+@Y z6W|Z{0d`$f;s@X>Sb@rl?%>|olh=xoX3n|io|!uy&%CebRmK>I#vlc=2w=|(Lb-_{ z1*;H&;g{IcnEtM;ByRM=%0&h4guiJ@T7k3V`S3(KiPWM`qV-R0SzhVE+1k0Js4pP( z^Eod`M6d)t-i61m;FP_aI7QKwlGmEl^&|8=HS@rTFzLlWiqPXcP({W z%WAK)TiJX*t>$=+XQ6Np?WSdR`oPjiLxug_2d(n%V2V3z|jORyxn zCf#MgM`PPHJBY61VNWo}I^?eP)&+iGx+d_>Xaw9DP(bc1&jIfaY}-0Q3)bSM>pK0; zv1^U|5Bd+djvhMNux%53y>}6gK%{r@73FzYRl`3Tjm)8Z~<;3 zB^S+!OAO}UB%Pa%T{McH`vINnx`gB6gXLY=bYb%VxL(q5C_F3G8~fUl3yhlHC>C_1 zQLQ#BEu&Q^>J@`buPoQV7ir*|a>igRE>5L)uqSXMWkh)ufbLTgFAMEc#-IETfgc5S?}GlC)AutD+_$0t*UC8@h5zBqD?a`3}V;sL3Hx55`Fh32F#9TSUZx z3qOGiH~s{-O7thdui#b{ap?_aVs8@n#7OJ+=FRiYdUyS?Y*rX!AcH{)W*LC#C0cf3 zNWl_>A@^f6>^7osJ?u&5I)_|1?*;I#Eo|WJ(FnLZq=eiVo(0|+4hGI^v|ul83*q+LN5UD= z!v8O>qm8z8!MD@iKJz(&>hr6J5uX!$#e$AV8of`xFpgV(9zvw}tQ5-VJNA-t3O8qku>LEk+t)YND-$?yC67N2FiuA2`K52tL$Xe6P z>q#m3l{sC-$qf`2QM-(T)<^55eUjgb6tY-&MZ^!;SLPDubrpX9l{#T)(tW0c0v)KX z0)59U7_4FPU@FYdPJV4tpO!ISpC!mH)>TLb>Rvx{s$HC4-ZIY+f=h54DY@vKRfPr4 zg7$3}hYZRO{Dk&(MZss_hvgmE5U|k&ZWaxEU215n^l!poEyf4W>I4!vp>YXuo`< literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_seek.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_seek.o new file mode 100644 index 0000000000000000000000000000000000000000..14b33a880b8061ae7bf3ce7dd5c958b84f462b94 GIT binary patch literal 1220 zcma)5zi-n(6n^Imd+&XB@BHrWZB4H;#(*1xG|WAKw(CUl zGeH_wK!oY%*uz-!P4#GVW65jAl;+IZ4QB;tKI zU7fzG7xp3j^BcR_DgXLW$L;Qf$5l_bjM>*>=8Mn&MA3NdZXdcdX5sT zrI?Om54y*WHTHh!Kj1oQsJ%;`mU`UrI6>IsR}rHgC-{U38IfW%pL8OAw>&?DNcP?Z ze{_!$Ad3;w2X(v_i8)u1)0`~|qS1P>8FL5HQT~C4ZWQ1n5~{(C*KJ?`Yrf#|FG$>b z8{he|hd8JDU#!-HW-o_1b>m?E3tc zxq=WZ`}c+BtO?9NXHrn#=)Aa*|JZY=uWk- CfPRbs literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_set_attributes.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_set_attributes.o new file mode 100644 index 0000000000000000000000000000000000000000..2cb523dde746b33428fd6b75f44974454aee04ed GIT binary patch literal 1256 zcmah}O>fgc5S?{CNLrz!6^JAlu%Ji@p~fi@R9wiXQ@|yt$sq?MNJtA>|U%?4fZoR>b*XyKF5i9M!H#5)s*1K!Js~b9F3`Ap)g;@m9;X$P6 z39_&ZF&KYNJW3dEYjXN(KPsP<;YReECg)^0${ddmq=Q%^{xH7vv6D(I_2DRaEXm3< z$o~A!u5~KEejMs|gqe@Y#-aXtXg(k8+2+J{P0MwiL3iJ^Cn#uCtM`;_Yqan5Y-g%8 z@_EG=xVEyP6|`4{^}^<6PARHIwE*SYD7S2@I{=nL8Y%B=-)+~nAFQ_^D#ciwt%lFB z^Xx(>#nLRpE=xBVsFUf?wYrF|!?7=zWACZ1{l*1#*K#dTyORm1&WHk17t|uCz0q)J zzeEXosVCO$zuW)d3JPe8qrQ;#x$Sd;u+J|d#(hrk1q%uy<>-0R#js!Z;}9aX4;+G# zA16Q_Go+u_2`>^0t|6yqHYkaW=1X~u52T~|eII!i;1d$^5KZ`QVFEqJBL5W$zgs*b zbSqpZWbg-BCy2Nwg`}6}@=2Ur!{id?64+^dN$j*w;$4wK2@CIu_)YkVSm1m<48Lg^ zK?`~AL5TCuJCI)(GP5!=2A6Ow1-bdzNgwg*K^bFZ79d-!hrRQjNx0vWAh9^VxMf@r zf-`UnDXHk0Rf&PlOWsKP_H-d0`Z4Y6iiG3oAFkSiH5b-)K{cux4&}$yt>%vQ4>gz# zqgg2%W>eQ&^|skASB$zz;urWkz%SIqZ_Js3dAb=bsf0a^3$7uimI3IVW$+Ri6yxFl E1*B_^9smFU literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_tell.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_tell.o new file mode 100644 index 0000000000000000000000000000000000000000..95acf42a41efe71aec53da8ca4475d93662861af GIT binary patch literal 1212 zcma)5&2G~`5T13MlC)Au%U=>Au%JjOp)03EB0@;u`~xmQO%CB?oYXXt5(3T^5pm$c zBXB|DHMmuxj{r}>tt#Tu8_dLB$LWcY*5AxG-|nnucRyCm8eQaAe14BU?X$Y$UqeOf$J4rBHBlX&AxCz)LC!%5;)$!ISjd;F8# z?39jw9o4pFAs-Xu>X0 z`C@TXEARr(gK-xp*pA&D0NX@2YV7XZYgcw2Z?#}aiLp3aS1+`ElbQY_7`DR&s~ z$#f*_E~0Qf>`TvehFm!B1@Jvv*ucA!32=8z0jcx60K7LIjhxpg!CKrF!X0!EgfsDf z=s(~(YN)MCzLt9X-1iAo-@l3&_kDt|n9vZ3qxqzZ;kf0;5k#_29t2@{Tt{*lx$`(^f3#ofll)h7p@4~fa(t6@Wh^nwtML1;T@QtP=WI5 zLa%7I7f}8nm=a!{^wC*9NMn3?9-wzNuL9kRxq0=>fH=Fpyk(vs0_TGJLUYy?7MwFF zsBd&$(kOo62h`U!1;613%X_dPU}F!sS=RAmJS#VvyZV9#th(7O8K%{&)mqiI)iz3I p)gsBhBP@K47QQEU3RZYwuV*RTz$2`iTmh&crty-{{*rjO{{UZidfNa1 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_file_write.o b/hardware/arduino/mtk/system/libmtk/debug/vm_file_write.o new file mode 100644 index 0000000000000000000000000000000000000000..e2d077d1acaed5e64b5a51b6913c157d0b58397d GIT binary patch literal 1244 zcma)5Pj3=I6o11%K{PEbrhuEeF=#;SW~n3+F9s+BDlMjv*hG`%-zpdoUA8KxUi<(a zJeZ#P5j^OPgNa{2&whX=p6ZQw(f8P$F7)I}X5R1p-f!m3zS%h_Rybn}gfU2f69IIs zz?+!~5)cGGOuszhoPYhiTJ=e*<%6w{{980E#kv=zL;iuojo^1xN=jFy0*90J>4nLA ze#oa2*Ti26JP4Hk>}4aNE}Se+Yy2ILG$3*OgT)*9U&mY=!uI}Bqx5>9J?-^%?Tyhh zb>d5f!W}tL8}1uz-5ATIR7$R3O5Rk{>Z|ldI-5<(86~5nA$JSqO}*Lb0ZStE=61Jl z*SEIsZPdW$^0NS2@r2nWw&sqoD2uUm*G&e>Xgn~RE%c^g`K~~Q-d9ZhtqDq}X*NM= zjYgmtLkdWpRx+Tphl7Fs0wq{WX_}_dYwer*hz|aLb_HeBa-S`yzV~fR&ST@t=mRz; zH^GFAo;X@hIzNtUcI-w^b~Kxv$+}*E6jG$0*NIxB7Fb10Yc`2QJHoL{z&6rR{;ut9 z8a^SQ8p1@~G7?zxrQm-eu>LiR5xS726EaxB#NKIS)ufR0t~p-D%~d4NBe#Tu&PV5^ zK8bHd2oEvwoPceju84)7=RNTIui(kMXVo3Xy-ad>DR*{%@t0WwH=Kj(2uVe2R$Of1E~sz!aR{UMu^mufLoS>b9<0)a zxC!wND3yYWQ*NhFuI{RfBG5{eYCc!ds+`w~b*-MuSBe^Gp6RBB?@_}SWsE^v*c$6m W-=cVkC+H(VfCl;)Hn>AEUhqF@9Ep?w literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_find_close.o b/hardware/arduino/mtk/system/libmtk/debug/vm_find_close.o new file mode 100644 index 0000000000000000000000000000000000000000..c7e13ec5f8e239a79f5d77b74d54b4fe9ec4fecc GIT binary patch literal 1212 zcma)5Pfrs;6o0eZVu7GQFl@2WjX_hWOt#p>#+Yd7UvZ%c?SaI@vTaveL#b{DW8*#s2h9^1j5%?CKjBw+o?{#O|E+=0y^M3F5elu_O&CZviU1E%ZG6qQ)M*x)|h-QX@ zB+Nn#vOnft&Doy|iTM3?Gy&_;^JD@pjH~P^JB4y=J68F&Zx}OexVU+xCCmdzUY`H{ zbyni4i1hR2v(m?|^QLpua+-&|zDImHpMPp5YrSK?>G=b*oJyH?M|kF@m9{>lH`3Yc znwjAlo`&3Gl)IkW=m1+o7|reNJgFCUUT)N2N{g{+wisDrx7o68usB;`ceO_hcz@6p zZUepW1K(E2_YS%6J_+D0SGd3%{XTHNM**qRJOjMh>vp{(lwd9H3gLGe$HME=!T-^So6K&eZ(}zNj?IXe-%$&A66eTdZ+^BBS7CV zHU>)=WJkp0?xc?n^P@Dz%i{pi^?U>pp?pw}dK}pG{ncLw<=J=)v+PtO{6d0k`uOPPyHDrMhQ@Mc|a}>Q>Hns-;q`Sa<5VExYKD n=B+0je2)&kD1QJ>XltxTeT(BEo}o8p0bZbA!3Gy7#tZ%j=*@d> literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_find_close_ext.o b/hardware/arduino/mtk/system/libmtk/debug/vm_find_close_ext.o new file mode 100644 index 0000000000000000000000000000000000000000..8900085c384b9b00875918806cfeda6c18ed2e93 GIT binary patch literal 1228 zcma)5&2G~`5T14HlC~; zd0OVGh{VOpY5Az{zU>`!-1h!p=)3+$LAgqy@We_r28Ti04@Oocowl5w@U3k-V}HnO zWpcRqgnyB#xGf~~Q;+Cv6> zIO+?pg(!j$yNU(=J{NQf-tmM7yfqvG4+i9rI>WQT+k<}JKR^lA;+_yeuXQN=Aszhx z>>kRftus%of&?UcvI4e29H%wTF6r=T|i{p48{TL$I@pz7=@CpIa7$W_oPSql{ z;x=+xvrR#?V;n0)q>+yD&m_t)d_h7rl&QK^3}DUoD*gireX}y9Tf%@k8|8lE*droM z=?FCyMAUJSjlntOx5&q_h=ckxxnC9&M;KG4_EWyX$+!*|e^i_>HvaM`68onD<#kw% z(#RN?IOncnle?4N80W9j=+nJNHl5eOijv5}der04ruSEWS(uH%4cJ6VDq6FwF?brL z#xwP;KIONiPkmj|sEN~$mbYPDz&6uQ?C!9B~bQnj-ml*?$27<$|67 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_find_first.o b/hardware/arduino/mtk/system/libmtk/debug/vm_find_first.o new file mode 100644 index 0000000000000000000000000000000000000000..f57184ff291be4d358ffb9af339b15c790c1039b GIT binary patch literal 1220 zcma)5%Wl&^6usj-NLrz^RZ){*fdvI6gpQmNLBxjU9g5pjO%{<@m^=&#B293nh=>JS zJ^}Xp0=q6M@dNM`tUzT&cW`g)N#d@!(#$#c+~c|98T)<7C^N=D27?65Gk^mp31p^* z1S~@cMqeUNBF4L-8oSX8s+U!`6a1#DNfplG=c5zlBvc9ShO3{N(dbeS&Q{J9ReJ`B zpWoTdX8zZY)AD`U%*B<;Y5C2-eBM9m;$)8n>6Jp^p_Zr*kL`|SPqa!Zr5Sx;Y1?{Q zf1Tb+XR}Ey!!tY$xqE1DS*>;-SQ2R%_ad-0YKcE5cr ztTAo;|Kd8@=xBqkozA!6ast20uOfzBPVgBE8X{@*Jo!R6Zn?P+k>Y~`v)Q>ufD|g^ zU-ZddWR_ek2nbVU}@+%8^2p88;TtY2^gZ4-JrE`++iWIU~cuB+!*;nQg7j-}U{wsAt-?aN& z@p(E>-4FC0^I))!$<9nzT%G)ZX?<44d}E#Zv>Z4rbcL_2pOQ7<_OEZX+cZ zJ+r1T&t1^D?c$I@`BOKcb6r(%_WZEC1DgUiyTFZtj#F;GP^}&6UK5xVqn6JZX02SV wml|dxmp4i#d0tq;#Q)L6Kgynf=~){4?cj*vCW?sBWdQn?;&{LY<#@sW0BGfY1poj5 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_find_first_ext.o b/hardware/arduino/mtk/system/libmtk/debug/vm_find_first_ext.o new file mode 100644 index 0000000000000000000000000000000000000000..a738181f1a0860f73e1c958da86fc4be6859778b GIT binary patch literal 1236 zcma)5&u}07#8`H${8+9uNIB;7RScOCiF4IQh!K?p* ziGPOPdg#ro{uQ1y_146LzQ^tW(u*&d`M&qPZ|2R;?!GG;CB_)YV32@W2GDSmKxSe{ zz%qnj_<7~Yit)Cf#%^|l>J=5Xf?sttslr+Oe0ZXqgv#N^;mU_*G`iGDd+TDm8jc^E05mX7=8i{4=eCubx~`;DMlIiG)^CF+ACr)@i9t(;0}Mo-w< zj-J+Er?=C)yGbp>GdvC1yJ)v;tJMRRL>kD}4(>M!2amSv5L7}e%+~ztY=d3(MOlo+ z*>&X(13nt}h1Eh7j*DH%9Qzd)bPC?Fgay1c8Uc3(l#n~kGr-$}e&0Ss3-;oc5Kgak zBh3V|RN`Mq9 zgo+dqFXJK|#UD! literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_find_next.o b/hardware/arduino/mtk/system/libmtk/debug/vm_find_next.o new file mode 100644 index 0000000000000000000000000000000000000000..426124d41b20ea900146603f029520eb320a5625 GIT binary patch literal 1216 zcma)5OK;Oa5T11&B&|@=@=AgQ78EHV)N)D$5f{iifJ>?-hj21ZVwy!A{V0Dc80P&v^X%w)Ze(-R|k=bLZ7-C57>zOU*v#ux}=kcMRhu*ZW?ej!N1 zIz(XlCH6F?zpKc}8-uWXUWVJ@Z zo!#t|e*HME-4n%JAFm(R-i(Zw!*SmjTW_5OT`!j(DCySZ(C%6GT&ZWXiavBKWk<_t zuXEeELLsB%)x4U6;$56zT4r|$EQ2sq+~2+5uIxVEZb4XzuqfLMUSyZpl|X_eS&Chg z?l4ei^O0kA(K|Nx1A%PomFmzo)V}GMpmt|7Q0)l?q|T{%PqfKUlQ~TMlgXLDkC|4#j8XMsr_V(ST9co28;|G;6h1 twQaPECB15pmUn{{U}td`tiU literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_find_next_ext.o b/hardware/arduino/mtk/system/libmtk/debug/vm_find_next_ext.o new file mode 100644 index 0000000000000000000000000000000000000000..e3014e3217ed6831ff1dff56b6ce22419a5a5a5c GIT binary patch literal 1232 zcma)5OK;Oa5T11&BrT|ERn#O{U_p@*LRU_SpsJ7{?*J}AO%AykCov=vdEmH+hyz#t z0un!h3%4G6;|jlm6R6xOaex`yn>gu(k#@gtX1?87k9XgfwF+YlgfU3L+yiL3PAKOH zQm_gU7=KxNvZlQ&$%*T|uzX2|Tj6i2oR;A z`uUyRXcd0_IH}wf#XO8vPbzN)`iuUss}Ie$wvNL|Rg1-aCDj-mSsl}wD%DIz(fYQj z?5bJyb#^Dax0hCOJjb(;zk>@5(`fgBrICj6hX?nXrGrO14G2pS7G)d3O?H`W1>!8h zlI*HqIRQ3$7xkHM9EnGod4tL=f>JE>bbLf_x1JoiB!i`sCm5J|_IXN$iKR1@p&)@cXYn8F0RQ z9tkW|pnAcDUQwsEQ2ubX#J@Y~Lr#8{Mn5@skS*tfK=)^EZoOx-!1Dg$mbroeTmX6~ zq@pz&5`%p=<;>K#`Ce`x4KGi9U6*iPezd#;+cs=>fonw-r~K1mt$wJU(}7;q>V>?f y*DIAqxv4kv1+A=;?4@bz_$qaLSJo8tOKp?Vs&T1C_W~0t?FyBo#F!}mG;Sp+Tr|BI78nJEqRSQ~n&>O| z7QTR2_8~MrgqPx7@AMpI2Pii($V080i)6tmffMzqp9a~i@K8pT-5 zu-dLL_Tq{7o5XG+mD)CvX3|VR`T-``!mhW0Z6gh&j}G^%xx<6q3M~18Y=v!V*VuJ- z!>_Y2+hVtUI}FVJu$K}U?7r4`Q!`YbJvUgh%`P( zn9TCC0>n@u|Ey2dBD3Og@S#4bvm%8OE_@^64OLgg3TJf< z{`^%sp?_R`s`xKepmpt1ujp;>qkVeb+1<$>7_U!v3{3hiwfS`o_NQiKvR-bY&F`;n znKbxe8PZ6}MLC;31~28(c&5I6nu|YsF}4pjd^j)qGn);FxDaWAX=UR$rJrR><)iq* z`M`@-Ig_?{xlpL&tGt@dSb0wAFNDkSFXs3kIz!-#zL5M5VLW6C&!VpaJVM;Ui}!?L HyfFU&Be$m5 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_fly_mode_is_switching.o b/hardware/arduino/mtk/system/libmtk/debug/vm_fly_mode_is_switching.o new file mode 100644 index 0000000000000000000000000000000000000000..0a207f285a08a16ad72d019587aee7b36216cb9a GIT binary patch literal 1252 zcmah|%Wl&^6usjl#if<{07OzMuuu>wp`)ZkB0@-zcM2{+O%@d!$4N|MscER~0ue}j z06)Nwuxg^Sdk=WW^i1F_*9GqMDIj;6XMnf+y`FW97Ocfh&vWe7sb{%z za~I<+w9wHm1XeoVYQPD?0l$H`7;u8`n9vYOqw(ZZ@w*emAw+5)1&n&}8v&B2kblxA zYmr&<6mlA~Ln1bsZ_{U@BOm3T1SnL1FG#3{Y_cxx4QsxU`ZpxvP6^@<~Hc7A!wgdqf%AdQq3e};05?f?J) literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_fly_mode_switch.o b/hardware/arduino/mtk/system/libmtk/debug/vm_fly_mode_switch.o new file mode 100644 index 0000000000000000000000000000000000000000..b5e95a96592357394e8674c5b2304d9a3fda30b3 GIT binary patch literal 1264 zcma)5O>YuW6uplxK{S?v3OK1~FafcXp^`{kXn^v-NF^yGc40CMFbWBX4pWs?H~s(@ zE=*Vb5p~DH#6M7ffy*YY>W;Y4dzpC-r7pb5d*|G9&zt+^&Ah#GjWfnT1cMYf8Nk3w zyt%m{1wrt`?DJF3`Ip0R-6w^sdz+v5*H}b~_by8N{3D0k!6QXVOE;wwhm*D0h3N;r z&u3HD)L#ia4pe{b4<_nx)YaAT z+rHW9VX;yw-A|+%qg|t;8bPvdZi1dN!X=CvtL5&O+fX+BIEk_kpF6 zdJEfI_nMnqkJcODbNN|-t$HHtGP~-IvKWiAHP;;m@^~^dwKk$@SlAQH&FftKC-B(( z8e+ia1V>m%Ad*Jw$>+y$%g)`16bJL!nXFF?kU@$3i$2kd+=45}Y0U3R z)gRhu%W#N`e#QNVXMfgINPuL)gg`K~d)ss^4yB72$K3qZZJZhJ4 z(Ee6%&^d{BMG8$UOo-Sa`iflOqV9p8zlBcdo_BW?_o)t4_rMjWjEq4HXXiZ@pH6=7 zyzVUVg5)H~mg^q4ajI_hqibWu^7F-CW>wvAZvKtPMQc`F3?5je`Ap~5T*`Gjr*jRt za6Wr!X+AI`nWtEICbW_Efsp8!- eCZL{eLffEojNvAqAx47$EyOtfI9k(wNOGfwJ~NQ8j1MMNCP zkyqe35Vs!s2z`s5klI^rFk^dT6Cp<0op0v*cE=ujzE-R%V+^D*Fd&Kmc7h<8_XP%A zhZGckF1}v0zLYcR2i;@_9wpC>3|wlH!YMn2TIyA*{{2wX7P@e`G*L488!)cUe_fna zxhxX;<=R>GQ{O)JTo<5LDm~SW=HSHZxZX&wWwW}~6Ry5(=FE?|tz4n7q33y?=b-o) z&pWQu?g86Cm@FRbJ!zHqUT!sEPD!zOwyNG_x7eM8#?ow!-BUIh@ZqR0oHlyl1->hh z=f2~@{VaeVIl=+n9u9$f0}4o;<9XnnLBH?5M+w&Aju2k2eInf9%nSV|ypJ5UaxTUW$=_|>CK;;#x+PsO>28-pbb3)58m zcG4$(eoA9ZeTZz9SK)R%U;bqQn}BPeBP11_SygDtBcr}Ok3zqXjWDLZ zt|+*NgUUOwE@1r#xK%Q7EAE%-jRRBCVArh1Zqc$E)oQcSvRlPnt6~%T))h9+pp8@H cjlh<3Pd!TG13W{oVH0=IuVFLF6ywMI11l79;{X5v literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_free_dyn_array.o b/hardware/arduino/mtk/system/libmtk/debug/vm_free_dyn_array.o new file mode 100644 index 0000000000000000000000000000000000000000..575c115daf083fef4e45d1dccc701bdd7e6054f1 GIT binary patch literal 1228 zcma)5O>fgc5S?|LlC~;I(Vx(N!3n7qm)>9|>y1NtVWi!8^XA!aJ+?m=?Gj@QR4_WjqB_gJA-oUb*%Dr-!SGnaC!S$OPFsVd3EvY z=Xr@MlOQja&r2sg=fL+or#(D!T;F$x)GO!n&&*`Kf9$tBe`uCdDbwx>&)l}s)`#>~ zI-A`vGd#o7kb8o1*K?a)U>gXdx!Ug2Mq&5WRvl)v7@K9w`U+cRcOwRivo&^Kd(40j zhCSgnF$-VjjzYfojtlRj0N!?m3%ofP0QdV;kUGsXz+3%Z&pSd1dU00>zuP<(-hdAN zfAIiiG}f6wPP4TGOi2&$JF3FXZzABibKV z(vwQkYZJVVH@A?SL+%bPI^QBLnv;4~gpk3;34tJ#uc}p^yk!8oc?Kf3)Tg!w}IPv3%A@}zEZ7OH-+Go?dnd>cB-XPz1VOX sxgERcknYeE4*r)8{#pJIoEsMCO*4$+0qMNPJitrLYxvO=sK%H57Z}-st^fc4 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_abort.o b/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_abort.o new file mode 100644 index 0000000000000000000000000000000000000000..caadaf8ba7af7d15d29364a383ad52fcaba20ad7 GIT binary patch literal 1232 zcma)5Pj3=I6o0cog*K_QY2$)KH(C=~>}07V5@Vv2zv@;R;J|HN=qe;qba&cFJb3X# z=(q6Vt%oLl0sR!-ntHM~eUI4zq!(W@^M3F5emigW&CG|gRbh;QG6rdwMgaRVh~&nC zG%P_B@?V#qEnDwPsl=^bBn4ZM@97krCol3R+DWt;dm5{KZtMDD569Zf~ zc6;~i=V@g}6$*U3dRjRi*e`wC@kfVU+vyBFLAh$N_`pavheux5^+rZDlQFEmaE%=^ zYrf5HXY=_@Bgb<*3x#_qcU-5_2eyeYQfTbmZH6yng3M zxIS(C|Li8psI?1$ocg;TU~=IAUq>GcFu5<7Fwhf6-;*wi<4zEV(35?XZZgYb1jrym z`dOW-MPh|b#Pp3iFIsO6hcePp{!!o+{|N!rP^RkEkieR66#or@yi<}>PzCm$MDpE99; zDo{QQ>(ewM20G3UC*17nq>qgAlQhP3?o*r3hryU85y^VigqvSq-7+Z%!4=p-NGkef zRbw-IlYMJQ>3F6-c7vGux}s4N=N~Qa!iIp21K?KC#HsMSSgSY8%R;cLR(-c%+4V}L xS#H^_!md@eN%zVXHoi+6UzRrl`%($4O+8HDh90BWmjFuWlXz+9e(8AFe*u*IgVX>3 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_close.o b/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_close.o new file mode 100644 index 0000000000000000000000000000000000000000..2b7321f3f221c050062c501e98fa5a8c46cfcefb GIT binary patch literal 1232 zcma)5&2G~`5T13ClC)Aut5!H60tYq+)>rV9$dsPm6Y}p(&s5-Oh4Ub*haYtG$lhKU6?`S)E zR)3q_&gS!*T8`&<777ngZaG%B4{Q@*q|n@b*e>rr+it;v5@j*A8eU`T>_$js36^BH zl=}?0HyZd>7rpNa-;>C74!Q5V^MM~&z6HGNdBEKv1*FdM9B_L$7&u2L!CKt%eYf8| z_8pHl{(p8GWz^b*Ku-PL4=}lKfN!FY1(@6yOlatdqwh%<#c?l)L+Hsq3OAX>F#=?e zA^ogQ)*`XQI%4`po)@jRhC>?ZDE}nzlK+H&YDklH>qubDH!+ll)hNkjKOcfxu*48B0IQhvC;B$&(L_t52EG zKNTn+hV^M05d#(H#}jULb<#)1`AHgMI`^r~=fj{)lZZq;W5Ug^FK?L;gy0%%AtV)j zv#PL}y@|dxg>*bqAMGHfzOE?L#Q8_dZP@T(;{do((s3&6mFkVAepLu&&1e)0hS{iA xTa~uiE)O2SJ~Z(U=&$gtsZaJz?`3utN_}vWnRD*BXXftC$A?X`$`}LH7-V1)0c^`4k{=r~ zumDjgd|iCHXuhwclh=EZG~9}O&!pivby7Ic4x+W#lUV(8JCT_0!EyXVOY6@ebM%AV zXqS$D9#%J0As^$l!|L0C^}@4kZ?xC7y2HVsFECjvm+$GB=5XKbI_^lXWwW~37mmJR zd zE81-a+#3yq-9Z$t#GYcV^NI`SodCXT3mbUH^MJcU3do(~dEoS!&K_E@7Pp0P`<;E^ zc>YiQ2V6xDZS9=zrTyLZIYHRxml0z=C-{O19g#GePrfMjn|>TZr1nulFv?>D$f832 zX`iY^X2lKUG)J8mt+#?*HS$sZp^r-cgoJ9Srs~#Fz?!d>{tbz|Q&LgBCFxT(_>HU` zM6xD@g{=Sp literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_delete.o b/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_delete.o new file mode 100644 index 0000000000000000000000000000000000000000..8fceb617d31e0b5ef8412168057b9fa1eb999e0f GIT binary patch literal 1240 zcma)5%Wl&^6usj-NLoBqQIBCm*k!H@h=bo8s&*NQ1uQJ9!GzMvyMF1@xgz{5E z8Wte}<4>_CG5u{>PG0MW<#RIJ41d++j0}gVqw&79AE`wjN9!NjiNr!54&z6XtUQPG zk8kXHyZH0_LG_L(=3%^cP<=f#UO0y7Om@3Q&)TtE3zM}{>7J5qj`r-XWlxk^Hmm3Z z*HYHCoc1cWmfP6KD0wxn=AdvJ?WSdR2EZ~%Lxt_FyRGupqqQc4r3j0%<=_fC&n^ZM zEXh*rvUH1q>P&{N*+Fz|j(x#wYe#jhH!i3>(=|cuI1Z@xhyrrw)I6x&(Qs((q6KTI zrt8{+&Yo*I-cS7pTtN?QZ`kwF9=AMB5cK#Z#Hhy!K4U^bB#q{iFM|Ds7Y7ijz31SM z{3rpksE~i&Cu)&da1A-lStk)2t+z5|d>|j?A9~1DfR9M1hG?R09R;j87Wx+?{9bWI z_?Ea&*x)y^wjc4D6p~+>)6e4K8j1_3#jw-&#j(>qiGM{3_c1Xc;x$oM!~*B_ApH6x zbi%;2`b-HNt3df6T$rViF-YRL>1*?=lRq@g`)Q2jS%Bts(2Yj5+N`vUR-vd@3^Km7TmxUGfp5#6fN{DAeZwa9Bz{yGF|i0hcPoV#N2eGM F{4Yr{hKc|H literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_get_working_buf_size.o b/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_get_working_buf_size.o new file mode 100644 index 0000000000000000000000000000000000000000..ed2e4455c5de20345961c1b831f25d73f49db868 GIT binary patch literal 1284 zcmah}&2G~`5T13M;?hb@3katm@F9qlP~((H1cXHMp9;5;njE5DTqkv#2$F#900AV# zn;`KF-1-Jw;2n@S5^lZ0jMtl_y=0}`@0*!#cXr3S{!}u{j4=?6K@z4GK$9EMOdv?Y z5-1S+w)}kA{7}3Z*E*1tf52Ehi=9fRN=4aGss~L~z0!g4%9(Zu$?;E?IL!a~eNQA1 zSWzo)de*UL+1{w%woV-1dOL7mbo(b(Yj|vV-S-1(io88bddPYw}?jcUF9lO;9wt+O7+uwcEDDLiT)?qb~>N2mQ$QZO~hu2f8~TgVbp~1A2SV>p6XtU@qPE zeYe{h`i>_KIUjGMgi5>+N~zA(kQ2xuzk#?Ia)MtN&=AQ-^GT;*zZ2RKL~0*7Oh*1W z0aEB8{j5&pBC+5Ga+7^Ne3>P=hc^Q2x*lB+;>{KUlR-~|vfv-fuCh`hf;H+PUzqE}> ziv-yxCayo5f%3`cYDK%fi}LAtXICeEG>A`EjKcYMb1^Q%gQ*x9&sUuIF0L-GYu*NUz2ms~Ebd)h0(gqJju&j3Y`hr% E0UoWJ761SM literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_open.o b/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_open.o new file mode 100644 index 0000000000000000000000000000000000000000..9e3a9ce124b8de957c9e1f23f98e49f9787d6a75 GIT binary patch literal 1236 zcma)5&2G~`5T12@>QJF3RZx>)K?Frg2(_FNi6|GyuT$X?)Z`Fxah=qVNF*t?i-y0=<(3=F#9qgQ3nT4*-^_fwvmWohX=*LT7;s~dgOvx+cb!OS zDagSlh_Lt+e;Dt)ZhT88rOGHOU6$Ur;P%EBMaoMzB)G^d7U#mbsEP-%_LF`pl^DUr z*5Yled~`#6%X6Vzi!gB92?0A3`L1 z=Yl`GzZ0N<5z+^BycUT$SCG@1eF~z{e#s?sC(=>=zK3oU-~$q>!Hw5#V*qQO^7v;Y z?%i@DT$gZlTn4|91^dEvgo3XEh~wr81}|Z33kRJqj)VHdzZEGwz(nvj@%<-qsc6l%z##Z8sc(;Qa3kOF9O`RAzr`v>%(w;p=%573)uJ?Krm^4o&t zQZk-VGin;LH*kPynYB$|NrWTWwbh%|{Oa9>3XJ-KEX2kG6YMgJ`eSU8O|dJ!>kQO( zr{$P6jE*g0QzF~iQXOm00kvT|CaAS`8&rFT5>ltt45;;;R?FH(33{of zKlLAB1~qgHqpp_DV&BCS0xq7$7;-U%FIb3UB#y?DE{NZ}oBJ_RI~1Yciz5d}Awznv zPI{48Vhu5kStJr0%{S3Qq9YyEZ@W>j03Q*MhiuZfgamp%k^D~t;{FLn>LNlXWpE7( z>-|i4Qc8NChtJ^T8j@k;F5pM&yNDm{ll)hN(7=NCn4~Y&yv@r8;MX5-&EIn$F#b~x zcB=%skEOZrODZ0Bga_Yq& z;K76GsXwCLdNA?gQGbEQCZ6hzc+vORo$eMdzGUXT_q}iCn|(WTP_1*u7zksK13v@U zb(2V8LdZcJqA>pSlym<1IMJBNBx(m6ANiNmLMGk2nmObjINXVUQ!~q%TbT-nv!(Hs zllT0Pk58nNs1|z^tNq?CCg*x^Hal+ecRbmK-063gZI^$Za&ZXHN42*0W}rW}b;BO* zb#>b`UrtI|rLr#Pn!|moYg!{&TUn9oeaDp7)V%sSznU)=m*s*|Q1Vc^hYJkT==6at zV;CuIZQgHfY(89V!i*GUF*YAwVAt7VD9KVR&6cFQ3>14baEuOm$8vp7M3%X$IObai zlpVt{KUXo{=?lw4z+#8<5KT;y_j6s zi*KNhc`>=KSdh^ZM(c?e#c|uqL+HtlCbK`ezZhTzA>s#lLW|fURxzeEYXqVl;aH%+ zGvZPGf#*FKjxit&VM4ct0BXJx_zw)+`{p8oH|O#M4H8(`KF?fDN{KH8@GNewB6u0G zYdGk9vpA?v;#)C<78ZiPN$657XhA#-zy1Vkp^3VWgf1wMUid<<=(LMS_rD{!JMklv zy1!!t(td)`bUh4oe|&TGdgs9O{^FLogb-W;dML!AHS-dKb+L81uX7U4 z(~nl^Le_!o4k-1Cic{%vrPkO||KWkI)f?qfU2kySthV%4sa&t>M0;U6I=)IB-<352 beOkcnUkVTR49}2^1GLen@xts-jz9V@sC16I literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_write.o b/hardware/arduino/mtk/system/libmtk/debug/vm_fs_async_write.o new file mode 100644 index 0000000000000000000000000000000000000000..b4efb3474c54f60dbf4221c6138cbed629d11ac4 GIT binary patch literal 1276 zcma)5&rcIU6n@h!SioOJ2n9B>DkR0qW{XWEYNDm>w8q6IZ4%(Hx3;91N81m4|=oSIGE^rot?Ipi!a&vzW2Rv=grQ{KF^q(F$OXiM4_7j z?2BX|(KbY31VYgI@Q`zU^nSveQ77)difUgX$S|Ont*4cJ|ZoTSJA{ zm(_XomI|#)$4c|`;VXW?TZe(eP@hO&3FyEW@k-LmVAt%~)`-S8Z$WmBn}TC}*m<5nEEp=Dz+&BT(nXvB@D@rC%( z(!7??6M7ty*U@e}c6kHXJko(=VdX|Cy>f4%2!nwT8)BouF*eR7ln9$-Q|w~k8UwxF zsCjl7(Q^e>C3Brk-E;Ol(ARCx2EAObgYIrqLhiVp0KKwZt2tX}!Ct!UdG1De$8+km z@c)Y$w9zpP`gS^teV-EqeLjsi`l0VR+Cvb8D#bMOW;X~^?j}PsW{8pr}j)h$!e#pKum)NTZ;nyFj6DsZQT}An) z1J#2t-Yp|z5W%t9(Rybm|3JImDPvCO-i`ix5VUR)ndrCI(fa3?w@ermI0aXcl8fFM z4KTPZO6`&Mt vreu|p%Vx$R-($zK@V~V1&vF}JooIo*X%8oHft!et5pkiW@X~mc<6-{=razaS literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_gb2312_string.o b/hardware/arduino/mtk/system/libmtk/debug/vm_gb2312_string.o new file mode 100644 index 0000000000000000000000000000000000000000..3bd9d40a19ad1a4b47e5f18737fc966ef078b583 GIT binary patch literal 1228 zcma)5O>YuG7=CAg3T;wpQ&T{q8?6ZyJK3cqlEy^&M%@Z29Js9u-4qfjx@?WagBO2< z{s*t#dT8Pw&|l%LsV95W_ubinEnb{t=6OG!nP=vmnGaQ?#ux+H7-V4X0knh@$$Nwh ztUweBUss>68t*IVQuT6qPtCN)Cr;mXrfNN#RgIx*t2s^A z-sn4ep|Gvyd7kS~+{Fo&ZS{u0w$Y3f5B48+D*I1&+OVWVS&XfRH`oof8A`AuOR-zZ z0|tCD9l2Hy(RBn4q~+MJxNE<2fgf6~1-v(z0C&dZ5L@SY;QjGvWFI31wYcTtwtFY8 zJ@F6qA8;EvRN5tCCo94*-qV+bg%SJrPKlV|^KcPVyvPs#0w#jjBy}klY{7UKe*FpNLZ13O61t*5 zdf_XzqTOyH{n2bnaCPEGy!l!gnVHZVcUT? z+hI5S36^9jcFT94fjpg$xzR`DmV-mVEc1oT%{Lt6GlLr-_oq{ktqD1#R^^91%#UWQteeSuOAmH+wh!K|)e8Gf-NHO}JbYUF#T;GpK z_Q3&fc8(JuhY`}R>O?IP3$7riZ|t)`r1j!BgprQ&k6aY-Pe`bSFj2RO0j&8-#J?hO z?v@h~x|pLAGWd&ZwJ$=i>US6{ubSc9v;m3=%k3z1ZsNqz~G8FO5E(`_k6)0g#qSWKO-V7h7Ln z+%iYthYi?6N-Fwh+sELcld@;(TYJqPxIXnY=A$OAKU#SJyBv1UK-MY>PUWYSW~;4S z6@uQ-T8Cv#Z`JFaT37Fu54DrAfWyVUVzS#!{@l)&25!z6By?o(nDKtoL7r8yxV G5BneBF@rGx literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_apn_info.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_apn_info.o new file mode 100644 index 0000000000000000000000000000000000000000..f237f36c49c28c31be3b11e6024492276e18f0b1 GIT binary patch literal 1220 zcmaJ=&2G~`5T13MlC)Au%U=?rVnLBoLRU_SM1+ta{{h?vH96#FoYas=Bq@%Ih&XWJ z5x8*Y6}VNRj{r}>tt#Tu8_ZWndvgFzO~5P%^-v@j=R zVF_YT{J#8R+4xw^q;3zQ8Mqhyna#jS`m}hc9L5^)=key(ZZf$zfRn_jlF?p4_V^dO z(=8wWKB{lYLY_=Cj_U76<{R5Jt^Kh%9KW6bG%A%xTDCnoaQe10(;B&)W(-|h+tTy; zyZmOpSlrMGyukBNdVqN>+v*L0ZJ-)0?QTEpRJWgPwqZeuu{c{*ud-|GMkL8nEX~%G z`waMWHgc^VO4ku`AT`H+%U%0}3w+OVE#STB6u2`XK(Yb%wnI z*PezBb^*MFK5FZN$D!W7^mG!cr{6>w_jD59(4nCu8^seZhV!n6BPeNn7Q$b}6$0eY zLi`|4)*`ahb<`)sREhZK45d?o0a*RK$A{7Rg%?JV}GU zsC9iLY7!*A60ob7Tu0*~+Aiay{n37@Px7p&LIEBACJ@WI7y1fgc5S_J?khDTct0IzMfmMo>G}LlR1Qi!Z^9i^FH96#fWSqp1NX4Jnru*baTum9zrq$&1mcbQ-Qi9!IL5n(_Eb7tUiBlA^wV z)UWUCW^@1d&$IGf(agtK<*fX=Z@#j*X^kfXv&;F&bnIiZYYjR_HbA9NxUZ(_!xN`% zI}^2%$*4w;+v={K)sM3~*}c8An$vPx7V>v+P0O}gJz!}}gZaaQdyV43qn$d0q%e!H z^}q(Z!mi43mS9PCUAoOc8&CS&Y9VsR!>-62`$*&VTMk;s;udJF@fb8`NQB&3EeBeA z*zel|v|umI;@s)APPjc@_{b&n2G(esL%xUhy5Z*p0YATn81Zw0A6QTkNu&AX3*&Rk z=Q1M22M?yBcccIrRLDQ?6TQeRavgJ;vr8fdt*5w|H;|9&4}A1gfX|pv4-uko6$R`$ z68cw6y!+)T!nfx6gbidYG^fn#NtFE3oW6mJ>nN_E7R86&FNP28llWFlp@@Z#l=va~ z3NCP755S+lLMN2n?lVRHuLIQsK<7IP2AfD8PKEi^$scs<(=u{8&si+i1F$_SV&?UG zHq{o_7q`qa$Z*Nsdvej7b&0tsrqjN?6aK z)!L!HYzmkaqqd(n%v!lzFEz|Ye%~mWVg~-JCjM>C1k5FE-Th7A%NFq+<(m00n&+hlyr-3(;7yCcnLkqQa zC9+a)>k%hVBYp>QHR1$cFkv8)M(fF^;qxGhV~8|937F2}6#`^XA^*Hj)*`dyCURP{ zMAJ ztGKy|;&s$E@S*c1@S#4*yCQ`=CeDdOL)MkC#CctX-+!e}7z?Y{A|ZK?92jWSMw^|U&xDkm8o`hfBBUOLkzA#7Ad)C&6dKTBvRo_eVgw& z#l0v`ece=WUiRbi4x|D|odCDXCQijy<$B}LT&Xl3umBJQYp>o zxI){~)B2nAW;&bQ&@w#3(~!H1>si8Tb%1SP8p`eM-fI+hA8poQP6@LJTMk}kSJ>5n z%3>_eR+Kvocz@7!trnu|c-WSiBVKV=ymNu?TdoDX)$ap$dPK;b<{992uiF)`(Sp6W z<+@I%b?A!z)C>NHUdI|8@0{65+4EOQ-mnj`Ow)>CoFARpBq_$c)+m{1QHvTqdy?0F#d@0fVsm8VGG zlIN2)_=8z<#JrwF$*)Z47jbbN#d*{&;h_CRanL!*cf}O8vG9o!KV)CYB~I!=`2APv zgn?oAu@X4ff$Bk^dm9IX6(rjuVRCiyhlcf08TpMd!ECx7g!OZEub(l}rq`EWnP&*V z1(5ekbCwkbbU!la+@48-NWABBI@cuypEG`3Zo{eztNXx>f{u^elR~w&r_Zv3Sutw) yoMG0=<$9@MHgb8RWJ)*wqbB}k&H&6A?S^L>!wo*feW?ooMZ`FMMD#u?Uj9GNGL13- literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_curr_utc.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_curr_utc.o new file mode 100644 index 0000000000000000000000000000000000000000..3a310e4ffb405812295b9252ebb8b13f0a3b7f9e GIT binary patch literal 1220 zcmaJ=&2AGh5FT%mlC)Au%U=?rvVtO|gj$;ti3lM<{sU|q)Z~!cvPoAY5+Sg05D^D1 zJOUT)yaKmM^bz1GxK%}5dV`sGz1{8sOZLn+^UaJswm;U*24f7=V330|1Yk-KD=r8* zSb;c{zO6o6H9yp{>6^n?7VgA;&7zFpurn{SmM&RAc4+-TU3z?vw2fENO9;VC&J#>ypQz-ahwq5>ZdTjxyotB)+0UM@cq{Cte)qZ4XCK()c8Wzsf5F$fJe$ zL7u8bWThLZQ;fPR%9q5c2Jy)M$dk(c85OFbhN{~_1J-<_?B7w5?@3w|Z%y(P4gR3k z^O3Ackoa1_9>wGa8kf;_5hv}B_Dg+IXGIl?=Rqc_u9$U8 kvG7k?_^aGGSfTWb-lg$EA7lO03P25I1|JK(s}x@HKjH|0ZU6uP literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_current_lang_country_code.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_current_lang_country_code.o new file mode 100644 index 0000000000000000000000000000000000000000..c0592669ce69cc910445f4897a79ccb0ff2dc5ba GIT binary patch literal 1280 zcmah|&2JJx6o0cUg^EU6zn~i311c3eLM0JR6HEEnHr+~6I5fSi3v3EW0bK@D;=%ZT zc=K=Y*1OmK3En(fJvH&5?=d@k^ukMKe!utLZ|2Ruo%vL<%8W5k#vln351=NUV0I)( zLIlDP{TA7cSRae`;zkRS`Wc+xzKEV`r(rX+6WTsJh{bNS;QZQ!@fMPQ&VK!Tq&8P* z#>@{L`^Xh`W8isiSJ=l+_sDMa23_F|5u5HvY8DEwjAXSp@EWc+G|W`Wu-d{k*3+5v z`^;JTmJj*kXe~t?r*QvLGts)KP_xE1ZihDb2Ranr%Y>_SNH`y(AClF(Cw!-df zPZ{w3up^v0qVOcP6!Y9;F5D9Vyy*xBc)i~T?)Atab%tkwH+r28o*g*W;*JnryFL(Z zUw!0!e1H;a?}9I-9v6L1p!@tT;-b$9eqh2tq!_IyT^Pqh-wz;?ok$qZ@>c?+Fhcri zovKA*#nZ@X%{m3qXurgW$%%B7f9<1;0(?P2HI%8k+Ze!_?^OId5_zv=MCq2KPRZae zvV*ZFYm!TPZ7O~hH&0{m3dXMEpz}p>P@mMdB83f1d?n(Ws;hj3({UYs|5I_oz^M8p z5}2t#d3~l=blS%#r=Cii-ktQpQC?;73d56$gY0r%hi5Z+S#NV3yS%@;Wl|7;5WGZ6 zs!bfr8iPYbWz@Ivk3vrVXFo}OUD9x#_lS7|5&{xU;8r1xQ~ph1yRx62yAEvAs%+&g vyHYM!OEtTe-?B=!T86LI#&_op!Jc;j+3z?Wp6*#J0+2&o!3(xQK3w*)M>xT~)ojw_)PVqGGR=?Y|dnmzN+!Dg+ zG>5_-cnA9rxQiMp?~13T8o%;5f#2hI5JMg(7-K*~Bp=NuT@d?y&-Niw`|QGWbgvR1 zfgaM&>trqxORgiQIr7eEJr%obq@(y#52gPr63QW)%v(VR<~))9??~Kt<$9!U!_`R{ z{6W^3T5e7p%6Ycj92CC>Z(@cXay6Z$6E zXCB`|28#O^YDK%Hd)%K+nO~jsfk}KCMtf^!AiEm(!}dbl&1Xz~SJ#)X%oX_H8YGdD ziso!8403L0GE&{6cD5Mc<7y}cpZF+YRUe-nfdIo$M$jAtT4tvHU>$USpZGnh~y@M zB&rBGcV)2olZ1jd++wn$vHJ#SYu5k2i zBWt|PX0kgwDLuz?JPY{;IKg)8Ru@=vT%eC$Z(Id8ad-V5M|wy=S>1_R(;j|@_0c@B8H=eo`jN-!6PJl!7c!|P($U723o4|%YYMv1AY^6Dc}TS4CsjDqxqzZVZR&LAw+5)eVC5^RRW~Z zL;880%td0!4dgUO-Wjc@Vwa6{6n`9`^nXS|Ib@T0Yv{n7ed+&(#D7=5N9xvmos_{} zWCv5r&q*ffl{x=qT--qCGWxD!r~R#Br#i{AB86QH91{te%qwk)^ZqdW`6vB^p-J|c zC$x}(;^Bo_(QfG;cc)Y4S0{aB5}$_A-kcf8&c?%VXCdzAGpD|@>&sW>3qo)SGDt~9 zbJi6G1wS+ysc!Q%C%YTOsjh1Zj^}+`-i9p!TZh2SqJcyHMX^@jH_p|9RW<8{ylK@d ul}5Q~HS-0tY)L8pP7D8+Hv;RtM1Cz3xUna=A9V$wgt&o^hu)crm;N7x+lYMt literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_default_apn_info.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_default_apn_info.o new file mode 100644 index 0000000000000000000000000000000000000000..352b994e8617e1acc6ce425a9deec8dc3bcc4534 GIT binary patch literal 1252 zcmaJ=O>YuW6uobN3azPaqj5k|N3Dj6eHki=#57U9QKw=G3s#N;OogOC9UeyF!i@|6 zf{A~_T^C)LxYb|buBp2wF7#ez9#9gz$(wV}xo6&;c^@D0Mu9N~G8n{Q!T_o+2_#2` z7%V{$QeT&!EgSE1(eTYyAPRQ_KVnfhjhv;9l%rrV^fXlZTvOG>7M!k}DN*ee#7=&) zTeZx|uj9hDY~-xx?)LzS+3Z6tR_P6#hV2ZsVmz)H zZDDKMdP0Ab*h-{Qn_7}5c>>b+aX!no>TO_~mz267!^oWoypVk*mpHBa;rCyu z6Z%HoCyMV}2devl_H7aj){*Rth3VPJ9~jlgW#l&|1hd(?AMTv1yZwx@HaovOWv;;o z7eMYWy|bn;p#70S>-JI-MB;cOM?vels^D|Z#pMmy5U|k%Ze(?Qq@QO?jkk7{5zh0>~jo@DS1esJQw60L#CP A>Hq)$ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_default_folder_path.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_default_folder_path.o new file mode 100644 index 0000000000000000000000000000000000000000..f4546c2e522c6ef184ddf0c698ba4508820687e5 GIT binary patch literal 1264 zcma)5&uGSAz)^J6S4;#57ULPjy?8!lAcyfvu2$)MYRd5B6X1 zXyU)&tp{&j>tEqb>#d0geUF`Cu}K?WGV^`!d*AHaot=4Kv`UOIP{AMxK?YFwlSpQ4 zNWwhmko~;ye8GBGh{x`1u%+Hi8^RErxgAo=4P z7(c&r)kNZA`Ag|d&wl9&yXEdX!>+LR``wo7*$0kjqp6(FKQfZF{?Kc>-pDAYQijzL zuCZaJ&DZJmbT+$YWO#07j_Wi!z}ApPa=Y6P>xJ#7>ou6sbT-SD!`Ik#b|VyJ zF}A{1wfhYCVAK;%15tQBwiWZ-E*I`w0lei12Y6#J0PgiEA$OW*fH(WSp8EC`1CcaZPd**TU73dvDGtYTF!{d{ zAcYe7r+umyxfM5&)0zzuF%EIWiO3)y)gMcgGJHZpJyfW^6%?@NfzrPs@z0g7DBqIr zQ#SaGY;ThJJt-x>Hl<(2hnpzQp>`Dqz271Z+9&m`NMRETABf0MeO0b-S`WjoKT0PI zjk^a*=${T$55sCuM#kVa&e@4J{dDq2#`Q@V^F)v!J6jI}9rPglezeDaoPEAJWqvgT zmw@gJxoFL@#$d-Ujc3}o)|q@LbK2J>4d?SOFKfgc5S?|B;)_z~MDvU9Z!5{-s2Jkpc68VuK z1M{GQ`FY{tg7vPHPG0FI(r_*DHIs%z?a16$_SLHTK&^e+*0i}U9G*T>()v@#{P+g? z&+l9|5x7`AsJ!Xh&)vZ8^!yk0GtYHxf5&ONXs8y8xAjb8uU$ZS>5UduD)*M zjMurfoN2D=d7kGvDBMK5<2tP#uvMgq!q(=kW@+>OS_5VjmCdr{_*r(2osVfO$x`f+ za-9M9hyB25AqHNEUCBK6B@f)U0q~9!IKW%J58NA2Lhc;T18)!defJewuoriN!0WYk z1J@TX_8)K=Jv7=G;idUnf)m6AzkoO^IKcrHbVSnVdh)5bu8KT{NU=BCqb)o}fGkSn zpY+LIoHh_Q!DBO-!)RKF`w$nX&f^^hU^)=bjAMf#RPpR~bm zWZUB`>`5v4l?h$Nn;R(3p>_rrJ>McOnv;B2q+nv<0}&CjugoP*>T&q>N9u&JQTIrR z9qT~#IHaO7G6olMH^JF9QHW}3tYzJsXE1KdMQ;YU=W91s657y^n0 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_disk_info.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_disk_info.o new file mode 100644 index 0000000000000000000000000000000000000000..ea2ad913acfe76b0ed4f205481872da06db5b559 GIT binary patch literal 1236 zcma)5&2G~`5T12@>QJF3RZx>)fdxfM2(_FNi6|GyuT$X?)Z`Fxah=4F2-1M#A|ei4 zICA6xcnG-l4YXA}l_|@5kG(>)+BzsXU5G7p3=2xViB~m2%QG3C=T%#hGv>YT`kx^{AIhB}Q<* zwRqbs9YglVS9ZNu{rSDj3wkJO$J)z@@x*eB;du7c7@s_zE>l{qR+h7!>8U-i?76Jv z^Rhm6EO}oos4oh8g;FUe7nPz?fXZ!LU|ME>3@nE~$b2h%Cmo!%23D z?SxV+%`)tYaEpO5n@=3GkLcJgjySWeXNqIJazGiHjtNSCHUq_;l0)i(QUql%olL9~ zlwd8zbR2u!KXt5`_fh`=S5ZSPj(S?^bI;=hVUJ%%jCq{kBPL`-iqU$~i8yX}eh885 zoeTc#{!V~AMo1sj@meJ2Tt!Z6_9=))`z4pmok&OdyB@kxfDcHh1~*=}g#oPjoX0;S zaqpHJ;ktyY<1+Y-EZ7&WBNTiUKpZz$F?a!ETR7-^aU9eq{;f#i9wvgniSI|bpatV$ z_(jL?Ewub{-^Kld6{ueLuU=87c2HjTmjrhwePo&U)97bb4zl%p80h}2%&ph;1MBfgc5S?{CNLrz$RS`+Cz$!%~gj#lqpyC2)(xeoZpeBbLkX$FWXe834&K6N| z;EKdA;Lcy*)}Dj*GHi+6Rvt3Y2ghCRv=F&3a9=Xtd#7{n0|(u8xC44?FaX`}Q9y1}FM!_e zb-UgHTCkSxaPD_nN8B5PKkf=}2R+p0c<7~GH$qMj4f!p^WXK85FrgumM(fF!z~^2V zM-XXz7BHN}D+S1-LjG}|tVL$Y4dk?DjYJ%@pBgYRk&p7vLKG^%HzZU;4q0~#1+3YZ z`VS=HehEeT=7mq%AcBeJFcLK>B)>AIFXH9~iZiIq;X~(3;X{3rzZEHzG4X{+IAmQJ zOB~mu@b{n82_r%EkrKI7f%4Hyy`t07`+h!LGQK0;T0zm*3?90SXG_ll&|O=?i)2xZ G7vMkBqmNwx literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_exec_filename.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_exec_filename.o new file mode 100644 index 0000000000000000000000000000000000000000..c1979929b2657141247f48537b11f746e8f05b74 GIT binary patch literal 1244 zcma)5&u0HnK1^cF^I#|0%%AhkQoc& zumVBIep`LHYJMulBKJCh7(594h{xa}dYK(*qhKZUB2@j-)b-^KT!b&RnDGYU=RetI zGk^Z;th}QVc^Iyol|S~Zcfz&AiD+AIyNBY)?ul`@QYbtz;`RQq(-zLqs3a1G*>#1n zlS-#Pq?74vcH7AC3{OMu5l*m$-Rc6{MjFWN?>%l5_ns%~u%rc9h^_l?vRmx7PiGMp zWgFT<27EB=xpoWDbtHBabHpKc#fc02z;#cnA9rxQiMp?~m%9Cc^3o{n8L(oy`WhsysI3FS~t<*lLvbG}#p??~jkk{+d7lR71X zKggOBOXeh#^xBO7Ixe0<=Q8?kV5j|su~VJYS&_mn22P21P32X#!dbr`e*aZ|Lf<(1 z)Z?4WKym+Et!TG&kGqp8v#XOnFpf{cXm3mnWLM*U*qn>YeCEV=b$#{9q`(K)Ac>Sz zG-q97ke8wHNOha7IoVw=PIX<=a9s3pc^kG|*g61i7E(CmUKOgf{nSD&SQWFD&zV-O uT&|ZIRwI`;OO}%2@3ioLIYY1(C6cv_;KrWee)JW9B4QLD54|%TFa00-B8ZCs literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_filename.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_filename.o new file mode 100644 index 0000000000000000000000000000000000000000..5b15cfa1eaa70de1adec901e3bcc3a41d5282452 GIT binary patch literal 1220 zcmaJ=&2G~`5S~q(khUVU<Ch z9)SyYUV&RB`UrgsE*x5M=?!MGUf1=3m3C*onQvxxXLmo>%sOKX-u74O>?;Ov1JJ@#)?4bkDs8pWl+4ktr?K$pLZ{+j3Iq)2P!zdW< z3+shaDW?~Ckr$x+2=myE-5mhSp_(Y~Y(4H&w_dEbAsI`tIkv3aU^m(AxXLnYg{{UO zGT@Wx(6hTJJy*!S)Ldtud(KA>_@3?Az`K(PaCbz2*acn$-Wv^v&H+-e7Pmdm9dr*p zXA(Ksf8bs8QCpKfhkE2xJEuK@4=b}YkR=Wih)acyV7j!7*QHn4YRdbHmz2@-mZ15PI=R; mS(1f+(!yWmPQi+#pY<+-7y2CQs|x^Clq>jH=v}FJ$^QU@sDJSQ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_full_path_by_short_name.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_full_path_by_short_name.o new file mode 100644 index 0000000000000000000000000000000000000000..2e248e6aa0a7f3d67501e83d3ec0be4a07c0d758 GIT binary patch literal 1288 zcma)5O>YuW6uocwD6}!qMk656Nv#QpybP7t#*O70bt zxc3jZ>!LqFsrl=e;}gKHin|GGh#6V~~J(1hDS}zUIBadjUO zKfkh@&HS(L$K`vnn2X`carsr>cwq_S`MB3JhNkEkt%)(}3~XT>ntcn6l|tdZny3%P zcH6QiY9*CY^{%kgO)aCn%%n5h+etOcvpfU2yJ$Bpv(*KbMC!}!?QS)SyARWK@GAip zWNY5b>3$ukNYzI4%*;bDW>$L!WUYcv9G4=5mahG&7d z2mQWvh!(8HO(E=VYb>mh`-A@hH_$^{?RUMj-wl@&cwK%CG3auFADB=PNu&AX3t+$H z#vVj!?;V(p&ancdP$B=KPu3!{U0T2Ce7Hu6#afs3vTpO8=u*<{@+3RrU} z^>0X=JLV|Tx9a$$4VEy`oJCGe3dyf5=n-68Lvb0k5O(^$Fm~D}`L9T!iiwXz+$QVF zSmL7Yh2MXqPUx9dpDUg-6)5k8^?4c@o1V|kOj}%?{Jv>^mc}?S50IVDdm()$@6>xb z)6TCiZ<%B8z!GdBB^S+EQy4sRQqz(4t#>Yd>&CRNs|t=6KVaU54FMYm!1aQLL+(kT zTHDk9F$;`}Ud!inqgF20OAVuu%j+dWPQn*!;G452U|d|BK6M9s6n~_M7+Jw{M~va+ J(kaGE@fUN{n%4jT literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_imei.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_imei.o new file mode 100644 index 0000000000000000000000000000000000000000..09348cec0b44a34c790cbc1946315647896eb48c GIT binary patch literal 1192 zcmah|O>fgc5S?|LCM6)!Kp_bTdxvz#l<*@MIsRb&K5P| zz=Z?6S zkb)$nzonk1?2nDRIb#S#{S?k_ou^NZ_$FaxGRJ|>KzGhs$S;*cpoj)#--3oy=;V> zKo9vH#O06^e8Gf)NE$s)z9h~EVH`uGaV%lJ%1;JRLWTTMpQ=S>#ZBb&%m#@#Xuqog zlMDGM|13nQ0(?e7HPldbcTm8Z@09)(iM&5jQN9)FQ#SaH>~J2*niP^>i|BtaFj2gM z+I5_CzBEqilX_RAP{721NH|no6)TMDI{f;pbi!CreWAoIRG_>boMGW$kimd@Do1p8 z^2dX`%HkD<)kT2pa$bl0g}kh{HPxzbJk?N+PP>^j}rw%v4;1OG(_|0aJ1 aPGsBQOgSu0_avJFs3PX^f^1TZANC)|^L2Ir literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_imei_ext.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_imei_ext.o new file mode 100644 index 0000000000000000000000000000000000000000..fb90cada80d09c17c2b7bf8c7a1016a9e5e2dd35 GIT binary patch literal 1216 zcmaJ=&2G~`5T13C;JG5)ndzG{1n`NKFpC87H+!BtpR1A|ej- z5x8>WB{jh0()WhU!QTpt+8JKs0+?ap}Y{Zw(Pj4@EgAPZ9lP?sc?9}BWD z4>}aSExcH8K9)1-^=>Ky_fkKz88|b}3n$u%UellJ^)Cm8G1rB&tLIwAd1>uQCvUKu>~_LnX|}@FwEGPBaMTxG z8@&jm?F3 zG40u=AlflLiv&U=9p#^dJ`BTW1XM$rs$0hZ)_kkt-x0`vNk)`zN$QjgP7xhUn5;>Z z^jaiNhg%q&!`L-^s6XnL=A_;gAy}B0G=W^zrCija@g)4ch~^TpU5QH-s9qATM>nAU z7V^R*7CoKxsd0XiMxLG$MDctQ)-L5`J({t!`1$HDli37Z!P_n0o%SqiEYh2t+n$t; zSDK?6a+>RshHLD?@(yeW*f<34lq_6|d!>3~--^q?tvQXIqT@EI)n=vTwu(DW#Z@Z2 hlP=z>U<7XL_;G(}Y~(T4H|7DJqF=$ErA!<@@;_Z7ek%X~ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_imsi.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_imsi.o new file mode 100644 index 0000000000000000000000000000000000000000..b9d033575f469148ee32ac337ec246f4988fca48 GIT binary patch literal 1192 zcmah|O>fgc5S?|LCM6)!Kp_bTdxvz#l<*@MIsRb&K5P| zz=Z?6S zkb)$nzonk1?2nDRIb#S#{S?k_ou^Nh zwd*+Pd}*B2C-tsKp@4}2k#MNGDpnZPb@=sH>4dSM`a+3as6cr=IK#rhAcFz*RF3HG z@Ypz}1U)?fkh(Q7hNXfN@Go!J{*<{~ZsH;JJd=UoJ z*A)%d$j{3AP!LcU0JrNVF17voPW!-&TEMaF_IAy7+O1Zn*>$?LZM*3x2mXr={!RW2 aoXEDpnQ~a1?nyQUP({q+1=*w+KkPpbe08n> literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_language.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_language.o new file mode 100644 index 0000000000000000000000000000000000000000..a26a6cf12b21ccb0dfb178f1849c025b77e2596d GIT binary patch literal 1212 zcmah|&2G~`5T13M;?hb@TYj8^iVsCfNxO1NBqD?aX?~mvw~?A0DlW!Jtt3*@fa4${ zkaz(ef!9D>df*Y@DL8Nmw;qtnOxByYzOa&azHjE6o!wdQr;1%=jDZ{sGB9TVWkHhp zsUQPOph4>E^2=rWL-~H%=t4&Q0TcZ)b)j5nmUf`kUY+RrdKV@um&R+zOnzP&lV9Jf zk7NO9E!}$8cRF6+oVn+nk=yYAtWxQzk!cJ@e%tfMhLz14b}#UZJu_#%&F$t2g>56x z^E?N|$GDE`xvd_sZG_3<@!^wZ`S4)30Sk)87TKD5i``~-6FN(?4YsN5FyO;+KX6-U z17Fy#M80>%1MhtR{L~Fx;H}{hxIZ95>KxAlZx8x??;Isqi@QPK_gbUC8_EOy-#$PI zwR0hqQcr6kCZmS<9@@nallg)H11NMPj1!Ci+(Jqy5o-sZa8(2w?{UvrQnEbtx7dQNId*uA;F-EGu!X0@YJtJ(_^} zJILqfjjm4m?TRB+_$D2E eRsI;9*z(ifrSU>(pZXHOGqfA{v%DaVm;4WGrGDQ4 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_language_ssc.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_language_ssc.o new file mode 100644 index 0000000000000000000000000000000000000000..eb0c7fd0d116652d41fdd43b1d7e462032597711 GIT binary patch literal 1236 zcmaJ=U2hUW6uq-Rg*K_QsVN}prq+Z?J6S4;#F$vVQMb|*Vt88@x&e|>bayZkO?>f3 z=>O2SJ~Z(U=&$gtsZaJz?`3y@65=E?=iGD8%-x-jk43%27z5cDBw!K&9JoOsJu)O< z34)OMw)}iqe_x14H#&hh+z%>nkbQt_nU>k?0^33w$R6%LtQYp5?$lsG39=Ad^{=rTY~2@OQ5Ivj zm2C#x8TN$PL=?7*9m#C#m<#Kj0Dfc&6L`~cfZKfv$erS8;H`eIXPux0YjINuyW1QH z%bEGP|AcoiM_aq#d1!wRJWk;E_)Wx+#|ge-LPaEv=94do{hk;55UG7~VLZCW2#`dD z{L?;Ji_DU1$Z3u|FIsO6yKLm6{1XqQ{uv3?kWJRDpnx@BOZ__%_fENr^sTr)X@ft= z8so^VNg?@_DLsgbYbY+Fb{#u?Ul=>>ll)htkio?$75}Jb@B&B`EeTKTay6UY~BwWSMqK>eXPx{FK?M^@WD0MMoKQ4 zv#K!ILzIp7?WGJ5DQ5Wxblq>PEFx usuk--J)6^uhIHcFH1KuVLonu)8SP^fKWY!ZC9(uiK#bwVp*t4A1OEq6=!WtD literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_malloc_stat.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_malloc_stat.o new file mode 100644 index 0000000000000000000000000000000000000000..80e1d9693cbe13f79e6ae20443e8e3d73c33de19 GIT binary patch literal 1228 zcmah|%Wl&^6upx;#if<{pny{Z<2tEDA|(WzDIx-i zU*JR7vZ5aWU%|3r*B#uO@x*D0#7LfV?zv~?dS0I^PL(kRsxe4I6amy^kjPC8X;=as zR=+L3Sav>^w~}TD(%KIg8|SO1u~XgF_w?GUL&Lb%f$_?@c?9Y4PnJ3=p8dM73MjM< z`+eVi?F+Z>^?HN0I~1P4q+KdKHq(v4NznF#k!fc#rqdO^xoc&uciEk6KEG||c#dbG z@DS~u@3p$Xwvi?Z2m6nj<^8>#1}wyMw#e4C4R)Q~j2kS;Hregi0|tCJ>I<)hC<2Kc z#R9*_h5tbSKlX$NyfqvG4+a#FJIiyx+k<}Je}fjR#XTW{ZtFz&L$#>?;~linmM(-= z+Sgjh3AB*kLR<_v!ByOKZcLZO$x~$o6%`< z3&pFbt>8!hw~8O_lUgfMurM(q5;j#=#R_M24SxSoI$?ZLJyPNqDo|d78&Mh=gCzFR zdS_=Re`1o4h9qDs3Xsj`HMn~rFYA@3+Wh?LmPtb#u1wB|Tr_4q#^C96tlYQeTmN>VZKqx=IBvaKZB&|Wvru#@t}^1wbn$Hk eBXBPlq2Hi=Oyc3@5sf8)Cy1MPah_9*2mTkh4}u&3 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_modules.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_modules.o new file mode 100644 index 0000000000000000000000000000000000000000..084394ceaa6159f13eb953bd9e7f0a35c442a307 GIT binary patch literal 1224 zcmah|%Z?I36us3vgqau^;=~49?dTXmoJuniC2kzvs68?nSgYRJ-sk+tGRqxAsg)s)AF-XE90yuPoKz3$G z!X|`Z^d<5%qQ5IC@f*FMa#4Xh!Ec(9Qs69cK01+3Le=n-aP3n|mN$BE7Cn~~^#vq< zerGpZgq!pmOWLg>9nf%9ZTKQ zGTQ6RZYGyYsac-o8OYy5yJ?y2KCl$hK>q09L9=x5c((yTDa67o=D)j3YXjtRUy9s{?B6p%Z^v%ovU!N7Wj7Ocfh$FckE zi8I@`_f7wU>u8{(4SGg8-=@b2{2sr881^{9XH2Mwq|toxg|Of9Vjm*44=&6{_csEh zQ6c}bPt+o_;2Lt8vqvH}S}!_d?m#}uKl0F30X`z38ls81H59PsNa$aYxOd7`gm26B z2^;)D)|y9dO$x~`E$Ja#TtjgKwFq|FAMKaUNqj3($YEkY#A~9ihy^a|e)#=Y=!Cvm z^@ZYFsX%!@#1?5}47PFHpKHsjlRq%a&(j#oivZbr-Vaw-@@~DuxwgK(xMi-v2N&Qr zQgYFpn8aZDP13pP*hQoGxfjs6Zb>+11YQ=}r;I=OACfeG+5i9m literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_mre_modules.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_mre_modules.o new file mode 100644 index 0000000000000000000000000000000000000000..323fef2c7af40429c0b1eeb43ab0dacc625a22df GIT binary patch literal 1236 zcmah|O>YuW6uocw5LykisR}sJQELKXCqpILG$xjBtWz{7sWHG90H)Mu*a2q!!(c)<3oriKRXq$4?|#c>(F4 z-`VYU@z;-|>H|^C!+7ne`o=b1TCQO`mSGQjlLKpv$y%wjt)!d7iPN>5sZz^k6@B1Z z%BGgnUgtJ)TU!|=ujbVp6z-$lw9L)`SO#gRu)p`PRo;8D(S)!RVNtdkTw|Bn)j)zJ zS&Chk?lDluQ`6 zy3U|8acAG{{n!8C1{!F4!=91$xaDzzpvSKvMmN{3}v;goz0euZg-M7PzPf;rCym z69#70=StvI1!>y`J#C|= zH;M(_XjH4sO3P>!ih9KmCVZ6!zAI-6#`yyD2|L)6c(7%}#4-Tgs}x=uonk!fe>e<< A9{>OV literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_mre_total_mem_size.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_mre_total_mem_size.o new file mode 100644 index 0000000000000000000000000000000000000000..a578ab814d0ef7a47c3c433a053c91cb0fc63bf5 GIT binary patch literal 1248 zcma)5O>fgc5S?|LCM80&>q|5KO9<4E@!zt>029i-hP{3&lihp zR)H6I9!d{T?)hH32W$;#ytKRhuvOXKT5rOfk!161$-Kg@vg@%l%dlm3%ec>g4~BvC z+K4h#*wrlb54iM?B=CJtdcfO*0r0R-4yp6J0KC%=0{=Biuom~E414WE=?`e*|7W*R zMs1yoNT`N3UAK+_tocUAzamlhNkz17QR%b{ek0o(d#Wb6 zq&KGGCN6Gc@B+pz;Ya&hz>oT*{}m||F!6~qpCI*V5r?o1qHvw0I==(MSNPsgFz_4O@Nf*2%5=SnJ?vt%%! z^U+3qd!Zdf^81lbeO)wgJooYP4y;O8-3RWLZ5&EF<$7b+))Qu4x^UdaX2}(eTCG`a riB@UTtqQHhH!ARzg+mbMmc#u}Uo*H#x=-m8KoM~nFVbW3@dEq>s7s5+ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_mre_version.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_mre_version.o new file mode 100644 index 0000000000000000000000000000000000000000..cf7e8f7a86756d9a4c2e2fb1d21fb09bebe08aad GIT binary patch literal 1220 zcmah|&2G~`5T13MCM80orIe&pV5EXlrCm8C5>bT&X?~mvw?Rz~6&K^A7Kua}a5hyV z4!i)5!7CsxeTcpV2M!cYJs`o1*PEp2ft9@9H{X2Tv1fNbRqQHb4Afwdfk^~VmO(Th z7&4H6I3&L&UMB31<<+#&fsB3*7t5E)Gwm#H#dc%0*N3Up?G9YryfofG=J)x}?~m2u z3aylN(sSN=!s+>*bK?1fZvPmQR;jdYWE%aU-}d~GVP&(1-4&j(W#-Hexy@Xmux{je zp68(W1nsWpwz|O9kw%LLdrzC?z1__Q%xQ5p&ldG1c8A@Kq*$7*u>0Bu13nn_gxf+C zzQm4VzW0s`?^FOka)k@LH5dT*`xKBn$MeA3{a(*IMhn*Bt`L5=H5A@J{nY>Q0a~b? zbD@=bS`ImZ9`bvL^C2hrf(ZkWG6>VsG;iCP{5k+mHrKhJV#Pdz6I%1Hu!<;a2&~+6p~+? z(*Iy!qId(fTlmoTCGnv?seeTZ8<-dp35TkyVujPX4!`~?oiGwqpD2+l6)3O6@+6In zK^kZ3sT|X*lRp~dRThshtWE-Cvw0mJUdhXPFUH#J`s$QPLj+>M9+8XQS=1P8%TzE^ z-(JncZWvQv7c`u&Us~RVH34f!!0nQWQ*pmks~?!ksjjwT+4Y^G?bNH)My2UAi#vA3 mQ6{{V4&Ez&1kUvW^a<3%G=3nRom2v#fVhH(<{8Df+5Z4*_<*7S literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_multi_tags.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_multi_tags.o new file mode 100644 index 0000000000000000000000000000000000000000..55ad87fb28f33c6d4f2aff0b8b7b70dde4f38d56 GIT binary patch literal 1236 zcmah|&u375u6vQVBSZUkp!`(@-V+G+h1Aibj{Za2~l(66#Ax z{`ki3wDLc{pOqg-GcQLfXXTT=d1Q05KR)I?lUqk4>QxGbM{2S$7&{%?nW&X?S~Ysy zR(JG_{yMXr+1*X4SuLw&Aa@_-mTk3rz)}bUx%$DwX7S+3b_0S+h=tjjf1Pcx>%J(9 zu{gV_++(1PCVg(TF>^=cu0)P~ta1Ad2kp?}7HI9!2sCFv1*tPy7PQWw-?v|(1idti zbEnrHbKBiGZT|mp3ng^CK~G9&-1IOdzlU#N4tto=Cv2#giKFL97s7GZt9_U$-itJy z#is;FBSZRmo%ABH#5!VnW`{@&T5sJ&Vj>;&AA4D_03Q*MhYaakMFKsClK+B0+$+II z-Kx+@8T>}nnpVP-O42KH{8e0BM{)_d6&$p`2o5?Y`K}0I4;v>0ypX=KmU*7{!>>P* zr|fgxXN>P32kQG_W7bB*Ad2(;l$&3j^Z~a&ZDUQ}eHM#-Kd7@NBH{O9$}O%hZnJb3Zw z(ZoOD)!Y6EJ$dwE;>DQt#!ai3X<#`JJL!I}s$O+X*L1%vY9+=Ph`}HROADZ58{X7h z5Q8B2VfK0F$xii6;d^9H%Jh8FRp~$_xoo?6m-yEJ}ti*>RprT!^wd6b#8RWdTXi=jI*xZ@62W8d_E(` z>Z6I(Hm#{#P9$Wl&rSJAO{y=Ghskt0E~k`~l7#F7OfXEN)dvdn?p9yJOl$A@+B zx%@1^c0GIS8oTZevj~f_o38r|l<{=PjTR!eZ0reUnFEEJuQ@0kgBzf<#$!;d5gDXT zDk)Ifqv6mzLkZSW49=~7Yr@U3bHM+ATd1LS`y4Ixyyu1{_ZC0|PQ5`6!=s zew=q4+l@%$y$y@i{a=t8zm$RLP;)xHQFp=+T6kZ^MqombGejg!7_2PgGOoE0f(82CuU z8Dc+S3taVk;Ll&-Cv?wGzVx^+RiL;B9jJc8jGCu{lzV_1#Z}ahe%09IlC?fH9It4sc*eCd+ONK*N_X>O%GUU!vTkb4k%h) z#U=YRU#ZsAjX9u~wQ4S_>D5xHUTo-%Y)&icA_ZToj_=Kyg1)J+-Qx%zfbLs3i2oZg MikIpc*?1ZL0o{w4tpET3 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_operator.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_operator.o new file mode 100644 index 0000000000000000000000000000000000000000..b79e12926c6b4e6412059e31ae24aa2cc6429ca1 GIT binary patch literal 1212 zcmah|&2G~`5T13M;?hb@TYj8^iVsCfNxO1NBqD?aX@1-aw~?A0DlW!JEfR^4;%pHS zNW1`#z-u5bJ@5$d6dbsOTMtNOChJXHUs%aI-#7Ek&hD)DQ_Zb2#y|}QIhZkkswC;+ zM3938Fd*}F@%f_rp?WuKbs?w!fU$XzIoHk&$JjUaUL2d|Y8S>!7uHM2jelNR<6qzF z4^#nV9n*Q&_g)3U8=MBAF9soiQ>i?*a?Qb6*a^as<>d30+Y^DcV;AhVh3!JAv}qN2 zkr$x+5ZCbozug12i7;J0I(XEo9_(*7VNNsHJX_Iku$%05%4Au##@4kh27EZ`3%`w4 zgwl2u3WL{N1n&j#6JPki+ruI7a6p9A1zrT+8T9+X8N zIXmRULF;8ENKT}q_|wQrFTiI6R6`9_m(GSYPnG{00{I_FkJ2qmosz+CM8{JmYZ4{B z7W4l_Vx#jq`j+sc{n37@PwK1)VG9G(O(0iwDHb1bzYc#c&;rrYn6B1nx|CwCOv#r d;Rw9M@{`_W@j_{z<^sSIv}^dYJR^>m{0}{he}4b~ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_origin_release_verno.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_origin_release_verno.o new file mode 100644 index 0000000000000000000000000000000000000000..d49b830a22b8024e298a9d6e13e4a2853848674d GIT binary patch literal 1268 zcmaJ=OK;Oa5T11&xUC3j1;Qy7SXGgdhOV3vi3%anG*7@KsL3HW@S9A>zP= zpTLD1e}Y>N+_`|nf8c~Dx87jJ_BtVljI=x7%zV4wdUpM;Y*ZLyAdEp8rV&8P4`O+b zkcJhIVe~oiBw@TQsi}=_T)nKqR{Wc;W>h#=E=Fh4nOv10%e9X!MOp5`dE!D+wdauj z^&Pa|KX-&s;FHxamD9d?Y`f;r=^gh5renXft+8#M+Rk7IP%RekYw5=D#Oc`1M5|`A zn$dG@ZAZ`PuX5YD-QA3q=Xsuk!d=|cvaNOxSO#INaCmU9Svq*M-GI0xvn93`y~?h! z>k);e*gCr@-C@ATlfG-U(YucCy8_`sxNE<0fgf3}1-v~T19yfL5Ie{7z&pc!-yR?Z zwYcTFPOp99+T*#8ToB&E8nrkcaH!AE0!%I%;2Y?d0!;1)7BuvfqxHm-aoi5#2zs*j zz6)pnIsvknA^t2+Xc1Xp9WkvD_eT4vID`?8>JI}i@}CfphA^R9!vt!MME)xR|84mh z!CUotf(CyPwZh2Pq>%X1Og@R5>zG`|+!Y*jz9bInllWGIu!n^Y1OgMfA{Kr&AB8`3 zjL;&UdKlvVvkIga1-jp?&$)x^KenSi-K*6VKy54(qFR8{~==-2T<(c4q-A^ZdP CvXrC% literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_path.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_path.o new file mode 100644 index 0000000000000000000000000000000000000000..bfd5d7cdc961da6c81fa0772b32462253d9e2892 GIT binary patch literal 1208 zcmaJ=&yUhT6n;|*!mb9ExDl|?Mlk_#o3aw!cu{_%cEv0ta;pUzArZmSH4+bA{R2Gc zAL4Bj_fOEj!joo=m%ZtGoep$4ILXZWzVCfAZ#tcMUpE?zF%XSG4pt1n;3Qn~3^~|@ zD9paZAIFV%H6?v*6j3fHa5M5vSMmy+WKL&C(owV-dlYMZ?xj*2BREN%N{ad%azDSb z>%GdaAIFV5qL?2O&Ev+KiTT2I&6(wn0Gie6JvG;v9y$ZtS*XoIK{dv%t?ueY{dIAt zxVM*AOIk@QLiskXVcAxH3@nc@Tt3*p+pXin16>$`{!-yA(>XG|R9n(k%ws zd@*sYK1SE!aU_sqztmj&tqa=FaxKvM^EqhFlnA+tS_!nlbTYADp#^Jcmg_p>{-JBn z*FNe$^eX1)SR=lN&bI4g3bKzcV~qKj!Y53q7)hh~5;Cituf5pRmCn zM7<^BHHng63g|K}uA{htS{ys=FM*xTNqj3pC}Cnqz;B|i;35Wf8Gip2I>nGzeWirX zRG_@OH z20Bl9Bb{4gjX(1_o$Ho_W8krB1IW6N9fD?5bsWl1s;%~c9<+ejG}@K2VYVBMPQ7b( o%N3(;3J1PL6JL|F05h literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_removable_driver.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_removable_driver.o new file mode 100644 index 0000000000000000000000000000000000000000..d0c901c30837bf1de8e8fcd7f87661789ff8af23 GIT binary patch literal 1252 zcmah|%Wl&^6usj(#if;+77$LUije|J3ALOOi3lM&+}?sq|P&H;3n5$Mq(fnaOBY-*>eGBWt|P?q~D) zJuRo_^ehw};s6IH=mXnB8ZR6lK5CT@>-$YukrcMdw&d&V2D=$kS(0tDUFiV>eKZ;P zP8-qpIQ9hd+%w&G-}#_-9p3@HJsN@T4JjaZR?mUn84d>SYqVf3-SK^|-#+)m;(~A(R@2I#yj#+{%L?*1^A4FYKSK4(%P`*8=-$i!tWGUgm07kgbn^6JDEqk zCWYjeBD#W;8z^2yZ3930zXX1?Phzb|A&-eqM1m&jidbM&m*Mwcp%cbt)k7t=P=WF? z(7A<;!7c{jdZV+GKR(Nc{y5wT17yp28SX9QdA;&nTb^IsGH!^$6%gl3W40s)_4!!7 zZ}w6w4vzM9Q^G#_cq4CD??B3jR2OusWMEe~D%Bdt#)5s}t=p#6C>AWcQLQ#BExT1H pS`}N^@sZm2%)ANM(RvFL@O@37b!;2#>>j7b0h literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_res_header.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_res_header.o new file mode 100644 index 0000000000000000000000000000000000000000..60ebb7efdcc3dda9e2ea6b4a2749c37b9d530d0e GIT binary patch literal 1220 zcma)5&2AD=6h3zt3Y8e?pAOaNEUKZUy%{Qr#F$vh&(Jt639x9~i~~%BL_~+%ro@FW z;A8j-#!VlhZ{fm))m0ZJdJcCkAl-P9JKuM{^KsAR%$<*Ar@|Nm6%5ia%>YU=iRQ+J zG$bGn$uEf)3FkxUUdrr3TEBqH+gHhR?L2PB4r0}p$A+=eh0B{)<||15y7=+!k=k6L zZP=%M_q8wFz#qC@-|P4R)$C&NshMsJPJ*@{j7&R|F`b_9&0Q;Nz0dAs^Z89P$8$Uj zg~w?3e6Q65wuv-as2@IQmJSbg8nB?n*&p2LnpTo#i>;?LoiqzeNl7;+_yeuXQ5)Aszhx;sM%doC~3y zW?Bk4fgbX^h>Ia7_>2V;ku>@}`Qo@9hIs^$;!MKiDPJ8x1{Lzp`cyA6D{djD-|Uiz zLHn(anS79s>d!-zD!?Zs)I){pTSWnTzEk>FB=R0fMfsMbPubu*vg1i6ds0e%ZASl% ziG|_~)NbLT^CfZ7oYa3s3fovXB@%|}t8#_2x(+}8D4j4e?mkr_|8$_b4r|jgG6n`d zX{It}cPD>zTvt`R!a(nR8uN7>%xMvs?6)`3=J!{(Od28(gDs@w+QYT1F?fckg639N z2_og~FsHdLX*9(7kCwM#L%>D{xKp(7Q8+4AYjx|o5nS7;?H3%kR;e_~O}AOtcgn8v k;dklcmlce_z19MI(+pF1Ai6t70w9mLj+chcZ{W-R3&)y&=l}o! literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_resource_offset.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_resource_offset.o new file mode 100644 index 0000000000000000000000000000000000000000..6ce3d1ac870a0c704197cde50caa6cdc6b448316 GIT binary patch literal 1248 zcma)5O>fgc5S?|B;)_zyDYK$?E!5{~52JkpcQpLcK zgLzQF{Iu|J!FpTCrmyr;S-6(^lFP!8c5EIf2Wnk?pf)~kYua27j!qvdS^X*GzJCS% z$2TsUM7UT#ti2xC&s<@9u0P!Kx~@Ik-Su68hI+YtThFxu)f?&cd|tQu!qwM}g7K=b zRxr&~y~vBa0HvE~cU-5_2eyhdRodFT)vj#bUu(gPqOw`GoIK0UvGWOyrCEkuQm!-L z{%9ba4x;cv>`CUi&$)2l2;e)8aDaDwAGkN9gxm#Q1l}DE2JQ>AU@z_n;q^Ov!u6vU z`wzH`9vbaT0_0I5|D;d$ zBDdrQa=K=nM2vl08j&c-NA2z6}(x=S!)7MiPEgp(1@tp-`^d=TJL?i=J;07tKk&D^f7A@SaE%vaie~PU=bc`CICQiJ*I|B>w6^ z^(18CGBO4iaW}`>=Bz{(DAt8Cy_dQ@&Sw~T+d!LD1)jgn0;s5{u literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_resource_offset_from_file.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_resource_offset_from_file.o new file mode 100644 index 0000000000000000000000000000000000000000..be90b778626c52aea84d740b11b1862f077c0154 GIT binary patch literal 1292 zcma)5&2G~`5T12@nzkae6$qzTV4)zAh8m|tq97zl^9yweYI3N!xK8SjNDT>&i-2`jC?Z)U#PSL0j1!D_fpBs^! zCrH5}#9;6_z8yE-6qUraPEkxvK5(s8U3dmO8N*puaj4xGeKB}Ltb z)UR)#{{FEc3i-HH`BHw>GoRb8>Da^mk<+rxe!D$HyY2LQX1jZ6d(ujwa8FIuJ%uw; zE18UHbX{BB(6jo>?0R-{Gp**doR)?BZA`FitJwvXMjFZQ?%ZhDh?kjxTnm0gi;GSG&jo@+G`U58^wFvmXBT>G^P+JWU-pf!g>(40OQq|RzN&|3Xo z&whattfg75>vWq(u08aB@;~4zYN*vwUrYUd>T`my&o3j+`<&n>22@1yQ9kKnIIsJ5 z2$9Bn4#AfnD?kQ4q@UD@S|k=+M@~87{Aj%-PBBPF@drK%|0g6=Lkv;3iVmzf5dQB- z_#NXOp;)FDNhax~3BQbs>*!oS-+7$0za^a1C-JXHp^AZzMEoJ@3R~c$ zKMa5V3O`}Ut3LLGrYcZ8Jk=}O?G2RQ4^k#qCw;_=2Vu0=#s;#p@i5$)it~C#;5)m% zxMf@rf;qU0lvI?nA~ATzL*AGA7913Evfp_T-q&Rbn>gzcYb{8+kURj*DCqdfKPgme zyZX#LFe^rFD{q*!a=Bh=n2r3FQ8GmuzFHICoihS+)&_XL6S(<@xOaIGpoqAN7mV(r Hj2Gh{jKG|R literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_rtc.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_rtc.o new file mode 100644 index 0000000000000000000000000000000000000000..54069f9d2eb5b5646b44275261caa1b12b41e6f2 GIT binary patch literal 1204 zcma)5&uk1%;Ke_{ zgBSl0PxjD1LH`PGwcdKu_m~})a&nTH?|a|-cHZurosU(k#ux)N7#I*l01X*L@>7EW zs}P04xA>E|^`VkU-Rws)uoL-VWZ*1)UO3i{qxIP1SmSFanOy0^S>jyF=r6!H{mC{v zrPE(0wLMkH$3*?4_HJmubcOAS9*XsH`JQgHMn_)H^(J~fo7Js>aP>ViXTHtt<_d*v zJ*KRZ5?`KEuefmE3*d*2aDaEmW8mJ10&?eg9(Zpw9J;U3g0;9Kgg59O33u#&%zwZQ z^iWHed@uF&na>HrKEH+-^Ets6Oz4QD(evbs;=JX@Aw(LVB+OQMd;nQg$UpB>waBcv ziJYEM=S2Hm!l?%NDF47mrGG|3HPldb8z^ASH%kAGME*-sQNA_lQ#SaGtTT&bO$y1c z&FQqciQ)=smvPejC2&%o)VCr96B7;*f2g`DRyePR;m=>C6NaYM10{5!0_DRH57NjO z(0ARRY4f|2KQhhF(im?90kXw>7*ZGVvYs{57WY?wnKXo888(rUi=J86@IJ`Ybfvyk z7UJiAOnqI`a1Aai@4=RUtwZ2e*~F#zwA^SOm~#%W>sGT=wCrZB)~dGccClntZDqil hXyaY-CSV7fQaS2Z3SZ_SVscf!QyLpd|56eU_8;tocXa>& literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_sim_card_status.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_sim_card_status.o new file mode 100644 index 0000000000000000000000000000000000000000..b6426036f073aa249cdc847ee1537ce9e7b17037 GIT binary patch literal 1256 zcma)5O>fgc5S?{CNLs0BD?XACz(Pez2{lfMAmT#Od;%^(O%6FA87HwwBuv2GAR-Q& zkoXJS_!HcE;E2QpegzT|Qn~e3X0l!bzC}tv_}g z`vpqSOS3q4N4*KRY2W`DS5QYs9QE~d&K)093j6pX=D3e3eZ_`~nK*i$bTJ&){5pi0 z;)6)REIubd4jIxf>ZBKmCDswsGrL4$(0a)k5)p19~EB5q>s${K^tpzULacThiBh=E)jl@17dl7 zdCP<#1ZUtTLQ>H)n+k)vXw7Ciw+|F~Kowm57JKr<>jPUT0HX6r!z zhZ@X=(b_8;W~*Lr*E(jWyl2$RKs32# z@DK3lzhUB`cdz{qJbLib-bg&?d&~|{LORLJ_r33ZJ8$;w?5CnxVvKUO=+29`wX&+YF$sulKjH>(ivC~SeP_`>Wa zTlGd*l*QN`&jtgnKj`p!1CcudTar2UYmM9QIcP_9UI(qw?}O%aDIj-R%YfGGb~^SO zv|uf*&biZWoN&88^Kw^&cQHrp4Y(faan0ofK9}D@TyQzT4@{_tq|x)_Q*hpMV=p3& zF9OD^_>=%CRLDQ=leNe!xsIHk*&-1K?H3*~v5=4QPh1o#z&9jRLk?NDi~`o|N&P1h zaj%3TeIenKHu#I|U>u2>6q4UFrC-O*bri3mwv3a`cLOK&Nxmymc#MgUMBE|k%2?vG z?t_beQYZ9|s!tT}r3#ey!RjQ9j6n?7r(XA^yUDXgQF`grWd)Yp&)*Ev6})`WEq>qnrOc^#MB^L)9o zug|lBWtf$noM}}`rE0Ne)p9##(V93r7XDq%0IWG>MrV!Up$d4G$RYsUtr%V$lVbef F{{buHh0qHkWhdX zP$2Vd^~I|7v2i!64WS_afSG!gxsWatQ`uMAuZ~sq)(~cESK0{_Wt($J z)yFu&ah?7M*fzp+_2}S9uW_)y(}g8TVaseo-ekAgR!U`AmSgv%M+|g-Iu4vZ+Q8#> zD3IsA(F6BG0Q#vDIH31^A9Qa*4zWvm8T7$qJa*5Jf?B#01m38B9=N_Z)c@^$q)jNlag!oCG&?2(H24b4C zOF?Y3-e!pSKs?Gni!6@VsD!2!A1>h;#96p%mLP0jZ063H093b)93BU@hI|+#7UHxZ_Vh z?!VwRDyX$fk&^mrMwpx&;hX4}BTViKCN%WK(R$J;IPOMq0zKI{nBytDMt~erq@UG^ zTBH`ZfSA^76Nxs)p%RFUbd-M*`G|&32&jfIQMZW%)_f!Q?+C&-6*5AX3UxvTe-Ir` zqp&80q?cxR1vf7sc^SDYIOu$9IH*tJTMk3v(P`-(f3D3DIP?5>T62EdC`xn_h6I5<`L*-t$1WtgpM#k5+DM!Vjz oI+dzfw_>Sl;s520z*}47cR>t$FD*%ttXYlbnr5G>$A1^bAIsgCw literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_system_driver.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_system_driver.o new file mode 100644 index 0000000000000000000000000000000000000000..4c7fa5a77fe413908ee5fe08fd3f3928ec729c3b GIT binary patch literal 1236 zcmah|-)qxQ6h1diXXXa$reZo}2JE1-Hng)~5kdPi9cC8RJ`7*7v<<19%7M~)b*!p4hA`c@)J`Bf{lPLP)n7j!hynr) z)i`sl*G^#h6F+cVYv7H}94|~8wb~Oc+ZmsFeaD+=wJ7P+6L7vmNOn1Kppvf!#w4 zJdQ)bJm-xbI3EJg2X2?r!quy!Y_~K&!$9rg@ zwys20>TN6H1aidhAg)H7;0q=+MAB$I`4oJ1qd0*`;}eJ3%wHiu4i)mx`$R1=3tm7@ zYxYURLHns8;}iKP|13hT0(?e7HN+5g>26r_ozTA_;olQigm07kgbn^6JDx?nCWYje z=5!f1FQ9lGwGDjed?|dWPvWjfp@fNZBGC|aMJ#Y$m*Mwcp%W&;>amhos6csnp;vTT zdXMpa=XWQ6GR((2CSfNIkX_BoaDO4s>(yu4)&0d+#tjL$26?39qBUC*gDOvjGxcr0 z=M;~kJoR-`!g<+`tM?%jKxP2CSu5aFd0A_Rn+S~0D5v)O5Mt!|}iHmum{ hTKIo?6R?&Q;=N4c!OD0Zbq(Mt;x>Lf&nd>2{tuElhE@Oo literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_tag_by_lang_id.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_tag_by_lang_id.o new file mode 100644 index 0000000000000000000000000000000000000000..0b890d384b63ca41d45d73368b1a94c7706ce2ac GIT binary patch literal 1292 zcma)5&rcIU6n@hdEX7|Sh88wb4aAblWQ$ECdeG7`t#OfrHj#K)wy>d%l>t2EZyY#!)PF$_dhk%=g@cK{*V$<+;owVlzVChS+j+Ayv(FbS!59M_3=+`I z0CrW*ID9{9O&Fv1-ihD2J@F-16yueb`~AilW5jqPAbIvvnp~zam#?#<)h&K>4R5dPqYpK2jP6AP!<S zpQL6|b92-2G*9ysWUiy#ah-A%*fi3<%<|%mQf~3?OcDA6VK%^qLnG`W8x2NTjE%8N zfolwSqgj(q8Bux)E1G%kCYSDx1itP_2Y9*B0PfW(A$N+Wfv?qTHFpaw*o!+-de!o_ zbQ`qr|BDH<(NXmKb~=w|J|_tId>nDW=LA2n5Jx19-X~uepD8~NB2w%t=#1*v0g|YY zzt^XGky&#SIlVJWA_mPDZ8J5HkLtI5R4TwnB-BHP?pr_sdp_3sFC^*?Dn zDi&5cnd(U?`2#)r98PYc7(wkEKD55`_|QJ-Z$%0fEW9A%hwiI$jlFsZe*V!qVX)o3 zs|5e)K=lyBx@BYx3>+&Rt#@|v_qFStGUjwYx^cW7g2`?Xnd-OG(T>lrZ<#U#;S_MB zlM*J^fm>MHHHH^RQjQ1z7s@7`mH+?% literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_tick_count.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_tick_count.o new file mode 100644 index 0000000000000000000000000000000000000000..bd16bbc7be0a5f269763a2a32eb4ec76e3917b83 GIT binary patch literal 1224 zcma)5&2G~`5T13M;?hb@ODmj$z=t5Egsz+ti3lM<{!`%+DaoPY;yS5CA_xIzQxSp0 zEASY+04Mqo@Dv;yZoR=w)*FZP!brRG%{Slf?2f&kD^8U$2Fe(uA&LO%GKlA9f;6mw z0f}$x&)1!g<=aWC2WkBWOwG&0xpr>Uj6)~ zq3{spp6_+~!1fTv3(ccP?efv#ehXGKgRQbHeVgsDn=z9m*)F@IJz&5`lY#I$=tUrX zPocnn!-fAr06+DF2fQ;H0S|^0kUGnAz`Mi2z{i7fti?Scf_`T#{1F}e|LiWxsHH2R zocdZ1F*!ZNx6rSKnA}%PSm=qP^`tX!+zaCvda_T_&1d=f05Zsseo?1tkyv3HF|9cu z5{>rTo*_Arj`B}KFIj*u2&jfKRhRCDHQy=zI|BJHNk-{5rB2D<0@3k2k~JwLy|%#9 z<~EYok=wvQ=S$$AKB>DR1RE1)1VU4FRjm9Xufy*@iYFhNRgak1KNTpi!%mb&#K6Qk zy6@udq>sKU&^}lz`MJaHnMBRCrOUH=6cUA-FZCQ7kxaqgriM+HSj0bSkdW;k$J4 fWd##(uav;r)WakmFpu6`gW0)v@uzu4F@Eg7)H;BN literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_time.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_time.o new file mode 100644 index 0000000000000000000000000000000000000000..5c35f14553997443dcb150de9901df5ffe40be85 GIT binary patch literal 1204 zcmaJ=Pj3=I6o0coh1OI`Yy>2_QA}vDlckbKjEOFP7SwGqg+y-K1vWw=qRZ4sJb3W~ zc<|x}@njGE2>L0!)q3kq-(z=R%fU%@e}CR@=k3nSeyo`WV+`bAkb{K+Xm}!0oCR{Q z22m(|TYt80eyC#EPk$J)I-Rf{$#g1 z<3j2NH~+FkNS_i zi8Wf%6+c7k`rPLPVV_?|jQO143l>yF^5}WWMe(}h>kuN1Pae$g-u40H(V=`WCwoy? zat%2>Bln5syNs6{l%x71AEo~p3H6Xe_HCenJ>N+GI}-0Kd5+9&csUt^-^e<1<@F>< zc_rY}#y}Z^984pCh797xu^SfCLTwTqWJ;>>&aDL|^eWINt?ZkGXvA<^+H+yh?{la_=xj(08zaFW>mA4K1 zW8l8=g)0WaJ9Gm-aEJX*KIQF7<(Zjl4UWRDAC62rpEsSp@XZaYV0|d87fPiyv&f6Q z0Ocnr_k6F@2eyVVUf$h#+OFYEQ;ScHJ|7Q!sNbV!bDFTJx{tMu7^<^Lr-=r-DH=a41TDS7Ks(M5Ysao zM557o#u&+sbd-M)dC3BNLqIi@sk#j$u;zQk|3n~XNis^eBy~y#XNdMDk*rA}>9rZ2 z4!4lJhTIKYbiXt%>XUj`gkWLfD}l&VT@@=o%j@v_uj0wa#?_}x>{12F>yVkI5iwZB zoq8&5_H@$6$9a{-5eAx%sa?(MkewzG$$Fa;?&|q!%A_C$3E&7xwTWw4W0z)+`nHct z8O3j-fcm#bVbZI`#4nya+< jf4caGg(Gn1mcn~bKQnkanj<3xP(r_g1N59?{P6z(tXYPE literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_get_version.o b/hardware/arduino/mtk/system/libmtk/debug/vm_get_version.o new file mode 100644 index 0000000000000000000000000000000000000000..e4314abb6f700f6bd2010df143c6e713d64fabce GIT binary patch literal 1208 zcmah|O>fgc5S?|LCM80&fr3-Md?=7Abmf!?B7{WJd^iKCpWifdJjb(8e1>+< z_gYj(wMIf=GSm1x; z!aozhk38W4Zw&^(gFYqX&hi}acE8v2kI{m?xF4cGS_o)(@>p*oKlG8FW25Y#|Ol8dO zPX6e)uBv#1!I&n<7VA3PpR3D$g^9MfzdB{o5P=vxK}xOyUP+C?b3_$1H%BFil)npe zn(L~D>--PP+pr;E;|RD@vT!NxmumF`YrzGs?bLUQj$5x*8YuW6uplxK{PEbrht<=F=#;SWT+$(HwGvVR4S&B*hG_IfJwm=(P3(2)r~*E zg$vVFe}W6$u`uxu=-MC9#8ur9H+nBKuLE6qllRWK=boAS=DnFYEY~<=3`8(UftvyJ z?8Kj&8B!32AWXkJ<(z;0yjl-PtJTA;kNjIaDkXZCr6c}#alRZ2_Or4onJ_35R_ zdw#^H6VD`A2|Wr`|Lo>tksh2bPaFIlkF_9m@`EK?#a|~}EW*KHrB!(|(Dn>VL$LHc z(krFXJvr4F9+(}&9LtqVMy~ZOL*7)g>g()AHlI(+IVGoLp>PN7x}mrGz|u(lg`MrY z&8_VR8x06}f-J;Vd{K6Vt$AZC&Jt|hbDM!O8V@YJjcA!R_5?GHeZ?}~TA*}wO9!Pr z8i8UCDIs@O$$`=t4hF_cv|ukqw=A>YKCp}tE&TuD8ro>f1CE{cec#~(K8IgL3^|-& zf(03oG`gOAK^!-n+>1zYJe%FgK3;$fO5~sSiC*LuTt!aTY?6p^jANOI6Xc`%eFq&G zJ|UqVB1GRR3fS|N(0?Ma-!)qizKHD;Hdw;K?pbE{q?G)gIbFt^t0-PXZ3zdhkJd~3 zB%T#1Ji)>XB2I|DA{RKX`{4Iqp%Z#%-Cf1I(1GecpyzOdK@=1BIp*(9e*diQ`u(ux zCdkg$eIPB=?S8#8?fm`4TV@-)Z~<;2B^O<@;$aJCLHqU)hX~4_ISK7+#Dnv~2di`- zX+g3JO0A^gRCrvf)_2rJ6KIuMy;!Jeb0NKiw-aVjE^ zcmW=O7eQS55bzWnI1p|+^WW&3@3D`|8ft$u^Cevvp=&NWNh*J{s?bp2Wf#w!=bF{H=eS?aj>>&IPL zK%%8vXFcbo7dU7A(_zme-71wH80kiT=(jz8WLTMuVRr-1*fX={+w5*OpWileJjb(8 zxQBMvb6Z_t+eqVu!-Mr8FK(fY+PM(g zsi(D&6R07-fw&lQg3mZ%Ad*J!lTX9vc9_QyDLx38j^fh+WKbdhtWVY=v*adndS{PB z3|cQSVPYU3%|8lJr~sdkPz@QfE}ac)zLEM@B;r33iuA1tpR~bGWJl9X)TEUB%8dR8 z6BEU&sIA~b`=k9*pX6DQ!VXTnA`*tID|3mnx(dJlN}Vt^sU9h@xe7F|0-YlY2J4ta z=bc@h{PD?rcyr@^6YM0lSf0;1E;0oM9N-lb5O<^;86McIktdo)Y z_#(`yud51YuW6upnH4pvhjZ3G;ZXpJCtGE}03m>9lkoQf$dh>4jFFcA``)M08QF5I|u z>C&Iz)?N2*^%uBwV@%zVxX^of^Y~izCG*a?=bm}@&7Jq&RkSK&48&lNgn0ze;((AQJXt)n& z8_O+mF-PtPodd3;huRx(z0~8j%L#lgzk(QaIl*U4BoIlX_sJ*WbIXmrh%`QM zn9clG0;EwP|DsRSBD3Hsa(ZW%L>#nUXv+9RKFU9Gk*ffokWdXVMBO?HSo2uuUy<;0 z#TDTTbDyxmUu27Y5k5lC%mr`}7gtfdfZ7H=v_IM}^+|jyQh107i-QbK9Yt6LP^~EXU z1~06^ZKUL)cOo7J_jzhMQ{S|e__-TXU&9`pmoKc+g>476d!T3~6{o_JQoV7YuDC$2 zX^mn*(;L-lv(nOAg`!r`U6YPCQpY=Gk3nBvoJv#gVz@CnN6~e@zc?P2rxfE){tsf1 Bg0TPq literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_getsockname.o b/hardware/arduino/mtk/system/libmtk/debug/vm_getsockname.o new file mode 100644 index 0000000000000000000000000000000000000000..c4c07ae010a004c4586916cee1da7a1458f26333 GIT binary patch literal 1228 zcma)5O>YuW6upnH4pvhjZ3G;Z*cw6XWT-?5F)@78I2BV^5EC;UU?N1P=rA=B7j9g- zbm>oU>#lpZ`U_mTF{bWFTLd3>#W$-Hy!xo6&ebLYLc6|Kq`12GsRVIBdrc;L@Y z4M|uB2_~OI4?>MM<50;WpY0)94IOam?2aC_Te5KOap(*1N`6z$iMXmyTL_#&h5OwP)V9ggo|AK^{ zE3OD%nEQkc{vccIi|`S8W-fs9xVVbqIn*}rq5aW*sZZitk-|MpSVY_*))TS7McoI# z{|cSZJN@#x;$5mhc^^dPX=Dtxa4yfZ#ns90pXO(2jHB}a*=pVgmzVOqUTdbUt}jj* zH+W$UZXhKWy%X^;xWiM^nfj)!#82Fq`Wp7&ynJDmF6=n4(*s2-sW=rLmgLsTV(h z2M?yFegqGC<6z4<;ea4Y;>mD196smS4Ub#iI^ zo*(ha*fS1lp+}+epWTgEqzk8ulNx`=V+}~1{OBYbg(32qIB35d z>|4ZZ#o|3VRT~_bZNnVNS|%e`dX^!tt6BARb}hTHk(P5xPRT<44$7NGv(*EZM(EG) zY~8JIZarA5LBJDaA-3d;vMX%G8)I>nV5^?n43y!hZ#7%!Ez|a0flOmhv5dDCD4nL& z1f?|`f?^IRAaz#BfzlrI`^GDjU@fI-S!SQR?`2X28lu^qAj-2|w=U{R^2VX@W zaxl3uCS>%)(R$JaaoliXFM6`$>FiGS^#Wv&BK@pR)FQRODq>o*P9)kfjzt2Fk&g2B z9q-Wa2?5m*ChC@vz?%Dl|B1l<*K9`UBDPM*U;z`mXOUf#LehI?co{cWk-Ui90uDMK zotOF~z7-)n#>5K(j)}S=7JioZ!SBCTc+8Twclpn*Pt4en5k7yJ*Ifr?uI literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_global_free.o b/hardware/arduino/mtk/system/libmtk/debug/vm_global_free.o new file mode 100644 index 0000000000000000000000000000000000000000..0899687298c37558662b42428841513ea11cd198 GIT binary patch literal 1216 zcma)5O>fgc5S?|BlC~%8?n4-1t-;jxjf_YeG*=MRlaCS%y0z%#bYtobp!na$@n zj2zGLELacF?s{&s18f6n%-Y>~)F|#e->k!&7H9J;5xvS**|mtyl5CCL)b2CjgJCal zn}~rgu&tQyb$Q@@4uJ2wfeXAj7y$SCl#n~ibHH2uUe9}v7VO2{An-fQgTNce7rFr4 zLJy5}PI_ssw&Vm+$*&{MOHS|u3kD)-bU*pxc-@hC1d-w}T*r&}d;l4g$Uo^*y~wS& ziJb1)A`#;duVo@K$Vc_35~U2^kWdd5s&5qq?D;|IzmSNtBoyUa5k6&uzsUARndnI= z`Lzk1HaAgRK^@c^Qyr)tg~Ygw zjKM0d`H?ocJNaW_eN@I=A1BCW>ruEdRTuqe#v*3-SEo!=BX9}sA|)5ylh7DE6s2&b zxlNu$%3sSm&2>e?b^3?pEm#j=eIK}8FmbV76{@vebH)Wu#jb5zwo@yY>!pU%u(s`z o6Pmoh!9UW$f65<%Grc*rrr9O&L7pJ$ivZ6M*YL0uDaVieAD=3G^8f$< literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_global_get_max_alloc_size.o b/hardware/arduino/mtk/system/libmtk/debug/vm_global_get_max_alloc_size.o new file mode 100644 index 0000000000000000000000000000000000000000..0cbc33b45d3e06b5d7de016dcabedccfb09a63ca GIT binary patch literal 1268 zcmah}O>fgc5S?|L;?hV>3katmutY&Ap)02Z5g{bVr&HlJQj$Z(#dT7viIfmiRG zzsYWA^Z6|;$8$Ujg@>46J9fJVYzt|;(Aaz2D(~%XH(^Oq*fLv}ud-|GdQ4?0w!v;m z4;b*#c;MM>M9&SdE12u_x#ygEz>jRt2HqZxfV)F7NS)<5;GN-M;JiW!*5bD3xxMy@ z=ZwSw|Bts(LhW4&rPSkE$O+_--#}arIl&JMXo%#ae9|d6?}l~^k;aDrrfcvj0W#c} zJh2NEC@zB*g^@A1gKKo&+1*JW_v2AY9PUL1viZ1tp~rMu4OQi7&iwx3mIZl9xcg`M%HuZH)!gbLH%sa5@!R8Tgv!vrv*e})U4Sit_ScX|I7EG&N xtu`wyt5qnP70XY-9|V4_7JhH;7_3EwgC3{w0C{{)bp_uy;s#!-=Vaq$_y?<3lU@J- literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_global_malloc.o b/hardware/arduino/mtk/system/libmtk/debug/vm_global_malloc.o new file mode 100644 index 0000000000000000000000000000000000000000..1237e10ec4a31d5d400d2e358d41a0e364bbd4f3 GIT binary patch literal 1224 zcma)5&2G~`5T13M;{xIqz@-eAVNo4Db^NW1gR%(wp5v%Bvqc9k&(${1u|8UffMi04B> z1{T49!l$JtOZMAxI(f4jPs8o_*GwAD66b|e?bN6lkB$0=!$e}C3ul+lwY2#RGC#h7 z`SUwhBGNC{zEocioag;v+wD68x8EOj!cwhN+A%ZD;j!QG{IOZfW=*>nc;>d1vtH%4 za)rXCndf<)gW_FW;CgPm2W%5zym+v8uT|cAwAF+;&0zCvRbOLQ*?KI&k}SopYj+s% z(RdKJZS;XJd{-gg>+`^S697MQ0~dIEGy?7qDIj)^=Ye;IgMs$~DX7KWAn<$brq zpZX7X13A>zImxBo+7gq~CBBA!USe_|v0$R79IYpwf#a5pW9Z3F!g)H0BLv7|iuh5U z(jvCP7GhenO-Zy99BTxm5s&H*q?c)UkAO6kDcw3IQ1hkAe?}nglgKFEir^_4{6=&* ziG(JF#MdHu9Y1biashK!aM1piaZsPszaoS@7NWt9(0>8Cw12b! literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_gps_close.o b/hardware/arduino/mtk/system/libmtk/debug/vm_gps_close.o new file mode 100644 index 0000000000000000000000000000000000000000..fe39cb23525b58a04328be6b5de7d4998433be10 GIT binary patch literal 1204 zcmah|&2G~`5T13M;?hb@TYj8^z=u>yNozSJ5)ndz{5lmbk(wL|7uQLxCQ?I+?II$O zcma;Q3gXg-fT!TVfpF^q31+-|p2!@$*cjiT|UxKk{bx3rR8(u+`e zh!Y&w=?#Hxp_{H8>_6((_xE->uplXHk*&!$*iCjjrLrvBVE3eL2D(2P1x^n!@Hh^H z=eehP;Jyn$KXw8K^q%j7?u{uRbx|*Y-XD)f?rW4_E!_zMZ`eBzTwfgM|9BrI)Xs%S zNvwJ25^)2}pDSk-_ zH0tZBgk$oD)%%bOAa@M9RWop?yr{L>2gaNRY}0C2E0*1EHam^3-K|uuh8;@Wz{bDP g#{bEifSp{J_biJWC}Ul93E&Ch20oH!6yxRo0|_>GwEzGB literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_gps_open.o b/hardware/arduino/mtk/system/libmtk/debug/vm_gps_open.o new file mode 100644 index 0000000000000000000000000000000000000000..03cad74cb0ce76181891a799e5093b026159ba4b GIT binary patch literal 1212 zcmaJ=O>YuW6upnH4pvhjZ3LVsQA|MW%TP%qYz*HtPNgX%5;xNUCPE?whpCacaO2XY z3m5(kcis61^cT2vV@zGiPVb$W2h%Qm$-Hy!xo7U3_c3qlYJ)KbVlc?SIs!O!f?&Zm zWMC5{SbmN?jC89*XjZGGRHidMH3x>dNHuf0lsdMI z)Si-8Ugmf6#bP#9;02zC@&l})8+v~XEQ>T)K00{VtsU&|b|B=FSeV5E+iZtj_s3a+ zCD~2ieFl8Km{@ur(J~zz31%8ExMjSyfDd&`2i~90ftynb$erf};DhO8Vw|7_dvV>e z%yIwJGUk^S^`Gz-=4fj}u7~!w=W>F8%WoitT~6=`6DdT}=za1@_}q14KO&9y4yACXWGF+|@M3fOZd^e;%9JLM?C z7j=BX27i!w_eJ;!eJdBP35zQzUO{aOANsxsKD19_tw^DWi6Ieph)Um z{r1Y&ivL0f$_MOkSUVWRFsQ8rZ*}qq?ffc@@yaOrjN1oMAI_eil@B0oL3#*WttvQ`pHy4zBgJb0t*N#v zWmRi88l8Gq>y|5OU9%mArQyG*;ooE~K=YKf_bY+T>F&fg0aU~!UXVkI@nHV}2#$Rx literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_gps_set_mode.o b/hardware/arduino/mtk/system/libmtk/debug/vm_gps_set_mode.o new file mode 100644 index 0000000000000000000000000000000000000000..43714dce00d0c689536e0ab23fa0e4ed5c0e8031 GIT binary patch literal 1220 zcmaJ=&2G~`5T13MlC)B3%U=?rV$mX{gsz+ti3lM<{sXuTYI4ZUIEh6f5mIay5pm$c zBXHr)D{!ks9|4|%TUErRH<-zKUDpRz+MW4kzM0vb-ThcM8jLZJgFz0?5r82;yf`Q1 zUDrz-nGS7$X0`fI%XOxQ&cJqNS~H*5jIn2HJ9{oM!M+V0cs4lF1MmSk({Rd$Wth^1JXW!SoM zj{$dQ6VK|S^c*2aQgiIr+_T?%z=xJ+0q?smaA!(@*acn$KA27>_8X*NEpB<9GwvUH zwi`Lvf8Z_jQCk;$4)ykhuai)H{U*w!uao$S4h<#QD4uu;oOgU2LrLS45Wy<05Fn2h z;)i*%7Llc{qfRmMt|;FMPC1B2{>Q$Q_RpwL4LM}p78N&QARJ+#k3Rr_TXuQNIf77yP205!j;n z5G(q&7r~~FsjsUFu8|MR2e9eE<`B41)p05BRa@b)Ea3I`zK!Ta9H*tMoCGULS%r`r`v)+$&tHBrpIT++%!2oK4q>3{^ z4pu;g^q19VtJeG4-HbkfobnB(+GYA8aiN;(q1t?Ys%e`8n66#wXONqIXW6sLuOIhi z0clOmd^@rSj&J+Jk==8=K7d)RKGJjT@wwM?y@_t-^SU(*T>Zc(7;g&ug;Hr(FY+QU zK=}c#_8&VeaQp&T>!lA1P<`7?*sS7L`YrWMc}>hXym>^3D)9H5O~AxdEol;K>xS*P(tlo z3Z>N3W{AlsA-;olImBc>V?aksKFTMZir-GilW1vt5N1A$s{_cRhxAdMtVLpp4aAgl zKu#RAUV4VaL^_H;39aw~d_q7qaP` zi}OZTCw*!bU!tyZOM*{w#SUGLbPa>c6KqSdkcL?VP?td{H#MYT z1;UX3w)%9{{7_CMZuUbd*b4nfr{FYsmOs*t!nMegNd0R&9$)UmY4l7>>8~Jt^0RlV zT|D`9T-{NHJdD`=lIQou}HQr{ov-$j{ zp5r;5g~DB&U^{ka0BjR!sIa$tuT|cCyxoK)EzBY;7QD=^u=PNkC0LSO)9x_f?`Iv`&>Bh1@N9NY~Y>o7`Qv4fZSQ01Ku4Cht2_7uokz4a0i`3;f%eH`46~` z9y-z`&r9d}+~Wj6k6%TMc%0xfCUiv7Xg>ME*l&Ar0Fl}!3H~Ur4Pqf}e?5dHE@((>!`WGZrLp4>mjsn(vqxA1ckD~V&-AtP>#J8L4FR|SH;|Hx=EO7xTQW5r>D(Tj zi(hy#o$H#0qxxBS7d8ZJ^njZs1Bb%1QoXTf_<68uW}{dztwy!lthB6Fp=eetO22l5 jg@2)i|B*WZOD!nRDS?}yJ;YZ4%7{sP81#nXc%lCQFJp9~ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_htons.o b/hardware/arduino/mtk/system/libmtk/debug/vm_htons.o new file mode 100644 index 0000000000000000000000000000000000000000..d165faed6d846aec9e4bd50c7ab4e9ed360c016b GIT binary patch literal 1196 zcmaJ=O>fgc5S?|L;U2jip`i9{N3wup!W z7mggbBJnpk(E~pLeg!vLZoR>b*XyJ`u#$J)n|Zr$Jzl@B*>%PksKFoyQwGqKBwh>z zIamY(N?(^AE!pp?+4S{(JPYgbAGs_XXHH6o+M&@f9vaQhyQ$PdAC40zTGo6Hx!*ta z=Fu;%Ov3o(FF>O4z5ZtC^u=g@9HbkS${jP;9v%2S&!3o$eBQJN!ZSCmg7vzvQ7Dzx z%px!H0+esz0@ri917K?i<0+nwt6gN-)KX$G5TN&Ok0(Rn zb}*I#i@i5DZvjCqEkcS$|w}}b#e5LZ=5XieEGfKBCbxH+lC}=yb#a_gOycKz{nE zUeRgkOr>ba?CzwG2lc3oJUJzZ&enBUIaQZ_c9c82zq(~o5QB4Y4I!y$O;Tg9E=$2o zeY<~#KMgtcby>q%{j9tPs{&T{fZG)dr}E=Uv$bPIb#NMXYpZNKt$Mv(>o}eAmR)nG l{K69s{)GuG)u=JXKn?~eSXuxbVFYsv zK?*iNf%)g~<8bqB<$FA;76xnTMfGD1?yP^+)wFt3g_Fd5KJ(3#y0RB)JnO__kpY}+ z&fnMahmiXDjos>$e*GxOf-Wlc!}{xyIpF-rwEBH>U|W6L!C<{yE+kW}@v+mhooTY3 z$s~;-x0AbiR)3Y<$>#IvWKPRzSt#B^xn*13A+R*kVDVu8e!H^2x6^_(pTa_HD-dOu z*cE?_#aV(~^W9~jO{ODmbrHEEa3GmuztFh-hJ)6(xCL5wG6BsQlR@gNmIJLf9*yjm zD8X8q#kn)=9&>x*{?s|(I%=rJYp$01+;KTUz~xsFLoO$nVIYY}KH5(@1?O$o_9N2x zAi!J2aROw}L;6*ntVLqUb>y^Xmz+2#Uv$C5LOO~+bWwN#J|UqRa>%+3bYRUR>HmU6 z+%4gex`@z88T>)E+83!K^m!_PFeca0c>#T!IO+SsIH^zaUy;Hi3`~i*L*|pV#8rO) ze$!`o!@u}*&&2$z6{ubSE-%B#7{qa{c)r!_qz^9QUKnk4X&^ft55SFo;-X&L^PSEw zZ_iF^-2zcPh34U?3*&;yfiA G5Bx7nM~KP* literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_http_fetch_handle.o b/hardware/arduino/mtk/system/libmtk/debug/vm_http_fetch_handle.o new file mode 100644 index 0000000000000000000000000000000000000000..ac911210fc52a02562f7af6c0b60ec974929651c GIT binary patch literal 1248 zcma)5&unXS&{;sDoDL6}>PfnH7NIm*I+W6dw$5#e$7CTo`>T5{< z`oXq3rQbj2wMSCS^RfE8_I_jzIG>nrY~CA~1M8@NXuIWlx%@;;x5md#&vs^NJ)2dH zA-B~XJ+HsZ=kmL|8MUAlv^*3a;sndKxgDVI{(%Y$JGs-DI}{ zah707wy8W|piO5ZZgtUfNBDt6j(w?sN*8Gp2ypd946iZ#){=M@T^} z&Enh{c8|F|^?vL>+#Tdli^Cq5`rP&~xuAz{qmO!++#Cxkddks!;zjVg=fwf^WS@ld zM{%40SpK-?{n zk-T-mlQj5?sN+XMlS1Mv3;7r>u48fqb8Gm~{$lu1pX9$Hggq>r5b#Xu%2@ivd=UQ7 zHhc@X>VAmpFDj5;@KUd6w{(ts{*=Yli63(7ei`Gl$_2A- zG)qOpY}RV6YTIlVOGecs>RX$e_&QB|U(O87WkRBt3EWr(_Y+?Qp!=1?%VSWChyD*b C9Etz{ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_http_free_handle.o b/hardware/arduino/mtk/system/libmtk/debug/vm_http_free_handle.o new file mode 100644 index 0000000000000000000000000000000000000000..f82bca21838697550b9ea38bae3405f981eaa2b9 GIT binary patch literal 1232 zcmaJ=T~8B16uq#+Yd7r@GjLHiox#+m5serMMl8jVAIV zeDPoS;v0$l1pb9jCJ1 zjdV7$zYGr*g@ZdV+j1$%KvO1INElA=HH za{rGGPpZ14xs z?vVLCiIQI%({)_jL~#bSTR3Qc^El|7)Vm^t3>H2U2txH$T;*|Hhl{^TryTOSkCf1r z4pi4+c~nNkAdYi(sEw~q{;*dcmXY5b5k!-99agT?{eE=DeoU^fZkb;V!3|hPNG^J2 zQDg8NvkE%5H;P~;z87#h*98sdYkpeZgjETvE#Ow(#3}bWU#aex*IB_XTh*>}%S1=NQ9HJ;l95XTjTh94}6RIDYVd>tKc4 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_http_get_current_handle.o b/hardware/arduino/mtk/system/libmtk/debug/vm_http_get_current_handle.o new file mode 100644 index 0000000000000000000000000000000000000000..54a75a8d38b079a02c7424655a67eb8f4de64d96 GIT binary patch literal 1260 zcmah}&u?;eExfGR8nP1}O+5fafxZ=B9=e zEP(;BPs`7i?YHHPgxQ6Z{uL(i^VpeoW?06qQG0P1k6-J;WaZpEg4E<2OCA+}e7~m( zD750%>%P+!;?#NR38y{seeXm#UH7DO?4ijjl^&U?#$e>PJ%4Ok>9lG0glFz#vYA)e z?QA~3W#)K}XQA)_?XKsxdcd}jMhgdf51Zw^-R%Y}Xa-wkYx;F|gWZh8S%R&zP3=Ad zJ{q+#I9n#cg%(NMgZ@)!Uf(M4uSgv3do)1IpFO1 z`#;`B3mxr3V5Re|1)M++_$|c6fD?Sdgo#KRjVGUh-`yaNAX0lLVb;r^5g?5U`R9GA z7MT^#Ag3`qBx0laHl|E=5ed~$P1U8nVa-#ee?}tjlvI>&Rr-_-ejz)Y zMY1M^bea!`L?Ial$S&q}po<!*kAs5c^i@fk{#f7DT7^Mzf`LqWd1P%9Lug33$|0QRvVS3 u(<~J2ibDhFuK{1GgKy0rgL8RNS{|Km0vDf0j4uH^MqI}W^^{_~2!8-KH;`li literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_http_recv_data.o b/hardware/arduino/mtk/system/libmtk/debug/vm_http_recv_data.o new file mode 100644 index 0000000000000000000000000000000000000000..d27f40c55d9857119ef6b5ec2fc8fe31cf7c8369 GIT binary patch literal 1240 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 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_http_send_data.o b/hardware/arduino/mtk/system/libmtk/debug/vm_http_send_data.o new file mode 100644 index 0000000000000000000000000000000000000000..2d6eb3f659624177dd1c6a9dcc5322697601e636 GIT binary patch literal 1240 zcma)5&2G~`5T12@>QJF3RVtDYfdxfM8frNu5>bQ%`A>yQP?AH$#m$dJB9W#z+lq(- z7mgfx0A2!#L*IZ4JOM{82$frIFk^e2D7`S!?)S~iw>#_c?z^g9V~l|?1}Rv20A0rk zI# zg3GPN`&#}OQop{lyWP_7p9N9SMY(=lKc5&Q&QFb*c``JHJ>H{Sy<9FRsrK~D8kp8x zsb?~ZKIW!!pk=k!+5K!jpH^~ePR&B`0m^%3uRjKsMj9x#jvjU@M~C}u2ud;wv2A~p z?XVlZ7>lz6yCvOcpw8wK-s>ZB%fXRgmibEM<{J*GeHOJpn}KRg$su)C&4D_YPA29F zO0bsN z%ZUhG#L)>E{6)6f7oj7RJQY9~H`g$D4P#q4=zL)u)F<(+NZ|=4&WX4t_7lFq)wm!2 z&@nvo*W@3H1K6vb1<%yz}nQqI3AGhQ*0AJM@-HshkXD5 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_http_set_body.o b/hardware/arduino/mtk/system/libmtk/debug/vm_http_set_body.o new file mode 100644 index 0000000000000000000000000000000000000000..37bef89c9e0ff63654a5a6db8a58112418f88803 GIT binary patch literal 1236 zcma)5&5ja55Uw6zcW`4CHkbvR=tS29#GMQ)iG+*t&&F9X3kTw5c7TbHh^#}ek$CXp z(W4LGL+EYaz>7YCM=!>#H*Q+ROb;Votfc$q#$}jE~@A zd-1kWJb}!Quk2>8^7DI16!cJTo-|)h%n|3O=FH}1e>$8mQ_X6%q-HwPGiP8sbG4bv zsm7Sw>VcluU*z}m#bQ=1Xay|~<-54RvaS9YSQcrde0+4TTRS@3@4$v6vnbmMC)gFX z8%nYiOS5az9R}KLKH*j$kvlGq1as_X8n<6@(1sSbKpkJWdey_*KNH#|b`SLPew)ttXv~)(#a*3{!Ea>2z6c$mJkiaNE6@|wRSxI5`1%e?o)_h)5py{;cv-(TD^ zR}g|tpoc;#TC*cD2);||+hZKU$hSO)`WlyTUVpUO0QNZS4M8)iI!@(B)mHmh|3?RA z(`Z-9hS_d3I`yvEEmw@XNwTN-{P9(q_^zBenCk`H{-y9RbeED_00v?jFASYEi9h-e DEMSH} literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_http_set_current_handle.o b/hardware/arduino/mtk/system/libmtk/debug/vm_http_set_current_handle.o new file mode 100644 index 0000000000000000000000000000000000000000..e5213885c07013073e182b36d7e8ba66fdefb93b GIT binary patch literal 1268 zcma)6&u3hu1LP%;wkqUdw02s3JFt2}99tttSe>!!I!D6l*+<<&2Sv3~>9L+}499NAaVL5$ zlhMt-aP(~>YrM&BW%Kz>J;!rA3x$U$w;j9P2eyecR5;js)GY5k+iJj)7G@E)9=yh` zvm1dJi?amV&>k@0qsc(nZA9Tp>?!6thg>-C1n{mcY~bzD2)H{Whtye~1Kt@926$ZH zSc}_2xc&B6I3w@J{RiAa4PEh)r=@#->2ZRf$8RD=JWlWv6FMTrXg%q|IPQ6V0FmsY z1b>#F6Ci^T($DKuEfOnkAg49zyU~709Lh*X`KKPL_!lHpLz$|(ivg^8tm5C0$lj6> zrCXCaC4)c6TD~W1l1qARE*{0r4Gb=0>?#gAUla%3llrYlVFweRhE5~v{@C;BUe`37FMqte11SNiE^xDC;8fTz?bZ*Bf2;tj zX4Z=Z)2dgijY`vM7K&!Yq6M$TKBfOUCMIv(9`91p*P7+V1-BPOt+sP|&n G2!8>{`jhnl literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_http_set_url.o b/hardware/arduino/mtk/system/libmtk/debug/vm_http_set_url.o new file mode 100644 index 0000000000000000000000000000000000000000..d346d9fc274df73f89e5e42dd7d57ed11a71cee5 GIT binary patch literal 1228 zcmaJ=&u=^hRRKvQS`!evSt^Nym>7Q3xGkn|AYQgWH$qaRE`yPH@Z!;< zNB;z`-g@_{e}P9Y#?%{$2Yrv(*>3mXBs<^t-uvdg**7z9YkHkA268Y+!?^{}5k@e- z6r^Dl6j*$YJc+d4RKLeJlEq;tc_sOw4)<2RYROFUb`s7Ki^Zw$RB0%?;pVe$EEXNY z+1lb=y>JNWpWoP>Zu!@bqAX~m(l~6q8XH5-PmHO_jhS@}(5O_3sdRfXvj(O$Pc^dH zls@8SYDddyFLT?uLLrmNt9dmCr3aX&XZHFdU>T&r(!t)tPIYg0yA2_q!oqAlu)(ge z8~zxJvjp4p-DjXq=VRXMBXUdNP%_IrR=N3_gL>5CJy848DX7+j3{vORJg9@ocx=8v z3D#13oLi&*jGI%>kNwBIg)wSx$ktGgyEZ2X*!(79*yaSEFpxqdAFU^yg5O=+_9N1G zFTk0_Q37PqLwdJP)*`Xw8gg2*Lrxr&FS2A}A|1sa+bFyMACXWEIb_`?I32P z{Qm2X`8})r7b;M_09c;JtB%i|o%F$F+zF!{KR1wh;{n*b5Eu12j?bH4-ZCNZ z!wSB1@$a-|-N&HdtQCFR_t=JQQ(vP#oIMX#9l#ccts_wNiiT5ZztU_SXkHl@4ZT$^ z=|-zwZ`V3Tr&QK!2C1Io!^byi;H$FcV0h9mdl$z8rF#@x1<(-_cv+s3jfeaXf`x>i literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_https_register_wps_cntxt_and_callback.o b/hardware/arduino/mtk/system/libmtk/debug/vm_https_register_wps_cntxt_and_callback.o new file mode 100644 index 0000000000000000000000000000000000000000..96e679163ed9a2f9d3c16a6523142d36610f368a GIT binary patch literal 1380 zcma)5&rcIU6n?X9p@_;)70Sjo29uJ)+F}!k9<;PfYb=sb61gqgvY}N9xE&M{6FHd3 z5%dCh@!%i8K~MI;pTOCp7frm>8wV48ud`DMr%p2Sz4yKE&6}TZrn8(e2C6X#!eek;(JE1%GC+xR`=k*J+M# z^MOSO|33Nt^O!HH1-j@@KTN+Yn?)hkE2d*Fmny<`%vb0XR>h_;t<@#7V6Cj=t-|wq zN;;Xm7YgUrHk^X(Y=zR1NGMwpc4#~ri@u1B#U>|5LUAK*#2|4O6D-@xmw=6+=}XMb zOw6Zd9*yOoP4lx3*6ZzO*Vqlu02^chc2gT=U{tos!pb8GM`BS~j=f?CdsBe1WC;t5 ze5C@0vqlc7V@4c|!dkg(uc8EN8I}-EDZe4?io4ksAcz{esy0_k_qF5N1YXx3LhNvD zf|L&+gh(9alg^L*w(ENksZ}L3M)@oNBFK=wS*L1|SlLmuDQBEWY&73!-I4?8DE`1j z$pZXBgKDUz>SmC@n(K=1!+?CFl2N)IsZ%mYV_>1-$(rPnUTfkPaPlaUmyqkiPV4K& zPUocdiYDw};2RlkQ+1WEu$lM5pMQ!c^wg`LF`jc3DDFLXRM>C=GjT_tH&E* z^wqgb?qb{v6K7(yWWBcy?&AFFl}UjI+981^sVJvcWAIFd>LZ=o_62{>_3`+iN5iqz z&ukQ6SitZS7};bLhs2X)W_B*xaz2>p?Cew`YtC|>o1Qo46I0n~lhT)MVd5_~@gF){ dV79s-c@KlQ$xYnLKqtU!!~j0LZSwKK{0F?7!#n^0 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_cancel_req.o b/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_cancel_req.o new file mode 100644 index 0000000000000000000000000000000000000000..201fff5034563edfb3d07116cb28133904c66578 GIT binary patch literal 1256 zcma)5O>fgc5S?|BlC~7u3Pe&Ou&N?bLRWT)M1(3qnoo*Lq$Y>nTqm(eq$X+YEh6GT z@B9KJ{sy-mxWN&A1ve&-`{NQ|^QZ{ED!S&w($6|5p-43sfQ!YBf$$sm#* z2$C=lQOJB+c(Gu;%_riktw;hMM7|{xa2~tJoM~s#QgkO;{;(g5&9&hC+J%1%S*B!eh#F20NZntSSoNmKCv_1EDASvZ?PxNH9cj7f%udkO?2&@xK6zdY#m`FySMwemfwB8QH2>T%4XSe_y)VlZiQkj z&Q{nR?I8p1_dCL=qZgj^ErmSykPG*X0N!+j1HA70z`Y&?q&9gPc%#?pxLuTBE$#^6 zwd*Is^@ET54|f+e)ZUpuOFgy%OfDSY+vsNlOztZtbo9j0deTL4+za9mda~2OJeuUM z1V|x8`f;7AMQVi&#I$CUNVHQN2?BwUj`B|fAJFg-0o72Z>Xwnfnn#NNf}wnky@h9v%>z6`zk(MjPcdGAfAo!x A6aWAK literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_post_content_res.o b/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_post_content_res.o new file mode 100644 index 0000000000000000000000000000000000000000..96665b143fc2c1f07c5b77d7e59f320407547344 GIT binary patch literal 1328 zcmah|OHUI~6h5~PEZ_qW!)qb~fuy8zonjM+E~K>F);QRNHp*^j%fymUT4yc>5{)Kq zT&5xou$qH<|l==R4oM=f39EvMCs2pc;cHv?GAG zUJy<+4N>TY2sFMv5kee&88XMUp@*Nv-}Jutp3aN0%A12O?TR+2eGm}4dffBT(BS=~ zHly9spfPb0Jh*)LPV9@uVc;;5>B*MF^|kKoNM$_@jsBCocrAw4A^PJRo31SV`gtS@ zYEeE$GK-n#RjVRp-L+hMd&8>NTxpeS+tS{amSekU%%oCx^=Q7f1>vEWOLpA9xsA%G|-iF`9`{z7d|Hl`Fsqq+vfy*VE`SGG#XF72!7Lk97Lpc;6bbR zt{)(V3i&&Isur0QH;~hqITEqad^!=ok&p8Cee`8GMnW}IQ+2Z_V9mPH{~+<+qNgZd zzvojnxQ&UmR^-*Bko1*5>q zn7O5-Y2}2-FBhyra>-n_XwXwzTKLCW_|G|eV4Yu_mP%(mf*YZI4EK5uZxkPwq!=H? Ee?~X16aWAK literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_read_content_req.o b/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_read_content_req.o new file mode 100644 index 0000000000000000000000000000000000000000..4e48cefe960b763487e2caabe4b772e383fae396 GIT binary patch literal 1288 zcma)5O>YuG7=DNE+B8U0BUGZBrY0aVSt_xl7fUH0jaxB=n8wSpz(z<4w7XLyF~*Ar ze}Gr-{sC|O5l#F79yRgO-ni-evO7RI)J`(9Gw;mo?8l;3VvK=o3=%Mn02)r< z&yEcVScDLazK5TOtM7Mz##Z86oj`mk{-p$ug6C>H8DERTMRYVe^PGjs!M#xB^A=O(=u;`zfW+nbpI=X9F&9JSM)_?|?+9^h>$cf%>y~M>_12&-%)Y?j1dZiFVM|HW z2B%ibw1!GKl~S~>FqI88qn>2anOrWZWO-M)`Gft<`tJT-x&{GH zh%K;X-wM0K?s}sv##Y&V&tnGM9`=OML=={T9my>7hzs+b0Nyr)0laD3z^wrVTHFxA>NZb>X}br!0X#qtU3I|q(tX!mPT+I-J;Vi<6a2=6f=C+8CtnEr zLpSy!Qv2+{WOP0&KnfM|&-!F7GE1%^r#TxWVx#pGB5ore<)69e%J2;d)sRirt)PH4 zkEQ+tiSx!BMfxI+Pud`eiNi_c)TEI7o*6xgi>oN!LM@D)_IDdQ-IF{kQmA0!D-pNJ zx-ynHtNY;cuha>>E4d!;ty_2_Zsowc>NE|Td*!*y$xI|s5syGMQo%h?;0=d987<2_=!;(3XiMv3yJi0*Q$% zTxjB=$cB%tKY)eqSg`O1urjXQxNuW1V|lQIuz&_@DG4|B=q~;qv?AfO1_4EBhQ`LuWnv zy+?fq{f9WoUU+}tNZP$|Ab<4L{Ck02T^UnuD-RW@kDP~&ubtHRA+MiEC&5f8Tjc!< z!R%mpF%9+Z^E}_-kwu99I{WtXl$XUqJq%`^WHu{i*>TpYX4P6*GHq*}YME5(ff~)P zZrCNu-c~cQm})FLmO7!w_4W98d}?Y;O=t-%4$1pyFIa`*GO#hE{^Z>33ALj zQjmpMpD)Y?*iAXY2H6n1CEa77Rktfnp@`_%E|vwetyh|3Z8@MV6`TTS#cCBadzBJ$ z$F&4#rPWHsT0sl;(h81aFBdl)t4a(1zZgLq9ZkTq)A`gqPT=$SFk;B#1a&N^h@{c` z%dS`+}44N<8VD3OZsz3J7RRO*up&lYc z-z*B)b4}x(phw#$8qZ|+W0&lUN`Tzg` literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_req_ext.o b/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_req_ext.o new file mode 100644 index 0000000000000000000000000000000000000000..9c222bf0997966c989a70e8519cc7093360db0c4 GIT binary patch literal 1332 zcma)5O-vI(6n?Y2g#s}asIi5OY!s4`%4UmABx<6iWm-eA2_=SbSz6dwqUC417&vLX zc&*?8!~-!LFkU$5je}Qjdef^1z1ABC6Me6{(^kU4m&|<~UTPEqPmcVW`9EW%Z^CwJRs>N4Jive3!rB z?|AK4I`*eKGezDz+mQ*E=2KAXKFRZ^JTwoHZ(rC@Y5d2}kGv>0@1Z|^C;hl=mKMboy{Ol!lTdODfBp+)j5>-K_WZ))jiRLd?omNsg{jJ4QEY;0^;i|cVc28nBE zFIa`*60l*UzQpv@^_kSv-H|-BNq*MBdXyl$z%I%m7G{0yl5~}UUfC==g(9M3yI2y; zwjSvY?LuEHI0ev)l?v$g3MJ%@>2c5(R?1~-87AC`g%_1_l-+n_oy}r0*u0e)&(2{{jXEt-b&N literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_set_channel_req.o b/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_set_channel_req.o new file mode 100644 index 0000000000000000000000000000000000000000..49cbb856728e19a4be9262399eea17f83b5623f2 GIT binary patch literal 1392 zcma)6&rcIk5T5NXwloAm#I~$Z2!@ivro~2ynqX;pt)YmajUir^wrnhh7T7MP#DgBZ znv`;(a5Ekxc;JAEhaR|^7{lM-#dxcU2M#7W)7@VngId@^3+i9=3_n$IT$y|2q3VW6v z>vsSCK*d&WEAcz_ZND%o3<>uHs12TV9Nn*$ScSb~hpbjLRr#nrmS$HM`Isxa6oFdj zS%ST0&L!~vJpK0LgcXe!(~*xph`z{4Syf#xNCi2+j82s@*;GC+uS$x%LAq!-eAnYm ztZgb8S=sVLeLhcoMU_1h{(yfYFdmqk9Q6dnpcsJAEtIF^RC)!tQ4Fo2g}FP)$lSy6 z1lUYGXXm;tJ=`_!y4lIOI5*dC8sk7LY~|Ec8c|g=%o>p*uZpT%R6$%$sVNZCg#w7m z8YQF-h(QoDYq^}9M+x>4Q>v=0q&HQ$Ko9qr;IS3J zgGe0BCmoODrkR}jZ$YMCK=XyOsH-!c5K5LAj>(X?F3<_9SY-CzbN=a{O;osomek9wG>%>9NcLfLS zlku(?!Z8;1DA3L5YvcyD@)r2@*Wd}w_3ll^e69o4Eil+DW5mHQ`i~8+b#>BP>-9z% z^O0tP(Z#w2#?IBXe$@tdaed>KX#z8}!EFplMRU4M93-_;-P683zmUJwbK2J~6Z%U( zU@-&3Dhw}!7!Ui=g&u`t^9%mVCxH}=&rgTq(mZ2{nWU5qO~+>>n)3{Q5BR-G_{Aw( dAYIxTpO5z0g)ec0=yc$jBf9ZoeWn~Q#6Pg}#vK3v literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_unset_channel_req.o b/hardware/arduino/mtk/system/libmtk/debug/vm_https_send_unset_channel_req.o new file mode 100644 index 0000000000000000000000000000000000000000..3b316be8d7a9bedda32c681e33902f7491f2fb5a GIT binary patch literal 1280 zcmah}L2nX46n?Wn-L|RHMk7?B8?A|S49B}hnK1^^7^Go>0Ga`a<$OXK zmO+L5=atth#>Y}BdAA!&!Nb_MbPCQB7x^>gOs%M|)as{ZBC*tk^Q#w1N_z|GU*AFd z{gX?P(8nuZ%J2JTSBOK;^lYbN4js=HX1i-Sj(uRd_7Om(SbVCb>w}@&w%w6d$z(L6 zCv0t7&+13nt!zHOspWW%XQA*I_qA-R)dRMPVXUyf_oPwUd%0DI1x00xY%O}7-C#E( z36^B*?6&fV0ry6IVYSc;H}G8A6U@PQ;yaXPsMRR#1ZslC;mK{ zf}ay0gDK)q^Q0EBWvpXNYqlwgc7j90A&q!ce;#_7KgEDFq)FW>CQ$QG=D%VP+^rxZ zd8+|W(%>&f%`plz2@+qK%ExhY9g|C#yM}|#7so+;lHZCUyuiXK1))h@iKU;;N8t}0 zV{8#$eGGB`X$8`Y!o5iuBL)v}&X04`yAwa=*T-eVbde`ETaUu!Hx=knj{}?CU*58y z8i6bRS%^hz))aQB$J93`p!zf6;}BC{R~4M+JYe324FMY+;6_o$sqm&)t?ldcmVsF@ zYC8qPtd-04-G=?Tyt$K%l5cpr z1rL4)uikp7-=H@?f+v&q)|<|-yRao5aFX}tH#5ICvu}3Zr;<@-jDar<(lD_ATCSmF zM}#!QAPTwfi!T?AkHu8-Zd*ygedRQrg0sX$?wB1zCHf*-{koe-EVSY5>P0A}zJ~Pq z>F-}BW$qX8bi8s>e%CWQt*$T!?=5M!%>&Wu_k4?3~fPigvyG_e}gNG`G!ecdE z?;kq0aE59nlTnS16zZm?Yj5=pJ(pWkvpman$Ui{3C9Gx#*cw75zq9?YQQUsMQHQxu zl+Cl{$aQvu-3%vKlC7}Yp>+m)FziXIiCQ|YZu`g)T`t833A|-V3wU!d0Pgh3Ahyo4 z!0mpoC-#wowYVjv(`g<`G4L)sgSvwpYWJMSrJfreCKd7UE!6WKCKXozRMh07^Tdnd zy64$p)FelveX_Z~79fKz;s<$tEn@pvLriBj$%%4=Yn^~6#H09APkV0ohJb4L;@7RB z18W}m{+|fkIdeTeZ^`BPG>BnfcWk*e$s~R#;7?(44V??zFA4f1aQ-LA36H8zJmE_fs9ppv&p!hl>ACTdV0Pjwqxd+CcCa@%(o^vWJerUZ zx%H^Wu1x3mr_7Cp;R+NG5{u3(hZyX;q0vr#`#fcT@oehrQV93iA2YXMRl;fuxKYq> z%fBjAYdhM1WB{{b)VA`5Su2<8rH0waZy6<%66^_S;!8I1EjmLmXa6X=4*icLUiJy< RL=4~=>J=QoBH1`Ne*tdQtSJBh literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_addr.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_addr.o new file mode 100644 index 0000000000000000000000000000000000000000..de81a0c12002097b412d97c83cbfcc64174fc3ad GIT binary patch literal 1208 zcma)5&2AGh5FT%mvTapp%U@C=SfL`Ngj$;ti3lMfiO|r-FeU|?>yaX!kl5UdA1tA!mhIGu_Q~eHFndu$AFK<1L3vN zi$MCGMuGpD3;(?U-t~kBygeEL4~7(wI>+Z_wLxwyhN(9bJO?lUGV^u*D8(wX?(QE?1C+0kSS2YGw|S)@oG)#+NK*4Rc& zbGC>?JHl_7fHKli{;~3khEE8nhBjTdjs(_xqxo+L9u z!qeh5k_*UP!jJYx`=vhVe? z^1^gVbam1vCi!U^<7;7n=zKm7bT2}a^{B_v&aba;nasxE!t}n-oK=HO&zTg|w{R^P zzoY~j^>xL-G5TP62i66wcY!-48;9bHQoXTj&uGA{IgRb2<2I_*W~Jq}irY@bCCNTM jdwh*9zNcUeZggSUvlMRV5!OvE0z5&#hL@yFF&^$eFYb8E literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_ftpd_restart.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_ftpd_restart.o new file mode 100644 index 0000000000000000000000000000000000000000..fcd1a3e01cef8c9c0841ad424b3d0f269e34f523 GIT binary patch literal 1248 zcma)6&u`B$AF~&eP25GqP06M}66g;!`*bfTz;aaTjOJ=XFD^sp3SPp zklX5xp4Z>ybNSufj9SnNS{{lIae`%A-660H!cg&W|8cvr|18&nuo7WWwh_F+Zn9f} zI7_f3+f*Jf(5AByx4LM#BkVvT$9}7E`vV89Z*dE>?sN*8GbV@Fd946iZ#){=M@T^} z&Enh{c8|F|^*-!B%pK%ViNhY3>fH7)nV^Snqm6o)%p4OcT8hzp;zh9E^ZWo>YM+Gh zM{%40S&R^Wktel?EU}K5=Il@q8?6_2kr;?a`KO*0QGhQ9NJBQM+rR*7PGtNW0&%xQ zMDo@JPtxEoqK@wgO>&8^EW~5DxQ@XUjICj({l&0To#eM7ggs205b&DRmA9OyI^UxS#kc0Nt-7ULJ#dJoJAm CFN(AP literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_ftpd_start.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_ftpd_start.o new file mode 100644 index 0000000000000000000000000000000000000000..b1a5e3e2189bc49cf01f8fd0233d9c5bae2b68be GIT binary patch literal 1240 zcma)6&u2%=f+TeKT)%c6Q&Dj51>kWMhzoSp?8xpn6V)o58QTno{8~aWvdl_CuBMqj2>@GZtIu!eR7CQMG4~ z{PB%lZ{~k~KPcak#XO8w4$80lW^dOP=5sOZm?L310+W?O;hvVP5B8k4?TocbI;|N! zVQcGpMt_xA%WQ0?4mEm z;w-@~E4LW%(YP`La?FS)Sa2;dz{SioDO5pZWf0l70g3%ot(_w8M@U@dM5 z;q+R2!X9}K^&fBrJ#@T5&r4_A@Hm0r3dnNyKZ?N2o{<@hnc#QCvVC!A|>&VyAPOU++F9#;D0A*ORftdEF1c{z#qB zH+k}z;yYG>@_x85OCw_t$8mG2&96@Wz$8CSW30{sWGC}}xOyz_)_XeDPOdL+nQQRD znaMjM7tL8#7(AHHb=HOxjXZ D{~?DG literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_ftpd_stop.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_ftpd_stop.o new file mode 100644 index 0000000000000000000000000000000000000000..e9b531dd3075d784f2dc0a9746589548cd3b4a6a GIT binary patch literal 1224 zcma)6&2G~`5T13M;?hb@ODmj$z=t5Egsz+ti3lMY%3y= zcm*DV7vMx60-l0n!>u=%vAuOjFO0PN&Cj

`6k1X+O14aDH*ixFH0W@Rjp_ zr!i|1gQ7Q<@7qp*8!o4PU6rs8JXp048xCyjgQ{0F>`FV8W@}Fi+Q4Y&t#U~>TJ?In u)-gJzvR*UD^~!P#e3J&gDtit_VEV=0rSL$jSUn3N6focq*(2oEP zWH6TO8lo@-e&~F8%sFp=4w_*t`0x||lR4twG6lX+d)pe<&S^8+2M+P`CzBry4c=eV zV%l8|I#*AQL%LDcDb?xEQWL}wYhP-nAv!+T!3+ppG~l7-wc~&L2ro7v3YjIbAy52Jgkdy z1yMK>Yl=Dct}g5Y0s3}XltHgFo1i-l3do(%lb}}{^}4->7ObV0g>ZH%`@(LzKlC3E zMh_jqxa*~Jc;#{epUW2zCtOZ&f{6$sX*8aEe*Bi)*o#Q5C85{L;|7SMLjFOYszqkS z4dgUtg+y#L-^DJI9r-AK&qb*Mw2@E^)l}Ua3Rv@*(tjb5cTXzH7mz+>gD@txdXcP2 zA^AN6x`C4$C{Chw0Y6$Ft(W#m{VP%^VWLjNZK|${6%Oh?`2APugx+rTzTzFKKzScb z_tVH2%wk{bX@j$qf2^DDr7;fm17xFlA6y>F%X;)|WE-7d-7=Z=!Wp=Zlw34s+QZNVE0T1@W4_2?jqJYJ1(9N`gUFuOfm)|r-TwrC*{94Mi@|+jei&inU qX0BUgdTI*`U!;X^$~gpUcycODdpCy*+eHjb$%{0Pmqk#Fhx`xp29j$4 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_read.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_read.o new file mode 100644 index 0000000000000000000000000000000000000000..0bcb3f2f4e404e20d747775813601d820b36f741 GIT binary patch literal 1212 zcmaJ=O^?!06uqx}3^#VJ?zyM;_I>niLu)d|fDZ;)SVaIwZV)Ou zhAeDC1QwrTk7DgN_3x=|u{;Wk*TfG^xV!OH5p&{g5iZh;#kp`EQ6mS@*3(`x86UyL z*5X~WbOPC*-`JgA_1BLwZ|Gq}JyBmxbo+FsTc$AtP;0falObKv%+c0{JrC_~&*KC^kKaIydYs@BCL~1C=za1<@Y(g^03wa|E-YvF z7y zU)=R^8~j1$-xuy96qYVr6Bbucyn@;mKJ+@UY8UnBZ z8KmT*cM<{vI&VH`-=vEsLYu4?US zMbq2OW~b5ByOpZe(8=-4v~~O!b^M#GIq1H!&VHq^Io+M)CV+;R#tU*pF&^wc#~gg~ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_rehandshake.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_rehandshake.o new file mode 100644 index 0000000000000000000000000000000000000000..5ef8b9f32cab2053c7f018561db170db6a01e350 GIT binary patch literal 1236 zcma)5U2hUW6uq-Rg*K_QsR~GR)tb=KPL@g{F-GMZ?N*w?18?gB8zGjWyHg|a!54po z{ttcYLlggi{tDlk`efhqUUp}p)CVV-Ip>~xX728Md?@P`#u&)PAO({MVAl;o*|8x7 z3lN6f*TwBc{e3AJzugNZVLkLcm4ws8S?)+V3Rfe~BDK%0SZuxrr_nPdslI^J$q#m? zRXF*1T-lO^Jd9S4D{lve*mn%u>X`>!r)R#hFj*}YAE>Fu@X+p9_DHR!)2iMVmb#^7 zv^SZ}OfI*kW_gxpAb$_-re(JKz}Aq4@_Re?o28wnn+=##!Ysm;gDdO`yB3JCI7_e_ z$_4}Oj0VDNBMRHao@BPQ&xQ3)0PmW@1m1QW;P#LLa%XrJcxN~mSO;jqTHF-E?zazx z<#<2!A8->rw6$}dm-ctp;{-vEUq_61oZt&4R7BEfKKa7f?|N|nk=jQW{Lwu|fHW%P zpZ3XGWR_e*PIKgW(RwS`Wg{QuAA2bEPe`bSY_e_*1+4j6>feyKcgj_yZ^`vZ8~jGr z@*}q4eQkPm@`uKGKaFv65+Iw+2jSMayjxHAwb}LMEprV4xHLW^a?zY+ zg~20#uDfr|nV6m=HQLuD1;>kzmUm!Pz-kw`Ues{NKQGqmd)hyoU{v*bA+Hgrh#wE9)WSO2z>+XV;m3n31VykpoEyfi$ixTh6nx^nEr)z literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_ciphers.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_ciphers.o new file mode 100644 index 0000000000000000000000000000000000000000..6d0cf5a31019d74d0ece050bfe349e0be1d3c586 GIT binary patch literal 1244 zcma)6&2G~`5T12@>QJF3Re&T|V4z3|p_Wr35#<2nKNT)PO%4$kH%ToLsUgL75fKM2 z969m;yaczr0T*}zj$9Bbx7=VR>vclQfsuCSo0)HC*0Z~QTQlm6F%ZHa4ND84%Z*Te zK}f?o$T0sDeH?AQseVhwmEth0TvR^P;m+C@UCAgn6*x`J=QC+0H{{(&^I12Mhz;R% zWB#sQIDqtzuk2R0{PTNJ6!f&*IB2{Yo9>ZgI+kk=M#n?Tb}-neRElc4Jvp%lmOWJ) z*{o`eTua^2bNb8NcCJv!sCg}~<)CyA={>909|6lC43+lx?suwtyW4FDOEQbF&0w5e zVpjqQmSib*O}fiKbEadr*GKKzTn`1Zts~8~Ub~z~7*&!zi<%=&6pNL2Cho0tMfR6~Mh7eJ=i4LrJEc~Al z@Vmu5f*0dFL4)6jR{J7&q$QsP5XIy=IxnDa0|)Idii7$jz7-)n!oZY(CnBG)gibr+6F;(OYkA+6xwvh4aq4SK!ukB8)dsNT!qy>ZMn%V|^rX^k?d$(w zg4r-y<&t5x>h*T5V|Geqqh=EEIsOCiWt#Z5>?xS%i_kWxk4ZdSx>JdD00VUjFV0i4 H@xcE8i42Lh literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_client_auth.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_client_auth.o new file mode 100644 index 0000000000000000000000000000000000000000..60a52fe842c8cd5682fac0e827f9c2c16d3ae9a3 GIT binary patch literal 1260 zcma)6O>YuW6upmu7HmwR!3c;t(VBqR=TJ!`Yz*HtPQ?@!#59=>bRr}mIy{WTg&W%mjOT_v!szsS)-z$4W6?!JwOGuliNghg45UGv;wz(&qTbFnaD@^2QE4)z(*uhLk?NDh62`n zF7+=+ob%-<(id`k(gq49mir=ogr2zzAdHJ^C|*Eq6EE6d5HISJd{(4T!o)iw?vU%r zSmLtoh2MXqPN>YDe4!}+RG_>UVv95~23K(|&9&v#$?u!x=V^@9MSyHI@14Exg~h4Y zoC~Y#%TwkU6j+D5NXbR_Yv2Cf%1obr!~ zwfcc}jvI`sUN7Wzqh6^r%1xu0FX&~1%un%ufM2MA-&ubGw6n?Y$VbUs1OQlJSy3`7ZZHG+_T13$NuDUhS1j%jPG)og`Ox#Sxpy1Vi zLGa%YJoM0;SN$tIDfL$HpzmdNk~9PdX5RO{_wBs5Z)f&>(JV2>Kn(^-7<&LU=>#%E zK@#R61ijA-PZrF#g+y$%6--=8z^&jnBauqLY5c5rtR08S;m6^fkM(GDt_7!&GcBRN zfaK5b>_$EJ>&Hpyj!Nd)Ncp7nx?_pMzSVbx)owa3MOzF2%K7{~Jz4D@x%-Yg(97%V zy4e>NL*)-|u!hSSfJK z#cd(ncH>Am{i&Dxk9!?s)ZU<{p&r*fOvdlwD`>+WCi4XYI$GlBdD4Y&-t>GQS{fgu z8LjeD0<0rL`bnM2MPh{w#PrM-kvM3-G`GnDL#6i4*|+CXI$Wub2cA!TUDR-$acTKJtO;0a0ypypF4?E~oywju zOA1!mtmLw$RVkIK#hO*i=FFl+$^-lh;N7(FcDVzvW~3R`8pEOrSW9#sfX-GN4~|Jb Ge(-;CN{JT$ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_null_client_auth.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_set_null_client_auth.o new file mode 100644 index 0000000000000000000000000000000000000000..f47d45875cfb4755f2c7ff28ac4b61ef6eb4e42b GIT binary patch literal 1268 zcmaJ>&uI3XZ)W*e(W{Ixkj5YbQwGrXNF?tH zGOz+sD12LewyJ+9r;{7KNE)^yKQd{!NL?0AmD6Y~_B2-i(oQ6ndvFoIRMP4T$ejOV zciQ{szt5_>vXJlNwX^Emp&{mJybKz(b(=<_C&2^ zv#Q<~mb$Cuv^Tk(T%oX~=6Rmypm-nmG%d5!2eySUQan0%&?+B1*=fR(5@j*A9=^t| zvm2oVOR^NZrQBn{oyky`9rVKXd`}|V8gOB~7r>8AVFK?s4sd%!gw#2n2i_eGhj>=t zSc{uN*!|8}SkBy!TtIJQj#|9rYpBo9eM~Ow zMC#T&os_{}MD2iiHHng5nTf}7a}9&b7`uvt&KJi)eUiTwA?#t|GXdXZUCE`Njfde6 z9V4)iTRot-|7-=S7Y4fDsWI3<@+b(*?oRrMn-9{+={~16pAWOQorw6h5{pBn3 z1R=QM_MTL^BOs|8g9#M7St^Odm>8f87^x&cVh<+EuT@AublDO)_2M7k z!Gr0ke?+};F!Aa^{{oLqJk=ZVqVKUgT}m&$WafSEd*95PeY>-V#R_MPfiMOMup@wh z8MreGK?3~Xh56^_obxXy!Kx<~EFbQE;$I`7ShRONcEmq&*z$i@V#(N@Sb@XY=KR|1 z13%*PnPcWH`JVd9fA+KCKo8E==5_v_hntW%{lVhR{I63k4q#h*nU^ks%7GY7g>A1&09#4lxtBu~!P2Uqp*9Nkoy)!`W zwu~0Y?eQ37eMAAN({cvn&S*H)UZVtS$t}as`|Sfm8`Hu6&u*iP+U~LB)cb*j$+;|i z3%$?6Vyn}nAks$%$gLE-m%2TadQR9tH|BJ zLFZe;L46X>iVzx@m=Lf`)D^Mt%e)JI{}nuW=c2mJI4@M7ybCt$G$ICJobBgW-ktRB zMc!WG272$dt>#@I*-1oZz1}&uy1)3!Oo0=wz!pMM(VBG!gGXj+F;m}aD{;q)sjmSC zHF5RQ${mOs5buIqDJVGQo)yZ~nsQkPYN=Aq=PGKI^LnwNHgfq&Q6=3g`~%>##A z2wb@H3fwBuM}Vi`RuysS4Q8@l*Y%+*?aq8N-^}dJ?tZG8HO3go!5{-?2*4B|nx7Lg zummwEd|!UCY<{eyledS_G~A2+%%tHYby_%74rBHB^LXQHCy`hj!pX|1lGa{9=J*%8 z(X=Z6jyA z&28lhg-tE5=k**EA7GxY-R+HlZK4`2?(IBmS9YFlwO~Psu{c{(ud-|GMkK+KEXCH9 z`wVn)igpK_7H^7xbR%g6>QR5Id*mLGMq-WBULpSWEA6?u>d< zZo8p_T>x*PkJ`H6aj3U1J)MN=={HfvJ)OiibZ98aM)Aap;k@hN2ud2Ch45E#g#cN! z5I@M1wTLWr19gg#cSZSDaLPeE@;~vUw0}W`YRDn$Hqd}I-$?rpRK$A{7Rg%`JV}GU zsC9fKY7!*A60ob7+(6?Z+Aiay{n37@Px7p&LLMFdCJ@WIUeY@9Yku;C(-(cb|SIRg`@bfBr7i< z{o@4B1N4)-0)cE(CAn^p84 zx0Q7*r@hLpz&*DTcmTe{XCuPl7!>gpH{VCmBZ>TsCr4mq42C!Z|rFQaDq|O z8^wZdG^*8RrDe1VMZIE>@ukfT{4)*wx12E;XN%A_HnAshQ)R@&A^^Ru6h0iCV!ZIb D%k_rp literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_write.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_write.o new file mode 100644 index 0000000000000000000000000000000000000000..393183f5c86cb5ec35a1eb33c238880d953f96a3 GIT binary patch literal 1220 zcma)5O>fgc5S?{C>QGRVQXmNySWu*dP|GQih$1AEPp85qsL3I4ah=p^A~ggY7l=4; z;mDCANB#o0-nqgr;K&7`a*M518%Q;Ri&(SLxR)vY<41?h?=+)Yd-BJlZgSG zuFc*xiu;iH`HkJ|R(|~`@q!+T+P?O3WH?6?KcOP`-;3Ov~&Ifn||K%6q%_IXgd9Z(KT#{{J}nSf%C$su)KDS*-+k4Dxrlwd8z zbR2uwJ9eyz_e1{y*HJ_5je1(@ao6JnVUJ%$jCq{k6DDLtiqU-1iTK^}{1779dl&rC zJxYKaMo1sj@meJ2Tt!ZEwke24>&55H9Y{y{2OhdnfR9M11~*=}i2H)eqy18!_`f2B`XFpqk-?qo`Mlv*zH*gH$eMIt^(+YX}lzl$;ZR}2U9zL AWB>pF literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tmp_filename.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tmp_filename.o new file mode 100644 index 0000000000000000000000000000000000000000..8d22d760711e0814cc0173af5d5baf4a2cae619b GIT binary patch literal 1220 zcmaJ=&2G~`5T13MkhUVU<Ch z9)SyYUV&RB`UrgsE*x5M=?!LLuj~52O1m@P%r`T;v%8<`MuRa1Vlc?T1p+X9kSxsz zIaq)+jDKWaWsFZXHG6N6Qm?A;Aa$avc@<8T^YIZof@b<v6ZX^VBGe^0(e@Rod@pur#1 zc0=UXBuIQIVwW+wj>dVkUBgNHqy18!#92{=5<0?7AQpAW7adW%3}=6%zC^K0+8%JDs^e1GuD04cdYlGk(`av2471&6bn0ERTiG<~ pCb8bxo{4|b#9!r3!HlJ!^)8DS`W)*k3jj5gEBILGT`73U{{Y^zfHeRB literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_free.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_free.o new file mode 100644 index 0000000000000000000000000000000000000000..ad4867540a5fd0c2200aeb272d622b33e91eb375 GIT binary patch literal 1228 zcma)5O>fgc5S?|LlC~`NsyPzXQg4!kprjgb%(-pjyxf#SI*}jo5_0r*lP)IWR_DY)9y-P?pbN;LwYxz z&2E_)p5bZ8Jw&-H+-4Wp7Q$$*cJQcCIC#EWhdC|A=Gm&g#@5;Gh{57)gWc7381TWU zC*3Ay>G`>%kSE@9DLzWzZCAR$n}Y#xuTKT3(>w#b)$jGhJCvXocct{Y&0{GBbnyR+ zdnlu^&INLstsP)WdVud>o)0jkZ`d#~6GzvRE{5wtP)9IRoQ(Hy^IsuA3MtZ0>y#I% z6}Ax5HG4#2oZwm`5CrL{|1`(}4POwDhYICeK>|JBEB*%p|9kQorCafJN(R3X9Zo9W zlS`%*Euqk1)4cyLKxaD5uE7h8HT?kIuuI}e-r&=o2iw&od s+qa7j>D~zG;D71hpXH6fxn_ahG{ZO^kj`r?0zAXKfgeqQYJAy$0Zkf$(f|Me literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_get_handle.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_get_handle.o new file mode 100644 index 0000000000000000000000000000000000000000..dcaf4f0b7a74e0223856a4c4cca44db3713b881d GIT binary patch literal 1244 zcmah}-D(p-6h5=r)U7S_N5xH*xUS9H7waQsq*>a&R(*A(>(@FkUb`@kAvONNlE;N#KOe{h z5-r_2?>WK1Y5U!C&v)Kfr&&-(bGP{{v zZpX;-EYCpx5w7QYZnFz)2WdQic<{JUI@sT>!;+%0WwxnaXE)f*n9dSxi)||p8Sufd z7r0Htz!%t&%=b=s;Jpukx81-6-W&{o`+YJyq0(%vxVTj~FXMBFFgk-80`lQQ^&>}YC< zoMe(-nenT*xQWiI=v%{1-?xsP>LmAy6tWojOeAbFue2r3`c?S-SNaKKlkAZvHkX0o zD$uz_jlnh=(SB!FCw+VpkMwc48yUzh$5psL7Z>?TQ{UzFh^lNmZ)Ptw5hHe3XTgNE^k3HfMgrET{LmXzbsa3hvp(VIF?;2!roNPS&e+q1h#Q*>R literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_get_mem.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_get_mem.o new file mode 100644 index 0000000000000000000000000000000000000000..0d07aed8ec985243e71f4d7d7648e8762edc3af1 GIT binary patch literal 1240 zcma)6&2G~`5T13C;Ik zmO%yc)5_Bo>wP(uywOXf;CA9$It8cNnR%j|s5SM8TK~AOX-hpgy?Cai^cRr+`5p9M zKe#L+{A%q>_0Y3}q22ZShpunGbOYOSy)a!XmG0~5=HS5Zxc*45Wiq%^>v^8%IVjx41&-^q`@pslCJKAI_gdxM$Jr(+#F%3cDK9Sdwk9P2~;) zJ{)<0(?%cok?%?5yRUfQz6*eNoxlO!9u9%~0}4o;<9Xnnf#F%FG@Fw#-}q40u+4+yA+G+DQf1lD{b`L76~Zz^J>ZY|PD8T>)C zKaQfB6p~(<;#J(-KynGWOE~C!t2n4n@>vmriHRcu!em_;OFzxW;rCz3laGbfCroUn z0_Ec~y`t07do;&OrgtZOBFvA|7;jDjMCbEyxH*%L>QRp)JHNmD%A#xxEdYM{RQxL+IYYG5!mwzMZHYo!5-jwv}J%t=r{1=DN~Fu{U4e1hd=-T literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_load.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ts_driver_load.o new file mode 100644 index 0000000000000000000000000000000000000000..91ff40a796b1432215a151d785217a72175e02b4 GIT binary patch literal 1236 zcma)5&uaLd7-lTWZdwWSW!!tY$+52cWEwj}FmPG2y)(#&w3Wra2>fl!bEXdZq8*GzZ_e5Bf z#n?^d9s@p_^c}N>=-2|glG)Y~cdWM#@Q&%2z+0mcaC<-rxzjuYyglgmt=DM5UfgsX zyVp8)tP#EV<>D6FXnXyxo%Xolassc*Zy*L;PVgBEDk5q0Joy4R?z*`Lk>Z1Z*({C{ zAcYF~7k#o9nI+ed(=)pyV$gaUQzj)V=Wguha=W z)9!P{^Ir$5dtq~4M#dn5^TAA8T%G*BX?<44oX&k7%XKfP^CB|Q@5M}8USHlaVer5e z*hWe&dS+c=urEr}nf9%=l(*fS_H|96O3GQP!)u ztZr0GrFyYpG_pCpXprxfyKrt!WaW-4AKxq058HIksk@t zFb^u2Ul*P&SRYEMD*rN4souOFcQ z{>fz#;TNk%m3KXR(Drk-A9&sUJ-aou9lzb}0#u8|2YR~EA9!uo8|u|eMz^|wtLKcY z@ix1WHO+NB&+|MBg?qT4<2tP_uyurq!uHnvW@+omMgwLPmCdr{_+@s5U5#lh$yV5^ za+d-3hrPgQp%1*!cO>%M*F13F2f%lozyaR!ec)c70#avr9(cRo>$&?V!CKr2@bIlc z;QA9Ecusg7bJW@yp`rd-0+Wjid=34qz~qiFp`#~`){{=faZAK8^kfI4Ihw+21jryo z`f;7CMQVu+#IzZA<* zBHB5P!kQG4UK!(6+}uEN4!KJ>=zNPfs88}+5rT<{PXvU?x-yo2oR7nwf08F38&!{( z*qI8Hj|1IXWDHg@Fi(l`-ASJqn#=p!Pf<2|&sHaIh;6pr@HV^O^{R%#!62*A={{icpi<1BV literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ucs2_to_ascii.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ucs2_to_ascii.o new file mode 100644 index 0000000000000000000000000000000000000000..d173d39208f85b73cd7512b50e0c4610d87c6d05 GIT binary patch literal 1236 zcma)5&5qJg6h627OmSicCYS*v+US^oI88wk2^;0NOzg;HU_sn;3eyOQh_=N@T)1)R z(g*M%bT@C{MxVf?8)L>DJ3WW?mWmrsa_{$@bH01e?diR5T3VYi2HY6rVC?}6Tqjaq z339LvA}l|}AI7_{o8QvOY;_#XUe3O6!|kmvN;aRpk%f!Qa(OPCi>i1S>pUK$Qi(BK z>@455E2ohA@s-^i)PH`j@`4_U>Z$s2s?SGuNq1(tVUH%0RZ49%s#2~un_DB(T1aZ4 zAZZiFluAlbc~LwlRw{X^ESKdX)b8Q}!!(8yV0omG+R4$qe)H(?pa)SwWHGiIPO>X( zFO*_wmSNX~I}BudF?Ea~qGP!@=FBpm%8vQU0r|{u43LMm4YD;Ohtx&64Dx6;otn>3 zg0*DBajeO3?wGdsQU3wgQ9~_`dRpr9z~cmAk6%TMd7R)QCL~0P(R$K}IBt1<2$Afa z3;yi>PJjYNNFUVkS|sLNK~8H*6hx!_k}Kv;q@(lY{T>M!w-W)YpW7^X8+KN3id}{u#(xL&2%`sL|=3DF5g{ zSG8`vrs>^wyVvUL{aRgX=_Gq%Iy$~e9p9C;0DZH7+rKm(hVD{o8$d(M;Dw>HrtnAq E0ebR;`~Uy| literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ucs2_to_gb2312.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ucs2_to_gb2312.o new file mode 100644 index 0000000000000000000000000000000000000000..e44781c99c37d16b465237e421be0951ff3a31a5 GIT binary patch literal 1240 zcma)5&2G~`5T4CX>rkO4RVtETfdxfM8fw{TB%%lj^6ON%1SL5{TwEu$nn;9z<5WZ( zxNzji1Mm_^9Qp=a;0ZW#L8#nvgPGXtMCpZ*cE4|CKJTn&ci+|YI%5pDF-XJG1L(R= zIKL32VG9J9e~vzhHs4l%B;#UnupwR-Kh|M?^P3`O#5*EfrsngDz=fa*N0G+!ZXyvI zz~%P*eZ6o3>0jU3-ER5!&mu4Ap`e{;=Obg@sl zFHwTEWYcl%VQ=bK6WaLy*=>|ji#I$u^||YDf{@2=B1Sw;@C6eRBE{%?(g`^3d43R) z?1Kyb>>ejT79*rz)$v*+=3GHe-z?4ok=Bdj;6^&iKk|^rKOvzS+<4sv2C(KU9{-BO zy<2XC>te2s%iu4v)xK~YVZc`bL~(HigV!*&jf3_V#X)`I|B4hIW8$2MXM8>Gb6kyw z;16xXx8UN>eHYhXtw8lcu)9nnW01hP>c>`BCw+L4_tWUpxi4)!9|CEaMCR7(__6i% z`7Lt=LD+Y^frO|9D zSA}3`db3>8jb^>xu62w~sjSxw(w$k3f$!45mu1huxKaXZQxB84LAp0QRASF#rGn literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_udp_close.o b/hardware/arduino/mtk/system/libmtk/debug/vm_udp_close.o new file mode 100644 index 0000000000000000000000000000000000000000..993116b2a2cc9f53d8f4e20588ef18de47fb6d07 GIT binary patch literal 1212 zcma)5&2G~`5T13MlC)Au%U=>Au%JjOp)03EB0@-z{{SvQO%CbFbrP$I)R5wA5D^D1 zJOURaUV~dD`Uvn8+^Qljy}?ZEb)23UY5mQ7^X<-hcK2h&s4~Vt8iO>C>O= zZo7E;>!i9Z3wao;omAfq%}MXb>>iHB_KdETN{_X4b2M?fwlmdgnT%!(gspAsS^aHx zE1S=6YB`?cStvZj36^bj2EaDa4HtHI9<|Cl&$pVeq(oSht*ckrHFhHuX9<>Mx0DAA z_;@-LRtHfyF7~D8*oR!$?*;IlB`n~b@ff%>qJY#{o&(+;4Tts{lwd7x3E>Pn6Jd|N zANmitjT&m}lBcEKzV>_q)$?y6Mm?Y4D<(8V;%GkUA~^1OaR`y@lMDXWJwkvCGNcdc zWGxa)Uq_$j$g`sLVmPFcj`B}El>BFOsD?CIw~hqXJd*r(blm&oGE%qZ>ZA<*px5>z zwi|a@(BX=1G?T_|LeUkr*F61zAK#pg!u8buHc@=*Dl{{f+R(;Nd7AjC) zUFa3<_6o|M_)~(blRiAl`)Q1?&ja)>=2f73F*moK;S(3vm$%Fngy52YUue#{!u)e4 z1@(>2OB%&{UO;_aQ}7#nu)GT!0ycWUjgpR^!mCofv8yj=z^oaKV!<#Q)oQcSGFyeB pQ87t!U<(spqlxdynSvQy*zH*YH}DMW##aE!h)KL8w7)nW?mwvadlLWv literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_udp_create.o b/hardware/arduino/mtk/system/libmtk/debug/vm_udp_create.o new file mode 100644 index 0000000000000000000000000000000000000000..3d8aadeac02fa963bb3adc19fbf191d64c2aaa67 GIT binary patch literal 1244 zcma)5Pj3=I6o11%K{PEbrhuEeG1Y+B%~DAuUJOtMR4S&B*hG_MfsJ5_)MYVp>ctP> z!Gr0kAHjp(IGFea^y~*{;;G(<7k!W2=|WGwWajB8yqw9eo0SQC;bKiEdI@au$&LpVNIZkFHlwNd9lYnz5{ z8N`>1#d~tHJ{Xy8!yL=ybXuGwSQiW+sa-E*6PG933Uy@lQ~ZQm8hH1-wCcx!>u(JdX6 z)^G@lIiP^l86^u!d(iJ2uTX-u6y37SUTb6-Lpu2X*)^0=%L9&_`o8aAay|!NMIUl7 zxd|p@^u*D6(gktcaAGfdvg6t8PWJTzq>&>1yiU|2wZJN3TC+tY+A)r00*;Z6^7kF@ z(C`TX)et7?R*=A&2ZH~J!2Z{4M(858PRL*h6MJWoU6Vr6d**lCoh};qmIv<^v z`Xs&;Aw0pvO9GCGx*`^Sp7+7;zk(<4omF=k??MI2`+&Z~H3m@(-0zs*o%H@$-qrhI z%?%Kp&-*}H$lLY0XWaSy#b0I%yl??-A|w^9S@E!iyP&>3#3790XHGzUjd*Zgc(6(v zHZ0iafKn~0IOQJ~E45v9Q3P7KS}WwMT8;C1si8IUg=$G7%?rcQ@I7kyqRcU93tMA7 X>RTKS@f>|D4A4ZMzy^0H#tZ%jAts4j literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_udp_recvfrom.o b/hardware/arduino/mtk/system/libmtk/debug/vm_udp_recvfrom.o new file mode 100644 index 0000000000000000000000000000000000000000..1df8e0351c55db9cd7400953e761c08d66578850 GIT binary patch literal 1248 zcmaJ=Pj3=I6o12?3ZiK#RRIZZ3??9Uvs4m^7Xy?5BQ2(o*n`RPZxxavby*rY_2LKc z;KB6NkKjRX9GdtA^y~*{;;G(<7k!W2f$biA$;^Ad_kM5Q%$u3xQk65tKnQ~*ED=D@ z1m5hNkc0sEVD|L|=ltwTsJ0RdRgSkm@o$lhShRONcEUe$xF7hg#8R=lu_A|y`0U#B z13%%jscY&h`=9wMfA(|XU=J?VW_A9ahntW*|G^T?!mo2KHeqRBxmi9MsN?RTs%xF2 zSNd=OP%ai9OUe3htamhhB9+r=soFO*X-ml{Z!?>jTrMSL<*b~6{6k!)rM239U@0`c z`MsS-jqRPMn{`-m`Iw)rdp6h&cFP@R5f)`}*8>LfXfiNbZPbQt>YlK4?LaoPcLvDa zmeB&aJsN?m4+#)EBWFSG3idCZlk!;h zZPb3tCUu4Z2{rjBpLjkT_blv2O>#P)my>zD0BLj)-_8@Yh%IadZOYjqC(0>~H8LzA z9>t$n+H%8ZG^mCUQMZB)ta&K>KhZGXn&}a|pve<7SjE8p0+}@l65nO>OSrg#&a3EK z#Xp}mH;hh+yn7TakE};;d8DpUYSX7!xjAf=GiG{-Nhic$Tj=6>%gjosjop7&W;Z& zcOYRvq6>1hsNj^}EmmrKijxLvxmqjat7?t&da0o{@`Y+iCDv=rQ1MTy_^b2@sE+05 Xy^G+5zQp?B06-IU6dy~MFkbRM@0N{1 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_udp_sendto.o b/hardware/arduino/mtk/system/libmtk/debug/vm_udp_sendto.o new file mode 100644 index 0000000000000000000000000000000000000000..a0e6c2f49c482d96da5053ff0c27a71acd93e665 GIT binary patch literal 1244 zcma)5Pj3=I6o11%K{PEbrhuEeF=#;SW~n3+F9s+BDlMjv*hG`%-$pQ{)MYVp>ctP> z!Gr0kAHjp(IGFea^y~*{;;G(<7k!W2=|WGwWaj`4v&t5hX>cZLbw8r1@NCOh5KUlnx|8>g6A#Cq2HA-*#+Ng7=4fTVL zIUv4NC_Io8wZX_}>&93vrBZUGXX^5%npR(@H`3W`QqCwDB@MZIC~xY`Ru5Pbp*Od? zeZRi7{b-{GK9`>b*or62uCXjx;oT1wM2jb3YH>O(sC|JeIX zF}VpQWc0+*deZrE+_Gagda{$*>`d160;G^4{k%@pBDKIOVp_9FB-#m%WdgR5j`9y} zZ`1Gz0o4#D>Xwnfnumh_iNN~TEJo-;mQKiE2@`wgkyVpI(!1t(88=svyo}ru4muy5 zm--~W6(Kyu#47@}iMk>dexCQh@4td4@19k6823U2%6ovm!!ZV744m(n-<|Z{S>Dlm zVa*8;UCetxTF6`Vy64=*{l#Bq3EXfAZX+ZWtyyugg}b1>J;ou7;^%fieGR#AUU;xd z8{#I!JD^kwDo(kbLbYuG7=CAg3T;wpQ&T{q8?6ZyJ6S4;q%l#xQMW=02X5;^H$qZMT?QlZ;Kd)I z|G}%b9-8dD^peVHBD;>Ag3p7-OKd1l_3`A{}1j4@D+K?>#`KtnpA?39p# z6$nG_>*|YD^L;59ztamP;eP0QDhU^f%iO7U8m>m3M{1wjvDk7CE~1xOQhx=h^B?SP zyKw&Vtg@?wJd9S)DsKnY_~g(Qj@7k~yUx)xRV^0x^i*>=cDs%{(W~jSZuW(v?;087 zO=c&P%Wdmfp5+PV|V(%w$Tjb5B49mO8d`tny{pWS%j?zH`oof8HlksOR!to z0|tCF83?Wx37~7tT8Y9QR}c?~F#k-61)|&hRYo?r<=0j*)^|+!n&^cgDgQ zd58KBxQ!et?UKi(`Zhe9An4gQ5hI>W@C6e(BE@Jv@xs{ed42$q+D8eqQC=fJ8Y9H_ z^OP2mm2IF+bJTs&dK=hPBOc|Sc&Or^&>#)flx__JsClB|-_Ve6N=6iKP4W~Cexuc% zc~X;H;%mNm7#BA%xQwyu*lB-J>{KUpRx}}p3I8=IUCQ~JKOTf%fBdeg8BZO^B=u4yxH~&)hm@|xn;HT r1+#1s?X@E;{FN5|D|Z6cqJXSl95?qA_YhkFC?O{B!O+`^;YI%i>uG_j literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_update_check_launch.o b/hardware/arduino/mtk/system/libmtk/debug/vm_update_check_launch.o new file mode 100644 index 0000000000000000000000000000000000000000..330df45920710f5bba880ce51a7b398563cce62c GIT binary patch literal 1256 zcma)5O>YuW6uocw5ZV}MqY-e_iPi+fjzcBdxRK8RbtSS~%9Y$)=$I<$yb|SITgX8##Br7i< z{p$z2(JuY|d8FSHW?qcfj`TMJb28eqT-)sS?CvXb-y9k3>9~G?zbvCk2aeSmLe?5)`J(= zMRqBWU`du@SEbtw)bVuSS{;n8!(&e%$KF?6`>hKquFC?oGaiHL42h6Br{+QJ4hIAK z043<9TCVH#I}_I)dq4Ic;Tmdai^HCl_POO@3PBHF#u)W5g|AppFj9`bCtU>lO^*jK zQv1k*Kl0-Q$YO@{i#p*&Vu3Zp^vxC}vC({q8R7%!sQ%E4JPYs{0eOffeCwD%&ymP~ zL%{DA&j{Tb*9jT?Mb!2g_asVsX(1oS$u&%_U@nH8))&W4`y~DqAr!Fifq>V9uizps z=7aEumf^R+%-yFr|Dpr=1tB#rBVup`$AX_*oSpQcS=}!qSLOuKay>XZ@41BgJ@XUG z^NU-?1pzn*cMy__zFC(T=)5!=Y2ThN@qx!_U)LlYPk*>-7dBkj*aOulYd932mg|jO z?F==THKS1~8fHV+o7I-tDwd3@N#d8bYvKzv@r^lCFi$t5B^9tIalsXgiB$l)XDPfy I25~(6e|b`kLI3~& literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_update_check_version.o b/hardware/arduino/mtk/system/libmtk/debug/vm_update_check_version.o new file mode 100644 index 0000000000000000000000000000000000000000..b36242a7558ba73b394e5ce903d79d559a55d8ff GIT binary patch literal 1296 zcmaJ=&rcIU6n@iRmg27>h5{QX2DGHI*>tpB-Z*gdsQ-c<^jPDCgNeS^*=b7?e96vx-}k@Cw4du%G%KA`l+}g-MJA6{$2RyO?vF~5moVEP($1yL; zO}Rdpy`SB!8O@!|l4BYb%d9*zc1^oct#1Ql)9E|WSfSpuE2h04&Bo(Vz3Q0JMJ=H{ zPb?&smgb{LHK`^bbqm)knWb_S*gS^*)Y|IpVrKQhLIDDvARA&MzEO6Sjd>$%oK3JP z&rJquW54E<%IF4Nypx!8-ItR-A`6m18H zBSZRrovcM-8EY8RoJAthXuU`$5(DWdf6w)T1^A2s)sQCZ=8(XeJCgs6fw+T$k-D(Z zNg3S0#CjKrngmJj>EoAhaSh23a+mO<{awb7&Po0&hG1dhH3hE8x)Mv@&->ulU&)jA zcB=On@2Luu_W|{-XAGtgSY4ujb<+Dg`EDBVOb=i*nD@c;Q+ZKuugeXtFK?L;c;Ot# z{?eQg4+H9tG&;8@5}+qscQKu7*n{I44_B?gtOK)~pz3K2ht#8VF2AOoB?lv`=a*Bu yk>|XyQZ$OGWqrjU^;6R^@QoVy%ItkG&M4P8({bG37VaxDEH2mtULuDuHvb=Q38BaU literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_update_download.o b/hardware/arduino/mtk/system/libmtk/debug/vm_update_download.o new file mode 100644 index 0000000000000000000000000000000000000000..3098fd9c388146df29b48a485e6a96eb149e2bc4 GIT binary patch literal 1264 zcma)5O>YuW6uobN3Zk(ss8A;r4JIIVGE@?Y3k{`xV4O-)NbJI77+@kKQ0g$Kth(_B zxNu>*>W`>97AF3I`U_k(aaDK3jo!=5>(JJPFM02rd+vGfzK@x`4UIF#Kr{v^@FIY& z69jToLkhwWgvpneob#`Tk;-shh<+z%hAa$3GC7df0PPp*tV z@_jxTOXFZE^gLAly`7IOwBclaQsp0btPZK;?<`qg`+3a8CR_}b>ZP|meYo2)Y*TOb z-|ck!MhlarV)1bzRqYS0rfH25rA#KFb!;=Ss%F(U*_CWQpHAeIoRWpYL$n*F(dYn6 zBMlU`HXqg2H=nIkVNMFN5L@&|*>!f)7h`d@#FnK843xpBXB!Pf+j6iim}Pbq+k9_> zf_pMRX$%ISSbYk}omFz6H2b}txq}w0r5Lttbs9t49Jq)254epUy7oEOOLyOOIf38h zw-7@vCpf}H0+BSDPre}bdv5GQq;@bJy}@~6fDB6HpY@4a0ND$WozMH>&Y8SZuYIbWUtfG>j==|)rf)grp707ARU##i8(`SgvfT|8Rm{(kg2OO|NiX-Kgoc!kV_Blkv4_>-cBt_-|Pw d&@UFDZO}c&@o`@v#=-z~#3lT2S`_1h{{?=@l34%% literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_update_update_file.o b/hardware/arduino/mtk/system/libmtk/debug/vm_update_update_file.o new file mode 100644 index 0000000000000000000000000000000000000000..4ca93e9d0b843cc87c29d3d6149765bd61a5cad4 GIT binary patch literal 1240 zcma)5&2G~`5T13M;?hb@TM$mEz=t5E4P7}U5)ndz{5lmbk(wN;UR)=2Nkl`6;~*lC zkaz}O1&Ko?UICthBSBnxgPE*14pk0}wEKNC^X<-hy!)YIR~cgE59~-e5P`t(eY|Y=hlV?la(nQ7>>?h=DJ# zBbo1=@xXf<0LOE=z*~a>aKBFusk1x>yxs5hyjLi}THFl+zuOuH-hdANe|8sT)YgSi zPQ9&#oInlvZN$Zp6MVshfk-i0PdW|9z0i*#lD!u&oy9K%$Y6x@vpQLe#FCrHY0WML z(P%$?!o);6%0CHFL;*e_p&HU;UHUexc`oB$k%;>wB2u?1bW#StksVGwQIlNKD>HEw zH#aeO9b+pv=zIwr)F=6^NFj%bk3>R~b)_$HHm<_2KQc}jn^cb?v41L1UWH_oM#f+h z=jeN9cPD*(l8=_ef$m3SSMw^Qq9ig=uRM)i-Cy1^A&9{>;7CbDYt|GtL6H@GJCY6} z_3>rsWBXuL!Fle(kU9ZwmrR@r&r7xXfjM6cj%C-21>31ttBp$2X%>oh#Ubqr mFL3aEI{3o;5jb;8;W?Zd751aeXWe8nK7iA$ z<-11l2r@suvRmEC&+jE(&_zK#QeTbq+2mxRKR0dNd~NH)2?o__wIpTQ6E736}Phw?q78>Z140?VQrE*~D;@6-TDWDq+q7eMZhM3R9YiE~ z?|?Tu#|e-_5AppxUW>?FS5T)ld*no+e2JCjOvI!3Ll+${z(-W51{Yqpi4LquC%cl* zI6HUCu{ke}Cf^%He&g`>h4TmlL~tdBixhNTKzj=Z?JtId`sB~|2m^EUapC#6&C%}< z!7ti|C&AU1dnV@hSD<*JWUZ>;RDM!zwhonl zFhN(fR;8@ztwy6=@93R!MXT#Xq+bBOOda2rH3$8C5!wdzF@=XqcPhCFpdqI5;yfiA G5Bv{=Vu`W< literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_upnp_mapping_ports.o b/hardware/arduino/mtk/system/libmtk/debug/vm_upnp_mapping_ports.o new file mode 100644 index 0000000000000000000000000000000000000000..e6e9ffda3737ffea5fc809c9e8b0067291b074e9 GIT binary patch literal 1276 zcmah|&ubGw6n>LmCPuNpq)Apc;GqY>e?afvJQO_DTkxXqWp}!13HV^<``-7y**7~od$3Uvj4_bGAO&6q zU^+=KJ2s>s3Sk(1dMbqY@^QWzQs&DC>mS6|_=2+3zN#FG_X6%jzp2WKa!V-+I9(oH zIesS&#pu{~94{C`sSn68iagd7GZON1$Lb+`eQ84me{iIE(6{lc5S_hXj=}pC9{k@ zZX2&{;4R(Ofj9eo;8u?ka%XrJ_)f3eHTKbhy|`}MR;M|zjq%25^Z$>VXrZGIxmG&= zJ(m*%Tz&&F;&Or?SV$m}M(fEJ#&O%t{fHDt&kT@8iTsm3*^AtgtH^218i^Q3 zIATQHARpBqy6DRA842}}A^Vn5z@DbmeEL4J%tZf zQM`=WH5|0R860#@@?DX_HWuCxaYOc%xx`650KflAozOq-?kWCr9jG3FxK~ETK*8C2 zkIAQ#KRB*?OM*c6!;6dc03^L4GN)hrOuP7edCMGwA1(n$N-kP6=VP$$l*Tii+p`P# z3pb~8o%P{7^~dEqkhCG$0$wSqIOU%d%hfG)x*4=mrCP{Ww5kxbjk;FP7b+VXd3Oz4 k!~avmKg=3}HnkP*gU&OKn|+QLivlzdm+%6$D8~=~4_8u{U;qFB literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_upper_case.o b/hardware/arduino/mtk/system/libmtk/debug/vm_upper_case.o new file mode 100644 index 0000000000000000000000000000000000000000..b1a792de3d682c3f399a75da2ca6615139fd323a GIT binary patch literal 1216 zcma)5O>fgc5S?|LkhUVURZ*Q{frSc68oF{yBr1diX+9}#gPI&F^11 zaN#F#;l`ifR*C+E{tGS~T5;(OW@2v=_ryr+_vX#>&U$zKxnz|YV<3Y;3Z@x=$JQj8wI#nIW2$a+QWX|_3V~2a7nKe3XhFcy*Kn)t~W9&nT%m|gllY>S@V5% zGrPT=HgY`2vygv?cE@#^9bjps(fq;QqegM>`DPtrN}SEHWp#z!WUCR4CD|Igtvq1B z2cxcVnux;lu`QYBzU9LGD1aY3!U5hK41jw*O30n%IpD2cx9h$`3-;oU5MHM_6z+f) z{(o@?ZM3biz)pMnGT;Piz;7YW1)ShJ77Rqv=za3Vaoh{?2qMK7A0|)#2mvyvkbl-E zdy!dk6FI#j&x+<-#36%xRDT+v)W0I39x`O#Dhk-MFZG{D{QKl9(zoRMqz(QcJDg;G zPfE$J%;+jkZlXAk+6^4EK3XsBll)eski)_oB0V%PT_o)&Ib)dQm z^c~Y+u!6~xi7-1m`J?0dq>TCMG(mQ?u7Vz_`~9qmc6EMv%X~uwuEBkzWDI_9v8H~h(SN{cX z{uADM=+VTB{uQ1y_12rd$L=g^6MV_c`@Z+Soj3Dl_I*{aF~&d|gA6PfK*u4W!d#Gn zRfxd&bL?qMe^*H-Z}h|Ii)pwM{-&j~X*f-tjgOV%NIm)_+W6Q>Bv$%x8b4Fg>PyJ{ z{LXH6O22-b)b7h-u8-GGYHx#YEOUcQOHPkBE>u&kMkNqu~&@3><55 zQwV#|oeFDm?tuTH*Dyyd4!auabKAw_f-b&_KI&p}UofGfrx<-tx(JS2E)Sq5``|cl zcCHg3hY`~Ib+Q(TCDstrH`^3MqxBMVWa{3F*pQGibfsD?CIw}AnyIhOIS2%NX& zM5J!b(McKnLDcb>Q1gh5T5n#g(z|y1z`s(oFGUx#;3Dmft7~%_Z)G-QS8E^x%lT4TZ%E9&j^bm z4FwOt1Mm`bDd=hP29y*uN#_n`ytkJla=}Qq^Uch+`|Zu{o>%o6V+@2bNWx77(B?rf zzaS)G6(pE{i@c09K30ClHxqkVz_ zxLTWksufNkd42i&*E1pJcu70a-j9r_b!PO<-nefXr`_CcHn%8iuZ^&$MQ; zmQKt1&^G0qnpNLrGuc8RCFhmAl7-?fPUx7O?hsfCVX%07_`Fp)JjgU5An#^P*?ZTp@wP$sjH-RYvYE$#;bS>~Byn;&dY`W?FiN_R2=#TrvU?5vUpr8gdp z%r{6uEu~}I*04LZ&5844|KT1WhguwRxYXyCgUJOPd>{RagUNlzf{dPWG@p19evh5l zkDlx^ckalK6CjNl;(K{Qi^u}2h-nT#48C5B2#yht>MtDcq~R+9(hw$e>zF{zw<7-o z0l!;3BY08H6EygPsO?5vlS1PAJo$B8T*c%a%ti2{{jK9ieG>nQ5caWfPQWptD`Mfj z`2bwgHeB;B)ZGx*_bQNH0KC1T-O@SkyHmWY6F<19yJd{GZvsTO>j8N5Po3)>xw+fx zi(AGCeh5PbA+c!AhL1ssmlh-S&D(Q|hfbaP8uj70?BOas*s)=!4~kw^aVWkj*Bi&` zQZ5*p-Y6Ayqfx6ht1Y8dEa_E)sHdiF;OjK-eOWUwmI?7*#&Kg6+)r#3fbQ28ULKud GJoLYGBZt=j literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_url_encode_gb2312.o b/hardware/arduino/mtk/system/libmtk/debug/vm_url_encode_gb2312.o new file mode 100644 index 0000000000000000000000000000000000000000..f7481cb483522c75bf642e944608b719d8d388b0 GIT binary patch literal 1248 zcma)6&2G~`5T4C{sj4(p5lOL11Vu^+v79u5s27@Fr@|$u$syw6I*HXpY8r4HM8u&N z4mki!KCfwY#ux}=kb;{Cpu>Y; zVL?d2DnwxZE&4Lr{8;^&*p&7LA!$weQimtuOGQdc4<)#Y&*vAui-;ONh&0}G;_=u3 zuGZ$C>cwM7U0?qG^-PF4KB6A0???L7I@Qgy-neh-C*AyRF25+NmC9Z+)f!K&o@vdJ zY9^D^hPIi^D>>y|E}JVB)5(HdkaJMl#R-OKbcevw2!o}g!{_bl;X$?qAzy^8u#Lbb zyUXtR<1E3p*tYK}19>tV*+v(=ZE-&k$TCl5+x%dI+&63k%Wo zA3fP;?%a_dCqM=>#P{-q7Lf&35Yrrf7<|1r5ga2P)n7Q?NyAqJq#;b`HZXyjZ$sCur~oQOAwACWXZJdGhPHxPr+$n2X{=`&-9{`Xt^JA?#z}oPc9OSH!}5 z^8vV~ZMf!NsJkJq?^PhZ0C;;vyQOp7cc*w)Cw_2Icgq-W-vo$m*8}kApE}oj?dEQ; zFK!tp_#q5ggv6pb8$JeQURsRQH*e1=9y)dEYs`n^vJY48!Hx|(eUP<^fCJk*Rcq_*Qdz6%L_INW9luWeC)m~u^kqW4mkHch755Wg1)%%2g_lR8 H7!Um~t0#y5 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_usb_get_cable_status.o b/hardware/arduino/mtk/system/libmtk/debug/vm_usb_get_cable_status.o new file mode 100644 index 0000000000000000000000000000000000000000..f5b84e6a3e73981d1af44eb913b663f1765ebceb GIT binary patch literal 1244 zcma)6UuzRV5T8vhHMNDNRq;}#o)9H9cDdAmK?Kd;OYv%;$wTqM>m@x*pfP&ch(WhF6?>95Q-PxPnyH6Fn$`}J>4AKyK0Jd~uxv3xx zYY>OT*Y#)X_J{J#q|t%2_8lhrd14$H$F2B5y!PT)*ROP7vT<&lKzj0nrA~^!e%@0B z6k59VuICH~E$5XdoVMFK^PGWj#c%*%l}e9{bfZ7?+nzr%tW3tRyTUW}&8+!0yO+)9 zca0p+@hlV`;Cim-wz|M}k;V!~hYy?O!-KsBtVH5$m2GKP*)?`OsDl4ESKw z6K)Gp_!2vc`Q8~9-g^Q3)DHA=7+cZKk~t)cL6+y85~ zP)KcE2_{f)YXK+F0)7K=HQ)qeOc;n1qxqzZ<8vqQqljc5CCo;7ga8?gkbYjLYLQrR z6FJS-A7bH|enW{_ghBe=)_%|f-KFNsEZAzVz!5?JDGf&ne zm-LajxQ2_H7`%+J4SZ;S34Ewe>RpjS4ile=1g7dLU*UXQgWrEuoG?1A9!8=I6)3L( zom*%OcF+mmcYbx!$ENvEAA{SWgY05ngS!iPS+6{cU0h$?GAW3{B~a%}bG9OE;qFo2 zUe4B%ee4H5^>s6X;x)_#F!|*OXIdAg^R`uw+r0}iHI(Pk!a$r z58$hKN8&5!Q+O%Ho8IX;%nl1ph?C5G-#O>oIWuQw_EW{KGR8nP1}O+F09zW-+*FW) zHHbm{>-w{G`$PF=!t6jw{|*!5JU-UOF)MZut35w4j4K_OY@C~?ked8p$p8=La9(=CX%Bthdo3K%?RfxJsr1N9HTpxp?fE0qN~cY`D?D>Qlg+%%?q&1& zT{FjXJPU;fIG^jetuC-#q|w6h;lpP6@L;b2D_V@LvMv28yT-0Z43=QqY)8A#fDcAJ z;kFQkFR`PT@4e!}doO^WxxxkB8VrE@eKJU$)|4TU#Q8~Z=r zLJ5_1C6H2WYXK+F1AYT>HQ)qe448=Iqwh%-KNwj8T>(ZGP7h( zGD)w^`E{H;gU-w7+rUoii({ucsl6hF90ooU37X2QY=!fF9e)2+e!|E!d+3QQWT3bX zbZ%i|u!Bap-}%`|ADzZSeH3no2C|EB9qul~Wxn#vcX57o%cLLzmq48_eY2&pg}X;} zdoi0!*0CShRM$-n$0ZM!w;?GYc?R4rWpF4Qm1_0l%rZGRmR&CvY^PqWHY!c0St!~S nht%{(z&GmPEAvO-EJ-)5X#y9V$8{NN0FM#3@e(~H8xQ{<3!saE literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ust_get_duration.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ust_get_duration.o new file mode 100644 index 0000000000000000000000000000000000000000..2fe02b445caa1a0a377a0f8d10079b8e5101968d GIT binary patch literal 1240 zcmaJ>&uyEqxc!EM*0Q(-T4OK(&FN7<>XeoSt=a2#?IV<6 zEzRQG=`@Di9?ZSmf5PjSqxSk;4fVL@Vsc&=UqK&qF}W|8P|*`d&yy~I^QIen(9`%J z+{B7c36MmF^s_oyi^LM^i0PSKB5}}q>tiGg=_voe^@0WXgn(+uA?ucrz?yx@e?=h9 zm0+Z9Rp_J){vfJPB2kk<(knCkMO<7*atXN=oV33XPU@3qE-Z#!q(imTz28ibKUf4XB7xkV^xcT+v zDH8$@T!3waq@rim6gIOr(YNP9I=0luLpP?rt}193Tw1LOTO77ppcy$GP3CE?TshDe zNx>``m2Ac^E5%~9P%~?ptWhvYNq+&nnd)i$qEYIBwL4 z124cs@DhkiAEIx;fdhq84@fYR^(JmOFw*Wf^Ub$A_U!J*idAKdfiwnLm`4C*5k&J- zK^77ahvb*Ui-h%|d_S#qA*)`%<=v~~xpE#iV+XO?tCLjfb{8&hUTLo(`|IMzx5sjG ziDt?i5A3nivER79-FL@sf0{B&rClxC7@m4<*PCc&E~i;N-_>?>Lw|2<8->EAmgjkH zK=BDKa9pR=1Gb57w0L~@v{^np*lxg*5@*Y7Rb69u*m@+z(k#OsC|eBpXfp7f7NYM7 z>`Kpb``mZWeBd3&cYwD>BjDbU0#X}154=4b4BWRU!CKt$eXrL#_1%&DssH0clu$dD z0x9*h9QXuk;NL@B4t#>on9vZ3qxGbV<9HOr5k#^x0kc^g9Y78l(uZ}j7Kx>=qfcvg zh(x3P)~24ANJshS0SXr26FO8wnygzx0&BjL{8x0uJra!6tq7fz!FTjdW|62#A?cM6 z{~H4x$s5Ss!a?7c#6f+M|B5bbVIq7?vM%Mq7Uos>`6rxVX%uRjrw*Z z14N3QAf~>qC^#=ZTHb~YA2vF`t&)yY@nxx2Ki2=zfo)p#{i0>ptJOxOX*Y}eR>dY6 jy?=a_Hohxw0`_77(Z4i)4BeYl0-%7H!3*<@Vm#=-?P7jY literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vad_is_on.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vad_is_on.o new file mode 100644 index 0000000000000000000000000000000000000000..bff3f59657756f98e4a100897dfb8642f8064a3c GIT binary patch literal 1200 zcmah|&uF0JFxWPOLo5ZzWHX}?3*`Vt4@tE2Fe&@VIBeO${<#l3bK%d z1f+f@-z1$cm4_L#2U+71uGc523+*Cd$M@s)_ebgUS`V&oPs|UH{d4*2>Z#gXp`EtR z2JV^Hb^9ZCcrvB!a`~m1Z4OU^jvtIoJC`$^zVOW*D{pCT8PZ2}Di?{BZ=p|Xc8Ely{Zdm; z4y2>`*C9$4;2S!WLz&83M*?$xQv45eWDiM3=~kpp$>0jTqgf<#Qb>9&!cQ=;ki3Q5 z9sKBgbY7~H`d4(ZJpqo%2~FiyvBD^C!0*3`C)B6e=ZwCPf#!{cTG46OP);?K7Tuln zvFW^;#TJJ3d4S%{c>|~~<|gy)&WM})t1goQ9pbZop*5=-o82=hsBUy$$|!yp22|G- z4aew%lYRziPZI$+%s!Nh%U%2=hU3^c$ b7~JT_vSt}P0QE{b2~b4bz$SS`F<$OJbvSot literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vad_register_callback.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vad_register_callback.o new file mode 100644 index 0000000000000000000000000000000000000000..4fc2a9c57363e472f1d01985e615bae527cc7ae3 GIT binary patch literal 1256 zcma)5%}*0S6o1nXEFcO*V~dS$2*zS%vWrb@42hP0ii=HX58Re*yP=J(mF+@oJjmU@ zz{G#U8wYNBnF!TVb!U?B* zK?3F>0_pDyZx+l?xp-`~8IHq~@I@jHm(lC=89RewWG7Pkx*v_sHR1Bsbs(-CK;r7+ z_pkE;S4AW)7S9VO9qYtySgv!}>UoZ9)$Mk>X4l{Ol43UdLQ7P-$8Ozm`&u!X)XbLW zXq&pB9~m1)I=!x?c#0d4d4>yY$F8-2ts@O*_I96FbGxrMDlij>uvxYoy2I|Wd%-A+ zu@&|p@RR}X^*f$jL-bsMO~qWN%{}L%2fSf>Ht<@n2i)zFLu!MkfY-a7j`JQRSc}`9 z=eBCcp3{>b_aE>OHPqf2sihv9k`sg^zmGU8Il)g%XowV}^`wj7cqIKGBH5`w4=3>} z0g@OZ{isgWBDLZ=a$2)VL9|mGaU#-4NBNf$Wf;C8p&H6m-4X_{<_8u3fkfOZ5mCA& zp;I#WgKU4`iJIh+J}?r$iJR*foWs~{9CW@#9MmWEtw>=D6JLl(Q+1WEa5Nr*tG_Bv z81$ln;&dicU-aJ3Ux3x;yE^etwWfe|6{}o6Lvc@mOBeqaF*J++W=?kqyEP zFp!dp)+`4Y?1+>)v12p=M AeE{xIqz@-eAV-P26x{q}};u=39U3+1+<#tHKxqX$%aQMF5rv;<^cg?K%I=hq2 z=ePA7&+#l2?&1Q+by_`O+X&-@!-IRx(!ryh1}rEVTV(6%2D{2OV+odIDRy1C!+?(_ z1K(+(_dVge5_xW)`|cYbc*pS_;H}XJxHqJL*jb(f-X0DH?n|Vg7I%E#>$Q%3cNG5A zf4CdSp|&oBTeeuUny+O3GXim+L`L$~1W(f7H=?6y zBs3``z7ol+_;C}HOPITYgZ8(IgZd=@6(QuX5IrWTOSPy)^D6xM6RpJp^;sr%L4owt z3%#PHVdCNpK2A6;y3bAO-y24;j zl!BT1_G~V8!kGHHrrGGMP>8~L6 z>j&t+e{RV{KCYC$7LPmDvE8)#@7i9YWpxj&?!mz*T*~Dh>9K0}$Za_8KrbZ{y4m&| zealE0Z&S(C_I6xP^E6LE<^fKy9lPEJ7DpP&?Cn0R<#(SZs}NQqY=Nx>ud(awMnGjz zw$3(``wV!0(DCd#qUQ>1N#;6lxaYk0fH!T=243&?fxBHYNS)$o;Eisl;~b&{b8*}A z+;;uQbNc?lE&#VsL*)(oTB`9&pA!UqeiL!Q=LACx=!oQ_`J{_rzw6rpL~0)ej7M>m z015Pvep)AUkyvsAIn9xGM(e5AWg{KMANwf%pOH`w*<{`_IxuHX`oAF&?@D;2ZdK@{ z4E`e9A6p_PnWR^y{FiZY1D%WLyNaFmw}PGOB+rTzb}(>4#BVaMv?WgagYf5{^b-a~ z*(aXBOa_VvXKF>erF+~NPnlkw^r2CF97cO%Vjw#o55k?9xX5RYedpJguS^I6a0!w~ zNkwzk6b4xl8jV!9>6(+>_TyC7RRza+AD1^^(}T?>a5HD%ka>|SSN4p#TChrHC7Us= zO0ifi)T~-2YZfe$zIHqdf2W22%N>9B zX;=Xb5?@wdtXl6Y_mf5s(&{&u>Q{+NjrxrD(ZlQFEm?-~c$T=s2lKUXO18hM`Q zIVe8DbsX1e_kryqj2BOi9=9q-hx<)fQZ%;AHq=|}HoF_sS(0tBZDo%EA58|n(?;ui z!uBNc+}GT9-}%71j_&|(k4C_~ArVsNcpi9XI2gEZP=d9%sqGYJl&dT@Emr&loV!l8^F9r{T8~@EBSeAB36D;_3i0=plVrCu@;d;w)my zIUpwvS}!p}Vj>;Ip9NNU0X`w18gj_GbT+JcF8yB-i2q1X|G>s=Brl=i8w06ayzg+I%4;&{pb01Y{P^Z)<= literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_power_down.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_power_down.o new file mode 100644 index 0000000000000000000000000000000000000000..bb08716a021df63843b7da96010389ae4c88d1d7 GIT binary patch literal 1236 zcmah|ZEMp|6h1diXXXa$reZo}2JE1-Hl(v)5kdQ!4l@gDKMcQQX&Y?8E;G$Gi^Bed zKSjR{{0sUk{Ak55`=;mQ=JsV2ypa1m=Q+>4=iZa#qH5I`V;}~DG)yA^iwE(1Xh_2f zD3JKN`fAnsSh=6ndXSdC!&tpaTuPUUsq88BH;1Zvs|Vw?EA0r<;~y+_RQmPvktiV0 zRL!%2eb)7Sw_~4p=dN#ez4PNRZI;W=v~<%u^*gRV(#%Xov-*Ln?HW1beJ-0T6n3<{ zp4W3we1Z!c*J<~G?I4X85B8t7D*JocCM-z`TV@;bZFYy07fjblz`#(NF z3$=AAvQlsB5hsu%eh+au;sjqXp&^n+>&d6!vmM1TL>iwsOlJNH0WzqNf7T~zky&s9 zIjz|x5eMz3hKx_-qx_2qxeD+Z3Dpoo)TO&&%@d)2L&Co&t_a^c_X!*PL3TKacufk) zFU{yOZf>A>6SXyb=zIx$s88aqNFk4j3nI}Fbww<2R+r)TU!fDm!s=5cHdlf2@?5Xz zwDcaQ_nqCH{P8e9-7yYZ(*W7^ybKTL^1NPUqFvu#d}Z7agBy@VN-kQnAu%ZNR5(-L zW_wO?Kgv^I*Cm`6{kVDuQURp8pj%}Fr{e2!y>VbH^nz_#jZ)FF8?{=q+Ok{4l2x_I n`qm9>{5x&@zx)x{iwf~xCh=eeJde5p@EmayKc1Hq<4gYsVHt)p literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_power_up.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_power_up.o new file mode 100644 index 0000000000000000000000000000000000000000..58ae85b6c0abab0cdb6536fe25d59bbfdbee3769 GIT binary patch literal 1240 zcma)5&uaB?feQ$RMXzRh3%zW>C@0)qEZ)V?>v@&B1gfU3MECOh_K_Kf0 zlCTIN7=DU8iD++&a{NX&C|{7_R`9DTr(`%v91jnqgHR>>I9&bEjKvnZa1=e3WaSwo ze|%#%oB5yL56gE&F%P4a!}5M#-|q}8v#k#YuT4uI4>4IO6z(g@`e1CeO>3f5(rHEO z*`~6gX4F@i^~~mGO3Csp&p_@D$_>+K^?;?&4dnKA?lp=#+v{}*N+A|z%l;L1kzMx1 zSezx;Rp~YZKAQAxqlIW&E_Q`ynJ>6)zOjLK4BG(S8jXNk0}4o;;aTAALBDUlLj-beihTtf}DH|S}p#|_UX@O%Ch#IWZRe8z-=NF1#vT?ogT7yA&&-n%fJ z-KzvhBSZRmov1}(;j8G=nhhe+XulQ5b0^YK{*i|+3-A#gsv%6&ts;Rn>1G}Kg0uUs z+*s(AFcfE_%x@e`ay%0{LP?N_=W&sWzdPvzPJWukSe^ywozDB=`iZ<-Z+FU_-e0^j zSKxzl&K;48)+|d59!}S~eVc!a)JN0HQ(u=PoX`HWybY^1tagBF1r?{<(?Yejr~X3; zdPS?{bDCZ&m+Pg5-pJ*(l1{?srmf?jspG$8O+Y_egpRR=BaVkEBE}X0=xrtN;b;`& Gh5rRH7Kb(f literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_preview.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_preview.o new file mode 100644 index 0000000000000000000000000000000000000000..cd550fbcef22eb6e271a898db20024d39503ddf9 GIT binary patch literal 1232 zcma)5Pj3=I6o0cog*K_QY2$)KH(C=~>}07V5@Vv2zv@;R;J|HNU?U_Vb(x~XgBL%9 zehV+&dT8Po&`;s5sV95W_m~|(dhsPQ@ArQ1xASJ-%zP+XCB_&iV~~Vd1aK&WP-Y@X z!U}{T`*ro%s`b8*h~4Uj60j5co=m`b{33gzorKGgr;*C%rmin{;XHbwC5#u4Jo~|J zH}}teo|g7hA>T*Kr=?Nf9(4wu+qRE9chqy=Qm&lOKQNN@!LiqNy|GbFr3|YlTw~8n zn{U#)>1=k}$nXqLL+&2R9oK2~fNdiTyLDL7!YsnpgBxswtn$K<|X!az?PeNVbDjyrxFKu`8jy6G&B5g>&O z>F0H-7Ks%$5z{y7ylA}*9Lh*X`A5E2{3irdLz${uK>}+YDgGM*d8Z_!bZb(lWbhkN za~jE-6p~(>q(qBy8e>R%B;784@^zNxw@R(_rj!mmGyCm)zppD}@d zDo{QMo3k_`20G3Ur`-JNqz_H<(=^6(?lW7=2f>&n5y^Vilv`Y1-7+Z%z!lg*NGkef zU1M{5lYOg6>13upw*8p;x~5SR7auKe!}si0 wFE;E(Zr>`}qYuG7=CAg3T;wpQ&T{q8?6bIcCu6wNn@gXqi%&14&1g2Y=lHamuVyM;Kd)I z|G}%b9-8dD^peVHBD;>Ag3p7-OKd1l_3`A{}1j4@D+K?>#`KtnpA?39p# z6$nG_>+17W^L;59ztayT;eP0QDhU^f%iO7U8m>m3MQWehvDk7SE~1xOQa^&!`44ut zT{!=FR@qZR9!9HYm6M@$(i^!>*TOz>d(%|4SlriB&C#*jb=-+wO{aBpARK+q$QW-k zyO~^WThH<=&p`eGPOu%jGXS=YW+;Dn@UT@nc)Ht!B`wS%Y(2QaZm`WjjKx`k-O_d# z@bP3Q><*%ECH9r&IIz%;)kaBSsMMs+(BzG9|U?o^CtDoSzvK}^~xk60M~#%3bAO;y2fB% zrlup+t+C+So=fRKYV zP$2bf{l&WVv357D4In4~fVp~=x{xjuQ#n+cuTE9<)&S-kSK1lm=092XtaAD5p%4(( zRL%2|ecm5?ZqN4I$#mofDYIHV&~okZ)a$w4Of&O&%^Lcywr>=S_l3PeskEyV^`c&Y z@?)IfxK4KnY!_j&d~)=pQ#(4`Yr~49uvNAtZ?oHMC!w-5%dmUWBL@0pHu9Y=THoV# zAdu(2(S7%W4|?D69niaz3FzLK9AX#rBIv#GXym>{3To+&?|Z}U)ORQ1Q2)30kwPV1 z38_@qW{AniA-;olHN<4TVnRbpF`7?21^a{0PoSmtiJQg9uMZ%P5#q;rLW{@(8;EJn zJ_WJSdfNfw1Mw*TEVMid@C5;Bh$eLDY^eE8#J?lpZ;3|)Z{KUlR)k<+B7RLmmvZqIkIV4;Pdt|h)T2n^ngZ#`*J?$(-9dVE z-uUXoPX_sD#Ux}R2hnm~26{hH<9fA4V0nG<$~YkbH-J70v1rbg#NdFZf|2TWyyQEf zPj%gta9sYhdJnQbWc#37RRf3e%WAWAV*JAc+q7DhvSqg#jds0bcghv3ZWHab>)ZG% gZTwf>4D4kAUcWSMu7rC~*8rZP&ESK1PCj1rUjdYU_5c6? literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_rtsp_local_save_start.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_rtsp_local_save_start.o new file mode 100644 index 0000000000000000000000000000000000000000..deff46abea2da9e06367aaeac7e8cab3e9b5a4f5 GIT binary patch literal 1288 zcmah|Pj3=I6o0e)DYP-AjYdGC8(R&Coh+3o@uK`k-L|IXz-_z0Mo6IG?vzM8^y*je z=Fu_At!!N6^R`vI#MC@)Sn7EdJ2f?peB9(yi_{H#4ISp0AFT=Hujc9ba1Lu(oC7~Wd z^4B-E(J1`>aaMUOi+Mg$J*$lR#;858t(IX6XK3^WEwg7h=EyP}VcG(qS}ZPpWWb$qUzknw!ghT}BHQY5VZ9T;+omvqHysDKJ)nTp8J-2+ z8ua_t5lXNYH-)gf&0}FX3m^KQ@DApv)j>}~{jPhMoZrK@(1$%t?k6Tx^u*D6(uHu` z^I{)*vJbAC&hBpoNFzh~d7Z39Vu>}xv}T(~G}=!k;2G&C|IG6q4WAKE4QaA&4GF9{ zl>B!D?j3U(satb(QU*(yXiOuwCWWL|=J+UXt|7UM+$s(_UjzsBNq#FrsA1w00ncPz z8B0IU`{B=D$&>d@s?QkTr3#ey!^SL)h{1iFpHI2@-ANyqq-pjB@yVc?rJ@YUI4Fs>*+>2(YbUc&Q6SMa~1 MkK^UiDaK3j4@F*`3;+NC literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_rtsp_local_save_stop.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_rtsp_local_save_stop.o new file mode 100644 index 0000000000000000000000000000000000000000..6445cb5e97b4a23ed4ad947b2d57f095dd3a4396 GIT binary patch literal 1276 zcmah|&uiA0V6 zi2fPgdiSb#?;gcl6A$_xyHk)u`;wXOd+&X3-p=gI$EsOljDa);8JKwht-y&Drh*Kt zfC`B(@n>=KUFCL4>p@2O29xAj;xuxq8tR@}e|eZpUhBbR^-Md0%;Y;uAC-Rnd>|W0 zG?K<>XpOqA=X5Mj_{Y}3?brj$w?~fU3-=g>M!Ec0%QW2+uj6=Q&B$govo9QNOV8_X z^11xZ&Zbu21)hiEBb3{Y-R=Y1L>em|>~FU!`+K=2EJakd%+{6b>;}6TO|lf*V0R)9 z8E}6*6m}a?cmeh#^PB+}&RYSzYYQ8A+xLNcE;*#m^8)aWI~+Q%QG&g=Eri!^p9sg7 z8@wFvqJ)ljDU{L~*F#RAg!~rba>xmOU_wKr7}b+b#c@CMqljeh12~_9UkQ-K2`8xiYF}{`+bHt~ z$03o>q>eBmgNSh~(lK}y`6>?jz61_Br}_1EG4UB=(&T#5mpC6+;P+n{CyY*aK8r;E z>p*!0?#0{IUtR#jnao!g53gqU~VZX|GY;k>g%K||ZuD~`@Qc=x% zgu#m-HJ$0)1`Ga&(5G`Xdfvrgegb`X;*0K14Ac)6aEkC);f_iLBL literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_save_to_file.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_save_to_file.o new file mode 100644 index 0000000000000000000000000000000000000000..9f294d6b64fabad70ec060b82235c0a055d7fc65 GIT binary patch literal 1252 zcma)5&u|!i$IY*2IIp$L;`?tkc3GDQ1gRG zc4SDx0>q&Ab@Az<^}e9RZ?>Y^1r2UTj|?rP!LfSUJ75P;iam*yKkusQd<%{jPZdpn z3CWYApFa-Gby+CDrP84}=-7j1*K-?o-x;{J=-RK^doCJE`TPStS?%t74c8m$rF2@i z+QQY>jg0X&vzFP|Na00qPZULv}0DjxnH Dd|-@- literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_set_param.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vdorec_set_param.o new file mode 100644 index 0000000000000000000000000000000000000000..38888f62e8d72b7bc6ed29bef90d214a06ea3851 GIT binary patch literal 1240 zcmaJ>O>fgc5S?{CNLorK)qVx^sV^X7SHJ>K>El3r$vffx*uFpU5jJP2f6 zK@yfB1jEmfClUQ^QI2nPgYqRAZUw(-a!Q8N#M$szIu2FBkHgiE%~))y3#ZXDNmgD! z^5=JUqnZEpLV{_jX$hKapj`hX?wPQLasIAcmRC_=HsWWO8)b^m?w_c$H zYpJH=*uB=FV~yrs?myvm%u#!To`!nd@Gv>Qhp(Uydzjo8OepAyqvuH%!gC+~BsPZ{623Y7Q5`ZSG*K?3c=2{*es=>u+llE(PzG(a?;_ru1yJg@g`!p*NQ zP8k>Y-~wzRBo#fgDzTZp@xDFhQrA)+54@QAx+0-naB0;xY&x*n0aY((XmU>r)!M$c zND4+pujO;PQ7f10rH0YS<@J(5$^-lb;N3LvcG+Vv7L;-K8pll)aWAoD06JRb)Ea3I`zK!O?DTPL|N($4qI%(pwcYwyRJRcDNWGzM9SB7kZTBnrMD z3oD>P^2_S8RqK8AMq2MfR`~`~?L2uFJ5x<{Pi;Iu(zGjmn691c$B>)Is#{H8=nfP1>sw&w3^5X9jU+(k+%nv;q#co39)Pxodm z#4o~_?sYwee*VGoE@T8`dcduUfv$8=X*3Uw1r^w))hw4RyIHTdYHhn+DqA(1L@!-o kg8%>k literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vibrator_off.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vibrator_off.o new file mode 100644 index 0000000000000000000000000000000000000000..20f2860a8e550ef97a2dae660d3460e4f319b705 GIT binary patch literal 1208 zcmah|&2G~`5S~q(CM80oKa`}P;zNs4g|3_ui3lOlG(S#-+el3g6&K^AZWD#LZwM%d8Y*uS9hmcz^8Y{}dq{eeZb9ml46YF!&6vzdl=QKXe~QFF z=RNd2z>m&H=cPKSyCTH)3>^Zw%1g2E2>Uho{WlzoM^?q}WT1Q+EQJ@Keg!$zRF3fO zq)+&96~z{Y+$}*Ajcc%WCoc2t%zV-PRhLOY9Fq8|<=tt`VvIpqhWwf8b`arqz^Sea zF`Oe0miJ&?!1^(8t7_m>IjA;UhelKewrRC?E0*1AG}`r!-Kp$ab(>VDuCVb<+W4xx b3D}YC{o3X5VAM0&H2CLT#b$X;9DnjZorZkf literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vibrator_on.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vibrator_on.o new file mode 100644 index 0000000000000000000000000000000000000000..bc9b5b59d5c0c03896f7bcd7b993565164e3c5e1 GIT binary patch literal 1208 zcmah|O>fgc5S>k&CM80ofr3-Md?=7Abmf!?B7{WJd^inz3A*rU*M27EB=3AcqPe2E>!eD5O{ z-njsN>T_OB#>r{9H^+Ny0$7rEZE(KPaXF1>m zTEOokE(e_8I~EK?(&&Ej#qfF(|jT`z6Lq zF65*7+W@5s@C^y|P@($PP{5v_l>P&WJVR1Zz7^?HHn>7|Fv(<3O35FZ(MOn=DBeKr z7GCsx^t?1D^{zT;Z&)!SBCHCk&6fPnGao2dZn3oR*O>SjClQDr0tc z@<+yXRmCF=`ZPhdSl8g;TwV4nOti)Q)hUyPFht=QQgRjWN`@G`L{vd@vsHpf`C*XL zTvtN4&i}By4eJ8dkAd4I6PMy%saD@N7hK?2c73~OJN0U{QE58O;lCM80oKhPu~@S&hoX;)5(L{uTsG(S#-OR6S^ii>eltBFJ!aJE$= z4!i&l!Al@6eTcpV2M!cYJs`nM)|cZ9SYvT=Me_j6g_C#&2 z&`Mcnedny#_FXaXoxw@R8>g&tdCSN)2d93=^GAl2%Ncf0c*drgH{a(s^2OqsQQ!rh zhtgAA;CgPm2W$=9Xz5_@S*x?+Uq-g4oc3*bktaDlgnL*V{^0#fIB0eEN7?|UaG!CKrE!tb?Dg*Q|`^?!VX5^CpM zAf=vG0-rz+{QHRWflu%m69yu2w4QWv9FK!oLnJ$wFq!4i0pyS&eORYzky!aA`m|<~ zNHp4SdF;uFbd-M)pkx6)p+hy4sk(I}u;x3(e?>>$BgrV;g48J)d`Ita63Lnrl0FjR ze`8=Gc?-EaIOzM5IH*tRU(tniOoWd~)umk6!n_VY|AceexcZdQZd9Op`i)-E*RG(P zdMYivJL#k2yvpJghRifTZ#J(3-Jhw+dfO9Xc7Jutq(Flh&_f~BHjc#zgDpg5)VF;V zAX4lGG4*vJg7fU7EOHaN8rpBko`;J$I!h=B>;+u8N4vhDaM2T3taDhx&QzG literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_video_close_buffer.o b/hardware/arduino/mtk/system/libmtk/debug/vm_video_close_buffer.o new file mode 100644 index 0000000000000000000000000000000000000000..9d76e5c9ca037ef09094e8484708eb9705144a9d GIT binary patch literal 1240 zcma)5&2G~`5T13M;?hb@3kauF;6sp7LRU_SM1+tazfOfqq$Y=|7uQK#644NFoQen} zB%Xm+LE=z}SAeJBND!CaU?%I0LzM#~?S9|Pe7mzA?|!J*RmK=dV~~c(1F(e?&rJns zSOE^=n<2tX&w#ke+;JspI0$ANOPd ziI#4i^_{a`#~V29)4|YlTBDN_&!@aqDm^mNjlsxod;Zw4G8x0}1)i~MX3aO*ooqh8 zZRB{4XQA)_<*w(pdcd}k#tR4g51Zxvy`2UuDH>a58|rm-gWZhjEXg+6ZRI`#J{D8X9X4FbQ{8U@~v4*q|3 z2W8aOrBF`2t%aOG4f!p^<&YD6!GwWGF`KY4ig`VgeL1sU*ddRg=69z|mRRG_>H z$taDC!4}TZ_s;K5`uH>-Er|o&kH{|PRY*liWTIYq7Q4K^yk$ZVgDb$1l8V-BC~S%% zEBbaM9YpHm%h1R6!McL;!iUS-kP0Bx0dAK}oC?oNwfcd%SPYJ3*NX+)saLCwO4Df; sigv{z?F%n(@O?V?!u&Bf3rpcSsGmtZTpm$h0eFnKi5KW8`S|1i0;r;gLjV8( literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_video_close_file.o b/hardware/arduino/mtk/system/libmtk/debug/vm_video_close_file.o new file mode 100644 index 0000000000000000000000000000000000000000..8668ddf95398cfd2a292429af47f5b162fa5766e GIT binary patch literal 1228 zcmah|+iuf95S?|L;?hdJP*f+}EEJ@av@54XB0@+sSEs@yQWK$y7uQKl6Dc9!xD^pd z`~n}sD^K(z;464+cL0j4PgXO^MiP9DoDc; zD6sl{`Q@_tseCt~bs;VPgo%2&dM=$ShO)2J-W;jwtu9PfF12GwPkyn~aq;5!V__iB zP>r*Jb=K=RL#y2%jvVW4ukQdDrP4Dk-58#_ZO0vJMkb?~Jtk0i*XeW5`RD=f*q#l%H5vhThZK-H%X7fn!@*`4j1={vtp>3-A>Qd59r=>1^ovUgUou@$ZtK5xO;BCuDGe>}VGGo)nT^ zisWf?9g{aPw}KD7-zq-TCvjG!pkpE08{tc}=!oWJ`13bfi%s3bOzesS`N^;umXR?? z;vAkgx;yFP(|Wih4)?+U+4Z^%53kgHzw#`1eSdMwd_fFuz&27+(VBIM!5*R*)VJ3n zK&1F2h^en@63%meTHc0~2dNHlv!vrxcvY&^5A}IcuneY9fLK;X4=ODzEmFHMO^}Tj+n%Yvqv$0@PBMkgOLCL literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_video_get_cur_play_time.o b/hardware/arduino/mtk/system/libmtk/debug/vm_video_get_cur_play_time.o new file mode 100644 index 0000000000000000000000000000000000000000..bab6de02bf187b11ed53413e6f9cbeb3c49fb142 GIT binary patch literal 1268 zcma)6&u3hu1LP%;wkqUdw02rO9$3fyt~0b=JHqOWUF+!3o>-zka8Oh$l^*Nq#&GO*9CxDE zG8x_M3rF8Jvc}u&RyLpC)N?$?vru@5a@(=nePEkNLxqFAN6qryv#ka!X<-&&>%nX6 zI=c~wu{cYx4ebE~KAH@K-9{9y#GYcVbI67BP5|%P!UoYuW6uoZ-DA<@ngAtHaVrv2-lcADG*cd*C#;KUXf*6x2A5$TbQiq|Dxah{E zOMilY!CjZ`)nDM!jWKn{PVeQ-~Z1MZ@S+U#+>)a$0h30w}pgXnWO!52)#5J{u;=U)fEVzoC*6fprgZ2x}7@x>T`6mu?72p#Rsv(A`TSWnD zo(cUc5`Mq9B76bv6E=`BvD_EoBb4SYfFN$JqId(fEqv(x{P<9x#J3`a5+*K)I793w zVu8!L3;z5SI-xxK@`WO=RG_?TrB~D`I>*v{$@1>xchBSa+^3>OWg!8%|SLwi>4SQWs^rDJW{#mhF zJ5twr!O-+tA+H;?N~K#^EFB@ciW!eV*od*72)&z`og?KN+_+oUgLYn|OVgxVG JbBgiM{{i09i`4)C literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_video_open_file.o b/hardware/arduino/mtk/system/libmtk/debug/vm_video_open_file.o new file mode 100644 index 0000000000000000000000000000000000000000..fda13f88e143a5637ab73a240f482cb902f3c2ec GIT binary patch literal 1240 zcma)5O>YuW6uocw5L!)XQx$Ncqt*n(z6_OUV~mz>s#7tA1-o&8QAkR`VcJMsxb-iX z_%}>kbkUt#{S~e>b=Sm&-piW@v~}T2-aF@>d)~V<@8ez3C^5!BHUjoi=ghoyV6n1_+_VQIf-?swaE-|P?UUGrsk$HrtipMRhwYW+Q@WjiCSoJwg% z*R{1ZJ*~e^ucp`6lUjyncp9>I(QesRvkNSVG?3lix?eABZLZcJsDxOUE%}$(MRwU2 zWib|KSCu;q_;A#7ttO)D2<%Aa*gM>{-?+frmTLiT4u`;ZB>xpDJjBF^h}UFY8B3hi{qXCL z)Cqm#>Qlvcq5|dpaA}%G#vq2{#zdQ4o&14uev-ymod(EG=lyW~L|)W;KG9CEFK?MJ z_~6|5jL1cEmJ|k$CUeEU&E7@YM|zUfXkQl<9M3*l-hveuR@%UgypBWmS-w);*8kxI zvuspzS;MTBO0{C$tY>pZ(In$5+coiJn)tSy5twI-&^K&gkKsoZ5To+|bhqMoaSV#_ G!2be7?}ml| literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_video_pause.o b/hardware/arduino/mtk/system/libmtk/debug/vm_video_pause.o new file mode 100644 index 0000000000000000000000000000000000000000..32234a2dc964ad5680c292d01500225a320fa908 GIT binary patch literal 1212 zcmah|-EI;=6g~q>-P$IlXya1<_5vf7cCu8W#F!|*OXF6O!bM|ZwhL^8M5HcDBhkbc z@DY3s<4qqzpTY|-#JgUY=sC;|3*0!#&i9?~d^2ZecIIQnsxrnvHU?=3BY?69V!5dy z4Qrr6{LA{Yb?bfkMpExWTKNVO?IM02Iaf{fK&`zv*0d{Km~33=Cy<_eXQ`9ouOIhh z0g0w&p7rgsUdJ8Sr_N~TV!|wy9_i`EVC1!3Z>*b{jBfROSKl|X#@p;(HlN?ob3Dhh zP`HnF$8}mgU^_@-g`>lV&GO;FUISJlDqCd<;vA^M)c zu4JD3n)~iMA9%;{9pJ6u5V$v>fZSQ01Ku9=`|caGU@h+WzSnDwe0L}}^nbjK7CO$A zz)ELY3pjxi@au@H0Vnv32_2C%8c#kIzdJ!3MWpsYz^oU)4j_XH`R9GI7MUeCkkgob z60y;I@hKA>`6&M+K%oMBLP9lUlXYotSo2isUy+D=Boyh}6h3K#pU949k*G-_`6F}s z9}El>FQc}BAFYqpOXno_iWGJ+(I*l#Sy#pq=XC{s|CKsnbXq-Bq6-x$uRtP9BV(|I zeYoHG*~uT9=EET|(82)Oa$bR(3wcqmJkyrvm$yt9qHqcBA|)4%NkkYt5UFWT=VmR% zFN2uQbu)tf;)CUFNcoWJ0Jlm8c7^AqTK&jaa)E7H^(y$b(zKg}qE)fU^vd;Z je33T3DQ^t+;^b7C&Mt`y%Oh%Q0FM#3@v=On7=Q9V`%Qc^ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_video_play.o b/hardware/arduino/mtk/system/libmtk/debug/vm_video_play.o new file mode 100644 index 0000000000000000000000000000000000000000..c04b369dfffbcd98a0e8018181e3308c33b13f9e GIT binary patch literal 1264 zcma)5L2nX46n+B~fod!jQ`&AUYHMh)o28Q2=s_uTK;24Gn%Km{c7csxKycYMC23+4 z|A5Ae)~i3DhkEOw2Y*2Q33}0+c7{p z|NL>xH^jmm4CLHg!C=6>xN#c0h>oUl3rWAy`EituuufQC%}Si+!tY&*@QRBCfO9b;@nuMqRdy9Sh`&Zs{PG+HH`{CMD!f$|;b`%|^p`ffno~>y~BKN?VrE zriK4s%%F{q!SC4VEcP5u;B)viV$k6PCs>Ffl1A^7FM!XSlY0><4sGa<_K^c5P$B=Y zPxK0(?P2Jw%AUc@(f`OX$Cl*!Ry?gfDFSgbl7^ zVfelXAEBr3!ntsA1;r3*7xAI>(Ryj0#J3`a3KpIdaYD=|a)HCT4}Sj@I-$4sOgfL(02@iK?IX}Ul^X9{3E@3zl{0BAVGGv?gPnHxBKn(wX^e!TV@-)a1L%DB^SLj z?qRO8pnZFYj|j@2ItlG-*n^|%hn34PYr$* z11k`P!jIKgtNN!(I(fezNyEd)X(kQlsf)s~avZJ4Ud9^VI*G(`AI{?!N?LsbnX_MP zqf879*q&>SQevORgcOHS)jFerX)iNJshS9?JN4BveD1tlPi<)||-rPb6+{xe=*b zb9GV%f01>3&#g%=>6Jh{j+<*3T*laS9CW@o4!S4#tw>=P6JLpVChJOHVlW@f(!}wZ*=GN2w(AE8Am$`xv zT$}$_Qqh`qh0Reer+c%cgGjz?ZMxSr1?Pp2mv>=Pz-AA)Ue<6b?w1?Q18wmFFzR}< zRMd@Tt=6ixjdro5R}Ip?vxR~0)WDbK%)nS!63;|;o5X|eA|_Sl1_W1{><-HIt3xD5-eLWF|Llt?^yG4XHk zKk(qyTMzvcH2x9Znwog%P2Xd8067>Ynfbo=y>I5t%+9_q=tagD$i^TF^9Z0}2cFc_ z5QRN^Uy{5L^<)6d{2GlPxU}xqXXyu3ni>JAbR$l z-KuBLex4ThWg!RsrPJcL&&S=iIpD*dG2tU&nMR+#v<7`{iP4bvx<{`8O1azvHCi1U zTP@R?sHIp;)w{w}_Y=v)n`AthPVcHIEu|$Pa}U=xOrzNawu{u0IXt*u%O5<6S7A-@ zG9TMRabxoS%_U%?lRCulfE#Th{Ce5BbjCPG-19KptTKQfYuz1K(huEkUOcR zKx+;9ee(z{SW7d6u)57-VUCs#`=9Uz=IE-|91q?13x^Z99exeb=Wv4Gm{1W(qxt0X zV!!RgE<|b{Y?zJqX9b9%LjFactVL$Y6Ub?f{C>1v1iNhHqx>TWrT!TS)sRirEu(-n zhf@E6#C~J8B7NJoPugG|6ZKhS*QAjA%7Pxi#Snsg^1H+ zT^UPU)ZOswkJJfW)9Q1@^-l%LyW!3}jf}w_jt^(r;_Br0O!Koe#_@T8Y&q|qeHYti z*VAWnme-fB%r>}SeYzKN(VQKHLBmc>N4mH1QvA`0>0Y-L99Q^>wH8DKMB1R~xdaZG z=ecs_FtN&1;3d71&FH*RELICOUdv?l0;id;Ou_Nr<@onm6W}XsV|vyg9_lgfJ+KLo OM-1UZqc<7A2l5wA&!YnX literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_video_play_stream_from_sdp_file.o b/hardware/arduino/mtk/system/libmtk/debug/vm_video_play_stream_from_sdp_file.o new file mode 100644 index 0000000000000000000000000000000000000000..337c4f2136cc10800073e1e88f7c00ad505b30cc GIT binary patch literal 1304 zcma)5O>YuG7=CB@5ZV}MqY>&xH`*Go?PjS&8$DP``B1lFS`IxqF0i#EAh=8$i3d+6 z{sn)6iC1qu^e5=apWsPTZ`|~KnH`{9+DT@f=Y8I1=AE6L`B1Qnj4@D+K?=qZKtl$h z?9h;cS%^UQTkKiPe!rzBZykj7%R1Z*f4B6s4yOx)?y+_pDMg<~%b)iWiJ1d9jSn>4 zcm=87KiKWP%|E|RiuYA9ALFHy;!&F)H5+b+cUw-M_k`ydD*a=!Zp^cjP*9Nnps~@8(A}JW*~PD?T+izn!wUXL%E&p2i2|Z zC#$;<)*>v*=7U$*Rdy|qU`e*XZfGkE%wE4OoEoC=BpxW{xh+$;?*y0)M>t^CdOa|` z4h7`Sm{~CEop#%OgBGl1Izo8O+M#fJ{zqN_ZlZ^dJM4Su%&R^p2>SdwV$|mZ156l* zq|toxMX)dVaR8CpCkdlb{#t-#RLDQ+Q?|AhIgpR?kA0LXz*i(x zLp4>mi~`o|D*Y!CdC#Pxd~?#LY%q(7y-_4MnLf3I|3&k1KV%TYaaqM(X>RXY5 zjfpQr{HE%vSmC4|gunlkP8b+gA1i?~6(}EsJL5Dm25B5OM%v`+b)Ea3I`zK!Ta9H*tMoCGULS%r`r`v)+$YyT%v;IT&PM!2l|PB=a*t z23A0W)R)!gtM>cK-L%nzjQS0x`eo`uxzH@_P^-T<)%DFDOxG@rGssN8vz@cjuOAO& z0ckDWIv+Ua{jN83d~Y-!cmP(p{Mg7ehhx9v`4hv+W(~U^c*cR5GvDU+bA`gLk>`1y zgW^M6$MxKHAJ{I!Wbx$aQLA!vxZi{&MPtisL%qRnvfBxrrP&tSR`wY1(PR*~ZM1NJd&L9qT>!l61}^aSXaw9J5+QYt=Ye;IgMs%NC0L8QLE!h>rq1O4CLLkYEW zDU?!A>meqihWHNJA&0C>XTzFrr2i`d@gE6~)U6Ahl)+C#r*kH15+%J7 z@&7?$qVqcX*6^eK(SE5<@~jA94+HZ}AeVJ179CN)3cvqGV~JQ+;z|Xor^0450rj_# zFU}iXo%G3Be36ob^nxIY$5q(A5*PIO6Yy{lYRWYH(Zk9@7?ZxnOY1|f5I1n$(0;>?E=(02t4_-Wa zG4YS^AMn;cLgUrD7h~#;o4&{H0Fu;nl9}&&-}`3X>@dUIvR+|~0dEY_u!sO!ZV<@L z3~5*c5vHG`kD~gUl9bqxZuNpvMEY2P?a&uhdLV5}aGsn_&xA8k6A!}GC(U>~)`RoN z^j$@6LHg%ccDq^l^<$qG^ib4V+UdYJ?RTxAF|w@ZhI!I8o>|UQ+ZIb9!) z?T%$nWG$1C^}b`tyJ}W_mEFni?QO|9C8uN|e-G`ZWw!gkwvYz$$A|YDrNe`rIs^rg zh1t6QD%)V!d~udwNwz86WuS~E1IKJ5I<|{F&TQ+2;#jX8P`ajLg3=z1K(U7ukUOj7 zKSPUpnG6)99P@qvif z_|i7gpEjx6C#8AO!Sg$VGG31qMfMYBtijbywoC7vu3kOu+Ht$E$Q8?4NWg>v)IFl6 zM}`C}LI^Tnm!2(|?+fwht&SRpyXucb98P0rnIq*WR1QB4S3Wm1ZJ`6FkuxQ(zk$!zFpp5`gY-pBQ9$8L6kZD6WqcXuAt3p-CXYcQvTSeUH@udu7^ zT0mn_7GtZ*JqCO*>%lg_~^m- z>0Kp25*6}K`(!UN%iO@6=Eysv^)wtZ$Vc@@K1%%yCe%ZQ>{~$rd%ltScTBwZ%2T9o z+4D&o{K2d-W?oOC`2APv zgn?1_i4r*1f$Bk^dz%De-xGw8*`O{|ESuTKJW@L$GGF8=YwsH~1L$r7Z#!5M%ff(eKgl^8W$D Csg9li literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_video_set_contrast.o b/hardware/arduino/mtk/system/libmtk/debug/vm_video_set_contrast.o new file mode 100644 index 0000000000000000000000000000000000000000..e9d7e5a69f29fd486b592cf5df5fc3042d1b1094 GIT binary patch literal 1248 zcma)6&uO)LRn|`X0LjNI3K*GvD{V_wBr4c9xH2qrw;i84OY|%K(~Q63R{t zDOiIrt&FBkT z+tD-nyUcbbm)p{^Jj*kXzlV0qw%UDQTS!Cs{k{9m(%$3k2COJy7Gayg%j^of8cMeD+{Ed#@58 zjSBhaeX=P3!jMiA^XZ);=CS&-+!e}7?^aQ zDS`hwP(28-Ss59F1kSrtZGLs~hbHxD8FRWHvskPLAvr4|^ZFT6ZE<~h%REB>E&xYL zE_!BDVNmi)lbO!##X|nt&*@w@6r7iSxV!^N0m&|Kqp0JQe^#v3_x0swFsnwrkT=YF zrP3%j&1Sw}luh!!!v6yNK27|>oDrByTj4(FJY%@oM~LbgOnyTgFA&`|6<_>6nXZdW literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_video_snapshot.o b/hardware/arduino/mtk/system/libmtk/debug/vm_video_snapshot.o new file mode 100644 index 0000000000000000000000000000000000000000..1516e731d34d81d0b6e5afc38d5903906ca20bf7 GIT binary patch literal 1236 zcma)5O>YuW6uocw5LykiX(Ql7Ct4FIb~03=jcH=}MxBZQ7VO3WCPE?wXI_cKg83Y%@0@$?dGEe?GxNTrmlub0@NM5(0Hir(jz zva4mZH<_Kx-d;+{s#!Gyx%+50EwkMRmO>iH)ej#wi-%8k8W5C1EX>yZ8*GzZ_r+M8 zCD={r9s|{x47k}w5iKoC-8gx24dLb1fQ{>Ad*Jw$rr+L*UNo~6dzoe&F-rN zNTWjjMW5(JX2CV&v}Tt?4BBsF%G`;3RDbNDs{(vNLOn!?zEu>k=Sb*Zkp*osY|hKb7{qWsm}!fi@0O-B-CKPr?|3=g>zYKDxct+q9oXWq)df{AXgKAb7pk?ocF_n%MX%*^ zx=|~a8>Obv%;oixLB3ZOH}JnS@XxX*U|eW{y$^82@qk6d*eU>hR|))RbjtB%{{!>* Bg>3); literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_video_stop.o b/hardware/arduino/mtk/system/libmtk/debug/vm_video_stop.o new file mode 100644 index 0000000000000000000000000000000000000000..b9c224bd333f39797699f466b51ae2a95e90f564 GIT binary patch literal 1208 zcma)5&2G~`5T13M;?hd}p{P!&z=wcR(yp8mi3lMVfTe+?3y|AZEh!5C~O&dp659z z-b1h@I&lL z=6kQW@ZJgFU01lk+oKV1e@G6gb36~cGaL-O*C@eW+!ey_w@-vOqJ#gR-9j0Sb1st8 zOzRORP$PZ=aX#V%pD|$|QjDG_orddntrtyOKu{kXLc!w zM)j5h7H*`Y{G$lND8MHq)I*x=OLxPb!KCI+t}U&2M_qw~_7rt58E;w8qU$$HY4I2~8v_g@(&OawQNBZ-*~lvjg$#0my$ z=*0J(u1@-7kdO6ASdSfKm-8xY&g8>>m5bQr`tmCa1qrwUcaV~bo>^7c)Y-zhJqe}3 zPIG)7`83xR1^1aBmUkd6Al(ISmrdM?2jzO>(3};4W7&;T(RLcOTC>`6TE&uGbx8BV l6Au254*pU87@V2X*pKFx!b21g^#y>3h#UB!JSHDs@IPI>dcFVv literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_vsprintf.o b/hardware/arduino/mtk/system/libmtk/debug/vm_vsprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..97c44005e0cfdf0fa5e2a99f573e4a0ee78193df GIT binary patch literal 1212 zcmaJ=J8#oa6h1eP)}f##Q7e*QfdxTI2(_FNi6{%o%T9$$swNTfn@}6;0ED> zW5~b;2r&N~eH?ARseMmwiKXG1cuoAE!oBscikKB|i*S*e&(8zrf+p-m8qYe3L~IBb zoAY;S@dz?Mzp*==%C8?K-q1rqJJQa^#@Y158Xeou0kmqhBxPEYQ>$-UGfB(kBz9KdT|hu#(NhQ zvwMsHIaJ8+_win2=3GHe@9dI@gX&#%m^+b=@{c@pRe+C3s0SasZvzGFdBXKCNZdQ+ zD%=-yecT3rkoot8`v?OI7p@75D=1z;Z4)2*z9>GlPkgONp@@kA5pVE%Jm%=vL-6}A z*9n8p%9l#;QU}V1oNrh<7{oECEd+mc@`s)LB8~C(GC;PP4?*fu-tE_3Xsh-4EprV) zScf!Ha?v~S00TO2K4{-m9w1Wu)QfTZAQr&c_p{1?9Q_Ei@WKZeV5v2f{R^OS#%F2`2(F2>III}Ue3U({GKwi?TG_!S*p z7`)|Yd^C^-!D4XhI5Ph8cU<9bc%%l2A75F#mizgA$a7)?=xfCxKkDd5uX_h(d*6C7 zNfqZ|lxdSfFgXOxVRhU`6@P&ew0Hn1eZKz3*Q zesyzuYpnuvQjjgMuz#6dW!HTX7G*2!rgWEq((8AudIP;>+I~+U(|D;^#<2xTt8Udn zY4m!am|Y4;omMiSG`pRSv5yk0rPM9UY&Q-qqc_?4e+{=#MXjE5)YR{mgUR_Fd;|T0 zgUNlsgp8gznoqhQez%?2ho0=zcJ62&D?kbv(tCBH7KsH`5!0M?BGG8Q%M)Y|q@(;J z$J;ExdjwQNn5bJq0&5-!{u=`Oj@gXRE!jFDgLzCmbtAhbg`}4}d;}L)kz7RX5`MHl z+AsA<{3}8zVPcnnW1_Bzh4=D)_&pXpdEcb^l=00}puB&kSG3zJD6hIxysMKwFv+`V zjIT`tMCbE!6uobNN?WTfu@NfKiNS2Xi>^Pf-ljK?PkR3uT{xn|yzL!ic^x)*mnU>aHLiY6d z&#xnst0pop*N)5&1N&oF*sol-3s5VUAL!ZUaNp~=-dL~Ya=O(QuD)gDjraM@e6hH$ z7kGi^p>z+=a9pR|2eytdR@&XU->U39*=)j`7H9J;5xvG%+4V@0rPvy~sckUeqwzpE zZOp<8a!(=8eZz(ONdWIU!U5hMjevVYBIM5V0`SgoFmT_Z1$%Kv2(RDX7w%~0p)R1e zutwvYlOCF>B{8L_#5XX{OHAn-7Ie&{(e>nu zCBGKZ{~|F^TtMwAF1o*ETr?;3tO#KP3ta*-RA0qa4(m}k{ik%w5x@IXiJa>|^{9Uj zQwM_tlHx=NpHBXmU!RnbuTBY~*?JV#&eel{G~*y<&sSerP>sMP$RH#aU6arl(ECoUP25zP2<$7b+2wT9eS&i+IWj9Q-S#8;^(zaE# n$?@71HvWq?{!QK(?9j3Pyi(ZwA@)oz0zAgNh95|UIKJ5bKYDo6 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wdt_start.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wdt_start.o new file mode 100644 index 0000000000000000000000000000000000000000..68ff1796834e59cec4bb4c0b791825006761c20e GIT binary patch literal 1212 zcma)5&2G~`5T14HlC)Au%U=>Au%JjOp)03EB0@-z{{SvQO%CB?oWyD(5dzK@h&XWJ z5x5}n8r&+;M}Vi`RuysS4Q67mgG^5`nHiX-sZM) zg~Fzu=Xsuk;$56zJ9c*nY!h9rxVv+&UDdh{E-7AU)T4#f9@h0Powv2Hu@afV*P~NS)((;Jxu^ef7+l)+#0Izi;s zq>%JVh*xoO1IcCN&f}o{(SE5<@?X(~JSO(Y@lDp1vBWU1!k>SVCydOh&zZ34UN_chBYqNZi#`y9)K<{*31-ch=^Xi!aae94u%RE5@&IR{{=Bz6$IA>B& z-{`!gQT)OWsIO}Ze!~xz_h3W7MjyCYHtsb;v@CfTBRsbr9DZC`KzXTrce?-cAivR!s literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wdt_stop.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wdt_stop.o new file mode 100644 index 0000000000000000000000000000000000000000..2ba0dfebe9c538764b47569fd663a8b45092ecfc GIT binary patch literal 1200 zcmaJ=L2nX46n?WnrLEPL*a%2;V=$qmoh+3^Voa0*3+h&qLSk?00-Hi2qRUhz9_$bB z;ME^uy!6nY(0}2?D_g)8u*Sh#f&a{w&`3wwFvU^x^c{xt7siLGJA2 z_s?UKt0EGY>&NE%q5YvJ?6DZV1*lgl5A|GYbl`PeZ=%=pdEFWaSKl%U#=F91p;TJa zi@eASP`;0QIIhzf09!*hR^Hut(5~)0-E6^}7H9J;5xv1y+096jrC6HX);1XM@nk5R z4x;b^>?_Z6UvuGp6u^6qaDaElW8mJ12&oIa2)sKQ4&65>!CKrA!W(oBggc)3ssGSB zn4@;iNe%VXl0HFH`nM40rBCn`6FMTrXg%rTIPOUvK_ol$=jjw29Y7vKqz~&(jYKY0pnTN- zhN*%<0!is25Z;~iF+YEiM!q^F=*{M%kiL`;>QRpao84dCvLG9QE09H(RJ10cF`)BS zMtw6CK_vcCa_Z}fhI8n#@-AcrWP8A^ih)!4MWxZ)HNq0G>sE8SY}rlIY}ML!yS#1H oY*OsI_~Iu+8()(*0Xwv<->(!Fe}pxYivUj$(|AFu#PMMN0Y5`|n*aa+ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wends_with.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wends_with.o new file mode 100644 index 0000000000000000000000000000000000000000..ff9961f3ca76d4ee8d1ded2960a6e7a7e1309043 GIT binary patch literal 1220 zcma)5%Wl&^6usj-NLrz^RZ){*fdvI6gpQmNLBxjU9g0h;CW}ZcOdb{qB292yO2mRK zp8$J)fn67s_yPC|R-m$?JGeLFN#d@!(#$#c+~c|98T)<7C^N=D27?65Gk|@O1Ts@Y z0+t~Jqc4#s5#wD^jos)4)ypc}34YVnqzY&8^U;ZN5~_rE!_`mCXmqIuXDjE5sy&Cq z&+qJJGym(yY5Bfv=Hg1_wESjZ9$Saqv3cBgdZbqhg@;lJsbw+`@b%V_~`kH^66AtmHa^9=CLa4@hA(Sp5r%W>>} z`^d4zwDJFo>u95+4Z3zZ--gQx{4T$W7#athTaQ6JLyaSsKY<7Vg1s$i{(?Yd&pnFYVR*YIcXPC8e xxn63Rja=R+ndEt4IVS#(CjL?O1WeD;*l!0%3^!3kj4lJvw-m<%HYmpn{s+_1epLVf literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wifi_is_connected.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wifi_is_connected.o new file mode 100644 index 0000000000000000000000000000000000000000..de26c48378746aa1a59f4a189487515a6215149c GIT binary patch literal 1236 zcmah|+iuf95S?|L;?hb@3kav6Vu@5r39+0Ki3lMW+xIhF_ ze}Yeew@Um1d?>z;#gI$^o8|H&E!`ZR`W@FFYi1^+Szh33`$o=qo6F`3g*`2= z=k**EAK(JVb=n@VJ*4sC(c!~ZR_bj%;skQUZy~NmoZt&4G(^&9J^2)TcB43kNaGWS>C9gtKn4}^&-+9zG7D}X zr#1T|;-LN1knxFplz$Q-R{=gFp&DX{x^y?J`9|p9knrz`E5f(QeZmHRkR4AWUXw!d zOLMx6n;R%zMQsBgI$r`G>XW!DQpjWCj7T&@T@eeM*Jb$qSLlSXu=-4iEmWYqywEE; zExpItedl*4e>}|3c8tT$EI@WSFT>r1Jg--oYM1vHUl}*V;0k1sl8e@CNeoIn70%SR z`JPkkMS1G$riAmdA6M@{Du7fMbgOLORD52pH;#;@Ua(E8Q7T$?qgHEHTXw5hvZ^*& nU%7#ef2WQAmp=x3Ss~ubBp$4Q=TX-H9wTn!$Mck8eChuHed2|R literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_connect.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_connect.o new file mode 100644 index 0000000000000000000000000000000000000000..37935b4cb114cf5d858024585fbd87450a991d5e GIT binary patch literal 1228 zcmaJ=&uHnTfG%5=c<|!U zqeuS)uikq1s(*n;FUHgxi3fd;+1YOQ&`EZ_@4ffUd$Vt5-qp1RV+_P#kbyG`pu>%D zVIj!C3PfQ3CH5rNdRzOET$f6NCFzRvu>tp%zbR5yx-G$JYCb;+oJ7>fPPF-~n@Ge5 zaJo8w-zXkH=GS+2r(5~`vm^>S7*P+@S0nxPkulc$lkwQ>+W=~{T1scylVhuITC=p8 z%cZrUZKk)Cyz(-?l`j^v>4IF4^H6?(c?{F&4S{8mhRgfA4?DHpovk)31tKiU)djlg{d@^m(`jUJ+HaU2L{nMbm1zOg|*G;9Op-gFAGH6er4dAR^`e=-`G zW0YVm*|2SE*gLk(sqe=wFmGXu+PmavsK;H06NDUo6EW&=g3lO8Ba)BSlP-eaUB?b0 z()hr^o%vA$Ro{P>uA?ppEo<{!;82ZMmu?CAoIsVuyHQV>vde8KfkzT zTo8n1eChn(Y0X-ILD5~y`?lw^b;qW@#sfI}9<1DlO&c~3LDs4YPUXF7v$e1IWuU8C zt5VkVR-@6bcl1uVqSbX$JvVI~-=vPO%9?@hOTXw{5)YK_QDOx^Lrmdic}g}O@_)~O Bgckq+ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_dereg_noti.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_dereg_noti.o new file mode 100644 index 0000000000000000000000000000000000000000..f102936934d2e754dc437bfd8d0b75db64957aae GIT binary patch literal 1244 zcma)5Pj3=I6o0co3pS?EpaO1m)tZ3V%~DAu98~_(xD``45HH&WHie{sE?bp&@Z!;< zAHXl+jc?#ZKY>Rt#?%`(eUI5$u=U_1Gr!+^?>F!5zL|Mj(W{Ix5Q9MymKH#p8-eUX zkc15g!u(VCak%lO{4E}p^ZhmXqWqx>ch?!TJ}__ zrPGQ&a4cn4%V;k$JDFTArDWBtnt{SSl$(~>830Qm4HORc@3+ePdpk{7lY%V7w)|0c ziCyu8_zB8FT}FvEa?NIu$6x**QmuI)pl z@t%XX^5XDb@r860f9N9j0(?Y5HN+5g>*&Cm&xQXp z5`MS1N9ZD4CuHy&*=k>ej!^Pc0AWn7q4NUzHgVGTg>h1!#J?hiM;MqAafiq!Y=NtO zKm4N4@P=>k=bnlAS1V9GKU`jhkuiwlTK0Ua*-0N*#Jw=u^3p(dHtvTTf5mydmghU0 zU)(Y-@WJ}xj7UX$wj>4*yuG|{%Us;H+&J|$BH?=e(W+h8c3`^)s$SA?DLg6F8wc7y zlwj2KMzNq9jcT=7X&J3TQLh*zJhB`EU#5X?%btR9z6gB=^)ZfzOLr=^0iYu$@Zvlr H8xQ;s`*n#< literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_disconnect.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_disconnect.o new file mode 100644 index 0000000000000000000000000000000000000000..bcdfc15e498a5a79d19022cbcabb79286f605457 GIT binary patch literal 1240 zcma)5O>YuG7=CB@5L!)XQx$NdtJVa>PL@ivF-FTb>Q+qQz-?V%BP8X+WvUVnUi}Lu z{tXikJ@n>Pe}yMay*2Tm@5}B0Z9O>2%=5g@`^>zvGqdlCMu{;7vN1@&ECQ&zK_D|R zBw!IjF#NRiWXX72P-E9RLG_#pH-lewHL1d3{AjqZ?1#$X$KlF{Ml`z6fy2m=qH50} z@#7o2-pKv@eo(q2i+LC+ACzA8%-6eC-)whBtwFzUw*)53`TRXCQ5)~M_epX-i7Jt zUL`;Z74pyfWGymFt|O;88zf?*^;Rd$9mq%dhaS2rz(*uhLpE8rf&$hYO8pBG`exar zZy5!-H_H9S-XP*N=_6F6hH&sB4E&|ZoisQpED8>u_ E3$Krc)&Kwi literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_get_connected_ap_info.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_get_connected_ap_info.o new file mode 100644 index 0000000000000000000000000000000000000000..eefe5734143f17859be5d2ce0e594f13a0522c74 GIT binary patch literal 1284 zcma)6%Wl&^6usj-nzTYqD-cPrz(5cQX)UKjP_dzT2XF~$vdGSL5<`NT2hJ3Tx?syM zz!&fX?7HYDfcOO@R-m%$4(^RTd2|tVq?vQ>xo751#xwa)(2I;Q5RE|`rV+rt6Zq0& zLmXBh0E4fq&sO!Lyd1gJ_RE)Kxaa?-$q5-wqi2I-={QgdJ`I*X)x+WCHk^jeBw5*q z`0wxRc0K#&*Gch#DCT0QbW(iVHQpVVJ>!+djb^{svzpv$8Ro#~^j`MKSIXrcDe-Fm z&~94xNGTu6k_I5%^t7$a_nfqurEwj-9mO$#u?Cn0R<#(TKR>3a? zSdguIFS9G`swd1MEXuA+8w}LpsLRa;BDWoE3uapfD!1NqP+KN9L2V3&pxS*3$emKt zpf>y6uGK>e)>2K*?M~y6TSMCT#o7(D(NX(dJDqpUWWz4tnP)s|AbEH8CRbwp1BH?_rlF-8X1Eajyn@=c6IXm#`#Gaz%92Y)dwFxl}u@U2hUW6uq-Rg*K_QsVN}prq+a(cCu6wi7~N!qi&@s#PGIV=vqh$)Mcs?O?>f3 z=>O2SJ~Z(U=&$gtsZaJz?`3y@64FU#&bjBFnL9f>yPxuUfiVWMF^It^0@!r|UvglG z!5sJ@^?m-uy#65<4X-qPQCRo=j78xha+x|+PW{Ee^FZlqEfktiK_b$JO9P* z*D~k7&k9?zkc+|MS>bKlcz0xWj6+Kptz)CrdEEslX0wmgSfzVnH!Qoa7UOYMZwX7? z(h}O6#AYIuT2qre$rF%%h-;aaS#JSbL+VTK?L4aHcAjlkU`Fw?09*7fv0H4}6JlW& zVRw}c2E5mA3$un&lIjeL}U>Y~)YAfXzv$+{&Ju;#JUe;{%0l%q)Bg5#4m z_=~JIjGUSjl3y9q{kXV>;w)-6vD5y7*y)_)vm%8QCO#5zo2)BiiQ~E#{``|Vp=VHi zqgXA~-%7YU8Vu-#5q)(-_|w1;{4zURb%3ck1awZE}5i%N&CTZomdo za?zYcg~2wWY;IKqeATF?GkV@2C;bHQ+cfa&vio36DKj|7Fm7ra_Y#@|$RS4X;?Nxn;S2u{gL{V- literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_get_mac_address.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_get_mac_address.o new file mode 100644 index 0000000000000000000000000000000000000000..d738d9c3771717c3a82bb1bdaea5a90d1eb199ba GIT binary patch literal 1252 zcma)6O>YuW6uobN3azPaqj5k|N3Dj6eHki=#57U9QKw=G3s#N;OoXHq9i}RA;l_o3 z!NkAeu8S^A-0H7z*VJ7T7kV!<7ibd_Z}R5cbMATXKHi(*L(wP+A%H_b0wxTg?vYS> zWJtgQgdy{F@yVj`z7UUI?}XxTJM<$FhvV2u=0G_Jmm`lOmCp@To$tW$(uoq+UO?jL zr?}C`9sN2iZE_|I>XvaMzp#5$&-?9TSRdSUy~Mh)hau!xA2;6-ss zTn?xrDq><)xg$UhhCSD6BD#);9nKtkSGx8)7i8OVEs#yzj&%A&$eogDkga~NXYZi} zdr8Z6oo;jAwQ<}38&}at$2;dwpfi5v=LA7Nzk(R?bAoSJ&=5(Z`Q!`Zxaso%BE?4! z#!v4m0g|YYf7-{r$jrHpInCiaqxDoA9OR?=10Pxcf(iBD;Jy_Uu;(k*zhmOPSDwPY zWzWYp_=8zv%)FjN$*)Z5=W%fz#d*{&;Gq32;h=Nk--;=0Vc`=cesEvrjMI7$e*a~i zFfi&qQ39trP(28AZ<7$PiezgnOs`J<(5OBxBfmBwn4PT$;nu0T*UuPhXV>Sq%rgYw z9Ps_poE1d?-46$y+jAy}#QQ#{b6r;OIpf2XEm(75tqs!1>-fk%%~z^B`Ybz`WuuzQ z8fLXrsuk;IJ)1L%Cb{Vk0l!fbzcObC=8SfuGmYW~AL72$1%Lu#3|}JpJt|)QKc=RQ A&Hw-a literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_get_para.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_get_para.o new file mode 100644 index 0000000000000000000000000000000000000000..a06a63010d289068289178a95b898419510ffb48 GIT binary patch literal 1232 zcma)5&uwH(j!EadOt0?W4AePC&Xq5S^dy=H0e(N+V(N`yt(T5z3RW*dPx zORyxns@!J4$CH6;wb8qd@I8qf`+&Rl8y9%jaxLKP@ff%>q=492o&(+)4hHriQc#Oq zuIu#MN3K2gKI%W*HRMox!ycD<-1IQHpog!Zk9wHgCoE{_DM#yx7r}AUiv#G%-U~OI ziA$EjL3}??YEfNc9WkxhrX(8ew?0K;A|BNrcwS@yJ|Z9uX;Qa_3Dg|P{1*h`UWtt4 ztqPu`!EZ#ZStK+mB);OyU&PIIOfF$=1qYokhJ*SfzZD_e$AbSiNnNV>&7Tj#uRs1; zV5&aP1kNdtUhrJ6=(HP1e>hv>-<|lOX?<44I5`gxE!KlT_h)WG@7XM|xWBw*f)IcU zKo5mjv}R3Vuq#T_nff;0OZ3t5>eSa&1?R;_%R8{?!e$q^QPgqDKP}ek`}#jTFsnwr zkT=YFrP3%j&1Sw}lue@1^T$_d;=6JtU@i)X{w45mB|JlX8G!Co5-*HFG5+YkvJ!)H literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_loc_get_connected_info.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_loc_get_connected_info.o new file mode 100644 index 0000000000000000000000000000000000000000..c75208b76093a623e77d83f6fbc7dd4f68942fe5 GIT binary patch literal 1284 zcma)6&uubU+~sL{{!`ZF!9#ZTW|Uvy91O%b&{Fyd*AzJ-tNroekkh|#u$jkAPLh5;Heh` zvtvUNmLLSVugi~?^>?L2Y`q&yz|G+IWCBj&r@2GvFjNgc4A(xjqS3`JoJ3Bggz^lM z$3NKhR^j;9QDsXM@-b39s=OW;Z~ErY=sTA2!sdqM42QPG?T*nKK6lVqEf()6$%eD< zTDE(jR8uKM?{Qn%(lXksOgfXxZ7Nwct7ag78||iTwtK)fkp}a7JKN3D&VzIV7Nigh zv(>;FyTmTbQ5Iuyc2&B?Kphrg=MjG6`2 zas~r?h!(7+nw-16_CB{q{tNyGTtg3S^MdcCy?*R-f`HGjAclQT@DmdXB55?Ad?D;N z{8&b$_R)jM=p89Q3KjCt`a~@<3$7ujIpXYSJq5dH|B(l*iSlihQO5+VFaGal{F-}ecWb^p|q|fBNdiq40 zUtioZ&mhAE*hWe&nzJe~c;cnTBkfy%E`IOFw67}?j^}^Css$SyHaei{MGc4iZn0M1 z)BZ6FjH+HQqnR)0WrHTsF9N?<1HU=<0F3jC)1%T}$M8k&BSx3-+!5n= Lx#%87@lyN+!Dg8< literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_loc_search.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_loc_search.o new file mode 100644 index 0000000000000000000000000000000000000000..2c796d78886be292e40dbbe49f1f3f03f723997f GIT binary patch literal 1240 zcma)5O>YuW6uocw5LykisR}sJQELKXUxrGwF-FTb>Qqc&!EPMrL`b0EFja{QxBdka z|AvW+F1mB8zrvNK?wYvJdwKJKwk~|hd*|G9&wF>~eY`6fWyToD#vlo^2%sT?Kz3qC z!XkuV_$l%vV!SP?@oSx+dQOF#!LPcSQsFRhG~8GALzVF3aP>no7F+1RVf08*wdauh z@r_+?=6`-aDBqFAJd9Qj%CGw7>z=i1_6BWpWLr+VgUL#va8FCt2YXK2cE(yIoz{%5 zYisLzMt_-E%WQ0|bH$*+pNB z#aV(~R&FuiqjBH0T8OSAup^mc_qc1nae?nxt_8d`8Uc3(6p%Z^v%uSfe&60j3)bS6 z>pI=mo@T5$_90SxFJL-~ zqXbB!LjHN5tVL$Yb>uW>okVQ3-pYiDfqayI=%G*nJ|dwSvdOwt6tLz{>R*tEdnFX< zTM|BLgWt%S(@4~$ko?M=eij$kQCvVRf}OrEik8b;nyFj z6Z$6AXNvDw1x%33y_`6`{C-byr}nVs-0Y4-ZEkE z!I{Y!k&EUmD-0e?=Zbxszl*ewwwI@UT~cs7{b+d`R$W-#0d5p@9CA+!)!MfH4=0!v zqn6JZX02SVml|dxmp4i#8DH40i7(T{x8;n%JY9r7V-tHEKdOirTLhrHmB5Q*P>cuu E7c|+1dH?_b literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_loc_search_abort.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_loc_search_abort.o new file mode 100644 index 0000000000000000000000000000000000000000..1b9e98b2d023f5429de57555d871dc59835b1885 GIT binary patch literal 1260 zcma)5&uo3w@Z!zC zz?=Vsw;p=egZ>rXntJO^-(z;RvI5tzM1`0HY>yI-%@D zkb(sWL+<UdA$9Vb z-D?$2{v1~}R3Q(e)#J*$f%U#`?_2$0#~L}d+v!?%d+3UZq*^RK)l-e(q1$oXv0hE5 zb+acNeIsLJ4vcjpms``bJj)HpKgI>NW4C+2){utsJKIm1rR^8%4VcryEW(z9H`q;f zD-dIGmSA_ZM-2FAJP>vpQMeMjin&go3+ICXzGn*?czZMg?heTzwZXH%JHx@i*+&W1 z;ho)l69hee8!_T>f}fbs5h+INNf*X(-}3{AWS=GY zv%F4#G)722ty8r~tat`Ftx@+z`z3KGBOT?Rd#K{ykWdX}s%{MfSo5ul|3D(&mW(Lf zlGG^~{6p6AJz0}n(rZ)kC~ls?;5^2zfRKX~ zP$2bf^~I|7v357D4In4~fSG!gx{xjuQ`uLVuZ~sq)&OQ}SK0~WWq;mP|p%4(( zRLyrI`~9hNW{<{w*M9B#LCUOF_q1GleD3vJZ>pL3yk-r3SKBoT#@oV9p;X$|ih5Bm zK>0CFa9pQ51h$PZSw1>=(y1Nn@3dh_QrI%vkT=nq}BM=@A2cG9CF&7p?Dc zI}pfoPj%n@;Dg?Gd!;!CU7%L4!*~$8(Qsl1qFk z7N^Ax4Bo`p8g|-W3Om(FoE0G$n22AK(4}0w#p5#k{u9q70`(}8xTZjQ^0ivgZnuyg zoj1NZ@smM5S}_Tk$U(H2mx10-)VN-49#~voyfRKmzzv{}LM)oIAu-tFsbHkK9WMAz z=u=(SB^(z&t=@yI57|EGR@K0v{Ic3?9U1@dz&5Q`rEJ-)Mx$Nt*qw64s@p`vpKs%@ hwDDhgQ?M5Wc>U72xf1R{T>*HCHiHl5Ir(_ee*t2RetrM| literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_mode_set.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_mode_set.o new file mode 100644 index 0000000000000000000000000000000000000000..a58d4432c61a3f783224791998803a9551de608d GIT binary patch literal 1236 zcma)5&2G~`5T12@>QJF3RZx>)fdxfM2(_FNi6|GyuT$X?)Z`Fxah=2>k(ve^7l=4; z;mDB(;344FH{b$Kz>y0=<(3=F#9qgQ3nT4*-^_fwvmWohY3NPH7;s~dg_Q@;bDcrSd2$U6$TA;r7NCRmw>>B)G^d7U#mbsEG%$){|Z;l^DUr z*5YlmbPU-aU)jxG_2>68FX*AD9cwQp#>*4))R;_%mNB!OWlF2n%5t_dJ+lXvJ(sn7 zUe?EsCGV>R^?6~hP%7o*qEb`}P`Qf>Ov~(#f#r}!Do2O+y7j|@y$(bLk;T|{ILWTC zoluIUS%zH`?l4eh^NC~j5gpsb5ofk_qBzzo2b7`dn4t7$Gf?a)IixNqMNkIQ$;3KE z3D#0f$Fax#Gsl{FAN3z_9W~VAsHdeq_dHGz_V`uAn8yh|VnRlw7_BFrh~t*$hY-o$ zx!}+4?*zzWg!DljuSH_cRphj0pMq$#UvkOZiFA~|@1Yw7_<)3JaN~7b7{Hp(c>FUG z_ininu1mN&E`#65f_>pSLcv!7#Bp;KgO@P2g@eu)$3cDK--;9-U?TXN_J@cr2jz8tNpN@4N0xa%jech3AY0Fef$q=B+zKJusZ}rucfgc5S?|LHfg1jMpQTN+rQP@D&D$M&y#81+%ZxFQgFzA|5r8RzU}j`U z!ZL&)`)%dfius|Kh+Xdl6L35DBbk7+_<8nNISy6APs7zOO-)pRU9{Vd-Rc6{KpM>LY~ODbx1Vg*VL=J8FpH`e*&4eP&{&Mc*;VBZ z13nn`JiCSHxdJBj*?8lMD=SMdn}QmBxB z+9zv~S#kq8?UCP#&WqrbgM5^KlD zk*G-_`IRYM#lsC0mr%Qalb(;Bm--~%6)9ve(IesySy#pqr*##6|CKsnU{rmg1ZFBw zUWMo+jf}w>t`EoB^y%aej`HI)#@Zx6HlJ7F%1mC=GsoKe`SO+tLjV@x7E*H2o~Xj$ zo=A;W>f7Wj(Z^jsPkmigaGm{Oc^lR}Slfgc5S?{CNLo##C z7m)Z7T)6en8&~)hoIvGPi37}dy@{J%7|A7=MX9iRtgka`JjVEMJo0R`{DHXJj}@osN&Bqew0KI9mVMP9&E4a1uY2WaT-e ze|~2-+QnZ#j;nV?G0(?q$JN(EYH*ERX6u0j zOR^NZD&1zFPNqZ0?4WmS?)w7S*1qakZyiv3relKInM^>nM--4cr{+QJj)p_)03}#U zH66zubPgSB;{DWrxNE4P_J%zz^|<9>azPJYK_B%nxzCtT&=W`VNf*KIrWXg$lYQWB zHu9qc$Ra~}zfRO5vA`N)nzKbD8m+hHB0i9g@((=ES%6OnsD?06w~hqX91H#{0)DSJ zBXlcVCuHykQF|8gniP^=^6?jOaSh2OrkAI_u1Gj8K3cU48xCyrK-Ehc4uz+sdSg#Jrvsy= zH;M(_XjH4sO3P>!ih9K$*-OhY@KqZ4uIwooiv@W9lDN4t?jf-ZKzAyI7e=QT5BeYL Cl!E{O literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_connect.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_connect.o new file mode 100644 index 0000000000000000000000000000000000000000..73fcb8b64beb42a97a73fe951befa7acf2721c06 GIT binary patch literal 1252 zcma)5O>YuW6upnH4mPHx!3a31#MT5vCPO8WurYiNjZ-m&1u-VmfsR5_pbk@&xah{E zOMilY!CjZ`)nDM!jWKn{PVeQ-1LM>lzA!q&!NBS`)3jD9<>QIQ@XYR5 z_BgJkQgOZKSn)kIqrS?dGr3$co>j6+1_}>wfoYlT9wt1>IwmOX(FhcKNCCMsN*0vP zu-~@^Xu(>F={R<;edbsr_rv}JZlj0V9B{qV>z2z2d@jF*7<4(o7fi$vNu%}TlkmCg z#$H4kA2`frexv{?RLH;R6Sc@JxQd+C?2(9r_KQpzpU6k~M=o*|;1d$6A%>`1Ljh}^ z3jHe*e!sXPd?D@=Ht=F%u`j|$=$W|y!nnDL;x*JZ@S*qH#E1GMz7;8yF>y}B9b!Kb z3tZHF@aM143BA)VpDW&_3Y7OP^@=)0=UARCS=^oc{%L-e#&~-kAiJ9P!Ol{i*K5wS ztNV*v#tmLrgEUfd(V8s}gCb8&XX@Kx&nfP?dFpG(gY&8%SLwj61G~qd=p_}W!jn?1 zeyFbWf}!d4VnH|R)oP>CG@6B?UNOk}(sB&^I}QB5>@gUt3h`b>@x|y~Mb-gy#28+l JrxfF%{{uEcj1>R? literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_delete.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_delete.o new file mode 100644 index 0000000000000000000000000000000000000000..2e8b97ff5b453e425f2a322fefcf107351dbb0e3 GIT binary patch literal 1236 zcmaJ=U2hUW6uq-Rg*K_QsVN}prq+Z?J6S4;#F$vVQMb|*Vt88@SPKc1x=dA~i7);L z{U7?)hbI03{T047^~t{Jz3dK9LORLJIrrQ%b9d+CQ(iAH#y~a(F&IYxdrsg>4h=C_ z06(O@FFs$?Kjfm}wU#dm_kBNOQ8MMwy{bF}( znX})gg>6~L#bEKY@V0Bb>zIeek==W3G_8&$EP!G*`$&ydddGIdvIlB09#{3Yu+(iW zp}k3LB~qykHOZ4a0qF<0mT8&wHn0t(zV!a?!)k8#=~e~i6h8~FW$y~R!B#yX7G@E4 zTiIm5`-849>xja3uqByob-1wJ3*b#tn854(K5)B70l5=A3B1wkcCACSU@dM6VYlnY z!s<``+!f&+%+c1)xgOfzJ(m-BU49cW;Bta*m{1W(qxt0XW54Id9z<%N9T<(yF#^O< zA^)UL)*`dy8giN=&x_Vu!7dy5DF4JoseeI2HDr@@ODJH?BdPyD;@l}mk-jCzCvET- zS#1R$NsPwIr8VfC@% zxm1DjURWKckuiwi_;{pEu1F6SZ@N?vlI3Xvv2rN(#wo7kj5YhGY_CCoIqwO zNWuyPA^Uap*{c4&7?0lW2I8l0%0e!NE2rf*edFzsIWUgx;Y;I{m)`w%eZP^pG zl1iz1&#}~9Ev>yy@1(QYEj7b4JPo<~C^s#$)dRMLG>|*of6yrIKiR3nk`iPgw(j3x z*VuJmghg45Z7TN|@X@62m@P!d7TA@{wvM=Cy>ozfOveP?8jXP4Lvl!+<{9AaVZUz; zP=d9%={R<;HFm6#`{VutZlZ>+c*)h$JwJCjf#2mf5JN5}_=yP>kz%x-bU_?zQq@(;}7iIhl5~?9h)~#XyYaYw^HzcCB zL`3S=gigxf53;7`iJIh+UYU!BadQoW%NVh7n|Rm^nq#KOQWBdImj0CexOF5nW(3GfyMo0 zmkEInt^mCmQqh`qg~5SHO=r5d&VoO7eY)2*1?S5jFKrN<#N5$FdDhMUNUF_{VU*0HSn$36EH3>O2?!7jpE_=5F;x9MZ_336!l&N G8{sbuypwSN literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_init.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_init.o new file mode 100644 index 0000000000000000000000000000000000000000..d58b1417f8f0508a44b0c815872e267fc1ed878d GIT binary patch literal 1232 zcma)5Pj3=I6o0cog*K_QY2$)KH(C=~>;x)_#F!}mQMb|n2X5;^S0O1-muZ!F@ZyKi zZ{fvT4^8|6`YF6M^<;1Q9(Cv%wz~bUpjR)5)?1oQg5f){) zwEGPBaMTla3%ziq?sK z>1TDS7Ks&3BBpQDdC_`nIFyl&@=rXk_|FKahB8&Rf&|t)RQz`Y@=i%c=~kpp$>0y7 z<|L9eDI~o%!v}HkB$A8BUB^ND3*(?ZseeTX8B81#@J!WJvGTLLAAbK;JbB-^`jqkg zSAp_=Sf8d5G0<^-JmF?nCw*X?pQJISbD!FL-Veq!iAdHnC*1t{>Xu1?53a!$LQ>H; zs~Vfxo9tUnO2;$xvF*jw*A;pIRNu07T^Ob5Xd07Zn*{tTWrd2JK x>cxiD$mYzVMY=bRu<%`4__Ev)SeHs*ZR%kJH}n*}z64M}AH_>U_e;ma{s-ZDgbV-x literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_query.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_prof_query.o new file mode 100644 index 0000000000000000000000000000000000000000..aff11a687c48f558fe77eba666b6763ce36d0a6e GIT binary patch literal 1240 zcma)6&uQ+qQz-?XVDkP=QWlaB?feUI4z+In!3neThw`)1zm%1#~e8Q7v}EBcJ?q?DHQH$$$Ed}v{BG1>9l5a zU0Yk#Gx~03C9}4c(y~0uGmyKDcFVR}U0^Asf!yZC-9~Za(MlbHN{EHoqJN2d20btBal_*Teve;5411j5GbS`d(r7;ULfCJ3u@8~jdjXSC z93?;+74pyeWGymFt|O;8t0ZEh^_Ip=4CJHyLl1=t@DT~skWJRDqJT9AQvZTP+$*6- z--7T-8~jGroJ67~h2&Re^s~6Qj^Z3@5$yDQQS7u&@?DX_eN52xl1s@|FpM z56+Cwh+H&hQDN|4GFR-|>|LaNw7op->w<#g>5rDTVcCV{E#O8$$07H$P_1q1|8Rm? zF>3joVb;p!dZ}SHa(Sa$c-6ncTT^dMJm`Du4p5T%lG*Ql-}`3X?9A?mf>C6QfeZ$5m@t5vO9H8p zAr1==g!I?NtwrN~J{Gyz3dG=U;72?LC(+aNp>h~3g`S4WpX;hR--46ysS?v(Lj3qA zyH(E~|2ise$VMK9OGm{wUGr_n+B5f^-YfH9U^_#z)9wp^QZDyUi&uLCr-`CgN+dL+ zEo^N=PwEHB^<+A|rloj_Cn0km*RyP^(FV4LX&|$+{h*fLezIPLIVH$KY}tRAU13*! zDvPivTT$*Y;Qe7&SPewsxY&}JV|Tc)-wEKmmau>~`hDO|j|jPwJO#Yj>vruuv|ul8 z3E{LG17Y`PUhqHkI@aiT=R6Oc@pCUH@O$|+#E_R0e8YlpI1K!yC%KG}=RGS@MuIr7eEJr#!x@=^Vfhf@E73H6X6`<79_p8Hb&j*0tSxr+2H zxjt!wKbY0W%8jQ%x3F;xO1lN_A|!X?E3O6a}7SY z0P=om&a%RQ?nefl+Y3n$iT6BC=enfe^PC@-H(^!4>Mn32r{g2@ELX1V=;ztNEE$z- z#xN_zVzp2+YniN3FvI3Xvv2rN(#wo7kj5YhGY_CCoIqwO zNWuyPA^Uap*{c4&7?0lW2I8l0%0e!NE2rf*edFzsIWUgx;Y(v=IfiYuhl7F9>!7GoC_Ge?_2JlVTlPe) zq*AKhb1ZdNOKY#wJLzn8OU>{MPeblL%1z5`^?+?54df2@A2f>lPj>3Cqy$-rt@}6F zHFn(>VNn)io60=~d^G7hW((1=1$HH~tt0MO?;PMA(=ma!MkC<%kQ`E{c?NiU*za2d zlwd7xI*#3IjU8*`{>;CJ~A#E{DgequsJq!_IyT@c4z*Y_ck zeH7r$;&TF|FhcryovcM-$u;D(Mt(QiFOEYR=_vo$MH&Bsglb5Wb*mV_n#VH!4T8avotaWw{U*s#pZV>ePEjR(<4zk6(AE?o1ChF;4U~zxh zWkTSCD?o3CRJ3MYVQ?T))0ytAv*3?ipYC-{!TIvX%iEA}AkhJ?7c`u52Zd_wQ2WOU zFe-X2pVN(6xm+(bj7Bc6mke6)3jY=Gr5gCw>&Z4*}fZ* z?4t$FYW+@tBt}TTsN=mz%(;x5-r1)h8r2KUn6;3O@{eq^q5z+fP!DdrZxsXBbHL+Y zkyvNTif~=f(s3F5MYcE>t|N3gDu4hMmoaz^V;lI;{sQ>WocOmQg#%2yBVrq`$9;~A zaS!~VZ8+wheYxXe{lyN{&jVZYG%^NJT#HU@u{!C!v%Hf=|JK|=ww(9C_J4V+U&Dzl z*XO6q61ZUvc9D{b-r009I6&k^b9=@eMDovUpXM5L;kx3|N^RINVdoSir6A*yds3*@ zj^$NSP%BC;pHtLYxm+(b)J86^lvGll>86TzQ^nh5j6q$|W;VwNZi>!ScpX4NjN-w0 INYOYU#G$)Rg*)+#dT7viPR+ExIn~# z3rCJT01pATz5y3_0*+h|D!1HVCiXfeTo`Hh`)20bo%MM4OuIoe! z3qb}pK!o|H*yC91b?sX!A(aMe(pBkw1MaSWQKhVOOM=Vve10KZh?=+`Z9eTLlkovu zZqDB}ipP-o@s-`~R(^gj@q!+T+OhUxWV}2x$A)d48smvGT%@#WwIpZSlXJUo*)v(o zh59Rx~z_iTX5Lgyzq1VDMsr_C*ru{`5{EI zcP{v|`#S-07$JR7$7_+8a}_zQ*`pvD?Uz_EcOo6-AA0CU0X`t18r*o@CI+zPGamnp z#JyW?gzMt2j?3UTvS44hj!^Jb05RNL#o!f;ZQ`Kw#c)uc__rd3N0=V@VW9i7G`C*I53KIb zZ<#9y!8*`GAr-CJ5*P&ECH3tP2RHIf&!N7?1)NtOtqz}a z2ZpA%DrMbhH5%=D$LN$Rdfgz|spS~>Dh+&B_6&^G0&f3Oco@1%$qfJ^p%kIW)vz z0sN5qzW8EM|B#D@*IK?PZ2Er2qHqzpOr0vH{$k*Hp!BsC3eC6RB6z7p)kBD#|6=!R zne*Rgg&kSQ#bEKQ@U~;TJ2tz9-7`DwZqsO50-%`9K2~Fu-ih6??15U0$5p*8EOkdq zXm1kRiBxJsP4Xm9K>8uBWm;yv4QvCcFMY80sG8e*wq1ca#m@q4*}KASu~koqg;|8% zRkj%L{-7hwI-;;0Y)NKY$6Q$N1@I$Nn854(K5)B70l5=A3B1wkbgV8~uogFku-o+$ zVfCke?war(=4fl@To3KR$NsPwIr8VfC@% zxl)1hURWKckuiwi_++F_u1~r3tRDf_vlppp#^{(VgxS^-LViJ_##h7~IrZeom1qtaS`+mQf`MsI9vv1#*)G}iXxG{*s+yiLZjxRkE z#9;$On0^U74%FTje?&r3w!0=>mp+x@{`xmXN=Q2rTt=tUi7*i>;*r1lycrG$yKuQV z{ZP)FLj2cvcDI@T{WHrOIw)37E3f+6>vMgenM1wb8+5dhVF6SMg={QdA6}Sk!yLyd z$z)9JSw`$YNhvQ=`>9MO5lhQyIR&`~SW7qbRu5PLsV{eO{IF3xKH9ItnjkVi+wz9k z4YutGvj~f_+rl0Lc{J`@dJEAqZR~Pp8t1ZQysIV6YFDLD;td)V(A z1C(GdS+^{+*SfHb(bCIZ;oiXDI8+r9TCTPJ??W{ zjCo0boeqPv~r;#y;;#zcLi`7Z*o8{d!`nTo|vgN!NcK*xT{Tgm; zxjw&Tw!j1Hu!odXv}a3TaEQo_=Jt#`h~#%1pXM4Aa9#1!%5B)SVD}7UwV>dVds3*@ zPLx$r&?;&zpHsD3xm+(bv_>wkmNZg!3`@g*Q^UW@9D}x^&1{YlJQUrj@CJa27{!b8 JlzjZ){{U2$i$4GW literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_scan.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_scan.o new file mode 100644 index 0000000000000000000000000000000000000000..b94a1d42f513fa19a92bd4a5bbf730e4521cade8 GIT binary patch literal 1216 zcma)5OK;Oa5T11&B&|@=@=AgQ78EHV)N)D$5f{iifJ>?-hj21ZYBiCX2aXFw9Julm z;KrZe)BnOoo~MRc4s}i`=P4W7-JxeK^hhjzzz>W`MDqs zs}O<7*Vyxz{=On7Z}r3SMH%jfziVqyvJ|@^ z-D99mXG6#AqIYcW`vTe4f$CWA98mX6#{{)Ioq}qQDIj%D&4bz-4~NzWC0I)}9mgJY z4;^dj{?IwxP1I0p!>*S4+jcRzpo_1gkGh!L7fdMViKF?Xi{N+1jRWY(K62-c{1^eU z$dKNz6SYVzu!flCY!Qh@>&54Y52T~~W7l&Q;1dF>AxzY5Ab~X}g8znq-zm-r-5S>k z8T>`m@giQ6Lefht0c(f?r89&9+Uu?MPN)^I4kC^wqB+L8v0y51}mb)#9U uwW@8ST`cKUgCzTwW8iBv@IBcxF#HSio+WVu6|9?B<@-wECDAFy!~G9K0(>X{ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_scan_abort.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_scan_abort.o new file mode 100644 index 0000000000000000000000000000000000000000..174879b259c38bb5b4a58f9a7d99655cd1c4481d GIT binary patch literal 1236 zcma)5U2hUW6uq-Rg*K_QsR~GR)tXSTlckbKj8XYUyOpN!z}vdejgXY0%Ty&k_~MVy z|DkVvXyPBxU*TI*pX{67%j_(a`rsrp=iGD8%-x-j4`s8$7z5Q9q+k*OY|9{&9UD@x z0Aa{|UEEwW-DjTYhhtcX$EX3=TWF-}ebWV87o+&Gh$^-N!zU0>ZYX$ZiD@fnee<}7Or z9{F?SzBOlJ$BSuSmoyyDKU&^_RROEJz|Eq8L;iWOR^KuH;RLH{)(d&ls#hwFa?@(& s3uf6O<4Z?a_%bbgTkZ&~^F`=0XdmNvxK9vc3jig=1YR7vV=+ANzlIQnX#fBK literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_scan_get_param.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_scan_get_param.o new file mode 100644 index 0000000000000000000000000000000000000000..68d667147bba9cb10b6c92a47c6c569f52c98ca1 GIT binary patch literal 1256 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 J3E6nye*i6liE;n{ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_status.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wlan_status.o new file mode 100644 index 0000000000000000000000000000000000000000..cd1693921082ebd076aeff9e7fb5966ef0755164 GIT binary patch literal 1212 zcma)5-EI;=6h5;omD(nyXya1<_5vf7cC%EX#F!|*OXIdAg^R|-Y!|u_l2UXTRHBJ5 z;3N1N#+yEbK7|)vh5-mp^oM@i^GCXs$>?^Md-|@KHD70Uviba$o-=Yr z77F*#?s{&k3v3H%v~alpuvy;U+iAd(5@X9Op{>))Nw&#uDccN;!KlaG79#fr zb|mw?Q-gc&I2b1`cfn{424MJo3do%`a$vOky`Fc57OZ8socrC@kbAW5|7^F>N5{Do z_~}e*0VhxcejRZ+-~^vBp(Bz;~aNYtc|{K|~} z2Lltu%c!m4N9&{Y(mBb!B86>C^oRsa)|IiuSzU$Sf2B?snN$yz$Xo@=tB?rO$QW#3 zAMST{cJfCj`EW=Sv@k%nm{;NETwc^GPqoGQ!JfgM&@ECCuFUwPk@hATSsM375 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_write_cache.o b/hardware/arduino/mtk/system/libmtk/debug/vm_write_cache.o new file mode 100644 index 0000000000000000000000000000000000000000..6f28d258bda527db9fa7c17eb9f1afc8502dc170 GIT binary patch literal 1228 zcma)5O^?!06uqx}OmQ>=WF`WlHabQSrzs;*LQD*wWnxFnz=D{VPGK4$5z*37i3>L_ zUApuqxOF#sxB3fQx-n+lk+{%%d3}7Xd`aIq_uSKWUvJ-gTQzEoF%W}63g!_&iwA++ z)R2O8kYVyUd_UZHQ~4g>Ocr{<swLCOD@iy_OeQDNiLA?eq57kCEEeg( z>Bi(;Eq@59pWoQkcInrTf+*;rtRLzx2j(lM@7iY9>h^3*=;d-jNi~PZPS`#m@U; zEY1?_l5~@SIvNjLtApq|9D9N}_EXihU%Q|lS*`_YXEXxU8B##*teOM0I~)w`XK2A% zs^z*)zjN%`BkzO$11_V7+8gw|)Z@0t3H%D#ZXE@z`CRBZhv+r&NQ}IE$-Z;=!Twv-( zqf|7^My=MYw#-(sWK>NuJ+WOAZ={KL${B;Xyf~Gn-ow3XRo_o%@XXcLQ@xE>}7-JwCgDjjefL%c%#f2dY z%MgRO_FE3xzQrxj`m-5m&V&fL3tADh!DKwPU!etSX%^?s zsDHriS>VV1LvLV?wl?Z|Xn(sdrVw`Vb&PQrQ}~Pt6(eaho_sO*w;K-ma$w=a;uk7(#FXU%B{q z8ndP_D0ySWzU>6K>2liFRR#ONgVhGG!C_+`G^46xSKg_%+IxD?24>S}SIUOjZZtae tuGuYDjJip#7dAKXO`7|*=@)yK!UL^g{p2zL-KR8O7K1n*@;{xuf>!_l literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wstrcat.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wstrcat.o new file mode 100644 index 0000000000000000000000000000000000000000..adf74193cf9c71b3e02baa8b228acd44f3860803 GIT binary patch literal 1208 zcma)5&ukJw4ML9=ct}o#^#kPB;6)(YK7e@hZQW z-`>vZ1zzBJDBec9?bw|@uq@JWaewb_tFrfCvk4I;%3^F)U1OKnmoaStih>g}eKV{xPKFZ(s(Nh6FBB2_x$-28JV9k-#zapVC%O-s*D9F80?hp1h z5x+?vp&~^@6(<=eE+LOoj6H#!?rDC#0w!$KWRvU3SmL~{!tcLQCk#zb9w?zR6)3O5 z#UPE00iA1Srp>QT{_r$EOJlqi1jrWiDx}Wjy?Re(+T!~1FY^o`I0x%U$whNk6?_j~ zYC6)rRTko>eoXheqTm=jR^EjT0UHOv&9Z?*@o{;#v2V;dz^a>#Qqi;;wOX^fgc5S?|LkhDP3s)!_5V9_Eagsz+tLB)mUyMRkj6QtaXlUgJaA;H-K5eKgP z01og&xK*M*0e%H1P!X5jU?%p)X-Bn@xx)Q5IvX>KePmE{BpV#nSAma*F{U zPX@y7APU#Ro@B1`f(z%Z0DfQ#8+d0t2JQ|iA$Oh^fOm(3f%6hA*o)gjxc$zdaK`@2 z{0Ce^4;^d7_tM$6d`_VH{0d^s=LDaypd*q->&X|zal_9;h!h_@n9bfN1jwO6{&}D5 zMP|tj07~6J{wj3 z;Aj)^L;466DI%)4$Ut!kd7N?_2^@4z^ZOOBV525O?k97J^STPZ|4N-OG=1|x37zRc zbrmiKWn>KKy>@2W{O;rrPwTTX=4(NMY_YCF>P+41_hhCm?l1o`&k%xhu#S{mv}RSo z`{0$PGo4#yA%E)UbgnB3&cS8nUDyz?aRA&b8#omomvHLESF sRVf z;uqNQ6YRR^5{V6b1uIb5bqDu)JWdp~5+lvrbM8H!GoHu$hSp?^foKeJFk=8cP9h~w zkb`B2!Q@NgNkV&9&!(>rquKLWxE1}bX7gD%&YVmRrNdY&{y4t%sh3JE4dFO>B4yB%kM{P*wy6&c$3#J^R(l}lI^zR-VA@l; zRVc{X$Tj5+wWz)-t`|2q^KwZkDMhH?LNA-t(KSU#TUxtX(e!q+*=cn3Zl$U literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wstrcpy.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wstrcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..961ab01e4e63f97d8b0e3ecc18c8b8a028f8fd7e GIT binary patch literal 1208 zcma)5&u??to=8r+P0GqkJ*C+XACk#ZER#~#LZKev;~r5>ClP8Cgm2AQAV z*?PP5>&J2Jjx6S5qJCU^J+R)4J-0iWpja=L@9CN5@X+l#?nJNWa=O{~9DU2k8?W-4 z`R(njUf>0uhvIFt+m7Ao1Ir=}7x(w>wkmrMHk%MpqAbQ%)irjBT@EE#ily0AUnnX9Mqy$H3ho1?0~20`Tr|FmPU?1#5BJ^W1*t&~wKA z$NUFeLk}Hm#P`zKwtP;Y`uqxF%;yB3Frg!oM)S!R#eTz&Lx|Kq2$+rH7Xsu^A^*Hj z)*`dy26CFSMIts@@BEaBfqay|@1sxwJ|dwSvdOx;C}7Qz)W0GT_em(yw<3Jf27i#X zXOXB$A^DX#UB$%>6qitoW2gNku+uroZ$%0POxQ&HChN*r;=HcH@4r$f3{9&CO6W`l z%ByfONF!rF-?cN-=2s_wc$%N3FHLESF sRVo3w@Zulf z!Ha*0Cwu6hpnrw8T5rASd&~|?Idzhm?|a|-cHZurolh0B$`}JR7^K0E0O~Rb=Erg>al02v!B*&JIt6FR^Zc=P9Ii#4M(W?%@%T~?&SK|UN`D3E(_d`8 zT|E7LQr%I7JdD*&s_zEY`;l-DoI@0ArP2dE-5egdUB?~kwM<4g`@+$8jI8lCyPeJF zH}xFP@hlYXq1|@uP9NAN(okV<_kOFq`((Qb3tE^(*lKW%U1Qe+ah707c2m2{fRDxl zVRsOPE3v1T>l|?5d=S9*ZD9lNj7GrSAqC{l@*ME)a4>KV(So(OEri?e90_OSeat1` z7J8_q3!azy`oiM`L66@+jCh>jD<*VA(&%~eg>l~T;s7Fz&l0AqJU)O7D&(K_saj-K z+(1sxsB@zIuHaOIe3XCWq0+w~p&Dwax^)z=<{PE|KqCJosVLuy^eG$sLDrr|vL=P( z*JgCu+(2;&wW~Pk{bD$&PwHEdf`JK}h&NPS6)T+8gYfsC(g_2T>b?@VP=WG6i27+{ z4CuQaPPN(H$sd~Jr)iAW`~cZ}J_v~md0Ee#YV-T6zf2keun6l&$wkksYIq-HYO+$_ z%5(8cFQ&e(Xt?^9m3Lu7z{Wmsvt-~>cwVYE_KX<^ST(azESOfKT5VQZR;y4nD;61E lJHo=7XyILQ$6)!JQaS2Z0$=7aVtiS?QxY3V|56+e_CL2Zco6^q literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_wstrncpy.o b/hardware/arduino/mtk/system/libmtk/debug/vm_wstrncpy.o new file mode 100644 index 0000000000000000000000000000000000000000..6183cb4bc0e91270033b5413a531777a82fb2395 GIT binary patch literal 1212 zcmaJ=O^?!06uqy&3^fn@}6;0B?B zW5~b;gkkG zly;T8@-n}ZFBY>>K`zL7C_lg&U9;O80m~u{l@IqHwrl%)J1tlf!Ysn#!7aAUt_Kn< z$x`g5aG!xZosI2o57D+<9CBuvFJ#+%V}m^C+Fg))(<#W-gaUHsy9MAGPe@`dra>%{>?8XsI( z%y|YUq4yt$6VeUje%0KeZRRKOBp&oqjz6}(x=Ly%pB607O zt8ib;^>G{gMdsfZ?jsZyE?g59S5Uly+9p2qeNlX9pZHplLJ<=KBHrNjc+AnS2jR~@ zt`i2Fl`oaRg$|StI^VE#Foz5mR_U4k*Th{SW%f Bed7QC literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_xml_get_error.o b/hardware/arduino/mtk/system/libmtk/debug/vm_xml_get_error.o new file mode 100644 index 0000000000000000000000000000000000000000..dcf2185f4009e3d979cee8864b2b586af3603d8d GIT binary patch literal 1216 zcmah|Pj3=I6o0cUg-VRHRtso!57p4nPL@g{X-q8T&(gRRQ#dqU)`e~gNh!Ka4a9?A zzz^Y%&y)b{8&hUKwv7`|IMzx5sL8 zg;vUX-*-m+6X)0yj_3OWf0DAwL9)BV-ewaPv^ZO2%lZnt!&W0HmS!3DK-*xzhvU9*+la!K z*j1kIop9le1n?tQxWL=PA#i^{0jcx60K7Bk_q|h;U@h(n;rH5S!W*ie`aeEI3AJ+} zkWx=8flr_Z{yoISz$f^O2?LQhT2Hz-jz>WpK_nYVn9lO(0CLEXKCDxrt+p&p$B|_5QKfcD2N8gh!jN^eH2hfv!lx{rBV+2Sd zL;7i*szqXjO~mw#Ixkvp6^Am?QU00l75@nV)ljDDR*=A&M~eT3K;9|IDBZHuDH;4m z)Eq~$CWWNeruZ-}ZX!94+)W&`za<>hC-tugA%lq%0=}ubDpr1)55liMiYFf!Ri7|{ ze=1Nu2y2rxA_h9nPsiN!>ZA{i^5ZndbnX+I%?H7lBoWDa)|i`JU)?e(2*3^4L`W+7 zW<_IDdy{>uN$F^&KDPas`ns%96K5YSZ^OEP^?l%0-oz=po3B)B=5-<1WviOYT6VQm xsuvq}Bb&2|HtF8D!p3)LVBmV+hcUJfd7+DZ1TO<9z&ZBm9XM3{+OM=LvY%RRbuCW`T z1WU3MyCpnepo}L&$Lu0Hwu^nvZ0ksItWyV+1Jf}<>5j*s*duaCom29l^hU#>^%5mm zOEDeC9&}F}YwZ2df52_jPb z8{he|_#CyO<9H-HW-o_1b>m;`;oS zxq=WZ`}c+BtO?9NXHrn#=)Aa*|J-w^uWn4 Cpnn_y literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_xml_set_data_handler.o b/hardware/arduino/mtk/system/libmtk/debug/vm_xml_set_data_handler.o new file mode 100644 index 0000000000000000000000000000000000000000..8898fa759ab29d5a201b2ec4097377bfae97a462 GIT binary patch literal 1252 zcmaJ>O>fgc5S?{CNLvVP1;Qy-F{q$~(3MjnQK3qZ<`e1?)a1|;#z`y^DQSYUMU6Oc z;lN)&;%{*4p$8mpz4uO zdT5Bl0z{zqJ-QP$KjyU9y=GXuroqGTsi7q_I8!fr$Ltu2k(ZIu*L_u;Z^BvhLeccM z5I;Zt{p+N#AshL)SUf3w=vYUcw$*op)v$$aHSL2&+i?Mk+3Zt2Ug;jXb;lj(#bi=9 zTf)&djFj;{wVvACOz3Hz<|)WL#`$c=uC;(AFb!q)cAr#pyD!!&5LO~=jx7gou$$~w zKxHwu!d8_>40wOg5q1qxxE?lT<~nUIoFf68Rs_7(?*n(cM97`uY2fv4r{f%;1$%K@ z2)9)`6i$EY0slkqV2!pn?0aaBU;8;h(9drp&iOgP4=m`2q|yE4i{QBL^8g~nXAeeK z?2z9kf}XHV)sG4b9jPm#VQ z&nIp02ebVV^Li2`zcQg;#mNm6=TW2E2gl8g)fx&A^S=$aZ(S$`Cq9M z28P|oO5jolst1A2Z5#|%k!+2G$=S&t8rDZ;{mhXzJ->X*JVOAk zfIMHiXIWuD=Ocsm?TsXe#JfJHeO*%UI^)CTbyyRy)&Op14ZLJtWlQBfW0oDPqFLU~ zm{z$^sN}0wHM4EzEporZKLUQE7Jg;!0IV79hI<;r1wO}hsS5x(#1(vr=y_B;{C`*{ Bju`*| literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_xml_set_doctype_handlers.o b/hardware/arduino/mtk/system/libmtk/debug/vm_xml_set_doctype_handlers.o new file mode 100644 index 0000000000000000000000000000000000000000..f634280125731a720d3c976d1bf2e5376dedf267 GIT binary patch literal 1272 zcma)6Pj3=Y5TD0Vpf(NCV1&BSO;Zyn_GPI=NiRzIvovm{DI6MOvRz;m5-4@qYKaFg z9{d3P2z~``{SNl%&7%h|?Twqx?Ct~XfjG&&-^_1*^X4)8mQQ89!WaW#3{o(S0A72+ zLe3SWUd&UrDoN4+0AS|pH^}_$Fop)jC-1v+3W&Kqq|Tz*n8S2?d@*XAry$P zMYa-*vpejrlwe7=%I*gqG2p{d-!Yqrj_qMbc(&E!j&Sj##6{mH_<;!pkvOU+T?C(p zek>u9eeqzjdao29gAD0sb)pxEg|DJdHCsfY(SEY)c?;<%|I9~^1^9{%^$;fdR*}G- zCxZWuj(5L2M(ARmPRKyQ#Nj0JdQwRGzziS9%~d3CAs5Am&UYIhnv?jg=t2n-=j8Y% z`ifZKEFXmHKY}Ne-0o9G`lkcsgFx?hY7Evecs?O!cPIUVo1dgHruR9uoB1GYOq1w& z{q`r^&HcqK^8^xv-Px0hYE}ZwMNv+3dm{owia+=<%{3Olbbw##G`+S{(2ZK9QZF}*Mqx)U8&vTY{~hpKHSlY*M_|lp>&`cchb`e56H5Se N=T`AT=@jEd_zTR2mu>(6 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_xml_set_element_handlers.o b/hardware/arduino/mtk/system/libmtk/debug/vm_xml_set_element_handlers.o new file mode 100644 index 0000000000000000000000000000000000000000..42d9e247c8be559baeb26edd002c51f2d41133d2 GIT binary patch literal 1272 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 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/include/vm4res.h b/hardware/arduino/mtk/system/libmtk/include/vm4res.h new file mode 100644 index 00000000..21092df3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vm4res.h @@ -0,0 +1,627 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef _VRE4RES_SDK_H_ +#define _VRE4RES_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#define VM_RES_SUCCESS 0 /* load resource success */ +#define VM_RES_OUT_OF_MEM -1 /* memory not enough */ +#define VM_RES_PARAM_ERROR -2 /* parameter is not right */ +#define VM_RES_ITEM_NOT_FOUND -3 /* resource not find or file open faild*/ + +#undef __VM_RES_DEBUG_DATA__ + +#ifdef __LINKIT_SDK__ +#define GetString(x) vm_res_get_string((VMUINT32)x) +#define GetImage(x) vm_res_get_image((VMUINT32)x) +#define GetAudio(x) vm_res_get_audio((VMUINT32)x) +#define FreeRes(x) vm_res_delete((VMUINT32)x); +#endif + +/***************************************************************************** + * FUNCTION + * vm_res_init + * DESCRIPTION + * Init LINKIT resource, will load current language table into RAM + * Need to be called before use LINKIT Resource. + * PARAMETERS + * VMINT32 + * RETURNS + * VM_RES_SUCCESS + * VM_RES_ITEM_NOT_FOUND : file cannot open + * SEE ALSO + * vm_res_deinit + * EXAMPLE + * init the resource + * + * vm_res_init(); + * ... + * vm_res_deinit(); + * + *****************************************************************************/ +extern VMINT32 vm_res_init(void); + + +/***************************************************************************** + * FUNCTION + * vm_res_init_with_language + * DESCRIPTION + * Init LINKIT resource, will load special language table into RAM + * Need to be called before use LINKIT Resource. + * PARAMETERS + * language : language id to load, the id can be get for reseditor + * RETURNS + * VM_RES_SUCCESS + * VM_RES_ITEM_NOT_FOUND : file cannot open + * EXAMPLE + * init the resource + * + * vm_res_init_with_language(44); // load english + * ... + * vm_res_deinit(); + * + *****************************************************************************/ +extern VMINT32 vm_res_init_with_language(VMUINT32 language); + + +/***************************************************************************** + * FUNCTION + * vm_res_deinit + * DESCRIPTION + * Release all LINKIT resource, will free all memory of resource + * Could be called after use LINKIT Resource. + * PARAMETERS + * VMINT32 + * RETURNS + * VM_RES_SUCCESS + * VM_RES_ITEM_NOT_FOUND : file cannot open + * SEE ALSO + * vm_res_deinit + * EXAMPLE + * init the resource + * + * vm_res_init(); + * ... + * vm_res_deinit(); + * + *****************************************************************************/ +extern VMINT32 vm_res_deinit(void); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_string + * DESCRIPTION + * Get the string by ID, no need to delete + * PARAMETERS + * string_id [IN] ID to get. + * RETURNS + * VMUINT8 * String pointer of the ID, only current language, NULL for not found + * EXAMPLE + * display a string in resource + * + * int x; + * int y; + * int wstr_len; + * VMWSTR s; + * vm_graphic_color color; + * + * vm_res_init(); + * s = (VMWSTR)vm_res_get_string(STR_ID_HELLO); + * + * wstr_len = vm_graphic_get_string_width(s); + * + * x = (vm_graphic_get_screen_width() - wstr_len) / 2; + * y = (vm_graphic_get_screen_height() - vm_graphic_get_character_height()) / 2; + * + * color.vm_color_565 = VM_COLOR_WHITE; + * vm_graphic_setcolor(&color); + * + * vm_graphic_fill_rect_ex(layer_hdl[0], 0, 0, vm_graphic_get_screen_width(), vm_graphic_get_screen_height()); + * + * color.vm_color_565 = VM_COLOR_BLUE; + * vm_graphic_setcolor(&color); + * + * vm_graphic_textout_to_layer(layer_hdl[0],x, y, s, wstr_len); + * + * vm_graphic_flush_layer(layer_hdl, 1); + * + * vm_res_deinit(); + * + *****************************************************************************/ +extern VMUINT8 *vm_res_get_string(VMUINT32 string_id); + +/* DOM-NOT_FOR_SDK-BEGIN */ +/***************************************************************************** + * FUNCTION + * vm_res_load_image_start + * DESCRIPTION + * phase out, no use now + * PARAMETERS + * void + * RETURNS + * VMINT32 + *****************************************************************************/ +extern VMINT32 vm_res_load_image_start(void); + + +/***************************************************************************** + * FUNCTION + * vm_res_load_image_end + * DESCRIPTION + * phase out, no use now + * PARAMETERS + * void + * RETURNS + * VMINT32 + *****************************************************************************/ +extern VMINT32 vm_res_load_image_end(void); +/* DOM-NOT_FOR_SDK-END */ + + +/***************************************************************************** + * FUNCTION + * vm_res_get_image + * DESCRIPTION + * Get Image data by ID. Will alloc memory, need to use FreeRes/vm_res_delete to free. + * Only alloc 1 time for the same ID. Will return Image size at the same time. + * PARAMETERS + * image_id : [IN] ID to get. + * size : [OUT] Image size + * RETURNS + * VMUINT8 * Image pointer of the ID + * EXAMPLE + * + * VMUINT8 *res=NULL; + * VMUINT8 *target_layer_buf; + * VMUINT32 size; + * VMINT canvas; + * VMUINT8 *canvas_buffer = NULL; + * struct frame_prop* image_prop = NULL; + * + * vm_res_init(); + * target_layer_buf = vm_graphic_get_layer_buffer(layer_hdl[0]); + * + * res = vm_res_get_image_and_size(IMAGE_1,&size); + * + * if(!res) + * { + * return; + * } + * + * canvas = vm_graphic_load_image(res,size); + * canvas_buffer = vm_graphic_get_canvas_buffer(canvas); + * image_prop = vm_graphic_get_img_property(canvas,1); + * vm_graphic_fill_rect(target_layer_buf, 0, 0, vm_graphic_get_screen_width(), vm_graphic_get_screen_height(), VM_COLOR_BLUE, VM_COLOR_BLUE); + * vm_graphic_blt(target_layer_buf,45,80,canvas_buffer,0,0,image_prop->width,image_prop->height,1); + * vm_graphic_release_canvas(canvas); + * vm_graphic_flush_layer(layer_hdl, 1); + * vm_res_delete(IMAGE_1); + * vm_res_deinit(); + * + *****************************************************************************/ +extern VMUINT8 *vm_res_get_image_and_size(VMUINT32 image_id, VMUINT32 *size); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_image_with_header + * DESCRIPTION + * this is use for vpp file, get Image data by ID. Will alloc memory, need to use FreeRes/vm_res_delete to free. + * Only alloc 1 time for the same ID. + * PARAMETERS + * image_id [IN] ID to get. + * RETURNS + * VMUINT8 * Image pointer of the ID + * SEE ALSO + * vm_res_get_image_and_size_with_header + *****************************************************************************/ +extern VMUINT8 *vm_res_get_image_with_header(VMUINT32 image_id); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_image_and_size_with_header + * DESCRIPTION + * this is use for vpp file, get Image data by ID. Will alloc memory, need to use FreeRes/vm_res_delete to free. + * Only alloc 1 time for the same ID. Will return Image size at the same time. + * PARAMETERS + * image_id : [IN] ID to get. + * size : [OUT] Image size + * RETURNS + * VMUINT8 * Image pointer of the ID + * SEE ALSO + * vm_res_get_image_and_size + *****************************************************************************/ +extern VMUINT8 *vm_res_get_image_and_size_with_header(VMUINT32 image_id, VMUINT32 *size); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_image_and_size_from_file + * DESCRIPTION + * Get other file's image data by ID. this api need application to alloc memory. + * PARAMETERS + * filename : [IN] File full path + * image_id : [IN] ID to get. + * buff : [IN] Buffer to put image data, if the is NULL, the function will return image size + * size : [IN/OUT] when buff is NULL, this is output parameter, will get image size; when buff is not NULL, this is input parameter + * RETURNS + * VMINT 1 is ok, o is error + * SEE ALSO + * vm_res_get_audio_and_size_from_file + * EXAMPLE + * + VMINT result; + * VMUINT8 *res=NULL; + * VMUINT8 *target_layer_buf; + * VMUINT32 size; + * VMINT canvas; + * VMUINT8 *canvas_buffer = NULL; + * struct frame_prop* image_prop = NULL; + * + * vm_res_init(); + * target_layer_buf = vm_graphic_get_layer_buffer(layer_hdl[0]); + * + * result = vm_res_get_image_and_size_from_file("E:\\sample.vxp", IMAGE_1,NULL, &size); + * + * if(!result ) + * { + * return; + * } + * + * res = vm_calloc(size+1); + * result = vm_res_get_image_and_size_from_file("E:\\sample.vxp", IMAGE_1,res, &size); + * + * if(!result ) + * { + * vm_free(res); + * return; + * } + * + * canvas = vm_graphic_load_image(res,size); + * canvas_buffer = vm_graphic_get_canvas_buffer(canvas); + * image_prop = vm_graphic_get_img_property(canvas,1); + * vm_graphic_fill_rect(target_layer_buf, 0, 0, vm_graphic_get_screen_width(), vm_graphic_get_screen_height(), VM_COLOR_BLUE, VM_COLOR_BLUE); + * vm_graphic_blt(target_layer_buf,45,80,canvas_buffer,0,0,image_prop->width,image_prop->height,1); + * vm_graphic_release_canvas(canvas); + * vm_graphic_flush_layer(layer_hdl, 1); + * vm_free(res) + * vm_res_deinit(); + * + *****************************************************************************/ +extern VMINT vm_res_get_image_and_size_from_file(VMWSTR filename, VMUINT32 image_id, void* buff, VMUINT32 *size); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_audio_and_size_from_file + * DESCRIPTION + * Get file's audio data by ID. this api need application to alloc memory. + * PARAMETERS + * filename : [IN] File full path + * image_id : [IN] ID to get. + * buff : [IN] Buffer to put audio data, if the is NULL, the function will return audio size + * size : [IN/OUT] when buff is NULL, this is output parameter, will get audio size; when buff is not NULL, this is input parameter + * RETURNS + * VMINT 1 is ok, o is error + * SEE ALSO + * vm_res_get_image_and_size_from_file + * EXAMPLE + * + * VMINT result; + * VMUINT8 *res=NULL; + * VMUINT32 size; + * + * vm_res_init(); + * + * result = vm_res_get_audio_and_size_from_file("E:\\sample.vxp", AUDIO_1,NULL, &size); + * + * if(!result ) + * { + * return; + * } + * + * res = vm_calloc(size+1); + * result = vm_res_get_audio_and_size_from_file("E:\\sample.vxp", AUDIO_1,res, &size); + * + * if(!result ) + * { + * vm_free(res); + * return; + * } + * + * vm_free(res) + * vm_res_deinit(); + * + *****************************************************************************/ +extern VMINT vm_res_get_audio_and_size_from_file(VMWSTR filename, VMUINT32 audio_id, void *buff, VMUINT32 *size); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_string_and_size_from_file + * DESCRIPTION + * Get file's string data by ID. this api need application to alloc memory. + * PARAMETERS + * filename : [IN] File full path + * image_id : [IN] ID to get. + * buff : [IN] Buffer to put string data, if the is NULL, the function will return string size + * size : [IN/OUT] when buff is NULL, this is output parameter, will get string size; when buff is not NULL, this is input parameter + * RETURNS + * VMINT 1 is ok, o is error + * SEE ALSO + * vm_res_get_audio_and_size_from_file + * EXAMPLE + * + * VMINT result; + * VMUINT8 *res=NULL; + * VMUINT32 size; + * + * vm_res_init(); + * + * result = vm_res_get_string_and_size_from_file("E:\\sample.vxp", STRING_1,NULL, &size); + * + * if(!result ) + * { + * return; + * } + * + * res = vm_calloc(size+1); + * result = vm_res_get_string_and_size_from_file("E:\\sample.vxp", STRING_1,res, &size); + * + * if(!result ) + * { + * vm_free(res); + * return; + * } + * + * vm_free(res) + * vm_res_deinit(); + * + *****************************************************************************/ +extern VMINT vm_res_get_string_and_size_from_file(VMWSTR filename, VMUINT32 string_id, void *buff, VMUINT32 *size); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_image_and_size_from_rom + * DESCRIPTION + * Get rom app's image data by ID. this api no need application to alloc memory. + * PARAMETERS + * filename : [IN] File full path + * image_id : [IN] ID to get. + * buff : [OUT] image data pointer + * size : [OUT] image size + * RETURNS + * VMINT 1 is ok, o is error + * SEE ALSO + * vm_res_get_audio_and_size_from_rom + * EXAMPLE + * display a string in resource + * + VMINT result; + * VMUINT8 *res=NULL; + * VMUINT8 *target_layer_buf; + * VMUINT32 size; + * VMINT canvas; + * VMUINT8 *canvas_buffer = NULL; + * struct frame_prop* image_prop = NULL; + * + * vm_res_init(); + * target_layer_buf = vm_graphic_get_layer_buffer(layer_hdl[0]); + * + * result = vm_res_get_image_and_size_from_rom("@:\xxxxx.rom", IMAGE_1,&res, &size); + * + * if(!result ) + * { + * return; + * } + * + * canvas = vm_graphic_load_image(res,size); + * canvas_buffer = vm_graphic_get_canvas_buffer(canvas); + * image_prop = vm_graphic_get_img_property(canvas,1); + * vm_graphic_fill_rect(target_layer_buf, 0, 0, vm_graphic_get_screen_width(), vm_graphic_get_screen_height(), VM_COLOR_BLUE, VM_COLOR_BLUE); + * vm_graphic_blt(target_layer_buf,45,80,canvas_buffer,0,0,image_prop->width,image_prop->height,1); + * vm_graphic_release_canvas(canvas); + * vm_graphic_flush_layer(layer_hdl, 1); + * vm_res_deinit(); + * + *****************************************************************************/ +extern VMINT vm_res_get_image_and_size_from_rom(VMWSTR filename, VMUINT32 image_id, void **buff, VMUINT32 *size); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_audio_and_size_from_rom + * DESCRIPTION + * Get rom app's audio data by ID. this api no need application to alloc memory. + * PARAMETERS + * filename : [IN] File full path + * image_id : [IN] ID to get. + * buff : [OUT] audio data pointer + * size : [OUT] audio size + * RETURNS + * VMINT 1 is ok, o is error + * SEE ALSO + * vm_res_get_image_and_size_from_rom + *****************************************************************************/ +extern VMINT vm_res_get_audio_and_size_from_rom(VMWSTR filename, VMUINT32 audio_id, void **buff, VMUINT32 *size); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_string_and_size_from_rom + * DESCRIPTION + * Get rom app's string data by ID. this api no need application to alloc memory. + * PARAMETERS + * filename : [IN] File full path + * image_id : [IN] ID to get. + * buff : [OUT] string data pointer + * size : [OUT] string size + * RETURNS + * VMINT 1 is ok, o is error + * SEE ALSO + * vm_res_get_audio_and_size_from_rom + *****************************************************************************/ +extern VMINT vm_res_get_string_and_size_from_rom(VMWSTR filename, VMUINT32 string_id, void **buff, VMUINT32 *size); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_image + * DESCRIPTION + * Get Image data by ID. Will alloc memory, need to use FreeRes/vm_res_delete to free. + * Only alloc 1 time for the same ID. + * PARAMETERS + * image_id [IN] ID to get. + * RETURNS + * VMUINT8 * Image pointer of the ID + * SEE ALSO + * vm_res_get_image_and_size + * EXAMPLE + * + * VMUINT8 *res=NULL; + * + * res = vm_res_get_image(IMAGE_1); + * + * if(!res) + * { + * return; + * } + * // do somthing + * vm_res_delete(IMAGE_1); + * + *****************************************************************************/ +extern VMUINT8 *vm_res_get_image(VMUINT32 image_id); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_audio + * DESCRIPTION + * Get audio data by ID. Will alloc memory, need to use FreeRes/vm_res_delete to free. + * Only alloc 1 time for the same ID. + * PARAMETERS + * audio_id [IN] ID to get. + * RETURNS + * VMUINT8 * Audio pointer of the ID + * SEE ALSO + * vm_res_get_image + * EXAMPLE + * + * VMUINT8 *res=NULL; + * + * res = vm_res_get_audio(AUDIO_1); + * + * if(!res) + * { + * return; + * } + * // do somthing + * vm_res_delete(AUDIO_1); + * + *****************************************************************************/ +extern VMUINT8 *vm_res_get_audio(VMUINT32 audio_id); + + +/***************************************************************************** + * FUNCTION + * vm_res_delete + * DESCRIPTION + * Management the list of current allocated resource. This is the delete node func + * PARAMETERS + * id [IN] ID of the resource + * RETURNS + * VM_RES_SUCCESS + * VM_RES_PARAM_ERROR + * VM_RES_ITEM_NOT_FOUND + * SEE ALSO + * vm_res_get_image_and_size + * EXAMPLE + * + * VMUINT8 *res=NULL; + * + * res = vm_res_get_audio(AUDIO_1); + * + * if(!res) + * { + * return; + * } + * // do somthing + * vm_res_delete(AUDIO_1); + * + *****************************************************************************/ +extern VMINT32 vm_res_delete(VMUINT32 id); + + +/***************************************************************************** + * FUNCTION + * vm_res_get_virtual_image + * DESCRIPTION + * load resource from current file, system will alloc 16 bytes as virtual image for graphic interface + * this need to call vm_res_delete after use. this will not load the real data of image, only load res offset + * and file handle, graphic interface will load the real data when it to show the image + * PARAMETERS + * image_id [IN] ID of the resource + * RETURNS + * NULL: resource error + * VMUINT8 * virtual struct pointer + * EXAMPLE + * + * VMUINT8 *res=NULL; + * + * res = vm_res_get_virtual_image(IMAGE_1); + * + * if(!res) + * { + * return; + * } + * // do somthing + * vm_res_delete(IMAGE_1); + * + *****************************************************************************/ +extern VMUINT8 *vm_res_get_virtual_image(VMUINT32 image_id); + + +#ifdef __cplusplus +} +#endif + +#endif /* _VRE4RES_SDK_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmalarm.h b/hardware/arduino/mtk/system/libmtk/include/vmalarm.h new file mode 100644 index 00000000..8101f081 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmalarm.h @@ -0,0 +1,104 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMALARM_SDK_H_ +#define VMALARM_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +typedef struct +{ + VMUINT16 nYear; + VMUINT8 nMonth; + VMUINT8 nDay; + VMUINT8 nHour; + VMUINT8 nMin; + VMUINT8 nSec; + VMUINT8 DayIndex; /* reserved*/ +} vm_alarm_time_struct; + + +typedef enum +{ + VM_ALARM_ERROR_INVALID_ID = -6, // invalid alarm id + VM_ALARM_ERROR_INVALID_TIME, // invalid alarm time. For example: set time is earlier than current phone time + VM_ALARM_ERROR_OF_PROCESS, // the operated alarm does not belong to current app + VM_ALARM_ERROR_OF_RES , // exceed to alarm resource limitation, the max value is 10 + VM_ALARM_ERROR_OF_MEM , // memory is not enough for alarm operation + VM_ALARM_ERROR , // native alarm error + VM_ALARM_OK // success +} vm_alarm_error_t; + + +/* alarm expire callback function prototype */ +typedef void (*VM_ALARMPROC_T)(VMINT alarm_id); + + +/****************************************************************************** + * FUNCTION + * vm_alarm_set + * DESCRIPTION + * set alarm with a dedicated time and expire callback function, the set time must be later than current phone time. + * When the set time expire, the expire callback function will be executed + * PARAMETERS + * expire_time : [IN] set time + * alarm_proc : [IN] expire callback function + * RETURNS + * if succeed, return VM_ALARM_OK ,otherwise, return error code + *****************************************************************************/ +VMINT vm_alarm_set(vm_alarm_time_struct* expire_time, VM_ALARMPROC_T alarm_proc); + + +/****************************************************************************** + * FUNCTION + * vm_alarm_cancel + * DESCRIPTION + * cancel alarm. If the alarm has expire, this cancel operation will do nothing + * PARAMETERS + * alarm_id : [IN] alarm id + * RETURNS + * if succeed, return VM_ALARM_OK ,otherwise, return error code + *****************************************************************************/ +VMINT vm_alarm_cancel(VMINT alarm_id); + +#ifdef __cplusplus +} +#endif + +#endif /* VMALARM_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmappcomm.h b/hardware/arduino/mtk/system/libmtk/include/vmappcomm.h new file mode 100644 index 00000000..e7f5ad20 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmappcomm.h @@ -0,0 +1,246 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef _VM_APP_COMM_SDK_H +#define _VM_APP_COMM_SDK_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +#include "vmpromng.h" + +/* max number of messages in LINKIT message queue */ +#define VM_APPCOMM_MESSAGE_QUEUE_SIZE 16 + +/* LINKIT application messge id base, application should define its own message id started from this. */ +#define VM_MESSAGE_ID_BASE 1000 + +#define VM_MESSAGE_INVALID_ID 0 + + +/* LINKIT message structure */ +typedef struct +{ + VM_P_HANDLE sender; /* process handle of sender */ + VM_P_HANDLE receiver; /* process handle of receiver */ + VMUINT msg_id; /* message ID */ + VMINT wparam; /* wparam of message */ + VMINT lparam; /* lparam of message */ +} vm_message_struct; + +/* LINKIT message queue struct, a circle array */ +typedef struct +{ + vm_message_struct message[VM_APPCOMM_MESSAGE_QUEUE_SIZE]; /* message array */ + VMINT head; /* message index which first come into the message queue */ + VMINT tail; /* message index which last come into the message queue */ +}vm_message_queue_struct; + +/* mapping table size of native application and LINKIT application */ +#define VM_APPCOMM_MAPPING_TABLE_SIZE 10 + + +/* message mapping table item for the message from LINKIT application to native application*/ +typedef struct +{ + VM_P_HANDLE sender; /* process handle of the LINKIT sendor application want to listen */ + VM_MESSAGE_PROC proc; /* native application receiver callback function */ +}vm_message_proc_mapping_struct; + + +/***************************************************************************** + * FUNCTION + * vm_appcomm_init + * DESCRIPTION + * initialize LINKIT message queue + * PARAMETERS + * void + * RETURNS + * void + * EXAMPLE + * + * You does not need to call this API + * + *****************************************************************************/ +void vm_appcomm_init(void); + + +/***************************************************************************** +* FUNCTION + * vm_appcomm_dispatch_msg + * DESCRIPTION + * dispatch LINKIT message in MMI task. +* RETURNS +* void +* EXAMPLE +* +* you does not need to call this api unless you think the message proc delay +* for a long time +* +*****************************************************************************/ +void vm_appcomm_dispatch_msg(void); + + +/***************************************************************************** + * FUNCTION + * vm_appcomm_reg_msg_proc + * DESCRIPTION + * register LINKIT message proc + * PARAMETERS + * handle : [IN] message sender handle, if despite of sender, this parameter should be set to zero. + * proc : [IN] message proc + * RETURNS + * 1 if register successfully + * 0 if register failed + * EXAMPLE + * + * typedef enum + * { + * CUSTOMER_APPCOMM_SCREEN = VM_MESSAGE_ID_BASE + 1, + * CUSTOMER_APPCOMM_MAX_NUM + * }PEDOMETER_PROCESS_STATUS; + * + * VMINT customer_appcomm_example_cb(VM_P_HANDLE sender, VMUINT msg_id, VMINT wparam, VMINT lparam) + * { + * if (VM_MSG_PAINT != msg_id && VM_MSG_QUIT != msg_id) + * { + * return 0; + * } + * switch(msg_id) + * { + * case CUSTOMER_APPCOMM_SCREEN: + * vm_log_debug("customer_appcomm_example_cb"); + * break; + * + * default: + * break; + * } + * return 1; + * } + * + * void customer_appcomm_init(void) + * { + * VMINT handle = 0; + * handle = vm_pmng_get_current_handle(); + * vm_appcomm_reg_msg_proc(handle, customer_appcomm_example_cb); + * } + * + * void customer_appcomm_deinit(void) + * { + * VMINT handle = 0; + * handle = vm_pmng_get_current_handle(); + * vm_appcomm_dereg_msg_proc(handle, customer_appcomm_example_cb); + * } + * + * void customer_appcomm_handle(void) + * { + * VMINT handle = 0; + * handle = vm_pmng_get_current_handle(); + * vm_post_msg(handle, CUSTOMER_APPCOMM_SCREEN, 0, 0); + * //vm_appcomm_send_msg(handle, CUSTOMER_APPCOMM_SCREEN, 0, 0); + * } + * + *****************************************************************************/ +VMINT vm_appcomm_reg_msg_proc(VMINT handle, VM_MESSAGE_PROC proc); + + +/***************************************************************************** + * FUNCTION + * vm_appcomm_dereg_msg_proc + * DESCRIPTION + * deregister LINKIT message proc + * PARAMETERS + * handle : [IN] message sender handle, if despite of sender, this parameter should be set to zero. + * proc : [IN] message proc + * RETURNS + * 1 if deregister successfully + * 0 if deregister failed + * EXAMPLE + * + * refer from vm_appcomm_reg_msg_proc code example + * + *****************************************************************************/ +VMINT vm_appcomm_dereg_msg_proc(VMINT handle, VM_MESSAGE_PROC proc); + + +/***************************************************************************** + * FUNCTION + * vm_appcomm_send_msg + * DESCRIPTION + * send message to LINKIT app or native app, will invoke message procedure directly. + * PARAMETERS + * phandle : [IN] receiver process handle, if receiver is native application, this value should be zero. + * msg_id : [IN] user defined message ID, should larger than VM_MESSAGE_ID_BASE. + * wparam : [IN] wparam of message. + * lparam : [IN] lparam of message. + * RETURNS + * message procedure return value. + * EXAMPLE + * + * refer from vm_appcomm_reg_msg_proc code example + * + *****************************************************************************/ +VMINT vm_appcomm_send_msg(VMINT handle, VMUINT msg_id, VMINT wparam, VMINT lparam); + + +/***************************************************************************** + * FUNCTION + * vm_appcomm_post_msg + * DESCRIPTION + * post message to LINKIT app or native app, will put this message to the end of LINKIT message queue. + * when this function call finish, MMI task will dispatch LINKIT message and invoke message procedure. + * PARAMETERS + * phandle : [IN] receiver process handle, if receiver is native application, this value should be zero. + * msg_id : [IN] user defined message ID, should larger than VM_MESSAGE_ID_BASE. + * wparam : [IN] wparam of message. + * lparam : [IN] lparam of message. + * RETURNS + * message procedure return value. + * EXAMPLE + * + * refer from vm_appcomm_reg_msg_proc code example + * + *****************************************************************************/ +VMINT vm_appcomm_post_msg(VMINT handle, VMUINT msg_id, VMINT wparam, VMINT lparam); + + +#ifdef __cplusplus +} +#endif + +#endif /* _VM_APP_COMM_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmappmgr.h b/hardware/arduino/mtk/system/libmtk/include/vmappmgr.h new file mode 100644 index 00000000..60df39be --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmappmgr.h @@ -0,0 +1,365 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmappmgr_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * application manager header file + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_APPMGR_SDK_H +#define VM_APPMGR_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ +#include "vmsys.h" +#include "vmdatetime.h" + +#define VM_INSTALL_ID_LEN 60 +#define VM_APPMGR_DEVELOPER_NAME_LEN 30 +#define VM_APPMGR_TEL_NUM_LEN 20 +#define VM_APPMGR_APP_NAME_LEN 15 +#define VM_APPMGR_FILEPATH_LEN 260 + +#define VM_APPMGR_MRE_ALL_FLAG 0x0001 +#define VM_APPMGR_MRE_INSTALLED_FLAG 0x0002 +#define VM_APPMGR_MRE_SHORTCUT_FLAG 0x0004 + +#define VM_APPMGR_WIDGET_PACKAGE_FLAG (0x8001) /* mre widget app */ +#define VM_APPMGR_WALLPAPER_PACKAGE_FLAG (0x8002) /* mre wallpaper app */ +#define VM_APPMGR_LAUNCHER_PACKAGE_FLAG (0x8004) /* mre launcher app */ +#define VM_APPMGR_SCRLOCK_PACKAGE_FLAG (0x8008) /* mre screen lock app */ + +#define VM_APPMGR_VPP_PACKAGE_FLAG \ + (VM_APPMGR_WIDGET_PACKAGE_FLAG |\ + VM_APPMGR_WALLPAPER_PACKAGE_FLAG |\ + VM_APPMGR_LAUNCHER_PACKAGE_FLAG |\ + VM_APPMGR_SCRLOCK_PACKAGE_FLAG) + + +typedef VMCHAR vm_install_id[VM_INSTALL_ID_LEN]; + + + + +typedef enum +{ + VM_APPMGR_INSTALL_TYPE_UNKNOWN = 0, /* UNKNOWN */ + VM_APPMGR_INSTALL_TYPE_DOWNLOAD, /* dwonload from server */ + VM_APPMGR_INSTALL_TYPE_ROM, /* build-in app */ + VM_APPMGR_INSTALL_TYPE_LOCAL_INSTALL, /* install from local */ + VM_APPMGR_INSTALL_TYPE_SHORTCUT, /* shortcut app */ + VM_APPMGR_INSTALL_TYPE_END_OF_ENUM +}vm_appmgr_install_type; + +/* Application storage position type */ +typedef enum +{ + VM_APPMGR_APP_POSITION_UNKNOWN = 0, /* UNKNOWN */ + VM_APPMGR_APP_POSITION_PHONE, /* Phone */ + VM_APPMGR_APP_POSITION_CARD, /* Memory card */ + VM_APPMGR_APP_POSITION_ROM, /* build-in app */ + VM_APPMGR_APP_POSITION_END_OF_ENUM +} vm_appmgr_app_storage_position; + +typedef struct +{ + VMUINT app_id; + VMUINT app_size; + vm_appmgr_install_type install_type; + vm_appmgr_app_storage_position store_pos; + vm_time_t installed_time; + VMUINT16 developer[VM_APPMGR_DEVELOPER_NAME_LEN]; + VMUINT16 tel[VM_APPMGR_TEL_NUM_LEN]; + VMUINT16 app_name[VM_APPMGR_APP_NAME_LEN]; + VMUINT16 app_path[VM_APPMGR_FILEPATH_LEN]; +}vm_install_info; + +typedef enum +{ + VM_WALLPAPER_SRC_HOME_SCREEN, + VM_WALLPAPER_SRC_LOCK_SCREEN +} vm_app_mgr_wallpaper_src_enum; + + +/***************************************************************************** + * FUNCTION + * vm_appmgr_install + * DESCRIPTION + * install mre app + * PARAMETERS + * path : [IN] path of app + * flag : [IN] reserved, please fill 0 + * install_id : [OUT] identification of installed app + * RETURNS + * error code 0 means success + *****************************************************************************/ +VMINT vm_appmgr_install(VMWSTR path, VMINT flag, vm_install_id install_id); + +/***************************************************************************** + * FUNCTION + * vm_appmgr_uninstall + * DESCRIPTION + * uninstall mre app + * PARAMETERS + * install_id : [IN] identification of installed app, can get + * by using vm_appmgr_get_installed_list or vm_appmgr_is_installed + * RETURNS + * error code 0 means success + *****************************************************************************/ +VMINT vm_appmgr_uninstall(vm_install_id install_id); + + +/***************************************************************************** + * FUNCTION + * vm_appmgr_is_installed + * DESCRIPTION + * check the mre app is intalled or not + * PARAMETERS + * path : [IN] path of app + * install_id : [OUT] identification of installed app + * RETURNS + * error code 0 means success + *****************************************************************************/ +VMBOOL vm_appmgr_is_installed(VMWSTR path, vm_install_id install_id); + +/***************************************************************************** + * FUNCTION + * vm_appmgr_get_installed_list + * DESCRIPTION + * get installed app list. set install_id_list to NULL to get number of installed app. + * PARAMETERS + * flag : [IN] + * install_id_list : [OUT] identifications of installed app + * num :[IN/OUT] number of installed app + * RETURNS + * error code 0 means success + *****************************************************************************/ +VMINT vm_appmgr_get_installed_list(VMINT flag ,vm_install_id* install_id_list, VMUINT* num); + +/***************************************************************************** + * FUNCTION + * vm_appmgr_get_install_info + * DESCRIPTION + * get installed app detail information + * PARAMETERS + * vm_install_id : [IN] identification of installed app + * vm_install_info : [OUT] detail information + * RETURNS + * error code 0 means success + *****************************************************************************/ +VMINT vm_appmgr_get_install_info(vm_install_id install_id, vm_install_info* install_info); +/***************************************************************************** + * FUNCTION + * vm_appmgr_activate_launcher + * DESCRIPTION + * Active launcher plug-in + * PARAMETERS + * install_id : [IN] identification of installed app, can get + * by using vm_appmgr_get_installed_list or vm_appmgr_is_installed + * RETURNS + * error code 0 means success + *****************************************************************************/ +VMINT vm_appmgr_activate_launcher(vm_install_id install_id); + +/***************************************************************************** + * FUNCTION + * vm_appmgr_activate_screen_lock + * DESCRIPTION + * Active Screen-Lock plug-in + * PARAMETERS + * install_id : [IN] identification of installed app, can get + * by using vm_appmgr_get_installed_list or vm_appmgr_is_installed + * RETURNS + * error code 0 means success + *****************************************************************************/ +VMINT vm_appmgr_activate_screen_lock(vm_install_id install_id); + +/***************************************************************************** + * FUNCTION + * vm_appmgr_activate_wallpaper + * DESCRIPTION + * Active wallpaper plug-in + * PARAMETERS + * install_id : [IN] identification of installed app, can get + * by using vm_appmgr_get_installed_list or vm_appmgr_is_installed + * RETURNS + * error code 0 means success + *****************************************************************************/ +VMINT vm_appmgr_activate_wallpaper(vm_install_id install_id, vm_app_mgr_wallpaper_src_enum src); + +/****************************************************************************** + * FUNCTION + * vm_appmgr_get_mem_size + * DESCRIPTION + * Get Memory size of DLUI components + * PARAMETERS + * Package : [IN] VM_APPMGR_WIDGET_PACKAGE_FLAG + * VM_APPMGR_LAUNCHER_PACKAGE_FLAG + * VM_APPMGR_WALLPAPER_PACKAGE_FLAG + * VM_APPMGR_SCRLOCK_PACKAGE_FLAG + * RETURNS + * Memory Size requirement, -1 means not support. + ******************************************************************************/ +VMINT vm_appmgr_get_mem_size(VMUINT32 package); +/****************************************************************************** + * FUNCTION + * vm_is_support_downloadable_app_icon + * DESCRIPTION + * check whether downloadable app icon is supported. + * PARAMETERS + * void + * RETURNS + * TRUE means support, FALSE means NOT support. + ******************************************************************************/ +VMINT vm_is_support_downloadable_app_icon(void); + + +/****************************************************************************** + * FUNCTION + * vm_appmgr_is_launcher_activated + * DESCRIPTION + * check whether launcher is activated. + * PARAMETERS + * install_id : [IN] identification of installed app, can get by using + * vm_appmgr_get_installed_list or vm_appmgr_is_installed. + * RETURNS + * TRUE means activated, FALSE means NOT activated. + ******************************************************************************/ +VMINT vm_appmgr_is_launcher_activated(vm_install_id install_id); + + +/****************************************************************************** + * FUNCTION + * vm_appmgr_is_wallpaper_activated + * DESCRIPTION + * check whether wallpaper is activated. + * PARAMETERS + * install_id : [IN] identification of installed app, can get by using + * vm_appmgr_get_installed_list or vm_appmgr_is_installed. + * src : [IN] wallpaper src. + * RETURNS + * TRUE means activated, FALSE means NOT activated. + ******************************************************************************/ +VMINT vm_appmgr_is_wallpaper_activated( + vm_install_id install_id, + VMINT src); + +/****************************************************************************** + * FUNCTION + * vm_appmgr_is_screen_lock_activated + * DESCRIPTION + * check whether screen lock is activated. + * PARAMETERS + * install_id : [IN] identification of installed app, can get by using + * vm_appmgr_get_installed_list or vm_appmgr_is_installed. + * RETURNS + * TRUE means activated, FALSE means NOT activated. + ******************************************************************************/ +VMINT vm_appmgr_is_screen_lock_activated(vm_install_id install_id); + +/****************************************************************************** + * FUNCTION + * vm_appmgr_is_support_launcher + * DESCRIPTION + * check whether launcher is supported. + * PARAMETERS + * void. + * RETURNS + * TRUE means support, FALSE means NOT support. + ******************************************************************************/ +VMINT vm_appmgr_is_support_launcher(void); + + +/****************************************************************************** + * FUNCTION + * vm_appmgr_is_support_wallpaper + * DESCRIPTION + * check whether wallpaper is supported. + * PARAMETERS + * void. + * RETURNS + * TRUE means support, FALSE means NOT support. + ******************************************************************************/ +VMINT vm_appmgr_is_support_wallpaper(void); + +/****************************************************************************** + * FUNCTION + * vm_appmgr_is_support_screen_lock + * DESCRIPTION + * check whether screen_lock is supported. + * PARAMETERS + * void. + * RETURNS + * TRUE means support, FALSE means NOT support. + ******************************************************************************/ +VMINT vm_appmgr_is_support_screen_lock(void); + +/****************************************************************************** + * FUNCTION + * vm_appmgr_is_support_widget + * DESCRIPTION + * check whether widget is supported. + * PARAMETERS + * void. + * RETURNS + * TRUE means support, FALSE means NOT support. + ******************************************************************************/ +VMINT vm_appmgr_is_support_widget(void); + +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_APPMGR_SDK_H*/ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmatcmd.h b/hardware/arduino/mtk/system/libmtk/include/vmatcmd.h new file mode 100644 index 00000000..93020208 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmatcmd.h @@ -0,0 +1,240 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMATCMD_SDK_H +#define VMATCMD_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/***************************************************************************** +* Typedef +*****************************************************************************/ +/*vm_command_type*/ +typedef enum +{ + VM_CMD_AT = 0, // receive AT command + VM_CMD_TYPE_TOTAL // total received command type +} vm_command_type; + +/*vm_command_transmitter_type*/ +typedef enum +{ + VM_UART_TYPE = 0, // reply command resoult though UART + VM_TRANSMITTER_TYPE_TOTAL // reply command type +} vm_command_transmitter_type; + +/*vm_command_struct*/ +typedef struct +{ + VMUINT32 command_type; // command type + VMUINT32 command_buf_size; // command buffer size + char* command_buf; // command buffer +}vm_command_struct; + +/*vm_command_callback*/ +typedef void (*vm_command_callback)(vm_command_struct *param, void *user_data); + + +/***************************************************************************** +* Function +*****************************************************************************/ + +/***************************************************************************** + * FUNCTION + * vm_command_open_port + * DESCRIPTION + * After app open one port, all the command send to the port will transfer to the app. + * Remember that, the port number which just in scope(500~65535) can be used by app. + * User can send AT command like such format: "AT+[port]commandstring",ex:AT+[5000]command1. + * PARAMETERS + * port [IN] the port number, only can use from 500 ~ 65535. + * call_back [IN] callback function, will be invoked when receive at command from this port. + * user_data [IN] user data when you want to use in callback function; if no use, give NULL value. + * RETURNS + * The opened port if sucess, or 0 + * EXAMPLE + * + * + * #define ATCMD_PORT 5000 + * + * void vm_atcmd_callback(vm_command_struct *param, void *user_data) + * { + * int len; + * char ret_buf[50]; + * + * if (VM_CMD_AT == param->command_type) + * { + * // use "AT+[5000]command1" to trigger it. + * if (strncmp(command_buf, "command1", param->command_buf_size)) + * { + * // handle the command and fill the result buffer. + * hadle_command1(ret_buf, &len); + * vm_command_reply(ret_buf, len, VM_UART_TYPE); + * } + * } + * return; + * } + * + * void handle_sysevt(VMINT message, VMINT param) + * { + * switch (message) + * { + * case VM_MSG_CREATE: + * vm_command_open_port(ATCMD_PORT, vm_atcmd_callback, NULL); + * break; + * case VM_MSG_QUIT: + * vm_command_close_port(ATCMD_PORT); + * break; + * } + * } + * return 0; + * } + * + *****************************************************************************/ +extern VMUINT16 vm_command_open_port(VMUINT16 port, vm_command_callback call_back, void *user_data); + +/***************************************************************************** + * FUNCTION + * vm_command_close_port + * DESCRIPTION + * Close the command port when app stop or you don't want to use it. + * PARAMETERS + * port [IN] the port number which be open by vm_open_command_port(). + * RETURNS + * None + * EXAMPLE + * + * + * #define ATCMD_PORT 5000 + * + * void vm_atcmd_callback(vm_command_struct *param, void *user_data) + * { + * int len; + * char ret_buf[50]; + * + * if (VM_CMD_AT == param->command_type) + * { + * // use "AT+[5000]command1" to trigger it. + * if (strncmp(command_buf, "command1", param->command_buf_size)) + * { + * // handle the command and fill the result buffer. + * hadle_command1(ret_buf, &len); + * vm_command_reply(ret_buf, len, VM_UART_TYPE); + * } + * } + * return; + * } + * + * void handle_sysevt(VMINT message, VMINT param) + * { + * switch (message) + * { + * case VM_MSG_CREATE: + * vm_command_open_port(ATCMD_PORT, vm_atcmd_callback, NULL); + * break; + * case VM_MSG_QUIT: + * vm_command_close_port(ATCMD_PORT); + * break; + * } + * } + * return 0; + * } + * + *****************************************************************************/ +extern void vm_command_close_port(VMUINT16 port); + + +/***************************************************************************** + * FUNCTION + * vm_command_reply + * DESCRIPTION + * Response the command resoult to remote terminal which send the AT command. + * PARAMETERS + * reply_buf [IN] command resoult string buffer. + * buf_size [IN] the size of the buffer. + * reply_type [IN] default transfer 0 for AT command reply. + * RETURNS + * None + * EXAMPLE + * + * + * #define ATCMD_PORT 5000 + * + * void vm_atcmd_callback(vm_command_struct *param, void *user_data) + * { + * int len; + * char ret_buf[50]; + * + * if (VM_CMD_AT == param->command_type) + * { + * // use "AT+[5000]command1" to trigger it. + * if (strncmp(command_buf, "command1", param->command_buf_size)) + * { + * // handle the command and fill the result buffer. + * hadle_command1(ret_buf, &len); + * vm_command_reply(ret_buf, len, VM_UART_TYPE); + * } + * } + * return; + * } + * + * void handle_sysevt(VMINT message, VMINT param) + * { + * switch (message) + * { + * case VM_MSG_CREATE: + * vm_command_open_port(ATCMD_PORT, vm_atcmd_callback, NULL); + * break; + * case VM_MSG_QUIT: + * vm_command_close_port(ATCMD_PORT); + * break; + * } + * } + * return 0; + * } + * + *****************************************************************************/ +extern void vm_command_reply(char* reply_buf, VMUINT32 buf_size, VMUINT32 reply_type); + +#ifdef __cplusplus +} +#endif + +#endif /* VMATCMD_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmbase64.h b/hardware/arduino/mtk/system/libmtk/include/vmbase64.h new file mode 100644 index 00000000..22e9ef04 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmbase64.h @@ -0,0 +1,478 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMBASE64_SDK_H_ +#define VMBASE64_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "vmsys.h" + +/* System used, the structure used to record and maintain the context of base64 */ +typedef struct +{ + VMUINT8 buf[4]; /* private data, All the fileds in this structure are absolutely private data, which only will be accessed by BASE64 lib inside. So no detail information about them be here. */ + VMUINT8 buf_cnt; /* private data */ + VMUINT8 finish_flag;/* private data */ + VMUINT8 illchr_flag;/* private data */ + VMUINT8 illpad_flag;/* private data */ + + VMUINT8 wrap_count; /* private data */ + VMUINT8 wrap_max; /* private data */ + VMUINT8 reserved[2];/* private data */ +}vm_base64_part_context; + +/***************************************************************************** +* FUNCTION +* vm_base64_encode_basic +* DESCRIPTION +* The vm_base64_encode_basic function encodes a piece of data into BASE64 format. +* PARAMETERS +* src : [IN] Point to the source content buffer to be encoded. +* srcl : [IN] Number of the size of source content buffer to be encoded. +* dst : [IN/OUT] Point to the output buffer of encoded content. +* If the parameter is NULL, the return value will be the needed output buffer size. +* dstl : [IN] Number of the size of output buffer of encoded content. +* If the [dst] parameter is NULL, this parameter will be ignored. +* auto_line_wrap : [IN] Line break (CRLF) will be added after each 76 bytes have been written to output buffer. +* RETURN VALUES +* -1 : It indicates that the given output buffer size is not enough, which SHOULD be avoid. +* >=0 : the number of needed output buffer size OR the number of bytes written to the buffer pointed to by [dst]. +* EXAMPLE +* +* #define VM_BASE64_LEN (64) +* +* char src[] = "MediaTek (Beijing) Inc"; +* char des_encode[VM_BASE64_LEN]; +* char des_decode[VM_BASE64_LEN]; +* +* VMINT32 src_len, des_len1, des_len2; +* +* src_len = strlen(src); +* memset(des_encode, 0, sizeof(des_encode)); +* +* des_len1 = VM_BASE64_LEN; +* des_len2 = VM_BASE64_LEN; +* +* vm_base64_encode_basic( +* src, +* src_len, +* des_encode, +* des_len1, +* TRUE); +* +* memset(des_decode, 0, sizeof(des_decode)); +* des_len2 = VM_BASE64_LEN; +* des_len1 = strlen(des_encode); +* +* vm_base64_decode_basic( +* des_encode, +* des_len1, +* des_decode, +* des_len2); +* +* +*****************************************************************************/ +VMINT32 vm_base64_encode_basic( + const VMCHAR *src, + VMINT32 srcl, + VMCHAR *dst, + VMINT32 dstl, + VMBOOL auto_line_wrap); + +/***************************************************************************** + * FUNCTION + * vm_base64_decode_basic + * DESCRIPTION + * This function is used to decode Base64 string. + * PARAMETERS + * src : [IN] Pointer to the buffer containing encoded data + * srcl : [IN] Length of the encoded data + * dst : [IN/OUT] Point to the output buffer of decoded content. + * If the parameter is NULL, the return value will be the needed output buffer size. + * Note that the returned value is not accurate; it may be larger than the indeed decoded size. + * dstl : [IN] Length of destination buffer. + * RETURN VALUES + * -1 : It indicates that the given output buffer size is not enough, which should be avoid + * >=0 : The number of needed output buffer size OR the number of bytes written to the buffer pointed to by [dst]. + * EXAMPLE + * + * #define VM_BASE64_LEN (64) + * + * char src[] = "MediaTek (Beijing) Inc"; + * char des_encode[VM_BASE64_LEN]; + * char des_decode[VM_BASE64_LEN]; + * + * VMINT32 src_len, des_len1, des_len2; + * + * src_len = strlen(src); + * memset(des_encode, 0, sizeof(des_encode)); + * + * des_len1 = VM_BASE64_LEN; + * des_len2 = VM_BASE64_LEN; + * + * vm_base64_encode_basic( + * src, + * src_len, + * des_encode, + * des_len1, + * TRUE); + * + * memset(des_decode, 0, sizeof(des_decode)); + * des_len2 = VM_BASE64_LEN; + * des_len1 = strlen(des_encode); + * + * vm_base64_decode_basic( + * des_encode, + * des_len1, + * des_decode, + * des_len2); + * + * + *****************************************************************************/ +VMINT32 vm_base64_decode_basic( + const VMCHAR *src, + VMINT32 srcl, + VMCHAR *dst, + VMINT32 dstl); + +/***************************************************************************** + * FUNCTION + * vm_base64_part_encode_init + * DESCRIPTION + * This function initializes the STREAM-STYLE part by part BASE64 + * encode process and calculate the needed output buffer size per-part. + * PARAMETERS + * cntx : [IN] point to the vm_base64_part_context + * max_part_buf_size : [IN] the number of MAX input buffer size per-part. + * auto_line_wrap : [IN] Line break (CRLF) will be added after each 76 bytes have been written to output buffer. + * RETURN VALUES + * -1 : Invalid parameter, It the context is NULL + * >= 0 : The MIN output buffer size needed for the per-parts process. + * EXAMPLE + * + * #define VM_BASE64_LEN (64) + * + * char src[] = "MediaTek (Beijing) Inc"; + * char des_encode[VM_BASE64_LEN]; + * char des_decode[VM_BASE64_LEN]; + * vm_base64_part_context cntx; + * VMINT32 src_len, des_len1, des_len2, temp; + * + * src_len = strlen(src); + * memset(des_encode, 0, sizeof(des_encode)); + * des_len1 = VM_BASE64_LEN; + * + * vm_base64_part_encode_init(&cntx, 0, TRUE); + * + * temp =src_len; + * vm_base64_part_encode_append(&cntx, src, &temp, des_encode, des_len1); + * + * vm_base64_part_encode_finish(&cntx, des_encode+reval, des_len1-reval); + * + * vm_base64_part_decode_init(&cntx,0); + * + * temp=des_len1; + * memset(des_decode, 0, sizeof(des_decode)); + * des_len2 = VM_BASE64_LEN; + * vm_base64_part_decode_append(&cntx, des_encode, &temp, des_decode,des_len2); + * + * vm_base64_part_decode_finish(&cntx, NULL); + * + * + *****************************************************************************/ +VMINT32 vm_base64_part_encode_init( + vm_base64_part_context *cntx, + VMINT32 max_part_buf_size, + VMBOOL auto_line_wrap); + +/***************************************************************************** + * FUNCTION + * vm_base64_part_encode_append + * DESCRIPTION + * The vm_base64_part_encode_append function accepts next part of source data, encode them to BASE64 format. + * PARAMETERS + * cntx : [IN] Point to the BASE64 part context. + * src : [IN] Point to the source content buffer to be encoded. + * srcl : [IN/OUT] Point to the number of the size of source content buffer to be encoded, it MUST NOT be NULL, the the number MUST NOT be less than ZERO. + * dst : [IN/OUT] Point to the output buffer of encoded content. + * dstl : [IN] Number of the size of output buffer. + * RETURN VALUES + * -1 : If the context is NULL or it was modified outside, the return value is -1. + * >=0 : If the function succeeds, the return value is the number of bytes written to output buffer, and the [*srcl] indicates how many input buffer was processed. Note that: if the output buffer size is NOT LESS THAN the return value of the vm_base64_part_decode_init function, and the input size buffer is NOT LARGER THAN the [max_part_buf_size] value, the OUT [*srcl] value is always equal to the IN [*src] value, in this case you can ignore the OUT [*srcl] value safely. + * EXAMPLE + * + * #define VM_BASE64_LEN (64) + * + * char src[] = "MediaTek (Beijing) Inc"; + * char des_encode[VM_BASE64_LEN]; + * char des_decode[VM_BASE64_LEN]; + * vm_base64_part_context cntx; + * VMINT32 src_len, des_len1, des_len2, temp; + * + * src_len = strlen(src); + * memset(des_encode, 0, sizeof(des_encode)); + * des_len1 = VM_BASE64_LEN; + * + * vm_base64_part_encode_init(&cntx, 0, TRUE); + * + * temp =src_len; + * vm_base64_part_encode_append(&cntx, src, &temp, des_encode, des_len1); + * + * vm_base64_part_encode_finish(&cntx, des_encode+reval, des_len1-reval); + * + * vm_base64_part_decode_init(&cntx,0); + * + * temp=des_len1; + * memset(des_decode, 0, sizeof(des_decode)); + * des_len2 = VM_BASE64_LEN; + * vm_base64_part_decode_append(&cntx, des_encode, &temp, des_decode,des_len2); + * + * vm_base64_part_decode_finish(&cntx, NULL); + * + * + *****************************************************************************/ +VMINT32 vm_base64_part_encode_append( + vm_base64_part_context *cntx, + const VMCHAR *src, + VMINT32 *srcl, + VMCHAR *dst, + VMINT32 dstl); + +/***************************************************************************** + * FUNCTION + * vm_base64_part_encode_finish + * DESCRIPTION + * The vm_base64_part_encode_finish function finish the part-by-part encode process, encode the last bytes into BASE64 format if there are. + * PARAMETERS + * cntx : [IN] Point to the vm_qprint_context + * dst : [IN/OUT] Point to the output buffer of decoded content. + * dstl : [IN] Number of the size of output buffer of encoded content. It must be larger than 6. + * RETURN VALUES + * >=0 : If the function succeeds, the return value is the number of bytes written to output buffer, + * -1 : If the function failed, the return value is -1 it means the context data was NULL or be changed outsides or the output buffer size is too small. + * EXAMPLE + * + * #define VM_BASE64_LEN (64) + * + * char src[] = "MediaTek (Beijing) Inc"; + * char des_encode[VM_BASE64_LEN]; + * char des_decode[VM_BASE64_LEN]; + * vm_base64_part_context cntx; + * VMINT32 src_len, des_len1, des_len2, temp; + * + * src_len = strlen(src); + * memset(des_encode, 0, sizeof(des_encode)); + * des_len1 = VM_BASE64_LEN; + * + * vm_base64_part_encode_init(&cntx, 0, TRUE); + * + * temp =src_len; + * vm_base64_part_encode_append(&cntx, src, &temp, des_encode, des_len1); + * + * vm_base64_part_encode_finish(&cntx, des_encode+reval, des_len1-reval); + * + * vm_base64_part_decode_init(&cntx,0); + * + * temp=des_len1; + * memset(des_decode, 0, sizeof(des_decode)); + * des_len2 = VM_BASE64_LEN; + * vm_base64_part_decode_append(&cntx, des_encode, &temp, des_decode,des_len2); + * + * vm_base64_part_decode_finish(&cntx, NULL); + * + * + *****************************************************************************/ +VMINT32 vm_base64_part_encode_finish( + vm_base64_part_context* cntx, + VMCHAR *dst, + VMINT32 dstl); + +/***************************************************************************** + * FUNCTION + * vm_base64_part_decode_init + * DESCRIPTION + * The vm_base64_part_decode_init function initialize the part by part style BASE64 decode process and calculate the needed output buffer size per-part. + * PARAMETERS + * cntx : [IN] Point to the BASE64 part context. + * max_part_buf_size : [IN] The number of MAX input buffer size per-part. + * RETURN VALUES + * >=0 : If the function succeeds, the return value is the MIN output buffer size needed for the per-part process. + * -1 : If the context is NULL, the return value is -1. + * EXAMPLE + * + * #define VM_BASE64_LEN (64) + * + * char src[] = "MediaTek (Beijing) Inc"; + * char des_encode[VM_BASE64_LEN]; + * char des_decode[VM_BASE64_LEN]; + * vm_base64_part_context cntx; + * VMINT32 src_len, des_len1, des_len2, temp; + * + * src_len = strlen(src); + * memset(des_encode, 0, sizeof(des_encode)); + * des_len1 = VM_BASE64_LEN; + * + * vm_base64_part_encode_init(&cntx, 0, TRUE); + * + * temp =src_len; + * vm_base64_part_encode_append(&cntx, src, &temp, des_encode, des_len1); + * + * vm_base64_part_encode_finish(&cntx, des_encode+reval, des_len1-reval); + * + * vm_base64_part_decode_init(&cntx,0); + * + * temp=des_len1; + * memset(des_decode, 0, sizeof(des_decode)); + * des_len2 = VM_BASE64_LEN; + * vm_base64_part_decode_append(&cntx, des_encode, &temp, des_decode,des_len2); + * + * vm_base64_part_decode_finish(&cntx, NULL); + * + * + *****************************************************************************/ +VMINT32 vm_base64_part_decode_init( + vm_base64_part_context *cntx, + VMINT32 max_part_buf_size); + +/***************************************************************************** + * FUNCTION + * vm_base64_part_decode_append + * DESCRIPTION + * This function accepts next part of source data; + * decode them from BASE64 format + * PARAMETERS + * cntx : [IN] Point to the BASE64 part context. + * src : [IN] Point to the source content buffer to be decoded. + * srcl : [IN] Point to the number of the size of source content buffer to de encoded. + * dst : [IN/OUT] Point to the output buffer of decoded content. + * dstl : [IN] Number of the size of output buffer. + * RETURN VALUES + * >=0 : If the function succeeds, the return value is the number of bytes written to output buffer. and the [*srcl] indicates how many input buffer was processed. Note that: if the output buffer size is NOT LESS THAN the return value of the vm_base64_part_decode_init function, and the input size buffer is NOT LARGER THAN the [max_part_buf_size] value, the OUT [*srcl] value is always equal to the IN [*src] value + * -1 : It the context is NULL or modified outside, the return value is -1. + * EXAMPLE + * + * #define VM_BASE64_LEN (64) + * + * char src[] = "MediaTek (Beijing) Inc"; + * char des_encode[VM_BASE64_LEN]; + * char des_decode[VM_BASE64_LEN]; + * vm_base64_part_context cntx; + * VMINT32 src_len, des_len1, des_len2, temp; + * + * src_len = strlen(src); + * memset(des_encode, 0, sizeof(des_encode)); + * des_len1 = VM_BASE64_LEN; + * + * vm_base64_part_encode_init(&cntx, 0, TRUE); + * + * temp =src_len; + * vm_base64_part_encode_append(&cntx, src, &temp, des_encode, des_len1); + * + * vm_base64_part_encode_finish(&cntx, des_encode+reval, des_len1-reval); + * + * vm_base64_part_decode_init(&cntx,0); + * + * temp=des_len1; + * memset(des_decode, 0, sizeof(des_decode)); + * des_len2 = VM_BASE64_LEN; + * vm_base64_part_decode_append(&cntx, des_encode, &temp, des_decode,des_len2); + * + * vm_base64_part_decode_finish(&cntx, NULL); + * + * + *****************************************************************************/ +VMINT32 vm_base64_part_decode_append( + vm_base64_part_context* cntx, + const VMCHAR *src, + VMINT32 *srcl, + VMCHAR *dst, + VMINT32 dstl); + +/***************************************************************************** + * FUNCTION + * vm_base64_part_decode_finish + * DESCRIPTION + * This function finishes the part-by-part decoding process. + * PARAMETERS + * cntx : [IN] Point to the BASE64 part context. + * illegal_format : [IN/OUT] Point to the illegal format flag, if you can ignore this safely, you can set it NULL. + * RETURN VALUES + * 0 : If the function succeeds, the return value is 0. if illegal character or invalid pad character was found during the process, and the [illegal_format] is NOT NULL, the [illegal_format] will be set as TRUE. + * -1 : If the context is NULL or modified outside, the return value is -1. + * EXAMPLE + * + * #define VM_BASE64_LEN (64) + * + * char src[] = "MediaTek (Beijing) Inc"; + * char des_encode[VM_BASE64_LEN]; + * char des_decode[VM_BASE64_LEN]; + * vm_base64_part_context cntx; + * VMINT32 src_len, des_len1, des_len2, temp; + * + * src_len = strlen(src); + * memset(des_encode, 0, sizeof(des_encode)); + * des_len1 = VM_BASE64_LEN; + * + * vm_base64_part_encode_init(&cntx, 0, TRUE); + * + * temp =src_len; + * vm_base64_part_encode_append(&cntx, src, &temp, des_encode, des_len1); + * + * vm_base64_part_encode_finish(&cntx, des_encode+reval, des_len1-reval); + * + * vm_base64_part_decode_init(&cntx,0); + * + * temp=des_len1; + * memset(des_decode, 0, sizeof(des_decode)); + * des_len2 = VM_BASE64_LEN; + * vm_base64_part_decode_append(&cntx, des_encode, &temp, des_decode,des_len2); + * + * vm_base64_part_decode_finish(&cntx, NULL); + * + * + *****************************************************************************/ +VMINT32 vm_base64_part_decode_finish( + vm_base64_part_context* cntx, + VMBOOL* illegal_format); + +#ifdef __cplusplus +} +#endif + +#endif /* VMSTDLIB_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmbitstream.h b/hardware/arduino/mtk/system/libmtk/include/vmbitstream.h new file mode 100644 index 00000000..6183ae7a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmbitstream.h @@ -0,0 +1,386 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef _VM_BITSTREAM_SDK_H +#define _VM_BITSTREAM_SDK_H +/* SDK header file */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + + +#define VM_BITSTREAM_SUCCEED 0 +#define VM_BITSTREAM_BUFFER_OVERFLOW 8001 +#define VM_BITSTREAM_BUFFER_UNDERFLOW 8002 +#define VM_BITSTREAM_EVENT_NONE 8003 +#define VM_BITSTREAM_EVENT_DATA_REQUEST 8004 +#define VM_BITSTREAM_EVENT_ERROR 8005 +#define VM_BITSTREAM_RECOVER 8006 +#define VM_BITSTREAM_INTERRUPT 8100 +#define VM_BITSTREAM_INTERRUPT_RESUME 8101 + +#define VM_BITSTREAM_ERR_FAILED -8001 +#define VM_BITSTREAM_ERR_INVALID_RESOULTION -8002 +#define VM_BITSTREAM_ERR_UNSUPPORTED_FORMAT -8003 +#define VM_BITSTREAM_ERR_INVALID_BITSTREAM -8004 +#define VM_BITSTREAM_ERR_MEMORY_INSUFFICIENT -8005 +#define VM_BITSTREAM_ERR_INSUFFICIENT_MEMORY -8006 /* MED memory is not enough, should check MED memory scenario */ +#define VM_BITSTREAM_ERR_INVALID_FORMAT -8007 /* there is some error while decoding the frame, the frame may not be a valid one */ +#define VM_BITSTREAM_NOT_SUPPORTED -8008 /* Something which is not supported by Bitstream API, e.g. incorrect invoking sequence, features not available */ +#define VM_BITSTREAM_INVALID_PARAMETER -8009 /* The parameter passed through the API is invalid */ + +#define VM_BITSTREAM_FAILED -1 + + +/* format type */ +typedef enum +{ + VM_BITSTREAM_CODEC_TYPE_NONE, /* No type */ + VM_BITSTREAM_CODEC_TYPE_SILENT, /* To play silence frame for video only file */ + VM_BITSTREAM_CODEC_TYPE_AMR, /* AMR */ + VM_BITSTREAM_CODEC_TYPE_AMRWB, /* Wideband AMR */ + VM_BITSTREAM_CODEC_TYPE_AAC, /* AAC */ + VM_BITSTREAM_CODEC_TYPE_DAF, /* DAF */ + VM_BITSTREAM_CODEC_TYPE_MP4A, /* Mpeg-4 audio */ + VM_BITSTREAM_CODEC_TYPE_MP4AG, + VM_BITSTREAM_CODEC_TYPE_WAV, /* RAW data wav */ + VM_BITSTREAM_CODEC_TYPE_ADPCM, /* compressed wav*/ + VM_BITSTREAM_CODEC_TYPE_PCM, /*RAW data, for input data strengh calculation*/ + VM_BITSTREAM_CODEC_TYPE_TOTAL /* Total codec type */ +} vm_bitstream_codec_type_enum; + +typedef enum +{ + VM_BITSTREAM_SAMPLE_FREQ_8000, /* 8000 */ + VM_BITSTREAM_SAMPLE_FREQ_11025, /* 11025 */ + VM_BITSTREAM_SAMPLE_FREQ_16000, /* 16000 */ + VM_BITSTREAM_SAMPLE_FREQ_22050, /* 22050 */ + VM_BITSTREAM_SAMPLE_FREQ_24000, /* 24000 */ + VM_BITSTREAM_SAMPLE_FREQ_32000, /* 32000 */ + VM_BITSTREAM_SAMPLE_FREQ_44100, /* 44100 */ + VM_BITSTREAM_SAMPLE_FREQ_48000, /* 48000 */ + VM_BITSTREAM_SAMPLE_FREQ_TOTAL /* Total sample frequency number */ + +} vm_bitstream_sample_freq_enum; + +/* bitstream aduio configuration structure*/ +typedef struct +{ + vm_bitstream_codec_type_enum vm_codec_type; +} vm_bitstream_audio_cfg_struct; + +/* PCM bitstream aduio configuration structure*/ +typedef struct +{ + vm_bitstream_codec_type_enum vm_codec_type; + VMBOOL isStereo; /* FALSE: mono, TRUE: stereo*/ + VMUINT8 bitPerSample; /* 8 or 16, commonly use 16 bits*/ + vm_bitstream_sample_freq_enum sampleFreq; /* 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000*/ +} vm_bitstream_pcm_audio_cfg_struct; + +/* buffer status */ +typedef struct +{ + VMUINT total_buf_size; + VMUINT free_buf_size; +} vm_bitstream_audio_buffer_status; + +/* paly audio parameters */ +typedef struct +{ + VMUINT start_time; + VMUINT8 volume; + VMUINT8 audio_path; +} vm_bitstream_audio_start_param; + +/* callback function */ +typedef void (*vm_bitstream_audio_result_callback)(VMINT handle, VMINT result); + + +/* Bitstream record quality */ +typedef enum +{ + VM_BITSTREAM_RECORD_QUALITY_LOW, /* Low quality */ + VM_BITSTREAM_RECORD_QUALITY_MED, /* Reserved */ + VM_BITSTREAM_RECORD_QUALITY_HIGH, /* High quality */ + VM_BITSTREAM_RECORD_QUALITY_BEST, /* Reserved */ + + /* For VM_BITSTREAM_CODEC_TYPE_AMR only */ + VM_BITSTREAM_RECORD_AMR_4_75, /* AMR 4.75 kbit/s */ + VM_BITSTREAM_RECORD_AMR_5_15, /* AMR 5.15 kbit/s */ + VM_BITSTREAM_RECORD_AMR_5_9, /* AMR 5.9 kbit/s */ + VM_BITSTREAM_RECORD_AMR_6_7, /* AMR 6.7 kbit/s */ + VM_BITSTREAM_RECORD_AMR_7_4, /* AMR 7.4 kbit/s */ + VM_BITSTREAM_RECORD_AMR_7_95, /* AMR 7.95 kbit/s */ + VM_BITSTREAM_RECORD_AMR_10_2, /* AMR 10.2 kbit/s */ + VM_BITSTREAM_RECORD_AMR_12_2 /* AMR 12.2 kbit/s */ +}vm_bitstream_rec_quality_enum; + +/* Get type of bitstream recorder */ +typedef enum +{ + VM_BITSTREAM_RECORD_GET_LENGTH, /* Get the length of recorded data(VMUINT16*) */ + VM_BITSTREAM_RECORD_GET_DATA, /* Get recorded data(VMUINT16*) */ + VM_BITSTREAM_RECORD_GET_STRENGTH /* Get current data strengh value*/ +}vm_bitstream_record_get_type_enum; + +/* Set type of bitstream recorder */ +typedef enum +{ + VM_BITSTREAM_RECORD_SET_PAUSE, /* Pause bitstream record */ + VM_BITSTREAM_RECORD_SET_RESUME, /* Resume bitstream record */ + VM_BITSTREAM_RECORD_SET_CB_THRESHOLD /* Set callback threshold: default is 200 (words), pass the address of a VMUINT32 to data_p*/ +}vm_bitstream_record_set_type_enum; + +typedef struct +{ + VMUINT16 codec_type; /* vm_bitstream_codec_type_enum */ + VMUINT16 quality; /* vm_bitstream_rec_quality_enum */ +}vm_bitstream_record_cfg_struct; + + +/* ======================== BitStream Audio ============================= */ + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_open + * DESCRIPTION + * open bitstream audio. + * PARAMETERS + * handle : [OUT] bitstream handle. + * audio_type : [IN] current type, support ARM,AAC,MP3. + * callback : [IN] callback function. + * RETURNS + * open success or not. + * RETURN VALUES + * VM_BITSTREAM_SUCCEED : open success. + * VM_BITSTREAM_FAILED : open failed. +*****************************************************************************/ +VMINT vm_bitstream_audio_open( + VMINT* handle, + vm_bitstream_audio_cfg_struct *audio_type, + vm_bitstream_audio_result_callback callback); + + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_open_pcm + * DESCRIPTION + * open pcm type bitstream audio. + * PARAMETERS + * handle : [OUT] bitstream handle. + * audio_type : [IN] current type, support PCM. + * callback : [IN] callback function. + * RETURNS + * open success or not. + * RETURN VALUES + * VM_BITSTREAM_SUCCEED : open success. + * VM_BITSTREAM_FAILED : open failed. +*****************************************************************************/ +VMINT vm_bitstream_audio_open_pcm( + VMINT* handle, + vm_bitstream_pcm_audio_cfg_struct *audio_type, + vm_bitstream_audio_result_callback callback); + + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_finished + * DESCRIPTION + * tell driver no data to put any more. + * PARAMETERS + * handle : [IN] bitstream handle which is getted by vm_bitstream_audio_open. + * RETURNS + * close success or not. + * RETURN VALUES + * VM_BITSTREAM_SUCCEED : finished success. + * VM_BITSTREAM_FAILED : finished failed. +*****************************************************************************/ +VMINT vm_bitstream_audio_finished(VMINT handle); + + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_close + * DESCRIPTION + * close bitstream audio. + * PARAMETERS + * handle : [IN] bitstream handle which is getted by vm_bitstream_audio_open. + * RETURNS + * close success or not. + * RETURN VALUES + * VM_BITSTREAM_SUCCEED : close success. + * VM_BITSTREAM_FAILED : close failed. +*****************************************************************************/ +VMINT vm_bitstream_audio_close(VMINT handle); + + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_get_buffer_status + * DESCRIPTION + * get data buffer status include free buffer and total buffer size + * PARAMETERS + * handle : [IN] bitstream handle. + * status : [OUT] the status of buffer, please refer the stucture of vm_bitstream_audio_buffer_status. + * RETURNS + * get status success or not. + * RETURN VALUES + * VM_BITSTREAM_SUCCEED : get status success. + * VM_BITSTREAM_FAILED : get status failed. +*****************************************************************************/ +VMINT vm_bitstream_audio_get_buffer_status( + VMINT handle, + vm_bitstream_audio_buffer_status *status); + + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_put_data + * DESCRIPTION + * put audio data to buffer. + * PARAMETERS + * handle : [IN] bitstream handle. + * buffer : [IN] buffer data to put. + * buffer_size : [IN] data buffer size. + * written : [OUT] the real data size to put. + * RETURNS + * put data to buffer success or not. + * RETURN VALUES + * VM_BITSTREAM_SUCCEED : put data success. + * VM_BITSTREAM_FAILED : put data failed. +*****************************************************************************/ +VMINT vm_bitstream_audio_put_data( + VMINT handle, + VMUINT8 *buffer, + VMUINT buffer_size, + VMUINT *written); + + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_start + * DESCRIPTION + * start to play audio. + * PARAMETERS + * handle : [IN] bitstream handle. + * para : [IN] audio paremeters,refer the structure of vm_bitstream_audio_start_param. + * RETURNS + * play audio success or not. + * RETURN VALUES + * VM_BITSTREAM_SUCCEED : play audio success. + * VM_BITSTREAM_FAILED : play audio failed. +*****************************************************************************/ +VMINT vm_bitstream_audio_start( + VMINT handle, + vm_bitstream_audio_start_param *para); + + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_stop + * DESCRIPTION + * stop play audio. + * PARAMETERS + * handle : [IN] bitstream handle. + * RETURNS + * stop audio success or not. + * RETURN VALUES + * VM_BITSTREAM_SUCCEED : stop audio success. + * VM_BITSTREAM_FAILED : stop audio failed. +*****************************************************************************/ +VMINT vm_bitstream_audio_stop(VMINT handle); + + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_get_play_time + * DESCRIPTION + * get current play time. + * PARAMETERS + * handle : [IN] bitstream handle. + * current_time : [OUT] current play time(ms). + * RETURNS + * get current play time success or not. + * RETURN VALUES + * VM_BITSTREAM_SUCCEED : get time success. + * VM_BITSTREAM_FAILED : get time failed. +*****************************************************************************/ +VMINT vm_bitstream_audio_get_play_time( + VMINT handle, + VMUINT* current_time); + + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_register_interrupt_callback + * DESCRIPTION + * register interrupt callback. + * PARAMETERS + * callback : [IN] callback function pointer. + * RETURNS + * handle of register function + * RETURN VALUES + * 0 : failed. +*****************************************************************************/ +VMINT vm_bitstream_audio_register_interrupt_callback(vm_bitstream_audio_result_callback callback); + + +/***************************************************************************** + * FUNCTION + * vm_bitstream_audio_clear_interrupt_callback + * DESCRIPTION + * clear the interrupt callback. + * PARAMETERS + * handle : [IN] handle from vm_bitstream_audio_register_interrupt_callback. +*****************************************************************************/ +void vm_bitstream_audio_clear_interrupt_callback(VMINT handle); + + +VMINT vm_bitstream_record_open(VMINT* handle_p,vm_bitstream_record_cfg_struct* cfg_p,vm_bitstream_audio_result_callback callback); +VMINT vm_bitstream_record_close(VMINT handle); +VMINT vm_bitstream_record_start(VMINT handle); +VMINT vm_bitstream_record_stop(VMINT handle); +VMINT vm_bitstream_record_get(VMINT handle,vm_bitstream_record_get_type_enum get_type,void* data_p,VMUINT16* data_len_p); +VMINT vm_bitstream_record_set(VMINT handle,vm_bitstream_record_set_type_enum set_type,void* data_p,VMUINT16 data_len); + +#ifdef __cplusplus +} +#endif + +#endif /* _VM_BITSTREAM_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmbridge.h b/hardware/arduino/mtk/system/libmtk/include/vmbridge.h new file mode 100644 index 00000000..d327bf99 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmbridge.h @@ -0,0 +1,192 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmbridge_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * driver bridge header file + * + * Author: + * ------- + * jianying.li(mtk81091) + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_BRIDGE_SDK_H +#define VM_BRIDGE_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ +#include "vmsys.h" + +/*vm_pipe_type*/ +typedef enum +{ + VM_SOCKET_PIPE_TYPE = 0x01,//VM_SOCKET_PIPE_TYPE + VM_UART_PIPE_TYPE,//VM_UART_PIPE_TYPE + VM_USB_PIPE_TYPE,// VM_USB_PIPE_TYPE + VM_UNDEFINED_TYPE//VM_UNDEFINED_TYPE +}vm_pipe_type; + +/*vm_socket_info*/ +typedef struct +{ + VMINT socket_accpet_fd;//socket_accpet_fd +}vm_socket_info; + +typedef struct +{ + VMUINT8 usb_port;//usb_port +}vm_usb_info; + +/*vm_uart_info*/ +typedef struct +{ + VMUINT32 uart_band;//uart_band + VMUINT8 uart_port;//uart_port + VMUINT8 flowControl;//flowControl +}vm_uart_info; + +/*vm_bridge_info*/ +typedef struct +{ + VMINT type;//type + union//type_info + { + vm_socket_info sock_info;//sock_info + vm_uart_info uart_info;//uart_info + vm_usb_info usb_info;//usb_info + }type_info;//type_info +}vm_bridge_info; + + + +/***************************************************************************** + * FUNCTION + * vm_bridge_create + * DESCRIPTION + * create bridge and connect firPeer and secPeer + * PARAMETERS + * firPeer: the first peer to create + * secPeer: the second peer to create + * RETURNS + * if create success, return 0, else return non_zero val + * USE CASE + * + * //accept sockect fd should obtain when socket accpet() return + * VMINT accpet_id; + * VMINT uart_port_id; + * vm_bridge_info firBridgeInfo, secBridgeInfo; + * VMINT ret; + * // accpet fd should create by your socket listen() action + * firBridgeInfo.type = VM_SOCKET_PIPE_TYPE; + * firBridgeInfo.type_info.sock_info.socket_accpet_fd = accpet_id; + * + * secBridgeInfo.type = VM_UART_PIPE_TYPE; + * secBridgeInfo.type_info.uart_info.uart_port = uart_port_id; + * secBridgeInfo.type_info.uart_info.uart_band = UART_BAUD_9600; + * secBridgeInfo.type_info.uart_info.flowControl = 0; + * + * ret = vm_bridge_create(&firBridgeInfo, &secBridgeInfo); + * if(0 != ret) + * { + * //create bridge fail and can record trace + * } + * + * // run bridge... + * + * //close bridge(optional) + * ret = vm_bridge_close(&firBridgeInfo, &secBridgeInfo); + * + *****************************************************************************/ +extern VMINT vm_bridge_create(vm_bridge_info *firPeer, vm_bridge_info *secPeer); +/***************************************************************************** + * FUNCTION + * vm_bridge_close + * DESCRIPTION + * close bridge and disconnect firPeer and secPeer + * PARAMETERS + * firPeer: the first peer to create + * secPeer: the second peer to create + * RETURNS + * if close success, return 0, else return non_zero val + * USE CASE like vm_bridge_create. + * + * //accept sockect fd should obtain when socket accpet() return + * VMINT accpet_id; + * VMINT uart_port_id; + * vm_bridge_info firBridgeInfo, secBridgeInfo; + * VMINT ret; + * // accpet fd should create by your socket listen() action + * firBridgeInfo.type = VM_SOCKET_PIPE_TYPE; + * firBridgeInfo.type_info.sock_info.socket_accpet_fd = accpet_id; + * + * secBridgeInfo.type = VM_UART_PIPE_TYPE; + * secBridgeInfo.type_info.uart_info.uart_port = uart_port_id; + * secBridgeInfo.type_info.uart_info.uart_band = UART_BAUD_9600; + * secBridgeInfo.type_info.uart_info.flowControl = 0; + * + * ret = vm_bridge_create(&firBridgeInfo, &secBridgeInfo); + * if(0 != ret) + * { + * //create bridge fail and can record trace + * } + * + * // run bridge... + * + * //close bridge(optional) + * ret = vm_bridge_close(&firBridgeInfo, &secBridgeInfo); + * + *****************************************************************************/ +extern VMINT vm_bridge_close(vm_bridge_info *firPeer, vm_bridge_info *secPeer); +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_BRIDGE_SDK_H*/ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmbtcm.h b/hardware/arduino/mtk/system/libmtk/include/vmbtcm.h new file mode 100644 index 00000000..bb597785 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmbtcm.h @@ -0,0 +1,453 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VM_BTCM_SDK_H +#define VM_BTCM_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "vmsys.h" + +#define VM_SRV_BT_CM_BD_FNAME_LEN 56 +#define VM_SRV_BT_CM_MAX_HOST_SUPPORTED_PROFILE 10 + +typedef enum +{ + VM_BT_CM_ERR_LOGICAL = -5, + VM_BT_CM_ERR_BAD_PARAM, + VM_BT_CM_ERR_NO_RESOURCE, + VM_BT_CM_ERR_NOT_SUPPORT, + VM_BT_CM_ERR_NO_AUTHORIZATION, + VM_BT_CM_ERR_SUCCESS = 0 +}vm_btcm_error_t; + +typedef enum +{ + VM_SRV_BT_CM_RESULT_SUCCESS = 0, /* success */ + VM_SRV_BT_CM_RESULT_FAILED = -1, /* failed */ + VM_SRV_BT_CM_RESULT_INVALID_HANDLE = -2, /* invalid instance handler */ + VM_SRV_BT_CM_RESULT_DEV_NOT_FOUND = -3, /* device not found */ + VM_SRV_BT_CM_RESULT_DEV_LIST_FULL = -4, /* device list full */ + VM_SRV_BT_CM_RESULT_NO_CONNECTION = -5, /* there is no connection */ + VM_SRV_BT_CM_RESULT_ONE_HEADSET_CONNECTED = -6, /* there is one headset connected */ + VM_SRV_BT_CM_RESULT_ONE_A2DP_CONNECTED = -7, /* there is one A2DP connection */ + VM_SRV_BT_CM_RESULT_SAME_HEADSET_CONNECTED = -8, /* the same headset is connected */ + VM_SRV_BT_CM_RESULT_PROFILE_NOT_SUPPORT = -9, /* the profile is not supported */ + VM_SRV_BT_CM_RESULT_TOTAL /* last enum for BT CM result code */ +} vm_srv_bt_cm_result_codes_enum; + + +/* event definiation */ +typedef enum +{ + VM_SRV_BT_CM_EVENT_ACTIVATE = 0x00000001, /* activate */ + VM_SRV_BT_CM_EVENT_DEACTIVATE = 0x00000002, /* deactivate */ + VM_SRV_BT_CM_EVENT_INQUIRY_IND = 0x00000004, /* inquiry indication */ + VM_SRV_BT_CM_EVENT_INQUIRY_COMPLETE = 0x00000008, /* inquiry complete */ + VM_SRV_BT_CM_EVENT_BEGIN_ACTIVATE = 0x00000010, // begin activate + VM_SRV_BT_CM_EVENT_BEGIN_DEACTIVATE = 0x00800000, // begin deactivate + VM_SRV_BT_CM_EVENT_BOND_RES = 0x00000020, /* bond result */ + VM_SRV_BT_CM_EVENT_PAIR_IND = 0x00000040, /* pair indication */ + VM_SRV_BT_CM_EVENT_PAIR_RES = 0x00000080, /* pair result */ + VM_SRV_BT_CM_EVENT_SECURITY_USER_CONFIRM = 0x00000100, /* security user confirm */ + VM_SRV_BT_CM_EVENT_SECURITY_PASSKEY_NOTIFY = 0x00000200, /* security passkey notify */ + VM_SRV_BT_CM_EVENT_SECURITY_KEYPRESS_NOTIFY = 0x00000400, /* security keypress notify */ + VM_SRV_BT_CM_EVENT_CONNECT_REQ = 0x00000800, /* connect request */ + VM_SRV_BT_CM_EVENT_CONNECT_RES = 0x00001000, /* connect result */ + VM_SRV_BT_CM_EVENT_DISCONNECT_IND = 0x00002000, /* disconnect indication */ + VM_SRV_BT_CM_EVENT_RELEASE_ALL_CONN = 0x00004000, /* release all connection */ + VM_SRV_BT_CM_EVENT_REFRESH_PROFILE = 0x00008000, /* refresh profile */ + VM_SRV_BT_CM_EVENT_SET_AUTHORIZE = 0x00010000, /* set authorize */ + VM_SRV_BT_CM_EVENT_UNBLOCK = 0x00020000, /* unblock device */ + VM_SRV_BT_CM_EVENT_MYDEV_DEL = 0x00040000, /* mydevice delete */ + VM_SRV_BT_CM_EVENT_SET_VISIBILITY = 0x00100000, /* set visibility */ + VM_SRV_BT_CM_EVENT_SET_NAME = 0x00200000, /* set name */ + VM_SRV_BT_CM_EVENT_SET_AUTHENTICATION = 0x00400000, /* set authentication */ + VM_SRV_BT_CM_EVENT_SET_SIMAP = 0x01000000, /* set SIMAP */ + VM_SRV_BT_CM_EVENT_SCO_IND = 0x02000000, /* sco indication */ + VM_SRV_BT_CM_EVENT_PANIC_IND = 0x04000000, /* panic inidation */ + VM_SRV_BT_CM_EVENT_READ_REMOTE_DEV_NAME = 0x08000000, /* read remote device */ + VM_SRV_BT_CM_EVENT_SET_LIMIT_DISCOVERABLE_MODE = 0x10000000, /* set limit discoverable mode */ + VM_SRV_BT_CM_EVENT_CHIP_DETECT = 0x20000000, /* chip auto detect */ + VM_SRV_BT_CM_EVENT_BOND_CANCEL = 0x40000000, /* bond cancel */ + VM_SRV_BT_CM_EVENT_FAIL_CONN_TO = 0x80000000, /* bond cancel */ + VM_SRV_BT_CM_EVENT_TOTAL /* last bt srv event enum */ +}vm_srv_bt_cm_event_enum; + +/* the power status of BT */ +typedef enum +{ + VM_SRV_BT_CM_POWER_ON, /* power on */ + VM_SRV_BT_CM_POWER_OFF, /* power off */ + VM_SRV_BT_CM_POWER_SWITCHING_ON, /* power switching on */ + VM_SRV_BT_CM_POWER_SWITCHING_OFF, /* power switching off */ + VM_SRV_BT_CM_POWER_TOTAL /* last enum for BT power status */ +}vm_srv_bt_cm_power_status_enum; + +/* visibility type enum */ +typedef enum +{ + VM_SRV_BT_CM_VISIBILITY_ON = 1, /* visibility on, can be discovered by other bt device */ + VM_SRV_BT_CM_VISIBILITY_TEMPORARY_ON, /* visibility temporary on, can be discovered by other bt device for some time */ + VM_SRV_BT_CM_VISIBILITY_OFF, /* visibility off, can not be discovered by other bt device */ + VM_SRV_BT_CM_VISIBILITY_TOTAL /* last enum for visibility type */ +}vm_srv_bt_cm_visibility_type; + +/* Bluetooth device type */ +typedef enum +{ + VM_SRV_BT_CM_DISCOVERED_DEV, /* discovered device */ + VM_SRV_BT_CM_RECENT_USED_DEV, /* recent used device */ + VM_SRV_BT_CM_PAIRED_DEV, /* paired device */ + VM_SRV_BT_CM_ALL_DEV, /* all device */ + VM_SRV_BT_CM_DEV_TYPE_TOTAL +}vm_srv_bt_cm_dev_type_enum; + +/* bt addr */ +struct _vm_srv_bt_cm_bt_addr +{ + VMUINT lap; /* Lower Address Part 00..23 */ + VMUINT8 uap; /* upper Address Part 24..31 */ + VMUINT16 nap; /* Non-significant 32..47 */ +}; + +#ifndef vm_bt_cm_bt_addr +#define vm_bt_cm_bt_addr +typedef struct _vm_srv_bt_cm_bt_addr vm_srv_bt_cm_bt_addr; +#endif + +/* pair indication struct */ +typedef struct +{ + VMINT32 srv_hd; /* service handle*/ + void* user_data; /* user data */ + VMUINT8* dev_name; /* device name */ + VMUINT8 enable_16digits_pin_code; /* whether enable 16 digits pin code */ + vm_srv_bt_cm_bt_addr dev_addr; /* device address */ +} vm_srv_bt_cm_pair_ind_struct; + +/* dev info structure */ +typedef struct +{ + VMUINT cod; /* class of device */ + VMUINT8 name[VM_SRV_BT_CM_BD_FNAME_LEN]; /* device name */ + vm_srv_bt_cm_bt_addr bd_addr; /* device addres */ + VMUINT8 attribute; /* authorized or blocked */ + VMUINT8 service_list_num; /* supported service number */ + VMINT service_list[VM_SRV_BT_CM_MAX_HOST_SUPPORTED_PROFILE]; /* supported service list */ +}vm_srv_bt_cm_dev_struct; + + + +/* event struct for VM_SRV_BT_CM_EVENT_ACTIVATE */ +typedef struct +{ + VMINT res_hd; /* res handle*/ + void * user_data; /* user data */ + VMINT result; /* activate result */ +}vm_srv_bt_cm_activate_struct; + + +/* event struct for VM_SRV_BT_CM_EVENT_DEACTIVATE */ +typedef struct +{ + VMINT res_hd; /* res handle*/ + void * user_data; /* user data */ + VMINT result; /* deactivate result */ +}vm_srv_bt_cm_deactivate_struct; + + +/* event struct for VM_SRV_BT_CM_EVENT_INQUIRY_IND */ +typedef struct +{ + VMINT res_hd; /* res handle*/ + void* user_data; /* user data */ + VMUINT discovered_dev_num; /* discovered device number */ +} vm_srv_bt_cm_inquiry_indication_struct; + +/* event struct for VM_SRV_BT_CM_EVENT_INQUIRY_COMPLETE */ +typedef struct +{ + VMINT res_hd; /* res handle*/ + void * user_data; /* user data */ + VMINT result; /* inquiry complete result */ + VMINT is_cancelled; /* non zero : cancelled by user + * zero : not cancelled by user */ +}vm_srv_bt_cm_inquiry_complete_struct; + +/* event struct for VM_SRV_BT_CM_EVENT_SET_VISIBILITY */ +typedef struct +{ + VMINT res_hd; /* res handle*/ + void * user_data; /* user data */ + VMINT result; /* set visibility result */ + VMINT is_from_mmi; /* to identify whether the action is initiated by MMI + * or change the visibility just by CM service due to A2DP connected */ +}vm_srv_bt_cm_set_visibility_struct; + +/* event struct for VM_SRV_BT_CM_EVENT_SET_NAME */ +typedef struct +{ + VMINT res_hd; /* res handle*/ + void * user_data; /* user data */ + VMINT result; /* set name result in vm_srv_bt_cm_result_codes_enum */ +}vm_srv_bt_cm_set_name_struct; + + +//Pairing method +typedef enum +{ + VM_PIN_AND_SSP = 0, //Pairing need UI and user should confirm,normal case for product,such as phone/mid,we support both pin and ssp + VM_FIXED_PIN_ONLY, //Pairing no need UI,auto accept pairing ,only adopt FIXED PIN CODE method + VM_FIXED_PIN_AND_SSP_JUST_WORK //Pairing no need UI,auto accept pairing ,adopt FIXED PIN CODE and JUST WORK of SSP +}vm_bt_pairing_Type; + + +/****************************************************************************** + * FUNCTION + * vm_btcm_init + * DESCRIPTION + * Bluetooth CM set notifier, after set successfully, + * notifier will receive the event notification it it happens. + * PARAMETERS + * callback : [IN] notifier + * evt_mask: [IN] event mask, refer to vm_srv_bt_cm_event_enum + * user_data : [IN] user data + * + * RETURNS + * VMINT res handle, failure if less than 0, see vm_btcm_error_t + ******************************************************************************/ +VMINT vm_btcm_init(void (*callback)(VMUINT evt, void * param, void * user_data), VMUINT evt_mask, void * user_data); + +/***************************************************************************** + * FUNCTION + * vm_btcm_exit + * DESCRIPTION + * exit btcm, + * PARAMETERS + * res_hd : [IN] res handle + * RETURNS + * failure if less than 0, else successful, see vm_btcm_error_t + *****************************************************************************/ +VMINT vm_btcm_exit(VMINT res_hd); + +/***************************************************************************** + * FUNCTION + * vm_btcm_get_power_status + * DESCRIPTION + * This function is to get current bt power status + * PARAMETERS + * void + * RETURNS + * failure if less than 0, else + * vm_srv_bt_cm_power_status_enum + * VM_SRV_BT_CM_POWER_ON means BT power is ON + * VM_SRV_BT_CM_POWER_OFF means BT power is OFF + * VM_SRV_BT_CM_POWER_SWITCHING_ON means switching power to be ON now + * VM_SRV_BT_CM_POWER_SWITCHING_OFF means switching power to be OFF now + *****************************************************************************/ +VMINT vm_btcm_get_power_status(void); + + +/***************************************************************************** + * FUNCTION + * vm_btcm_switch_on + * DESCRIPTION + * This function is to switch on bt chip, + * and it will also help to activate bt profiles registered to CM service + * PARAMETERS + * void + * RETURNS + * VMINT : refer to vm_srv_bt_cm_result_codes_enum + *****************************************************************************/ +VMINT vm_btcm_switch_on(void); + +/***************************************************************************** + * FUNCTION + * vm_btcm_switch_off + * DESCRIPTION + * This function is to switch off bt, it will also help to deactivate all the activated bt profiles, + * if there is live connection(s), it will disconnect the live connection(s) firstly + * PARAMETERS + * RETURNS + * VMINT : refer to vm_srv_bt_cm_result_codes_enum + *****************************************************************************/ +VMINT vm_btcm_switch_off(void); + +/****************************************************************************** + * FUNCTION + * vm_btcm_srv_set_visibility + * DESCRIPTION + * this function is to set bluetooth visibility + * PARAMETERS + * type: [IN] visibility type + * RETURNS + * VMINT : refer to vm_srv_bt_cm_result_codes_enum + ******************************************************************************/ +VMINT vm_btcm_srv_set_visibility(vm_srv_bt_cm_visibility_type type); + +/****************************************************************************** + * FUNCTION + * vm_btcm_srv_get_visibility + * DESCRIPTION + * this function is to get bluetooth visibility + * PARAMETERS + * void + * RETURNS + * VMINT : refer to vm_srv_bt_cm_result_codes_enum + ******************************************************************************/ +VMINT vm_btcm_srv_get_visibility(void); + +/***************************************************************************** + * FUNCTION + * vm_btcm_search + * DESCRIPTION + * This function is to process inquiry request, + * each time finding a device, it will notify notifier with event VM_SRV_BT_CM_EVENT_INQUIRY_IND , + * after search procedure completed, it will notify notifier VM_SRV_BT_CM_EVENT_INQUIRY_COMPLETE. + * PARAMETERS + * max_response : [IN] max repsone number of device + * time_out : [IN] inquiry timeout timer + * cod : [IN] class of device + * is_name_discovery: [IN] whether do name discovery + * RETURNS + * VMINT : failure if less than 0, see vm_srv_bt_cm_result_codes_enum, else successful + *****************************************************************************/ +VMINT vm_btcm_search(VMUINT8 max_response, VMUINT16 time_out, VMUINT cod, VMBYTE is_name_discovery); + +/***************************************************************************** + * FUNCTION + * vm_btcm_search_abort + * DESCRIPTION + * This function is to process inquiry cancel request + * and invoke srv_bt_cm_cancel_discovery_req_hdler, + * notifier will receive VM_SRV_BT_CM_EVENT_INQUIRY_COMPLETE after cancel inquiry procedure is completed + * PARAMETERS + * void + * RETURNS + * VMINT : refer to vm_srv_bt_cm_result_codes_enum + *****************************************************************************/ +VMINT vm_btcm_search_abort(void); + +/***************************************************************************** + * FUNCTION + * vm_btcm_set_host_name + * DESCRIPTION + * This function is to set host device name, it will notify notifier VM_SRV_BT_CM_EVENT_SET_NAME + * after set host device name procedure is completed. + * PARAMETERS + * name : [IN] host device name, UTF-8 coding + * RETURNS + * VMINT : refer to vm_srv_bt_cm_result_codes_enum + *****************************************************************************/ +VMINT vm_btcm_set_host_name(VMUINT8 * name); + +/***************************************************************************** + * FUNCTION + * vm_btcm_get_host_name + * DESCRIPTION + * This function is to get host device information + * PARAMETERS + * info : [IN] host device info structure in vm_srv_bt_cm_dev_struct + * RETURNS + * VMINT : failure if less than 0, see vm_btcm_error_t, else successful + *****************************************************************************/ +VMINT vm_btcm_get_host_dev_info(vm_srv_bt_cm_dev_struct * info); + +/****************************************************************************** + * FUNCTION + * vm_btcm_get_dev_num + * DESCRIPTION + * this function is to get device number according to device type + * PARAMETERS + * dev_type: [IN] refer to vm_srv_bt_cm_dev_type_enum + * + * RETURNS + * VMINT : device number of designated device type + ******************************************************************************/ +VMINT vm_btcm_get_dev_num(vm_srv_bt_cm_dev_type_enum dev_type); + +/****************************************************************************** + * FUNCTION + * vm_btspp_get_dev_info_by_index + * DESCRIPTION + * this function is to get device info + * PARAMETERS + * index : [IN] device index + * dev_type: [IN] device type + * info: [OUT] device type + * + * RETURNS + * if succeed to find the device, return VM_BT_CM_ERR_SUCCESS + * return value less than 0, if failed to find the device + ******************************************************************************/ +VMINT vm_btcm_get_dev_info_by_index(VMUINT idx, vm_srv_bt_cm_dev_type_enum dev_type, vm_srv_bt_cm_dev_struct * info); + +/***************************************************************************** + * FUNCTION + * vm_bt_cm_send_passkey + * DESCRIPTION + * This function is to process pair request and send passkey + * PARAMETERS + * dev_addr : [IN] device address + * dev_passkey: [IN] passkey + * result : [IN] VM_TURE: valid passkey, VM_FALSE:reject this pair + * RETURNS + * U32 : refer to srv_bt_cm_result_codes_enum + *****************************************************************************/ +VMINT vm_bt_cm_send_passkey(vm_srv_bt_cm_bt_addr* dev_addr, VMUINT8* dev_passkey, VMBOOL result); + + +/***************************************************************************** + * FUNCTION + * vm_custom_set_bt_pairing_method + * DESCRIPTION + * This function is to set bt pair type + * PARAMETERS + * config_type : [IN] pair type + * RETURNS + * None + *****************************************************************************/ +void vm_custom_set_bt_pairing_method(vm_bt_pairing_Type config_type); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* VM_BTCM_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmbtgatt.h b/hardware/arduino/mtk/system/libmtk/include/vmbtgatt.h new file mode 100644 index 00000000..13bba233 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmbtgatt.h @@ -0,0 +1,880 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VM_BTGATT_SDK_H +#define VM_BTGATT_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "vmsys.h" + +#define VM_ATT_HANDLE VMUINT16 + + +typedef VMUINT32 VM_GATT_CHAR_PROPERTIES; +#define VM_GATT_CHAR_PROP_BROADCAST 0x01 +#define VM_GATT_CHAR_PROP_READ 0x02 +#define VM_GATT_CHAR_PROP_WRITE_WO_RESPONSE 0x04 +#define VM_GATT_CHAR_PROP_WRITE 0x08 +#define VM_GATT_CHAR_PROP_NOTIFY 0x10 +#define VM_GATT_CHAR_PROP_INDICATE 0x20 +#define VM_GATT_CHAR_PROP_SIGNED_WRITE 0x40 +#define VM_GATT_EXT_PROP 0x80 + +typedef VMUINT32 VM_GATT_PERMISSION; +#define VM_GATT_PERM_READ (1 << 0) /* bit 0 */ +#define VM_GATT_PERM_READ_ENCRYPTED (1 << 1) /* bit 1 */ +#define VM_GATT_PERM_READ_ENC_MITM (1 << 2) /* bit 2 */ +#define VM_GATT_PERM_WRITE (1 << 4) /* bit 4 */ +#define VM_GATT_PERM_WRITE_ENCRYPTED (1 << 5) /* bit 5 */ +#define VM_GATT_PERM_WRITE_ENC_MITM (1 << 6) /* bit 6 */ +#define VM_GATT_PERM_WRITE_SIGNED (1 << 7) /* bit 7 */ +#define VM_GATT_PERM_WRITE_SIGNED_MITM (1 << 8) /* bit 8 */ + + +typedef enum +{ + VM_OS_STATUS_SUCCESS = 0, + VM_OS_STATUS_FAILED = 1, +}VM_OS_STATUS; + + +#define VM_BD_ADDR_SIZE 6 +typedef struct _VM_BD_ADDR +{ + VMUINT8 addr[VM_BD_ADDR_SIZE]; +}VM_BD_ADDR; + +#define VM_ATT_MAX_VALUE_LEN 512 +typedef struct +{ + VMUINT16 len; + VMUINT8 value[VM_ATT_MAX_VALUE_LEN]; +}VM_ATT_VALUE; + + +typedef struct +{ + /* the len can only be 2, 4, or 16 */ + VMUINT8 len; + VMUINT8 uuid[16]; +}VM_BT_UUID; +typedef struct +{ + VM_BT_UUID uuid; + VMUINT8 inst; +}VM_ATT_UUID; +typedef struct +{ + VM_ATT_UUID uuid; + VMUINT8 is_primary; +}VM_GATT_SVC_UUID; + + + +typedef struct +{ + VMUINT8 uu[16]; +}vm_bt_uuid_struct; + +typedef struct +{ + void *reg_ctx; + void *conn_ctx; +}vm_gatt_conn_struct; + + +/**************************************************************************** +* data define +****************************************************************************/ +/** BT-GATT Server callback structure. */ + +/** Callback invoked in response to register */ +typedef void (*vmt_register_server_callback)(void *reg_ctx, VM_OS_STATUS status, vm_bt_uuid_struct *app_uuid); + +/** Callback indicating that a remote device has connected or been disconnected */ +typedef void (*vmt_connection_callback)(vm_gatt_conn_struct *conn, VMBOOL connected, VM_BD_ADDR *bd_addr); + +/** Callback triggered in response to listen */ +typedef void (*vmt_listen_callback)(void *reg_ctx, VM_OS_STATUS status); + +/** Callback invoked in response to create_service */ +typedef void (*vmt_service_added_callback)(VM_OS_STATUS status, void *reg_ctx, + VM_GATT_SVC_UUID *srvc_id, VM_ATT_HANDLE srvc_handle); + +/** Callback indicating that an included service has been added to a service */ +typedef void (*vmt_included_service_added_callback)(VM_OS_STATUS status, void *reg_ctx, + VM_ATT_HANDLE srvc_handle, VM_ATT_HANDLE incl_srvc_handle); + +/** Callback invoked when a characteristic has been added to a service */ +typedef void (*vmt_characteristic_added_callback)(VM_OS_STATUS status, void *reg_ctx, + VM_ATT_UUID *uuid, VM_ATT_HANDLE srvc_handle, VM_ATT_HANDLE char_handle); + +/** Callback invoked when a descriptor has been added to a characteristic */ +typedef void (*vmt_descriptor_added_callback)(VM_OS_STATUS status, void *reg_ctx, + VM_ATT_UUID *uuid, VM_ATT_HANDLE srvc_handle, VM_ATT_HANDLE descr_handle); + +/** Callback invoked in response to start_service */ +typedef void (*vmt_service_started_callback)(VM_OS_STATUS status, void *reg_ctx, + VM_ATT_HANDLE srvc_handle); + +/** Callback invoked in response to stop_service */ +typedef void (*vmt_service_stopped_callback)(VM_OS_STATUS status, void *reg_ctx, + VM_ATT_HANDLE srvc_handle); + +/** Callback triggered when a service has been deleted */ +typedef void (*vmt_service_deleted_callback)(VM_OS_STATUS status, void *reg_ctx, + VM_ATT_HANDLE srvc_handle); + +/** + * Callback invoked when a remote device has requested to read a characteristic + * or descriptor. The application must respond by calling send_response + */ +typedef void (*vmt_request_read_callback)(vm_gatt_conn_struct *conn, VMUINT16 trans_id, VM_BD_ADDR *bd_addr, + VM_ATT_HANDLE attr_handle, VMUINT16 offset, VMBOOL is_long); + +/** + * Callback invoked when a remote device has requested to write to a + * characteristic or descriptor. + */ +typedef void (*vmt_request_write_callback)(vm_gatt_conn_struct *conn, VMUINT16 trans_id, VM_BD_ADDR *bd_addr, + VM_ATT_HANDLE attr_handle, VM_ATT_VALUE *value, VMUINT16 offset, + VMBOOL need_rsp, VMBOOL is_prep); + +/** Callback invoked when a previously prepared write is to be executed */ +typedef void (*vmt_request_exec_write_callback)(vm_gatt_conn_struct *conn, VMUINT16 trans_id, + VM_BD_ADDR *bd_addr, VMBOOL cancel); + +/** + * Callback triggered in response to send_response if the remote device + * sends a confirmation. + */ +typedef void (*vmt_response_confirmation_callback)(VM_OS_STATUS status, VM_ATT_HANDLE handle); + +/** Callback triggered in response to read_tx_power */ +typedef void (*vmt_read_tx_power_callback)(void *reg_ctx, VM_OS_STATUS status, VM_BD_ADDR *bd_addr, VMUINT8 tx_power); + +typedef struct +{ + vmt_register_server_callback register_server_cb; + vmt_connection_callback connection_cb; + vmt_listen_callback listen_cb; + vmt_service_added_callback service_added_cb; + vmt_included_service_added_callback included_service_added_cb; + vmt_characteristic_added_callback characteristic_added_cb; + vmt_descriptor_added_callback descriptor_added_cb; + vmt_service_started_callback service_started_cb; + vmt_service_stopped_callback service_stopped_cb; + vmt_service_deleted_callback service_deleted_cb; + vmt_request_read_callback request_read_cb; + vmt_request_write_callback request_write_cb; + vmt_request_exec_write_callback request_exec_write_cb; + vmt_response_confirmation_callback response_confirmation_cb; + vmt_read_tx_power_callback read_tx_power_cb; +}vm_gatts_callback_struct; + +/***************************************************************************** + * FUNCTION + * vm_gatts_register + * DESCRIPTION + * Registers a GATT server application with the stack + * PARAMETERS + * uuid [IN] : BT UUID + * callback [IN] : the pointer of callback structure + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_register(vm_bt_uuid_struct *uuid, vm_gatts_callback_struct *callback); + +/***************************************************************************** + * FUNCTION + * vm_gatts_deregister + * DESCRIPTION + * Unregister a server application from the stack + * PARAMETERS + * reg_ctx [IN] : the context of gatt server + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_deregister(void *reg_ctx); + +/***************************************************************************** + * FUNCTION + * vm_gatts_connect + * DESCRIPTION + * Create a connection to a remote peripheral + * PARAMETERS + * reg_ctx [IN] : + * bd_addr [IN] : + * direct [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_connect(void *reg_ctx, VM_BD_ADDR *bd_addr, VMBOOL direct); + +/***************************************************************************** + * FUNCTION + * vm_gatts_disconnect + * DESCRIPTION + * Disconnect an established connection or cancel a pending one + * PARAMETERS + * conn [IN] : + * bd_addr [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_disconnect(vm_gatt_conn_struct *conn, VM_BD_ADDR *bd_addr); + +/***************************************************************************** + * FUNCTION + * vm_gatts_listen + * DESCRIPTION + * Start or stop a listen for connection + * PARAMETERS + * reg_ctx [IN] : + * start [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_listen(void *reg_ctx, VMBOOL start); + +/***************************************************************************** + * FUNCTION + * vm_gatts_add_service + * DESCRIPTION + * Create a new service + * PARAMETERS + * reg_ctx [IN] : + * srvc_id [IN] : + * num_handles [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_add_service(void *reg_ctx, VM_GATT_SVC_UUID *srvc_id, VMUINT16 num_handles); + +/***************************************************************************** + * FUNCTION + * vm_gatts_add_included_service + * DESCRIPTION + * Assign an included service to it's parent service + * PARAMETERS + * reg_ctx [IN] : + * service_handle [IN] : + * included_handle [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_add_included_service(void *reg_ctx, VM_ATT_HANDLE service_handle, VM_ATT_HANDLE included_handle); + +/***************************************************************************** + * FUNCTION + * vm_gatts_add_characteristic + * DESCRIPTION + * Add a characteristic to a service + * PARAMETERS + * reg_ctx [IN] : + * service_handle [IN] : + * uuid [IN] : + * properties [IN] : + * permission [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_add_characteristic(void *reg_ctx, + VM_ATT_HANDLE service_handle, VM_ATT_UUID *uuid, + VM_GATT_CHAR_PROPERTIES properties, VM_GATT_PERMISSION permission); + +/***************************************************************************** + * FUNCTION + * vm_gatts_add_descriptor + * DESCRIPTION + * Add a descriptor to a given service + * PARAMETERS + * reg_ctx [IN] : + * service_handle [IN] : + * uuid [IN] : + * permission [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_add_descriptor(void *reg_ctx, VM_ATT_HANDLE service_handle, + VM_ATT_UUID *uuid, VM_GATT_PERMISSION permission); + +/***************************************************************************** + * FUNCTION + * vm_gatts_start_service + * DESCRIPTION + * Starts a local service + * PARAMETERS + * reg_ctx [IN] : + * service_handle [IN] : + * transport [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_start_service(void *reg_ctx, VM_ATT_HANDLE service_handle, + VMUINT8 transport); + +/***************************************************************************** + * FUNCTION + * vm_gatts_stop_service + * DESCRIPTION + * Stops a local service + * PARAMETERS + * reg_ctx [IN] : + * service_handle [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_stop_service(void *reg_ctx, VM_ATT_HANDLE service_handle); + +/***************************************************************************** + * FUNCTION + * vm_gatts_delete_service + * DESCRIPTION + * Delete a local service + * PARAMETERS + * reg_ctx [IN] : + * service_handle [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_delete_service(void *reg_ctx, VM_ATT_HANDLE service_handle); + +/***************************************************************************** + * FUNCTION + * vm_gatts_send_indication + * DESCRIPTION + * Send value indication to a remote device + * PARAMETERS + * conn [IN] : + * attribute_handle [IN] : + * need_confirm [IN] : + * value [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_send_indication(vm_gatt_conn_struct *conn, VM_ATT_HANDLE attribute_handle, + VMBOOL need_confirm, VM_ATT_VALUE *value); + +/***************************************************************************** + * FUNCTION + * vm_gatts_send_response + * DESCRIPTION + * Send a response to a read/write operation + * PARAMETERS + * conn [IN] : + * trans_id [IN] : + * status [IN] : + * handle [IN] : + * value [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_send_response(vm_gatt_conn_struct *conn, VMUINT16 trans_id, + VM_OS_STATUS status, VM_ATT_HANDLE handle, VM_ATT_VALUE *value); + + +/***************************************************************************** + * FUNCTION + * vm_gatts_read_tx_power + * DESCRIPTION + * Request tx power for a given remote device + * PARAMETERS + * reg_ctx [IN] : + * bd_addr [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gatts_read_tx_power(void *reg_ctx, VM_BD_ADDR *bd_addr); + + + +/**************************************************************************** +* data define +****************************************************************************/ +/* authentication requirement */ +typedef VMUINT8 VM_GATTC_AUTH_REQ; +#define VM_GATTC_AUTH_REQ_NONE 0 +#define VM_GATTC_AUTH_REQ_NO_MITM 1 /* unauthenticated encryption */ +#define VM_GATTC_AUTH_REQ_MITM 2 /* authenticated encryption */ +#define VM_GATTC_AUTH_REQ_SIGNED_NO_MITM 3 +#define VM_GATTC_AUTH_REQ_SIGNED_MITM 4 + +typedef VMUINT8 VM_GATTC_WRITE_TYPE; +#define VM_GATTC_WRITE_TYPE_NO_RSP 1 +#define VM_GATTC_WRITE_TYPE_REQUEST 2 +#define VM_GATTC_WRITE_TYPE_PREPARE 3 + +typedef VMUINT8 VM_GATTC_DEV_TYPE; +#define VM_GATTC_DEV_TYPE_UNKNOWN 0 +#define VM_GATTC_DEV_TYPE_LE 1 +#define VM_GATTC_DEV_TYPE_BR_EDR 2 +#define VM_GATTC_DEV_TYPE_BR_EDR_LE 3 + + + +typedef struct +{ + VM_GATT_SVC_UUID *svc_uuid; + VM_ATT_UUID *ch_uuid; +}vm_gattc_char_struct; + +typedef struct +{ + VM_GATT_SVC_UUID *svc_uuid; + VM_ATT_UUID *ch_uuid; + VM_ATT_UUID *descr_uuid; +}vm_gattc_descr_struct; + +/** BT-GATT Client callback structure. */ + +/** Callback invoked in response to register */ +typedef void (*vmt_register_client_callback)(void *reg_ctx, VM_OS_STATUS status, vm_bt_uuid_struct *app_uuid); + +/** Callback for scan results */ +typedef void (*vmt_scan_result_callback)(void *reg_ctx, VM_BD_ADDR *bd_addr, VMINT32 rssi, VMUINT8 eir_len, VMUINT8 *eir); + +/** Callback indicating that a remote device has connected or been disconnected */ +//typedef void (*vmt_connection_callback)(vm_gatt_conn_struct *conn, VMBOOL connected, VM_BD_ADDR *bd_addr); + +/** Callback triggered in response to listen */ +//typedef void (*vmt_listen_callback)(void *reg_ctx, VM_OS_STATUS status); + +/** Callback triggered in response to set_adv_data */ +typedef void (*vmt_set_adv_data_callback)(void *reg_ctx, VM_OS_STATUS status); + +/** + * Invoked in response to search_service when the GATT service search + * has been completed. + */ +typedef void (*vmt_search_complete_callback)(void *reg_ctx, VM_OS_STATUS status); + +/** Reports GATT services on a remote device */ +typedef void (*vmt_search_result_callback)(vm_gatt_conn_struct *conn, VM_GATT_SVC_UUID *uuid); + +/** GATT characteristic enumeration result callback */ +typedef void (*vmt_get_characteristic_callback)(vm_gatt_conn_struct *conn, VM_OS_STATUS status, + vm_gattc_char_struct *ch, VM_GATT_CHAR_PROPERTIES properties); + +/** GATT descriptor enumeration result callback */ +typedef void (*vmt_get_descriptor_callback)(vm_gatt_conn_struct *conn, VM_OS_STATUS status, vm_gattc_descr_struct *descr); + +/** GATT included service enumeration result callback */ +typedef void (*vmt_get_included_service_callback)(vm_gatt_conn_struct *conn, VM_OS_STATUS status, + VM_GATT_SVC_UUID *svc_uuid, VM_GATT_SVC_UUID *incl_svc_uuid); + +/** Callback invoked in response to [de]register_for_notification */ +typedef void (*vmt_register_for_notification_callback)(void *reg_ctx, VM_OS_STATUS status, + VM_BD_ADDR *bd_addr, vm_gattc_char_struct *ch); + +/** + * Remote device notification callback, invoked when a remote device sends + * a notification or indication that a client has registered for. + */ +typedef void (*vmt_notify_callback)(vm_gatt_conn_struct *conn, VM_BD_ADDR *bd_addr, + vm_gattc_char_struct *ch, VM_ATT_VALUE *value, VMBOOL is_notify); + +/** Reports result of a GATT read operation */ +typedef void (*vmt_read_characteristic_callback)(vm_gatt_conn_struct *conn, VM_OS_STATUS status, + vm_gattc_char_struct *ch, VM_ATT_VALUE *value); + +/** GATT write characteristic operation callback */ +typedef void (*vmt_write_characteristic_callback)(vm_gatt_conn_struct *conn, VM_OS_STATUS status, + vm_gattc_char_struct *ch); + +/** Callback invoked in response to read_descriptor */ +typedef void (*vmt_read_descriptor_callback)(vm_gatt_conn_struct *conn, VM_OS_STATUS status, + vm_gattc_descr_struct *descr, VM_ATT_VALUE *value); + +/** Callback invoked in response to write_descriptor */ +typedef void (*vmt_write_descriptor_callback)(vm_gatt_conn_struct *conn, VM_OS_STATUS status, + vm_gattc_descr_struct *descr); + +/** GATT execute prepared write callback */ +typedef void (*vmt_execute_write_callback)(vm_gatt_conn_struct *conn, VM_OS_STATUS status); + +/** Callback triggered in response to read_remote_rssi */ +typedef void (*vmt_read_remote_rssi_callback)(void *reg_ctx, VM_OS_STATUS status, VM_BD_ADDR *bd_addr, VMINT32 rssi); + +/** Callback triggered in response to get_device_type */ +typedef void (*vmt_get_device_type_callback)(void *reg_ctx, VM_OS_STATUS status, VM_BD_ADDR *bd_addr, VM_GATTC_DEV_TYPE dev_type); + +/* status : Used by message handler to return result of request */ + +typedef struct +{ + vmt_register_client_callback register_client_cb; + vmt_scan_result_callback scan_result_cb; + vmt_connection_callback connection_cb; + vmt_listen_callback listen_cb; + vmt_set_adv_data_callback set_adv_data_cb; + vmt_search_complete_callback search_complete_cb; + vmt_search_result_callback search_result_cb; + vmt_get_characteristic_callback get_characteristic_cb; + vmt_get_descriptor_callback get_descriptor_cb; + vmt_get_included_service_callback get_included_service_cb; + vmt_register_for_notification_callback register_for_notification_cb; + vmt_notify_callback notify_cb; + vmt_read_characteristic_callback read_characteristic_cb; + vmt_write_characteristic_callback write_characteristic_cb; + vmt_read_descriptor_callback read_descriptor_cb; + vmt_write_descriptor_callback write_descriptor_cb; + vmt_execute_write_callback execute_write_cb; + vmt_read_remote_rssi_callback read_remote_rssi_cb; + vmt_get_device_type_callback get_device_type_cb; +}vm_gattc_callback_struct; + +/**************************************************************************** +* function define +****************************************************************************/ +/***************************************************************************** + * FUNCTION + * vm_gattc_register + * DESCRIPTION + * Registers a GATT client application with the stack + * PARAMETERS + * app_uuid [IN] : BT UUID + * callback [IN] : the pointer of callback structure + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_register(vm_bt_uuid_struct *app_uuid, vm_gattc_callback_struct *callback); + +/***************************************************************************** + * FUNCTION + * vm_gattc_deregister + * DESCRIPTION + * Unregister a client application from the stack + * PARAMETERS + * reg_ctx [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_deregister(void *reg_ctx); + +/***************************************************************************** + * FUNCTION + * vm_gattc_scan + * DESCRIPTION + * Start or stop LE device scanning + * PARAMETERS + * reg_ctx [IN] : + * start [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_scan(void *reg_ctx, VMBOOL start); + +/***************************************************************************** + * FUNCTION + * vm_gattc_connect + * DESCRIPTION + * Create a connection to a remote LE or dual-mode device + * PARAMETERS + * reg_ctx [IN] : + * bd_addr [IN] : + * direct [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_connect(void *reg_ctx, VM_BD_ADDR *bd_addr, VMBOOL direct); + +/***************************************************************************** + * FUNCTION + * vm_gattc_disconnect + * DESCRIPTION + * Disconnect a remote device or cancel a pending connection + * PARAMETERS + * conn [IN] : + * bd_addr [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_disconnect(vm_gatt_conn_struct *conn, VM_BD_ADDR *bd_addr); + +/***************************************************************************** + * FUNCTION + * vm_gattc_listen + * DESCRIPTION + * Start or stop a listen for connection + * PARAMETERS + * reg_ctx [IN] : + * start [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_listen(void *reg_ctx, VMBOOL start); + +/***************************************************************************** + * FUNCTION + * vm_gattc_set_adv_data + * DESCRIPTION + * Set advertise data + * PARAMETERS + * reg_ctx [IN] : + * set_scan_rsp [IN] : + * include_name [IN] : + * include_txpower [IN] : + * min_interval [IN] : + * max_interval [IN] : + * appearance [IN] : + * manufacturer_len [IN] : + * manufacturer_data [IN] : + * service_data_len [IN] : + * service_data [IN] : + * service_uuid_len [IN] : + * service_uuid [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_set_adv_data(void *reg_ctx, VMBOOL set_scan_rsp, VMBOOL include_name, VMBOOL include_txpower, + VMUINT16 min_interval, VMUINT16 max_interval, VMUINT16 appearance, + VMUINT16 manufacturer_len, VMCHAR *manufacturer_data, + VMUINT16 service_data_len, VMCHAR *service_data, + VMUINT16 service_uuid_len, VMCHAR *service_uuid); + +/***************************************************************************** + * FUNCTION + * vm_gattc_refresh + * DESCRIPTION + * Clear the attribute cache for a given device + * PARAMETERS + * reg_ctx [IN] : + * bd_addr [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_refresh(void *reg_ctx, VM_BD_ADDR *bd_addr); + +/***************************************************************************** + * FUNCTION + * vm_gattc_search_service + * DESCRIPTION + * Enumerate all GATT services on a connected device. + * Optionally, the results can be filtered for a given UUID. + * PARAMETERS + * conn [IN] : + * uuid [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_search_service(vm_gatt_conn_struct *conn, vm_bt_uuid_struct *uuid); + +/***************************************************************************** + * FUNCTION + * vm_gattc_get_included_service + * Enumerate included services for a given service. + * Set start_incl_srvc_id to NULL to get the first included service. + * PARAMETERS + * conn [IN] : + * svc_uuid [IN] : + * incl_svc_uuid [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_get_included_service(vm_gatt_conn_struct *conn, VM_GATT_SVC_UUID *svc_uuid, + VM_GATT_SVC_UUID *incl_svc_uuid); + +/***************************************************************************** + * FUNCTION + * vm_gattc_get_characteristic + * DESCRIPTION + * Enumerate characteristics for a given service. + * Set start_char_uuid to NULL to get the first characteristic. + * PARAMETERS + * conn [IN] : + * svc_uuid [IN] : + * start_char_uuid [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_get_characteristic(vm_gatt_conn_struct *conn, VM_GATT_SVC_UUID *svc_uuid, VM_ATT_UUID *start_char_uuid); + +/***************************************************************************** + * FUNCTION + * vm_gattc_get_descriptor + * DESCRIPTION + * Enumerate descriptors for a given characteristic. + * Set start_descr_id to NULL to get the first descriptor. + * PARAMETERS + * conn [IN] : + * char_info [IN] : + * start_descr_uuid [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_get_descriptor(vm_gatt_conn_struct *conn, vm_gattc_char_struct *char_info, VM_ATT_UUID *start_descr_uuid); + +/***************************************************************************** + * FUNCTION + * vm_gattc_read_characteristic + * DESCRIPTION + * Read a characteristic on a remote device + * PARAMETERS + * conn [IN] : + * ch [IN] : + * auth_req [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_read_characteristic(vm_gatt_conn_struct *conn, vm_gattc_char_struct *ch, VM_GATTC_AUTH_REQ auth_req); + +/***************************************************************************** + * FUNCTION + * vm_gattc_write_characteristic + * DESCRIPTION + * Write a remote characteristic + * PARAMETERS + * conn [IN] : + * ch [IN] : + * value [IN] : + * write_type [IN] : + * auth_req [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_write_characteristic(vm_gatt_conn_struct *conn, vm_gattc_char_struct *ch, + VM_ATT_VALUE *value, VM_GATTC_WRITE_TYPE write_type, VM_GATTC_AUTH_REQ auth_req); + +/***************************************************************************** + * FUNCTION + * vm_gattc_read_descriptor + * DESCRIPTION + * Read the descriptor for a given characteristic + * PARAMETERS + * conn [IN] : + * descr [IN] : + * auth_req [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_read_descriptor(vm_gatt_conn_struct *conn, vm_gattc_descr_struct *descr, VM_GATTC_AUTH_REQ auth_req); + +/***************************************************************************** + * FUNCTION + * vm_gattc_write_descriptor + * DESCRIPTION + * Write a remote descriptor for a given characteristic + * PARAMETERS + * conn [IN] : + * descr [IN] : + * value [IN] : + * write_type [IN] : + * auth_req [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_write_descriptor(vm_gatt_conn_struct *conn, vm_gattc_descr_struct *descr, + VM_ATT_VALUE *value, VM_GATTC_WRITE_TYPE write_type, VM_GATTC_AUTH_REQ auth_req); + +/***************************************************************************** + * FUNCTION + * vm_gattc_execute_write + * DESCRIPTION + * Execute a prepared write operation + * PARAMETERS + * conn [IN] : + * exeute [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_execute_write(vm_gatt_conn_struct *conn, VMUINT8 exeute); + +/***************************************************************************** + * FUNCTION + * vm_gattc_register_for_notification + * DESCRIPTION + * Register to receive notifications or indications for a given + * characteristic + * PARAMETERS + * reg_ctx [IN] : + * bd_addr [IN] : + * ch [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_register_for_notification(void *reg_ctx, VM_BD_ADDR *bd_addr, vm_gattc_char_struct *ch); + +/***************************************************************************** + * FUNCTION + * vm_gattc_deregister_for_notification + * DESCRIPTION + * Deregister a previous request for notifications/indications + * PARAMETERS + * reg_ctx [IN] : + * bd_addr [IN] : + * ch [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_deregister_for_notification(void *reg_ctx, VM_BD_ADDR *bd_addr, vm_gattc_char_struct *ch); + +/***************************************************************************** + * FUNCTION + * vm_gattc_read_remote_rssi + * DESCRIPTION + * Request RSSI for a given remote device + * PARAMETERS + * reg_ctx [IN] : + * bd_addr [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_read_remote_rssi(void *reg_ctx, VM_BD_ADDR *bd_addr); + +/***************************************************************************** + * FUNCTION + * vm_gattc_get_device_type + * DESCRIPTION + * Determine the type of the remote device (LE, BR/EDR, Dual-mode) + * PARAMETERS + * reg_ctx [IN] : + * bd_addr [IN] : + * RETURNS + * failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_gattc_get_device_type(void *reg_ctx, VM_BD_ADDR *bd_addr); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* VM_BTCM_SDK_H */ + + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmbtnotify.h b/hardware/arduino/mtk/system/libmtk/include/vmbtnotify.h new file mode 100644 index 00000000..337acce6 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmbtnotify.h @@ -0,0 +1,187 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef VM_BTNOTIFY_SDK_H +#define VM_BTNOTIFY_SDK_H + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "vmsys.h" +#include "vmbtcm.h" + +#define VM_BT_NOTIFY_MRE_FILE_NAME_LENTH 50 +#define VM_BT_NOTIFY_MRE_MAX_DATA_LENTH (2047 - 30) +#define VM_MAX_IOER (16) + +/* mre callback data type */ +typedef enum +{ + VM_SRV_BT_NOTI_MRE_DATA_TYPE_BUFFER = 0, + VM_SRV_BT_NOTI_MRE_DATA_TYPE_FILE +}vm_srv_bt_noti_mre_data_type_enum; + + +typedef enum +{ + VM_SRV_BT_NOTIFY_RET_NO_ERROR = 0, + VM_SRV_BT_NOTIFY_RET_UNKNOWN_ERROR = -1000, /* unknown error */ + VM_SRV_BT_NOTIFY_RET_FILE_NOT_EXIST, /* file not exist */ + VM_SRV_BT_NOTIFY_RET_FILE_INTEGRITY_ERROR, /* file length error */ + VM_SRV_BT_NOTIFY_RET_LINK_DISCONNECTED, + VM_SRV_BT_NOTIFY_RET_MRE_PARSE_PARA_ERROR, + VM_SRV_BT_NOTIFY_RET_MAP_FILE_PARSE_PARA_ERROR +} vm_srv_bt_notify_ret_code; + + +/* mre callback struct */ +typedef struct +{ + VMCHAR sender[VM_MAX_IOER]; /* sender id for FP */ + VMCHAR receiver[VM_MAX_IOER]; /* receiver id for SP */ + VMINT32 err_code; /* error code */ + VMINT data_type; /* data type, 0 for buffer, 1 for file */ + union + { + VMWCHAR file_path[VM_BT_NOTIFY_MRE_FILE_NAME_LENTH]; /* file path */ + struct + { + VMUINT8 buf[VM_BT_NOTIFY_MRE_MAX_DATA_LENTH]; /* buffer address */ + VMUINT16 len; /* buffer length */ + }buffer; + }data; + vm_srv_bt_cm_bt_addr bt_addr; /* bt addr */ +}vm_srv_bt_noti_callback_struct; + + +/* The bt notification callback mre engine */ +typedef void (*vm_srv_bt_noti_callback)(vm_srv_bt_noti_callback_struct *data); + +/***************************************************************************** + * FUNCTION + * vm_srv_bt_noti_check_connection + * DESCRIPTION + * check the connection status. + * RETURNS + * VMINT : 0 is connection succesfully else no connection + *****************************************************************************/ +VMINT vm_srv_bt_noti_check_connection(void); + +/***************************************************************************** + * FUNCTION + * vm_srv_bt_noti_register_mre_callback + * DESCRIPTION + * regist the callback, it will be called while here is a notify from spp service + * PARAMETERS + * bt_addr : [IN] bt address + * sender [IN]: the id of yourself (sender id) + * cb [IN]: callback + * RETURNS + * VMINT : 0 is succesful else failure + *****************************************************************************/ +VMINT vm_srv_bt_noti_register_callback(const vm_srv_bt_cm_bt_addr *bt_addr, const VMCHAR sender[VM_MAX_IOER], vm_srv_bt_noti_callback cb); + +/* MREE sender_id data_type data_len data CANNOT EXCEED VM_BT_NOTIFY_MRE_MAX_DATA_LENTH */ + +/***************************************************************************** + * FUNCTION + * vm_srv_bt_noti_send_cmd_ext + * DESCRIPTION + * send data to the other side. this API will conbine the param to string, the total size could not exceed the VM_BT_NOTIFY_MRE_MAX_DATA_LENTH. + * or the -4 will be return. + * PARAMETERS + * bt_addr : [IN] bt address + * reader [IN]: whose id you want to send. + * data_type [IN]: refer to vm_srv_bt_noti_mre_data_type_enum + * data [IN]: what data want to be sent + * len [IN]: sending data length + * RETURNS + * VMINT : 0 is succesful else failure + *****************************************************************************/ +VMINT vm_srv_bt_noti_send_cmd_ext(const vm_srv_bt_cm_bt_addr *bt_addr, const VMCHAR reader[VM_MAX_IOER], VMINT data_type, const VMBYTE *data, VMINT len); + +/***************************************************************************** + * FUNCTION + * vm_srv_bt_noti_send_ex + * DESCRIPTION + * send data to the other side. this API will conbine the param to string, the total size could not exceed the VM_BT_NOTIFY_MRE_MAX_DATA_LENTH. + * or the -4 will be return. + * PARAMETERS + * bt_addr : [IN] bt address + * sender [IN]: whose id you want to send. + * receiver [IN]: whose id you want to read. + * data_type [IN]: refer to vm_srv_bt_noti_mre_data_type_enum + * data [IN]: what data want to be sent + * len [IN]: sending data length + * RETURNS + * VMINT : 0 is succesful else failure + *****************************************************************************/ +VMINT vm_srv_bt_noti_send_ex(const vm_srv_bt_cm_bt_addr *bt_addr, const VMCHAR sender[VM_MAX_IOER], const VMCHAR receiver[VM_MAX_IOER], VMINT data_type, const VMBYTE *data, VMINT len); + +/***************************************************************************** + * FUNCTION + * vm_bt_noti_check_channel_valid + * DESCRIPTION + * This function is to check validation context channel + * PARAMETERS + * cntx_chnl : [IN] channel index + * RETURNS + * VMINT : 0 is valid else failure + *****************************************************************************/ +VMINT vm_bt_noti_check_channel_valid(VMINT cntx_chnl); + + +/***************************************************************************** + * FUNCTION + * vm_bt_noti_get_bt_device_addr + * DESCRIPTION + * This function is to get bt device address from context channel + * PARAMETERS + * cntx_chnl : [IN] channel index + * RETURNS + * VMINT : 0 is succesful else failure + *****************************************************************************/ +VMINT vm_bt_noti_get_bt_device_addr(VMINT cntx_chnl, vm_srv_bt_cm_bt_addr *bt_addr); + +#define vm_srv_bt_noti_register_mre_callback vm_srv_bt_noti_register_callback + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* VM_BTNOTIFY_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmbtspp.h b/hardware/arduino/mtk/system/libmtk/include/vmbtspp.h new file mode 100644 index 00000000..ef3b10b4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmbtspp.h @@ -0,0 +1,322 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef VM_BTSPP_SDK_H +#define VM_BTSPP_SDK_H + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "vmsys.h" + + +/*spp connect type*/ +typedef enum{ + VM_SRV_SPP_CONNECT_WITH_SCO = 0x01, /* connect with SOC */ + VM_SRV_SPP_CONNECT_WITHOUT_SCO = 0x02 /* connect without SOC */ +}vm_srv_spp_connect_type; + +/*spp return error type*/ +typedef enum +{ + VM_BT_SPP_ERR_LOGICAL = -5, /* error in logical */ + VM_BT_SPP_ERR_BAD_PARAM, /* error in bad param */ + VM_BT_SPP_ERR_NO_RESOURCE, /* error in resource */ + VM_BT_SPP_ERR_NOT_SUPPORT, /* error in support */ + VM_BT_SPP_ERR_NO_AUTHORIZATION, /* error in authorization */ + VM_BT_SPP_ERR_SUCCESS = 0 /* no error */ +}vm_btspp_error_t; + +/*spp security level*/ +typedef enum{ + VM_SRV_SPP_SEC_NAN = 0x00, /* security NAN */ + VM_SRV_SPP_SEC_AUTHENTICATION = 0x01, /* security level */ + VM_SRV_SPP_SEC_AUTHORIZATION = 0x04, /* security level */ + VM_SRV_SPP_SEC_ENCRYPTION = 0x10, /* security level */ + VM_SRV_SPP_SEC_ALL = 0xff /* */ +}vm_srv_spp_security_level; + +/*spp srv for app event enum*/ +typedef enum{ + VM_SRV_SPP_EVENT_START = 0x0001, /* spp event start */ + VM_SRV_SPP_EVENT_BIND_FAIL = 0x0002, /* spp event bind fail */ + VM_SRV_SPP_EVENT_AUTHORIZE = 0x0004, /* spp event authorize */ + VM_SRV_SPP_EVENT_CONNECT = 0x0008, /* spp event connect */ + VM_SRV_SPP_EVENT_SCO_CONNECT = 0x0010, /* spp event soc connect */ + VM_SRV_SPP_EVENT_READY_TO_WRITE = 0x0020, /* spp event ready to write */ + VM_SRV_SPP_EVENT_READY_TO_READ = 0x0040, /* spp event ready to read */ + VM_SRV_SPP_EVENT_DISCONNECT = 0x0080, /* spp event disconnect */ + VM_SRV_SPP_EVENT_SCO_DISCONNECT = 0x0100, /* spp event soc disconnect */ + VM_SRV_SPP_EVENT_END +}vm_srv_spp_event_enum; + +/*spp srv for app event structure */ +typedef struct{ + VMINT res_hd; /* res handle*/ + void * user_data; /* user data */ + VMINT ret; /* result (bool) */ + VMINT conn_id; /* connection id */ +}vm_srv_spp_event_cntx; + + +#ifndef vm_bt_cm_bt_addr +#define vm_bt_cm_bt_addr +typedef struct _vm_srv_bt_cm_bt_addr vm_srv_bt_cm_bt_addr; +#endif + +/***************************************************************************** + * FUNCTION + * vm_btspp_get_min_buf_size + * DESCRIPTION + * get spp minmal buf, return the minmal buf for tx and rx + * PARAMETERS + * void + * RETURNS + * VMINT : failure if less than 0, else buf size + *****************************************************************************/ +VMINT vm_btspp_get_min_buf_size(void); + +/***************************************************************************** + * FUNCTION + * vm_btspp_open + * DESCRIPTION + * open btspp, return the resource handle if success + * PARAMETERS + * void + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_open(VMUINT evt_mask, void (*callback)(VMUINT evt, void * param, void * user_data), void * user_data); + +/***************************************************************************** + * FUNCTION + * vm_btspp_distory + * DESCRIPTION + * This function is for distorying a spp resource + * PARAMETERS + * res_hd [IN]: res handler + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_close(VMINT res_hd); + +/***************************************************************************** + * FUNCTION + * vm_btspp_disconnect + * DESCRIPTION + * This function is for app disconnect a connect + * PARAMETERS + * conn_id [IN]: connnect id + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_disconnect(VMINT conn_id); + +/***************************************************************************** + * FUNCTION + * vm_btspp_write + * DESCRIPTION + * This function is for app write data + * PARAMETERS + * conn_id [IN]: connect id + * buf [IN]: data buf want to transfer + * size [IN]: the size of data want to transfer + * RETURNS + * VMINT : failure if less than 0, see vm_btspp_error_t, + * else return the size of data transferred successfully + *****************************************************************************/ +VMINT vm_btspp_write(VMUINT conn_id, void * buf, VMUINT size); + +/***************************************************************************** + * FUNCTION + * vm_btspp_read + * DESCRIPTION + * This function is for app read data + * PARAMETERS + * conn_id [IN]: connect id + * buf [IN]: data buf want to receive + * size [IN]: the size of data want to receive + * RETURNS + * VMINT : failure if less than 0, see vm_btspp_error_t, + * else return the size of data received successfully + *****************************************************************************/ +VMINT vm_btspp_read(VMUINT conn_id, void * buf, VMUINT size); + +/***************************************************************************** + * FUNCTION + * vm_btspp_get_dev_addr + * DESCRIPTION + * get the bt addr with the conn_id + * PARAMETERS + * conn_id [IN]: connect id + * bt_addr [IN]: bt_addr. + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_get_dev_addr(VMINT conn_id, vm_srv_bt_cm_bt_addr * bt_addr); + +/***************************************************************************** + * FUNCTION + * vm_btspp_set_security_level + * DESCRIPTION + * This function is for set security level by handle + * PARAMETERS + * res_hd [IN]: res handler + * level [IN]: spp instance security level in vm_srv_spp_security_level + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_set_security_level(VMINT res_hd, VMINT level); + +/***************************************************************************** + * FUNCTION + * vm_btspp_set_service_name + * DESCRIPTION + * This function is for set a spp resource name + * PARAMETERS + * res_hd [IN]: res handler + * name [IN]: spp resource name UCS2 + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_set_service_name(VMINT res_hd, VMWCHAR * name); + +/* SPP SERVER USING START*/ + +/***************************************************************************** + * FUNCTION + * vm_btspp_bind + * DESCRIPTION + * This function is for app create a spp instance + * PARAMETERS + * res_hd [IN]: res handler + * uuid [IN]: profile id + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_bind(VMINT res_hd, VMUINT16 uuid); + +/***************************************************************************** + * FUNCTION + * vm_btspp_accept + * DESCRIPTION + * This function is used for server whether do accept when notified by event VM_SRV_SPP_EVENT_AUTHORIZE + * PARAMETERS + * conn_id [IN]: connect id + * buf [IN]: tx rx buffer + * tx_size [IN]: tx buffer size + * rx_size [IN]: rx buffer size + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_accept(VMINT conn_id, + void * buf, + VMUINT tx_size, + VMUINT rx_size + ); + +/***************************************************************************** + * FUNCTION + * vm_btspp_reject + * DESCRIPTION + * This function is used for server whether do accept when notified by event VM_SRV_SPP_EVENT_AUTHORIZE + * PARAMETERS + * conn_id : connect id + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_reject(VMINT conn_id); + +/* SPP SERVER USING END */ + + +/* SPP CLIENT USING START */ + +/***************************************************************************** + * FUNCTION + * vm_srv_spp_connect + * DESCRIPTION + * This function is for app connect server + * PARAMETERS + * res_hd [IN]: res handler + * bt_addr [IN]: server bt address + * buf [IN]: for tx rx buffer + * tx_size [IN]: tx buffer size + * rx_size [IN]: rx buffer size + * uuid [IN]: profile id + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_connect(VMINT res_hd, + const vm_srv_bt_cm_bt_addr * bt_addr, + void * buf, + VMUINT tx_size, + VMUINT rx_size, + VMUINT16 uuid); + +/***************************************************************************** + * FUNCTION + * vm_srv_spp_connect_ex + * DESCRIPTION + * This function is for app connect server + * PARAMETERS + * res_hd [IN]: res handler + * bt_addr [IN]: bt address. + * buf [IN]: for tx rx buffer + * tx_size [IN]: tx buffer size + * rx_size [IN]: rx_size + * connect_type [IN]: with sco or not + * uuid [IN]: profile id + * RETURNS + * VMINT : failure if less than 0, else successful + *****************************************************************************/ +VMINT vm_btspp_connect_ex(VMINT res_hd, + const vm_srv_bt_cm_bt_addr * bt_addr, + void * buf, + VMUINT tx_size, + VMUINT rx_size, + vm_srv_spp_connect_type conn_type, + VMUINT16 uuid); + +/* SPP CLIENT USING END */ + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* VM_BTSPP_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmcamera.h b/hardware/arduino/mtk/system/libmtk/include/vmcamera.h new file mode 100644 index 00000000..45879412 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmcamera.h @@ -0,0 +1,1038 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMCAMERA_SDK_H_ +#define VMCAMERA_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +#include "vmgraph.h" + +typedef VMINT VM_CAMERA_HANDLE; + +/* camera id */ +typedef enum +{ + VM_CAMERA_MAIN_ID = 1, + VM_CAMERA_MAIN_LOW_RESOURCE_ID +}VM_CAMERA_ID; + +/* The maximum number of af zone */ +#define VM_CAMERA_AF_ZONE_MAX_NO 5 + +/* camera result */ +typedef enum +{ + VM_CAM_PREVIEW_START_DONE = 1, /* preview success */ + VM_CAM_PREVIEW_START_ABORT, /* preview abort */ + VM_CAM_PREVIEW_STOP_DONE, /* stop preview done */ + VM_CAM_PREVIEW_STOP_ABORT, /* stop preview failed */ + VM_CAM_PREVIEW_FRAME_RECEIVED, /* receive data */ + VM_CAM_CAPTURE_DONE, /* capture success */ + VM_CAM_CAPTURE_ABORT /* capture abort */ +}VM_CAMERA_MESSAGE; + +/* camera status */ +typedef enum +{ + VM_CAM_READY_STATUS = 1, /* create camera success status */ + VM_CAM_STARTING_PREVIEW_STATUS, /* starting preview status */ + VM_CAM_STOPPING_PREVIEW_STATUS, /* stopping preview status */ + VM_CAM_PREVIEW_STATUS, /* preview status */ + VM_CAM_CAPTURING_STATUS /* capturing status */ +}VM_CAMERA_STATUS; + + +/* operation success */ +#define VM_CAM_SUCCESS (0) + +/* no memory */ +#define VM_CAM_ERR_NOMEMORY (-1) + +/* not support operation in this status */ +#define VM_CAM_ERR_OPERATE_BAD_STATUS (-2) + +/* wrong parameters */ +#define VM_CAM_ERR_BAD_PARAM (-3) + +/* invalid handle */ +#define VM_CAM_ERR_INVALID_CAM_HANDLE (-4) + +/* linkit not support operation */ +#define VM_CAM_ERR_UNSUPPORT_OPERATION (-5) + +/* instance has been created */ +#define VM_CAM_ERR_CAM_INSTANCE_CREATED (-6) + +/* not register callback function */ +#define VM_CAM_ERR_NOT_REGISTER_NOTIFY (-7) + +/* invalid camera id */ +#define VM_CAM_ERR_INVALID_CAM_ID (-8) + +/* internal error */ +#define VM_CAM_ERR_CAM_INTERNAL_ERROR (-9) + +/* not support camera feature */ +#define VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE (-10) + +/* not support under background run */ +#define VM_CAM_OPERATION_IN_PROCESS_STATUS (-11) + + +#define VM_CAM_XENONFLASH_CHARGING 1001 +#define VM_CAM_ERR_FAILED -1001 +#define VM_CAM_ERR_DISK_FULL -1002 +#define VM_CAM_ERR_WRITE_PROTECTION -1003 +#define VM_CAM_ERR_NO_DISK -1004 +#define VM_CAM_ERR_HW_NOT_READY -1005 +#define VM_CAM_ERR_MEMORY_NOT_ENOUGH -1006 +#define VM_CAM_ERR_PREVIEW_FAILED -1007 +#define VM_CAM_ERR_CAPTURE_FAILED -1008 +#define VM_CAM_ERR_ROOT_DIR_FULL -1009 +#define VM_CAM_ERR_XENONFLASH_TIMEOUT -1010 +#define VM_CAM_ERR_XENONFLASH_LOW_BATTERY -1011 +#define VM_CAM_ERR_CBM_BEARER_ERROR -1012 +#define VM_CAM_ERR_SAVE_FAILED -1013 + + + +#define VM_CAMERA_ROTATE_0 0 +#define VM_CAMERA_ROTATE_90 1 +#define VM_CAMERA_ROTATE_180 2 +#define VM_CAMERA_ROTATE_270 3 + +typedef void (*vm_camera_rotate_callback)(VMUINT8 rotate); + +/* pixel format */ +typedef enum +{ + PIXTEL_RGB565 = 1, + PIXTEL_BGR565, + PIXTEL_RGB888, + PIXTEL_BGR888, + PIXTEL_ARGB8888, + PIXTEL_ABGR8888, + PIXTEL_UYUV422 +}PIXTEL_FORMAT_T; + +typedef enum +{ + VM_RAWDATA_RGB565 = 0, + Vm_RAWDATA_YUV420 +}ROW_DATA_FORMAT_T; + + +/* frame raw data */ +typedef struct vm_cam_frame_raw_data_t +{ + VMUINT row_pixel; /* pixels per row */ + VMUINT col_pixel; /* pixels per column */ + ROW_DATA_FORMAT_T format; /* pixel format */ + void* buffer; /* buffer */ + VMINT buffer_size; /* buffer size */ +}vm_cam_frame_raw_data_t; + + +/* frame data */ +typedef struct vm_cam_frame_data_t +{ + VMUINT row_pixel; /* pixels per row */ + VMUINT col_pixel; /* pixels per column */ + PIXTEL_FORMAT_T pixtel_format; /* pixel format */ + void* pixtel_data; /* data */ + VMINT reserved; /* no use */ +}vm_cam_frame_data_t; + +/* capture data */ +typedef struct vm_cam_capture_data_t +{ + VMCHAR mime_type[32]; /* data type */ + VMUINT8* data; /* data */ + VMUINT data_size; /* data size */ + VMINT reserved; /* no use */ +}vm_cam_capture_data_t; + +/* notify data */ +typedef struct vm_cam_notify_data_t +{ + VM_CAMERA_HANDLE handle; /* camera handle */ + VM_CAMERA_MESSAGE cam_message; /* message type */ + VM_CAMERA_STATUS cam_status; /* curent status */ +}vm_cam_notify_data_t; + +/* callback function */ +typedef void (*VM_CAMERA_STATUS_NOTIFY)(const vm_cam_notify_data_t* notify_data, void* user_data); +/* camera size */ +typedef struct vm_cam_size_t +{ + VMUINT width; + VMUINT height; +}vm_cam_size_t; + +/* camera size */ +typedef struct vm_cam_origin_t +{ + VMUINT x; + VMUINT y; +}vm_cam_origin_t; + + +/* AF zone structure */ +typedef struct +{ + VMUINT af_zone_w; /* Width */ + VMUINT af_zone_h; /* Height */ + VMUINT af_zone_x; /* Offset x */ + VMUINT af_zone_y; /* Offset y */ +}vm_camera_af_zone_struct; + + +/* AF window structure */ +typedef struct +{ + VMUINT af_active_zone; /* Active zone */ + vm_camera_af_zone_struct af_zone[VM_CAMERA_AF_ZONE_MAX_NO]; /* AF zone array */ +}vm_camera_af_window_struct; + +/* The result of af */ +typedef enum +{ + VM_AF_SEARCH_STATUS_IDLE=0, /* Idle */ + VM_AF_SEARCH_STATUS_BUSY, /* Busy */ + VM_AF_SEARCH_STATUS_FOUND_FAIL, /* Failed */ + VM_AF_SEARCH_STATUS_FOUND_SUCCESS, /* Success */ + VM_AF_SEARCH_STATUS_FOUND_NOFOCUS, /* No focus */ + VM_AF_SEARCH_STATUS_SWITCH_MACRO /* Switch to marco */ +}vm_af_result_enum; + +/* af struct */ +typedef struct +{ + vm_af_result_enum af_result; /* AF result */ + VMUINT af_success_zone; /* AF success zone */ +}vm_camera_af_result_struct; + +typedef void (*vm_camera_af_ind_callback) (vm_camera_af_result_struct result_ind, void* user_data); + +/* camera parameter setting struct */ +typedef struct +{ + unsigned int preview_x; /* preview x */ + unsigned int preview_y; /* preview y */ + unsigned int preview_width; /* preview width */ + unsigned int preview_height; /* preview height */ + unsigned int preview_layer; /* preview layer handle */ + void* preview_layer_buffer; /* preview layer buffer */ + + unsigned int osd_x; /* osd x */ + unsigned int osd_y; /* osd y */ + unsigned int osd_width; /* osd width */ + unsigned int osd_height; /* osd height */ + unsigned int osd_layer; /* osd ayer handle */ + void* osd_layer_buffer; /* osd layer buffer */ + + VMUINT16 af_operation_mode; /* af mode */ + VMUINT16 af_range; /* af range */ +}vm_camera_para_struct; + +void vm_camera_sensor_driver_install(void* func_install1,void* func_install2); + +/***************************************************************************** + * FUNCTION + * vm_create_camera_instance + * DESCRIPTION + * create camera instance and get the handle, you can use the handle to do other operation, + * if you don't need use this instance, please use vm_release_camera_instance to release it. + * PARAMETERS + * camera_id : [IN] camera's id, you can refer the VM_CAMERA_ID. + * handle_ptr : [OUT] camera's handle. + * RETURNS + * create camera instance success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : create success. + * VM_CAM_ERR_NOMEMORY : there is no enough memory. + * VM_CAM_ERR_INVALID_CAM_ID : camera id is wrong. + * VM_CAM_ERR_CAM_INSTANCE_CREATED : camera instance is in use. + * VM_CAM_ERR_CAM_INTERNAL_ERROR : preview size is not support. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. + * VM_CAM_OPERATION_IN_PROCESS_STATUS : after LINKIT, when application is in background status + * not allow to create camera. + * EXAMPLE + * + * VM_CAM_READY_STATUS VM_CAM_STARTING_PREVIEW_STATUS VM_CAM_PREVIEW_STATUS VM_CAM_STOPPING_PREVIEW_STATUS VM_CAM_CAPTURING_STATUS + * | vm_camera_preview_start + * -------------------------------> + * |VM_CAM_PREVIEW_START_DONE + * --------------------------------> + * | | + * VM_CAM_PREVIEW_START_ABORT | | + * <-------------------------------- |vm_camera_preview_stop + * | -------------------------------> + * | | VM_CAM_PREVIEW_STOP_ABORT | + * | <------------------------------- + * | | + * | VM_CAM_PREVIEW_STOP_DONE | + * <------------------------------------------------------------------------------------------------ + * | | + * | |vm_camera_capture + * | ---------------------------------------------------------------> + * | VM_CAM_CAPTURE_DONE/VM_CAM_CAPTURE_ABORT | + * <------------------------------------------------------------------------------------------------------------------------------- + * |vm_camera_capture | + * -------------------------------------------------------------------------------------------------------------------------------> + * | VM_CAM_CAPTURE_DONE/VM_CAM_CAPTURE_ABORT | + * <------------------------------------------------------------------------------------------------------------------------------- + * +*****************************************************************************/ +VMINT vm_create_camera_instance(VM_CAMERA_ID camera_id, + VM_CAMERA_HANDLE* handle_ptr); + +/***************************************************************************** + * FUNCTION + * vm_release_camera_instance + * DESCRIPTION + * release camera instance, after vm_create_camera_instance, when application exit or not use camera, + * please invole this function to release it. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * RETURNS + * release camera instance success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : release success. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to release camera instance. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_release_camera_instance(VM_CAMERA_HANDLE handle); + +/***************************************************************************** + * FUNCTION + * vm_get_camera_status + * DESCRIPTION + * get camera's current status. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * cam_status : [OUT] camera's status, please refer struct VM_CAMERA_STATUS. + * RETURNS + * get camera's success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get status success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_get_camera_status(VM_CAMERA_HANDLE handle, VM_CAMERA_STATUS* cam_status); + + + + + +/***************************************************************************** + * FUNCTION + * vm_camera_register_notify + * DESCRIPTION + * register callback function, system will invoke this function when camera's status changes. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * notify_callback : [IN] application's callback function. + * user_data : [IN] user data use as parameter for callback function, if no need, set to NULL. + * RETURNS + * register success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : register success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_register_notify(VM_CAMERA_HANDLE handle, VM_CAMERA_STATUS_NOTIFY notify_callback, void* user_data); + + + + + +/***************************************************************************** + * FUNCTION + * vm_camera_get_support_preview_size + * DESCRIPTION + * get camera's support preview size. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * cam_size_list : [OUT] camera's support preview size list. + * list_size : [OUT] camera's support preview size list size. + * RETURNS + * get camera's success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get status success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_CAM_INTERNAL_ERROR : preview size is not support. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. + * EXAMPLE + * + * void app_set_preview_size(void) + * { + * vm_cam_size_t* ptr = NULL; + * VMUINT size = 0, i = 0; + * if (vm_camera_get_support_preview_size(camera_handle, &ptr, &size) == VM_CAM_SUCCESS) + * { + * vm_cam_size_t my_cam_size; + * + * for (i = 0; i < size; i++) + * { + * my_cam_size.width = (ptr + i)->width; + * my_cam_size.height =(ptr + i) ->height; + * } + * vm_camera_set_preview_size(camera_handle, &my_cam_size); + * } + * } + * +*****************************************************************************/ +VMINT vm_camera_get_support_preview_size(VM_CAMERA_HANDLE handle, const vm_cam_size_t** cam_size_list, VMUINT* list_size); + +/***************************************************************************** + * FUNCTION + * vm_camera_set_preview_size + * DESCRIPTION + * set camera's preview size. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * preview_size : [IN] preview size to set. + * RETURNS + * set camera's preview size success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get status success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_CAM_INTERNAL_ERROR : preview size is not support. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to set camera's preview size. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_set_preview_size(VM_CAMERA_HANDLE handle, const vm_cam_size_t* preview_size); + +/***************************************************************************** + * FUNCTION + * vm_camera_set_preview_fps + * DESCRIPTION + * set camera's preview frame number per second, the max is 30, if not set the default is the max number. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * fps : [IN] frame number, the max is 30, if this is bigger than 30, it will change to 30. + * RETURNS + * set preview frame number success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : set frame number success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_CAM_INTERNAL_ERROR : preview size is not support. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to set camera's preview size. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_set_preview_fps(VM_CAMERA_HANDLE handle, VMUINT fps); + +/***************************************************************************** + * FUNCTION + * vm_camera_preview_start + * DESCRIPTION + * start to preview. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * RETURNS + * start preview success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : start preview success. + * VM_CAM_ERR_NOT_REGISTER_NOTIFY : not register callback function. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to start preview. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. + * VM_CAM_OPERATION_IN_PROCESS_STATUS : after LINKIT SDK, when application is in background status + * not allow to create camera. +*****************************************************************************/ +VMINT vm_camera_preview_start(VM_CAMERA_HANDLE handle); + +/***************************************************************************** + * FUNCTION + * vm_camera_preview_stop + * DESCRIPTION + * stop preview. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * RETURNS + * stop preview success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : stop preview success. + * VM_CAM_ERR_NOT_REGISTER_NOTIFY : not register callback function. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to set camera's preview size. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_preview_stop(VM_CAMERA_HANDLE handle); + +/***************************************************************************** + * FUNCTION + * vm_camera_get_frame + * DESCRIPTION + * get camera's one frame. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * frame_data : [OUT] the frame data. + * RETURNS + * get frame success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get status success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to get frame. + * VM_CAM_ERR_CAM_INTERNAL_ERROR : pixtel format is not support, now support BGR565,BGR888,ABGR8888. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. + * EXAMPLE + * + * void cam_message_callback(vm_cam_notify_data_t* notify_data, void* user_data) + * { + * if (notify_data != NULL) + * { + * vm_cam_frame_data_t frame; + * + * switch (notify_data->cam_message) + * { + * case VM_CAM_PREVIEW_SOPT_DONE: + * // + * break; + * case VM_CAM_PREVIEW_FRAME_RECEIVED: + * if (vm_camera_get_frame(cam_handle, &frame) == VM_CAM_SUCCESS) + * { + + * VMUINT app_frame_data_size = 0; + * VMUINT8* app_frame_data = NULL; + * + * if (frame.pixtel_format == PIXTEL_RGB565 || frame.pixtel_format == PIXTEL_BGR565) + * app_frame_data_size = row_pixel * col_pixel * 2; + * else if (frame.pixtel_format == PIXTEL_RGB888 || frame.pixtel_format == PIXTEL_BGR888) + * app_frame_data_size = row_pixel * col_pixel * 3; + * else + * app_frame_data_size = row_pixel * col_pixel * 4; + * + * if ((app_frame_data = vm_malloc(app_frame_data_size)) != NULL) + * { + * memcpy(app_frame_data, frame.pixtel_data, app_frame_data_size); + * } + * else + * { + * // if (frame.rgbformat == screen format) + * // { + * // copy frame.pixtel_data to screen buffer; + * // flush screen buffer; + * // } + * } + * + * } + * break; + * case ...... + * } + * } + * } + * +*****************************************************************************/ +VMINT vm_camera_get_frame(VM_CAMERA_HANDLE handle, vm_cam_frame_data_t* frame_data); + + +/***************************************************************************** + * FUNCTION + * vm_camera_get_raw_data_frame + * DESCRIPTION + * get raw dat use application's memory. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * frame_data : [IN] please refer vm_cam_frame_raw_data_t + * RETURNS + * get raw data success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get raw data success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to set capture size. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. + * VM_CAM_ERR_DISK_FULL Disk full + * VM_CAM_ERR_WRITE_PROTECTION Disk write protection + * VM_CAM_ERR_NO_DISK No disk + * VM_CAM_ERR_CAPTURE_FAILED Capture failed +*****************************************************************************/ +VMINT vm_camera_get_raw_data_frame(VM_CAMERA_HANDLE handle, vm_cam_frame_raw_data_t* frame_data); + + +/***************************************************************************** + * FUNCTION + * vm_camera_get_support_capture_size + * DESCRIPTION + * get camera's support capture size. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * cam_size_list : [OUT] camera's support capture size list. + * list_size : [OUT] camera's support capture size list size. + * RETURNS + * get camera's success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get status success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_CAM_INTERNAL_ERROR : capture size is not support. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. + * EXAMPLE + * + * void app_set_capture_size(void) + * { + * vm_cam_size_t* ptr = NULL; + * VMUINT size = 0, i = 0; + * if (vm_camera_get_support_capture_size(camera_handle, &ptr, &size) == VM_CAM_SUCCESS) + * { + * vm_cam_size_t my_cam_size; + * + * for (i = 0; i < size; i++) + * { + * my_cam_size.width = (ptr + i)->width; + * my_cam_size.height =(ptr + i) ->height; + * } + * vm_camera_set_capture_size(camera_handle, &my_cam_size); + * } + * } + * +*****************************************************************************/ +VMINT vm_camera_get_support_capture_size(VM_CAMERA_HANDLE handle, const vm_cam_size_t** cam_size_list, VMUINT* list_size); + +/***************************************************************************** + * FUNCTION + * vm_camera_set_capture_size + * DESCRIPTION + * set camera's capture size. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * size : [IN] capture size to set. + * RETURNS + * set camera's capture size success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get max capture size success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to set capture size. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_set_capture_size(VM_CAMERA_HANDLE handle, const vm_cam_size_t* size); + +/***************************************************************************** + * FUNCTION + * vm_camera_capture + * DESCRIPTION + * capture a image. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * RETURNS + * capture success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : capture a image success. + * VM_CAM_ERR_NOT_REGISTER_NOTIFY : not register callback function. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to capture a image. + * VM_CAM_ERR_NOMEMORY : there is no enough memory. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_capture(VM_CAMERA_HANDLE handle); + + +/***************************************************************************** + * FUNCTION + * vm_camera_get_capture_data + * DESCRIPTION + * get capture data. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * capture_data : [OUT] capture data. + * RETURNS + * get camera's capture data success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get capture data success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to get get data. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_get_capture_data(VM_CAMERA_HANDLE handle, vm_cam_capture_data_t* capture_data); + + +/***************************************************************************** + * FUNCTION + * vm_camera_get_focus_zone + * DESCRIPTION + * get focuse zone. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * zone : [OUT] zone data. + * RETURNS + * success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get capture data success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to get get data. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_get_focus_zone(VM_CAMERA_HANDLE handle, vm_camera_af_window_struct* zone); + + +/***************************************************************************** + * FUNCTION + * vm_camera_start_autofocus_process + * DESCRIPTION + * start auto focuse process + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * af_callback : [IN] callback function. + * user_data : [IN] user data. + * RETURNS + * success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get capture data success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to get get data. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_start_autofocus_process(VM_CAMERA_HANDLE handle, vm_camera_af_ind_callback af_callback, void* user_data); + + +/***************************************************************************** + * FUNCTION + * vm_camera_stop_autofocus_process + * DESCRIPTION + * stop auto foucs process. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * RETURNS + * stop auto focus success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get capture data success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to get get data. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_stop_autofocus_process(VM_CAMERA_HANDLE handle); + + +/***************************************************************************** + * FUNCTION + * vm_camera_update_parameter + * DESCRIPTION + * update parameter. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * para : [OUT] capture data. + * RETURNS + * update parameter success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get capture data success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to get get data. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_update_parameter(VM_CAMERA_HANDLE handle, vm_camera_para_struct* para); + + +/***************************************************************************** + * FUNCTION + * vm_camera_get_default_parameter + * DESCRIPTION + * get default parameter. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * para : [OUT] camera data. + * RETURNS + * get parameter success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get capture data success. + * VM_CAM_ERR_BAD_PARAM : parameter is wrong. + * VM_CAM_ERR_INVALID_CAM_HANDLE : camera's handle is wrong. + * VM_CAM_ERR_OPERATE_BAD_STATUS : bad status to get get data. + * VM_CAM_ERR_UNSPPUORT_CAMERA_FEATURE : not support camera function. +*****************************************************************************/ +VMINT vm_camera_get_default_parameter(VM_CAMERA_HANDLE handle, vm_camera_para_struct* para); + + +/***************************************************************************** + * FUNCTION + * vm_camera_get_osd_layer_buffer + * DESCRIPTION + * get osd layer buffer. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * osd : [OUT] osd layer width and height. + * RETURNS + * layer buffer pointer + * RETURN VALUES + * NULL : error +*****************************************************************************/ +void* vm_camera_get_osd_layer_buffer(VM_CAMERA_HANDLE handle, vm_cam_size_t* osd); + + +/***************************************************************************** + * FUNCTION + * vm_camera_get_osd_layer_handle + * DESCRIPTION + * get osd layer handle. + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * RETURNS + * handle id + * RETURN VALUES + * 0 : error +*****************************************************************************/ +VMINT vm_camera_get_osd_layer_handle(VM_CAMERA_HANDLE handle); + + +/***************************************************************************** + * FUNCTION + * vm_camera_set_camera_id + * DESCRIPTION + * get capture data. + * PARAMETERS + * camera_id : [IN] please refer VM_CAMERA_ID + * RETURNS + * set camera's id success or not. + * RETURN VALUES + * VM_CAM_SUCCESS : get capture data success. + * other : error +*****************************************************************************/ +VMINT vm_camera_set_camera_id(VMUINT16 camera_id); + +/***************************************************************************** + * FUNCTION + * vm_camera_get_main_camera_id + * DESCRIPTION + * get main camera id + * PARAMETERS + * + * RETURNS + * main camera id + * RETURN VALUES + * -1 : error +*****************************************************************************/ +VMINT vm_camera_get_main_camera_id(void); + +/***************************************************************************** + * FUNCTION + * vm_camera_get_sub_camera_id + * DESCRIPTION + * get sub camera id + * PARAMETERS + * + * RETURNS + * sub camera id + * RETURN VALUES + * -1 : error +*****************************************************************************/ +VMINT vm_camera_get_sub_camera_id(void); + + +/***************************************************************************** + * FUNCTION + * vm_camera_is_support_dual_camera + * DESCRIPTION + * support dual camera or not + * PARAMETERS + * + * RETURNS + * + * RETURN VALUES + * 1 : support + * 0: not support +*****************************************************************************/ +VMINT vm_camera_is_support_dual_camera(void); + +/***************************************************************************** + * FUNCTION + * vm_camera_register_rotation_callback + * DESCRIPTION + * register ratate callback function + * PARAMETERS + * callback + * RETURNS +*****************************************************************************/ +void vm_camera_register_rotation_callback(vm_camera_rotate_callback callback); + +/***************************************************************************** + * FUNCTION + * vm_camera_set_capture_rotation + * DESCRIPTION + * set capture rotation + * PARAMETERS + * rotate + * RETURNS +*****************************************************************************/ +void vm_camera_set_capture_rotation(VMUINT8 rotate); + +/***************************************************************************** + * FUNCTION + * vm_camera_update_para_image_size + * DESCRIPTION + * update image size + * PARAMETERS + * image_width: image width + * image_height: image height + * RETURNS +*****************************************************************************/ +void vm_camera_update_para_image_size(VMUINT16 image_width, VMUINT16 image_height); + + +/***************************************************************************** + * FUNCTION + * vm_camera_set_auto_detect_mode + * DESCRIPTION + * set auto detect mode + * PARAMETERS + * mode: TRUE or FALSE + * + * RETURNS +*****************************************************************************/ +void vm_camera_set_auto_detect_mode(VMBOOL mode); + + +/***************************************************************************** + * FUNCTION + * vm_camera_set_lcd_update + * DESCRIPTION + * set lcd update or not + * PARAMETERS + * update: TRUE or FALSE + * + * RETURNS +*****************************************************************************/ +void vm_camera_set_lcd_update(VMBOOL update); + + +/***************************************************************************** + * FUNCTION + * vm_camera_enable_osd_layer + * DESCRIPTION + * use new layer as osd layer or not + * PARAMETERS + * mode: TRUE or FALSE + * + * RETURNS +*****************************************************************************/ +void vm_camera_enable_osd_layer(VMBOOL enable); + + +/***************************************************************************** + * FUNCTION + * vm_camera_is_horizontal_sensor + * DESCRIPTION + * is horizontal sensor or not + * PARAMETERS + * + * RETURNS + * + * RETURN VALUES + * 1 : horizontal + * 0: not horizontal +*****************************************************************************/ +VMINT vm_camera_is_horizontal_sensor(void); + + +/***************************************************************************** + * FUNCTION + * vm_camera_set_capture_disable_jaia + * DESCRIPTION + * Enable/disable capture with JAIA + * PARAMETERS + * is_disable : [IN] enable[FALSE]/disable[TRUE] + * RETURNS + * void + *****************************************************************************/ +void vm_camera_set_capture_disable_jaia(VMBOOL is_disable); + + +/***************************************************************************** + * FUNCTION + * vm_camera_rotate_osd_layer + * DESCRIPTION + * rotate osd layer + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * RETURNS + * success or not + * RETURN VALUES + * FALSE + * TRUE +*****************************************************************************/ +VMBOOL vm_camera_rotate_osd_layer(VM_CAMERA_HANDLE handle, vm_graphic_rotate_value rotatevalue); + +/***************************************************************************** + * FUNCTION + * vm_camera_set_preview_origin + * DESCRIPTION + * set preview origin point + * PARAMETERS + * handle : [IN] camera's handle which is created by vm_create_camera_instance. + * origin : [IN] origin point. + * RETURNS + * success or not + * RETURN VALUES + * FALSE + * TRUE +*****************************************************************************/ +VMINT vm_camera_set_preview_origin(VM_CAMERA_HANDLE handle, const vm_cam_origin_t* origin); + +/***************************************************************************** + * FUNCTION + * vm_camera_use_anonymous_memory + * DESCRIPTION + * use/no use anonymous memory + * PARAMETERS + * mode : [IN] no use[FALSE]/use[TRUE] + * RETURNS + * void + *****************************************************************************/ +void vm_camera_use_anonymous_memory(VMBOOL mode); + +#ifdef __cplusplus +} +#endif + +#endif /* VMCAMERA_SDK_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmcell.h b/hardware/arduino/mtk/system/libmtk/include/vmcell.h new file mode 100644 index 00000000..b04286de --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmcell.h @@ -0,0 +1,129 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMCELL_SDK_H_ +#define VMCELL_SDK_H_ + +#include "vmsys.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*cell info structure*/ +typedef struct{ + VMUINT16 arfcn; /*ARFCN*/ + VMUINT8 bsic; /*BSIC*/ + VMUINT8 rxlev; /*Received signal level*/ + VMUINT16 mcc; /*MCC*/ + VMUINT16 mnc; /*MNC*/ + VMUINT16 lac; /*LAC*/ + VMUINT16 ci; /*CI*/ +}vm_cell_info_struct; + +/*CELL register state*/ +typedef enum{ + VM_CELL_OPEN_REG_ERROR = -2, /*CELL Info register error*/ + VM_CELL_OPEN_RES_LESS = -1, /*lack of reource*/ + VM_CELL_OPEN_SUCCESS = 0, /*open successfully*/ + VM_CELL_OPEN_ALREADY_OPEN = 1 /*already open*/ +} vm_cell_reg_state_enum; + +/***************************************************************************** +* FUNCTION + * vm_cell_open + * DESCRIPTION + * open CELL ID reource + * RETURNS + * result of open operation. + * RETURN VALUES + * VM_CELL_OPEN_SUCCESS : open successfully. + * VM_CELL_OPEN_ALREADY_OPEN : already open. + * VM_CELL_OPEN_RES_LESS : lack of reource + * VM_CELL_OPEN_REG_ERROR : CELL Info register error + * +*****************************************************************************/ +VMINT vm_cell_open(void); + +/***************************************************************************** +* FUNCTION + * vm_cell_close + * DESCRIPTION + * close CELL ID reource + * +*****************************************************************************/ +void vm_cell_close(void); + +/***************************************************************************** +* FUNCTION + * vm_cell_get_cur_cell_info + * DESCRIPTION + * get current cell information. vm_cell_open() should be invoked before this API, + * or NULL will be returned. + * RETURNS + * the pointer to current cell information or NULL. + * +*****************************************************************************/ +vm_cell_info_struct* vm_cell_get_cur_cell_info(void); + +/***************************************************************************** +* FUNCTION + * vm_cell_get_nbr_cell_info + * DESCRIPTION + * get neighbor cell information. vm_cell_open() should be invoked before this API, + * or NULL will be returned. + * RETURNS + * the pointer to neighbor cell information or NULL. + * +*****************************************************************************/ +vm_cell_info_struct** vm_cell_get_nbr_cell_info(void); + +/***************************************************************************** +* FUNCTION + * vm_cell_get_nbr_num + * DESCRIPTION + * get the number of neighbor cell information. vm_cell_open() should be invoked before this API, + * or NULL will be returned. + * RETURNS + * the pointer to the number of neighbor cell information or NULL. + * +*****************************************************************************/ +VMINT* vm_cell_get_nbr_num(void); + +#ifdef __cplusplus +} +#endif +#endif /* VMCELL_SDK_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmcert.h b/hardware/arduino/mtk/system/libmtk/include/vmcert.h new file mode 100644 index 00000000..7704715a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmcert.h @@ -0,0 +1,195 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef _VM_CERT_MANAGER_SDK_ +#define _VM_CERT_MANAGER_SDK_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +#define RSA_LEN 64 + +#define DIG_MD5_LEN 16 +#define DIG_SHA_LEN 20 + +#define DIG_MAX_LEN DIG_SHA_LEN +#define DIG_MIN_LEN DIG_MD5_LEN + +#define CERT_HEAD_LEN 6 + +#define CERT_DIGEST_TYPE_MD5 1 +#define CERT_DIGEST_TYPE_SHA 2 + +#define CERT_DIGEST_LEN 64 + +#define ISD_APP_NUM -1 + +#define RESERVED_BYTES_NUM 8 + +/* tag define */ +enum{ + VM_CE_INFO_END = 0, /* 0x00, null */ + VM_CE_INFO_DEV, /* 0x01, application developer name */ + VM_CE_INFO_APP_ID, /* 0x02, application identification */ + VM_CE_INFO_CERT_ID, /* 0x03, index of key id */ + VM_CE_INFO_NAME, /* 0x04, application name */ + VM_CE_INFO_VER, /* 0x05, application version */ + VM_CE_INFO_ISSUE, /* 0x06, valid start time (no use) */ + VM_CE_INFO_EXPIRED, /* 0x07, valid end time (no use) */ + VM_CE_INFO_PAY, /* 0x08, billing-related setting (no use) */ + VM_CE_INFO_PAY_NODE, /* 0x09, billing-related setting (no use) */ + VM_CE_INFO_PRICE, /* 0x0a, billing-related setting (no use) */ + VM_CE_INFO_PAY_MODE, /* 0x0b, billing-related setting (no use) */ + VM_CE_INFO_PAY_PARAM, /* 0x0c, billing-related setting (no use) */ + VM_CE_INFO_APP_USE, /* 0x0d, billing-related setting (no use) */ + VM_CE_INFO_PAY_CHANNEL, /* 0x0e, billing-related setting (no use) */ + VM_CE_INFO_MEM_REQ, /* 0x0f, memory size application required */ + VM_CE_INFO_RESOLUTION_REQ, /* 0x10, resolution application support */ + VM_CE_INFO_PLAT_REQ, /* 0x11, engine version (no use) */ + VM_CE_INFO_IMSI, /* 0x12, check for individual application */ + VM_CE_INFO_PERMISSION, /* 0x13, system permission list */ + VM_CE_INFO_TRIAL, /* 0x14, (no use) */ + VM_CE_INFO_COMPILER, /* 0x15, compiler type (no use) */ + VM_CE_INFO_INPUT_MODE, /* 0x16, (no use) */ + VM_CE_INFO_DESC, /* 0x17, application descriptionl */ + VM_CE_INFO_SUPPORT_BG_RUN, /* 0x18, is support background run or not */ + VM_CE_INFO_NAME_LIST, /* 0x19, application name multilanguage */ + VM_CE_INFO_DESC_LIST, /* 0x1a, application description multilanguage */ + VM_CE_INFO_ZIMO_LIST, /* 0x1b, application name zimo multilanguage */ + VM_CE_INFO_ROTATE, /* 0x1c, is support rotate or not */ + VM_CE_INFO_SM, /* 0x1d, sm type (no use) */ + VM_CE_INFO_SM_TYPE, /* 0x1e, sm type: general(0), UI(1) (no use) */ + VM_CE_INFO_SM_PRIVATE, /* 0x1f, private sm */ + VM_CE_INFO_SM_CRYPTEXT, /* 0x20, private key */ + VM_CE_INFO_FILE_TYPE, /* 0x21, file type */ + VM_CE_INFO_RO_RW_ZIP, /* 0x22, is zipped or not */ + VM_CE_INFO_CHARSET, /* 0x23, is encoding using UCS2 */ + VM_CE_INFO_SUPPORT_VP, /* 0x24, 0 means not support Venus componet, 1 means support Venus component, and will link venus lib in package*/ + VM_CE_INFO_SYS_FILE_SIZE, /* 0x25, system file max size*/ + VM_CE_INFO_MULTI_NAME_LIST, /* 0x26, app name multi language support*/ + VM_CE_INFO_URL, /* 0x27, update server URL*/ + VM_CE_INFO_UPDATE_INFO, /* 0x28, update information*/ + VM_CE_INFO_NO_SCREEN, /* 0x29, is use screen or not*/ + VM_CE_INFO_VPP_TYPE, /* 0x2a, vpp type:1:widget,2:wallpaper,3:launcher,4:screen lock*/ + VM_CE_INFO_PUSH = 0x2c, /* 0x2c, app support PUSH nor not ,1 means support,0 means NOT support*/ + VM_CE_INFO_PUSH_APPID, /* 0x2d, app push id */ + VM_CE_INFO_PUSH_SENDERID, /* 0x2e, app push sender id normal is a e-mail address */ + VM_CE_INFO_RES_AB2, /* 0x2f, app use AB2 formant image */ + VM_CE_INFO_BUILD_ID, /* 0x30 */ + VM_CE_INFO_ADV_ICON, /* 0x31, app use advanced ICON, support PNG and any size */ + VM_CE_INFO_AUTO_START, /* 0x32, app auto start when power on*/ + VM_CE_INFO_IDLE_SHORTCUT, /* 0x33, app set idle shortcut when install*/ + VM_CE_INFO_CLOCK_APP, /* 0x34, 1 means app is clock app,0 means not*/ + VM_CE_INFO_TOTAL +}; + + +/* DOM-NOT_FOR_SDK-BEGIN */ +#define VM_CE_INFO_LIST_START VM_CE_INFO_NAME_LIST +#define VM_CE_INFO_LIST_END VM_CE_INFO_ZIMO_LIST + +/* define the Cert envelop head */ +typedef struct _MRECertHead +{ + VMINT digestype; /* digest type MD5 or SHA1 */ + VMUCHAR signature[RSA_LEN]; /* signature */ + VMINT offset; /* offset of signature */ + VMUCHAR reserve[RESERVED_BYTES_NUM]; /* reserve */ +} MRECertHead; + +/* Extend Cert envelop head */ +typedef struct _MRECertHead_Ex +{ + VMINT digestype; /* digest type MD5 or SHA1 */ + VMUCHAR signature[RSA_LEN * 2]; /* signature */ + VMINT offset; /* offset of signature */ + VMUCHAR reserve[RESERVED_BYTES_NUM]; /* reserve */ +} MRECertHead_Ex; + +/* Cert structure */ +typedef struct _MRECert +{ + VMUCHAR* digest; /* digest data */ + VMINT diglen; /* digest lenth */ + VMINT digesttype; /* digest type */ +} MRECert; +/* DOM-NOT_FOR_SDK-END */ + +/* Auth type */ +enum +{ + VERIFY_SIG = 1, /* only signature */ + VERIFY_FULL /* full Auth */ +}; + +/***************************************************************************** + * FUNCTION + * vm_ce_auth_app_ex + * DESCRIPTION + * verify the file, to check if it is legal + * PARAMETERS + * filename : [IN] full path to check + * cache_buf : [IN] buffer for engine used + * cache_len : [IN] size of buffer + * mode : [IN] VERIFY_SIG(signature, resolution), VERIFY_FULL(include memory) + * RETURNS + * if succeed, return >=0, otherwise failure. + * EXAMPLE + * + * VMUCHAR* ce_digest_buffer = NULL; + * VMINT ce_digest_buffer_len = (10 * 1024); + * + * VMINT rescode = -1; + * + * if ((ce_digest_buffer = vm_malloc(ce_digest_buffer_len)) == NULL) + * return ; + * + * rescode = vm_ce_auth_app_ex( vxp_filename, ce_digest_buffer, ce_digest_buffer_len, VERIFY_SIG); + * + * vm_free( ce_digest_buffer ); + * + * return rescode; + * + *****************************************************************************/ +extern VMINT vm_ce_auth_app_ex( VMWSTR filename, VMUCHAR * cache_buf, VMINT cache_len, VMINT mode ); + +#ifdef __cplusplus +} +#endif + +#endif /* _VM_CERT_MANAGER_SDK_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmche.h b/hardware/arduino/mtk/system/libmtk/include/vmche.h new file mode 100644 index 00000000..49ecb36c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmche.h @@ -0,0 +1,965 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMCHE_SDK_H_ +#define VMCHE_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* The structure vm_stche is defined to record and maintain the context of CHE */ +typedef struct _vm_stche_t +{ + VMUINT cheLastLength; /* last block length */ + VMUINT8 *cheLastDstAddr; /* last destination address */ + VMUINT8 *cheWorkBuf; /* pointe to a space used by each algorithm */ + VMUINT cheBufLen; /* the length of cheWorkBuf. It depends on the encrypt algorithm */ + VMUINT cipher_type; /* cipher type */ + VMUINT8 *cheKey; /* key stream */ + VMUINT8 *cheIV; /* initial vector */ + VMUINT cheKeyLength; /* key stream length */ + VMUINT cheIVLength; /* initial vector length */ + VMUINT8 cheFirstFlag; /* first block flag */ + } vm_stche; + +/* CHE error cause */ +typedef enum +{ + VM_CHE_OK = 0, /* success */ + VM_CHE_ERROR = -1, /* error occurs */ + VM_CHE_KEY_CHK_FAIL = -2, /* public or private key check fail */ + VM_CHE_INVALID_LENGTH = -3, /* buffer length too small or too long */ + VM_CHE_OPERATION_FAIL = -4 /* che operation fails, such as cipher fail */ +} vm_che_result_error_enum; + +/* vm_che_type define the cipher and hash function algorithm type */ +typedef enum +{ + VM_CHE_MD5 = 1, /* MD5 hash algorithm. The output length is fixed 16 bytes */ + VM_CHE_SHA1, /* SHA1 hash algorithm. The output length is fixed 20 bytes */ + VM_CHE_DES, /* DES block cipher algorithm. The CHE will do auto padding in DES type. The maximum padding length is 8 bytes */ + VM_CHE_3DES, /* 3DES block cipher algorithm. The CHE will do auto padding in 3DES type. The maximum padding length is 8 bytes */ + VM_CHE_AES, /* AES block cipher algorithm. The CHE will do auto padding in AES(ECB, CBC) type. The maximum padding length is 16 bytes */ + VM_CHE_MD4, /* MD4 hash algorithm. The output length is fixed 16 bytes */ + VM_CHE_MAC_MD5, /* HMAC_MD5 hash algorithm. The output length is fixed 16 bytes */ + VM_CHE_MAC_SHA1, /* HMAC_SHA1 hash algorithm. The output length is fixed 20 bytes */ + VM_CHE_RC4, /* RC4 stream cipher algorithm. No padding */ + VM_CHE_RSA, /* RSA asym cipher algorithm. */ + VM_CHE_DH, /* Diffie Hellman cipher algorithm used to generate the key. No padding */ + VM_CHE_MAC_SHA224, /* HMAC_SHA224 hash algorithm. The output length is fixed 28 bytes */ + VM_CHE_MAC_SHA256, /* HMAC_SHA256 hash algorithm. The output length is fixed 32 bytes */ + VM_CHE_SHA224, /* SHA 224 algorithm */ + VM_CHE_SHA256, /* SHA 256 algorithm */ + VM_CHE_TYPE_END +} vm_che_type; + +/* vm_che_operation_mode define the cipher function mode. For hash function, it could be set VM_CHE_MODE_NULL */ +typedef enum +{ + VM_CHE_MODE_NULL = 0, /* null mode. This mode is used when there is no mode operation */ + VM_CHE_ECB, /* AES/DES ECB mode */ + VM_CHE_CBC, /* AES/DES CBC mode */ + VM_CHE_CTR, /* AES CTR(counter) mode */ + VM_CHE_F8, /* AES F8 mode */ + VM_CHE_SKIP, /* RC4 Skip mode */ + VM_CHE_KEY_WRAP, /* AES key wrap mode */ + VM_CHE_KEY_UNWRAP /* AES key unwrap mode */ +} vm_che_operation_mode; + +/* vm_che_rsa_padding_mode_enum define the RSA padding mode. */ +typedef enum +{ + VM_CHE_RSA_MODE_NULL = 0, /* null mode. This mode is used when there is no padding */ + VM_CHE_RSA_PKCS1_V15, /* RSA PKCS#1 v1.5 padding mode */ + VM_CHE_RSA_MODE_TOTAL +} vm_che_rsa_padding_mode_enum; + +/* vm_che_action define this CHE process should run hash, encipher or decipher */ +typedef enum +{ + VM_CHE_HASH, /* generate hash value */ + VM_CHE_ENC, /* encryption data */ + VM_CHE_DEC, /* decryption data */ + VM_CHE_MAC_HASH, /* generate HMAC value */ + VM_DH_INIT, /* initialize the Diffie-Hellman */ + VM_DH_MAKE_PARAMS, /* Suppose A=G^a mod p. generate discrete logarithms(a) and A */ + VM_DH_MAKE_PUBLIC, /* Suppose A=G^a mod p. generate discrete logarithms(a) and A */ + VM_DH_CALC_SECRET, /* Suppose B=G^b mod p. Calculate the shared secret (G^b)^a mod P */ + VM_DH_FREE /* finialize the Diffie-Hellman */ +} vm_che_action; + +/* vm_che_key_action_type define the CHE Key process. The life cycle of input key buffer should be maintained until che_deinit except RSA.*/ +typedef enum +{ + VM_CHE_GEN_KEY, /* generate the key exclude asynmetry and RC4 algirhtm */ + VM_CHE_SET_KEY, /* set the key exclude asynmetry and RC4 algirhtm */ + VM_CHE_GET_KEY, /* get the key exclude asynmetry and RC4 algirhtm*/ + VM_CHE_DEL_KEY, /* delete the key exclude asynmetry and RC4 algirhtm */ + VM_CHE_SET_RC4_KEY, /* set the RC4 key */ + VM_CHE_SET_RSA_N, /* set the RSA modulus N. N=P*Q. N is prime number. The input N is a binary data */ + VM_CHE_SET_RSA_E, /* set the RSA public exponent: E. The input E is a binary data */ + VM_CHE_SET_RSA_D, /* set the RSA private exponent: D. The input D is a binary data */ + VM_CHE_SET_RSA_P, /* set the RSA modulus P(CRT format). The input P is a binary data */ + VM_CHE_SET_RSA_Q, /* set the RSA modulus Q(CRT format). The input Q is the binary data */ + VM_CHE_SET_RSA_dModPm1, /* set the RSA private exponent(CRT format): DP. The input DP is a binary data */ + VM_CHE_SET_RSA_dModQm1, /* set the RSA private exponent(CRT format): DQ. The input DQ is a binary data */ + VM_CHE_SET_RSA_qInvModP, /* set the coefficient Integer(CRT format): inverse Q. The input InvQ is a binary data */ + VM_CHE_SET_DH_P, /* set the DH modulus: P. The input P is a binary data. */ + VM_CHE_SET_DH_G, /* set the DH prime root: G. The input G is a binary data */ + VM_CHE_SET_DH_SELF_PUBLIC, /* set the self public value. G^X mod P. The input is a binary data. */ + VM_CHE_SET_DH_PEER_PUBLIC, /* set the peer public value. G^Y mod P. The input is a binary data. */ + VM_CHE_SET_DH_PRIVATE, /* set the discrete logarithms(private key): X. The input X is a binary data. */ + VM_CHE_GET_DH_SELF_PUBLIC_LEN, /* get the self public length */ + VM_CHE_GET_DH_PRIVATE_LEN, /* get the discrete logarithm length */ + VM_CHE_GET_DH_SECRET_LEN, /* get the secret length */ + VM_CHE_GET_DH_SELF_PUBLIC, /* get self public value */ + VM_CHE_GET_DH_PRIVATE, /* get the discrete logarithm */ + VM_CHE_GET_DH_SECRET, /* get the shared key,i.e. key. key = GY^X mod P */ + VM_CHE_GET_RSA_N, /* get the RSA modulus N. N=P*Q. N is prime number. The output N is binary data */ + VM_CHE_GET_RSA_E, /* get the RSA public exponent: E. The output E is a binary data */ + VM_CHE_GET_RSA_D, /* get the RSA private exponent: D. The output D is a binary data */ + VM_CHE_GET_RSA_P, /* get the RSA modulus P(CRT format). The output P is a binary data */ + VM_CHE_GET_RSA_Q, /* get the RSA modulus Q(CRT format). The output Q is the binary data */ + VM_CHE_GET_RSA_dModPm1, /* get the RSA private exponent(CRT format): DP. The output DP is a binary data */ + VM_CHE_GET_RSA_dModQm1, /* get the RSA private exponent(CRT format): DQ. The output DQ is a binary data */ + VM_CHE_GET_RSA_qInvModP, /* get the coefficient Integer(CRT format): inverse Q. The output InvQ is a binary data */ + VM_CHE_GET_RSA_N_LEN, /* get the RSA modulus N. N=P*Q. N is prime number. The output N is binary data */ + VM_CHE_GET_RSA_E_LEN, /* get the RSA public exponent: E. The output E is a binary data */ + VM_CHE_GET_RSA_D_LEN, /* get the RSA private exponent: D. The output D is a binary data */ + VM_CHE_GET_RSA_P_LEN, /* get the RSA modulus P(CRT format). The output P is a binary data */ + VM_CHE_GET_RSA_Q_LEN, /* get the RSA modulus Q(CRT format). The output Q is the binary data */ + VM_CHE_GET_RSA_dModPm1_LEN, /* get the RSA private exponent(CRT format): DP. The output DP is a binary data */ + VM_CHE_GET_RSA_dModQm1_LEN, /* get the RSA private exponent(CRT format): DQ. The output DQ is a binary data */ + VM_CHE_GET_RSA_qInvModP_LEN, /* get the coefficient Integer(CRT format): inverse Q. The output InvQ is a binary data */ + VM_CHE_ACTION_TYPE_END +}vm_che_key_action_type; + + + +/***************************************************************************** + * FUNCTION + * vm_che_init + * DESCRIPTION + * Initialize the vm_stche data structure created by application + * PARAMETERS + * che_context_p : [IN] CHE context + * type : [IN] CHE type (vm_che_type) + * RETURN VALUES + * void + * SEE ALSO + * vm_che_deinit + * EXAMPLE + * + * vm_stche context; + * vm_che_init(&context, VM_CHE_SHA1); + * + *****************************************************************************/ + extern void vm_che_init(vm_stche *che_context_p, VMUINT type); + +/***************************************************************************** + * FUNCTION + * vm_che_deinit + * DESCRIPTION + * Deinitialize the CHE context + * PARAMETERS + * che_context_p : [IN] CHE context + * RETURN VALUES + * void + * SEE ALSO + * vm_che_init + * EXAMPLE + * + * vm_stche context; + * vm_che_init(&context, VM_CHE_SHA1); + * ... + * vm_che_deinit(&context); + * + *****************************************************************************/ +extern void vm_che_deinit(vm_stche *che_context_p); + +/***************************************************************************** + * DESCRIPTION + * API used to set, get, delete, generate the key value. + * If user uses this API to get the key, CHE only stores the pointer of the key. + * Thus, the key has to be kept until the che_deinit is called. There is only + * One exception, in the RSA, we will allocate another space to store the key. + * Thus, user doesn't have to care if they can release the buffer of key. + * PARAMETERS + * che_context_p : [IN] CHE context + * type : [IN] key action type (vm_che_key_action_type) + * key : [IN/OUT] key stream + * key_len : [IN] key stream length + * EXAMPLE + * + * vm_stche che_context; + * vm_che_init(&che_context, VM_CHE_MAC_MD5); + * vm_che_key_action(&che_context, VM_CHE_SET_KEY, (VMUINT8 *) key, key_len); + * + *****************************************************************************/ +extern void vm_che_key_action(vm_stche *che_context_p, vm_che_key_action_type type, VMUINT8 *key, VMINT key_len); + +/***************************************************************************** + * FUNCTION + * vm_che_set_iv + * DESCRIPTION + * Set initial vector for CBC or CTR or AES_F8 mode. CHE only stores the pointer address. + * The iv buffer should be kept by the user until the first block is computed. + * To avoid confusion, user can keep the buffer until the che_deinit is called. + * PARAMETERS + * che_context_p : [IN] CHE context + * iv : [IN] initial vector. the input has to be 4-byte alignment on ARM platform + * iv_len : [IN] initial vector length + * RETURN VALUES + * void + * EXAMPLE + * + * vm_stche context; + * vm_che_init(&context, VM_CHE_AES); + * vm_che_set_iv(&che_context, iv, 16); + * ... + * vm_che_deinit(&context); + * + *****************************************************************************/ +extern void vm_che_set_iv(vm_stche *che_context_p, VMUINT8 *iv, VMUINT iv_len); + +/***************************************************************************** + * DESCRIPTION + * API used to execute cipher and hash process function. + * Please pass the "type" parameter + * as the constant announced in vm_che_type enum. It doesn't allow passing variable. + * The dest buffer size should be refer to the RFC standard specification. + * The DES/AES in CBC/ECB mode will do the auto padding if application uses the CHE's auto padding, + * the destination buffer address has to be at least source_length + 1 DES block size(8 bytes) . + * Otherwise, there will be a memory corruption. If application doesn't want to use auto padding, + * it cannot set the last_block to "TRUE". That is to say, as long as the last_block is not set to + * TRUE, there will no auto padding. The auto padding CHE uses is PKCS#1 v15. This padding is standard + * padding used in PCKS#5. + * P.S. The input and output buffer should be different buffer. Don't use the same buffer. + * + * PARAMETERS + * che_context_p : [IN] CHE context + * type : [IN] che type (vm_che_type) + * mode : [IN] che operation mode (vm_che_operation_mode) + * act : [IN] che action (vm_che_action) + * source : [IN] source input data buffer (it has to be 4-byte alignment for DES and AES) + * dest : [OUT] destination buffer (it has to be 4-byte alignment for DES) + * source_length : [IN] source input buffer length + * last_block : [IN] TRUE: do the standard auto padding(PKCS#5). + * FLASE: don't do the standard auto padding(PKCS#5). + * If user wants the auto padding, s/he has to set the final to TRUE in its final block + * operation. On the contrary, if s/he doesn't want the auto padding, please do not set + * final to TRUE. + * RETURN VALUES + * 1 : CHE process successful + * 0 : CHE process fail + * EXAMPLE + * Symmetry Block Cipher Examples: + * + * 1. DES Encryption (CBC mode): + * The input, initial vector and destination address have to be in 4-byte alignment. + * + * With auto padding: + * + * vm_stche che_context; + * vm_che_init(&che_context, VM_CHE_DES); + * vm_che_key_action(&che_context, VM_CHE_SET_KEY, key, key_length); + * vm_che_set_iv(&che_context, init_vector, vec_length); + * vm_che_process(&che_context, VM_CHE_DES, VM_CHE_CBC , VM_CHE_ENC, src_buffer, dst_buffer, src_len, FALSE); + * ... + * //if the last segmemnt in source buffer is intended to be processed and we want to use the auto padding, + * //we set final to TRUE + * vm_che_process(&che_context, VM_CHE_DES, VM_CHE_CBC , VM_CHE_ENC, src_buffer, dst_buffer, src_len, TRUE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_context); + * + * + * Without auto padding: + * + * vm_stche che_context; + * vm_che_init(&che_context, VM_CHE_DES); + * vm_che_key_action(&che_context, VM_CHE_SET_KEY, key, key_length); + * vm_che_set_iv(&che_context, init_vector, vec_length); + * vm_che_process(&che_context, VM_CHE_DES, VM_CHE_CBC , VM_CHE_ENC, src_buffer, dst_buffer, src_len, FALSE); + * ... + * //if the last segmemnt in source buffer is intended to be processed and we don't want the auto padding, + * //we set final to FALSE + * vm_che_process(&che_context, VM_CHE_DES, VM_CHE_CBC , VM_CHE_ENC, src_buffer, dst_buffer, src_len, FALSE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_context); + * + * 2. DES Encryption (ECB mode): + * With auto padding: + * + * vm_stche che_context; + * vm_che_init(&che_context, VM_CHE_DES); + * vm_che_key_action(&che_context, VM_CHE_SET_KEY, key, key_length); + * vm_che_process(&che_context, VM_CHE_DES, VM_CHE_ECB , VM_CHE_ENC, src_buffer, dst_buffer, src_len, FALSE); + * ... + * //if the last segmemnt in source buffer is intended to be processed and we want to use the auto padding, + * //we set final to TRUE + * vm_che_process(&che_context, VM_CHE_DES, VM_CHE_ECB , VM_CHE_ENC, src_buffer, dst_buffer, src_len, TRUE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_context); + * + * + * Without auto padding: + * + * vm_stche che_context; + * vm_che_init(&che_context, VM_CHE_DES); + * vm_che_key_action(&che_context, VM_CHE_SET_KEY, key, key_length); + * vm_che_process(&che_context, VM_CHE_DES, VM_CHE_ECB , VM_CHE_ENC, src_buffer, dst_buffer, src_len, FALSE); + * ... + * //if the last segmemnt in source buffer is intended to be processed and we don't want to use the + * //auto padding, we set final to TRUE + * vm_che_process(&che_context, VM_CHE_DES, VM_CHE_ECB , VM_CHE_ENC, src_buffer, dst_buffer, src_len, FALSE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_context); + * + * 3. AES Encryption (Counter mode): + * Because this mode doesn't need padding, we don't care the "final" parameter in this mode. + * Its input data can not in block boundary size. + * + * vm_stche che_cntx; + * vm_che_init(&che_cntx, VM_CHE_AES); + * vm_che_key_action(&che_cntx, VM_CHE_SET_KEY, key, 16); + * vm_che_set_iv(&che_cntx, iv, 16); + * vm_che_process(&che_cntx, VM_CHE_AES, VM_CHE_CTR, VM_CHE_ENC, src_data, dst_data, src_len, TRUE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_cntx); + * + * + * 4. AES Encryption (Key WRAP mode): + * The input data has to be in multiple of 64 bits block size. + * Because this mode doesn't need padding, we don't care the "final" parameter in this mode. + * Because one more block is generated for checking in KEY WRAP mode, + * the input and output buffer should be different one in KEY_WRAP and KEY_UNWRAP mode. + * + * vm_stche che_cntx; + * vm_che_init(&che_cntx, VM_CHE_AES); + * vm_che_key_action(&che_cntx, VM_CHE_SET_KEY, key, 16); + * vm_che_set_iv(&che_cntx, iv, 16); + * vm_che_process(&che_cntx, VM_CHE_AES, VM_CHE_KEY_WRAP, VM_CHE_ENC, src_data, dst_data, src_len, TRUE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_cntx); + * + * + * 5. AES Encryption (CBC mode): + * The input and initial vector address have to be in 4-byte alignment. + * + * With auto padding: + * + * vm_stche che_cntx; + * vm_che_init(&che_cntx, VM_CHE_AES); + * vm_che_key_action(&che_cntx, VM_CHE_SET_KEY, key, 16); + * vm_che_set_iv(&che_cntx, iv, 16); + * vm_che_process(&che_cntx, VM_CHE_AES, VM_CHE_CBC, VM_CHE_ENC, src_data, dst_data, src_len, FALSE); + * //final block + * vm_che_process(&che_cntx, VM_CHE_AES, VM_CHE_CBC, VM_CHE_ENC, src_data, dst_data, src_len, TRUE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_cntx); + * + * + * Without auto padding: + * + * vm_stche che_cntx; + * vm_che_init(&che_cntx, VM_CHE_AES); + * vm_che_key_action(&che_cntx, VM_CHE_SET_KEY, key, 16); + * vm_che_set_iv(&che_cntx, iv, 16); + * vm_che_process(&che_cntx, VM_CHE_AES, VM_CHE_CBC, VM_CHE_ENC, src_data, dst_data, src_len, FALSE); + * // final block + * vm_che_process(&che_cntx, VM_CHE_AES, VM_CHE_CBC, VM_CHE_ENC, src_data, dst_data, src_len, FALSE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_cntx); + * + * 6. AES Encryption (ECB mode): + * The input address have to be in 4-byte alignment. + * + * With auto padding: + * + * vm_stche che_cntx; + * vm_che_init(&che_cntx, VM_CHE_AES); + * vm_che_key_action(&che_cntx, VM_CHE_SET_KEY, key, 16); + * vm_che_process(&che_cntx, VM_CHE_AES, VM_CHE_ECB, VM_CHE_ENC, src_data, dst_data, src_len, FALSE); + * //final block + * vm_che_process(&che_cntx, VM_CHE_AES, VM_CHE_ECB, VM_CHE_ENC, src_data, dst_data, src_len, TRUE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_cntx); + * + * + * Without auto padding: + * + * vm_stche che_cntx; + * vm_che_init(&che_cntx, VM_CHE_AES); + * vm_che_key_action(&che_cntx, VM_CHE_SET_KEY, key, 16); + * vm_che_process(&che_cntx, VM_CHE_AES, VM_CHE_ECB, VM_CHE_ENC, src_data, dst_data, src_len, FALSE); + * //final block + * vm_che_process(&che_cntx, VM_CHE_AES, VM_CHE_ECB, VM_CHE_ENC, src_data, dst_data, src_len, FALSE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_cntx); + * + * + * Symmetry Stream Cipher Example: + * + * 1. RC4 Encryption: + * Because this mode doesn't need padding, we don't care the "final" parameter in this mode. + * + * Use default RC4 mode: + * + * vm_stche che_ctx; + * vm_che_init(&che_ctx, VM_CHE_RC4); + * vm_che_key_action(&che_ctx, VM_CHE_SET_KEY, (kal_uint8 *)key, key_len); + * vm_che_process(&che_ctx, VM_CHE_RC4, VM_CHE_MODE_NULL, VM_CHE_ENC, (VMUINT8 *)input, + * (VMUINT8 *)output, (VMINT32)input_size, TRUE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_ctx); + * + * + * Use CHE_SKIP mode: + * skip the first 256 byts key data because first 256 bytes are not random enough. + * + * vm_stche che_ctx; + * vm_che_init(&che_ctx, VM_CHE_RC4); + * vm_che_key_action(&che_ctx, VM_CHE_SET_KEY, (VMUINT8 *)key, key_len); + * vm_che_process(&che_ctx, VM_CHE_RC4, VM_CHE_SKIP, VM_CHE_ENC, (VMUINT8 *)input, + * (VMUINT8 *)output, (VMINT32)input_size, TRUE); + * // do other operation + * ... + * //Deinitialize when all cipher operation is finish + * vm_che_deinit(&che_ctx); + * + * + * Hash Operation: + * + * 1. MD5 Hash generation: + * we have to set the final block to TRUE for hash operation. The mode field is useless for hash algorithm. + * HASH doesn't have any mode options. Thus, we set it to VM_CHE_MODE_NULL. + * + * + * vm_stche che_context; + * VMUINT8 digest[16]; + * vm_che_init(&che_context, VM_CHE_MD5); + * vm_che_process(&che_context,VM_CHE_MD5,VM_CHE_MODE_NULL,VM_CHE_HASH,(kal_uint8*)input,digest,input_len, FALSE); + * ... + * vm_che_process(&che_context,VM_CHE_MD5,VM_CHE_MODE_NULL,VM_CHE_HASH,(kal_uint8*)input,digest,input_len, TRUE); + * // do other operation + * ... + * //Deinitialize when all hash operation is finish + * vm_che_deinit(&che_context); + * + * + * 2. SHA1 Hash generation: + * we have to set the final block to TRUE for hash operation. The mode field is useless for hash algorithm. + * HASH doesn't have any mode options. Thus, we set it to VM_CHE_MODE_NULL. + * + * + * vm_stche che_context; + * VMUINT8 digest[20]; + * vm_che_init(&che_context, VM_CHE_SHA1); + * vm_che_process(&che_context,VM_CHE_SHA1,VM_CHE_MODE_NULL,VM_CHE_HASH,(VMUINT8*)input,digest,input_len, FALSE); + * ... + * vm_che_process(&che_context,VM_CHE_SHA1,VM_CHE_MODE_NULL,VM_CHE_HASH,(VMUINT8*)input,digest,input_len, TRUE); + * vm_che_deinit(&che_context); + * // do other operation + * ... + * //Deinitialize when all hash operation is finish + * + * + * 3. HMAC MD5 generation: + * we have to set the final block to TRUE for HMAC operation because HMAC doesn't have padding consideartion for last block. + * The mode field is useless for HMAC algorithm. HMAC doesn't have any mode options. Thus, we set it to VM_CHE_MODE_NULL. + * + * + * vm_stche che_context; + * VMUINT8 digest[16]; + * vm_che_init(&che_context, VM_CHE_MAC_MD5); + * vm_che_key_action(&che_context, VM_CHE_SET_KEY, (VMUINT8*) key, key_len); + * vm_che_process(&che_context, VM_CHE_MAC_MD5, VM_CHE_MODE_NULL, VM_CHE_HASH, (VMUINT8 *) input, digest, input_len, FALSE); + * ... + * vm_che_process(&che_context, VM_CHE_MAC_MD5, VM_CHE_MODE_NULL, VM_CHE_HASH, (VMUINT8 *) input, digest, input_len, TRUE); + * // do other operation + * ... + * //Deinitialize when all hash operation is finish + * vm_che_deinit(&che_context); + * + * + * 4. SHA2 Hash generation: + * we have to set the final block to TRUE for hash operation. The mode field is useless for hash algorithm. + * HASH doesn't have any mode options. Thus, we set it to VM_CHE_MODE_NULL. + * + * + * vm_stche che_context; + * VMUINT8 digest[32]; + * vm_che_init(&che_context, VM_CHE_SHA256); + * vm_che_process(&che_context, VM_CHE_SHA256, VM_CHE_MODE_NULL, VM_CHE_HASH, (VMUINT8 *) input, digest, input_len, FALSE); + * ... + * vm_che_process(&che_context, VM_CHE_SHA256, VM_CHE_MODE_NULL, VM_CHE_HASH, (VMUINT8 *) input, digest, input_len, TRUE); + * // do other operation + * ... + * //Deinitialize when all hash operation is finish + * vm_che_deinit(&che_context); + * + * + * Public Key or Key Agreement: + * + * 1. Diffie-Hellman: + * The source and dest parameter is useless for DH. + * The output data is get through vm_che_key_action. + * + * vm_stche che_ctx_dh; + * VMUINT32 dh_secret_len; + * VMUINT8 *dh_secret_key = NULL; + * + * vm_che_init(&che_ctx_dh, VM_CHE_DH); + * vm_che_process(&che_ctx_dh, VM_CHE_DH, VM_CHE_MODE_NULL, VM_DH_INIT, NULL, NULL, 0, TRUE); + * // set the p and g. p and g must in binary format + * vm_che_key_action(&che_ctx_dh, VM_CHE_SET_DH_P, (VMUINT8*) P, P_Len); + * vm_che_key_action(&che_ctx_dh, VM_CHE_SET_DH_G, G, G_Len); + * // Compute self public B = (g^b mod p) and private (b) + * vm_che_process(&che_ctx_dh, VM_CHE_DH, VM_CHE_MODE_NULL, VM_DH_MAKE_PARAMS, NULL, NULL, 0, TRUE); + * // Set the peer public key (A) in binary format + * vm_che_key_action(&che_ctx_dh, VM_CHE_SET_DH_PEER_PUBLIC, (VMUINT8*)peer_public, peer_public_len); + * // calculate the shared secret: K + * vm_che_process(&che_ctx_dh, VM_VM_CHE_DH, CHE_MODE_NULL, VM_DH_CALC_SECRET, NULL, NULL, 0, TRUE); + * //get the shared secret key + * vm_che_key_action(&che_ctx_dh, VM_CHE_GET_DH_SECRET_LEN, (void*)&dh_secret_len, sizeof(int)); + * dh_secret_key = malloc(dh_secret_len); + * che_key_action(&che_ctx_dh, VM_CHE_GET_DH_SECRET, (VMUINT8*) dh_secret_key, dh_secret_len); + * //call deinit when all operations are finish + * vm_che_process(&che_ctx_dh, VM_CHE_DH, VM_CHE_MODE_NULL, DH_FREE, NULL, NULL, 0, TRUE); + * vm_che_deinit(&che_ctx_dh); + * + *****************************************************************************/ +extern VMUINT8 vm_che_process(vm_stche *che_context_p,vm_che_type type,vm_che_operation_mode mode, + vm_che_action act, VMUINT8 *source,VMUINT8 *dest,VMUINT source_length,VMUINT8 last_block); + + +/***************************************************************************** + * FUNCTION + * vm_che_rsa_public_encrypt + * DESCRIPTION + * This API is used when we want to use public key to encrypt the data. + * Application can specify the way of padding based PKCS#1 standard. + * If application doesn't want to do the padding, s/he can set the padding to + * VM_CHE_RSA_MODE_NULL. + * + * Based on PKCS#1v1.5 standard, the smallest padding size is 11 bytes. + * Thus, the destination buffer should be: + * Destination_buffer_len = input_data_len + 11(smallest padding data) + * In addition, the output buffer size is equal to the size of N. + * If the input data length is too large or destination buffer is too small, + * the error cause will be returned. The output buffer length will be checked only + * If the passed in length is not 0. If it is 0, this means user doesn't want to check + * the destination buffer length. + * The input and output buffer can be the same one. + * + * RSA valid public key length: + * 128 bits < Modulus (N) < 4096 bits + * 2 bits < public exponent (E) < 64 bits + * PARAMETERS + * ctx : [IN] CHE context + * src : [IN] source buffer + * src_len : [IN] source buffer length (the length sould < length of N) + * dst : [OUT] destination buffer (must pass in) + * dst_len : [IN/OUT] encrypted destination length. If user pass in non zero value, + * CHE will do the destination buffer length check. If the length + * smaller than the length of N. The error is returned. However, + * If user pass in value 0, che will not do the length checking. + * padding : [IN] the way of padding. Currently we only support PKCS#1v1.5 padding. + * If user doesn't want any padding, s/he can pass in VM_CHE_RSA_MODE_NULL. + * Please take reference of the enum vm_che_rsa_padding_mode_enum + * + * RETURN VALUES + * take the reference of vm_che_result_error_enum. + * VM_CHE_OK : success + * VM_CHE_ERROR : parameter error + * VM_CHE_KEY_CHK_FAIL : input key is not correct + * VM_CHE_INVALID_LENGTH : the input data length is too large or destination buffer is too small + * VM_CHE_OPERATION_FAIL : algorithm operation is failed + * SEE ALSO + * vm_che_rsa_private_decrypt + * EXAMPLE + * (a). Encrypt the data by public key without padding + * + * vm_stche che_ctx; + * //initialize + * vm_che_init(&che_ctx, VM_CHE_RSA); + * //Set modulus: N + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_N, modulusN, n_len); + * //Set public Exponent: E + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_E, pubExp, e_len); + * //Encrypt Data by the public key + * vm_che_rsa_public_encrypt(&che_ctx, src, src_len, dst, &dst_len, VM_CHE_RSA_MODE_NULL); + * // do other operation + * ... + * //Deinitialize when all RSA operation is finish + * vm_che_deinit(&che_ctx); + * + * + * (b). Encrypt the data by public key with PKCS#1v1.5 padding + * + * vm_stche che_ctx; + * //initialize + * vm_che_init(&che_ctx, VM_CHE_RSA); + * //Set modulus: N + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_N, modulusN, n_len); + * //Set public Exponent: E + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_E, pubExp, e_len); + * //Encrypt Data by the public key + * vm_che_rsa_public_encrypt(&che_ctx, src, src_len, dst, &dst_len, VM_CHE_RSA_PKCS1_V15); + * // do other operation + * ... + * //Deinitialize when all RSA operation is finish + * vm_che_deinit(&che_ctx); + * + *****************************************************************************/ +extern VMINT vm_che_rsa_public_encrypt(vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding); + + +/***************************************************************************** + * FUNCTION + * vm_che_rsa_private_encrypt + * DESCRIPTION + * This API is used when we want to use private key to encrypt the data. + * Application can specify the way of padding based PKCS#1 standard. + * If users don't want to do the padding, they can set the padding to + * VM_CHE_RSA_MODE_NULL. + * + * Based on PKCS#1v1.5 standard, the smallest padding size is 11 bytes. + * Thus, the destination buffer should be: + * Destination_buffer_len = input_data_len + 11(smallest padding data) + * In addition, the output buffer size is equal to the size of N. + * If the input data length is too large or destination buffer is too small, + * the error cause will be returned. The output buffer length will be checked only + * If the passed in length is not 0. If it is 0, this means user doesn't want to check + * the destination buffer length. + * The input and output buffer can be the same one. + * + * PARAMETERS + * ctx : [IN] CHE context + * src : [IN] source buffer + * src_len : [IN] source buffer length (the length sould < length of N) + * dst : [OUT] destination buffer (must pass in) + * dst_len : [IN/OUT] encrypted destination length. If user pass in non zero value, + * CHE will do the destination buffer length check. If the length + * smaller than the length of N. The error is returned. However, + * If user pass in value 0, che will not do the length checking. + * padding : [IN] the way of padding. Currently we only support PKCS#1v1.5 padding. + * If users don't want any padding, they can pass in VM_CHE_RSA_MODE_NULL. + * (vm_che_rsa_padding_mode_enum) + * + * RETURN VALUES + * take the reference of vm_che_result_error_enum. + * VM_CHE_OK : success + * VM_CHE_ERROR : parameter error + * VM_CHE_KEY_CHK_FAIL : input key is not correct + * VM_CHE_INVALID_LENGTH : the input data length is too large or destination buffer is too small + * VM_CHE_OPERATION_FAIL : algorithm operation is failed + * SEE ALSO + * vm_che_rsa_public_decrypt + * EXAMPLE + * (a). Encrypt the data by private key without padding + * We set the mode to VM_CHE_RSA_MODE_NULL to indicate that we don't + * encode the input data with any padding method + * + * vm_stche che_ctx; + * //initialize + * vm_che_init(&che_ctx, VM_CHE_RSA); + * //Set modulus: N + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_N, modulusN, n_len); + * //Set private key: D + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_D, privD, d_len); + * //Encrypt Data by the private key + * vm_che_rsa_private_encrypt(&che_ctx, src, src_len, dst, &dst_len, VM_CHE_RSA_MODE_NULL); + * // do other operation + * ... + * //Deinitialize when all RSA operation is finish + * vm_che_deinit(&che_ctx); + * + * + * (b). Encrypt the data by private key with PKCS#1v1.5 padding + * + * vm_stche che_ctx; + * //initialize + * vm_che_init(&che_ctx, VM_CHE_RSA); + * //Set modulus: N + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_N, modulusN, n_len); + * //Set private key: D + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_D, privD, d_len); + * //Encrypt Data by the private key + * vm_che_rsa_private_encrypt(&che_ctx, src, src_len, dst, &dst_len, VM_CHE_RSA_PKCS1_V15); + * // do other operation + * ... + * //Deinitialize when all RSA operation is finish + * vm_che_deinit(&che_ctx); + * + * + * (c). Encryption the data by the private key (CRT format) with PKCS1#v15 padding + * + * vm_stche che_ctx; + * // initialize + * vm_che_init(&che_ctx, VM_CHE_RSA); + * // set modulus: N + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_N, modulusN, n_len); + * // set P for private key checking + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_P, (VMUINT8 *)primeP, P_len); + * // set Q for private key checking + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_Q, (VMUINT8 *)primeQ, q_len); + * // Set private exponent: d mod (p-1) + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_dModPm1, dModPm1, dp_len); + * // Set private exponent: d mod (q-1) + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_dModQm1, dModQm1, 32); + * // Set coefficient Integer: inverse of q mod p + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_qInvModP, qInvModP, 32); + * //Encrypt Data by the private key + * vm_che_rsa_private_encrypt(&che_ctx, src, src_len, dst, &dst_len, VM_CHE_RSA_PKCS1_V15); + * // do other operation + * ... + * //Deinitialize when all RSA operation is finish + * vm_che_deinit(&che_ctx); + * + *****************************************************************************/ +extern VMINT vm_che_rsa_private_encrypt(vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding); + + +/***************************************************************************** + * FUNCTION + * vm_che_rsa_public_decrypt + * DESCRIPTION + * This API is used when we want to use public key to decrypt the data. + * Application can specify the way of padding based PCKS#1 standard. + * If users don't want to do the padding, they can set the padding to + * VM_CHE_RSA_MODE_NULL. + * If the input data is too large (> size of N), the error will be returned. + * If the input data is too small ( < smallest padding length(11)), + * the error will be returned as well. + * The input and output buffer can be the same one. + * + * RSA valid public key length: + * 128 bits < Modulus (N) < 4096 bits + * 2 bits < public exponent (E) < 64 bits + * PARAMETERS + * ctx : [IN] CHE context + * src : [IN] source buffer + * src_len : [IN] source buffer length (the length sould < length of N) + * dst : [OUT] destination buffer (must pass in) + * dst_len : [IN/OUT] encrypted destination length. If user pass in non zero value, + * CHE will do the destination buffer length check. If the length + * smaller than the length of N. The error is returned. However, + * If user pass in value 0, che will not do the length checking. + * padding : [IN] the way of padding. Currently we only support PKCS#1v1.5 padding. + * If users don't want any padding, they can pass in VM_CHE_RSA_MODE_NULL. + * (vm_che_rsa_padding_mode_enum) + * + * RETURN VALUES + * take the reference of vm_che_result_error_enum. + * VM_CHE_OK : success + * VM_CHE_ERROR : parameter error + * VM_CHE_KEY_CHK_FAIL : input key is not correct + * VM_CHE_INVALID_LENGTH : input data is too small or too long + * VM_CHE_OPERATION_FAIL : algorithm operation is failed + * SEE ALSO + * vm_che_rsa_private_encrypt + * EXAMPLE + * (a). Decrypt the data by public key without padding + * + * vm_stche che_ctx; + * //initialize + * vm_che_init(&che_ctx, VM_CHE_RSA); + * //Set modulus: N + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_N, modulusN, n_len); + * //Set public Exponent: E + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_E, pubExp, e_len); + * //Decrypt Data by the public key + * vm_che_rsa_public_decrypt(&che_ctx, src, src_len, dst, &dst_len, VM_CHE_RSA_MODE_NULL); + * // do other operation + * ... + * //Deinitialize when all RSA operation is finish + * vm_che_deinit(&che_ctx); + * + * + * (b). Decrypt the data by public key with PKCS#1v1.5 padding + * + * vm_stche che_ctx; + * //initialize + * vm_che_init(&che_ctx, VM_CHE_RSA); + * //Set modulus: N + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_N, modulusN, n_len); + * //Set public Exponent: E + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_E, pubExp, e_len); + * //Decrypt Data by the public key + * vm_che_rsa_public_decrypt(&che_ctx, src, src_len, dst, &dst_len, VM_CHE_RSA_PKCS1_V15); + * // do other operation + * ... + * //Deinitialize when all RSA operation is finish + * vm_che_deinit(&che_ctx); + * + *****************************************************************************/ +extern VMINT vm_che_rsa_public_decrypt(vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding); + + +/***************************************************************************** + * FUNCTION + * vm_che_rsa_private_decrypt + * DESCRIPTION + * This API is used when we want to use private key to decrypt the data. + * Application can specify the way of padding based PCKS#1 standard. + * If users don't want to do the padding, they can set the padding to + * VM_CHE_RSA_MODE_NULL. + * + * If the input data is too large (> size of N), the error will be returned. + * If the input data is too small ( < smallest padding length(11)), + * the error will be returned as well. + * The input and output buffer can be the same one. + * + * PARAMETERS + * ctx : [IN] CHE context + * src : [IN] source buffer + * src_len : [IN] source buffer length (the length sould < length of N) + * dst : [OUT] destination buffer (must pass in) + * dst_len : [IN/OUT] encrypted destination length. If user pass in non zero value, + * CHE will do the destination buffer length check. If the length + * smaller than the length of N. The error is returned. However, + * If user pass in value 0, che will not do the length checking. + * padding : [IN] the way of padding. Currently we only support PKCS#1v1.5 padding. + * If users don't want any padding, they can pass in VM_CHE_RSA_MODE_NULL. + * (vm_che_rsa_padding_mode_enum) + * + * RETURN VALUES + * take the reference of vm_che_result_error_enum. + * VM_CHE_OK : success + * VM_CHE_ERROR : parameter error + * VM_CHE_KEY_CHK_FAIL : input key is not correct + * VM_CHE_INVALID_LENGTH : input data is too small or too long + * VM_CHE_OPERATION_FAIL : algorithm operation is failed + * SEE ALSO + * vm_che_rsa_public_encrypt + * EXAMPLE + * (a). Decrypt the data by private key without padding + * We set the mode to VM_CHE_RSA_MODE_NULL to indicate that we don't encode the input data with any padding method + * + * vm_stche che_ctx; + * //initialize + * vm_che_init(&che_ctx, VM_CHE_RSA); + * //Set modulus: N + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_N, modulusN, n_len); + * //Set private key: D + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_D, privD, d_len); + * //Decrypt Data by the private key + * vm_che_rsa_private_decrypt(&che_ctx, src, src_len, dst, &dst_len, VM_CHE_RSA_MODE_NULL); + * // do other operation + * ... + * //Deinitialize when all RSA operation is finish + * vm_che_deinit(&che_ctx); + * + * + * (b). Decrypt the data by private key with PKCS#1v1.5 padding + * + * vm_stche che_ctx; + * //initialize + * vm_che_init(&che_ctx, VM_CHE_RSA); + * //Set modulus: N + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_N, modulusN, n_len); + * //Set private key: D + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_D, privD, d_len); + * //decrypt Data by the private key + * vm_che_rsa_private_decrypt(&che_ctx, src, src_len, dst, &dst_len, VM_CHE_RSA_PKCS1_V15); + * // do other operation + * ... + * //Deinitialize when all RSA operation is finish + * vm_che_deinit(&che_ctx); + * + * + * (c). Decrypt the data by private key (CRT format) with PKCS#1v1.5 padding + * + * vm_stche che_ctx; + * //initialize + * vm_che_init(&che_ctx, VM_CHE_RSA); + * // set modulus: N + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_N, modulusN, n_len); + * // set P for private key checking + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_P, (kal_uint8 *)primeP, P_len); + * // set Q for private key checking + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_Q, (kal_uint8 *)primeQ, q_len); + * // Set private exponent: d mod (p-1) + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_dModPm1, dModPm1, dp_len); + * // Set private exponent: d mod (q-1) + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_dModQm1, dModQm1, 32); + * // Set coefficient Integer: inverse of q mod p + * vm_che_key_action(&che_ctx, VM_CHE_SET_RSA_qInvModP, qInvModP, 32); + * //decrypt Data by the private key + * vm_che_rsa_private_decrypt(&che_ctx, src, src_len, dst, &dst_len, VM_CHE_RSA_PKCS1_V15); + * // do other operation + * ... + * //Deinitialize when all RSA operation is finish + * vm_che_deinit(&che_ctx); + * + *****************************************************************************/ +extern VMINT vm_che_rsa_private_decrypt(vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding); + +#ifdef __cplusplus +} +#endif + +#endif /* VMCHE_SDK_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmchset.h b/hardware/arduino/mtk/system/libmtk/include/vmchset.h new file mode 100644 index 00000000..24641fa3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmchset.h @@ -0,0 +1,332 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMCHSET_SDK_H_ +#define VMCHSET_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* The maximum length of character conversion. */ +#define CONVERT_CHSET_MAX_LEN 4096 + +/***************************************************************************** + * FUNCTION + * vm_ucs2_to_gb2312 + * DESCRIPTION + * Converts the UCS2 string to GB2312 string. + * PARAMETERS + * dst : [OUT] Pointer to destination string. + * size : [IN] Size in bytes of destination. + * src : [IN] Pointer to input string. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If successful. + * -1 : If failed. + *****************************************************************************/ +VMINT vm_ucs2_to_gb2312(VMSTR dst, VMINT size, VMWSTR src); + +/***************************************************************************** + * FUNCTION + * vm_gb2312_to_ucs2 + * DESCRIPTION + * Converts the GB2312 string to UCS2 string. + * PARAMETERS + * dst : [OUT] Pointer to destination string. + * size : [IN] Size in bytes of destination. + * src : [IN] Pointer to input string. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If successful. + * -1 : If failed. + *****************************************************************************/ +VMINT vm_gb2312_to_ucs2(VMWSTR dst, VMINT size, VMSTR src); + +/***************************************************************************** + * FUNCTION + * vm_ucs2_to_ascii + * DESCRIPTION + * Converts the UCS2 string to ASCII string. + * PARAMETERS + * dst : [OUT] Pointer to destination string. + * size : [IN] Size in bytes of destination. + * src : [IN] Pointer to input string. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If successful. + * -1 : If failed. + *****************************************************************************/ +VMINT vm_ucs2_to_ascii(VMSTR dst, VMINT size, VMWSTR src); + +/***************************************************************************** + * FUNCTION + * vm_ascii_to_ucs2 + * DESCRIPTION + * Converts the ASCII string to UCS2 string. + * PARAMETERS + * dst : [OUT] Pointer to destination string. + * size : [IN] Size in bytes of destination. + * src : [IN] Pointer to input string. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If successful. + * -1 : If failed. + *****************************************************************************/ +VMINT vm_ascii_to_ucs2(VMWSTR dst, VMINT size, VMSTR src); + +/* Phone language */ +typedef enum +{ + LANG_UNKOWN = 0, /* Unkown language */ + GB = 1, /* Simplified Chinese */ + ENGLISH, /* ENGLISH */ + BIG5, /* Traditional Chinese */ + JAPANESE, /* JAPANESE */ + KOREAN, /* KOREAN */ + SPANISH, /* SPANISH */ + FRENCH, /* FRENCH */ + DANISH, /* DANISH */ + POLISH, /* POLISH */ + PORTUGUESE, /* PORTUGUESE */ + ALBANIAN, /* ALBANIAN */ + ICELANDIC, /* ICELANDIC */ + SERBIAN, /* SERBIAN */ + AZERBAIJANI, /* AZERBAIJANI */ + CATALAN, /* CATALAN */ + HAUSA, /* HAUSA */ + KAZAKH, /* KAZAKH */ + MACEDONIAN, /* MACEDONIAN */ + SESOTHO, /* SESOTHO */ + TAGALOG, /* TAGALOG */ + YORUBA, /* YORUBA */ + ITALIAN, /* ITALIAN */ + GERMAN, /* GERMAN */ + MALAY, /* MALAY */ + INDONESIAN, /* INDONESIAN */ + CZECH, /* CZECH */ + NORWEGIAN, /* NORWEGIAN */ + SLOVAK, /* SLOVAK */ + DUTCH, /* DUTCH */ + FINNISH, /* FINNISH */ + HUNGARIAN, /* HUNGARIAN */ + VIETNAMESE, /* VIETNAMESE */ + TURKISH, /* TURKISH */ + RUSSIAN, /* RUSSIAN */ + UKRAINIAN, /* UKRAINIAN */ + ARABIC, /* ARABIC */ + PERSIAN, /* PERSIAN */ + URDU, /* URDU */ + HEBREW, /* HEBREW */ + THAI, /* THAI */ + GREEK, /* GREEK */ + SWEDISH, /* SWEDISH */ + CROATIAN, /* CROATIAN */ + ROMANIAN, /* ROMANIAN */ + SLOVENIAN, /* SLOVENIAN */ + HINDI, /* HINDI */ + MARATHI, /* MARATHI */ + TAMIL, /* TAMIL */ + GUJARATI, /* GUJARATI */ + BENGALI, /* BENGALI */ + ASSAMESE, /* ASSAMESE */ + PUNJABI, /* PUNJABI */ + TELUGU, /* TELUGU */ + KANNADA, /* KANNADA */ + MALAYALAM, /* MALAYALAM */ + ORIYA, /* ORIYA */ + XHOSA, /* XHOSA */ + SWAHILI, /* SWAHILI */ + AFRIKAANS, /* AFRIKAANS */ + ZULU, /* ZULU */ + LITHUANIAN, /* LITHUANIAN */ + LATVIAN, /* LATVIAN */ + ESTONIAN, /* ESTONIAN */ + ARMENIAN, /* ARMENIAN */ + GEORGIAN, /* GEORGIAN */ + MOLDOVAN, /* MOLDOVAN */ + GALICIAN, /* GALICIAN */ + BASQUE, /* BASQUE */ + IGBO, /* IGBO */ + FILIPINO, /* FILIPINO */ + IRISH, /* IRISH */ + SA_SPANISH, /* SA_SPANISH */ + SA_PORTUGUESE, /* SA_PORTUGUESE */ + UK_ENGLISH, /* UK_ENGLISH */ + CA_FRENCH, /* CA_FRENCH */ + BULGARIAN /* BULGARIAN */ +} vm_language_t; + +/***************************************************************************** + * FUNCTION + * vm_get_language + * DESCRIPTION + * To get current language. + * RETURNS + * The current language. + * RETURN VALUES + * GB : Simplified Chinese. + * ENGLISH : English. + * BIG5 : Traditional Chinese. + * Other value : Please refer to vm_language_t. + *****************************************************************************/ +vm_language_t vm_get_language(void); + +/* Character sets */ +typedef enum +{ + VM_CHSET_BASE = 0, /* BASE */ + VM_CHSET_ASCII, /* ASCII */ + VM_CHSET_ARABIC_ISO, /* ARABIC_ISO */ + VM_CHSET_ARABIC_WIN, /* ARABIC_WIN */ + VM_CHSET_PERSIAN_CP1097, /* PERSIAN_CP1097 */ + VM_CHSET_PERSIAN_CP1098, /* PERSIAN_CP1098 */ + VM_CHSET_BALTIC_ISO, /* BALTIC_ISO */ + VM_CHSET_BALTIC_WIN, /* BALTIC_WIN */ + VM_CHSET_CEURO_ISO, /* CEURO_ISO */ + VM_CHSET_CEURO_WIN, /* CEURO_WIN */ + VM_CHSET_CYRILLIC_ISO, /* CYRILLIC_ISO */ + VM_CHSET_CYRILLIC_WIN, /* CYRILLIC_WIN */ + VM_CHSET_GREEK_ISO, /* GREEK_ISO */ + VM_CHSET_GREEK_WIN, /* GREEK_WIN */ + VM_CHSET_HEBREW_ISO, /* HEBREW_ISO */ + VM_CHSET_HEBREW_WIN, /* HEBREW_WIN */ + VM_CHSET_LATIN_ISO, /* LATIN_ISO */ + VM_CHSET_NORDIC_ISO, /* NORDIC_ISO */ + VM_CHSET_SEURO_ISO, /* SEURO_ISO */ + VM_CHSET_TURKISH_ISO, /* TURKISH_ISO */ + VM_CHSET_TURKISH_WIN, /* TURKISH_WIN */ + VM_CHSET_WESTERN_ISO, /* WESTERN_ISO */ + VM_CHSET_ARMENIAN_ISO, /* ARMENIAN_ISO */ + VM_CHSET_WESTERN_WIN, /* WESTERN_WIN */ + VM_CHSET_BIG5, /* BIG5 */ + VM_CHSET_GB2312, /* GB2312 */ + VM_CHSET_HKSCS, /* HKSCS */ + VM_CHSET_SJIS, /* SJIS */ + VM_CHSET_GB18030, /* GB18030 */ + VM_CHSET_UTF7, /* UTF7 */ + VM_CHSET_EUCKR, /* EUCKR */ + VM_CHSET_THAI_WIN, /* THAI_WIN */ + VM_CHSET_VIETNAMESE_WIN, /* VIETNAMESE_WIN */ + VM_CHSET_KOI8_R, /* KOI8_R */ + VM_CHSET_TIS_620, /* TIS_620 */ + VM_CHSET_UTF16LE, /* UTF16LE */ + VM_CHSET_UTF16BE, /* UTF16BE */ + VM_CHSET_UTF8, /* UTF8 */ + VM_CHSET_UCS2, /* UCS2 */ + VM_CHSET_TOTAL /* TOTAL */ +} vm_chset_enum; + +/* The return value of vm_chset_convert */ + +#define VM_CHSET_CONVERT_SUCCESS (0) /* If successful. */ +#define VM_CHSET_CONVERT_ERR_PARAM (-1) /* Parameter error. */ +#define VM_CHSET_CONVERT_SRC_UNSUPPORT_CHSET (-2) /* Character set used by input string is not supported. */ +#define VM_CHSET_CONVERT_DST_UNSUPPORT_CHSET (-3) /* Character set used by destination string is not supported. */ +#define VM_CHSET_CONVERT_FATAL_ERROR (-4) /* General failure. */ + +/***************************************************************************** + * FUNCTION + * vm_chset_convert + * DESCRIPTION + * Converts string between 2 character sets. (will add the terminate character) + * PARAMETERS + * src_type : [IN] Character set in which the input string is encoded. + * dest_type : [IN] Character set in which the destination string is encoded. + * src : [IN] Pointer to input string. + * dest : [OUT] Pointer to destination string. + * dest_size : [IN] Size in bytes of destination. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * VM_CHSET_CONVERT_SUCCESS : If successful. + * VM_CHSET_CONVERT_ERR_PARAM : Parameter error. + * VM_CHSET_CONVERT_SRC_UNSUPPORT_CHSET : Character set used by input string is not supported. + * VM_CHSET_CONVERT_DST_UNSUPPORT_CHSET : Character set used by destination string is not supported. + * VM_CHSET_CONVERT_FATAL_ERROR : General failure. + *****************************************************************************/ +VMINT vm_chset_convert(vm_chset_enum src_type, vm_chset_enum dest_type, VMCHAR *src, VMCHAR *dest, VMINT dest_size); + +/***************************************************************************** + * FUNCTION + * vm_get_language_ssc + * DESCRIPTION + * Get curent language's ssc string + * PARAMETERS + * ssc : [OUT] SSC String + * RETURNS + * index of cur language + *****************************************************************************/ +extern VMINT32 vm_get_language_ssc(VMINT8 *ssc); + +/***************************************************************************** + * FUNCTION + * vm_get_current_lang_country_code + * DESCRIPTION + * To get current language's country code + * This is used to get current language's country code + * PARAMETERS + * void + * RETURNS + * country code + *****************************************************************************/ +VMUSTR vm_get_current_lang_country_code(void); + + +/***************************************************************************** + * FUNCTION + * vm_get_language_num + * DESCRIPTION + * To query support language number. + * PARAMETERS + * void + * RETURNS + * the language number. + *****************************************************************************/ +VMINT32 vm_get_language_num(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* VMCHSET_SDK_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmconn.h b/hardware/arduino/mtk/system/libmtk/include/vmconn.h new file mode 100644 index 00000000..8ee00418 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmconn.h @@ -0,0 +1,1186 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMCONN_SDK_H +#define VMCONN_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + + +#define VM_MAX_SOCK_ADDR_LEN 28 + +/* Socket address struct */ +typedef struct +{ + VMINT16 addr_len; /* address length */ + VMUINT16 port; /* port number */ + VMUINT8 addr[VM_MAX_SOCK_ADDR_LEN]; /* address */ +} vm_sockaddr_struct; + + +/* only use when conbined with vm_dtacct_set */ +#define VM_APN_USER_DEFINE (6) + + +/* APN information struct */ +typedef struct +{ + VMINT apn_info_id; /* indicate use proxy or not, 1 means use */ + VMINT proxy_port; /* proxy port */ + VMCHAR operator_id[8]; /* empty string */ + VMCHAR operator_name[64]; /* empty string */ + VMCHAR proxy_ip[16]; /* proxy ip address */ + VMCHAR apn_proxy[32]; /* empty string */ + VMCHAR apn_no_proxy[32]; /* empty string */ + VMCHAR user_name[16]; /* proxy auth. ID */ + VMCHAR pass_word[16]; /* proxy auto. password */ +}vm_apn_info_ext; + + +/***************************************************************************** + * FUNCTION + * vm_is_support_wifi + * DESCRIPTION + * query wifi support. + * RETURNS + * support or not support wifi. + * RETURN VALUES + * TRUE : support wifi + * FALSE : not support wifi +*****************************************************************************/ +VMINT vm_is_support_wifi(void); + + +/***************************************************************************** + * FUNCTION + * vm_wifi_is_connected + * DESCRIPTION + * query wifi contect. + * RETURNS + * contected or not contected wifi. + * RETURN VALUES + * TRUE : wifi contect. + * FALSE : wifi not contected. +*****************************************************************************/ +VMINT vm_wifi_is_connected(void); + + +/***************************************************************************** + * FUNCTION + * vm_get_apn_info + * DESCRIPTION + * Get Apn info after network connected + * PARAMETERS + * current_apn_info : [OUT] apn info of current connection + * RETURNS + * 0 means successful + * RETURN VALUES + * 0 : successful +*****************************************************************************/ +VMINT vm_get_apn_info(vm_apn_info_ext *current_apn_info); + +/***************************************************************************** + * FUNCTION + * vm_get_default_apn_info + * DESCRIPTION + * get current default apn infomation. + * RETURNS + * avaliable or not. + * RETURN VALUES + * 0 sucess, else failure +*****************************************************************************/ +VMINT vm_get_default_apn_info( vm_apn_info_ext *apn_info); + + +#define VM_SOC_DNS_MAX_ADDR 5 + +/* Socket return codes, negative values stand for errors */ +typedef enum +{ + VM_E_SOC_SUCCESS = 0, /* success */ + VM_E_SOC_ERROR = -1, /* error */ + VM_E_SOC_WOULDBLOCK = -2, /* not done yet */ + VM_E_SOC_LIMIT_RESOURCE = -3, /* limited resource */ + VM_E_SOC_INVALID_SOCKET = -4, /* invalid socket */ + VM_E_SOC_INVALID_ACCOUNT = -5, /* invalid account id */ + VM_E_SOC_NAMETOOLONG = -6, /* address too long */ + VM_E_SOC_ALREADY = -7, /* operation already in progress */ + VM_E_SOC_OPNOTSUPP = -8, /* operation not support */ + VM_E_SOC_CONNABORTED = -9, /* Software caused connection abort */ + VM_E_SOC_INVAL = -10, /* invalid argument */ + VM_E_SOC_PIPE = -11, /* broken pipe */ + VM_E_SOC_NOTCONN = -12, /* socket is not connected */ + VM_E_SOC_MSGSIZE = -13, /* msg is too long */ + VM_E_SOC_BEARER_FAIL = -14, /* bearer is broken */ + VM_E_SOC_CONNRESET = -15, /* TCP half-write close, i.e., FINED */ + VM_E_SOC_DHCP_ERROR = -16, /* DHCP error */ + VM_E_SOC_IP_CHANGED = -17, /* IP has changed */ + VM_E_SOC_ADDRINUSE = -18, /* address already in use */ + VM_E_SOC_CANCEL_ACT_BEARER = -19 /* cancel the activation of bearer */ +} vm_soc_error_enum; + +/* dns query result struct */ +typedef struct +{ + VMUINT address[VM_SOC_DNS_MAX_ADDR]; /* ip address */ + VMINT num; + VMINT error_cause; /* vm_ps_cause_enum */ +}vm_soc_dns_result; +/* +VMINT vm_soc_get_host_by_name(const VMCHAR * host, + VMBYTE * addr, + VMBYTE * addr_len, + VMINT (*callback)(VMBYTE * addr, VMINT addr_len)); +*/ + +/***************************************************************************** + * FUNCTION + * vm_soc_get_host_by_name + * DESCRIPTION + * this function retrieves IP addresses associated with the specified host name. + * PARAMETERS + * apn : [IN] + * host : [IN] domain to be resolved. + * result : [OUT] DNS parsed result. + * callback : [IN] point to the callback. + * RETURNS + * success if 0, else failure. + * RETURN VALUES + * VM_E_SOC_SUCCESS : Get IP address successfully, result is filled. + * VM_E_SOC_WOULDBLOCK : wait response from network, result could be gotten from callback. + * VM_E_SOC_INVAL : invalid arguments: null domain_name, etc. + * VM_E_SOC_ERROR : unspecified error + * VM_E_SOC_LIMIT_RESOURCE : socket resources not available + * VM_E_SOC_INVALID_ACCOUNT : invalid data account id + * EXAMPLE + * + * VMINT vat_vmsock_gethost_cb(vm_soc_dns_result *dns) + * { + * return FALSE; + * } + * void vat_vmsock_gethost_1(VATExt *po) + * { + * VMINT ret = -1; + * VMINT apn = VM_TCP_APN_CMNET; + * vm_soc_dns_result dns; + * if (vm_wifi_is_connected()) { + * apn = VM_TCP_APN_WIFI; + * } + * ret = vm_soc_get_host_by_name(apn, "www.mediatek.com", &dns, vat_vmsock_gethost_cb); + * + * switch (ret) { + * case VM_E_SOC_SUCCESS: + * break; + * case VM_E_SOC_WOULDBLOCK: + * break; + * default: + * break; + * } + * } + * +*****************************************************************************/ +VMINT vm_soc_get_host_by_name(VMINT apn, + const VMCHAR * host, + vm_soc_dns_result * result, + VMINT (*callback)(vm_soc_dns_result *)); + +/***************************************************************************** + * FUNCTION + * vm_soc_get_host_by_name_ex + * DESCRIPTION + * this function retrieves IP addresses associated with the specified host name. + * PARAMETERS + * apn : [IN] + * host : [IN] domain to be resolved. + * result : [OUT] DNS parsed result. + * callback : [IN] point to the callback. + * RETURNS + * handle if more than 0, else failure. + * EXAMPLE + * + * VMINT vat_vmsock_gethost_cb_ex(VMINT handle, vm_soc_dns_result *dns, void *user_data) + * { + * return FALSE; + * } + * void vat_vmsock_gethost_ex(VATExt *po) + * { + * VMINT ret = -1; + * VMINT apn = VM_TCP_APN_CMNET; + * vm_soc_dns_result dns; + * if (vm_wifi_is_connected()) { + * apn = VM_TCP_APN_WIFI; + * } + * ret = vm_soc_get_host_by_name_ex(apn, "www.mediatek.com", &dns, vat_vmsock_gethost_cb_ex, NULL); + * + * switch (ret) { + * case VM_E_SOC_SUCCESS: + * break; + * case VM_E_SOC_WOULDBLOCK: + * break; + * default: + * break; + * } + * } + * +*****************************************************************************/ +VMINT vm_soc_get_host_by_name_ex(VMINT apn, + const VMCHAR * host, + vm_soc_dns_result * result, + VMINT (*callback)(VMINT, vm_soc_dns_result *, void *), void *user_data); +/***************************************************************************** + * FUNCTION + * vm_get_encoded_dtacct_id + * DESCRIPTION + * this function retrieves data account id. + * PARAMETERS + * apn : [IN] apn id, only support VM_TCP_APN_CMNET, VM_TCP_APN_WIFI + * dtacct_id : [OUT] point to data account id. + * RETURNS + * success if 0, else failure. + * RETURN VALUES + * VM_E_SOC_SUCCESS : Get IP address successfully, result is filled. + * VM_E_SOC_INVAL : invalid arguments: null domain_name, etc. + * VM_E_SOC_INVALID_ACCOUNT : invalid data account id + * EXAMPLE + * + * void vat_vmsock_dtacct_1(void) + * { + * VMINT ret = -1; + * VMINT apn = VM_TCP_APN_CMNET; + * VMUINT dtacct_id; + * + * if (vm_wifi_is_connected()) { + * apn = VM_TCP_APN_WIFI; + * } + * + * ret = vm_get_encoded_dtacct_id(apn, &dtacct_id); + * if (ret == VM_E_SOC_SUCCESS) { + * } + * else { + * } + * } + * +*****************************************************************************/ +VMINT vm_get_encoded_dtacct_id(VMINT apn, VMUINT * dtacct_id); + + + + + + +/* MAC address length */ +#define VM_WLAN_LOC_MAC_ADDR_LEN 6 +/* Maximum ap list number */ +#define VM_WLAN_LOC_MAX_AP_LIST_NUM 30 + +/* Wlan scan error */ +typedef enum +{ + VM_WLAN_LOC_ERR_LOGICAL = -7, /* wlan is inactive state */ + VM_WLAN_LOC_ERR_INTERNAL, /* Internal error */ + VM_WLAN_LOC_ERR_BUSY, /* Can't create a new scan job */ + VM_WLAN_LOC_ERR_BAD_PARAM, /* bad parameter */ + VM_WLAN_LOC_ERR_NO_RESOURCE, /* allocate resource failed */ + VM_WLAN_LOC_ERR_NOT_SUPPORT, /* project doesn't support wlan */ + VM_WLAN_LOC_ERR_NO_AUTHORIZATION, + VM_WLAN_LOC_ERR_SUCCESS = 0 +}vm_wlan_loc_error_t; + +/* Wlan scan result */ +typedef enum +{ + VM_WLAN_LOC_SCAN_RESULT_SUCCESS = 0, /* WLAN scan success */ + VM_WLAN_LOC_SCAN_RESULT_FAILED, /* WLAN scan failed */ + VM_WLAN_LOC_SCAN_RESULT_ABORTED, /* WLAN scan service is aborted */ + VM_WLAN_LOC_SCAN_RESULT_TOTAL +} vm_wlan_loc_scan_result_enum; + +/* wlan connected information struct */ +typedef struct +{ + VMUINT8 bssid[VM_WLAN_LOC_MAC_ADDR_LEN]; /* MAC address */ + VMINT rssi; /* rssi information */ +}vm_wlan_loc_supc_abm_bss_info_struct; + +typedef struct +{ + const vm_wlan_loc_supc_abm_bss_info_struct * ap_list[VM_WLAN_LOC_MAX_AP_LIST_NUM]; /* bss info array */ + VMINT handle; + vm_wlan_loc_scan_result_enum result; /* scan result enum */ + VMUINT8 ap_list_num;/* total num of searched ap list */ +}vm_wlan_loc_data_t; + + +/***************************************************************************** + * FUNCTION + * vm_wlan_loc_search + * DESCRIPTION + * The function is used to scan the AP list for applications. + * PARAMETERS + * callback : [IN] scan result callback notify function for APP + * user_data : [IN] application piggyback data + * RETURNS + * return value >= 0 : search handle id created successfully. + * return value < 0 : failure + * RETURN VALUES + * VM_WLAN_LOC_ERR_BUSY : busy, could retry later + * VM_WLAN_LOC_ERR_NO_RESOURCE : no avalible resource + * VM_WLAN_LOC_ERR_NOT_SUPPORT : platform dose not support + * EXAMPLE + * + * static VMINT g_wlan_hd; + * void vat_vmsock_wlan_search_cb(vm_wlan_loc_data_t *wlan_data, void *user_data) + * { + * switch (wlan_data->result) { + * case VM_WLAN_LOC_SCAN_RESULT_SUCCESS: + * { + * vm_wlan_loc_search_abort(g_wlan_hd); + * break; + * } + * case VM_WLAN_LOC_SCAN_RESULT_FAILED: + * vm_wlan_loc_search_abort(g_wlan_hd); + * break; + * case VM_WLAN_LOC_SCAN_RESULT_ABORTED: + * g_wlan_hd = -1; + * break; + * default: + * break; + * } + * } + * void vat_vmsock_wlan_search_1(void) + * { + * VMINT ret = -1; + * + * ret = vm_wlan_loc_search(vat_vmsock_wlan_search_cb, NULL); + * if (VM_WLAN_LOC_ERR_NOT_SUPPORT != ret && 0 <= ret) { + * g_wlan_hd = ret; + * } + * } + * +*****************************************************************************/ +VMINT vm_wlan_loc_search(void (*callback)(vm_wlan_loc_data_t * data, void * user_data), void * user_data); + +/***************************************************************************** + * FUNCTION + * vm_wlan_loc_search_abort + * DESCRIPTION + * The function is used to abort the scanning AP list process for applications. + * PARAMETERS + * handle : [IN] created handle id from calling vm_wlan_loc_search + * RETURNS + * success if 0, else failure. + * RETURN VALUES + * VM_WLAN_LOC_ERR_BAD_PARAM : invalid input param + * VM_WLAN_LOC_ERR_NO_RESOURCE : no avalible resource + * VM_WLAN_LOC_ERR_NOT_SUPPORT : platform dose not support + * EXAMPLE + * + * static VMINT g_wlan_hd; + * void vat_vmsock_wlan_search_cb(vm_wlan_loc_data_t *wlan_data, void *user_data) + * { + * switch (wlan_data->result) { + * case VM_WLAN_LOC_SCAN_RESULT_SUCCESS: + * { + * vm_wlan_loc_search_abort(g_wlan_hd); + * break; + * } + * case VM_WLAN_LOC_SCAN_RESULT_FAILED: + * vm_wlan_loc_search_abort(g_wlan_hd); + * break; + * case VM_WLAN_LOC_SCAN_RESULT_ABORTED: + * g_wlan_hd = -1; + * break; + * default: + * break; + * } + * } + * void vat_vmsock_wlan_search_1(void) + * { + * VMINT ret = -1; + * + * ret = vm_wlan_loc_search(vat_vmsock_wlan_search_cb, NULL); + * if (VM_WLAN_LOC_ERR_NOT_SUPPORT != ret && 0 <= ret) { + * g_wlan_hd = ret; + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_loc_search_abort(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_wlan_loc_get_connected_info + * DESCRIPTION + * The function get info form ap which connected already + * PARAMETERS + * rssi : [OUT] rssi + * bssid : [OUT] bssid + * RETURNS + * success if 0, else failure. + * RETURN VALUES + * VM_WLAN_LOC_ERR_BAD_PARAM : invalid input param + * VM_WLAN_LOC_ERR_NOT_SUPPORT : platform dose not support + * VM_WLAN_LOC_ERR_LOGICAL : maybe not connected + * EXAMPLE + * + * void hl_wlan_get_conn_info(void) + * { + * vm_wlan_loc_supc_abm_bss_info_struct info; + * vm_wlan_loc_get_connected_info(&info); + * } + * +*****************************************************************************/ +VMINT vm_wlan_loc_get_connected_info(vm_wlan_loc_supc_abm_bss_info_struct * info); + +/* Preload app query and download states */ +typedef enum +{ + E_PRELOAD_QUERYING, /* Querying information */ + E_PRELOAD_AVAILABLE_UPDATE, /* There is available update */ + E_PRELOAD_NO_UPDATE, /* No update */ + E_PRELOAD_CONNECTING, /* Connecting network */ + E_PRELOAD_CONNECTED, /* Network connected */ + E_PRELOAD_DOWNLOADING, /* Downloading */ + E_PRELOAD_DOWNLOADED, /* App downloaded */ + E_PRELOAD_HOST_NOT_FOUND, /* host can not be found */ + E_PRELOAD_PIPE_CLOSED, /* Pipe is closed */ + E_PRELOAD_PIPE_BROKEN, /* Pipe is broken */ + E_PRELOAD_FAILURE, /* Other failed */ + E_PRELOAD_ERR_PATH, /* download destination path error */ + E_PRELOAD_ABORT, /* Action is abort */ +}vm_preload_state_e; + +/* Preload query information */ +typedef struct +{ + VMUINT app_id; /* app id */ +// VMCHAR ver[8]; +// VMCHAR imsi[32]; +// VMCHAR imei[32]; + VMCHAR * ua; /* User-Agent */ + /* + VMCHAR sc[16]; + VMBYTE skb; + VMBYTE stch; + VMBYTE sgs; + VMBYTE scs; + VMINT w; + VMINT h; + */ +}vm_preload_query_info_t; + +/* Common info */ +typedef struct +{ + vm_preload_state_e state; /* query or download states */ + void * user_data; /* user data */ +}vm_common_t; + + +/* +state in below +E_PRELOAD_DOWNLOADING, +E_PRELOAD_DOWNLOADED, +*/ +/* received data information */ +typedef struct +{ + vm_common_t head; /* Common info */ + VMINT received; /* received data size */ + VMINT total; /* Total data size */ +}vm_preload_recv_data_t; + +/***************************************************************************** + * FUNCTION + * vm_preload_query + * DESCRIPTION + * Query information of preload app + * PARAMETERS + * apn [IN] apn id + * url [IN] server url + * port [IN] server port + * info [IN] query information + * callback [IN] query result callback + * user_data [IN] user data + * RETURNS + * query handle if success. + * EXAMPLE + * + * static VMINT preload_handle; + * void callback(VMINT hdl,void * para) + * { + * vm_common_t * data = (vm_common_t *)para; + * + * if (E_PRELOAD_AVAILABLE_UPDATE == data->state) + * { + * vm_preload_download(hdl, get_app_tmp_path(), callback, NULL); + * } + * if (E_PRELOAD_DOWNLOADING == data->state) + * { + * vm_preload_recv_data_t * info = (vm_preload_recv_data_t *)para; + * vm_trace("PRELOAD [%d/%d]", info->received, info->total); + * } + * return; + * } + * void hl_preload(void) + * { + * static VMINT ret = 0; + * vm_preload_query_info_t info; + * + * info.app_id = 0x0100a4; + * info.ua = (VMCHAR*)vm_malloc(32); + * sprintf(info.ua, "app_id=%d&ver=%s", 0x0100a4, "0.0.1"); + * ret = vm_preload_query(VM_TCP_APN_CMNET, + * (const VMCHAR *)"http://www.mediatek.com/games/AppsUpdate", + * 80, + * (const vm_preload_query_info_t *)&info, + * callback, + * (void *)0x12341234); + * if (ret > 0) + * preload_handle = ret; + * } + * +*****************************************************************************/ +VMINT vm_preload_query(VMINT apn, + const VMCHAR * url, + VMINT port, + const vm_preload_query_info_t * info, + void (*callback)(VMINT hdl, void * para), + void * user_data); +/***************************************************************************** + * FUNCTION + * vm_preload_download_ex + * DESCRIPTION + * Download preload application + * PARAMETERS + * hdl [IN] preload query handle + * data [IN] destination path + * bDLA [IN] use download agent or not + * callback [IN] download state callback + * user_data [IN] user data + * RETURNS + * return 0 if success, else return error code. + * EXAMPLE + * + * static VMINT preload_handle; + * void callback(VMINT hdl,void * para) + * { + * vm_common_t * data = (vm_common_t *)para; + * + * if (E_PRELOAD_AVAILABLE_UPDATE == data->state) + * { + * vm_preload_download_ex(hdl, get_app_tmp_path(), FALSE, callback, NULL); + * } + * if (E_PRELOAD_DOWNLOADING == data->state) + * { + * vm_preload_recv_data_t * info = (vm_preload_recv_data_t *)para; + * vm_trace("PRELOAD [%d/%d]", info->received, info->total); + * } + * return; + * } + * void hl_preload(void) + * { + * static VMINT ret = 0; + * vm_preload_query_info_t info; + * + * info.app_id = 0x0100a4; + * info.ua = (VMCHAR*)vm_malloc(32); + * sprintf(info.ua, "app_id=%d&ver=%s", 0x0100a4, "0.0.1"); + * ret = vm_preload_query(VM_TCP_APN_CMNET, + * (const VMCHAR *)"http://www.mediatek.com/games/AppsUpdate", + * 80, + * (const vm_preload_query_info_t *)&info, + * callback, + * (void *)0x12341234); + * if (ret > 0) + * preload_handle = ret; + * } + * +*****************************************************************************/ +VMINT vm_preload_download_ex(VMINT hdl, const VMWCHAR * data, VMBOOL bDLA,void (*callback)(VMINT hdl, void * para), void * user_data); + +/***************************************************************************** + * FUNCTION + * vm_preload_download + * DESCRIPTION + * Download preload application + * PARAMETERS + * hdl [IN] preload query handle + * data [IN] destination path + * callback [IN] download state callback + * user_data [IN] user data + * RETURNS + * return 0 if success, else return error code. + * EXAMPLE + * + * static VMINT preload_handle; + * void callback(VMINT hdl,void * para) + * { + * vm_common_t * data = (vm_common_t *)para; + * + * if (E_PRELOAD_AVAILABLE_UPDATE == data->state) + * { + * vm_preload_download(hdl, get_app_tmp_path(), callback, NULL); + * } + * if (E_PRELOAD_DOWNLOADING == data->state) + * { + * vm_preload_recv_data_t * info = (vm_preload_recv_data_t *)para; + * vm_trace("PRELOAD [%d/%d]", info->received, info->total); + * } + * return; + * } + * void hl_preload(void) + * { + * static VMINT ret = 0; + * vm_preload_query_info_t info; + * + * info.app_id = 0x0100a4; + * info.ua = (VMCHAR*)vm_malloc(32); + * sprintf(info.ua, "app_id=%d&ver=%s", 0x0100a4, "0.0.1"); + * ret = vm_preload_query(VM_TCP_APN_CMNET, + * (const VMCHAR *)"http://www.mediatek.com/games/AppsUpdate", + * 80, + * (const vm_preload_query_info_t *)&info, + * callback, + * (void *)0x12341234); + * if (ret > 0) + * preload_handle = ret; + * } + * +*****************************************************************************/ +VMINT vm_preload_download(VMINT hdl, const VMWCHAR * data, void (*callback)(VMINT hdl, void * para), void * user_data); + +/***************************************************************************** + * FUNCTION + * vm_preload_cancel + * DESCRIPTION + * Cancel preload query + * PARAMETERS + * hdl [IN] preload query handle + * RETURNS + * return 0 if success, else return error code. + * EXAMPLE + * + * static VMINT preload_handle; + * void callback(VMINT hdl,void * para) + * { + * vm_common_t * data = (vm_common_t *)para; + * + * if (E_PRELOAD_AVAILABLE_UPDATE == data->state) + * { + * vm_preload_download(hdl, get_app_tmp_path(), callback, NULL); + * } + * if (E_PRELOAD_DOWNLOADING == data->state) + * { + * vm_preload_recv_data_t * info = (vm_preload_recv_data_t *)para; + * vm_trace("PRELOAD [%d/%d]", info->received, info->total); + * } + * return; + * } + * void hl_preload(void) + * { + * static VMINT ret = 0; + * vm_preload_query_info_t info; + * + * info.app_id = 0x0100a4; + * info.ua = (VMCHAR*)vm_malloc(32); + * sprintf(info.ua, "app_id=%d&ver=%s", 0x0100a4, "0.0.1"); + * ret = vm_preload_query(VM_TCP_APN_CMNET, + * (const VMCHAR *)"http://www.mediatek.com/games/AppsUpdate", + * 80, + * (const vm_preload_query_info_t *)&info, + * callback, + * (void *)0x12341234); + * if (ret > 0) + * preload_handle = ret; + * vm_preload_cancel(preload_handle); + * } + * +*****************************************************************************/ +VMINT vm_preload_cancel(VMINT hdl); + +/* network enum */ +typedef enum +{ + VM_NETWORK_NONE = 0, /* No bit-wise operation for none case */ + VM_GSM = 0x0100, /* GSM protocol */ + VM_WCDMA = 0x0200, /* WCDMA protocol */ + VM_NETWORK_END_OF_ENUM /* reserved */ +}vm_network_enum_t; + +/***************************************************************************** + * FUNCTION + * vm_srv_nw_info_get_protocol + * DESCRIPTION + * Get the protocol of current network. + * PARAMETERS + * sim_card : [IN] SIM index, eg: 0x1-SIM1, 0x2-SIM2 + * RETURNS + * vm_network_enum_t + * RETURN VALUES + * VM_GSM, VM_WCDMA, failure if less than 0 + * EXAMPLE + * + * void hl_nw_sample_1(void) + * { + * VMINT nw; + * nw = vm_srv_nw_info_get_protocol(0x1); + * } + * + *****************************************************************************/ +VMINT vm_srv_nw_info_get_protocol(VMINT sim_card); + +/* network capability enum */ +typedef enum +{ + VM_NETWORK_CAPABILITY_NONE = 0, + VM_GPRS = 0x0010, /* GPRS */ + VM_EDGE = 0x0020, /* EDGE */ + VM_HSDPA = 0x0040, /* HSDPA */ + VM_HSUPA = 0x0080, /* HSUPA */ + VM_NETWORK_CAPABILITY_END_OF_ENUM +} vm_network_capability_enum; + +/***************************************************************************** + * FUNCTION + * vm_srv_nw_info_get_protocol + * DESCRIPTION + * Query if current channel supports the capability. + * PARAMETERS + * sim : [IN] Which protocol layer of SIM + * type : [IN] Protocol capability. refer to vm_network_capability_enum + * RETURNS + * -1: no authorization + * -2: invalid param + * not support if 0, else support. + * EXAMPLE + * + * void hl_nw_sample_2(void) + * { + * VMINT nw; + * nw = vm_srv_nw_info_channel_supports(0x1, VM_HSDPA); + * } + * + *****************************************************************************/ +VMINT vm_srv_nw_info_channel_supports(VMINT sim_card, vm_network_capability_enum type); + + +typedef enum +{ + VM_NW_INFO_SA_SEARCHING, /* Searching network */ + VM_NW_INFO_SA_NO_SERVICE, /* No service */ + VM_NW_INFO_SA_LIMITED_SERVICE, /* Limited service, emergency call only */ + VM_NW_INFO_SA_FULL_SERVICE, /* Full service */ + + VM_NW_INFO_SA_END_OF_ENUM +} vm_nw_info_service_availability_enum_t; +/***************************************************************************** + * FUNCTION + * vm_srv_nw_info_get_service_availability + * DESCRIPTION + * Get the service availability status. + * If the network is disabled, the return value is invalid. + * PARAMETERS + * sim_card : [IN] SIM index, eg: 0x1-SIM1, 0x2-SIM2 + * RETURNS + * vm_nw_info_service_availability_enum_t + * RETURN VALUES + * VM_NW_INFO_SA_SEARCHING, etc, failure if less than 0 + * EXAMPLE + * + * void hl_nw_sample_1(void) + * { + * VMINT nw; + * nw = vm_nw_info_get_service_availability(0x1); + * } + * + *****************************************************************************/ +VMINT vm_srv_nw_info_get_service_availability(VMINT sim_card); + + +/***************************************************************************** + * FUNCTION + * vm_dtacct_set + * DESCRIPTION + * set the current data account info that got from vm_dtacct_select. if app need to do connection + * use this data account of the sim_id, VM_APN_USER_DEFINE should be passed as apn param. eg, + * vm_tcp_connect(xx, xxx, VM_APN_USER_DEFINE, xxxx); + * PARAMETERS + * sim_id : [IN] SIM index, eg: 0-SIM1, 1-SIM2, ... + * dtacct : [IN] account id + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * VMINT hl_dtacct_cb(VMUINT32 dtacct) + * { + * vm_dtacct_set(0, dtacct); + * } + * void hl_dtacct_sample(void) + * { + * vm_dtacct_select(0, hl_dtacct_cb); + * } + * + *****************************************************************************/ +VMINT vm_dtacct_set(VMINT sim_id, VMUINT32 dtacct); + +/***************************************************************************** + * FUNCTION + * vm_dtacct_select + * DESCRIPTION + * show the current available data account list of the required sim_id. call back app when user selected + * one of them. app may record this data account value, for the vm_dtacct_set if necessary. + * PARAMETERS + * sim_id : [IN] SIM index, eg: 0-SIM1, 1-SIM2, ... + * dtacct : [IN] account id + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * VMINT hl_dtacct_cb(VMUINT32 dtacct) + * { + * vm_dtacct_set(0, dtacct); + * } + * void hl_dtacct_sample(void) + * { + * vm_dtacct_select(0, hl_dtacct_cb); + * } + * + *****************************************************************************/ +VMINT vm_dtacct_select(VMINT sim_id, VMINT (*callback)(VMUINT32 dtacct)); + + + +typedef enum +{ + VM_RES_TYPE_TCP, + VM_RES_TYPE_UDP, + VM_RES_TYPE_HTTP, + VM_RES_TYPE_HTTPS +}vm_res_type_t; + +/***************************************************************************** + * FUNCTION + * vm_cbm_hold_bearer + * DESCRIPTION + * hold the bearer. + * PARAMETERS + * type : [IN] vm_res_type_t + * hdl : [IN] TCP : hdl = vm_tcp_connect + * UDP : hdl = vm_udp_create + * HTTP : hdl = vm_http_get_current_handle + * hdl = vm_http_fetch_handle + * HTTPS : channel id + * RETURN VALUES + * success if 0, failure if less than 0 + * EXAMPLE + * + * static VMINT g_tcp_hd; + * void tcp_cb(VMINT handle, VMINT event) + * { + * VMINT ret = 0; + * if (VM_TCP_EVT_CONNECTED == event || VM_TCP_EVT_CAN_WRITE == event) + * { + * ret = vm_cbm_hold_bearer(VM_RES_TYPE_TCP, handle); + * ret = vm_tcp_write(handle, "GET / HTTP/1.1\r\nHOST:www.mediate.com:80\r\n\r\n", strlen("GET / HTTP/1.1\r\nHOST:www.mediate.com:80\r\n\r\n")); + * } + * if (VM_TCP_EVT_CAN_READ == event) + * { + * VMCHAR buf[2048] = {0}; + * ret = vm_tcp_read(handle, buf, 2048); + * vm_tcp_close(handle); + * } + * } + * void handle_keyevt(VMINT event, VMINT keycode) { + * { + * if (VM_KEY_EVENT_UP == event) + * { + * if (VM_KEY_VOL_UP == keycode || + * VM_KEY_UP == keycode) + * { + * g_tcp_hd = vm_tcp_connect("http://www.mediatek.com", 80, VM_TCP_APN_CMNET, tcp_cb); + * } + * if (VM_KEY_VOL_DOWN == keycode || + * VM_KEY_DOWN == keycode) + * { + * vm_cbm_release_bearer(); + * } + * } + * } + * + *****************************************************************************/ +VMINT vm_cbm_hold_bearer(vm_res_type_t type, VMINT hdl); + +/***************************************************************************** + * FUNCTION + * vm_cbm_release_bearer + * DESCRIPTION + * hold the bearer. + * RETURN VALUES + * success if 0, failure if less than 0 + * EXAMPLE + * + * static VMINT g_tcp_hd; + * void tcp_cb(VMINT handle, VMINT event) + * { + * VMINT ret = 0; + * if (VM_TCP_EVT_CONNECTED == event || VM_TCP_EVT_CAN_WRITE == event) + * { + * ret = vm_cbm_hold_bearer(VM_RES_TYPE_TCP, handle); + * ret = vm_tcp_write(handle, "GET / HTTP/1.1\r\nHOST:www.mediate.com:80\r\n\r\n", strlen("GET / HTTP/1.1\r\nHOST:www.mediate.com:80\r\n\r\n")); + * } + * if (VM_TCP_EVT_CAN_READ == event) + * { + * VMCHAR buf[2048] = {0}; + * ret = vm_tcp_read(handle, buf, 2048); + * vm_tcp_close(handle); + * } + * } + * void handle_keyevt(VMINT event, VMINT keycode) { + * { + * if (VM_KEY_EVENT_UP == event) + * { + * if (VM_KEY_VOL_UP == keycode || + * VM_KEY_UP == keycode) + * { + * g_tcp_hd = vm_tcp_connect("http://www.mediatek.com", 80, VM_TCP_APN_CMNET, tcp_cb); + * } + * if (VM_KEY_VOL_DOWN == keycode || + * VM_KEY_DOWN == keycode) + * { + * vm_cbm_release_bearer(); + * } + * } + * } + * + *****************************************************************************/ +VMINT vm_cbm_release_bearer(void); + +/* Data account profile maximum size */ +#define VM_SRV_DTCNT_PROF_MAX (32) +/* Data account address maximum size */ +#define VM_SRV_DTCNT_IP_MAX (64) + +/* Data account information */ +typedef struct +{ + VMUINT8 APN[VM_SRV_DTCNT_PROF_MAX]; /* account name */ + VMUINT8 PrimaryAddr[VM_SRV_DTCNT_IP_MAX]; /* Primary DNS IP Address (ASCII) */ + VMUINT8 use_proxy; /* use proxy flag */ + VMUINT8 UserName[VM_SRV_DTCNT_PROF_MAX]; /* User string of a Data Account (ASCII) */ + VMUINT8 Passwd[VM_SRV_DTCNT_PROF_MAX]; /* Password for a Data Account (ASCII) */ + VMUINT8 px_addr[VM_SRV_DTCNT_IP_MAX]; /* proxy addr string IP format (ASCII)*/ + VMUINT16 px_port; /* proxy port */ +}vm_dtcnt_info_t; + +/***************************************************************************** + * FUNCTION + * vm_set_cust_apn_info + * DESCRIPTION + * set customized apn info. if successful, it will output data account(*dtacct) which value could be + * passed to 'vm_dtacct_set'. VM_APN_USER_DEFINE should be the param when do operation of network. + * PARAMETERS + * info : [IN] refer to vm_dtcnt_info_t + * dtacct : [OUT] data account id + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * static VMINT g_hdl; + * void callback(VMINT handle, VMINT event) + * { + * vm_trace("cnt cb[%d][%d]", handle, event); + * } + * void handle_keyevt(VMINT event, VMINT keycode) { + * vm_dtcnt_info_t info = {0}; + * if (VM_KEY_EVENT_UP == event) + * { + * if (VM_KEY_UP == keycode || + * VM_KEY_VOL_UP == keycode) + * { + * VMUINT32 dtacct = 0; + * VMINT ret = 0; + * strcpy(info.APN, "cust apn"); + * strcpy(info.px_addr, "10.0.0.172"); + * info.px_port = 80; + * info.use_proxy = 1; + * ret = vm_set_cust_apn_info(&info, &dtacct); + * ret = vm_dtacct_set(0, dtacct); + * ret = vm_get_cust_apn_info(&info); + * if (0 != strcmp(info.px_addr, "0.0.0.0") && 0 != info.px_port) + * { + * ret = vm_tcp_connect((const char*)info.px_addr, info.px_port, 6, callback); + * if (ret >= 0) + * { + * g_hdl = ret; + * } + * } + * else + * { + * ret = vm_tcp_connect((const char*)"www.mediatek.com", 80, 6, callback); + * if (ret >= 0) + * { + * g_hdl = ret; + * } + * } + * ret = 0; + * } + * if (VM_KEY_DOWN == keycode || + * VM_KEY_VOL_DOWN == keycode) + * { + * VMINT ret = 0; + * ret = vm_get_cust_apn_info(&info); + * vm_tcp_close(g_hdl); + * ret = 0; + * } + * } + * } + * + *****************************************************************************/ +VMINT vm_set_cust_apn_info(const vm_dtcnt_info_t * info, VMUINT32 * dtacct); + +/***************************************************************************** + * FUNCTION + * vm_get_cust_apn_info + * DESCRIPTION + * get customized apn info. + * PARAMETERS + * info : [IN] refer to vm_dtcnt_info_t + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * static VMINT g_hdl; + * void callback(VMINT handle, VMINT event) + * { + * vm_trace("cnt cb[%d][%d]", handle, event); + * } + * void handle_keyevt(VMINT event, VMINT keycode) { + * vm_dtcnt_info_t info = {0}; + * if (VM_KEY_EVENT_UP == event) + * { + * if (VM_KEY_UP == keycode || + * VM_KEY_VOL_UP == keycode) + * { + * VMUINT32 dtacct = 0; + * VMINT ret = 0; + * strcpy(info.APN, "cust apn"); + * strcpy(info.px_addr, "10.0.0.172"); + * info.px_port = 80; + * info.use_proxy = 1; + * ret = vm_set_cust_apn_info(&info, &dtacct); + * ret = vm_dtacct_set(0, dtacct); + * ret = vm_get_cust_apn_info(&info); + * if (0 != strcmp(info.px_addr, "0.0.0.0") && 0 != info.px_port) + * { + * ret = vm_tcp_connect((const char*)info.px_addr, info.px_port, 6, callback); + * if (ret >= 0) + * { + * g_hdl = ret; + * } + * } + * else + * { + * ret = vm_tcp_connect((const char*)"www.mediatek.com", 80, 6, callback); + * if (ret >= 0) + * { + * g_hdl = ret; + * } + * } + * ret = 0; + * } + * if (VM_KEY_DOWN == keycode || + * VM_KEY_VOL_DOWN == keycode) + * { + * VMINT ret = 0; + * ret = vm_get_cust_apn_info(&info); + * vm_tcp_close(g_hdl); + * ret = 0; + * } + * } + * } + * + *****************************************************************************/ +VMINT vm_get_cust_apn_info(vm_dtcnt_info_t * info); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_perfer + * DESCRIPTION + * disable wlan perfer. + * PARAMETERS + * disable : [IN] disable if no-zero, or else is default. + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * static void tst_cb(VMINT i, VMINT j) + * { + * } + * void handle_keyevt(VMINT event, VMINT keycode) { + * + * VMINT ret = 0; + * VMUINT id; + * if (VM_KEY_EVENT_UP == event && + * VM_KEY_VOL_UP == keycode) + * { + * ret = vm_wlan_perfer(1); + * vm_get_encoded_dtacct_id(VM_TCP_APN_CMNET, &id); + * vm_trace("prefer 1[%d][0x%x]", ret, id); + * } + * if (VM_KEY_EVENT_UP == event && + * VM_KEY_VOL_UP == keycode) + * { + * ret = vm_wlan_perfer(0); + * vm_get_encoded_dtacct_id(VM_TCP_APN_CMNET, &id); + * vm_trace("prefer 0[%d][0x%x]", ret, id); + * } + * ret = vm_tcp_connect((VMCHAR*)"www.mediatek.com", 80, 1, tst_cb); + * vm_trace("connect [%d]", ret); + * } + * + *****************************************************************************/ +VMINT vm_wlan_perfer(VMINT disable); + +#ifdef __cplusplus +} +#endif + +#endif /* VMCONN_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmcontact.h b/hardware/arduino/mtk/system/libmtk/include/vmcontact.h new file mode 100644 index 00000000..4786fb08 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmcontact.h @@ -0,0 +1,402 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMPHONEBOOK_SDK_H_ +#define VMPHONEBOOK_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* The maximum length of searching pattern string */ +#define VM_PHB_MAX_SEARCH_LENGTH 60 + +/* Returned basic error codes */ +typedef enum +{ + VM_PHB_REQ_NOT_READY = -2, /* Phonebook is not ready */ + VM_PHB_REQ_ERROR, /* Operation unsuccessful */ + VM_PHB_REQ_NO_ERROR /* Operation successful */ +} vm_phb_req_error_enum; + +/* Error codes */ +typedef enum +{ + VM_PHB_NAME_MODIFIED = 1, /* Name has been truncated due to length exceed SIM MAX name length. */ + VM_PHB_NO_ERROR = 0, /* Operation successful */ + VM_PHB_ERROR = -1, /* General failure */ + VM_PHB_NOT_READY = -2, /* Phonebook is not ready */ + VM_PHB_NUM_NOT_READY = -3, /* Search operation is not ready */ + VM_PHB_NOT_SUPPORT = -4, /* Phonebook not supported */ + VM_PHB_NOT_FOUND = -5, /* No contact found */ + VM_PHB_DATAMGR_BUSY = -6, /* Phonebook is busy */ + VM_PHB_STORAGE_FULL = -7, /* Storage is full */ + VM_PHB_NO_SIM_CARD = -8, /* No SIM card */ + VM_PHB_ADN_FORBID = -9, /* Failed to visit phonebook in SIM card */ + VM_PHB_OUT_OF_INDEX = -10, /* Invalid index */ + VM_PHB_NUMBER_TOO_LONG = -11, /* Invalid number */ + VM_PHB_BIRTHDAY_ERROR = -12 /* Invalid birthday format */ +} vm_phb_error_enum; + +/* Storage location of phonebook */ +typedef enum +{ + VM_PHB_STORAGE_LOC_SIM = 1, /* SIM card 1 */ + VM_PHB_STORAGE_LOC_PHONE, /* Phone */ + VM_PHB_STORAGE_LOC_SIM2, /* SIM card 2 */ + VM_PHB_STORAGE_LOC_SIM3, /* SIM card 3 */ + VM_PHB_STORAGE_LOC_SIM4, /* SIM card 4 */ + VM_PHB_STORAGE_LOC_BOTH /* Both SIM card and Phone */ +} vm_phb_storage_loc_enum; + +/* Search type */ +typedef enum +{ + VM_PHB_SEARCH_TYPE_NAME, /* Name */ + VM_PHB_SEARCH_TYPE_NUM /* Number */ +} vm_phb_search_type_enum; + +/* Phonebook contact position struct */ +typedef struct +{ + VMUSHORT index; /* Index: 1 - MAX index. It will not change the position of other contact when deleting a contact. */ + vm_phb_storage_loc_enum storage; /* Storage location of phonebook */ +} vm_phb_contact_pos_struct; + +#define VM_MAX_PHB_NAME_LENGTH 30 /* Max length of name */ +#define VM_MAX_PHB_NUMBER_LENGTH 40 /* Max length of number */ +#define VM_MAX_PHB_EMAIL_LENGTH 60 /* Max length of email */ +#define VM_MAX_PHB_COMPANY_LENGTH 20 /* Max length of company */ +#define VM_MAX_PHB_TITLE_LENGTH 20 /* Max length of title */ +#define VM_MAX_PHB_URL_LENGTH 128 /* Max length of url */ +#define VM_MAX_PHB_ADDRESS_LENGTH 25 /* Max length of address */ +#define VM_MAX_PHB_NOTE_LENGTH 30 /* Max length of note */ +#define VM_MAX_PHB_GROUP_NAME_LENGTH 20 /* Max length of group name */ + + /* Phonebook contact info struct, all the string are encoded by UCS2. */ +typedef struct +{ + vm_phb_contact_pos_struct pos; /* Contact position */ + VMUWCHAR name[VM_MAX_PHB_NAME_LENGTH + 1]; /* Contact name field (UCS2) */ + VMUWCHAR number[VM_MAX_PHB_NUMBER_LENGTH + 1 + 1]; /* Contact mobile number field (UCS2) */ + VMUWCHAR home_number[VM_MAX_PHB_NUMBER_LENGTH + 1 + 1]; /* Contact home number field (UCS2) */ + VMUWCHAR office_number[VM_MAX_PHB_NUMBER_LENGTH + 1 + 1]; /* Contact office number field (UCS2) */ + VMUWCHAR fax_number[VM_MAX_PHB_NUMBER_LENGTH + 1 + 1]; /* Contact fax number field (UCS2) */ + VMUWCHAR email_address[VM_MAX_PHB_EMAIL_LENGTH + 1]; /* Contact email field (UCS2) */ + VMUWCHAR email_address2[VM_MAX_PHB_EMAIL_LENGTH + 1]; /* Contact email2 field (UCS2) */ + VMUWCHAR company_name[VM_MAX_PHB_COMPANY_LENGTH + 1]; /* Contact company name field (UCS2) */ + VMUCHAR birth_day; /* Contact birthday-day field */ + VMUCHAR birth_mon; /* Contact birthday-month field */ + VMUINT16 birth_year; /* contact birthday-year field */ + VMUWCHAR title[VM_MAX_PHB_TITLE_LENGTH + 1]; /* Contact title field (UCS2) */ + VMUWCHAR url[VM_MAX_PHB_URL_LENGTH + 1]; /* Contact url field (UCS2) */ + VMUWCHAR adr_pobox[VM_MAX_PHB_ADDRESS_LENGTH + 1]; /* Contact address-pobox field (UCS2) */ + VMUWCHAR adr_extension[VM_MAX_PHB_ADDRESS_LENGTH + 1]; /* Contact address-extention field (UCS2) */ + VMUWCHAR adr_street[VM_MAX_PHB_ADDRESS_LENGTH + 1]; /* Contact address-street field (UCS2) */ + VMUWCHAR adr_city[VM_MAX_PHB_ADDRESS_LENGTH + 1]; /* Contact address-city field (UCS2) */ + VMUWCHAR adr_state[VM_MAX_PHB_ADDRESS_LENGTH + 1]; /* Contact address-state field (UCS2) */ + VMUWCHAR adr_postal_code[VM_MAX_PHB_ADDRESS_LENGTH + 1]; /* Contact address-postal code field (UCS2) */ + VMUWCHAR adr_country[VM_MAX_PHB_ADDRESS_LENGTH + 1]; /* Contact address-country field (UCS2) */ + VMUWCHAR note[VM_MAX_PHB_NOTE_LENGTH + 1]; /* Contact note field (UCS2) */ + VMUINT group_mask; /* Contact group field(bitmask), a contact can have multiple group id. (group_mask = 1<< group_id1 + 1<< group_id2 + ... . If group_mask=1, then group_id=0; if group_mask=3, then group_id=0 group_id=1) */ +} vm_phb_contact_struct; + +/* Phonebook group struct */ +typedef struct +{ + VMUINT group_id; /* Group id */ + VMWCHAR group_name[VM_MAX_PHB_GROUP_NAME_LENGTH + 1]; /* Group name */ +} vm_phb_group_struct; + +/***************************************************************************** + * + * + * FUNCTION + * vm_phb_callback_type + * DESCRIPTION + * Callback function type for phonebook operation. + * PARAMETERS + * result : [IN] Operation result, refer to vm_phb_error_enum. + * contact_ptr : [IN] Pointer to contact info, as a part of request data when sending request. + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_phb_callback_type) (VMINT result, vm_phb_contact_struct *contact_ptr); + +/* Phonebook contact add request info struct */ +typedef struct +{ + vm_phb_storage_loc_enum storage; /* Storage location of phonebook */ + vm_phb_contact_struct *contact_ptr; /* Phonebook contact info */ +} vm_phb_add_req_struct; + +/* Phonebook contact delete request info struct */ +typedef struct +{ + vm_phb_contact_pos_struct pos; /* Contact position */ +} vm_phb_delete_req_struct; + +/* Phonebook contact update request info struct */ +typedef struct +{ + vm_phb_contact_pos_struct pos; /* Contact position */ + vm_phb_contact_struct *contact_ptr; /* Phonebook contact info */ +} vm_phb_update_req_struct; + +/* Contact get request info struct */ +typedef struct +{ + vm_phb_contact_pos_struct pos; /* Contact position */ + vm_phb_contact_struct *contact_ptr; /* Phonebook contact info */ +} vm_phb_get_req_struct; + +/* Search contact request info struct */ +typedef struct +{ + VMWCHAR pattern_ucs2[VM_PHB_MAX_SEARCH_LENGTH]; /* Search pattern(UCS2) */ + vm_phb_search_type_enum search_type; /* Search type */ + vm_phb_contact_struct *contact_ptr; /* Pointer to contact info, this pointer will be returned by callback function */ +} vm_phb_search_req_struct; + + /* Search contact list request info struct */ +typedef struct +{ + VMWCHAR pattern_ucs2[VM_PHB_MAX_SEARCH_LENGTH]; /* Search pattern(UCS2) */ + vm_phb_search_type_enum search_type; /* Search type */ +} vm_phb_search_list_req_struct; + + /***************************************************************************** + * FUNCTION + * vm_phb_add_contact + * DESCRIPTION + * Add a phonebook contact. If you want to add multiple contacts, + * the next contact must be added after the callback function returns. + * PARAMETERS + * req_info : [IN] Contact's info. If added successfully, the content and location info can be obtained by the callback function. + * cb : [IN] Callback function. + * RETURNS + * The error code of the operation. Refer to vm_phb_req_error_enum. + *****************************************************************************/ +vm_phb_req_error_enum vm_phb_add_contact(vm_phb_add_req_struct *req_info, vm_phb_callback_type cb); + + /***************************************************************************** + * FUNCTION + * vm_phb_delete_contact + * DESCRIPTION + * Delete a phonebook contact. If you want to delete multiple contacts, + * the next contact must be deleted after the callback function returns. + * PARAMETERS + * req_info : [IN] Delete contact request info. + * cb : [IN] Callback function. + * RETURNS + * The error code of the operation. Refer to vm_phb_req_error_enum. + *****************************************************************************/ +vm_phb_req_error_enum vm_phb_delete_contact(vm_phb_delete_req_struct *req_info, vm_phb_callback_type cb); + + /***************************************************************************** + * FUNCTION + * vm_phb_update_contact + * DESCRIPTION + * Edit a phonebook contact. If you want to edit multiple contacts, + * the next contact must be edited after the callback function returns. + * PARAMETERS + * req_info : [IN] Contact's info. + * cb : [IN] Callback function. + * RETURNS + * The error code of the operation. Refer to vm_phb_req_error_enum. + *****************************************************************************/ +vm_phb_req_error_enum vm_phb_update_contact(vm_phb_update_req_struct *req_info, vm_phb_callback_type cb); + + /***************************************************************************** + * FUNCTION + * vm_phb_search_contact + * DESCRIPTION + * Search a contact by name or number. The matching contact of every searching is returned by callback function. + * PARAMETERS + * req_info : [IN] Search request info. + * cb : [IN] Callback function. + * RETURNS + * The error code of the operation. Refer to vm_phb_req_error_enum. + *****************************************************************************/ +vm_phb_req_error_enum vm_phb_search_contact(vm_phb_search_req_struct *req_info, vm_phb_callback_type cb); + + /***************************************************************************** + * FUNCTION + * vm_phb_search_contact_list + * DESCRIPTION + * Search contact list by name or number. The matching contact list will be filled to pos_array. + * PARAMETERS + * req_info : [IN] Search request info. + * pos_array : [OUT] Buffer to all the matching contacts. + * post_array_len : [IN] Buffer size. + * RETURNS + * The number of matching contacts. + *****************************************************************************/ +VMINT vm_phb_search_contact_list( + vm_phb_search_list_req_struct *req_info, + vm_phb_contact_pos_struct *pos_array, + VMINT post_array_len); + + /***************************************************************************** + * FUNCTION + * vm_phb_get_contact + * DESCRIPTION + * Get contact's info by position, and the info will be returned by callback function. + * PARAMETERS + * req_info : [IN] Pointer to request info. + * cb : [IN] Callback function. + * RETURNS + * The error code of the operation. Refer to vm_phb_req_error_enum. + *****************************************************************************/ +vm_phb_req_error_enum vm_phb_get_contact(vm_phb_get_req_struct *req_info, vm_phb_callback_type cb); + +/***************************************************************************** + * FUNCTION + * vm_phb_search_contact_syn + * DESCRIPTION + * Search a contact by name or number synchronously. + * PARAMETERS + * req_info : [IN] Pointer to request info. + * RETURNS + * The error code of the operation. Refer to vm_phb_req_error_enum. + *****************************************************************************/ +vm_phb_req_error_enum vm_phb_search_contact_syn(vm_phb_search_req_struct *req_info); + +/***************************************************************************** + * FUNCTION + * vm_phb_get_contact_syn + * DESCRIPTION + * Get contact's info by position synchronously. + * PARAMETERS + * req_info : [IN] Pointer to request info. + * RETURNS + * The error code of the operation. Refer to vm_phb_req_error_enum. + *****************************************************************************/ +vm_phb_req_error_enum vm_phb_get_contact_syn(vm_phb_get_req_struct *req_info); + + /***************************************************************************** + * FUNCTION + * vm_phb_get_total_contacts + * DESCRIPTION + * Get total number of contacts of phonebook. + * PARAMETERS + * storage : [IN] Storage location. + * RETURNS + * The total number of contacts. + * RETURN VALUES + * <0 : Get failed. + * >0 : The total number of contacts. + *****************************************************************************/ +VMINT vm_phb_get_total_contacts(vm_phb_storage_loc_enum storage); + + /***************************************************************************** + * FUNCTION + * vm_phb_get_used_contacts + * DESCRIPTION + * Get the stored contact list by location. + * PARAMETERS + * pos_array : [OUT] Buffer stores contact list. + * storage : [IN] Storage location. + * RETURNS + * The number of stored contacts. + * RETURN VALUES + * <0 : Operation failed. + * >0 : The number of stored contacts. + *****************************************************************************/ +VMINT vm_phb_get_used_contacts(vm_phb_contact_pos_struct *pos_array, vm_phb_storage_loc_enum storage); + +/***************************************************************************** + * FUNCTION + * vm_phb_get_used_contacts_count + * DESCRIPTION + * Get the number of stored contacts in phonebook storage. + * PARAMETERS + * storage : [IN] Storage location. + * RETURNS + * The number of stored contacts. + * RETURN VALUES + * <0 : Operation failed. + * >0 : The number of stored contacts. + *****************************************************************************/ +VMINT vm_phb_get_used_contacts_count(vm_phb_storage_loc_enum storage); + +/***************************************************************************** + * FUNCTION + * vm_phb_get_group_list_count + * DESCRIPTION + * Get the number of group in phonebook. + * PARAMETERS + * void + * RETURNS + * The number of group. + *****************************************************************************/ +VMINT vm_phb_get_group_list_count(void); + +/***************************************************************************** + * FUNCTION + * vm_phb_get_group_list + * DESCRIPTION + * Get group id list ordered by group name. + * PARAMETERS + * group_array : [OUT] Buffer stores group id list. + * group_array_len : [IN] Size of the buffer. + * RETURNS + * The number of group id. + *****************************************************************************/ +VMINT vm_phb_get_group_list(vm_phb_group_struct *group_array, VMINT group_array_len); + +/***************************************************************************** + * FUNCTION + * vm_phb_get_group_name_by_id + * DESCRIPTION + * Get group name by group id. + * PARAMETERS + * group_id : [IN] Group id. + * group_name : [OUT] Buffer stores group name. + * len : [IN] Size of the buffer. + * RETURN VALUES + * TRUE : If successful. + * FALSE : If unsuccessful. + *****************************************************************************/ +VMINT vm_phb_get_group_name_by_id(VMUINT group_id, VMWCHAR *group_name, VMINT len); + +#ifdef __cplusplus +} +#endif + +#endif /* VMPHONEBOOK_SDK_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmda.h b/hardware/arduino/mtk/system/libmtk/include/vmda.h new file mode 100644 index 00000000..b658c06f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmda.h @@ -0,0 +1,194 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmpromng.c + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ + * $Log$ + * + * 04 18 2012 feng.lin + * [MAUI_03152588] MRE requirement of downloading and playing video file + * . + * + * 03 22 2012 feng.lin + * [MAUI_03152588] MRE requirement of downloading and playing video file + * . + * + * *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== + *******************************************************************************/ + +#ifndef VM_DA_SDK_H +#define VM_DA_SDK_H + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "vmsys.h" + +typedef enum +{ + VM_WPS_DL_STATUS_DOWNLOADING, /* downloading is in progress */ + VM_WPS_DL_STATUS_COMPLETE, /* complete downloading */ + VM_WPS_DL_STATUS_ABORT /* downloading is aborted */ +}vm_wps_dl_status_enum; + +typedef enum +{ + VM_WPS_OK, /* Success */ + VM_WPS_ERROR_UNKNOWN, /* Unknonw error */ + VM_WPS_ERROR_SEND, /* Fail to write content */ + VM_WPS_ERROR_INVALID_PARAM, /* Invalid parameters */ + VM_WPS_ERROR_INVALID_HEADER, /* Invalid headers */ + VM_WPS_ERROR_INVALID_CHANNEL_ID, /* Invalid channel ID */ + VM_WPS_ERROR_INVALID_REQUEST_ID, /* Invalid request ID */ + VM_WPS_ERROR_INVALID_SEQUENCE_NUM, /* Incorrect sequence number in MSG_ID_WPS_READ_CONTENT_REQ and MSG_ID_WPS_POST_CONTENT_RES */ + VM_WPS_ERROR_INVALID_DEFAULT_PROFILE, /* Invalid default profile */ + VM_WPS_ERROR_INACTIVE_CHANNEL, /* Inactive channel */ + VM_WPS_ERROR_INVALID_CONN_TYPE, /* Invalid connection type */ + VM_WPS_ERROR_NO_RESOURCE, /* Resource limitation */ + VM_WPS_ERROR_ACCESS_DENY, /* Access deny */ + VM_WPS_ERROR_PENDING_REQ_EXIST, /* Pending request exists */ + VM_WPS_ERROR_FILE_ACCESS, /* File system operation error */ + VM_WPS_ERROR_REQ_ABORT, /* Request aborted */ + VM_WPS_ERROR_NOT_FOUND, /* Not found */ + VM_WPS_ERROR_REQ_MSG_TOO_LARGE, /* Message header is too large */ + VM_WPS_ERROR_REQ_NOT_SUPPORT, /* Request is not supported */ + VM_WPS_ERROR_DNS_RESOLVE, /* DNS error */ + VM_WPS_ERROR_USE_PROXY, /* Proxy error */ + VM_WPS_ERROR_NOT_READY /* WPS is not ready yet */ +}vm_wps_result_error_enum; + +typedef enum +{ + VM_SRV_DA_DOWNLOAD_STOP = 0, /* download of operation */ + VM_SRV_DA_DOWNLOAD_PAUSE, /* pause of operation */ + VM_SRV_DA_DOWNLOAD_RESUME, /* resume of operation */ + + VM_SRV_DA_DOWNLOAD_STOP_END_OF_ENUM /* stop of operation */ +}vm_srv_da_download_cause_enum; + + +typedef struct +{ + VMINT hdl; + vm_wps_dl_status_enum status; + VMUINT32 curr_size; + VMUINT32 total_size; + VMWSTR savepath; + vm_wps_result_error_enum cause; + void *user_data; +} vm_srv_da_download_progress_struct; + +/* callback function for progress */ +typedef void (*vm_srv_da_http_progress_funcptr_type)(vm_srv_da_download_progress_struct * pgs); + +typedef struct +{ + const VMWCHAR *url;/*url for download [IN] */ + VMINT apn;/* apn, refer to vmsock.h, such as VM_TCP_APN_WIFI, VM_TCP_APN_CMNET... [IN] */ + VMINT show_confirm; /* show confirm or not, 0 show, else not [IN] */ + VMWSTR file_path; + void * user_data; + vm_srv_da_http_progress_funcptr_type dl_progress; /* callback of download progress [IN] */ +}vm_srv_da_start_download_struct; + +/* callback function for operation */ +typedef void (*vm_srv_da_http_op_funcptr_type)(VMINT hdl, vm_srv_da_download_cause_enum cause); + + +/****************************************************************************** + * FUNCTION + * vm_da_http_start_download + * DESCRIPTION + * start a download. + * PARAMETERS + * arg : [IN] refer to vm_srv_da_start_download_struct + * RETURNS + * VMINT job handle if > 0, failure if less than 0, + ******************************************************************************/ +VMINT vm_da_http_start_download(vm_srv_da_start_download_struct * arg); + +/****************************************************************************** + * FUNCTION + * vm_da_http_dl_operation + * DESCRIPTION + * operation of download agent. + * PARAMETERS + * hdl : [IN] download job handler + * cause : [IN] refer to vm_srv_da_download_cause_enum + * RETURNS + * VMINT 0 if successful, else failure + ******************************************************************************/ +VMINT vm_da_http_dl_operation(VMINT hdl, vm_srv_da_download_cause_enum cause); + +/****************************************************************************** + * FUNCTION + * vm_da_display_download_list + * DESCRIPTION + * display download list. + * RETURNS + * VMINT 0 if successful, else failure + ******************************************************************************/ +VMINT vm_da_display_download_list(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* VM_DA_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdatetime.h b/hardware/arduino/mtk/system/libmtk/include/vmdatetime.h new file mode 100644 index 00000000..7c92f0ad --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdatetime.h @@ -0,0 +1,185 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmdatetime_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * date time + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_DATETIME_SDK_H +#define VM_DATETIME_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ +#include "vmsys.h" +/*vm_time_t*/ +typedef struct vm_time_t { + VMINT year; /*year*/ + VMINT mon; /* month, begin from 1 */ + VMINT day; /* day,begin from 1 */ + VMINT hour; /* house, 24-hour */ + VMINT min; /* minute */ + VMINT sec; /* second */ +} vm_time_t; + + +/***************************************************************************** + * FUNCTION + * vm_get_time + * DESCRIPTION + * get current system time + * PARAMETERS + * time : [OUT] time structure + * RETURNS + * if succeed, return 0, otherwise return -1 + *****************************************************************************/ +VMINT vm_get_time(vm_time_t* time); + +/***************************************************************************** + * FUNCTION + * vm_get_sys_time_zone + * DESCRIPTION + * get system time zone + * PARAMETERS + * void + * RETURNS + * GMT value + *****************************************************************************/ +float vm_get_sys_time_zone(void); + +/***************************************************************************** + * FUNCTION + * vm_get_curr_utc + * DESCRIPTION + * Get the time(the rtc time,not the utc) since the Epoch (00:00:00 UTC, January 1, 1970), + * measured in seconds.phase out, replace by vm_get_rtc() + * PARAMETERS + * utc : [OUT] point to the time in seconds. + * RETURNS + * if succeed, return 0, otherwise failure. + *****************************************************************************/ +VMINT vm_get_curr_utc(VMUINT * utc); + +/***************************************************************************** + * FUNCTION + * vm_get_rtc + * DESCRIPTION + * Get the time since the Epoch (00:00:00 UTC, January 1, 1970), + * measured in seconds. + * PARAMETERS + * utc : [OUT] point to the time in seconds. + * RETURNS + * if succeed, return 0, otherwise failure. + *****************************************************************************/ +VMINT vm_get_rtc(VMUINT * rtc); + +/***************************************************************************** + * FUNCTION + * vm_get_tick_count + * DESCRIPTION + * get millisecond number from the system power on till now + * PARAMETERS + * void + * RETURNS + * millisecond number from the system power on till now + *****************************************************************************/ +VMINT vm_get_tick_count(void); + +/* DOM-NOT_FOR_SDK-BEGIN */ +/***************************************************************************** + * FUNCTION + * get_today_from_2000 + * DESCRIPTION + * get the number of day from 2000/01/01 to now. + * RETURNS + * number of day, -1 means failed. + *****************************************************************************/ +VMINT get_today_from_2000(void); +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** + * FUNCTION + * vm_ust_get_current_time + * DESCRIPTION + * get microsecond from the system power on till now. + * RETURNS + * microsecond number from the system power on till now + * + * start = vm_ust_get_current_time(); + * + *****************************************************************************/ +VMUINT32 vm_ust_get_current_time(); + +/***************************************************************************** + * FUNCTION + * vm_ust_get_duration + * DESCRIPTION + * get the duration from start to end + * RETURNS + * the duration + * + * start = vm_ust_get_current_time(); + * ... + * end = vm_ust_get_current_time(); + * duration = vm_ust_get_duration(start,end); + * + *****************************************************************************/ + VMUINT32 vm_ust_get_duration(VMUINT32 start,VMUINT32 end); + +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_DATETIME_SDK_H*/ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdcl.h b/hardware/arduino/mtk/system/libmtk/include/vmdcl.h new file mode 100644 index 00000000..c50ea597 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdcl.h @@ -0,0 +1,517 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef __VM_DCL_H__ +#define __VM_DCL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_DEV is the type used to represent a special device such as UART,I2C,GPIO and so on. + * The value for every device group is defined in VM_DCL_DEV_T. + * The value of a special device is defined in the header file of the device. + *****************************************************************************/ +typedef VMUINT16 VM_DCL_DEV; +/***************************************************************************** + * DESCRIPTION + * VM_DCL_FLAGS is the type used to represent the flag that pass to the vm_dcl_open. + * The value depend on each special device. + *****************************************************************************/ +typedef VMUINT32 VM_DCL_FLAGS; + + + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_OPTIONS is the type used to pass some special option to the read/write API. + * The value depend on each special device. + *****************************************************************************/ +typedef VMUINT32 VM_DCL_OPTIONS; + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_HANDLE is the type used to record a specific device that opened by vm_dcl_open. + * This value will be pass to other API to tell the driver which device will response to the corresponding operation. + *****************************************************************************/ +typedef VMINT32 VM_DCL_HANDLE; +/*Represent invalid handle, returned by vm_dcl_open.*/ +#define VM_DCL_HANDLE_INVALID (-1) + + +/* VM_DCL_BUFF is the type of the buffer*/ +typedef VMUCHAR VM_DCL_BUFF; +/* VM_DCL_BUFF_LEN is the type of the buffer length*/ +typedef VMUINT32 VM_DCL_BUFF_LEN; + + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_EVENT is the type used to represent event. + * The event usually represent a specific hardware condition changed, such as data transfer finished. + * This type value is used in asynchronous operations, please reference VM_DCL_EVENT_T + *****************************************************************************/ +typedef VMUINT32 VM_DCL_EVENT; + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_CALLBACK is the prototype of the call back function. + * PARAMETERS + * parameter: [IN] This pointer is the data structure pointer that driver pass to user. + * The real type of this value should be VM_DCL_CB_ILM_DATA_T. + * The detail of this structure will be given by the driver. + * event: [IN] The event identify which condition that this call back triggered by. + *device_handle: [IN] This handle represent the device that trigger this callback. + * RETURNS + * The return value is void. + * + * RETURN VALUES + * None + * EXAMPLE + * + * //This example explain how to implement the callback. + * void uart_callback(void* parameter, VM_DCL_EVENT event, VM_DCL_HANDLE device_handle){ + * VM_DCL_CB_ILM_DATA_T* uart_para = (VM_DCL_CB_ILM_DATA_T*)parameter; + * if(VM_UART_READY_TO_READ==event){ + * vm_sio_ctrl_get_bytes_t* get_byte=(vm_sio_ctrl_get_bytes_t*)(uart_para->vm_local_para_ptr); + * vm_log_info("UART read callback!!!"); + * }else if(VM_UART_READY_TO_WRITE==event){ + * vm_sio_ctrl_put_bytes_t* put_byte = (vm_sio_ctrl_put_bytes_t*)(uart_para->vm_local_para_ptr); + * vm_log_info("UART write callback!!!"); + * }else{ + * vm_log_info("Wrong callback event!!!"); + * } + * } + * + *****************************************************************************/ +typedef void (*VM_DCL_CALLBACK)(void* parameter, VM_DCL_EVENT event, VM_DCL_HANDLE device_handle); + + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_CTRL_CMD is the type used to represent the operation the driver need to do. + * The value of the type variable is depend on specific device driver. + * The detail please reference to the command enum of driver. + * Please find different command for difference driver: + * SIO: VM_DCL_SIO_CTRL_CMD + * I2C: VM_DCL_I2C_CTRL_CMD_T + * SPI: VM_SPI_IOCTL_CODE + * ADC: VM_DCL_ADC_CTRL_CMD_T + * GPIO: VM_DCL_GPIO_CTRL_CMD_T + * PMU: VM_DCL_PMU_CTRL_CMD_T + * EINT: VM_DCL_EINT_CMD_T + *****************************************************************************/ +typedef VMUINT32 VM_DCL_CTRL_CMD; + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_STATUS is the type used to represent the status the driver returned. + * The meaning of the value please reference to VM_DCL_STATUS_T. + *****************************************************************************/ +typedef VMINT32 VM_DCL_STATUS; + +/***************************************************************************** +*This is the type used for callback transfer data from driver. +*The callback's parameter is always this type. +*Most of the time, the data send back by driver was wrapped in the vm_local_para_ptr, sometimes in vm_peer_buff_ptr. +*Different device driver has different specific type for these two parameter. +*****************************************************************************/ +typedef struct{ + void *vm_local_para_ptr; /* local_para pointer */ + void *vm_peer_buff_ptr; /* peer_buff pointer */ +}VM_DCL_CB_ILM_DATA_T; + +/* This used to represent the status of dcl operations.*/ +typedef enum +{ + VM_DCL_STATUS_OK = 0, /*Operation success*/ + VM_DCL_STATUS_FAIL = -1, /*Operation failed*/ + VM_DCL_STATUS_INVALID_CMD = -2, /*The command send to device is invalid*/ + VM_DCL_STATUS_UNSUPPORTED = -3, /*The device do not support the operation*/ + VM_DCL_STATUS_NOT_OPENED = -4, /*The device isn't open*/ + VM_DCL_STATUS_INVALID_EVENT = -5, /*The event is invalid*/ + VM_DCL_STATUS_INVALID_DCL_HANDLE = -6, /*The handle used to operate the device is invalid. The invalid handle returned by vm_dcl_open is another value.*/ + VM_DCL_STATUS_INVALID_CTRL_DATA = -7, /*The data used to control the device is invalid.*/ + VM_DCL_STATUS_INVALID_ARGUMENT = -9, /*The data used to control the device is invalid.*/ + VM_DCL_STATUS_ERROR_TIMEOUT = -10, /*Operation timeout.*/ + VM_DCL_STATUS_ERROR_CRCERROR = -11, /*CRC error.*/ + VM_DCL_STATUS_ERROR_READONLY = -12, /*device is readonly.*/ + VM_DCL_STATUS_ERROR_WRONG_STATE = -13, /*wrong state.*/ + VM_DCL_STATUS_INVALID_DEVICE = -14, /*invalid device.*/ + VM_DCL_STATUS_ALREADY_OPENED = -15, /*device is already opened.*/ + VM_DCL_STATUS_INVALID_OPERATION = -17, /*operation is invalid.*/ + VM_DCL_STATUS_DEVICE_NOT_EXIST = -18,/*device is not exist.*/ + VM_DCL_STATUS_DEVICE_IS_BUSY = -20,/*device is busy.*/ +} VM_DCL_STATUS_T; + +/***************************************************************************** +*This is the type used for vm_dcl_get_ownerid. +*This value may be have different meaning for the same value. +*So MUST use the vm_dcl_get_ownerid to get the correct value at runtime. +*****************************************************************************/ +typedef enum{ + VM_MODULE_START = 0,/*give the start number*/ + VM_MODULE_END = 0x1FF/*set the end number*/ +}VM_DCL_MODULE_TYPE_T; + + + +/***************************************************************************** +*This is the device number group enum. +*Each group device may have several devices. +*The specific device number please reference to the device driver. +*****************************************************************************/ +typedef enum +{ + VM_DCL_SIO_GROUP_START = 0, /*SIO(Uart,USB) device number starts. Please reference VM_DCL_SIO_DEV_T*/ + VM_DCL_I2C_GROUP_START = 0x100,/*I2C device number starts. Please reference VM_DCL_I2C_DEV_T*/ + VM_DCL_SPI_GROUP_START = 0x200, /*SPI device number starts. Please reference VM_DCL_SPI_DEV_T*/ + VM_DCL_ADC_GROUP_START = 0x300, /*ADC device number starts. Please reference VM_DCL_ADC_DEV_T*/ + VM_DCL_GPIO_GROUP_START = 0x400, /*GPIO device number starts. Please reference VM_DCL_GPIO_DEV_T*/ + VM_DCL_PWM_GROUP_START = 0x500, /*PWM device number starts. Please reference VM_DCL_PWM_DEV_T*/ + VM_DCL_PMU_GROUP_START = 0xB00, /*PMU device number starts. Please reference VM_DCL_PMU_DEV_T*/ + VM_DCL_EINT_GROUP_START = 0x1C00 /* EINT device number starts. Please reference VM_DCL_EINT_DEV_T*/ +} VM_DCL_DEV_T; + +/***************************************************************************** +*This is the event number group enum. +*Each group device may have several events. Some device may not need the event. +*The specific event number and the meaning please reference to the device driver. +*****************************************************************************/ +typedef enum +{ + VM_EVENT_NULL = 0, + VM_GPIO_EVENTS_START = 0x100, /*for GPIO*/ + VM_ADC_EVENTS_START = 0x600, /*for ADC, please reference VM_DCL_ADC_EVENT_T*/ + VM_I2C_EVENTS_START = 0x700, /*for I2C*/ + VM_SERIPORT_EVENTS_START = 0x1400, /*For SIO(include UART and USB), please reference VM_DCL_SIO_EVENT_T*/ + VM_SPI_EVENTS_START = 0x1500 , /*for SPI*/ + VM_EINT_EVENTS_START = 0x1600 /* for EINT , please reference VM_DCL_EINT_EVENT_T*/ +} VM_DCL_EVENT_T; + +/***************************************************************************** +* FUNCTION + * vm_dcl_open + * DESCRIPTION + * Open the device. Every device must be opened with this function before use it. + * The device number passed to this function was defined in device driver's header file. + * The returned handle is the device's identify which will be passed to the other functions at runtime. + * PARAMETERS + * device: [IN] The number of device, given by device driver. It's a 16 bits integer. + * flags: [IN] The parameter needed for the device. It's a 32 bits unsigned integer. Some driver may not need this. + * RETURNS + * The return value is the handle which record the information of corresponding device. + * + * RETURN VALUES + * DCL_HANDLE : The handle record the information of corresponding device. + * If the value of returned handle equal to VM_DCL_HANDLE_INVALID, the open operation failed. + * + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * usr_id = vm_dcl_get_ownerid(); + * //some device may not need the second parameter. + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + * //Do something with the handle. + * +*****************************************************************************/ +VM_DCL_HANDLE vm_dcl_open(VM_DCL_DEV dev, VM_DCL_FLAGS flags); +/***************************************************************************** +* FUNCTION + * vm_dcl_control + * DESCRIPTION + * Send command to control the device. + * This function used to control the device after open the device successfully. + * The command tell the driver what to do and the arg will give the information needed for the control to driver. + * The command is defined in device driver's header file and represent different meaning even have the same value + * for different device. So the handle, command and arg must be match, otherwise the operation maybe given to wrong + * device or do wrong operation. + * This function maybe synchronous or asynchronous operation depending on which devices' which command. + * The details please reference to the command description in the specific driver's document. + * PARAMETERS + * device_handle: [IN] The device handle which returned by vm_dcl_open. + * cmd: [IN] The command used to control the device. The detail reference to the device document. + * arg: [IN] The argument used by the command. The detail reference to the device document. + * RETURNS + * The return value is status. The meaning reference to VM_DCL_STATUS_T; + * + * RETURN VALUES + * DCL_STATUS : The return value is status.The meaning reference to VM_DCL_STATUS_T; + * + * EXAMPLE + * + * DCL_STATUS status; + * vm_sio_ctrl_dcb_t config; + * VM_DCL_MODULE_TYPE_T usr_id; + * VM_DCL_HANDLE uart_handle; + * + * usr_id=vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * config.u4OwenrId = usr_id; + * config.rUARTConfig.fgDSRCheck = 0; + * config.rUARTConfig.u1DataBits = 8; + * config.rUARTConfig.u1FlowControl = VM_FC_NONE; + * config.rUARTConfig.u1Parity = VM_PA_NONE; + * config.rUARTConfig.u1StopBits = VM_SB_1; + * config.rUARTConfig.u4Baud = 115200; + * config.rUARTConfig.ucXoffChar = 0x13; + * config.rUARTConfig.ucXonChar = 0x11; + * status=vm_dcl_control(uart_handle,VM_SIO_CMD_SET_DCB_CONFIG,&config); + * +*****************************************************************************/ +VM_DCL_STATUS vm_dcl_control(VM_DCL_HANDLE device_handle,VM_DCL_CTRL_CMD cmd, void* arg); + + +/***************************************************************************** +* FUNCTION + * vm_dcl_close + * DESCRIPTION + * Close the device. After the device finished the operation, user should close the device. + * Pay attention to the device operation with callback. The device should not be closed before the callback finished. + * PARAMETERS + * device_handle: [IN] The device handle which returned by vm_dcl_open. + * RETURNS + * The return value is status. The meaning reference to VM_DCL_STATUS_T; + * + * RETURN VALUES + * VM_DCL_STATUS : The return value is status.The meaning reference to VM_DCL_STATUS_T; + * +* EXAMPLE + * + * status = vm_dcl_close(i2c_handle); + * +*****************************************************************************/ +VM_DCL_STATUS vm_dcl_close(VM_DCL_HANDLE device_handle); + /***************************************************************************** +* FUNCTION + * vm_dcl_read + * DESCRIPTION + * Read data from the device. This function may not be provided by the devices that don't transfer data. + * If the device have several ways to transfer data, this function may provide some of the methods, + * others can be done bye the vm_dcl_control. The details please reference to the specific device driver document. + * PARAMETERS + * device_handle: [IN] The device handle which returned by vm_dcl_open. + * buf: [IN] The buffer used to save data. + * read_len: [IN] The number of bytes that need to be read. + * returned_len: [OUT] The number of bytes that read by device after returned. + * options: [IN] The special options need by the device. The detail reference to the device document. + * RETURNS + * The return value is status. The meaning reference to VM_DCL_STATUS_T; + * + * RETURN VALUES + * VM_DCL_STATUS : The return value is status.The meaning reference to VM_DCL_STATUS_T; + * +* EXAMPLE + * + * VM_DCL_STATUS status; + * VM_DCL_BUFF data_buffer[1024]; + * VM_DCL_BUFF_LEN returned_len; + * VM_DCL_MODULE_TYPE_T usr_id; + * VM_DCL_HANDLE uart_handle; + * usr_id=vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * status = vm_dcl_read(uart_handle,(VM_DCL_BUFF*)data_buffer,1024,&returned_len,usr_id); + * +*****************************************************************************/ +VM_DCL_STATUS vm_dcl_read(VM_DCL_HANDLE device_handle, VM_DCL_BUFF* buf, VM_DCL_BUFF_LEN read_len, VM_DCL_BUFF_LEN* returned_len,VM_DCL_OPTIONS options); +/***************************************************************************** +* FUNCTION + * vm_dcl_write + * DESCRIPTION + * Write data to the device.This function may not be provided by the devices that don't transfer data. + * If the device have several ways to transfer data, this function may provide some of the methods, + * others can be done bye the vm_dcl_control. The details please reference to the specific device driver document. + * PARAMETERS + * device_handle: [IN] The device handle which returned by vm_dcl_open. + * buf: [IN] The buffer with data that to be written. + * write_len: [IN] The number of bytes that need to write. + * written_len: [OUT] The number of bytes that written by device after returned. + * options: [IN] The special options need by the device. The detail reference to the device document. + * RETURNS + * The return value is status. The meaning reference to VM_DCL_STATUS_T; + * + * RETURN VALUES + * VM_DCL_STATUS : The return value is status.The meaning reference to VM_DCL_STATUS_T; + * +* EXAMPLE + * + * VM_DCL_STATUS status; + * VM_DCL_BUFF data_buffer[1024]; + * VM_DCL_BUFF_LEN written_len; + * VM_DCL_MODULE_TYPE_T usr_id; + * VM_DCL_HANDLE uart_handle; + * usr_id=vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * status = vm_dcl_write(uart_handle,(VM_DCL_BUFF*)data_buffer,1024,&written,usr_id); + * +*****************************************************************************/ +VM_DCL_STATUS vm_dcl_write(VM_DCL_HANDLE device_handle,VM_DCL_BUFF* buf, VM_DCL_BUFF_LEN write_len, VM_DCL_BUFF_LEN* written_len,VM_DCL_OPTIONS options); + +/***************************************************************************** +* FUNCTION + * vm_dcl_registercallback + * DESCRIPTION + * Register event callback. Before the device to do asynchronous operations, the callback function for that operation + * should be registered. The implementation of the callback please reference to the document of the callback function prototype. + * PARAMETERS + * device_handle: [IN] The device handle which returned by vm_dcl_open. + * event: [IN] The event that will triger the callback. + * callback: [IN] callback function. + * parameter: [IN] user parameter. + * RETURNS + * The return value is status. + * + * RETURN VALUES + * VM_DCL_STATUS : The return value is status. + * +* EXAMPLE + * + * VM_DCL_STATUS status; + * VM_DCL_MODULE_TYPE_T usr_id; + * VM_DCL_HANDLE uart_handle; + * usr_id=vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * status=vm_dcl_registercallback(uart_handle,VM_UART_READY_TO_WRITE ,(VM_DCL_CALLBACK)uart_callback,(void *)NULL); + * +*****************************************************************************/ +VM_DCL_STATUS vm_dcl_registercallback(VM_DCL_HANDLE device_handle,VM_DCL_EVENT event, VM_DCL_CALLBACK callback,void* user_data); + +/***************************************************************************** +* FUNCTION + * vm_dcl_addlistenevent + * DESCRIPTION + * if you want listen mluti event then you can use vm_dcl_registercallback first, and use vm_dcl_addlistenevent to add all your events + * PARAMETERS + * device_handle: [IN] The device handle which returned by vm_dcl_open. + * event: [IN] The event that will triger the callback. + * callback: [IN] The number of bytes that need to write. + * user_data: [IN] The number of bytes that written by device after returned. + * RETURNS + * The return value is status. + * + * RETURN VALUES + * VM_DCL_STATUS : The return value is status. + * +* EXAMPLE + * + * status=vm_dcl_addlistenevent(uart_handle,VM_UART_READY_TO_READ,(void *)NULL); + * +*****************************************************************************/ +VM_DCL_STATUS vm_dcl_addlistenevent(VM_DCL_HANDLE device_handle,VM_DCL_EVENT event, void* user_data); + +/***************************************************************************** +* FUNCTION + * vm_dcl_get_ownerid + * DESCRIPTION + * Get the runtime environment identify of the user. Some device may need this. + * Most of the time this function's returned value need to be passed to the driver when the device do asynchronous operations. + * PARAMETERS + * No parameter. + * RETURNS + * The return value is the owner id. + * + * RETURN VALUES + * VM_DCL_MODULE_TYPE_T : the owner id. + * +* EXAMPLE + * + * VM_DCL_MODULE_TYPE_T usr_id; + * usr_id=vm_dcl_get_ownerid(); + * +*****************************************************************************/ +VM_DCL_MODULE_TYPE_T vm_dcl_get_ownerid(void); + +/***************************************************************************** + * FUNCTION + * vm_irq_mask + * DESCRIPTION + * This interface used in AP mode, Mask the I bit of the processor. Note this function must be used in pairs with vm_irq_restore. + * And more, the I bit mask time should not exceed 5ms. + * PARAMETERS + * + * RETURN VALUES + * mask status of the current I bit, it should be an input parameter of vm_irq_restore + * EXAMPLE + * + * VMUIN32 savedMask; + * savedMask = vm_irq_mask(); + * ... // your code need to protect + * vm_irq_restore(savedMask); + * + * + *****************************************************************************/ +VMUINT32 vm_irq_mask(); + +/***************************************************************************** + * FUNCTION + * vm_irq_restore + * DESCRIPTION + * This interface used in AP mode, restore the I bit of the processor. Note, this function must be used in pairs with vm_irq_mask. + * PARAMETERS + * saved_mask:[in] the return value of vm_irq_mask + * RETURN VALUES + * EXAMPLE + * + * VMUIN32 savedMask; + * savedMask = vm_irq_mask(); + * ... // your code need to protect + * vm_irq_restore(savedMask); + * + * + *****************************************************************************/ +void vm_irq_restore(VMUINT32 mask); + +#if 0 +#include "vmdcl_i2c.h" +#include "vmdcl_gpio.h" +#include "vmdcl_sio.h" +#include "vmdcl_spi.h" +#include "vmdcl_adc.h" +#include "vmdcl_pmu.h" +#include "vmdcl_eint.h" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __VM_DCL_H__ */ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdcl_adc.h b/hardware/arduino/mtk/system/libmtk/include/vmdcl_adc.h new file mode 100644 index 00000000..09b5a456 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdcl_adc.h @@ -0,0 +1,101 @@ +#ifndef __VM_DCL_ADC_H__ +#define __VM_DCL_ADC_H__ + + +/*Define the dev for ADC module. Used in dcl_open*/ +typedef enum +{ + VM_DCL_ADC_START = VM_DCL_ADC_GROUP_START, + VM_DCL_ADC +}VM_DCL_ADC_DEV_T; + +/* DCL_CTRL_CMD for ADC */ +typedef enum +{ + VM_ADC_CMD_CREATE_OBJECT = 0x901, /* Get logic channel */ + VM_ADC_CMD_MODIFY_PARAM, /* Set measure parameters */ + VM_ADC_CMD_SEND_START, /* start to measure */ + VM_ADC_CMD_SEND_STOP, /* stop measure */ + VM_ADC_CMD_GET_CHANNEL /* get physical channel */ +}VM_DCL_ADC_CTRL_CMD_T; + +/* ADC event id */ +typedef enum +{ + VM_ADC_GET_RESULT = VM_ADC_EVENTS_START /* Get logic channel */ +}VM_DCL_ADC_EVENT_T; + + +/* For VM_ADC_CMD_CREATE_OBJECT command. */ +typedef struct +{ + VMUINT32 u4Period; /* Measurement period (Uint is in Tick) */ + VMUINT32 u4Sapid; + VM_DCL_MODULE_TYPE_T u1OwnerId; /* Indicate the module to for ADC driver to notify the result */ + VMUINT8 u1AdcChannel; /* To be measured physical ADC channel */ + VMUINT8 u1EvaluateCount; /* Measurement count */ + VMBOOL fgSendPrimitive; /* Whether to send message to owner module or NOT */ +}vm_adc_ctrl_create_object_t; + +/* For VM_ADC_CMD_MODIFY_PARAM command. */ +typedef struct +{ + VMUINT32 u4Period; /* Measurement period (Uint is in Tick) */ + VMUINT8 u1EvaluateCount; /* Measurement count */ +} vm_adc_ctrl_modify_param_t; + +/* For VM_ADC_CMD_SEND_START command. */ +typedef struct +{ + VM_DCL_MODULE_TYPE_T u1OwnerId; /* Indicate the module to for ADC driver to notify the result */ +} vm_adc_ctrl_send_start_t; + +/* For VM_ADC_CMD_SEND_STOP command. */ +typedef struct +{ + + VM_DCL_MODULE_TYPE_T u1OwnerId; /* Indicate the module to for ADC driver to notify the result */ +} vm_adc_ctrl_send_stop_t; + +/*ADC measure result */ +typedef struct { + VMUINT8 ref_count; + VMUINT16 msg_len; /* LOCAL_PARA_HDR */ + double adc_value; /* Indicate the measure raw data */ + VMINT32 adc_handle; + VMINT32 volt; /* Indicate the measure data (volt) */ + VMUINT8 adc_sche_id; +}vm_bmt_adc_measure_done_conf_struct; + +/* For VM_ADC_CMD_GET_CHANNEL command. */ +typedef enum { + VM_VBAT_ADC_CHANNEL = 0, + VM_VISENSE_ADC_CHANNEL, + VM_VBATTMP_ADC_CHANNEL, + VM_BATTYPE_ADC_CHANNEL, + VM_VCHARGER_ADC_CHANNEL, + VM_PCBTMP_ADC_CHANNEL, + VM_AUX_ADC_CHANNEL, + VM_CHR_USB_ADC_CHANNEL, + VM_OTG_VBUS_ADC_CHANNEL, + VM_RFTMP_ADC_CHANNEL, + VM_DCL_XP_ADC_CHANNEL, + VM_DCL_YP_ADC_CHANNEL, + VM_DCL_YM_ADC_CHANNEL, + VM_DCL_XM_ADC_CHANNEL, + VM_MAX_ADC_CHANNEL +} VM_ADC_CHANNEL_TYPE_ENUM; + +/* For VM_ADC_CMD_GET_CHANNEL command. */ +typedef struct +{ + VMUINT8 u1AdcPhyCh; + VMUINT16 u2AdcName; +}vm_adc_ctrl_get_physical_channel_t; + + + +#endif + + + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdcl_eint.h b/hardware/arduino/mtk/system/libmtk/include/vmdcl_eint.h new file mode 100644 index 00000000..602ffc12 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdcl_eint.h @@ -0,0 +1,124 @@ +#ifndef _VM_DCL_EINT_H_ +#define _VM_DCL_EINT_H_ + + +/****************************************************************** +* DESCRIPTION +* This enum define the device for eint module, used in vm_dcl_open as a parameter. +* To control EINTs, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vm_dcl.h" +* eint_handle = vm_dcl_open(VM_DCL_EINT,19); //We call vm_dcl_open to get a handle. 19 means eint19 +* +*******************************************************************/ +typedef enum +{ + VM_DCL_EINT_DEV_GROUP_START = VM_DCL_EINT_GROUP_START, /* EINT dev group start. */ + VM_DCL_EINT /* DCL EINT device. */ +}VM_DCL_EINT_DEV_T; + +/****************************************************************** +* DESCRIPTION +* This enum define the event for eint module. +* When user recieve this event, it means the specified EINT has triggerd an interrupt. +*******************************************************************/ +typedef enum +{ + VM_EVENT_EINT_TRIGGER = VM_EINT_EVENTS_START /* EINT trigger event. */ +}VM_DCL_EINT_EVENT_T; + + + +/****************************************************************** +* DESCRIPTION +* This enum define the eint control command, used in vm_dcl_open as a parameter. +* With different commands, user could control the different function of the EINTs. +* To control EINTs, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vm_dcl.h" +* VM_DCL_HANDLE eint_handle; // Declare a VM_DCL_HANDLE variable. +* vm_eint_ctrl_config_t eint_config; //Declare a vm_eint_ctrl_config_t variable. +* vm_eint_ctrl_set_sensitivity_t sens_data; //Declare a vm_eint_ctrl_set_sensitivity_t variable. +* vm_eint_ctrl_set_hw_deounce_t deboun_time; //Declare a vm_eint_ctrl_set_hw_deounce_t variable. +* eint_handle = vm_dcl_open(VM_DCL_EINT,19); // First, we call vm_dcl_open to get a handle. 19 means eint19 +* vm_dcl_control(eint_handle,VM_EINT_CMD_MASK,NULL); // Usually, before we config eint, we mask it firstly. +* vm_dcl_registercallback(eint_handle,EVENT_EINT_TRIGGER,(VM_DCL_CALLBACK)eint_callback,(void*)NULL ); // register callback function,Note: the last paramter fill NULL +* sens_data.sensitivity = 1; // 1 means level sensitive, 0 means edge sensitive. +* vm_dcl_control(eint_handle,VM_EINT_CMD_SET_SENSITIVITY,(void *)&sens_data); // set eint sensitivity +* deboun_time.debounce_time = 10; //Debounce time 10ms +* vm_dcl_control(eint_handle,VM_EINT_CMD_SET_HW_DEBOUNCE,(void *)&deboun_time); // Set debounce time +* eint_config.act_polarity = 0; // 1 means positive active, 0 means negative active. +* eint_config.debounce_en = 1; // 1 means enable hw debounce, 0 means disable. +* eint_config.auto_unmask = 1; // 1 means unmask after callback, 0 means not unmask, and user should unmask it themselves. +* vm_dcl_control(eint_handle,VM_EINT_CMD_CONFIG,(void *)&eint_config); // Please call this api finally, because we will unmask eint in this command. +* vm_dcl_control(eint_handle,VM_EINT_CMD_UNMASK,NULL); // call this function to unmask this eint. +* vm_dcl_close(eint_handle); // Finally, we call vm_dcl_close +* +*******************************************************************/ +typedef enum +{ + VM_EINT_CMD_GROUP_START = 0x1E00, /* EINT cmmand group start. */ + VM_EINT_CMD_CONFIG, /* EINT config command. */ + VM_EINT_CMD_SET_HW_DEBOUNCE, /* EINT set hardware debounce command. */ + VM_EINT_CMD_SET_POLARITY, /* EINT set polartiy command. */ + VM_EINT_CMD_SET_SENSITIVITY, /* EINT set sensitivity command. */ + VM_EINT_CMD_MASK, /* EINT mask command. */ + VM_EINT_CMD_UNMASK, /* EINT unmask command. */ +}VM_DCL_EINT_CMD_T; + + +/****************************************************************** +* DESCRIPTION +* This struct is for VM_EINT_CMD_CONFIG command,used in vm_dcl_control as parameter. +* With this command, you can config the attribute of a specified EINT. +* You can find the sample code in the description of VM_DCL_EINT_CMD_T. +* All commands have similar usage. +*******************************************************************/ +typedef struct +{ + VMUINT8 debounce_en; /* The value is 1 or 0. 1 means enable hw debounce, 0 means disable. */ + VMUINT8 act_polarity; /* The value is 1 0r 0. 1 means positive active, 0 means negative active. */ + VMUINT8 auto_unmask; /* The value is 1 or 0. 1 means unmask after callback, 0 means not unmask. user unmask it themselves. */ +} vm_eint_ctrl_config_t; + +/****************************************************************** +* DESCRIPTION +* This struct is for VM_EINT_CMD_SET_HW_DEBOUNCE command,used in vm_dcl_control as parameter. +* With this command, you can set the hw debounce time of a specified EINT. +* You can find the sample code in the description of VM_DCL_EINT_CMD_T. +* All commands have similar usage. +*******************************************************************/ +typedef struct +{ + VMUINT32 debounce_time; /* HW debounce time. the unit is 1ms. */ +}vm_eint_ctrl_set_hw_deounce_t; + +/****************************************************************** +* DESCRIPTION +* This struct is for VM_EINT_CMD_SET_POLARITY command,used in vm_dcl_control as parameter. +* With this command, you can set the polarity of a specified EINT. +* You can find the sample code in the description of VM_DCL_EINT_CMD_T. +* All commands have similar usage. +*******************************************************************/ +typedef struct +{ + VMUINT8 ACT_Polarity; /* The value is 1 0r 0. 1 means positive active, 0 means negative active. */ +}vm_eint_ctrl_set_polarity_t; + +/****************************************************************** +* DESCRIPTION +* This struct is for VM_EINT_CMD_SET_SENSITIVITY command,used in vm_dcl_control as parameter. +* With this command, you can set the sensitivity of a specified EINT. +* You can find the sample code in the description of VM_DCL_EINT_CMD_T. +* All commands have similar usage. +*******************************************************************/ +typedef struct +{ + VMUINT8 sensitivity; /* The value is 1 or 0. 1 means level sensitive,0 means edge sensitive. */ +}vm_eint_ctrl_set_sensitivity_t; + + + +#endif diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdcl_gpio.h b/hardware/arduino/mtk/system/libmtk/include/vmdcl_gpio.h new file mode 100644 index 00000000..6a72b417 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdcl_gpio.h @@ -0,0 +1,251 @@ +#ifndef __VM_DCL_GPIO_H_STRUCT__ +#define __VM_DCL_GPIO_H_STRUCT__ + +/****************************************************************** +* DESCRIPTION +* This enum defines the device for gpio module,used in vm_dcl_open as a parameter. +* To control GPIOs, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vm_dcl.h" +* VM_DCL_HANDLE gpio_handle; // Declare a VM_DCL_HANDLE variable. +* gpio_handle = vm_dcl_open(VM_DCL_GPIO,55); // Call vm_dcl_open to get a handle. 55 means gpio55 +* +*******************************************************************/ +typedef enum +{ + VM_DCL_GPIO_START = VM_DCL_GPIO_GROUP_START, /*GPIO device start*/ + VM_DCL_GPIO,/*This device is used to control GPIO normal function.*/ + VM_DCL_GPIO_CLK /*This device is used to control GPIO clk function.*/ +}VM_DCL_GPIO_DEV_T; + + +/****************************************************************** +* DESCRIPTION +* This enum is for GPIO_CMD_SET_CLK_OUT command,used in vm_dcl_control as parameter. +* Please refer the introduction of vm_gpio_ctrl_set_clk_out_t for more details. +*******************************************************************/ +typedef enum { + vm_mode_default = 0,/*The default mode is 0. User should refer to the GPIO datasheet to see the specified value*/ + vm_mode_f32k_ck = 0x82, /*Use this enum value to set the 32K clock out in a faster way*/ + vm_mode_max_num /*This value defines the max number of mode, do not exceed this value*/ + } vm_gpio_clk_mode; + + +/****************************************************************** +* DESCRIPTION +* This enum is for GPIO_CMD_SET_CLK_DIV,used in vm_dcl_control as parameter. +* Please refer the introduction of vm_gpio_ctrl_set_clk_div_t for more details. +*******************************************************************/ +typedef enum { + vm_div_max_num=16 /*This value defines the max number of div, do not exceed this value*/ +} vm_gpio_clk_div; + + +/****************************************************************** +* DESCRIPTION +* This enum define the control command for GPIO module,used in vm_dcl_control as parameter. +* With different commands, user could control the different function of the GPIOs. +* To control GPIOs, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vm_dcl.h" +* VM_DCL_HANDLE gpio_handle; // Declare a VM_DCL_HANDLE variable. +* vm_gpio_ctrl_read_t gpio_input_data; //Declare a variable for read IO. +* vm_gpio_ctrl_set_pupd_r0_r1_t pupd_r0r1_data; //Declare a vm_gpio_ctrl_set_pupd_r0_r1_t variable. +* gpio_handle = vm_dcl_open(VM_DCL_GPIO,55); // First, we call vm_dcl_open to get a handle. 55 means gpio55 +* vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_3,NULL); // we call vm_dcl_control to set gpio55 as mode3. +* vm_dcl_control(gpio_handle,VM_GPIO_CMD_READ,(void *)&gpio_input_data); // We call vm_dcl_control to read gpio55 . +* vm_dcl_control(gpio_handle,VM_GPIO_CMD_WRITE_HIGH,0); // we call vm_dcl_control to write gpio55 . +* pupd_r0r1_data.fgSetPupd = 1; // More details, please refer to the GPIO datasheet. +* pupd_r0r1_data.fgSetR0 = 1; // More details, please refer to the GPIO datasheet. +* pupd_r0r1_data.fgSetR1 = 0; // More details, please refer to the GPIO datasheet. +* vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_PUPD_R0_R1,(void *)&pupd_r0r1_data); //we call vm_dcl_control to set pupd of gpio55 . +* vm_dcl_close(gpio_handle); // Finally, we call vm_dcl_close +* +*******************************************************************/ +typedef enum +{ + VM_GPIO_CMD_READ = 1, /*Read data from GPIO Pin*/ + VM_GPIO_CMD_WRITE_LOW, /*Write low to GPIO pin,the GPIO pin will output low*/ + VM_GPIO_CMD_WRITE_HIGH, /*Write high to GPIO Pin,the GPIO pin will output high*/ + VM_GPIO_CMD_SET_MODE_0, /*Set GPIO mode as mode 0,user should refer to the GPIO datasheet to get the real meaning of MODE0*/ + VM_GPIO_CMD_SET_MODE_1, /*Set GPIO mode as mode 1,user should refer to the GPIO datasheet to get the real meaning of MODE1*/ + VM_GPIO_CMD_SET_MODE_2, /*Set GPIO mode as mode 2,user should refer to the GPIO datasheet to get the real meaning of MODE2*/ + VM_GPIO_CMD_SET_MODE_3, /*Set GPIO mode as mode 3,user should refer to the GPIO datasheet to get the real meaning of MODE3*/ + VM_GPIO_CMD_SET_MODE_4, /*Set GPIO mode as mode 4 ,only for chip support 4-bit mode*/ + VM_GPIO_CMD_SET_MODE_5, /*Set GPIO mode as mode 5,only for chip support 4-bit mode*/ + VM_GPIO_CMD_SET_MODE_6, /*Set GPIO mode as mode 6,only for chip support 4-bit mode*/ + VM_GPIO_CMD_SET_MODE_7, /*Set GPIO mode as mode 7,only for chip support 4-bit mode*/ + VM_GPIO_CMD_SET_MODE_8, /*Set GPIO mode as mode 8,only for chip support 4-bit mode*/ + VM_GPIO_CMD_SET_DIR_OUT, /*Set GPIO direction as output*/ + VM_GPIO_CMD_SET_DIR_IN, /*Set GPIO direction as input*/ + VM_GPIO_CMD_RETURN_MODE, /*Get current GPIO mode*/ + VM_GPIO_CMD_RETURN_DIR, /*Get current GPIO direction*/ + VM_GPIO_CMD_RETURN_OUT, /*Get current GPIO output level,0 means low level and 1 means high level*/ + VM_GPIO_CMD_ENABLE_PULL, /*Enable GPIO pull-up/pull-down */ + VM_GPIO_CMD_DISABLE_PULL, /*Disable GPIO pull-up/pull-down */ + VM_GPIO_CMD_SET_PULL_HIGH, /*Set GPIO as pull-up*/ + VM_GPIO_CMD_SET_PULL_LOW, /*Set GPIO as pull-down*/ + VM_GPIO_CMD_SET_DINV, /*Enable or disable GPIO data inversion*/ + VM_GPIO_CMD_RESERVED0, /*Reserved commond, don't use this command*/ + VM_GPIO_CMD_SET_CLK_OUT, /*Select the clock output source of GPIO*/ + VM_GPIO_CMD_SET_CLK_DIV, /*Set the clock division of the clock source*/ + VM_GPIO_CMD_RESERVED1, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED2, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED3, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED4, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED5, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED6, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED7, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED8, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED9, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED10, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED11, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED12, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED13, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_RESERVED14, /*Reserved command, don't use this command*/ + VM_GPIO_CMD_SET_PUPD_R0_R1, /*set the special gpio's pull up/down register. User should refer to the GPIO datasheet*/ + VM_GPIO_CMD_SET_MODE_9, /*Set GPIO mode as mode 9,only for chip support 4-bit mode*/ + VM_GPIO_CMD_SET_MODE_10, /*Set GPIO mode as mode 10,only for chip support 4-bit mode*/ +}VM_DCL_GPIO_CTRL_CMD_T; + + +/****************************************************************** +* DESCRIPTION +* This struct is for GPIO_CMD_READ control command,used in vm_dcl_control as parameter. +* You can find the sample code in the description of VM_DCL_GPIO_CTRL_CMD_T. +*******************************************************************/ +typedef struct +{ + #define VM_GPIO_IO_HIGH 1 + #define VM_GPIO_IO_LOW 0 + VMUINT8 u1IOData; /* The returned value. 0 means the GPIO pin input level is low. 1 means level is high*/ +} vm_gpio_ctrl_read_t; + +/****************************************************************** +* DESCRIPTION +* This struct is for GPIO_CMD_RETURN_MODE control command,used in vm_dcl_control as parameter. +* With this command, you can get the current mode of a specified GPIOs. +* You can find the sample code in the description of VM_DCL_GPIO_CTRL_CMD_T. +* All commands have similar usage. +*******************************************************************/ +typedef struct +{ +#define VM_GPIO_MODE_0 0 +#define VM_GPIO_MODE_1 1 +#define VM_GPIO_MODE_2 2 +#define VM_GPIO_MODE_3 3 +#define VM_GPIO_MODE_4 4 +#define VM_GPIO_MODE_5 5 +#define VM_GPIO_MODE_6 6 +#define VM_GPIO_MODE_7 7 +#define VM_GPIO_MODE_8 8 + VMUINT8 u1RetMode; /*The returned mode value: 0, 1, 2, 3,4,5,6,7,8. Please refer to more details about what the mode number represents from GPIO datasheet*/ +} vm_gpio_ctrl_return_mode_t; + + +/****************************************************************** +* DESCRIPTION +* This struct is for GPIO_CMD_RETURN_DIR control command,used in vm_dcl_control as parameter. +* With this command, you can get the direction of a specified GPIOs. +* You can find the sample code in the description of VM_DCL_GPIO_CTRL_CMD_T. +* All commands have similar usage. +*******************************************************************/ +typedef struct +{ +#define VM_GPIO_DIR_IN 0 +#define VM_GPIO_DIR_OUT 1 + VMUINT8 u1RetDirData; /*The returned dir value: to return 0 means input, or 1 means output*/ +}vm_gpio_ctrl_return_dir_t; + +/****************************************************************** +* DESCRIPTION +* This struct is for GPIO_CMD_RETURN_OUT control command,used in vm_dcl_control as parameter. +* With this command, you can get the output level of a specified GPIOs. +* You can find the sample code in the description of VM_DCL_GPIO_CTRL_CMD_T. +* All commands have similar usage. +*******************************************************************/ +typedef struct +{ + VMUINT8 u1RetOutData;/*The returned value: 1 means gpio output level is high,0 means gpio output level is low */ +}vm_gpio_ctrl_return_out_t; + + +/****************************************************************** +* DESCRIPTION +* This struct is for FOR GPIO_CMD_SET_DINV control command,used in vm_dcl_control as parameter. +* With this command, you can set the data inversion funtion of a specified GPIOs. +* You can find the sample code in the description of VM_DCL_GPIO_CTRL_CMD_T. +* All commands have similar usage. +*******************************************************************/ +typedef struct +{ + VMBOOL fgSetDinv; /*This function only valid when the direction is input. 1 means enable this function. Get more information from datasheet*/ +}vm_gpio_ctrl_set_dinv_t; + +/****************************************************************** +* DESCRIPTION +* This struct is for GPIO_CMD_SET_PUPD_R0_R1 control command,used in vm_dcl_control as parameter. +* With this command, you can set the pupd,r0,r1 funtion of a specified GPIOs. +* You can find the sample code in the description of VM_DCL_GPIO_CTRL_CMD_T. +* All commands have similar usage. +*******************************************************************/ +typedef struct +{ + VMBOOL fgSetPupd; /*This function set the pull up/down resisters of some special GPIO pins. Different fgSetPupd,fgSetR0,fgSetR1 means defferent pull up/down resisters.Please get more details in datasheet.*/ + VMBOOL fgSetR0; /*This function set the pull up/down resisters of some special GPIO pins. Different fgSetPupd,fgSetR0,fgSetR1 means defferent pull up/down resisters.Please get more details in datasheet.*/ + VMBOOL fgSetR1; /*This function set the pull up/down resisters of some special GPIO pins. Different fgSetPupd,fgSetR0,fgSetR1 means defferent pull up/down resisters.Please get more details in datasheet.*/ +}vm_gpio_ctrl_set_pupd_r0_r1_t; + + +/****************************************************************** +* DESCRIPTION +* This struct is for GPIO_CMD_SET_CLK_OUT control command,used in vm_dcl_control as parameter. +* To control GPIOs, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vm_dcl.h" +* VM_DCL_HANDLE gpio_handle; // Declare a VM_DCL_HANDLE variable. +* vm_gpio_ctrl_set_clk_out_t clk_data; //Declare a vm_gpio_ctrl_set_clk_out_t variable. +* gpio_handle = vm_dcl_open(VM_DCL_GPIO_CLK,55);// Step1, we call vm_dcl_open to get a handle. 55 means gpio55. Notice the dev parameter is VM_DCL_GPIO_CLK. +* clk_data.u2ClkNum = 2;// More details, please refer to the GPIO datasheet. +* clk_data.u2Mode = 4; //More details, please refer to the GPIO datasheet. +* vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_CLK_OUT,(void *)&clk_data); // Step2, we call vm_dcl_control to set pupd of gpio55 . +* vm_dcl_close(gpio_handle); // Finally, we call vm_dcl_close +* +*******************************************************************/ +typedef struct +{ + VMUINT16 u2ClkNum; /*The clock register number in datasheet.*/ + vm_gpio_clk_mode u2Mode;/*The clock mode in datasheet.different mode means different source clock selected*/ +}vm_gpio_ctrl_set_clk_out_t; + + +/****************************************************************** +* DESCRIPTION +* This struct is for GPIO_CMD_SET_CLK_DIV control command,used in vm_dcl_control as parameter. +* To control GPIOs, you should use DCL(Driver Common Layer) APIs. +* Note,some platform do not have such functions and others may have. You should refer the datasheet before using GPIOs. +* EXAMPLE +* +* #include "vm_dcl.h" +* VM_DCL_HANDLE gpio_handle; // Declare a VM_DCL_HANDLE variable. +* vm_gpio_ctrl_set_clk_div_t clk_data; //Declare a vm_gpio_ctrl_set_clk_out_t variable. +* gpio_handle = vm_dcl_open(VM_DCL_GPIO_CLK,55);// Step1, we call vm_dcl_open to get a handle. 55 means gpio55. Notice the dev parameter is VM_DCL_GPIO_CLK. +* clk_data.u2ClkNum = 3;// More details, please refer to the GPIO datasheet. +* clk_data.u2Div = 2; //More details, please refer to the GPIO datasheet. +* vm_dcl_control(gpio_handle,GPIO_CMD_SET_CLK_DIV,(void *)&clk_data); // Step2, we call vm_dcl_control to set pupd of gpio55 . +* vm_dcl_close(gpio_handle); // Finally, we call vm_dcl_close +* +*******************************************************************/ +typedef struct +{ + VMUINT16 u2ClkNum; /*The clock register number in datasheet.*/ + vm_gpio_clk_div u2Div; /*The division value in datasheet.Please get more details in datasheet.*/ +}vm_gpio_ctrl_set_clk_div_t; + + +#endif + + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdcl_i2c.h b/hardware/arduino/mtk/system/libmtk/include/vmdcl_i2c.h new file mode 100644 index 00000000..ad7ff78e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdcl_i2c.h @@ -0,0 +1,359 @@ +#ifndef __VM_DCL_I2C_H__ +#define __VM_DCL_I2C_H__ + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_I2C_OWNER indecates that this is the DEFAULT user when no users use + * i2c driver + *****************************************************************************/ +typedef enum +{ + VM_DUMMY_I2C_OWNER = 0xD +}VM_DCL_I2C_OWNER; + + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_I2C_DEV_T indecates the deivce which use i2c module,*This enum + * define the dev for i2c module. Used in vm_dcl_open + * EXAMPLE + * + * VM_DCL_HANDLE i2c_handle; + * i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + * if(VM_DCL_HANDLE_INVALID==i2c_handle) return; + * //Do something with the handle. + * + *****************************************************************************/ +typedef enum +{ + VM_DCL_I2C_START = VM_DCL_I2C_GROUP_START, /*I2C device start*/ + VM_DCL_I2C /*This device is for vm_dcl_open as a parameter.*/ +}VM_DCL_I2C_DEV_T; + + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_I2C_TRANSACTION_MODE indecates the i2c Transaction Mode, user + * can select FAST or HIGH speed if need + * EXAMPLE + * + * VM_DCL_HANDLE i2c_handle; + * vm_i2c_ctrl_config_t conf_data; + * i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + * if(VM_DCL_HANDLE_INVALID==i2c_handle) return; + *conf_data.Reserved0 = 0; + *conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + *conf_data.fgGetHandleWait = 0; + *conf_data.Reserved1 = 0; + *conf_data.u1DelayLen = 0; + *conf_data.u1SlaveAddress = 0x98; + *conf_data.u4FastModeSpeed = 400; + *conf_data.u4HSModeSpeed = 0; + *vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + * //Do something with the handle. + * + *****************************************************************************/ +typedef enum +{ + VM_DCL_I2C_TRANSACTION_FAST_MODE, /* Fast Mode: < 400kbps */ + VM_DCL_I2C_TRANSACTION_HIGH_SPEED_MODE /* Hign Speed Mode: > 400kbps */ +}VM_DCL_I2C_TRANSACTION_MODE; + + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_I2C_CTRL_CMD_T indecates tthe I2C control commands, user + * can select CMDS to control driver + * EXAMPLE + * + * VM_DCL_HANDLE i2c_handle; + * vm_i2c_ctrl_config_t conf_data; + * vm_i2c_ctrl_single_write_t write_data; + * VM_DCL_BUFF_LEN len; + * VMUINT8 i2c_write_data[2] = {0x56,0x78}; + * i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + * if(VM_DCL_HANDLE_INVALID==i2c_handle) return; + * conf_data.Reserved0 = 0; + * conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + * conf_data.fgGetHandleWait = 0; + * conf_data.Reserved1 = 0; + * conf_data.u1DelayLen = 0; + * conf_data.u1SlaveAddress = 0x98; + * conf_data.u4FastModeSpeed = 400; + * conf_data.u4HSModeSpeed = 0; + * vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + * write_data.pu1Data = i2c_write_data; + * write_data.u4DataLen = 2; + * vm_dcl_write(i2c_handle,(VM_DCL_BUFF*)i2c_write_data,2,&len,0); + * //Do something with the handle. + * + *****************************************************************************/ +typedef enum +{ + VM_I2C_CMD_GET_TRANSACTION_MODE = 0x901, /* Get transaction mode */ + VM_I2C_CMD_SET_TRANSACTION_SPEED, /* Set transaction speed */ + VM_I2C_CMD_SINGLE_WRITE, /* Single write of blocking mode */ + VM_I2C_CMD_SINGLE_READ, /* Single read of blocking mode */ + VM_I2C_CMD_CONT_WRITE, /* Continue write of blocking mode */ + VM_I2C_CMD_CONT_READ, /* Continue read of blocking mode */ + VM_I2C_CMD_WRITE_AND_READ, /* Write and read of blocking mode */ + VM_I2C_CMD_RESERVED0, /* Reserved command. Do not use it */ + VM_I2C_CMD_RESERVED1, /* Reserved command. Do not use it */ + VM_I2C_CMD_RESERVED2, /* Reserved command. Do not use it */ + VM_I2C_CMD_RESERVED3, /* Reserved command. Do not use it */ + VM_I2C_CMD_SET_SLAVE_ADDRESS, /* Set the slave address of sensor */ + VM_I2C_CMD_CONFIG /* Configure the i2c for read or writer */ +}VM_DCL_I2C_CTRL_CMD_T; + +/***************************************************************************** + * DESCRIPTION + * vm_i2c_ctrl_get_transaction_mode_t indecates I2C_CMD_GET_TRANSACTION_MODE command + * EXAMPLE + * + * VM_DCL_HANDLE i2c_handle; + * vm_i2c_ctrl_config_t conf_data; + * vm_i2c_ctrl_get_transaction_mode_t mode; + * i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + * if(VM_DCL_HANDLE_INVALID==i2c_handle) return; + * conf_data.Reserved0 = 0; + * conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + * conf_data.fgGetHandleWait = 0; + * conf_data.Reserved1 = 0; + * conf_data.u1DelayLen = 0; + * conf_data.u1SlaveAddress = 0x98; + * conf_data.u4FastModeSpeed = 400; + * conf_data.u4HSModeSpeed = 0; + * vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + * vm_dcl_control(i2c_handle,I2C_CMD_GET_TRANSACTION_MODE,(void *)&mode); + * //Do something with the handle. + * + *****************************************************************************/ +typedef struct +{ + VM_DCL_I2C_TRANSACTION_MODE eTransactionMode; /* Transaction mode */ +}vm_i2c_ctrl_get_transaction_mode_t; + + + +/***************************************************************************** + * DESCRIPTION + * vm_i2c_ctrl_set_transaction_speed_t indecates I2C_CMD_SET_TRANSACTION_SPEED command + * EXAMPLE + * + * VM_DCL_HANDLE i2c_handle; + * vm_i2c_ctrl_config_t conf_data; + * vm_i2c_ctrl_set_transaction_speed_t speed; + * i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + * if(VM_DCL_HANDLE_INVALID==i2c_handle) return; + * conf_data.Reserved0 = 0; + * conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + * conf_data.fgGetHandleWait = 0; + * conf_data.Reserved1 = 0; + * conf_data.u1DelayLen = 0; + * conf_data.u1SlaveAddress = 0x98; + * conf_data.u4FastModeSpeed = 400; + * conf_data.u4HSModeSpeed = 0; + * vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + * speed.eTransactionMode = VM_DCL_I2C_TRANSACTION_HIGH_SPEED_MODE; + * speed.u4FastModeSpeed = 800; + * speed.u4HSModeSpeed = 1; + * vm_dcl_control(i2c_handle,I2C_CMD_SET_TRANSACTION_SPEED,(void *)&speed); + * //Do something with the handle. + * + *****************************************************************************/ +typedef struct +{ + VM_DCL_I2C_TRANSACTION_MODE eTransactionMode; /* Transaction mode */ + VMUINT32 u4FastModeSpeed; /* Fast mode speed */ + VMUINT32 u4HSModeSpeed; /* High speed mode speed */ +}vm_i2c_ctrl_set_transaction_speed_t; + +/***************************************************************************** + * DESCRIPTION + * vm_i2c_ctrl_single_write_t,vm_i2c_ctrl_single_read_t indecates + * I2C_CMD_SINGLE_WRITE, I2C_CMD_SINGLE_READ command. + * EXAMPLE + * + * VM_DCL_HANDLE i2c_handle; + * vm_i2c_ctrl_config_t conf_data; + * vm_i2c_ctrl_single_write_t write_data; + * vm_i2c_ctrl_single_read_t read_data; + * VM_DCL_BUFF_LEN len; + * VMUINT8 i2c_write_data[2] = {0x56,0x78}; + * VMUINT8 i2c_read_data[2] = {0x0,0x0}; + * i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + * if(VM_DCL_HANDLE_INVALID==i2c_handle) return; + * conf_data.Reserved0 = 0; + * conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + * conf_data.fgGetHandleWait = 0; + * conf_data.Reserved1 = 0; + * conf_data.u1DelayLen = 0; + * conf_data.u1SlaveAddress = 0x98; + * conf_data.u4FastModeSpeed = 400; + * conf_data.u4HSModeSpeed = 0; + * vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + * write_data.pu1Data = i2c_write_data; + * write_data.u4DataLen = 2; + * vm_dcl_control(i2c_handle,I2C_CMD_SINGLE_WRITE,(void *)&write_data); + * read_data.pu1Data=i2c_read_data; + * read_data.u4DataLen = 2; + * vm_dcl_control(i2c_handle,I2C_CMD_SINGLE_READ,(void *)&read_data); + * //Do something with the handle. + * + *****************************************************************************/ +typedef struct +{ + VMUINT8 *pu1Data; /* Pointer to the buffer of data */ + VMUINT32 u4DataLen; /* Data length ,Note that this len should not exceed 8*/ +}vm_i2c_ctrl_single_write_t,vm_i2c_ctrl_single_read_t; + +/***************************************************************************** + * DESCRIPTION + * vm_i2c_ctrl_single_write_t,vm_i2c_ctrl_single_read_t indecates + * I2C_CMD_CONT_WRITE, I2C_CMD_CONT_READ command + * EXAMPLE + * + * VM_DCL_HANDLE i2c_handle; + * vm_i2c_ctrl_config_t conf_data; + * vm_i2c_ctrl_cont_write_t write_data; + * vm_i2c_ctrl_cont_read_t read_data; + * VM_DCL_BUFF_LEN len; + * VMUINT8 i2c_write_data[20] = {0x56,0x78,0x00}; + * VMUINT8 i2c_read_data[20] = {0x0}; + * i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + * if(VM_DCL_HANDLE_INVALID==i2c_handle) return; + * conf_data.Reserved0 = 0; + * conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + * conf_data.fgGetHandleWait = 0; + * conf_data.Reserved1 = 0; + * conf_data.u1DelayLen = 0; + * conf_data.u1SlaveAddress = 0x98; + * conf_data.u4FastModeSpeed = 400; + * conf_data.u4HSModeSpeed = 0; + * vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + * write_data.pu1Data = i2c_write_data; + * write_data.u4DataLen = 20; + * write_data.u4TransferNum = 1; + * vm_dcl_control(i2c_handle,I2C_CMD_SINGLE_WRITE,(void *)&write_data); + * read_data.pu1Data=i2c_read_data; + * read_data.u4DataLen = 20; + * read_data.u4TransferNum = 1; + * vm_dcl_control(i2c_handle,I2C_CMD_SINGLE_READ,(void *)&read_data); + * //Do something with the handle. + * + *****************************************************************************/ +typedef struct +{ + VMUINT8 *pu1Data; /* Pointer to the buffer of data */ + VMUINT32 u4DataLen; /* Data length of each transfer ,Note that this len should not exceed 8*/ + VMUINT32 u4TransferNum; /* Transfer number */ +}vm_i2c_ctrl_cont_write_t,vm_i2c_ctrl_cont_read_t; + + +/***************************************************************************** + * DESCRIPTION + * vm_i2c_ctrl_write_and_read_tindecates I2C_CMD_WRITE_AND_READ command command + * EXAMPLE + * + * VM_DCL_HANDLE i2c_handle; + * vm_i2c_ctrl_config_t conf_data; + * vm_i2c_ctrl_write_and_read_t write_and_read_data; + * vm_i2c_ctrl_cont_read_t read_data; + * VM_DCL_BUFF_LEN len; + * VMUINT8 i2c_write_data[20] = {0x56,0x78,0x00}; + * VMUINT8 i2c_read_data[20] = {0x0}; + * i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + * if(VM_DCL_HANDLE_INVALID==i2c_handle) return; + * conf_data.Reserved0 = 0; + * conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + * conf_data.fgGetHandleWait = 0; + * conf_data.Reserved1 = 0; + * conf_data.u1DelayLen = 0; + * conf_data.u1SlaveAddress = 0x98; + * conf_data.u4FastModeSpeed = 400; + * conf_data.u4HSModeSpeed = 0; + * vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + * write_and_read_data.pu1OutData = i2c_write_data; + * write_and_read_data.u4OutDataLen = 20; + * write_and_read_data.pu1InData = i2c_read_data; + * write_and_read_data.u4InDataLen = 20; + * vm_dcl_control(i2c_handle,I2C_CMD_WRITE_AND_READ,(void *)&write_and_read_data); + * //Do something with the handle. + * + *****************************************************************************/ + +typedef struct +{ + VMUINT8 *pu1InData; /* Pointer to the read data */ + VMUINT32 u4InDataLen; /* Read data length ,Note that this len should not exceed 8*/ + VMUINT8 *pu1OutData; /* Pointer to the write data */ + VMUINT32 u4OutDataLen; /* Write data length ,Note that this len should not exceed 8*/ +}vm_i2c_ctrl_write_and_read_t; + + +/***************************************************************************** + * DESCRIPTION + * vm_i2c_ctrl_set_slave_address_t indecates I2C_CMD_SET_SLAVE_ADDRESS command + * EXAMPLE + * + * VM_DCL_HANDLE i2c_handle; + * vm_i2c_ctrl_config_t conf_data; + * vm_i2c_ctrl_set_slave_address_t address_setting; + * i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + * if(VM_DCL_HANDLE_INVALID==i2c_handle) return; + * conf_data.Reserved0 = 0; + * conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + * conf_data.fgGetHandleWait = 0; + * conf_data.Reserved1 = 0; + * conf_data.u1DelayLen = 0; + * conf_data.u1SlaveAddress = 0x98; + * conf_data.u4FastModeSpeed = 400; + * conf_data.u4HSModeSpeed = 0; + * vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + * address_setting.u1SlaveAddress=0x98; + * vm_dcl_control(i2c_handle,I2C_CMD_GET_TRANSACTION_MODE,(void *)&address_setting); + * //Do something with the handle. + * + *****************************************************************************/ +typedef struct +{ + VMUINT8 u1SlaveAddress; /* Slave address */ +}vm_i2c_ctrl_set_slave_address_t; + + +/***************************************************************************** + * DESCRIPTION + * vm_i2c_ctrl_config_t indecates I2C_CMD_CONFIG command + * EXAMPLE + * + * VM_DCL_HANDLE i2c_handle; + * vm_i2c_ctrl_config_t conf_data; + * i2c_handle = vm_dcl_open(VM_DCL_I2C,0); + * if(VM_DCL_HANDLE_INVALID==i2c_handle) return; + *conf_data.Reserved0 = 0; + *conf_data.eTransactionMode = VM_DCL_I2C_TRANSACTION_FAST_MODE; + *conf_data.fgGetHandleWait = 0; + *conf_data.Reserved1 = 0; + *conf_data.u1DelayLen = 0; + *conf_data.u1SlaveAddress = 0x98; + *conf_data.u4FastModeSpeed = 400; + *conf_data.u4HSModeSpeed = 0; + *vm_dcl_control(i2c_handle,VM_I2C_CMD_CONFIG,(void *)&conf_data); + * //Do something with the handle. + * + *****************************************************************************/ +typedef struct +{ + VM_DCL_I2C_OWNER Reserved0; /* Reserved, please use 0 */ + VMBOOL fgGetHandleWait; /* KAL_TRUE: wait until I2C is idle; KAL_FALSE: do not wait */ + VMUINT8 u1SlaveAddress; /* Slave address */ + VMUINT8 u1DelayLen; /* Wait delay between consecutive transfers (the unit is half pulse width) */ + VM_DCL_I2C_TRANSACTION_MODE eTransactionMode; /* Fast mode or high speed mode */ + VMUINT32 u4FastModeSpeed; /* The transfer speed under fast mode. But even under high speed mode, you should alse configure this parameter */ + VMUINT32 u4HSModeSpeed; /* The transfer speed under high speed mode */ + VMBOOL Reserved1; /* Reserved,please always use 0 to fill this member. */ +} vm_i2c_ctrl_config_t; + +#endif + + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdcl_pmu.h b/hardware/arduino/mtk/system/libmtk/include/vmdcl_pmu.h new file mode 100644 index 00000000..71c6e9a8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdcl_pmu.h @@ -0,0 +1,269 @@ + +#ifndef __VM_DCL_PMU_H_STRUCT__ +#define __VM_DCL_PMU_H_STRUCT__ + + +/*Define the dev for PMU module. Used in dcl_open*/ +typedef enum +{ + VM_DCL_PMU_START = VM_DCL_PMU_GROUP_START, + VM_DCL_PMU +}VM_DCL_PMU_DEV_T; + + +/* Enum of VM_LDO/BUCK List */ +typedef enum +{ + VM_VA12, //VM_VA12 + VM_VRTC, //VM_VRTC + VM_VMIC, //VM_VMIC + VM_VAUDN, //VM_VAUDN + VM_VAUDP, //VM_VAUDP + VM_VRF28, //VM_VRF28 + VM_VRF=VM_VRF28, //VM_VRF + VM_VTCXO, //VM_VTCXO + VM_VA25, //VM_VA25 + VM_VCAMA, //VM_VCAMA + VM_VCAMD, //VM_VCAMD + VM_VCAM_IO, //VM_VCAM_IO + VM_VCAM_AF, //VM_VCAM_AF + VM_VIO28, //VM_VIO28 + VM_VUSB, //VM_VUSB + VM_VBT, //VM_VBT + VM_VSIM, //VM_VSIM + VM_VSIM1 = VM_VSIM, //VM_VSIM1 + VM_VSIM2, //VM_VSIM2 + VM_VIBR, //VM_VIBR + VM_VMC, //VM_VMC + VM_VMC1, //VM_VMC1 + VM_VCAMA2, //VM_VCAMA2 + VM_VCAMD2, //VM_VCAMD2 + VM_VFM, //VM_VFM + VM_VM12, //VM_VM12 + VM_VM12_1, //VM_VM12_1 + VM_VM12_2, //VM_VM12_2 + VM_VM12_INT, //VM_VM12_INT + VM_VCORE, //VM_VCORE + VM_VCORE2, //VM_VCORE2 + VM_VIO18, //VM_VIO18 + VM_VPA_SW, //VM_VPA_SW + VM_VPROC, //VM_VPROC + VM_VRF18, //VM_VRF18 + VM_VA, //VM_VA + VM_VA28 = VM_VA, //VM_VA28 + VM_VM, //VM_VM + VM_VSF, //VM_VSF + VM_VWIFI2V8, //VM_VWIFI2V8 + VM_VWIFI3V3, //VM_VWIFI3V3 + VM_V3GTX, //VM_V3GTX + VM_V3GRX, //VM_V3GRX + VM_VGP, //VM_VGP + VM_VGP2, //VM_VGP2 + VM_VSDIO, //VM_VSDIO + VM_VDIG, //VM_VDIG + VM_VBUS, //VM_VBUS + VM_VA1, //VM_VA1 + VM_VA2, //VM_VA2 + VM_VBACKUP, //VM_VBACKUP + VM_VM_PMU_LDO_BUCK_MAX //VM_VM_PMU_LDO_BUCK_MAX +}VM_PMU_LDO_BUCK_LIST_ENUM; + + +/* Enum of LDO/BUCK List */ +typedef enum +{ + VM_VGPIO0, + VM_VGPIO1, + VM_VGPIO2, + VM_VGPIO3, + VM_VGPIO4, + VM_VGPIO5, + VM_VGPIO6, + VM_VGPIO7, + VM_VGPIO8, + VM_VGPIO9, + VM_VGPIO10, + VM_VGPIO11, + VM_VGPIO12, + VM_VGPIO13, + VM_VGPIO14, + VM_VGPIO15, + VM_VGPIO16, + VM_VGPIO17, + VM_VGPIO18, + VM_VGPIO19, + VM_VGPIO20, + VM_VGPIO21, + VM_VGPIO22, + VM_VGPIO23, + VM_VGPIO24, + VM_VGPIO25, + VM_VGPIO26, + VM_VGPIO27, + VM_VGPIO28, + VM_VGPIO29, + VM_VGPIO30, + VM_VGPIO31, + VM_VGPIO32, + VM_VGPIO33, + VM_VGPIO34, + VM_VGPIO35, + VM_VGPIO36, + VM_VGPIO37, + VM_VGPIO38, + VM_VGPIO39, + VM_VGPIO40, + VM_VGPIO41, + VM_VGPIO42, + VM_VGPIO43, + VM_VGPIO44, + VM_VGPIO45, + VM_VGPIO46, + VM_VGPIO47, + VM_VGPIO48, + VM_VGPIO49, + VM_VGPIO50, + VM_VGPIO51, + VM_VGPIO52, + VM_VGPIO53, + VM_VGPIO54, + VM_VGPIO55, + VM_VGPIO56, + VM_VGPIO57, + VM_VGPIO58, + VM_VGPIO59, + VM_VGPIO60, + VM_VGPIO61, + VM_VGPIO62, + VM_VGPIO63, + VM_VGPIO64, + VM_VGPIO65, + VM_VGPIO66, + VM_VGPIO67, + VM_VGPIO68, + VM_VGPIO69, + VM_VGPIO70, + VM_VGPIO71, + VM_VGPIO72, + VM_VGPIO73, + VM_VGPIO74, + VM_VGPIO75, + VM_VGPIO76, + VM_VGPIO77, + VM_VGPIO78, + VM_VGPIO79, + VM_VGPIO80, + VM_VGPIO81, + VM_VGPIO82, + VM_VGPIO83, + VM_VGPIO84, + VM_VGPIO85, + VM_VGPIO86, + VM_VGPIO87, + VM_VGPIO88, + VM_VGPIO89, + VM_VGPIO90, + VM_VGPIO91, + VM_VGPIO92, + VM_VGPIO93, + VM_VGPIO94, + VM_VGPIO95, + VM_VGPIO96, + VM_VGPIO97, + VM_VGPIO98, + VM_VGPIO99, + VM_VGPIO100, + PMU_LDO_BUCK_GPIO_POWER_MAX +}VM_PMU_LDO_BUCK_GPIO_POWER_LIST_ENUM; + +/* PMU Driver command list */ +typedef enum +{ + VM_PMU_CTRL_CMD_LDO_BUCK_SET_EN = 0x2, /* Command to enable ldo/buck , use structure VM_PMU_CTRL_LDO_BUCK_SET_EN */ + VM_PMI_CTRL_CMD_LDO_BUCK_SET_GPIO_POWER_EN = 0x1006, /* command open gpio power */ + VM_KPLED_SET_EN = 3000 /* Command to enable kpled, use structure VM_PMU_CTRL_KPLED_SET_EN */ +}VM_DCL_PMU_CTRL_CMD_T; + + + /***************************************************************************** + * Description + * This struct is for VM_PMU_CTRL_CMD_LDO_BUCK_SET_EN command + * EXAMPLE + * + * //This example explain how to enable the LDO (example VM_VMC) + * VM_DCL_HANDLE handle; + * VM_PMU_CTRL_LDO_BUCK_SET_EN val; + * + * handle = vm_dcl_open(VM_DCL_PMU, 0); + * + * val.enable = KAL_TRUE; // enable , KAL_FLASE : disable + * val.mod = VM_VMC; // LDO + * + * vm_dcl_control(handle, VM_PMU_CTRL_LDO_BUCK_SET_EN, (void *)&val); + * vm_dcl_close(handle); + * + * + *****************************************************************************/ +typedef struct +{ + VM_PMU_LDO_BUCK_LIST_ENUM mod; /* LDO, please reference VM_PMU_LDO_BUCK_LIST_ENUM */ + VMBOOL enable; /* Enalbe or not */ +}VM_PMU_CTRL_LDO_BUCK_SET_EN; + + + /***************************************************************************** + * Description + * This struct is for VM_PMI_CTRL_CMD_LDO_BUCK_SET_GPIO_POWER_EN command + * EXAMPLE + * + * //This example explain how to enable gpio power (example VGPIO40) + * VM_DCL_HANDLE handle; + * VM_PMI_CTRL_CMD_LDO_BUCK_SET_GPIO_POWER_EN val; + * + * handle = vm_dcl_open(VM_DCL_PMU, 0); + * + * val.enable = KAL_TRUE; // enable , KAL_FLASE : disable + * val.mod = VM_VGPIO40; // gpio number + * + * vm_dcl_control(handle, VM_PMI_CTRL_CMD_LDO_BUCK_SET_GPIO_POWER_EN, (void *)&val); + * vm_dcl_close(handle); + * + * + *****************************************************************************/ + + typedef struct + { + VM_PMU_LDO_BUCK_GPIO_POWER_LIST_ENUM gpionum; + VMBOOL enable; + }PMU_CTRL_LDO_BUCK_SET_GPIO_POWER_EN; + + + /***************************************************************************** + * Description + * This struct is for VM_PMU_CTRL_KPLED_SET_EN command. + * EXAMPLE + * + * //This example explain how to enable the LDO (example VM_VMC) + * VM_DCL_HANDLE handle; + * VM_PMU_CTRL_KPLED_SET_EN val; + * + * handle = vm_dcl_open(VM_DCL_PMU, 0); + * + * val.enable = KAL_TRUE; // enable , KAL_FLASE : disable + * + * vm_dcl_control(handle, VM_PMU_CTRL_KPLED_SET_EN, (void *)&val); + * vm_dcl_close(handle); + * + * + *****************************************************************************/ + typedef struct + { + VMBOOL enable; /* Enable or not */ + }VM_PMU_CTRL_KPLED_SET_EN; + + + + + +#endif // #ifndef __VM_DCL_VM_PMU_H_PROTOTYPE__ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdcl_pwm.h b/hardware/arduino/mtk/system/libmtk/include/vmdcl_pwm.h new file mode 100644 index 00000000..b0ce4f11 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdcl_pwm.h @@ -0,0 +1,91 @@ +#ifndef _VM_DCL_PWM_H_ +#define _VM_DCL_PWM_H_ + + +/****************************************************************** +* DESCRIPTION +* This enum defines the device for PWM module,used in vm_dcl_open as a parameter. +* To control PWM, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vm_dcl.h" +* VM_DCL_HANDLE pwm_handle; // Declare a VM_DCL_HANDLE variable. +* pwm_handle = vm_dcl_open(VM_DCL_KPLED_PWM,0); // Call vm_dcl_open to get a handle. +* +*******************************************************************/ +typedef enum +{ + VM_DCL_PWM_START = VM_DCL_PWM_GROUP_START, /*PWM device start*/ + VM_DCL_KPLED_PWM, /*This device is used to control keypad LED PWM.*/ + + + VM_DCL_HW_PWM_GROUP_START = (VM_DCL_PWM_GROUP_START+0x20), + VM_DCL_PWM1, /* control pwm1 */ + VM_DCL_PWM_RESERVED2, /* Reserved, do not use. */ + VM_DCL_PWM_RESERVED3, /* Reserved, do not use. */ + VM_DCL_PWM4, /* control pwm4 */ +}VM_DCL_PWM_DEV_T; + +/****************************************************************** +* DESCRIPTION +* This enum define the control command for PWM module,used in vm_dcl_control as parameter. +* With different commands, user could control the different function of the PWM. +* To control PWM, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vm_dcl.h" +* VM_DCL_HANDLE pwm_handle; // Declare a VM_DCL_HANDLE variable. +* VM_PWM_LEVEL_T pwm_level_var; +* pwm_handle = vm_dcl_open(VM_DCL_KPLED_PWM,0); // First, we call vm_dcl_open to get a handle. the second parameter always fill 0. +* pwm_level_var.pwm_level = 2; +* vm_dcl_control(pwm_handle,VM_PWM_CMD_SET_LEVEL,(void *)(&pwm_level_var)); // we call vm_dcl_control to set the kpled full brightness. +* vm_dcl_close(pwm_handle); // Finally, we call vm_dcl_close +* +*******************************************************************/ + +typedef enum +{ + VM_PWM_CMD_START = 0xD06, /*For hw pwm control only*/ + VM_PWM_CMD_STOP = 0xD07, /*For hw pwm control only*/ + VM_PWM_CMD_SET_LEVEL = 0xD0C, /* for VM_DCL_KPLED_PWM only,nowadays, The keypad led only support 3 levels:0,1,2. 0 means stop pwm, 1 means 50% of brightness, 2 means 100% of brightness.*/ + VM_PWM_CMD_CONFIG = 0xD14, /*For hw pwm control only*/ + VM_PWM_CMD_SET_CLK = 0xD1B, /*For hw pwm control only*/ + VM_PWM_CMD_SET_COUNTER_AND_THRESHOLD = 0xD1C,/*For hw pwm control only*/ + +}VM_DCL_PWM_CTRL_CMD_T; + + +/****************************************************************** +* DESCRIPTION +* This struct is for VM_PWM_CMD_SET_LEVEL control command,used in vm_dcl_control as parameter. +* With this command, you can set the brightness of the keypad led PWM. +* You can find the sample code in the description of VM_DCL_PWM_CTRL_CMD_T. +* All commands have similar usage. +*******************************************************************/ + +typedef struct +{ + VMUINT8 pwm_level; /*nowadays, The keypad led only support 3 levels:0,1,2. 0 means stop pwm, 1 means 50% of brightness, 2 means 100% of brightness.*/ +}VM_PWM_LEVEL_T; + +typedef struct +{ + VMUINT32 freq; // the PWM channel output frequency. + VMUINT8 duty; // the duty cycle of the high level under the periodical output. +}VM_PWM_CONFIG_T; + +typedef struct +{ + VMUINT8 source_clk; // 0 means 13Mhz, 1means 32K + VMUINT8 source_clk_div; // 0 means 0 div, 1 means 2 div, 2 means 4 div, 3 means 8 div. +}VM_PWM_SET_CLOCK_T; + +typedef struct +{ + VMUINT16 counter; // 0 means 13Mhz, 1means 32K + VMUINT16 threshold; // 0 means 0 div, 1 means 2 div, 2 means 4 div, 3 means 8 div. +}VM_PWM_SET_COUNTER_THRESHOLD_T; + + +#endif + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdcl_sio.h b/hardware/arduino/mtk/system/libmtk/include/vmdcl_sio.h new file mode 100644 index 00000000..29fc8497 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdcl_sio.h @@ -0,0 +1,439 @@ +#ifndef __VM_DCL_SIO_H__ +#define __VM_DCL_SIO_H__ + +/***************************************************************************** + * DESCRIPTION + * vm_uart_ready_to_write_ind_struct is the meassge struct which inform + * user to write data ,user can get port information from this content + *****************************************************************************/ +typedef struct +{ + VMUINT8 ref_count; + VMUINT16 msg_len; /* LOCAL_PARA_HDR */ + VMUINT16 port; /*uart port*/ +}vm_uart_ready_to_write_ind_struct; + + +/***************************************************************************** + * DESCRIPTION + * vm_uart_ready_to_read_ind_struct is the meassge struct which inform + * user to write data ,user can get port information from this content + *****************************************************************************/ +typedef struct +{ + VMUINT8 ref_count; + VMUINT16 msg_len; /* LOCAL_PARA_HDR */ + VMUINT16 port; /*uart port*/ +}vm_uart_ready_to_read_ind_struct; + + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_SIO_DEV_T is the seriport type ENUM, user can select one of + * the devices to use + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + * //Do something with the handle. + * + *****************************************************************************/ +typedef enum +{ + vm_uart_port1 = VM_DCL_SIO_GROUP_START, /*uart port1*/ + vm_uart_port2, /*uart port2*/ + vm_uart_port3, /*uart port3*/ + vm_uart_port_reserved, /*uart reserved*/ + vm_usb_port1, /*usb port1*/ + vm_usb_port2 /*usb port2*/ +} VM_DCL_SIO_DEV_T; + + +/************************************************************************************************************ + * DESCRIPTION + * VM_DCL_SIO_EVENT_T is the event type ENUM, user can select one of + * the event to use, every event is matched with the callback user defined + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + * vm_dcl_registercallback(uart_handle,VM_UART_READY_TO_WRITE ,(VM_DCL_CALLBACK)uart_callback,(void *)NULL); + * //uart_callback is defined by user + * + **************************************************************************************************************/ +typedef enum +{ + VM_UART_READY_TO_READ = VM_SERIPORT_EVENTS_START, /*uart read event*/ + VM_UART_READY_TO_WRITE /*uart write event*/ +} VM_DCL_SIO_EVENT_T; + + +/************************************************************************************************************ + * DESCRIPTION + * VM_DCL_SIO_CTRL_CMD is the CMD type ENUM, user can use VM_SIO_CMD_SET_DCB_CONFIG + * command to config uart driver + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * vm_sio_ctrl_dcb_t config; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + * config.u4OwenrId = usr_id; + * config.rUARTConfig.fgDSRCheck = 0; + * config.rUARTConfig.u1DataBits = VM_LEN_8; + * config.rUARTConfig.u1FlowControl = VM_FC_NONE; + * config.rUARTConfig.u1Parity = VM_PA_NONE; + * config.rUARTConfig.u1StopBits = VM_SB_1; + * config.rUARTConfig.u4Baud = VM_UART_BAUD_115200; + * config.rUARTConfig.ucXoffChar = 0x13; + * config.rUARTConfig.ucXonChar = 0x11; + * vm_dcl_control(uart_handle,VM_SIO_CMD_SET_DCB_CONFIG,&config); + * //uart_callback is defined by user + * + **************************************************************************************************************/ + + typedef enum + { + VM_SIO_CMD_SET_DCB_CONFIG = 0xd /*uart setting*/ + }VM_DCL_SIO_CTRL_CMD; + + + +/***************************************************************************** + * DESCRIPTION + * VM_UART_BAUDRATE_T is the type of uart buadrate,which is a member of + * vm_sio_config_t + *****************************************************************************/ +typedef VMUINT32 VM_UART_BAUDRATE_T; + +/***************************************************************************** + * DESCRIPTION + * VM_UART_baudrate is the type of VMUINT32,which define the type UART BUADRATE + * user set + *****************************************************************************/ +typedef VMUINT32 VM_UART_baudrate; + +/***************************************************************************** + * DESCRIPTION + * VM_UART_PORT is the type of VMUINT16 ,which define the type UART_PORT + * user select + *****************************************************************************/ +typedef VMUINT16 VM_UART_PORT; + + + +/***************************************************************************** + * DESCRIPTION + * VM_UART_BAUD_XXX is the VALUE of VM_UART_BAUDRATE_T type,use can select one + * of these vaules to config + *****************************************************************************/ +#define VM_UART_BAUD_AUTO 0 /*AUTO BUADRATE*/ +#define VM_UART_BAUD_75 75 /*BUADRATE 75*/ +#define VM_UART_BAUD_150 150 /*BUADRATE 150*/ +#define VM_UART_BAUD_300 300 /*BUADRATE 300*/ +#define VM_UART_BAUD_600 600 /*BUADRATE 600*/ +#define VM_UART_BAUD_1200 1200 /*BUADRATE 1200*/ +#define VM_UART_BAUD_2400 2400 /*BUADRATE 2400*/ +#define VM_UART_BAUD_4800 4800 /*BUADRATE 4800*/ +#define VM_UART_BAUD_7200 7200 /*BUADRATE 7200*/ +#define VM_UART_BAUD_9600 9600 /*BUADRATE 9600*/ +#define VM_UART_BAUD_14400 14400 /*BUADRATE 14400*/ +#define VM_UART_BAUD_19200 19200 /*BUADRATE 19200*/ +#define VM_UART_BAUD_28800 28800 /*BUADRATE 28800*/ +#define VM_UART_BAUD_33900 33900 /*BUADRATE 33900*/ +#define VM_UART_BAUD_38400 38400 /*BUADRATE 38400*/ +#define VM_UART_BAUD_57600 57600 /*BUADRATE 57600*/ +#define VM_UART_BAUD_115200 115200 /*BUADRATE 115200*/ +#define VM_UART_BAUD_230400 230400 /*BUADRATE 230400*/ +#define VM_UART_BAUD_460800 460800 /*BUADRATE 460800*/ +#define VM_UART_BAUD_921600 921600 /*BUADRATE 921600*/ +#define VM_UART_BAUD_1500000 1500000 /*BUADRATE 1500000*/ + + +/************************************************************************************************************ + * DESCRIPTION + * VM_UART_BITS_PER_CHAR_T is the DATA_LENGTH type ENUM, user can set DATA_LENGTH + * to config uart driver + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * vm_sio_ctrl_dcb_t config; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + * config.u4OwenrId = usr_id; + * config.rUARTConfig.fgDSRCheck = 0; + * config.rUARTConfig.u1DataBits = VM_LEN_8; + * config.rUARTConfig.u1FlowControl = VM_FC_NONE; + * config.rUARTConfig.u1Parity = VM_PA_NONE; + * config.rUARTConfig.u1StopBits = VM_SB_1; + * config.rUARTConfig.u4Baud = VM_UART_BAUD_115200; + * config.rUARTConfig.ucXoffChar = 0x13; + * config.rUARTConfig.ucXonChar = 0x11; + * vm_dcl_control(uart_handle,VM_SIO_CMD_SET_DCB_CONFIG,&config); + * //uart_callback is defined by user + * + **************************************************************************************************************/ +typedef enum { + VM_LEN_5=5, /* 5 DATA LENGTH*/ + VM_LEN_6, /* 6 DATA LENGTH*/ + VM_LEN_7, /* 7 DATA LENGTH*/ + VM_LEN_8 /* 8 DATA LENGTH*/ +} VM_UART_BITS_PER_CHAR_T; + + +/************************************************************************************************************ + * DESCRIPTION + * VM_UART_STOP_BITS_T is the STOP_BIT type ENUM, user can set STOP_BIT + * to config uart driver + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * vm_sio_ctrl_dcb_t config; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + * config.u4OwenrId = usr_id; + * config.rUARTConfig.fgDSRCheck = 0; + * config.rUARTConfig.u1DataBits = VM_LEN_8; + * config.rUARTConfig.u1FlowControl = VM_FC_NONE; + * config.rUARTConfig.u1Parity = VM_PA_NONE; + * config.rUARTConfig.u1StopBits = VM_SB_1; + * config.rUARTConfig.u4Baud = VM_UART_BAUD_115200; + * config.rUARTConfig.ucXoffChar = 0x13; + * config.rUARTConfig.ucXonChar = 0x11; + * vm_dcl_control(uart_handle,VM_SIO_CMD_SET_DCB_CONFIG,&config); + * //uart_callback is defined by user + * + **************************************************************************************************************/ +typedef enum { + VM_SB_1=1, /* 1 STOP BIT*/ + VM_SB_2, /* 2 STOP BIT*/ + VM_SB_1_5 /* 3 STOP BIT*/ +} VM_UART_STOP_BITS_T; + + +/************************************************************************************************************ + * DESCRIPTION + * VM_UART_PARITY_T is the PARITY type ENUM, user can set PARITY + * to config uart driver + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * vm_sio_ctrl_dcb_t config; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + * config.u4OwenrId = usr_id; + * config.rUARTConfig.fgDSRCheck = 0; + * config.rUARTConfig.u1DataBits = VM_LEN_8; + * config.rUARTConfig.u1FlowControl = VM_FC_NONE; + * config.rUARTConfig.u1Parity = VM_PA_NONE; + * config.rUARTConfig.u1StopBits = VM_SB_1; + * config.rUARTConfig.u4Baud = VM_UART_BAUD_115200; + * config.rUARTConfig.ucXoffChar = 0x13; + * config.rUARTConfig.ucXonChar = 0x11; + * vm_dcl_control(uart_handle,VM_SIO_CMD_SET_DCB_CONFIG,&config); + * //uart_callback is defined by user + * + **************************************************************************************************************/ +typedef enum { + VM_PA_NONE=0, + VM_PA_ODD, + VM_PA_EVEN, + VM_PA_MARK, + VM_PA_SPACE +} VM_UART_PARITY_T; + +/************************************************************************************************************ + * DESCRIPTION + * VM_UART_FLOW_CTRL_MODE_T is the FLOW CONTROL type ENUM, user can set flow control + * to config uart driver + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * vm_sio_ctrl_dcb_t config; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + * config.u4OwenrId = usr_id; + * config.rUARTConfig.fgDSRCheck = 0; + * config.rUARTConfig.u1DataBits = VM_LEN_8; + * config.rUARTConfig.u1FlowControl = VM_FC_NONE; + * config.rUARTConfig.u1Parity = VM_PA_NONE; + * config.rUARTConfig.u1StopBits = VM_SB_1; + * config.rUARTConfig.u4Baud = VM_UART_BAUD_115200; + * config.rUARTConfig.ucXoffChar = 0x13; + * config.rUARTConfig.ucXonChar = 0x11; + * vm_dcl_control(uart_handle,VM_SIO_CMD_SET_DCB_CONFIG,&config); + * //uart_callback is defined by user + * + **************************************************************************************************************/ +typedef enum { + VM_FC_NONE=1, /*none flow control*/ + VM_FC_HW, /*hw flow control*/ + VM_FC_SW /*sw flow control*/ +} VM_UART_FLOW_CTRL_MODE_T; + + +/************************************************************************************************************ + * DESCRIPTION + * vm_sio_config_t is the seriport config type struct, which is one member of vm_sio_ctrl_dcb_t struct. + * user can set the members to config uart driver + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * vm_sio_ctrl_dcb_t config; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + * config.u4OwenrId = usr_id; + * config.rUARTConfig.fgDSRCheck = 0; + * config.rUARTConfig.u1DataBits = VM_LEN_8; + * config.rUARTConfig.u1FlowControl = VM_FC_NONE; + * config.rUARTConfig.u1Parity = VM_PA_NONE; + * config.rUARTConfig.u1StopBits = VM_SB_1; + * config.rUARTConfig.u4Baud = VM_UART_BAUD_115200; + * config.rUARTConfig.ucXoffChar = 0x13; + * config.rUARTConfig.ucXonChar = 0x11; + * vm_dcl_control(uart_handle,VM_SIO_CMD_SET_DCB_CONFIG,&config); + * //uart_callback is defined by user + * + **************************************************************************************************************/ + typedef struct +{ + VM_UART_BAUDRATE_T u4Baud; /*baudrate-->like VM_UART_BAUD_150 or VM_UART_BAUD_1500000*/ + VMUINT8 u1DataBits; /*data bit--> VM_UART_BITS_PER_CHAR_T*/ + VMUINT8 u1StopBits; /*stop bit-->VM_UART_STOP_BITS_T*/ + VMUINT8 u1Parity; /*parity-->VM_UART_PARITY_T*/ + VMUINT8 u1FlowControl; /*flow control-->VM_UART_FLOW_CTRL_MODE_T*/ + VMUCHAR ucXonChar; /*SW Xon flow control-->if your HW not support SW flowcontrol,please write 0x0*/ + VMUCHAR ucXoffChar; /*SW Xoff flow control-->if your HW not support SW flowcontrol,please write 0x0*/ + VMBOOL fgDSRCheck; /*DSR check-->please write 0x0*/ +}vm_sio_config_t; + + +/************************************************************************************************************ + * DESCRIPTION + * vm_sio_config_t is the seriport config type struct, user can set the members + * to config uart driver + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * vm_sio_ctrl_dcb_t config; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + * config.u4OwenrId = usr_id; + * config.rUARTConfig.fgDSRCheck = 0; + * config.rUARTConfig.u1DataBits = VM_LEN_8; + * config.rUARTConfig.u1FlowControl = VM_FC_NONE; + * config.rUARTConfig.u1Parity = VM_PA_NONE; + * config.rUARTConfig.u1StopBits = VM_SB_1; + * config.rUARTConfig.u4Baud = VM_UART_BAUD_115200; + * config.rUARTConfig.ucXoffChar = 0x13; + * config.rUARTConfig.ucXonChar = 0x11; + * vm_dcl_control(uart_handle,VM_SIO_CMD_SET_DCB_CONFIG,&config); + * //uart_callback is defined by user + * + **************************************************************************************************************/ + typedef struct +{ + VMUINT32 u4OwenrId; /*uart's owner id */ + vm_sio_config_t rUARTConfig; /*user config setting */ +} vm_sio_ctrl_dcb_t; + + + +/************************************************************************************************************ + * DESCRIPTION + * vm_sio_ctrl_open_t is the UART owner ID + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * vm_sio_ctrl_dcb_t config; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + **************************************************************************************************************/ +typedef struct +{ + VMUINT32 u4OwenrId; /*uart's owner id */ +}vm_sio_ctrl_open_t; + + + +/************************************************************************************************************ + * DESCRIPTION + * vm_sio_ctrl_put_bytes_t is the struct of putting uart data. + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * vm_sio_ctrl_put_bytes_t data; + * vm_sio_ctrl_dcb_t config; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + data.u2Length=2048; + data.u4OwenrId=usr_id; + data.puBuffaddr=data_buffer; + * vm_dcl_write(uart_handle,(VM_DCL_BUFF*)data_buffer,2048,&writen_len,usr_id); + **************************************************************************************************************/ +typedef struct +{ + VMUINT16 u2Length; /*uart's data length */ + VMUINT32 u4OwenrId; /*uart's owner id */ + VMUINT16 u2RetSize; /*uart's sent data size */ + VMUINT8* puBuffaddr; /*uart's buffer address */ +}vm_sio_ctrl_put_bytes_t; + + +/************************************************************************************************************ + * DESCRIPTION + * vm_sio_ctrl_get_bytes_t is the struct of getting uart data. + * EXAMPLE + * + * DCL_HANDLE uart_handle; + * VM_DCL_MODULE_TYPE_T usr_id; + * vm_sio_ctrl_put_bytes_t data; + * vm_sio_ctrl_dcb_t config; + * usr_id = vm_dcl_get_ownerid(); + * uart_handle = vm_dcl_open(vm_uart_port1,usr_id); + * if(VM_DCL_HANDLE_INVALID==uart_handle) return; + data.u2Length=2048; + data.u4OwenrId=usr_id; + data.puBuffaddr=data_buffer; + * vm_dcl_read(uart_handle,(VM_DCL_BUFF*)data_buffer,1024,&returned_len,usr_id); + **************************************************************************************************************/ +typedef struct +{ + VMUINT16 u2Length; /*uart's data length */ + VMUINT32 u4OwenrId; /*uart's owner id */ + VMUINT16 u2RetSize; /*uart's get data size */ + VMUINT8* puBuffaddr; /*uart's buffer address */ + VMUINT8* pustatus; /*uart's status */ + +}vm_sio_ctrl_get_bytes_t; + + +#endif + + + + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdcl_spi.h b/hardware/arduino/mtk/system/libmtk/include/vmdcl_spi.h new file mode 100644 index 00000000..24f93c15 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdcl_spi.h @@ -0,0 +1,523 @@ + +#ifndef __VM_DCL_SPI_H__ +#define __VM_DCL_SPI_H__ + + +/***************************************************************************** + * DESCRIPTION + * VM_SPI_MAX_PORT_NUM indecates that this is the max port number which + * spi driver support + *****************************************************************************/ +#define VM_SPI_MAX_PORT_NUM 2 + + +/***************************************************************************** + * DESCRIPTION + * VM_DCL_SPI_DEV_T is the spi type ENUM, user can select one of + * the devices to use + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * //Do something with the handle. + * + *****************************************************************************/ +typedef enum +{ + vm_spi_port0 = VM_DCL_SPI_GROUP_START, /*spi 1*/ + vm_spi_port1 + +} VM_DCL_SPI_DEV_T; + +/************************************************************************************************************************************* + * DESCRIPTION + * SPI IOCTL code definition. + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_config_para_t conf_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * conf_data.clk_high_time = 5; + * conf_data.clk_low_time = 5; + * conf_data.cs_hold_time = 15; + * conf_data.cs_idle_time = 15; + * conf_data.cs_setup_time= 15; + * conf_data.clk_polarity = VM_SPI_CPOL_B0; + * conf_data.clk_fmt = VM_SPI_CPHA_B0; + * conf_data.rx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.tx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.rx_msbf = VM_SPI_MSBF_MSB; + * conf_data.tx_msbf = VM_SPI_MSBF_MSB; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); + * //Do something with the handle. + * + *************************************************************************************************************************************/ +typedef enum +{ + + + VM_SPI_IOCTL_GET_PARAM=0, /* Get the current SPI configuration parameters.*/ + + VM_SPI_IOCTL_QUERY_CAPABILITY=1, /* Get the capability of current SPI hardware.*/ + + VM_SPI_IOCTL_QUERY_MODE_SUPPORT=2, /* Query supported SPI modes.*/ + + VM_SPI_IOCTL_QUERY_CLOCK=3, /* Query SPI base clock.*/ + + VM_SPI_IOCTL_SET_MODE=4, /* Set and configure SPI mode.*/ + + VM_SPI_IOCTL_GET_MODE=5, /* Get SPI mode settings.*/ + + VM_SPI_IOCTL_SET_CONFIG_PARA=8, /* Set SPI driving current.*/ + + VM_SPI_IOCTL_WRITE_AND_READ=9 /* Set SPI write and read .*/ + +} VM_SPI_IOCTL_CODE; + + +/************************************************************************************************************************************* + * DESCRIPTION + * VM_SPI_HAL_MODE indicates that which mode and functions SPI HW supports, user often use DEASSERT or PAUSE mode + * ULTRA_HIGH and SLOW_DOWN is little used beacause of these are used to ajust the spi ratio of EMI bandwith.GET_TICK is to adjust + * clock timing in order ro device can sample spi master's clock correctly when speed is very high + *************************************************************************************************************************************/ + +typedef enum +{ + /* Deassert mode. SPI CS pin will be pulled low and high for each byte during transmission. */ + VM_SPI_MODE_DEASSERT, + /* Pause mode. SPI CS pin is pulled low and keeps until specific amount of transfers have been finished. */ + VM_SPI_MODE_PAUSE, + /* Ultra high mode. Raise DMA priority during DMA transmission. */ + VM_SPI_MODE_ULTRA_HIGH, + /* Slow down mode. Slow down SPI DMA speed during DMA transmission. */ + VM_SPI_MODE_SLOW_DOWN, + /* Get tick delay mode. This mode is used to tuning SPI timing. */ + VM_SPI_MODE_GET_TICK +} VM_SPI_HAL_MODE; + +/************************************************************************************************************************************* + * DESCRIPTION + * VM_SPI_GET_TICK_E is the ENUM that set GET_TICK_DELAY1 or GET_TICK_DELAY2 + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_mode_t spi_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * spi_data.mode=VM_SPI_MODE_GET_TICK; + * spi_data.bEnable=KAL_TRUE; + * spi_data.param=VM_SPI_GET_TICK_DELAY1; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_MODE,(void *)&spi_data); + * //Do something with the handle. + * +*************************************************************************************************************************************/ +typedef enum +{ + /* Delay SCK for one clock. */ + VM_SPI_GET_TICK_DELAY1 = 1, + /* Delay SCK for two clocks. */ + VM_SPI_GET_TICK_DELAY2 = 2 +} VM_SPI_GET_TICK_E; + +/************************************************************************************************************************************* + * DESCRIPTION + * VM_SPI_MSBF_E indecates that SPI transimssion bit order definition + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_config_para_t conf_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * conf_data.clk_high_time = 5; + * conf_data.clk_low_time = 5; + * conf_data.cs_hold_time = 15; + * conf_data.cs_idle_time = 15; + * conf_data.cs_setup_time= 15; + * conf_data.clk_polarity = VM_SPI_CPOL_B0; + * conf_data.clk_fmt = VM_SPI_CPHA_B0; + * conf_data.rx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.tx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.rx_msbf = VM_SPI_MSBF_MSB; + * conf_data.tx_msbf = VM_SPI_MSBF_MSB; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); + * //Do something with the handle. + * + *************************************************************************************************************************************/ +typedef enum +{ + /* Transfer LSB first. */ + VM_SPI_MSBF_LSB = 0, + /* Transfer MSB first. */ + VM_SPI_MSBF_MSB = 1 +} VM_SPI_MSBF_E; + +/************************************************************************************************************************************* + * DESCRIPTION + * VM_SPI_CPOL_E indecates that SPI clock polarity definition. + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_config_para_t conf_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * conf_data.clk_high_time = 5; + * conf_data.clk_low_time = 5; + * conf_data.cs_hold_time = 15; + * conf_data.cs_idle_time = 15; + * conf_data.cs_setup_time= 15; + * conf_data.clk_polarity = VM_SPI_CPOL_B0; + * conf_data.clk_fmt = VM_SPI_CPHA_B0; + * conf_data.rx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.tx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.rx_msbf = VM_SPI_MSBF_MSB; + * conf_data.tx_msbf = VM_SPI_MSBF_MSB; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); + * //Do something with the handle. + * + *************************************************************************************************************************************/ +typedef enum +{ + /* CPOL = 0. */ + VM_SPI_CPOL_B0 = 0, + /* CPOL = 1. */ + VM_SPI_CPOL_B1 = 1 +} VM_SPI_CPOL_E; + + +/************************************************************************************************************************************* + * DESCRIPTION + * VM_SPI_CPHA_E indecates that SPI clock format definition. + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_config_para_t conf_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * conf_data.clk_high_time = 5; + * conf_data.clk_low_time = 5; + * conf_data.cs_hold_time = 15; + * conf_data.cs_idle_time = 15; + * conf_data.cs_setup_time= 15; + * conf_data.clk_polarity = VM_SPI_CPOL_B0; + * conf_data.clk_fmt = VM_SPI_CPHA_B0; + * conf_data.rx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.tx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.rx_msbf = VM_SPI_MSBF_MSB; + * conf_data.tx_msbf = VM_SPI_MSBF_MSB; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); + * //Do something with the handle. + * + *************************************************************************************************************************************/ +typedef enum +{ + /* CPHA = 0. */ + VM_SPI_CPHA_B0 = 0, + /* CPHA = 1. */ + VM_SPI_CPHA_B1 = 1 +} VM_SPI_CPHA_E; + + +/************************************************************************************************************************************* + * DESCRIPTION + * VM_SPI_ENDIAN_E indecates that SPI data transfer byte order definition. + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_config_para_t conf_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * conf_data.clk_high_time = 5; + * conf_data.clk_low_time = 5; + * conf_data.cs_hold_time = 15; + * conf_data.cs_idle_time = 15; + * conf_data.cs_setup_time= 15; + * conf_data.clk_polarity = VM_SPI_CPOL_B0; + * conf_data.clk_fmt = VM_SPI_CPHA_B0; + * conf_data.rx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.tx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.rx_msbf = VM_SPI_MSBF_MSB; + * conf_data.tx_msbf = VM_SPI_MSBF_MSB; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); + * //Do something with the handle. + * + *************************************************************************************************************************************/ + +typedef enum +{ + /* Use little endian. */ + VM_SPI_ENDIAN_LITTLE = 0, + /* Use big endian. */ + VM_SPI_ENDIAN_BIG = 1 +} VM_SPI_ENDIAN_E; + + + +/************************************************************************************************************************************* + * DESCRIPTION + * vm_spi_config_para_t indecates that SPI configuration parameters. + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_config_para_t conf_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * conf_data.clk_high_time = 5; + * conf_data.clk_low_time = 5; + * conf_data.cs_hold_time = 15; + * conf_data.cs_idle_time = 15; + * conf_data.cs_setup_time= 15; + * conf_data.clk_polarity = VM_SPI_CPOL_B0; + * conf_data.clk_fmt = VM_SPI_CPHA_B0; + * conf_data.rx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.tx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.rx_msbf = VM_SPI_MSBF_MSB; + * conf_data.tx_msbf = VM_SPI_MSBF_MSB; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); + * //Do something with the handle. + * + *************************************************************************************************************************************/ +typedef struct +{ + /* CS setup time. Unit in count of SPI base clock. Range(0-255). + The chip select setup time = (cs_setup_time+1)*CLK_PERIOD, where CLK_PERIOD is the cycle time of the clock the SPI engine adopts. */ + VMUINT32 cs_setup_time; + /* CS hold time. Unit in count of SPI base clock. Range(0-255). + The chip select hold time = (cs_hold_time+1)*CLK_PERIOD. */ + VMUINT32 cs_hold_time; + /* CS idle time. Unit in count of SPI base clock. Range(0-255). + The chip select idle time between consecutive transaction = (cs_idle_time+1)*CLK_PERIOD. */ + VMUINT32 cs_idle_time; + /* SCK clock low time. Unit in count of SPI base clock. Range(0-255). + The SCK clock low time = (clk_low_time+1)*CLK_PERIOD. */ + VMUINT32 clk_low_time; + /* SCK clock high time. Unit in count of SPI base clock. Range(0-255). + The SCK clock high time = (clk_high_time+1)*CLK_PERIOD. */ + VMUINT32 clk_high_time; + /* Bit order setting for SPI output. */ + VM_SPI_MSBF_E tx_msbf; + /* Bit order setting for SPI input. */ + VM_SPI_MSBF_E rx_msbf; + /* Byte order setting for SPI output. */ + VM_SPI_ENDIAN_E tx_endian; + /* Byte order setting for SPI input. */ + VM_SPI_ENDIAN_E rx_endian; + /* SPI clock polarity. */ + VM_SPI_CPOL_E clk_polarity; + /* SPI clock format. */ + VM_SPI_CPHA_E clk_fmt; +} vm_spi_config_para_t; + +/************************************************************************************************************************************* + * DESCRIPTION + * VM_SPI_CTRL_WRITE_AND_READE_T indecates that SPI write and read operation. + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_config_para_t conf_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * conf_data.clk_high_time = 5; + * conf_data.clk_low_time = 5; + * conf_data.cs_hold_time = 15; + * conf_data.cs_idle_time = 15; + * conf_data.cs_setup_time= 15; + * conf_data.clk_polarity = VM_SPI_CPOL_B0; + * conf_data.clk_fmt = VM_SPI_CPHA_B0; + * conf_data.rx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.tx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.rx_msbf = VM_SPI_MSBF_MSB; + * conf_data.tx_msbf = VM_SPI_MSBF_MSB; + * VM_SPI_CTRL_WRITE_AND_READE_T write_and_read; + * write_and_read.pu1InData=in_buff; + * write_and_read.u4DataLen=10; + * write_and_read.pu1OutData=out_buff; + * write_and_read.uCount=1; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_WRITE_AND_READ,(void *)&write_and_read); + * //Do something with the handle. + * + *************************************************************************************************************************************/ +typedef struct +{ + VMUINT8 *pu1InData; /* Pointer to the read data */ + VMUINT32 u4DataLen; /* Read data length */ + VMUINT8 *pu1OutData; /* Pointer to the write data */ + VMUINT32 uCount; /* Read data length */ +}VM_SPI_CTRL_WRITE_AND_READE_T; + +/************************************************************************************************************************************* + * DESCRIPTION + * vm_spi_capabilty_t indecates that SPI 's Capabilty which user can query,This structure is + * used as the parameter of VM_SPI_IOCTL_QUERY_CAPABILITY. + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_capabilty_t spi_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_QUERY_CAPABILITY,(void *)&spi_data); + * //Do something with the handle. + * + *************************************************************************************************************************************/ +typedef struct +{ + /* Minimum value for cs setup time. */ + VMUINT32 cs_setup_time_min; + /* Maximum value for cs setup time. */ + VMUINT32 cs_setup_time_max; + /* Minimum value for cs hold time. */ + VMUINT32 cs_hold_time_min; + /* Maximum value for cs hold time. */ + VMUINT32 cs_hold_time_max; + /* Minimum value for cs idle time. */ + VMUINT32 cs_idle_time_min; + /* Maximum value for cs idle time. */ + VMUINT32 cs_idle_time_max; + /* Minimum value for clock low time. */ + VMUINT32 clk_low_time_min; + /* Maximum value for clock low time. */ + VMUINT32 clk_low_time_max; + /* Minimum value for clock high time. */ + VMUINT32 clk_high_time_min; + /* Maximum value for clock high time. */ + VMUINT32 clk_high_time_max; + /* Minimum value for transfer length. */ + VMUINT32 transfer_length_min; + /* Maximum value for transfer length. */ + VMUINT32 transfer_length_max; + /* Minimum value for transfer count. */ + VMUINT32 transfer_count_min; + /* Maximum value for transfer count. */ + VMUINT32 transfer_count_max; + /* Minimum value for slow down threshold. */ + VMUINT32 slow_down_thresh_min; + /* Maximum value for slow down threshold. */ + VMUINT32 slow_down_thresh_max; + /* Minimum value for ultra high threshold. */ + VMUINT32 ultra_high_thresh_min; + /* Maximum value for ultra high threshold. */ + VMUINT32 ultra_high_thresh_max; + /* Minimum value for driving current. */ + VMUINT32 driving_current_min; + /* Maximum value for driving current. */ + VMUINT32 driving_current_max; +} vm_spi_capabilty_t; + + +/************************************************************************************************************************************* + * DESCRIPTION + * vm_spi_query_mode_t indecates that user can check which mode can SPI support, This structure is used as the parameter + * of VM_SPI_IOCTL_QUERY_MODE_SUPPORT. + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_query_mode_t spi_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * spi_data.mode=VM_SPI_MODE_PAUSE; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_QUERY_MODE_SUPPORT,(void *)&spi_data); + * //Do something with the handle. + * + *************************************************************************************************************************************/ +typedef struct +{ + /* [IN] Specify a SPI mode. */ + VM_SPI_HAL_MODE mode; + /* [OUT] Return whether the specific mode is supported. */ + VMBOOL bSupport; +} vm_spi_query_mode_t; + + +/************************************************************************************************************************************* + * DESCRIPTION + * vm_spi_query_mode_t indecates that user can check SPI 's clock, This structure is used as the parameter of VM_SPI_IOCTL_QUERY_CLOCK. + * It contains the clock frequency which is used to calculate SPI timing parameters. + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_query_clock_t spi_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_QUERY_CLOCK,(void *)&spi_data); + * //Do something with the handle. + * + *************************************************************************************************************************************/ +typedef struct +{ + /* [OUT] SPI base clock. Unit in MHz. */ + VMUINT32 clock; +} vm_spi_query_clock_t; + + + +/************************************************************************************************************************************* + * DESCRIPTION + * vm_spi_mode_t indecates that user can set/get SPI 's mode , This structure is used as the parameter of + * VM_SPI_IOCTL_SET_MODE and VM_SPI_IOCTL_GET_MODE. + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_mode_t spi_data; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + spi_data.mode = SPI_MODE_DEASSERT; + spi_data.bEnable = KAL_TRUE; + * vm_dcl_control(spi_handle,SPI_IOCTL_SET_MODE,(void *)&spi_data); + * //Do something with the handle. + * + *************************************************************************************************************************************/ + +typedef struct +{ + /* [IN] Specify a SPI mode. */ + VM_SPI_HAL_MODE mode; + /* [IN/OUT] Specify whether the mode is enabled. + For SPI_IOCTL_SET_MODE, it is an input parameter. + For SPI_IOCTL_GET_MODE, it is an output parameter. + */ + VMBOOL bEnable; + /* [IN/OUT] The parameter for the specific mode. + The meaning of this parameter depends on the mode to be set/get. + */ + VMUINT32 Param; +} vm_spi_mode_t; + + +/************************************************************************************************************************************* + * DESCRIPTION + * spi read function and spi write function + * EXAMPLE + * + * VM_DCL_HANDLE spi_handle; + * vm_spi_config_para_t conf_data; + * vm_spi_mode_t spi_data; + * VMUINT8 write_buff[3] = {0}; + * VMUINT32 wrten_len; + * VMUINT8 read_buff[3] = {0}; + * VMUINT32 read_len; + * spi_handle = vm_dcl_open(vm_spi_port0,0); + * if(VM_DCL_HANDLE_INVALID==spi_handle) return; + * conf_data.clk_high_time = 5; + * conf_data.clk_low_time = 5; + * conf_data.cs_hold_time = 15; + * conf_data.cs_idle_time = 15; + * conf_data.cs_setup_time= 15; + * conf_data.clk_polarity = VM_SPI_CPOL_B0; + * conf_data.clk_fmt = VM_SPI_CPHA_B0; + * conf_data.rx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.tx_endian = VM_SPI_ENDIAN_LITTLE; + * conf_data.rx_msbf = VM_SPI_MSBF_MSB; + * conf_data.tx_msbf = VM_SPI_MSBF_MSB; + * vm_dcl_control(spi_handle,VM_SPI_IOCTL_SET_CONFIG_PARA,(void *)&conf_data); + * spi_data.mode = SPI_MODE_DEASSERT; + * spi_data.bEnable = KAL_FALSE; + * vm_dcl_control(spi_handle,SPI_IOCTL_SET_MODE,(void *)&spi_data); + * vm_dcl_write(spi_handle,write_buff,3,&wrten_len,(VMUINT32)0); + * vm_dcl_read(spi_handle,read_buffer,3,&returned_len,(VMUINT32)0); + * //Do something with the handle. + * + *************************************************************************************************************************************/ +#endif diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdes.h b/hardware/arduino/mtk/system/libmtk/include/vmdes.h new file mode 100644 index 00000000..c2cd505e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdes.h @@ -0,0 +1,116 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef _VM_DES_SDK_H_ +#define _VM_DES_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + + +/* DOM-NOT_FOR_SDK-BEGIN */ + +#define VMDESHANDLE VMINT + +#define DES_INVALID_HANDLE -1 +#define DES_OK 0 + +#define DES_BLOCK_SIZE 8 + +/***************************************************************************** + * FUNCTION + * vm_des_set_key (old usage, please use new interface of CHE, refer in vmche.h) + * DESCRIPTION + * set des key. + * PARAMETERS + * key : [IN] key. + * RETURNS + * des handle + *****************************************************************************/ +VMDESHANDLE vm_des_set_key( VMUINT8 key[8] ); + +/***************************************************************************** + * FUNCTION + * vm_des_encrypt (old usage, please use new interface of CHE, refer in vmche.h) + * DESCRIPTION + * encrypt the data. + * PARAMETERS + * handle : [IN] des handle from vm_des_set_key . + * input : [IN] input data. + * input_len : [IN] input data length. + * output_len : [OUT] output data length. + * RETURNS + * encrypt output data + *****************************************************************************/ +VMUINT8 * vm_des_encrypt( VMDESHANDLE handle, VMUINT8 * input, VMINT input_len, VMINT * output_len ); + +/***************************************************************************** + * FUNCTION + * vm_des_decrypt (old usage, please use new interface of CHE, refer in vmche.h) + * DESCRIPTION + * decrypt the data. + * PARAMETERS + * handle : [IN] des handle from vm_des_set_key . + * input : [IN] input data. + * input_len : [IN] input data length. + * output_len : [OUT] output data length. + * RETURNS + * decrypt output data + *****************************************************************************/ +VMUINT8 * vm_des_decrypt( VMDESHANDLE handle, VMUINT8 * input, VMINT input_len, VMINT * output_len ); + +/***************************************************************************** + * FUNCTION + * vm_des_reset_key (old usage, please use new interface of CHE, refer in vmche.h) + * DESCRIPTION + * This function is document type start handler. + * PARAMETERS + * handle : [IN] des handle from vm_des_set_key . + * RETURNS + * DES_INVALID_HANDLE : error + * DES_OK : ok + *****************************************************************************/ +VMINT vm_des_reset_key( VMDESHANDLE handle ); + +/* DOM-NOT_FOR_SDK-END */ + +#ifdef __cplusplus +} +#endif + +#endif /* _VM_DES_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdhcp.h b/hardware/arduino/mtk/system/libmtk/include/vmdhcp.h new file mode 100644 index 00000000..7b3be540 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdhcp.h @@ -0,0 +1,185 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VM_DHCP_SDK_H_ +#define VM_DHCP_SDK_H_ + +#include "vmsys.h" + +/*---------------- DHCP Client APIs -------------------*/ + +/* DHCP Client Mode */ +typedef enum +{ + VM_DHCP_CLIENT_ON, // The feature that using DHCP to get an IP is available. + VM_DHCP_CLIENT_OFF, // The feature that using DHCP to get an IP is unavailable. + + VM_DHCP_CLIENT_END +}vm_dhcp_client_mode_enum; + +/***************************************************************************** + * FUNCTION + * vm_dhcp_client_set_mode + * DESCRIPTION + * This function is used to set the client mode. + * PARAMETERS + * mode : [IN] vm_dhcp_client_mode_enum + * RETURN VALUES + * TRUE Setting succeeds. + * FALSE Setting fails. + *****************************************************************************/ +VMINT vm_dhcp_client_set_mode(VMUINT32 mode); + + +/***************************************************************************** + * FUNCTION + * vm_dhcp_client_get_mode + * DESCRIPTION + * This function is used to get the client mode. + * PARAMETERS + * + * RETURN VALUES + * >=0 Current client mode in dhcp_client_mode_enum. + * <0 Getting fails. + *****************************************************************************/ +VMINT vm_dhcp_client_get_mode(void); + + + +/*---------------- DHCP Server APIs -------------------*/ + +#define VM_DHCPD_DOT_IP_MAX_LEN 15 + +/****************************************************************************/ +/* Enum */ +/****************************************************************************/ +typedef enum +{ + VM_DHCP_SERVER_ON, // Response to clients' requests. + VM_DHCP_SERVER_OFF, // Won't resonse to any client's request. + + VM_DHCP_SERVER_END +}vm_dhcp_server_mode_enum; + +/****************************************************************************/ +/* Struct */ +/****************************************************************************/ +typedef struct +{ + VMUINT8 start_ip_addr[VM_DHCPD_DOT_IP_MAX_LEN + 1]; // start ip address + VMUINT8 end_ip_addr[VM_DHCPD_DOT_IP_MAX_LEN + 1]; // end ip address + VMUINT8 gateway_ip_addr[VM_DHCPD_DOT_IP_MAX_LEN + 1]; // gateway ip address + VMUINT8 subnet_mask[VM_DHCPD_DOT_IP_MAX_LEN + 1]; // subnet mask + VMUINT32 default_lease_tm; // default lease time. +} vm_dhcp_server_config_struct; + +/****************************************************************************/ +/* API */ +/****************************************************************************/ +/***************************************************************************** + * FUNCTION + * vm_dhcp_server_set_mode + * DESCRIPTION + * This function is used to set the server mode. + * PARAMETERS + * mode : [IN] vm_dhcp_server_mode_enum + * RETURN VALUES + * TRUE Setting succeeds. + * FALSE Setting fails. + *****************************************************************************/ +VMINT vm_dhcp_server_set_mode(VMUINT32 mode); + + +/***************************************************************************** + * FUNCTION + * vm_dhcp_server_get_mode + * DESCRIPTION + * This function is used to get the server mode. + * PARAMETERS + * + * RETURN VALUES + * >=0 Current server mode in dhcp_server_mode_enum. + * <0 Getting fails. + *****************************************************************************/ +VMINT vm_dhcp_server_get_mode(void); + + +/***************************************************************************** + * FUNCTION + * vm_dhcp_server_set_param + * DESCRIPTION + * This function is used to set the parameters for DHCP server, when the phone is in AP mode. + * The configurable parameters are start ip, end ip, gateway ip and the default lease time. + * DNS and default domain name are gotten from 3G, which can't be configed by customer. + * + * There are some restrictions for the input parameter, when server_on is set to be true. + * Firstly, start_ip_addr, end_ip_addr, and gateway_ip_addr should be in the same subnet. + * Secondly, gateway_ip_addr should be out of the range defined by start_ip_addr and end_ip_addr. + * If any restriction mentioned above is broken, default values will be used. + * + * The format for the IP address is dot format, such as "xxx.xxx.xxx.xxx". The unit for default_lease_tm is + * second. Default lease time will be used, if DHCP client doesn't request certain lease time, . + * If the members in dhcp_server_config_struct are not set or are set improperly, default values will be used. + * + * Default values for the members in dhcp_server_config_struct. + * start_ip_addr 192.168.1.10 + * end_ip_addr 192.168.1.250 + * gateway_ip_addr 192.168.1.1 + * subnet_mask 255.255.255.0 + * default_lease_tm 3600 + * + * PARAMETERS + * param : [IN] + * RETURN VALUES + * TRUE Setting succeeds. + * FALSE Setting fails. + *****************************************************************************/ +VMINT vm_dhcp_server_set_param(vm_dhcp_server_config_struct *param); + + +/***************************************************************************** + * FUNCTION + * dhcp_server_get_param + * DESCRIPTION + * This function is used to get DHCP server parameters, when phone is in AP mode and parameters have been set. + * PARAMETERS + * param : [OUT] + * RETURN VALUES + * TRUE Getting succeeds. + * FALSE Getting fails. + *****************************************************************************/ +VMINT vm_dhcp_server_get_param(vm_dhcp_server_config_struct *param); + +#endif /* VM_DHCP_SDK_H_ */ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmdns.h b/hardware/arduino/mtk/system/libmtk/include/vmdns.h new file mode 100644 index 00000000..ab553ffa --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmdns.h @@ -0,0 +1,60 @@ +#ifndef VM_DNS_SDK_H_ +#define VM_DNS_SDK_H_ + +#include "vmsys.h" + +/*---------------- DHCP Client APIs -------------------*/ + +/* DNS status */ +typedef enum +{ + VM_STATE_STARTING, + VM_STATE_RUNNING, + VM_STATE_STOPPING, + VM_STATE_STOPED, + VM_STATE_ERROR +}vm_dns_state; + + +/***************************************************************************** + * FUNCTION + * vm_dns_start + * DESCRIPTION + * This function is used to start DNS function + * PARAMETERS + * port : dns server listen port + * config_path : config file of author dns server + * domain_path : records file of customized domian-IP + * RETURN VALUES + * -1 is failed + *****************************************************************************/ +VMINT vm_dns_start(VMUINT32 port, VMCHAR *config_path, VMCHAR *domain_path); + + +/***************************************************************************** + * FUNCTION + * vm_dns_stop + * DESCRIPTION + * This function is used to stop DNS functions + * PARAMETERS + * + * RETURN VALUES + * -1 is failed + *****************************************************************************/ +VMINT vm_dns_stop(void); + + +/***************************************************************************** + * FUNCTION + * vm_dns_get_state + * DESCRIPTION + * This function is used to get DNS status + * PARAMETERS + * + * RETURN VALUES + * vm_dns_state + *****************************************************************************/ +VMINT vm_dns_get_state(void); + + +#endif /* VM_DNS_SDK_H_ */ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmeditor.h b/hardware/arduino/mtk/system/libmtk/include/vmeditor.h new file mode 100644 index 00000000..c69c2ec2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmeditor.h @@ -0,0 +1,886 @@ +/******************************************************************************* +* Modification Notice: +* -------------------------- +* This software is modified by MediaTek Inc. and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*******************************************************************************/ + + /******************************************************************************* + * Filename: + * --------- + * vmeditor_sdk.h + * + * Project: + * -------- + * Maui_Software + * + * Description: + * ------------ + * Inline editor APIs + * + * Author: + * ------- + * Keith Chen + * + *============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ + * $Log$ + * + * 07 09 2014 liu.cheng + * [MAUI_03508170] [Wearable_Phase2] VM_GRAPH_ID_3 of ID_14~15.vxp is crashing + * . + * + * 09 03 2012 hongtao.liu + * [MAUI_03230059] [RenRenV2.0][Renren_QVGA_Key_2M_20120829.vxp]ÒÑÊäÈëµÄÕʺÅÐÅÏ¢ÏÔʾ²»ÍêÕû + * add new API : vm_editor_show_from_start. + * + * 07 14 2012 hongtao.liu + * [MAUI_03213274] [ARTMicroBlogV3Vxp_HVGA_0707.vxp]ת·¢Î¢²©Ê±£¬Ó¦¸Ãhighlight×îÇ°Ãæ + * add API : vm_editor_show_from_first_line + * + * 06 27 2012 hongtao.liu + * [MAUI_03112870] Check in MRE editor + * add vm_editor_get_cursor_index, vm_editor_set_cursor_index, vm_editor_insert_string, vm_editor_set_default_text. + * + * 06 05 2012 hongtao.liu + * [MAUI_03191785] [MRE][Inline Editor] check in MRE Editor + * + * add api : vm_editor_set_imui_background_filler and vm_editor_set_update_text_with_cursor_rect_callback + * + * + * 05 25 2012 hongtao.liu + * [MAUI_03191785] [MRE][Inline Editor] check in MRE Editor + * check in MRE Editor + * + * + *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================ + *******************************************************************************/ +#ifndef VMEDITOR_SDK_H_ +#define VMEDITOR_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +#include "vmgraph.h" +#include "vmio.h" +#include "vminput.h" + +/***************************************************************************** +* Define +*****************************************************************************/ +/* Enum values which are used to describe different types of softkey. */ +typedef enum +{ + VM_LEFT_SOFTKEY, /* Is an enum value which represents the left softkey */ + VM_RIGHT_SOFTKEY, /* Is an enum value which represents the right softkey */ + VM_CENTER_SOFTKEY, /* Is an enum value which represents the center softkey */ + + /* DOM-NOT_FOR_SDK-BEGIN */ + VM_MAX_SOFTKEYS /* Is the max count of all softkeys */ + /* DOM-NOT_FOR_SDK-END */ +} VM_SOFTKEY_ENUM; + +typedef enum +{ + VM_EDITOR_NO_BORDER, + VM_EDITOR_SINGLE_BORDER, + VM_EDITOR_DOUBLE_BORDER, + VM_EDITOR_BORDER_END +} VM_EDITOR_BORDER_TYPE; + +/* + * The 24 bits of input type are internally divided two parts + * 1. 0-19 bit are used for generic cases (Currently 18 bits out of which are being used) + * 2. 20-24 bit are used for external input types for special scenarios + */ +typedef enum +{ + VM_INPUT_TYPE_NONE = 0, + VM_INPUT_TYPE_NUMERIC = 0x1, /* For Number only */ + VM_INPUT_TYPE_PHONE_NUMBER = (0x1 << 1), /* For Phone Number */ + VM_INPUT_TYPE_DECIMAL_NUMERIC = (0x1 << 2), /* For Number with Decimal */ + VM_INPUT_TYPE_SIGNED_NUMERIC = (0x1 << 3), /* For Signed Numbers */ + VM_INPUT_TYPE_SIGNED_DECIMAL_NUMERIC = (0x1 << 4), /* For Signed Numbers with Decimal */ + VM_INPUT_TYPE_URL = (0x1 << 5), /* For url input */ + VM_INPUT_TYPE_QUICK_SEARCH = (0x1 << 6), /* For quick search */ + VM_INPUT_TYPE_SENTENCE = (0x1 << 7), /* all kind of character are allowed */ + VM_INPUT_TYPE_ENGLISH_SENTENCE = (0x1 << 8), /* only English character are allowed. */ + VM_INPUT_TYPE_USER_SPECIFIC = (0x1 << 9), /* App defines the input method it wants */ + VM_INPUT_TYPE_KEYPAD_NUMERIC = (0x1 << 10), /* For all numbers mapped on keyboard 0-9 * and # */ + VM_INPUT_TYPE_SIM_NUMERIC = (0x1 << 11), /* for numeric input with + and * */ + VM_INPUT_TYPE_ENGLISH_SENTENCE_UPPERCASE = (0x1 << 12), /* English with Uppercase */ + VM_INPUT_TYPE_ENGLISH_SENTENCE_LOWERCASE = (0x1 << 13), /* English with Lowercase */ + VM_INPUT_TYPE_EMAIL = (0x01 << 14), /* For Email Input */ + VM_INPUT_TYPE_PHONE_NUMBER_WILDCHAR = (0x01 << 15), /* For Phone number with + , p , w and ? */ + VM_INPUT_TYPE_NUMERIC_SYMBOL = (0x01 << 16), /* For number input with symbold allowed */ + VM_INPUT_TYPE_ASCII_CHAR = (0x01 << 17), /* ALL ASCII Characters */ + VM_INPUT_TYPE_NO_TITLECASE_SENTENCE = (0x01 << 18), /* All characters , but no titlecase */ + VM_INPUT_TYPE_SAT_NUMERIC_PASSWORD = (VM_INPUT_TYPE_KEYPAD_NUMERIC | 0x800000), + VM_INPUT_TYPE_DECIMAL_NUMERIC_PASSWORD = (VM_INPUT_TYPE_DECIMAL_NUMERIC | 0x800000), + VM_INPUT_TYPE_SIGNED_NUMERIC_PASSWORD = (VM_INPUT_TYPE_SIGNED_NUMERIC | 0x800000), + VM_INPUT_TYPE_SIGNED_DECIMAL_NUMERIC_PASSWORD = (VM_INPUT_TYPE_SIGNED_DECIMAL_NUMERIC | 0x800000), + VM_INPUT_TYPE_NUMERIC_PASSWORD = (VM_INPUT_TYPE_NUMERIC | 0x800000), + VM_INPUT_TYPE_ALPHANUMERIC_PASSWORD = (VM_INPUT_TYPE_ENGLISH_SENTENCE | VM_INPUT_TYPE_NUMERIC_SYMBOL | 0x800000), + VM_INPUT_TYPE_ASCII_PASSWORD = (VM_INPUT_TYPE_ASCII_CHAR | 0x800000), + VM_INPUT_TYPE_MULTITAP_SENTENCE = (0x200000 | VM_INPUT_TYPE_SENTENCE), + VM_INPUT_TYPE_END +} vm_input_type_enum; + +typedef enum +{ + VM_EDITOR_MESSAGE_NONE = 0x0, + VM_EDITOR_MESSAGE_REDRAW_FLOATING_UI, + VM_EDITOR_MESSAGE_ACTIVATE, + VM_EDITOR_MESSAGE_DEACTIVATE, + VM_EDITOR_MESSAGE_REDRAW_IMUI_RECTANGLE, + VM_EDITOR_MESSAGE_END +} vm_editor_message_id_enum; + +typedef enum +{ + VM_EDITOR_SINGLELINE, + VM_EDITOR_MULTILINE, + VM_EDITOR_END +} VM_EDITOR_TYPE; + +typedef struct +{ + VMINT32 x; + VMINT32 y; + VMINT32 width; + VMINT32 height; +} vm_editor_rect; + +typedef struct +{ + VMUINT32 message_id; + vm_editor_rect rect; /* floating UI rectangle or IMUI rectangle */ +} vm_editor_message_struct, *vm_editor_message_struct_p; + +typedef struct +{ + VMUINT8 bold; + VMUINT8 italic; + VMUINT8 underline; + VMUINT8 size; +} vm_editor_font_attribute; + +typedef struct +{ + VMINT32 x1, y1, x2, y2; +} vm_editor_rect_points, *vm_editor_rect_points_p; + +/***************************************************************************** + * FUNCTION + * Soft key callback function. + * DESCRIPTION + * This callback will be invoke when the soft key be pressed. + * PARAMETERS + * void + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_soft_key_handle_funcptr) (void); + +// TODO: VM_EDITOR_MESSAGE_DEACTIVATE param?? +/***************************************************************************** + * FUNCTION + * IME callback function. + * DESCRIPTION + * This Call back is used to receive IME message, message id refer to vm_editor_message_id_enum. + * 1. When floating UI overlap the editor, we send message VM_EDITOR_MESSAGE_REDRAW with parameters: + * msg_ptr->param_0 : 1 + * msg_ptr->param_1 : (vm_editor_rect *)floating UI rectangle + * In this case, you do not need to redraw the whole screen, only need to redraw the affected area(previous floating UI rectangle). + * 2. When application call vm_editor_activate(), we send message VM_EDITOR_MESSAGE_ACTIVATE with parameters: + * msg_ptr->param_0 : reserved + * msg_ptr->param_1 : reserved + * 3. When application call vm_editor_deactivate(), we send message VM_EDITOR_MESSAGE_DEACTIVATE with parameters: + * msg_ptr->param_0 : 1 + * msg_ptr->param_1 : reserved + * 4. When Virtual Keypad(VK) update status, we send message VM_EDITOR_MESSAGE_VK_STATUS with parameters: + * msg_ptr->param_0 : VK width + * msg_ptr->param_1 : VK height + * PARAMETERS + * editor_handle : [IN] Is the editor handle + * msg_ptr : [IN] Is the message pointer + * RETURNS + * Reserved (PLease return 0 now). + *****************************************************************************/ +typedef VMUINT32(*vm_editor_message_funcptr) (VMINT32 editor_handle, vm_editor_message_struct_p msg_ptr); + +/***************************************************************************** + * FUNCTION + * Text update callback function. + * DESCRIPTION + * This callback will be invoke when User input a charactor. + * PARAMETERS + * text : [IN] Point to the begin of the input string. + * cursor : [IN] Point to the current cusor position. + * text_length : [IN] Length of the input string. + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_update_text_funcptr) (VMUINT8 *text, VMUINT8 *cursor, VMINT32 text_length); + +/***************************************************************************** + * FUNCTION + * Text update with cursor rect callback function + * DESCRIPTION + * This callback will be invoked when user input or delete a charactor. + * The difference between this callback and vm_update_text_funcptr is: + * vm_update_text_funcptr will be invoked before editor redraw. + * vm_update_text_with_cursor_rect_funcptr will be invoked after editor redraw. + * PARAMETERS + * text : [IN] Point to the begin of the input string. + * cursor : [IN] Point to the current cursor position. + * text_length : [IN] length of the input string. + * cursor_rect_points : [IN] rect of the cursor. + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_update_text_with_cursor_rect_funcptr)( + VMUINT8 *text, + VMUINT8 *cursor, + VMINT32 text_length, + vm_editor_rect_points_p cursor_rect_points); + +/***************************************************************************** + * FUNCTION + * callback function to draw imui background + * DESCRIPTION + * draw imui background + * PARAMETERS + * x1 : [IN] x-coordination of top-left point. + * y1 : [IN] y-coordination of top-left point. + * x2 : [IN] x-coordination of down-right point. + * y2 : [IN] y-coordination of down-right point. + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_draw_imui_background_funcptr)(VMINT32 x1, VMINT32 y1, VMINT32 x2, VMINT32 y2); + +/***************************************************************************** + * FUNCTION + * vm_editor_create + * DESCRIPTION + * Creates an editor, it will use some application's heap memory. + * For single line editor, it will malloc 550Byte; For multiple line editor, it will malloc xxxByte. + * PARAMETERS + * editor_type [IN] Is the editor type + * x [IN] Is the left-top corner (x coordinate) + * y [IN] Is the left-top corner (y coordinate) + * width [IN] Is the width of the editor + * height [IN] Is the height of the editor + * text_buffer [IN] Is the text buffer the editor should use (pre-allocated) + * text_buffer_size [IN] Is the text buffer size in Bytes + * is_disable_softkey [IN] Disable softkey or not + * layer_handle [IN] Is the layer handle + * RETURNS + * NULL : Failed to create editor. + * Other : If successful. + *****************************************************************************/ +VMINT32 vm_editor_create( + VM_EDITOR_TYPE editor_type, + VMINT32 x, + VMINT32 y, + VMINT32 width, + VMINT32 height, + VMUWSTR text_buffer, + VMINT32 text_buffer_size, + VMBOOL is_disable_softkey, + VM_GDI_HANDLE layer_handle); + +/***************************************************************************** + * FUNCTION + * vm_editor_close + * DESCRIPTION + * Close the editor, it will free the editor memory in this API. + * Application must call this API before exit or go to background, if not, there will be memory leak. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * RETURNS + * void + *****************************************************************************/ +void vm_editor_close(VMINT32 editor_handle); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_IME + * DESCRIPTION + * To set IME input type, input mode and callback function. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * input_type [IN] Is the input type, refer to vm_input_type_enum + * input_mode_array [IN] Is the input mode set, can pass null to use default mode set. + * If want to use user defined input mode list, + * 1. You need to set input_type as VM_INPUT_TYPE_USER_SPECIFIC. + * 2. Application need to use global array variable and end with VM_INPUT_MODE_NONE. + * 3. The max length of the array can not more than 10. + * Example: + * static vm_input_mode_enum my_input_modes_lower_first[] + * { + * VM_INPUT_MODE_MULTITAP_LOWERCASE_ABC, + * VM_INPUT_MODE_MULTITAP_UPPERCASE_ABC, + * VM_INPUT_MODE_123, + * VM_INPUT_MODE_SM_PINYIN, + * VM_INPUT_MODE_NONE + * }; + * default_input_mode [IN] Is the default input mode + * ime_callback [IN] Is the ime callback function + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_IME( + VMINT32 editor_handle, + VMUINT32 input_type, + vm_input_mode_enum *input_mode_array, + vm_input_mode_enum default_input_mode, + vm_editor_message_funcptr ime_callback); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_softkey + * DESCRIPTION + * Set editor softkey. Only send key press event to application, other key event will be discarded. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * s [IN] Is the label + * key [IN] Is softkey type + * f [IN] Is the softkey handle + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_softkey(VMINT32 editor_handle, VMUWSTR s, VM_SOFTKEY_ENUM key, vm_soft_key_handle_funcptr f); + +/***************************************************************************** + * FUNCTION + * vm_editor_get_softkey_height + * DESCRIPTION + * Get editor softkey height. + * PARAMETERS + * void + * RETURNS + * Soft key height. + *****************************************************************************/ +VMUINT32 vm_editor_get_softkey_height(void); + +/***************************************************************************** + * FUNCTION + * vm_editor_show + * DESCRIPTION + * Display the editor (not flush to screen). + * PARAMETERS + * editor_handle [IN] Is the editor handle + * RETURNS + * void + *****************************************************************************/ +void vm_editor_show(VMINT32 editor_handle); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_multiline_text_font + * DESCRIPTION + * Set multi line editor input text font. Recommended that use font_size_t type to define size. + * If use number directly, you need to check if the phone support vector font. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * text_font [IN] Is the text font + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_multiline_text_font(VMINT32 editor_handle, vm_editor_font_attribute text_font); + +/***************************************************************************** + * FUNCTION + * vm_editor_get_font_attribute + * DESCRIPTION + * Get editor font attribute. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * text_font [OUT] Is the text font + * RETURNS + * void + *****************************************************************************/ +void vm_editor_get_font_attribute(VMINT32 editor_handle, vm_editor_font_attribute *text_font); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_bg_image + * DESCRIPTION + * Set the normal and focuss image pointers for image background + * (there are two styles of background: image background and rectangle background) + * PARAMETERS + * editor_handle [IN] Is the editor handle + * focus_image [IN] Is the focuss image + * normal_image [IN] Is the normal image + * focus_image_size [IN] Is the focuss image size + * normal_image_size [IN] Is the normal image size + * RETURNS + * 0 : If successful. + * -1 : Parameter error. + * -2 : Focus image type error. + * -3 : Normal image type error. + *****************************************************************************/ +VMINT32 vm_editor_set_bg_image( + VMINT32 editor_handle, + VMUINT8 *focus_image, + VMUINT8 *normal_image, + VMINT32 focus_image_size, + VMINT32 normal_image_size); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_bg_border_style + * DESCRIPTION + * Set border style for rectangle background + * (there are two styles of background: image background and rectangle background) + * PARAMETERS + * editor_handle [IN] Is the editor handle + * border_width [IN] Is the border width(no border/single border/double border) + * border_normal_color [IN] Is the border color of normal style + * border_focuss_color [IN] Is the border color of focuss style + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_bg_border_style( + VMINT32 editor_handle, + VM_EDITOR_BORDER_TYPE border_width, + VMUINT16 border_normal_color, + VMUINT16 border_focuss_color); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_margin + * DESCRIPTION + * Set margin for editor + * (for singleline, align center along y direction, so no need to set top/down margin) + * PARAMETERS + * editor_handle [IN] Is the editor handle + * top [IN] Top >0: set new value; -1: use default value + * down [IN] Down >0: set new value; -1: use default value + * left [IN] Left >0: set new value; -1: use default value + * right [IN] Right >0: set new value; -1: use default value + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_margin(VMINT32 editor_handle, VMINT32 top, VMINT32 down, VMINT32 left, VMINT32 right); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_layer_handle + * DESCRIPTION + * Set editor layer handle + * PARAMETERS + * editor_handle [IN] Is the editor handle + * layer_handle [IN] Is the layer handle + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_layer_handle(VMINT32 editor_handle, VM_GDI_HANDLE layer_handle); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_update_text_callback + * DESCRIPTION + * Set update text call back. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * update_text_callback [IN] Is update text callback + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_update_text_callback(VMINT32 editor_handle, vm_update_text_funcptr update_text_callback); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_update_text_with_cursor_rect_callback + * DESCRIPTION + * set update text with cursor rect callback. + * notice that this callback will be invoked after editor redraw. + * PARAMETERS + * editor_handle : [IN] the editor handle. + * update_text_with_cursor_rect_callback : [IN] update text with cursor rect callback. + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_update_text_with_cursor_rect_callback( + VMINT32 editor_handle, + vm_update_text_with_cursor_rect_funcptr update_text_with_cursor_rect_callback); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_pos + * DESCRIPTION + * Move the editor and show. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * x [IN] Is the left-top corner + * y [IN] Is the left-top corner + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_pos(VMINT32 editor_handle, VMINT32 x, VMINT32 y); + +/***************************************************************************** + * FUNCTION + * vm_editor_get_pos + * DESCRIPTION + * Get editor position. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * x [OUT] Is the left-top corner + * y [OUT] Is the left-top corner + * RETURNS + * void + *****************************************************************************/ +void vm_editor_get_pos(VMINT32 editor_handle, VMINT32 *x, VMINT32 *y); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_size + * DESCRIPTION + * Resize the editor and show. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * width [IN] Is the width of the editor + * height [IN] Is the height of the editor + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_size(VMINT32 editor_handle, VMINT32 width, VMINT32 height); + +/***************************************************************************** + * FUNCTION + * vm_editor_get_size + * DESCRIPTION + * Get the editor size. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * width [OUT] Is the width of the editor + * height [OUT] Is the height of the editor + * RETURNS + * void + *****************************************************************************/ +void vm_editor_get_size(VMINT32 editor_handle, VMINT32 *width, VMINT32 *height); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_text + * DESCRIPTION + * Set the text show in the editor. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * text_buffer [IN] Is the text buffer + * text_size [IN] Is the text buffer size(byte) + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_text(VMINT32 editor_handle, VMUWSTR text_buffer, VMINT32 text_size); + +/***************************************************************************** + * FUNCTION + * vm_editor_get_text + * DESCRIPTION + * Get the input text of the editor. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * text_buffer [IN/OUT] Is the text buffer + * text_size [IN] Is the text buffer size(byte) + * RETURNS + * VMINT32: text length + *****************************************************************************/ +VMINT32 vm_editor_get_text(VMINT32 editor_handle, VMUWSTR text_buffer, VMINT32 text_size); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_text_color + * DESCRIPTION + * set text color + * PARAMETERS + * editor_handle [IN] Is the editor handle + * text_color [IN] Is the text color + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_text_color(VMINT32 editor_handle, VMUINT16 text_color); + +/***************************************************************************** + * FUNCTION + * wgui_editor_set_cursor_color + * DESCRIPTION + * set cursor color + * PARAMETERS + * editor_handle [IN] Is the editor handle + * cursor_color [IN] Is the cursor color + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_cursor_color(VMINT32 editor_handle, VMUINT16 cursor_color); + +/***************************************************************************** + * FUNCTION + * vm_editor_activate + * DESCRIPTION + * Activate the editor. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * is_vk_default_on [IN] If TRUE, the VK will be on when active the editor; + * If FALSE, the VK will be not on when active the editor, you need extra tap to show VK. + * RETURNS + * void + *****************************************************************************/ +void vm_editor_activate(VMINT32 editor_handle, VMBOOL is_vk_default_on); + +/***************************************************************************** + * FUNCTION + * vm_editor_deactivate + * DESCRIPTION + * Deactivate the editor. + * If application state switch to inactive/background/unload, must call this API. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * RETURNS + * void + *****************************************************************************/ +void vm_editor_deactivate(VMINT32 editor_handle); + +/***************************************************************************** + * FUNCTION + * vm_editor_get_active_editor + * DESCRIPTION + * Get current active editor. + * PARAMETERS + * void + * RETURNS + * The active editor handle. + *****************************************************************************/ +VMINT32 vm_editor_get_active_editor(void); + +/***************************************************************************** + * FUNCTION + * vm_editor_get_fit_height + * DESCRIPTION + * Get the fit editor height. This API only used to calculate single line editor height. + * For text_font_size, you can use font_size_t type to define the size or use number directly. + * PARAMETERS + * vertical_margin_size [IN] Is the vertical margin size + * text_font_size [IN] Is the text font size + * RETURNS + * editor height. + *****************************************************************************/ +VMINT32 vm_editor_get_fit_height(VMUINT8 vertical_margin_size, VMUINT8 text_font_size); + +/***************************************************************************** + * FUNCTION + * vm_editor_get_indicator_height + * DESCRIPTION + * Get indicator height. + * PARAMETERS + * void + * RETURNS + * Indicator height. + *****************************************************************************/ +VMINT32 vm_editor_get_indicator_height(void); + +/***************************************************************************** + * FUNCTION + * vm_editor_save + * DESCRIPTION + * Save the history info of the editor. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * RETURNS + * void + *****************************************************************************/ +void vm_editor_save(VMINT32 editor_handle); + +/***************************************************************************** + * FUNCTION + * vm_editor_restore + * DESCRIPTION + * Restore the history info to the editor. + * PARAMETERS + * editor_handle [IN] Is the editor handle + * RETURNS + * void + *****************************************************************************/ +void vm_editor_restore(VMINT32 editor_handle); + +/***************************************************************************** +* FUNCTION +* vm_editor_is_draw_floating_indicator +* DESCRIPTION +* Set if draw ime floating indicator. +* PARAMETERS +* is_draw_floating_indicator [IN] if draw ime floating indicator +* RETURNS +* void +*****************************************************************************/ +void vm_editor_is_draw_floating_indicator(VMBOOL is_draw_floating_indicator); + +/***************************************************************************** + * FUNCTION + * vm_editor_redraw_floating_ui_within_rect + * DESCRIPTION + * Redraw ime floating ui within given rectangle area. + * PARAMETERS + * rect [IN] Is the given rectangle area + * RETURNS + * void + *****************************************************************************/ +void vm_editor_redraw_floating_ui_within_rect(vm_editor_rect rect); + +/***************************************************************************** + * FUNCTION + * vm_editor_redraw_ime_screen + * DESCRIPTION + * Redraw ime UIs(floating ui and fixed ui). + * PARAMETERS + * void + * RETURNS + * void + *****************************************************************************/ +void vm_editor_redraw_ime_screen(void); + +/***************************************************************************** + * FUNCTION + * vm_editor_get_extra_imui_layer_handler + * DESCRIPTION + * get extra imui layer handler (like handwriting drawn layer). + * PARAMETERS + * void + * RETURNS + * Layer handle. + *****************************************************************************/ +VM_GDI_HANDLE vm_editor_get_extra_imui_layer_handler(void); + +/***************************************************************************** + * FUNCTION + * vm_editor_draw_imui_background_filler + * DESCRIPTION + * set the callback function to draw imui background + * PARAMETERS + * draw_imui_background_callback : [IN] the callback to draw imui background. + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_imui_background_filler(vm_draw_imui_background_funcptr draw_imui_background_callback); + +/***************************************************************************** + * FUNCTION + * vm_editor_insert_string + * DESCRIPTION + * insert string. + * PARAMETERS + * editor_handle : [IN] the handle of editor. + * str : [IN] string to be inserted. + * len : [IN] length of string. + * RETURNS + * the length of string actually inserted. + *****************************************************************************/ +VMINT32 vm_editor_insert_string(VMINT32 editor_handle, VMUWSTR str, VMINT32 len); + +/***************************************************************************** + * FUNCTION + * vm_editor_set_cursor_index + * DESCRIPTION + * set editor cursor index + * PARAMETERS + * editor_handle : [IN] the handle of editor. + * cursor_index : [IN] the cursor index + * RETURNS + * void + *****************************************************************************/ +void vm_editor_set_cursor_index(VMINT32 editor_handle, VMINT32 cursor_index); + +/***************************************************************************** + * FUNCTION + * vm_editor_get_cursor_index + * DESCRIPTION + * get editor cursor index + * PARAMETERS + * editor_handle : [IN] the handle of editor. + * RETURNS + * the cursor index. + *****************************************************************************/ +VMINT32 vm_editor_get_cursor_index(VMINT32 editor_handle); + +/***************************************************************************** +* FUNCTION +* vm_editor_set_default_text +* DESCRIPTION +* set default text. +* PARAMETERS +* editor_handle : [IN] the handle of editor. +* default_text_buffer : [IN] the buffer that stores default text. +* RETURNS +* void +*****************************************************************************/ +void vm_editor_set_default_text(VMINT32 editor_handle, VMUWSTR default_text_buffer); + +/***************************************************************************** +* FUNCTION +* vm_editor_show_from_first_line +* DESCRIPTION +* jump to start to show from the first line of multiline editor. +* PARAMETERS +* editor_handle : [IN] handle of the editor. +* RETURNS +* void +*****************************************************************************/ +void vm_editor_show_from_first_line(VMINT32 editor_handle); + +/***************************************************************************** +* FUNCTION +* vm_editor_show_from_start +* DESCRIPTION +* for multi-line editor, show from the first line. +* for single-line editor, show from the first charactor. +* PARAMETERS +* editor_handle : [IN] handle of the editor. +* RETURNS +* void +*****************************************************************************/ +void vm_editor_show_from_start(VMINT32 editor_handle); + +#ifdef __cplusplus +} +#endif + +#endif /* VMEDITOR_SDK_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmemcmd.h b/hardware/arduino/mtk/system/libmtk/include/vmemcmd.h new file mode 100644 index 00000000..4fc265a4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmemcmd.h @@ -0,0 +1,98 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmemcmd_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * driver bridge header file + * + * Author: + * ------- + * diangang.qin(mtk81217) + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_EMCMD_SDK_H +#define VM_EMCMD_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ + +#include "vmsys.h" + +/*vm_emcmd_enum*/ +typedef enum +{ + VM_EMCMD_NO_ERROR = 0,//operator suceed + VM_EMCMD_GET_MEM_FAIL = -1,//memory is not enough + VM_EMCMD_ERR_OTHERS = -65535,// other errors + VM_EMCMD_ERR_END = -65536//end mark +}vm_emcmd_enum; + +/* callback function at_cmd */ +typedef VMINT (*VM_EM_CMD_CB)(void *data); + +/***************************************************************************** + * FUNCTION + * vm_em_send_command + * DESCRIPTION + * this is for send em cmd + * PARAMETERS + * atCmdStr: [IN]the cmd string + * atcmd_cb:[IN]the cmd cb + * RETURNS + * vm_emcmd_enum:return VM_EMCMD_NO_ERROR, success, othersize, fail + *****************************************************************************/ +extern vm_emcmd_enum vm_em_send_command(VMCHAR *atCmdStr, VM_EM_CMD_CB atcmd_cb); + +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_EMCMD_SDK_H*/ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmfota.h b/hardware/arduino/mtk/system/libmtk/include/vmfota.h new file mode 100644 index 00000000..4abe4a90 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmfota.h @@ -0,0 +1,203 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmfota_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * fota header file + * + * Author: + * ------- + * jianying.li(mtk81091) + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_FOTA_SDK_H +#define VM_FOTA_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ +#include "vmsys.h" + +/*vm_srv_funet_flag_enum*/ +typedef enum +{ + VM_SRV_FUNET_FLAG_SUCCESS,//VM_SRV_FUNET_FLAG_SUCCESS + VM_SRV_FUNET_FLAG_FAIL_DEL_CBR_UPDATING_INFO,//VM_SRV_FUNET_FLAG_FAIL_DEL_CBR_UPDATING_INFO + VM_SRV_FUNET_FLAG_ERASE_MARKER_BLOCK,//VM_SRV_FUNET_FLAG_ERASE_MARKER_BLOCK + VM_SRV_FUNET_FLAG_WRITE_MARKER_BLOCK,//VM_SRV_FUNET_FLAG_WRITE_MARKER_BLOCK + VM_SRV_FUNET_FLAG_NO_DL_PACKAGE_FOUND,//VM_SRV_FUNET_FLAG_NO_DL_PACKAGE_FOUND + VM_SRV_FUNET_FLAG_FLASH_INIT_FAIL//VM_SRV_FUNET_FLAG_FLASH_INIT_FAIL +} vm_srv_funet_flag_enum; + +/*vm_srv_funet_update_type_enum*/ +typedef enum +{ + VM_SRV_FUNET_UPDATE_FULL,//VM_SRV_FUNET_UPDATE_FULL + VM_SRV_FUNET_UPDATE_PARTIAL//VM_SRV_FUNET_UPDATE_PARTIAL +} vm_srv_funet_update_type_enum; + +/*vm_fudiffnet_update_type_enum*/ +typedef enum +{ + VM_FUDIFFNET_UPDATE_FULL,//VM_FUDIFFNET_UPDATE_FULL + VM_FUDIFFNET_UPDATE_PARTIAL//VM_FUDIFFNET_UPDATE_PARTIAL +}vm_fudiffnet_update_type_enum; + +/*vm_fudiffnet_flag_enum*/ +typedef enum +{ + VM_FUDIFFNET_FLAG_SUCCESS,//VM_FUDIFFNET_FLAG_SUCCESS + VM_FUDIFFNET_FLAG_FAIL_DEL_CBR_UPDATING_INFO,//VM_FUDIFFNET_FLAG_FAIL_DEL_CBR_UPDATING_INFO + VM_FUDIFFNET_FLAG_ERASE_MARKER_BLOCK,//VM_FUDIFFNET_FLAG_ERASE_MARKER_BLOCK + VM_FUDIFFNET_FLAG_WRITE_MARKER_BLOCK,//VM_FUDIFFNET_FLAG_WRITE_MARKER_BLOCK + VM_FUDIFFNET_FLAG_NO_DL_PACKAGE_FOUND,//VM_FUDIFFNET_FLAG_NO_DL_PACKAGE_FOUND + VM_FUDIFFNET_FLAG_FLASH_INIT_FAIL//VM_FUDIFFNET_FLAG_FLASH_INIT_FAIL +} vm_fudiffnet_flag_enum; +/*vm_fudiffnet_update_ret_enum*/ +typedef enum +{ + VM_FUDIFFNET_NO_UPDATE,//VM_FUDIFFNET_NO_UPDATE + VM_FUDIFFNET_UPDATE_SUCCESS,//VM_FUDIFFNET_UPDATE_SUCCESS + VM_FUDIFFNET_UPDATE_FAIL//VM_FUDIFFNET_UPDATE_FAIL +}vm_fudiffnet_update_ret_enum; + +/***************************************************************************** + * FUNCTION + * vm_srv_funet_trigger + * DESCRIPTION + * Trigger bootloader to update. + * PARAMETERS + * file_name [IN] FOTA update package + * update_type [IN] Full update or partial update + * RETURNS + * vm_srv_funet_flag_enum: update flag return + *****************************************************************************/ +extern vm_srv_funet_flag_enum vm_srv_funet_trigger(VMWCHAR * file_name, vm_srv_funet_update_type_enum update_type); + +/***************************************************************************** + * FUNCTION + * vm_fudiffnet_trigger + * DESCRIPTION + * Trigger bootloader to update differential package. + * PARAMETERS + * update_type [IN] Full update or partial update + * RETURNS + * vm_fudiffnet_flag_enum: update flag return + * EXAMPLE + * + *if (VM_FUDIFFNET_FLAG_SUCCESS == vm_fudiffnet_trigger(VM_FUDIFFNET_UPDATE_PARTIAL)) + *{ + * ... + *} + *else + *{ + * ... + *} + * + * + *****************************************************************************/ +extern vm_fudiffnet_flag_enum vm_fudiffnet_trigger(vm_fudiffnet_update_type_enum update_type); + +/***************************************************************************** + * FUNCTION + * vm_fudiffnet_get_fota_result + * DESCRIPTION + * get update result from update_info file. + * PARAMETERS + * N/A + * RETURNS + * vm_fudiffnet_update_ret_enum + * EXAMPLE + * + * vm_fudiffnet_update_ret_enum ret = VM_FUDIFFNET_NO_UPDATE; + * + * ret = vm_fudiffnet_get_fota_result(); + * if (VM_FUDIFFNET_UPDATE_SUCCESS == ret) + * { + * ... + * } + * else if(VM_FUDIFFNET_UPDATE_FAIL == ret) + * { + * vm_log_info( "fota update failed."); + * } + * else if(VM_FUDIFFNET_NO_UPDATE == ret) + * { + * vm_log_info( "fota no update."); + * } + * + *****************************************************************************/ +extern vm_fudiffnet_update_ret_enum vm_fudiffnet_get_fota_result(void); + +/***************************************************************************** + * FUNCTION + * vm_fudiffnet_get_firmware_path + * DESCRIPTION + * get firmware path + * PARAMETERS + * N/A + * RETURNS + * VMWCHAR* + * EXAMPLE + * + * VMWCHAR* firmware_path = NULL; + * firmware_path = vm_fudiffnet_get_firmware_path(); + * + *****************************************************************************/ +extern VMWCHAR* vm_fudiffnet_get_firmware_path(void); +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_FOTA_SDK_H*/ + + + + + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmftpd.h b/hardware/arduino/mtk/system/libmtk/include/vmftpd.h new file mode 100644 index 00000000..b204a1bb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmftpd.h @@ -0,0 +1,150 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmftpd_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_FTPD_SDK_H +#define VM_FTPD_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ +#include "vmsys.h" + +/* vm_ftpsrv_error_enum */ +typedef enum +{ + VM_FTPSRV_ERR_NO_ERROR = 0, //operator suceed + VM_FTPSRV_ERR_STATE_ERROR = -1, //state of ftp is mess + VM_FTPSRV_ERR_GET_MEM_FAIL = -2, //memory is not enough + VM_FTPSRV_ERR_CONNECT_NETWORK_FAIL = -3, //net work is not ready + VM_FTPSRV_ERR_FD_INIT_FAIL = -4, //file disciptor init fail + VM_FTPSRV_ERR_GET_HOSTNAME_FAIL = -5, //invalid host name + VM_FTPSRV_ERR_SRV_INIT_FAIL = -6, //server init fail + VM_FTPSRV_ERR_ERROR_FD_NUMBER = -7, //file diciptor abnormal + VM_FTPSRV_ERR_OTHERS = -65535, // other errors + VM_FTPSRV_ERR_CODE = -65536 //end mark. +}vm_ftpsrv_error_enum; + + +/***************************************************************************** + * FUNCTION + * vm_inet_ftpd_start + * DESCRIPTION + * this is for lauch ftp server + * PARAMETERS + * port : [IN] + * root_dir : [IN] + * RETURNS + * vm_ftpsrv_error_enum + * EXAMPLE + * + * if (vm_inet_ftpd_start(21, "C:\\@ftp") == VM_FTPSRV_ERR_NO_ERROR) + * { + * // do relate action + * } + * + *****************************************************************************/ +extern vm_ftpsrv_error_enum vm_inet_ftpd_start(VMUINT32 port, VMCHAR* root_dir); + + +/***************************************************************************** + * FUNCTION + * vm_inet_ftpd_stop + * DESCRIPTION + * this is for stop ftp server + * PARAMETERS + * RETURNS + * vm_ftpsrv_error_enum + * + * EXAMPLE + * + * if (vm_inet_ftpd_stop() == VM_FTPSRV_ERR_NO_ERROR) + * { + * // do relate action + * } + * + *****************************************************************************/ +extern vm_ftpsrv_error_enum vm_inet_ftpd_stop(void); + +/***************************************************************************** + * FUNCTION + * vm_inet_ftpd_restart + * DESCRIPTION + * this is for restart ftp server + * PARAMETERS + * port : [IN] + * root_dir : [IN] + * RETURNS + * vm_ftpsrv_error_enum + * + * EXAMPLE + * + * if (vm_inet_ftpd_restart(21, "C:\\@ftp") == VM_FTPSRV_ERR_NO_ERROR) + * { + * // do relate action + * } + * + *****************************************************************************/ +extern vm_ftpsrv_error_enum vm_inet_ftpd_restart(VMUINT32 port, VMCHAR* root_dir); + + +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_FTPD_SDK_H*/ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmgettag.h b/hardware/arduino/mtk/system/libmtk/include/vmgettag.h new file mode 100644 index 00000000..bbdd8f16 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmgettag.h @@ -0,0 +1,321 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMTAG_SDK_H_ +#define VMTAG_SDK_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmio.h" +#include "vmsys.h" + +#define MULTI_TAG_MAX 10 + +#define PPID 1 +#define USAGE_MODE 2 +#define PARAM 3 +#define PRICE 4 +#define TRIAL 5 +#define CN_NAME 6 +#define DEVELOPER 7 +#define SERIAL_NUM 8 +#define VERSION 9 +#define ICON 10 + + +#define GET_TAG_TRUE 1 /* get tag success */ +#define GET_TAG_ERROR 0 /* read tag error */ +#define GET_TAG_INSUFFICIENT_BUF (-1) /* memory not enough */ +#define GET_TAG_NULL_BUF (-2) /* buffer size is zero */ +#define GET_TAG_NOT_FOUND (-3) /* not find this tag */ +#define GET_TAG_FILE_ERROR (-4) /* read file error */ +#define GET_TAG_NOT_A_LIST_TAG (-5) /* tag id is not corrent */ +#define GET_TAG_LANG_NOT_FOUND (-6) /* not find language id */ +#define GET_TAG_CACHE_ERROR (-7) /* file seek error */ + +/* multi tag stucture */ +typedef struct multi_tag_t +{ + VMINT tag_id[MULTI_TAG_MAX]; /* tag id array, max size is 10 */ + VMINT tag_len[MULTI_TAG_MAX]; /* tag lenth array, max size is 10 */ + VMUCHAR * tag_content[MULTI_TAG_MAX]; /* tag content pointer array, max size is 10 */ +} MULTI_TAG; + +/***************************************************************************** + * FUNCTION + * vm_get_vm_tag + * DESCRIPTION + * get one tag from file or preload file, this support file in file system and in ROM. + * PARAMETERS + * filename : [IN] file name, if it is preload file, it should be @:\xx.rom format. + * tag_num : [IN] tag id, refer tag define in vmcert.h. + * buf : [OUT] tag value. + * buf_size : [OUT] tag value size. + * RETURNS + * get tag success or not. + * RETURN VALUES + * GET_TAG_TRUE : get tag success. + * GET_TAG_NOT_FOUND : not find this tag. + * GET_TAG_ERROR : read tag error. + * GET_TAG_INSUFFICIENT_BUF : buffer size is error. + * SEE ALSO + * vm_get_vm_tag_from_rom + * EXAMPLE + * (a). get tag and know the tag size + * + * VMINT file_type; + * VMINT buffSize = 4; // tag size is 4 + * + * if (vm_get_vm_tag(filename, VM_CE_INFO_FILE_TYPE, (void*)&liner_type, &buffSize) != GET_TAG_TRUE) + * { + * // get tag error + * } + * else + * { + * // get tag success + * } + * + * + * (b). get tag and don't know the tag size + * + * VMUINT8* tagName; + * VMINT buffSize; + * + * // get tag size + * if (vm_get_vm_tag(fileName, VM_CE_INFO_NAME, NULL, &bufSize) == GET_TAG_TRUE) + * { + * tagName = (VMUINT8 *)vm_calloc(bufSize + 1); + * + * if(tagName) + * { + * if(vm_get_vm_tag(fileName, VM_CE_INFO_NAME, tagName, &bufSize) != GET_TAG_TRUE) + * { + * vm_free(tagName); // failed + * } + * } + * } + * .... + * // free it when no use + * vm_free(tagName); + * +*****************************************************************************/ +VMINT vm_get_vm_tag(short* filename,int tag_num, void* buf ,int* buf_size); + + +/***************************************************************************** + * FUNCTION + * vm_get_multi_tags + * DESCRIPTION + * get some tags from file or preload file, max size refer to MULTI_TAG_MAX + * PARAMETERS + * filename : [IN] file name, if it is preload file, it should be @:\xx.rom format. + * tag_req : [IN & OUT] tag id and value. + * RETURNS + * get tags success or not. + * RETURN VALUES + * GET_TAG_TRUE : get tag success. + * GET_TAG_NOT_FOUND : not find this tag. + * GET_TAG_ERROR : read tag error. + * SEE ALSO + * vm_get_vm_tag + * EXAMPLE + * + * MULTI_TAG multi_tag; + * memset(&multi_tag, 0, sizeof(MULTI_TAG)); + * multi_tag. tag_id[0] = VM_CE_INFO_APP_ID; + * multi_tag. tag_id[1] = VM_CE_INFO_CERT_ID; + * multi_tag. tag_id[2] = VM_CE_INFO_NAME; + * + * // get tag size + * if (vm_get_multi_tags(fileName, &multi_tag) == GET_TAG_TRUE) + * { + * multi_tag. tag_content[0] = (VMUINT8 *)vm_calloc(multi_tag. tag_len[0] + 1); + * multi_tag. tag_content[1] = (VMUINT8 *)vm_calloc(multi_tag. tag_len[1] + 1); + * multi_tag. tag_content[2] = (VMUINT8 *)vm_calloc(multi_tag. tag_len[2] + 1); + * + * if(tagName) + * { + * if(vm_get_multi_tags(fileName, &multi_tag) != GET_TAG_TRUE) + * { + * // failed + * vm_free(multi_tag. tag_content[0] ); + * vm_free(multi_tag. tag_content[1] ); + * vm_free(multi_tag. tag_content[2] ); + * } + * } + * } + * .... + * // free them when no use + * vm_free(multi_tag. tag_content[0] ); + * vm_free(multi_tag. tag_content[1] ); + * vm_free(multi_tag. tag_content[2] ); + * +*****************************************************************************/ +VMINT vm_get_multi_tags( short* filename, MULTI_TAG* tag_req); + + +/***************************************************************************** + * FUNCTION + * vm_get_tag_by_lang_id + * DESCRIPTION + * get a tag from tag id and language id. + * PARAMETERS + * filename : [IN] file name, if it is preload file, it should be @:\xx.rom format. + * tag_num : [IN] tag id, refer tag define in vmcert.h. + * lang_id : [IN] lang id. + * buf : [OUT] tag value. + * buf_size : [OUT] tag value size. + * RETURNS + * get a tag success or not. + * RETURN VALUES + * GET_TAG_TRUE : get tag success. + * GET_TAG_ERROR : get tag error. + * GET_TAG_NOT_FOUND : not find this tag. + * GET_TAG_LANG_NOT_FOUND : not find language id. + * GET_TAG_NOT_A_LIST_TAG : tag id is not corrent. + * GET_TAG_FILE_ERROR : read tag error from file. + * GET_TAG_INSUFFICIENT_BUF : buffer size is error. + * GET_TAG_NULL_BUF : buffer size is zero + * EXAMPLE + * get app's english (language id is 44, this id can be get from reseditor) name + * + * VMUINT8* tagName; + * VMINT buffSize; + * + * if (vm_get_tag_by_lang_id(fileName, VM_CE_INFO_MULTI_NAME_LIST, NULL, &buffSize, 44) == GET_TAG_TRUE) + * { + * tagName = (VMUINT8 *)vm_calloc(bufSize + 1); + * vm_get_tag_by_lang_id(fileName, VM_CE_INFO_MULTI_NAME_LIST, tagName, &buffSize, 44); + * } + * + +*****************************************************************************/ +VMINT vm_get_tag_by_lang_id( short* filename, int tag_num, void* buf, int* buf_size, int lang_id ); + + +/***************************************************************************** + * FUNCTION + * vm_get_multi_tags_by_lang_id + * DESCRIPTION + * get tags from tag id and language id. + * PARAMETERS + * filename : [IN] file name, if it is preload file, it should be @:\xx.rom format. + * lang_id : [IN] lang id. + * tag_req : [IN & OUT] tag id and value. + * RETURNS + * get tags success or not. + * RETURN VALUES + * GET_TAG_TRUE : get tag success. + * GET_TAG_ERROR : get tag error. + * GET_TAG_LANG_NOT_FOUND : not find language id. + * GET_TAG_INSUFFICIENT_BUF : there is no enough memroy. + * EXAMPLE + * + * MULTI_TAG multi_tag; + * memset(&multi_tag, 0, sizeof(MULTI_TAG)); + * multi_tag. tag_id[0] = VM_CE_INFO_NAME_LIST; + * multi_tag. tag_id[1] = VM_CE_INFO_DESC_LIST; + * multi_tag. tag_id[2] = VM_CE_INFO_ZIMO_LIST; + * + * // get tag size + * if (vm_get_multi_tags_by_lang_id(fileName, &multi_tag, 44) == GET_TAG_TRUE) + * { + * multi_tag. tag_content[0] = (VMUINT8 *)vm_calloc(multi_tag. tag_len[0] + 1); + * multi_tag. tag_content[1] = (VMUINT8 *)vm_calloc(multi_tag. tag_len[1] + 1); + * multi_tag. tag_content[2] = (VMUINT8 *)vm_calloc(multi_tag. tag_len[2] + 1); + * + * if(tagName) + * { + * if(vm_get_multi_tags_by_lang_id(fileName, &multi_tag, 44) != GET_TAG_TRUE) + * { + * // failed + * vm_free(multi_tag. tag_content[0] ); + * vm_free(multi_tag. tag_content[1] ); + * vm_free(multi_tag. tag_content[2] ); + * } + * } + * } + * .... + * // free them when no use + * vm_free(multi_tag. tag_content[0] ); + * vm_free(multi_tag. tag_content[1] ); + * vm_free(multi_tag. tag_content[2] ); + * +*****************************************************************************/ +VMINT vm_get_multi_tags_by_lang_id( short* filename, MULTI_TAG * tag_req, int lang_id ); + + +/***************************************************************************** + * FUNCTION + * vm_get_vm_tag_from_rom + * DESCRIPTION + * get a tag from rom. + * PARAMETERS + * rom : [IN] the address of preload app. + * tag_num : [IN] tag id, refer tag define in vmcert.h. + * buf : [OUT] tag value. + * buf_size : [OUT] tag value size. + * RETURNS + * get tag success or not. + * RETURN VALUES + * GET_TAG_TRUE : get tag success. + * GET_TAG_NOT_FOUND : not find this tag. + * GET_TAG_ERROR : read tag error. + * GET_TAG_INSUFFICIENT_BUF : buffer size is error. + * SEE ALSO + * vm_get_vm_tag + * EXAMPLE + * + * VMUINT8* tagName; + * VMINT buffSize; + * + * if (vm_get_vm_tag_from_rom(address, VM_CE_INFO_IMSI, NULL, &buffSize) == GET_TAG_TRUE) + * { + * tagName = (VMUINT8 *)vm_calloc(bufSize + 1); + * vm_get_vm_tag_from_rom(fileName, VM_CE_INFO_IMSI, tagName, &buffSize); + * } + * +*****************************************************************************/ +VMINT vm_get_vm_tag_from_rom(VMUINT8* rom, int tag_num, void* buf , int* buf_size); + + +#ifdef __cplusplus +} +#endif + +#endif /* VMTAG_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmgfxold.h b/hardware/arduino/mtk/system/libmtk/include/vmgfxold.h new file mode 100644 index 00000000..53287309 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmgfxold.h @@ -0,0 +1,680 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + + +#ifndef VMCPT_SDK_H_ +#define VMCPT_SDK_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +#include "vmgraph.h" +#include "vmlog.h" + +/* vmgraph.h*/ + +/****************************************************************************** +* FUNCTION +* vm_graphic_lock +* DESCRIPTION +* create layer and set clip region. clip region is full screen. +* PARAMETERS +* void +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_lock(void); + + + +/****************************************************************************** +* FUNCTION +* vm_graphic_unlock +* DESCRIPTION +* blt the layer to LCD and delete layer +* PARAMETERS +* void +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_unlock(void); + + + +/****************************************************************************** +* FUNCTION +* vm_graphic_get_buffer +* DESCRIPTION +* get the layer buffer +* PARAMETERS +* void +* RETURNS +* the layer buffer pointer +*****************************************************************************/ +VMUINT8 * vm_graphic_get_buffer(void); + + + +/****************************************************************************** +* FUNCTION +* vm_graphic_flush_buffer +* DESCRIPTION +* blt the layer to LCD. +* PARAMETERS +* void +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_flush_buffer(void); + + +/****************************************************************************** +* FUNCTION +* vm_initialize_screen_buffer +* DESCRIPTION +* create base layer(if not exist) and reset clip region to full screen. +* PARAMETERS +* void +* RETURNS +* void +*****************************************************************************/ +void vm_initialize_screen_buffer(void); + + + +/****************************************************************************** +* FUNCTION +* vm_finalize_screen_buffer +* DESCRIPTION +* delete base layer. +* PARAMETERS +* void +* RETURNS +* void +*****************************************************************************/ +void vm_finalize_screen_buffer(void); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_draw_gif +* DESCRIPTION +* decode the gif image to base layer +* PARAMETERS +* gif : [IN] image data pointer +* gif_len : [IN]image data length +* x : [IN]x offset of source start position +* y : [IN]y offset of source start position +* width : [IN]source image width +* height : [IN]source image height +* frame_index : [IN]frame index of gif image +* RETURNS +* always return 0, make no sense +*****************************************************************************/ +VMINT vm_graphic_draw_gif(VMUINT8* gif, VMINT gif_len, VMINT x, VMINT y, VMINT width, VMINT height, VMINT frame_index); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_bitblt +* DESCRIPTION +* draw the resource to base layer +* PARAMETERS +* resid : [IN] resource id +* x : [IN] x offset of destination +* y : [IN] y offset of destination +* RETURNS +* always return -1, make no sense +*****************************************************************************/ +VMINT vm_graphic_bitblt(VMINT resid, int x, int y); + + + +/****************************************************************************** +* FUNCTION +* vm_graphic_drawtext +* DESCRIPTION +* draw the text to base layer +* PARAMETERS +* x : [IN] x offset of destination +* y : [IN] y offset of destination +* s : [IN] to be shown string buffer pointer +* length : [IN] string length +* color : [IN] string color +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_drawtext(VMINT x, VMINT y, VMWSTR s, VMINT32 length, VMINT color); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_setpixel +* DESCRIPTION +* draw the point to base layer +* PARAMETERS +* x : [IN] x offset of destination +* y : [IN] y offset of destination +* color : [IN] point color +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_setpixel(VMINT x, VMINT y, VMINT color); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_drawline +* DESCRIPTION +* draw the line to base layer +* PARAMETERS +* x0 : [IN] x offset of start position +* y0 : [IN] y offset of start position +* x1 : [IN] x offset of end position +* y1 : [IN] y offset of end position +* color : [IN] line color +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_drawline(VMINT x0, VMINT y0, VMINT x1, VMINT y1, VMINT color); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_drawrect +* DESCRIPTION +* draw the rect to base layer +* PARAMETERS +* x : [IN] x offset of start position +* y : [IN] y offset of start position +* width : [IN] rect width +* height : [IN] rect height +* color : [IN] rect color +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_drawrect(VMINT x, VMINT y, VMINT width, VMINT height, VMINT color); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_fillrect +* DESCRIPTION +* draw the filled rect to base layer +* PARAMETERS +* x : [IN] x offset of start position +* y : [IN] y offset of start position +* width : [IN] rect width +* height : [IN] rect height +* color : [IN] rect color +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_fillrect(VMINT x, VMINT y, int width, int height, int color); + + +/* vmddraw.h*/ + +/****************************************************************************** + * FUNCTION + * vm_dd_initialize_clip_rect + * DESCRIPTION + * get layer buffer and set clip region to the full screen size + * PARAMETERS + * void + * RETURNS + * void + *****************************************************************************/ +void vm_dd_initialize_clip_rect(void); + + + +/****************************************************************************** + * FUNCTION + * vm_dd_set_clip + * DESCRIPTION + * set the clip region + * PARAMETERS + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * width : [IN] clip region width + * height : [IN] clip region height + * RETURNS + * void + *****************************************************************************/ +void vm_dd_set_clip(VMINT x, VMINT y, VMINT width, VMINT height); + + + +/****************************************************************************** + * FUNCTION + * vm_dd_initialize_clip_rect + * DESCRIPTION + * reset clip region to the full screen size + * PARAMETERS + * void + * RETURNS + * void + *****************************************************************************/ +void vm_dd_reset_clip(void); + + +/****************************************************************************** + * FUNCTION + * vm_dd_blt_all_cutting_frames + * DESCRIPTION + * reduce the image to appointed size + * PARAMETERS + * buf : [IN] destination buffer + * source_surface : [IN] source buffer + * x_num : [IN] resized width + * y_num : [IN] resized height + * width : [IN] source width + * height : [IN] source height + * RETURNS + * void + *****************************************************************************/ +void vm_dd_blt_all_cutting_frames(VMBYTE *buf, VMBYTE *source_surface, VMINT x_num, VMINT y_num, VMINT width, VMINT height); + + +/****************************************************************************** + * FUNCTION + * vm_dd_img_flood + * DESCRIPTION + * draw the appointed frame index image to destination buffer + * PARAMETERS + * buf : [IN] destination buffer + * x_dst : [IN] x offset of destination + * y_dst : [IN] y offset of destination + * source_surface : [IN] source buffer + * width : [IN] source width + * height : [IN] source height + * frame_index : [IN]frame index + * RETURNS + * void + *****************************************************************************/ +void vm_dd_img_flood(VMBYTE *buf, VMINT x_dst, VMINT y_dst,VMBYTE *source_surface, VMINT width, VMINT height, VMINT frame_index); + + +/****************************************************************************** + * FUNCTION + * vm_dd_copy + * DESCRIPTION + * copy the appointed frame index/mirror mode/position image to destination buffer + * PARAMETERS + * buf : [IN] destination buffer + * x_dest : [IN] x offset of destination + * y_dest : [IN] y offset of destination + * source_surface : [IN] source buffer + * x_src : [IN]x offset of source + * y_src : [IN]y offset of source + * width : [IN] source width + * height : [IN] source height + * frame_index : [IN]frame index + * direction : [IN] copy direction, means mirror direction + * RETURNS + * void + *****************************************************************************/ +void vm_dd_copy(VMBYTE *buf, VMINT x_dest, VMINT y_dest, VMBYTE *source_surface, VMINT x_src, VMINT y_src, VMINT width, VMINT height, VMINT frame_index, VMINT direction); + + +/****************************************************************************** + * FUNCTION + * vm_dd_flood_4_regional + * DESCRIPTION + * copy the appointed frame index image to destination buffer twice, vertical alignment + * PARAMETERS + * buf : [IN] destination buffer + * x_dst : [IN] x offset of destination + * y_dst : [IN] y offset of destination + * source_surface : [IN] source buffer + * width : [IN] source width + * height : [IN] source height + * frame_index : [IN]frame index + * RETURNS + * void + *****************************************************************************/ +void vm_dd_flood_4_regional(VMBYTE *buf, VMINT x_dst, VMINT y_dst,VMBYTE *source_surface, VMINT width, VMINT height, VMINT frame_index); + + +/****************************************************************************** + * FUNCTION + * vm_dd_load_image + * DESCRIPTION + * image decode + * PARAMETERS + * img : [IN] source image buffer + * img_len : [IN] source image length + * RETURNS + * if succeed ,return pointer of decoded data, otherwise return NULL + *****************************************************************************/ +VMUINT8* vm_dd_load_image(VMUINT8 *img, VMINT img_len); + + +/****************************************************************************** + * FUNCTION + * vm_dd_get_img_property + * DESCRIPTION + * get the appointed frame property + * PARAMETERS + * img : [IN] source image buffer + * frame_index : [IN] source image index + * RETURNS + * frame property structure pointer + *****************************************************************************/ +struct frame_prop * vm_dd_get_img_property(VMUINT8 *img, VMUINT8 frame_index); + + +/****************************************************************************** + * FUNCTION + * vm_dd_get_frame_number + * DESCRIPTION + * get the gif image frame number + * PARAMETERS + * img : image pointer + * RETURNS + * frame number + *****************************************************************************/ +VMINT vm_dd_get_frame_number(VMUINT8 *img); + + +/****************************************************************************** + * FUNCTION + * vm_dd_clean + * DESCRIPTION + * clean the buffer with the appointed color + * PARAMETERS + * buf : [IN] buffer pointer + *color16 : [IN] color value + * RETURNS + * void + *****************************************************************************/ +void vm_dd_clean(VMUINT8* buf, VMUINT16 color16); + + + +/****************************************************************************** + * FUNCTION + * vm_dd_active_layer + * DESCRIPTION + * active layer handle + * PARAMETERS + * handle : [IN] layer handle + * RETURNS + * void + *****************************************************************************/ +void vm_dd_active_layer(VMINT handle); + + +/****************************************************************************** + * FUNCTION + * vm_graph_drawtext + * DESCRIPTION + * show string to base layer + * PARAMETERS + * x : [IN] x offset of destination + * y : [IN] y offset of destination + * s : [IN] string pointer + * length : [IN] string length + * color : [IN] string color + * RETURNS + * void + *****************************************************************************/ +void vm_graph_drawtext(VMINT x, VMINT y, VMWSTR s, VMINT32 length, VMUINT16 color); + + +/****************************************************************************** + * FUNCTION + * vm_graph_release_surface + * DESCRIPTION + * free buffer + * PARAMETERS + * off_surface : [IN]buffer pointer + * RETURNS + * void + *****************************************************************************/ +void vm_graph_release_surface(VMUINT8 * off_surface); + + +/****************************************************************************** + * FUNCTION + * vm_graph_create_custom_buf + * DESCRIPTION + * create canvas + * PARAMETERS + * width : [IN] buffer width + * height : [IN] buffer height + * RETURNS + * buffer pointer + *****************************************************************************/ +VMUINT8 * vm_graph_create_custom_buf(VMINT width, VMINT height); + + +/****************************************************************************** + * FUNCTION + * vm_graph_delete_custom_buf + * DESCRIPTION + * delete canvas + * PARAMETERS + * custom_buf : [IN] canvas handle, it means buffer pointer + * RETURNS + * void + *****************************************************************************/ +void vm_graph_delete_custom_buf(VMUINT8 * custom_buf); + + +/****************************************************************************** + * FUNCTION + * vm_graph_move + * DESCRIPTION + * copy buffer from source to destination + * PARAMETERS + * screen_buf : [IN] destination buffer pointer + * x_dest : [IN] x offset of destination + * y_dest : [IN] y offset of destination + * custom_buf : [IN] source buffer pointer + * x_src : [IN]x offset of source + * y_src : [IN]y offset of source + * width : [IN]source width + * height : [IN]source height + * RETURNS + * void + *****************************************************************************/ +void vm_graph_move(VMBYTE *screen_buf, VMINT x_dest, VMINT y_dest, VMBYTE *custom_buf, VMINT x_src, VMINT y_src, VMINT width, VMINT height); + + +/* define vm_graphic_set_text_clip, only for compatible with older version */ +#define vm_graphic_set_text_clip vm_graphic_set_clip + +/* define vm_graphic_reset_text_clip, only for compatible with older version */ +#define vm_graphic_reset_text_clip vm_graphic_reset_clip +/* define vm_dd_clean_ex, only for compatible with older version */ +#define vm_dd_clean_ex vm_dd_clean + +/* define vm_dd_copy_ex, only for compatible with older version */ +#define vm_dd_copy_ex vm_dd_copy + +/* define vm_dd_setpixel_ex, only for compatible with older version */ +#define vm_dd_setpixel_ex vm_graphic_set_pixel + +/* define vm_dd_setpixel, only for compatible with older version */ +#define vm_dd_setpixel vm_graphic_set_pixel + +/* define vm_dd_getpixel_ex, only for compatible with older version */ +#define vm_dd_getpixel_ex vm_graphic_get_pixel + +/* define vm_dd_getpixel, only for compatible with older version */ +#define vm_dd_getpixel vm_graphic_get_pixel + +/* define vm_dd_line_ex, only for compatible with older version */ +#define vm_dd_line_ex vm_graphic_line + +/* define vm_dd_line, only for compatible with older version */ +#define vm_dd_line vm_graphic_line + +/* define vm_dd_rect_ex, only for compatible with older version */ +#define vm_dd_rect_ex vm_graphic_rect + +/* define vm_dd_rect, only for compatible with older version */ +#define vm_dd_rect vm_graphic_rect + +/* define vm_dd_fillrect_ex, only for compatible with older version */ +#define vm_dd_fillrect_ex vm_graphic_fill_rect + +/* define vm_dd_fillrect, only for compatible with older version */ +#define vm_dd_fillrect vm_graphic_fill_rect + +/* define vm_dd_blt_ex, only for compatible with older version */ +#define vm_dd_blt_ex vm_graphic_blt + +/* define vm_dd_blt, only for compatible with older version */ +#define vm_dd_blt vm_graphic_blt + +/* define vm_dd_rotate_ex, only for compatible with older version */ +#define vm_dd_rotate_ex vm_graphic_rotate + +/* define vm_dd_rotate, only for compatible with older version */ +#define vm_dd_rotate vm_graphic_rotate + +/* define vm_dd_mirror_ex, only for compatible with older version */ +#define vm_dd_mirror_ex vm_graphic_mirror + +/* define vm_dd_mirror, only for compatible with older version */ +#define vm_dd_mirror vm_graphic_mirror + +/* define vm_dd_blt_with_opacity, only for compatible with older version */ +#define vm_dd_blt_with_opacity vm_graphic_blt_ex + +/* define vm_graph_initialize, only for compatible with older version */ +#define vm_graph_initialize vm_initialize_screen_buffer + +/* define vm_graph_finalize, only for compatible with older version */ +#define vm_graph_finalize vm_finalize_screen_buffer + +/* define vm_graph_get_buffer, only for compatible with older version */ +#define vm_graph_get_buffer vm_graphic_get_buffer + +/* define vm_graph_flush_buffer, only for compatible with older version */ +#define vm_graph_flush_buffer vm_graphic_flush_buffer + +/* define vm_graph_initialize_clip_rect, only for compatible with older version */ +#define vm_graph_initialize_clip_rect vm_dd_initialize_clip_rect + +/* define vm_graph_blt_all_cutting_frames, only for compatible with older version */ +#define vm_graph_blt_all_cutting_frames vm_dd_blt_all_cutting_frames + +/* define vm_graph_img_flood, only for compatible with older version */ +#define vm_graph_img_flood vm_dd_img_flood + +/* define vm_graph_copy, only for compatible with older version */ +#define vm_graph_copy vm_dd_copy + +/* define vm_graph_load_image, only for compatible with older version */ +#define vm_graph_load_image vm_dd_load_image + +/* define vm_graph_get_img_property, only for compatible with older version */ +#define vm_graph_get_img_property vm_dd_get_img_property + +/* define vm_graph_get_frame_number, only for compatible with older version */ +#define vm_graph_get_frame_number vm_dd_get_frame_number + +/* define vm_graph_clean, only for compatible with older version */ +#define vm_graph_clean vm_dd_clean + +/* define vm_graph_get_bits_per_pixel, only for compatible with older version */ +#define vm_graph_get_bits_per_pixel vm_graphic_get_bits_per_pixel + +/* define vm_graph_set_clip, only for compatible with older version */ +#define vm_graph_set_clip vm_graphic_set_clip + +/* define vm_graph_reset_clip, only for compatible with older version */ +#define vm_graph_reset_clip vm_graphic_reset_clip + +/* define vm_graphic_reset_text_clip, only for compatible with older version */ +#define vm_graph_get_screen_width vm_graphic_get_screen_width + +/* define vm_graph_get_screen_height, only for compatible with older version */ +#define vm_graph_get_screen_height vm_graphic_get_screen_height + +/* define vm_graph_get_character_height, only for compatible with older version */ +#define vm_graph_get_character_height vm_graphic_get_character_height + +/* define vm_graph_get_character_width, only for compatible with older version */ +#define vm_graph_get_character_width vm_graphic_get_character_width + +/* define vm_graph_measure_character, only for compatible with older version */ +#define vm_graph_measure_character vm_graphic_measure_character + +/* define vm_graph_get_string_width, only for compatible with older version */ +#define vm_graph_get_string_width vm_graphic_get_string_width + +/* define vm_graph_set_font, only for compatible with older version */ +#define vm_graph_set_font vm_graphic_set_font + +/* define vm_graph_setpixel, only for compatible with older version */ +#define vm_graph_setpixel vm_graphic_set_pixel + +/* define vm_graph_getpixel, only for compatible with older version */ +#define vm_graph_getpixel vm_graphic_get_pixel + +/* define vm_graph_line, only for compatible with older version */ +#define vm_graph_line vm_graphic_line + +/* define vm_graph_rect, only for compatible with older version */ +#define vm_graph_rect vm_graphic_rect + +/* define vm_graph_fillrect, only for compatible with older version */ +#define vm_graph_fillrect vm_graphic_fill_rect + +/* define vm_graph_blt, only for compatible with older version */ +#define vm_graph_blt vm_graphic_blt + +/* define vm_graph_rotate, only for compatible with older version */ +#define vm_graph_rotate vm_graphic_rotate + +/* define vm_graph_mirror, only for compatible with older version */ +#define vm_graph_mirror vm_graphic_mirror + +/* define vm_graph_draw_gif, only for compatible with older version */ +#define vm_graph_draw_gif vm_graphic_draw_gif + +#ifdef __cplusplus +} +#endif + +#endif /* VMCPT_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmgps.h b/hardware/arduino/mtk/system/libmtk/include/vmgps.h new file mode 100644 index 00000000..3d482f3e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmgps.h @@ -0,0 +1,352 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMGPS_SDK_H_ +#define VMGPS_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/*GPS open result status*/ +typedef enum{ + VM_GPS_OPEN_MEMORY_LESS = -2 , /*memory not enough*/ + VM_GPS_OPEN_RES_LESS = -1 , /*lack of resource*/ + VM_GPS_OPEN_SUCCESS = 0, /*Open successfully, need waiting callback */ + VM_GPS_OPEN_ALREADY_OPEN = 1 /*Already open*/ +} vm_gps_open_state_enum; + +/*GPS close result status*/ +typedef enum{ + VM_GPS_CLOSE_FAILED = -1, /*Close failed*/ + VM_GPS_CLOSE_SUCCESS = 0, /*Close successfully*/ + VM_GPS_CLOSE_STILL_APP_USE_DATA = 1 /*GPS information still used by other application*/ +} vm_gps_close_state_enum; + +/*GPS set mode result status*/ +typedef enum{ + VM_GPS_SET_MODE_NOT_OPEN = -1, /*GPS not opened, please open it first*/ + VM_GPS_SET_MODE_CLOSE_SUCCESS = 0, /*set mode successfully*/ + VM_GPS_SET_PARAM_SUCCESS = 1 /*set mode successfully*/ +} vm_gps_setmode_state_enum; + +/*GPS type. This type dependent your GPS chip. 3336 only support VM_GPS_ONLY. */ +typedef enum +{ + VM_GPS_ONLY, /* GPS_ONLY */ + VM_GPS_GLONASS, /* GPS+GLONASS */ + VM_GPS_BEIDOU, /* GPS+BEIDOU */ + VM_GPS_TYPE_END +} vm_gps_type_enum; + +#define VM_MAX_GPGGA_SENTENCE_LENGTH 100 +#define VM_MAX_GPGSA_SENTENCE_LENGTH 80 +#define VM_MAX_GPRMC_SENTENCE_LENGTH 100 +#define VM_MAX_GPVTG_SENTENCE_LENGTH 80 +#define VM_MAX_GPGSV_SENTENCE_LENGTH 400 +#define VM_MAX_GLGSV_SENTENCE_LENGTH 400 +#define VM_MAX_BDGSV_SENTENCE_LENGTH 400 +#define VM_MAX_BDGSA_SENTENCE_LENGTH 80 +#define VM_MAX_GLGSA_SENTENCE_LENGTH 80 + +/*GPS data structure */ +typedef struct +{ + VMUINT8 GPGGA[VM_MAX_GPGGA_SENTENCE_LENGTH+1]; /* GGA data */ + VMUINT8 GPGSA[VM_MAX_GPGSA_SENTENCE_LENGTH+1]; /* GSA data */ + VMUINT8 GPRMC[VM_MAX_GPRMC_SENTENCE_LENGTH+1]; /* RMC data */ + VMUINT8 GPVTG[VM_MAX_GPVTG_SENTENCE_LENGTH+1]; /* VTG data */ + VMUINT8 GPGSV[VM_MAX_GPGSV_SENTENCE_LENGTH+1]; /* GSV data */ + VMUINT8 GLGSV[VM_MAX_GLGSV_SENTENCE_LENGTH+1]; /* GLONASS GSV data */ + VMUINT8 GLGSA[VM_MAX_GLGSA_SENTENCE_LENGTH+1]; /* GLONASS GSA data */ + VMUINT8 BDGSV[VM_MAX_BDGSV_SENTENCE_LENGTH+1]; /* BD GSV data */ + VMUINT8 BDGSA[VM_MAX_BDGSA_SENTENCE_LENGTH+1]; /* BD GSA data */ +} vm_gps_sentence_info; + +/*GPS start mode status. Only for test.*/ +typedef enum +{ + VM_GPS_START_MODE_NULL, + VM_GPS_HOT_START, /* To test GPS hot start */ + VM_GPS_WARM_START, /* To test GPS warm start */ + VM_GPS_COLD_START, /* To test GPS cold start */ + VM_GPS_FULL_START, /* To test GPS full start */ + VM_GPS_START_TYPE_END +}vm_gps_mode_enum; + +/*GPS start set parameter*/ +typedef enum +{ + VM_GPS_CMD_SET_LOCATION_REPORT_PERIOD = 1, /* Set GPS positioning period of normal mode. The minimun is 1s. */ + VM_GPS_CMD_SET_LOCATION_REPORT_PREIOD_SLEEP_WORK, /* Set GPS positioning period of low power mode (Sleep First Mode). GPS will power off firstly in positioning cycle. And then willl auto power on to get position before period timer out.*/ + VM_GPS_CMD_SET_LOCATION_REPORT_PREIOD_WROK_SLEEP, /* Set GPS positioning period of low power mode (Work First Mode). GPS will power on to get position. And then will power off for low power. After period timer out will power on again. */ + VM_GPS_CMD_SET_ASSIST_DATA_FOR_FAST_FIXED, /* Set GPS assist data for ast fixed. */ + VM_GPS_CMD_SET_END +} vm_gps_set_param_enum; + +/*GPS assist data*/ +typedef struct +{ + VMUINT16 u2YEAR ; /* > 2000 */ + VMUINT8 u1MONTH; /* 1~12 */ + VMUINT8 u1DAY; /* 1~31*/ + VMUINT8 u1HOUR; /* 0~23*/ + VMUINT8 u1MIN; /* 0~59*/ + VMUINT8 u1SEC; /* 0~59*/ +}vm_gps_assist_data_cfg; + +/*GPS callback message*/ +typedef enum +{ + VM_GPS_OPEN_CNF, /* GPS open confirm msg, data is the result of success of not */ + VM_GPS_SET_MODE_CNF, /* GPS set mode confirm msg, data is the result of success of not */ + VM_GPS_CLOSE_CNF, /* GPS close confirm msg, data is the result of success of not, LINKIT app cannot receive this msg now */ + VM_GPS_SENTENCE_DATA, /* GPS data receive msg, the data is the GPS sentence data, refer vm_gps_sentence_info */ + VM_GPS_SET_PARAM_CNF /* GPS set parameter confirm msg, data is the result of success of not */ +}vm_gps_msg_type_enum; + + +typedef void (*VM_GPS_CAlLBACK_FUNC)(VMINT msg, void* data); + +/***************************************************************************** +* FUNCTION + * vm_gps_open + * DESCRIPTION + * Open GPS. This funtion will also open UART port. + * PARAMETERS + * period [IN] period of update data, must be 1, now + * call_back [IN] callback function, will be invoked when get the message of vm_gps_msg_type_enum. + * RETURNS + * result of open operation. + * RETURN VALUES + * VM_GPS_OPEN_SUCCESS : Open successfully. + * VM_GPS_OPEN_ALREADY_OPEN : Already open. + * VM_GPS_OPEN_MEMORY_LESS : memory not enough + * VM_GPS_OPEN_RES_LESS : lack of resource + * + * Example + * + * + * vm_gps_sentence_info g_info + * + * static void vm_gps_callback(VMINT msg, void* data) + * { + * switch(msg) + * { + * case VM_GPS_OPEN_CNF: + * { + * VMINT result = (VMINT)data; + * if(result == 0) + * { + * // open success + * // if need you can set mode + * // vm_gps_set_mode(); + * } + * else + * { + * // open failed + * } + * } + * break; + * case VM_GPS_CLOSE_CNF: + * // app cannot receive this msg now, ignore this. + * break; + * case VM_GPS_SET_MODE_CNF: + * { + * VMINT result = (VMINT)data; + * if(result == 0) + * // set mode success + * else + * // set mode failed + * } + * break; + * case VM_GPS_SENTENCE_DATA: + * { + * // copy data + * memcpy(&g_info, (vm_gps_sentence_info*)data, sizeof(vm_gps_sentence_info)); + * + * // deal with the data + * } + * break; + * } + * } + * + * int vm_gps_test(void) + * { + * VMINT result; + * result = vm_gps_open( 1, VM_GPS_ONLY, vm_gps_callback); + * + * if(result == VM_GPS_OPEN_SUCCESS) + * { + * // this is first time to open GPS, need to get the message VM_GPS_OPEN_CNF + * } + * else if(result == VM_GPS_OPEN_ALREADY_OPEN) + * { + * // GPS had been opened before, can get data, no need to wait VM_GPS_OPEN_CNF + * // if need you can set mode + * // vm_gps_set_mode(); + * } + * else + * { + * // open failed + * } + * } + * + * + * void handle_sysevt(VMINT message, VMINT param) + * { + * switch (message) + * { + * case VM_MSG_CREATE: + * { + * VMINT result; + * result = vm_gps_open( 1, VM_GPS_ONLY, vm_gps_callback); + * + * if(result == VM_GPS_OPEN_SUCCESS) + * { + * // this is first time to open GPS, need to get the message VM_GPS_OPEN_CNF + * } + * else if(result == VM_GPS_OPEN_ALREADY_OPEN) + * { + * // GPS had been opened before, can get data, no need to wait VM_GPS_OPEN_CNF + * // if need you can set mode + * // vm_gps_set_mode(); + * } + * else + * { + * // open failed + * } + * } + * break; + * case VM_MSG_QUIT: + * vm_gps_close(); + * break; + * break; + * } + * } + * } + * + * + *****************************************************************************/ +VMINT vm_gps_open(VMUINT period, vm_gps_type_enum type, VM_GPS_CAlLBACK_FUNC callback); + +/***************************************************************************** +* FUNCTION + * vm_gps_close + * DESCRIPTION + * Close GPS. This funtion will close GPS if there is no other application use GPS. + * RETURNS + * result of close operation. + * RETURN VALUES + * VM_GPS_CLOSE_SUCCESS : Close successfully. + * VM_GPS_CLOSE_STILL_APP_USE_DATA : GPS information still used by other application + * VM_GPS_CLOSE_FAILED : Close failed. + * + * Example + * + * please refer vm_gps_open + * +*****************************************************************************/ +VMINT vm_gps_close(void); + +/***************************************************************************** +* FUNCTION + * vm_gps_set_mode + * DESCRIPTION + * set GPS start mode. This API is only for test. Please don't use it in normal usage. + * PARAMETERS + * mode [IN] start mode of GPS, please refer vm_gps_mode_enum type + * RETURNS + * result of close operation. + * RETURN VALUES + * VM_GPS_SET_MODE_CLOSE_SUCCESS : set mode successfully. + * VM_GPS_SET_MODE_NOT_OPEN : GPS not opened, need open it. + * + * Example + * + * please refer vm_gps_open + * +*****************************************************************************/ +VMINT vm_gps_set_mode(vm_gps_mode_enum mode); + +/***************************************************************************** +* FUNCTION + * vm_gps_set_param + * DESCRIPTION + * set GPS parameter + * PARAMETERS + * mode [IN] set parameter of GPS, please refer vm_gps_param_enum type + * value [IN] parameter value + * RETURNS + * result of the operation. + * RETURN VALUES + * 0 : set mode successfully. + * -1 : GPS not opened, need open it. + * + * Example + * + * + * void set_param(void) + * { + * // If you need set gps assist data. + * vm_gps_assist_data_cfg cfg; + * cfg.u2YEAR = 2000; + * cfg.u1MONTH = 7; + * cfg.u1DAY = 22; + * cfg.u1HOUR = 10; + * cfg.u1MIN = 10; + * cfg.u1SEC = 10; + * vm_gps_set_param(VM_GPS_CMD_SET_ASSIST_DATA_FOR_FAST_FIXED, &cfg); + * + * // If you need set GPS normal mode and positioning period. + * vm_gps_set_param(VM_GPS_CMD_SET_LOCATION_REPORT_PERIOD, 1); + * // If you need set GPS low power mode (Sleep first mode) and positioning period. + * vm_gps_set_param(VM_GPS_CMD_SET_LOCATION_REPORT_PREIOD_SLEEP_WORK, 60); + * // If you need set GPS low power mode (Work first mode) and positioning period. + * vm_gps_set_param(VM_GPS_CMD_SET_LOCATION_REPORT_PREIOD_WROK_SLEEP, 60); + * } + * + * +*****************************************************************************/ +VMINT vm_gps_set_param(vm_gps_set_param_enum param, VMUINT32 value); + +#ifdef __cplusplus +} +#endif + +#endif /* VMGPS_SDK_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmgraph.h b/hardware/arduino/mtk/system/libmtk/include/vmgraph.h new file mode 100644 index 00000000..70d84355 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmgraph.h @@ -0,0 +1,2676 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMGRAPHIC_SDK_H_ +#define VMGRAPHIC_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* GDI return code */ +typedef enum +{ + VM_GDI_ERR_BASE_LAYER_EXIST = -17, //baselayer exist when set wallpaper + VM_GDI_FONTSIZE_NOT_SUPPORT = -16, //self define size not support + VM_GDI_ERR_NOT_SUPPORT_ROTATE = -15, + VM_GDI_MIBR_ERR = -14, /*general MIBR error*/ + VM_GDI_MIBR_RES_ERR, /*GDI MIBR resource error*/ + VM_GDI_MIBR_NOT_FORE, /*APP is not in foreground status*/ + VM_GDI_MIBR_NO_RES, /*no resource */ + VM_GDI_ERR_PLATFORM_DECODE_FAILED, /*platform decode error*/ + VM_GDI_ERR_BASE_LAYER_NOT_EXIST, /*base layer not exist*/ + VM_GDI_ERR_UNSUPPORT_IMAGE_TYPE, /*decode image type no support*/ + VM_GDI_ERR_MALLOC_FAILED, /*can not malloc memory*/ + VM_GDI_ERR_LAYER_BIND, /*layer bind with canvas error*/ + VM_GDI_ERR_FREE_RES, /*free resource error*/ + VM_GDI_ERR_CREATE_LAYER_FAILED, /*create layer fail*/ + VM_GDI_ERR_CREATE_CANVAS_FAILED, /*general MIBR fail*/ + VM_GDI_ERR_WRONG_PARAM, /*parameter error*/ + VM_GDI_FAILED, /*general GDI error*/ + VM_GDI_SUCCEED /*general GDI succeed*/ +}vm_graphic_result; + +/*GDI rotate type*/ +typedef enum +{ + VM_GDI_ROTATE_NORMAL = 0, /*rotate 0 degree*/ + VM_GDI_ROTATE_90 = 0x01, /*rotate 90 degree*/ + VM_GDI_ROTATE_180 = 0x02, /*rotate 180 degree*/ + VM_GDI_ROTATE_270 = 0x03, /*rotate 270 degree*/ + VM_GDI_MIRROR = 0x80, /*mirror*/ + VM_GDI_MIRROR_ROTATE_90 = 0x81,/*mirror 90 degree*/ + VM_GDI_MIRROR_ROTATE_180 = 0x82,/*mirror 180 degree*/ + VM_GDI_MIRROR_ROTATE_270 = 0x83/*mirror 270 degree*/ +}vm_graphic_rotate_value; + + +/*GDI gradient paint style*/ +typedef enum +{ + VM_GDI_GP_HOR = 0, /*horizon*/ + VM_GDI_GP_VER, /*vertical*/ + VM_GDI_GP_DIA, /*lean 45 degree */ + VM_GDI_GP_DIA_INV, /*de-lean 45 degree*/ + VM_GDI_GP_FLIP /*from middle to edge*/ +}vm_graphic_gp_style; + +/*screen rotate type enum*/ +typedef enum +{ + VM_GRAPHIC_SCREEN_ROTATE_0=0, + VM_GRAPHIC_SCREEN_ROTATE_90,//1 + VM_GRAPHIC_SCREEN_ROTATE_180,//2 + VM_GRAPHIC_SCREEN_ROTATE_270,//3 + VM_GRAPHIC_SCREEN_ROTATE_MIRROR_0,//4 + VM_GRAPHIC_SCREEN_ROTATE_MIRROR_90,//5 + VM_GRAPHIC_SCREEN_ROTATE_MIRROR_180,//6 + VM_GRAPHIC_SCREEN_ROTATE_MIRROR_270,//7 + VM_GRAPHIC_SCREEN_ROTATE_MAX_TYPE//8 +} vm_graphic_screen_rotate_value; + + +typedef enum +{ + VM_FONT_ENGINE_ERROR = -1, + VM_FONT_ENGINE_NO_ERROR = 0, + VM_FONT_ENGINE_NO_TRUNCATION, + VM_FONT_ENGINE_TRUNCATION, + VM_FONT_ENGINE_ERROR_NULL_STRING, + VM_FONT_ENGINE_ZERO_LENGTH, + VM_FONT_ENGINE_ERROR_NO_TRUNCATION_AVAILABLE, + VM_FONT_ENGINE_END_OF_ENUM +} vm_font_engine_error_message_enum; + +/* + *This macro is not work now,just keep for compatibility. + */ +#define MAX_BLT_LAYER (4) +/* GDI_RESULT define*/ +#define VM_GDI_RESULT VMINT + +/* GDI_HANDLE define*/ +#define VM_GDI_HANDLE VMINT + +/* max layer width*/ +#define MAX_LAYER_WIDTH (65535) + +/*max layer height*/ +#define MAX_LAYER_HEIGHT (65535) + +/*max layer count*/ +#define MAX_LAYER (16) + + +/*max layer number when flatten to other layer or canvas*/ +#define MAX_FLATTEN_LAYER (4) + +/*max multiples when enlarge image */ +#define MAX_PIXEL_ENLARGE (512) + +/*the offset from the canvas beginning to the image data*/ +#define CANVAS_BUF_OFFSET (VM_CANVAS_SIGNATURE_SIZE + VM_CANVAS_FRAME_PROPERTY_SIZE) + +/*layer or canvas attribute: no transparent color*/ +#define VM_NO_TRANS_COLOR (-1) + + +/* RGB565 white color */ +#define VM_COLOR_WHITE (0XFFFF) + +/* RGB565 black color */ +#define VM_COLOR_BLACK (0X0000) + +/* RGB565 red color */ +#define VM_COLOR_RED (0XF800) + +/* RGB565 green color */ +#define VM_COLOR_GREEN (0X07E0) + +/* RGB565 blue color */ +#define VM_COLOR_BLUE (0X001F) + +/* get color value from RGB value */ +#define VM_RGB(r, g, b) ((b << 16) + (g << 8) + r) + +/* get RGB32 color value (BGRA) from ARGB value */ +#define VM_RGB32_ARGB(a, r, g, b) ((b << 24) + (g << 16) + (r << 8) + a) + +/* get RGB565 color value from ARGB value, the same as VM_COLOR_888_TO_565(r, g, b) */ +#define VM_RGB565_ARGB(a, r, g, b) (((r & 0xf8) + ((g & 0xe0) >> 5)) << 8) + ((g & 0x1c) << 3) + (b >> 3) + +/* get a RGB32 value of int type (BGRA) from 565 color*/ +#define VM_COLOR_RGB565_TO_RGB32(color16) ((color16 & 0x001F) << 27) + ((color16 & 0x07E0) << 13) + ((color16 & 0xF800)) + +/* get 565 color from a value of int type */ +#define VM_COLOR_INT_TO_565(i) ((i & 0xf8) << 8) + ((i & 0xfc00) >> 5) + ((i & 0xf80000) >> 19) + +/* convert color format from 888 to 565 */ +#define VM_COLOR_888_TO_565(r, g, b) (((r & 0xf8) + ((g & 0xe0) >> 5)) << 8) + ((g & 0x1c) << 3) + (b >> 3) + +/* convert color format from 565 to 888 */ +#define VM_COLOR_565_TO_888(color16) ((color16 & 0x001F) << 19) + ((color16 & 0x07E0) << 5) + ((color16 & 0xF800) >> 8) + +/* get Red value from a rgb value */ +#define VM_COLOR_GET_RED(color16) ((color16 & 0xF800) >> 8) + +/* get Green value from a rgb value */ +#define VM_COLOR_GET_GREEN(color16) ((color16 & 0x07E0) >> 3) + +/* get Blue value from a rgb value */ +#define VM_COLOR_GET_BLUE(color16) ((color16 & 0x001F) << 3) + +#define VM_CANVAS_DATA_OFFSET (32) + +typedef void (*vm_graphic_screen_rotate_event_callback)(VMINT, VMINT); // 1:envent 2:inside/outside|| horizontal/vertical + + +/*clip region*/ +typedef struct clip_rect{ + VMINT16 left; /*x offset at begin*/ + VMINT16 top; /*y offset at begin*/ + VMINT16 right; /*x offset at end*/ + VMINT16 bottom; /*y offset at end*/ + VMBYTE flag; /* flag = 0: the clip region is invalid; flag =1: the clip region is valid*/ +}clip_rect; + + +/* single frame info for gif image */ +struct frame_prop +{ + VMUINT8 flag; /* marker to show it is frame beginning */ + VMUINT8 is_resize; /* if resize */ + VMUINT16 left; /* x offset */ + VMUINT16 top; /* y offset */ + VMUINT16 width; /*image width */ + VMUINT16 height; /* image height*/ + VMUINT16 delay_time; /* the interval between two frames*/ + VMUINT8 trans_color_index; /* reserved*/ + VMUINT16 trans_color; /* transparent color*/ + VMUINT32 offset; /* current frame size , unit:byte */ +}; + +/*image property*/ +typedef struct _vm_graphic_imgprop +{ + VMINT width; /*image widtg*/ + VMINT height; /*image height*/ +}vm_graphic_imgprop; + +/*character infomation*/ +typedef struct _vm_graphic_char_info +{ + VMINT dwidth; /*the real width of the character, can be used for typeset*/ + VMINT width; /*the width of the character, not include padding*/ + VMINT height; /*the height of the character*/ + VMINT ascent; /*base line*/ + VMINT descent; /*the length from the character bottom to the baseline*/ +}vm_graphic_char_info; + +/* font size */ +typedef enum { + VM_SMALL_FONT, /*small font*/ + VM_MEDIUM_FONT, /*medium font*/ + VM_LARGE_FONT /*large font*/ +} font_size_t; + +/*create mode of layer */ +typedef enum{ + VM_BASE_LAYER = 1, /*create base layer*/ + VM_FAST_LAYER , /*create fast layer(no need to malloc memory*/ + VM_BUF, /*create layer using outside memory*/ + VM_CREATE_CANVAS /*create layer, and create canvas at the same time*/ +}vm_layer_mode; + +/*property of canvas*/ +typedef enum{ + VM_CANVAS_LEFT = 1, /*x offset*/ + VM_CANVAS_TOP, /*y offset*/ + VM_CANVAS_WIDTH, /*canvas width*/ + VM_CANVAS_HEIGHT, /*canvas height*/ + VM_CANVAS_CF, /*canvas color format*/ + VM_CANVAS_DATASIZE /*canvas data size*/ +}vm_canvas_prop; + + +/*point structure*/ +typedef struct _vm_graphic_point{ + VMINT16 x; /*x offset*/ + VMINT16 y; /*y offset*/ +}vm_graphic_point; + +/*color structure*/ +typedef struct _vm_graphic_color{ + VMUINT vm_color_565; /*color value in 565 style*/ + VMUINT vm_color_888; /*color value in 888 style*/ +}vm_graphic_color; + + +typedef struct _vm_graphic_color_argb{ + VMUINT8 a; /* alpha */ + VMUINT8 r; /* red */ + VMUINT8 g; /* green */ + VMUINT8 b; /* blue */ +}vm_graphic_color_argb; + + +/*pen structure*/ +typedef struct _vm_graphic_pen{ + VMBYTE cycle; /*the length of one cycle*/ + VMBYTE *bitvalues;/*the value of one cycle ,example:VMBYTE bitvalues[] = {1,1,1,0,0}; + vm_graphic_pen pen; + pen.cycle = sizeof(bitvalues); + pen.bitvalues = bitvalues; */ +}vm_graphic_pen; + + +typedef enum +{ + VM_GRAPHIC_COLOR_FORMAT_16, /* 16-bit, rgb 565 */ + VM_GRAPHIC_COLOR_FORMAT_24, /* 24-bit, B,G,R 8,8,8 */ + VM_GRAPHIC_COLOR_FORMAT_32, /* 32-bit, B,G,R,A 8,8,8,8 */ + VM_GRAPHIC_COLOR_FORMAT_32_PARGB, /* 32-bit, PB,PG,PR,A 8,8,8,8 */ + VM_GRAPHIC_COLOR_FORMAT_END +} vm_graphic_color_famat_enum; + + +typedef VMUINT8 vm_graphic_color_famat; + + +typedef enum +{ + VM_FRM_SCREEN_ROTATE_0, + VM_FRM_SCREEN_ROTATE_90, + VM_FRM_SCREEN_ROTATE_180, + VM_FRM_SCREEN_ROTATE_270, + VM_FRM_SCREEN_ROTATE_MIRROR_0, + VM_FRM_SCREEN_ROTATE_MIRROR_90, + VM_FRM_SCREEN_ROTATE_MIRROR_180, + VM_FRM_SCREEN_ROTATE_MIRROR_270, + VM_FRM_SCREEN_ROTATE_MAX_TYPE +} vm_frm_screen_rotate_enum; + +typedef enum { + VM_NON_CACHEABLE, + VM_CACHEABLE, +} vm_cacheable_t; + + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_screen_width + * DESCRIPTION + * get the screen width + * PARAMETERS + * void + * RETURNS + * the width of the screen + *****************************************************************************/ +VMINT vm_graphic_get_screen_width(void); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_screen_height + * DESCRIPTION + * get the screen height + * PARAMETERS + * void + * RETURNS + * the height of the screen + *****************************************************************************/ +VMINT vm_graphic_get_screen_height(void); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_create_layer + * DESCRIPTION + * Create layer.layer is the simulation for LCD. + * using this api, user can create two layers at most, and user needn't to require additional memory for it. + * layer 0: same with LCD's size and position. it means, top left coordination must be (0,0), width = screen width and height = screen height + * layer 1: user can set the opacity, position,size(can not larger than LCD's size). + * the two layers can be merged with the appointed opacity + * PARAMETERS + * x : [IN]x_top left coordination + * y : [IN]y_top left coordination + * width : [IN] the width of the layer, the unit:pixel + * height : [IN]the height of the layer, the unit:pixel + * trans_color : [IN]the transparent color. -1 means no transparent color. + * RETURNS + * if succeed, return the layer handle, if fail, return the error code + * EXAMPLE + * VMINT layer_hdl[2] = {0}; + * layer_hdl[0] = vm_graphic_create_layer(0, 0, vm_graphic_get_screen_width(), vm_graphic_get_screen_height(), VM_NO_TRANS_COLOR); + * //user can draw on the layer + * vm_graphic_line_ex( layer_hdl[0],0,0,100,100); + * .... + * // when need to show it to the LCD + * vm_graphic_flush_layer( layer_hdl[0], 1); + * //when no more use the layer, delete it + * vm_graphic_delete_layer(layer_hdl[0]); + *****************************************************************************/ +VMINT vm_graphic_create_layer(VMINT x, VMINT y, VMINT width, VMINT height, VMINT trans_color); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_delete_layer + * DESCRIPTION + * delete the layer created by vm_graphic_create_layer. user can release the layer when app exits + * PARAMETERS + * handle : [IN] the layer handle to be deleted + * RETURNS + * if succeed, return VM_GDI_SUCCEED. otherwise, return error code + *****************************************************************************/ +VMINT vm_graphic_delete_layer(VMINT handle); + + + +/***************************************************************************** + * FUNCTION + * vm_graphic_active_layer + * DESCRIPTION + * active layer. all the GDI operation is valid only to the active layer. + * PARAMETERS + * handle : [IN]the layer handle to be actived.if the layer handle is wrong, system will not change, it means + * current active layer will not change + * RETURNS + * if succeed, return VM_GDI_SUCCEED. otherwise, return error code + *****************************************************************************/ +VMINT vm_graphic_active_layer(VMINT handle); + + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_layer_buffer + * DESCRIPTION + * get the appointed layer's buffer + * PARAMETERS + * handle : [IN]layer handle + * RETURNS + * if succeed, return buffer address. otherwise, return NULL + *****************************************************************************/ +VMUINT8* vm_graphic_get_layer_buffer (VMINT handle); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_clear_layer_bg + * DESCRIPTION + * clean the layer with the transparent color. the color is same as the trans_color used in vm_graphic_create_layer() + * PARAMETERS + * handle : [IN]layer handle + * RETURNS + * if succeed, return VM_GDI_SUCCEED. otherwise, return VM_GDI_FAILED + *****************************************************************************/ +VMINT vm_graphic_clear_layer_bg (VMINT handle); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_flush_layer + * DESCRIPTION + * flatten layers to one layer and blt to LCD. Only call this API does app can update LCD + * PARAMETERS + * layer_handles : [IN] the pointer of layer array + * count : [IN] layer number that to be flushed. if the number is larger than max layer count (get by vm_graphic_get_blt_layer_count()), + * just use the max layer count + * RETURNS + * if succeed, return VM_GDI_SUCCEED. otherwise, return error code + *****************************************************************************/ +VMINT vm_graphic_flush_layer(VMINT* layer_handles, VMINT count); + +/***************************************************************************** + * FUNCTION + * vm_graphic_flush_layer_non_block + * DESCRIPTION + * flatten layers to one layer and blt to LCD non block. + * PARAMETERS + * layer_handles : [IN] the pointer of layer array + * count : [IN] layer number that to be flushed. if the number is larger than max layer count (get by vm_graphic_get_blt_layer_count()), + * just use the max layer count + * RETURNS + * if succeed, return VM_GDI_SUCCEED. otherwise, return error code + *****************************************************************************/ +VMINT vm_graphic_flush_layer_non_block(VMINT* layer_handles, VMINT count); + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_layer_count + * DESCRIPTION + * get the max layer number of current platform + * PARAMETERS + * void + * RETURNS + * the max layer number + *****************************************************************************/ + + +VMINT vm_graphic_get_layer_count(void); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_layer_position + * DESCRIPTION + * get the layer position + * PARAMETERS + * handle : [IN] layer handle + * x : [OUT] x_top left coordination + * y : [OUT] y_top left coordination + * width : [OUT] layer width + * height : [OUT] layer height + * RETURNS + * if succeed, return VM_GDI_SUCCEED,otherwise return error code + *****************************************************************************/ +VMINT vm_graphic_get_layer_position(VMINT handle, VMINT *x, VMINT *y, VMINT *width, VMINT *height); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_set_layer_opacity + * DESCRIPTION + * set the layer opacity. value range:[0,100], 0 means the layer is transparent. + * PARAMETERS + * handle : [IN] layer handle + * percent : [IN] the percent of opacity + * RETURNS + * if succeed, return VM_GDI_SUCCEED,otherwise return error code + *****************************************************************************/ +VMINT vm_graphic_set_layer_opacity(VMINT handle, VMINT percent); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_bits_per_pixel + * DESCRIPTION + * get the byte number of one pixel in current platform + * PARAMETERS + * void + * RETURNS + * the number of byte + *****************************************************************************/ +VMINT vm_graphic_get_bits_per_pixel(void); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_pixel + * DESCRIPTION + * get the color of the appointed point in the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the point + * y : [IN] y offset of the point + * RETURNS + * the color of the point + *****************************************************************************/ +VMUINT16 vm_graphic_get_pixel(VMUINT8 *buf, VMINT x, VMINT y); + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_pixel_cf + * DESCRIPTION + * get the color of the appointed point in the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the point + * y : [IN] y offset of the point + * RETURNS + * the color of the point, the color value include a, r, g, b value + *****************************************************************************/ +vm_graphic_color_argb vm_graphic_get_pixel_cf(VMUINT8 *buf, VMINT x, VMINT y); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_set_pixel + * DESCRIPTION + * draw a point on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the point + * y : [IN] y offset of the point + * color : [IN] color of the point + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_set_pixel(VMUINT8 *buf, VMINT x,VMINT y, VMUINT16 color); + +/****************************************************************************** + * FUNCTION + * vm_graphic_set_pixel_cf + * DESCRIPTION + * draw a point on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the point + * y : [IN] y offset of the point + * color : [IN] color of the point, the color value include a, r, g, b value + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_set_pixel_cf(VMUINT8 *buf, VMINT x, VMINT y, vm_graphic_color_argb* color); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_line + * DESCRIPTION + * draw a line on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * x : [IN] x offset of the end point + * y : [IN] y offset of the end point + *color : [IN] color of the line + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_line(VMUINT8 *buf, VMINT x0, VMINT y0, VMINT x1, VMINT y1, VMUINT16 color); + +/****************************************************************************** + * FUNCTION + * vm_graphic_line_cf + * DESCRIPTION + * draw a line on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * x : [IN] x offset of the end point + * y : [IN] y offset of the end point + *color : [IN] color of the line, the color value include a, r, g, b value + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_line_cf(VMUINT8 *buf, VMINT x0, VMINT y0, VMINT x1, VMINT y1, vm_graphic_color_argb* color); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_rect + * DESCRIPTION + * draw a rect on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the rect + * height : [IN] height of the rect + *color : [IN] color of the rect + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_rect(VMUINT8 *buf, VMINT x, VMINT y, VMINT width, VMINT height, VMUINT16 color); + +/****************************************************************************** + * FUNCTION + * vm_graphic_rect_cf + * DESCRIPTION + * draw a rect on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the rect + * height : [IN] height of the rect + *color : [IN] color of the rect, the color value include a, r, g, b value + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_rect_cf(VMUINT8 *buf, VMINT x, VMINT y, VMINT width, VMINT height, vm_graphic_color_argb* color); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_fill_rect + * DESCRIPTION + * draw a filled rect on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the rect + * height : [IN] height of the rect + * line_color : [IN] color of the frame + * back_color : [IN] color of the filled + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_fill_rect(VMUINT8 *buf, VMINT x, VMINT y, VMINT width, VMINT height, VMUINT16 line_color, VMUINT16 back_color); + +/****************************************************************************** + * FUNCTION + * vm_graphic_fill_rect_cf + * DESCRIPTION + * draw a filled rect on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the rect + * height : [IN] height of the rect + * line_color : [IN] color of the frame, the color value include a, r, g, b value + * back_color : [IN] color of the filled, the color value include a, r, g, b value + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_fill_rect_cf(VMUINT8 *buf,VMINT x,VMINT y,VMINT width,VMINT height,vm_graphic_color_argb* line_color,vm_graphic_color_argb* back_color); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_roundrect + * DESCRIPTION + * draw a round rectangle on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the round rectangle + * height : [IN] height of the round rectangle + * corner_width : [IN] radius of the rounded angle. the value must less than half of width, if not, the api will have no effect + * color : [IN] color of the round rectangle + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_roundrect (VMUINT8 * buf, VMINT x, VMINT y, VMINT width, VMINT height, VMINT corner_width, VMUINT16 color); + +/****************************************************************************** + * FUNCTION + * vm_graphic_roundrect_cf + * DESCRIPTION + * draw a round rectangle on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the round rectangle + * height : [IN] height of the round rectangle + * corner_width : [IN] radius of the rounded angle. the value must less than half of width, if not, the api will have no effect + * color : [IN] color of the round rectangle, the color value include a, r, g, b value + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_roundrect_cf (VMUINT8 * buf, VMINT x, VMINT y, VMINT width, VMINT height, VMINT corner_width, vm_graphic_color_argb* color); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_fill_roundrect + * DESCRIPTION + * draw a filled round rectangle on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the round rectangle + * height : [IN] height of the round rectangle + * corner_width : [IN] radius of the rounded angle. the value must less than half of width, if not, the api will have no effect + * color : [IN] color of the filled round rectangle + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_fill_roundrect (VMUINT8 * buf, VMINT x, VMINT y, VMINT width, VMINT height, VMINT corner_width, VMUINT16 color); + +/****************************************************************************** + * FUNCTION + * vm_graphic_fill_roundrect_cf + * DESCRIPTION + * draw a filled round rectangle on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the round rectangle + * height : [IN] height of the round rectangle + * corner_width : [IN] radius of the rounded angle. the value must less than half of width, if not, the api will have no effect + * color : [IN] color of the filled round rectangle, the color value include a, r, g, b value + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_fill_roundrect_cf (VMUINT8 * buf, VMINT x, VMINT y, VMINT width, VMINT height, VMINT corner_width, vm_graphic_color_argb* color); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_ellipse + * DESCRIPTION + * draw a ellipse on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the ellipse + * height : [IN] height of the ellipse + * color : [IN] color of the ellipse + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_ellipse (VMUINT8 * buf, VMINT x, VMINT y, VMINT width, VMINT height, VMUINT16 color); + +/****************************************************************************** + * FUNCTION + * vm_graphic_ellipse_cf + * DESCRIPTION + * draw a ellipse on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the ellipse + * height : [IN] height of the ellipse + * color : [IN] color of the ellipse, the color value include a, r, g, b value + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_ellipse_cf(VMUINT8* buf, VMINT x, VMINT y, VMINT width, VMINT height, vm_graphic_color_argb* color); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_fill_ellipse + * DESCRIPTION + * draw a filled ellipse on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the ellipse + * height : [IN] height of the ellipse + * color : [IN] color of the filled ellipse + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_fill_ellipse (VMUINT8 * buf, VMINT x, VMINT y, VMINT width, VMINT height, VMUINT16 color); + +/****************************************************************************** + * FUNCTION + * vm_graphic_fill_ellipse_cf + * DESCRIPTION + * draw a filled ellipse on the appointed position of the buffer + * PARAMETERS + * buf : [IN] buffer pointer + * x : [IN] x offset of the start point + * y : [IN] y offset of the start point + * width : [IN] width of the ellipse + * height : [IN] height of the ellipse + * color : [IN] color of the filled ellipse, the color value include a, r, g, b value + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_fill_ellipse_cf(VMUINT8* buf, VMINT x, VMINT y, VMINT width, VMINT height, vm_graphic_color_argb* color); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_create_canvas + * DESCRIPTION + * create canvas + * PARAMETERS + * width : [IN] width of the canvas + * height : [IN] height of the height + * RETURNS + * if succeed, return the canvas handle, otherwise, return error code + * EXAMPLE + * hcanvas = vm_graphic_create_canvas(width, height); + * if(hcanvas>0) + * { + * //get the destination pointer of the data to be displayed + * frame_buffer = (VMUINT8*)hcanvas + VM_CANVAS_SIGNATURE_SIZE + VM_CANVAS_FRAME_PROPERTY_SIZE; + * //use the buffer to create layer + * layer_handle = vm_graphic_create_layer_ex(0, 0, vm_graphic_get_screen_width(), vm_graphic_get_screen_height(), VM_NO_TRANS_COLOR,VM_BUF,frame_buffer); + * //the following operation is same with vm_graphic_create_layer + * } + * else + * { + * //error handle + * } + * + *****************************************************************************/ +VMINT vm_graphic_create_canvas(VMINT width, VMINT height); + +/****************************************************************************** + * FUNCTION + * vm_graphic_create_canvas_cf + * DESCRIPTION + * create canvas + * PARAMETERS + * cf : [IN] color format + * width : [IN] width of the canvas + * height : [IN] height of the height + * RETURNS + * if succeed, return the canvas handle, otherwise, return error code + * EXAMPLE + * hcanvas = vm_graphic_create_canvas(width, height); + * if(hcanvas>0) + * { + * //get the destination pointer of the data to be displayed + * frame_buffer = (VMUINT8*)hcanvas + VM_CANVAS_SIGNATURE_SIZE + VM_CANVAS_FRAME_PROPERTY_SIZE; + * //use the buffer to create layer + * layer_handle = vm_graphic_create_layer_ex(0, 0, vm_graphic_get_screen_width(), vm_graphic_get_screen_height(), VM_NO_TRANS_COLOR,VM_BUF,frame_buffer); + * //the following operation is same with vm_graphic_create_layer + * } + * else + * { + * //error handle + * } + * + *****************************************************************************/ +VMINT vm_graphic_create_canvas_cf(vm_graphic_color_famat cf, VMINT width, VMINT height); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_release_canvas + * DESCRIPTION + * release the resource created by vm_graphic_create_canvas or vm_graphic_load_image + * PARAMETERS + * hcanvas : [IN] canvas handle + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_release_canvas(VMINT hcanvas); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_canvas_buffer + * DESCRIPTION + * get the pointer of the canvas's display buffer + * PARAMETERS + * hcanvas : [IN] canvas handle + * RETURNS + * the pointer of the canvas's display buffer + *****************************************************************************/ +VMUINT8* vm_graphic_get_canvas_buffer(VMINT hcanvas); + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_canvas_buffer_size + * DESCRIPTION + * get the size of the canvas's display buffer + * PARAMETERS + * hcanvas : [IN] canvas handle + * RETURNS + * the size of the canvas's display buffer + *****************************************************************************/ +VMINT vm_graphic_get_canvas_buffer_size (VMINT hcanvas); + +/****************************************************************************** + * FUNCTION + * vm_graphic_load_image + * DESCRIPTION + * image decode, and draw the decoded image to the new-created canvas. + * PARAMETERS + * img : [IN] pointer of source image data + * img_len : [IN] image length + * RETURNS + * the pointer of the canvas's display buffer + *****************************************************************************/ +VMINT vm_graphic_load_image(VMUINT8 *img, VMINT img_len); + +/****************************************************************************** + * FUNCTION + * vm_graphic_load_image_cf + * DESCRIPTION + * image decode, and draw the decoded image to the new-created canvas. + * PARAMETERS + * cf : [IN] color format + * img : [IN] pointer of source image data + * img_len : [IN] image length + * RETURNS + * the pointer of the canvas's display buffer + *****************************************************************************/ +VMINT vm_graphic_load_image_cf(vm_graphic_color_famat cf, VMUINT8 *img_data, VMINT img_len); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_img_property + * DESCRIPTION + * get the appointed frame property of the image + * PARAMETERS + * hcanvas : [IN] canvas handle which hold the decoded image data + * frame_index : [IN] frameindex ,begin from 0 + * RETURNS + * the pointer of the image property structure + *****************************************************************************/ +struct frame_prop * vm_graphic_get_img_property(VMINT hcanvas, VMUINT8 frame_index); + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_img_buffer + * DESCRIPTION + * get the appointed frame buffer of the image + * PARAMETERS + * hcanvas : [IN] canvas handle which hold the decoded image data + * frame_index : [IN] frameindex ,begin from 0 + * RETURNS + * the pointer of the image buffer poniter + *****************************************************************************/ +VMUINT8* vm_graphic_get_img_buffer(VMINT hcanvas, VMUINT8 frame_index); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_frame_number + * DESCRIPTION + * get the frame number of the image + * PARAMETERS + * hcanvas : [IN] canvas handle which hold the decoded image data,get by vm_graphic_load_image() + * RETURNS + * frame number + *****************************************************************************/ +VMINT vm_graphic_get_frame_number(VMINT hcanvas); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_blt + * DESCRIPTION + * copy the data from the souce display buffer to the destination buffer. just copy, no merge. + * the destination can be LCD buffer or canvas display buffer + * PARAMETERS + * dst_disp_buf : [IN] destination buffer pointer + * x_dest : [IN] x offset of destination position + * y_dest : [IN] y offset of destination position + * src_disp_buf : [IN] source buffer pointer + * x_src : [IN] x offset of source position + * y_src : [IN] y offset of source position + * width : [IN] the image width + * height : [IN] the image height + * frame_index : [IN] frame number + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_blt(VMBYTE * dst_disp_buf, VMINT x_dest, VMINT y_dest, VMBYTE * src_disp_buf, + VMINT x_src, VMINT y_src, VMINT width, VMINT height, VMINT frame_index); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_blt_ex + * DESCRIPTION + * copy the data from the souce display buffer to the destination buffer. merge with the destination data using the alpha value. + * the destination can be LCD buffer or canvas display buffer + * PARAMETERS + * dst_disp_buf : [IN] destination buffer pointer + * x_dest : [IN] x offset of destination position + * y_dest : [IN] y offset of destination position + * src_disp_buf : [IN] source buffer pointer + * x_src : [IN] x offset of source position + * y_src : [IN] y offset of source position + * width : [IN] the image width + * height : [IN] the image height + * frame_index : [IN] frame number + * alpha : [IN]the value of transparent,value range [0,255], 0 means completely transparent + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_blt_ex(VMBYTE * dst_disp_buf, VMINT x_dest, VMINT y_dest, VMBYTE * src_disp_buf, + VMINT x_src, VMINT y_src, VMINT width, VMINT height, VMINT frame_index, VMINT alpha); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_character_height + * DESCRIPTION + * get current font height, for dot character, it is precise. for vector font,it is usually higher than + * single character, it is the string height. + * PARAMETERS + * void + * RETURNS + * the height of the font + *****************************************************************************/ +VMINT vm_graphic_get_character_height(void); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_character_width + * DESCRIPTION + * get current character width, for dot character, it is precise. for vector font, it isn't include the + * padding between characters + * PARAMETERS + * c : [IN] character vlue + * RETURNS + * the width of the character + *****************************************************************************/ +VMINT vm_graphic_get_character_width(VMWCHAR c); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_string_width + * DESCRIPTION + * get the width of the appointed string + * PARAMETERS + * str : [IN]string pointer + * RETURNS + * the width of the string + *****************************************************************************/ +VMINT vm_graphic_get_string_width(VMWSTR str); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_string_height + * DESCRIPTION + * get the string of the appointed string + * PARAMETERS + * str : [IN]string pointer + * RETURNS + * the height of the string + *****************************************************************************/ +VMINT vm_graphic_get_string_height(VMWSTR str); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_measure_character + * DESCRIPTION + * get the width and height of the appointed character. Unit:pixel + * PARAMETERS + * c : [IN]the value of character + *width : [OUT]character width + *height : [OUT]character height + * RETURNS + * if succeed, return VM_GDI_SUCCEED,otherwise, return error code + *****************************************************************************/ +VMINT vm_graphic_measure_character(VMWCHAR c, VMINT *width, VMINT *height); + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_character_info + * DESCRIPTION + * get the info of the appointed character + * PARAMETERS + * c : [IN]the value of character + * char_info : [OUT]character infomation + * RETURNS + * if succeed, return VM_GDI_SUCCEED,otherwise, return error code + *****************************************************************************/ + +VMINT vm_graphic_get_character_info(VMWCHAR c, vm_graphic_char_info *char_info); + +/****************************************************************************** + * FUNCTION + * vm_graphic_set_font + * DESCRIPTION + * set font size + * PARAMETERS + * size : [IN]font size + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_set_font(font_size_t size); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_textout + * DESCRIPTION + * show text to the display buffer. font size is defined by vm_graphic_set_font(),defaul value is VM_MEDIUM_FONT + * PARAMETERS + * disp_buf : [IN] display buffer pointer + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * s : [IN] string pointer + * length : [IN] string length + * color : [IN] string color + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_textout (VMUINT8* disp_buf, VMINT x, VMINT y, VMWSTR s, VMINT length, VMUINT16 color); + +/****************************************************************************** + * FUNCTION + * vm_graphic_textout_cf + * DESCRIPTION + * show text to the display buffer. font size is defined by vm_graphic_set_font(),defaul value is VM_MEDIUM_FONT + * PARAMETERS + * disp_buf : [IN] display buffer pointer + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * s : [IN] string pointer + * length : [IN] string length + * color : [IN] string color, the color value include a, r, g, b value + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_textout_cf (VMUINT8* disp_buf, VMINT x, VMINT y, VMWSTR s, VMINT length, vm_graphic_color_argb* color); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_textout_by_baseline + * DESCRIPTION + * show text to the display buffer according baseline. font size is defined by vm_graphic_set_font(),defaul value is VM_MEDIUM_FONT + * PARAMETERS + * disp_buf : [IN] display buffer pointer + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * s : [IN] string pointer + * length : [IN] string length + * color : [IN] string color + * baseline : [IN] the baseline to be aligned + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_textout_by_baseline (VMUINT8* disp_buf, VMINT x, VMINT y, VMWSTR s, VMINT length, VMUINT16 color,VMINT baseline); + +/****************************************************************************** + * FUNCTION + * vm_graphic_textout_by_baseline_cf + * DESCRIPTION + * show text to the display buffer according baseline. font size is defined by vm_graphic_set_font(),defaul value is VM_MEDIUM_FONT + * PARAMETERS + * disp_buf : [IN] display buffer pointer + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * s : [IN] string pointer + * length : [IN] string length + * color : [IN] string color, the color value include a, r, g, b value + * baseline : [IN] the baseline to be aligned + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_textout_by_baseline_cf (VMUINT8* disp_buf, VMINT x, VMINT y, VMWSTR s, VMINT length, vm_graphic_color_argb* color,VMINT baseline); + +/****************************************************************************** + * FUNCTION + * vm_graphic_set_clip + * DESCRIPTION + * set clip region. any GDI operation out of the clip region will have no effect. It is a global value, when the aim changes, the clip region + * must be reset. + * PARAMETERS + * x1 : [IN] x offset of top left position + * y1 : [IN] y offset of top left + * x2 : [IN] x offset of bottom right position + * y2 : [IN] y offset of bottom right position + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_set_clip(VMINT x1, VMINT y1, VMINT x2, VMINT y2); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_reset_clip + * DESCRIPTION + * reset clip region to the full screen size + * PARAMETERS + * void + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_reset_clip(void); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_flush_screen + * DESCRIPTION + * notify system to re-paint screen. once APP calls the API, system will send VM_PAINT to the callback fuction registered + * by vm_reg_sysevt_callback + * PARAMETERS + * void + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_flush_screen(void); + + +/*rotate value :90 degree*/ +#define VM_ROTATE_DEGREE_90 (90) + +/*rotate value :180 degree*/ +#define VM_ROTATE_DEGREE_180 (180) + +/*rotate value :270 degree*/ +#define VM_ROTATE_DEGREE_270 (270) + + +/****************************************************************************** + * FUNCTION + * vm_graphic_rotate + * DESCRIPTION + * rotate image with the appointed angel to the destinate buffer. + * PARAMETERS + * buf : [IN] destinate buffer + * x_des : [IN]x offset of destination + * y_des : [IN]y offset of destination + * src_buf : [IN]source buffer + * frame_index :[IN]frame index + * degrees :[IN]the value of clockwise angle,only valid with the value VM_ROTATE_DEGREE_90,VM_ROTATE_DEGREE_180 + * VM_ROTATE_DEGREE_270. + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_rotate(VMBYTE *buf, VMINT x_des, VMINT y_des, + VMBYTE *src_buf, VMINT frame_index, VMINT degrees); + + +/*Mirror direction:x */ +#define VM_MIRROR_X (0) + +/*Mirror direction:y */ +#define VM_MIRROR_Y (1) + +/****************************************************************************** + * FUNCTION + * vm_graphic_mirror + * DESCRIPTION + * mirror the image to the destination with the appointed direction + * PARAMETERS + * buf : [IN] destinate buffer + * x_des : [IN] x offset of destination + * y_des : [IN] y offset of destination + * src_buf : [IN] source buffer + * frame_index : [IN] frame index + * direction : [IN] the mirror direction ,only valid with the value VM_MIRROR_X,VM_MIRROR_Y + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_mirror(VMBYTE *buf, VMINT x_des, VMINT y_des, VMBYTE *src_buf, VMINT frame_index, VMINT direction); + + + +/****************************************************************************** + * FUNCTION + * vm_reg_res_provider + * DESCRIPTION + * APP can use it to register its own resource get function. if the app self-define resource is saved as array, app can operate it by ID using the + * callback function + * PARAMETERS + * fp : resource callback function pointer + * RETURNS + * void + *****************************************************************************/ + void vm_reg_res_provider(VMUINT8* (*fp)(VMINT resid, VMINT* len)); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_create_layer_ex + * DESCRIPTION + * create layer using varies modes,before create other layers, base layer must be created firstly. + * PARAMETERS + * x : [IN] x offset of layer position + * y : [IN] y offset of layer position + * width : [IN]layer width + * height : [IN] layer height + * mode : [IN] creation mode + * VM_BASE_LAYER: create base layer. if existed, new attribute will override the old. + * VM_FAST_LAYER create fast layer( no need additional memory),if existed, new attribute will override the old. + * VM_BUF: create layer using the canvas buffer. the buffer must be gotten from vm_create_canvas. the canvas + * and buffer are mapped automatically. if re-create layer using the same memory , will return error code + * VM_CREATE_CANVAS: create a new canvas , at the same time , create a new layer with the canvas buffer. + * the canvas and buffer are mapped automatically. + * buf : [IN] only valid when mode = VM_BUF, the buffer pointer + * RETURNS + * if succeed, return the layer handle ,otherwise, return error code + *****************************************************************************/ +VM_GDI_HANDLE vm_graphic_create_layer_ex(VMINT x, VMINT y, VMINT width, VMINT height, VMINT trans_color,VMINT mode,VMUINT8 * buf); + +/****************************************************************************** + * FUNCTION + * vm_graphic_create_layer_cf + * DESCRIPTION + * create layer using varies modes,before create other layers, base layer must be created firstly. + * PARAMETERS + * cf : [IN] color format + * x : [IN] x offset of layer position + * y : [IN] y offset of layer position + * width : [IN]layer width + * height : [IN] layer height + * mode : [IN] creation mode + * VM_BASE_LAYER: create base layer. if existed, new attribute will override the old. + * VM_FAST_LAYER create fast layer( no need additional memory),if existed, new attribute will override the old. + * VM_BUF: create layer using the canvas buffer. the buffer must be gotten from vm_create_canvas. the canvas + * and buffer are mapped automatically. if re-create layer using the same memory , will return error code + * VM_CREATE_CANVAS: create a new canvas , at the same time , create a new layer with the canvas buffer. + * the canvas and buffer are mapped automatically. + * buf : [IN] only valid when mode = VM_BUF, the buffer pointer + * buf_size: [IN] only valid when mode = VM_BUF, the buffer size + * RETURNS + * if succeed, return the layer handle ,otherwise, return error code + *****************************************************************************/ +VM_GDI_HANDLE vm_graphic_create_layer_cf(vm_graphic_color_famat cf, VMINT x, VMINT y, VMINT width, VMINT height, vm_graphic_color_argb* trans_color, VMINT mode, VMUINT8 *buf, VMINT buf_size); + +/****************************************************************************** + * FUNCTION + * vm_graphic_create_layer_cf_double + * DESCRIPTION + * create layer using varies modes,before create other layers, base layer must be created firstly. + * PARAMETERS + * cf : [IN] color format + * x : [IN] x offset of layer position + * y : [IN] y offset of layer position + * width : [IN]layer width + * height : [IN] layer height + * mode : [IN] creation mode + * VM_BASE_LAYER: create base layer. if existed, new attribute will override the old. + * VM_FAST_LAYER create fast layer( no need additional memory),if existed, new attribute will override the old. + * VM_BUF: create layer using the canvas buffer. the buffer must be gotten from vm_create_canvas. the canvas + * and buffer are mapped automatically. if re-create layer using the same memory , will return error code + * VM_CREATE_CANVAS: create a new canvas , at the same time , create a new layer with the canvas buffer. + * the canvas and buffer are mapped automatically. + * buf : [IN] only valid when mode = VM_BUF, the buffer pointer + * buf_size: [IN] only valid when mode = VM_BUF, the buffer size + * buf1 : [IN] only valid when mode = VM_BUF, the another buffer pointer + * buf_size_1: [IN] only valid when mode = VM_BUF, the another buffer size + * RETURNS + * if succeed, return the layer handle ,otherwise, return error code + *****************************************************************************/ +VM_GDI_HANDLE vm_graphic_create_layer_cf_double(vm_graphic_color_famat cf, VMINT x, VMINT y, VMINT width, VMINT height, vm_graphic_color_argb* trans_color, VMINT mode, VMUINT8 *buf, VMINT buf_size, VMUINT8 *buf1, VMINT buf_size_1); + +/****************************************************************************** + * FUNCTION + * vm_graphic_layer_toggle_double + * DESCRIPTION + * swap the two buffer of the layer. + * PARAMETERS + * handle : [IN] layer handle + * RETURNS + * if succeed, return success ,otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_layer_toggle_double(VMINT handle); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_release_canvas_ex + * DESCRIPTION + * release the canvas handle. if the canvas maps with layer (it means using this canvas buffer to create a layer), the layer will + * be deleted at the same time. + * PARAMETERS + * hcanvas : [IN] canvas handle + * RETURNS + * if succeed, return VM_GDI_SUCCEED ,otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_release_canvas_ex(VMINT hcanvas); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_flatten_canvas + * DESCRIPTION + * merge several canvas display buffer to active layer and release the canvases and them own layers. the canvas buffers must + * map with layer, otherwise, their can not be merged. the MAX number of merged canvases is 4. + * PARAMETERS + * hcanvas : [IN] canvas handle array + * count : [IN] cavas number + * RETURNS + * if succeed, return VM_GDI_SUCCEED ,otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_flatten_canvas(VMINT *hcanvas,VMINT count); + +/****************************************************************************** + * FUNCTION + * vm_graphic_flatten_canvas + * DESCRIPTION + * merge several canvas display buffer to active layer. the canvas buffers must + * map with layer, otherwise, their can not be merged. the MAX number of merged canvases is 4. + * PARAMETERS + * hcanvas : [IN] canvas handle array + * count : [IN] cavas number + * RETURNS + * if succeed, return VM_GDI_SUCCEED ,otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_flatten_canvas_ex(VMINT *hcanvas,VMINT count); + +/****************************************************************************** + * FUNCTION + * vm_graphic_flatten_layer + * DESCRIPTION + * merge several layer to active layer and release layers. active layer will not be released. the MAX number of merged layers is 4. + * PARAMETERS + * hhandle : [IN] layer handle array + * count : [IN] layer number + * RETURNS + * if succeed, return VM_GDI_SUCCEED ,otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_flatten_layer(VMINT *hhandle,VMINT count); + +/****************************************************************************** + * FUNCTION + * vm_graphic_flatten_layer + * DESCRIPTION + * merge several layer to active layer. the MAX number of merged layers is 4. + * PARAMETERS + * hhandle : [IN] layer handle array + * count : [IN] layer number + * RETURNS + * if succeed, return VM_GDI_SUCCEED ,otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_flatten_layer_ex(VMINT *hhandle,VMINT count); + +/****************************************************************************** + * FUNCTION + * vm_graphic_resize_layer + * DESCRIPTION + * resize layer size. after resize, the layer need to be re-draw. new width and height can not be larger than the origion's. + * PARAMETERS + * handle : [IN] layer handle + * width : [IN] new layer width + * height : [IN] new layer height + * RETURNS + * if succeed, return VM_GDI_SUCCEED ,otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_resize_layer(VMINT handle,VMINT width,VMINT height); + + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_setpen + * DESCRIPTION + * set pen attribute + * PARAMETERS + * pen : [IN] pen pointer + * RETURNS + * if succeed, return VM_GDI_SUCCEED ,otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_setpen(vm_graphic_pen *pen); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_getpen + * DESCRIPTION + * get pen attribute + * PARAMETERS + * void + * RETURNS + * pen attribute structure + *****************************************************************************/ +vm_graphic_pen vm_graphic_getpen(void); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_setcolor + * DESCRIPTION + * set global color + * PARAMETERS + * color : [IN] color pointer + * RETURNS + * if succeed, return VM_GDI_SUCCEED ,otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_setcolor(vm_graphic_color* color); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_setcolor + * DESCRIPTION + * set global color + * PARAMETERS + * void + * RETURNS + * return global color + *****************************************************************************/ +vm_graphic_color vm_graphic_getcolor(void); + +/****************************************************************************** + * FUNCTION + * vm_graphic_setcolor_argb + * DESCRIPTION + * set global color + * PARAMETERS + * color : [IN] color pointer, the color value include a, r, g, b value + * RETURNS + * if succeed, return VM_GDI_SUCCEED ,otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_setcolor_argb(vm_graphic_color_argb* color); + +/****************************************************************************** + * FUNCTION + * vm_graphic_getcolor_argb + * DESCRIPTION + * set global color + * PARAMETERS + * void + * RETURNS + * return global color, the color value include a, r, g, b value + *****************************************************************************/ +vm_graphic_color_argb vm_graphic_getcolor_argb(void); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_set_pixel_ex + * DESCRIPTION + * draw point on the layer + * PARAMETERS + * handle : [IN] layer handle + * x1 : [IN] x offset of start position + * y1 : [IN] y offset of start position + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_set_pixel_ex(VMINT handle,VMINT x1,VMINT y1); + +/****************************************************************************** + * FUNCTION + * vm_graphic_line_ex + * DESCRIPTION + * draw line on the layer, not using pen + * PARAMETERS + * handle : [IN] layer handle + * x1 : [IN] x offset of start position + * y1 : [IN] y offset of start position + * x2 : [IN] x offset of end position + * y2 : [IN] y offset of end position + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_line_ex(VMINT handle,VMINT x1,VMINT y1,VMINT x2,VMINT y2); + + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_line_style + * DESCRIPTION + * draw line with style. before using this API, vm_graphic_set_pen must be called, otherwise the operation will have no effection + * PARAMETERS + * handle : [IN] layer handle + * x1 : [IN] x offset of start position + * y1 : [IN] y offset of start position + * x2 : [IN] x offset of end position + * y2 : [IN] y offset of end position + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_line_style(VMINT handle,VMINT x1,VMINT y1,VMINT x2,VMINT y2); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_roundrect_ex + * DESCRIPTION + * draw round rectangle on the layer. + * PARAMETERS + * handle : [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * width : [IN] round rectangle width + * height : [IN] round rectangle height + * frame_width : [IN] radius of the rounded angle. the value must less than half of width, if not, the api will have no effect + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_roundrect_ex(VMINT handle, VMINT x, VMINT y, VMINT width, VMINT height, VMINT frame_width); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_rect_ex + * DESCRIPTION + * draw rect on the layer. + * PARAMETERS + * handle : [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * width : [IN] rect width + * height : [IN] rect height + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_rect_ex(VMINT handle, VMINT x, VMINT y, VMINT width, VMINT height); + + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_ellipse_ex + * DESCRIPTION + * draw ellipse on the layer. + * PARAMETERS + * handle : [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * width : [IN] ellipse width + * height : [IN] ellipse height + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_ellipse_ex(VMINT handle, VMINT x, VMINT y, VMINT width, VMINT height); + + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_polygon + * DESCRIPTION + * draw polygon on the layer. + * PARAMETERS + * handle : [IN] layer handle + * point : [IN] point coordination array + * npoint : [IN] point number + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_polygon(VMINT handle, vm_graphic_point *point,VMINT npoint); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_fill_roundrect_ex + * DESCRIPTION + * draw round rectangle on the layer. + * PARAMETERS + * handle : [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * width : [IN] round rectangle width + * height : [IN] round rectangle height + * frame_width : [IN] radius of the rounded angle. the value must less than half of width, if not, the api will have no effect + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_fill_roundrect_ex(VMINT handle, VMINT x, VMINT y, VMINT width, VMINT height, VMINT frame_width); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_fill_rect_ex + * DESCRIPTION + * draw filled rect on the layer. + * PARAMETERS + * handle : [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * width : [IN] rect width + * height : [IN] rect height + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_fill_rect_ex(VMINT handle, VMINT x, VMINT y, VMINT width, VMINT height); + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_fill_ellipse_ex + * DESCRIPTION + * draw ellipse on the layer. + * PARAMETERS + * handle : [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * width : [IN] ellipse width + * height : [IN] ellipse height + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_fill_ellipse_ex(VMINT handle, VMINT x, VMINT y, VMINT width, VMINT height); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_polygon + * DESCRIPTION + * draw filled polygon on the layer. + * PARAMETERS + * handle : [IN] layer handle + * point : [IN] point coordination array + * npoint : [IN] point number + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_fill_polygon(VMINT handle, vm_graphic_point *point,VMINT npoints); + + + + +/****************************************************************************** + * FUNCTION + * vm_graphic_gradient_paint_rect + * DESCRIPTION + * draw gradient_paint_rect on the layer. + * PARAMETERS + * handle : [IN] layer handle + * x1 : [IN] x offset of top left position + * y1 : [IN] y offset of top left position + * x2 : [IN] x offset of bottom right position + * y2 : [IN] y offset of bottom right position + * color_start : [IN]start color of gradient color + * color_end : [IN] end colorof gradient color + * style : [IN] paint style + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_gradient_paint_rect(VMINT handle, VMINT x1, VMINT y1, VMINT x2, VMINT y2, vm_graphic_color color_start, vm_graphic_color color_end,vm_graphic_gp_style style); + + +/****************************************************************************** + * FUNCTION + * vm_graphic_get_layer_clip + * DESCRIPTION + * get layer clip region. + * PARAMETERS + * handle : [IN] layer handle + * curcliprect : [OUT] region structure pointer + * RETURNS + * if succeed, return VM_GDI_SUCCEED, otherwise, return error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_get_layer_clip(VMINT handle,clip_rect * curcliprect); + + + +/****************************************************************************** +* FUNCTION +* vm_graphic_set_layer_clip +* DESCRIPTION +* set layer clip region. it will affect the global setting +* PARAMETERS +* handle : [IN] layer handle +* x1 : [IN] x offset of top left position + * y1 : [IN] y offset of top left position + * x2 : [IN] x offset of bottom right position + * y2 : [IN] y offset of bottom right position + +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_set_layer_clip(VMINT handle,VMINT16 x1,VMINT16 y1,VMINT16 x2,VMINT16 y2); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_translate_layer +* DESCRIPTION +* move the layer to the new position +* PARAMETERS +* handle : [IN] layer handle +* tx : [IN] x offset of new position + * ty : [IN] y offset of new position +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_translate_layer(VMINT handle , VMINT tx, VMINT ty); + + + + +/****************************************************************************** +* FUNCTION +* vm_graphic_rotate_layer +* DESCRIPTION +* rotate the layer +* PARAMETERS +* handle : [IN] layer handle +* rotatevalue : [IN] degree of angle,now, valid value is VM_GDI_ROTATE_90,VM_GDI_ROTATE_180 ,VM_GDI_ROTATE_270 +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_rotate_layer(VMINT handle, vm_graphic_rotate_value rotatevalue); + + + +/****************************************************************************** +* FUNCTION +* vm_graphic_load_image_resized +* DESCRIPTION +* resize image to appointed size +* PARAMETERS +* img_data : [IN] image data buffer pointer +* img_len : [IN] image length +* width : [IN] image new width +* height : [IN] image new height +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_load_image_resized(VMUINT8 *img_data, VMINT img_len,VMINT width,VMINT height); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_load_image_resized_cf +* DESCRIPTION +* resize image to appointed size +* PARAMETERS +* cf : [IN] color format +* img_data : [IN] image data buffer pointer +* img_len : [IN] image length +* width : [IN] image new width +* height : [IN] image new height +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VMINT vm_graphic_load_image_resized_cf(vm_graphic_color_famat cf, VMUINT8 *img_data, VMINT img_len,VMINT width,VMINT height); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_load_gif_resized_by_percent +* DESCRIPTION +* enlarge gif image +* PARAMETERS +* img_data : [IN] image data buffer pointer +* img_len : [IN] image length +* percent : [IN] the percent of enlarge +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VMINT vm_graphic_load_gif_resized_by_percent(VMUINT8 *img_data, VMINT img_len,VMINT percent); + +/****************************************************************************** +* FUNCTION +* vm_graphic_load_gif_resized_by_percent_cf +* DESCRIPTION +* enlarge gif image +* PARAMETERS +* cf : [IN] color format +* img_data : [IN] image data buffer pointer +* img_len : [IN] image length +* percent : [IN] the percent of enlarge +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VMINT vm_graphic_load_gif_resized_by_percent_cf(vm_graphic_color_famat cf, VMUINT8 *img_data, VMINT img_len,VMINT percent); + +/****************************************************************************** + * FUNCTION + * vm_graphic_load_gif_frame + * DESCRIPTION + * gif image decode, and draw the decoded image frame (from start_frame_index to end_frame_index) to the new-created canvas. + * PARAMETERS + * img : [IN] pointer of source image data + * img_len : [IN] image length + * start_frame_index : [IN] the first frame of the gif image to be decoded + * end_frame_index : [IN] the last frame of the gif image to be decoded + * RETURNS + * the pointer of the canvas's display buffer + *****************************************************************************/ +VMINT vm_graphic_load_gif_frame(VMUINT8 *img_data, VMINT img_len, VMINT start_frame_index, VMINT end_frame_index); + +/****************************************************************************** + * FUNCTION + * vm_graphic_load_gif_frame_cf + * DESCRIPTION + * gif image decode, and draw the decoded image frame (from start_frame_index to end_frame_index) to the new-created canvas. + * PARAMETERS + * cf : [IN] color format + * img : [IN] pointer of source image data + * img_len : [IN] image length + * start_frame_index : [IN] the first frame of the gif image to be decoded + * end_frame_index : [IN] the last frame of the gif image to be decoded + * RETURNS + * the pointer of the canvas's display buffer + *****************************************************************************/ +VMINT vm_graphic_load_gif_frame_cf(vm_graphic_color_famat cf, VMUINT8 *img_data, VMINT img_len, VMINT start_frame_index, VMINT end_frame_index); + +/****************************************************************************** +* FUNCTION +* vm_graphic_load_gif_frame_resized +* DESCRIPTION +* resize image to appointed size +* PARAMETERS +* img_data : [IN] image data buffer pointer +* img_len : [IN] image length +* width : [IN] image new width +* height : [IN] image new height +* start_frame_index : [IN] the first frame of the gif image to be decoded +* end_frame_index : [IN] the last frame of the gif image to be decoded +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VMINT vm_graphic_load_gif_frame_resized(VMUINT8 *img_data, VMINT img_len,VMINT width,VMINT height, VMINT start_frame_index, VMINT end_frame_index); + +/****************************************************************************** +* FUNCTION +* vm_graphic_load_gif_frame_resized_cf +* DESCRIPTION +* resize image to appointed size +* PARAMETERS +* cf : [IN] color format +* img_data : [IN] image data buffer pointer +* img_len : [IN] image length +* width : [IN] image new width +* height : [IN] image new height +* start_frame_index : [IN] the first frame of the gif image to be decoded +* end_frame_index : [IN] the last frame of the gif image to be decoded +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VMINT vm_graphic_load_gif_frame_resized_cf(vm_graphic_color_famat cf, VMUINT8 *img_data, VMINT img_len,VMINT width,VMINT height, VMINT start_frame_index, VMINT end_frame_index); + +/****************************************************************************** +* FUNCTION +* vm_graphic_load_gif_frame_resized_by_percent +* DESCRIPTION +* enlarge gif image +* PARAMETERS +* img_data : [IN] image data buffer pointer +* img_len : [IN] image length +* percent : [IN] the percent of enlarge +* start_frame_index : [IN] the first frame of the gif image to be decoded +* end_frame_index : [IN] the last frame of the gif image to be decoded +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VMINT vm_graphic_load_gif_frame_resized_by_percent(VMUINT8 *img_data, VMINT img_len,VMINT percent, VMINT start_frame_index, VMINT end_frame_index); + +/****************************************************************************** +* FUNCTION +* vm_graphic_load_gif_frame_resized_by_percent_cf +* DESCRIPTION +* enlarge gif image +* PARAMETERS +* cf : [IN] color format +* img_data : [IN] image data buffer pointer +* img_len : [IN] image length +* percent : [IN] the percent of enlarge +* start_frame_index : [IN] the first frame of the gif image to be decoded +* end_frame_index : [IN] the last frame of the gif image to be decoded +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VMINT vm_graphic_load_gif_frame_resized_by_percent_cf(vm_graphic_color_famat cf, VMUINT8 *img_data, VMINT img_len,VMINT percent, VMINT start_frame_index, VMINT end_frame_index); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_get_blt_layer_count +* DESCRIPTION +* get the MAX layer count that can be drawn +* PARAMETERS +* void +* RETURNS +* MAX layer count that can be drawn +*****************************************************************************/ +VMINT vm_graphic_get_blt_layer_count(void); + + + + +/****************************************************************************** +* FUNCTION +* vm_font_set_font_size +* DESCRIPTION +* set font size. Recommended that use font_size_t type to define size. if use number directly, the UI may be diffrent from dot character with vector font +* PARAMETERS +* size : [IN] font size +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_font_set_font_size(VMINT size); + + +/****************************************************************************** +* FUNCTION +* vm_font_set_font_style +* DESCRIPTION +* set font style . valid only to vector font +* PARAMETERS +* bold : [IN]wether to bold, value:TRUE or FALSE +* italic : [IN]wether to italic, value:TRUE or FALSE +* underline: wether to underline, value:TRUE or FALSE +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_font_set_font_style(VMINT bold,VMINT italic,VMINT underline); + + + +/****************************************************************************** +* FUNCTION +* vm_graphic_textout_to_layer +* DESCRIPTION +* draw text on the layer +* PARAMETERS +* handle: layer handle +* x : [IN]x offset of start position +* y : [IN]y offset of start position +* s : [IN]string pointer +* length : [IN]string length +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_textout_to_layer (VMINT handle, VMINT x, VMINT y, VMWSTR s, VMINT length); + +/****************************************************************************** +* FUNCTION +* vm_graphic_get_string_baseline +* DESCRIPTION +* get the baseline of the string +* PARAMETERS +* string : [IN] string pointer +* RETURNS +* baseline of the string +*****************************************************************************/ +VMINT vm_graphic_get_string_baseline(VMWSTR string); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_textout_to_layer_by_baseline +* DESCRIPTION +* show the string to the layer according baseline +* PARAMETERS +* handle: layer handle +* x : [IN]x offset of start position +* y : [IN]y offset of start position +* s : [IN] string pointer +* length: [IN] the length of the string +* baseline: [IN]the baseline of the string +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_textout_to_layer_by_baseline (VMINT handle, VMINT x, VMINT y, VMWSTR s, VMINT length,VMINT baseline); + +/****************************************************************************** +* FUNCTION +* vm_graphic_canvas_set_trans_color +* DESCRIPTION +* set canvas transparent color . when use vm_graphic_blt_ex, the color will take effect +* PARAMETERS +* hcanvas : [IN] canvas handle +* trans_color : [IN]transparent color value, -1 means no transparent color +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_canvas_set_trans_color(VMINT hcanvas, VMINT trans_color); + +/****************************************************************************** +* FUNCTION +* vm_graphic_canvas_set_trans_color_argb +* DESCRIPTION +* set canvas transparent color . when use vm_graphic_blt_ex, the color will take effect +* PARAMETERS +* hcanvas : [IN] canvas handle +* trans_color : [IN]transparent color value, NULL means no transparent color, the color value include a, r, g, b value +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_canvas_set_trans_color_argb(VMINT hcanvas, vm_graphic_color_argb* trans_color); + + + +/****************************************************************************** +* FUNCTION +* vm_graphic_layer_set_trans_color +* DESCRIPTION +* set layer transparent color . +* PARAMETERS +* hhandle : [IN]layer handle +* trans_color : [IN] transparent color value, -1 means no transparent color +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_layer_set_trans_color(VMINT hhandle, VMINT trans_color); + +/****************************************************************************** +* FUNCTION +* vm_graphic_layer_set_trans_color_argb +* DESCRIPTION +* set layer transparent color . +* PARAMETERS +* hhandle : [IN]layer handle +* trans_color : [IN] transparent color value, NULL means no transparent color, the color value include a, r, g, b value +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return error code +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_layer_set_trans_color_argb(VMINT hhandle, vm_graphic_color_argb* trans_color); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_is_use_vector_font +* DESCRIPTION +* query current platform whether support vector font . +* PARAMETERS +* void +* RETURNS +* if support, return TRUE, otherwise, return FALSE +*****************************************************************************/ +VMINT vm_graphic_is_use_vector_font(void); + +/****************************************************************************** +* FUNCTION +* vm_graphic_draw_abm_text +* DESCRIPTION +* draw bitmap font according to bitmap array. +* PARAMETERS +* handle : [IN] layer handle +* x : [IN] x position of the to be drawn string +* y : [IN] y position of the to be drawn string +* color : [IN]the color of font +* font_data : [IN] font array info +* font_width : [IN] character width +* font_height : [IN] character height +* RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return others +*****************************************************************************/ +VM_GDI_RESULT vm_graphic_draw_abm_text(VMINT handle, VMINT x, VMINT y, VMINT color,VMUINT8* font_data,VMINT font_width,VMINT font_height); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_show_theme_background +* DESCRIPTION +* show theme background. +* PARAMETERS +* void +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_show_theme_background(void); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_show_left_softkey +* DESCRIPTION +* show left softkey. +* PARAMETERS +* void +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_show_left_softkey(void); + + +/****************************************************************************** +* FUNCTION +* vm_graphic_show_right_softkey +* DESCRIPTION +* show right softkey. +* PARAMETERS +* void +* RETURNS +* void +*****************************************************************************/ +void vm_graphic_show_right_softkey(void); + + +//======================================================================== + +/****************************************************************************** +* FUNCTION +* vm_graphic_is_r2l_state +* DESCRIPTION +* +* PARAMETERS + +* RETURNS +* if yes, return 1, otherwise, return 0 +*****************************************************************************/ +VMINT vm_graphic_is_r2l_state(void); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_char_num_in_width + * DESCRIPTION + * To get char number in specified width and gap + * This function only work for non-complicated langauge. + * It means that the language process is not processed in the function. + * PARAMETERS + * String : [IN] The string content + * width : [IN] The specifed width to display the string. + * checklinebreak : [IN] To check line break or not. + * gap [IN] The gap between each character + * RETURNS + * The number of character could be displayed in the specified width. + *****************************************************************************/ +VMUINT vm_graphic_get_char_num_in_width(VMWCHAR* string, VMUINT width, VMINT checklinebreak, VMUINT gap); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_char_num_in_width_ex + * DESCRIPTION + * To get char number in specified width and gap + * This function only work for non-complicated langauge. + * It means that the language process is not processed in the function. + * PARAMETERS + * String : [IN] The string content + * width : [IN] The specifed width to display the string. + * checklinebreak : [IN] To check line break or not. + * gap [IN] The gap between each character + * RETURNS + * The number of character could be displayed in the specified width. + *****************************************************************************/ +VMUINT vm_graphic_get_char_num_in_width_ex(VMWCHAR* string, VMUINT width, VMINT checklinebreak, VMUINT gap); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_draw_gif_image_from_memory + * DESCRIPTION + * PARAMETERS + * dest_layer_handle [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * img_data : [IN] data pointer + * img_len : [IN] length of image data + * frameIdx : [IN] frame id + * RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return others + *****************************************************************************/ +VMINT vm_graphic_draw_gif_image_from_memory(VM_GDI_HANDLE dest_layer_handle,VMINT x,VMINT y,VMUINT8* img_data,VMINT img_len, VMINT frameIdx); + +/***************************************************************************** + * FUNCTION + * vm_graphic_draw_image_from_memory + * DESCRIPTION + * PARAMETERS + * dest_layer_handle [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * img_data : [IN] data pointer + * img_len : [IN] length of image data + * RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return others + *****************************************************************************/ +VMINT vm_graphic_draw_image_from_memory(VM_GDI_HANDLE dest_layer_handle,VMINT x,VMINT y,VMUINT8* img_data,VMINT img_len); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_set_alpha_blending_layer + * DESCRIPTION + * PARAMETERS + * layer_handle [IN] layer handle, pass -1 means restore alpha blending layer + * RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return others + *****************************************************************************/ + +VMINT vm_graphic_set_alpha_blending_layer(VMINT layer_handle); + + +/***************************************************************************** + * FUNCTION + * vm_get_string_width_height_ex + * DESCRIPTION + * PARAMETERS + * string [IN] string pointer + * gap : [IN] gap between characters + * n : [IN] string length + * pWidth : [OUT] width + * pHeight : [OUT] height + * max_width : [IN] the width for the string + * checkLineBreak : [IN] check line break or not + * checkCompleteWord : [IN] check complete word or not + * RETURNS +* how many character can draw in given width + *****************************************************************************/ + +VMUINT vm_get_string_width_height_ex( + VMWCHAR* string, + VMINT gap, + VMINT n, + VMINT *pWidth, + VMINT *pHeight, + VMINT max_width, + VMUINT8 checkLineBreak, + VMUINT8 checkCompleteWord); + +/***************************************************************************** + * FUNCTION + * vm_graphic_show_truncated_text + * DESCRIPTION + * PARAMETERS + * dest_layer_handle [IN] layer handle + * x : [IN] offset x + * y : [IN] offset y + * xwidth : [IN] width for drawing string + * st : [IN] string to show + * truncated_symbol : [IN] truncated symbol, for example,"..." + * bordered : [IN] border or not + * color : [IN] color + * RETURNS +* Error Message + *****************************************************************************/ + + +vm_font_engine_error_message_enum vm_graphic_show_truncated_text(VM_GDI_HANDLE dest_layer_handle, + VMINT x, + VMINT y, + VMINT xwidth, + VMWCHAR *st, + VMWCHAR *truncated_symbol, + VMINT bordered, + VMUINT16 color); + +/***************************************************************************** + * FUNCTION + * vm_graphic_draw_resized_image_from_memory + * DESCRIPTION + * PARAMETERS + * dest_layer_handle [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * resized_width : [IN] resized width + * resized_height : [IN] resized height + * img_data : [IN] data pointer + * img_len : [IN] length of image data + * RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return others + *****************************************************************************/ + +VMINT vm_graphic_draw_resized_image_from_memory(VM_GDI_HANDLE dest_layer_handle,VMINT x,VMINT y,VMINT resized_width,VMINT resized_height,VMUINT8* img_data,VMINT img_len); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_draw_resized_gif_image_from_memory + * DESCRIPTION + * PARAMETERS + * dest_layer_handle [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * resized_width : [IN] resized width + * resized_height : [IN] resized height + * img_data : [IN] data pointer + * img_len : [IN] length of image data + * frameIdx : [IN] frame id + * RETURNS +* if succeed, return VM_GDI_SUCCEED, otherwise, return others + *****************************************************************************/ + +VMINT vm_graphic_draw_resized_gif_image_from_memory(VM_GDI_HANDLE dest_layer_handle,VMINT x,VMINT y,VMINT resized_width,VMINT resized_height,VMUINT8* img_data,VMINT img_len, VMINT frameIdx); + +/***************************************************************************** + * FUNCTION + * vm_graphic_set_blt_layer + * DESCRIPTION + * PARAMETERS + * layer_handles : [IN] the pointer of layer array + * count : [IN] layer number that to be flushed. + * RETURNS + * if succeed, return VM_GDI_SUCCEED. otherwise, return error code + *****************************************************************************/ + +VMINT vm_graphic_set_blt_layer(VMINT* layer_handles, VMINT count); + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_blt_layer + * DESCRIPTION + * PARAMETERS + * count : [OUT] layer number that to be flushed. + * RETURNS + * layer handles array pointer + *****************************************************************************/ + +VMINT* vm_graphic_get_blt_layer( VMINT* count); + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_img_property_ex + * DESCRIPTION + * PARAMETERS + * RETURNS + * error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_get_img_property_ex(VMUINT8 *img_data, VMINT img_len,vm_graphic_imgprop * img_prop); + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_img_property_from_file + * DESCRIPTION + * PARAMETERS + * RETURNS + * error code + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_get_img_property_from_file(const VMWSTR filename, vm_graphic_imgprop * img_prop); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_character_height_ex + * DESCRIPTION + * PARAMETERS + * RETURNS + * the character height + *****************************************************************************/ + +VMINT vm_graphic_get_character_height_ex(VMUWCHAR c); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_highest_char_height_of_all_language + * DESCRIPTION + * PARAMETERS + * RETURNS + * the highest character height of all language + *****************************************************************************/ +VMINT vm_graphic_get_highest_char_height_of_all_language(void); + +/***************************************************************************** + * FUNCTION + * vm_frm_screen_rotate + * DESCRIPTION + * PARAMETERS + * RETURNS + *****************************************************************************/ +void vm_frm_screen_rotate(vm_frm_screen_rotate_enum rotation); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_char_height_alllang + * DESCRIPTION + * Get maximum char height regardless of language for the font size + * PARAMETERS + * size [IN] font size + * RETURNS + * return char height + *****************************************************************************/ +VMINT vm_graphic_get_char_height_alllang(VMINT size); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_draw_image_from_file + * DESCRIPTION + * PARAMETERS + * dest_layer_handle [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * filename : [IN] file name + * RETURNS + * if succeed, return VM_GDI_SUCCEED, otherwise, return others + *****************************************************************************/ +VMINT vm_graphic_draw_image_from_file(VM_GDI_HANDLE dest_layer_handle, VMINT x, VMINT y, const VMWSTR filename); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_draw_resized_image_from_file + * DESCRIPTION + * PARAMETERS + * dest_layer_handle [IN] layer handle + * x : [IN] x offset of start position + * y : [IN] y offset of start position + * resized_width : [IN] resized width + * resized_height : [IN] resized height + * filename : [IN] file name + * RETURNS + * if succeed, return VM_GDI_SUCCEED, otherwise, return others + *****************************************************************************/ +VMINT vm_graphic_draw_resized_image_from_file(VM_GDI_HANDLE dest_layer_handle, VMINT x, VMINT y, VMINT resized_width, VMINT resized_height, const VMWSTR filename); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_flush_layer_ex + * DESCRIPTION + * flatten layers to one layer and blt to LCD for some region. + * PARAMETERS + * layer_handles : [IN] the pointer of layer array + * count : [IN] layer number that to be flushed. if the number is larger than max layer count (get by vm_graphic_get_blt_layer_count()), + * just use the max layer count + * x1 : [IN] x offset of top left position + * y1 : [IN] y offset of top left position + * x2 : [IN] x offset of bottom right position + * y2 : [IN] y offset of bottom right position + * RETURNS + * if succeed, return VM_GDI_SUCCEED. otherwise, return error code + *****************************************************************************/ +VMINT vm_graphic_flush_layer_ex(VMINT* layer_handles, VMINT count, VMINT x1, VMINT y1, VMINT x2, VMINT y2); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_flush_layer_non_block_ex + * DESCRIPTION + * flatten layers to one layer and blt to LCD for some region with non-blocking way. + * PARAMETERS + * layer_handles : [IN] the pointer of layer array + * count : [IN] layer number that to be flushed. if the number is larger than max layer count (get by vm_graphic_get_blt_layer_count()), + * just use the max layer count + * x1 : [IN] x offset of top left position + * y1 : [IN] y offset of top left position + * x2 : [IN] x offset of bottom right position + * y2 : [IN] y offset of bottom right position + * RETURNS + * if succeed, return VM_GDI_SUCCEED. otherwise, return error code + *****************************************************************************/ +VMINT vm_graphic_flush_layer_non_block_ex(VMINT* layer_handles, VMINT count, VMINT x1, VMINT y1, VMINT x2, VMINT y2); + + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_char_baseline_alllang + * DESCRIPTION + * Get maximum char baseline regardless of language for the font size + * PARAMETERS + * size [IN] font size + * RETURNS + * return char baseline + *****************************************************************************/ +VMINT vm_graphic_get_char_baseline_alllang(VMINT size); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_layer_buffer_size + * DESCRIPTION + * Get buffer size of the layer + * PARAMETERS + * handle [IN] layer handle + * RETURNS + * return laeyr buffer size + *****************************************************************************/ +VMINT vm_graphic_get_layer_buffer_size(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_graphic_is_dynamic_switch_cacheable_region + * DESCRIPTION + * query whether the memory is dynamic switch cacheable + * PARAMETERS + * vaddr [IN] the memory start address + * len [IN] the memory size + * RETURNS + * If the can dynamic switch cacheable, return 1; otherwise, return 0 + *****************************************************************************/ +VMINT vm_graphic_is_dynamic_switch_cacheable_region(void * vaddr, VMUINT len); + +/***************************************************************************** + * FUNCTION + * vm_graphic_dynamic_switch_cacheable_region + * DESCRIPTION + * dynamic switch the memory cacheable attribute + * PARAMETERS + * vaddr [IN] the pointer to the memory start address, the memory start address will be changed after switch + * len [IN] the memory size + * cacheable [IN] the cacheable attribute. If it is VM_NON_CACHEABLE, switch the memory from cache to non cache; if it is VM_CACHEABLE, switch the memory from non cache to cache + * NOTE + * 1. The memory must be dynamic switch cacheable, otherwise ASSERT + * 2. Only the whole base layer or fast layer buffer can be dynamic switch cacheable + * RETURNS + * Always return 1; if something abnormal, ASSERT directly + *****************************************************************************/ +VMINT vm_graphic_dynamic_switch_cacheable_region(void **vaddr, VMUINT len, VMUINT cacheable); + +/***************************************************************************** + * FUNCTION + * vm_graphic_2d_linear_transform + * DESCRIPTION + * hw linear transform. + * PARAMETERS + * src_handle : [IN] layer to resize + * sx : [IN] x of left-top cornor of resize region + * sy : [IN] y of left-top cornor of resize region + * sw : [IN] width of resize region + * sh : [IN] height of resize region + * dx : [IN] x of left-top cornor of output region + * dy : [IN] y of left-top cornor of output region + * dw : [IN] width of output region + * dh : [IN] height of output region + * RETURNS + * void + *****************************************************************************/ +VM_GDI_RESULT vm_graphic_2d_linear_transform(VMINT src_handle, VMINT sx,VMINT sy,VMINT sw,VMINT sh,VMINT dx,VMINT dy,VMINT dw,VMINT dh); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hardware/arduino/mtk/system/libmtk/include/vmhttp.h b/hardware/arduino/mtk/system/libmtk/include/vmhttp.h new file mode 100644 index 00000000..d50d09f4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmhttp.h @@ -0,0 +1,966 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMHTTP_SDK_H_ +#define VMHTTP_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +#ifdef WIN32 + typedef unsigned int SOCKET_T; +#else + typedef int SOCKET_T; +#endif + + +/* Default user-agent when send http req */ +#define USER_AGENT "HTTP4MRE/1.3.0(MRE)" + +/* size of http req, include http head and body */ +#define HTTP_REQUEST_BUFSIZE (4096) + +/* HTTP response head size, do not include body */ +#define HTTP_RESPONSE_HEADSIZE (8192) + +/* HTTP cache size, enhance the read speed */ +#define HTTP_CACHE_SIZE (5 * 1024) + +/* HTTP state, get get remote host name , param is not used */ +#define HTTP_STATE_GET_HOSTNAME (1) + +/* HTTP state, connecting to the host , param is not used */ +#define HTTP_STATE_CONNECTING (2) + +/* HTTP state, send the http req , param is percent of sending */ +#define HTTP_STATE_SENDING (3) + +/* HTTP state, receive status , param is not used */ +#define HTTP_STATE_RECV_STATUS (4) + +/* HTTP state, receive heads , param is not used */ +#define HTTP_STATE_RECV_HEADS (5) + +/* HTTP state, receive body , param is not used */ +#define HTTP_STATE_RECV_BODY (6) + +/* HTTP session structure */ +struct http_session_t { + SOCKET_T s; /* SOCKET handle */ + char url[255]; /* Req URL */ + char host[100]; /* Host name */ + VMUINT8 ip_addr[4]; /* Host IP address */ + VMUINT8 ip_addr_len; /* Length of IP */ + int port; /* Server Port, default is 80 */ + int nreqbuf; /* length of Req Buffer */ + char reqbuf[HTTP_REQUEST_BUFSIZE]; /* Req buffer */ + int res_code; /* HTTP response code, <0 means TCP failded */ + int nresbuf; /* HTTP response Head length */ + VMUINT8 resbuf[HTTP_RESPONSE_HEADSIZE]; /* HTTP response Head buffer */ + int nresbody; /* HTTP response Body length */ + VMUINT8* resbody; /* HTTP response Body buffer */ + void (*hook)(int, void*); /* HTTP callback func, app provide this */ + VMWCHAR lasterr[50]; /* Last error string */ +}; +typedef struct http_session_t http_session_t; + + +/* HTTP head structure */ +struct http_head_t { + char name[20]; /* Name of head */ + char value[100]; /* Value of head */ +}; +typedef struct http_head_t http_head_t; + + +/* HTTP request stucture */ +struct http_request_t { + char url[255]; /* Address URL */ + int nhead; /* Count of request head */ + http_head_t *heads; /* Array pointer of of request head */ + int nbody; /* size of request body (byte) */ + char* body; /* pointer of request body */ +}; +typedef struct http_request_t http_request_t; + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_request + * Description + * Start a http request, it's an async method, http response will return from callback function + * Parameters + * request : [IN] HTTP request pointer, the structure can be local variable + * session : [IN/OUT] HTTP session pointer, the structure should be global memory + * Returns + * 0 is successful, otherwise will return following error code: + * ASYN_HTTP_REQ_NOT_SUPPORT_METHOD + * ASYN_HTTP_REQ_NOT_SUPPORT_HTTP_COMM + * ASYN_HTTP_REQ_ONLY_SUPPORT_PROXY + * ASYN_HTTP_REQ_NOT_ENOUGH_RESOURCE + * ASYN_HTTP_REQ_URL_FORMAT_ERROR + * EXAMPLE + * + * http_session_t g_hl_ses; + * void hl_http_req(void) + * { + * http_request_t req; + * int ret; + * memset(&req, 0, sizeof(http_request_t)); + * memset(&g_hl_ses, 0, sizeof(http_session_t)); + * strcpy(req.url, "http://www.mediatek.com/"); + * g_hl_ses.hook = hl_http_hook; + * ret = vm_http_request(&req, &g_hl_ses); + * } + * + *******************************************************************************************/ +int vm_http_request(http_request_t *request, http_session_t *session); + + +/******************************************************************************************* + * + * FUNCTION + * get_http_head + * Description + * Get head in HTTP response + * Parameters + * session : [IN] HTTP request session + * name : [IN] HTTP head name + * value : [IN/OUT] The buffer to store HTTP head value, the maximum size needed is 512 bytes + * Returns + * 0 is successful, otherwise will return error code: -1 + * EXAMPLE + * + * void hl_http_hook(int state, void *ses) + * { + * http_session_t *p_ses; + * int ret; + * char date[512]; + * p_ses = (http_session_t*)ses; + * ret = get_http_head(p_ses, "Date", date); + * } + * + *******************************************************************************************/ +int get_http_head(http_session_t* session, const char* name, char* value); + + +/******************************************************************************************* + * + * FUNCTION + * get_http_head_number + * Description + * Get Head number + * Parameters + * session : [IN] HTTP session pointer + * Returns + * number of head + * EXAMPLE + * + * void hl_http_hook(int state, void *ses) + * { + * http_session_t *p_ses; + * int ret; + * p_ses = (http_session_t*)ses; + * ret = get_http_head_number(p_ses); + * } + * + *******************************************************************************************/ +int get_http_head_number(http_session_t* session); + + +/******************************************************************************************* + * + * FUNCTION + * get_http_head_by_index + * Description + * Get Head name and value by the index + * Parameters + * session : [IN] HTTP request session + * index : [IN] HTTP head index + * name : [IN/OUT] HTTP head name buffer, the maximum size needed is 255 bytes. + * value : [IN/OUT] HTTP head value, the maximum size needed is 512 bytes + * Returns + * 0 is successful, otherwise will return error code: -1 + * EXAMPLE + * + * void hl_http_hook(int state, void *ses) + * { + * http_session_t *p_ses; + * int ret; + * char name[255], value[512]; + * p_ses = (http_session_t*)ses; + * ret = get_http_head_by_index(p_ses, 0, name, value); + * } + * + *******************************************************************************************/ +int get_http_head_by_index(http_session_t* session, int index, char* name, char* value); + + +/******************************************************************************************* + * + * FUNCTION + * vm_cancel_all_http_sessions + * Description + * Cancel all https sessions, created TCP link will be closed. will not send callback to app after closed + * Parameters + * void + * Returns + * void + * EXAMPLE + * + * void hl_http_hook(int state, void *ses) + * { + * http_session_t *p_ses; + * int ret; + * char name[255], value[512]; + * p_ses = (http_session_t*)ses; + * ret = get_http_head_by_index(p_ses, 0, name, value); + * vm_cancel_asyn_http_req(g_hl_http_hd); + * vm_cancel_all_http_sessions(); + * + * } + * + *******************************************************************************************/ +void vm_cancel_all_http_sessions(void); + + +/******************************************************************************************* + * + * FUNCTION + * vm_reg_http_notification + * Description + * Register HTTP status call back function. + * Parameters + * f : [IN] status callback function, state is current state, param is the different meaning in different status, please check Define of HTTP_STATE_XXXX + * Returns + * void + * EXAMPLE + * + * void hl_http_noti(VMINT state, VMINT param) + * { + * char perc[6]; + * switch(state) + * { + * case HTTP_STATE_SENDING: + * vm_sprintf(perc, "%d%%", param); + * break; + * default: + * break; + * } + * } + * void hl_http_req(void) + * { + * http_request_t req; + * int ret; + * memset(&req, 0, sizeof(http_request_t)); + * memset(&g_hl_ses, 0, sizeof(http_session_t)); + * strcpy(req.url, "http://www.mediatek.com/"); + * g_hl_ses.hook = hl_http_hook; + * vm_reg_http_notification(hl_http_noti); + * ret = vm_http_request(&req, &g_hl_ses); + * } + * + *******************************************************************************************/ +void vm_reg_http_notification(void (*f)(VMINT state, VMINT param)); + + +/******************************************************************************************* + * + * FUNCTION + * vm_enable_proxy + * Description + * Enable/Disalbe HTTP proxy, it's a global setting for MRE env. + * Parameters + * use_proxy : [IN] TRUE is use proxy, FALSE is not use Proxy + * Returns + * void + *******************************************************************************************/ +void vm_enable_proxy(VMINT use_proxy); + + +/* HTTP request method enum */ +typedef enum { + GET = 1, + POST, + HEAD, + PUT, + DELETE, + TRACE, + CONNECT +}HTTP_METHOD; + +/* asyn_http_req_t.use_proxy param enum*/ +typedef enum +{ + HTTP_USE_CMNET = 0, /* use cmnet APN to connect */ + HTTP_USE_CMWAP, /* use cmwap APN to connect */ + HTTP_USE_CMNET_PRIORITY, /* If can't find any cmnet's APN, will use cmwap APN */ + HTTP_USE_CMWAP_PRIORITY, /* If can't find any cmwap's APN, will use cmnet APN */ + HTTP_USE_WIFI /* Use WIFI to connect */ +} VM_HTTP_PROXY_TYPE; + + +/* Async http request structure, enhance http_request */ +typedef struct asyn_http_req_t { + HTTP_METHOD req_method; /* HTTP_METHOD */ + VMUINT8 use_proxy; /* VM_HTTP_PROXY_TYPE */ + http_request_t* http_request; /* Old http request */ +}asyn_http_req_t; + + + +/* return value of vm_asyn_http_req, HTTP req success, will sent an async request */ +#define ASYN_HTTP_REQ_ACCEPT_SUCCESS (0) + +/* return value of vm_asyn_http_req, Do not support current method */ +#define ASYN_HTTP_REQ_NOT_SUPPORT_METHOD (1) + +/* return value of vm_asyn_http_req, Do not support HTTP stack */ +#define ASYN_HTTP_REQ_NOT_SUPPORT_HTTP_COMM (2) + +/* return value of vm_asyn_http_req, only support proxy mode */ +#define ASYN_HTTP_REQ_ONLY_SUPPORT_PROXY (3) + +/* return value of vm_asyn_http_req, only one HTTP request should be sent, before it finished, could not start another again. */ +#define ASYN_HTTP_REQ_NOT_ENOUGH_RESOURCE (4) + +/* return value of vm_asyn_http_req, URL format error */ +#define ASYN_HTTP_REQ_URL_FORMAT_ERROR (5) + + +/******************************************************************************************* + * + * FUNCTION + * vm_asyn_http_req + * Description + * Start a http request, it's async function. + * Parameters + * request : [IN] HTTP request, if it's nULL, will return success, but HTTP stack will do nothing. + * http_hook : [IN] Call back function, + * http_state_notify : [IN] HTTP status notify function + * Returns + * return ASYN_HTTP_REQ_ACCEPT_SUCCESS if success, or return error code, please check define of ASYN_HTTP_REQ_XXX + * EXAMPLE + * + * void hl_asyn_http_req(void) + * { + * asyn_http_req_t asyn_req; + * http_request_t req; + * int ret; + * memset(&req, 0, sizeof(http_request_t)); + * strcpy(req.url, "http://www.mediatek.com/"); + * asyn_req.http_request = &req; + * asyn_req.req_method = GET; + * asyn_req.use_proxy = HTTP_USE_CMNET; + * ret = vm_asyn_http_req(&asyn_req, hl_http_hook, hl_asyn_http_noti); + * } + * + *******************************************************************************************/ +VMINT vm_asyn_http_req(asyn_http_req_t *request, void (*http_hook)(VMINT, void*), + void (*http_state_notify)(VMINT state, VMINT param, void* session)); + +/* Get HANDLE successful */ +#define VM_GET_AHH_SUCCESS (0) + +/* Can't found the handle */ +#define VM_GET_AHH_NO_COMM (-1) + +/* Paramter error */ +#define VM_GET_AHH_ERROR_PARAM (-2) + + +/******************************************************************************************* + * + * FUNCTION + * vm_get_asyn_http_req_handle + * Description + * Get async request handle + * Parameters + * request : [IN] HTTP request. + * handle : [IN] http handle. + * Returns + * Is get it successful + * VM_GET_AHH_SUCCESS Get HANDLE successful + * VM_GET_AHH_NO_COMM Can't found the handle + * VM_GET_AHH_ERROR_PARAM Paramter error + * Example + * + * { + * http_request_t internal_req; + * + * req.http_request = &internal_req; + * req.req_method = GET; + * internal_req.nhead = internal_req.nbody = 0; + * strcpy(internal_req.url, "http://www.mediatek.com"); + * + * if (vm_asyn_http_req(&req, http_hook_callback, http_state_callback) == ASYN_HTTP_REQ_ACCEPT_SUCCESS) + * { + * VMINT handle = 0; + * vm_get_asyn_http_req_handle(&req, &handle); // Get the handle + * } + * } + * + *******************************************************************************************/ +VMINT vm_get_asyn_http_req_handle(asyn_http_req_t* request, VMINT* handle); + + + +/* return value of vm_cancel_asyn_http_req, Cancel request success */ +#define VM_CAH_REQ_SUCCESS (0) + +/* return value of vm_cancel_asyn_http_req, Could not found the reqeust */ +#define VM_CAH_REQ_NO_COMM (-1) + + +/******************************************************************************************* + * + * FUNCTION + * vm_cancel_asyn_http_req + * Description + * Cancel one http request + * Parameters + * handle : [IN] http handle, could get it from vm_get_asyn_http_req_handle + * Returns + * VM_CAH_REQ_SUCCESS Cancel request success + * VM_CAH_REQ_NO_COMM Could not found the reqeust + * EXAMPLE + * + * void hl_http_hook(int state, void *ses) + * { + * http_session_t *p_ses; + * int ret; + * char name[255], value[512]; + * p_ses = (http_session_t*)ses; + * ret = get_http_head_by_index(p_ses, 0, name, value); + * vm_cancel_asyn_http_req(g_hl_http_hd); + * vm_cancel_all_http_sessions(); + * + * } + * + *******************************************************************************************/ +VMINT vm_cancel_asyn_http_req(VMINT handle); + + +/******************************************************************************************* + * + * FUNCTION + * vm_url_encode_gb2312 + * Description + * GB2312 to URL encode + * Parameters + * dst : [OUT] Dest buffer + * size : [IN] Dest buffer size(byte) + * src : [IN] Source buffer + * Returns + * size of dest string(byte), do not include \0. + * EXAMPLE + * + * static void hl_http_encode_url(void) + * { + * VMSTR src = "http://www.²âÊÔ.com"; + * VMCHAR des[255]; + * int ret; + * ret = vm_url_encode_gb2312(des,sizeof(des), src); + * } + * + *******************************************************************************************/ +VMUINT vm_url_encode_gb2312(VMSTR dst, VMUINT size, const VMSTR src); + + +/******************************************************************************************* + * + * FUNCTION + * vm_url_decode_gb2312 + * Description + * URL to GB2312 decode + * Parameters + * dst : [OUT] Dest buffer + * size : [IN] Dest buffer size(byte) + * src : [IN] Source buffer + * Returns + * size of dest string(byte), do not include \0. + * EXAMPLE + * + * static void hl_http_decode_url(void) + * { + * VMSTR src = "http%3a%2f%2fwww.%b2%e2%ca%d4.com"; + * VMCHAR des[255]; + * int ret; + * ret = vm_url_decode_gb2312(des, sizeof(des), src); + * } + * + *******************************************************************************************/ +VMUINT vm_url_decode_gb2312(VMSTR dst, VMUINT size, VMSTR src); + + +/******************************************************************************************* + * + * FUNCTION + * http_data_receiver + * Description + * HTTP reponse callback function typedef + * Parameters + * handle : [IN] HTTP handle + * p : [IN] Not used + * Returns + * >0 total length, 0 block, <0 error code. + *******************************************************************************************/ +typedef VMINT(*http_data_receiver)(VMINT handle, void* p); + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_reg_receiver + * Description + * Register receiver + * Parameters + * handle : [IN] HTTP handle + * reciever : [IN] Receive data callback + * Returns + * Is successful + * EXAMPLE + * + * void hl_http_fetch(void) + * { + * asyn_http_req_t asyn_req; + * http_request_t req; + * int ret; + * + * memset(&req, 0, sizeof(http_request_t)); + * strcpy(req.url, "http://www.mediatek.com"); + * asyn_req.http_request = &req; + * asyn_req.req_method = GET; + * if (vm_wifi_is_connected()) { + * asyn_req.use_proxy = HTTP_USE_WIFI; + * } + * else { + * asyn_req.use_proxy = HTTP_USE_CMNET_PRIORITY; + * } + * g_hl_http_hd = vm_http_fetch_handle(ASYN_HTTP_REQ, &asyn_req); + * vm_http_reg_receiver(g_hl_http_hd, hl_data_recv); + * ret = vm_asyn_http_req(&asyn_req, NULL, hl_asyn_http_noti); + * } + * + *******************************************************************************************/ +VMINT vm_http_reg_receiver(VMINT handle, http_data_receiver reciever); + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_recv_data + * Description + * Receive HTTP Data + * Parameters + * handle : [IN] HTTP handle + * data : [IN] Buffer pointer + * len : [IN] Buffer size + * Returns + * Received data size + * EXAMPLE + * + * VMINT hl_data_recv(VMINT handle, void* p) + * { + * VMINT ret; + * VMUINT8 data[1024]; + * ret = vm_http_recv_data(handle, data, 1024); + * return TRUE; + * } + * + *******************************************************************************************/ +VMINT vm_http_recv_data(VMINT handle, VMUINT8* data, VMINT len); + + +/******************************************************************************************* + * + * FUNCTION + * http_data_sender + * Description + * Callback function of HTTP data callback + * Parameters + * handle : [IN] HTTP handle + * p : [IN] Not used + * Returns + * >0 total length, 0 block, <0 error code. + *******************************************************************************************/ +typedef VMINT(*http_data_sender)(VMINT handle, void* p); + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_reg_sender + * Description + * Register HTTP datacall back function + * Parameters + * handle : [IN] HTTP handle + * sender : [IN] Callback function + * Returns + * Is successful + * EXAMPLE + * + * void hl_http_fetch(void) + * { + * asyn_http_req_t asyn_req; + * http_request_t req; + * int ret; + * + * memset(&req, 0, sizeof(http_request_t)); + * strcpy(req.url, "http://www.mediatek.com"); + * asyn_req.http_request = &req; + * asyn_req.req_method = GET; + * if (vm_wifi_is_connected()) { + * asyn_req.use_proxy = HTTP_USE_WIFI; + * } + * else { + * asyn_req.use_proxy = HTTP_USE_CMNET_PRIORITY; + * } + * g_hl_http_hd = vm_http_fetch_handle(ASYN_HTTP_REQ, &asyn_req); + * vm_http_reg_sender(g_hl_http_hd, hl_data_sender); + * ret = vm_asyn_http_req(&asyn_req, NULL, hl_asyn_http_noti); + * } + * + *******************************************************************************************/ +VMINT vm_http_reg_sender(VMINT handle, http_data_sender sender); + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_send_data + * Description + * Send HTTP data, use this after send http request + * Parameters + * handle : [IN] HTTP handle + * data : [IN] Buffer of HTTP data + * len : [IN] Length of HTTP data + * Returns + * Is successful + * EXAMPLE + * + * VMINT hl_data_sender(VMINT handle, void* p) + * { + * VMUINT8 data[1024]; + * strcpy(data, "Data data data..."); + * vm_http_send_data(g_hl_http_hd, data, strlen(data)); + * } + * + *******************************************************************************************/ +VMINT vm_http_send_data(VMINT handle, VMUINT8* data, VMINT len); + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_add_header + * Description + * Add http head, APP need to provide name and value memory, call this before start the request. + * max length of name+value is 400 bytes + * Parameters + * handle : [IN] HTTP handle + * name : [IN] name of head + * value : [IN] value of head + * Returns + * Is successful + * EXAMPLE + * + * void hl_http_fetch(void) + * { + * asyn_http_req_t asyn_req; + * http_request_t req; + * int ret; + * + * memset(&req, 0, sizeof(http_request_t)); + * strcpy(req.url, "http://www.mediatek.com"); + * asyn_req.http_request = &req; + * asyn_req.req_method = GET; + * if (vm_wifi_is_connected()) { + * asyn_req.use_proxy = HTTP_USE_WIFI; + * } + * else { + * asyn_req.use_proxy = HTTP_USE_CMNET_PRIORITY; + * } + * g_hl_http_hd = vm_http_fetch_handle(ASYN_HTTP_REQ, &asyn_req); + * vm_http_reg_receiver(g_hl_http_hd, hl_data_recv); + * vm_http_add_header(g_hl_http_hd, "Keep-Alive", "115"); + * vm_http_add_header(g_hl_http_hd, "Connection", "keep-alive"); + * ret = vm_asyn_http_req(&asyn_req, NULL, hl_asyn_http_noti); + * } + * + *******************************************************************************************/ +VMINT vm_http_add_header(VMINT handle, VMCHAR* name, VMCHAR* value); + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_set_body + * Description + * Set HTTP request URL, URL max length is 400 bytes + * Parameters + * handle : [IN] HTTP handle + * url : [IN] URL pointer, app need to handle this buffer by itself. + * len : [IN] URL size + * Returns + * Is successful + * EXAMPLE + * + * void hl_http_fetch(void) + * { + * asyn_http_req_t asyn_req; + * http_request_t req; + * int ret; + * + * memset(&req, 0, sizeof(http_request_t)); + * strcpy(req.url, "http://www.mediatek.com"); + * asyn_req.http_request = &req; + * asyn_req.req_method = GET; + * if (vm_wifi_is_connected()) { + * asyn_req.use_proxy = HTTP_USE_WIFI; + * } + * else { + * asyn_req.use_proxy = HTTP_USE_CMNET_PRIORITY; + * } + * g_hl_http_hd = vm_http_fetch_handle(ASYN_HTTP_REQ, &asyn_req); + * vm_http_set_url(g_hl_http_hd, "http://www.mediatek.com", strlen("http://www.mediatek.com")); + * ret = vm_asyn_http_req(&asyn_req, hl_http_hook, hl_asyn_http_noti); + * } + * + *******************************************************************************************/ +VMINT vm_http_set_url(VMINT handle, VMCHAR* url, VMINT len); + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_set_body + * Description + * Set HTTP request body, before start the request, free memory of data after request is sent + * Parameters + * handle : [IN] HTTP handle + * data : [IN] Body pointer, could be NULL, then body will upload by callback function + * len : [IN] Body size, will write to head's content-length section. + * Returns + * Is successful + * EXAMPLE + * + * void hl_http_fetch(void) + * { + * asyn_http_req_t asyn_req; + * http_request_t req; + * int ret; + * + * memset(&req, 0, sizeof(http_request_t)); + * strcpy(req.url, "http://www.mediatek.com"); + * asyn_req.http_request = &req; + * asyn_req.req_method = POST; + * if (vm_wifi_is_connected()) { + * asyn_req.use_proxy = HTTP_USE_WIFI; + * } + * else { + * asyn_req.use_proxy = HTTP_USE_CMNET_PRIORITY; + * } + * g_hl_http_hd = vm_http_fetch_handle(ASYN_HTTP_REQ, &asyn_req); + * vm_http_reg_sender(g_hl_http_hd, hl_data_sender); + * vm_http_set_body(g_hl_http_hd, "Body body body...", strlen("Body body body...")); + * ret = vm_asyn_http_req(&asyn_req, hl_http_hook, hl_asyn_http_noti); + * } + * + *******************************************************************************************/ +VMINT vm_http_set_body(VMINT handle, VMUINT8* data, VMINT len); + + +typedef enum { + ASYN_HTTP_REQ = 0, + HTTP_REQUEST +} HTTP_HANDLE_TYPE; + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_fetch_handle + * Description + * Get a valid HTTP, use it when need to config HTTP request by vm_set_http_header(), vm_set_http_body() + * Parameters + * type : [IN] Type of get http handle + * p : [IN] pointer of asyn_http_req_t + * Returns + * HTTP handle + * EXAMPLE + * + * void hl_http_fetch(void) + * { + * asyn_http_req_t asyn_req; + * http_request_t req; + * int ret; + * + * memset(&req, 0, sizeof(http_request_t)); + * strcpy(req.url, "http://www.mediatek.com"); + * asyn_req.http_request = &req; + * asyn_req.req_method = POST; + * if (vm_wifi_is_connected()) { + * asyn_req.use_proxy = HTTP_USE_WIFI; + * } + * else { + * asyn_req.use_proxy = HTTP_USE_CMNET_PRIORITY; + * } + * g_hl_http_hd = vm_http_fetch_handle(ASYN_HTTP_REQ, &asyn_req); + * vm_http_reg_sender(g_hl_http_hd, hl_data_sender); + * ret = vm_asyn_http_req(&asyn_req, hl_http_hook, hl_asyn_http_noti); + * } + * + *******************************************************************************************/ +VMINT vm_http_fetch_handle(VMINT type, void* p); + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_get_current_handle + * Description + * Get the current handle + * Parameters + * void + * Returns + * HTTP handle + * EXAMPLE + * + * void hl_http_fetch(void) + * { + * asyn_http_req_t asyn_req; + * http_request_t req; + * int ret; + * VMINT cur_hd; + * memset(&req, 0, sizeof(http_request_t)); + * strcpy(req.url, "http://www.mediatek.com"); + * asyn_req.http_request = &req; + * asyn_req.req_method = POST; + * if (vm_wifi_is_connected()) { + * asyn_req.use_proxy = HTTP_USE_WIFI; + * } + * else { + * asyn_req.use_proxy = HTTP_USE_CMNET_PRIORITY; + * } + * g_hl_http_hd = vm_http_fetch_handle(ASYN_HTTP_REQ, &asyn_req); + * cur_hd = vm_http_get_current_handle(); + * } + * + *******************************************************************************************/ +VMINT vm_http_get_current_handle(void); + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_set_current_handle + * Description + * Set the current handle + * Parameters + * handle : [IN] HTTP handle need to be handle + * Returns + * HTTP handle + * EXAMPLE + * + * void hl_http_fetch(void) + * { + * asyn_http_req_t asyn_req; + * http_request_t req; + * int ret; + * VMINT cur_hd; + * memset(&req, 0, sizeof(http_request_t)); + * strcpy(req.url, "http://www.mediatek.com"); + * asyn_req.http_request = &req; + * asyn_req.req_method = POST; + * if (vm_wifi_is_connected()) { + * asyn_req.use_proxy = HTTP_USE_WIFI; + * } + * else { + * asyn_req.use_proxy = HTTP_USE_CMNET_PRIORITY; + * } + * cur_hd = vm_http_fetch_handle(ASYN_HTTP_REQ, &asyn_req); + * g_hl_http_hd = vm_http_set_current_handle(cur_hd - 1); + * } + * + *******************************************************************************************/ +VMINT vm_http_set_current_handle(VMINT handle); + + +/******************************************************************************************* + * + * FUNCTION + * vm_http_free_handle + * Description + * Release all resource of HTTP, use it after HTTP operate or after cancel the request + * Parameters + * handle : [IN] HTTP handle + * Returns + * void + * EXAMPLE + * + * void hl_http_fetch(void) + * { + * asyn_http_req_t asyn_req; + * http_request_t req; + * int ret; + * VMINT cur_hd; + * memset(&req, 0, sizeof(http_request_t)); + * strcpy(req.url, "http://www.mediatek.com"); + * asyn_req.http_request = &req; + * asyn_req.req_method = POST; + * if (vm_wifi_is_connected()) { + * asyn_req.use_proxy = HTTP_USE_WIFI; + * } + * else { + * asyn_req.use_proxy = HTTP_USE_CMNET_PRIORITY; + * } + * cur_hd = vm_http_fetch_handle(ASYN_HTTP_REQ, &asyn_req); + * ret = vm_asyn_http_req(&asyn_req, hl_http_hook, hl_asyn_http_noti); + * vm_http_free_handle(g_hl_http_hd); + * } + * + *******************************************************************************************/ +void vm_http_free_handle(VMINT handle); + +#ifdef __cplusplus +} +#endif + +#endif /*VMHTTP_SDK_H_*/ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmhttpd.h b/hardware/arduino/mtk/system/libmtk/include/vmhttpd.h new file mode 100644 index 00000000..ed6d238e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmhttpd.h @@ -0,0 +1,359 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmhttpd_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * LinkIt app and http task communicate header file + * + * Author: + * ------- + * jianying.li(mtk81091) + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_HTTPD_SDK_H +#define VM_HTTPD_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ +#include "vmsys.h" +/*VM_CGI_MAX_PARAM*/ +/*VM_CGI_MAX_COMMAND_LINE_LEN*/ +#define VM_CGI_MAX_COMMAND_LINE_LEN 250 + +/*vm_httpsrv_error_enum*/ +typedef enum +{ + VM_HTTPSRV_ERR_NO_ERROR = 0,//operator suceed + VM_HTTPSRV_ERR_STATE_ERROR = -1,//state of http is mess + VM_HTTPSRV_ERR_GET_MEM_FAIL = -2,//memory is not enough + VM_HTTPSRV_ERR_CONNECT_NETWORK_FAIL = -3,//network is not ready + VM_HTTPSRV_ERR_FD_INIT_FAIL = -4,//file disciptor init fail + VM_HTTPSRV_ERR_GET_HOSTNAME_FAIL = -5,//invalid host name + VM_HTTPSRV_ERR_SRV_INIT_FAIL = -6,//server init fail + VM_HTTPSRV_ERR_ERROR_FD_NUMBER = -7,//file diciptor abnormal + VM_HTTPSRV_ERR_OTHERS = -65535,// other errors + VM_HTTPSRV_ERR_CODE = -65536//end mark +}vm_httpsrv_error_enum; +/*the struct of app parameter */ +typedef struct vm_cgi_app_param +{ + VMINT8 command_line[VM_CGI_MAX_COMMAND_LINE_LEN];// memory for string which was reference by argv +} vm_cgi_app_param; + +/*the struct of the parameter with system message VM_MSG_HTTPD */ +typedef struct vm_cgi_launch_param +{ + VMUINT32 hc_handle; //http connection handler, actually, a pointer to hc + vm_cgi_app_param param;//used by app, this struct is fill with command line, which is comes from client +}vm_cgi_launch_param; + +/***************************************************************************** + * FUNCTION + * vm_inet_httpd_start + * DESCRIPTION + * this is for launch http server + * PARAMETERS + * port: [IN]the port to start + * root_dir:[IN] the root dir + * cgi_pattern:[IN] the cgi pattern + * RETURNS + * httpsrv_error_enum:return VM_HTTPSRV_ERR_NO_ERROR, success, othersize, fail + * EXAMPLE + * + * vm_inet_httpd_start(80, "C:\\@httpsrv", "**.vxp"); + * + *****************************************************************************/ +extern vm_httpsrv_error_enum vm_inet_httpd_start(VMUINT32 port, VMINT8* root_dir, VMINT8* cgi_pattern); + +/***************************************************************************** + * FUNCTION + * vm_inet_httpd_stop + * DESCRIPTION + * this is for stop http server + * PARAMETERS + * N/A + * RETURNS + * httpsrv_error_enum:return VM_HTTPSRV_ERR_NO_ERROR, success, othersize, fail + * EXAMPLE + * + * vm_inet_httpd_stop(); + * + *****************************************************************************/ +extern vm_httpsrv_error_enum vm_inet_httpd_stop(void); + +/***************************************************************************** + * FUNCTION + * vm_inet_httpd_restart + * DESCRIPTION + * this is for restart http server + * PARAMETERS + * port: [IN]the port to restart + * root_dir:[IN]the root dir + * cgi_pattern:[IN]the cgi pattern + * RETURNS + * httpsrv_error_enum:return VM_HTTPSRV_ERR_NO_ERROR, success, othersize, fail + * EXAMPLE + * + * vm_inet_httpd_restart(80, "C:\\@httpsrv", "**.vxp"); + * + *****************************************************************************/ +extern vm_httpsrv_error_enum vm_inet_httpd_restart(VMUINT32 port, VMINT8* root_dir, VMINT8* cgi_pattern); + +/***************************************************************************** + * FUNCTION + * vm_inet_httpd_cgi_job_finish + * DESCRIPTION + * call this api to notify http server when cgi app finished the job. + * PARAMETERS + * hc_handle:[IN] when launch LinkIt app, will send VM_MSG_HTTPD,and the parameter with this msg + * is the pointer of vm_cgi_launch_param ; app can get hc_handle from vm_cgi_launch_param ,so app should + * save the handle,a lot of api will use hc_handle as parameter + * RETURNS + * N/A + * EXAMPLE + * + * void httpd_cgi_app_demo(VMUINT32 hc_handle, VMCHAR* command_line) + * { + * VMCHAR* request_method; + * VMCHAR* query_string; + * VMCHAR* content_length; + * VMINT32 con_len; + * VMCHAR* content_data; + * VMCHAR output_buffer[256]; + * if (command_line && command_line[0] != '\0') + * { + * ///TODO: parse command line, and do some thing you need, config setting according to command_line + * } + * + * request_method = vm_inet_httpd_getenv(hc_handle,"REQUEST_METHOD"); + * + * if (request_method && strcmp(request_method, "GET") == 0) + * { + * query_string = vm_inet_httpd_getenv(hc_handle,"QUERY_STRING"); + * ///TODO: parse query_string, and do some thing you need. for example, config setting according to query_string + * } + * else if (request_method && strcmp(request_method, "POST") == 0) + * { + * content_length = vm_inet_httpd_getenv(hc_handle,"CONTENT_LENGTH"); + * if (content_length && sscanf(content_length,"%ld",&con_len) == 1) + * { + * content_data = vm_malloc(con_len + 1); + * if (content_data) + * { + * vm_inet_httpd_read(hc_handle, content_data, con_len); + * ///TODO: parse content_data, and do some thing you need. for example, config setting according to content_data + * vm_free(content_data); + * } + * } + * } + * + * //output the config result to client, let end user knows the config result. + * + * //write message header + * sprintf(output_buffer, "Content-Type:text/html\n\n"); + * vm_inet_httpd_write(hc_handle, output_buffer, strlen(output_buffer)); + * sprintf(output_buffer, "\n"); + * vm_inet_httpd_write(hc_handle, output_buffer, strlen(output_buffer)); + * sprintf(output_buffer, "\nResponse\n\n"); + * vm_inet_httpd_write(hc_handle, write_buffer, strlen(output_buffer)); + * + * //write body. + * sprintf(output_buffer, "\n"); + * vm_inet_httpd_write(hc_handle, output_buffer, strlen(output_buffer)); + * sprintf(output_buffer, "

Dear, your configration be saved suceed.\n"); + * vm_inet_httpd_write(hc_handle, output_buffer, strlen(output_buffer)); + * sprintf(output_buffer, "\n\n"); + * vm_inet_httpd_write(my_app_param.hc_handle, output_buffer, strlen(output_buffer)); + * + * //please remember to give a notification to httpd when job is finished. + * vm_inet_httpd_cgi_job_finish(hc_handle); + * + *****************************************************************************/ +extern void vm_inet_httpd_cgi_job_finish(VMUINT32 hc_handle); + +/***************************************************************************** + * FUNCTION + * vm_inet_httpd_read + * DESCRIPTION + * this api is used to read the data which is comes from client, it is used to instead of stand I/O stream. + * PARAMETERS + * hc_handle: [IN] hc_handle,comes from the parameter with VM_MSG_HTTPD + * buf:[IN/OUT]the buf to hold the read data + * buf_size:[IN]the buf size + * RETURNS + * the actually read size + * EXAMPLE + * + * void httpd_cgi_app_demo(VMUINT32 hc_handle, VMCHAR* command_line) + * { + * VMCHAR* content_length; + * VMINT32 con_len; + * content_length = vm_inet_httpd_getenv(hc_handle,"CONTENT_LENGTH"); + * if (content_length && sscanf(content_length,"%ld",&con_len) == 1) + * { + * content_data = vm_malloc(con_len + 1); + * if (content_data) + * { + * vm_inet_httpd_read(hc_handle, content_data, con_len); + * ///TODO: parse content_data, and do some thing you need. for example, config setting according to content_data + * vm_free(content_data); + * } + * } + * } + * + *****************************************************************************/ +extern VMINT32 vm_inet_httpd_read(VMUINT32 hc_handle, VMINT8* buf, VMINT32 buf_size); + +/***************************************************************************** + * FUNCTION + * vm_inet_httpd_write + * DESCRIPTION + * this api is used to write the data to client, it is used to instead of stand I/O stream. + * PARAMETERS + * hc_handle: [IN] hc_handle,comes from the parameter with VM_MSG_HTTPD + * buf:[IN] the data write to httpd + * content_size:[IN]the data size + * RETURNS + * the actually write size + * EXAMPLE + * + * VMCHAR output_buffer[256]; + * sprintf(output_buffer, "Content-Type:text/html\n\n"); + * vm_inet_httpd_write(hc_handle, output_buffer, strlen(output_buffer)); + * + *****************************************************************************/ +extern VMINT32 vm_inet_httpd_write(VMUINT32 hc_handle, VMINT8* buf, VMINT32 content_size); + +/***************************************************************************** + * FUNCTION + * vm_inet_httpd_getenv + * DESCRIPTION + * this api is get enviroment varible, it's same as other plateform in CGI. + * PARAMETERS + * hc_handle:[IN]hc_handle,comes from the parameter with VM_MSG_HTTPD + * name:[IN]the env name + * RETURNS + * the env string + * EXAMPLE + * + * void httpd_cgi_app_demo(VMUINT32 hc_handle, VMCHAR* command_line) + * { + * VMCHAR* content_length; + * VMINT32 con_len; + * content_length = vm_inet_httpd_getenv(hc_handle,"CONTENT_LENGTH"); + * if (content_length && sscanf(content_length,"%ld",&con_len) == 1) + * { + * content_data = vm_malloc(con_len + 1); + * if (content_data) + * { + * vm_inet_httpd_read(hc_handle, content_data, con_len); + * ///TODO: parse content_data, and do some thing you need. for example, config setting according to content_data + * vm_free(content_data); + * } + * } + * } + * + *****************************************************************************/ +extern VMINT8* vm_inet_httpd_getenv(VMUINT32 hc_handle, VMINT8* name); + +/***************************************************************************** + * FUNCTION + * vm_inet_httpd_enable_ssl + * DESCRIPTION + * this api can enable httpd for SSL. Then it can support https. + * Important + * 1. Must start http server after enable ssl. Https server must run with http server. + * 2. Push your https html into http server source path. Emxaple "E:/httpd". + * If some html files can't be get by http server, you can push them into "E:/httpd/https". We will protect the files of "(httpd sourcepath)/https". + * Example: + * input : http://127.0.0.1/user/index.html output: index.html + * input : https://127.0.0.1/user/index.html output: index.html + * input : http://127.0.0.1/https/index.html output: 403 forbidden + * input : https://127.0.0.1/user/index.html output: index.html + * 3. Support base64 and binary certificate file provide by openssl.exe or certificate authority. + * Don't support cermake.exe certificate file. This is xyssl open source limitation. + * PARAMETERS + * port : [IN] https port + * cer_dir : [IN] The directory for https server certificate files. You must be include "httpd_ca.cer" / "httpd_server.cer" / "httpd_server.key". Total three files and can't change names. + * peer_CN: [IN] The name of client certificate which one https server need verify. Example "HTTPD_CLIENT". + * server_key_passwd : [IN] Pass word of "httpd_server.key" file. Your private key file need a password for protection. + * RETURNS + * void + * EXAMPLE + * + * vm_inet_httpd_enable_ssl(443, E:/https, HTTPD_CLIENT, 1234); + * vm_inet_httpd_start(80, E:/httpd, **.vxp); + * + *****************************************************************************/ +extern void vm_inet_httpd_enable_ssl(VMUINT32 port, VMINT8* cer_dir, VMINT8* peer_cn, VMINT8* server_key_passwd); + +/***************************************************************************** + * FUNCTION + * vm_inet_httpd_disable_ssl + * DESCRIPTION + * this api can disable httpd for SSL. Then it can't support https. + * PARAMETERS + * N/A + * RETURNS + * void + * EXAMPLE + * + * vm_inet_httpd_stop(); + * vm_inet_httpd_disable_ssl(); + * + *****************************************************************************/ +extern void vm_inet_httpd_disable_ssl(); + +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_HTTPD_SDK_H*/ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmhttps.h b/hardware/arduino/mtk/system/libmtk/include/vmhttps.h new file mode 100644 index 00000000..6818a7b2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmhttps.h @@ -0,0 +1,538 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMHTTPS_SDK_H +#define VMHTTPS_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/************************************************************************* + * WPS SERVICE -- MACRO's And Typedef's structure definition + ************************************************************************/ + +#define MRE_WPS_MAX_CONTENT_TYPE_LEN 256 + +/* Connection type constants */ + +#define MRE_WPS_CONN_TYPE_HTTP 1 +#define MRE_WPS_CONN_TYPE_WSP_CL 2 +#define MRE_WPS_CONN_TYPE_WSP_CO 3 +#define MRE_WPS_CONN_TYPE_TLS 4 + +/* HTTP method constants */ + +#define MRE_WPS_HTTP_METHOD_GET 0x40 +#define MRE_WPS_HTTP_METHOD_HEAD 0x42 +#define MRE_WPS_HTTP_METHOD_POST 0x60 +#define MRE_WPS_HTTP_METHOD_PUT 0x61 +#define MRE_WPS_HTTP_METHOD_DELETE 0x43 + +/* HTTP request options */ + +#define MRE_WPS_HTTP_OPTION_NO_CACHE 0x00000001 +#define MRE_WPS_HTTP_OPTION_DO_NOT_CACHE_REPLY 0x00000002 +#define MRE_WPS_HTTP_OPTION_ALWAYS_CACHE 0x00000004 +#define MRE_WPS_HTTP_OPTION_CACHE_ONLY 0x00000008 +#define MRE_WPS_HTTP_OPTION_STALE_CACHE 0x00000010 +#define MRE_WPS_HTTP_OPTION_DO_NOT_HANDLE_SERVER_AUTH 0x00008000 +#define MRE_WPS_HTTP_OPTION_DO_NOT_HANDLE_PROXY_AUTH 0x00010000 +#define MRE_WPS_HTTP_OPTION_DO_NOT_REDIRECT 0x00020000 +#define MRE_WPS_HTTP_OPTION_USE_LARGE_PIPE 0x40000000 +#define MRE_WPS_HTTP_OPTION_FS_COMMIT 0x80000000 +#define MRE_WPS_HTTP_OPTION_NO_NOT_ADD_COOKIE 0x00400000 + +/* HTTP authentication constants */ + +#define MRE_WPS_HTTP_AUTH_SERVER 1 +#define MRE_WPS_HTTP_AUTH_PROXY 2 + +#define MRE_WPS_HTTP_AUTH_TYPE_BASIC 1 +#define MRE_WPS_HTTP_AUTH_TYPE_DIGEST 2 + + +/* Protocol constants */ + +#define MRE_WPS_PROTOCOL_WSP_CL 1 +#define MRE_WPS_PROTOCOL_WSP_CL_WTLS 2 +#define MRE_WPS_PROTOCOL_WSP_CO 3 +#define MRE_WPS_PROTOCOL_WSP_CO_WTLS 4 +#define MRE_WPS_PROTOCOL_HTTP 5 +#define MRE_WPS_PROTOCOL_HTTP_TLS 6 +#define MRE_WPS_PROTOCOL_HTTP_SSL 7 +#define MRE_WPS_PROTOCOL_CACHE 8 +#define MRE_WPS_PROTOCOL_FILE 9 +#define MRE_WPS_PROTOCOL_OTHER 10 + + +#define MRE_WPS_READY_STATUS_NULL 0 /* MMI WPS is not ready to service */ +#define MRE_WPS_READY_STATUS_OK 1 /* MMI WPS is ready to service */ + + +/* used to indicate the result and error code of a request. */ + +#define MRE_WPS_OK 0 /* Success */ +#define MRE_WPS_ERROR_UNKNOWN 1 /* Unknonw error */ +#define MRE_WPS_ERROR_SEND 2 /* Fail to write content */ +#define MRE_WPS_ERROR_INVALID_PARAM 3 /* Invalid parameters */ +#define MRE_WPS_ERROR_INVALID_HEADER 4 /* Invalid headers */ +#define MRE_WPS_ERROR_INVALID_CHANNEL_ID 5 /* Invalid channel ID */ +#define MRE_WPS_ERROR_INVALID_REQUEST_ID 6 /* Invalid request ID */ +#define MRE_WPS_ERROR_INVALID_SEQUENCE_NUM 7 /* Incorrect sequence number in MSG_ID_WPS_READ_CONTENT_REQ and MSG_ID_WPS_POST_CONTENT_RES */ +#define MRE_WPS_ERROR_INVALID_DEFAULT_PROFILE 8 /* Invalid default profile */ +#define MRE_WPS_ERROR_INACTIVE_CHANNEL 9 /* Inactive channel */ +#define MRE_WPS_ERROR_INVALID_CONN_TYPE 10 /* Invalid connection type */ +#define MRE_WPS_ERROR_NO_RESOURCE 11 /* Resource limitation */ +#define MRE_WPS_ERROR_ACCESS_DENY 12 /* Access deny */ +#define MRE_WPS_ERROR_PENDING_REQ_EXIST 13 /* Pending request exists */ +#define MRE_WPS_ERROR_FILE_ACCESS 14 /* File system operation error */ +#define MRE_WPS_ERROR_REQ_ABORT 15 /* Request aborted */ +#define MRE_WPS_ERROR_NOT_FOUND 16 /* Not found */ +#define MRE_WPS_ERROR_REQ_MSG_TOO_LARGE 17 /* Message header is too large */ +#define MRE_WPS_ERROR_REQ_NOT_SUPPORT 18 /* Request is not supported */ +#define MRE_WPS_ERROR_DNS_RESOLVE 19 /* DNS error */ +#define MRE_WPS_ERROR_USE_PROXY 20 /* Proxy error */ +#define MRE_WPS_ERROR_NOT_READY 21 /* WPS is not ready yet */ +#define MRE_WPS_ERROR_NO_CNTXT_AVAILABLE 22 /* WPS free context not available, try after some time*/ +#define MRE_WPS_ERROR_CNTXT_NOT_REGISTERED 23 /* when availing WPS service without register context*/ + +/* This enum is used to specify the reply data format in a WSP/HTTP request. */ +typedef enum +{ + /* Use peer buffer to convey replied content. */ + MRE_WPS_DATA_TYPE_BUFFER, + /* Store replied content in specified file path directly with downloading + progress indication while this is specified as reply_type of + MSG_ID_WPS_HTTP_REQ. */ + MRE_WPS_DATA_TYPE_FILE, + /* Store replied content in specified file path directly without downloading + progress indication while this is specified as reply_type of + MSG_ID_WPS_HTTP_REQ. */ + MRE_WPS_DATA_TYPE_FILE_NO_PROG_IND, + /* Resume a download previously. WPS will append the content in the file + specified in the request. */ + MRE_WPS_DATA_TYPE_FILE_RESUME, + /* multipart/form-data, pass to post_type when do posting for multipart/form-data */ + MRE_WPS_DATA_TYPE_MULTIPART, +} mre_wps_data_type_enum; + +/* vm_wps_content_t is the unit of multipart */ +typedef struct { + VMUINT32 contentTypelen; /* The content type length */ + /* These two fields correspond to the following header: * Content-Type: contentType; charset="charset" * In case of multipart/form-data, each part has such a header. */ + VMUINT8 * contentType; + + VMUINT32 namelen; /* The name length */ + /* These two fields are used in case of multipart/form-data, * and are then included with each part as follows: * Content-Disposition: form-data; name="name"; filename="fileName" */ + VMUINT8 * name; + VMUINT32 fileNamelen; /* The fileName name length */ + VMUINT8 * fileName;/* Its an attribute of Content-Disposition. But not the multipart file name */ + + VMUINT32 charset; + VMUINT32 dataType; /* One of MRE_WPS_DATA_TYPE_BUFFER or MRE_WPS_DATA_TYPE_FILE. */ + VMUINT32 dataLen; + VMUINT32 filepathNamelen; /* The fileName name length */ + VMWCHAR * filepathName;/* Absolute multipart filepath along with its name. */ +} vm_wps_content_t; + +/* the structure used for vm_https_send_req_ext. */ +typedef struct +{ + VMUINT32 request_url_len; /* The request URL length */ + VMUINT8 * request_url; /* The request URL */ + VMUINT32 request_header_len; /* The request header length */ + VMUINT8 * request_header; /* The request header */ + + /* The post segment buffer length when post_type is specified as + MRE_WPS_DATA_TYPE_BUFFER. It is mandatory is method is POST/PUT and post_type + is MRE_WPS_DATA_TYPE_BUFFER. */ + VMUINT32 post_segment_len; + + /* The post data segment. It is mandatory is method is POST/PUT and + post_type is MRE_WPS_DATA_TYPE_BUFFER. */ + VMUINT8 * post_segment; + /*To support Posting of multipart data */ + VMUINT32 num_entries; /*no. of multipart entries*/ + vm_wps_content_t * content; /*application should allocate memory for each vm_wps_content_t and fill the info */ +} vm_wps_http_req_var_struct; + + +/************************************************************************* + * WPS SERVICE -- Callback function prototype + ************************************************************************/ + + /* + * Response to the channel configuration request, and if the result is + * successful, then the channel ID will be used n the HTTP/WSP request. + */ +typedef void (*wps_send_set_channel_rsp_cb)( VMUINT32 req_id, + VMUINT8 channel_id, + VMUINT8 result); + +/* + * Response to channel remove request. If the channel ID in request is + * invalid or some pending request of this channel exists, then an error is + * replied. + */ +typedef void (*wps_unset_channel_rsp_cb)( VMUINT8 channel_id, + VMUINT8 result); + + +/* + * Response to release all request. + */ +typedef void (*wps_send_release_all_req_rsp_cb)( VMUINT8 result); + + +/* + * Notifying applcation about WPS agent termination. + * app should clear all information at its end, and can start again + */ +typedef void (*wps_send_wps_termination_ind_cb)(void); + +/* + * Response to the HTTP/WSP request. new_url is used to hold the new URL + * that was used to retrieve this reply If the original request was + * redirected. If the reply_type in MSG_ID_WPS_HTTP_REQ is + * WPS_DATA_TYPE_BUFFER, then the more flag is used to indicate if + * application needs to use MSG_ID_WPS_READ_CONTENT_REQ to retrieve + * remaining content. + * + * The new_url if available, reply_header if available, and reply_segment + */ +typedef void (*wps_send_http_rsp_cb)( VMUINT16 request_id, /* request ID */ + VMUINT8 result, /* Result (wps_result_error_enum) */ + VMUINT16 status, /* HTTP response codes */ + VMINT32 cause, /* Error cause if result is not ok */ + VMUINT8 protocol, /* Network protocol used to retrieve content. Please refer to the Protocol Constants */ + VMUINT8 content_type_len, + VMUINT8 *content_type, /* The type of replied content.. max 256 characters including NULL */ + VMUINT32 content_length, /* The length of replied content. Incase the content length is unknown, use the more field to know whether there is more data*/ + VMINT32 more, /* Indicate if more data is needed to be retrieved. */ + VMUINT32 new_url_len, /* The length of new redirected URL */ + VMUINT8 *new_url, /* The new redirected URL */ + VMUINT32 reply_header_len, /* The length of replied header */ + VMUINT8 *reply_header, /* The replied header */ + VMUINT32 reply_segment_len, /* The reply segment buffer length when reply_type is specified as WPS_DATA_TYPE_BUFFER. It is mandatory when reply_type is WPS_DATA_TYPE_BUFFER. */ + VMUINT8 *reply_segment ); + +/* + * Response to the MSG_ID_WPS_READ_CONTENT_REQ. The seq_num must be the same + * as the one in the corresponding MSG_ID_WPS_READ_CONTENT_REQ. The more + * flag is used to indicate if application needs to use + * MSG_ID_WPS_READ_CONTENT_REQ to retrieve remaining content. + */ +typedef void (*wps_send_read_content_rsp_cb)( VMUINT16 request_id, /* Request ID */ + VMUINT8 seq_num, /* Sequence number (for debug purpose) */ + VMUINT8 result, /* Result (wps_result_error_enum) */ + VMINT32 more, /* Indicate if more data is needed to be retrieved. */ + VMUINT32 reply_segment_len, /* The reply segment buffer length */ + VMUINT8 *reply_segment /* The reply segment buffer */); + + + +/* + * Response to the cancel request. + */ +typedef void (*wps_send_cancel_rsp_cb)( VMUINT16 request_id, + VMUINT8 result); + + +/* + * Response to status query reqeust. If the status is WPS_READY_STATUS_NULL, + * then WPS will send MSG_ID_WPS_READY_IND to the module who submit + * MSG_ID_WPS_STATUS_QUERY_REQ + */ +typedef void (*wps_send_status_query_rsp_cb)( VMUINT8 status); + +/* + * post data indication + */ +typedef void (*wps_post_ind_cb)(VMUINT16 request_id, VMUINT8 seq_num, VMUINT8 result); + +/************************************************************************* + * WPS SERVICE -- INTERFACE FUNCTION PROTOTYPE + ************************************************************************/ + +/***************************************************************************** + * FUNCTION + * vm_https_is_supported + * DESCRIPTION + * query whether the https is supported by platform + * RETURNS + * 0 means successfully, non-zero is NOT SUPPORT. + *****************************************************************************/ +VMINT vm_https_is_supported(void); + +/***************************************************************************** + * FUNCTION + * vm_https_register_wps_cntxt_and_callback + * DESCRIPTION + * This function is to register callback function + * PARAMETERS + * apn :[IN] APN enum, VM_TCP_APN_CMNET/VM_TCP_APN_CMWAP/VM_TCP_APN_WIFI + * set_channel_rsp_cb :[IN] set channel callback + * unset_channel_cb :[IN] unset channel callback + * release_all_req_cb :[IN] release all request callback + * terminal_ind_cb :[IN] terminal req callback + * http_rsp_cb :[IN] http request callback + * read_content_rsp_cb :[IN] read content callback + * cancel_rsp_cb :[IN] cancel req callback + * status_query_rsp_cb :[IN] status query callback + * RETURNS + * 0 success + *****************************************************************************/ +VMUINT8 vm_https_register_wps_cntxt_and_callback( + VMINT apn, + wps_send_set_channel_rsp_cb set_channel_rsp_cb, + wps_unset_channel_rsp_cb unset_channel_cb, + wps_send_release_all_req_rsp_cb release_all_req_cb, + wps_send_wps_termination_ind_cb terminal_ind_cb, + wps_send_http_rsp_cb http_rsp_cb, + wps_send_read_content_rsp_cb read_content_rsp_cb, + wps_send_cancel_rsp_cb cancel_rsp_cb, + wps_send_status_query_rsp_cb status_query_rsp_cb); + + +/***************************************************************************** + * FUNCTION + * vm_https_send_set_channel_req + * DESCRIPTION + * Configure a dedicated channel for HTTP/WSP requests. An channel can be + * configured to use proxy while use_proxy is true. When use_proxy is true, + * prx_ip, prx_port, username, and password will be used to communicate with + * proxy server, thus prx_ip must not be 0.0.0.0 and if prx_port value 0 + * means use default proxy port 8080. When the conn_type is + * WPS_CONN_TYPE_WSP_CO or WPS_CONN_TYPE_WSP_CL, then use_proxy is true + * default. However, if application simply wants to use current activated + * setting used in WAP, then just set use_default as true and ignore all + * other parameters. + * Static_header (if necessary) must be filled in + * WAP_PROF_CONN_TYPE_WSP_CO and the first WSP request of some dedicated + * channel with connection type WSP_CONN_TYPE_WSP_CL. If application doesn't + * specify static_header, then WPS will use the value currently used by WAP. + * + * PARAMETERS + * req_id : [IN] Request ID + * use_proxy : [IN] Use proxy or not + * prx_ip : [IN] Proxy IP address + * prx_port : [IN] Proxy port number. 0 means default proxy 8080. + * username : [IN] Username for the proxy. Only ASCII is allowed and NULL terminated + * username_len : [IN] length should not exceed 40 character excluding NULL character + * password : [IN] Password for the proxy. Only ASCII is allowed and NULL terminated. + * password_len : [IN] length should not exceed 40 character excluding NULL character + * server_auth_username : [IN] Username for the origin server. Only ASCII is allowed and NULL terminated. + * server_auth_username_len : [IN] length should not exceed 128 character excluding NULL character + * server_auth_password : [IN] length should not exceed 128 character excluding NULL character + * server_auth_password_len : [IN] length should not exceed 40 character excluding NULL character + * static_header_len : [IN] The length of static header + * static_header : [IN] static header + * RETURNS + * void + *****************************************************************************/ +VMUINT8 vm_https_send_set_channel_req( + VMUINT16 req_id, /* Request ID */ + VMUINT8 use_proxy, /* Use proxy or not */ + VMUINT8 prx_ip[4], /* Proxy IP address */ + VMUINT16 prx_port, /* Proxy port number. 0 means default proxy 8080. */ + VMUINT8 *username, /* Username for the proxy. Only ASCII is allowed and NULL terminated. */ + VMUINT8 username_len, /*length should not exceed 40 character excluding NULL character*/ + VMUINT8 *password, /* Password for the proxy. Only ASCII is allowed and NULL terminated. */ + VMUINT8 password_len, /*length should not exceed 40 character excluding NULL character*/ + VMUINT8 *server_auth_username, /* Username for the origin server. Only ASCII is allowed and NULL terminated. */ + VMUINT8 server_auth_username_len, /*length should not exceed 128 character excluding NULL character*/ + VMUINT8 *server_auth_password, /* Password for the origin server. Only ASCII is allowed and NULL terminated. */ + VMUINT8 server_auth_password_len, /*length should not exceed 40 character excluding NULL character*/ + VMUINT32 static_header_len, /* The length of static header */ + VMUINT8 *static_header /* static header */ ); + + +/***************************************************************************** + * FUNCTION + * vm_https_send_unset_channel_req + * DESCRIPTION + * this function is to send unset channel request information to WPS + * PARAMETERS + * channel_id : [IN] channel ID + * RETURNS + * void + *****************************************************************************/ + VMUINT8 vm_https_send_unset_channel_req(VMUINT8 channel_id ); + + +/***************************************************************************** + * FUNCTION + * vm_https_send_req + * DESCRIPTION + * this function is to send a HTTP/WSP request. + * PARAMETERS + request_id, : [IN] Request ID + method, : [IN] HTTP Method Constant + option, : [IN] HTTP request options + reply_type, : [IN] Reply type (wps_data_type_enum) + The file path used to store replied content when reply_type is specified + as WPS_DATA_TYPE_FILE, WPS_DATA_TYPE_FILE_NO_PROG_IND or + WPS_DATA_TYPE_FILE_RESUME. + Max. buffer size that reading side suggests when reply_type is specified + as WPS_DATA_TYPE_BUFFER. + reply_segment_len, : [IN] + request_url_len, : [IN] The request URL length + *request_url, : [IN] The request URL + request_header_len : [IN] The request header length + *request_header, : [IN] The request header + The post segment buffer length when post_type is specified as + WPS_DATA_TYPE_BUFFER. It is mandatory is method is POST/PUT and post_type + is WPS_DATA_TYPE_BUFFER. + post_segment_len, : [IN] + *post_segment : [IN] + * RETURNS + * void + *****************************************************************************/ +VMUINT8 vm_https_send_req( VMUINT16 request_id, /* Request ID */ + VMUINT8 method, /* HTTP Method Constant */ + VMUINT32 option, /* HTTP request options */ + VMUINT8 reply_type, /* Reply type (wps_data_type_enum) */ + VMUINT32 reply_segment_len, + VMUINT32 request_url_len, /* The request URL length */ + VMUINT8 *request_url, /* The request URL */ + VMUINT32 request_header_len, /* The request header length */ + VMUINT8 *request_header, /* The request header */ + VMUINT32 post_segment_len, + VMUINT8 *post_segment ); + + +/***************************************************************************** + * FUNCTION + * vm_https_send_read_content_req + * DESCRIPTION + * this function is to send request to continue to read HTTP/WSP reply content. + * PARAMETERS + * request_id : [IN] Request ID + * seq_num : [IN] Sequence number (for debug purpose) + * read_segnemtn_len : [IN] Segnemtn Length + * RETURNS + * void + *****************************************************************************/ +VMUINT8 vm_https_send_read_content_req( VMUINT16 request_id,/* Request ID */ + VMUINT8 seq_num, /* Sequence number (for debug purpose) */ + VMUINT32 read_segnemtn_len); + + +/***************************************************************************** + * FUNCTION + * vm_https_send_cancel_req + * DESCRIPTION + * this function is to send a request to cancel an incomplete WSP/HTTP request. + * PARAMETERS + * request_id : [IN] Request ID + * RETURNS + * void + *****************************************************************************/ +VMUINT8 vm_https_send_cancel_req( VMUINT16 request_id ); + + +/***************************************************************************** + * FUNCTION + * vm_https_send_req_ext + * DESCRIPTION + * this function is to send a HTTP/WSP request. + * CALLS + * + * PARAMETERS + * request_id : [IN] Request ID + * method : [IN] HTTP Method Constant + * option : [IN] HTTP request options + * reply_type : [IN] reply type (mre_wps_data_type_enum) + * reply_segment_len : [IN] length of repy segment + * more_post : [IN] if are still some data need to be posted next time, please set 1 + * post_type : [IN] refer to mre_wps_data_type_enum + * req : [IN] request data, refer to vm_wps_http_req_var_struct + * cb : [IN] callback of post status + * RETURNS + * VMINT + *****************************************************************************/ + VMINT vm_https_send_req_ext(VMUINT16 request_id, + VMUINT8 method, + VMUINT32 option, + VMUINT8 reply_type, + VMUINT32 reply_segment_len, + VMBYTE more_post, + VMUINT8 post_type, + const vm_wps_http_req_var_struct * req, + wps_post_ind_cb cb); + +/***************************************************************************** +* FUNCTION +* vm_https_send_post_content_res +* DESCRIPTION +* this function is to to handle continuous content post of a HTTP request. +* PARAMETERS +* request_id : [IN] Request ID +* seq_num : [IN] sequence id +* more : [IN] need more send or not +* post_segment_len : [IN] +* post_segment : [IN] +* RETURNS +* VMINT +*****************************************************************************/ +VMINT vm_https_send_post_content_res(VMUINT16 request_id, + VMUINT8 seq_num, + VMBYTE more, + VMUINT32 post_segment_len, + VMUINT8* post_segment); + + + +/* DOM-NOT_FOR_SDK-BEGIN */ +/************************************************************************* + * Backup, please do not use them, only For old version's APP. + ************************************************************************/ +/* Please do not use mre_https_init any more, no need to use it.*/ +//#define mre_https_register_wps_cntxt_and_callback( a,b,c,d,e,f,g,h) vm_https_register_wps_cntxt_and_callback( 1,a,b,c,d,e,f,g,h) +//#define mre_https_send_set_channel_req(a,b,c,d,e,f,g,h,i,j,k,l,m,n) vm_https_send_set_channel_req(a,b,c,d,e,f,g,h,i,j,k,l,m,n) +//#define mre_https_send_unset_channel_req(a) vm_https_send_unset_channel_req(a) +//#define mre_https_send_req(a,b,c,d,e,f,g,h,i,j,k,l) vm_https_send_req(b,c,d,e,f,g,h,i,j,k,l) +//#define mre_https_send_read_content_req(a,b,c,d) vm_https_send_read_content_req(b,c,d) +//#define mre_https_send_cancel_req(a,b) vm_https_send_cancel_req(b) +/* DOM-NOT_FOR_SDK-END */ + +#ifdef __cplusplus +} +#endif + +#endif /* VMHTTPS_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vminput.h b/hardware/arduino/mtk/system/libmtk/include/vminput.h new file mode 100644 index 00000000..aeb05432 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vminput.h @@ -0,0 +1,654 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMINPUT_SDK_H +#define VMINPUT_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +typedef enum +{ +VM_INPUT_MODE_NONE = 0, +VM_INPUT_MODE_123, +VM_INPUT_MODE_123_SYMBOLS, +/* English */ +VM_INPUT_MODE_MULTITAP_UPPERCASE_ABC, +VM_INPUT_MODE_MULTITAP_LOWERCASE_ABC, +VM_INPUT_MODE_MULTITAP_UPPERCASE_ABC_NO_NUMERIC, +VM_INPUT_MODE_MULTITAP_LOWERCASE_ABC_NO_NUMERIC, +/* The above 6 input modes are used by Q03C WCSS editor, and the + * editor requires the input modes values are smaller than 0x1F, + * so we should make sure the input modes used in UI_check_WCSS_normal_character() + * of gui_inputs.c are smaller than 0x1F + */ +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_ABC, +VM_INPUT_MODE_SMART_LOWERCASE_ABC, +VM_INPUT_MODE_SMART_UPPERCASE_ABC, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_ABC, + +VM_INPUT_MODE_ARABIC_NUMERIC, +VM_INPUT_MODE_FLOAT_123, +VM_INPUT_MODE_HK_STROKE, +VM_INPUT_MODE_KEYPAD_NUMERIC, +VM_INPUT_MODE_MAGIC_NUMBER, +VM_INPUT_MODE_PHONE_NUMBER, +VM_INPUT_MODE_PHONE_NUMBER_WILDCHAR, +VM_INPUT_MODE_SIGNED_123, +VM_INPUT_MODE_SIGNED_FLOAT_123, +VM_INPUT_MODE_SIM_NUMERIC, + +/*Afrikaans*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_AFRIKAANS, +VM_INPUT_MODE_MULTITAP_LOWERCASE_AFRIKAANS, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_AFRIKAANS, +VM_INPUT_MODE_SMART_LOWERCASE_AFRIKAANS, +VM_INPUT_MODE_SMART_UPPERCASE_AFRIKAANS, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_AFRIKAANS, +/*Albanian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_ALBANIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_ALBANIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_ALBANIAN, +VM_INPUT_MODE_SMART_LOWERCASE_ALBANIAN, +VM_INPUT_MODE_SMART_UPPERCASE_ALBANIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_ALBANIAN, +/*Armenian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_ARMENIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_ARMENIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_ARMENIAN, +VM_INPUT_MODE_SMART_LOWERCASE_ARMENIAN, +VM_INPUT_MODE_SMART_UPPERCASE_ARMENIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_ARMENIAN, +/*Arabic*/ +VM_INPUT_MODE_MULTITAP_ARABIC, +VM_INPUT_MODE_SMART_ARABIC, +/*Assamese*/ +VM_INPUT_MODE_MULTITAP_ASSAMESE, +VM_INPUT_MODE_SMART_ASSAMESE, +/*Azerbaijani*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_AZERBAIJANI, +VM_INPUT_MODE_MULTITAP_LOWERCASE_AZERBAIJANI, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_AZERBAIJANI, +VM_INPUT_MODE_SMART_LOWERCASE_AZERBAIJANI, +VM_INPUT_MODE_SMART_UPPERCASE_AZERBAIJANI, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_AZERBAIJANI, +/*Basque*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_BASQUE, +VM_INPUT_MODE_MULTITAP_LOWERCASE_BASQUE, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_BASQUE, +VM_INPUT_MODE_SMART_LOWERCASE_BASQUE, +VM_INPUT_MODE_SMART_UPPERCASE_BASQUE, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_BASQUE, +/*Bengali*/ +VM_INPUT_MODE_MULTITAP_BENGALI, +VM_INPUT_MODE_SMART_BENGALI, +/*Bulgarian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_BULGARIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_BULGARIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_BULGARIAN, +VM_INPUT_MODE_SMART_LOWERCASE_BULGARIAN, +VM_INPUT_MODE_SMART_UPPERCASE_BULGARIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_BULGARIAN, +/*Catalan*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_CATALAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_CATALAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_CATALAN, +VM_INPUT_MODE_SMART_LOWERCASE_CATALAN, +VM_INPUT_MODE_SMART_UPPERCASE_CATALAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_CATALAN, +/*Croatian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_CROATIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_CROATIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_CROATIAN, +VM_INPUT_MODE_SMART_LOWERCASE_CROATIAN, +VM_INPUT_MODE_SMART_UPPERCASE_CROATIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_CROATIAN, +/*Czech*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_CZECH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_CZECH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_CZECH, +VM_INPUT_MODE_SMART_LOWERCASE_CZECH, +VM_INPUT_MODE_SMART_UPPERCASE_CZECH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_CZECH, +/*Danish*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_DANISH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_DANISH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_DANISH, +VM_INPUT_MODE_SMART_LOWERCASE_DANISH, +VM_INPUT_MODE_SMART_UPPERCASE_DANISH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_DANISH, +/*Dutch*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_DUTCH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_DUTCH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_DUTCH, +VM_INPUT_MODE_SMART_LOWERCASE_DUTCH, +VM_INPUT_MODE_SMART_UPPERCASE_DUTCH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_DUTCH, +/*Estonian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_ESTONIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_ESTONIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_ESTONIAN, +VM_INPUT_MODE_SMART_LOWERCASE_ESTONIAN, +VM_INPUT_MODE_SMART_UPPERCASE_ESTONIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_ESTONIAN, +/*Filipino*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_FILIPINO, +VM_INPUT_MODE_MULTITAP_LOWERCASE_FILIPINO, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_FILIPINO, +VM_INPUT_MODE_SMART_LOWERCASE_FILIPINO, +VM_INPUT_MODE_SMART_UPPERCASE_FILIPINO, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_FILIPINO, +/*Finnish*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_FINNISH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_FINNISH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_FINNISH, +VM_INPUT_MODE_SMART_LOWERCASE_FINNISH, +VM_INPUT_MODE_SMART_UPPERCASE_FINNISH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_FINNISH, +/*French*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_FRENCH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_FRENCH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_FRENCH, +VM_INPUT_MODE_SMART_LOWERCASE_FRENCH, +VM_INPUT_MODE_SMART_UPPERCASE_FRENCH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_FRENCH, +/*Galician*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_GALICIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_GALICIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_GALICIAN, +VM_INPUT_MODE_SMART_LOWERCASE_GALICIAN, +VM_INPUT_MODE_SMART_UPPERCASE_GALICIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_GALICIAN, +/*Georgian*/ +VM_INPUT_MODE_MULTITAP_GEORGIAN, +VM_INPUT_MODE_SMART_GEORGIAN, +/*German*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_GERMAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_GERMAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_GERMAN, +VM_INPUT_MODE_SMART_LOWERCASE_GERMAN, +VM_INPUT_MODE_SMART_UPPERCASE_GERMAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_GERMAN, +/*Greek*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_GREEK, +VM_INPUT_MODE_MULTITAP_LOWERCASE_GREEK, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_GREEK, +VM_INPUT_MODE_SMART_LOWERCASE_GREEK, +VM_INPUT_MODE_SMART_UPPERCASE_GREEK, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_GREEK, +/*Gujarati*/ +VM_INPUT_MODE_MULTITAP_GUJARATI, +VM_INPUT_MODE_SMART_GUJARATI, +/*Hausa*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_HAUSA, +VM_INPUT_MODE_MULTITAP_LOWERCASE_HAUSA, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_HAUSA, +VM_INPUT_MODE_SMART_LOWERCASE_HAUSA, +VM_INPUT_MODE_SMART_UPPERCASE_HAUSA, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_HAUSA, +/*Hebrew*/ +VM_INPUT_MODE_MULTITAP_HEBREW, +VM_INPUT_MODE_SMART_HEBREW, +/*Hindi*/ +VM_INPUT_MODE_MULTITAP_HINDI, +VM_INPUT_MODE_SMART_HINDI, +/*Hungarian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_HUNGARIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_HUNGARIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_HUNGARIAN, +VM_INPUT_MODE_SMART_LOWERCASE_HUNGARIAN, +VM_INPUT_MODE_SMART_UPPERCASE_HUNGARIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_HUNGARIAN, +/*Icelandic*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_ICELANDIC, +VM_INPUT_MODE_MULTITAP_LOWERCASE_ICELANDIC, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_ICELANDIC, +VM_INPUT_MODE_SMART_LOWERCASE_ICELANDIC, +VM_INPUT_MODE_SMART_UPPERCASE_ICELANDIC, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_ICELANDIC, +/*Igbo*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_IGBO, +VM_INPUT_MODE_MULTITAP_LOWERCASE_IGBO, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_IGBO, +VM_INPUT_MODE_SMART_LOWERCASE_IGBO, +VM_INPUT_MODE_SMART_UPPERCASE_IGBO, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_IGBO, +/*Indonesian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_INDONESIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_INDONESIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_INDONESIAN, +VM_INPUT_MODE_SMART_LOWERCASE_INDONESIAN, +VM_INPUT_MODE_SMART_UPPERCASE_INDONESIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_INDONESIAN, +/*Irish*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_IRISH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_IRISH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_IRISH, +VM_INPUT_MODE_SMART_LOWERCASE_IRISH, +VM_INPUT_MODE_SMART_UPPERCASE_IRISH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_IRISH, +/*Italian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_ITALIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_ITALIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_ITALIAN, +VM_INPUT_MODE_SMART_LOWERCASE_ITALIAN, +VM_INPUT_MODE_SMART_UPPERCASE_ITALIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_ITALIAN, +/*Kannada*/ +VM_INPUT_MODE_MULTITAP_KANNADA, +VM_INPUT_MODE_SMART_KANNADA, +/*Kazakh*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_KAZAKH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_KAZAKH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_KAZAKH, +VM_INPUT_MODE_SMART_LOWERCASE_KAZAKH, +VM_INPUT_MODE_SMART_UPPERCASE_KAZAKH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_KAZAKH, +VM_INPUT_MODE_MULTITAP_KOREAN, +/*Latvian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_LATVIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_LATVIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_LATVIAN, +VM_INPUT_MODE_SMART_LOWERCASE_LATVIAN, +VM_INPUT_MODE_SMART_UPPERCASE_LATVIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_LATVIAN, +/*Lithuanian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_LITHUANIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_LITHUANIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_LITHUANIAN, +VM_INPUT_MODE_SMART_LOWERCASE_LITHUANIAN, +VM_INPUT_MODE_SMART_UPPERCASE_LITHUANIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_LITHUANIAN, +/*Macedonian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_MACEDONIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_MACEDONIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_MACEDONIAN, +VM_INPUT_MODE_SMART_LOWERCASE_MACEDONIAN, +VM_INPUT_MODE_SMART_UPPERCASE_MACEDONIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_MACEDONIAN, +/*Malay*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_MALAY, +VM_INPUT_MODE_MULTITAP_LOWERCASE_MALAY, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_MALAY, +VM_INPUT_MODE_SMART_LOWERCASE_MALAY, +VM_INPUT_MODE_SMART_UPPERCASE_MALAY, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_MALAY, +/*Malayalam*/ +VM_INPUT_MODE_MULTITAP_MALAYALAM, +VM_INPUT_MODE_MULTITAP_LAO, +VM_INPUT_MODE_MULTITAP_KHMER, +VM_INPUT_MODE_SMART_KHMER, +VM_INPUT_MODE_MULTITAP_MYANMAR, +VM_INPUT_MODE_SMART_MALAYALAM, +/*Marathi*/ +VM_INPUT_MODE_MULTITAP_MARATHI, +VM_INPUT_MODE_SMART_MARATHI, +/*Moldovan*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_MOLDOVAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_MOLDOVAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_MOLDOVAN, +VM_INPUT_MODE_SMART_LOWERCASE_MOLDOVAN, +VM_INPUT_MODE_SMART_UPPERCASE_MOLDOVAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_MOLDOVAN, +/*Norwegian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_NORWEGIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_NORWEGIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_NORWEGIAN, +VM_INPUT_MODE_SMART_LOWERCASE_NORWEGIAN, +VM_INPUT_MODE_SMART_UPPERCASE_NORWEGIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_NORWEGIAN, +/*Oriya*/ +VM_INPUT_MODE_MULTITAP_ORIYA, +VM_INPUT_MODE_SMART_ORIYA, +/*Persian*/ +VM_INPUT_MODE_MULTITAP_PERSIAN, +VM_INPUT_MODE_SMART_PERSIAN, +/*Polish*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_POLISH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_POLISH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_POLISH, +VM_INPUT_MODE_SMART_LOWERCASE_POLISH, +VM_INPUT_MODE_SMART_UPPERCASE_POLISH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_POLISH, +/*Portuguese*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_PORTUGUESE, +VM_INPUT_MODE_MULTITAP_LOWERCASE_PORTUGUESE, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_PORTUGUESE, +VM_INPUT_MODE_SMART_LOWERCASE_PORTUGUESE, +VM_INPUT_MODE_SMART_UPPERCASE_PORTUGUESE, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_PORTUGUESE, +/*Punjabi*/ +VM_INPUT_MODE_MULTITAP_PUNJABI, +VM_INPUT_MODE_SMART_PUNJABI, +/*Romanian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_ROMANIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_ROMANIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_ROMANIAN, +VM_INPUT_MODE_SMART_LOWERCASE_ROMANIAN, +VM_INPUT_MODE_SMART_UPPERCASE_ROMANIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_ROMANIAN, +/*Russian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_RUSSIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_RUSSIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_RUSSIAN, +VM_INPUT_MODE_SMART_LOWERCASE_RUSSIAN, +VM_INPUT_MODE_SMART_UPPERCASE_RUSSIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_RUSSIAN, +/*Serbian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_SERBIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_SERBIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_SERBIAN, +VM_INPUT_MODE_SMART_LOWERCASE_SERBIAN, +VM_INPUT_MODE_SMART_UPPERCASE_SERBIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_SERBIAN, +/*Sesotho*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_SESOTHO, +VM_INPUT_MODE_MULTITAP_LOWERCASE_SESOTHO, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_SESOTHO, +VM_INPUT_MODE_SMART_LOWERCASE_SESOTHO, +VM_INPUT_MODE_SMART_UPPERCASE_SESOTHO, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_SESOTHO, +/*Slovak*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_SLOVAK, +VM_INPUT_MODE_MULTITAP_LOWERCASE_SLOVAK, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_SLOVAK, +VM_INPUT_MODE_SMART_LOWERCASE_SLOVAK, +VM_INPUT_MODE_SMART_UPPERCASE_SLOVAK, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_SLOVAK, +/*Slovenian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_SLOVENIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_SLOVENIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_SLOVENIAN, +VM_INPUT_MODE_SMART_LOWERCASE_SLOVENIAN, +VM_INPUT_MODE_SMART_UPPERCASE_SLOVENIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_SLOVENIAN, +/*Spanish*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_SPANISH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_SPANISH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_SPANISH, +VM_INPUT_MODE_SMART_LOWERCASE_SPANISH, +VM_INPUT_MODE_SMART_UPPERCASE_SPANISH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_SPANISH, +/*Swahili*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_SWAHILI, +VM_INPUT_MODE_MULTITAP_LOWERCASE_SWAHILI, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_SWAHILI, +VM_INPUT_MODE_SMART_LOWERCASE_SWAHILI, +VM_INPUT_MODE_SMART_UPPERCASE_SWAHILI, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_SWAHILI, +/*Swedish*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_SWEDISH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_SWEDISH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_SWEDISH, +VM_INPUT_MODE_SMART_LOWERCASE_SWEDISH, +VM_INPUT_MODE_SMART_UPPERCASE_SWEDISH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_SWEDISH, +/*Tagalog*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_TAGALOG, +VM_INPUT_MODE_MULTITAP_LOWERCASE_TAGALOG, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_TAGALOG, +VM_INPUT_MODE_SMART_LOWERCASE_TAGALOG, +VM_INPUT_MODE_SMART_UPPERCASE_TAGALOG, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_TAGALOG, +/*Tamil*/ +VM_INPUT_MODE_MULTITAP_TAMIL, +VM_INPUT_MODE_SMART_TAMIL, +/*Telugu*/ +VM_INPUT_MODE_MULTITAP_TELUGU, +VM_INPUT_MODE_SMART_TELUGU, +/*Thai*/ +VM_INPUT_MODE_MULTITAP_THAI, +VM_INPUT_MODE_SMART_THAI, +/*Turkish*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_TURKISH, +VM_INPUT_MODE_MULTITAP_LOWERCASE_TURKISH, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_TURKISH, +VM_INPUT_MODE_SMART_LOWERCASE_TURKISH, +VM_INPUT_MODE_SMART_UPPERCASE_TURKISH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_TURKISH, +/*Ukrainian*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_UKRAINIAN, +VM_INPUT_MODE_MULTITAP_LOWERCASE_UKRAINIAN, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_UKRAINIAN, +VM_INPUT_MODE_SMART_LOWERCASE_UKRAINIAN, +VM_INPUT_MODE_SMART_UPPERCASE_UKRAINIAN, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_UKRAINIAN, +/*Urdu*/ +VM_INPUT_MODE_MULTITAP_URDU, +VM_INPUT_MODE_SMART_URDU, +/*Vietnamese*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_VIETNAMESE, +VM_INPUT_MODE_MULTITAP_LOWERCASE_VIETNAMESE, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_VIETNAMESE, +VM_INPUT_MODE_SMART_LOWERCASE_VIETNAMESE, +VM_INPUT_MODE_SMART_UPPERCASE_VIETNAMESE, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_VIETNAMESE, +/*Xhosa*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_XHOSA, +VM_INPUT_MODE_MULTITAP_LOWERCASE_XHOSA, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_XHOSA, +VM_INPUT_MODE_SMART_LOWERCASE_XHOSA, +VM_INPUT_MODE_SMART_UPPERCASE_XHOSA, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_XHOSA, +/*Yoruba*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_YORUBA, +VM_INPUT_MODE_MULTITAP_LOWERCASE_YORUBA, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_YORUBA, +VM_INPUT_MODE_SMART_LOWERCASE_YORUBA, +VM_INPUT_MODE_SMART_UPPERCASE_YORUBA, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_YORUBA, +/*Zulu*/ +VM_INPUT_MODE_MULTITAP_UPPERCASE_ZULU, +VM_INPUT_MODE_MULTITAP_LOWERCASE_ZULU, +VM_INPUT_MODE_MULTITAP_FIRST_UPPERCASE_ZULU, +VM_INPUT_MODE_SMART_LOWERCASE_ZULU, +VM_INPUT_MODE_SMART_UPPERCASE_ZULU, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_ZULU, + +/* Dialects */ +VM_INPUT_MODE_SMART_UPPERCASE_UK_ABC, +VM_INPUT_MODE_SMART_LOWERCASE_UK_ABC, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_UK_ABC, +VM_INPUT_MODE_SMART_UPPERCASE_CA_FRENCH, +VM_INPUT_MODE_SMART_LOWERCASE_CA_FRENCH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_CA_FRENCH, +VM_INPUT_MODE_SMART_UPPERCASE_HINGLISH, +VM_INPUT_MODE_SMART_LOWERCASE_HINGLISH, +VM_INPUT_MODE_SMART_UPPERCASE_SA_SPANISH, +VM_INPUT_MODE_SMART_LOWERCASE_SA_SPANISH, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_SA_SPANISH, +VM_INPUT_MODE_SMART_UPPERCASE_SA_PORTUGUESE, +VM_INPUT_MODE_SMART_LOWERCASE_SA_PORTUGUESE, +VM_INPUT_MODE_SMART_FIRST_UPPERCASE_SA_PORTUGUESE, + +/* Chinese*/ +VM_INPUT_MODE_TR_BOPOMO, +VM_INPUT_MODE_TR_MULTITAP_BOPOMO, +VM_INPUT_MODE_TR_STROKE, +VM_INPUT_MODE_QUICK_SEARCH_BOPOMO, +VM_INPUT_MODE_QUICK_SEARCH_HK_STROKE, +VM_INPUT_MODE_QUICK_SEARCH_PINYIN, +VM_INPUT_MODE_QUICK_SEARCH_SM_STROKE, +VM_INPUT_MODE_QUICK_SEARCH_TR_STROKE, +VM_INPUT_MODE_SM_MULTITAP_PINYIN, +VM_INPUT_MODE_SM_PINYIN, +VM_INPUT_MODE_SM_STROKE, + +VM_INPUT_MODE_MAX_NUM +} vm_input_mode_enum; + +/* If selects OK or Cancel in editor screen, the state will pass to application via callback's parameter. */ + +#define VM_INPUT_OK (1) /* If selects OK */ +#define VM_INPUT_CANCEL (0) /* If selects Cancel */ +#define VM_INPUT_NOTIFY (2) /* If another screen makes editor exit, this message will be sent */ +#define VM_INPUT_CLOSE (3) /* If application close the input screen self, application will receive this message */ + /***************************************************************************** + * FUNCTION + * vm_input_text + * DESCRIPTION + * Display a editor screen. The default input method is VM_INPUT_METHOD_TEXT. + * The max length of input string is 250. + * PARAMETERS + * f : [IN] This callback will be invoked when the editor screen closed. If user selects OK, the state will be VM_INPUT_OK. + * If user select Cancel, the state will be VM_INPUT_CANCEL. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If open the input screen successfully. + * <0 : If failed. + *****************************************************************************/ +VMINT vm_input_text(void (*f)(VMINT state, VMWSTR text)); + +#define VM_INPUT_METHOD_TEXT 1 /* Input text and the default input method is PINYIN */ +#define VM_INPUT_METHOD_PASSWORD 2 /* Input password and the default input method is multitap abc. + only 0~9, *, # are allowed and the content would be displayed as * in editor. */ +#define VM_INPUT_METHOD_NUMERIC 4 /* Input number and the default input method is phone number */ +#define VM_INPUT_METHOD_ALPHABETIC 8 /* Input English and the default input method is multitap abc */ +#define VM_INPUT_METHOD_URL 16 /* Input URL */ + + /***************************************************************************** + * FUNCTION + * vm_input_text2 + * DESCRIPTION + * Display a editor screen. User can set default string and default input method. + * The max length of input string is 250. + * PARAMETERS + * def_str : [IN] Default string in editor screen. + * def_input_method: [IN] Default input method. + * f : [IN] This callback will be invoked when the editor screen closed. If user selects OK, the state will be VM_INPUT_OK. + * If user select Cancel, the state will be VM_INPUT_CANCEL. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If open the input screen successfully. + * <0 : If failed. + *****************************************************************************/ +VMINT vm_input_text2(VMWSTR def_str, VMINT def_input_method, void (*f) (VMINT state, VMWSTR text)); + +/***************************************************************************** + * FUNCTION + * vm_input_text3 + * DESCRIPTION + * Display a editor screen. User can set default string and default input method. + * User can also set the max input length (in short) via parameter input_max_size. + * PARAMETERS + * default_string : [IN] Default string in editor screen. + * input_max_size : [IN] + * default_input_method: [IN] Default input method. + * input_text_cb : [IN] This callback will be invoked when the editor screen closed. If user selects OK, the state will be VM_INPUT_OK. + * If user select Cancel, the state will be VM_INPUT_CANCEL. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If open the input screen successfully. + * <0 : If failed. + *****************************************************************************/ +VMINT vm_input_text3(VMWSTR default_string, VMINT input_max_size, + VMINT default_input_method, void (*input_text_cb)(VMINT state, VMWSTR text)); + + /***************************************************************************** + * FUNCTION + * vm_set_app_desired_input_mode + * DESCRIPTION + * To set editor desired input mode. Used when App call vm_input_text/vm_input_text2/vm_input_text3 to enter editor screen. + * PARAMETERS + * desired_input_mode : [IN] input mode. + * RETURN VALUES + * void + *****************************************************************************/ +void vm_set_app_desired_input_mode(vm_input_mode_enum desired_input_mode); + +/***************************************************************************** + * FUNCTION + * vm_input_close_screen + * DESCRIPTION + * Close input screen by application self. And it will send VM_INPUT_CLOSE to application. + * PARAMETERS + * void + * RETURN VALUES + * void + *****************************************************************************/ +void vm_input_close_screen(void); + +/***************************************************************************** + * FUNCTION + * vm_input_move_cursor_to_start + * DESCRIPTION + * Move the cursor to the start position and edit from the beginning. + * You need to call this API after vm_input_text/vm_input_text2/vm_input_text3. + * PARAMETERS + * void + * RETURN VALUES + * void + *****************************************************************************/ +void vm_input_move_cursor_to_start(void); + +/***************************************************************************** + * FUNCTION + * vm_input_set_vk_default_enlarge + * DESCRIPTION + * Set VK default enlarge. + * PARAMETERS + * void + * RETURN VALUES + * void + *****************************************************************************/ +void vm_input_set_vk_default_enlarge(void); + +/****************************************************************************** + * FUNCTION + * vm_input_set_editor_title + * DESCRIPTION + * set the input editor title. This function should be called just before + * vm_input_text, vm_input_text2 or vm_input_text3, and the title's length must + * be less than 60. + * PARAMETERS + * title : [IN] editor title provided by user + * RETURN VALUES + * TRUE : if set the editor title successfully. + * FALSE : if fail to set the editor title. + *****************************************************************************/ +VMINT vm_input_set_editor_title(VMWSTR title); + +#ifdef __cplusplus +} +#endif + +#endif /* VMINPUT_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmio.h b/hardware/arduino/mtk/system/libmtk/include/vmio.h new file mode 100644 index 00000000..6a419bcf --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmio.h @@ -0,0 +1,1325 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMIO_SDK_H_ +#define VMIO_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +#include "vmsim.h" +#include "vmtel.h" +#include "vmtouch.h" +#include "vmkeypad.h" +#include "vminput.h" + +#ifndef MAX_APP_NAME_LEN +#define MAX_APP_NAME_LEN (260) +#endif + +typedef enum +{ + VM_FILE_COMMIT_ERROR = -1, + VM_FILE_OPEN_ERROR = -2, + VM_FILE_NAME_ERROR = -1, + VM_FILE_OK = 0 +} vm_file_error_t; + +typedef enum +{ + VM_STORE_PATH_TYPE_PHOTO, + VM_STORE_PATH_TYPE_VIDEO, + VM_STORE_PATH_TYPE_MUSIC, + VM_STORE_PATH_TYPE_RINGTONE, + VM_STORE_PATH_TYPE_DOCUMENT, + VM_STORE_PATH_TYPE_OTHERS + +} VM_STORE_PATH_TYPE; + +/* + * file attribution + */ +#define VM_FS_ATTR_READ_ONLY 0x01 +#define VM_FS_ATTR_HIDDEN 0x02 +#define VM_FS_ATTR_SYSTEM 0x04 +#define VM_FS_ATTR_VOLUME 0x08 +#define VM_FS_ATTR_DIR 0x10 +#define VM_FS_ATTR_ARCHIVE 0x20 +#define VM_FS_LONGNAME_ATTR 0x0F + +/* file info */ +struct vm_fileinfo_t +{ + VMWCHAR filename[MAX_APP_NAME_LEN]; /* full path of file */ + VMINT size; /* file size */ +}; + +/* file info */ +typedef struct vm_fileinfo_ext +{ + /* file name without path */ + VMWCHAR filefullname[MAX_APP_NAME_LEN]; + /* file name character array by 8.3 format encoding with UCS2, and the last character may be not '\0' */ + VMCHAR filename[8]; + /* file extention name character array by 8.3 format encoding with UCS2, and the last character may be not '\0' */ + VMCHAR extension[3];/* file attributes */ + VMBYTE attributes; + vm_time_t create_datetime; /* create time */ + vm_time_t modify_datetime; /* modify time */ + VMUINT filesize; /* file size */ + VMUINT drive; /* drive */ + VMUINT stamp; /* stamp */ +} vm_fileinfo_ext; + +/* Disk information */ +typedef struct +{ + /* A zero-terminated Short File Name with the volume's label. */ + VMCHAR Label[24]; + + /* The drive letter in UPPER case. */ + VMCHAR DriveLetter; + + /* Indicate the disk is in write protection or not. 1 for protect, 0 for not protect. */ + VMUINT8 WriteProtect; + + /* Reserved fields */ + VMCHAR Reserved[2]; + + /* The volume's serial number. */ + VMUINT32 SerialNumber; + + /* The LBA address of the logical drive's boot record. For diskettes, this value will be 0. */ + VMUINT32 FirstPhysicalSector; + + /* 2, 16, or 32 for FAT-12, FAT-16, or FAT-32 */ + VMUINT32 FATType; + + /* The number of FATs on the volume. */ + VMUINT32 FATCount; + + /* The number of FATs on the volume. */ + VMUINT32 MaxDirEntries; + + /* The sector size. This value will usually be 512. */ + VMUINT32 BytesPerSector; + + /* Specifies the size of the smallest unit of storage that can be allocated to a file in sectors. */ + VMUINT32 SectorsPerCluster; + + /* Number of clusters for file storage on the volume. */ + VMUINT32 TotalClusters; + + /* The number of clusters, which are marked bad and are unavailable for file storage. */ + VMUINT32 BadClusters; + + /* The number of clusters currently available. */ + VMUINT32 FreeClusters; + + /* The number of files on the volume including directories, but not counting the root directory and files with an allocated file size of 0. */ + VMUINT32 Files; + + /* The number of contiguous cluster chains. On a completely unfragmented volume, this value would be identical to Files. */ + VMUINT32 FileChains; + + /* The number of contiguous cluster chains of free clusters. On a completely unfragmented volume, this value would be 1. */ + VMUINT32 FreeChains; + + /* The maximum allocated file size for a newly allocated contiguous file in clusters. On a completely unfragmented volume, this value would be identical to FreeClusters. */ + VMUINT32 LargestFreeChain; +} vm_fs_disk_info; + +/* vm_get_disk_info Parameter */ +typedef enum +{ + /* + * Returns all fields in structure vm_get_disk_info except FreeClusters, BadClusters, Files, FileChains, FreeChains, LargestFreeChain. + * This flag never requires a FAT scan. + */ + VM_FS_DI_BASIC_INFO = 0x00000001L, + + /* + * Returns field FreeClusters. This flags may require FS to scan the complete FAT if the amount of free space is not known. + * In this case, FS_DI_FAT_STATISTICS is returned in addition to FS_DI_FREE_SPACE. + */ + VM_FS_DI_FREE_SPACE = 0x00000002L, + + /* + * Returns fields BadClusters, Files, FileChains, FreeChains, LargestFreeChain. + * This flag will always cause FS to scan the complete FAT. + */ + VM_FS_DI_FAT_STATISTICS = 0x00000004L, + + /* + * Get volume label of the target drive. The maximum length is 11 wide characters. + * This option must be used with FS_DI_BASIC_INFO. + */ + VM_FS_DI_VOLUME_LABEL = 0x00000008L, + + VM_FS_DI_INVALID +}vm_fs_di_enum; + + +/** + * open file with file Read-Only mode. + */ +#define MODE_READ 1 + +/** + * open file with Read-Write mode. + */ +#define MODE_WRITE 2 + +/** + * open file with Read-Write mode, create if the file not exist. + */ +#define MODE_CREATE_ALWAYS_WRITE 4 + +/** + * open file with Append mode. + */ +#define MODE_APPEND 8 + +/***************************************************************************** +* FUNCTION + * vm_file_open + * DESCRIPTION + * open file + * PARAMETERS + * filename : [IN] file full path encoding with UCS2 + * mode : [IN] file open mode: + * MODE_READ: Read-Only + * MODE_WRITE : Read-Write + * MODE_CREATE_ALWAYS_WRITE : Read-Write mode, create if the file not exist. + * binary : [IN] TRUE means open with binary format, FALSE means open with ASCII format. + * RETURNS + * non-negative file handle if successfully, and error code if failed to open. + * +*****************************************************************************/ +VMFILE vm_file_open(const VMWSTR filename, VMUINT mode, VMUINT binary); + +/***************************************************************************** +* FUNCTION + * vm_file_close + * DESCRIPTION + * close file + * PARAMETERS + * handle : [IN] file handle to be closed. + * +*****************************************************************************/ +void vm_file_close(VMFILE handle); + +/***************************************************************************** +* FUNCTION + * vm_file_read + * DESCRIPTION + * read file from current pointer of file + * PARAMETERS + * handle : [IN] file handle to be read. + * data : [OUT] output data address + * length : [IN] bytes to be read + * nread : [IN] bytes read actually + * RETURNS + * bytes of read data if > 0, 0 means error happened or reach end of file. + * +*****************************************************************************/ +VMINT vm_file_read(VMFILE handle, void * data, VMUINT length, VMUINT *nread); + +/***************************************************************************** +* FUNCTION + * vm_file_write + * DESCRIPTION + * write data to current pointer of the file + * PARAMETERS + * handle : [IN] file handle to write. + * data : [IN] the address of data to be written + * length : [IN] bytes to be written + * written : [IN] bytes written actually + * RETURNS + * bytes of written data if > 0, 0 means error happened. + * +*****************************************************************************/ +VMINT vm_file_write(VMFILE handle, void * data, VMUINT length, VMUINT * written); + +/***************************************************************************** +* FUNCTION + * vm_file_commit + * DESCRIPTION + * commit the I/O cache data to file. + * PARAMETERS + * handle : [IN] file handle to commit. + * RETURNS + * 0 means successfully, non-zero is error code. + * +*****************************************************************************/ +VMINT vm_file_commit(VMFILE handle); + +#define BASE_BEGIN 1 +#define BASE_CURR 2 +#define BASE_END 3 + +/***************************************************************************** +* FUNCTION + * vm_file_seek + * DESCRIPTION + * move the file pointer to specified position. If exceed file size, this operation will return error. + * PARAMETERS + * handle : [IN] file handle to seek. + * offset : [IN] bytes to move. + * base: [IN] base position to move. + * BASE_BEGIN means from begin of file; + * BASE_CURR means from current position; + * BASE_END means from end of file. + * RETURNS + * 0 means successfully, non-zero is error code. + * +*****************************************************************************/ +VMINT vm_file_seek(VMFILE handle, VMINT offset, VMINT base); + +/***************************************************************************** +* FUNCTION + * vm_file_tell + * DESCRIPTION + * get the position of current pointer of file. + * PARAMETERS + * handle : [IN] file handle. + * RETURNS + * current pointer position, or negative number error code if failed. + * +*****************************************************************************/ +VMINT vm_file_tell(VMFILE handle); + +/***************************************************************************** +* FUNCTION + * vm_file_is_eof + * DESCRIPTION + * check if the current pointer is end of file or not. + * PARAMETERS + * handle : [IN] file handle. + * RETURNS + * current pointer is end of file or not. + * RETURN VALUES + * TRUE : current pointer is end of file. + * FALSE : current pointer is not end of file. + * +*****************************************************************************/ +VMINT vm_file_is_eof(VMFILE handle); + +/***************************************************************************** +* FUNCTION + * vm_file_getfilesize + * DESCRIPTION + * get file size by byte. + * PARAMETERS + * handle : [IN] file handle. + * file_size : [OUT] output the file size by byte + * RETURNS + * get file size successfully or failed + * RETURN VALUES + * 0 : get file size successfully. + * non-zero : failed to get file size + * +*****************************************************************************/ +VMINT vm_file_getfilesize(VMFILE handle, VMUINT *file_size); + +/***************************************************************************** +* FUNCTION + * vm_file_delete + * DESCRIPTION + * delete specified file. + * PARAMETERS + * filename : [IN] file name full path encoding with UCS2 format. + * RETURNS + * delete file successfully or failed + * RETURN VALUES + * 0 : delete file successfully. + * non-zero : failed to delete file. + * +*****************************************************************************/ +VMINT vm_file_delete(const VMWSTR filename); + +/***************************************************************************** +* FUNCTION + * vm_file_rename + * DESCRIPTION + * delete specified file. + * PARAMETERS + * filename : [IN] old file name full path encoding with UCS2 format. + * newname : [IN] new file name full path encoding with UCS2 format. + * RETURNS + * rename file successfully or failed + * RETURN VALUES + * 0 : rename file successfully. + * non-zero : failed to rename file. + * +*****************************************************************************/ +VMINT vm_file_rename(const VMWSTR filename, const VMWSTR newname); + +/***************************************************************************** +* FUNCTION + * vm_file_mkdir + * DESCRIPTION + * create new directory with specified path name. + * PARAMETERS + * dirname : [IN] path name encoding with UCS2 format. + * RETURNS + * create directory successfully or failed + * RETURN VALUES + * 0 : create directory successfully. + * non-zero : failed to create directory. + * +*****************************************************************************/ +VMINT vm_file_mkdir(const VMWSTR dirname); + +/***************************************************************************** +* FUNCTION + * vm_file_rmdir + * DESCRIPTION + * remove directory with specified path name. + * PARAMETERS + * dirname : [IN] path name encoding with UCS2 format. + * RETURNS + * remove directory successfully or failed + * RETURN VALUES + * 0 : remove directory successfully. + * non-zero : failed to remove directory. + * +*****************************************************************************/ +VMINT vm_file_rmdir(const VMWSTR dirname); + +/***************************************************************************** +* FUNCTION + * vm_file_set_attributes + * DESCRIPTION + * set attributes of specified full path file name encoding with UCS2 format. The attributes + * can not include VM_FS_ATTR_VOLUME, VM_FS_ATTR_DIR, or VM_FS_LONGNAME_ATTR. + * The value of attributes is the result of OR operator. + * PARAMETERS + * filename : [IN] file name encoding with UCS2 format. + * attributes : [IN] file attributes. + * RETURNS + * set attributes successfully or failed + * RETURN VALUES + * 0 : set attributes successfully. + * non-zero : failed to set attributes. + * +*****************************************************************************/ +VMINT vm_file_set_attributes(const VMWSTR filename, VMBYTE attributes); + +/***************************************************************************** +* FUNCTION + * vm_file_get_attributes + * DESCRIPTION + * set attributes of specified full path file name encoding with UCS2 format. + * The value of attributes is the result of OR operator. + * PARAMETERS + * filename : [IN] file name encoding with UCS2 format. + * RETURNS + * get attributes successfully or failed + * RETURN VALUES + * -1 : failed to get attributes. + * else : get the attributes value. + * +*****************************************************************************/ +VMINT vm_file_get_attributes(const VMWSTR filename); + +/***************************************************************************** +* FUNCTION + * vm_find_first + * DESCRIPTION + * find files from specified path, support wild character finding. + * PARAMETERS + * pathname : [IN] path name encoding with UCS2 format. + * info : [OUT] result of finding + * RETURNS + * find handle or error code + * RETURN VALUES + * non-negative number : find handle. + * negative number : error code. + * +*****************************************************************************/ +VMINT vm_find_first(VMWSTR pathname, struct vm_fileinfo_t* info); + +/***************************************************************************** +* FUNCTION + * vm_find_next + * DESCRIPTION + * continue to find next file. + * PARAMETERS + * handle : [IN] find handle. + * info : [OUT] result of finding + * RETURNS + * find handle or error code + * RETURN VALUES + * 0 : find next file successfully. + * negative number : end of finding. + * +*****************************************************************************/ +VMINT vm_find_next(VMINT handle, struct vm_fileinfo_t* info); + +/***************************************************************************** +* FUNCTION + * vm_find_close + * DESCRIPTION + * close finding process. + * PARAMETERS + * handle : [IN] find handle. + * +*****************************************************************************/ +void vm_find_close(VMINT handle); + +#define vm_get_removable_driver vm_get_removeable_driver +/***************************************************************************** +* FUNCTION + * vm_get_removable_driver + * DESCRIPTION + * get drive letter of removable disk, which normally is memory card. + * RETURNS + * drive letter of removable disk. negative number means no removable drive. + * +*****************************************************************************/ +VMINT vm_get_removable_driver(void); + +/***************************************************************************** +* FUNCTION + * vm_get_system_driver + * DESCRIPTION + * get drive letter of phone disk, which normally is public drive. + * RETURNS + * drive letter of phone disk. negative number means no public drive. + * +*****************************************************************************/ +VMINT vm_get_system_driver(void); + +/***************************************************************************** +* FUNCTION + * vm_get_disk_free_space + * DESCRIPTION + * get free space by byte of specified drive. + * PARAMETERS + * drv_name : [IN] drive letter string terminated with '\0' . + * RETURNS + * free space by byte. 0 means specified disk does not exist. + * 0xFFFFFFFF means exceed the max limitation, the free space size lager than this value. + * another choice to use vm_get_disk_info + * +* EXAMPLE [this TAG is optional] + * + * VMINT sys_driver = -1; + * VMUINT sys_driver_size = 0; + * if ((sys_driver = vm_get_system_driver()) >= 0) + * { + * VMCHAR driver_str[2] = {0}; + * + * sprintf(driver_str, "%c", (VMCHAR)sys_driver); + * sys_driver_size = vm_get_disk_free_space(vm_ucs2_string(driver_str)); + * } + * +*****************************************************************************/ +VMUINT vm_get_disk_free_space(VMWSTR drv_name); + +/***************************************************************************** + * FUNCTION + * vm_get_disk_info + * DESCRIPTION + * Return information about a logical drive + * PARAMETERS + * DriveName : [IN]

Must be a valid file name, e.g., a root directory name. + * Only the drive information (possibly the current default drive) is determined. + * DiskInfo : [OUT]

Refer to vm_fs_disk_info. + * Flags : [IN]

Refer to vm_fs_di_enum. + * RETURNS + * success if >= 0, else failure. + *****************************************************************************/ +VMINT vm_get_disk_info(const VMCHAR * drv_name, vm_fs_disk_info * fs_disk, vm_fs_di_enum e_di); + +/***************************************************************************** +* FUNCTION + * vm_file_get_modify_time + * DESCRIPTION + * get the latest modified time of specified file. + * PARAMETERS + * filename : [IN] file name of full path encoding with UCS2 format. + * modify_time : [OUT] output the latest modified time + * RETURNS + * 0 means get modified time successfully, -1 means failed. + * +*****************************************************************************/ +VMINT vm_file_get_modify_time(const VMWSTR filename, vm_time_t * modify_time); + +/***************************************************************************** +* FUNCTION + * vm_find_first_ext + * DESCRIPTION + * find files from specified path, support wild character finding. + * PARAMETERS + * pathname : [IN] path name encoding with UCS2 format. + * direntry : [OUT] result of finding + * RETURNS + * find handle or error code + * RETURN VALUES + * non-negative number : find handle. + * negative number : error code. + * +*****************************************************************************/ +VMINT vm_find_first_ext(VMWSTR pathname, vm_fileinfo_ext * direntry); + +/***************************************************************************** +* FUNCTION + * vm_find_next_ext + * DESCRIPTION + * continue to find next file. + * PARAMETERS + * handle : [IN] find handle. + * direntry : [OUT] result of finding + * RETURNS + * find handle or error code + * RETURN VALUES + * 0 : find next file successfully. + * negative number : end of finding. + * +*****************************************************************************/ +VMINT vm_find_next_ext(VMINT handle, vm_fileinfo_ext * direntry); + +/***************************************************************************** +* FUNCTION + * vm_find_close_ext + * DESCRIPTION + * close finding process. + * PARAMETERS + * handle : [IN] find handle. + * +*****************************************************************************/ +void vm_find_close_ext(VMINT handle); + +typedef struct +{ + VMUINT8 home_city; + VMUINT8 foreign_city; + VMUINT8 date_seperator; + VMUINT8 date_format; + VMUINT8 time_format; + VMINT current_dst; + + VMUINT8 current_city; + float current_timezone; + + VMUINT8 foreign_index; + VMUINT8 wc_dst; + VMUINT8 setting_dt_dst; + VMUINT16 timezone; + VMUINT16 frn_timezone; + + VMUINT8 wc_entry_screen; /* wc_entry_screen, 0:worldclock, 1:homecity, 2:foreigncity */ + VMUINT8 tz_city_match; /* tz_city_match, 0:Not Match, 1:Match */ +} vm_phoneset_info_struct; + + +/* DOM-NOT_FOR_SDK-BEGIN */ + + +/* error code of storage */ +typedef enum +{ + VM_STORAGE_ERR_RES = -10, /* resource is not enough */ + VM_STORAGE_ERR_PARAM = -9, /* input param error */ + VM_STORAGE_ERR_FILE_CREATE = -8, /* sto create failure */ + VM_STORAGE_ERR_FILE_OPEN = -7, /* sto open failure */ + VM_STORAGE_ERR_FILE_SEEK = -6, /* sto seek failure */ + VM_STORAGE_ERR_FILE_WRITE = -5, /* sto wirte failure */ + VM_STORAGE_ERR_FILE_READ = -4, /* sto read failure */ + VM_STORAGE_ERR_AUTHORIZATION = -3, /* no authorization */ + VM_STORAGE_ERR_NONE = 0 /* no error */ +}vm_storage_error_type; + +/***************************************************************************** + * FUNCTION + * vm_storage_open + * DESCRIPTION + * open storage. + * PARAMETERS + * void + * RETURNS + * storage handle or error code + * RETURN VALUES + * vm_storage_error_type +*****************************************************************************/ +VMINT vm_storage_open(void); + +/***************************************************************************** + * FUNCTION + * vm_storage_close + * DESCRIPTION + * close storage. + * PARAMETERS + * h : [IN] handle of storage +*****************************************************************************/ +void vm_storage_close(VMINT h); + +/***************************************************************************** + * FUNCTION + * vm_storage_read + * DESCRIPTION + * read data from storage. + * PARAMETERS + * h : [IN] handle of storage + * data : [OUT] buffer will be filled + * offset : [IN] offset from head of storage + * size : [IN] buffer size + * read : [OUT] read size + * RETURNS + * 0 or error code + * RETURN VALUES + * vm_storage_error_type +*****************************************************************************/ +VMINT vm_storage_read(VMINT h, void * data, VMUINT offset, VMUINT size, VMUINT * read); + +/***************************************************************************** + * FUNCTION + * vm_storage_write + * DESCRIPTION + * write data to storage + * PARAMETERS + * h : [IN] handle of storage + * data : [IN] buffer will be written to storage + * offset : [IN] offset from head of storage + * size : [IN] buffer size + * written : [OUT] written size + * RETURNS + * 0 or error code + * RETURN VALUES + * vm_storage_error_type +*****************************************************************************/ +VMINT vm_storage_write(VMINT h, const void * data, VMUINT offset, VMUINT size, VMUINT * written); +/* DOM-NOT_FOR_SDK-END */ + +/* error code of storage */ +typedef enum +{ + VM_SYS_FILE_ERR_DISK_FULL = -12, + VM_SYS_FILE_ERR_RES , /* resource is not enough */ + VM_SYS_FILE_ERR_PARAM, /* input param error */ + VM_SYS_FILE_ERR_FILE_CREATE, /* create failure */ + VM_SYS_FILE_ERR_FILE_OPEN, /* open failure */ + VM_SYS_FILE_ERR_FILE_DELETE, + VM_SYS_FILE_ERR_FILE_SEEK, /* seek failure */ + VM_SYS_FILE_ERR_FILE_WRITE, /* wirte failure */ + VM_SYS_FILE_ERR_FILE_WRITE_PARTLY, + VM_SYS_FILE_ERR_FILE_READ, /* read failure */ + VM_SYS_FILE_ERR_AUTHORIZATION, /* no authorization */ + VM_SYS_FILE_ERR_NONE = 0 /* no error */ +}vm_sys_file_error_type; + + +/***************************************************************************** +* FUNCTION + * vm_sys_file_open + * DESCRIPTION + * open file in system drive disk + * PARAMETERS + * mode : [IN] file open mode: + * MODE_READ: Read-Only + * MODE_WRITE : Read-Write + * MODE_CREATE_ALWAYS_WRITE : Read-Write mode, create if the file not exist. + * binary : [IN] TRUE means open with binary format, FALSE means open with ASCII format. + * RETURNS + * non-negative file handle if successfully, and error code if failed to open. + * +*****************************************************************************/ +VMFILE vm_sys_file_open(VMUINT mode, VMUINT binary); + +/***************************************************************************** +* FUNCTION + * vm_sys_file_seek + * DESCRIPTION + * move the sys file pointer to specified position. If exceed file size, this operation will return error. + * PARAMETERS + * handle : [IN] sys file handle to seek. + * offset : [IN] bytes to move. + * base: [IN] base position to move. + * BASE_BEGIN means from begin of file; + * BASE_CURR means from current position; + * BASE_END means from end of file. + * RETURNS + * 0 means successfully, non-zero is error code. + * +*****************************************************************************/ +VMINT vm_sys_file_seek(VMFILE handle, VMINT offset, VMINT base); + + +/***************************************************************************** +* FUNCTION + * vm_sys_file_read + * DESCRIPTION + * read file from current pointer of sys file + * PARAMETERS + * handle : [IN] file handle to be read. + * data : [OUT] output data address + * length : [IN] bytes to be read + * nread : [IN] bytes read actually + * RETURNS + * bytes of read data if > 0, 0 means error happened or reach end of file. + * +*****************************************************************************/ +VMINT vm_sys_file_read(VMFILE handle, void * data, VMUINT length, VMUINT *nread); + +/***************************************************************************** +* FUNCTION + * vm_sys_file_write + * DESCRIPTION + * write data to current pointer of the sys file + * PARAMETERS + * handle : [IN] file handle to write. + * data : [IN] the address of data to be written + * length : [IN] bytes to be written + * written : [IN] bytes written actually + * RETURNS + * bytes of written data if > 0, 0 means error happened. + * +*****************************************************************************/ +VMINT vm_sys_file_write(VMFILE handle, void * data, VMUINT length, VMUINT * written); + + +/***************************************************************************** +* FUNCTION + * vm_sys_file_close + * DESCRIPTION + * close sys file + * PARAMETERS + * handle : [IN] sys file handle to be closed. + * +*****************************************************************************/ +void vm_sys_file_close(VMFILE h); + +/***************************************************************************** +* FUNCTION + * vm_sys_file_delete + * DESCRIPTION + * delete sys file. + * RETURNS + * delete sys file successfully or failed + * RETURN VALUES + * 0 : delete file successfully. + * non-zero : failed to delete sys file. + * +*****************************************************************************/ +VMINT vm_sys_file_delete(void); + +/***************************************************************************** +* FUNCTION + * vm_sys_file_get_space + * DESCRIPTION + * get the current free size of sys file + * PARAMETERS + * RETURNS + * rest space size. + * +*****************************************************************************/ +VMINT vm_sys_file_get_space(void); + + +/***************************************************************************** +* FUNCTION + * vm_get_default_store_path_by_type + * DESCRIPTION + * get default store path of different types + * PARAMETERS + * RETURNS + * path string. + * +*****************************************************************************/ + +VMUWSTR vm_get_default_store_path_by_type(VMINT disk_letter, VM_STORE_PATH_TYPE type); + + +/***************************************************************************** + * FUNCTION + * vm_startup_email + * DESCRIPTION + * startup email + * PARAMETERS + * to_addr : [IN] email address of receiver (UCS2) + * RETURN VALUES + * 0 : success + * non-zero : failure + * -2 : platform not support + * -3 : no email account + *****************************************************************************/ +VMINT vm_startup_email(const VMWSTR to_addr); + +/* vm_fmgr_default_folder_enum */ +typedef enum +{ + VM_FMGR_DEFAULT_FOLDER_EBOOKS, /* path of defualt ebooks */ + VM_FMGR_DEFAULT_FOLDER_IMAGES, /* path of defualt images */ + VM_FMGR_DEFAULT_FOLDER_AUDIO, /* path of defualt audio */ + VM_FMGR_DEFAULT_FOLDER_VIDEO, /* path of defualt video */ + VM_FMGR_DEFAULT_FOLDER_SWFLASH, /* path of defualt swflash */ + VM_FMGR_DEFAULT_FOLDER_LANGLN, /* path of defualt langln */ + VM_FMGR_DEFAULT_FOLDER_TEMP, /* path of defualt temp */ + VM_FMGR_DEFAULT_FOLDER_THEMES, /* path of defualt themes */ + VM_FMGR_DEFAULT_FOLDER_BARCODE, /* path of defualt barcode */ + VM_FMGR_DEFAULT_FOLDER_MMSBOX, /* path of defualt mmsbox */ + VM_FMGR_DEFAULT_FOLDER_ROOT, /* path of defualt root */ + VM_FMGR_DEFAULT_FOLDER_TOTAL +}vm_fmgr_default_folder_enum; + +/***************************************************************************** + * FUNCTION + * vm_get_default_folder_path + * DESCRIPTION + * get the default path of folder type + * PARAMETERS + * mode : [IN] see vm_fmgr_default_folder_enum + * RETURNS + * const VMWCHAR * (UCS2) + * RETURN VALUES + * non-NULL : success + * NULL : failure + *****************************************************************************/ +const VMWCHAR * vm_get_default_folder_path(vm_fmgr_default_folder_enum type); + + +/* vm_file_copy Callback Return Value */ +typedef enum +{ + /* if something wrong, will call once + * Fail to do the copy action. Total and Completed will be zero. + */ + VM_FS_MOVE_PGS_FAIL = -1, + + /* + * Always call once + * Prepare to do the copy action. Parameter checking and remove target will be done at this stage. + * Total and Completed will be zero. + */ + VM_FS_MOVE_PGS_PREPARE, + + /* + * If pass parameter checking, always call once. + * Start to do the copy action. Total and Completed will be zero. + */ + VM_FS_MOVE_PGS_START, + + /* + * Not always call even if nothing wrong. + * If you move/copy a folder recursively, Total will be the number of files/folders to be moved/copied. + * Completed will be the files/folders that had been copied. + * If you just copy a file, Total will be the size of this file and Completed will be the bytes that had been copied. + * Note that if move/copy only one file, this callback will be triggered when interval is longer than 100ms around. + */ + VM_FS_MOVE_PGS_ING, + + /* + * + * Move/copy action is done. Total and Completed will be zero. + */ + VM_FS_MOVE_PGS_DONE +} vm_fs_move_pgs_enum; + + +/***************************************************************************** + * + * FUNCTION + * vm_file_copy_cb + * DESCRIPTION + * Callback function type for file copy. + * PARAMETERS + * act : [IN] see vm_fs_move_pgs_enum. + * total : [IN] the size of source file. + * completed : [IN] copied size. + * hdl : [IN] handle of file copy. + * RETURNS + * VMINT + *****************************************************************************/ +typedef VMINT (*vm_file_copy_cb)(VMINT act, VMUINT32 total, VMUINT32 completed, VMINT hdl); + +/***************************************************************************** + * FUNCTION + * vm_file_copy + * DESCRIPTION + * copy file + * PARAMETERS + * dst : [IN] the file path of destination UCS2 + * src : [IN] the file path of source UCS2 + * cb : [IN] callback of file copy + * RETURNS + * VMINT + * RETURN VALUES + * successful if 0, else failure + * (-2): bad parameter. + * (-3): Either source full path or destination full path is wrong + * (-19): Cannot find source full path specified. + * (-36): destination full path exists. + * (-44): Cannot get memory to do the operation + * (-46): busy. + * (-47): This action has been aborted in the user's callback function. + *****************************************************************************/ +VMINT vm_file_copy(const VMWSTR dst, const VMWSTR src, vm_file_copy_cb cb); + +/***************************************************************************** + * FUNCTION + * vm_file_copy_abort + * DESCRIPTION + * abort file copy + * PARAMETERS + * hdl : [IN] handle of file copy + * RETURNS + * VMINT + * RETURN VALUES + * success if 0, else failure + *****************************************************************************/ +VMINT vm_file_copy_abort(VMINT hdl); + + +/* flag for async fs */ +#define VM_FS_READ_WRITE 0x00000000L +#define VM_FS_READ_ONLY 0x00000100L +#define VM_FS_OPEN_SHARED 0x00000200L +#define VM_FS_OPEN_NO_DIR 0x00000400L +#define VM_FS_OPEN_DIR 0x00000800L +#define VM_FS_CREATE 0x00010000L +#define VM_FS_CREATE_ALWAYS 0x00020000L +#define VM_FS_COMMITTED 0x01000000L +#define VM_FS_CACHE_DATA 0x02000000L +#define VM_FS_LAZY_DATA 0x04000000L +#define VM_FS_NONBLOCK_MODE 0x10000000L +#define VM_FS_PROTECTION_MODE 0x20000000L +#define VM_FS_NOBUSY_CHECK_MODE 0x40000000L + + + +typedef VMINT vm_fs_api_enum; +typedef VMINT vm_fs_job_state_enum; +typedef VMINT vm_fs_job_id; +typedef VMINT vm_module_type; +typedef VMINT VM_FS_HANDLE; +typedef VMINT (*vm_fs_async_callback)(vm_fs_job_id jid, VMINT64 * result, void *data); + + +typedef enum +{ + VM_FS_PRIORITY_DEFAULT = 0, // Default: This job will use lower priority to run. Suitable to non-critical jobs. + VM_FS_PRIORITY_INHERITED, // Inherited: This job will inherites the priority of user. Suitable to critical jobs. + VM_FS_PRIORITY_INVALID = 0xFF +}vm_fs_prioity_enum; + +typedef struct +{ + vm_fs_api_enum api; // The API enumeration of this job + vm_fs_job_state_enum reserved1; // Reserved + VMUINT8 reserved2; // Reserved + vm_fs_job_id jid; // Job ID. It also appears in the 1st parameter of callback function. + vm_module_type reserved3; // Reserved + VMINT64 result; // Execution result of FS API. It also appears in the 2nd parameter of callback function. + vm_fs_async_callback callback; // Callback function pointer + void *param; // Parameter of callback function. It is defined in by user whenever FS async I/F is used. + void *reserved4; // Reserved +}vm_fs_async_callback_data_struct; + + +typedef struct +{ + vm_fs_async_callback_data_struct head; + VMINT job_id; + VMINT aborted; +}vm_fs_job_abort_struct; + +typedef struct +{ + vm_fs_async_callback_data_struct head; + VMWCHAR * filename; + VMUINT flag; +}vm_fs_job_open_struct; + +typedef struct +{ + vm_fs_async_callback_data_struct head; + VMINT fs_hdl; + void * data; + VMUINT length; + VMUINT * read; +}vm_fs_job_read_struct; + +typedef struct +{ + vm_fs_async_callback_data_struct head; + VMINT fs_hdl; + void * data; + VMUINT length; + VMUINT * written; +}vm_fs_job_write_struct; + +typedef struct +{ + vm_fs_async_callback_data_struct head; + const VMWCHAR * filename; +}vm_fs_job_delete_struct; + +typedef struct +{ + vm_fs_async_callback_data_struct head; + VMINT fs_hdl; + VMINT64 offset; + VMINT whence; +}vm_fs_job_seek_struct; + + +typedef struct +{ + vm_fs_prioity_enum priority; // priority configuration of this job + vm_fs_async_callback callback; // callback function pointer + void *param; // parameter of callback function +}vm_fs_overlapped_struct; + +/***************************************************************************** + * FUNCTION + * fs_aysnc_open + * + * DESCRIPTION + * Open a file + * + * PARAMETERS + * filename :[IN] Must point to the name of the file to open/create. + * File names are not case sensitive; they will be converted to + * upper case when file system searches this file, and they should + * be two-byte aligned and UCS2 encoded. The file name can have one + * of the following formats: + * flag :[IN] Can be a combination of the following flags: + * VM_FS_READ_WRITE VM_FS_READ_ONLY VM_FS_OPEN_SHARED VM_FS_OPEN_NO_DIR + * VM_FS_OPEN_DIR VM_FS_CREATE VM_FS_CREATE_ALWAYS VM_FS_COMMITTED + * VM_FS_CACHE_DATA VM_FS_LAZY_DATA VM_FS_ATTR_HIDDEN VM_FS_ATTR_SYSTEM + * VM_FS_ATTR_ARCHIVE VM_FS_NONBLOCK_MODE VM_FS_PROTECTION_MODE + * overlapped :[IN] Overlapped structure has 3 members, + * 1. callback :[IN] (Optional) Call back function. This function will be executed just after response message is received by user. + * 2. param :[IN] (Optional) Parameters for call back function + * 3. priority :[IN] (*Required) Priority of this job, it can be any one of following options, + * 1. VM_FS_PRIORITY_DEFAULT : User has no priority concern for this job) + * 2. VM_FS_PRIORITY_INHERITED: FS task will be raised to a higher priorty to execute this job) + * RETURNS + * Successful : A positive integer. It is Job ID. + * Failed : A negative integer. -1 means no authorization. + *****************************************************************************/ +VMINT vm_fs_async_open(const VMWSTR file_name, VMINT flag, vm_fs_overlapped_struct *overlapped); + +/***************************************************************************** + * FUNCTION + * vm_fs_async_write + * + * DESCRIPTION + * Write data to a file + * + * PARAMETERS + * fs_hdl :[IN] file handle, get it from *result in VMINT (*vm_fs_async_callback)(vm_fs_job_id jid, VMINT64 * result, void *data); + * data :[IN] Specifies the address of the data to be written. + * length :[IN] Specifies the number of bytes to write. + * written :[OUT] Pointer to an unsigned integer to receive the number of + * bytes actually been written. Usually, *Written will contain + * Length after the call. However, in case of an error, the + * returned value may be less. Written may be set to NULL if + * this information is not required by an application. + * overlapped :[IN] Overlapped structure has 3 members, + * 1. callback :[IN] (Optional) Call back function. This function will be executed just after response message is received by user. + * 2. param :[IN] (Optional) Parameters for call back function + * 3. priority :[IN] (*Required) Priority of this job, it can be any one of following options, + * 1. VM_FS_PRIORITY_DEFAULT : User has no priority concern for this job) + * 2. VM_FS_PRIORITY_INHERITED: FS task will be raised to a higher priorty to execute this job) + * RETURNS + * Successful : A positive integer. It is Job ID. + * Failed : A negative integer. -1 means no authorization. + *****************************************************************************/ +VMINT vm_fs_async_write(VM_FS_HANDLE fs_hdl, void *data, VMUINT length, VMUINT *written, vm_fs_overlapped_struct *overlapped); + +/***************************************************************************** + * FUNCTION + * vm_fs_async_write + * + * DESCRIPTION + * Read data to a file + * + * PARAMETERS + * fs_hdl :[IN] file handle, get it from *result in VMINT (*vm_fs_async_callback)(vm_fs_job_id jid, VMINT64 * result, void *data); + * data :[IN] Specifies the address of the data to be read. + * length :[IN] Specifies the number of bytes to write. + * read :[OUT] Pointer to an unsigned integer to receive the number of + * bytes actually been read. Usually, *Written will contain + * Length after the call. However, in case of an error, the + * returned value may be less. Written may be set to NULL if + * this information is not required by an application. + * overlapped :[IN] Overlapped structure has 3 members, + * 1. callback :[IN] (Optional) Call back function. This function will be executed just after response message is received by user. + * 2. param :[IN] (Optional) Parameters for call back function + * 3. priority :[IN] (*Required) Priority of this job, it can be any one of following options, + * 1. VM_FS_PRIORITY_DEFAULT : User has no priority concern for this job) + * 2. VM_FS_PRIORITY_INHERITED: FS task will be raised to a higher priorty to execute this job) + * RETURNS + * Successful : A positive integer. It is Job ID. + * Failed : A negative integer. -1 means no authorization. + *****************************************************************************/ +VMINT vm_fs_async_read(VM_FS_HANDLE fs_hdl, void *data, VMUINT length, VMUINT *read, vm_fs_overlapped_struct *overlapped); + +/***************************************************************************** + * FUNCTION + * vm_fs_async_seek + * + * DESCRIPTION + * Seek to a specific position of a file + * + * PARAMETERS + * fs_hdl :[IN] file handle, get it from *result in VMINT (*vm_fs_async_callback)(vm_fs_job_id jid, VMINT64 * result, void *data); + * offset :[IN] Specifies the offset (bytes) of the file to be seeked. + * whence :[IN] Specifies the method (start address) of the seek. + * overlapped :[IN] Overlapped structure has 3 members, + * 1. callback :[IN] (Optional) Call back function. This function will be executed just after response message is received by user. + * 2. param :[IN] (Optional) Parameters for call back function + * 3. priority :[IN] (*Required) Priority of this job, it can be any one of following options, + * 1. VM_FS_PRIORITY_DEFAULT : User has no priority concern for this job) + * 2. VM_FS_PRIORITY_INHERITED: FS task will be raised to a higher priorty to execute this job) + * RETURNS + * Successful : A positive integer. It is Job ID. + * Failed : A negative integer. -1 means no authorization. + *****************************************************************************/ +VMINT vm_fs_async_seek(VM_FS_HANDLE fs_hdl, VMINT64 * offset, VMINT whence, vm_fs_overlapped_struct *overlapped); + + +/***************************************************************************** + * FUNCTION + * vm_fs_async_delete + * + * DESCRIPTION + * Delete a file + * + * PARAMETERS + * filename :[IN] References the open file to seek to. + * overlapped :[IN] Overlapped structure has 3 members, + * 1. callback :[IN] (Optional) Call back function. This function will be executed just after response message is received by user. + * 2. param :[IN] (Optional) Parameters for call back function + * 3. priority :[IN] (*Required) Priority of this job, it can be any one of following options, + * 1. VM_FS_PRIORITY_DEFAULT : User has no priority concern for this job) + * 2. VM_FS_PRIORITY_INHERITED: FS task will be raised to a higher priorty to execute this job) + * RETURNS + * Successful : A positive integer. It is Job ID. + * Failed : A negative integer. -1 means no authorization. + *****************************************************************************/ +VMINT vm_fs_async_delete(const VMWSTR filename, vm_fs_overlapped_struct *overlapped); + +/***************************************************************************** + * FUNCTION + * vm_fs_async_abort + * + * DESCRIPTION + * This function provides the facility to abort a specific job by Job ID + * + * PARAMETERS + * jid :[IN] Job ID + * + * RETURNS + * Successful : A non-negative integer + * Failed : A negative integer. -1 means no authorization. + *****************************************************************************/ +VMINT vm_fs_async_abort(vm_fs_job_id jid); + + +/***************************************************************************** + * FUNCTION + * vm_fs_async_commit + * + * PARAMETERS + * fs_hdl :[IN] file handle, get it from *result in VMINT (*vm_fs_async_callback)(vm_fs_job_id jid, VMINT64 * result, void *data); + * + * DESCRIPTION + * Immediately flushes all buffers associated with a file to disk. + * + * PARAMETERS + * jid :[IN] Job ID + * + * RETURNS + * Successful : A non-negative integer + * Failed : A negative integer. -1 means no authorization. + *****************************************************************************/ +VMINT vm_fs_async_commit(VM_FS_HANDLE fs_hdl); + +/***************************************************************************** + * FUNCTION + * vm_fs_async_close + * + * PARAMETERS + * fs_hdl :[IN] file handle, get it from *result in VMINT (*vm_fs_async_callback)(vm_fs_job_id jid, VMINT64 * result, void *data); + * + * DESCRIPTION + * Immediately flushes all buffers associated with a file to disk. + * + * RETURNS + * Successful : A non-negative integer + * Failed : A negative integer. -1 means no authorization. + *****************************************************************************/ +VMINT vm_fs_async_close(VM_FS_HANDLE fs_hdl); + +VMINT vm_fs_async_get_working_buf_size(void); + +/***************************************************************************** + * FUNCTION + * vm_kbd_is_key_supported + * DESCRIPTION + * query if specified key code is supported + * PARAMETERS + * keycode [IN] key code + * RETURNS + * non-zero : supported. + * zero : unsupported + *****************************************************************************/ +VMINT vm_kbd_is_key_supported(VMINT keycode); + + + +typedef struct +{ + VMBYTE * dst; + VMUINT dst_size; + VMBYTE * src; + VMUINT src_size; +}vm_zip_t; + +VMINT vm_uncompress(const vm_zip_t * info, void * (*app_malloc)(VMUINT items, VMUINT size), void (*app_free)(void * address)); + + +#ifdef __cplusplus +} +#endif + +#endif /* VMIO_SDK_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmjava.h b/hardware/arduino/mtk/system/libmtk/include/vmjava.h new file mode 100644 index 00000000..c7f0eb6c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmjava.h @@ -0,0 +1,81 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef VMJAVA_SDK_H_ +#define VMJAVA_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +#include "vmpromng.h" + +#define MMI_MRE_MAX_ID_LEN 32 +#define MMI_MRE_MAX_URL_LEN 128 + +typedef enum +{ + VM_RESULT_OK, + VM_RESULT_FAILED +} vm_process_result_enum; + +typedef enum +{ + VM_CMD_JAVA_INSTALL, + VM_CMD_JAVA_REMOVE, + VM_CMD_JAVA_START, + VM_CMD_END +} vm_cmd_enum; + +typedef void (*vm_java_report_status_t)( vm_process_result_enum error_code, VMSTR mids_storage_id); + +typedef struct +{ + VMCHAR mids_storage_id[MMI_MRE_MAX_ID_LEN]; /* App software ID */ + VMINT16 pkg_install_path[MMI_MRE_MAX_URL_LEN]; /* Install file path */ + VMCHAR pkg_network_url[MMI_MRE_MAX_URL_LEN]; /* network package url */ + VM_P_HANDLE process_handle; + vm_java_report_status_t vm_java_report_status; +} vm_cmd_info_struct; + +void vm_process_java_app( vm_cmd_enum cmd, vm_cmd_info_struct *info); + +VMINT vm_java_is_removed(VMSTR mids_storage_id); + +#ifdef __cplusplus +} +#endif + +#endif /* VMJAVA_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmkeypad.h b/hardware/arduino/mtk/system/libmtk/include/vmkeypad.h new file mode 100644 index 00000000..5eea1fe8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmkeypad.h @@ -0,0 +1,281 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMKEYPAD_SDK_H +#define VMKEYPAD_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* Key events supported by MRE. */ + +#define VM_KEY_EVENT_UP (1) /* Key up event */ +#define VM_KEY_EVENT_DOWN (2) /* Key down event */ +#define VM_KEY_EVENT_LONG_PRESS (3) /* Key long press event */ +#define VM_KEY_EVENT_REPEAT (4) /* Key repeat event */ + +/* Key codes supported by MRE. */ + +#define VM_KEY_UP (-1) /* Arrow key up */ +#define VM_KEY_DOWN (-2) /* Arrow key down */ +#define VM_KEY_LEFT (-3) /* Arrow key left */ +#define VM_KEY_RIGHT (-4) /* Arrow key right */ +#define VM_KEY_LEFT_SOFTKEY (-6) /* Left soft key */ +#define VM_KEY_RIGHT_SOFTKEY (-7) /* Right soft key */ +#define VM_KEY_OK (-5) /* OK key */ +#define VM_KEY_CLEAR (-8) /* Clear key */ +#define VM_KEY_BACK (-9) /* Back key */ +#define VM_KEY_HOME (-10) /* Key home */ +#define VM_KEY_END (-11) /* key end */ +#define VM_KEY_NUM0 (48) /* Number key 0 */ +#define VM_KEY_NUM1 (49) /* Number key 1 */ +#define VM_KEY_NUM2 (50) /* Number key 2 */ +#define VM_KEY_NUM3 (51) /* Number key 3 */ +#define VM_KEY_NUM4 (52) /* Number key 4 */ +#define VM_KEY_NUM5 (53) /* Number key 5 */ +#define VM_KEY_NUM6 (54) /* Number key 6 */ +#define VM_KEY_NUM7 (55) /* Number key 7 */ +#define VM_KEY_NUM8 (56) /* Number key 8 */ +#define VM_KEY_NUM9 (57) /* Number key 9 */ +#define VM_KEY_VOL_UP (58) /* Volume key up */ +#define VM_KEY_VOL_DOWN (59) /* Volume key down */ +#define VM_KEY_POUND (35) /* Key # */ +#define VM_KEY_STAR (42) /* Key * */ + +/* Key codes from A to Z on a qwerty keypad, each code represents the Unicode value of the corresponding capital letter. */ +#define VM_KEY_A 65 /* A */ +#define VM_KEY_B 66 /* B */ +#define VM_KEY_C 67 /* C */ +#define VM_KEY_D 68 /* D */ +#define VM_KEY_E 69 /* E */ +#define VM_KEY_F 70 /* F */ +#define VM_KEY_G 71 /* G */ +#define VM_KEY_H 72 /* H */ +#define VM_KEY_I 73 /* I */ +#define VM_KEY_J 74 /* J */ +#define VM_KEY_K 75 /* K */ +#define VM_KEY_L 76 /* L */ +#define VM_KEY_M 77 /* M */ +#define VM_KEY_N 78 /* N */ +#define VM_KEY_O 79 /* O */ +#define VM_KEY_P 80 /* P */ +#define VM_KEY_Q 81 /* Q */ +#define VM_KEY_R 82 /* R */ +#define VM_KEY_S 83 /* S */ +#define VM_KEY_T 84 /* T */ +#define VM_KEY_U 85 /* U */ +#define VM_KEY_V 86 /* V */ +#define VM_KEY_W 87 /* W */ +#define VM_KEY_X 88 /* X */ +#define VM_KEY_Y 89 /* Y */ +#define VM_KEY_Z 90 /* Z */ +#define VM_KEY_SPACE 91 /* Space */ +#define VM_KEY_TAB 92 /* Tab */ +#define VM_KEY_DEL 93 /* Delete */ +#define VM_KEY_ALT 94 /* Alt */ +#define VM_KEY_CTRL 95 /* Ctrl */ +#define VM_KEY_WIN 96 /* Winodows key */ +#define VM_KEY_SHIFT 97 /* Shift */ +#define VM_KEY_QUESTION 98 /* Question */ +#define VM_KEY_PERIOD 99 /* Period */ +#define VM_KEY_COMMA 100 /* Comma (,) */ +#define VM_KEY_EXCLAMATION 101 /* Exclamation (!) */ +#define VM_KEY_APOSTROPHE 102 /* Apostrophe (') */ +#define VM_KEY_AT 103 /* @ */ +#define VM_KEY_BACKSPACE 104 /* Backspace */ +#define VM_KEY_QWERTY_ENTER 105 /* Qwerty enter */ +#define VM_KEY_FN 106 /* Function */ +#define VM_KEY_SYMBOL 107 /* Symbol */ +#define VM_KEY_NUM_LOCK 108 /* Number lock */ +#define VM_KEY_QWERTY_MENU 109 /* Qwerty menu */ + +/***************************************************************************** + * FUNCTION + * vm_kbd_is_key_supported + * DESCRIPTION + * query if specified key code is supported + * PARAMETERS + * keycode [IN] key code + * RETURNS + * non-zero : supported. + * zero : unsupported + *****************************************************************************/ +VMINT vm_kbd_is_key_supported(VMINT keycode); + + +typedef enum +{ + VM_DEVCONFIG_KEYPAD_TYPE_NORMAL, /* normal keypad type */ + VM_DEVCONFIG_KEYPAD_TYPE_REDUCED, /* reduced keypad type */ + VM_DEVCONFIG_KEYPAD_TYPE_QWERTY, /* qwerty keypad type */ + VM_DEVCONFIG_KEYPAD_TYPE_TOTAL +} vm_devconfig_keypad_type_enum; + + +/***************************************************************************** +* FUNCTION +* vm_get_keypad_type +* DESCRIPTION +* check the current type of keypad +* PARAMETERS +* void +* RETURN VALUES +* less than zero : failure +* VM_DEVCONFIG_KEYPAD_TYPE_NORMAL : normal keypad type. +* VM_DEVCONFIG_KEYPAD_TYPE_REDUCED : reduced keypad type. +* VM_DEVCONFIG_KEYPAD_TYPE_QWERTY : qwerty keypad type. +*****************************************************************************/ +VMINT vm_get_keypad_type(void); + +typedef enum +{ + /* KEY1 Number */ + VM_KEYPAD_1KEY_NUMBER = 0, + /* KEY2 Number */ + VM_KEYPAD_2KEY_NUMBER, + /* reserved */ + VM_KEYPAD_3KEY_NUMBER, + /* KEY1 Qwerty */ + VM_KEYPAD_1KEY_QWERTY, + /* KEY2 Qwerty */ + VM_KEYPAD_2KEY_QWERTY, + /* reserved */ + VM_KEYPAD_3KEY_QWERTY, + /* reserved */ + VM_KEYPAD_MODE_END +} vm_keypad_mode_enum; + +typedef enum +{ + VM_KBD_MODE_ERR_PARAM = -2, /* input invalid parameter */ + VM_KBD_MODE_ERR_NOT_AUTHORIZED, /* no authrization */ + VM_KBD_MODE_ERR_SUCCESS = 0 /* success */ +}vm_kbd_mode_error_t; + +/***************************************************************************** + * FUNCTION + * vm_kbd_set_mode + * DESCRIPTION + * set the concurrent key mode + * PARAMETERS + * mode : [IN] see vm_keypad_mode_enum + * RETURNS + * vm_kbd_mode_error_t + * RETURN VALUES + * 0 : success + * non-zero : failure + *****************************************************************************/ +VMINT vm_kbd_set_mode(VMUINT8 mode); + +/***************************************************************************** + * FUNCTION + * vm_is_support_keyborad + * DESCRIPTION + * Check whether the phone support keypad or not. + * PARAMETERS + * void + * RETURN VALUES + * TRUE : Supports keypad. + * FALSE : Not support. + *****************************************************************************/ +VMINT vm_is_support_keyborad(void); + + + +/***************************************************************************** + * + * + * FUNCTION + * vm_key_handler_t + * DESCRIPTION + * Callback function type for key event handler. + * PARAMETERS + * event : [IN] Key event. + * keycode : [IN] Key code. + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_key_handler_t)(VMINT event, VMINT keycode); + +/***************************************************************************** + * + * + * FUNCTION + * vm_key_handler_ex_t + * DESCRIPTION + * Callback function type for key event handler. + * PARAMETERS + * event : [IN] Key event. + * keycode : [IN] Key code. + * RETURNS + * void + *****************************************************************************/ +typedef VMINT (*vm_key_handler_ex_t)(VMINT event, VMINT keycode); + +/***************************************************************************** + * FUNCTION + * vm_reg_keyboard_callback + * DESCRIPTION + * Registers key handler. + * PARAMETERS + * vm_key_handler_t : [IN] Key event handler. + * RETURNS + * void + *****************************************************************************/ +void vm_reg_keyboard_callback(vm_key_handler_t handler); + +/***************************************************************************** + * FUNCTION + * vm_reg_keyboard_callback + * DESCRIPTION + * Registers key extension handler. app will take the key event + * and not give it back to platform if return value from callback is non-zero, + * else not. + * PARAMETERS + * vm_key_handler_ex_t : [IN] Key extension event handler. + * RETURNS + * void + *****************************************************************************/ +VMINT vm_reg_keyboard_callback_ex(vm_key_handler_ex_t handler); + +#ifdef __cplusplus +} +#endif + +#endif /* VMKEYPAD_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmlog.h b/hardware/arduino/mtk/system/libmtk/include/vmlog.h new file mode 100644 index 00000000..0a0620b0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmlog.h @@ -0,0 +1,147 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef LOG_SDK_H_ +#define LOG_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#define VM_DEBUG_LEVEL 5 +#define VM_INFO_LEVEL 4 +#define VM_WARN_LEVEL 3 +#define VM_ERROR_LEVEL 2 +#define VM_FATAL_LEVEL 1 + + +void vm_log_init(char* filename, int log_level); +void vm_log_close(void); + +#if defined(__LINKIT_ONE__) + +void _vm_log_debug(const char* fmt, ...); +void _vm_log_info(const char* fmt, ...); +void _vm_log_warn(const char* fmt, ...); +void _vm_log_error(const char* fmt, ...); +void _vm_log_fatal(const char* fmt, ...); + +#else + +void _vm_log_debug(char* fmt, ...); +void _vm_log_info(char* fmt, ...); +void _vm_log_warn(char* fmt, ...); +void _vm_log_error(char* fmt, ...); +void _vm_log_fatal(char* fmt, ...); + +#endif + +int _vm_log_module(const char* __file__, const int __line__); + +#ifdef WIN32 +#define vm_log_fatal if(_vm_log_module(__FILE__, __LINE__)) _vm_log_fatal +#define vm_log_error if(_vm_log_module(__FILE__, __LINE__)) _vm_log_error +#define vm_log_warn if(_vm_log_module(__FILE__, __LINE__)) _vm_log_warn +#define vm_log_info if(_vm_log_module(__FILE__, __LINE__)) _vm_log_info +#define vm_log_debug if(_vm_log_module(__FILE__, __LINE__)) _vm_log_debug + +#elif defined(__LINKIT_ONE_RELEASE__) + +#define vm_log_fatal +#define vm_log_error +#define vm_log_warn +#define vm_log_info +#define vm_log_debug + +#else +/***************************************************************************** + * FUNCTION + * vm_log_fatal + * DESCRIPTION + * write fatal level log. + * PARAMETERS + * fmt : [IN] format string. +*****************************************************************************/ +#define vm_log_fatal(...) if(_vm_log_module(__FILE__, __LINE__)) _vm_log_fatal(__VA_ARGS__) + +/***************************************************************************** + * FUNCTION + * vm_log_error + * DESCRIPTION + * write error level log. + * PARAMETERS + * fmt : [IN] format string. +*****************************************************************************/ +#define vm_log_error(...) if(_vm_log_module(__FILE__, __LINE__)) _vm_log_error(__VA_ARGS__) + +/***************************************************************************** + * FUNCTION + * vm_log_warn + * DESCRIPTION + * write warn level log. + * PARAMETERS + * fmt : [IN] format string. +*****************************************************************************/ +#define vm_log_warn(...) if(_vm_log_module(__FILE__, __LINE__)) _vm_log_warn(__VA_ARGS__) + +/***************************************************************************** + * FUNCTION + * vm_log_info + * DESCRIPTION + * write info level log. + * PARAMETERS + * fmt : [IN] format string. +*****************************************************************************/ +#define vm_log_info(...) if(_vm_log_module(__FILE__, __LINE__)) _vm_log_info( __VA_ARGS__) + +/***************************************************************************** + * FUNCTION + * vm_log_debug + * DESCRIPTION + * write debug level log. + * PARAMETERS + * fmt : [IN] format string. +*****************************************************************************/ +#define vm_log_debug(...) if(_vm_log_module(__FILE__, __LINE__)) _vm_log_debug(__VA_ARGS__) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LOG_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmmagic.h b/hardware/arduino/mtk/system/libmtk/include/vmmagic.h new file mode 100644 index 00000000..9f633b23 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmmagic.h @@ -0,0 +1,78 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMMAGIC_SDK_H +#define VMMAGIC_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +#include "vmpromng.h" + +/* Max num of magic api using resource */ +#define VM_RES_TYPE_MAGIC_NUM (10) + +/* struct of storing in resource */ +typedef struct vm_magic_t { + /* the pointer to customer struct */ + void* pointer; + /* saving current mre app handle */ + VM_P_HANDLE m_pHandle; + /* the handle of native function which register cb */ + VMINT native_handle; +} vm_magic_t; + +/***************************************************************************** +* FUNCTION + * vm_magic_wrapper_for_customer + * DESCRIPTION + * magic wrapper api for customer, customer can use this api to realize apis which is not released in SDK + * PARAMETERS + * index: [IN] the index which implies different apis + * param: [IN] the data transfered into wrapper api, which maybe callback function + * RETURNS + * if 0, success; others, fail. +*****************************************************************************/ +VMINT vm_magic_wrapper_for_customer(VMINT index, void* param, void* reserve); + + +#ifdef __cplusplus +} +#endif + +#endif /* VMMAGIC_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmmm.h b/hardware/arduino/mtk/system/libmtk/include/vmmm.h new file mode 100644 index 00000000..fe7d6e98 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmmm.h @@ -0,0 +1,963 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMMM_SDK_H_ +#define VMMM_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* driver name length */ +#define DRV_NAME_LEN (4) + +/* record file name length */ +#define REC_NAME_LEN (50) + +/* directory length */ +#define DIR_NAME_LEN (200) + +/* file name length */ +#define MAX_NAME_LEN (260) + +/* wide char file name length */ +#define MAX_WNAME_LEN (260 * sizeof(VMWCHAR)) + +/* default volume */ +#define DEFAULT_VOLUME 3 + +/* path to play */ +#define VM_DEVICE_SPEAKER 0 +#define VM_DEVICE_MICROPHONE 1 +#define VM_DEVICE_SPEAKER2 4 +#define VM_DEVICE_LOUDSPEAKER 5 +#define VM_DEVICE_SPEAKER_BOTH 6 +#define VM_DEVICE_BT_HEADSET 8 + +/* media type */ +typedef enum +{ + VM_FORMAT_NONE = -1, + VM_FORMAT_AMR = 3, + VM_FORMAT_MP3 = 5, + VM_FORMAT_AAC = 6, + VM_FORMAT_WAV = 13, + VM_FORMAT_MIDI = 17, + VM_FORMAT_IMELODY = 18, + VM_FORMAT_OTHER = 100, + VM_FORMAT_MAX +}vm_format_enum; + +/* ======================= record ====================== */ + + +/* record success */ +#define VM_RECORD_SUCCEED (1) + +/* record failed */ +#define VM_RECORD_FAILED (0) + +/* callback function pointer */ +typedef void(*vm_recorder_callback)(VMINT result); + +typedef void (*vm_audio_result_callback)(VMINT handle, VMINT result); + +/***************************************************************************** + * FUNCTION + * vm_record_start + * DESCRIPTION + * start record. + * PARAMETERS + * drv_name : [IN] driver name. + * dir_name : [IN] directory name. + * rec_name : [IN] record file name. + * format : [IN] record file format, VM_FORMAT_AMR and VM_FORMAT_WAV. + * full_rec_file_wname : [OUT] the real file name, maybe different with rec_name. + * vm_record_cb : [IN] callback function. + * RETURNS + * start record success or not. + * RETURN VALUES + * VM_RECORD_FAILED : start record failed. + * VM_RECORD_SUCCEED : start record success. +*****************************************************************************/ +VMINT vm_record_start(VMSTR drv_name, VMSTR dir_name, VMSTR rec_name, VMUINT8 format, VMWSTR full_rec_file_wname, vm_recorder_callback vm_record_cb); + +/***************************************************************************** + * FUNCTION + * vm_record_pause + * DESCRIPTION + * record pause. + * RETURNS + * record pause success or not. + * RETURN VALUES + * VM_RECORD_FAILED : record pause failed. + * VM_RECORD_SUCCEED : record pause success. +*****************************************************************************/ +VMINT vm_record_pause(void); + +/***************************************************************************** + * FUNCTION + * vm_record_resume + * DESCRIPTION + * record resume. + * RETURNS + * record resume success or not. + * RETURN VALUES + * VM_RECORD_FAILED : record resume failed. + * VM_RECORD_SUCCEED : record resume success. +*****************************************************************************/ +VMINT vm_record_resume(void); + +/***************************************************************************** + * FUNCTION + * vm_record_stop + * DESCRIPTION + * stop record. + * RETURNS + * stop record success or not. + * RETURN VALUES + * VM_RECORD_FAILED : stop record failed. + * VM_RECORD_SUCCEED : stop record success. +*****************************************************************************/ +VMINT vm_record_stop(void); + + +/* ===================== audio ========================== */ + + +/* audio operation success */ +#define VM_AUDIO_SUCCEED (0) + +/* audio operation failed */ +#define VM_AUDIO_FAILED (-1) + +/* stop play audio */ +#define VM_AUDIO_RESULT_STOP 1 + +/* pause audio */ +#define VM_AUDIO_RESULT_PAUSE 2 + +/* resume audio */ +#define VM_AUDIO_RESULT_RESUME 3 + +/* play end */ +#define VM_AUDIO_RESULT_END_OF_FILE 5 + +/* demo end time */ +#define VM_AUDIO_RESULT_DEMO_END 6 + +/* interruptted by others */ +#define VM_AUDIO_RESULT_INTERRUPT 7 + +/* resume from interruptting */ +#define VM_AUDIO_RESULT_INTERRUPT_RESUME 8 + + +/***************************************************************************** + * FUNCTION + * vm_audio_play_file + * DESCRIPTION + * play file use default volume(3) and path(VM_DEVICE_SPEAKER2). + * PARAMETERS + * filename : [IN] file name to play. + * f : [IN] callback function. + * RETURNS + * play a file success or not. + * RETURN VALUES + * VM_AUDIO_FAILED : play a file failed. + * VM_AUDIO_SUCCEED : play a file success. +*****************************************************************************/ +VMINT vm_audio_play_file(VMWSTR filename, void (*f)(VMINT result)); + +/***************************************************************************** + * FUNCTION + * vm_audio_play_file_ex + * DESCRIPTION + * play file use default volume(3) but set start time and path. + * PARAMETERS + * filename : [IN] file name to play. + * start_time : [IN] start time to play. + * path : [IN] play path. + * VM_DEVICE_SPEAKER Tone, Keypad sound to play on audio device. + * VM_DEVICE_MICROPHONE Microphone sound to send on audio device. + * VM_DEVICE_SPEAKER2 Earphone, carkit + * VM_DEVICE_LOUDSPEAKER Loudspeaker for free sound + * VM_DEVICE_SPEAKER_BOTH Output from earphone and loud speaker + * VM_DEVICE_BT_HEADSET Used to be OR bitwise with above audio output devices + * f : [IN] callback function. + * RETURNS + * play a file success or not. + * RETURN VALUES + * VM_AUDIO_FAILED : play a file failed. + * VM_AUDIO_SUCCEED : play a file success. +*****************************************************************************/ +VMINT vm_audio_play_file_ex(VMWSTR filename, VMUINT start_time, VMUINT path, void (*f)(VMINT result)); + +/***************************************************************************** + * FUNCTION + * vm_audio_play_bytes + * DESCRIPTION + * play buffer use default volume(3) but set start time and path. + * PARAMETERS + * audio_data : [IN] audio buffer to play. + * len : [IN] buffer length. + * format : [IN] buffer format, only support mp3 and aac. + * start_time : [IN] start time to play. + * path : [IN] play path. + * VM_DEVICE_SPEAKER Tone, Keypad sound to play on audio device. + * VM_DEVICE_MICROPHONE Microphone sound to send on audio device. + * VM_DEVICE_SPEAKER2 Earphone, carkit + * VM_DEVICE_LOUDSPEAKER Loudspeaker for free sound + * VM_DEVICE_SPEAKER_BOTH Output from earphone and loud speaker + * VM_DEVICE_BT_HEADSET Used to be OR bitwise with above audio output devices + * f : [IN] callback function. + * RETURNS + * play buffer success or not. + * RETURN VALUES + * VM_AUDIO_FAILED : play buffer failed. + * VM_AUDIO_SUCCEED : play buffer success. +*****************************************************************************/ +VMINT vm_audio_play_bytes(void *audio_data, VMUINT len, VMUINT8 format, VMUINT start_time, VMUINT path, void (*f)(VMINT result)); + + +/***************************************************************************** + * FUNCTION + * vm_audio_play_bytes_no_block + * DESCRIPTION + * play buffer use default volume(3) but set path, this is no block function. + * PARAMETERS + * audio_data : [IN] audio buffer to play. + * len : [IN] buffer length. + * format : [IN] buffer format, only support mp3 and aac. + * path : [IN] play path. + * VM_DEVICE_SPEAKER Tone, Keypad sound to play on audio device. + * VM_DEVICE_MICROPHONE Microphone sound to send on audio device. + * VM_DEVICE_SPEAKER2 Earphone, carkit + * VM_DEVICE_LOUDSPEAKER Loudspeaker for free sound + * VM_DEVICE_SPEAKER_BOTH Output from earphone and loud speaker + * VM_DEVICE_BT_HEADSET Used to be OR bitwise with above audio output devices + * f : [IN] callback function. + * RETURNS + * play buffer success or not. + * RETURN VALUES + * VM_AUDIO_FAILED : play buffer failed. + * VM_AUDIO_SUCCEED : play buffer success. +*****************************************************************************/ +VMINT vm_audio_play_bytes_no_block(void *audio_data, VMUINT len, VMUINT8 format, VMUINT path, void (*f)(VMINT result)); + + +/***************************************************************************** + * FUNCTION + * vm_audio_pause + * DESCRIPTION + * pause audio. + * PARAMETERS + * f : [IN] callback function. + * RETURNS + * pause success or not. + * RETURN VALUES + * VM_AUDIO_FAILED : pause failed. + * VM_AUDIO_SUCCEED : pause success. +*****************************************************************************/ +VMINT vm_audio_pause(void (*f)(VMINT result)); + +/***************************************************************************** + * FUNCTION + * vm_audio_resume + * DESCRIPTION + * resume audio. + * PARAMETERS + * f : [IN] callback function. + * RETURNS + * resume success or not. + * RETURN VALUES + * VM_AUDIO_FAILED : resume failed. + * VM_AUDIO_SUCCEED : resume success. +*****************************************************************************/ +VMINT vm_audio_resume(void (*f)(VMINT result)); + +/***************************************************************************** + * FUNCTION + * vm_audio_stop + * DESCRIPTION + * stop audio. + * PARAMETERS + * f : [IN] callback function. + * RETURNS + * stop success or not. + * RETURN VALUES + * VM_AUDIO_FAILED : stop failed. + * VM_AUDIO_SUCCEED : stop success. +*****************************************************************************/ +VMINT vm_audio_stop(void (*f)(VMINT result)); + +/***************************************************************************** + * FUNCTION + * vm_audio_stop_all + * DESCRIPTION + * stop all audios. + * PARAMETERS + * + * RETURNS + * stop success or not. + * RETURN VALUES + * VM_AUDIO_FAILED : stop failed. + * VM_AUDIO_SUCCEED : stop success. +*****************************************************************************/ +VMINT vm_audio_stop_all(void); + +/***************************************************************************** + * FUNCTION + * vm_audio_duration + * DESCRIPTION + * get file time. + * PARAMETERS + * filename : [IN] file name to get time. + * RETURNS + * time timer or failed. + * RETURN VALUES + * VM_AUDIO_FAILED : get time failed. + * Other : audio time. +*****************************************************************************/ +VMINT vm_audio_duration(VMWSTR filename); + +/***************************************************************************** + * FUNCTION + * vm_audio_bytes_duration + * DESCRIPTION + * get buffer time. + * PARAMETERS + * audio_data : [IN] audio buffer to play. + * len : [IN] buffer length. + * format : [IN] buffer format, support mp3,aac,midi,amr. + * RETURNS + * buffer timer or failed. + * RETURN VALUES + * VM_AUDIO_FAILED : play buffer failed. + * Other : buffer time. +*****************************************************************************/ +VMINT vm_audio_bytes_duration(void *audio_data, VMUINT len, VMUINT8 format); + + +/***************************************************************************** + * FUNCTION + * vm_audio_get_time + * DESCRIPTION + * get current play time. + * RETURN VALUES + * VM_AUDIO_FAILED : play buffer failed. + * Other : current play time. +*****************************************************************************/ +VMINT vm_audio_get_time(void); + +/***************************************************************************** + * FUNCTION + * vm_set_volume + * DESCRIPTION + * set play volume. + * PARAMETERS + * volume : [IN] volume to set, range is 0-6. +*****************************************************************************/ +void vm_set_volume(VMINT volume); + + +/* ========================== midi ============================ */ + +/* midi operation success */ +#define VM_MIDI_SUCCEED (0) + +/* midi operation failed */ +#define VM_MIDI_FAILED (-1) + +/* play count once time */ +#define VM_MIDI_PLAY_MAX 9 + +/* midi paly start */ +#define VM_STATE_MIDI_START 1 + +/* midi paly end */ +#define VM_STATE_MIDI_STOP 2 + + +/***************************************************************************** + * FUNCTION + * vm_midi_set_type + * DESCRIPTION + * set midi play format. + * PARAMETERS + * type : [IN] resource id. + * RETURNS + * set midi type + * RETURN VALUES +*****************************************************************************/ +void vm_midi_set_type(VMINT type); + +/***************************************************************************** + * FUNCTION + * vm_midi_play + * DESCRIPTION + * play midi. + * PARAMETERS + * resid : [IN] resource id. + * repeat : [IN] repeat count. + * f : [IN] callback function. + * RETURNS + * if play success return midi handle, else return VM_MIDI_FAILED. + * RETURN VALUES + * VM_MIDI_FAILED : play midi failed. + * Other : midi handle. +*****************************************************************************/ +VMINT vm_midi_play(VMINT resid, VMINT repeat, void (*f)(VMINT handle, VMINT event)); + +/***************************************************************************** + * FUNCTION + * vm_midi_play_ex + * DESCRIPTION + * play midi. + * PARAMETERS + * resid : [IN] resource id. + * start_time : [IN] time to play. + * repeat : [IN] repeat count. + * path : [IN] play path. + * VM_DEVICE_SPEAKER Tone, Keypad sound to play on audio device. + * VM_DEVICE_MICROPHONE Microphone sound to send on audio device. + * VM_DEVICE_SPEAKER2 Earphone, carkit + * VM_DEVICE_LOUDSPEAKER Loudspeaker for free sound + * VM_DEVICE_SPEAKER_BOTH Output from earphone and loud speaker + * VM_DEVICE_BT_HEADSET Used to be OR bitwise with above audio output devices + * f : [IN] callback function. + * RETURNS + * if play success return midi handle, else return VM_MIDI_FAILED. + * RETURN VALUES + * VM_MIDI_FAILED : play midi failed. + * Other : midi handle. +*****************************************************************************/ +VMINT vm_midi_play_ex(VMINT resid, VMUINT start_time, VMINT repeat, VMUINT path, void (*f)(VMINT handle, VMINT event)); + +/***************************************************************************** + * FUNCTION + * vm_midi_play_by_bytes + * DESCRIPTION + * play buffer. + * PARAMETERS + * midibuf : [IN] buffer data. + * len : [IN] buffer length. + * repeat : [IN] repeat count. + * f : [IN] callback function. + * RETURNS + * if play success return midi handle, else return VM_MIDI_FAILED. + * RETURN VALUES + * VM_MIDI_FAILED : play midi failed. + * Other : midi handle. +*****************************************************************************/ +VMINT vm_midi_play_by_bytes( VMUINT8 * midibuf, VMINT len, VMINT repeat, void (*f)(VMINT handle, VMINT event) ); + +/***************************************************************************** + * FUNCTION + * vm_midi_play_ex + * DESCRIPTION + * play midi. + * PARAMETERS + * midibuf : [IN] buffer data. + * len : [IN] buffer length. + * start_time : [IN] time to play. + * repeat : [IN] repeat count. + * path : [IN] play path. + * VM_DEVICE_SPEAKER Tone, Keypad sound to play on audio device. + * VM_DEVICE_MICROPHONE Microphone sound to send on audio device. + * VM_DEVICE_SPEAKER2 Earphone, carkit + * VM_DEVICE_LOUDSPEAKER Loudspeaker for free sound + * VM_DEVICE_SPEAKER_BOTH Output from earphone and loud speaker + * VM_DEVICE_BT_HEADSET Used to be OR bitwise with above audio output devices + * f : [IN] callback function. + * RETURNS + * if play success return midi handle, else return VM_MIDI_FAILED. + * RETURN VALUES + * VM_MIDI_FAILED : play midi failed. + * Other : midi handle. +*****************************************************************************/ +VMINT vm_midi_play_by_bytes_ex( VMUINT8 * midibuf, VMINT len, VMUINT start_time, VMINT repeat, VMUINT path, void (*f)(VMINT handle, VMINT event) ); + +/***************************************************************************** + * FUNCTION + * vm_midi_pause + * DESCRIPTION + * pause audio. + * PARAMETERS + * handle : [IN] play handle. + * RETURNS + * pause success or not. + * RETURN VALUES + * 0 : resume success. + * others : resume failed. +*****************************************************************************/ +VMINT vm_midi_pause(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_midi_resume + * DESCRIPTION + * resume audio. + * PARAMETERS + * handle : [IN] play handle. + * RETURNS + * resume success or not. + * RETURN VALUES + * 0 : resume success. + * others : resume failed. +*****************************************************************************/ +VMINT vm_midi_resume(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_midi_get_time + * DESCRIPTION + * get play time. + * PARAMETERS + * handle : [IN] play handle. + * current_time : [OUT] play time. + * RETURNS + * get play time success or not. + * RETURN VALUES + * 0 : resume success. + * others : resume failed. +*****************************************************************************/ +VMINT vm_midi_get_time(VMINT handle, VMUINT *current_time); + +/***************************************************************************** + * FUNCTION + * vm_midi_stop + * DESCRIPTION + * stop midi. + * PARAMETERS + * handle : [IN] play handle. + * RETURNS + * stop success or not. + * RETURN VALUES + * VM_MIDI_SUCCEED : stop success. + * VM_MIDI_FAILED : stop failed. +*****************************************************************************/ +void vm_midi_stop(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_midi_stop_all + * DESCRIPTION + * stop all opened midi. + * EXAMPLE +*****************************************************************************/ +void vm_midi_stop_all(void); + +/***************************************************************************** + * FUNCTION + * vm_set_key_tone_on + * DESCRIPTION + * set key tone on. +*****************************************************************************/ +void vm_set_key_tone_on(void); + +/***************************************************************************** + * FUNCTION + * vm_set_key_tone_off + * DESCRIPTION + * set key tone off. +*****************************************************************************/ +void vm_set_key_tone_off(void); + +/* key tone type */ +typedef enum +{ + VM_KEY_TONE_ENABLED = 0, /* Not Disable all key tone */ + VM_KEY_VOL_TONE_DISABLED, /* Disable VOL_UP VOL_DOWN key tone */ + VM_KEY_VOL_UP_DOWN_TONE_DISABLED, /* Disable VOL_UP, VOL_DOWN, UP_ARROW, DOWN_ARROW key tone */ + VM_KEY_RIGHT_LEFT_ARROW_TONE_DISABLED, /* Disable LEFT ARROW, RIGHT ARROW */ + VM_KEY_TONE_DISABLED, /* Disable all key tone */ + VM_KEY_TONE_INVALID +} vm_kbd_tone_state_enum; + +/***************************************************************************** + * FUNCTION + * vm_get_key_tone_state + * DESCRIPTION + * get current key tone states. + * RETURNS + * key tone states, please refer the struct of vm_kbd_tone_state_enum. +*****************************************************************************/ +vm_kbd_tone_state_enum vm_get_key_tone_state(void); + +/***************************************************************************** + * FUNCTION + * vm_set_key_tone_state + * DESCRIPTION + * set key tone states. + * PARAMETERS + * key_tone_state : [IN] key tone states to set. + * RETURNS + * set key tone states success or not. + * RETURN VALUES + * FALSE : set key tone states failed. + * TRUE : set key tone states success. +*****************************************************************************/ +VMINT vm_set_key_tone_state(vm_kbd_tone_state_enum key_tone_state); + + +/***************************************************************************** + * FUNCTION + * vm_set_ringtone + * DESCRIPTION + * set file as ringtone. + * PARAMETERS + * filepath : [IN] the path for setting ringtone. + * RETURNS + * set ringtone success or not. + * RETURN VALUES + * >0 : the slot of set ringtone + * VM_KURO_FAILED : set ringtone error +*****************************************************************************/ +VMINT vm_set_ringtone(VMWSTR filepath); + +/***************************************************************************** +* FUNCTION +* vm_audio_resume_bg_play +* DESCRIPTION +* resume background audio +*****************************************************************************/ +void vm_audio_resume_bg_play(void); + +/***************************************************************************** +* FUNCTION +* vm_audio_suspend_bg_play +* DESCRIPTION +* suspend background audio +*****************************************************************************/ +void vm_audio_suspend_bg_play(void); + + +typedef void (*vm_audio_mixed_callback_p) (VMINT handle, VMINT result, void* user_data); + +typedef struct +{ + void* data; /* String data. */ + VMINT32 data_len; /* The length of string data. Don't care if using file name */ + vm_format_enum format; /* Audio format, please refer vm_format_enum */ + VMINT8 repeats; /* Repate times */ + VMINT8 output_path; /* Output path. Use VM_DEVICE_SPEAKER2 for default setting */ + VMBOOL async_mode; /* Async mode, if this is TRUE, play and stop will be asynchronous */ + vm_audio_mixed_callback_p callback; /* Callback function */ + void* user_data; /* User data */ +} vm_auido_mixed_open_struct; + + +/***************************************************************************** + * FUNCTION + * vm_audio_mixed_set_speedup_mode + * DESCRIPTION + * Speed mode, if this is TRUE, play and stop will speed up, but this will use on mixed channel, + * Example : if the paltformat support 5 channels to mixed, if you set this is TRUE , application + * only can use 4 channels to play + * PARAMETERS + * mode : [IN] TRUE + * RETURNS + * RETURN VALUES +*****************************************************************************/ +void vm_audio_mixed_set_speedup_mode(VMBOOL mode); + +/***************************************************************************** + * FUNCTION + * vm_audio_mixed_open + * DESCRIPTION + * this function support mixed audio's play, support format is VM_FORMAT_WAV,VM_FORMAT_MIDI,VM_FORMAT_IMELODY, + * other audio format only can play, but could not mixed. + * PARAMETERS + * mixed_play : [IN] open parameters, please refer vm_auido_mixed_open_struct. + * RETURNS + * if open success , it will return handle, else return VM_AUDIO_FAILED. + * RETURN VALUES + * VM_AUDIO_FAILED : mixed play open failed. + * Other : play handle. +*****************************************************************************/ +VMINT vm_audio_mixed_open(vm_auido_mixed_open_struct* mixed_open); + + +/***************************************************************************** + * FUNCTION + * vm_audio_mixed_play + * DESCRIPTION + * play the audio + * PARAMETERS + * handle : [IN] play parameters, please refer vm_auido_mixed_play_struct. + * RETURNS + * play success or not. + * RETURN VALUES + * VM_AUDIO_SUCCEED : mixed play success. + * Other : play failed. +*****************************************************************************/ +VMINT vm_audio_mixed_play(VMINT handle); + + +/***************************************************************************** + * FUNCTION + * vm_audio_mixed_pause + * DESCRIPTION + * pause audio. + * PARAMETERS + * handle : [IN] audio handle, get from vm_audio_mixed_open + * RETURNS + * pause success or not. + * RETURN VALUES + * VM_AUDIO_SUCCEED : resume success. + * others : resume failed. +*****************************************************************************/ +VMINT vm_audio_mixed_pause(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_audio_mixed_resume + * DESCRIPTION + * resume audio. + * PARAMETERS + * handle : [IN] audio handle, get from vm_audio_mixed_open + * RETURNS + * resume success or not. + * RETURN VALUES + * VM_AUDIO_SUCCEED : resume success. + * others : resume failed. +*****************************************************************************/ +VMINT vm_audio_mixed_resume(VMINT handle); + + +/***************************************************************************** + * FUNCTION + * vm_audio_mixed_set_start_time + * DESCRIPTION + * set start time to play. + * PARAMETERS + * handle : [IN] audio handle, get from vm_audio_mixed_open + * current_time : [IN] start time. + * RETURNS + * set start time success or not. + * RETURN VALUES + * VM_AUDIO_SUCCEED : set time success. + * others : set time failed. +*****************************************************************************/ +VMINT vm_audio_mixed_set_start_time(VMINT handle, VMUINT start_time); + + +/***************************************************************************** + * FUNCTION + * vm_audio_mixed_get_time + * DESCRIPTION + * get current play time. + * PARAMETERS + * handle : [IN] audio handle, get from vm_audio_mixed_open + * current_time : [OUT] play time. + * RETURNS + * get play time success or not. + * RETURN VALUES + * VM_AUDIO_SUCCEED : get time success. + * others : get time failed. +*****************************************************************************/ +VMINT vm_audio_mixed_get_time(VMINT handle, VMUINT *current_time); + +/***************************************************************************** + * FUNCTION + * vm_audio_mixed_stop + * DESCRIPTION + * stop the opened audio. + * PARAMETERS + * handle : [IN] audio handle, get from vm_audio_mixed_open + * RETURNS +*****************************************************************************/ +void vm_audio_mixed_stop(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_audio_mixed_close + * DESCRIPTION + * close the opened audio. + * PARAMETERS + * handle : [IN] audio handle, get from vm_audio_mixed_open + * RETURNS +*****************************************************************************/ +void vm_audio_mixed_close(VMINT handle); + + +/***************************************************************************** + * FUNCTION + * vm_audio_mixed_close_all + * DESCRIPTION + * close all opened mixed audio. + * EXAMPLE +*****************************************************************************/ +void vm_audio_mixed_close_all(void); + + +/***************************************************************************** + * FUNCTION + * vm_audio_register_interrupt_callback + * DESCRIPTION + * register interrupt callback, when audio was interrupted it will invoke this callback + * PARAMETERS + * callback : [IN] callback function pointer + * RETURNS + * handle of the app + * RETURN VALUES + * 0 : error + * other : handle of the app +*****************************************************************************/ +VMINT vm_audio_register_interrupt_callback(vm_audio_result_callback callback); + + +/***************************************************************************** + * FUNCTION + * vm_audio_clear_interrupt_callback + * DESCRIPTION + * clear interrupt callback + * PARAMETERS + * handle : [IN] get from vm_audio_register_interrupt_callback + * RETURNS + * +*****************************************************************************/ +void vm_audio_clear_interrupt_callback(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_audio_play_beep + * DESCRIPTION + * when other app use audio play, application can use this to play notification tone + * PARAMETERS + * + * RETURNS + * +*****************************************************************************/ +void vm_audio_play_beep(void); + + +/***************************************************************************** + * FUNCTION + * vm_audio_is_app_playing + * DESCRIPTION + * this is to check if there is other applications are palying + * PARAMETERS + * + * RETURNS + * TRUE: other application is playing + * FLASE: no there is palying +*****************************************************************************/ +VMBOOL vm_audio_is_app_playing(void); + + +/***************************************************************************** + * FUNCTION + * vm_audio_terminate_background_play + * DESCRIPTION + * terminate background play , if the LINKIT appliction is audio player, please use it. + * PARAMETERS +*****************************************************************************/ +void vm_audio_terminate_background_play(void); + + +/***************************************************************************** + * FUNCTION + * vm_get_volume + * DESCRIPTION + * get current volume + * PARAMETERS + * + * RETURNS + * volume value + * +*****************************************************************************/ +VMINT vm_get_volume(void); + + +/***************************************************************************** + * FUNCTION + * vm_audio_is_calling + * DESCRIPTION + * quer is calling now + * PARAMETERS + * + * RETURNS + * TRUE or FALSE + * +*****************************************************************************/ +VMINT vm_audio_is_calling(void); + + +/***************************************************************************** + * FUNCTION + * vm_audio_set_volume_type + * DESCRIPTION + * set volume type, media or ring, media only cosmos project support + * PARAMETERS + * type 0-ring 1-media + * RETURNS + * TRUE or FALSE + * +*****************************************************************************/ +VMINT vm_audio_set_volume_type(VMINT type); + +/***************************************************************************** + * FUNCTION + * vm_audio_set_sph_volume + * DESCRIPTION + * set speech volume + * PARAMETERS + * volume + * RETURNS + * +*****************************************************************************/ +void vm_audio_set_sph_volume(VMINT volume); + +/***************************************************************************** + * FUNCTION + * vm_audio_get_sph_mode_volume + * DESCRIPTION + * get speech volume + * PARAMETERS + * void + * RETURNS + * volume value +*****************************************************************************/ +VMINT vm_audio_get_sph_mode_volume(void); + +#ifdef __cplusplus +} +#endif + +#endif /* VMMM_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmmms.h b/hardware/arduino/mtk/system/libmtk/include/vmmms.h new file mode 100644 index 00000000..c94b385f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmmms.h @@ -0,0 +1,1183 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMMMS_SDK_H +#define VMMMS_SDK_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/** + *maxium length of xml file path, including '\0' + */ +#define MAX_MMS_APP_NAME_LEN 100 + +/*Max length of address MMS adaptor supports*/ +#define VM_MMS_MAX_ADDR_LEN 128 +/*Max length of subbject MMS adaptor supports*/ +#define VM_MMS_MAX_SUBJECT_LEN 41 + +#define VM_MMS_MSG_ID_LIST_LEN 100 +typedef enum +{ + VM_MMS_CANCEL = -3, /*user cancelled sending*/ + VM_MMS_FAIL = -2, /*operation request error*/ + VM_MMS_MEMORY_NOT_ENOUGH = -1, /*not enough memory*/ + VM_MMS_SUCCESS /*operation successfully*/ + }vm_mms_result_enum; + +typedef enum +{ + VM_MMS_TYPE_SMIL_MMS = 0, /*SMIL type of XML */ + VM_MMS_TYPE_MIXED_MMS /*MIXED type of XML */ +}vm_mms_type_enum; + +typedef enum +{ + VM_MMS_SIM_ID_SIM1 = 0x01, /*sim1 card */ + VM_MMS_SIM_ID_SIM2 = 0x02, /*sim2 card */ + VM_MMS_SIM_ID_SIM3 = 0x04, /*sim3 card */ + VM_MMS_SIM_ID_SIM4 = 0x08, /*sim4 card */ +}vm_mms_sim_id_enum; + +typedef struct +{ + VMUWCHAR xml_filepath[MAX_MMS_APP_NAME_LEN];/*XML file path*/ + VMUINT xml_size; /*XML file size*/ + VMUINT8 mms_type; /*refer to vm_mms_type_enum*/ + VMUINT8 sim_id; /*refer to vm_mms_sim_id_enum*/ +}vm_send_mms_req_t; + +typedef enum +{ + VM_MMS_ADDR_PHONE_NUM = 0, + VM_MMS_ADDR_EMAIL, + VM_MMS_ADDR_IP +}vm_mms_addr_type_enum; + + + +typedef enum +{ + VM_EVT_ID_MMS_NEW_MSG, + VM_EVT_ID_MMS_MAX_ENUM +}vm_mms_event_enum; + + +/* This enum is used to specify MMS contains only one media type objects. */ +typedef enum +{ + VM_MMS_MEDIA_MSG_NONE = 0, /* Not specified */ + VM_MMS_MEDIA_MSG_TEXT, /* Text MMS: One MMS only contains text object */ + VM_MMS_MEDIA_MSG_AUDIO, /* Audio MMS: One MMS only contains audio object */ + VM_MMS_MEDIA_MSG_PHOTO, /* Photo MMS: One MMS only contains image object */ + VM_MMS_MEDIA_MSG_VIDEO /* Video MMS: One MMS only contains video object */ +} vm_mms_media_msg_enum; + + +/* This enum is used to specify message type. */ +typedef enum +{ + VM_MMS_MSG_TYPE_NOTIFICATION, /* MMS notification */ + VM_MMS_MSG_TYPE_DELIVERY_REPORT, /* MMS delivery report */ + VM_MMS_MSG_TYPE_READ_REPORT, /* MMS read report v1.1 */ + VM_MMS_MSG_TYPE_MMS, /* normal MMS message */ + VM_MMS_MSG_TYPE_JAVA, /* Java MMS */ + VM_MMS_MSG_TYPE_TEMPLATE, /* MMS template */ + VM_MMS_MSG_TYPE_POSTCARD, /* MMS postcard */ + VM_MMS_MSG_TYPE_UNSUPPORTED +}vm_mms_msg_type_enum; + +typedef enum +{ + VM_MMS_MSG_STORAGE_NONE = 0X00, + VM_MMS_MSG_STORAGE_PHONE = 0X01, + VM_MMS_MSG_STORAGE_CARD1 = 0X02, + VM_MMS_MSG_STORAGE_TOTAL = 0X03 +} vm_mms_msg_storage_type_enum; + +/* This enum is used to specify MMS folder. */ +typedef enum +{ + VM_MMS_FOLDER_NONE = 0x0, + VM_MMS_FOLDER_INBOX = 0x1, + VM_MMS_FOLDER_OUTBOX = 0x2, + VM_MMS_FOLDER_SENT = 0x4, + VM_MMS_FOLDER_DRAFT = 0x8, + VM_MMS_FOLDER_TEMPLATE = 0x10, /* This folder is for predefined MMS template */ + VM_MMS_FOLDER_USRDEF_TEMPLATE = 0x20, /* This folder is for user to save MMS as template */ + VM_MMS_FOLDER_ARCHIVE = 0x40, + VM_MMS_FOLDER_HIDDEN = 0x80, + VM_MMS_FOLDER_REPORT_BOX = 0x100, +}vm_mms_folder_enum; +typedef enum +{ + VM_MMS_RESULT_OK, /* 0 */ + VM_RESULT_DELAYED, /* 1 */ + VM_RESULT_CONTINUE, /* 2 */ + VM_RESULT_FAIL, /* 3 */ + VM_RESULT_FAIL_IN_CALL, /* 4 */ + VM_RESULT_FAIL_NOT_READY, /* 5 */ + VM_RESULT_FAIL_BUSY, /* 6 */ + VM_RESULT_FAIL_INSUFFICIENT_MEMORY, /* 7 */ + VM_RESULT_FAIL_INSUFFICIENT_STORAGE, /* 8 */ + VM_RESULT_FAIL_MAX_MSG_NUM_REACHED, /* 9 */ + VM_RESULT_FAIL_MAX_MSG_SIZE_REACHED, /* 10 */ + VM_RESULT_FAIL_MAX_SLIDE_NUM_REACHED, /* 11 */ + VM_RESULT_FAIL_MAX_ATTACHMENT_NUM_REACHED, /* 12 */ + VM_RESULT_FAIL_FILE_EMPTY, /* 13 */ + VM_RESULT_FAIL_FILE_NOT_FOUND, /* 14 */ + VM_RESULT_FAIL_FILE_CORRUPTED, /* 15 */ + VM_RESULT_FAIL_FILE_IN_USE, /* 16 */ + VM_RESULT_FAIL_FILE_IO, /* 17 */ + VM_RESULT_FAIL_FOLDER_NOT_FOUND, /* 18 */ + VM_RESULT_FAIL_UNSUPPORT_CONTENT, /* 19 */ + VM_RESULT_FAIL_COMM_UNSUPPORT_CONTENT, /* 20 */ + VM_RESULT_FAIL_COMM_CONFIG_ERROR, /* 21 */ + VM_RESULT_FAIL_COMM_CONNECT_ERROR, /* 22 */ + VM_RESULT_FAIL_COMM_SERVER_ERROR, /* 23 */ + VM_RESULT_FAIL_COMM_SERVER_TIMEOUT, /* 24 */ + VM_RESULT_FAIL_COMM_SERVICE_DENIED, /* 25 */ + VM_RESULT_FAIL_COMM_UNKNOWN_APN, /* 26 */ + VM_RESULT_FAIL_COMM_UNAUTHORIZED, /* 27 */ + VM_RESULT_FAIL_USER_CANCEL, /* 28 */ + VM_RESULT_FAIL_INVALID_PARAMETER, /* 29 */ + VM_RESULT_FAIL_INVALID_MSGID, /* 30 */ + VM_RESULT_FAIL_INVALID_FOLDER, /* 31 */ + VM_RESULT_FAIL_QUEUE_FULL, /* 32 */ + VM_RESULT_FAIL_PARSE, /* 33 */ + VM_RESULT_FAIL_MSGID_IS_USING, /* 34 */ + VM_RESULT_FAIL_CREATION_MODE_MAX_MSG_SIZE_REACHED, /* 35 */ + VM_RESULT_FAIL_UPDATE_CHECKSUM_INVALID_PARAM, /* 36 */ + VM_RESULT_FAIL_IN_USB_MODE, /* 37 */ + VM_RESULT_FAIL_FILE_ACCESS_IN_USB_MODE, /* 38 */ + VM_RESULT_FAIL_TERMINATING, /* 39 */ + VM_RESULT_FAIL_USERDEF_TEMPLATE_FULL, /* 40 */ + VM_RESULT_FAIL_WAP_CONN_MAX_MSG_SIZE_REACHED, /* 41 */ + VM_RESULT_OK_WITH_WARNING_CONTENT, /* 42 */ + VM_RESULT_ABORTED, /* 43 */ + VM_RESULT_FAIL_SUSPENDED_MODE, /* 44 */ + VM_RESULT_FAIL_MSG_EXPIRED, /* 45 */ + VM_RESULT_FAIL_IN_VIDEO_CALL, /* 46 */ + VM_RESULT_FAIL_IMAGE_TOO_LARGE, /* 47 */ + VM_RESULT_FAIL_MEM_CARD_NOT_PRESENT, /* 48 */ + VM_RESULT_FAIL_MEM_CARD_NOT_PRESENT_USE_PHONE, /* 49 */ + VM_RESULT_FAIL_MEM_CARD_NOT_PRESENT_INSERT_CARD, /* 50 */ + VM_RESULT_FAIL_MAX_MSG_REACHED_ON_PHONE_MEMORY, /* 51 */ + VM_RESULT_FAIL_MAX_MSG_REACHED_ON_MEM_CARD, /* 52 */ + VM_RESULT_FAIL_MEM_CARD_PLUG_OUT, /* 53 */ + VM_RESULT_FAIL_UNSUPPORT_MMS_TYPE, + VM_RESULT_FAIL_ROOT_DIR_FULL, + /*NEW ADDED AS REMOVAL OF SLS*/ + VM_SMIL_RESULT_SMIL_NOT_CREATED, + VM_SMIL_RESULT_MISSING_MEDIA_OBJECTS, + VM_SMIL_RESULT_MISSING_MEDIA_OBJECT_SRC, + VM_RESULT_END +}vm_result_enum; + +/* This enum is used to specify MMS folder. */ +typedef enum +{ + VM_FOLDER_NONE = 0x0, + VM_FOLDER_INBOX = 0x1, + VM_FOLDER_OUTBOX = 0x2, + VM_FOLDER_SENT = 0x4, + VM_FOLDER_DRAFT = 0x8, + VM_FOLDER_TEMPLATE = 0x10, /* This folder is for predefined MMS template */ + VM_FOLDER_USRDEF_TEMPLATE = 0x20, /* This folder is for user to save MMS as template */ + VM_FOLDER_ARCHIVE = 0x40, + VM_FOLDER_HIDDEN = 0x80, + VM_FOLDER_REPORT_BOX = 0x100, + VM_FOLDER_ALL = 0xFFFF +}vm_folder_enum; + +/* This enum is used to specify MMS creation mode. */ +typedef enum +{ + VM_CREATION_MODE_FREE, /* Creation mode: Free*/ + VM_CREATION_MODE_RESTRICTED, /* Creation mode: Restricted */ + VM_CREATION_MODE_WARNING /* Creation mode: Warning*/ +}vm_creation_mode_enum; + +/* This enum is used to specify the MMS priority. */ +typedef enum +{ + VM_PRIORITY_NOT_SET, /*Prority is not defined */ + VM_PRIORITY_LOW, /*Prority is low */ + VM_PRIORITY_MEDIUM, /*Prority is medium */ + VM_PRIORITY_HIGH /*Prority is high */ +}vm_priority_enum; + +/* This enum is used to specify MMS expiry time. Count by seconds*/ +typedef enum +{ + VM_EXPIRY_NOT_SET = 0, /* epxiry time is not defined */ + VM_EXPIRY_1_HOUR = 3600, /* epxiry time is 1 hour */ + VM_EXPIRY_6_HOURS = 21600, /* epxiry time is 6 hours */ + VM_EXPIRY_12_HOURS = 43200, /* epxiry time is 12 hours */ + VM_EXPIRY_1_DAY = 86400, /* epxiry time is 1 day */ + VM_EXPIRY_1_WEEK = 604800, /* epxiry time is 1 week */ + VM_EXPIRY_MAX = 0 /* epxiry time is not defined */ +}vm_expiry_time_enum; + +/* This enum is used to specify MMS delivery time. */ +typedef enum +{ + VM_DELIVERY_NOT_SET = 0, /* delivery time is not defined */ + VM_DELIVERY_IMMEDIATE = 0, /* delivery time is 0 hour */ + VM_DELIVERY_1_HOUR = 3600, /* delivery time is 1 hours */ + VM_DELIVERY_2_HOUR = 7200, /* delivery time is 2 hours */ + VM_DELIVERY_12_HOURS = 43200, /* delivery time is 12 hours */ + VM_DELIVERY_24_HOURS = 86400 /* delivery time is 1 day */ +}vm_delivery_time_enum; + +/* This enum is used to specify the MMS header field type. */ +typedef enum +{ + VM_HEADER_UNKNOWN, /* Unknowm */ + VM_HEADER_ADDRESS, /* Address */ + VM_HEADER_SUBJECT /* Subject */ +}vm_header_attr_enum; + +/* This enum is used to specify the media type which the object will be inserted as. */ +typedef enum +{ + VM_INSERT_UNKNOWN, /* Unknown */ + VM_INSERT_TEXT, /* Text */ + VM_INSERT_IMAGE, /* image */ + VM_INSERT_AUDIO, /* audio */ + VM_INSERT_VIDEO, /* video */ + VM_INSERT_REF, /* object embeded in tag */ + VM_INSERT_ATTACHMENT /* attachment */ +}vm_insert_type_enum; + +/*This enum is used to specify the DRM type.*/ +typedef enum +{ + VM_DRM_NONE, /*Not DRM object*/ + VM_DRM_FL_CD, /* forward-lock or combined delivery */ + VM_DRM_SD, /* seperate-delivery */ + VM_DRM_SD_NO_RIGHT, /* Separate-delivery object without right */ + VM_DRM_PDCF_V2, /* DRM v2.0 PDCF or V2 object */ + VM_DRM_PDCF_V2_NO_RIGHT, /* DRM v2.0 PDCF or V2 object without right */ + VM_DRM_TYPE_TOTAL +}vm_drm_type_enum; + +/*This enum is used to specify slide layout.*/ +typedef enum +{ + VM_LAYOUT_NONE, /* No relative layout specification */ + VM_LAYOUT_IMAGE_ON_TOP, /* Image on top; text on bottom */ + VM_LAYOUT_TEXT_ON_TOP, /* Text on top; image on bottom */ + VM_LAYOUT_IMAGE_AT_LEFT, /* Image at left; text at right */ + VM_LAYOUT_TEXT_AT_LEFT /* Text at left; image at right */ +}vm_slide_layout_enum; + +/* This enum is used to specify connection type. */ +typedef enum +{ + VM_CONN_TYPE_HTTP_PROXY, /* HTTP connection with proxy */ + VM_CONN_TYPE_HTTP_DIRECT, /* HTTP connection without proxy */ + VM_CONN_TYPE_WSP_CL, /* WSP connectionless */ + VM_CONN_TYPE_WSP_CO, /* WSP connection oriented */ + VM_CONN_TYPE_WSP_SEC_CL, /* WSP connectionless with security */ + VM_CONN_TYPE_WSP_SEC_CO /* WSP connection oriented with security */ +}vm_connection_type_enum; + +/* This enum is used to specify 'text style' like bold and italic. Also, these two are mutually exclusive. */ +typedef enum +{ + VM_TEXT_STYLE_BOLD = 0x01, /* Bold text */ + VM_TEXT_STYLE_ITALIC = 0x02 /* Italic text */ +}vm_text_style_enum; + +/* This enum is used to specify 'text size */ +typedef enum +{ + VM_TEXT_SIZE_SMALL = 1, /* Small text */ + VM_TEXT_SIZE_MEDIUM, /* Medium text */ + VM_TEXT_SIZE_LARGE /* Large text */ +}vm_text_size_enum; + +/* This enum is used to specify address group type. */ +typedef enum +{ + VM_ADDRESS_GROUP_TYPE_TO, + VM_ADDRESS_GROUP_TYPE_CC, + VM_ADDRESS_GROUP_TYPE_BCC, + VM_ADDRESS_GROUP_TYPE_FROM, + VM_ADDRESS_GROUP_TYPE_TOTAL_NUM +} vm_address_group_type_enum; + +/* This enum is used to specify address type. */ +typedef enum +{ + VM_ADDR_TYPE_NONE, /* Unknown */ + VM_ADDR_TYPE_PHONE_NUMBER, /* Phone number */ + VM_ADDR_TYPE_EMAIL, /* Email */ + VM_ADDR_TYPE_IPV4 /* IPv4 */ +}vm_addr_type_enum; + +/* This enum is used to specify message class. */ +typedef enum +{ + VM_MSG_CLASS_NOT_SET, + VM_MSG_CLASS_PERSONAL, /* MMS message is created by person */ + VM_MSG_CLASS_ADVERTISEMENT, /* MMS message is for advertisement */ + VM_MSG_CLASS_INFORMATIONAL, /* MMS message is for informational */ + VM_MSG_CLASS_AUTO /* MMS message is created automatically */ +}vm_msg_class_enum; + +/* This enum is used to specify message type. */ +typedef enum +{ + VM_MSG_TYPE_NOTIFICATION, /* MMS notification */ + VM_MSG_TYPE_DELIVERY_REPORT, /* MMS delivery report */ + VM_MSG_TYPE_READ_REPORT, /* MMS read report v1.1 */ + VM_MSG_TYPE_MMS, /* normal MMS message */ + VM_MSG_TYPE_JAVA, /* Java MMS */ + VM_MSG_TYPE_TEMPLATE, /* MMS template */ + VM_MSG_TYPE_POSTCARD, /* MMS postcard */ + VM_MSG_TYPE_UNSUPPORTED +}vm_msg_type_enum; + +/* This enum is used to specify message status.*/ +typedef enum +{ + VM_MSG_STATUS_WAITING_SENDING, /* The status is for msg in outbox */ + VM_MSG_STATUS_SENDING, /* The status is for msg in outbox */ + VM_MSG_STATUS_WAITING_DOWNLOADING, /* The status is for msg in inbox folder */ + VM_MSG_STATUS_DOWNLOADING, /* The status is for msg in inbox folder */ + VM_MSG_STATUS_NORMAL, /* It is for template, draft, received MMS, delivery report and read report. */ + VM_MSG_STATUS_FAILED /* The status is for msg in sent or inbox folder. In case of inbox folder, the msg shall be mms notification. */ +}vm_msg_status_enum; + +/* This enum is used to specify retrieval mode. */ +typedef enum +{ + VM_RETRIEVAL_MODE_IMMED, /* Immediate retrieval */ + VM_RETRIEVAL_MODE_DEFERRED, /* delayed retrieval */ + VM_RETRIEVAL_MODE_REJECT, /* Reject to retrieve MMS message */ + VM_RETRIEVAL_MODE_AS_HOME /* Same as setting in home network */ +}vm_retrieval_mode_enum; + +/* This enum is used to specify delivery report status (value refer to X-Mms-Status header field). */ +typedef enum +{ + VM_DR_STATUS_PENDING = 0, + VM_DR_STATUS_EXPIRED = 0x80, /* MMS is expired */ + VM_DR_STATUS_RETRIEVED = 0x81, /* MMS is retrieved */ + VM_DR_STATUS_REJECTED = 0x82, /* MMS is rejected */ + VM_DR_STATUS_DEFERRED = 0x83, /* MMS is defered */ + VM_DR_STATUS_UNRECOGNISED = 0x84, /* MMS is unrecognized */ + VM_DR_STATUS_INDETERMINATE = 0x85, /* MMS is indeterminate */ + VM_DR_STATUS_FORWARDED = 0x86, /* MMS is forwarded */ + VM_DR_STATUS_UNREACHABLE = 0x87 /* MMS is unreachable */ +}vm_dr_status_enum; + +/*This enum is used to specify read report status (value refer to X-Mms-Read-Status header field).*/ +typedef enum +{ + VM_RR_STATUS_PENDING = 0, + VM_RR_STATUS_READ = 0x80, /* MMS is read */ + VM_RR_STATUS_DELETED_NO_READ = 0x81 /* MMS is deleted without reading */ +}vm_rr_status_enum; + +/* This enum is used to specify MMS version (value refer to X-Mms-MMS-Version). */ +typedef enum +{ + VM_VERSION_10 = 0x10, /* MMS V1.0 */ + VM_VERSION_11 = 0x11, /* MMS V1.1 */ + VM_VERSION_12 = 0x12 /* MMS V1.2 */ +}vm_version_enum; + +/* This enum is used to specify region fit parameter. */ +typedef enum +{ + VM_REGION_FIT_NONE, /* Not specified */ + VM_REGION_FIT_MEET, /* Scale the object so that its aspect ratio is kept, and it is stays fully visible */ + VM_REGION_FIT_SCROLL, /* Scale the object so that its aspect ratio is kept, and some parts are cropped */ + VM_REGION_FIT_HIDDEN, /* Do not resize the media object, but fill the box with the background color, or crop the object */ + VM_REGION_FIT_FILL, /* Resize the media object so that it fills the width and height defined in the SMIL document */ + VM_REGION_FIT_SLICE /* Add a scrolling mechanism if the object exceeds the box */ +}vm_region_fit_enum; + +/* This enum is used to specify text encoding charset (value refer to IANA MIBEnum).*/ +typedef enum +{ + VM_CHARSET_UNKNOWN = 0, /* Not specified */ + VM_CHARSET_ASCII = 3, /* ASCII */ + VM_CHARSET_ISO_8859_1 = 4, /* ISO 8859-1 */ + VM_CHARSET_UTF8 = 106, /* UFT8 */ + VM_CHARSET_UCS2 = 1000, /* UCS2 */ + VM_CHARSET_UTF16BE = 1013, /* UTF16BE */ + VM_CHARSET_UTF16LE = 1014, /* UTF16LE */ + VM_CHARSET_UTF16 = 1015, /* UTF16 */ + VM_CHARSET_GB2312 = 2025, /* GB2312 */ + VM_CHARSET_BIG5 = 2026 /* BIG5 */ +}vm_charset_enum; + +/* This enum is used to specify UC filter mode. */ +typedef enum +{ + VM_UC_FILTER_MODE_AUDIO_OPEN_MODE, /*audio type when creation mode is free*/ + VM_UC_FILTER_MODE_IMAGE_OPEN_MODE, /*image type when creation mode is free*/ + VM_UC_FILTER_MODE_TEXT_OPEN_MODE, /*text type when creation mode is free*/ + VM_UC_FILTER_MODE_VIDEO_OPEN_MODE, /*video type when creation mode is free*/ + VM_UC_FILTER_MODE_ATTACHMENT_OPEN_MODE, /*image type when creation mode is free*/ + VM_UC_FILTER_MODE_AUDIO_RESTRICTED_MODE, /*audio type when creation mode is restricted*/ + VM_UC_FILTER_MODE_IMAGE_RESTRICTED_MODE, /*image type when creation mode is restricted*/ + VM_UC_FILTER_MODE_TEXT_RESTRICTED_MODE, /*text type when creation mode is restricted*/ + VM_UC_FILTER_MODE_VIDEO_RESTRICTED_MODE, /*video type when creation mode is restricted*/ + VM_UC_FILTER_MODE_ATTACHMENT_RESTRICTED_MODE /*image type when creation mode is restricted*/ +}vm_uc_filter_mode_enum; + +/* This enum is used to specify UC filter mode. */ +typedef enum +{ + VM_EVENT_NEW_MSG, /* For new message */ + VM_EVENT_DELETE_MSG, /* When one message is deleted. Send after delete. */ + VM_EVENT_SAVE_MSG, /* When one message is saved to another folder. Send after saved. */ + VM_EVENT_DELETE_FOLDER, /* Send before delete a folder */ + VM_EVENT_UM_DELETE_FOLDER_DONE, /* Send after MMA finish deleting folder */ + VM_EVENT_TOTAL +}vm_event_enum; + +/* This enum is used to specify MMS contains only one media type objects. */ +typedef enum +{ + VM_MEDIA_MSG_NONE = 0, /* Not specified */ + VM_MEDIA_MSG_TEXT, /* Text MMS: One MMS only contains text object */ + VM_MEDIA_MSG_AUDIO, /* Audio MMS: One MMS only contains audio object */ + VM_MEDIA_MSG_PHOTO, /* Photo MMS: One MMS only contains image object */ + VM_MEDIA_MSG_VIDEO /* Video MMS: One MMS only contains video object */ +} vm_media_msg_enum; + + +/* This enum is used to specify MMS sending size limit */ +typedef enum +{ + VM_SETTING_SIZE_LIMIT_100 = 102400, /* 100KB */ + VM_SETTING_SIZE_LIMIT_300 = 307200, /* 300KB */ + VM_SETTING_SIZE_LIMIT_600 = 614400, /* 600KB */ + VM_SETTING_SIZE_LIMIT_MAX +}vm_setting_size_limit_enum; + +typedef enum +{ + VM_TRUNCATED_ATTACHMENT = 0X01, + VM_TRUNCATED_SLIDE = 0X02, + VM_TRUNCATE_TEXT = 0X04, + VM_TRUNCATED_TOTAL = 0XFF +}vm_content_truncated_enum; + + +typedef enum +{ + VM_MSG_STORAGE_NONE = 0X00, + VM_MSG_STORAGE_PHONE = 0X01, + VM_MSG_STORAGE_CARD1 = 0X02, + VM_MSG_STORAGE_TOTAL = 0X03 +} vm_msg_storage_type_enum; + +typedef enum +{ + VM_MMS_STORAGE_ACTION_COPY_MMS, + VM_MMS_STORAGE_ACTION_MOVE_MMS, + VM_MMS_STORAGE_ACTION_TOTAL +}vm_mms_storage_action_type_enum; + +/* This enum is used to specify delivery report status (value refer to X-Mms-Status header field). */ +typedef enum +{ + VM_MSG_ICON_STATUS_NONE = 0, + VM_MSG_ICON_STATUS_WAITING_FOR_SEND, /* MMS status is waiting sending */ + VM_MSG_ICON_STATUS_SENDING, /* MMS status is sending */ + VM_MSG_ICON_STATUS_SEND_FAIL, /* MMS status is send failed */ + VM_MSG_ICON_STATUS_POSTPONE_FOR_SEND, /* MMS status is defered to send*/ + VM_MSG_ICON_STATUS_CORRUPTED_MMS, /* MMS status is corrupted mms*/ + VM_MSG_ICON_STATUS_JAVA_MMS, /* MMS status is JAVA mms */ + VM_MSG_ICON_STATUS_PRIO_HIGH_MMS, /* MMS status is high priority MMS */ + VM_MSG_ICON_STATUS_PRIO_LOW_MMS, /* MMS status is low priority MMS */ + VM_MSG_ICON_STATUS_PRIO_MED_MMS, /* MMS status is Medium/default priority MMS */ + VM_MSG_ICON_STATUS_DR_MMS, /* MMS status is Delivery Report */ + VM_MSG_ICON_STATUS_RR_MMS, /* MMS status is Read Report */ + VM_MSG_ICON_STATUS_DRAFT_MMS, /* MMS status is draft/Normal MMS */ + VM_MSG_ICON_STATUS_NOTIFICATION_MMS, /* MMS status is Notification */ + VM_MSG_ICON_TOTAL_MAX_STATUS /* Total MAX MMS status */ +}vm_msg_icon_status_enum; + + +typedef enum +{ + VM_MMS_FROM_ADDRESS_PRESENT = 128, /*!< The address is added by the client */ + VM_MMS_FROM_INSERT_ADDRESS = 129 /*!< The address is added by the server */ +} vm_mms_from_type_enum; + + +typedef enum +{ + VM_MMS_TIME_ABSOLUTE = 128, + VM_MMS_TIME_RELATIVE = 129 +} vm_mms_time_type_enum; + + +typedef enum +{ + VM_MMS_READ_REPLY_NOT_SET = 0, + VM_MMS_READ_REPLY_YES = 128, /*!< Read reply is requested. */ + VM_MMS_READ_REPLY_NO = 129 /*!< Read reply is not requested. */ +} vm_mms_read_reply_enum; + + +typedef enum +{ + VM_MMS_DELIVERY_REPORT_NOT_SET = 0, + VM_MMS_DELIVERY_REPORT_YES = 128, /*!< Delivery report is requested. */ + VM_MMS_DELIVERY_REPORT_NO = 129 /*!< Delivery report is not requested. */ +} vm_mms_delivery_report_enum; + + +typedef enum +{ + VM_MMS_SENDER_VISIBILITY_NOT_SET = 0, /*!< Show unless sender has secret address*/ + VM_MMS_SENDER_HIDE = 128, /*!< Don't show the address. */ + VM_MMS_SENDER_SHOW = 129 /*!< Show even secret address. */ +} vm_mms_sender_visibility_enum; + + +typedef enum +{ + VM_MMS_OBJECT_TYPE_IMAGE, + VM_MMS_OBJECT_TYPE_AUDIO, + VM_MMS_OBJECT_TYPE_VIDEO, + VM_MMS_OBJECT_TYPE_TEXT, + VM_MMS_OBJECT_TYPE_ATTACHMENT, + VM_MMS_OBJECT_TYPE_REF, /*needed by UC*/ + VM_MMS_OBJECT_TYPE_UNKNOWN, + VM_MMS_OBJECT_TYPE_MAX +} vm_mms_viewer_object_type_enum; + +/* This enum is used to define UC current state of operation. It will be need to set when launch UC. As each state have different type of flow. */ +typedef enum +{ + VM_MMS_STATE_WRITE_NEW_MSG, /* Writing new msg state. */ + VM_MMS_STATE_EDIT_EXISTED_MSG, /* Edit existing msg state. */ + VM_MMS_STATE_FORWARD, /* Forward existing msg state. Only for inbox and sent box msgs. */ + VM_MMS_STATE_SEND, /* Send existing msg state. Only for outbox and draft box msgs. */ + VM_MMS_STATE_REPLY, /* Reply existing msg state. */ + VM_MMS_STATE_REPLY_ALL, /* Reply all existing msg state. */ + VM_MMS_STATE_TOTAL_NUM /* Max number of msg states in UC. */ +} vm_mms_state_enum; + +/* This enum is used to specify the group types of addresses. */ +typedef enum +{ + VM_MMS_ADDRESS_GROUP_TYPE_TO, /* To group. */ + VM_MMS_ADDRESS_GROUP_TYPE_CC, /* Cc group. */ + VM_MMS_ADDRESS_GROUP_TYPE_BCC, /* Bcc group. */ + VM_MMS_ADDRESS_GROUP_TYPE_FROM, /* From group. */ + VM_MMS_ADDRESS_GROUP_TYPE_TOTAL_NUM /* Max number of address group. */ +} vm_mms_address_group_type_enum; + + +typedef struct +{ + VMUINT msg_id; /* Message id */ + VMUINT msg_size; /* The size of message. Counted by byte */ + VMUINT user_elements_size; /* The size of MMS bodies and subject*/ + VMUINT date; /* The date field is in mms header of mms message. It should be given in seconds since 1.Jan. 1970 GMT. */ + VMUINT expiry_date; /* Expiration date. The format is in relative seconds value. */ + VMUINT received_date; /* Received date. This value is only valid for the received MMS message. */ + VMINT16 from_address[VM_MMS_MAX_ADDR_LEN]; /* SRV_MMS_MAX_ADDR_LEN From address of the MMS. Encoded by USC2 */ + VMINT16 subject[VM_MMS_MAX_SUBJECT_LEN]; /* SRV_MMS_MAX_SUBJECT_LEN Subject of the MMS. Encoded by USC2 */ + VMBOOL need_read_report; /* Specify if the MMS message require to send read report to sender. */ + VMBOOL isRead; /* Specify if the MMS message is already read. */ + VMBOOL isForwardLock; /* When MMS contain any DRM forward-lock or combine-delivery object, the value is KAL_TRUE. Because separate-delivery DRM object can be forwarded. */ + VMBOOL isDRM; /* When MMS contain any DRM object, the value is KAL_TRUE */ + VMBOOL isFollowPhoneMMSContentClass; /* Specify if the MMS follow handset content class */ + VMBOOL hasAttachment; /* Specify if the MMS message contain any attachment. */ + VMUINT8 result; /* 0 means success, other fail */ + VMUINT8 msg_media_type; /* vm_mms_media_msg_enum, media type , for no media=0,text=1,audio=2,photo=3,video=4 */ + VMUINT8 from_address_type; /* vm_mms_addr_type_enum, from address type,unknown=0,phone=1,email=2,IPV4=3 */ + VMUINT8 msg_type; /* vm_mms_msg_type_enum, message type Notification=0,DR=1,RR=2,MMS=3,JAVA=4,Template=5,postcard=6 */ + VMUINT8 storage_type; /* vm_mms_msg_storage_type_enum, storage type,phone=1,card=2*/ + VMUINT8 sim_id; /* vm_mms_sim_id_enum, sim ID SIM1=1 SIM2=2 SIM3=4 ,SIM4=8 */ +}vm_mms_msg_info; + +typedef struct +{ + VMINT sim; // sim card :1,2,3,4 + vm_mms_addr_type_enum addr_type; + VMWCHAR* addr; // address UCS2 + VMWCHAR* subject; //subject UCS2 + VMWCHAR* content; //content UCS2 + VMWCHAR* att_path; //attach_file +}vm_mms_launch_data; + +typedef struct +{ + VMINT result; //0 means success + VMINT msg_num; + VMINT msg_id_list[VM_MMS_MSG_ID_LIST_LEN]; +}vm_mms_get_msg_id_list_rsp; + +typedef struct vm_mms_addr_list_struct_t +{ + VMCHAR *address; + VMUINT8 addr_type; /*unused*/ + VMUINT8 group; /*unused*/ + + /*! Address for current element */ + // vm_mms_address_struct current; + struct vm_mms_addr_list_struct_t *prev; + /*! Next address list element or NULL if last element */ + struct vm_mms_addr_list_struct_t *next; + +} vm_mms_addr_list_struct; + +typedef struct +{ + VMUINT8 charset; /*unused */ + VMCHAR *text; /*!< Text buffer, must be NULL terminated */ +} vm_mms_encoded_text_struct; + +typedef struct +{ + VMUINT8 class_identifier; /*unused */ + VMCHAR *text_string; /*!< Textual representation of a message class */ +}vm_mms_msg_class_struct; + +typedef struct +{ + + VMUINT8 version;/*reserved*/ + + /*! [M] The address of the message sender. */ + vm_mms_addr_list_struct *from; + + /*! [O] The addressee of the message. The address field can contain one or + * several addresses. The parameter is a reference to a list + * containing the recipient addresses. One element in the list carries + * the address (PLMN or e-mail) and the text string representing the + * recipient real name (e.g. Joe User) to be used in multimedia + * messages. Please note that PLMN addresses cannot make use of real + * names. A message needs always at least one specified address in one + * of the to, cc or bcc field. + */ + VMUINT8 from_type; /*vm_mms_from_type_enum*/ + + + vm_mms_addr_list_struct *to; + + /*! [O] See To field. */ + vm_mms_addr_list_struct *cc; + + /*! [O] See To field. */ + vm_mms_addr_list_struct *bcc; + + /*! [O] The text string containing the subject of the message. See also + * configuration setting for the maximum length of this field in + * mms_cfg.h. + */ + vm_mms_encoded_text_struct subject; + + /*! [O] Arrival time (in seconds since 1970-01-01) of the message at the + * MMS Proxy-Relay. The MMS Proxy-Relay will generate this field if + * not supplied. + */ + VMUINT32 date; + + /*! [O] The message class field labels the message type as Auto, + * Informational or Advertisement. When the message class is not set + * the class will be interpreted as Personal at the recipient. It is + * recommended not to set this field in normal MMS Applications. + */ + vm_mms_msg_class_struct msg_class; + + + /*! [O] The type of expiry time, absolute or relative. Absolute means that + * an absolute time (in seconds since 1970-01-01) is given. Relative + * means that the server will add the given number of seconds to + * current time. + */ + VMUINT8 expiry_time_type;/*vm_mms_time_type_enum*/ + + /*! [O] Defines the time when the message will be removed from the + * recipient's MMS Proxy-Relay. If not set the maximum time will be + * used. The maximum value is dependent on the MMS Proxy-Relay. + */ + VMUINT32 expiry_time; + +//#ifdef MTK_TMP_PATCH /* TR 29894 */ + /*! [O] The type of delivery time, absolute or relative. Absolute means that + * an absolute time (in seconds since 1970-01-01) is given. Relative + * means that the server will add the given number of seconds to + * current time. + */ + VMUINT8 delivery_time_type;/*vm_mms_time_type_enum*/ +//#endif + + /*! [O] This time value indicates for the MMS Proxy-Relay when the message + * should be delivered to the recipient(s) at a later time. When this + * field is not set the message is delivered immediately. + */ + VMUINT32 delivery_time; + + /*! [O] This value defines the message priority. */ + VMUINT8 priority;/*vm_mms_priority_enum*/ + + /*! [O] This value is used to control if the "From" address is displayed + * in the message at the recipient's MMS Application. + */ + VMUINT8 visibility; /*vm_mms_sender_visibility_enum*/ + + /*! [O] This field is requesting the retrieving MMS Applications to send a + * read reply message when the message was read. Note; a retrieving + * MMS Application may cancel the request. A read reply message sent + * is seen as an ordinary message and the MMS Application controls + * the contents. + */ + VMUINT8 read_reply; /*vm_mms_read_reply_enum*/ + + /*! [O] The setting of this flag will cause the MMS Proxy-Relay to send + * back a notification message when the recipient retrieves the + * message. A retrieving MMS Application may prevent a Delivery + * Report from being sent. + */ + VMUINT8 delivery_report; /*vm_mms_delivery_report_enum*/ + + /*! [M] Id of the message. + * This field is only used when retrieving a message, NOT used when + * sending. + */ + VMUINT8 to_num; + + VMUINT8 cc_num; + + VMUINT8 bcc_num; + + VMUINT8 status; + + VMWCHAR reported_subject[VM_MMS_MAX_SUBJECT_LEN]; + VMCHAR *presentation; + VMCHAR *app_id; + VMCHAR *reply_app_id; + /*notif*/ + VMUINT32 download_size; + VMCHAR *content_location; + /*report*/ + VMUINT8 dr_status; + VMUINT8 rr_status; +} vm_mms_header_struct; + +typedef struct +{ + vm_mms_header_struct *header; /* used when parsing */ +} vm_mms_description_header_struct; + +typedef struct vm_mms_object_struct_t +{ + VMUINT32 size; + VMUINT32 offset; + VMUINT32 id; + VMUINT32 encoding; + VMUINT16 reference_count; + VMUINT32 charset; /*vm_charset_enum*/ + VMCHAR *file_path; + VMCHAR *file_name; + VMWCHAR *file_path_ucs; + VMWCHAR *file_name_ucs; + VMWCHAR *mime_type_ext; + VMUINT8 type; /*vm_mms_viewer_object_type_enum*/ + VMBOOL is_attachment; + VMBOOL is_virtual_file; + VMBOOL rights_expired; + VMBOOL is_restricted; + VMBOOL is_mixed_obj; + VMUINT8 drm_type; /*vm_drm_type_enum*/ + VMUINT8 drm_process_type; + VMCHAR *mime_str; + + VMUINT32 drm_ext[5];//SRV_FMGR_PATH_MAX_FILE_EXT_LEN defined in filemgrgprot.h + VMCHAR *drm_mime_type; + VMUINT32 consume_id; + VMUINT32 drm_offset; + VMUINT32 drm_size; + VMBOOL consume_only_timed; + VMBOOL is_drm_processed; + VMUINT8 mime_type;/*applib_mime_type_enum*/ + VMCHAR *content_id; // Used By JSR + VMCHAR *content_location; //USED by JSR + /*requested by ashok to process JSR message */ + VMCHAR *content_type; + VMUINT32 content_type_value; + VMUINT8 encoding_scheme; + VMBOOL auto_delete_file; + VMBOOL is_invallid; + struct vm_mms_object_struct_t *next; + struct vm_mms_object_struct_t *prev; +// #ifdef __DRM_SUPPORT__ +// drm_cid_struct *cid; +// #endif /* __DRM_SUPPORT__ */ +} vm_mms_object_struct; + +typedef struct +{ + VMUINT32 value; + VMUINT8 type;/*vm_mms_time_type_enum*/ +}vm_mms_type_value_struct; + +typedef struct +{ + vm_mms_type_value_struct x; + vm_mms_type_value_struct y; + vm_mms_type_value_struct w; + vm_mms_type_value_struct h; +} vm_mms_object_area_struct; + +typedef struct vm_mms_slide_object_struct_t +{ + vm_mms_object_struct *object; + VMUINT32 begin; + VMUINT32 end; + vm_mms_object_area_struct *region_area; + VMCHAR *alt; + VMUINT16 id; + struct vm_mms_slide_object_struct_t *next; +} vm_mms_slide_object_struct; + +typedef struct vm_mms_slide_text_object_struct_t +{ + vm_mms_object_struct *object; + VMUINT32 bg_color; + VMUINT32 fg_color; + VMUINT8 text_style;/*vm_text_style_enum*/ + VMUINT16 char_count; + VMUINT16 utf8_msg_len; + VMUINT16 extension_char_count; + VMUINT16 UCS2_count; + VMUINT8 text_size;/*vm_text_size_enum*/ + VMUINT32 begin; + VMUINT32 end; + VMCHAR *alt; + VMUINT16 id; + VMUINT16 str_id; + + vm_mms_object_area_struct *region_area; + + +}vm_mms_slide_text_object_struct; + +typedef struct vm_mms_slide_ref_object_struct_t +{ + vm_mms_object_struct *object; + VMUINT32 bg_color; + VMUINT32 fg_color; + VMUINT8 text_style;/*vm_text_style_enum*/ + VMUINT8 text_size;/*vm_text_size_enum*/ + VMUINT32 begin; + VMUINT32 end; + VMCHAR *alt; + VMUINT16 id; + vm_mms_object_area_struct *region_area; + struct vm_mms_slide_ref_object_struct_t *next; + struct vm_mms_slide_ref_object_struct_t *prev; +} vm_mms_slide_ref_object_struct; + +typedef struct vm_mms_slide_struct_t +{ + + struct vm_mms_slide_struct_t *prev; + vm_mms_slide_object_struct img; + vm_mms_slide_object_struct vid; + vm_mms_slide_object_struct aud; + vm_mms_slide_text_object_struct txt; + vm_mms_slide_ref_object_struct *ref_items; + VMUINT32 duration; + VMUINT16 slide_num; + struct vm_mms_slide_struct_t *next; +} vm_mms_slide_struct; + +typedef struct vm_mms_attachment_info_struct_t +{ + vm_mms_object_struct *object; + struct vm_mms_attachment_info_struct_t *next; + struct vm_mms_attachment_info_struct_t *prev; +} vm_mms_attachment_info_struct; + +typedef struct{ + vm_mms_slide_struct *slides; + vm_mms_object_struct *objects; + vm_mms_slide_struct *curr_slide; + vm_mms_object_struct *curr_object; + vm_mms_attachment_info_struct *attachment; + VMUINT32 slide_no; + VMUINT32 bgColor; + VMUINT32 fgColor; + VMUINT32 obj_no; + VMUINT32 total_attach_no; + VMUINT32 total_ref_no; + VMUINT16 total_address; + VMUINT8 layout;/*vm_slide_layout_enum*/ + VMUINT8 text_fit; /*vm_region_fit_enum*//* this one also insertion of regions in the main context */ + VMUINT8 image_fit; /*vm_region_fit_enum*//* this one also insertion of regions in the main context */ +}vm_mms_description_body_struct; + +typedef struct +{ + vm_mms_description_header_struct *header; /*new one to be used*/ + vm_mms_description_body_struct *body; +}vm_mms_description_struct; + +typedef struct +{ + VMUINT msg_id; /* Message id */ + VMUINT req_id; /* request id for get content rsp*/ + VMUINT mms_header_size; /* Size of MMS headers */ + VMUINT mms_body_size; /* Size of MMS bodies */ + VMBOOL isFollowPhoneMMSContentClass; /* Specify if the MMS follow handset content class */ + VMUINT8 app_id; /* unused*/ + VMUINT8 result; /* result OK=0 */ + VMUINT8 unused; /* Unused */ + vm_mms_description_struct *content_info; +}vm_mms_get_content_rsp_struct; + +typedef void (*vm_mms_get_content_callback_type)(vm_mms_get_content_rsp_struct *rsp_data, void *user_data); + +typedef struct +{ + VMUINT msg_id; /* Message id */ + void * user_data; /* Service will save this data and will return in callback*/ + vm_mms_get_content_callback_type callback;/* srv_mms_funcptr_type, Callback API which service will use to response back to caller Application*/ + VMUINT reserved; /*reserved*/ + VMUINT8 mode; /* vm_app_mode_enum, Content request mode edit=0 send=1 reply=2 replyall=3 forwward=4 upload=5 header=6 view=7 raw=8 abort=10 postcard=11 mixed=12 template=13 */ + VMUINT8 creation_mode; /* vm_creation_mode_enum, Creation mode to filter content.Free=0,restricted=1,Warning=2*/ +}vm_mms_get_content_req_struct; + +/***************************************************************************** + * + * FUNCTION + * vm_mms_interrupt_callback + * DESCRIPTION + * MMS interrupt callback function + * RETURN VALUES + * result : [IN] TRUE means deleted the MMS, othewise return FALSE +*****************************************************************************/ +typedef VMBOOL (*vm_mms_interrupt_callback)(vm_mms_msg_info* param, void* user_data); + + +/***************************************************************************** + * + * FUNCTION + * vm_mms_delete_callback + * DESCRIPTION + * MMS delete callback function + * RETURN VALUES + * +*****************************************************************************/ +typedef VMINT (*vm_mms_delete_callback)( + VMINT result, VMUINT* msg_id_list,VMINT* result_list,VMUINT num,void* user_data); + +/***************************************************************************** + * + * FUNCTION + * vm_mms_callback_type + * DESCRIPTION + * MMS callback function + * PARAMETERS + * result : [IN] refer to vm_mms_result_enum. +*****************************************************************************/ +typedef void (*vm_mms_callback_type)(VMINT result); + + +typedef void (*vm_mms_get_msg_id_list_callback_type)(vm_mms_get_msg_id_list_rsp *rsp_data, void *user_data); + + +/***************************************************************************** +* FUNCTION + * vm_mms_send_mms + * DESCRIPTION + * Send MMS. The result will be returned in callback. + * PARAMETERS + * req_ptr : [IN] MMS information to send, refer to vm_send_mms_req_t + * callback : [IN] callback function pointer. + * RETURNS + * send request successfully or failed. + * RETURN VALUES + * FALSE : failed to send request. + * TRUE : send request successfully. + * +*****************************************************************************/ +VMINT vm_mms_send_mms(vm_send_mms_req_t * req_ptr, vm_mms_callback_type callback); + +/***************************************************************************** +* FUNCTION + * vm_mms_cancel_send_mms + * DESCRIPTION + * Cancel the procedure of sending MMS. If the MMS has sent already and callback + * has been invoked or there is no sending function invoked before, this cancelling + * will be ignored. + * +*****************************************************************************/ +void vm_mms_cancel_send_mms(void); + +/***************************************************************************** +* FUNCTION + * vm_mms_launch + * DESCRIPTION + * launch native editor to edit mms + * PARAMETERS + * data : [IN] MMS info + * data_size : [IN] sizeof data + * RETURN VALUES + * 0 means success + * +*****************************************************************************/ +VMINT vm_mms_launch(vm_mms_launch_data* data, VMINT data_size); + +/***************************************************************************** +* FUNCTION + * vm_mms_set_interrupt_event_handler + * DESCRIPTION + * set handler to interrupt MMS + * PARAMETERS + * event : [IN] MMS event type + * callback : [IN] sizeof data + * user_data : [IN] user_data + * RETURN VALUES + * 0 means success + * +*****************************************************************************/ +VMINT vm_mms_set_interrupt_event_handler(vm_mms_event_enum event, vm_mms_interrupt_callback callback, void* user_data); + +/***************************************************************************** +* FUNCTION + * vm_mms_clear_interrupt_event_handler + * DESCRIPTION + * clear handler + * PARAMETERS + * event : [IN] MMS event type + * RETURN VALUES + * 0 means success + * +*****************************************************************************/ +VMINT vm_mms_clear_interrupt_event_handler(vm_mms_event_enum event); + +/***************************************************************************** +* FUNCTION + * vm_mms_download + * DESCRIPTION + * download mms + * PARAMETERS + * msg_id : [IN] message id + * sim : [IN] sim card id + * storage_type : [IN] storage type + * RETURN VALUES + * 0 means success + * +*****************************************************************************/ +VMINT vm_mms_download(VMUINT msg_id, vm_mms_sim_id_enum sim, vm_mms_msg_storage_type_enum storage_type); + +/***************************************************************************** +* FUNCTION + * vm_mms_cancel_download + * DESCRIPTION + * cancel downloading mms + * PARAMETERS + * msg_id : [IN] message id + * RETURN VALUES + * +*****************************************************************************/ +void vm_mms_cancel_download(VMINT msg_id); + +/***************************************************************************** +* FUNCTION + * vm_mms_delete + * DESCRIPTION + * delete mms + * PARAMETERS + * msg_id_list : [IN] message id + * msg_num : [IN] sim card id + * folder : [IN] storage type + * vm_mms_delete_callback : [IN] sim card id + * user_data : [IN] storage type + * RETURN VALUES + * 0 means success + * +*****************************************************************************/ +VMINT vm_mms_delete(VMUINT* msg_id_list, VMUINT msg_num, vm_mms_folder_enum folder, vm_mms_delete_callback callback,void* user_data); + +/***************************************************************************** +* FUNCTION + * vm_mms_get_msg_id_list + * DESCRIPTION + * get mms message id list + * PARAMETERS + * folder : [IN] where to get message + * callback : [IN] callback + * user_data: [IN] user data + * RETURN VALUES + * 0 means success + * +*****************************************************************************/ +VMINT vm_mms_get_msg_id_list(vm_mms_folder_enum folder, vm_mms_get_msg_id_list_callback_type callback, void* user_data); + +/***************************************************************************** +* FUNCTION + * vm_mms_get_content + * DESCRIPTION + * get mms content + * PARAMETERS + * req_data : [IN] request struct + * RETURN VALUES + * 0 means success + * +*****************************************************************************/ +VMINT vm_mms_get_content(vm_mms_get_content_req_struct *req_data); + +#ifdef __cplusplus +} +#endif + +#endif /* VMMMS_SDK_H */ + + + + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmmullang.h b/hardware/arduino/mtk/system/libmtk/include/vmmullang.h new file mode 100644 index 00000000..69f34f63 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmmullang.h @@ -0,0 +1,176 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef _VM_MUL_LANG_SDK_ +#define _VM_MUL_LANG_SDK_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/*multi-language segment name*/ +#define MUL_LANG_RES_NAME "lang.bin" + +/*language type list*/ +enum{ + VM_LANG_NULL = 0, /*no language*/ + VM_LANG_ENG,/*English*/ + VM_LANG_CHS,/*Chinese Simple*/ + VM_LANG_CHT /*Chinese Tradition*/ +}; + +/*language list begin*/ +#define VM_LANG_ID_START VM_LANG_ENG + +/*language list end*/ +#define VM_LANG_ID_END VM_LANG_CHT + +/*default language*/ +#define VM_LANG_ID_DEFAULT VM_LANG_ENG + + + +/***************************************************************************** + * FUNCTION + * vm_mul_lang_init + * DESCRIPTION + * init multi-language model. multi-lang resource is in the segment "vm_res" in the vxp file, its name is lang.bin. so it has + * malloc memory operation. + * PARAMETERS + * void + * RETURNS + * if succeed, return the handle of multi-lang resource(the resource pointer), otherwise, return NULL + *****************************************************************************/ +VMCHAR * vm_mul_lang_init( void ); + + +/***************************************************************************** + * FUNCTION + * vm_mul_lang_deinit + * DESCRIPTION + * release multi-lang resource + * PARAMETERS + * mul_lang_handle : [IN] the handle of multi-lang resource, in fact, it is pointer address. + * RETURNS + * void + *****************************************************************************/ +void vm_mul_lang_deinit( VMCHAR * mul_lang_handle ); + + + +/***************************************************************************** + * FUNCTION + * vm_mul_lang_get_string + * DESCRIPTION + * get the appointed string from multi-lang resource + * PARAMETERS + * lang_buf : [IN] multi-lang resource pointer address. + * res_id : [IN] string resource id + * lang_id : [IN] language id + * str_buf : [OUT] string pointer + * RETURNS + * the length of string. if length is 0, the operation is failed. + *****************************************************************************/ +VMINT vm_mul_lang_get_string( VMCHAR * lang_buf, VMINT res_id, VMINT lang_id, VMCHAR ** str_buf ); + + + + +/***************************************************************************** + * FUNCTION + * vm_mul_lang_set_lang + * DESCRIPTION + * set current language + * PARAMETERS + * lang_id : [IN] language id + * RETURNS + * if succeed, return 1, otherwise, return 0 + *****************************************************************************/ +VMINT vm_mul_lang_set_lang( VMINT lang_id ); + + + +/***************************************************************************** + * FUNCTION + * vm_mul_lang_set_lang + * DESCRIPTION + * get current language + * PARAMETERS + * void + * RETURNS + * language id, default value is VM_LANG_ENG + *****************************************************************************/ +VMINT vm_mul_lang_get_lang( void ); + + + +/***************************************************************************** + * FUNCTION + * vm_graphic_textout_by_id + * DESCRIPTION + * show string to the destination buffer + * PARAMETERS + * disp_buf : [IN] display buffer + * x : [IN] x offset of display buffer + * y : [IN] y offset of display buffer + * lang_buf : [IN] multi-lang resource pointer address. + * res_id : [IN] resource id + * color : [IN] string color + * RETURNS + * void + *****************************************************************************/ +void vm_graphic_textout_by_id( VMUINT8* disp_buf, VMINT x, VMINT y, VMCHAR * lang_buf, VMINT res_id, VMUINT16 color); + + +/***************************************************************************** + * FUNCTION + * vm_graphic_get_string_width_by_id + * DESCRIPTION + * get string width by resource id + * PARAMETERS + * lang_buf : [IN] multi-lang resource pointer address. + * res_id : [IN] string resource id + * RETURNS + * if succeed, return string width, otherwise, return error code + *****************************************************************************/ +VMINT vm_graphic_get_string_width_by_id( VMCHAR * lang_buf, VMINT res_id ); + +#ifdef __cplusplus +} +#endif + +#endif /* _VM_MUL_LANG_SDK_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmnat.h b/hardware/arduino/mtk/system/libmtk/include/vmnat.h new file mode 100644 index 00000000..28ef52c0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmnat.h @@ -0,0 +1,233 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* +* Filename: +* --------- +* +* +* Project: +* -------- +* MAUI +* +* Description: +* ------------ +* +* +* Author: +* ------- +* +* +*============================================================================== +* HISTORY +* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! +*------------------------------------------------------------------------------ +* $Log$ +* +* 06 20 2014 shuaihui.ren +* [MAUI_03493338] MRE NAT check in +* . +* +* 06 18 2014 shuaihui.ren +* [MAUI_03505838] "apk occure some error please check" happened when try to view video. +* . +* +* 05 20 2014 shuaihui.ren +* [MAUI_03493338] MRE NAT check in +* . +* +* 03 11 2014 feng.lin +* [MAUI_03479763] [IOT]Merge IOT code to 11C +* . +* +* 01 27 2014 xiufeng.zhang +* [MAUI_03484297] [IOT] UPnP check in +* . +* +* 01 27 2014 xiufeng.zhang +* [MAUI_03484297] [IOT] UPnP check in +* . +* +* . +*------------------------------------------------------------------------------ +* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! +*============================================================================== +*******************************************************************************/ +#ifndef VM_NAT_SDK_H +#define VM_NAT_SDK_H + +#define VM_TYPE_MAX_LEN 4 +#define VM_UPNP_SUCCESS 0 +#define VM_UPNP_FAIL_CREATE_SOCKET -1 +#define VM_UPNP_FAIL_NO_ROUTER -2 +#define VM_UPNP_FAIL_ROUTER_NOT_SUPPORT_UPNP -3 +#define VM_UPNP_FAIL_CREATE_THREAD -4 +#define VM_UPNP_FAIL_NO_MEMORY -5 +#define VM_UPNP_FAIL_MAPPING -6 +#define VM_UPNP_FAIL_OTHER -7 +#define VM_UPNP_PROTOCAL_UDP 0 +#define VM_UPNP_PROTOCAL_TCP 1 + +/* use for mmi_frm_mapping_ports() parameter*/ +typedef struct _vm_upnp_request_info +{ + VMUINT8 mapping_protocal; /* UPNP_PROTOCAL_UDP or UPNP_PROTOCAL_TCP */ + VMUINT16 local_port; /* local port of mapping request. */ + VMUINT16 ext_port; /* external port of mapping result. If not 0, upnp will try to mapping the ext_port, or it will mapping a random port.*/ +} vm_upnp_request_info; + +/* use for response port mapping */ +typedef struct _vm_upnp_map_info +{ + VMUINT32 count; + vm_upnp_request_info* requset_data; +} vm_upnp_map_info; + +typedef void(* vm_upnp_result_cb)(VMUINT8 request_id, VMINT ret, void* res_data, void* user_data); + +/**/ +typedef struct +{ + VMUINT32 protocol_type; + VMUINT16 port; + VMUINT32 userNum; + VMUINT32 seqId; + VMUINT8 addr[4]; + VMINT8 request_id[64]; +}vm_nat_invite_req_struct; + +typedef void(* vm_got_tunneling_addr_cb)(vm_nat_invite_req_struct *out_info, void *user_data); + +typedef struct +{ + VMUINT16 port; /* local port */ + VMUINT16 nat_port; /* port for NAT */ + VMUINT8 ip_addr[4]; /* local IP address */ + VMUINT8 nat_ip_addr[4]; /* address for NAT */ +}vm_nat_addr_struct; + +typedef void (*vm_nat_got_mapped_addr_cb)(vm_nat_addr_struct *addr, void *user_data); + +/***************************************************************************** +* FUNCTION +* vm_upnp_mapping_ports +* DESCRIPTION +* Async function, use for add mapping ports on router, the mapping result is notifyed by cb function. +* only can be used in mmi task, +* PARAMETERS +* request_id: [in] user define, use for identify the request. +* cb [in] the call back function. +* request_data: [in] the request ports mapping info. +* user_data: [in] user data. +* RETURNS +* None +* Example +* +* kal_int8 mapping_handler (kal_uint8 request_id, kal_int32 ret, void* res_data, void* user_data); +* kal_int32 fun() +* { +* upnp_request_info req_data[2]; +* upnp_map_res_info req; +* kal_uint8 request_id = 1234; +* req_data[0].mapping_protocal = UPNP_PROTOCAL_UDP; +* req_data[0].local_port = 2002; +* req_data[0].ext_port = 0; +* req_data[1].mapping_protocal = UPNP_PROTOCAL_TCP; +* req_data[1].local_port = 4221; +* req_data[1].ext_port = 0; +* req.requset_data = req_data; +* vm_upnp_mapping_ports(request_id, mapping_handler, req, NULL); +* return 0; +* } +* +* +* kal_int8 mapping_handler (kal_uint8 request_id, kal_int32 ret, void* res_data, void* user_data); +* { +* upnp_map_info* res_data; +* if(ret == UPNP_SUCCESS) +* { +* MMI_FRM_MAPPING_RES_INFO* res; +* res_data = (vm_upnp_request_info*) res_data; +* // do_sth(); +* } +* return 0; +* } +* +*****************************************************************************/ +VMINT vm_upnp_mapping_ports(VMUINT8 request_id, vm_upnp_result_cb cb, vm_upnp_map_info* request_data, void* user_data); + +/***************************************************************************** +* FUNCTION +* vm_upnp_get_ext_ip +* DESCRIPTION +* Async function, use for geting external ip of router, the mapping result is notifyed by cb function. +* only can be used in mmi task, +* PARAMETERS +* request_id: [in] user define, use for identify the request. +* cb [in] the call back function. +* user_data: [in] user data. +* RETURNS +* None +* +* Example +* +* kal_int8 ip_handler (kal_uint8 request_id, kal_int32 ret, void* res_data); +* kal_int32 fun() +* { +* kal_uint8 request_id = 231; +* vm_upnp_get_ext_ip(request_id, ip_handler); +* return 0; +* } +* +* kal_int8 ip_handler(kal_uint8 request_id, kal_int32 ret, void* res_data) +* { +* kal_char* ip; +* if(ret == UPNP_SUCCESS) +* { +* ip = (kal_char*) res_data; +* // do_sth(); +* } +* return 0; +* } +* +*****************************************************************************/ +VMINT vm_upnp_get_ext_ip(VMUINT8 request_id, vm_upnp_result_cb cb, void *user_data); + +VMINT vm_nat_invite_req(vm_nat_invite_req_struct *req, vm_got_tunneling_addr_cb cb, void* user_data); +VMINT vm_nat_set_life_time(VMUINT32 life_time); +VMINT vm_nat_set_stun_server(VMCHAR *server, VMUINT16 port); +VMINT vm_nat_get_mapped_addr_async(vm_nat_got_mapped_addr_cb callback, void *user_data); +VMINT vm_nat_set_type(VMUINT32 type); +#endif /* VM_NAT_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmnvram.h b/hardware/arduino/mtk/system/libmtk/include/vmnvram.h new file mode 100644 index 00000000..4409c4c1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmnvram.h @@ -0,0 +1,115 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMNVRAM_SDK_H_ +#define VMNVRAM_SDK_H_ +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* NVRAM ID for Sensor */ +typedef enum{ + VM_NVRAM_EF_SENSOR_START_LID = 513, /* begin */ + VM_NVRAM_EF_SENSOR1_LID = VM_NVRAM_EF_SENSOR_START_LID, /* used for sensor1 */ + VM_NVRAM_EF_ACCELERATOR_SENSOR_LID = VM_NVRAM_EF_SENSOR1_LID, /* ACCELERATOR has used thi one, others cannot use it */ + VM_NVRAM_EF_SENSOR2_LID, /* reserved */ + VM_NVRAM_EF_SENSOR3_LID, /* reserved */ + VM_NVRAM_EF_SENSOR4_LID, /* reserved */ + VM_NVRAM_EF_SENSOR5_LID, /* reserved */ + VM_NVRAM_EF_SENSOR6_LID, /* reserved */ + VM_NVRAM_EF_SENSOR7_LID, /* reserved */ + VM_NVRAM_EF_SENSOR8_LID, /* reserved */ + VM_NVRAM_EF_SENSOR9_LID, /* reserved */ + VM_NVRAM_EF_SENSOR10_LID, /* reserved */ + VM_NVRAM_EF_SENSOR11_LID, /* reserved */ + VM_NVRAM_EF_SENSOR12_LID, /* reserved */ + VM_NVRAM_EF_SENSOR13_LID, /* reserved */ + VM_NVRAM_EF_SENSOR14_LID, /* reserved */ + VM_NVRAM_EF_SENSOR15_LID, /* reserved */ + VM_NVRAM_EF_SENSOR16_LID, /* reserved */ + VM_NVRAM_EF_SENSOR17_LID, /* reserved */ + VM_NVRAM_EF_SENSOR18_LID, /* reserved */ + VM_NVRAM_EF_SENSOR19_LID, /* reserved */ + VM_NVRAM_EF_SENSOR20_LID /* reserved */ +}vm_nvram_sensor_lid; + +/* Max size of NVRAM data */ +#define VM_NVRAM_EF_SENSOR_SIZE 512 + + +/***************************************************************************** + * FUNCTION + * vm_nvram_get_data + * DESCRIPTION + * get nvram data from special ID. + * PARAMETERS + * id : [IN] NVRAM ID to get data. + * buff : [OUT] data buffer. + * size : [IN] size to get + * RETURNS + * get data success or not. + * RETURN VALUES + * <0 : error, other is success +*****************************************************************************/ +VMINT vm_nvram_get_data(vm_nvram_sensor_lid id, void* buff, VMUINT size); + +/***************************************************************************** + * FUNCTION + * vm_nvram_set_data + * DESCRIPTION + * set nvram data for special ID. + * PARAMETERS + * id : [IN] NVRAM ID to set data. + * buff : [IN] data buffer. + * size : [IN] size to set + * RETURNS + * set data success or not. + * RETURN VALUES + * <0 : error, other is success +*****************************************************************************/ +VMINT vm_nvram_set_data(vm_nvram_sensor_lid id, void* buff, VMUINT size); + + +#ifdef __cplusplus +} +#endif + + +#endif + + + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmnwsetting.h b/hardware/arduino/mtk/system/libmtk/include/vmnwsetting.h new file mode 100644 index 00000000..3870588d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmnwsetting.h @@ -0,0 +1,1639 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VM_NWSETTING_SDK_H +#define VM_NWSETTING_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + + + +/* Maximum length of WLAN SSID attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_SSID_LEN (32) + +/* Maximum length of WLAN SSID attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_SSID_LEN (32) +/* Maximum length of profile IP address length in WLAN profile */ +#define VM_WLAN_PROF_MAX_IP_ADDR_LEN (4) + +#define VM_WLAN_PROF_MAX_PROXY_ADDR_LEN (63) +/* Maximum length of proxy auth ID attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_PX_AUTH_ID_LEN (40) +/* Maximum length of proxy auth password attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_PX_AUTH_PW_LEN (40) +/* Maximum length of homepage attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_HOMEPAGE_LEN (256) +/* Maximum length of WLAN profile name attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_WLAN_PROF_NAME_LEN (VM_WLAN_PROF_MAX_SSID_LEN) +//#ifdef __WAPI_SUPPORT__ +#define VM_WLAN_WAPI_PSK_STR_LEN (32+1) /* WAPI PSK string length */ +//#endif /* __WAPI_SUPPORT__ */ +/* Maximum length of password attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_PW_LEN (31) +/* Maximum length of username attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_USER_LEN (31) +/* Maximum length of WLAN profile passphrase attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_PASSPHRASE_LEN (64) +/* Maximum length of WLAN profile psk attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_PSK_LEN (34) +/* Maximum length of WLAN profile wep key attribute in WLAN profile */ +#define VM_WLAN_PROF_MAX_WEP_KEY_LEN (26) +/* MAX WLAN profile number */ +#define VM_MAX_WLAN_ACCOUNT_NUM (30) + +/* --- MAC Address Length -------------------------------------------------- */ +/* WNDRV_MAC_ADDRESS_LEN */ +#define VM_WLAN_WNDRV_MAC_ADDRESS_LEN (6) +/* --- SSID Length --------------------------------------------------------- */ +/* WNDRV_SSID_MAX_LEN */ +#define VM_WLAN_WNDRV_SSID_MAX_LEN (32) + +#define VM_WLAN_MAX_AP_LIST_NUM (30) + +/* Maximum length of password attribute of all kinds in WLAN profile */ +#define VM_WLAN_PROF_PSWD_MAX_LEN (64) + +/* Profile fields */ + +/* Set SSID field in wlan account profile */ +#define VM_WLAN_PROF_FIELD_SSID (0x00000002) + +/* Set auth type field in wlan account profile */ +#define VM_WLAN_PROF_FIELD_AUTH_TYPE (0x00000400) + +/* Set username field in wlan account profile */ +#define VM_WLAN_PROF_FIELD_USER (0x00080000) + +/* Set password field in wlan account profile */ +#define VM_WLAN_PROF_FIELD_PW (0x00100000) + +/* Set All fields */ +#define VM_WLAN_PROF_FIELD_ALL (0xFFFFFFFF) + +#define VM_WLAN_MAX_SPEC_SSID_LIST_NUM (7) + +/* wlan network type enum */ +typedef enum +{ + VM_WLAN_NETWORK_TYPE_INFRA, /* infrasturcture mode */ + VM_WLAN_NETWORK_TYPE_ADHOC, /* ad-hoc mode */ + VM_WLAN_NETWORK_TYPE_TOTAL +} vm_wlan_network_type_enum; + + +/* wlan auth.mode enum */ +typedef enum +{ + VM_WLAN_AUTH_MODE_OPEN, /* Open Network */ + VM_WLAN_AUTH_MODE_WEP, /* WEP */ + VM_WLAN_AUTH_MODE_IEEE8021X, /* IEEE802.1x */ + VM_WLAN_AUTH_MODE_WPA_ONLY, /* WPA Enterprise */ + VM_WLAN_AUTH_MODE_WPA_ONLY_PSK, /* WPA Only PSK */ + VM_WLAN_AUTH_MODE_WAPICERT, /* WAPICERT */ + VM_WLAN_AUTH_MODE_WAPIPSK, /* WAPIPSK */ + + VM_WLAN_AUTH_MODE_WPA2_ONLY, /* WPA2 Enterprise */ + VM_WLAN_AUTH_MODE_WPA_WPA2_MIX, /* WPA WPA2 Mix Enterprise */ + VM_WLAN_AUTH_MODE_WPA2_ONLY_PSK, /* WPA2 Only PSK */ + VM_WLAN_AUTH_MODE_WPA_WPA2_MIX_PSK, /* WPA WPA2 Mix PSK */ + VM_WLAN_AUTH_MODE_TOTAL +} vm_wlan_auth_mode_enum; + +/* wlan encrypt mode */ +typedef enum +{ + VM_WLAN_ENCRYPT_MODE_NONE, /* unencrypt mode */ + VM_WLAN_ENCRYPT_MODE_WEP, /* WEP mode */ + VM_WLAN_ENCRYPT_MODE_TKIP, /* TKIP mode */ + VM_WLAN_ENCRYPT_MODE_AES, /* AES mode */ + VM_WLAN_ENCRYPT_MODE_WPI, /* WPI mode */ + VM_WLAN_ENCRYPT_MODE_TKIP_AES, /*TKIP_CCMP */ + VM_WLAN_ENCRYPT_MODE_TOTAL +} vm_wlan_encrypt_mode_enum; + +typedef enum +{ + VM_WLAN_WEP_KEY_FORMAT_HEX, /* HEX encoded */ + VM_WLAN_WEP_KEY_FORMAT_ASCII,/* ASCII encoded */ + VM_WLAN_WEP_KEY_FORMAT_TOTAL +} vm_wlan_wep_key_format_enum; + +typedef enum +{ + VM_WLAN_AP_USER_DEFINE, + VM_WLAN_AP_DEFAULT, + VM_WLAN_AP_UNKNOW, + VM_WLAN_AP_BLACK_LIST, + VM_WLAN_AP_END +}vm_wlan_ap_type_enum; + +/* Connect error type */ +typedef enum +{ + VM_WLAN_TIMEOUT, + VM_WLAN_LOST_COVERAGE, + VM_WLAN_NORMAL_REJ, + VM_WLAN_CONNECT_FAIL, + VM_WLAN_AUTH_FAIL, + VM_WLAN_CAUSE_COUNT, + VM_WLAN_UNSUPPORTED_EAP_TYPE, //add for WiFi UE enhancement + VM_WLAN_WRONG_USER_INFO, //add for WiFi UE enhancement + VM_WLAN_LOW_RSSI, // when RSSI < -85dBm . indicate this cause + VM_WLAN_INVALID_CAUSE +} vm_wlan_cause_enum; /* same as supc_abm_cause_enum */ + +/* Connection type */ +typedef enum +{ + VM_WLAN_ALL_PROFILE_ENABLE, + VM_WLAN_ONE_PROFILE_SELECT, + VM_WLAN_START_WPS_PIN, + VM_WLAN_START_WPS_PBC +} vm_wlan_connection_type_enum; /* supc_connection_type_enum */ + +/* WLAN request result enum */ +typedef enum +{ + VM_WLAN_REQ_RES_DONE = 0, /* request completed successfully */ + VM_WLAN_REQ_RES_TERMINATED, /* request is terminated by newer request */ + VM_WLAN_REQ_RES_DUPLICATED, /* request is removed by newer same request */ + VM_WLAN_REQ_RES_FAILED, /* request is ignored due to state error */ + VM_WLAN_REQ_RES_ADD_BY_SRV, + VM_WLAN_REQ_RES_UNKNOWN_ERROR, + VM_WLAN_REQ_RES_CANCELLED, + VM_WLAN_REQ_RES_BUSY, + + VM_WLAN_REQ_RES_TOTAL +} vm_wlan_req_res_enum; + +/* WLAN scan result enum */ +typedef enum +{ + VM_WLAN_SCAN_RESULT_SUCCESS = 0, /* WLAN scan success */ + VM_WLAN_SCAN_RESULT_FAILED, /* WLAN scan failed */ + VM_WLAN_SCAN_RESULT_ABORTED, /* WLAN scan service is aborted */ + VM_WLAN_SCAN_RESULT_DELETE, /* WLAN scan delete in CONNECT_WAIT */ + VM_WLAN_SCAN_RESULT_TOTAL +} vm_wlan_scan_result_enum; + +/* WLAN services result enum */ +typedef enum +{ + VM_WLAN_RESULT_SUCCESS = 0, /* success */ + VM_WLAN_RESULT_FAILED, /* general failed case */ + VM_WLAN_RESULT_PROCESSING, /* processing state implies Event notify */ + VM_WLAN_RESULT_STATE_ERROR, /* service status error */ + VM_WLAN_RESULT_INVALID_INPUT, /* the input parameter is invalid */ + VM_WLAN_RESULT_ABORTED, /* the process is aborted */ + VM_WLAN_RESULT_TERMINATED, /* the process is terminated */ + VM_WLAN_RESULT_ONE_STORE_EXISTS, /* currently only support one store */ + VM_WLAN_RESULT_STORE_NOT_COMMIT, /* store doesn't be config commited before */ + VM_WLAN_RESULT_INVALID_STORE, /* store invalid */ + VM_WLAN_RESULT_STORE_FULL, /* reach maximum profile storage */ + VM_WLAN_RESULT_READ_ONLY, /* can't delete or update read_only profile */ + VM_WLAN_RESULT_FIRST_BOOTUP, /* first bootup rerurn code for store open */ + VM_WLAN_RESULT_RESET_FACTORY, /* the data base sim profiles folder is deleted */ + VM_WLAN_RESULT_FS_ERROR, /* the database file system error */ + VM_WLAN_RESULT_IGNORE, + VM_WLAN_RESULT_TOTAL +} vm_wlan_result_enum; + +/* WLAN set mode enum */ +typedef enum +{ + VM_WLAN_SET_MODE_NONE, + VM_WLAN_SET_MODE_OFF, /* OFF */ + VM_WLAN_SET_MODE_AP, /* AP only*/ + VM_WLAN_SET_MODE_STA, /* STA only */ + VM_WLAN_SET_MODE_AP_STA, /* AP+STA */ + + VM_WLAN_SET_MODE_TOTAL +}vm_wlan_set_mode_enum; + + + +/* WLAN mode status enum */ +typedef enum +{ + VM_WLAN_MODE_STATUS_OFF, /* OFF */ + VM_WLAN_MODE_STATUS_OFF_SWITCHING, + VM_WLAN_MODE_STATUS_AP, /* AP only*/ + VM_WLAN_MODE_STATUS_AP_SWITCHING, + VM_WLAN_MODE_STATUS_STA, /* STA only */ + VM_WLAN_MODE_STATUS_STA_SWITCHING, + VM_WLAN_MODE_STATUS_AP_STA, /* AP+STA */ + VM_WLAN_MODE_STATUS_AP_STA_SWITCHING, + VM_WLAN_MODE_STATUS_ERROR, + + VM_WLAN_MODE_STATUS_TOTAL +}vm_wlan_mode_status_enum; + + +/* WLAN mode status enum */ +typedef enum +{ + VM_WLAN_STA_STATUS_INACTIVE = 0x01, /* inactive state */ + VM_WLAN_STA_STATUS_ACTIVE = 0x02, /* active state */ + VM_WLAN_STA_STATUS_CONNECTED = 0x04, /* connected state */ + VM_WLAN_STA_STATUS_INVALID_MAC = 0x08, /* current MAC address isn't valid, OR'd with ACTIVE and CONNECTED status */ + VM_WLAN_STA_STATUS_SNIFFER = 0x10, /* sniffer status */ + VM_WLAN_STA_STATUS_BUSY = 0x20, /* status changing */ + + VM_WLAN_STA_STATUS_TOTAL = 0xFF +} vm_wlan_sta_status_enum; + + + +/* Sniffer ON Callback type */ +typedef enum +{ + VM_WLAN_SNIFFER_ON_RES, + VM_WLAN_SNIFFER_ON_AP_INFO, + + VM_WLAN_SNIFFER_ON_END +}vm_wlan_sniffer_on_cb_type_enum; + + +/* Sniffer ON/OFF callback result Enum */ +typedef enum +{ + VM_WLAN_SNIFFER_SUCCESS = 0, + VM_WLAN_SNIFFER_FAIL_INVALID_CHANNEL, + VM_WLAN_SNIFFER_FAIL_INVALID_SNIFFERFILTEROPTIONS, + VM_WLAN_SNIFFER_FAIL_INVALID_ONOFFSWITCH, + VM_WLAN_SNIFFER_FAIL_NETWORK_IS_CONNECTED, + VM_WLAN_SNIFFER_FAIL_UNKNOWN, + VM_WLAN_SNIFFER_FAIL_STATE_ERROR, + VM_WLAN_SNIFFER_FAIL_HW_ERROR +}vm_wlan_sniffer_res_enum; + + +/* Notification type */ +typedef enum +{ + VM_WLAN_NOTI_NONE, + VM_WLAN_NOTI_IP_AVAILABLE, //IP available + VM_WLAN_NOTI_PASSIVE_DISCONN, //Passive disconnect + + VM_WLAN_NOTI_END = 0xFFFF +}vm_wlan_noti_type_enum; + + +/* Connected ap info type */ +typedef enum +{ + VM_WLAN_AP_INFO_BSSID, //Get BSSID + VM_WLAN_AP_INFO_PROF_ID, //Get Profile ID + VM_WLAN_AP_INFO_RSSI, //Get RSSI + VM_WLAN_AP_INFO_ALL, //Get All infomation + + VM_WLAN_AP_INFO_END = 0xFFFF +}vm_wlan_ap_info_type_enum; + + +/* scan param type */ +typedef enum +{ + VM_WLAN_SCAN_PARAM_DWELL_TIME, /* Get/Set dwell time */ + VM_WLAN_SCAN_PARAM_SPEC_SSID_LIST, /* Get/Set ssid list */ + + VM_WLAN_SCAN_PARAM_END = 0xFFFF +}vm_wlan_scan_param_type_enum; + +/* Custom config apmode para enum */ +typedef enum +{ + VM_WLAN_CFG_AP_PARA_AUTH_MODE = 0x00000001, /* AP mode */ + VM_WLAN_CFG_AP_PARA_SSID = 0x00000002, /* AP mode */ + VM_WLAN_CFG_AP_PARA_PWD = 0x00000004, /* AP mode */ + + VM_WLAN_CFG_AP_PARA_ALL = VM_WLAN_CFG_AP_PARA_AUTH_MODE | + VM_WLAN_CFG_AP_PARA_SSID | + VM_WLAN_CFG_AP_PARA_PWD, /*All parameter */ + + VM_WLAN_CFG_AP_PARA_END +} vm_wlan_cfg_ap_para_enum; + +typedef struct +{ + VMUINT8 ssid[VM_WLAN_PROF_MAX_SSID_LEN+1]; /* SSID ASCII string (MAX: VM_WLAN_PROF_MAX_SSID_LEN) */ + vm_wlan_auth_mode_enum auth_mode; /* profile auth.mode */ + VMUINT8 username[VM_WLAN_PROF_MAX_USER_LEN+1]; /* user name string (ASCII, MAX: VM_WLAN_PROF_MAX_USER_LEN) */ + VMUINT8 password[VM_WLAN_PROF_PSWD_MAX_LEN+1]; /* password string (ASCII, MAX: VM_WLAN_PROF_PSWD_MAX_LEN) */ + VMUINT32 profile_id; /* Profile ID */ +} vm_wlan_prof_struct; + + + +/* Sniffer ON structure , used in callback function*/ +typedef struct +{ + vm_wlan_sniffer_on_cb_type_enum cb_type; // callback type, reference vm_wlan_sniffer_on_cb_type_enum + vm_wlan_sniffer_res_enum result; // Result ENUM, reference vm_wlan_sniffer_res_enum + vm_wlan_prof_struct profile; // Get by sniffer +}vm_wlan_sniffer_on_res_struct; + + +/* Sniffer ON Config structure, used in paramter */ +typedef struct +{ + VMUINT32 sniffer_filter_op; + VMUINT8 channel_num; + VMINT32 min_rssi; + VMINT32 max_rssi; + VMUINT16 min_pack_len; + VMUINT16 max_pack_len; +}vm_wlan_sniffer_on_cfg_struct; + + +/* WLAN Notification Structure */ +typedef struct +{ + vm_wlan_noti_type_enum type; //Notification type + void * data; //Notification data +}vm_wlan_noti_struct; + + +/* Mac addres query structure */ +typedef struct +{ + VMCHAR *dest; /* destination buffer. */ + VMUINT16 dest_len; /* application's dest buffer length. */ + VMUINT16 req_len; /* if this attribute is provided by application (NOT NULL), + WLAN SRV will hint application the required buffer length */ +} vm_wlan_prof_str_info_qry_struct; + + +/* WLAN scan AP info strucutre */ +typedef struct +{ + VMUINT8 bssid[ VM_WLAN_WNDRV_MAC_ADDRESS_LEN ]; /* MAC address */ + VMUINT8 ssid [ VM_WLAN_WNDRV_SSID_MAX_LEN ]; /* SSID */ + VMUINT16 ssid_len; /* SSID Length */ + VMINT32 rssi; /* receive signal, in dBm */ + VMUINT32 channel_number; /* AP Channel number */ + VMUINT8 max_rate; /* AP Max rate */ + VMUINT8 privacy; /* WEP encryption requirement */ + vm_wlan_network_type_enum network_type; /* profile network type */ + vm_wlan_auth_mode_enum auth_mode; /* profile auth.mode */ + vm_wlan_encrypt_mode_enum encrypt_mode; /* profile encrypt mode */ +} vm_wlan_scan_ap_info_struct; + +/* this struct is designed for WLAN SRV to send the scan result to APP */ +typedef struct +{ + vm_wlan_scan_result_enum result; /* scan result enum */ + VMUINT8 ap_list_num; /* total num of searched ap list */ + vm_wlan_scan_ap_info_struct ap_list[VM_WLAN_MAX_AP_LIST_NUM]; /* bss info array */ + VMINT32 scan_job_id; /* scan_job_id, 0xFFFFFF means scan result broadcasting */ +} vm_wlan_scan_result_struct; + +/* This struct is designed for user to pass the specialized ssid for scaning. */ +typedef struct +{ + VMUINT8 ssid_len; //SSID length + VMUINT8 ssid[VM_WLAN_WNDRV_SSID_MAX_LEN]; //SSID +}vm_wlan_ssid_struct; + + +/* this struct is designed for WLAN SRV to send the connect result to APP */ +typedef struct +{ + vm_wlan_result_enum result; /* SUCCESS: connected, FAILD: connect failed, + * ABORTED: preemptived by new connect req + * TERMINATED: terminated by new disconnect req + * STATE_ERROR: can't perform connect req + */ + vm_wlan_cause_enum cause; /* Error cause, uses only if result = FAILD */ + VMUINT8 bssid[VM_WLAN_WNDRV_MAC_ADDRESS_LEN]; /* MAC Address */ + VMUINT8 ssid[VM_WLAN_WNDRV_SSID_MAX_LEN]; /* SSID */ + VMBYTE init_by_soc; /* connection activated by socket flag */ + VMUINT16 ssid_len; /* SSID length in array */ + VMUINT32 channel_number; /* channel info from chip */ + VMUINT32 profile_id; /* connected profile id */ + VMUINT32 auth_type; + VMUINT32 eap_peap_auth_type; + VMUINT32 eap_ttls_auth_type; + vm_wlan_connection_type_enum conn_type; + VMUINT16 encry_mode; /*defaultly, it is WPS_ENCR_TYPES, + and now we don't to parse encry_mode in M2 */ + VMUINT8 passphase[32]; + VMUINT8 passphase_len; + VMBYTE need_login; + VMBYTE cancel_by_discon; + VMINT rssi; +} vm_wlan_conn_res_struct; + +/* this struct is designed for WLAN store query operation */ +typedef struct +{ + VMUINT32 ids[VM_MAX_WLAN_ACCOUNT_NUM]; /* profile id list query result */ + VMUINT8 num_ids; /* the number of queried id list */ +} vm_wlan_prof_list_struct; + +/* event structure for setting roaming parameter*/ +typedef struct { + VMBYTE is_roaming; // param of roaming, 1 is roming, 0 is non-roaming +} vm_wlan_roaming_para_struct; + + +/* This struct is designed for wlan srv to tell the ip inforamtion. */ +typedef struct +{ + VMUINT8 ip_addr[VM_WLAN_PROF_MAX_IP_ADDR_LEN]; /* IP address (ASCII, MAX: VM_WLAN_PROF_MAX_IP_ADDR_LEN) */ + VMUINT8 netmask[VM_WLAN_PROF_MAX_IP_ADDR_LEN]; /* Netmask (ASCII, MAX: VM_WLAN_PROF_MAX_IP_ADDR_LEN) */ + VMUINT8 gateway[VM_WLAN_PROF_MAX_IP_ADDR_LEN]; /* Gateway (ASCII, MAX: VM_WLAN_PROF_MAX_IP_ADDR_LEN) */ + VMUINT8 dns1[VM_WLAN_PROF_MAX_IP_ADDR_LEN]; /* Primary DNS (ASCII, MAX: VM_WLAN_PROF_MAX_IP_ADDR_LEN) */ + VMUINT8 dns2[VM_WLAN_PROF_MAX_IP_ADDR_LEN]; /* Secondary DNS (ASCII, MAX: VM_WLAN_PROF_MAX_IP_ADDR_LEN) */ +}vm_wlan_ip_info_struct; + + +/* AP information */ +typedef struct +{ + VMUINT8 ssid[VM_WLAN_PROF_MAX_SSID_LEN+1]; //SSID of AP + vm_wlan_auth_mode_enum auth_mode; //Auth mode, reference vm_wlan_auth_mode_enum + VMUINT8 password[VM_WLAN_PROF_PSWD_MAX_LEN+1]; //Password of AP +}vm_wlan_ap_info_struct; + +/* Connected ap information */ +typedef struct +{ + VMUINT8 bssid[VM_WLAN_WNDRV_MAC_ADDRESS_LEN + 1]; + VMUINT32 prof_id; + VMINT32 rssi_out; +}vm_wlan_conned_ap_info_struct; + + +/* part of scan param -- spec ssid list */ +typedef struct +{ + VMUINT8 ssid_list_num; + vm_wlan_ssid_struct ssid_list[VM_WLAN_MAX_SPEC_SSID_LIST_NUM]; +}vm_wlan_spec_ssid_list_struct; + +typedef struct +{ + /* AP mode info */ + vm_wlan_auth_mode_enum auth_mode; + VMINT8 ssid[VM_WLAN_WNDRV_SSID_MAX_LEN + 1]; + VMINT8 psk[VM_WLAN_PROF_PSWD_MAX_LEN]; + + /* add */ +}vm_wlan_cfg_ap_struct; +/***************************************************************************** + * FUNCTION + * vm_wlan_conn_res_cb_func_ptr + * DESCRIPTION + * Prototype of wLAN scan result callback function + * PARAMETERS + * user_data : [IN] APP's piggyback user_data + * conn_res : [IN] connect results from DA SRV + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_wlan_conn_res_cb_func_ptr) ( + void *user_data, + vm_wlan_conn_res_struct *conn_res); + +/***************************************************************************** + * FUNCTION + * vm_wlan_cb_func_ptr + * DESCRIPTION + * Prototype of wLAN general callback function for no feedback arguments except application piggyback data + * PARAMETERS + * user_data : [IN] APP's piggyback user_data + * res : [IN] request result + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_wlan_cb_func_ptr) (void *user_data, vm_wlan_req_res_enum res); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_sniffer_off_cb_func_ptr + * DESCRIPTION + * Prototype of wlan sniffer on callback function. Tell user the result of sniffer on. If successfully, + * function will be called again with AP info. + * PARAMETERS + * user_data : [IN] APP's piggyback user_data + * res : [IN] Sniffer on results from WLAN srv + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_wlan_sniffer_on_cb_func_ptr) ( + void *user_data, + vm_wlan_sniffer_on_res_struct *res); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_sniffer_off_cb_func_ptr + * DESCRIPTION + * Prototype of wlan sniffer off callback function. Tell user the result of sniffer off. + * PARAMETERS + * user_data : [IN] APP's piggyback user_data + * res : [IN] Sniffer off results from WLAN srv + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_wlan_sniffer_off_cb_func_ptr) ( + void *user_data, + vm_wlan_sniffer_res_enum res); + +/***************************************************************************** + * FUNCTION + * vm_wlan_noti_func_ptr + * DESCRIPTION + * Prototype of notification register function. When notification comes, corresponding register + * function will be called if it's registered before. + * PARAMETERS + * user_data : [IN] APP's piggyback user_data + * noti : [IN] Noti type + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_wlan_noti_func_ptr) (void *user_data, vm_wlan_noti_struct *noti); + + + +/***************************************************************************** + * FUNCTION + * vm_wlan_scan_res_cb_func_ptr + * DESCRIPTION + * WLAN scan result callback function + * APPs need to copy the bss info byself. + * PARAMETERS + * job_id : [IN] APP's job ID from return value by calling WLAN scan operation + * user_data : [IN] APP's piggyback user_data + * scan_res : [IN] Scan results from WLAN srv + * RETURNS + * success if 0, else failure. + *****************************************************************************/ +typedef void (*vm_wlan_scan_res_cb_func_ptr) ( + VMUINT32 job_id, + void *user_data, + vm_wlan_scan_result_struct *scan_res); + + + +/***************************************************************************** + * FUNCTION + * vm_wlan_connect + * DESCRIPTION + * The function is used to connect the AP specified by the info in ap_info. + * 1. DA WLAN servive can only support one connection at the same time due to chip constraint. + * 2. If the new connect request is arrived, current connecting process will be aborted. + * 3. If there is one connection already, the connection will be disconnected + * then connect a new one. + * PARAMETERS + * prof_id : [IN] prof_id for wlan profile + * callback : [IN] connect result callback notify function for APP + * user_data : [IN] application associated piggyback data + * RETURN VALUES + * VM_WLAN_RESULT_INVALID_INPUT : profile_num <= 0 or profile pointer invalid + * VM_WLAN_RESULT_STATE_ERROR : the wlan status can't perform the scan process + * VM_WLAN_RESULT_PROCESSING : accept the connect quest, wait for event notify. + * SEE ALSO + * vm_wlan_prof_connect + * EXAMPLE + * + * // STA status is ACTIVED before calling vm_wlan_connect(). + * vm_wlan_ap_info_struct ap_info = {0}; + * strcpy(ap_info.ssid, "ssidexample"); + * ap_info.auth_mode = VM_WLAN_AUTH_MODE_WPA_ONLY_PSK; + * strcpy(ap_info.password, "ssidpwd"); + * vm_wlan_connect(&ap_info, conn_cb, NULL); + * void conn_cb(void *user_data, vm_wlan_req_res_enum res) + * { + * if (VM_WLAN_REQ_RES_DONE == res) + * { + * // Connection succeeds. + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_connect( + vm_wlan_ap_info_struct *ap_info, + vm_wlan_conn_res_cb_func_ptr callback, + void *user_data); + +/***************************************************************************** + * FUNCTION + * vm_wlan_disconnect + * DESCRIPTION + * 1. The function is used to disconnect current WLAN connection. + * 2. After WLAN init process is done, SRV will callback APP with user_data. + * PARAMETERS + * callback : [IN] callback function to notify applications the disconnect operation is done + * user_data : [IN] application piggyback data + * RETURN VALUES + * refer to vm_wlan_result_enum + * VM_WLAN_RESULT_STATE_ERROR : the wlan status can't perform the disconnect process + * VM_WLAN_RESULT_SUCCESS : the WLAN status is active. + * VM_WLAN_RESULT_PROCESSING : accept the disconnect quest, wait for event notify. + * EXAMPLE + * + * // STA status is CONNECTED before calling vm_wlan_disconnect(). + * vm_wlan_disconnect(disconn_cb, NULL); + * void disconn_cb(void *user_data, vm_wlan_req_res_enum res) + * { + * if (VM_WLAN_REQ_RES_DONE == res) + * { + * // Disconnection succeeds. + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_disconnect(vm_wlan_cb_func_ptr callback, void *user_data); + + + +/***************************************************************************** + * FUNCTION + * vm_wlan_mode_set + * DESCRIPTION + * The function is used to switch the mode. + * VM_WLAN_SET_MODE_OFF turns off both AP mode and STA mode. + * VM_WLAN_SET_MODE_AP turns only AP mode on. + * VM_WLAN_SET_MODE_STA turns only STA mode on. + * VM_WLAN_SET_MODE_AP_STA turns both AP mode and STA mode on. + * PARAMETERS + * mode : [IN] The mode wanted to switch on. + * RETURN VALUES + * + * EXAMPLE + * + * vm_wlan_mode_set(VM_WLAN_SET_MODE_AP, switch_mode_cb, NULL); + * void switch_mode_cb(void *user_data, vm_wlan_req_res_enum res) + * { + * if (VM_WLAN_REQ_RES_DONE == res) + * { + * // Switch mode successfully. + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_mode_set(vm_wlan_set_mode_enum mode, vm_wlan_cb_func_ptr callback, void *user_data); + + + +/***************************************************************************** + * FUNCTION + * vm_wlan_mode_get + * DESCRIPTION + * The function is query the status of WLAN services. + * PARAMETERS + * void + * RETURNS + * refer to vm_wlan_mode_status_enum + * EXAMPLE + * + * vm_wlan_mode_status_enum mode; + * mode = srv_wlan_status(); + * + *****************************************************************************/ +VMINT vm_wlan_mode_get(void); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_status + * DESCRIPTION + * The function is used to query current status in WLAN STA mode. + * PARAMETERS + * VMINT + * RETURNS + * vm_wlan_sta_status_enum + * VM_WLAN_STA_STATUS_BUSY means that WIFI status is changing, + * User need to wait changing finish and poll the result in interval timer + * EXAMPLE + * + * srv_wlan_sta_status_enum sta_status; + * sta_status = srv_wlan_sta_status(); + * + *****************************************************************************/ +VMINT vm_wlan_status(void); + + + +/***************************************************************************** + * FUNCTION + * vm_wlan_get_ip_info + * DESCRIPTION + * The function is used to get ip addr, netmask, gateway ip, dns, when they are available. + * These ip info will be available only when wlan srv is in CONNECTED status. And there're + * two situation due to the way of how to get ip. + * If using static ip when connecting, the ip will be availabe once connection succeeds. + * If using DHCP when connecting, ip will be availabe only when ABM notify the ip by MSG. + * That'll take a little time after connection succeeds. + * PARAMETERS + * ip_info : [OUT] Ip info + * RETURN VALUES + * VM_WLAN_RESULT_SUCCESS: Successfuly. + * VM_WLAN_RESULT_STATE_ERROR: Wrong time to get ip for ip is not available. + * VM_WLAN_RESULT_FAILED: Failed. + * EXAMPLE + * + * vm_wlan_ip_info_struct ip_info = {0}; + * vm_wlan_get_ip_info(&ip_info); + * + *****************************************************************************/ +VMINT vm_wlan_get_ip_info(vm_wlan_ip_info_struct* ip_info); + + + +/***************************************************************************** + * FUNCTION + * vm_wlan_get_mac_address + * DESCRIPTION + * The function is used to get MAC address. + * 1. dest buffer length must be >= VM_WLAN_WNDRV_MAC_ADDRESS_LEN, i.e. dest_len must + * be >= VM_WLAN_WNDRV_MAC_ADDRESS_LEN, otherwise WLAN SRV will be failure + * and reqired length (VM_WLAN_WNDRV_MAC_ADDRESS_LEN) will be set back to application. + * 2. Also, if dest = NULL, and req_len exist, it will get failure + * with required length in req_len for application. + * PARAMETERS + * mac_address_out : [OUT] MAC address output location + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * CHAR dest[VM_WLAN_WNDRV_MAC_ADDRESS_LEN] = {0}; + * vm_wlan_prof_str_info_qry_struct mac_addr; + * mac_addr.dest = dest; + * mac_addr.dest_len = VM_WLAN_WNDRV_MAC_ADDRESS_LEN; + * vm_wlan_get_mac_address(&mac_addr); + * + *****************************************************************************/ +VMINT vm_wlan_get_mac_address(vm_wlan_prof_str_info_qry_struct *mac_address_out); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_get_connected_ap_info + * DESCRIPTION + * The function is used to get information of the connected AP, such as bssid, rssi, + * and profile id. + * + * Input parameter, info_type, indicates what kind of information is wanted. User should provide + * enough memory to store the information as following: + * + * info_type info + * VM_WLAN_AP_INFO_BSSID U8 array with length at least VM_WLAN_WNDRV_MAC_ADDRESS_LEN + 1 + * VM_WLAN_AP_INFO_PROF_ID U32* points to a U32 variable + * VM_WLAN_AP_INFO_RSSI S32* points to an S32 variable + * VM_WLAN_AP_INFO_ALL vm_wlan_conned_ap_info_struct* to an vm_wlan_conned_ap_info_struct variable + * + * PARAMETERS + * info [OUT]: parameter used to store ap info. Please refer to the description. + * info_type [IN]: vm_wlan_ap_info_type_enum + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * // To get bssid + * U8 bssid[VM_WLAN_WNDRV_MAC_ADDRESS_LEN + 1] = {0}; + * vm_wlan_get_connected_ap_info((void*)bssid, VM_WLAN_AP_INFO_BSSID); + * // To get prof id + * U32 prof_id; + * vm_wlan_get_connected_ap_info((void*)&prof, VM_WLAN_AP_INFO_PROF_ID); + * // To get rssi + * S32 rssi; + * vm_wlan_get_connected_ap_info((void*)&rssi, VM_WLAN_AP_INFO_RSSI); + * // To get all inforamtion + * vm_wlan_conned_ap_info_struct ap_info = {0}; + * vm_wlan_get_connected_ap_info((void*)&ap_info, VM_WLAN_AP_INFO_ALL); + * + *****************************************************************************/ +VMINT vm_wlan_get_connected_ap_info(void *info, VMINT info_type); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_scan + * DESCRIPTION + * The function is used to scan the AP list for applications. + * PARAMETERS + * callback : [IN] scan result callback notify function for APP + * user_data : [IN] application piggyback data + * RETURN VALUES + * Job ID > 0 : New scan job created successfully. + * Job ID <= 0 : Can't create a new scan job. + * EXAMPLE + * + * U32 job_id; + * job_id = vm_wlan_scan(scan_cb, NULL); + * void scan_cb( + * U32 job_id, + * void *user_data, + * vm_wlan_scan_result_struct *scan_res) + * { + * if (VM_WLAN_SCAN_RESULT_SUCCESS == scan_res->result) + * { + * // Scan successfully. Information of APs scaned is in scan_res. + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_scan(vm_wlan_scan_res_cb_func_ptr callback, void *user_data); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_scan_abort + * DESCRIPTION + * The function is used to abort the scanning AP list process for applications. + * PARAMETERS + * job_id : [IN] created job ID from calling vm_wlan_scan + * RETURNS + * success if 0, else failure. + * EXAMPLE + * + * // scan job_id is returned by vm_wlan_scan(). + * vm_wlan_scan_abort(job_id); + * + *****************************************************************************/ +VMINT vm_wlan_scan_abort(VMUINT32 job_id); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_scan_set_param + * DESCRIPTION + * The function is used to set scan parameters, such as dwell time or specific ssid list. + * For scan parameters will be initialized to the default value evertytime wlan is turned on + * from inactive status, setting scan parameters is not useful at INACTIVE status, so it's not + * allowed. + * If scan parameter(s) is(are) not set, default value(s) will be used. + * Default values: dwell time: 60 spec_ssid_list: NULL + * + * Input parameter param_type indicates the kind of scan param that is wanted to be set. User + * should provide proper param to each kind of scan param as following: + * + * param_type param + * VM_WLAN_SCAN_PARAM_DWELL_TIME U16* points to a U16 variable + * VM_WLAN_SCAN_PARAM_SPEC_SSID_LIST vm_wlan_spec_ssid_list_struct* points to an + * vm_wlan_spec_ssid_list_struct variable + * PARAMETERS + * param [IN] scan parameters + * param_type [IN] vm_wlan_scan_param_type_enum + * RETURN VALUES + * VM_WLAN_RESULT_SUCCESS: Successfuly. + * VM_WLAN_RESULT_FAILED: Failed. + * VM_WLAN_RESULT_INVALID_INPUT: Invalid input parameter(s). + * VM_WLAN_RESULT_STATE_ERROR: Set scan parameter(s) in INACTIVE status + * EXAMPLE + * + * // Set dwell time + * U16 dwell_time = 70; + * vm_wlan_scan_set_param((void*)&dwell_time, VM_WLAN_SCAN_PARAM_DWELL_TIME, set_dwell_time_cb, NULL); + * + * void set_dwell_time_cb(void *user_data, vm_wlan_req_res_enum res) + * { + * if (VM_WLAN_REQ_RES_DONE == res) + * { + * // Set dwell time successfully. + * } + * } + * // Set specialized ssid list + * vm_wlan_spec_ssid_list_struct ssid_list = {0}; + * ssid_list.ssid_list[0] = {5, "ssid1"}; + * ssid_list.ssid_list[1] = {5, "ssid2"}; + * ssid_list.ssid_list[2] = {5, "ssid3"}; + * ssid_list.ssid_list[3] = {5, "ssid4"}; + * ssid_list.ssid_list_num = 4; + * vm_wlan_scan_set_param((void*)&ssid_list, VM_WLAN_SCAN_PARAM_SPEC_SSID_LIST, set_spec_ssid_list_cb, NULL); + * void set_spec_ssid_list_cb(void *user_data, vm_wlan_req_res_enum res) + * { + * if (VM_WLAN_REQ_RES_DONE == res) + * { + * // Set specialized ssid list successfully. + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_scan_set_param( + void *param, + VMINT32 param_type, + vm_wlan_cb_func_ptr callback, + void *user_data); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_scan_get_param + * DESCRIPTION + * The function is used to get scan parameters, such as dwell time or specific ssid list. + * + * Input parameter param_type indicates the kind of scan param that is wanted. User + * should provide proper param to each kind of scan param as following: + * + * param_type param + * VM_WLAN_SCAN_PARAM_DWELL_TIME U16* points to a U16 variable + * VM_WLAN_SCAN_PARAM_SPEC_SSID_LIST vm_wlan_spec_ssid_list_struct* points to an + * vm_wlan_spec_ssid_list_struct variable + * PARAMETERS + * param [OUT] scan parameters + * param_type [IN] vm_wlan_scan_param_type_enum + * RETURN VALUES + * VM_WLAN_RESULT_SUCCESS: Successfuly. + * VM_WLAN_RESULT_FAILED: Failed. + * VM_WLAN_RESULT_INVALID_INPUT: Invalid input parameter(s). + * EXAMPLE + * + * // Get dwell time + * U16 dwell_time; + * vm_wlan_scan_get_param((void*)&dwell_time, VM_WLAN_SCAN_PARAM_DWELL_TIME); + * // Get specialized ssid list + * vm_wlan_spec_ssid_list_struct ssid_list; + * vm_wlan_scan_get_param((void*)&ssid_list, VM_WLAN_SCAN_PARAM_SPEC_SSID_LIST); + * + *****************************************************************************/ +VMINT vm_wlan_scan_get_param(void *param, VMINT32 param_type); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_reg_noti + * DESCRIPTION + * The function is used to register the handler of notifications, such as ip available notification, or + * WIFI passive disconnect notification. When relative things happens, notification will be actived and + * callback function will be invoked if it's registered before. + * + * vm_wlan_reg_noti() should be paired with vm_wlan_dereg_noti(). + * PARAMETERS + * noti_type : [IN] Notification type. Please refer to vm_wlan_noti_type_enum + * callback : [IN] callback function to notify that notification is coming + * user_data : [IN] application piggyback data + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * vm_wlan_reg_noti(VM_WLAN_NOTI_IP_AVAILABLE, ip_available_hdl, NULL); + * // When IP is available, ip_available_hdl will be called. + * void ip_available_hdl(void *user_data, vm_wlan_noti_struct *noti) + * { + * if (noti->type == VM_WLAN_NOTI_IP_AVAILABLE) + * { + * //... + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_reg_noti(VMINT noti_type, vm_wlan_noti_func_ptr callback, void *user_data); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_dereg_noti + * DESCRIPTION + * The function is used to deregister the handler of notifications which is registered before. + * the type of notification, callback and user_data should be the same as the one that registed + * by using vm_wlan_reg_noti(). + * + * vm_wlan_dereg_noti() should be paired with vm_wlan_reg_noti() + * PARAMETERS + * noti_type : [IN] Notification type. Please refer to vm_wlan_noti_type_enum + * callback : [IN] callback function to notify that notification is coming + * user_data : [IN] application piggyback data + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * vm_wlan_reg_noti(VM_WLAN_NOTI_IP_AVAILABLE, ip_available_hdl, NULL); + * // Deregister with the same callback and user_data. Then when IP is avaliable, ip_available_hdl + * // will not be called. + * vm_wlan_dereg_noti(VM_WLAN_NOTI_IP_AVAILABLE, ip_available_hdl, NULL); + * + *****************************************************************************/ +VMINT vm_wlan_dereg_noti(VMINT noti_type, vm_wlan_noti_func_ptr callback, void *user_data); + + + +/***************************************************************************** + * FUNCTION + * vm_wlan_sniffer_on + * DESCRIPTION + * The function is used to open sniffer in WLAN STA mode. + * PARAMETERS + * sniffer_on_config : [IN] the configuration parameter of sniffer status + * callback : [IN] callback function to notify applications the operation is done + * user_data : [IN] application piggyback data + * RETURN VALUES + * VM_WLAN_RESULT_SUCCESS : Successfuly. + * VM_WLAN_RESULT_FAILED : Failed. + * VM_WLAN_RESULT_INVALID_INPUT : Invalid input parameter(s). + * VM_WLAN_RESULT_PROCESSING : Waiting for result. + * EXAMPLE + * + * vm_wlan_sniffer_on(NULL, sniffer_on_cb, NULL); + * void sniffer_on_cb(void *user_data, vm_wlan_sniffer_on_res_struct *res) + * { + * switch (res->cb_type) + * { + * case VM_WLAN_SNIFFER_ON_RES: + * { + * if (res->result == VM_WLAN_SNIFFER_SUCCESS) + * { + * // Open sniffer successfully. + * } + * break; + * } + * case VM_WLAN_SNIFFER_ON_AP_INFO: + * { + * if (res->result == VM_WLAN_SNIFFER_SUCCESS) + * { + * // Get AP information successfully. And Ap information is stored + * // in res->profile. + * } + * break; + * } + * default: + * break; + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_sniffer_on(vm_wlan_sniffer_on_cfg_struct *sniffer_on_config, vm_wlan_sniffer_on_cb_func_ptr callback, void *user_data); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_sniffer_off + * DESCRIPTION + * The function is used to close sniffer in WLAN STA mode. + * PARAMETERS + * callback : [IN] callback function to notify applications the operation is done + * user_data : [IN] application piggyback data + * RETURN VALUES + * VM_WLAN_RESULT_SUCCESS : Successfuly. + * VM_WLAN_RESULT_FAILED : Failed. + * VM_WLAN_RESULT_INVALID_INPUT : Invalid input parameter(s). + * VM_WLAN_RESULT_PROCESSING : Waiting for result. + * EXAMPLE + * + * vm_wlan_sniffer_off(sniffer_off_cb, NULL); + * void sniffer_off_cb(void *user_data, vm_wlan_sniffer_res_enum res) + * { + * if (VM_WLAN_SNIFFER_SUCCESS == res) + * { + * // Exist sniffer successfully. + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_sniffer_off(vm_wlan_sniffer_off_cb_func_ptr callback, void *user_data); + + + +/***************************************************************************** + * FUNCTION + * vm_wlan_prof_init + * DESCRIPTION + * The function is used to init the wlan profile structure. In other words, fill in default + * values for the structure data members. + * PARAMETERS + * profile : [OUT] specified profile to be set + * RETURN VALUES + * refer to vm_wlan_result_enum + * EXAMPLE + * + * vm_wlan_prof_struct wlan_prof; + * vm_wlan_prof_init(&wlan_prof); + * + *****************************************************************************/ +VMINT vm_wlan_prof_init(vm_wlan_prof_struct *profile); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_prof_add + * DESCRIPTION + * The function is to add a new wlan profile by specified profile data. + * PARAMETERS + * prof : [IN] profile data buffer to be added + * prof_id : [OUT] return prof_id for wlan profile + * RETURN VALUES + * refer to vm_wlan_result_enum + * VM_WLAN_RESULT_SUCCESS : add profile successfully. + * VM_WLAN_RESULT_FAILED : add profile failed. + * VM_WLAN_RESULT_ONE_STORE_EXISTS : the profile has already been added. + * VM_WLAN_RESULT_INVALID_STORE : store handle invalid. + * VM_WLAN_RESULT_INVALID_INPUT : the input parameter is invalid. + * VM_WLAN_RESULT_STORE_FULL : storage full + * EXAMPLE + * + * vm_wlan_prof_struct wlan_prof; + * U32 prof_id = 0; + * vm_wlan_result_enum ret; + * vm_wlan_prof_init(&wlan_prof); + * strcpy(wlan_prof.ssid, "ssidexample"); + * // If auth mode is VM_WLAN_AUTH_MODE_OPEN, password is no need. + * wlan_prof.auth_mode = VM_WLAN_AUTH_MODE_WPA2_ONLY_PSK; + * strcpy(wlan_prof.password, "ssidpwd"); + * ret = vm_wlan_prof_add(&wlan_prof, &prof_id); + * if (ret == VM_WLAN_RESULT_SUCCESS) + * { + * // Add profile successfully. + * } + * + *****************************************************************************/ +VMINT vm_wlan_prof_add(const vm_wlan_prof_struct *prof, VMUINT32 *prof_id); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_prof_update + * DESCRIPTION + * The function is to update WLAN profile content by specified profile id. Structure + * data members can be updated seperately, or updated all at one time. + * PARAMETERS + * prof_id : [IN] update wlan profile id + * wlan_prof : [IN] profile info from application + * prof_fields : [IN] VM_WLAN_PROF_FIELD_X, such as VM_WLAN_PROF_FIELD_ALL + * RETURN VALUES + * refer to vm_wlan_result_enum + * VM_WLAN_RESULT_SUCCESS : update profile successfully. + * VM_WLAN_RESULT_INVALID_STORE : store handle invalid. + * VM_WLAN_RESULT_INVALID_INPUT : the input parameter is invalid. + * VM_WLAN_RESULT_READ_ONLY : this profile can't be deleted or update + * EXAMPLE + * + * // Fill in the new value for the data members you want to update. + * vm_wlan_prof_struct wlan_prof = {0}; + * strcpy(wlan_prof.password, "newpwd"); + * // There's an avaialbe profile id(For how to get an available profile id, please + * // refer to vm_wlan_prof_add()). + * vm_wlan_prof_update(prof_id, &wlan_prof, VM_WLAN_PROF_FIELD_PW); + * + *****************************************************************************/ +VMINT vm_wlan_prof_update(VMUINT32 prof_id, vm_wlan_prof_struct *prof, VMUINT32 prof_fields); + + + +/***************************************************************************** + * FUNCTION + * vm_wlan_prof_delete + * DESCRIPTION + * The function is to delete a WLAN profile by specified profile id. + * PARAMETERS + * prof_id : [IN] query wlan profile id + * RETURN VALUES + * refer to vm_wlan_result_enum + * VM_WLAN_RESULT_SUCCESS : delete profile successfully. + * VM_WLAN_RESULT_INVALID_STORE : store handle invalid. + * VM_WLAN_RESULT_INVALID_INPUT : the input parameter is invalid. + * VM_WLAN_RESULT_READ_ONLY : this profile can't be deleted or update + * EXAMPLE + * + * // There's an avaialbe profile id(For how to get an available profile id, please + * // refer to vm_wlan_prof_add()). + * vm_wlan_prof_delete(prof_id); + * + *****************************************************************************/ +VMINT vm_wlan_prof_delete(VMUINT32 prof_id); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_prof_connect + * DESCRIPTION + * The function is used to connect the applications specified AP for applications. + * 1. DA WLAN servive can only support one connection at the same time due to chip constraint. + * 2. If the new connect request is arrived, current connecting process will be aborted. + * 3. If there is one connection already, the connection will be disconnected + * then connect a new one. + * PARAMETERS + * prof_id : [IN] prof_id for wlan profile + * callback : [IN] connect result callback notify function for APP + * user_data : [IN] application associated piggyback data + * RETURN VALUES + * refer to vm_wlan_result_enum + * VM_WLAN_RESULT_INVALID_INPUT : profile_num <= 0 or profile pointer invalid + * VM_WLAN_RESULT_STATE_ERROR : the wlan status can't perform the scan process + * VM_WLAN_RESULT_PROCESSING : accept the connect quest, wait for event notify. + * EXAMPLE + * + * // STA status is ACTIVED before calling vm_wlan_prof_connect(). And there's an available + * // profile id(For how to get an available profile id, please refer to vm_wlan_prof_add()). + * vm_wlan_prof_connect(prof_id, conn_cb, NULL); + * void conn_cb(void *user_data, vm_wlan_req_res_enum res) + * { + * if (VM_WLAN_REQ_RES_DONE == res) + * { + * // Connection succeeds. + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_prof_connect(VMUINT32 prof_id, vm_wlan_conn_res_cb_func_ptr callback, void *user_data); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_prof_query + * DESCRIPTION + * The function is to query WLAN profile content by specified profile id. + * PARAMETERS + * prof_id : [IN] query wlan profile id + * prof : [OUT] profile info from application + * RETURN VALUES + * refer to vm_wlan_result_enum + * VM_WLAN_RESULT_SUCCESS : query profile successfully. + * VM_WLAN_RESULT_INVALID_STORE : store handle invalid. + * VM_WLAN_RESULT_INVALID_INPUT : the input parameter is invalid. + * EXAMPLE + * + * // There's an avaialbe profile id(For how to get an available profile id, please + * // refer to vm_wlan_prof_add()). + * vm_wlan_prof_struct wlan_prof = {0}; + * VM_WLAN_RESULT_SUCCESS ret; + * ret = vm_wlan_prof_query(prof_id, &wlan_prof); + * if (VM_WLAN_RESULT_SUCCESS == ret) + * { + * // Query profile successfully. wlan_prof returns with detail of the profile. + * } + * + *****************************************************************************/ +VMINT vm_wlan_prof_query(VMUINT32 prof_id, vm_wlan_prof_struct *prof); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_prof_query_list + * DESCRIPTION + * The function is to query the number and ids of the WLAN profiles added. + * PARAMETERS + * prof_list : [IN] query wlan profile list + * RETURN VALUES + * refer to vm_wlan_result_enum + * VM_WLAN_RESULT_SUCCESS : query profile successfully. + * VM_WLAN_RESULT_INVALID_STORE : store handle invalid. + * VM_WLAN_RESULT_INVALID_INPUT : the input parameter is invalid. + * EXAMPLE + * + * vm_wlan_prof_list_struct prof_list; + * vm_wlan_prof_query_list(&prof_list); + * + *****************************************************************************/ +VMINT vm_wlan_prof_query_list(vm_wlan_prof_list_struct *prof_list); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_set_reconn_prof_id + * DESCRIPTION + * The function is used to set reconnect profile id. It will be stored and may be used + * in reconfig flow. Every time connection succeeds, the reconn prof id will be set to + * be the conn prof id automatically. + * PARAMETERS + * prof_id : [IN] WLAN profile id which has been stored in WLAN service + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * // There's an avaialbe profile id(For how to get an available profile id, please + * // refer to vm_wlan_prof_add()). + * vm_wlan_prof_set_reconn_id(prof_id); + * + *****************************************************************************/ +VMINT vm_wlan_prof_set_reconn_id(VMUINT32 prof_id); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_get_reconn_prof_id + * DESCRIPTION + * The function is used to get reconnect profile id. It will be stored and may be used + * in bootup flow. Everytime connection succeeds, the reconn prof id will be set to be + * the conn prof id automatically. + * PARAMETERS + * prof_id : [OUT] WLAN profile id which has been stored in WLAN service + * RETURN VALUES + * success if 0, else failure. + * EXAMPLE + * + * U32 prof_id; + * vm_wlan_prof_get_reconn_id(&prof_id); + * + *****************************************************************************/ +VMINT vm_wlan_prof_get_reconn_id(VMUINT32 *prof_id); + + +/***************************************************************************** + * FUNCTION + * vm_wlan_roaming_set + * DESCRIPTION + * The function is used to set roaming parameter. + * PARAMETERS + * enable_roaming : [IN] WLAN roaming parameter + * RETURN VALUES + * VM_WLAN_RESULT_SUCCESS : Successfuly. + * VM_WLAN_RESULT_FAILED : Failed. + * VM_WLAN_RESULT_PROCESSING : Waiting for result. + * EXAMPLE + * + * MMI_BOOL enable_roaming = MMI_TRUE; + * vm_wlan_roaming_set(enable_roaming, set_roaming_cb, NULL); + * void set_roaming_cb(void *user_data, vm_wlan_req_res_enum res) + * { + * if (VM_WLAN_REQ_RES_DONE == res) + * { + * // Set roaming successfully. + * } + * } + * + *****************************************************************************/ +VMINT vm_wlan_roaming_set(VMINT enable_roaming, vm_wlan_cb_func_ptr callback, void *user_data); + +/***************************************************************************** + * FUNCTION + * vm_wlan_roaming_get + * DESCRIPTION + * The function is used to get roaming parameter. + * PARAMETERS + * is_roaming : [OUT] WLAN roaming parameter + * RETURN VALUES + * VM_WLAN_RESULT_SUCCESS: Successfuly. + * VM_WLAN_RESULT_FAILED: Failed. + * EXAMPLE + * + * MMI_BOOL is_roaming = MMI_TRUE; + * vm_wlan_roaming_get(&is_roaming); + * + *****************************************************************************/ +VMINT vm_wlan_roaming_get(VMINT *is_roaming); + + +/***************************************************************************** + * FUNCTION + * vm_srv_wlan_set_para + * DESCRIPTION + * Set parameters under different modes. User should prepare variables with proper types for + * "para" and "flag" input parameters. + * + * Currently, only MODE_AP and MODE_AP_STA are supported to set AP's SSID, Auth mode, and + * Password. For Auth mode, only OPEN and WPA2_ONLY_PSK are supported. To make the parameter(s) + * work, do set parameter(s) before AP is turned on. + * + * Default values will be used if parameters are not set or setting operation failed. + * Default SSID: MTK_XXXXXX(The value of XXXXXX depends on the last three bytes of mac addr) + * Default AUTH MODE: WPA2_ONLY_PSK + * Default Password: 12345678 + * + * PARAMETERS + * para : [IN] vm_wlan_cfg_ap_struct(in AP mode) + * flag : [IN] Indicate which parameter to config. + * vm_wlan_cfg_ap_para_enum(in AP mode) + * RETURNS + * VM_WLAN_RESULT_SUCCESS: set parameter success + * VM_WLAN_RESULT_FAILED: set parameter fail + * VM_WLAN_RESULT_STATE_ERROR: set at inappropriate state, such as set AP para when AP is on. + * VM_WLAN_RESULT_INVALID_INPUT: invalid input parameters. + * EXAMPLE + * + * // Set AP parameter before turning on AP mode. + * srv_wlan_cfg_ap_struct ap_param = {0}; + * ap_param.auth_mode = VM_WLAN_AUTH_MODE_WPA2_ONLY_PSK; + * strcpy(ap_param.ssid, "SSIDEXAMPLE"); + * strcpy(ap_param.pwd, "PWDEXAMPLE") + * vm_wlan_set_para(VM_WLAN_SET_MODE_AP, (void*)&ap_param, VM_WLAN_CFG_AP_PARA_ALL); + * + *****************************************************************************/ +VMINT vm_wlan_set_para( + vm_wlan_set_mode_enum mode, + void *para, + VMINT32 flag); + + +/***************************************************************************** + * FUNCTION + * vm_srv_wlan_get_para + * DESCRIPTION + * Get parameter under different modes. Currently, only MODE_AP or MODE_AP_STA are + * supported to get AP's SSID, Auth mode, and Password. + + * User should prepare varible with proper type for "para" input parameter. + * PARAMETERS + * para : [OUT] return parameters to App. + * srv_wlan_cfg_ap_struct(under MODE_AP or MODE_AP_STA) + * RETURNS + * VM_WLAN_RESULT_SUCCESS: get parameter success + * VM_WLAN_RESULT_FAILED: get parameter fail + * VM_WLAN_RESULT_INVALID_INPUT: invalid input parameters. + * EXAMPLE + * + * vm_wlan_cfg_ap_struct ap_param = {0}; + * vm_wlan_get_para(SRV_WLAN_SET_MODE_AP, (void*)&ap_param); + * + *****************************************************************************/ +VMINT vm_wlan_get_para( + vm_wlan_set_mode_enum mode, + void *para); + + + + +#define VM_SCANONLY_MAX_SCAN_AP_NUM 15 +#define VM_SCANONLY_MAC_ADDRESS_LEN 6 +#define VM_SCANONLY_SSID_MAX_LEN 32 + +typedef enum +{ + VM_WNDRV_RESULT_SUCCESS, + VM_WNDRV_RESULT_WOULDBLOCK, + VM_WNDRV_RESULT_TOTAL +} vm_wndrv_result_enum; + +typedef enum + +{ + VM_SCANONLY_SUCCESS = 0, + + VM_SCANONLY_INIT_BUSY_IS_INITING= 1, + VM_SCANONLY_INIT_FAIL__ALREAD_INITED, + VM_SCANONLY_INIT_FAIL__DRIVER_REASON, + VM_SCANONLY_INIT_FAIL__UNKOWN, + + VM_SCANONLY_DEINIT_BUSY__IS_DEINITING = 10, + VM_SCANONLY_DEINIT_FAIL__ALREAD_DEINITED, + VM_SCANONLY_DEINIT_FAIL__DRIVER_REASON, + VM_SCANONLY_DEINIT_FAIL__UNKOWN, + + VM_SCANONLY_SCAN_BUSY__IS_SCANNING = 20, + VM_SCANONLY_SCAN_FAIL__NOT_INITED, + VM_SCANONLY_SCAN_FAIL__DRIVER_REASON, + VM_SCANONLY_SCAN_FAIL__UNKOWN, + + VM_SCANONLY_STATUS_END +}VM_SCANONLY_STATUS_ENUM; + +typedef struct +{ + // Reserved struct + void *para; +} vm_wlan_init_req_struct; + +typedef struct +{ + VM_SCANONLY_STATUS_ENUM state; +} vm_wlan_init_cnf_struct; + +typedef struct +{ + // Reserved struct + void *para; +} vm_wlan_deinit_req_struct; + +typedef struct +{ + VM_SCANONLY_STATUS_ENUM state; +} vm_wlan_deinit_cnf_struct; + +typedef struct +{ + // Reserved struct + void *para; +} vm_wlan_scan_req_struct; + + +typedef struct +{ + VMUINT8 bssid[ VM_SCANONLY_MAC_ADDRESS_LEN ]; + VMUINT8 ssid_len; + VMUINT8 ssid [ VM_SCANONLY_SSID_MAX_LEN ]; + signed char rssi; + VMUINT8 channel_number; +} vm_scanonly_scan_ap_info_struct; + +typedef struct +{ + VM_SCANONLY_STATUS_ENUM status; + VMUINT8 scan_ap_num; + vm_scanonly_scan_ap_info_struct scan_ap[ VM_SCANONLY_MAX_SCAN_AP_NUM ]; +} vm_wlan_scan_cnf_struct; + +/* Callback */ +typedef void (*vm_wlan_init_cb) (void *user_data, vm_wlan_init_cnf_struct *cnf); +typedef void (*vm_wlan_deinit_cb) (void *user_data, vm_wlan_deinit_cnf_struct *cnf); +typedef void (*vm_wlan_scan_cb) (void *user_data, vm_wlan_scan_cnf_struct *cnf); + +/***************************************************************************** + * FUNCTION + * vm_wndrv_init + * DESCRIPTION + * The function is used to switch WIFI on in station mode. + * PARAMETERS + * req : [IN] reserved parameter + * callback : [IN] init result callback notify function for APP + * user_data : [IN] application piggyback data + * RETURNS + * VM_WNDRV_RESULT_WOULDBLOCK : Wouldblock. callback will be invoked later to notify the result. + * EXAMPLE + * + * vm_wndrv_init(NULL, init_cb, NULL); + * void init_cb(void *user_data, vm_wlan_init_cnf_struct *cnf) + * { + * if (VM_SCANONLY_SUCCESS == cnf->state) + * { + * // successfully. + * } + * } + * + *****************************************************************************/ +VMINT vm_wndrv_init(vm_wlan_init_req_struct *req, vm_wlan_init_cb callback, void *user_data); + +/***************************************************************************** + * FUNCTION + * vm_wndrv_deinit + * DESCRIPTION + * The function is used to switch WIFI off. + * PARAMETERS + * req : [IN] reserved parameter + * callback : [IN] deinit result callback notify function for APP + * user_data : [IN] application piggyback data + * RETURNS + * VM_WNDRV_RESULT_WOULDBLOCK : Wouldblock. callback will be invoked later to notify the result. + * EXAMPLE + * + * vm_wndrv_deinit(NULL, deinit_cb, NULL); + * void deinit_cb(void *user_data, vm_wlan_deinit_cnf_struct *cnf) + * { + * if (VM_SCANONLY_SUCCESS == cnf->state) + * { + * // successfully. + * } + * } + * + *****************************************************************************/ +VMINT vm_wndrv_deinit(vm_wlan_deinit_req_struct *req, vm_wlan_deinit_cb callback, void *user_data); + +/***************************************************************************** + * FUNCTION + * vm_wndrv_scan + * DESCRIPTION + * The function is used to scan the AP list for applications. + * PARAMETERS + * req : [IN] reserved parameter + * callback : [IN] scan result callback notify function for APP + * user_data : [IN] application piggyback data + * RETURNS + * VM_WNDRV_RESULT_WOULDBLOCK : Wouldblock. callback will be invoked later to notify the result. + * EXAMPLE + * + * vm_wndrv_scan(NULL, scan_cb, NULL); + * void scan_cb(void *user_data, vm_wlan_scan_cnf_struct *cnf) + * { + * if (VM_SCANONLY_SUCCESS == cnf->status) + * { + * // Scan successfully. Information of APs scaned is in cnf. + * } + * } + * + *****************************************************************************/ +VMINT vm_wndrv_scan(vm_wlan_scan_req_struct *req, vm_wlan_scan_cb callback, void *user_data); + + +#ifdef __cplusplus +} +#endif + +#endif /* VM_NWSETTING_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmota.h b/hardware/arduino/mtk/system/libmtk/include/vmota.h new file mode 100644 index 00000000..0131715f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmota.h @@ -0,0 +1,140 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmota_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * ota + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_OTA_SDK_H +#define VM_OTA_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ +#include "vmsys.h" + +#define VM_UPDATE_OK_ALREADY_DOWNLOADED 1 +#define VM_UPDATE_OK 0 +#define VM_UPDATE_ERROR -2 +#define VM_UPDATE_ERROR_GET_VERSION_FAIL -3 +#define VM_UPDATE_ERROR_GET_APP_ID_FAIL -4 +#define VM_UPDATE_ERROR_GET_SC_FAIL -5 +#define VM_UPDATE_ERROR_PATH_NOT_EXIST -6 +#define VM_UPDATE_ERROR_NO_MEMORY -7 +#define VM_UPDATE_ERROR_NO_UPDATE_FILE -8 +#define VM_UPDATE_ERROR_INTER -9 + +typedef void (*vm_update_app_callback)(VMINT hdl, void * para); + + + +/***************************************************************************** + * FUNCTION + * vm_update_check_version + * DESCRIPTION + * check new version is avaliable or not through service. + * PARAMETERS + * + * RETURNS + * error code, VM_UPDATE_OK means success, can get result from callback + * VM_UPDATE_OK_ALREADY_DOWNLOADED means new version already downloaded + *****************************************************************************/ +VMINT vm_update_check_version(VMSTR URL, VMINT port, VMINT apn, vm_update_app_callback callback, void* user_data); + +/***************************************************************************** + * FUNCTION + * vm_update_download + * DESCRIPTION + * after check version, can use this to download new version app + * PARAMETERS + * + * RETURNS + * error code, VM_UPDATE_OK means success, can get result from callback + *****************************************************************************/ +VMINT vm_update_download(VMINT handle, VMINT bOnCard, vm_update_app_callback callback, void* user_data); + + +/***************************************************************************** + * FUNCTION + * vm_update_update_file + * DESCRIPTION + * if downloaded, can use this to update to new version app. This will exit the running app. + * PARAMETERS + * + * RETURNS + *****************************************************************************/ +VMINT vm_update_update_file(void); + +/***************************************************************************** + * FUNCTION + * vm_update_cancel + * DESCRIPTION + * cancel the downloading process + * PARAMETERS + * + * RETURNS + *****************************************************************************/ +VMINT vm_update_cancel(VMINT handle); + +VMINT vm_update_check_launch(VMWSTR path, VMWSTR new_path); + + +#define vm_update_mre_app_callback vm_update_app_callback + +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_OTA_SDK_H*/ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmpayment.h b/hardware/arduino/mtk/system/libmtk/include/vmpayment.h new file mode 100644 index 00000000..e2942187 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmpayment.h @@ -0,0 +1,103 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VM_PURCHASE_SDK_H +#define VM_PURCHASE_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +typedef enum +{ + VM_BUYER_ALIPAY +}vm_payment_type_enum; + +typedef enum +{ + VM_PURCHASE_RET_ERR_PARAM, + VM_PURCHASE_RET_ERR_FAILURE, + VM_PURCHASE_RET_ERR_SIM, + VM_PURCHASE_RET_ERR_SUCCESS = 0, +}vm_purchase_ret_enum; + +typedef VMINT VM_H_BUYER; +typedef void (*purchase_cb)(void*); + + +/***************************************************************************** + * FUNCTION + * vm_create_buyer + * DESCRIPTION + * get the payment handle. + * PARAMETERS + * payment_type : [IN] + * RETURNS + * the handle of the buyer, non-negtive is successful +*****************************************************************************/ +VM_H_BUYER vm_create_buyer(vm_payment_type_enum payment_type); + +/***************************************************************************** +* FUNCTION + * vm_purchase_item + * DESCRIPTION + * the operation of item-purchase. + * PARAMETERS + * h : [IN] buyer handle. + * data : [IN] user data. + * cb : [IN] feedback of purchase + * RETURNS + * the number of process that have created already. +*****************************************************************************/ +VMINT vm_purchase_item(VM_H_BUYER h, void * data, purchase_cb cb); + + +/***************************************************************************** + * FUNCTION + * vm_release_buyer + * DESCRIPTION + * release the handle of buyer. + * PARAMETERS + * h : [IN] buyer handle. +*****************************************************************************/ +void vm_release_buyer(VM_H_BUYER h); + +#ifdef __cplusplus +} +#endif + +#endif /* VM_PURCHASE_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmpn.h b/hardware/arduino/mtk/system/libmtk/include/vmpn.h new file mode 100644 index 00000000..be4441aa --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmpn.h @@ -0,0 +1,316 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmpn.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * MRE push + * + * Author: + * ------- + * Feng Lin(mtk80996) + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ + * $Log$ + * + * 06 14 2012 feng.lin + * [MAUI_03129054] MRE PUSH Receiver check in CR + * . + * + * 05 15 2012 jianying.li + * [MAUI_03185909] [MREPUSH2.0] push 2.0 check-in + * . + * + * 05 10 2012 feng.lin + * [MAUI_02997195] [MRE_SOC] + * query key supported & pn supported. + * + * 04 23 2012 zhibo.tong + * [MAUI_03129054] MRE PUSH Receiver check in CR + * . + * + * 04 10 2012 zhibo.tong + * [MAUI_03129054] MRE PUSH Receiver check in CR + * . + * + * 04 10 2012 zhibo.tong + * [MAUI_03129054] MRE PUSH Receiver check in CR + * . + * + * 04 09 2012 zhibo.tong + * [MAUI_03129054] MRE PUSH Receiver check in CR + * . + * + * 04 05 2012 feng.lin + * [MAUI_03129054] MRE PUSH Receiver check in CR + * . + * + * 04 01 2012 feng.lin + * [MAUI_03129054] MRE PUSH Receiver check in CR + * . + * + * 04 01 2012 zhibo.tong + * [MAUI_03129054] MRE PUSH Receiver check in CR + * . + * + * 03 27 2012 feng.lin + * [MAUI_02997195] [MRE_SOC] + * push. + * + * 03 26 2012 zhibo.tong + * [MAUI_03129054] MRE PUSH Receiver check in CR + * . + * + * 03 22 2012 feng.lin + * [MAUI_02997195] [MRE_SOC] + * vmpn. + * + * *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== + *******************************************************************************/ +#ifndef VM_PN_SDK_H +#define VM_PN_SDK_H + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "vmsys.h" + +#define VM_SRV_PNS_ALERT_TEXT_MAX_LEN 150 /* include '\0' */ +#define VM_SRV_PNS_MAX_MSGBODY_SIZE 257 /* include '\0' */ +#define VM_SRV_PNS_REGID_LEN 26 /* include '\0' */ +#define VM_SRV_PNS_ACTION_TEXT_MAX_LEN 51 +#define VM_SRV_PNS_MAX_MPS_ARGS_NUM 3 +#define VM_SRV_PNS_MAX_MPS_ARG_LEN 21 /* include '\0' */ + +#define VM_PN_EVT_PARAM_HEADER \ +VMUINT16 evt_id; \ +VMUINT16 size; \ +void * user_data + + +typedef enum +{ + VM_SRV_PNS_NO_ERROR = 0, + VM_SRV_PNS_SERVICE_NOT_AVAILABLE = -1, + VM_SRV_PNS_INVALID_DATA_CONNECTION = -2, + VM_SRV_PNS_TOO_MANY_REGISTRATIONS = -3, + VM_SRV_PNS_INVALID_SENDER = -4, + VM_SRV_PNS_INVALID_APPID = -5, + VM_SRV_PNS_LAST_MSG_ON_PROCESSING = -6, + VM_SRV_PNS_SYSTEM_ERROR = -7, + + VM_SRV_PNS_ALREADY_IN_QUEUE = -8, + VM_SRV_PNS_JSON_PARSING_ERR = -9, + VM_SRV_PNS_JSON_PAYLOAD_FORMAT_ERR = -10, + VM_SRV_PNS_JSON_PAYLOAD_NOT_FOUND = -11, + + VM_SRV_PNS_PARAM_ERR = -12, + VM_SRV_PNS_QUERY_FAIL = -13, + + VM_SRV_PNS_ERR_TOTAL = -100 +} vm_srv_pns_result; + +typedef enum +{ + // list/File + SRV_MRE_PUSH_TYPE_LIST_NULL = -100, + SRV_MRE_PUSH_TYPE_LIST_NOT_FIND, + SRV_MRE_PUSH_TYPE_FILE_SAVE_FAIL, + + // dereg / reg + SRV_MRE_PUSH_TYPE_REG_ID_ALREADY_REG = -70, + SRV_MRE_PUSH_TYPE_DEREG_BADPARA, + + // Setting + SRV_MRE_PUSH_TYPE_SETTING_OFF = -50, + + // normal + SRV_MRE_PUHS_TYPE_BADPARA = -30, + SRV_MRE_PUHS_TYPE_INTERNAL_ERROR, + SRV_MRE_PUHS_TYPE_SUCCESS = 0, + SRV_MRE_PUHS_TYPE_FILE_EXIT, + SRV_MRE_PUHS_TYPE_FILE_NOT_EXIT, + SRV_MRE_PUHS_TYPE_END, +}srv_mre_push_type_enum; + + +typedef enum +{ + VM_SRV_MRE_MPR_QUERY_APP_ID = 0, + VM_SRV_MRE_MPR_QUERY_SENDER_ID, + VM_SRV_MRE_MPR_QUERY_REGISTER_ID, + VM_SRV_MRE_MPR_QUERY_SETTING_STATUS, + VM_SRV_MRE_MPR_QUERY_BADGE, + VM_SRV_MRE_MPR_QUERY_PAYLOAD, + VM_SRV_MRE_MPR_QUERY_PAYLOAD_COUNT, + VM_SRV_MRE_MPR_QUERY_PAYLOAD_BY_INDEX, + VM_SRV_MRE_MPR_QUERY_MULTIPLE_PAYLOAD, + VM_SRV_MRE_MPR_QUERY_END, +} vm_srv_pns_query_event; + + +/* + * please notify that:high-Weight is means ON/OFF. + * so if you add style don't change this for new type + * so never use 0x10000000 express a kind of style, +*/ +typedef enum +{ + VM_SRV_MRE_MPR_NOTIFY_STYLE_TEXT_PREVIEW = 0x00000001, + VM_SRV_MRE_MPR_NOTIFY_STYLE_POPUP = 0x00000010, + VM_SRV_MRE_MPR_NOTIFY_STYLE_END, +} vm_srv_pns_notify_style; + +typedef enum +{ + VM_SRV_MRE_MPR_NOTIFY_OFF = 0x00000000, + VM_SRV_MRE_MPR_NOTIFY_ON = 0x10000000, + VM_SRV_MRE_MPR_NOTIFY_END, +} vm_srv_pns_notify_switch; + +typedef struct +{ + VMUINT32 index; + VMCHAR * app_payload; /*the length of this should be VM_SRV_PNS_MAX_MSGBODY_SIZE or larger*/ +}vm_query_one_payload_by_index; /*when user query one payload,should transfer this struct to query function*/ + +typedef VMCHAR vm_one_payload_struct[VM_SRV_PNS_MAX_MSGBODY_SIZE]; +typedef struct +{ + VMUINT32 * payload_count; /*this is an input and also an output*/ + vm_one_payload_struct * app_payload; +}vm_query_multiple_payload_by_count;/*when user query multiple payload,should transfer this struct to query function*/ + +typedef struct +{ + VM_PN_EVT_PARAM_HEADER; +}vm_srv_pns_event_struct; + +typedef struct +{ + VM_PN_EVT_PARAM_HEADER; + VMINT appId; + VMCHAR reg_id[VM_SRV_PNS_REGID_LEN]; + vm_srv_pns_result result; +}vm_srv_pns_identity_event_struct; + + +typedef struct +{ + /* alert begin */ + VMINT32 mainLen; + VMCHAR main[VM_SRV_PNS_ALERT_TEXT_MAX_LEN]; + VMINT32 hintLen; + VMCHAR hint[VM_SRV_PNS_ALERT_TEXT_MAX_LEN]; + VMINT32 mainResId; + VMINT32 hintResId; + /* alert end */ + + VMINT32 actionLen; + VMCHAR action[VM_SRV_PNS_ACTION_TEXT_MAX_LEN]; + + VMINT32 badge; + VMINT32 icon; + VMINT32 sound; +}vm_srv_pns_msg_mps_struct; + +typedef struct +{ + /* alert begin */ + VMINT32 mainLen; + VMCHAR main[VM_SRV_PNS_ALERT_TEXT_MAX_LEN]; + VMINT32 hintLen; + VMCHAR hint[VM_SRV_PNS_ALERT_TEXT_MAX_LEN]; + VMINT32 mainResId; + VMCHAR main_args[VM_SRV_PNS_MAX_MPS_ARGS_NUM][VM_SRV_PNS_MAX_MPS_ARG_LEN]; + VMINT32 main_args_num; + + VMINT32 hintResId; + VMCHAR hint_args[VM_SRV_PNS_MAX_MPS_ARGS_NUM][VM_SRV_PNS_MAX_MPS_ARG_LEN]; + VMINT32 hint_args_num; + /* alert end */ + + VMINT32 actionLen; + VMCHAR action[VM_SRV_PNS_ACTION_TEXT_MAX_LEN]; + VMINT32 actionResId; + + VMINT32 badge; + VMINT32 icon; + VMINT32 sound; +}vm_srv_pns_msg_mps_struct_ex; +typedef struct +{ + VMBYTE dictionary; + VMCHAR msgBody[VM_SRV_PNS_MAX_MSGBODY_SIZE]; +}vm_srv_pns_msg_value_struct; + + +typedef VMINT (*vm_pn_cb)(vm_srv_pns_event_struct * evt, void * user_data); + + +VMINT vm_pn_is_support(void); + +VMINT vm_pn_get_global_setting(void); // 0 off; 1 on. + +VMINT vm_pn_reg(vm_pn_cb cb, void* user_data); +VMINT vm_pn_dereg(); +VMINT vm_pn_query(vm_srv_pns_query_event query_id, void * user_data); +VMINT vm_pn_get_mps_info(const VMCHAR * msgBody, vm_srv_pns_msg_mps_struct * mpsPtr); +VMINT vm_pn_get_object(const VMCHAR * msgBody, const VMCHAR * key, vm_srv_pns_msg_value_struct * value); +VMINT vm_pn_set_notify_style(vm_srv_pns_notify_switch OnOff, vm_srv_pns_notify_style style); +VMINT vm_pn_set_badge(VMINT32 badge_number); +VMINT vm_pn_get_mps_info_ex(const VMCHAR * msgBody, vm_srv_pns_msg_mps_struct_ex * mpsPtr); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* VM_PN_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmpromng.h b/hardware/arduino/mtk/system/libmtk/include/vmpromng.h new file mode 100644 index 00000000..876ec385 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmpromng.h @@ -0,0 +1,719 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef _VM_PRO_MNG_SDK_ +#define _VM_PRO_MNG_SDK_ + +#include "vmsys.h" + +#ifdef __cplusplus +extern "C" { +#endif + + + +typedef VMINT VM_P_HANDLE;/*VMINT*/ + +//process procedure related interfaces + +#define VM_PMNG_OP_OK (0) +#define VM_PMNG_PROCESS_NO_EXISTS (-1) +#define VM_PMNG_NO_OP_IN_STATUS (-2) +#define VM_PMNG_ERROR_PARAM (-3) +#define VM_PMNG_NO_MEM (-4) +#define VM_PMNG_ERROR_IO (-5) +#define VM_PMNG_NO_SCHEDULE (-6) +#define VM_PMNG_EXIT (-7) +#define VM_PMNG_CERT_FAIL (-8) +#define VM_PMNG_ERROR_FUNLST (-9) + +#define VM_PMNG_SEC_TAG_PLATFORM_PARAM_DISMATCH (-10) +#define VM_PMNG_SEC_APP_TIMESTAMP_ERROR (-11) +#define VM_PMNG_SEC_IMSI_DISMATCH (-12) +#define VM_PMNG_SEC_BAN_LIST_APP (-13) +#define VM_PMNG_SEC_INVALIDATE_APP (-14) +#define VM_PMNG_SEC_CERT_OMREDUE (-15) +#define VM_PMNG_SEC_CERT_SMALL_SYS_MEM (-16) + +#define VM_PMNG_WAIT_ASM (-17) +#define VM_PMNG_NOT_SUPPORT_VP (-18) +#define VM_PMNG_ONLY_ONE_FOREGROUND (-19) +#define VM_PMNG_MAX_APP_NUM_REACHED (-20) + +#define VM_PMNG_CUR_HANDLE (0x0f) + +#define VM_PMNG_KERNEL_HANDLE (0) + +#define VM_MAX_PATH 261 /*VM_MAX_PATH*/ +/*VM_PROCESS_STATUS*/ +typedef enum +{ + VM_PMNG_UNLOAD = 0, /* state that loaded to memory but not started */ + VM_PMNG_FOREGROUND, /* state of foreground running */ + VM_PMNG_BACKGROUND, /*state of background running */ + VM_PMNG_STARTING, /*state of starting */ + VM_PMNG_CLOSING, /*state of closing */ + VM_PMNG_INACTIVE, /*state of inactive */ + VM_PMNG_MAX_NUM /*max status */ +}VM_PROCESS_STATUS; + +typedef enum +{ + VM_QUIT_NORMAL, + VM_QUIT_MASS_STORAGE, + VM_QUIT_CARD_PLUG_OUT +}VM_QUIT_TYPE; +/*vm_process_property*/ +typedef struct +{ + VM_P_HANDLE pHandle;/*process's handle*/ + VMINT appID;/*appid*/ + VM_PROCESS_STATUS status;/*VM_PROCESS_STATUS*/ + VM_P_HANDLE pParentHandle;/*parent's handle*/ + VMINT type;/*not used*/ + VMINT reserved[5];/*not used*/ + VMWCHAR filePath[VM_MAX_PATH];/*path*/ +}vm_process_property; + +typedef struct { + VMINT (*sys_event_filter)(VMINT message, VMINT param); + VMINT (*pen_event_filter)(VMINT pen_event, VMINT x, VMINT y); + VMINT (*key_event_filter)(VMINT key_event, VMINT key_code); +} _event_filter_t; + +/* LinkIt module structure */ +typedef struct +{ + VMUINT mod_core_base : 1;//base + VMUINT mod_core_sandbox : 1;//sandbox + VMUINT mod_core_resmgr : 1;//resource manager + VMUINT mod_core_safety : 1;//safety + VMUINT mod_core_commu : 1;//communication + VMUINT mod_core_sm : 1;//share module,use for ADS,RVCT + VMUINT mod_core_so : 1;//share object,for RVCT,GCC + VMUINT mod_lib_appres : 1;//app resource + VMUINT mod_lib_c : 1;//c library + VMUINT mod_lib_chset : 1;//char set + VMUINT mod_lib_defgame : 1; + VMUINT mod_lib_ddraw : 1;//direct draw + VMUINT mod_lib_gfxold : 1; + VMUINT mod_lib_image : 1;//graphic + VMUINT mod_lib_http : 1;//http + VMUINT mod_lib_ime : 1;//ime + VMUINT mod_lib_ini : 1; + VMUINT mod_lib_log : 1;//log + VMUINT mod_lib_mullang : 1;//multi-language + VMUINT mod_lib_network : 1;//network + VMUINT mod_lib_vip : 1; + VMUINT mod_lib_vip_vg : 1; + VMUINT mod_lib_xml : 1;//xml + VMUINT mod_sal_audio : 1;//audio + VMUINT mod_sal_bitstream : 1;//bit stream + VMUINT mod_sal_camera : 1;//camera + VMUINT mod_sal_cell : 1;//cell + VMUINT mod_sal_che_des : 1;//CHE DES + VMUINT mod_sal_che_md5 : 1;//CHE MD5 + VMUINT mod_sal_che_sha1 : 1;//CHE SHA1 + VMUINT mod_sal_gps : 1;//gps + VMUINT mod_sal_mms : 1;//mms + VMUINT mod_sal_phonebook : 1;//phonebook + VMUINT mod_sal_sensor : 1;//sensor + VMUINT mod_sal_sim : 1;//sim + VMUINT mod_sal_sms : 1;//sms + VMUINT mod_sal_socket : 1;//socket + VMUINT mod_sal_status : 1;//status bar + VMUINT mod_sal_tele : 1;//telephone + VMUINT mod_sal_timer : 1;//timer + VMUINT mod_sal_video : 1;//video + VMUINT mod_sal_wallpaper : 1; + VMUINT mod_sal_wps : 1;//https + VMUINT mod_app_launch : 1;//launch app + VMUINT mod_sal_payment : 1;//payment +}vm_module_struct; +/***************************************************************************** +* FUNCTION +* vm_main +* DESCRIPTION +* This is entry function of application and application must implement it. +*****************************************************************************/ +void vm_main(void); + +/** + * the message of asking for application to repaint screen. + */ +#define VM_MSG_PAINT 1 + +/** + * the message of application state from inactive to active. + */ +#define VM_MSG_ACTIVE 2 + +/** + * the message of application state from active to inactive. + */ +#define VM_MSG_INACTIVE 3 + +/** + * the message of creation of application + */ +#define VM_MSG_CREATE 4 + +/** + * the message of quit of application + */ +#define VM_MSG_QUIT 5 + +/** + * the message of application state from foreground running to background running. + */ +#define VM_MSG_HIDE 6 + +/** + * the message to notify application memory card has been plug out. + */ +#define VM_MSG_CARD_PLUG_OUT 7 + +/** + * the message when screen rotate. + */ +#define VM_MSG_SCREEN_ROTATE 8 + +/** + * the message of application when foreground running and receive PUSH Message. + */ +#define VM_MSG_PUSH 9 + +/*when cgi start LinkIt app with cmd,will send VM_MSG_HTTP*/ +#define VM_MSG_HTTPD 10 + +/** + * when AP mode application launch success, it will receive this message, in this message app need load tiny system driver + */ +#define VM_MSG_LOAD_TINY 12 + +/** + * when system switch form suspend mode to AP mode, app will receive this message, and app need deal with the share data + */ +#define VM_MSG_SUSPEND_TO_AP_MODE 13 + +/** + * when system switch form hibernation mode to AP mode, app will receive this message, and app need get tiny system driver handle, and deal with the share data + */ +#define VM_MSG_HIBERNATION_TO_AP_MODE 14 + +#define VM_MSG_CELL_INFO_CHANGE 15 + +/** + * when the battery is low + */ +#define VM_MSG_LOW_BATTERY 16 + +/** + * when the power off + */ +#define VM_MSG_SHUTDOWN 17 + +/** + * atci message + */ +#define VM_MSG_ATCI_IND 1030 + +/** + * atci message response + */ +#define VM_MSG_ATCI_RSP 1031 + + +#define VM_MSG_RESTART_PARENT 100 + + +/*LinkIt user ID, corresponding to the value : a string with max length 20(unit:VMCHAR) e.g. 100973*/ +#define MRE_SYS_SUBSCRIBER_ID (1) + +/*LinkIt system user agent, corresponding to the value : a string with max length 20(unit:VMCHAR) e.g. Gionee-A10*/ +#define MRE_SYS_EQUIPMENT_ID (2) + +/*LinkIt version,corresponding to the value : a string with max length 12(unit:VMCHAR) + *naming rule :"main version number.sub-version number.release number",e.g. 1.2.6 */ +#define MRE_SYS_VERSION (3) + +/*platform version,corresponding to the value :a string with max length 30(unit:VMCHAR). e.g. MT6225_08A_VERSION*/ +#define MRE_SYS_HOST_VERSION (4) + +/*Max memory that LinkIt can get,corresponding to the value :a string with max length 6(unit:VMCHAR), it can be change to +*number by atoi function(unit:KB), the memory is the sum of LinkIt system memory and app memory. e.g. 800*/ +#define MRE_SYS_HOST_MAX_MEM (5) + +/*LinkIt system home path,corresponding to the value :a string with max length 30(unit:VMCHAR),e.g. C:\LinkIt*/ +#define MRE_SYS_HOME_DIR (6) + +/*platform build date and time :a string with max length 30(unit:VMCHAR). e.g. 2012/02/09 11:47*/ +#define MRE_SYS_BUILD_DATE_TIME (7) + +/*platform release branch and info. e.g. 11B NEUTRON52_12864*/ +#define MRE_SYS_RELEASE_BRANCH (8) + +#define VM_PROF_NORMAL_MODE 0 /* normal mode */ +#define VM_PROF_MEETING_MODE 1 /* Meeting mode */ +#define VM_PROF_SILENT_MODE 2 /* Silnet mode */ +#define VM_PROF_HEADSET_MODE 3 /* Headset mode */ +#define VM_PROF_BLUETOOTH_MODE 4 /* Bluetooth profile */ + +/* builtin sm struct */ +typedef struct _vm_sm_builtin_struct +{ + VMINT8 file_name[32]; /* sm file name */ + VMUINT address; /* sm memory address */ +} vm_sm_builtin_struct; + +/* DOM-NOT_FOR_SDK-BEGIN */ + +#define VM_MSG_CONFIRM_EXIT 1001 +#define VM_MSG_FORCE_FREE 1002 + + +/** + * The reason of HIDE or PAINT Event + */ +enum { + SCREEN_POPUP = 0, /* HIDE or PAINT cause of POPUP£¬like incoming call, sms, input method, etc. */ + USER_END_KEY /* HIDE cause of END key */ +}; + +/** + * System event structure + */ +typedef struct _vm_sysevt_param_t +{ + VMINT evt_cause; /* Reason of the event */ + void * evt_detail; /* reserved */ +} vm_sysevt_param_t; + +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** +* FUNCTION + * vm_reg_sysevt_callback + * DESCRIPTION + * register system message callback function.must be called in vm_main() + * PARAMETERS + * f : [IN] callback function. +*****************************************************************************/ +void vm_reg_sysevt_callback(void (*f)(VMINT message, VMINT param)); + +/***************************************************************************** +* FUNCTION +* vm_exit_app +* DESCRIPTION +* LinkIt application call this function to quit. +*****************************************************************************/ +void vm_exit_app(void); + +/* DOM-NOT_FOR_SDK-BEGIN */ +// do not support this function +/***************************************************************************** +* FUNCTION +* vm_exit_and_update_app +* DESCRIPTION +* LinkIt application call this function to quit and update application itself. +*****************************************************************************/ +void vm_exit_and_update_app(void); +/* DOM-NOT_FOR_SDK-END */ + + +/* DOM-NOT_FOR_SDK-BEGIN */ + +/****************************************************************************** + * FUNCTION + * vm_get_customer_name + * DESCRIPTION + * get customer name + * PARAMETERS + * value : [OUT] string to store customer name. + * len : [IN] length of value. + * RETURNS + * length of customer name. + ******************************************************************************/ +VMUINT vm_get_customer_name(VMCHAR *value, VMUINT len); + +/****************************************************************************** + * FUNCTION + * vm_get_origin_release_verno + * DESCRIPTION + * get origin release verno. + * PARAMETERS + * value : [OUT] string to store origin release verno. + * len : [IN] length of value. + * RETURNS + * length of origin release verno. + ******************************************************************************/ +VMUINT vm_get_origin_release_verno(VMCHAR *value, VMUINT len); + +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** +* FUNCTION + * vm_get_exec_filename + * DESCRIPTION + * get current application file name + * PARAMETERS + * filename: [OUT] output file name string encoding with UCS2 format. + * RETURNS + * if 0, file name will output to the parameter filename, else means there is no application running. +*****************************************************************************/ +VMINT vm_get_exec_filename(VMWSTR filename); + +/***************************************************************************** + * FUNCTION + * vm_get_sys_property + * DESCRIPTION + * get LinkIt system property. Property is defined as group of key and value. The property is maintained by LinkIt internal and APP can not + * modify it or delete it. + * PARAMETERS + * key : [IN] the key to get the system property + * value : [OUT] point to continuous memory,store the gotten system property. if value ==NULL, it shows that no data writing operation. + * len : [IN] the max length that value storing data. unit: VMCHAR + * e.g. if len =12 and actual written length is 10, value[10] = 0x00 + * if len =12 and actual written length is 12, value string will not include 0x00 + * if len =12 and actual need to be written length is 15, only the first 12 character will be written to value region + * RETURNS + * the actual written length, not including 0x00 + * EXAMPLE + * VMCHAR value[20] = {0}; + * VMUINT valueNum = vm_get_sys_property(MRE_SYS_SUBSCRIBER_ID, value, 20); + *****************************************************************************/ +VMUINT vm_get_sys_property(const VMINT key, VMCHAR* value, VMUINT len); + +/***************************************************************************** + * FUNCTION + * vm_get_modules + * DESCRIPTION + * get modules information + * PARAMETERS + * modules : module structure + * size : module structure's size + * RETURNS + * if succeed ,return 0, otherwise,return error code + *****************************************************************************/ +VMINT vm_get_modules(vm_module_struct *modules, VMUINT size); + +/***************************************************************************** + * FUNCTION + * vm_get_version + * DESCRIPTION + * get version + * PARAMETERS + * + * RETURNS: + * if 1000,will be the version LinkIt1.0.00, if 3000,will be the version LinkIt3.0.00 + * version + *****************************************************************************/ +VMUINT vm_get_version(void); + +/* DOM-NOT_FOR_SDK-BEGIN */ +/***************************************************************************** +* FUNCTION + * vm_reg_func_callback + * DESCRIPTION + * register get function pointer callback. for download UI + * PARAMETERS + * f : [IN] callback function. +*****************************************************************************/ +void vm_reg_func_callback(VMINT (*f)(VMSTR symbol)); +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** +* FUNCTION + * vm_pmng_set_bg + * DESCRIPTION + * set the caller process to background state. This function can be invoked only during foreground + * state, and all the UI resource should be release before call this function. + * RETURNS + * result of setting background state + * RETURN VALUES + * VM_PMNG_OP_OK : set successfully. + * VM_PMNG_NO_OP_IN_STATUS : the caller process is not during foreground state. + * +*****************************************************************************/ +VMINT vm_pmng_set_bg(void); + +/***************************************************************************** +* FUNCTION + * vm_pmng_state + * DESCRIPTION + * get the state of specified process ID. + * PARAMETERS + * p_handle : [IN] process handle to be checked. If want to get current process state, + * it should be VM_PMNG_CUR_HANDLE. + * RETURNS + * the state of specified process. +* RETURN VALUES + * VM_PMNG_FOREGROUND : foreground state + * VM_PMNG_BACKGROUND : background state + * VM_PMNG_PAUSED : inactive state + * VM_PMNG_UNLOAD : unloaded state + * +*****************************************************************************/ +VM_PROCESS_STATUS vm_pmng_state(VM_P_HANDLE p_handle); + +/***************************************************************************** +* FUNCTION + * vm_pmng_get_current_handle + * DESCRIPTION + * get process handle of current process(app or sm/so). + * RETURNS + * the process ID of current running if larger than zero, 0 means no process running + * +*****************************************************************************/ +VM_P_HANDLE vm_pmng_get_current_handle(void); + + +/**************************************************************************** + * for application communication begin + ****************************************************************************/ + +/* LinkIt application messge id base, application should define its own message id started from this. */ +#define VM_MESSAGE_ID_BASE 1000 + +typedef VMINT (*VM_MESSAGE_PROC) (VM_P_HANDLE sender, VMUINT msg_id, VMINT wparam, VMINT lparam); +/***************************************************************************** +* FUNCTION + * vm_pmng_get_handle + * DESCRIPTION + * get process handle of specified file name. + * PARAMETERS + * file_name : [IN] file name to be checked. + * RETURNS + * the process ID of specified file if larger than zero, 0 means there is no specified file running + * +*****************************************************************************/ +VM_P_HANDLE vm_pmng_get_handle(VMWSTR file_name); + +/***************************************************************************** +* FUNCTION + * vm_reg_msg_proc + * DESCRIPTION + * register user defined message callback function. + * use vm_appcomm_send_msg send msg to app, will invoke this callback + * PARAMETERS + * proc : [IN] callback function. + * + *VM_MESSAGE_PROC f; + *VMINT message_proc(VM_P_HANDLE sender, VMUINT msg_id, VMINT wparam, VMINT lparam) + *{ + * ... + *} + *f = message_proc; + *vm_reg_msg_proc(f); + * + * +*****************************************************************************/ +void vm_reg_msg_proc(VM_MESSAGE_PROC proc); + +/***************************************************************************** +* FUNCTION + * vm_send_msg + * DESCRIPTION + * send message to LinkIt app or native app, will invoke message procedure directly. + * PARAMETERS + * phandle : [IN] receiver process handle, if receiver is native application, this value should be zero. + * msg_id : [IN] user defined message ID, should larger than VM_MESSAGE_ID_BASE. + * wparam : [IN] wparam of message. + * lparam : [IN] lparam of message. + * RETURNS + * message procedure return value. +*****************************************************************************/ +VMINT vm_send_msg(VM_P_HANDLE phandle, VMUINT msg_id, VMINT wparam, VMINT lparam); + + +/***************************************************************************** +* FUNCTION + * vm_post_msg + * DESCRIPTION + * post message to LinkIt app or native app, will put this message to the end of LinkIt message queue. + * when this function call finish, MMI task will dispatch LinkIt message and invoke message procedure. + * PARAMETERS + * phandle : [IN] receiver process handle, if receiver is native application, this value should be zero. + * msg_id : [IN] user defined message ID, should larger than VM_MESSAGE_ID_BASE. + * wparam : [IN] wparam of message. + * lparam : [IN] lparam of message. + * RETURNS + * 1 means add message into message queue successfully, 0 means message queue is full. +*****************************************************************************/ +VMINT vm_post_msg(VM_P_HANDLE phandle, VMUINT msg_id, VMINT wparam, VMINT lparam); + +/**************************************************************************** + * for application communication end + ****************************************************************************/ + +/***************************************************************************** +* FUNCTION + * vm_pmng_get_app_handle + * DESCRIPTION + * get process handle of current process(app). + * RETURNS + * the process ID of current running app if larger than zero, 0 means no process running + * +*****************************************************************************/ +VMINT vm_pmng_get_app_handle(void); + +/** + * notification mode of background running application applying to foreground running. + */ +typedef enum +{ + VM_NOTIFY_TYPE_DEFAULT = 0, /* by default mode (follow engine control) */ + VM_NOTIFY_TYPE_SOUND = 1, /* by sound mode */ + VM_NOTIFY_TYPE_VIBRATILITY = 2 /* by vibration mode */ +} VM_FG_NOTIFY_TYPE; + +/***************************************************************************** +* FUNCTION + * vm_start_app + * DESCRIPTION + * Run another APP + * PARAMETERS + * filepath : [IN] The file path need to startup. + * parent_app_handle : [IN] Parent APP handle, usually should be current APP. + * is_parent_exit : [IN] Is need exit Parent APP before enter new one. + * RETURNS + * void + * +*****************************************************************************/ +void vm_start_app(const VMWCHAR* filepath, VMINT parent_app_handle, VMINT is_parent_exit); + +/***************************************************************************** +* FUNCTION + * vm_start_app_with_para + * DESCRIPTION + * Run another APP,the parameter will be send with message VM_MSG_CREATE in param(an address) + * handle_sysevt(VMINT message, VMINT param) + * PARAMETERS + * filepath : [IN] The file path need to startup. + * parent_app_handle : [IN] Parent APP handle, usually should be current APP. + * is_parent_exit : [IN] Is need exit Parent APP before enter new one. + * parameter : [IN] parmeter. + * parameter_size : [IN] parameter size + * RETURNS + * void + * +*****************************************************************************/ +void vm_start_app_with_para(const VMWCHAR* filepath, VMINT parent_app_handle, VMINT is_parent_exit,void* parameter,VMINT parameter_size); + + +/***************************************************************************** +* FUNCTION + * vm_pmng_get_process_list + * DESCRIPTION + * get process list. set handle_list NULL to get process number. + * PARAMETERS + * handle_list : [IN] process handle list + * num : [IN/OUT] process number. + * RETURNS + * >0 means process number, <0 means fail +*****************************************************************************/ +VMINT vm_pmng_get_process_list(VM_P_HANDLE *handle_list, VMUINT *num); + +/***************************************************************************** +* FUNCTION + * vm_pmng_get_process_property + * DESCRIPTION + * get process property + * PARAMETERS + * handle : [IN] process handle + * property : [OUT] process property + * RETURNS + * 0 means success, < 0 means fail +*****************************************************************************/ +VMINT vm_pmng_get_process_property(VM_P_HANDLE handle, vm_process_property *property); + +/***************************************************************************** + * FUNCTION + * vm_pmng_set_fg + * DESCRIPTION + * bring an application from bg to fg + * PARAMETERS + * fileName [IN] Application file name encoding with USC2 format. + * RETURNS + * sucess app handle, <0 means fail + *****************************************************************************/ +VM_P_HANDLE vm_pmng_set_fg(VMWSTR fileName); + +/***************************************************************************** + * FUNCTION + * vm_get_full_path_by_short_name + * DESCRIPTION + * get full path from short name. it is get the vxp or vpp or vsp file in current running app folder. + * e.g.FBv2, maybe get FBv2.vsp in the same folder, or rom which named FBv2 + * PARAMETERS + * short_name [IN] Short name encoding with USC2 format. + * full_path [OUT] full path + * RETURNS + * sucess 0; <0 means fail + *****************************************************************************/ + +VMINT vm_get_full_path_by_short_name(VMWSTR short_name, VMWSTR full_path); + +/***************************************************************************** + * FUNCTION + * vm_pmng_set_pen_move_not_exit + * DESCRIPTION + * when call this api in wearable app, will not exit app when pen move event release. + * this api should call in when receive VM_MSG_ACTIVE,because only when app forground, this setting work. + * PARAMETERS + * none + * RETURNS + * none + *****************************************************************************/ +void vm_pmng_set_pen_move_not_exit(); +/***************************************************************************** + * FUNCTION + * vm_pmng_set_pen_move_exit + * DESCRIPTION + * when call this api in wearable app, will hide or inactive app when pen move event release. + * PARAMETERS + * none + * RETURNS + * none + *****************************************************************************/ +void vm_pmng_set_pen_move_exit(); +/* DOM-NOT_FOR_SDK-BEGIN */ +#define vm_get_mre_modules vm_get_modules +#define vm_get_mre_version vm_get_version +/* DOM-NOT_FOR_SDK-END */ +#ifdef __cplusplus +} +#endif +#endif /* _VM_PRO_MNG_SDK_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmpwr.h b/hardware/arduino/mtk/system/libmtk/include/vmpwr.h new file mode 100644 index 00000000..9e116033 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmpwr.h @@ -0,0 +1,328 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmpwr_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * pwr + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_PRW_SDK_H +#define VM_PRW_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ +#include "vmsys.h" + +typedef enum +{ + VM_MAINLCD_BRIGHTNESS_LEVEL0 =0 , /* TURN OFF*/ + VM_MAINLCD_BRIGHTNESS_LEVEL1 , + VM_MAINLCD_BRIGHTNESS_LEVEL2 , + VM_MAINLCD_BRIGHTNESS_LEVEL3 , + VM_MAINLCD_BRIGHTNESS_LEVEL4 , + VM_MAINLCD_BRIGHTNESS_LEVEL5 , + VM_MAINLCD_BRIGHTNESS_LEVEL6 , + VM_MAINLCD_BRIGHTNESS_LEVEL7 , + VM_MAINLCD_BRIGHTNESS_LEVEL8 , + VM_MAINLCD_BRIGHTNESS_LEVEL9 , + VM_MAINLCD_BRIGHTNESS_LEVEL10 , + VM_MAINLCD_BRIGHTNESS_LEVEL11 , + VM_MAINLCD_BRIGHTNESS_LEVEL12 , + VM_MAINLCD_BRIGHTNESS_LEVEL13 , + VM_MAINLCD_BRIGHTNESS_LEVEL14 , + VM_MAINLCD_BRIGHTNESS_LEVEL15 , + VM_MAINLCD_BRIGHTNESS_LEVEL16 , + VM_MAINLCD_BRIGHTNESS_LEVEL17 , + VM_MAINLCD_BRIGHTNESS_LEVEL18 , + VM_MAINLCD_BRIGHTNESS_LEVEL19 , + VM_MAINLCD_BRIGHTNESS_LEVEL20 , + VM_MAINLCD_BRIGHTNESS_20LEVEL_MAX /* DO NOT USE THIS */ +} vm_mainlcd_brightness_level_enum; + +typedef enum { + turn_on_mode = 0, /*turn on saving mode */ + turn_off_mode /*turn off saving mode*/ +} power_saving_mode_enum; + +/***************************************************************************** + * FUNCTION + * vm_mode_block + * DESCRIPTION + * Disable the system switch to Tiny mode, usually used when you want the device keep in Normal mode. + * PARAMETERS + * void + * RETURNS + * void + *****************************************************************************/ +void vm_mode_block(void); + +/***************************************************************************** + * FUNCTION + * vm_mode_unblock + * DESCRIPTION + * Enable the system switch to Tiny mode + * PARAMETERS + * void + * RETURNS + * void + *****************************************************************************/ +void vm_mode_unblock(void); + +/***************************************************************************** + * FUNCTION + * vm_get_battery_level + * DESCRIPTION + * get handset battery level + * PARAMETERS + * void + * RETURNS + * battery level .depend on the target config, return value maybe one of 0,25,50,75,100 + * or one of 0,33,66,100 + *****************************************************************************/ +VMINT vm_get_battery_level(void) ; + + +/***************************************************************************** + * FUNCTION + * vm_charbat_is_charging + * DESCRIPTION + * is charging or not + * PARAMETERS + * void + * RETURNS + * Return VM_TRUE if battery is charging or return VM_FALSE + *****************************************************************************/ +VMBOOL vm_charbat_is_charging(void); + +/***************************************************************************** + * FUNCTION + * vm_set_mainlcd_brightness + * DESCRIPTION + * set handset main LCD brightness + * PARAMETERS + * vm_mainlcd_brightness_level_enum + * RETURNS + * NO + *****************************************************************************/ +void vm_set_mainlcd_brightness(vm_mainlcd_brightness_level_enum brighness_level); + +/***************************************************************************** + * FUNCTION + * vm_get_mainlcd_brightness + * DESCRIPTION + * get handset main LCD brightness + * PARAMETERS + * NULL + * RETURNS + * an unsigned int value + *****************************************************************************/ +VMINT vm_get_mainlcd_brightness(void); +/***************************************************************************** + * FUNCTION + * vm_switch_power_saving_mode + * DESCRIPTION + * settign saving mode. + * LinkIt default value is turn_on_mode, when app is set to background running or + * exit, or receives INACTIVE message, the mode also should be set as turn_on_mode. + * turn_on_mode: LCD will off when no action occurs in a period time. + * turn_off_mode: LCD will keep on,only when app is on fore-ground running, can + * it set the mode. + * PARAMETERS + * mode : whether open the saving mode + * RETURNS + * if succeed ,return 0, otherwise,return error code + *****************************************************************************/ +VMINT vm_switch_power_saving_mode(power_saving_mode_enum mode); + +/***************************************************************************** + * FUNCTION + * vm_switch_backlight + * DESCRIPTION + * turn on /off backlight + * PARAMETERS + * turn_on + * 1: turn on the backlight + * 0: turn off the backlight + * RETURNS + * + *****************************************************************************/ +void vm_switch_backlight(VMINT turn_on); + +/***************************************************************************** + * FUNCTION + * vm_disable_auto_screen_lock + * DESCRIPTION + * diable auto screen lock function. + * PARAMETERS + * NONE. + * RETURNS + * void + *****************************************************************************/ +void vm_disable_auto_screen_lock(void); + +/***************************************************************************** + * FUNCTION + * vm_enable_auto_screen_lock + * DESCRIPTION + * enable auto screen lock function. + * PARAMETERS + * NONE. + * RETURNS + * void + *****************************************************************************/ +void vm_enable_auto_screen_lock(void); + +/***************************************************************************** + * FUNCTION + * vm_reboot_normal_start + * DESCRIPTION + * Launch normal shutdown flow. + * PARAMETERS + * NONE. + * RETURNS + * void + *****************************************************************************/ +void vm_reboot_normal_start(void); + +/***************************************************************************** + * FUNCTION + * vm_shutdown_normal_start + * DESCRIPTION + * Launch normal shutdown flow. + * It plays shutdown animation and emit deinit events normally. + * PARAMETERS + * trigger_man_app_id : [IN] The ID of the application who triggers shutdown. + * RETURNS + * void + *****************************************************************************/ +void vm_shutdown_normal_start(VMUINT16 trigger_man_app_id); + + +#define VM_FLY_MODE_EVT_PARAM_HEADER \ +VMUINT16 evt_id; \ +VMUINT16 size; \ +void * user_data + +/* fly mode event enum*/ +typedef enum +{ + /* switch finish */ + VM_FLY_MODE_SWITCH_FINISH, + + VM_FLY_MODE_EVENT_END +} vm_fly_mode_event_enum; + +/* fly mode event structure */ +typedef struct +{ + /* Event id */ + VMUINT16 evt_id; + /* Event structure size */ + VMUINT16 size; + /* User data pointer */ + void *user_data; + /* resule */ + VMUINT16 result; +}vm_fly_mode_event_struct; + +/* fly mode switch callback */ +typedef VMINT (*vm_fly_mode_cb)(vm_fly_mode_event_struct * evt, void * user_data); + +/***************************************************************************** + * FUNCTION + * vm_fly_mode_is_switching + * DESCRIPTION + * get fly mode switch is running or not + * PARAMETERS + * void + * RETURNS + * 0 : not switching 1 : switching + *****************************************************************************/ +extern VMBOOL vm_fly_mode_is_switching(void); + +/***************************************************************************** + * FUNCTION + * vm_fly_mode_is_network_service_available + * DESCRIPTION + * check if having available network service including GSM and WLAN. + * PARAMETERS + * void + * RETURNS + * MMI_FALSE in flight mode + * MMI_TRUE not in flight mode + *****************************************************************************/ +extern VMBOOL vm_fly_mode_is_network_service_available(void); + +/***************************************************************************** + * FUNCTION + * vm_fly_mode_switch + * DESCRIPTION + * Switch to flight mode or back to normal mode + * If check_sim is MMI_TRUE, the phone will only turn on RF of inserted SIM + * PARAMETERS + * flight_mode_on [IN] is switch to flight mode + * check_sim [IN] is switch the RF according to SIM insert status + * callback [IN] + * user_data + * RETURNS + * MMI_BOOL + *****************************************************************************/ +extern VMBOOL vm_fly_mode_switch(VMBOOL flight_mode_on, VMBOOL check_sim, vm_fly_mode_cb callback, void *user_data); + +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_PRW_SDK_H*/ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmres.h b/hardware/arduino/mtk/system/libmtk/include/vmres.h new file mode 100644 index 00000000..8ed5547e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmres.h @@ -0,0 +1,335 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMRES_SDK_H +#define VMRES_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* cache data structure */ +typedef struct _vm_res_read_hint_struct +{ + VMINT res_offset; /* res offset */ + VMINT res_size; /* res size */ +}vm_res_read_hint_struct; + +/***************************************************************************** + * FUNCTION + * vm_load_resource + * DESCRIPTION + * load resource from current file, system will alloc memory and read the + * resource from file to memory,need to call vm_free after use. + * PARAMETERS + * res_name : [IN] Resource name, not include path. + * res_size : [OUT] Resource size, bytes. + * RETURNS + * Resource pointer + * SEE ALSO + * vm_load_resource_from_file + * EXAMPLE + * get resource named "mre-2.0" + * + * VMCHAR* res_buf; + * + * res_buf = vm_load_resource("mre-2.0", (VMINT*)&res_size); + * if(res_buf == NULL) + * { + * // get error + * } + * else + * { + * // get success + * ... + * vm_free(res_buf); // release the resource after use it. + * } + * +*****************************************************************************/ +VMUINT8* vm_load_resource(char* res_name, VMINT* res_size); + + + /***************************************************************************** + * FUNCTION + * vm_load_resource_from_file + * DESCRIPTION + * Load Resource from one filesystem will alloc memory and read the + * res from file to memory,need to call vm_free after use. + * PARAMETERS + * filename : [IN] full path need to read the resource. + * res_name : [IN] Resource name, not include path. + * res_size : [OUT] Resource size, bytes. + * RETURNS + * Resource pointer + * SEE ALSO + * vm_load_resource + * EXAMPLE + * get resource named "mre-2.0" + * + * VMCHAR* res_buf; + * + * res_buf = vm_load_resource_from_file("E:\\sample.vxp", "mre-2.0", (VMINT*)&res_size); + * if(res_buf == NULL) + * { + * // get error + * } + * else + * { + * // get success + * ... + * vm_free(res_buf); // release the resource after use it. + * } + * +*****************************************************************************/ +VMUINT8* vm_load_resource_from_file(VMWSTR filename, char *res_name, VMINT *res_size); + + /***************************************************************************** + * FUNCTION + * vm_load_virtual_resource + * DESCRIPTION + * load resource from current file, system will alloc 16 bytes as virtual image for graphic interface + * this need to call vm_free after use. this will not load the real data of image, only load res offset + * and file handle, graphic interface will load the real data when it to show the image + * PARAMETERS + * res_name : [IN] Resource name, not include path. + * res_size : [OUT] Resource size, bytes. + * RETURNS + * Resource pointer + * EXAMPLE + * get resource named "logo" + * + * VMCHAR* res_buf; + * + * res_buf = vm_load_virtual_resource( "logo", (VMINT*)&res_size); + * if(res_buf == NULL) + * { + * // get error + * } + * else + * { + * // get success + * ... + * vm_free(res_buf); // release the resource after use it. + * } + * + *****************************************************************************/ +VMUINT8 *vm_load_virtual_resource(char *res_name, VMINT *res_size); + +/***************************************************************************** + * FUNCTION + * vm_resource_get_data + * DESCRIPTION + * Function to Get data from current app file, some app have it own resource format, so they can make all their resource + * as on MRE resource, and get the resource offset form vm_get_resource_offset, then they can manage the data by themslef + * PARAMETERS + * data [IN] Buffer of data + * offset [IN] Offset of the file + * size [IN] Size of the data + * RETURNS + * 0 successful + * SEE ALSO + * vm_resource_get_data_from_file + * EXAMPLE + * get data of the resource "mre-2.0", size is 1200 bytes + * + * VMCHAR* res_buf; + * VMUINT offset; + * offset = vm_get_resource_offset("mre-2.0"); + * res_buf = vm_malloc(1200); + * result = vm_resource_get_data( res_buf, offset, 1200); + * if(result == 0) + * { + * // get error + * } + * else + * { + * // get success + * ... + * vm_free(res_buf); // release the resource after use it. + * } + * + *****************************************************************************/ +extern VMINT32 vm_resource_get_data(VMUINT8 *data, VMUINT32 offset, VMUINT32 size); + +/***************************************************************************** + * FUNCTION + * vm_resource_get_data_from_file + * DESCRIPTION + * Function to Get data from file with full path. + * PARAMETERS + * filename[IN] File full path + * data [IN] Buffer of data + * offset [IN] Offset of the file + * size [IN] Size of the data + * RETURNS + * 0 successful + * SEE ALSO + * vm_get_resource_offset_from_file + * EXAMPLE + * get data of the resource "mre-2.0", size is 1200 bytes + * + * VMCHAR* res_buf; + * VMUINT offset; + * offset = vm_get_resource_offset_from_file("E:\\sample.vxp","mre-2.0"); + * res_buf = vm_malloc(1200); + * result = vm_resource_get_data_from_file( "E:\\sample.vxp", res_buf, offset, 1200); + * if(result == 0) + * { + * // get error + * } + * else + * { + * // get success + * ... + * vm_free(res_buf); // release the resource after use it. + * } + * + *****************************************************************************/ +VMINT32 vm_resource_get_data_from_file(VMWSTR filename, VMUINT8 *data, VMUINT32 offset, VMUINT32 size); + +/***************************************************************************** + * FUNCTION + * vm_get_resource_offset + * DESCRIPTION + * get resource's offset from current file + * PARAMETERS + * res_name : [IN] Resource name, not include path. + * RETURNS + * Resource offset + * 0 is error + * SEE ALSO + * vm_get_resource_offset_from_file + * EXAMPLE + * get offset of the resource "mre-2.0" + * + * VMUINT offset; + * offset = vm_get_resource_offset("mre-2.0"); + * +*****************************************************************************/ +VMUINT vm_get_resource_offset(char *res_name); + + /***************************************************************************** + * FUNCTION + * vm_get_resource_offset_from_file + * DESCRIPTION + * get resource offset from one file + * PARAMETERS + * filename : [IN] The file need to read the resource. + * res_name : [IN] Resource name, not include path. + * RETURNS + * Resource offset + * 0 is error + * SEE ALSO + * vm_get_resource_offset + * EXAMPLE + * get offset of the resource "mre-2.0" + * + * VMUINT offset; + * + * offset = vm_get_resource_offset("E:\\sample.vxp", "mre-2.0"); + * +*****************************************************************************/ +VMUINT vm_get_resource_offset_from_file(VMWSTR filename, char *res_name); + + + /***************************************************************************** + * FUNCTION + * vm_get_resource_offset_and_size_from_file + * DESCRIPTION + * get resource offset and size from one file + * PARAMETERS + * filename : [IN] The file need to read the resource. + * res_name : [IN] Resource name, not include path. + * res_size : [OUT] res size. + * RETURNS + * Resource offset + * 0 is error + * SEE ALSO + * vm_get_resource_offset_from_file + * EXAMPLE + * get offset of the resource "mre-2.0" + * + * VMUINT offset; + * VMINT size; + * offset = vm_get_resource_offset("E:\\sample.vxp", "mre-2.0", (VMINT*)&size); + * +*****************************************************************************/ +VMUINT vm_get_resource_offset_and_size_from_file(VMWSTR filename, char *res_name, VMINT* res_size); + + +/***************************************************************************** + * FUNCTION + * vm_load_resource_use_outside_memory + * DESCRIPTION + * get resource use outside memory + * PARAMETERS + * filename : [IN] The file need to read the resource. + * res_name : [IN] Resource name, not include path. + * buffer : [IN] buffer to put resource data. + * buffer_size : [IN] buffer size. + * hint : [OUT] buffer size and offset. this will cache data to speed up resource loading time + * RETURNS + * Resource offset + * 0 is error + * EXAMPLE + * get data of the resource "mre-2.0" + * + * VMCHAR* res_buf; + * vm_res_read_hint_struct hint; + * VMINT buffer_size; + * vm_load_resource_use_outside_memory("E:\\sample.vxp","mre-2.0", NULL, 0, &hint); + * res_buf = vm_malloc(hint.res_size); + * result = vm_load_resource_use_outside_memory("E:\\sample.vxp","mre-2.0", res_buf, hint.res_size, &hint); + * if(result == 0) + * { + * // get error + * } + * else + * { + * // get success + * ... + * vm_free(res_buf); // release the resource after use it. + * } + * +*****************************************************************************/ +VMBOOL vm_load_resource_use_outside_memory(VMWSTR filename, char *res_name, void* buffer, VMINT buffer_size, vm_res_read_hint_struct* hint); + +#ifdef __cplusplus +} +#endif + +#endif /* VMRES_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmrtspd.h b/hardware/arduino/mtk/system/libmtk/include/vmrtspd.h new file mode 100644 index 00000000..45f93e35 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmrtspd.h @@ -0,0 +1,176 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmrtspd_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_RTSPD_SDK_H +#define VM_RTSPD_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ +#include "vmsys.h" +/*vm_rtspd_error_enum*/ +typedef enum +{ + VM_RTSPD_ERR_NO_ERROR = 0, //operator suceed + VM_RTSPD_ERR_STATE_ERROR = -1, //state of http is mess + VM_RTSPD_ERR_GET_MEM_FAIL = -2, //memory is not enough + VM_RTSPD_ERR_CONNECT_NETWORK_FAIL = -3, //net work is not ready + VM_RTSPD_ERR_FD_INIT_FAIL = -4, //file disciptor init fail + VM_RTSPD_ERR_SRV_INIT_FAIL = -5, //server init fail + VM_RTSPD_ERR_SAVE_CB = -65534,//save cb fail + VM_RTSPD_ERR_OTHERS = -65535, // other errors + VM_RTSPD_ERR_CODE = -65536 //end mark. +}vm_rtspd_error_enum; +/*vm_rtspd_status_enum*/ +typedef enum +{ + VM_RTSPD_IND_IDLE = 0, + VM_RTSPD_IND_RECORDING_ONLY,// in local recording and save temp file + VM_RTSPD_IND_FILE_MERGE_ONLY,// create local video file + VM_RTSPD_IND_STREAMING_ONLY,//rtsp send rtp data + VM_RTSPD_IND_STREAMING_RECORDING,//rtsp send rtp & local save temp file + VM_RTSPD_IND_STREAMING_FILE_MERGE//rtsp send rtp & local save file merge +}vm_rtspd_status_enum; + +/***************************************************************************** + * DESCRIPTION + * VM_RTSPD_CB is the prototype of the call back function. + * PARAMETERS + * status: [IN] vm_rtspd_status_enum + * data: [IN] currently have no meaning,use for future extend + * RETURNS + * The return value is void. + *****************************************************************************/ +typedef void (*VM_RTSPD_CB)(vm_rtspd_status_enum status, void* data); +/***************************************************************************** + * FUNCTION + * vm_inet_rtspd_register_cb + * DESCRIPTION + * register rtspd callback function + * PARAMETERS + * callback: VM_RTSPD_CB + * RETURNS + * vm_rtspd_error_enum: 0,success; others: fail. + *****************************************************************************/ +extern vm_rtspd_error_enum vm_inet_rtspd_register_cb(VM_RTSPD_CB callback); +/***************************************************************************** + * FUNCTION + * vm_inet_rtspd_start + * DESCRIPTION + * this is for lauch rtsp server + * PARAMETERS + * port: + * root_dir:[IN] the root dir + * RETURNS + * vm_rtspd_error_enum: + * + *vm_inet_rtspd_start(554, "C:\\@rtsp"); + * + *****************************************************************************/ +extern vm_rtspd_error_enum vm_inet_rtspd_start(VMUINT32 port, VMCHAR* root_dir); +/***************************************************************************** + * FUNCTION + * vm_inet_httpd_stop + * DESCRIPTION + * this is for stop http server + * PARAMETERS + * N/A + * RETURNS + * httpsrv_error_enum:return VM_HTTPSRV_ERR_NO_ERROR, success, othersize, fail + * + *vm_inet_rtspd_stop(); + * + *****************************************************************************/ +extern vm_rtspd_error_enum vm_inet_rtspd_stop(void); +/***************************************************************************** + * FUNCTION + * vm_inet_rtspd_restart + * DESCRIPTION + * this is for restart rtsp server + * PARAMETERS + * port: [IN]the port to restart + * root_dir:[IN]the root dir + * RETURNS + * vm_rtspd_error_enum + * + *vm_inet_rtspd_restart(554, "C:\\@rtsp"); + * + *****************************************************************************/ +extern vm_rtspd_error_enum vm_inet_rtspd_restart(VMUINT32 port, VMCHAR* root_dir); +/***************************************************************************** + * FUNCTION + * vm_inet_rtspd_set_stream_identify + * DESCRIPTION + * this is for set the name of real time stream,rtsp server will check request URL with this string + * PARAMETERS + * stream_name: [IN] + * RETURNS + * none + * + *vm_inet_rtspd_set_stream_identify("xxx.3gp"); + * + *****************************************************************************/ +extern void vm_inet_rtspd_set_stream_identify(VMCHAR* stream_name); + + +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_RTSPD_SDK_H*/ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmsalui.h b/hardware/arduino/mtk/system/libmtk/include/vmsalui.h new file mode 100644 index 00000000..f51353b7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmsalui.h @@ -0,0 +1,149 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMSALUI_SDK_H_ +#define VMSALUI_SDK_H_ + +#include "vmsys.h" + +/* If set thsi flag for behavior_mask, it will show nothing if this ui is not supported */ +#define VM_COMMON_UI_MASK_NO_SHOW_UNSUPPORTED 0x1 + +typedef enum +{ + VM_COMMON_UI_ERROR_INVALID_ID = -7, + VM_COMMON_UI_ERROR_OF_PROCESS, + VM_COMMON_UI_ERROR_OF_RES , + VM_COMMON_UI_ERROR_OF_MEM , + VM_COMMON_UI_ERROR_UNSUPPORTED, + VM_COMMON_UI_ERROR_WRONG_PARAM, + VM_COMMON_UI_ERROR , + VM_COMMON_UI_OK +} vm_common_ui_error_t; + +/* popup type */ +typedef enum +{ + VM_COMMON_UI_POPUP_TYPE_FAILURE, + VM_COMMON_UI_POPUP_TYPE_INFO, + VM_COMMON_UI_POPUP_TYPE_WARNING, + VM_COMMON_UI_POPUP_TYPE_SUCCESS, + VM_COMMON_UI_POPUP_TYPE_PROGRESS, + VM_COMMON_UI_POPUP_TYPE_QUERY, + + VM_COMMON_UI_POPUP_TYPE_MAX +} vm_common_ui_popup_type_enum; + +/* confirm type - one button(confirm) or two button(user defeind and cancel) */ +typedef enum +{ + VM_COMMON_UI_CONFIRM_TYPE_ONE_BUTTON, + VM_COMMON_UI_CONFIRM_TYPE_TWO_BUTTON, + + VM_COMMON_UI_CONFIRM_TYPE_MAX +} vm_common_ui_confirm_type_enum; + +/* common ui type */ +typedef enum +{ + VM_COMMON_UI_TYPE_BALLOON, + VM_COMMON_UI_TYPE_TEXT_PREVIEW, // If app is foreground, text preview just can show when statusbar exist + VM_COMMON_UI_TYPE_POPUP, + VM_COMMON_UI_TYPE_CONFIRM, + VM_COMMON_UI_TYPE_END_OF_ENUM +}vm_common_ui_type; + +/* receive event in confirm popup callback function */ +typedef enum +{ + VM_COMMON_UI_CONFIRM_EVENT_BUTTON_NONE, + VM_COMMON_UI_CONFIRM_EVENT_USER_1, + VM_COMMON_UI_CONFIRM_EVENT_USER_2, + + VM_COMMON_UI_CONFIRM_EVENT_MAX +} vm_common_ui_confirm_evt_enum; + +typedef void (*VM_COMMONUIPROC_T)(vm_common_ui_confirm_evt_enum evt_id, void *user_data); + + +/* Balloon information */ +typedef struct { + const VMWCHAR *display_string; +}vm_common_ui_balloon_struct; + +/* Text preview information */ +typedef struct { + const VMWCHAR *display_string; +}vm_common_ui_text_preview_struct; + +/* Popup information*/ +typedef struct { + vm_common_ui_popup_type_enum popup_type; + const VMWCHAR *display_string; +}vm_common_ui_popup_struct; + +/* Confirm Popup information*/ +typedef struct +{ + vm_common_ui_confirm_type_enum confirm_type; + vm_common_ui_popup_type_enum confirm_popup_type; + const VMWCHAR *popup_string; + const VMWCHAR *popup_button_string1; + const VMWCHAR *popup_button_string2; + VM_COMMONUIPROC_T confirm_popup_proc; + void *user_data; +} vm_common_ui_confirm_popup_struct; + + +typedef struct +{ + vm_common_ui_type ui_type; + VMUINT16 behavior_mask; + + /*balloon parameter*/ + vm_common_ui_balloon_struct balloon_para; + /*text preview parameter*/ + vm_common_ui_text_preview_struct text_preview_para; + /*popup parameter*/ + vm_common_ui_popup_struct popup_para; + /*confirm popup parameter*/ + vm_common_ui_confirm_popup_struct confirm_popup_para; +}vm_common_ui_info_struct; + +VMINT vm_common_ui_show(vm_common_ui_info_struct *ui_info); +VMINT vm_common_ui_cancel(VMINT id); + + +#endif diff --git a/hardware/arduino/mtk/system/libmtk/include/vmsensor.h b/hardware/arduino/mtk/system/libmtk/include/vmsensor.h new file mode 100644 index 00000000..234500f9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmsensor.h @@ -0,0 +1,352 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef __VM_SENSOR_SDK +#define __VM_SENSOR_SDK + +#include "vmsys.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Motion Sensor Angle define */ +typedef enum +{ + VM_SRV_SENSOR_MOTION_ANGLE_GX0, /* angle 0 of x */ + VM_SRV_SENSOR_MOTION_ANGLE_GY0, /* angle 0 of y */ + VM_SRV_SENSOR_MOTION_ANGLE_GZ0, /* angle 0 of z */ + VM_SRV_SENSOR_MOTION_ANGLE_GX180, /* angle 180 of x */ + VM_SRV_SENSOR_MOTION_ANGLE_GY180, /* angle 180 of y */ + VM_SRV_SENSOR_MOTION_ANGLE_GZ180, /* angle 180 of z */ + VM_SRV_SENSOR_MOTION_ANGLE_OTHER /* others */ +} vm_srv_sensor_motion_direct_enum; + +/* Motion Sensor Action define */ +typedef enum +{ + VM_SRV_SENSOR_MOTION_ACTION_NULL, /* None */ + VM_SRV_SENSOR_MOTION_ACTION_ROLL_RIGHT, /* Roll right */ + VM_SRV_SENSOR_MOTION_ACTION_ROLL_LEFT, /* Roll left */ + VM_SRV_SENSOR_MOTION_ACTION_PITCH_BACKWARD, /* Pitch Backward */ + VM_SRV_SENSOR_MOTION_ACTION_PITCH_FORWARD, /* Pitch Forward */ + VM_SRV_SENSOR_MOTION_ACTION_YAW_RIGHT, /* Yaw right */ + VM_SRV_SENSOR_MOTION_ACTION_YAW_LEFT, /* Yaw left */ + VM_SRV_SENSOR_MOTION_ACTION_TOTAL +} vm_srv_sensor_motion_action_enum; + + +/* Motion Sensor Type */ +typedef enum +{ + VM_SRV_SENSOR_MOTION_DIRECT, /* direct */ + VM_SRV_SENSOR_MOTION_SHAKE, /* shake */ + VM_SRV_SENSOR_MOTION_TILT, /* tilt */ + VM_SRV_SENSOR_MOTION_TAP, /* tap */ + VM_SRV_SENSOR_MOTION_DOUBLE_TAP, /* double tap */ + VM_SRV_SENSOR_MOTION_DROP, /* drop */ + VM_SRV_SENSOR_MOTION_STEP, /* step */ + VM_SRV_SENSOR_MOTION_ADVANCED_SHAKE,/* shake */ + VM_SRV_SENSOR_MOTION_TURNOVER, /* turnover */ + VM_SRV_SENSOR_TOTAL, + VM_SRV_SENSOR_DISABLE /* motion sensor have been disabled */ +} vm_srv_sensor_type_enum; + +/* Motion Sensor direct structure */ +typedef struct +{ + VMUINT8 angle_threshold; /* angle */ +} vm_srv_sensor_motion_direct_cfg_struct ; + +/* Motion Sensor tilt angle structure */ +typedef struct +{ + VMINT gx; /* angle of x */ + VMINT gy; /* angle of y */ + VMINT gz; /* angle of z */ +}vm_srv_sensor_motion_tilt_angle_struct; + +/* Motion Sensor tilt acc */ +typedef struct +{ + VMINT16 x; /* acceleration of x */ + VMINT16 y; /* acceleration of y */ + VMINT16 z; /* acceleration of z */ +}vm_srv_sensor_motion_tilt_acc_struct; + +/* sensor_type = VM_SRV_SENSOR_MOTION_TILT */ +typedef struct +{ + vm_srv_sensor_motion_tilt_angle_struct angle; /* tilt angle */ + vm_srv_sensor_motion_tilt_acc_struct acc; /* tilt acceleration */ +}vm_srv_sensor_motion_tilt_struct; + +/* Handle define */ +typedef VMINT VM_SRV_SENSOR_HANDLE; + +/* Result define */ +typedef VMINT VM_SRV_SENSOR_RESULT; + +/* Sensor tap event */ +typedef enum +{ + VM_SRV_SENSOR_MOTION_TAP_DONE /*tap done*/ +}vm_srv_sensor_motion_tap_direct_enum; + +/* Sensor step event */ +typedef enum +{ + VM_SRV_SENSOR_MOTION_ACTION_STEP, /*Step devent happen*/ + VM_SRV_SENSOR_MOTION_STEP_NULL +}vm_srv_sensor_motion_step_enum; + +/* Sensor drop event */ +typedef enum +{ + VM_SRV_SENSOR_MOTION_ACTION_DROP, /*Drop event happen*/ + VM_SRV_SENSOR_MOTION_DROP_NULL +}vm_srv_sensor_motion_drop_enum; + +/* Sensor turnover type */ +typedef enum { + VM_SRV_SENSOR_MOTION_TURNOVER_NONE = 0, /*NONE*/ + VM_SRV_SENSOR_MOTION_TURNOVER_UP = 0x01, /*back to front*/ + VM_SRV_SENSOR_MOTION_TURNOVER_DOWN = 0x02, /*front to back*/ + VM_SRV_SENSOR_MOTION_TURNOVER_LEFT = 0x04, /*turnover left*/ + VM_SRV_SENSOR_MOTION_TURNOVER_RIGHT = 0x08, /*turnover right*/ + VM_SRV_SENSOR_MOTION_TURNOVER_TOTAL = 0xffff +} vm_srv_sensor_motion_turnover_enum; + +/* sensor_type = VM_SRV_SENSOR_MOTION_STEP + step sensitive enum +*/ +typedef enum +{ + VM_SRV_SENSOR_MOTION_STEP_HIGH, /*HIGH */ + VM_SRV_SENSOR_MOTION_STEP_MEDIUM, /*MEDIUM */ + VM_SRV_SENSOR_MOTION_STEP_LOW /*LOW */ +}vm_srv_sensor_motion_step_sensitive_enum; + +/* sensor_type = VM_SRV_SENSOR_MOTION_STEP + struct of sensor_data*/ +typedef struct +{ + vm_srv_sensor_motion_step_sensitive_enum sensitive; /* step sensitive */ +}vm_srv_sensor_motion_step_cfg_struct; + + +/* sensor_type = VM_SRV_SENSOR_MOTION_TILT */ +typedef enum +{ + VM_SRV_SENSOR_MOTION_NORMAL_TILT, /* nomal TILT */ + VM_SRV_SENSOR_MOTION_RAW_TILT /* raw TILT */ +}vm_srv_sensor_motion_tilt_sensitive_enum; + +/* sensor_type = VM_SRV_SENSOR_MOTION_TILT + struct of sensor_data*/ +typedef struct +{ + vm_srv_sensor_motion_tilt_sensitive_enum sensitive; /* tilt sensitive */ +}vm_srv_sensor_motion_tilt_cfg_struct; + +/*sensor_type = VM_SRV_SENSOR_MOTION_TAP + struct of sensor_data*/ +typedef struct +{ + vm_srv_sensor_motion_tap_direct_enum tap_direct; /* tap direction */ +}vm_srv_sensor_motion_tap_struct; + +/*sensor_type = VM_SRV_SENSOR_MOTION_DOUBLE_TAP + struct of sensor_data*/ +typedef struct +{ + vm_srv_sensor_motion_tap_direct_enum double_tap_direct; /* tap direction */ +}vm_srv_sensor_motion_double_tap_struct; + + +/*sensor_type = VM_SRV_SENSOR_MOTION_DROP + struct of sensor_data*/ +typedef struct +{ + vm_srv_sensor_motion_drop_enum action; /* drop action */ +}vm_srv_sensor_motion_drop_struct; + +/*sensor_type = VM_SRV_SENSOR_MOTION_STEP + struct of sensor_data*/ +typedef struct +{ + vm_srv_sensor_motion_step_enum action; /* step action */ +}vm_srv_sensor_motion_step_struct; + +/*sensor_type = VM_SRV_SENSOR_MOTION_ADVANCED_SHAKE + struct of sensor_data*/ +typedef struct { + VMUINT8 direction; /*shake direction */ +}vm_srv_sensor_motion_advanced_shake_struct; + +/*sensor_type = VM_SRV_SENSOR_MOTION_TURNOVER + struct of sensor_data*/ +typedef struct { + vm_srv_sensor_motion_turnover_enum direction; /* Tunover direction */ +} vm_srv_sensor_motion_turnover_struct; + +/*sensor_type = VM_SRV_SENSOR_MOTION_DIRECT + struct of sensor_data*/ +typedef struct +{ + vm_srv_sensor_motion_direct_enum direct; /* Direct */ + vm_srv_sensor_motion_action_enum action; /* Action */ +} vm_srv_sensor_motion_direct_struct ; + +#define VM_SRV_SENSOR_MOTION_ALWAYS_ON_MODE 0x0001 /* Sensor always open */ + + +/*----------------------------------------------------------------------------*/ +/* Extern Function */ +/*----------------------------------------------------------------------------*/ + +/***************************************************************************** + * DESCRIPTION + * sensor event callback handler + * please invole this function to release it. + * PARAMETERS + * sensor_handle : [IN] sensor's handle which is created by vm_create_sensor_instance. + * sensor_type : [IN] sensor type + * sensor_data : [IN] this is a structure of the sensor type, please convert it by type + * VM_SRV_SENSOR_MOTION_DIRECT -> vm_srv_sensor_motion_direct_struct + * VM_SRV_SENSOR_MOTION_SHAKE, -> NONE + * VM_SRV_SENSOR_MOTION_TILT, -> vm_srv_sensor_motion_tilt_struct + * VM_SRV_SENSOR_MOTION_TAP, -> vm_srv_sensor_motion_tap_struct + * VM_SRV_SENSOR_MOTION_DOUBLE_TAP, -> vm_srv_sensor_motion_double_tap_struct + * VM_SRV_SENSOR_MOTION_DROP, -> vm_srv_sensor_motion_drop_struct + * VM_SRV_SENSOR_MOTION_STEP, -> vm_srv_sensor_motion_step_struct + * VM_SRV_SENSOR_MOTION_ADVANCED_SHAKE, -> vm_srv_sensor_motion_advanced_shake_struct + * VM_SRV_SENSOR_MOTION_TURNOVER, -> vm_srv_sensor_motion_turnover_struct + * RETURNS + * void + *****************************************************************************/ +typedef void (*VM_SRV_SENSOR_EVENT_HDLR)(vm_srv_sensor_type_enum sensor_type, void *sensor_data, void *user_data); + +/***************************************************************************** + * FUNCTION + * vm_srv_sensor_start_listen + * DESCRIPTION + * Start the listen + * PARAMETERS + * type : [IN] sensor type, please refer vm_srv_sensor_type_enum + * option : [IN] some type's option, if it have + * event_hdlr : [IN] callback function + * user_data : [IN] user data + * RETURNS + * VM_SRV_SENSOR_HANDLE + * RETURN VALUES + * VM_SRV_SENSOR_MOTION_NO_SLOT : open too much detection, so that no have enough handle . + * Other: the handle of direct detection . + *****************************************************************************/ +extern VM_SRV_SENSOR_HANDLE vm_srv_sensor_start_listen(vm_srv_sensor_type_enum type, void *option, + VM_SRV_SENSOR_EVENT_HDLR event_hdlr, void *user_data); + + +/***************************************************************************** + * FUNCTION + * vm_srv_sensor_stop_listen + * DESCRIPTION + * Stop listen a sensor application + * PARAMETERS + * sensor_handle : [IN] sensor's handle. + * control_name : [IN] sensor's control name. + * value : [IN] set value. + * RETURNS + * VM_SRV_SENSOR_RESULT + * RETURN VALUES + * VM_SRV_SENSOR_SUCCEED: Stop success + * VM_SRV_SENSOR_CB_NOT_FOUND: Pass the wrong handle + *****************************************************************************/ +extern VM_SRV_SENSOR_RESULT vm_srv_sensor_stop_listen(VM_SRV_SENSOR_HANDLE handle); + + +/***************************************************************************** + * FUNCTION + * vm_srv_sensor_enable_mode + * DESCRIPTION + * This function is to enable mode + * PARAMETERS + * sensor_handle : [IN] The return value of start listen + * sensor_mode : [IN] A bitmask of sensor mode(VM_SRV_SENSOR_MOTION_ALWAYS_ON_MODE) + * RETURNS + * VM_SRV_SENSOR_RESULT + * RETURN VALUES + * VM_SRV_SENSOR_SUCCEED: enable success + * VM_SRV_SENSOR_MOTION_NO_SLOT: + *****************************************************************************/ +extern VM_SRV_SENSOR_RESULT vm_srv_sensor_enable_mode(VM_SRV_SENSOR_HANDLE handle , VMUINT16 sensor_mode); + + +/***************************************************************************** + * FUNCTION + * vm_srv_sensor_disable_mode + * DESCRIPTION + * This function is to disable mode + * PARAMETERS + * sensor_handle : [IN] The return value of start listen + * sensor_mode : [IN] A bitmask of sensor mode(VM_SRV_SENSOR_MOTION_ALWAYS_ON_MODE) + * RETURNS + * VM_SRV_SENSOR_RESULT + * RETURN VALUES + * VM_SRV_SENSOR_SUCCEED: disable success + * VM_SRV_SENSOR_MOTION_NO_SLOT: + *****************************************************************************/ +extern VM_SRV_SENSOR_RESULT vm_srv_sensor_disable_mode(VM_SRV_SENSOR_HANDLE handle, VMUINT16 sensor_mode); + + +/***************************************************************************** + * FUNCTION + * vm_srv_sensor_is_available + * DESCRIPTION + * Check whether the sensor(motion ,or future other sensors...) is enable + * stop sensor. + * PARAMETERS + * sensor_handle : [OUT] sensor's handle. + * RETURNS + * stop sensor success or not. + * RETURN VALUES + *****************************************************************************/ +extern VMINT vm_srv_sensor_is_available(vm_srv_sensor_type_enum sensor_type); + +#ifdef __cplusplus +} +#endif + +#endif /* __VM_SENSOR_SDK */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmsettings.h b/hardware/arduino/mtk/system/libmtk/include/vmsettings.h new file mode 100644 index 00000000..c80183ba --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmsettings.h @@ -0,0 +1,616 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMSETTINGS_SDK_H +#define VMSETTINGS_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +#define VM_SETTINGS_RET_OK 0 +#define VM_SETTINGS_RET_FAIL -2 +#define VM_SETTINGS_RET_NOT_SUPPORT -3 +#define VM_SETTINGS_RET_PARAM_ERR -4 +#define VM_SETTINGS_RET_NO_MEM -5 + + +typedef VMINT (*vm_settings_set_wallpaper_callback)(void* user_data); + +typedef enum +{ + VM_SETTINGS_POWER_ON_TONE, + VM_SETTINGS_POWER_OFF_TONE, + VM_SETTINGS_POWER_ON_OFF_TONE, + VM_SETTINGS_COVER_OPEN_TONE, + VM_SETTINGS_COVER_CLOSE_TONE, + VM_SETTINGS_SMS_TONE, + VM_SETTINGS_SMS_CARD2_TONE, + VM_SETTINGS_SMS_CARD3_TONE, + VM_SETTINGS_SMS_CARD4_TONE, + VM_SETTINGS_MMS_TONE, + VM_SETTINGS_MMS_CARD2_TONE, + VM_SETTINGS_MMS_CARD3_TONE, + VM_SETTINGS_MMS_CARD4_TONE, + VM_SETTINGS_EMAIL_TONE, + VM_SETTINGS_EMAIL_CARD2_TONE, + VM_SETTINGS_EMAIL_CARD3_TONE, + VM_SETTINGS_EMAIL_CARD4_TONE, + VM_SETTINGS_VOICE_TONE, + VM_SETTINGS_VOICE_CARD2_TONE, + VM_SETTINGS_VOICE_CARD3_TONE, + VM_SETTINGS_VOICE_CARD4_TONE, + VM_SETTINGS_MT_CALL_TONE, + VM_SETTINGS_MT_CALL_CARD2_TONE, + VM_SETTINGS_MT_CALL_CARD3_TONE, + VM_SETTINGS_MT_CALL_CARD4_TONE, + VM_SETTINGS_VT_CALL_TONE, + VM_SETTINGS_VT_CALL_CARD2_TONE, + VM_SETTINGS_VT_CALL_CARD3_TONE, + VM_SETTINGS_VT_CALL_CARD4_TONE, + VM_SETTINGS_TONE_END +}vm_settings_tone_enum; + +typedef enum +{ + VM_SETTINGS_HOME_PAPER, + VM_SETTINGS_LOCK_PAPER, + VM_SETTINGS_WALLPAPER_END +}vm_setttings_wallpaper_enum; + + +VMINT vm_settings_set_tone(vm_settings_tone_enum type, VMWCHAR* path); + +VMINT vm_settings_set_wallpaper(vm_setttings_wallpaper_enum type, + VMWCHAR* path,vm_settings_set_wallpaper_callback callback, void* user_data); + + + +/* Enum for time format */ +typedef enum +{ + VM_SETTING_TIME_FORMAT_12_HOURS, + VM_SETTING_TIME_FORMAT_24_HOURS, + + VM_SETTING_TIME_FORMAT_END +} vm_setting_time_format_enum; + +/* Enum for date format */ +typedef enum +{ + VM_SETTING_DATE_FORMAT_DD_MM_YYYY, + VM_SETTING_DATE_FORMAT_MM_DD_YYYY, + VM_SETTING_DATE_FORMAT_YYYY_MM_DD, + + VM_SETTING_DATE_FORMAT_END +} vm_setting_date_format_enum; + +/* Enum for date seperator */ +typedef enum +{ + VM_SETTING_DATE_SEPERATOR_DOT, + VM_SETTING_DATE_SEPERATOR_COLON, + VM_SETTING_DATE_SEPERATOR_SLOPE, + VM_SETTING_DATE_SEPERATOR_LINE, + + VM_SETTING_DATE_SEPERATOR_END +} vm_setting_date_seperator_enum; + + +/***************************************************************************** + * FUNCTION + * vm_setting_get_time_format + * DESCRIPTION + * Get system time format + * PARAMETERS + * void + * RETURNS + * vm_setting_time_format_enum + *****************************************************************************/ +VMINT vm_setting_get_time_format(void); + + +/***************************************************************************** + * FUNCTION + * vm_setting_get_date_format + * DESCRIPTION + * Get system date format + * PARAMETERS + * void + * RETURNS + * vm_setting_date_format_enum + *****************************************************************************/ +VMINT vm_setting_get_date_format(void); + + +/***************************************************************************** + * FUNCTION + * vm_setting_get_date_seperator + * DESCRIPTION + * Get system date seperator + * PARAMETERS + * void + * RETURNS + * vm_setting_date_seperator_enum + *****************************************************************************/ +VMINT vm_setting_get_date_seperator(void); + + + + +/*Setting Type Enum*/ +typedef enum +{ + VM_SETTING_ENUM_NULL, //NULL + VM_SETTING_CELLULAR_GPRS_SERVICE, //GPRS on/off + VM_SETTING_CELLULAR_GPRS_ROAMING, //GPRS roaming on/off + VM_SETTING_CELLULAR_CONNECTION_SIM, //SIM selection in multiple SIM case + VM_SETTING_NETWORK_ACCOUNTS, //network accounts + VM_SETTING_DATETIME, //system datetime + VM_SETTING_SCHEDULE_POWER_ON_OFF, //system schedule power on/off + VM_SETTING_NETWORK_TIME_AUTO_UPDATE,//network time auto update on/off + VM_SETTING_SIM_GPRS_TRANSFER_PREFER,//call perfer or data prefer + VM_SETTING_GPS_SYNC_TIME,//GPS sync time setting + VM_SETTING_ENUM_NUM +}vmsettingModuleTypes; + +/*Operation Type Enum for Each module*/ + +/* +**Operation type for SETTING_CELLULAR_GPRS_SERVICE +*/ +typedef enum +{ + VM_OPERATION_GPRS_SERVICE_ON, //GPRS on + VM_OPERATION_GPRS_SERVICE_OFF, //GPRS off + VM_OPERATION_GPRS_SERVICE_GET_STATUS, //get current GPRS status + VM_OPERATION_GPRS_SERVICE_NUM +}vmoperationTypesGPRSSrv; + + +/* +**Operation type for SETTING_CELLULAR_GPRS_ROAMING +*/ +typedef enum +{ + VM_OPERATION_GPRS_ROAMING_ON, //GPRS roaming on + VM_OPERATION_GPRS_ROAMING_OFF, //GPRS roaming off + VM_OPERATION_GPRS_ROAMING_GET_STATUS,//get current roaming status + VM_OPERATION_GPRS_ROAMING_NUM +}vmoperationTypesGPRSRoaming; + +/* +**Operation type for SETTING_CELLULAR_CONNECTION_SIM +*/ +typedef enum +{ + VM_OPERATION_CONNECTION_SIM_SET, //set currently connection SIM id, example SIM1 or SIM2 + VM_OPERATION_CONNECTION_SIM_GET_CURRENT_SIM, //get currently connection SIM id + VM_OPERATION_CONNECTION_SIM_NUM +}vmoperationTypesGPRSConnectionSIM; + +/* +**Operation type for SETTING_NETWORK_ACCOUNTS +*/ +typedef enum +{ + VM_OPERATION_NETWORK_ACCOUNTS_ADD, //add network accounts + VM_OPERATION_NETWORK_ACCOUNTS_EDIT, //edit network accounts + VM_OPERATION_NETOWRK_ACCOUNTS_DELETE, //delete network accounts + VM_OPERATION_NETWORK_ACCOUNTS_GET_ACCOUNT_LIST,//get exist accounts list + VM_OPERATION_NETWORK_ACCOUNTS_NUM +}vmoperationTypesNetworkAccounts; + +/* +**Operation type for SETTING_DATETIME +*/ +typedef enum +{ + VM_OPERATION_DATETIME_SET, //set system datetime + VM_OPERATION_DATETIME_GET, //get system datetime + VM_OPERATION_DATETIME_NUM +}vmoperationTypesDatetime; + +/* +**Operation type for SETTING_SCHEDULE_POWER_ON_OFF +*/ +typedef enum +{ + VM_OPERATION_SET_SCHEDULE_POWER_ON_STATUS, //switch schedule power on to on/off + VM_OPERATION_SET_SCHEDULE_POWER_OFF_STATUS, //switch schedule power off to on/off + VM_OPERATION_SCHEDULE_POWER_ON_OFF_NUM +}vmoperationTypesSchedulePowerOnOff; + +/* +**Operation type for SETTING_NETWORK_TIME_AUTO_UPDATE +*/ +typedef enum +{ + VM_OPERATION_NETWORK_TIME_ON, //set network time auto update on + VM_OPERATION_NETWORK_TIME_OFF, //set network time auto update off + VM_OPERATION_NETWORK_TIME_GET_STATUS, //get network time auto update status + VM_OPERATION_NETWORK_TIME_NUM +}vmoperationTypesNetowrkTime; + +/* +**Operation type for SETTING_SIM_GPRS_TRANSFER_PREFER +*/ +typedef enum +{ + VM_OPERATION_SIM_GPRS_TRANSFER_SET_CALL_PREFER, //set GPRS transfer call prefer + VM_OPERATION_SIM_GPRS_TRANSFER_SET_DATA_PREFER, //set GPRS transfer data prefer + VM_OPERATION_SIM_GPRS_TRANSFER_GET_STATUS, //get GPRS transfer status + VM_OPERATION_SIM_GPRS_TRANSFER_PREFER_NUM +}vmoperationTypesGPRSTranferPref; + + +/* +**OPERATION TYPE FOR +*/ +typedef enum +{ + VM_OPERATION_DATETIME_GPS_TIME_SYNC_ON, //ALLOW GPS TO UPDATE TIME + VM_OPERATION_DATETIME_GPS_TIME_SYNC_OFF,//DEFUSE GPS TO UPDATE TIME + VM_OPERATION_DATETIME_GPS_TIME_SYNC_GET,//GET GPS UPDATED TIME + VM_OPERATION_DATETIME_GPS_TIME_SYNC_NUM +}vmoperationTypesDTGPSSyncTime; + + + +/* +** Data Account profile sim type enum +*/ +typedef enum +{ + VM_SRV_DTCNT_SIM_TYPE_NONE = 0, + VM_SRV_DTCNT_SIM_TYPE_1, /*SIM 1*/ + VM_SRV_DTCNT_SIM_TYPE_2, /*SIM 2*/ + VM_SRV_DTCNT_SIM_TYPE_3, /*SIM 2*/ + VM_SRV_DTCNT_SIM_TYPE_4, /*SIM 4*/ + VM_SRV_DTCNT_SIM_TYPE_TOTAL +} vm_srv_dtcnt_sim_type_enum; + + +/* Data Account bearer enum */ +typedef enum +{ + VM_SRV_DTCNT_BEARER_UNKNOWN = 0, /* unknown type profile */ + VM_SRV_DTCNT_BEARER_CSD = 1, /* For csd type profile */ + VM_SRV_DTCNT_BEARER_GPRS = 2, /* For GPRS type profile */ + VM_SRV_DTCNT_BEARER_WIFI = 4, /* For WIFI type profile */ + VM_SRV_DTCNT_BEARER_TOTAL +} vm_srv_dtcnt_bearer_enum; + +/* Data Account services result enum */ +typedef enum +{ + VM_SRV_DTCNT_RESULT_SUCCESS = 0, /* success */ + VM_SRV_DTCNT_RESULT_FAILED, /* general failed case */ + VM_SRV_DTCNT_RESULT_PROCESSING, /* processing state implies Event notify */ + VM_SRV_DTCNT_RESULT_STATE_ERROR, /* service status error */ + VM_SRV_DTCNT_RESULT_INVALID_INPUT, /* the input parameter is invalid */ + VM_SRV_DTCNT_RESULT_ABORTED, /* the process is aborted */ + VM_SRV_DTCNT_RESULT_TERMINATED, /* the process is terminated */ + VM_SRV_DTCNT_RESULT_ONE_STORE_EXISTS, /* currently only support one store */ + VM_SRV_DTCNT_RESULT_STORE_NOT_COMMIT, /* store doesn't be config commited before */ + VM_SRV_DTCNT_RESULT_INVALID_STORE, /* store invalid */ + VM_SRV_DTCNT_RESULT_STORE_FULL, /* reach maximum profile storage */ + VM_SRV_DTCNT_RESULT_READ_ONLY, /* can't delete or update read_only profile */ + VM_SRV_DTCNT_RESULT_FIRST_BOOTUP, /* first bootup rerurn code for store open */ + VM_SRV_DTCNT_RESULT_RESET_FACTORY, /* the data base sim profiles folder is deleted */ + VM_SRV_DTCNT_RESULT_FS_ERROR, /* the database file system error */ + VM_SRV_DTCNT_RESULT_IGNORE, + VM_SRV_DTCNT_RESULT_TOTAL +} vm_srv_dtcnt_result_enum; + +/* this struct is designed for Data account store profile content operations*/ +typedef struct +{ + void *prof_data; /* profile data pointer */ + VMUINT32 prof_fields; /* profile enabled attributes */ + vm_srv_dtcnt_bearer_enum prof_type; /* profile bearer type */ +} vm_srv_dtcnt_store_prof_data_struct; + +/***************************************************************************** + * + * FUNCTION + * vm_srv_dtcnt_store_delete_cb_func_ptr + * DESCRIPTION + * store account deleting callback function + * PARAMETERS + * user_data : [IN] APP's piggyback user_data + * deleting_acc_id : [IN] the account id to be deleted + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_srv_dtcnt_store_delete_cb_func_ptr) (VMUINT32 deleting_acc_id, void *user_data); + +/* Data Account profile type enum */ +typedef enum +{ + VM_SRV_DTCNT_PROF_TYPE_USER_CONF = 0, /* user configured account */ + VM_SRV_DTCNT_PROF_TYPE_OTA_CONF, /* OTA configured account */ + VM_SRV_DTCNT_PROF_TYPE_FACTORY_CONF, /* Factory default */ + VM_SRV_DTCNT_PROF_TYPE_SIM_PROF, /* SIM provisioning account */ + VM_SRV_DTCNT_PROF_TYPE_DM_CONF, /* DM configured account */ + VM_SRV_DTCNT_PROF_TYPE_TOTAL +} vm_srv_dtcnt_prof_acc_type_enum; + +/* this struct is designed for Data account store query operation */ +typedef struct +{ + vm_srv_dtcnt_sim_type_enum sim_qry_info; /* sim query data for filter settings (used if OR'd set in filters) */ + vm_srv_dtcnt_bearer_enum bearer_qry_info; /* bearer query data for filter settings (used if OR'd set in filters) */ + vm_srv_dtcnt_prof_acc_type_enum acc_type_info; /* account type query data for filter settings (used if OR'd set in filters) */ + VMUINT16 filters; /* query settings (OR'd operation by srv_dtcnt_store_qry_type_enum) */ + VMUINT64 app_type; /* app_type query data for filter settings (used if OR'd set in filters) */ +} vm_srv_dtcnt_store_prof_qry_filter_struct; + +/* this struct is designed for Data account store query operation */ +#define VM_SRV_DTCNT_STORE_IDS_QRY_MAX_SIZE (64) /* maximum size of ids query id buffer */ +typedef struct +{ + vm_srv_dtcnt_store_prof_qry_filter_struct qry_info; /* query information from DA APP */ + VMUINT32 ids[VM_SRV_DTCNT_STORE_IDS_QRY_MAX_SIZE]; /* account id list query result */ + VMUINT8 num_ids; /* the number of queried id list */ +} vm_srv_dtcnt_store_prof_qry_struct; + +/* srv dtcnt add prof cntx struct */ +typedef struct +{ + vm_srv_dtcnt_store_prof_data_struct *prof; + VMUINT32 *acc_prof_id; + vm_srv_dtcnt_result_enum operate_result; +} vm_srv_dtcnt_add_prof_cntx_struct; + +/* srv dtcnt update prof cntx */ +typedef struct +{ + vm_srv_dtcnt_store_prof_data_struct *prof; + VMUINT32 acc_prof_id; + vm_srv_dtcnt_result_enum operate_result; +} vm_srv_dtcnt_update_prof_cntx_struct; + +/* srv dtcnt delete prof cntx */ +typedef struct +{ + VMUINT32 acc_prof_id; + VMBOOL force_exec; + void *user_data; + vm_srv_dtcnt_store_delete_cb_func_ptr callback; + vm_srv_dtcnt_result_enum operate_result; +}vm_srv_dtcnt_delete_prof_cntx_struct; + +/* srv dtcnt get prof ids cntx*/ +typedef struct +{ + vm_srv_dtcnt_store_prof_qry_struct *qry; + vm_srv_dtcnt_result_enum operate_result; +} vm_srv_dtcnt_get_prof_ids_cntx_struct; + + +/* time struct for setting srv */ +typedef struct +{ + VMUINT16 nYear; + VMUINT8 nMonth; + VMUINT8 nDay; + VMUINT8 nHour; + VMUINT8 nMin; + VMUINT8 nSec; + VMUINT8 DayIndex; /* 0=Sunday */ +} vm_time_struct; + + +/* spof nvram struct for mre */ +typedef struct +{ + VMBYTE Type; + VMBYTE Status; + VMBYTE Hour; + VMBYTE Min; +} vm_spof_nvram_struct; + + +/* nitz status */ +typedef enum +{ + VM_SRV_NITZ_OFF, + VM_SRV_NITZ_CONFIRM_FIRST, + VM_SRV_NITZ_ON +}vm_srv_nitz_type_enum; + + +typedef enum +{ + VM_SIM_NONE = 0, /* No bit-wise operation for none case */ + VM_SIM1 = 0x0001, + VM_SIM2 = 0x0002, + VM_SIM3 = 0x0004, + VM_SIM4 = 0x0008, + VM_SIM_END_OF_ENUM +}vm_setting_sim_enum; + +typedef struct +{ + /* Event id */ + VMUINT16 evt_id; + /* Event structure size */ + VMUINT16 size; + /* User data pointer */ + void *user_data; +}vm_mmi_event_struct; + +/* vm mmi proc function type */ +typedef VMINT (*vm_mmi_proc_func) (vm_mmi_event_struct *param); + +/* srv gprs tranfer cntx */ +typedef struct +{ + vm_setting_sim_enum sim_type; + vm_mmi_proc_func ptr_func; + void *user_data; +} vm_srv_gprs_tranfer_cntx_struct; + + +//Error code +/*ok means setting apply done*/ +#define VM_SETTING_RESULT_OK 0 +/*fail means system error when apply setting*/ +#define VM_SETTING_RESULT_FAIL -1 +/*would block means current setting is a asynchronous mode, result and data will notify to callback*/ +#define VM_SETTING_RESULT_WOULD_BLOCK -2 +/*invalid means wrong type and operation combination*/ +#define VM_SETTING_RESULT_INVALID -3 + +/*Interface and callback function*/ + +/***************************************************************************** + * + * FUNCTION + * srv_setting_result_callback + * DESCRIPTION + * setting result callback funtion, app should provide a callback funtion when apply + * settings, and this function will be called if current setting is asynchronous mode + * PARAMETERS + * result: [IN] Operation result + * user_data: [IN] User data + * RETURN VALUES + * void + *****************************************************************************/ +typedef void(* vm_setting_srv_result_callback)(VMINT32 result, void *user_data); + + +/*vm_setting_srv_enum*/ +typedef enum +{ + VM_SETTING_SRV_NO_ERROR = 0,//operator suceed + VM_SETTING_SRV_GET_MEM_FAIL = -1,//memory is not enough + VM_SETTING_SRV_ERROR_OF_RES = -2,// out of resource + VM_SETTING_SRV_ERROR_INVALID_ID = -3, //Invalid res id + VM_SETTING_SRV_ERROR_OF_PROCESS = -4,//process error + VM_SETTING_SRV_ERR_OTHERS = -65535,// other errors + VM_SETTING_SRV_ERR_END = -65536//end mark +}vm_setting_srv_enum; + + +/***************************************************************************** + * + * FUNCTION + * vm_settings_srv_command + * DESCRIPTION + * General setting command interface, which is use to set/get platfrom related settings + * + * PARAMETERS + * type: [IN] setting type, refer enum settingModuleTypes + * user_data: [IN] setting operation, refer to setting operation enum for each setting type + * in: [IN] in parameters, if you use set/add/edit/delete related operaitons, + * please provide in para + * out: [OUT] out data, if you use get/query related operations, please provide out para + * srv_setting_result_callback: [IN] setting result callback funtion, will be called by + * system when current setting is asynchronous mode + * RETURN VALUES + * void + * + * EXAMPLE + * + * Sample Code1 + * //switch on mobile data connection. + * VMINT32 result = VM_SETTING_SRV_NO_ERROR; + * result = vm_setting_srv_command(VM_SETTING_CELLULAR_GPRS_SERVICE, VM_OPERATION_GPRS_SERVICE_ON, NULL, NULL, NULL, NULL); + * if (result == VM_SETTING_RESULT_OK) + * { + * vm_log_debug("This case is passed"); + * } + * else if (result == VM_SETTING_RESULT_INVALID) + * { + * vm_log_debug("This case is not support"); + * } + * else + * { + * vm_log_debug("This case is failed."); + * } + * + * Sample Code2 + * //set system time + * VMINT32 result = VM_SETTING_SRV_NO_ERROR; + * vm_time_struct get_time, set_time; + * vm_setting_srv_command(VM_SETTING_DATETIME, VM_OPERATION_DATETIME_GET, NULL, &get_time, NULL, NULL); + * set_time = get_time; + * set_time.nHour = 12; + * set_time.nMin = 14; + * result = vm_setting_srv_command(VM_SETTING_DATETIME, VM_OPERATION_DATETIME_SET, &set_time, NULL, NULL, NULL); + * if (result == VM_SETTING_RESULT_OK) + * { + * vm_log_debug("This case is passed"); + * } + * else if (result == VM_SETTING_RESULT_INVALID) + * { + * vm_log_debug("This case is not support"); + * } + * else + * { + * vm_log_debug("This case is failed"); + * } + * + *****************************************************************************/ +VMINT32 vm_setting_srv_command(VMUINT16 type, + VMUINT16 operation, + void *in, + void *out, + vm_setting_srv_result_callback cb, + void *user_data); + + + +typedef void (*vm_srv_sensor_hr_data_cb)(void *sensor_data); +typedef void (*vm_srv_sensor_acc_data_cb)(void *acc_x, void *acc_y, void *acc_z); + +void vm_srv_sensor_hr_data_rigister_cb(vm_srv_sensor_hr_data_cb event_hdlr); +void vm_srv_sensor_acc_data_rigister_cb(vm_srv_sensor_acc_data_cb event_hdlr); + +typedef void (*vm_idle_swatch_pedometer_cb)(void *data); +void vm_idle_swatch_pedometer_register_callback(vm_idle_swatch_pedometer_cb event_hdlr); +void vm_switch_bt_call(VMBOOL on); +VMBOOL vm_is_bt_call_allowed(void); + +#ifdef __cplusplus +} +#endif + +#endif /* VMSETTINGS_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmsim.h b/hardware/arduino/mtk/system/libmtk/include/vmsim.h new file mode 100644 index 00000000..23ed9ce6 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmsim.h @@ -0,0 +1,417 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef VMSIM_SDK_H_ +#define VMSIM_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* Operator */ +typedef enum +{ + NO_SIM_CARD = 0, /* No SIM card. */ + UNKOWN_OPERATOR, /* Unknown operator. */ + CMCC, /* China Mobile. */ + UNICOM, /* China Unicom. */ + CNC, /* China Netcom. */ + CNTELCOM, /* China Telecom. */ + ALL /* All the operator. */ +} operator_t; + +/* The return value of vm_get_sim_card_status(). */ +typedef enum +{ + VM_SIM_STATE_ERROR = -1, /* Get failed. */ + VM_SIM_STATE_VACANT = 0, /* No SIM card or the SIM card not work. */ + VM_SIM_STATE_WORKING = 1 /* The SIM card is working. */ +} vm_sim_state_t; + +typedef void (*vm_sim_get_iccid_cb)(VMCHAR* iccid, void* user_data); + +#define VM_SIM_NO 0 /* No SIM card */ +#define VM_SIM_SIM1 1 /* SIM card 1 */ +#define VM_SIM_SIM2 2 /* SIM card 2 */ +#define VM_SIM_SIM3 3 /* SIM card 3 */ +#define VM_SIM_SIM4 4 /* SIM card 4 */ + +/***************************************************************************** + * FUNCTION + * vm_get_operator + * DESCRIPTION + * Get the active operator. + * RETURNS + * The operator code. + * RETURN VALUES + * NO_SIM_CARD : No SIM card. + * UNKOWN_OPERATOR : Unknown operator. + * CMCC : China Mobile. + * UNICOM : China Unicom. + * CNC : China Netcom. + * CNTELCOM : China Telecom. + *****************************************************************************/ +operator_t vm_get_operator(void); + +/***************************************************************************** + * FUNCTION + * vm_has_sim_card + * DESCRIPTION + * To query whether the SIM is available or not. + * RETURNS + * TRUE if any SIM is available. + * RETURN VALUES + * TRUE : A SIM available. + * FALSE : No SIM available. + *****************************************************************************/ +VMINT vm_has_sim_card(void); + +/***************************************************************************** + * FUNCTION + * vm_get_imei + * DESCRIPTION + * Get the IMEI of the phone. If the phone support dual card, it will get the IMEI of the selected SIM card. + * RETURNS + * IMEI string for the phone in ASCII format. + * RETURN VALUES + * NULL : The request of IMEI is in progress, please try again later. + *****************************************************************************/ +VMSTR vm_get_imei(void); + +/***************************************************************************** + * FUNCTION + * vm_get_imsi + * DESCRIPTION + * Get the IMSI of selected SIM card. + * RETURNS + * IMSI string of the selected SIM card. + * RETURN VALUES + * NULL : The request of IMSI is in progress, please try again later. + *****************************************************************************/ +VMSTR vm_get_imsi(void); + +/***************************************************************************** + * FUNCTION + * vm_sim_card_count + * DESCRIPTION + * Get the number of SIM cards. + * RETURNS + * The number of SIM cards. + * RETURN VALUES + * 99 : Flight mode. + * VM_SIM_NO : No SIM. + * 1 : One SIM card. + * 2 : Two SIM card. + *****************************************************************************/ +VMINT vm_sim_card_count(void); + +/***************************************************************************** + * FUNCTION + * vm_set_active_sim_card + * DESCRIPTION + * Set active SIM card. + * PARAMETERS + * card_id : [IN] Index of SIM card, 1-SIM1, 2-SIM2. + * RETURN VALUES + * TRUE : If successful. + * FALSE : If failed. + *****************************************************************************/ +VMINT vm_set_active_sim_card(VMINT card_id); + +/***************************************************************************** + * FUNCTION + * vm_get_sim_card_status + * DESCRIPTION + * Get the status of the given SIM card. + * PARAMETERS + * card_id : [IN] Index of SIM card, 1-SIM1, 2-SIM2. + * RETURNS + * The status of the given SIM card. + * RETURN VALUES + * VM_SIM_STATE_ERROR : Get failed. + * VM_SIM_STATE_VACANT : No SIM card or the SIM card not work. + * VM_SIM_STATE_WORKING : The given SIM card is working. + *****************************************************************************/ +vm_sim_state_t vm_get_sim_card_status(VMINT card_id); + +/* The maximum length of operator code */ +#define VM_MAX_OPERATOR_CODE_SIZE (7) + +/***************************************************************************** + * FUNCTION + * vm_query_operator_code + * DESCRIPTION + * Get the operator code. + * PARAMETERS + * buffer : [OUT] Buffer stores operator code. + * buffer_size : [IN] Size of the buffer. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If successful. + * Other error code: If unsuccessful. + *****************************************************************************/ +VMINT vm_query_operator_code(VMCHAR *buffer, VMUINT buffer_size); + +/***************************************************************************** + * FUNCTION + * vm_sim_get_iccid + * DESCRIPTION + * Get the iccid of sim card. + * PARAMETERS + * sim : [IN] which sim card :1,2,3,4.... + * callback : [IN] callback function. + * iccid : [IN] buff to receive iccid + * buff_len : [IN] buff length + * user_data : [IN] user data in callback. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If successful. + * Other error code: If unsuccessful. + *****************************************************************************/ +VMINT vm_sim_get_iccid(VMINT sim, vm_sim_get_iccid_cb callback, VMCHAR* iccid, VMINT buff_len, void* user_data); + +/***************************************************************************** + * FUNCTION + * vm_sim_get_active_sim_card + * DESCRIPTION + * Get the active sim card. + * PARAMETERS + * + * RETURNS + * sim card 1,2,3,4... + * RETURN VALUES + * 0 : no active sim card + *****************************************************************************/ +VMINT vm_sim_get_active_sim_card(void); + +/***************************************************************************** + * FUNCTION + * vm_sim_max_card_count + * DESCRIPTION + * Get the max card phone support + * PARAMETERS + * + * RETURNS + * 1,2,3,4... + * RETURN VALUES + * + *****************************************************************************/ +VMINT vm_sim_max_card_count(void); + +/***************************************************************************** + * FUNCTION + * vm_sim_get_prefer_sim_card + * DESCRIPTION + * Get the user prefer sim card + * PARAMETERS + * + * RETURNS + * 1,2,3,4... + * RETURN VALUES + * + *****************************************************************************/ +VMINT vm_sim_get_prefer_sim_card(void); + +/***************************************************************************** + * FUNCTION + * vm_get_imei + * DESCRIPTION + * Get the IMEI of the phone. + * PARAMETERS + * sim : [IN] which sim card :1,2,3,4.... + * RETURNS + * IMEI string for the phone in ASCII format. + * RETURN VALUES + * NULL : The request of IMEI is in progress, please try again later. + *****************************************************************************/ +VMSTR vm_get_imei_ext(VMINT sim); + + +/* NEW */ +/***************************************************************************** + * FUNCTION + * vm_sim_get_imei + * DESCRIPTION + * Get the IMEI of the phone. If the phone support dual card, it will get the IMEI of the selected SIM card. + * RETURNS + * IMEI string for the phone in ASCII format. + * RETURN VALUES + * NULL : The request of IMEI is in progress, please try again later. + *****************************************************************************/ +VMSTR vm_sim_get_imei(void); +/***************************************************************************** + * FUNCTION + * vm_get_imsi + * DESCRIPTION + * Get the IMSI of selected SIM card. + * RETURNS + * IMSI string of the selected SIM card. + * RETURN VALUES + * NULL : The request of IMSI is in progress, please try again later. + *****************************************************************************/ +VMSTR vm_sim_get_imsi(void); +/***************************************************************************** + * FUNCTION + * vm_sim_get_imei_ext + * DESCRIPTION + * Get the IMEI of the phone. + * PARAMETERS + * sim : [IN] which sim card :1,2,3,4.... + * RETURNS + * IMEI string for the phone in ASCII format. + * RETURN VALUES + * NULL : The request of IMEI is in progress, please try again later. + *****************************************************************************/ +VMSTR vm_sim_get_imei_ext(VMINT sim); +/***************************************************************************** + * FUNCTION + * vm_sim_get_operator + * DESCRIPTION + * Get the active operator. + * RETURNS + * The operator code. + * RETURN VALUES + * NO_SIM_CARD : No SIM card. + * UNKOWN_OPERATOR : Unknown operator. + * CMCC : China Mobile. + * UNICOM : China Unicom. + * CNC : China Netcom. + * CNTELCOM : China Telecom. + *****************************************************************************/ +operator_t vm_sim_get_operator(void); + +/***************************************************************************** + * FUNCTION + * vm_get_sim_card_status + * DESCRIPTION + * Get the status of the given SIM card. + * PARAMETERS + * card_id : [IN] Index of SIM card, 1-SIM1, 2-SIM2. + * RETURNS + * The status of the given SIM card. + * RETURN VALUES + * VM_SIM_STATE_ERROR : Get failed. + * VM_SIM_STATE_VACANT : No SIM card or the SIM card not work. + * VM_SIM_STATE_WORKING : The given SIM card is working. + *****************************************************************************/ +vm_sim_state_t vm_sim_get_card_status(VMINT sim); + +/***************************************************************************** + * FUNCTION + * vm_has_sim_card + * DESCRIPTION + * To query whether the SIM is available or not. + * RETURNS + * TRUE if any SIM is available. + * RETURN VALUES + * TRUE : A SIM available. + * FALSE : No SIM available. + *****************************************************************************/ +VMBOOL vm_sim_has_card(void); +/***************************************************************************** + * FUNCTION + * vm_query_operator_code + * DESCRIPTION + * Get the operator code. + * PARAMETERS + * buffer : [OUT] Buffer stores operator code. + * buffer_size : [IN] Size of the buffer. + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If successful. + * Other error code: If unsuccessful. + *****************************************************************************/ +VMINT vm_sim_query_operator_code(VMCHAR* buffer, VMUINT buffer_size); +/***************************************************************************** + * FUNCTION + * vm_sim_get_active_sim_card + * DESCRIPTION + * Get the active sim card. + * PARAMETERS + * + * RETURNS + * sim card 1,2,3,4... + * RETURN VALUES + * 0 : no active sim card + *****************************************************************************/ +VMBOOL vm_sim_set_active_card(VMINT sim); + +#define VM_MAX_PLMN_LEN 6 +/***************************************************************************** + * FUNCTION + * vm_sim_get_home_plmn + * DESCRIPTION + * Get the SIM PLMN. + * PARAMETERS + * sim : [IN] Index of SIM card, 1-SIM1, 2-SIM2. + * buffer : [OUT] Buffer stores operator code. The size shall be + * (VM_MAX_PLMN_LEN + 1) at minimum. + * buffer_size : [IN] Size of the buffer. It shall be >= + * (VM_MAX_PLMN_LEN + 1) + * RETURNS + * The error code of the operation. + * RETURN VALUES + * 0 : If successful. + * Other error code: If unsuccessful. + *****************************************************************************/ +VMINT vm_sim_get_home_plmn(VMINT sim, VMCHAR* buffer, VMUINT buffer_size); + + +/***************************************************************************** + * FUNCTION + * vm_nw_info_get_nw_plmn + * DESCRIPTION + * Get network PLMN. + * PARAMETERS + * sim : [IN] Which protocol layer of SIM + * buffer : [OUT] PLMN buffer to be filled in. The size shall be + * (VM_MAX_PLMN_LEN + 1) at minimum. + * buffer_size : [IN] The size of out_plmn_buffer[]. It shall be >= + * (VM_MAX_PLMN_LEN + 1). + * RETURN VALUES + * 0 : If returned PLMN is valid. + * else : If PLMN is not available; for example, no service state. + *****************************************************************************/ +VMINT vm_nw_info_get_nw_plmn(VMINT sim, VMCHAR* buffer, VMUINT buffer_size); +#ifdef __cplusplus +} +#endif + +#endif /* VMSIM_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmsm.h b/hardware/arduino/mtk/system/libmtk/include/vmsm.h new file mode 100644 index 00000000..aab820c1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmsm.h @@ -0,0 +1,310 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMSM_SDK_H_ +#define VMSM_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +#include "vmpromng.h" + +/* Search all SMs in removable & phone memory and compare their versions while loading. The newest one will be loaded. */ +#define MRE_SM_LOAD_VER_CMP + +/* SM is being loaded. */ +#define VM_SM_MSG_LOAD (1) + +/* Invoker is querying for entries of SM API. */ +#define VM_SM_MSG_QUERY (5) + +/* SM is being unloaded. */ +#define VM_SM_MSG_UNLOAD (9) + + +/* Definitions of SM's return value */ +#define VM_SM_SUCCESS (0) /* SM operation success */ +#define VM_SM_FAILED (-1) /* SM operation failed */ +#define VM_SM_PARAM_ERROR (-2) /* SM parameter error */ +#define VM_SM_FILE_NOT_FOUND (-3) /* SM file not found */ +#define VM_SM_INVALID_INVOKER (-4) /* SM invalid invoker */ +#define VM_SM_CREATE_FAILED (-5) /* SM failed to create pcb */ +#define VM_SM_CREATE_COPY_FAILED (-6) /* SM failed to create copy */ +#define VM_SM_MSG_FAILED (-7) /* SM failed to handle messages */ +#define VM_SM_NAME_MISMATCH (-8) /* SM name mis-match with name in file tag */ +#define VM_SM_MEMORY_INSUFFICIENT (-9) /* SM memory insifficient */ + +/* SM flag to identify PCB's type, phase out*/ +enum { + MRE_APP = 0, /* app launch vsm */ + MRE_SM /* vsm launch vsm (not support) */ +}; + + +typedef struct _vm_sm_info_t { + VMCHAR version[6]; +} vm_sm_info_t; + +VMINT vm_sm_query_info(VMSTR sm_name, vm_sm_info_t * sm_info); + +#ifdef __LINKIT_SDK__ + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +/* Definitions for explicit SM invoking */ +typedef void (*void_void_t)(void); +typedef VMINT (*int_void_t)(void); +typedef VMINT (*int_int_t)(VMINT); + +/* Macros for SM */ +#define SM_PROCESS_BEGIN() {\ + if (((int_int_t)vm_get_sym_entry("vm_sm_set_sb_by_ptr"))((VMINT)handle_smevt) == 0) { + +#define SM_PROCESS_RETURN() ((void_void_t)vm_get_sym_entry("vm_sm_reset_sb"))(); + +#define SM_PROCESS_END() SM_PROCESS_RETURN() } } + +#define SM_CALLBACK_BEGIN() {\ + if (((int_void_t)vm_get_sym_entry("vm_sm_set_sb_for_invoker"))() == 0) { + +#define SM_CALLBACK_END() SM_PROCESS_END() + +#define SM_SAFE_CALLBACK(PTR) \ + SM_CALLBACK_BEGIN() \ + PTR; \ + SM_CALLBACK_END() + +#define SM_SAFE_CALLBACK_RETURN(PTR, RET) \ + SM_CALLBACK_BEGIN() \ + RET = PTR; \ + SM_CALLBACK_END() + +/* Macros for SM STUB */ +#define SM_INVOKE_BEGIN(SM) {\ + if (((int_int_t)vm_get_sym_entry("vm_sm_set_sb_by_handle"))(SM) == 0) { + +#define SM_INVOKE_END() SM_PROCESS_END() + +#define SM_SAFE_INVOKE(SM, PTR) \ + SM_INVOKE_BEGIN(SM) \ + PTR; \ + SM_INVOKE_END() + +#define SM_SAFE_INVOKE_RETURN(SM, PTR, RET) \ + SM_INVOKE_BEGIN(SM) \ + RET = PTR; \ + SM_INVOKE_END() + +#endif + + +/***************************************************************************** + * FUNCTION + * vm_sm_reg_callback + * DESCRIPTION + * register SM system event callback function. + * PARAMETERS + * smHandler : [IN] callback function pointer. + * RETURN VALUES + * + *****************************************************************************/ +void vm_sm_reg_callback(VMINT (*smHandler)(VMINT message, VMINT param)); + + +/***************************************************************************** + * FUNCTION + * vm_sm_get_filename + * DESCRIPTION + * Get running sm full path (UCS2). + * PARAMETERS + * filename : [OUT] sm file name, get memory form invoker. + * RETURN VALUES + * VM_SM_SUCCESS : If successful. + * VM_SM_FAILED : If unsuccessful. + *****************************************************************************/ +VMINT vm_sm_get_filename(VMWSTR filename); + +/***************************************************************************** + * FUNCTION + * vm_sm_load + * DESCRIPTION + * load sm file. + * PARAMETERS + * sm_name : [IN] sm file name without suffix. + * RETURN VALUES + * >0 : sm handle. + * VM_SM_FAILED : If unsuccessful. + * VM_SM_PARAM_ERROR : If unsuccessful. + * VM_SM_FILE_NOT_FOUND : If unsuccessful. + * VM_SM_FAILED : If unsuccessful. + * VM_SM_CREATE_FAILED : If unsuccessful. + * VM_SM_CREATE_COPY_FAILED : If unsuccessful. + * VM_SM_MSG_FAILED : If unsuccessful. + * VM_SM_NAME_MISMATCH : If unsuccessful. + * SEE ALSO + * vm_sm_loadw + * vm_sm_unload + * EXAMPLE + * + * VMINT sm_hdl = vm_sm_load("sm_charge"); + * if (sm_hdl > 0) + * { + * ... + * } + * vm_sm_unload(sm_hdl); + * + *****************************************************************************/ +VMINT vm_sm_load(VMSTR sm_name); + + +/***************************************************************************** + * FUNCTION + * vm_sm_loadw + * DESCRIPTION + * load sm file use unicorn. + * PARAMETERS + * sm_name : [IN] sm file name without suffix. + * RETURN VALUES + * >0 : sm handle. + * VM_SM_FAILED : If unsuccessful. + * VM_SM_PARAM_ERROR : If unsuccessful. + * VM_SM_FILE_NOT_FOUND : If unsuccessful. + * VM_SM_FAILED : If unsuccessful. + * VM_SM_CREATE_FAILED : If unsuccessful. + * VM_SM_CREATE_COPY_FAILED : If unsuccessful. + * VM_SM_MSG_FAILED : If unsuccessful. + * VM_SM_NAME_MISMATCH : If unsuccessful. + * SEE ALSO + * vm_sm_load + *****************************************************************************/ +VMINT vm_sm_loadw(VMWSTR sm_name); + + +/***************************************************************************** + * FUNCTION + * vm_sm_get_func_entry + * DESCRIPTION + * get function pointer form sm file. + * PARAMETERS + * sm_hdl : [IN] sm file handler. + * api_id : [IN] app id provide by sm headfile. + * RETURN VALUES + * >0 : If successful. + * NULL : If unsuccessful. + * EXAMPLE + * + * VMINT sm_hdl = vm_sm_load("sm_charge"); + * func_t func_ptr = NULL; + * if (sm_hdl > 0) + * { + * func_ptr = vm_sm_get_func_entry(sm_hdl, id_func); + * if (func_ptr) + * { + * func_ptr(x, y, z); + * } + * } + * vm_sm_unload(sm_hdl); + * + *****************************************************************************/ +VMINT vm_sm_get_func_entry(VMINT sm_hdl, VMINT api_id); + + +/***************************************************************************** + * FUNCTION + * vm_sm_unload + * DESCRIPTION + * unload sm file. + * PARAMETERS + * sm_hdl : [IN] sm file handler. + * RETURN VALUES + * VM_SM_SUCCESS : If successful. + * VM_SM_FAILED : If unsuccessful. + * SEE ALSO + * vm_sm_load + * EXAMPLE + * + * VMINT sm_hdl = vm_sm_load("sm_charge"); + * if (sm_hdl > 0) + * { + * ... + * } + * vm_sm_unload(sm_hdl); + * + *****************************************************************************/ +VMINT vm_sm_unload(VMINT sm_hdl); + + +/***************************************************************************** + * FUNCTION + * vm_sm_reg_msg_proc + * DESCRIPTION + * register msg proc handle + * PARAMETERS + * proc : [IN] proc handle + * RETURN VALUES + * void + *****************************************************************************/ +void vm_sm_reg_msg_proc(VM_MESSAGE_PROC proc); + + +/***************************************************************************** + * FUNCTION + * vm_sm_get_handle_by_package_name + * DESCRIPTION + * get handle + * PARAMETERS + * name : [IN] package name of vsm file. + * RETURN VALUES + * handle : If successful. + * 0 : If unsuccessful. + *****************************************************************************/ +VMINT vm_sm_get_handle_by_package_name(VMSTR name); + + +VMINT vm_sm_set_sb_by_ptr(VMINT ptr); +VMINT vm_sm_reset_sb(void); +void vm_sm_exit(void); +VMINT vm_sm_set_sb_for_invoker(void); +VMINT vm_sm_set_sb_by_handle(VMINT sm_hdl); + + +#ifdef __cplusplus +} +#endif + +#endif /* VMSM_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmsms.h b/hardware/arduino/mtk/system/libmtk/include/vmsms.h new file mode 100644 index 00000000..e8c09b77 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmsms.h @@ -0,0 +1,822 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMSMS_SDK_H_ +#define VMSMS_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +#define VM_SMS_MSG_CONTENT_LEN 500 + +#define VM_SMS_MAX_ADDR_LEN 21 + +#define VM_SMS_MSG_INFO_CONTENT_LEN (61 + 19) + +#define VM_SMS_SUPPORT_SYN_SCA 1 +#define VM_SMS_NOT_SUPPORT_SYN_SCA -2 + +typedef enum +{ + VM_SMS_IDENTIFY_ERROR = -4, + VM_SMS_MIBR_NOT_IN_PROCESS_SPACE = -3, + VM_SMS_MIBR_ERROR = -2, + VM_SMS_REQ_ERROR = -1, /*SMS operation request failure*/ + VM_SMS_REQ_NO_ERROR, /*SMS operation request succeed*/ + VM_SMS_REQ_CALLBACK_REGISTERED +} vm_sms_error_enum; + + +typedef enum +{ + VM_SMS_BOX_INBOX = 0x01, /*inbox*/ + VM_SMS_BOX_OUTBOX = 0x02, /*sent box*/ + VM_SMS_BOX_DRAFTS = 0x04, /*draft box*/ + VM_SMS_BOX_UNSENT = 0x08, /*to be sent box*/ + VM_SMS_BOX_SIM = 0x10, /*sim card*/ + VM_SMS_BOX_ARCHIVE = 0x20, /*archive box */ + + VM_SMS_BOX_RESERVED = 0x40 + +} vm_sms_box_enum; + +/* Message Folder Type */ +typedef enum +{ + VM_SMS_FOLDER_DEFAULT, /* default folder */ + VM_SMS_FOLDER_ARCHIVE /* archive folder */ +} vm_sms_folder_enum; + +/* Message Storage Type */ +typedef enum +{ + + VM_SMS_STATUS_UNREAD = 0x01, /*unread*/ + VM_SMS_STATUS_READ = 0x02, /*read*/ + VM_SMS_STATUS_SENT = 0x04, /*sent*/ + VM_SMS_STATUS_UNSENT = 0x08, /*to be sent*/ + VM_SMS_STATUS_DRAFT = 0x10, /*draft*/ + + VM_SMS_STATUS_UNSUPPORTED = 0x20 +} vm_sms_status_enum; + + +/* Message Type Indication */ +typedef enum +{ + VM_SMS_MTI_DELIVER = 0x00, /* deliver type */ + VM_SMS_MTI_DELIVER_REPORT = 0x00, /* deliver report type */ + VM_SMS_MTI_SUBMIT = 0x01, /* submit type */ + VM_SMS_MTI_SUBMIT_REPORT = 0x01, /* submit report type */ + VM_SMS_MTI_STATUS_REPORT = 0x02, /* status report type */ + VM_SMS_MTI_COMMAND = 0x02, /* command type */ + VM_SMS_MTI_RESERVED = 0x03 +} vm_sms_mti_enum; + + +/* Message Storage Type */ +typedef enum +{ + VM_SMS_STORAGE_ME, /*phone*/ + VM_SMS_STORAGE_SIM, /*SIM card*/ + + VM_SMS_STORAGE_UNSPECIFIC +} vm_sms_storage_enum; + +typedef enum +{ + VM_MMI_SIM_1 = 0x0001, /* SIM 1 */ + VM_MMI_SIM_2 = 0x0002, /* SIM 2 */ + VM_MMI_SIM_3 = 0x0004, /* SIM 1 */ + VM_MMI_SIM_4 = 0x0008 /* SIM 2 */ + }vm_sim_enum; + +/* network type*/ +typedef enum +{ + VM_MMI_GSM = 0x0100 /* GSM network */ + } vm_network_enum; + +/* SIM Card Type */ +typedef enum +{ + VM_SMS_SIM_1 = VM_MMI_GSM | VM_MMI_SIM_1, /* sim1 */ + VM_SMS_SIM_2 = VM_MMI_GSM | VM_MMI_SIM_2, /* sim2 */ + VM_SMS_SIM_3 = VM_MMI_GSM | VM_MMI_SIM_3, /* SIM Card 3, the SIM card inserted in the slot 3 */ + VM_SMS_SIM_4 = VM_MMI_GSM | VM_MMI_SIM_4, /* SIM Card 4, the SIM card inserted in the slot 4 */ + VM_SMS_TOTAL +} vm_sms_sim_enum; + + +/* Message Class Type */ +typedef enum +{ + VM_SMS_CLASS_0 = 0x00, /* class 0 */ + VM_SMS_CLASS_1 = 0x01, /* class 1 */ + VM_SMS_CLASS_2 = 0x02, /* class 2 */ + VM_SMS_CLASS_3 = 0x03 /* class 3 */ +} vm_sms_class_enum; + + +/* Validity-Period */ +typedef enum +{ + VM_SMS_VP_1_HR = 11, /* 1 hour */ + VM_SMS_VP_6_HR = 71, /* 6 hours */ + VM_SMS_VP_12_HR = 143, /* 12 hours */ + VM_SMS_VP_24_HR = 167, /* 24 hours */ + VM_SMS_VP_72_HR = 169, /* 72 hours */ + VM_SMS_VP_1_WEEK = 173, /* 1 week */ + VM_SMS_VP_MAX = 255 +} vm_sms_vp_enum; + + +/* SMS DCS */ +typedef enum +{ + VM_SMS_DCS_7BIT = 0x00, /* GSM 7 bit default alphabet */ + VM_SMS_DCS_8BIT = 0x04, /* 8 bit data */ + VM_SMS_DCS_UCS2 = 0x08, /* UCS2 (16bit) */ + VM_SMS_DCS_RESERVED = 0x0c +} vm_sms_dcs_enum; + + +/* Protocol Identifier */ +typedef enum +{ + VM_SMS_PID_DEFAULT = 0x00, /* Text SMS */ + VM_SMS_PID_EMAIL = 0x32, /* Internet Electronic Mail */ + + VM_SMS_PID_TYPE_0 = 0x40, /* Short Message Type 0 */ + VM_SMS_PID_REPLACE_TYPE_1 = 0x41, /* Replace Short Message Type 1 */ + VM_SMS_PID_REPLACE_TYPE_2 = 0x42, /* Replace Short Message Type 2 */ + VM_SMS_PID_REPLACE_TYPE_3 = 0x43, /* Replace Short Message Type 3 */ + VM_SMS_PID_REPLACE_TYPE_4 = 0x44, /* Replace Short Message Type 4 */ + VM_SMS_PID_REPLACE_TYPE_5 = 0x45, /* Replace Short Message Type 5 */ + VM_SMS_PID_REPLACE_TYPE_6 = 0x46, /* Replace Short Message Type 6 */ + VM_SMS_PID_REPLACE_TYPE_7 = 0x47, /* Replace Short Message Type 7 */ + + VM_SMS_PID_RETURN_CALL_MSG = 0x5F, /* Return Call Message */ + VM_SMS_PID_ANSI_136_RDATA = 0x7C, /* ANSI-136 R-DATA */ + VM_SMS_PID_ME_DOWNLOAD = 0x7D, /* ME Data Download */ + VM_SMS_PID_ME_DE_PERSONAL = 0x7E, /* ME De-personalization Short Message */ + VM_SMS_PID_SIM_DOWNLOAD = 0x7F, /* (U)SIM Data Download */ + + VM_SMS_PID_RESERVED +} vm_sms_pid_enum; + + +/* SMS Action Type */ +typedef enum +{ + VM_SMS_ACTION_NONE, /* no action */ + VM_SMS_ACTION_SEND, /* send action */ + VM_SMS_ACTION_READ, /* read action */ + VM_SMS_ACTION_DELETE, /* delete action */ + VM_SMS_ACTION_SAVE, /* save action */ + VM_SMS_ACTION_UPDATE, /* update action */ + VM_SMS_ACTION_COPY, /* copy action */ + VM_SMS_ACTION_MOVE, /* move action */ + VM_SMS_ACTION_QUERY, /* query action */ + VM_SMS_ACTION_CHANGE_STATUS, /* change status action */ + VM_SMS_ACTION_MOVE_TO_ARCHIVE, /* move to archive action */ + VM_SMS_ACTION_GET_CONTENT, /* get content action */ + VM_SMS_ACTION_GET_SIM_NUM, /* get sim number action */ + VM_SMS_ACTION_GET_SC_ADDR /* get SMS center address action */ +} vm_sms_action_enum; + + +/* SMS Cause Tpye, and MMI defined error codes for others */ +typedef enum +{ + VM_SMS_CAUSE_NO_ERROR = 0, + + + VM_SMS_CAUSE_ME_FAILURE = 300, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + VM_SMS_CAUSE_OP_NOT_ALLOWED = 302, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + VM_SMS_CAUSE_OP_NOT_SUPPORTED = 303, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + VM_SMS_CAUSE_INVALID_PDU_PARA = 304, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + VM_SMS_CAUSE_INVALID_TEXT_PARA = 305, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + VM_SMS_CAUSE_SIM_NOT_INSERTED = 310, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + VM_SMS_CAUSE_SIM_FAILURE = 313, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + VM_SMS_CAUSE_MEMORY_FAILURE = 320, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + VM_SMS_CAUSE_INVALID_MEM_INDEX = 321, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + VM_SMS_CAUSE_MEM_FULL = 322, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + VM_SMS_CAUSE_SCA_UNKNOWN = 330, /* Reference TS 27.005 Clause 3.2.5, For AT Command and MMI */ + + VM_SMS_CAUSE_NOT_READY = 341, /*SMS not ready*/ + VM_SMS_CAUSE_SEND_BUSY, /*busy on sending*/ + VM_SMS_CAUSE_SEND_ABORT, + VM_SMS_CAUSE_MEM_INSUFFICIENT, /*memory insufficient*/ + VM_SMS_CAUSE_DATA_INVALID, /*invalid data*/ + VM_SMS_CAUSE_DATA_EXCEED, /*data exceed*/ + VM_SMS_CAUSE_NUMBER_EMPTY, /*destination number is empty*/ + VM_SMS_CAUSE_NUMBER_INVALID, /*destination number is invalid*/ + VM_SMS_CAUSE_SC_EMPTY, /*SMS center number is empty*/ + VM_SMS_CAUSE_SC_INVALID, /*SMS center number is invalid*/ + VM_SMS_CAUSE_FDL_FAIL, /* FDL fail */ + VM_SMS_CAUSE_AT_CONFLICT, /* AT conflict */ + VM_SMS_CAUSE_OP_CONFLICT, /* OP conflict */ + VM_SMS_CAUSE_EMAIL_NO_SPACE, /* email no space */ + VM_SMS_CAUSE_FS_ERROR, /* FS error */ + + VM_SMS_CAUSE_UNKNOWN_ERROR = 500 +} vm_sms_cause_enum; + +/* SMS Parameter Flag */ +typedef enum +{ + VM_SMS_PARA_NONE = 0x00000000, + + VM_SMS_PARA_NUM = 0x00000001, /* parameter of number */ + VM_SMS_PARA_SCA = 0x00000002, /* parameter of SCA */ + VM_SMS_PARA_PID = 0x00000004, /* parameter of PID */ + VM_SMS_PARA_DCS = 0x00000008, /* parameter of DCS */ + VM_SMS_PARA_VP = 0x00000010, /* parameter of VP */ + VM_SMS_PARA_STATUS_REPORT = 0x00000020, /* parameter of status report */ + VM_SMS_PARA_REPLY_PATH = 0x00000040, /* parameter of reply path */ + VM_SMS_PARA_PORT = 0x00000080, /* parameter of port */ + VM_SMS_PARA_CLASS = 0x00000100, /* parameter of class */ + VM_SMS_PARA_MMS = 0x00000200, /* parameter of MMS */ + VM_SMS_PARA_FO = 0x00000400, /* parameter of FO */ + + VM_SMS_PARA_STATUS = 0x00000800, /* parameter of status */ + VM_SMS_PARA_SIM_ID = 0x00001000, /* parameter of SIM ID */ + VM_SMS_PARA_STORAGE_TYPE = 0x00002000, /* parameter of storage type */ + VM_SMS_PARA_TIMESTAMP = 0x00004000, /* parameter of time stamp */ + + VM_SMS_PARA_CONTENT_EMS = 0x00008000, /* parameter of EMS */ + VM_SMS_PARA_CONTENT_BUFF = 0x00010000, /* parameter of buffer */ + VM_SMS_PARA_CONTENT_FILE = 0x00020000 /* parameter of file */ +} vm_sms_para_enum; + + + +/* SMS Sort Type */ +typedef enum +{ + VM_SMS_SORT_NONE, + VM_SMS_SORT_TIMESTAMP, /*by timestamp*/ + VM_SMS_SORT_MSG_TYPE, /*by message type*/ + VM_SMS_SORT_STORAGE_TYPE, /*by storage type*/ + VM_SMS_SORT_NUMBER, /*by number*/ + VM_SMS_SORT_CONTENT, /*by content*/ + VM_SMS_SORT_PID, /*by PID*/ + VM_SMS_SORT_SIM_ID /*by SIM*/ + +} vm_sms_sort_enum; + + +/* SMS Sorting Order */ +typedef enum +{ + VM_SMS_ORDER_DEFAULT, /*default order*/ + VM_SMS_ORDER_ASC, /*ascending*/ + VM_SMS_ORDER_DESC /*descending*/ +} vm_sms_order_enum; + + +/* SMS new message event type*/ +typedef enum +{ + + VM_EVT_ID_SMS_NEW_MSG, /* SMS event of new message */ + VM_EVT_ID_SMS_NEW_MSG_EX +} vm_sms_event_enum; + +typedef enum +{ + VM_SMS_ADDR_PHONE_NUM = 0, + VM_SMS_ADDR_EMAIL, + VM_SMS_ADDR_IP +}vm_sms_addr_type_enum; + +/* SMS Operation Callback Data Structure */ +typedef struct +{ + VMINT result; /* 1: operation succeed; 0: operation failure */ + vm_sms_cause_enum cause; /* cause description, refer to vm_sms_cause_enum */ + vm_sms_action_enum action; /* action type, refer to vm_sms_action_enum */ + void *action_data; /* action data depending on action type */ + void *user_data; /* user data */ +} vm_sms_callback_t; + +/* SMS Event Structure */ +typedef struct +{ + VMINT event_id; /* event ID registered */ + VMINT size; /* event information size */ + void * user_data; /* user data */ + void *event_info; /* event information pointer */ +} vm_sms_event_t; + + +/* Message Data Struture */ +typedef struct +{ + VMINT8 number[(VM_SMS_MAX_ADDR_LEN + 1)*2 ]; /* SMS number */ + vm_sms_status_enum status; /* SMS status */ + vm_sms_mti_enum mti; /* mti */ + + VMUINT8 tp_st; /* TP-Status, for Status Report */ + vm_sms_folder_enum folder_id; /* folder */ + + vm_sms_para_enum para_flag; /* parameter flag */ + + vm_sms_storage_enum storage_type; /* storage type */ + vm_sms_sim_enum sim_id; /* SIM ID */ + vm_time_t timestamp; /* time stamp */ + + VMINT8 sc_address[(VM_SMS_MAX_ADDR_LEN + 1)*2]; /* SMS center address */ + vm_sms_pid_enum pid; /* pid */ + vm_sms_vp_enum vp; /* vp */ + + VMINT status_report; /* status report */ + VMINT reply_path; /* reply path */ + + VMUINT16 src_port; /* source port */ + VMUINT16 dest_port; /* destination port */ + vm_sms_dcs_enum dcs; /* dcs */ + vm_sms_class_enum msg_class; /* message class */ + VMUINT16 content_buff_size; /* content buffer size */ + VMINT8 *content_buff; /* content buffer */ + VMINT8 *content_file_path; /* content file path */ + + void *content_ems; /* content ems */ +} vm_sms_msg_data_t; + +/* Add Message Callback Data Structure */ +typedef struct +{ + vm_sms_status_enum status; /* status */ + vm_sms_sim_enum sim_id; /* SIM ID */ + vm_sms_storage_enum storage_type; /* storage type */ + vm_time_t timestamp; /* time stamp */ + VMUINT16 content_size; /* content buffer size */ + VMINT8 *content; /* content buffer */ + VMINT8 number[(VM_SMS_MAX_ADDR_LEN + 1)*2 ]; /* destination number */ +} vm_sms_add_msg_data_t; + + +/* Query Data Structure */ +typedef struct +{ + vm_sms_sort_enum sort_flag; /* sort flag */ + vm_sms_order_enum order_flag; /* order flag */ + vm_sms_status_enum status; /* status */ + +} vm_sms_query_t; + + +/* new Message Data Structure */ +typedef struct +{ + VMUINT16 msg_id; + VMUINT16 dest_port; /* destination port */ + VMUINT16 src_port; /* source port */ + VMUINT16 message_len; /* message length */ + VMUINT16 ref; /* concat. message reference */ + VMUINT8 number[VM_SMS_MAX_ADDR_LEN + 1]; /* source number */ + VMUINT8 sc_number[VM_SMS_MAX_ADDR_LEN + 1]; + vm_time_t timestamp; /* timestamp of service center*/ + VMUINT8 total_seg; /* total segment */ + VMUINT8 seg; /* segment number */ + VMUINT8 dcs; /* encoding format */ + VMUINT8 mti; /* message type identication */ + VMUINT8 pid; /* protocol ID */ + VMUINT8 fo; + VMUINT8 data[1]; /* data */ + vm_sms_sim_enum sim_id; /* SIM ID */ + vm_sms_storage_enum storage_type; /* storage */ +} vm_sms_new_msg_t; + + +/* Read Message Callback Data Structure */ +typedef struct +{ + vm_sms_msg_data_t *msg_data; /* message data */ +} vm_sms_read_msg_cb_t; + + +/* Add Message Callback Data Structure */ +typedef struct +{ + VMUINT16 msg_id; /* message ID */ +} vm_sms_save_msg_cb_t; + + +/* Delete Message Callback Data Structure */ +typedef struct +{ + void *dummy; /* dummy */ +} vm_sms_delete_msg_cb_t; + + +/* Delete Message List Callback Data Structure */ +typedef struct +{ + VMUINT16 deleted_msg_num; /* number of deleted message */ +} vm_sms_delete_msg_list_cb_t; + + + +/* Query Message Callback Data Structure */ +typedef struct +{ + VMUINT16 msg_num; /* message number */ + VMUINT16 *msg_id_list; /* message ID list */ +} vm_sms_query_msg_cb_t; + + +/* Message New SMS Interrupt Event Callback Data Structure */ +typedef struct +{ + VMUINT16 msg_id; /* message ID */ + VMUINT8 *content; + void *msg_data; /* new msg structure (vm_sms_new_msg_t ) */ +} vm_sms_event_new_sms_t; + +/* get SMS center number Callback Data Structure */ +typedef struct +{ + VMINT8 sc_addr[VM_SMS_MAX_ADDR_LEN + 1]; +}vm_sms_get_sc_addr_cb_t; + +typedef struct +{ + VMINT sim; // sim card :1,2,3,4 + vm_sms_addr_type_enum addr_type; + VMWCHAR* addr; // address UCS2 + VMWCHAR* subject; //subject UCS2 + VMWCHAR* content; //content UCS2 +}vm_sms_launch_data; + + +/***************************************************************************** + * + * FUNCTION + * VmSmsCallbackFunc + * DESCRIPTION + * SMS operation callback function + * PARAMETERS + * callback_data : [IN] refer to vm_sms_callback_t + * +*****************************************************************************/ +typedef void(*VmSmsCallbackFunc)(vm_sms_callback_t* callback_data); + + +/***************************************************************************** + * + * FUNCTION + * VmSmsEventFunc + * DESCRIPTION + * SMS event callback function + * PARAMETERS + * event_data : [IN] refer to vm_sms_event_t + * RETURNS + * +*****************************************************************************/ +typedef VMINT(*VmSmsEventFunc)(vm_sms_event_t* event_data); + + +/***************************************************************************** + * FUNCTION + * vm_sms_read_msg + * DESCRIPTION + * 1. Read Message's Data, included message status, number, content and other attributes + * (Storage Type, SIM Card, Profile element, etc.) indicated by the flag; + * 2. The buffer to save the content should be provided by caller. + * 3. The Callback Action Data Structure is srv_sms_read_msg_cb_struct; + * PARAMETERS + * msg_id : [IN] Message ID + * change_status : [IN] Whether change the UNREAD Msg to READ + * msg_data : [IN/OUT] Message Data For Filling back read data + * callback_func : [IN] Callback Function + * user_data : [IN] User Data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_read_msg(VMUINT16 msg_id, VMINT change_status, vm_sms_msg_data_t* msg_data, + VmSmsCallbackFunc callback_func, void* user_data); + + +/***************************************************************************** + * FUNCTION + * vm_sms_add_msg + * DESCRIPTION + * 1. Save a new message to SMS Storage. + * 2. If Caller specify those parameters (Status, Address, Content, SIM Card, Storage Type, + * Profile element, we will use them, otherwise, it will user the defaut value (If the + * parameters is in the SMS setting, it will use the setting's value as defaut). + * 3. The Callback Action Data Struct is vm_sms_save_msg_cb_t. + * PARAMETERS + * msg_data : [IN] message data to be added + * callback_func : [IN] Callback Function + * user_data : [IN] User Data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_add_msg(vm_sms_add_msg_data_t * msg_data, VmSmsCallbackFunc callback_func, void* user_data); + + +/***************************************************************************** + * FUNCTION + * vm_sms_delete_msg + * DESCRIPTION + * 1. Delete an existed message; + * 2. If the message is not existed, the result is FALSE; + * 3. The Callback Action Data Structure is vm_sms_delete_msg_cb_t; + * PARAMETERS + * msg_id : [IN] Message ID + * callback_func : [IN] Callback Function + * user_data : [IN] User Data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_delete_msg(VMUINT16 msg_id, VmSmsCallbackFunc callback_func, void* user_data); + + +/***************************************************************************** + * FUNCTION + * vm_sms_delete_msg_list + * DESCRIPTION + * 1. Delete all the existed message of specified list + * 2. If the message is not existed, the result is FALSE; + * 3. The Callback Action Data Structure is vm_sms_delete_msg_list_cb_t; + * PARAMETERS + * box_type : [IN] refer to vm_sms_box_enum, can be combination of multiple boxes. + * sim_id : [IN] refer to vm_sms_sim_enum + * callback_func : [IN] Callback Function + * user_data : [IN] User Data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_delete_msg_list(vm_sms_box_enum box_type, vm_sms_sim_enum sim_id, VmSmsCallbackFunc callback_func, void* user_data); + + +/***************************************************************************** + * FUNCTION + * vm_sms_get_msg_id_list + * DESCRIPTION + * 1. Query the messages with some properties. + * 2. The caller can set the query_flag, and the corresponding paramenters of + * the propertied they wanted. The folder ID is mandatory in the current version; + * 3. The caller also can specify the sort flag, in the current version, we only + * support sorting by timestamp. + * 4. The Callback Action Data Structure is srv_sms_query_msg_cb_struct; + * PARAMETERS + * query_data : [IN] Query Data + * callback_func : [IN] Callback Function + * user_data : [IN] User Data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_get_msg_id_list(vm_sms_query_t* query_data, VmSmsCallbackFunc callback_func, void* user_data); + + +/***************************************************************************** + * FUNCTION + * vm_sms_get_msg_id + * DESCRIPTION + * Get message ID of the message in the box list + * PARAMETERS + * box_type : [IN] Message Box List Type + * msg_index : [IN] The position of message in the Box List + * for example: msg_id_list[msg_index] = msg_id; + * msg_id_list[0]=0 msg_id_list[0]=0 msg_id_list[0]=0 + * msg_id_list[1]=1 delete msg_id=2 msg_id_list[1]= 1 add a message msg_id_list[1]=1 + * msg_id_list[2]=2 -------------->msg_id_list[2]= 3 ------------>msg_id_list[2]=2 + * msg_id_list[3]=3 msg_id_list[3]=3 + * RETURNS + * msg_id if non-negative number, -1 means the msg-index does not exist. + *****************************************************************************/ +VMINT16 vm_sms_get_msg_id(vm_sms_box_enum box_type, VMUINT16 msg_index); + + +/***************************************************************************** + * FUNCTION + * vm_sms_get_box_size + * DESCRIPTION + * Get number of the messages in a box list + * PARAMETERS + * box_type : [IN] Message Box List Type, refer to vm_sms_box_enum + * RETURNS + * number of message + *****************************************************************************/ +VMINT16 vm_sms_get_box_size(vm_sms_box_enum box_type); + +/***************************************************************************** + * FUNCTION + * vm_sms_get_sc_address + * DESCRIPTION + * Get SC number (asyn) + * PARAMETERS + * sim_id : [IN] SIM card, refer to vm_sms_sim_enum. + * callback_func : [IN] Callback Function. + * user_data : [IN] user data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_get_sc_address( vm_sms_sim_enum sim_id, VmSmsCallbackFunc callback_func, void* user_data); + +/***************************************************************************** + * FUNCTION + * vm_sms_set_interrupt_event_handler + * DESCRIPTION + * Set Interrupt Event Handler of the Event + * PARAMETERS + * event_id : [IN] Event ID + * event_func : [IN] Event Handler Function + * user_data : [IN] User Data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_set_interrupt_event_handler(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data); + + +/***************************************************************************** + * FUNCTION + * vm_sms_clear_interrupt_event_handler + * DESCRIPTION + * Clear Interrupt Event Handler of the Event + * PARAMETERS + * event_id : [IN] Event ID + * event_func : [IN] Event Handler Function + * user_data : [IN] User Data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_clear_interrupt_event_handler(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data); + +/***************************************************************************** + * FUNCTION + * vm_sms_get_sc_address_syn + * DESCRIPTION + * Get SC number (sync) + * PARAMETERS + * vm_sc_addr : [OUT] output SC number + * sim_id : [IN] SIM card + * RETURNS + * result of get sc address. +* RETURN VALUES + * VM_SMS_REQ_ERROR : support sync mode, request failed. + * VM_SMS_SUPPORT_SYN_SCA : support sync mode, request succeed. + * VM_SMS_NOT_SUPPORT_SYN_SCA : not support sync mode, request failed. + *****************************************************************************/ +VMINT vm_sms_get_sc_address_syn(vm_sms_get_sc_addr_cb_t * vm_sc_addr, vm_sms_sim_enum sim_id); +/***************************************************************************** + * FUNCTION + * vm_sms_set_interrupt_event_handler_forpay + * DESCRIPTION + * Set Interrupt Event Handler of the Event + * PARAMETERS + * event_id : [IN] Event ID + * event_func : [IN] Event Handler Function + * user_data : [IN] User Data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_set_interrupt_event_handler_forpay(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data); + +/***************************************************************************** + * FUNCTION + * vm_sms_clear_interrupt_event_handler_forpay + * DESCRIPTION + * Clear Interrupt Event Handler of the Event + * PARAMETERS + * event_id : [IN] Event ID + * event_func : [IN] Event Handler Function + * user_data : [IN] User Data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_clear_interrupt_event_handler_forpay(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data); +/***************************************************************************** + * FUNCTION + * vm_sms_delete_msg_forpay + * DESCRIPTION + * 1. Delete an existed message; + * 2. If the message is not existed, the result is FALSE; + * 3. The Callback Action Data Structure is vm_sms_delete_msg_cb_t; + * PARAMETERS + * event_id : [IN] Event ID + * callback_func : [IN] Event Handler Function + * user_data : [IN] User Data + * RETURNS + * refer to vm_sms_error_enum + *****************************************************************************/ +VMINT vm_sms_delete_msg_forpay(VMUINT16 msg_id, VmSmsCallbackFunc callback_func, void* user_data); + +/***************************************************************************** + * FUNCTION + * vm_sms_launch + * DESCRIPTION + * 1. Launch a sms editor to edit sms + * PARAMETERS + * vm_sms_launch_data : [IN] launch data + * data_size : [IN] size of launch data + * RETURNS + * 0:success + *****************************************************************************/ +VMINT vm_sms_launch(vm_sms_launch_data* data, VMINT data_size); + +/** + * send SMS successfully + */ +#define VM_SMS_RESULT_OK 1 + +/** + * failed to send SMS + */ +#define VM_SMS_RESULT_ERROR 2 + +/** + * Cancel sending SMS + */ +#define VM_SMS_RESULT_ABORT 3 + +/***************************************************************************** +* FUNCTION + * vm_send_sms + * DESCRIPTION + * send SMS + * PARAMETERS + * phone_number : [IN] destination phone number. + * content : [IN] SMS content. + * callback : [IN] callback function for sending SMS + * RETURNS + * result of sending SMS request + * RETURN VALUES + * TRUE : request succeed. + * FALSE : request failure + * +*****************************************************************************/ +VMINT vm_send_sms(VMWSTR phone_number, VMWSTR content, void (*callback)(VMINT result)); + +/***************************************************************************** +* FUNCTION + * vm_cancel_send_sms + * DESCRIPTION + * cancel sending SMS. + * The function can be used only when: 1) after call the function vm_send_sms() and return TRUE + * 2) before callback is invoked + * Or the function will be invalid. + * +*****************************************************************************/ +void vm_cancel_send_sms(void); + +/***************************************************************************** + * FUNCTION + * vm_sms_is_sms_ready + * DESCRIPTION + * check whether sms is ready + * PARAMETERS + * void + * RETURNS + * result of whether sms is ready + * RETURN VALUES + * VM_TRUE : sms is ready + * VM_FALSE : sms is not ready + *****************************************************************************/ +VMBOOL vm_sms_is_sms_ready(void); + +#ifdef __cplusplus +} +#endif + +#endif /* VMSMS_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmso.h b/hardware/arduino/mtk/system/libmtk/include/vmso.h new file mode 100644 index 00000000..4681cb6e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmso.h @@ -0,0 +1,150 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMSO_SDK_H_ +#define VMSO_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* SO is being loaded. */ +#define VM_SO_MSG_LOAD (1) + +/* SO is being unloaded. */ +#define VM_SO_MSG_UNLOAD (9) + +/************************************************************************/ + +#define VM_SO_SUCCESS (0) /* SO operation success */ +#define VM_SO_FAILED (-1) /* SO operation failed */ +#define VM_SO_PARAM_ERROR (-2) /* SO parameter error */ +#define VM_SO_FILE_NOT_FOUND (-3) /* SO file not found */ +#define VM_SO_CREATE_FAILED (-5) /* SO failed to create pcb */ + +/***************************************************************************** + * FUNCTION + * vm_load_library + * DESCRIPTION + * load so file. + * PARAMETERS + * sm_name : [IN] so file name without suffix. + * RETURN VALUES + * >0 : so handle. + * <=0 : If unsuccessful. + * EXAMPLE + * + * VMINT so_hdl = vm_load_library("test"); + * if (so_hdl > 0) + * { + * ... + * } + * + *****************************************************************************/ +VMINT vm_load_library(VMSTR so_name); + + +/***************************************************************************** + * FUNCTION + * vm_load_ibraryw + * DESCRIPTION + * load so file. + * PARAMETERS + * name : [IN] so file name without suffix. + * RETURN VALUES + * >0 : so handle. + * <=0 : If unsuccessful. + *****************************************************************************/ +VMINT vm_load_libraryw(VMWSTR name); + + +/***************************************************************************** + * FUNCTION + * vm_get_symbol + * DESCRIPTION + * get function pointer form so file. + * PARAMETERS + * so_hdl : [IN] so file handler. + * func_name : [IN] function name string. + * RETURN VALUES + * >0 : If successful. + * <=0 : If unsuccessful. + * EXAMPLE + * + * VMINT so_hdl = vm_load_library("test"); + * func_t func_ptr = NULL; + * if (so_hdl > 0) + * { + * func_ptr = vm_get_symbol(so_hdl, "func_name"); + * if (func_ptr) + * { + * func_ptr(x, y, z); + * } + * } + * vm_free_library(so_hdl); + * + *****************************************************************************/ +VMINT vm_get_symbol(VMINT so_hdl, VMSTR func_name); + +/***************************************************************************** + * FUNCTION + * vm_free_library + * DESCRIPTION + * unload so file. + * PARAMETERS + * sm_hdl : [IN] so file handler. + * RETURN VALUES + * >0 : If successful. + * <=0 : If unsuccessful. + * EXAMPLE + * + * VMINT so_hdl = vm_load_library("test"); + * if (so_hdl > 0) + * { + * ... + * } + * vm_free_library(so_hdl); + * + *****************************************************************************/ +VMINT vm_free_library(VMINT so_hdl); + +#ifdef __cplusplus +} +#endif + +#endif /* VMSO_SDK_H_ */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmsock.h b/hardware/arduino/mtk/system/libmtk/include/vmsock.h new file mode 100644 index 00000000..808d48de --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmsock.h @@ -0,0 +1,1545 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VM_SOCK_SDK_H +#define VM_SOCK_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +#include "vmconn.h" +#include "vmtcp.h" +#include "vmudp.h" + + + + +/* This enum is used to define bearer status */ +typedef enum +{ + VM_CBM_DEACTIVATED = 0x01, /* bearer deactivated */ + VM_CBM_ACTIVATING = 0x02, /* bearer activating */ + VM_CBM_ACTIVATED = 0x04, /* bearer activated */ + VM_CBM_DEACTIVATING = 0x08, /* bearer deactivating */ + VM_CBM_CSD_AUTO_DISC_TIMEOUT = 0x10, /* csd auto disconnection timeout */ + VM_CBM_GPRS_AUTO_DISC_TIMEOUT = 0x20, /* gprs auto disconnection timeout */ + VM_CBM_NWK_NEG_QOS_MODIFY = 0x040, /* negotiated network qos modify notification */ + VM_CBM_BEARER_STATE_TOTAL +} vm_cbm_bearer_state_enum; + + +/* error cause */ +typedef enum +{ + VM_CBM_OK = 0, /* success */ + VM_CBM_ERROR = -1, /* error */ + VM_CBM_WOULDBLOCK = -2, /* would block */ + VM_CBM_LIMIT_RESOURCE = -3, /* limited resource */ + VM_CBM_INVALID_ACCT_ID = -4, /* invalid account id*/ + VM_CBM_INVALID_AP_ID = -5, /* invalid application id*/ + VM_CBM_INVALID_SIM_ID = -6, /* invalid SIM id */ + VM_CBM_BEARER_FAIL = -7, /* bearer fail */ + VM_CBM_DHCP_ERROR = -8, /* DHCP get IP error */ + VM_CBM_CANCEL_ACT_BEARER = -9, /* cancel the account query screen, such as always ask or bearer fallback screen */ + VM_CBM_DISC_BY_CM = -10,/* bearer is deactivated by the connection management */ + VM_CBM_IPV6_ERROR = -11,/* IP get V6 address error */ +} vm_cbm_result_error_enum; + + + + +/* ip type */ +typedef enum +{ + VM_CBM_IP_NONE = 0, + VM_CBM_IPV4 = 0x01, /* IPv4 */ + VM_CBM_IPV6 = 0x02, /* IPv6 */ + VM_CBM_IPV4V6 = VM_CBM_IPV4 | VM_CBM_IPV6, /* IPv4v6 */ + VM_CBM_IP_TYPE_TOTAL, +} vm_cbm_ip_type_enum; + + + +typedef struct +{ + VMUINT account_id; /* network account id */ + vm_cbm_bearer_state_enum state; /* bearer state */ + vm_cbm_result_error_enum error; /* error */ + VMINT error_cause; /* network error cause */ + vm_cbm_ip_type_enum ip_type; /* IP type */ +}vm_cbm_bearer_info_struct; + + +/***************************************************************************** + * FUNCTION + * vm_bearer_open_ex + * DESCRIPTION + * Open the bearer. + * + * P.S. We assume applications shall set its module id or register the application id + * before calling this API. + * + * Please remember to wrap API by __TCPIP__ if you may call this API when network is disable + * PARAMETERS + * apn : [IN] apn index + * user_data : [IN] user data + * callback_ex : [IN] callback function + * ip : [IN] ip type vm_cbm_ip_type_enum + * RETURN VALUES + * VM_CBM_OK : bearer is in activated state. + * VM_CBM_INVALID_AP_ID : invalid application id. + * VM_CBM_INVALID_ACCT_ID : invalid network account id. + * VM_CBM_WOULDBLOCK : the bearer is in deactivating state and the bearer info + * will be reported later. + *****************************************************************************/ +VMINT vm_bearer_open_ex(VMINT apn, void *user_data, void (*callback_ex)(VMINT handle, VMINT event, void *param, void *user_data), vm_cbm_ip_type_enum ip); + +/* The structure for DNS A RR entry */ +typedef struct +{ + VMUINT8 address[4]; /* resolved IP address for queried domain name */ +}vm_soc_dns_a_struct; + +typedef struct +{ + VMUINT8 addr[16]; /* resolved IP address for queried domain name of ipv6*/ +}vm_soc_dns_aaaa_struct; + +typedef struct +{ + vm_soc_dns_aaaa_struct address[VM_SOC_DNS_MAX_ADDR]; /* address set */ + VMINT num; /* the numbers of address */ + VMINT error_cause; /* vm_ps_cause_enum */ +}vm_soc_dns_v6_result; + + + +/***************************************************************************** + * FUNCTION + * vm_soc_gethostbynamev6 + * DESCRIPTION + * this function retrieves IPv6 addresses associated with the specified host name. + * PARAMETERS + * apn : [IN] + * host : [IN] domain to be resolved. + * result : [OUT] DNS parsed result. + * callback : [IN] point to the callback. + * user_data : [IN] user data. + * RETURNS + * success if 0, else failure. + * RETURN VALUES + * VM_E_SOC_SUCCESS : Get IP address successfully, result is filled. + * VM_E_SOC_WOULDBLOCK : wait response from network, result could be gotten from callback. + * VM_E_SOC_INVAL : invalid arguments: null domain_name, etc. + * VM_E_SOC_ERROR : unspecified error + * VM_E_SOC_LIMIT_RESOURCE : socket resources not available + * VM_E_SOC_INVALID_ACCOUNT : invalid data account id +*****************************************************************************/ +VMINT vm_soc_gethostbynamev6(VMINT apn, + const VMCHAR * host, + vm_soc_dns_v6_result * result, + VMINT (*callback)(VMINT, vm_soc_dns_v6_result *, void *), void *user_data); + + +/***************************************************************************** + * FUNCTION + * vm_bearer_open + * DESCRIPTION + * Open the bearer. + * + * P.S. We assume applications shall set its module id or register the application id + * before calling this API. + * + * Please remember to wrap API by __TCPIP__ if you may call this API when network is disable + * PARAMETERS + * account_id : [IN] account id which contains the application id. + * App id must to be encoded in the account id + * RETURN VALUES + * VM_CBM_OK : bearer is in activated state. + * VM_CBM_INVALID_AP_ID : invalid application id. + * VM_CBM_INVALID_ACCT_ID : invalid network account id. + * VM_CBM_WOULDBLOCK : the bearer is in deactivating state and the bearer info + * will be reported later. + *****************************************************************************/ +VMINT vm_bearer_open(VMINT apn, void *user_data, void (*callback)(VMINT handle, VMINT event, VMUINT param, void *user_data)); + +/***************************************************************************** + * FUNCTION + * cbm_release_bearer + * DESCRIPTION + * This API is used to release all bearers which are opened by this application. + * The bearer will be released only when all sockets are closed. + * If the sockets are all closed and this API is called, the bearer will be + * deactivated. Otherwise, the bearer will be deactivated only when + * all sockets which belong to this application are closed. + * If the bearer is opened by application directly through the API + * "cbm_open_bearer", the bearer can be directly deactivated when + * application calls the API cbm_release_bearer. + * + * P.S. We assume applications shall set its module id or register the application id + * before calling this API. + * + * Please remember to wrap API by __TCPIP__ if you may call this API when network is disable + * PARAMETERS + * app_id : [IN] application id + * RETURN VALUES + * CBM_OK : bearer is in deactivated state. + * CBM_INVALID_AP_ID : invalid application id. + * CBM_WOULDBLOCK : the bearer is in deactivating state and the bearer info + * will be reported later. + * SEE ALSO + * cbm_hold_bearer + * EXAMPLE + * + * kal_uint8 ap_id; + * kal_int8 ret; + * ap_id = cbm_get_app_id ((kal_uint32)account_id); + * ... + * if ((ret = cbm_release_bearer (ap_id)) == CBM_OK) + * { + * //bearer is deactivated + * } + * else + * { + * if (ret == CBM_WOULDBLOCK) + * { + * //bearer is not completely deactivated yet + * } + * } + * + * After the bearer is deactivated: + * + * app_cbm_bearer_info_ind_hdlr(local_para_struct *msg) + * { + * app_cbm_bearer_info_ind_struct *ind_ptr; + * ind_ptr = (app_cbm_bearer_info_ind_struct *)local_para_ptr; + * switch (ind_ptr->state) + * { + * case CBM_DEACTIVATED: + * app_bearer_deactivated_hdlr(); + * break; + * ... + * } + * } + * + *****************************************************************************/ +VMINT vm_bearer_close(VMINT hdl); + + + +#define PF_INET (0) /* ipv4 */ +#define PF_INET6 (1) /* ipv6 */ + + +#define SOCK_STREAM (0) /* stream socket, TCP */ +#define SOCK_DGRAM (1) /* datagram socket, UDP */ + + +/* + * + * + * Control message protocol. Currently, only allow applicaion to set this type when RAW_SOCKET is used + */ +#define IPPROTO_ICMP (1) + +/* for SOC/TCP/IP internal use, application shall NOT use */ + +/* + * + * + * dummy for IP + */ +#define IPPROTO_IP (0) + +/* + * + * + * IP6 hop-by-hop options + */ +#define IPPROTO_HOPOPTS (0) + +/* + * + * + * group mgmt protocol + */ +#define IPPROTO_IGMP (2) + +/* + * + * + * IPv4 encapsulation + */ +#define IPPROTO_IPV4 (4) + +/* + * + * + * for compatibility + */ +#define IPPROTO_IPIP IPPROTO_IPV4 + +/* + * + * + * tcp protocol + */ +#define IPPROTO_TCP (6) + +/* + * + * + * user datagram protocol + */ +#define IPPROTO_UDP (17) + +/* + * + * + * raw IP packet + */ +#define IPPROTO_RAW (255) + +/// Generic Socket Address structure +typedef struct sockaddr { + VMUINT16 sa_family; ///< Address family + VMINT8 sa_data[14]; ///< Direct address (up to 14 bytes) +} SOCKADDR; + +/// Generic IPv4 Address structure +typedef struct in_addr { + union { + struct { + VMUINT8 s_b1; + VMUINT8 s_b2; + VMUINT8 s_b3; + VMUINT8 s_b4; ///< IP address, byte access + }S_un_b; + struct { + VMUINT16 s_w1; + VMUINT16 s_w2; ///< IP address, short int access + }S_un_w; + VMUINT32 s_addr; ///< IP address in network byte order + }S_un; +} IN_ADDR; + + +/// IPv4 Socket Address structure +typedef struct sockaddr_in { + VMINT16 sin_family; ///< Socket domain + VMUINT16 sin_port; ///< Port + IN_ADDR sin_addr; ///< IP address + VMINT8 sin_zero[8]; ///< reserved +} SOCKADDR_IN; + +/// Generic IPv6 Address structure +typedef struct in6_addr { + union { + VMUINT8 s6_u8[16]; + VMUINT32 s6_u32[4]; + VMUINT64 s6_u64[2]; + }S_all; +} IN6_ADDR; + +/// IPv6 Socket Address structure +typedef struct sockaddr_in6 { + VMINT16 sin_family; ///< Socket domain + VMUINT16 sin_port; ///< Port + VMUINT32 sin6_flowinfo; /// IPv6 traffic class & flow info + IN6_ADDR sin6_addr; ///< IP address + VMUINT32 sin6_scop_id; /// set of interfaces for a scope +} SOCKADDR_IN6; + + +/*=================================================== + * + * Socket APIs prototypes + * + *===================================================*/ + +/***************************************************************************** +* FUNCTION +* socket +* DESCRIPTION +* This function creates a socket. +* note: here is an advice for API usage. please use BSD socket API all in one sub thread. +* PARAMETERS +* family : [IN] Address family specification. PF_INET / PF_INET6 +* type : [IN] Type specification for the new socket. +* SOCK_STREAM = connection based type, +* SOCK_DGRAM = datagram connectionless type. +* protocol : [IN] Particular protocol to be used with the socket that is specific to the indicated address family +* RETURN VALUES +* A descriptor referencing the new socket indicates that no error occurred. +* >=0 : socket id +* VM_SOC_INVAL : wrong parameters, domain, type, protocol +* VM_SOC_LIMIT_RESOURCE : no socket available +* VM_SOC_BEARER_FAIL : bearer broken +*****************************************************************************/ +int vm_socket(int family, int type, int protocol); + +/***************************************************************************** +* FUNCTION +* socket_ex +* DESCRIPTION +* This function creates a socket. +* note: here is an advice for API usage. please use BSD socket API all in one sub thread. +* PARAMETERS +* family : [IN] Address family specification. PF_INET / PF_INET6 +* type : [IN] Type specification for the new socket. +* SOCK_STREAM = connection based type, +* SOCK_DGRAM = datagram connectionless type. +* protocol : [IN] Particular protocol to be used with the socket that is specific to the indicated address family +* data_account : [IN] data account for network which get from the callback param of vm_open_bearer. +* RETURN VALUES +* A descriptor referencing the new socket indicates that no error occurred. +* >=0 : socket id +* VM_SOC_INVAL : wrong parameters, domain, type, protocol +* VM_SOC_LIMIT_RESOURCE : no socket available +* VM_SOC_BEARER_FAIL : bearer broken +*****************************************************************************/ +int vm_socket_ex(int family, int type, int protocol, VMUINT32 data_account); + +/***************************************************************************** +* FUNCTION +* closesocket +* DESCRIPTION +* Receive data from endpoint node. +* PARAMETERS +* sock : [IN] Descriptor that identifies an unbound socket. +* RETURN VALUES +* VM_E_SOC_SUCCESS : success +* VM_E_SOC_INVALID_SOCKET : invalid socket id +*****************************************************************************/ +int vm_closesocket(int sock); + +/***************************************************************************** +* FUNCTION +* bind +* DESCRIPTION +* This function associates a local address with a socket. +* PARAMETERS +* sock : [IN] Descriptor that identifies an unbound socket. +* addr : [IN] Address to assign to the socket from the SOCKADDR structure. +* addrlen : [IN] Length of the name. +* type : [IN] Type specification for the new socket. +* SOCK_STREAM = connection based type, +* SOCK_DGRAM = datagram connectionless type. +* RETURN VALUES +* A descriptor referencing the new socket indicates that no error occurred. +* VM_E_SOC_SUCCESS : success +* VM_E_SOC_INVALID_SOCKET : invalid socket id +* VM_E_SOC_BEARER_FAIL : bearer broken +* VM_E_SOC_ERROR : unspecified error +* VM_E_SOC_ADDRINUSE : the local port has been bound by other socket +*****************************************************************************/ +int vm_bind(int sock, const SOCKADDR *addr, int addrlen, int type); + +/***************************************************************************** +* FUNCTION +* listen +* DESCRIPTION +* This function prepares a socket to listen for incoming connections. +* PARAMETERS +* sock : [IN] Descriptor that identifies an unbound socket. +* backlog : [IN] number of connection requests that can be queued +* RETURN VALUES +* A descriptor referencing the new socket indicates that no error occurred. +* VM_E_SOC_SUCCESS : success +* VM_E_SOC_INVALID_SOCKET : invalid socket id +* VM_E_SOC_BEARER_FAIL : bearer broken +* VM_E_SOC_OPNOTSUPP : only TCP can be listened +* VM_E_SOC_ALREADY : already listened +* VM_E_SOC_ERROR : unspecified error +* VM_E_SOC_BEARER_FAIL : bearer broken +*****************************************************************************/ +int vm_listen(int sock, int backlog); + +/***************************************************************************** +* FUNCTION +* accept +* DESCRIPTION +* This function accepts a connection on a socket. +* PARAMETERS +* sock : [IN] Descriptor that identifies an unbound socket. +* addr : [IN] Address to assign to the socket from the SOCKADDR structure. +* addrlen : [IN] Length of the name. +* RETURN VALUES +* A descriptor referencing the new socket indicates that no error occurred. +* >=0 : socket id of new connection +* VM_E_SOC_INVALID_SOCKET : invalid socket id +* VM_E_SOC_INVAL : socket is not calling soc_listen +* VM_E_SOC_WOULDBLOCK : non-blocking +* VM_E_SOC_CONNABORTED : server socket cannot receive anymore +* VM_E_SOC_BEARER_FAIL : bearer broken +* VM_E_SOC_ERROR : unspecified error +*****************************************************************************/ +int vm_accept(int sock, SOCKADDR *addr, int *addrlen); + +/***************************************************************************** +* FUNCTION +* connect +* DESCRIPTION +* Connect a socket to a remote host. +* PARAMETERS +* sock : [IN] Descriptor that identifies an unbound socket. +* addr : [IN] Address to assign to the socket from the SOCKADDR structure. +* addrlen : [IN] Length of the name. +* RETURN VALUES +* A descriptor referencing the new socket indicates that no error occurred. +* >=0 : socket id of new connection +* VM_E_SOC_INVALID_SOCKET : invalid socket id +* VM_E_SOC_INVAL : socket is not calling soc_listen +* VM_E_SOC_WOULDBLOCK : non-blocking +* VM_E_SOC_CONNABORTED : server socket cannot receive anymore +* VM_E_SOC_BEARER_FAIL : bearer broken +* VM_E_SOC_ERROR : unspecified error +*****************************************************************************/ + +int vm_connect(int sock, SOCKADDR *addr, int addrlen); +/***************************************************************************** +* FUNCTION +* send +* DESCRIPTION +* Send data on already connected socket. +* PARAMETERS +* sock : [IN] Descriptor that identifies an unbound socket. +* buf : [IN] pointer to application data buffer to transmit. +* len : [IN]length of data (in bytes). +* flags : [IN]message flags: +* RETURN VALUES +* A descriptor referencing the new socket indicates that no error occurred. +* >=0 : socket id of new connection +* VM_E_SOC_INVALID_SOCKET : invalid socket id +* VM_E_SOC_INVAL : socket is not calling soc_listen +* VM_E_SOC_WOULDBLOCK : non-blocking +* VM_E_SOC_CONNABORTED : server socket cannot receive anymore +* VM_E_SOC_BEARER_FAIL : bearer broken +* VM_E_SOC_ERROR : unspecified error +*****************************************************************************/ + +int vm_send(int sock, const char *buf, int len, int flags); +/***************************************************************************** +* FUNCTION +* sendto +* DESCRIPTION +* Send data to endpoint node. +* PARAMETERS +* sock : [IN] Descriptor that identifies an unbound socket. +* buf : [IN] pointer to application data buffer to transmit. +* len : [IN]length of data (in bytes). +* flags : [IN]message flags: +* to : [IN] structure containing remote IP address and port. +* tolen : [IN] length of \ref SOCKADDR structure. +* RETURN VALUES +* >=0 : SUCCESS +* VM_E_SOC_INVALID_SOCKET : invalid socket id +* VM_E_SOC_INVAL : buf is NULL or len equals to zero +* VM_E_SOC_WOULDBLOCK : buffer not available or bearer is establishing +* VM_E_SOC_BEARER_FAIL : bearer broken +* VM_E_SOC_NOTCONN : socket is not connected in case of TCP +* VM_E_SOC_PIPE : socket is already been shutdown +* VM_E_SOC_MSGSIZE : message is too long +* VM_E_SOC_ERROR : unspecified error +* VM_E_SOC_NOTBIND : in case of sending ICMP Echo Request, shall bind before +*****************************************************************************/ +int vm_sendto(int sock, const char *buf, int len, int flags, const SOCKADDR *to, int tolen); +/***************************************************************************** +* FUNCTION +* recv +* DESCRIPTION +* Receive data on already connected socket. +* PARAMETERS +* sock : [IN] Descriptor that identifies an unbound socket. +* buf : [OUT] pointer to application data buffer to transmit. +* len : [IN]length of data (in bytes). +* flags : [IN]message flags: +* RETURN VALUES +* >0 : number of bytes received +* 0 : receive the FIN from the server +* VM_E_SOC_INVALID_SOCKET : invalid socket id +* VM_E_SOC_INVAL : buf is NULL or len equals to zero +* VM_E_SOC_WOULDBLOCK : no data available +* VM_E_SOC_BEARER_FAIL : bearer broken +* VM_E_SOC_NOTCONN : socket is not connected in case of TCP +* VM_E_SOC_PIPE : socket is already been shutdown +* VM_E_SOC_ERROR : unspecified error +*****************************************************************************/ +int vm_recv(int sock, char *buf, int len, int flags); + +/***************************************************************************** +* FUNCTION +* recvfrom +* DESCRIPTION +* Receive data from endpoint node. +* PARAMETERS +* sock : [IN] Descriptor that identifies an unbound socket. +* buf : [OUT] pointer to application data buffer to transmit. +* len : [IN]length of data (in bytes). +* flags : [IN]message flags: +* from : [OUT]structure containing remote IP address and port +* fromlen : [IN/OUT]length of \ref SOCKADDR structure: +* RETURN VALUES +* 0 : receive the FIN from the server +* VM_E_SOC_INVALID_SOCKET : invalid socket id +* VM_E_SOC_INVAL : buf is NULL or len equals to zero +* VM_E_SOC_WOULDBLOCK : no data available +* VM_E_SOC_BEARER_FAIL : bearer broken +* VM_E_SOC_NOTCONN : socket is not connected in case of TCP +* VM_E_SOC_PIPE : socket is already been shutdown +* VM_E_SOC_ERROR : unspecified error +*****************************************************************************/ +int vm_recvfrom(int sock, char *buf, int len, int flags, SOCKADDR *from, int *fromlen); + +#define VM_FD_SETSIZE 25 + +/* Macros for SOC_SELECT */ +typedef struct +{ + VMUINT8 fds_bits[VM_FD_SETSIZE]; /* select set based on socket id */ +} vm_fd_set; + +#ifdef fd_set +#undef fd_set +#define fd_set vm_fd_set +#else +#define fd_set vm_fd_set +#endif + +/* + * + * + * set the socket id which you want to select + */ + +#ifdef FD_SET +#undef FD_SET +#define FD_SET(s, p) ((p)->fds_bits[s] |= 0x01) +#else +#define FD_SET(s, p) ((p)->fds_bits[s] |= 0x01) +#endif + +/* + * + * + * clear the socket id which you don't want to select + */ + +#ifdef FD_CLR +#undef FD_CLR +#define FD_CLR(s, p) ((p)->fds_bits[s] &= ~(0x01)) +#else +#define FD_CLR(s, p) ((p)->fds_bits[s] &= ~(0x01)) +#endif + +/* + * + * + * check if the socket id is selected + */ +#ifdef FD_ISSET +#undef FD_ISSET +#define FD_ISSET(s, p) ((p)->fds_bits[s] & 0x02) +#else +#define FD_ISSET(s, p) ((p)->fds_bits[s] & 0x02) +#endif + +/* + * + * + * clear the select set + */ +#ifdef FD_ZERO +#undef FD_ZERO +#define FD_ZERO(p) memset(p, 0x00, sizeof(*(p))) +#else +#define FD_ZERO(p) memset(p, 0x00, sizeof(*(p))) +#endif + + + +/* select timeout structure */ +typedef struct +{ + VMUINT32 tv_sec; /* select timeout: no. of second */ + VMUINT32 tv_usec; /* select timeout: no. of microsecond */ +} timeval; + + +/***************************************************************************** + * + * + * FUNCTION + * select + * DESCRIPTION + * Allow the application to query the status of multiple sockets. + * If tv is null, soc_select will wait indefinitely until the first socket is ready. + * If both tv_sec and tv_msec are zero, soc_select will timeout immediately for + * polling the sockets in the set. + * in: + * 1. If listen has been called and a connection is pending, accept will succeed. + * 2. Data is available for reading (includes OOB data if VM_SOC_OOBINLINE is enabled). + * 3. Connection has been closed/reset/terminated + * out: + * 1. If processing a connect request (non-blocking mode), connection has succeeded. + * 2. Data can be sent. + * ex: + * If processing a connect request (non-blocking mode), connection attempt failed. + * OOB data is available for reading (only if VM_SOC_OOBINLINE is disabled). + * Useful Macros: + * FD_ZERO(fd_set) reset fd_set + * FD_SET(s, fd_set) add a particular socket with id of s to fd_set + * FD_CLR(s, fd_set) remove a particular socket with id of s from fd_set + * FD_ISSET(s, fd_set) Nonzero if s is a member of the fd_set (s is ready). + * Otherwise, zero + * PARAMETERS + * nfds : [IN] max selected socket id plus 1 + * readfds : [IN] input fd_set (readfds) + * writefds : [IN] output fd_set (writefds) + * exceptfds : [IN] exception fd_set (exceptfds) + * timeout : [IN] specify the timeout value, + * timeout == NULL: block until ready + * timeout != NULL && value == 0: return immediately + * timeout != NULL && value != 0: return after timeout + * RETURN VALUES + * >0 : number of ready sockets + * 0 : timeout expires before anything interesting happens + * VM_E_SOC_INVALID_SOCKET : selected sockets are not belong to this module + * VM_E_SOC_INVAL : invalid arguments: ndesc, in, out, ex + * VM_E_SOC_WOULDBLOCK : non-blocking + * VM_E_SOC_BEARER_FAIL : bearer broken + * VM_E_SOC_ERROR : unspecified error + * EXAMPLE + * + * timeval timeout; + * fd_set writefds; + * timeout.tv_sec = 0; + * timeout.tv_usec = 2000; + * FD_ZERO(&writefds); + * FD_SET((bf_u32)sockIds[sock].id, &writefds); + * if (select(sockIds[sock].id+1, 0, &writefds, 0, &timeout) >= 0) + * { + * if (FD_ISSET(sockIds[sock].id, &writefds)) + * { + * //socket is ready for writting data + * } + * } + * + *****************************************************************************/ +int vm_select(int nfds, + fd_set *readfds, + fd_set *writefds, + fd_set *exceptfds, + const timeval *timeout); + + +/* howto arguments for shutdown(2), specified by Posix.1g. */ +typedef enum +{ + VM_SHUT_RD = 0x01, /* shut down the reading side */ + VM_SHUT_WR = 0x02, /* shut down the writing side */ + VM_SHUT_RDWR = VM_SHUT_RD | VM_SHUT_WR /* shut down both sides */ +} vm_shutdown_enum; + +/***************************************************************************** + * FUNCTION + * shutdown + * DESCRIPTION + * This function shutdowns the connection in aspects of reading, writing + * or both. + * For the read-half, soc_shutdown discards the received data that applications haven't yet + * and any incoming data. For the write-half of TCP, the remaining data will be sent first, + * then FIN will be sent to close the connection. + * PARAMETERS + * sock : [IN] socket id + * how : [IN] specify shutdown read/write/both + * RETURN VALUES + * VM_E_SOC_SUCCESS : success + * VM_E_SOC_INVALID_SOCKET : invalid socket id + * VM_E_SOC_INVAL : invalid how + * VM_E_SOC_ERROR : unspecified error + * EXAMPLE + * + * INT handle; + * shutdown((kal_int8) handle, SHUT_WR); + * + *****************************************************************************/ +int vm_shutdown(int sock, int how); + + +/* Socket Options */ +typedef enum +{ + VM_SOC_OOBINLINE = 0x01 << 0, /* not support yet */ + VM_SOC_LINGER = 0x01 << 1, /* linger on close */ + VM_SOC_NBIO = 0x01 << 2, /* Nonblocking */ + VM_SOC_ASYNC = 0x01 << 3, /* Asynchronous notification */ + + VM_SOC_NODELAY = 0x01 << 4, /* disable Nagle algorithm or not */ + VM_SOC_KEEPALIVE = 0x01 << 5, /* enable/disable the keepalive */ + VM_SOC_RCVBUF = 0x01 << 6, /* set the socket receive buffer size */ + VM_SOC_SENDBUF = 0x01 << 7, /* set the socket send buffer size */ + + VM_SOC_NREAD = 0x01 << 8, /* no. of bytes for read, only for soc_getsockopt */ + VM_SOC_PKT_SIZE = 0x01 << 9, /* datagram max packet size */ + VM_SOC_SILENT_LISTEN = 0x01 << 10, /* SOC_SOCK_SMS property */ + VM_SOC_QOS = 0x01 << 11, /* set the socket qos */ + + VM_SOC_TCP_MAXSEG = 0x01 << 12, /* set the max segmemnt size */ + VM_SOC_IP_TTL = 0x01 << 13, /* set the IP TTL value */ + VM_SOC_LISTEN_BEARER = 0x01 << 14, /* enable listen bearer */ + VM_SOC_UDP_ANY_FPORT = 0x01 << 15, /* enable UDP any foreign port */ + + VM_SOC_WIFI_NOWAKEUP = 0x01 << 16, /* send packet in power saving mode */ + VM_SOC_UDP_NEED_ICMP = 0x01 << 17, /* deliver NOTIFY(close) for ICMP error */ + VM_SOC_IP_HDRINCL = 0x01 << 18, /* IP header included for raw sockets */ + VM_SOC_IPSEC_POLICY = 0x01 << 19, /* ip security policy */ + VM_SOC_TCP_ACKED_DATA = 0x01 << 20, /* TCPIP acked data */ + VM_SOC_TCP_DELAYED_ACK = 0x01 << 21, /* TCP delayed ack */ + VM_SOC_TCP_SACK = 0x01 << 22, /* TCP selective ack */ + VM_SOC_TCP_TIME_STAMP = 0x01 << 23, /* TCP time stamp */ + VM_SOC_TCP_ACK_MSEG = 0x01 << 24 /* TCP ACK multiple segment */ +} option_enum; + + +/***************************************************************************** + * FUNCTION + * setsockopt + * DESCRIPTION + * This function sets the socket options. + * PARAMETERS + * sock : [IN] socket id + * option : [IN] option type (soc_option_enum) + * val : [IN] option value (soc_event_enum for SOC_ASYNC) + * val_size : [IN] option value size + * RETURN VALUES + * VM_E_SOC_SUCCESS : success + * VM_E_SOC_INVALID_SOCKET : invalid socket id + * VM_E_SOC_INVAL : invalid arguments: option, val and val_size + * VM_E_SOC_ERROR : unspecified error + * SEE ALSO + * getsockopt + * EXAMPLE + * VM_SOC_NBIO: + * this option must to be set if you want to use the non-blocking mode or + * non-blocking plus asyn mode. + * val contains KAL_TRUE indicates non-blocking shall be adopted, + * KAL_FALSE indicates blocking mode shall be adopted. + * For example, set a socket to non-blocking mode: + * kal_bool val = KAL_TRUE; + * setsockopt(sock, SOC_NBIO, &val, sizeof(kal_bool)); + * + * VM_SOC_SILENT_LISTEN: + * val contains KAL_TRUE indicates the silent listen shall be adopted, + * KAL_FALSE indicates non-silent listen shall be adopted. + * This is SOC_SOCK_SMS property. For example, if you want to let the socket be + * the passive to activate the bear, you can set a socket to silent listen mode: + * For example: + * kal_bool val = KAL_TRUE; + * setsockopt(sock, VM_SOC_SILENT_LISTEN, &val, sizeof(kal_bool)) + * + * VM_SOC_UDP_NEED_ICMP: + * This option is used to deliver NOTIFY(close) for ICMP error. + * val contains KAL_TRUE indicates this option shall be enabled, + * KAL_FALSE indicates this option shall be disabled. + * For example, if you want to let set a socket to UDP NEED ICMP mode: + * kal_bool val = KAL_TRUE; + * setsockopt(sock, VM_SOC_UDP_NEED_ICMP, &val, sizeof(kal_bool)) + * + * VM_SOC_ASYNC: + * this option needs to be set if you want to use the non-blocking plus asyn mode. + * val contains the events application wants to receive. + * For example, if application wants to receive + * READ/WRITE/CLOSE/CONNECT events, + * it shall call soc_setsockopt like the following: + * kal_uint8 val = 0; + * val = SOC_READ | SOC_WRITE | SOC_CLOSE | SOC_CONNECT; + * setsockopt(sock, VM_SOC_ASYNC, &val, sizeof(kal_uint8)); + * P.S. if you are using the server socket, please remember to set the SOC_ACCPET event. + * + * VM_SOC_TCP_MAXSEG: + * A process can only decrease the MSS. When a TCP socket is created, + * the default MSS is set to 512. The MSS is updated according to the value announced + * from peer TCP after the socket completes TCP three-way handshake. + * Therefore, after a socket is created but before connected, a process can only decrease + * the MSS from its default of 512. After a connection is established, + * the process can decrease the MSS from the new updated value. + * + * The value of TCP MSS is reduced to fit the interface MTU if the application set an + * unacceptable large value. + * For example: + * kal_uint8 val = 512; + * setsockopt(sock, VM_SOC_TCP_MAXSEG, &val, sizeof(kal_uint8)); + * + * VM_SOC_LISTEN_BEARER: + * val contains bear type indicates which kind of bear we want to receive packets from. + * For example, set a socket to receive the WiFi bear: + * kal_uint8 val = SOC_BEARER_WIFI; + * setsockopt(sock, VM_SOC_LISTEN_BEARER, &val, sizeof(kal_uint8)); + * + * VM_SOC_WIFI_NOWAKEUP: + * val contains KAL_TRUE indicates this option shall be enabled, + * KAL_FALSE indicates this option shall be disabled. + * This option is to make WNDRV sends outgoing packet to in power saving mode. + * For example: + * kal_bool val = KAL_TRUE; + * setsockopt(sock, VM_SOC_WIFI_NOWAKEUP, &val, sizeof(kal_bool)) + * + * VM_SOC_IP_HDRINCL: + * val contains KAL_TRUE indicates this option shall be enabled, + * KAL_FALSE indicates this option shall be disabled. If this option is set for a raw IP socket, + * we must build our own IP header for all the datagrams that we send on the raw socket. + * We can only set this socket option if the socket type in soc_create is + * SOC_SOCK_RAW(raw socket) and protocol in soc_create is not SOC_IPPROTO_ICMP. + * For example: + * kal_bool val = KAL_TRUE; + * setsockopt(sock, VM_SOC_IP_HDRINCL, &val, sizeof(kal_bool)) + * + * VM_SOC_UDP_ANY_FPORT: + * val contains KAL_TRUE indicates this option shall be enabled, + * KAL_FALSE indicates this option shall be disabled. For a connected UDP socket, + * this option makes socket deliver incoming packet from the same remote + * address but different remote port. + * For example: + * kal_bool val = KAL_TRUE; + * setsockopt(sock, VM_SOC_UDP_ANY_FPORT, &val, sizeof(kal_bool)) + * + * VM_SOC_IP_TTL: + * val contains the TTL values . If you want to change the default TTL (64), + * you can set this option. For example: + * kal_uint8 val = 128; + * setsockopt(sock, VM_SOC_IP_TTL, &val, sizeof(kal_uint8)) + * + * VM_SOC_QOS: + * val contains the TOS values . If you want to set the TOS values, you can set this option. + * For example: + * kal_uint8 val = 0x80; + * setsockopt(sock, VM_SOC_QOS, &val, sizeof(kal_uint8)) + * + * VM_SOC_KEEPALIVE: + * val contains KAL_TRUE indicates this option shall be enabled, + * KAL_FALSE indicates this option shall be disabled. + * You can use this option to enable or disable the keep-alive timer in TCP. + * For example: + * kal_bool val = KAL_TRUE; + * setsockopt(sock, VM_SOC_KEEPALIVE, &val, sizeof(kal_bool)) + * + * VM_SOC_NODELAY: + * val contains KAL_TRUE indicates this option shall be enabled, + * KAL_FALSE indicates this option shall be disabled. + * If you want to send the packet directly without waiting a packet size larger than MSS, + * you can set this option. For example: + * kal_bool val = KAL_TRUE; + * soc_setsockopt(sock, VM_SOC_NODELAY, &val, sizeof(kal_bool)) + * + * VM_SOC_SENDBUF: + * val contains the value of send buffer's high water mark. + * If you want to set the high water mark, you can set this option. + * If the value you set is smaller than the MSS, the mss would be adjusted to this value. + * The value must be greater than 0 and smaller than the SSPDU + SSPDU_GROW. + * For example: + * kal_uint32 val = 1024; + * setsockopt(sock, VM_SOC_SENDBUF, &val, sizeof(kal_uint32)) + * + * VM_SOC_RECVBUF: + * val contains the value of receive buffer's high water mark. + * If you want to set the high water mark, you can set this option. + * This value must be greater than 0 and smaller than the SRPDU size. + * For example: + * kal_uint32 val = 4096; + * soc_setsockopt(sock, VM_SOC_RECVBUF, &val, sizeof(kal_uint32)) + * + * VM_SOC_LINGER: + * val contains the value of enable/diable LINGER option and the value of LINGER time. + * This option is used in linger on close. + * For example: + * soc_linger_struct val; + * val.onoff = KAL_TRUE; val. + * linger_time = 3; (sec) + * setsockopt(sock, VM_SOC_LINGER, &val, sizeof(soc_linger_struct_val)); + * + * VM_SOC_IPSEC_POLICY: + * val contains sadb_x_policy structure content. + * You can set this option to set the IPSEC policy. + * If you want to get the IPSEC policy, + * you can set this option. For example: + * struct sadb_x_policy policy; + * policy.sadb_x_policy_len = PFKEY_UNIT64(sizeof(policy)); + * policy.sadb_x_policy_exttype = SADB_X_EXT_POLICY; + * policy.sadb_x_policy_type = 4; // IPSEC_POLICY_BYPASS; + * policy.sadb_x_policy_dir = 1; // IPSEC_DIR_INBOUND; + * setsockopt(sock, VM_SOC_IPSEC_POLICY, &policy, sizeof(sadb_x_policy)) + * + * VM_SOC_TCP_DELAYED_ACK: + * The VM_SOC_TCP_DELAYED_ACK function is enable by default. That is to say, + * if you don't set this option. The default VM_SOC_TCP_DELAYED_ACK value is TRUE. + * val contains KAL_TRUE indicates this option shall be enabled, + * KAL_FALSE indicates this option shall be disabled. + * If you want to enable the "TCP no delay" function, + * you can set this option. For example: + * kal_bool val = KAL_TRUE; + * setsockopt(sock, VM_SOC_TCP_DELAYED_ACK, &val, sizeof(kal_bool)) + * + * VM_SOC_TCP_SACK: + * The VM_SOC_TCP_SACK function is enable by default. That is to say, + * if you don't set this option. The default VM_SOC_TCP_SACK value is TRUE. + * val contains KAL_TRUE indicates this option shall be enabled, + * KAL_FALSE indicates this option shall be disabled. + * If you want to enable the "TCP SACK" function, + * you can set this option. For example: + * kal_bool val = KAL_TRUE; + * setsockopt(sock, VM_SOC_TCP_SACK, &val, sizeof(kal_bool)) + * + * VM_SOC_TCP_TIME_STAMP: + * The VM_SOC_TCP_TIME_STAMP function is enable by default. That is to say, + * if you don't set this option. The default VM_SOC_TCP_TIME_STAMP value is TRUE. + * val contains KAL_TRUE indicates this option shall be enabled, + * KAL_FALSE indicates this option shall be disabled. + * If you want to enable the "TCP TIME STAMP" function, + * you can set this option. For example: + * kal_bool val = KAL_TRUE; + * setsockopt(sock, VM_SOC_TCP_TIME_STAMP, &val, sizeof(kal_bool)) + * + *****************************************************************************/ +int vm_setsockopt(int sock, VMUINT32 option, void *val, VMUINT8 val_size); + +/***************************************************************************** + * FUNCTION + * getsockopt + * DESCRIPTION + * This function gets the socket options. + * PARAMETERS + * sock : [IN] socket id + * option : [IN] option type (soc_option_enum) + * val : [IN] option value + * val_size : [IN] option value size + * RETURN VALUES + * VM_E_SOC_SUCCESS : get the socket option successfully + * VM_E_SOC_INVALID_SOCKET : invalid socket id + * VM_E_SOC_INVAL : invalid arguments: option, val and val_size + * VM_E_SOC_ERROR : unspecified error + * SEE ALSO + * setsockopt + * EXAMPLE + * + * VM_SOC_TCP_DELAYED_ACK: + * val contains kal_bool to hold the option behavior. + * If you don't set this option, the default value you get is KAL_TRUE. + * If you to get this option, you can do: + * + * kal_bool val; + * getsockopt(sock, SOC_TCP_DELAYED_ACK, &val, sizeof(kal_bool)) + * + * + * VM_SOC_TCP_SACK: + * val contains kal_bool to hold the option behavior. + * If you don't set this option, the default value you get is KAL_TRUE. + * If you to get this option, you can do: + * + * kal_bool val; + * getsockopt(sock, SOC_TCP_SACK, &val, sizeof(kal_bool)) + * + * + * VM_SOC_TCP_TIME_STAMP: + * val contains kal_bool to hold the option behavior. + * If you don't set this option, the default value you get is KAL_TRUE. + * If you to get this option, you can do: + * + * kal_bool val; + * getsockopt(sock, SOC_TCP_TIME_STAMP, &val, sizeof(kal_bool)) + * + *****************************************************************************/ + int vm_getsockopt(int sock, VMUINT32 option, void *val, VMUINT8 val_size); + +/***************************************************************************** + * FUNCTION + * getsockname + * DESCRIPTION + * Retrieve local IP address and port number. + * PARAMETERS + * sock [IN] socket descriptor obtained with socket. + * addr [OUT] structure that will receive IP address and port number. + * len [OUT] length of SOCKADDR structure. + * RETURNS + * refer to vm_soc_error_enum + *****************************************************************************/ +int vm_getsockname(int s, SOCKADDR *addr, int *len); + +/***************************************************************************** + * FUNCTION + * getpeername + * DESCRIPTION + * Retrieve IP address and port number of the endpoint node. + * PARAMETERS + * sock [IN] socket descriptor obtained with socket. + * addr [OUT] addr that will receive IP address and port number. + * len [OUT] length of SOCKADDR structure. + * RETURNS + * refer to vm_soc_error_enum + *****************************************************************************/ +int vm_getpeername(int s, SOCKADDR *addr, int *len); + + +/***************************************************************************** + * FUNCTION + * htonl + * DESCRIPTION + * Convert long integer (32 bits) from host byte order to network byte order + * PARAMETERS + * a : [IN] + * RETURNS + * converted result in unsigned integer + * EXAMPLE + * + * loopback = htonl(0x7f000001); + * + *****************************************************************************/ +VMUINT32 vm_htonl(VMUINT32 a); + + +/***************************************************************************** + * FUNCTION + * htons + * DESCRIPTION + * Convert short integer (16 bits) from host byte order to network byte order + * PARAMETERS + * a : [IN] + * RETURNS + * converted result in unsigned integer + * EXAMPLE + * + * sockaddr sock_addr; + * ((struct SOCKADDR_IN *) sock_addr)->sin_port = htons(port); + * + *****************************************************************************/ +VMUINT16 vm_htons(VMUINT16 a); + + +/***************************************************************************** + * FUNCTION + * inet_addr + * DESCRIPTION + * This function converts a string containing a dotted address into a network address in the format of an IN_ADDR structure. + * PARAMETERS + * addr : [IN] + * RETURNS + * VMUINT + *****************************************************************************/ +VMUINT vm_inet_addr(const char* addr); + +/***************************************************************************** + * FUNCTION + * inet_ntoa + * DESCRIPTION + * This function converts a network address into a string in dotted format. + * PARAMETERS + * in : [IN] + * RETURNS + * char * + *****************************************************************************/ +char* vm_inet_ntoa(IN_ADDR in); + + + +/***************************************************************************** + * FUNCTION + * inet_pton + * DESCRIPTION + * Convert an IPV4 or IPV6 address in its standard text presentation form into + * its numeric binary form in network byte order. + * Format of 'x:x:x:x:x:x:d.d.d.d' is not supported. + * PARAMETERS + * af : [IN] 0 - IPV4; 1 - IPV6 + * src : [IN] IP address with standard text presentation form ends with '\0'. + * dst : [OUT] IP address with numeric binary form in network byte order + * For IPV4, it's a kal_uint8 array with size of at least 4. + * For IPV6, it's an ipv6_addr_struct variable or compatible + * kal_uint8 array with size of at least 16. + * RETURNS + * no-zero: converted successfully. + * EXAMPLE + * // IPV4 + * + * kal_char ipv4[] = {"192.168.1.1"}; + * kal_uint8 ipv4_dst[4] = {0}; + * kal_bool ret = KAL_FALSE; + * ret = soc_inet_pton(0, ipv4, ipv4_dst); + * if (ret) + * { + * // successfully + * } + * + * // IPV6 + * + * VMCHAR ipv6[] = {"FF::EE"}; + * VMUINT8 ipv6_dst[16] = {0}; + * VMINT ret; + * ret = soc_inet_pton(1, ipv6, ipv6_dst); + * if (ret) + * { + * // successfully + * } + * + *****************************************************************************/ +int vm_inet_pton(int af, const char *src, void *dst); + + +/***************************************************************************** + * inet_ntop + * DESCRIPTION + * Convert an IPV4 or IPV6 address in its numeric binary form in network byte order + * into its standard text presentation form. + * Format of 'x:x:x:x:x:x:d.d.d.d' is not supported. + * PARAMETERS + * af : [IN] 0 - IPV4; 1 - IPV6 + * src : [IN] IP address with numeric binary form in network byte order + * For IPV4, it's a kal_uint8 array with size of at least 4. + * For IPV6, it's an ipv6_addr_struct variable or compatible + * kal_uint8 array with size of at least 16. And src should obey + * 4-byte alignment. + * dst : [OUT] IP address with standard text presentation form ends with '\0'. + * The memory that dst provided should be big enough to contain the + * whole IP address. Otherwise, conversion will fail. + * For IPV4, safe size is 16. + * For IPV6, safe size is 40. + * size : [IN] The size of memory in bytes dst provided. + * RETURNS + * dst: converted successfully. + * NULL: failed. + * EXAMPLE + * // IPV4 + * + * VMUINT8 ipv4[] = {192, 168, 0, 1}; + * VMCHAR ipv4_addr[16] = {0}, *addr = NULL; + * addr = inet_ntop(0, ipv4, ipv4_addr, 16); + * if (addr) + * { + * // successfully + * } + * + * // IPV6 + * + * VMUINT8 ipv6[] = {0xff, 0xee, 0xdd, 0xcc, 0xaa, 99, 88, 77, 66, 55, 44, 33, 22, 11, 00, 00}; + * VMCHAR ipv6_addr[16] = {0}; + * const VMCHAR *addr = NULL; + * addr = soc_inet_ntop(1, ipv6, ipv6_addr, 40); + * if (addr) + * { + * // successfully + * } + * + *****************************************************************************/ +const char *vm_inet_ntop(int af, const void *src, char *dst, VMUINT8 size); + + +/***************************************************************************** + * FUNCTION + * vm_soc_get_account_localip + * DESCRIPTION + * This function is used to get the local IP held by this socket id. + * PARAMETERS + * sock : [IN] Socket id + * local_ip : [OUT] copy the IP address, used as return + * RETURN VALUES + * VM_E_SOC_SUCCESS : Get IP address successfully + * VM_E_SOC_INVAL : invalid argument: null local_ip. + * VM_E_SOC_BEARER_FAIL : bearer is not activated + * VM_E_SOC_INVALID_SOCKET : invalid socket + * VM_E_SOC_INVALID_ACCOUNT : invalid account + * EXAMPLE + * + * static VMUINT8 ip[4]; + * VMINT result; + * result = vm_soc_get_account_localip(fd, ip); + * if (result == VM_E_SOC_SUCCESS) + * { + * //get the local IP address successfully + * } + * + *****************************************************************************/ +VMINT vm_soc_get_account_localip(VMINT8 sock, VMUINT8 *local_ip); + + +/***************************************************************************** + * FUNCTION + * vm_soc_get_account_localipv6 + * DESCRIPTION + * This function is used to get local IPv6 address held by specific socket id. + * The IPv6 address obtained is in numeric binary form with network byte order. + * Only socket id for IPv6 is valid for this function. + * PARAMETERS + * sock : [IN] Socket id + * local_ipv6 : [OUT] copy the IP address, used as return + * RETURN VALUES + * VM_E_SOC_SUCCESS : Get IP address successfully + * VM_E_SOC_INVAL : invalid argument: null local_ip. + * VM_E_SOC_BEARER_FAIL : bearer is not activated + * VM_E_SOC_INVALID_SOCKET : invalid socket + * VM_E_SOC_INVALID_ACCOUNT : invalid account + * EXAMPLE + * + * static VMUINT8 ip[16]; + * VMINT result; + * result = vm_soc_get_account_localipv6(fd, ip); + * if (result == VM_E_SOC_SUCCESS) + * { + * //get the local IP address successfully + * } + * + *****************************************************************************/ +VMINT vm_soc_get_account_localipv6(int sock, VMUINT8 *local_ipv6); + + + + +typedef struct +{ + VMUSHORT sa_family; + VMCHAR sa_data[16]; +}vm_soc_addr; + +/* this struct is for getaddrinfo function only */ +typedef struct +{ + VMINT32 ai_flags; + VMINT32 ai_family; + VMINT32 ai_socktype; + VMINT32 ai_protocol; + VMUINT16 ai_addrlen; + VMCHAR *ai_canonname; + VMBOOL ai_ipv6_first; + vm_soc_addr *ai_addr; + +}vm_soc_addrinfo; + +typedef enum +{ + VM_DNS_AF_INET = 0, /* INET QUERY */ + VM_DNS_AF_INET6, /* IPV6 QUERY */ + VM_DNS_AF_UNSPEC, /* UNSPEC QUERY */ + VM_DNS_AF_END +}vm_soc_dns_family_enum; + +typedef enum +{ + VM_DNS_NO_RESPONSE_YET = 0, + VM_DNS_IPV4_WAIT = 0x01, + VM_DNS_IPV4_COMPLETE = 0x02, + VM_DNS_IPV6_WAIT = 0x04, + VM_DNS_IPV6_COMPLETE = 0x08, + VM_DNS_IPV4_FAILED = 0x10, + VM_DNS_IPV6_FAILED = 0x20, + VM_DNS_STATUS_SUCCESS, + VM_DNS_STATUS_END +}vm_dns_getaddrinfo_status_enum; + +#define VM_SOC_MAX_A_ENTRY (5) + + +/* For vm_soc_getaddrinfo() */ +typedef struct vm_soc_addrinfo_struct +{ + VMINT32 ai_flags; /* soc_ai_flags_enum */ + VMINT32 ai_family; + VMINT32 ai_socktype; + VMINT32 ai_protocol; + VMUINT32 ai_addrlen; + VMCHAR *ai_canonname; + vm_sockaddr_struct *ai_addr; + struct vm_soc_addrinfo_struct *ai_next; +}vm_soc_addrinfo_struct; + +typedef struct +{ + VMUINT8 ref_count; + VMUINT16 msg_len; + VMINT8 error_cause; /* bearer fail */ + VMINT32 detail_cause; /* refer to vm_ps_cause_enum if error_cause + * is VM_E_SOC_BEARER_FAIL */ + VMINT32 request_id; /* request id */ + VMUINT32 account_id; /* network account id */ + VMUINT8 access_id; /* access id */ + VMBOOL result; /* the result of soc_gethostbyname */ + void *res; /* vm_soc_addrinfo_struct */ +} vm_app_soc_get_addr_info_ind_struct; + + +typedef void (*FP_dns_cb)(vm_app_soc_get_addr_info_ind_struct *ind); + + +/***************************************************************************** + * FUNCTION + * vm_soc_getaddrinfo + * DESCRIPTION + * This function gets the address information (both ipv6 and ipv4 address) of the given domain name. + * Get a host address (i.e., IP address) by its domain name. + * If the bearer is not activated when this API is called, + * the bearer activation would be triggered. However, + * if the account id is not specified in soc_gethostbyname, + * an account query would be displayed to ask the user which account + * s/he wants to use. + * + * This API only supports the non-blokcing mode, i.e., + * is_blocking shall be set to KAL_FALSE. + * Thus, soc_getaddrinfo will be returned immediately instead of + * blocking and waiting for the result. + * If user doesn't get the returned value directly after it calls this API, + * the returned value "VM_E_SOC_WOULDBLOCK" will be returned normally. + * SOC will send a notification to application when it gets the response + * of previous DNS query later. + * On the contrary, if user gets the result directly, the result will be + * returned directly in the parameter "addr". + * + * this api can query ipv4 and ipv6 at same time and also can query ipv4 or ipv6 single. + * hits->ai_family = VM_DNS_AF_UNSPEC; query ipv4 and ipv6 same time + * hits->ai_family = VM_DNS_AF_INET6; only query ipv6 + * hits->ai_family = VM_DNS_AF_INET; only query ipv4 + * + * PARAMETERS + * is_blocking : [IN] whether block or non-block mode are used, + * currently only support non-block mode + * mod_id : [IN] module id + * request_id : [IN] embedded in response message + * nodename : [IN] Domain_name + * servicename : [IN] pass NULL now + * hits : [IN] set some query method + * addr : [IN] resolved address + * addr_len : [IN/OUT] address length + * access_id : [IN] embedded in response message + * res : [IN] pass NULL now + * nwk_account_id : [IN] Nwk_account_id + * RETURN VALUES + * VM_E_SOC_INVAL : invalid arguments: null domain_name, etc. + * VM_E_SOC_ERROR : unspecified error + * VM_E_SOC_WOULDBLOCK : wait response from network + * VM_E_SOC_LIMIT_RESOURCE : socket resources not available + * EXAMPLE + * + * vm_soc_addrinfo info; + * vm_soc_addrinfo *hits = &info; + * memset(hits, 0, sizeof(vm_soc_addrinfo)); + * hits->ai_family = VM_DNS_AF_UNSPEC; // query ipv4 and ipv6 at same time. + * hits->ai_ipv6_first = KAL_TRUE; // if query both ipv4 and ipv6, app can decide which query first + * ret = soc_getaddrinfo( + * KAL_FALSE, + * soc_id, + * (const kal_char*)domain_name, + * hits + * ch->stun_ip_addr.addr, + * (kal_uint8*) & ch->stun_ip_addr.addr_len, + * 0, + * ch->data_account_id); + * + * if (ret == VM_E_SOC_WOULDBLOCK) + * { + * //processing the wouldblock state + * ¡K.. + * } + * + * + *****************************************************************************/ +VMINT vm_soc_getaddrinfo(VMBOOL is_blocking, + VMINT32 request_id, + const VMCHAR *nodename, + const VMCHAR *servicename, + const vm_soc_addrinfo_struct *hits, + vm_soc_addrinfo_struct **res, + VMINT32 access_id, + VMUINT32 nwk_account_id, + FP_dns_cb dns_cb); + + + +/* refer to vm_socket */ +#define socket(family, type, protocol) vm_socket(family, type, protocol) +/* refer to vm_socket_ex */ +#define socket_ex(family, type, protocol, account) vm_socket_ex(family, type, protocol, account) +/* refer to vm_closesocket */ +#define closesocket(s) vm_closesocket(s) +/* refer to vm_bind */ +#define bind(s, addr, len, type) vm_bind(s, addr, len, type) +/* refer to vm_listen */ +#define listen(s, bl) vm_listen(s, bl) +/* refer to vm_accept */ +#define accept(s, addr, len) vm_accept(s, addr, len) +/* refer to vm_connect */ +#define connect(s, addr, len) vm_connect(s, addr, len) +/* refer to vm_send */ +#define send(s, buf, len, flags) vm_send(s, buf, len, flags) +/* refer to vm_sendto */ +#define sendto(s, buf, len, flags, to, tlen) vm_sendto(s, buf, len, flags, to, tlen) +/* refer to vm_recv */ +#define recv(s, buf, len, flags) vm_recv(s, buf, len, flags) +/* refer to vm_recvfrom */ +#define recvfrom(s, buf, len, flags, from, flen) vm_recvfrom(s, buf, len, flags, from, flen) +/* refer to vm_select */ +#define select(fds, reads, writes, except, timeout) vm_select(fds, reads, writes, except, timeout) +/* refer to vm_shutdown */ +#define shutdowns(s, how) vm_shutdown(s, how) +/* refer to vm_setsockopt */ +#define setsockopt(s, opt, val, size) vm_setsockopt(s, opt, val, size) +/* refer to vm_getsockopt */ +#define getsockopt(s, opt, val, size) vm_getsockopt(s, opt, val, size) +/* refer to vm_getsockname */ +#define getsockname(s, addr, len) vm_getsockname(s, addr, len) +/* refer to vm_getpeername */ +#define getpeername(s, addr, len) vm_getpeername(s, addr, len) + +/* refer to vm_htonl */ +#define htonl(a) vm_htonl(a) +/* refer to vm_htons */ +#define htons(a) vm_htons(a) +/* refer to vm_htonl */ +#define ntohl(a) vm_htonl(a) +/* refer to vm_htons */ +#define ntohs(a) vm_htons(a) + +/* refer to vm_inet_addr */ +#define inet_addr(a) vm_inet_addr(a) +/* refer to vm_inet_ntoa */ +#define inet_ntoa(in) vm_inet_ntoa(in) +/* refer to vm_inet_pton */ +#define inet_pton(af, src, dst) vm_inet_pton(af, src, dst) +/* refer to vm_inet_ntop */ +#define inet_ntop(af, src, dst, size) vm_inet_ntop(af, src, dst, size) + +#ifdef __cplusplus +} +#endif + +#endif /* VM_SOCK_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmsrvmng.h b/hardware/arduino/mtk/system/libmtk/include/vmsrvmng.h new file mode 100644 index 00000000..1afb34a7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmsrvmng.h @@ -0,0 +1,51 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef __VM_SRVMNG_SDK_H__ +#define __VM_SRVMNG_SDK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "vmsys.h" +VMINT vm_create_service(VMINT clsid, VMINT iid, void ** pptr); + +#ifdef __cplusplus +} +#endif + +#endif /* __VM_SRVMNG_SDK_H__ */ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmssl.h b/hardware/arduino/mtk/system/libmtk/include/vmssl.h new file mode 100644 index 00000000..79cb23a4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmssl.h @@ -0,0 +1,328 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef _VMSSL_SDK_H_ +#define _VMSSL_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + + + +#define VM_SSL_VERIFY_NONE 0 /* peer certificate is not checked (default), this is insecure and SHOULD be avoided. */ +#define VM_SSL_VERIFY_OPTIONAL 1 /* peer certificate is checked, however the + handshake continues even if verification failed; */ +#define VM_SSL_VERIFY_REQUIRED 2 /* peer *must* present a valid certificate, handshake is aborted if verification failed. */ + + + +/* connected status */ +#define VM_SSL_EVT_CONNECTED 1 + +/* write status */ +#define VM_SSL_EVT_CAN_WRITE 2 + +/* read status */ +#define VM_SSL_EVT_CAN_READ 3 + +/* broken status */ +#define VM_SSL_EVT_PIPE_BROKEN 4 + +/* not find host */ +#define VM_SSL_EVT_HOST_NOT_FOUND 5 + +/* tcp pipe closed */ +#define VM_SSL_EVT_PIPE_CLOSED 6 + +/* ssl handshake failed */ +#define VM_SSL_EVT_HANDSHAKE_FAILED 7 + +/* ssl certificate failed */ +#define VM_SSL_EVT_CERTIFICATE_VALIDATION_FAILED 8 + + +/* + * Rteurn Errror Values from Xyssl Library + */ +#define VM_XYSSL_ADP_ERR_SSL_FEATURE_UNAVAILABLE -0x1000 +#define VM_XYSSL_ADP_ERR_SSL_BAD_INPUT_DATA -0x1800 +#define VM_XYSSL_ADP_ERR_SSL_INVALID_MAC -0x2000 +#define VM_XYSSL_ADP_ERR_SSL_INVALID_RECORD -0x2800 +#define VM_XYSSL_ADP_ERR_SSL_INVALID_MODULUS_SIZE -0x3000 +#define VM_XYSSL_ADP_ERR_SSL_UNKNOWN_CIPHER -0x3800 +#define VM_XYSSL_ADP_ERR_SSL_NO_CIPHER_CHOSEN -0x4000 +#define VM_XYSSL_ADP_ERR_SSL_NO_SESSION_FOUND -0x4800 +#define VM_XYSSL_ADP_ERR_SSL_NO_CLIENT_CERTIFICATE -0x5000 +#define VM_XYSSL_ADP_ERR_SSL_CERTIFICATE_TOO_LARGE -0x5800 +#define VM_XYSSL_ADP_ERR_SSL_CERTIFICATE_REQUIRED -0x6000 +#define VM_XYSSL_ADP_ERR_SSL_BAD_HS_SERVER_HELLO_DONE -0xC000 +#define VM_XYSSL_ADP_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE -0xC800 +#define VM_XYSSL_ADP_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY -0xD000 +#define VM_XYSSL_ADP_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC -0xD800 +#define VM_XYSSL_ADP_ERR_SSL_BAD_HS_FINISHED -0xE000 + + +/* +* XYSSL VERIFY RESULT ERROR VALUES +*/ +#define VM_XYSSL_ADP_BADCERT_EXPIRED 0x01 /**< The certificate validity has expired. */ +#define VM_XYSSL_ADP_BADCERT_REVOKED 0x02 /**< The certificate has been revoked (is on a CRL). */ +#define VM_XYSSL_ADP_BADCERT_CN_MISMATCH 0x04 /**< The certificate Common Name (CN) does not match with the expected CN. */ +#define VM_XYSSL_ADP_BADCERT_NOT_TRUSTED 0x08 /**< The certificate is not correctly signed by the trusted CA. */ + + +/* +* XYSSL X509 ERROR VALUES +*/ +#define VM_XYSSL_ADP_ERR_X509_FEATURE_UNAVAILABLE -0x0020 +#define VM_XYSSL_ADP_ERR_X509_CERT_INVALID_PEM -0x0040 +#define VM_XYSSL_ADP_ERR_X509_CERT_INVALID_FORMAT -0x0060 +#define VM_XYSSL_ADP_ERR_X509_CERT_INVALID_VERSION -0x0080 +#define VM_XYSSL_ADP_ERR_X509_CERT_INVALID_SERIAL -0x00A0 +#define VM_XYSSL_ADP_ERR_X509_CERT_INVALID_ALG -0x00C0 +#define VM_XYSSL_ADP_ERR_X509_CERT_INVALID_NAME -0x00E0 +#define VM_XYSSL_ADP_ERR_X509_CERT_INVALID_DATE -0x0100 +#define VM_XYSSL_ADP_ERR_X509_CERT_INVALID_PUBKEY -0x0120 +#define VM_XYSSL_ADP_ERR_X509_CERT_INVALID_SIGNATURE -0x0140 +#define VM_XYSSL_ADP_ERR_X509_CERT_INVALID_EXTENSIONS -0x0160 +#define VM_XYSSL_ADP_ERR_X509_CERT_UNKNOWN_VERSION -0x0180 +#define VM_XYSSL_ADP_ERR_X509_CERT_UNKNOWN_SIG_ALG -0x01A0 +#define VM_XYSSL_ADP_ERR_X509_CERT_UNKNOWN_PK_ALG -0x01C0 +#define VM_XYSSL_ADP_ERR_X509_CERT_SIG_MISMATCH -0x01E0 +#define VM_XYSSL_ADP_ERR_X509_CERT_VERIFY_FAILED -0x0200 +#define VM_XYSSL_ADP_ERR_X509_KEY_INVALID_PEM -0x0220 +#define VM_XYSSL_ADP_ERR_X509_KEY_INVALID_VERSION -0x0240 +#define VM_XYSSL_ADP_ERR_X509_KEY_INVALID_FORMAT -0x0260 +#define VM_XYSSL_ADP_ERR_X509_KEY_INVALID_ENC_IV -0x0280 +#define VM_XYSSL_ADP_ERR_X509_KEY_UNKNOWN_ENC_ALG -0x02A0 +#define VM_XYSSL_ADP_ERR_X509_KEY_PASSWORD_REQUIRED -0x02C0 +#define VM_XYSSL_ADP_ERR_X509_KEY_PASSWORD_MISMATCH -0x02E0 +#define VM_XYSSL_ADP_ERR_X509_POINT_ERROR -0x0300 +#define VM_XYSSL_ADP_ERR_X509_VALUE_TO_LENGTH -0x0320 + + +/* +* XYSSL BASE64 ERROR VALUES +*/ +#define XYSSL_ADP_ERR_BASE64_BUFFER_TOO_SMALL -0x0010 +#define XYSSL_ADP_ERR_BASE64_INVALID_CHARACTER -0x0012 + + + + +/* +* XYSSL VERIFY RESULT ERROR VALUES +*/ +#define XYSSL_ADP_BADCERT_EXPIRED 0x01 /**< The certificate validity has expired. */ +#define XYSSL_ADP_BADCERT_REVOKED 0x02 /**< The certificate has been revoked (is on a CRL). */ +#define XYSSL_ADP_BADCERT_CN_MISMATCH 0x04 /**< The certificate Common Name (CN) does not match with the expected CN. */ +#define XYSSL_ADP_BADCERT_NOT_TRUSTED 0x08 /**< The certificate is not correctly signed by the trusted CA. */ + + +typedef struct _vm_ssl_cntx{ + VMCHAR* host; /* host to which connection will be made */ + VMINT port; /* port at which connection will be made */ + void (*connection_callback)(VMINT handle, VMINT event); /* callback funtion to notify app about actions, like in vm_tcp_connect */ + VMINT authmod; /* what type of certification verification is required: NONE, OPTIONAL, REQUIRED */ + VMCHAR *ua; +}vm_ssl_cntx; + +/***************************************************************************** + * FUNCTION + * vm_ssl_is_support + * DESCRIPTION + * query if ssl be supported + * PARAMETERS + * void + * RETURNS + * non-zero value if successfully, else not support. +*****************************************************************************/ +VMINT vm_ssl_is_support(void); + + +/***************************************************************************** + * FUNCTION + * vm_ssl_connect + * DESCRIPTION + * create a ssl connection + * PARAMETERS + * ctx : [IN] ssl context, refer to vm_ssl_cntx + * RETURNS + * non-negative handle if successfully, and error code if failed to create. +*****************************************************************************/ +VMINT vm_ssl_connect(const vm_ssl_cntx *ctx); + + +/***************************************************************************** + * FUNCTION + * vm_ssl_load_ca_chain_cert + * DESCRIPTION + * load ca_chain certification + * PARAMETERS + * handle : [IN] ssl handle + * cert_buf : [IN] cert data, the raw data get from resource of app + * buf_len : [IN] length of cert data. + * RETURNS + * 0 if successfully, else failed. + * RETURN VALUES + * XYSSL X509 ERROR VALUES +*****************************************************************************/ +VMINT vm_ssl_load_ca_chain_cert(VMINT handle, const void *cert_buf, VMINT buf_len); + +/***************************************************************************** + * FUNCTION + * vm_ssl_read + * DESCRIPTION + * read data from ssl connection. + * PARAMETERS + * handle : [IN] ssl handle. + * buf : [OUT] data buffer. + * len : [IN] data length. + * RETURNS + * read data size. + * RETURN VALUES + * read size +*****************************************************************************/ +VMINT vm_ssl_read(VMINT handle, VMUINT8 *buf, VMINT len); + + +/***************************************************************************** + * FUNCTION + * vm_ssl_write + * DESCRIPTION + * write data from ssl connection. + * PARAMETERS + * handle : [IN] ssl handle. + * buf : [OUT] data buffer. + * len : [IN] data length. + * RETURNS + * read data size. + * RETURN VALUES + * read size +*****************************************************************************/ +VMINT vm_ssl_write(VMINT handle, const VMUINT8 *buf, VMINT len); + + +/***************************************************************************** + * FUNCTION + * vm_ssl_close + * DESCRIPTION + * close ssl connection. + * PARAMETERS + * handle : [IN] ssl handle. +*****************************************************************************/ +VMINT vm_ssl_close(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_ssl_get_verify_result + * DESCRIPTION + * get the verify result. + * PARAMETERS + * handle : [IN] ssl handle. + * RETURNS + * result + * RETURN VALUES + * 0 if successful, or a combination of: + * XYSSL VERIFY RESULT ERROR VALUES +*****************************************************************************/ +VMINT vm_ssl_get_verify_result(VMINT handle); + + +/***************************************************************************** + * FUNCTION + * vm_ssl_base64_encode + * Call this function with *dlen = 0 to obtain the required buffer size in *dlen + * DESCRIPTION + * base64 encode. + * PARAMETERS + * dst : [OUT] destination buffer. + * dlen : [OUT] size of the buffer. + * src : [IN] source buffer. + * slen : [IN] amount of data to be encoded. + * RETURNS + * result + * RETURN VALUES + * 0 if successful, or XYSSL_ERR_BASE64_BUFFER_TOO_SMALL. + * *dlen is always updated to reflect the amount of data that has (or would have) been written. +*****************************************************************************/ +VMINT vm_ssl_base64_encode(VMBYTE *dst, VMINT *dlen, VMBYTE *src, VMINT slen); + +/***************************************************************************** +* FUNCTION +* vm_ssl_base64_decode +* Call this function with *dlen = 0 to obtain the required buffer size in *dlen +* DESCRIPTION +* base64 decode. +* PARAMETERS +* dst : [OUT] destination buffer. +* dlen : [OUT] size of the buffer. +* src : [IN] source buffer. +* slen : [IN] amount of data to be decoded. +* RETURNS +* result +* RETURN VALUES +* 0 if successful, XYSSL_ERR_BASE64_BUFFER_TOO_SMALL, or +* XYSSL_ERR_BASE64_INVALID_DATA if the input data is not +* correct. *dlen is always updated to reflect the amount +* of data that has (or would have) been written. +*****************************************************************************/ +VMINT vm_ssl_base64_decode(VMBYTE *dst, VMINT *dlen, VMBYTE *src, VMINT slen); + +/***************************************************************************** +* FUNCTION +* vm_ssl_sha1_hmac +* DESCRIPTION +* get the verify result. +* PARAMETERS +* key : [IN] HMAC secret key. +* keylen : [IN] length of the HMAC key. +* input : [IN] buffer holding the data. +* ilen : [IN] length of the input data. +* output : [OUT] HMAC-SHA-1 result. +* RETURNS +* result +*****************************************************************************/ +VMINT vm_ssl_sha1_hmac(VMBYTE *key, VMINT keylen, VMBYTE *input, VMINT ilen, VMBYTE output[20]); + +#ifdef __cplusplus +} +#endif + +#endif /*_VMSSL_SDK_H_*/ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmsso.h b/hardware/arduino/mtk/system/libmtk/include/vmsso.h new file mode 100644 index 00000000..57e40fe3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmsso.h @@ -0,0 +1,446 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmpromng.c + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ + * $Log$ + * + * 07 05 2012 feng.lin + * [MAUI_03211419] It allways shows invalid username or password error notice while logging in yahoo services. + * . + * + * 06 14 2012 feng.lin + * [MAUI_03202717] update sso srv callback prototype + * . + * + * 06 07 2012 feng.lin + * [MAUI_03159675] MRE of SSO + * . + * + * 06 04 2012 feng.lin + * [MAUI_03159675] MRE of SSO + * . + * + * 05 14 2012 feng.lin + * [MAUI_03159675] MRE of SSO + * sso sdk. + * + * 05 14 2012 feng.lin + * [MAUI_03159675] MRE of SSO + * sso sdk. + * + * 04 25 2012 feng.lin + * [MAUI_03159675] MRE of SSO + * . + * + * 04 19 2012 feng.lin + * [MAUI_03159675] MRE of SSO + * . + * + * 04 18 2012 feng.lin + * [MAUI_03159675] MRE of SSO + * . + * + * 03 30 2012 feng.lin + * [MAUI_03159675] MRE of SSO + * . + * + * *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== + *******************************************************************************/ + +#ifndef VM_SSO_SDK_H +#define VM_SSO_SDK_H + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "vmsys.h" + +#define VM_SSO_NAME_SIZE 64 +#define VM_SSO_ACCESS_TOKEN 256 +#define VM_SSO_REFRESH_TOKEN 256 +#define VM_SSO_SCOPE 128 +#define VM_SSO_EXTENSION 256 + +#define VM_SSO_EXT_YAHOO_COOKIE 300 +#define VM_SSO_EXT_YAHOO_CRUMB 256 + + +typedef enum +{ + VM_SSO_ICON_LARGE, + VM_SSO_ICON_SMALL, + VM_SSO_ICON_TOTAL, +}vm_sso_icon_enum; + +typedef enum +{ + VM_SSO_LOGIN_DONT_CARE, + VM_SSO_LOGIN_TRUE, + VM_SSO_LOGIN_FALSE, + VM_SSO_LOGIN_TOTAL +}vm_sso_login_state; + +typedef enum +{ + VM_SSO_CREDENTIAL_OAUTH, + VM_SSO_CREDENTIAL_USERPASS, + VM_SSO_CREDENTIAL_YAHOO, + VM_SSO_CREDENTIAL_TOTAL +}vm_sso_credential_enum; + +typedef enum +{ + VM_SSO_OK, + VM_SRV_SSO_UNKNOWN_ERROR = -999, + VM_SRV_SSO_CARD_PLUG_OUT, + VM_SRV_SSO_USB_MS_MODE, + VM_SRV_SSO_PROVIDER_NOT_FOUND, + VM_SRV_SSO_ACCOUNT_NOT_FOUND, + VM_SRV_SSO_BUSY, + VM_SRV_SSO_CONNECTION_FAIL, + VM_SRV_SSO_INCORRECT_ID_PW, + VM_SRV_SSO_NOT_FULL_EMAIL, + VM_SRV_SSO_CANCELLED, + VM_SRV_SSO_UPGRADING, + VM_SRV_SSO_FAIL_TO_LOAD_PLUGIN +}vm_sso_result; + + +typedef struct +{ + VMUINT32 provider; + VMUINT8 accounts_total; // number of total accounts + VMUINT8 accounts_loggedin; // number of accounts which are logged-in +}vm_sso_provider_struct; + +typedef struct +{ + VMUINT32 provider; + VMUINT8 account; + VMUINT8 is_login; +} vm_sso_account_struct; + +typedef struct +{ + vm_sso_credential_enum type; + union + { + struct + { + VMCHAR access_token[VM_SSO_ACCESS_TOKEN]; + VMCHAR refresh_token[VM_SSO_REFRESH_TOKEN]; + VMCHAR scope[VM_SSO_SCOPE]; + VMCHAR extension[VM_SSO_EXTENSION]; + } oauth; + struct + { + VMCHAR username[VM_SSO_NAME_SIZE]; + VMCHAR password[VM_SSO_NAME_SIZE]; + } userpass; + struct + { + VMCHAR security_token[VM_SSO_ACCESS_TOKEN]; + VMCHAR ycookie[VM_SSO_EXT_YAHOO_COOKIE]; + VMCHAR tcookie[VM_SSO_EXT_YAHOO_COOKIE]; + VMCHAR crumb[VM_SSO_EXT_YAHOO_CRUMB]; + } yahoo; + } value; +}vm_sso_credential_struct; + +typedef void (*vm_sso_account_callback)(VMINT req_id, vm_sso_result result, VMUINT32 provider, VMUINT8 account, void * user_data); + +typedef void (*vm_sso_result_callback)(VMINT req_id, vm_sso_result result, void * user_data); + + +/****************************************************************************** + * FUNCTION + * vm_sso_get_provider_count + * DESCRIPTION + * get the number of providers + * RETURNS + * return the nubmer of providers if positive number, else failure + ******************************************************************************/ +VMINT vm_sso_get_provider_count(void); + +/****************************************************************************** + * FUNCTION + * vm_sso_get_providers + * DESCRIPTION + * get info for all providers + * PARAMETERS + * buffer: [OUT] memory allocated by caller to hold the provider structure + * buffer_items: [IN] number of items the buffer can hold + * RETURNS + * return the nubmer of available providers if positive number, else failure + ******************************************************************************/ +VMINT vm_sso_get_providers(vm_sso_provider_struct * buffer, VMUINT8 buffer_items); + +/****************************************************************************** + * FUNCTION + * vm_sso_get_provider + * DESCRIPTION + * get info for specific providers + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_provider_struct.provider + * buffer: [OUT] refer to vm_sso_provider_struct + * RETURNS + * success if 0, else failure. + ******************************************************************************/ +VMINT vm_sso_get_provider(VMUINT32 provider, vm_sso_provider_struct * buffer); + +/****************************************************************************** + * FUNCTION + * vm_sso_get_provider_icon + * DESCRIPTION + * get the name of a provider by its id + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_provider_struct.provider + * type: [IN] the size of icon to get + * icon_path [OUT] icon_path + * RETURNS + * success if 0, else failure. + ******************************************************************************/ +VMINT vm_sso_get_provider_icon(VMUINT32 provider, vm_sso_icon_enum type, VMWCHAR ** icon_path); + +/****************************************************************************** + * FUNCTION + * vm_sso_get_provider_name + * DESCRIPTION + * get the name of a provider by its id + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_provider_struct.provider + * buffer: [OUT] memory allocated by caller to hold the name of the provider + * must be at least VM_SSO_NAME_SIZE bytes + * RETURNS + * success if 0, else failure. + ******************************************************************************/ +VMINT vm_sso_get_provider_name(VMUINT32 provider, VMWCHAR * buffer); + +/****************************************************************************** + * FUNCTION + * vm_sso_get_account_count + * DESCRIPTION + * get the number of accounts for a provider according the login state + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_provider_struct.provider + * login_state: [IN] login state to filter accounts + * RETURNS + * return the nubmer of accounts if positive number, else failure + ******************************************************************************/ +VMINT vm_sso_get_account_count(VMUINT32 provider, vm_sso_login_state login_state); + +/****************************************************************************** + * FUNCTION + * vm_sso_get_accounts + * DESCRIPTION + * get the info of accounts for a provider according the login state + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_provider_struct.provider + * login_state: [IN] login state to filter accounts + * buffer: [OUT] memory allocated by caller to hold the vm_sso_account_struct + * buffer_items: [IN] number of items the buffer can hold + * RETURNS + * return the nubmer of accounts if positive number, else failure + ******************************************************************************/ +VMINT vm_sso_get_accounts(VMUINT32 provider, vm_sso_login_state login_state, vm_sso_account_struct * buffer, VMUINT8 buffer_items); + +/****************************************************************************** + * FUNCTION + * vm_sso_get_account + * DESCRIPTION + * get the info of accounts for a provider according the login state + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_provider_struct.provider + * account: [IN] the account as in vm_sso_account_struct.account + * buffer: [OUT] refer to vm_sso_account_struct + * RETURNS + * return the nubmer of accounts if positive number, else failure + ******************************************************************************/ +VMINT vm_sso_get_account(VMUINT32 provider, VMUINT8 account, vm_sso_account_struct * buffer); + +/****************************************************************************** + * FUNCTION + * vm_sso_get_account_name + * DESCRIPTION + * get the username of an account by its provider and account + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_account_struct.provider + * account: [IN] the account as in vm_sso_account_struct.account + * buffer: [OUT] memory allocated by caller to hold the username of the account + * must be at least VM_SSO_NAME_SIZE bytes + * RETURNS + * success if 0, else failure. + ******************************************************************************/ +VMINT vm_sso_get_account_name(VMUINT32 provider, VMUINT8 account, VMWCHAR * buffer); + +/****************************************************************************** + * FUNCTION + * vm_sso_get_credentials + * DESCRIPTION + * get the credentials of an account by its provider and account + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_provider_struct.provider + * account: [IN] the account as in vm_sso_provider_struct.account + * buffer: [OUT] memory allocated by caller to hold the credentials of the account + * must be at least sizeof(vm_sso_credential_struct) bytes + * RETURNS + * success if 0, else failure. + ******************************************************************************/ +VMINT vm_sso_get_credentials(VMUINT32 provider, VMUINT8 account, vm_sso_credential_struct * buffer); + +/****************************************************************************** + * FUNCTION + * vm_sso_add_account + * DESCRIPTION + * launch plugin to prompt user for username/password in exchange for credentials + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_provider_struct.provider + * username: [IN] username of account + * password: [IN] password of account + * callback: [IN] will be called when the operation is done, no matter success or failure + * user_data: [IN] user data to be pass along by the callback function + * RETURNS + * success if >= 0, else failure. + ******************************************************************************/ +VMINT vm_sso_add_account(VMUINT32 provider, const VMWCHAR * username, const VMWCHAR * password, vm_sso_account_callback callback, void * user_data); + +/****************************************************************************** + * FUNCTION + * vm_sso_login_account + * DESCRIPTION + * log in to an existing account which has been logged out + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_provider_struct.provider + * account: [IN] the account as in vm_sso_provider_struct.account + * password: [IN] password of account, user needs to enter again + * callback: [IN] will be called when the operation is done, no matter success or failure + * user_data: [IN] user data to be pass along by the callback function + * RETURNS + * success if >= 0, else failure. + ******************************************************************************/ +VMINT vm_sso_login_account(VMUINT32 provider, VMUINT8 account, const VMWCHAR * password, vm_sso_account_callback callback, void * user_data); + +/****************************************************************************** + * FUNCTION + * vm_sso_logout_account + * DESCRIPTION + * logout account but still keep it for log-in later + * PARAMETERS + * provider: [IN] the provider id as in vm_sso_provider_struct.provider + * account: [IN] the account as in vm_sso_provider_struct.account + * callback: [IN] will be called when the operation is done, no matter success or failure + * user_data: [IN] user data to be pass along by the callback function + * RETURNS + * success if >= 0, else failure. + ******************************************************************************/ +VMINT vm_sso_logout_account(VMUINT32 provider, VMUINT8 account, vm_sso_result_callback callback, void * user_data); + +/****************************************************************************** + * FUNCTION + * vm_sso_del_account + * DESCRIPTION + * delete account and do the necessary clean-ups + * PARAMETERS + * provider: [IN] the provider id as in srv_sso_account_struct.provider + * account: [IN] the account as in srv_sso_account_struct.account + * callback: [IN] will be called when the operation is done, no matter success or failure + * user_data: [IN] user data to be pass along by the callback function + * RETURNS + * success if >= 0, else failure. + ******************************************************************************/ +VMINT vm_sso_del_account(VMUINT32 provider, VMUINT8 account, vm_sso_result_callback callback, void * user_data); + +/****************************************************************************** + * FUNCTION + * vm_sso_refresh_credentials + * DESCRIPTION + * ask plugin to refresh access token by using refresh token or extension + * PARAMETERS + * provider: [IN] the provider id as in srv_sso_account_struct.provider + * account: [IN] the account as in srv_sso_account_struct.account + * callback: [IN] will be called when the operation is done, no matter success or failure + * user_data: [IN] user data to be pass along by the callback function + * RETURNS + * success if >= 0, else failure. + ******************************************************************************/ +VMINT vm_sso_refresh_credentials(VMUINT32 provider, VMUINT8 account, vm_sso_result_callback callback, void * user_data); + +/****************************************************************************** + * FUNCTION + * vm_sso_cancel + * DESCRIPTION + * cancel an running operation + * PARAMETERS + * req_id: [IN] request id + * RETURNS + * success if 0, else failure. + ******************************************************************************/ +VMINT vm_sso_cancel(VMINT req_id); + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + + + +#endif /* VM_SSO_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmstatusbar.h b/hardware/arduino/mtk/system/libmtk/include/vmstatusbar.h new file mode 100644 index 00000000..8f19f7b6 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmstatusbar.h @@ -0,0 +1,269 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +#ifndef VMSTATUSBAR_SDK_H +#define VMSTATUSBAR_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +#include "vmpromng.h" + +#ifndef MAX_APP_NAME_LEN +#define MAX_APP_NAME_LEN (260) +#endif + +/***************************************************************************** +* FUNCTION + * vm_pmng_apply_to_run_in_fg + * DESCRIPTION + * apply to foreground running for background running application by specified mode. + * PARAMETERS + * notify_type : [IN] notification mode, refer to VM_FG_NOTIFY_TYPE + * EXAMPLE [this TAG is optional] + * + * vm_pmng_apply_to_run_in_fg(VM_NOTIFY_TYPE_SOUND); //by sound mode + * + * +*****************************************************************************/ +VMINT vm_pmng_apply_to_run_in_fg(VMINT notify_type); + +/* DOM-NOT_FOR_SDK-BEGIN */ +void vm_graphic_status_icon_bar_hide_callback(void); +void vm_graphic_show_status_icon_bar(void); +void vm_graphic_reset_status_icon_bar(void); + +typedef struct mmi_mre_data +{ + VMUWSTR subText; + VMUWSTR timeText; + VMUSTR imageBuffer; +}mmi_mre_data; + +typedef enum mmi_mre_image_type +{ + MRE_IMAGE_TYPE_INVALID = 0, + MRE_IMAGE_TYPE_BMP = 1, + MRE_IMAGE_TYPE_GIF = 3, + MRE_IMAGE_TYPE_JPG = 9, + MRE_IMAGE_TYPE_PNG = 19, +}mmi_mre_image_type; + + +typedef struct vm_status_bar_icon_t +{ + VMINT icon_id; /**< ICON ID */ + VMINT pHandle; /**< ICON Handle */ + VMINT b_used; + VMWCHAR fullFilename[MAX_APP_NAME_LEN + 1]; /**< full file name of bg running app */ + VMUSTR image_buffer_show; /**< ICON Show Image */ + VMUSTR image_buffer_blink; /**< ICON BlinkImage */ + mmi_mre_data* ncenter_cell_buf; + struct vm_status_bar_icon_t* pNext; /**< next icon */ +}vm_status_bar_icon_t; +/* DOM-NOT_FOR_SDK-END */ + +typedef enum +{ + VM_ICON_SHOW=1 , /**< icon image is show */ + VM_ICON_BLINK, /**< icon image is blink */ + VM_ICON_NCENTER_CELL, /**< icon image is notification-center cell */ + VM_ICON_HIDE /**< icon image is hide */ +}VM_ICON_STATUS_TYPE; + +typedef struct vm_status_bar_icon_image_info +{ + VMUINT8 image_type; /**< image type such as BMP|PNG|JPEG|GIF */ + VMUINT image_frame_num; /**< how many frame does Image have */ + VMUINT image_size; /**< image size */ + VMUINT image_width; /**< image width */ + VMUINT image_height; /**< image height */ + VMUSTR image_data_buf; /**< pointer to image data buf */ +}VM_ICON_STATUS_ICON_IMAGE_INFO; + +typedef struct vm_status_bar_new_message_info +{ + VMUWSTR us_subText; /**< sub text */ + VMUWSTR us_timeText; /**< time text */ + VMINT subText_lenth; /**< sub text lenth */ + VMINT timeText_lenth; /**< time text lenth */ + VM_ICON_STATUS_ICON_IMAGE_INFO* uc_imageBuffer; /**< image data buf */ +}VM_NEW_MESSAGE_INFO; + +/***************************************************************************** +* FUNCTION + * vm_graphic_show_status_icon_bar + * DESCRIPTION + * normally MRE application is full screen ,this api will show status bar in + * application's screen + * PARAMETERS + * NULL + * EXAMPLE [this TAG is optional] + * + * vm_statusbar_new_message(&new_message); + * + * +*****************************************************************************/ +void vm_graphic_show_status_icon_bar(void); + +/***************************************************************************** +* FUNCTION + * vm_graphic_reset_status_icon_bar + * DESCRIPTION + * after called vm_graphic_show_status_icon_bar(),status bar will be shown. + * vm_graphic_reset_status_icon_bar() will hide status bar again. + * PARAMETERS + * NULL + * EXAMPLE [this TAG is optional] + * + * vm_statusbar_new_message(&new_message); + * + * +*****************************************************************************/ +void vm_graphic_reset_status_icon_bar(void); + +/***************************************************************************** +* FUNCTION + * vm_statusbar_new_message + * DESCRIPTION + * notify statusbar has a new message coming,detail will be in paramater of + * new_message_info. + * PARAMETERS + * new_message_info : [IN] new message content + * EXAMPLE [this TAG is optional] + * + * VM_NEW_MESSAGE_INFO new_message; + * new_message.us_subText = XXXX; + * new_message.us_timeText = XXXX; + * new_message.subText_lenth = XXXX; + * new_message.timeText_lenth = XXXX; + * new_message.uc_imageBuffer = XXXX; + * vm_statusbar_new_message(&new_message); + * + * +*****************************************************************************/ +VMINT vm_statusbar_new_message(VM_NEW_MESSAGE_INFO* new_message_info); + +/***************************************************************************** +* FUNCTION + * vm_statusbar_set_image + * DESCRIPTION + * set image of statusbar. + * PARAMETERS + * Status_type : [IN] notification mode, refer to VM_ICON_STATUS_TYPE + * VM_ICON_SHOW // icon image will be show + * VM_ICON_BLINK // icon image will be blink + * VM_ICON_NCENTER_CELL // icon image will be show on N-center cell + * VM_ICON_HIDE // icon image will be hide + * image_info : [IN] information of image. + * image_type; // image type. + * image_frame_num; // image frame number it should be 1,if it is a static image. + * image_size; // size of image. + * image_width; // width of image. + * image_height; // height of image + * image_data_buf; // image resource buffer. + * EXAMPLE [this TAG is optional] + * + * VM_ICON_STATUS_ICON_IMAGE_INFO image_icon_info; + * image_icon_info.image_type = XXXX; + * image_icon_info.image_frame_num = XXXX; + * image_icon_info.image_size = XXXX; + * image_icon_info.image_width = XXXX; + * image_icon_info.image_height = XXXX; + * image_icon_info.image_data_buf = XXXX; + * vm_statusbar_set_image(VM_ICON_SHOW,&image_icon_info); + * + * +*****************************************************************************/ +VMINT vm_statusbar_set_image(VM_ICON_STATUS_TYPE Status_type ,VM_ICON_STATUS_ICON_IMAGE_INFO*image_info); + +/***************************************************************************** +* FUNCTION + * vm_statusbar_set_image_ex + * DESCRIPTION + * set image of statusbar, and you can decide which notify type will be used. + * PARAMETERS + * Status_type : [IN] notification mode, refer to VM_ICON_STATUS_TYPE + * VM_ICON_SHOW // icon image will be show + * VM_ICON_BLINK // icon image will be blink + * VM_ICON_NCENTER_CELL // icon image will be show on N-center cell + * VM_ICON_HIDE // icon image will be hide + * image_info : [IN] information of image. + * image_type; // image type. + * image_frame_num; // image frame number it should be 1,if it is a static image. + * image_size; // size of image. + * image_width; // width of image. + * image_height; // height of image + * image_data_buf; // image resource buffer. + * notify_type : [IN] type of notification. + * VM_NOTIFY_TYPE_DEFAULT // by default mode (follow engine control) + * VM_NOTIFY_TYPE_SOUND // by sound mode + * VM_NOTIFY_TYPE_VIBRATILITY // by vibration mode + * EXAMPLE [this TAG is optional] + * + * VM_ICON_STATUS_ICON_IMAGE_INFO image_icon_info; + * image_icon_info.image_type = XXXX; + * image_icon_info.image_frame_num = XXXX; + * image_icon_info.image_size = XXXX; + * image_icon_info.image_width = XXXX; + * image_icon_info.image_height = XXXX; + * image_icon_info.image_data_buf = XXXX; + * vm_statusbar_set_image(VM_ICON_SHOW,&image_icon_info,VM_NOTIFY_TYPE_DEFAULT); + * + * +*****************************************************************************/ +VMINT vm_statusbar_set_image_ex( + VM_ICON_STATUS_TYPE status_type, + VM_ICON_STATUS_ICON_IMAGE_INFO *image_info, + VMINT notify_type); + +/****************************************************************************** + * FUNCTION + * vm_statusbar_get_height + * DESCRIPTION + * get the height of statusbar. + * PARAMETER + * void + * RETURNS + * the height (in pixels) of statusbar. + ******************************************************************************/ +VMINT vm_statusbar_get_height(void); + +#ifdef __cplusplus +} +#endif + +#endif /* VMSTATUSBAR_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmstdlib.h b/hardware/arduino/mtk/system/libmtk/include/vmstdlib.h new file mode 100644 index 00000000..9bfe4163 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmstdlib.h @@ -0,0 +1,681 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMSTDLIB_SDK_H_ +#define VMSTDLIB_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "vmsys.h" + +#define VM_CACHE_SIZE 4096 + + +#if defined(__COMPILER_RVCT__) || defined(__COMPILER_GCC__) +#undef vsprintf +#undef sprintf +#undef sscanf + +int vm_vsprintf(char *buf, const char *fmt, va_list args); +int vm_sprintf( char * buf, const char * fmt, ... ); +int vm_sscanf(const char *str, const char *format, ...); + +#define vsprintf vm_vsprintf +#define sprintf vm_sprintf +#define sscanf vm_sscanf +#endif + + +/** +* cache structure to transfer block io mode to stream io mode +*/ +struct vm_cache_t { + VMINT eof; /* end of stream */ + VMINT avail; /* data still available from stream */ + VMINT count; /* number of byte of remaining data from stream */ + VMUINT8 buf[VM_CACHE_SIZE]; /* data buffer */ +}; +typedef struct vm_cache_t vm_cache_t; + +/***************************************************************************** + * FUNCTION + * strtoi + * DESCRIPTION + * transfer a number format from string to integer. + * PARAMETERS + * s : [IN] string to be transfered. + * RETURNS + * result of transition. -1 means failed. + *****************************************************************************/ +int strtoi(char* s); + +/***************************************************************************** + * FUNCTION + * vm_get_filename + * DESCRIPTION + * get file name from full path. + * PARAMETERS + * path: [IN] full path string encoding with UCS2. + * filename : [OUT] output file name encoding with UCS2. + *****************************************************************************/ +void vm_get_filename(VMWSTR path, VMWSTR filename); + +/***************************************************************************** + * FUNCTION + * vm_get_path + * DESCRIPTION + * get file path from full path. + * PARAMETERS + * fullpath: [IN] full path string encoding with UCS2. + * path : [OUT] output file path encoding with UCS2. + * RETURNS + * 0 means successfully + *****************************************************************************/ +VMINT vm_get_path(VMWSTR fullpath, VMWSTR path); + +/* DOM-NOT_FOR_SDK-BEGIN */ +/***************************************************************************** + * FUNCTION + * get_today_from_2000 + * DESCRIPTION + * get the number of day from 2000/01/01 to now. + * RETURNS + * number of day, -1 means failed. + *****************************************************************************/ +VMINT get_today_from_2000(void); +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** + * FUNCTION + * vm_upper_case + * DESCRIPTION + * convert the lower case character to upper case character + * PARAMETERS + * dst : [OUT] output the upper case of string + * src : [IN] string to be converted. + *****************************************************************************/ +void vm_upper_case(char* dst, char* src); + +/***************************************************************************** + * FUNCTION + * vm_upper_case + * DESCRIPTION + * convert the upper case character to lower case character + * PARAMETERS + * dst: [OUT] output the lower case of string + * src : [IN] string to be converted. + *****************************************************************************/ +void vm_lower_case(char* dst, char* src); + +/***************************************************************************** + * FUNCTION + * vm_string_equals_ignore_case + * DESCRIPTION + * compare string without case sensitive + * PARAMETERS + * s1: [IN] the first string. + * s2 : [IN] the second string. + * RETURNS + * 0 means the two string are same, -1 means they are different. + *****************************************************************************/ +VMINT vm_string_equals_ignore_case(const char *s1, const char *s2); + +/***************************************************************************** + * FUNCTION + * vm_write_cache + * DESCRIPTION + * write data to cache by stream mode. + * PARAMETERS + * cache: [IN] cache pointer. + * buf : [IN] buffer address. + * buf_len : [IN] buffer length. + * RETURNS + * number of bytes written + *****************************************************************************/ +VMINT vm_write_cache(vm_cache_t *cache, void *buf, VMINT buf_len); + + /***************************************************************************** + * FUNCTION + * vm_read_cache + * DESCRIPTION + * read data from cache by stream mode. + * PARAMETERS + * cache: [IN] cache pointer. + * buf : [OUT] buffer address. + * buf_size : [IN] buffer size + * len : [IN] number of bytes to read. + * RETURNS + * number of bytes read + *****************************************************************************/ +VMINT vm_read_cache(vm_cache_t *cache, void *buf, VMINT buf_size, VMINT len); + + /***************************************************************************** + * FUNCTION + * vm_cache_read_char + * DESCRIPTION + * read a character from cache by stream mode. + * PARAMETERS + * cache: [IN] cache pointer. + * ch : [OUT] character. + * RETURNS + * 0 means succeed, else return error code. + *****************************************************************************/ +VMINT vm_cache_read_char(vm_cache_t *cache, char *ch); + + /***************************************************************************** + * FUNCTION + * vm_get_cache_free_space + * DESCRIPTION + * get free space of cache. + * PARAMETERS + * cache: [IN] cache pointer. + * RETURNS + * number of byte of free space + *****************************************************************************/ +VMINT vm_get_cache_free_space(vm_cache_t *cache); + + /***************************************************************************** + * FUNCTION + * vm_read_line + * DESCRIPTION + * read a line of string from cache. + * PARAMETERS + * line: [OUT] string pointer to read + * size : [IN] line buffer size + * cache : [IN] cache pointer. + * RETURNS + * 0 means succeed, else return error code. + *****************************************************************************/ +VMINT vm_read_line(char* line, VMINT size, vm_cache_t* cache); + +/* DOM-NOT_FOR_SDK-BEGIN */ +/***************************************************************************** +* FUNCTION +* vm_memcpy +* DESCRIPTION +* memory copy. +* PARAMETERS +* dst: [OUT] destination data buffer. +* src : [IN] source data buffer. +* count : [IN] number of byte to be copied. +*****************************************************************************/ +void vm_memcpy(void* dst, void* src, VMINT count); +/* DOM-NOT_FOR_SDK-END */ + +/** +* dynamic array +*/ +typedef struct _vm_dyn_array_t { +/** +* size of block. + */ + VMINT block_size; + + /** + * initial size. + */ + VMINT init_size; + + /** + * increased size. + */ + VMINT inc_size; + + /** + * count of saved block + */ + VMINT count; + + /** + * capacity of the array + */ + VMINT capacity; + + /** + *pointer of array + */ + void *ptr; +} vm_dyn_array_t; + +/***************************************************************************** + * FUNCTION + * vm_create_dyn_array + * DESCRIPTION + * create dynamic array. + * PARAMETERS + * init_size: [IN] initial size of dynamic array. + * inc_size : [IN] increased size each time + * block_size : [IN] structure size of data stored in the array + * RETURNS + * 0 means succeed, else return error code. + *****************************************************************************/ +vm_dyn_array_t* vm_create_dyn_array(VMINT init_size, VMINT inc_size, VMINT block_size); + +/***************************************************************************** + * FUNCTION + * vm_dyn_array_add + * DESCRIPTION + * add new data to the end of dynamic array . + * PARAMETERS + * array: [IN] array pointer. + * data : [IN] data to be added. + * RETURNS + * 0 means succeed, else return error code. + *****************************************************************************/ +VMINT vm_dyn_array_add(vm_dyn_array_t *array, void* data); + +/***************************************************************************** + * FUNCTION + * vm_dyn_array_del + * DESCRIPTION + * delete the data item of specified index of the array . + * PARAMETERS + * array: [IN] array pointer. + * idx : [IN] index to be deleted. + * RETURNS + * 0 means succeed, else return error code. + *****************************************************************************/ +VMINT vm_dyn_array_del(vm_dyn_array_t *array, VMINT idx); + +/***************************************************************************** + * FUNCTION + * vm_dyn_array_del_all + * DESCRIPTION + * delete all the data from the specified array . + * PARAMETERS + * array: [IN] array pointer. + * RETURNS + * 0 means succeed, else return error code. + *****************************************************************************/ +VMINT vm_dyn_array_del_all(vm_dyn_array_t *array); + +/***************************************************************************** + * FUNCTION + * vm_free_dyn_array + * DESCRIPTION + * free the memory of the dynamic array . + * PARAMETERS + * array: [IN] array pointer. + *****************************************************************************/ +void vm_free_dyn_array(vm_dyn_array_t *array); + +/** + * stack operation succeed + */ +#define STACK_OPERATE_SUCCESS (0) + +/** + * stack operation fail + */ +#define STACK_PARAM_ERROR (-1) + +/** + * stack operation fail for lack of resource + */ +#define STACK_LEAK_RESOUCE (-2) + +/** + * stack push fail for overflow + */ +#define STACK_PUSH_OVERFLOW (-3) + +/** +* stack pop fail for empty stack +*/ +#define STACK_OPERATE_EMPTY_STACK (-4) + +/** + * stack operation fail for handler error + */ +#define STACK_HANDLE_ERROR (-5) + +/***************************************************************************** + * FUNCTION + * vm_create_array_stack + * DESCRIPTION + * create an array stack, when not use this, please use vm_destory_stack to destroy it. + * PARAMETERS + * capability : [IN] stack's capability. + * handle : [OUT] the handle of stack. + * RETURNS + * create an array stack success or not. + * RETURN VALUES + * STACK_OPERATE_SUCCESS : create stack success. + * STACK_PARAM_ERROR : parameter is wrong. + * STACK_LEAK_RESOUCE : resource error. + *****************************************************************************/ +VMINT vm_create_array_stack(VMINT capability, VMINT* handle); + + +/***************************************************************************** + * FUNCTION + * vm_create_linked_stack + * DESCRIPTION + * create an linked stack, memory will dynamicly allocate,when not use this, please use vm_destory_stack to destroy it. + * PARAMETERS + * capability : [IN] stack's capability. + * handle : [OUT] the handle of stack. + * RETURNS + * create an linked stack success or not. + * RETURN VALUES + * STACK_OPERATE_SUCCESS : create stack success. + * STACK_PARAM_ERROR : parameter is wrong. + * STACK_LEAK_RESOUCE : resource error. + *****************************************************************************/ +VMINT vm_create_linked_stack(VMINT capability, VMINT* handle); + + +/***************************************************************************** + * FUNCTION + * vm_is_empty_stack + * DESCRIPTION + * check stack empty or not. + * PARAMETERS + * stackHandle : [IN] stack's handle when created by vm_create_linked_stack. + * RETURNS + * stack empty or not. + * RETURN VALUES + * FALSE : stack is not empty. + * TRUE : stack is empty. + *****************************************************************************/ +VMINT vm_is_empty_stack(VMINT stackHandle); + + +/***************************************************************************** + * FUNCTION + * vm_push_stack + * DESCRIPTION + * push data to stack. + * PARAMETERS + * stackHandle : [IN] stack's handle. + * ptr : [IN] data for pushing. + * RETURNS + * push data to stack success or not. + * RETURN VALUES + * STACK_OPERATE_SUCCESS : push data success. + * STACK_PUSH_OVERFLOW : stack is full. + * STACK_LEAK_RESOUCE : memory is not enough. + * STACK_HANDLE_ERROR : stackHandle is wrong. + *****************************************************************************/ +VMINT vm_push_stack(VMINT stackHandle, void* ptr); + + +/***************************************************************************** + * FUNCTION + * vm_popup_stack + * DESCRIPTION + * popup data from stack. + * PARAMETERS + * stackHandle : [IN] stack's handle. + * ptr : [OUT] data get from stack. + * RETURNS + * popup data success or not. + * RETURN VALUES + * STACK_OPERATE_SUCCESS : popup data success. + * STACK_OPERATE_EMPTY_STACK : stack is empty. + * STACK_HANDLE_ERROR : stackHandle is wrong. + *****************************************************************************/ +VMINT vm_popup_stack(VMINT stackHandle, void** ptr); + + +/***************************************************************************** + * FUNCTION + * vm_peek_stack + * DESCRIPTION + * get next data from stack but not popup. + * PARAMETERS + * stackHandle : [IN] stack's handle. + * ptr : [OUT] data get from stack. + * RETURNS + * get next data from stack success or not. + * RETURN VALUES + * STACK_OPERATE_SUCCESS : popup data success. + * STACK_OPERATE_EMPTY_STACK : stack is empty. + * STACK_HANDLE_ERROR : stackHandle is wrong. + *****************************************************************************/ +VMINT vm_peek_stack(VMINT stackHandle, void** ptr); + + +/***************************************************************************** + * FUNCTION + * vm_reset_stack + * DESCRIPTION + * clear all stack's data. + * PARAMETERS + * stackHandle : [IN] stack's handle. + * RETURNS + * clear all stack's data success or not. + * RETURN VALUES + * STACK_OPERATE_SUCCESS : clear data success. + * STACK_HANDLE_ERROR : stackHandle is wrong. + *****************************************************************************/ +VMINT vm_reset_stack(VMINT stackHandle); + + +/***************************************************************************** + * FUNCTION + * vm_is_exist_stack + * DESCRIPTION + * check data in or not in stack. + * PARAMETERS + * stackHandle : [IN] stack's handle. + * ptr : [IN] data. + * RETURNS + * return data in or not in stack. + * RETURN VALUES + * TRUE : in stack. + * FALSE : not in stack. + *****************************************************************************/ +VMINT vm_is_exist_stack(VMINT stackHandle, void* ptr); + + +/***************************************************************************** + * FUNCTION + * vm_destroy_stack + * DESCRIPTION + * check data in or not in stack. + * PARAMETERS + * stackHandle : [IN] stack's handle. + * RETURNS + * destroy stack success or not. + * RETURN VALUES + * STACK_OPERATE_SUCCESS : destroy stack success. + * STACK_HANDLE_ERROR : stackHandle is wrong. + *****************************************************************************/ +VMINT vm_destroy_stack(VMINT stackHandle); + +/***************************************************************************** + * FUNCTION + * vm_ends_with + * DESCRIPTION + * check specified string is end with specified string + * PARAMETERS + * s1 : [IN] string to check + * s2 : [IN] ending string + * RETURNS + * 0 if s1 ended with s2, else return others. + *****************************************************************************/ +VMINT vm_ends_with(const char *s1, const char *s2); + +/***************************************************************************** + * FUNCTION + * vm_ends_with + * DESCRIPTION + * check specified string is end with specified string, and both of the two strings are encoding with UCS2 + * PARAMETERS + * s1 : [IN] string to check + * s2 : [IN] ending string + * RETURNS + * 0 if s1 ended with s2, else return others. + *****************************************************************************/ +VMINT vm_wends_with(const VMWSTR s1, const VMWSTR s2); + +/* DOM-NOT_FOR_SDK-BEGIN */ +/***************************************************************************** + * FUNCTION + * vm_tmp_filename + * DESCRIPTION + * generate a temp file name which will be unique. + * PARAMETERS + * prefix : [IN] prefix to temp file name, normally is path. + * filename : [OUT] temp file name length is 128 including '\0'. + *****************************************************************************/ +void vm_tmp_filename(char* prefix, char* filename); +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** + * FUNCTION + * vm_safe_wstrcpy + * DESCRIPTION + * safe wstrcpy. When destination buffer is not enough, the extra part will be cut. + * PARAMETERS + * dest : [OUT] destination string. + * size : [IN] length of string. + * src : [IN] source string. + * RETURNS + * length of string copied actually. + *****************************************************************************/ +VMINT vm_safe_wstrcpy(VMWSTR dest, VMINT size, VMWSTR src); + +#define wstrlen vm_wstrlen +/***************************************************************************** + * FUNCTION + * vm_wstrcpy + * DESCRIPTION + * get the length of UCS2 string. + * PARAMETERS + * s : [IN] string to be checked teminated with '\0'. + * RETURNS + * length of string. + *****************************************************************************/ +VMINT vm_wstrlen(VMWSTR s); + +#define wstrcpy vm_wstrcpy +/***************************************************************************** + * FUNCTION + * vm_wstrcpy + * DESCRIPTION + * UCS2 string copy + * PARAMETERS + * dest : [OUT] destination string. + * src : [IN] source string. + * RETURNS + * length of string copied actually. + *****************************************************************************/ +VMINT vm_wstrcpy(VMWSTR dst, const VMWSTR src); + +#define wstrcat vm_wstrcat +/***************************************************************************** + * FUNCTION + * vm_wstrcat + * DESCRIPTION + * UCS2 string append. + * PARAMETERS + * dest : [OUT] destination string. + * src : [IN] source string. + *****************************************************************************/ +VMINT vm_wstrcat(VMWSTR dst, const VMWSTR src); + +#define wstrncpy vm_wstrncpy +/***************************************************************************** + * FUNCTION + * vm_wstrncpy + * DESCRIPTION + * UCS2 string N copy + * PARAMETERS + * dest : [OUT] destination string. + * src : [IN] source string. + * length : [IN] lenth of string to be copied. + * RETURNS + * length of string copied actually. + *****************************************************************************/ +VMINT vm_wstrncpy(VMWSTR dst, const VMWSTR src, VMINT length); + +#define wstrcmp vm_wstrcmp + +/***************************************************************************** + * FUNCTION + * vm_wstrcmp + * DESCRIPTION + * UCS2 string compare + * PARAMETERS + * str_1 : [IN] string 1 + * str_2 : [IN] string 2 + * RETURNS + * 0 means the two string are same, non-zero means they are different. + *****************************************************************************/ +VMINT vm_wstrcmp(VMWSTR str_1, VMWSTR str_2); + +/* DOM-NOT_FOR_SDK-BEGIN */ +/***************************************************************************** + * FUNCTION + * vm_wstrcmp_ignore_case + * DESCRIPTION + * UCS2 string compare without case sensitive + * PARAMETERS + * str_1 : [IN] string 1 + * str_2 : [IN] string 2 + * RETURNS + * 0 means the two string are same, non-zero means they are different. + *****************************************************************************/ +VMINT vm_wstrcmp_ignore_case(VMWSTR str_1, VMWSTR str_2); +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** + * FUNCTION + * vm_wstarts_with + * DESCRIPTION + * check specified string is started with specified string, and both of the two strings are encoding with UCS2 + * PARAMETERS + * s1 : [IN] string to check + * s2 : [IN] starting string + * RETURNS + * 0 if s1 start with s2, else return others. + *****************************************************************************/ +VMINT vm_wstarts_with(VMWSTR a, VMWSTR b); + +VMINT vm_vwsprintf(VMWSTR outstr, VMINT size, const VMWSTR fmt, va_list args); +VMINT vm_wsprintf(VMWSTR outstr, VMINT size, const VMWSTR fmt, ...); + + +#ifdef __cplusplus +} +#endif + +#endif /* VMSTDLIB_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmstream.h b/hardware/arduino/mtk/system/libmtk/include/vmstream.h new file mode 100644 index 00000000..1b64928d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmstream.h @@ -0,0 +1,172 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMSTREAM_SDK_H_ +#define VMSTREAM_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +#define VM_STREAM_MAX_PROXY_ADDR_LEN (63) +#define VM_STREAM_MAX_IP_LEN 4 + +/* stream scenario enum */ +typedef enum +{ + VM_STREAM_DECODER, // not used + VM_STREAM_QVGA, // not used + VM_STREAM_PREVIEW, // not used + VM_STREAM_CIF, // not used + VM_STREAM_INFO, // not used + VM_STREAM_MPEG4_DECODER, // not used + VM_STREAM_DECODER_N_SUBTITLE, // not used + VM_STREAM_UPTO_QVGA, // not used + VM_STREAM_UPTO_CIF, // not used + VM_STREAM_QVGA_MPEG4SP, // not used + VM_STREAM_MAX_SCENARIO = 0xFF +}vm_stream_scenario_enum; + +/* stream connect struct */ +typedef struct +{ + VMUINT8 session_id; // not used + VMUINT16 request_id; // not used + VMUINT32 net_id; // not used + VMUINT8 type; // not used + VMBOOL use_proxy; // not used + VMUINT8 proxy_addr[VM_STREAM_MAX_PROXY_ADDR_LEN]; // not used + VMUINT16 proxy_port; // not used + VMUINT16 lowest_udp_port; // not used + VMUINT16 highest_udp_port; // not used + vm_stream_scenario_enum scenario; // not used + VMUINT16 prefer_transport; // not used + VMUINT8 host_ip[VM_STREAM_MAX_IP_LEN]; // remote IP, format is like host_ip[0] = 127; host_ip[1] = 0; host_ip[2] = 0; host_ip[3] = 1 + VMUINT8 local_ip[VM_STREAM_MAX_IP_LEN]; // local IP , format is like local_ip[0] = 127; host_ip[1] = 0; host_ip[2] = 0; host_ip[3] = 1 + VMUINT16 host_port; // remote port + VMUINT16 local_port; // local port + +}vm_stream_connect_struct; + +/* volume type */ +typedef enum +{ + VM_STREAM_VOLUME_MIC, /* microphone */ + VM_STREAM_VOLUME_MEDIA, /* Multi-Media */ + VM_STREAM_MAX_VOLUME_TYPE +}vm_stream_volume_enum; + +/* Audio volume level enum for 7 level volume */ +typedef enum +{ + VM_STREAM_VOL_0, /* Volume level 0 (Not mute) */ + VM_STREAM_VOL_1, /* Volume level 1 */ + VM_STREAM_VOL_2, /* Volume level 2 */ + VM_STREAM_VOL_3, /* Volume level 3 */ + VM_STREAM_VOL_4, /* Volume level 4 */ + VM_STREAM_VOL_5, /* Volume level 5 */ + VM_STREAM_VOL_6, /* Volume level 6 */ + VM_STREAM_VOL_NUM /* Total volume level */ +}vm_stream_mic_vol_enum; + +/* Audio volume level enum for 16 level volume */ +typedef enum +{ + VM_STREAM_VOL_EX_0, /* Volume level 0 (Not mute) */ + VM_STREAM_VOL_EX_1, /* Volume level 1 */ + VM_STREAM_VOL_EX_2, /* Volume level 2 */ + VM_STREAM_VOL_EX_3, /* Volume level 3 */ + VM_STREAM_VOL_EX_4, /* Volume level 4 */ + VM_STREAM_VOL_EX_5, /* Volume level 5 */ + VM_STREAM_VOL_EX_6, /* Volume level 6 */ + VM_STREAM_VOL_EX_7, /* Volume level 7 */ + VM_STREAM_VOL_EX_8, /* Volume level 8 */ + VM_STREAM_VOL_EX_9, /* Volume level 9 */ + VM_STREAM_VOL_EX_10, /* Volume level 10 */ + VM_STREAM_VOL_EX_11, /* Volume level 11 */ + VM_STREAM_VOL_EX_12, /* Volume level 12 */ + VM_STREAM_VOL_EX_13, /* Volume level 13 */ + VM_STREAM_VOL_EX_14, /* Volume level 14 */ + VM_STREAM_VOL_EX_15, /* Volume level 15 */ + VM_STREAM_VOL_EX_NUM /* Total volume level */ +}vm_stream_media_vol_enum; + + + +/***************************************************************************** + * FUNCTION + * vm_stream_connect + * DESCRIPTION + * connect by remote device external IP/port and current device local IP/port + * PARAMETERS + * connect_info : [IN] please refer the structure vm_stream_connect_struct + * RETURNS + * stream handle / failure + *****************************************************************************/ +VMINT vm_stream_connect(vm_stream_connect_struct connect_info); + + +/***************************************************************************** + * FUNCTION + * vm_stream_disconnect + * DESCRIPTION + * disconnect session + * PARAMETERS + * session_id : [IN] not used, default: 0 + * RETURNS + * stream handle / failure + *****************************************************************************/ +VMINT vm_stream_disconnect(VMUINT8 session_id); + +/***************************************************************************** + * FUNCTION + * vm_stream_set_volume + * DESCRIPTION + * set loudspeaker volume + * PARAMETERS + * type : [IN]please refer vm_stream_volume_enum + * value : [IN] volume level refer vm_stream_mic_vol_enum/vm_stream_media_vol_enum + * RETURNS + * + *****************************************************************************/ +void vm_stream_set_volume(vm_stream_volume_enum type, VMUINT value); + +#ifdef __cplusplus +} +#endif + +#endif /* VMSTREAM_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmsys.h b/hardware/arduino/mtk/system/libmtk/include/vmsys.h new file mode 100644 index 00000000..54dcae7e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmsys.h @@ -0,0 +1,330 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMSYS_SDK_H_ +#define VMSYS_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef TRUE +#define TRUE 1 /*1*/ +#endif + +#ifndef FALSE +#define FALSE 0/*0*/ +#endif + +#ifndef NULL +#define NULL 0/*0*/ +#endif + + +/* start LinkIt environment normally */ +#define VM_NORMAL_START_MRE_ENV 1 + + +typedef unsigned char VMUINT8;/*unsigned char*/ +typedef unsigned short VMUINT16;/*unsigned short*/ +typedef unsigned int VMUINT;/*unsigned int*/ +typedef unsigned long VMUINT32;/*unsigned long*/ + + +typedef unsigned long long VMUINT64 ;/*unsigned long long*/ +typedef long long VMINT64 ;/*long long*/ + + +typedef char VMINT8;/*char*/ +typedef short VMINT16;/*short*/ +typedef int VMINT;/*int */ +typedef long VMINT32;/*long */ + +typedef VMUINT8 VMUCHAR;/*VMUINT8*/ +typedef VMUINT16 VMUWCHAR;/*VMUINT16*/ +typedef VMUINT8 * VMUSTR;/*VMUINT8 * */ +typedef VMUINT16 * VMUWSTR;/*VMUINT16 * */ + +typedef VMINT8 VMCHAR;/*VMINT8*/ +typedef VMINT16 VMWCHAR;/*VMINT16*/ +typedef VMINT8 * VMSTR;/* VMINT8 * */ +typedef VMINT16 * VMWSTR;/* VMINT16 * */ + +typedef unsigned char VMBYTE;/*unsigned char*/ +typedef unsigned short VMUSHORT;/*unsigned short*/ +typedef short VMSHORT;/*short*/ + +typedef VMINT VMFILE;/*VMINT*/ +typedef VMINT VMBOOL;/*VMINT*/ +#include "vmdatetime.h" +#include "vmuimisc.h" +#include "vmpwr.h" +#include "vmota.h" +#include "vmappmgr.h" +#include "vmpromng.h" +/*the statistic of memory using status */ +typedef struct malloc_stat_t { + /* the number if the malloc memory API is called, including vm_malloc(),vm_realloc(), * vm_calloc() */ + VMINT malloc_count; + + /*the number of free memory API is called */ + VMINT free_count; + + /*current used memory */ + VMINT current; + + /*peak memory*/ + VMINT peak; + + /*the number of memory malloc fail*/ + VMINT fail_times; + + /* the max size that malloc memory failed */ + VMINT max_fail_size; + + /* current avail heap size */ + VMINT avail_heap_size; +} malloc_stat_t; + + + +typedef VMUINT32 VMCOLOR32;/*VMUINT32*/ + +typedef float VMFLOAT;/*float*/ + +typedef VMINT32 VMMSEC;/*VMINT32*/ + +typedef VMINT32 VMRESID;/*VMINT32*/ + +typedef VMINT32 VMID;/*VMINT32*/ + +#define VM_TRUE TRUE/*VM_TRUE*/ +#define VM_FALSE FALSE/*VM_FALSE*/ + +/* DOM-NOT_FOR_SDK-BEGIN */ +/***************************************************************************** + * FUNCTION + * vm_get_malloc_stat + * DESCRIPTION + * get current memory management data after the memory management is available + * PARAMETERS + * void + * RETURNS + * the memory status structure pointer + *****************************************************************************/ +malloc_stat_t* vm_get_malloc_stat(void); +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** +* FUNCTION + * vm_malloc + * DESCRIPTION + * allocate specified size of memory + * PARAMETERS + * size : [IN] size of byte to be allocated. + * RETURNS + * memory pointer allocated, NULL means allocation failed. +*****************************************************************************/ +void *vm_malloc(int size); + +/***************************************************************************** +* FUNCTION + * vm_calloc + * DESCRIPTION + * allocate specified size of memory and clean as zero. + * PARAMETERS + * size : [IN] size of byte to be allocated. + * RETURNS + * memory pointer allocated, NULL means allocation failed. +*****************************************************************************/ +void *vm_calloc(int size); + +/***************************************************************************** +* FUNCTION + * vm_realloc + * DESCRIPTION + * reallocate specified size of memory for the memory already allocated before. + * PARAMETERS + * p : [IN] memory pointer to be realloced. + * size : [IN] size of byte to be allocated. + * RETURNS + * memory pointer allocated; NULL means allocation failed, but the original pointer will not free. +*****************************************************************************/ +void *vm_realloc(void* p, int size); + +/***************************************************************************** +* FUNCTION + * vm_free + * DESCRIPTION + * free memory allocated by vm_malloc(), vm_calloc(), or vm_realloc(). + * PARAMETERS + * ptr : [IN] memory pointer to be free. +*****************************************************************************/ +void vm_free(void* ptr); + +/* DOM-NOT_FOR_SDK-BEGIN */ +/***************************************************************************** +* FUNCTION + * vm_global_malloc + * DESCRIPTION + * allocate extra memory excluding the size announced when packing, size must larger than 10KB. + * PARAMETERS + * size : [IN] size of byte to be allocated. + * RETURNS + * memory pointer allocated, NULL means allocation failed. +*****************************************************************************/ +void *vm_global_malloc(unsigned int size); +/***************************************************************************** +* FUNCTION + * vm_free + * DESCRIPTION + * free memory allocated by vm_global_malloc(); + * PARAMETERS + * ptr : [IN] memory pointer to be free. +*****************************************************************************/ +void vm_global_free(void* ptr); + +/***************************************************************************** +* FUNCTION + * vm_global_get_max_alloc_size + * DESCRIPTION + * Get the max possible size of single allocation from app-based ASM. + * + * Remark: we can use this function to dynamically decide the allocation size + * (for example, use larger image cache when there is more memory) + * + * However, sometimes we cannot allocate 2 * 10KB blocks if the maximum allocation size + * is 20KB because of the overheads of memory management bookkeeping. + * + * It is suggested to use "fail-safe" allocation regardless the internal + * implementation of ASM if we want to allocate more memory adaptively according + * to the free space + * Step 1. Decide the size of free space => e.g. 100KB + * Step 2. Allocate 100KB + * Step 3. If failed, allocate 95 KB + * Step 4. If failed, allocate 90 KB + * Step 5. ... + * PARAMETERS + * void + * RETURNS + * memory size +*****************************************************************************/ +VMINT vm_global_get_max_alloc_size(void); + +/***************************************************************************** +* FUNCTION + * vm_malloc + * DESCRIPTION + * allocate non-cacheable memory + * PARAMETERS + * size : [IN] size of byte to be allocated. + * RETURNS + * memory pointer allocated, NULL means allocation failed. +*****************************************************************************/ +void *vm_malloc_nc(int size); +/***************************************************************************** +* FUNCTION + * vm_malloc_nc_topmost + * DESCRIPTION + * allocate specified size of non-cachable memory from topmost address + * PARAMETERS + * size : [IN] size of byte to be allocated. + * RETURNS + * memory pointer allocated, NULL means allocation failed. +*****************************************************************************/ +void *vm_malloc_nc_topmost(int size); + +typedef enum +{ + VM_SLA_STOP, + VM_SLA_START, + VM_SLA_LABEL +} vm_sla_action_type; + +/***************************************************************************** +* FUNCTION + * vm_sla_custom_logging + * DESCRIPTION + * SWLA custom logging function + * PARAMETERS + * custom_label : [IN] the custom label. + * action : [IN] the logging action +*****************************************************************************/ +void vm_sla_custom_logging(VMSTR custom_label, vm_sla_action_type action); + +#define vm_get_mre_total_mem_size vm_get_total_mem_size +/* DOM-NOT_FOR_SDK-END */ + +/***************************************************************************** + * FUNCTION + * vm_get_total_mem_size + * DESCRIPTION + * get LinkIt total memory size + * PARAMETERS + * + * RETURNS + * memory size + *****************************************************************************/ +VMUINT vm_get_total_mem_size(void); + +/***************************************************************************** +* FUNCTION + * vm_malloc_nc_topmost + * DESCRIPTION + * allocate specified size of memory from topmost address + * PARAMETERS + * size : [IN] size of byte to be allocated. + * RETURNS + * memory pointer allocated, NULL means allocation failed. +*****************************************************************************/ +void *vm_malloc_topmost(int size); + +/***************************************************************************** +* FUNCTION + * vm_malloc_nc_topmost + * DESCRIPTION + * re-allocate specified size of memory from topmost address + * PARAMETERS + * size : [IN] size of byte to be allocated. + * RETURNS + * memory pointer allocated, NULL means allocation failed. +*****************************************************************************/ +void *vm_realloc_topmost(void * p,int size); + +#ifdef __cplusplus +} +#endif + +#endif /* VMSYS_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtcp.h b/hardware/arduino/mtk/system/libmtk/include/vmtcp.h new file mode 100644 index 00000000..71c618d1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtcp.h @@ -0,0 +1,961 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMTCP_SDK_H +#define VMTCP_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* tcp connected */ +#define VM_TCP_EVT_CONNECTED 1 + +/* write status */ +#define VM_TCP_EVT_CAN_WRITE 2 + +/* read status */ +#define VM_TCP_EVT_CAN_READ 3 + +/* broken status */ +#define VM_TCP_EVT_PIPE_BROKEN 4 + +/* not find host */ +#define VM_TCP_EVT_HOST_NOT_FOUND 5 + +/* tcp pipe closed */ +#define VM_TCP_EVT_PIPE_CLOSED 6 + +/* no enough resource to create tcp connection */ +#define VM_TCP_ERR_NO_ENOUGH_RES -1 + +/* create tcp connection failed */ +#define VM_TCP_ERR_CREATE_FAILED -2 + +/* use cmnet to connect */ +#define VM_TCP_APN_CMNET (1) + +/* use cmwap to connect */ +#define VM_TCP_APN_CMWAP (2) + +/* use wifi to connect */ +#define VM_TCP_APN_WIFI (3) + +/* only use cmnet to connect */ +#define VM_TCP_APN_CMNET_ONLY (4) + +/* only use cmwap to connect */ +#define VM_TCP_APN_CMWAP_ONLY (5) + +/* only use when conbined with vm_dtacct_set */ +//#define VM_APN_USER_DEFINE (6) + +/* wifi hot spot account id */ +#define VM_APN_WIFI_HS (7) + +/* wifi ap mode account id */ +#define VM_APN_AP_MODE (8) + + + + +/***************************************************************************** + * FUNCTION + * vm_tcp_connect + * DESCRIPTION + * create tcp connection. + * PARAMETERS + * host : [IN] dest host ip. + * port : [IN] dest host port. + * apn : [IN] apn id, only support VM_TCP_APN_CMNET,VM_TCP_APN_CMWAP,VM_TCP_APN_WIFI. + * callback : [IN] callback function for tcp connection. + * RETURNS + * create tcp success or not. + * RETURN VALUES + * tcp handle, if value >=0, that is right, else is wrong + * EXAMPLE + * + * static VMINT g_hl_tcp_hd; + * void hl_tcp_connect(void) + * { + * vm_enable_proxy(FALSE); + * g_hl_tcp_hd = vm_tcp_connect("www.mediatek.com", 80, VM_TCP_APN_CMNET, hl_tcp_conn_cb); + * } + * +*****************************************************************************/ +VMINT vm_tcp_connect(const char* host, const VMINT port, const VMINT apn, + void (*callback)(VMINT handle, VMINT event)); + +/***************************************************************************** + * FUNCTION + * vm_tcp_connect + * DESCRIPTION + * create tcp connection. + * PARAMETERS + * host : [IN] dest host ip. + * port : [IN] dest host port. + * apn : [IN] apn id, only support VM_TCP_APN_CMNET,VM_TCP_APN_CMWAP,VM_TCP_APN_WIFI. + * user_data : [IN] user_data. + * callback : [IN] callback function for tcp connection. + * RETURNS + * create tcp success or not. + * RETURN VALUES + * tcp handle, if value >=0, that is right, else is wrong + * EXAMPLE + * + * static VMINT g_hl_tcp_hd; + * void hl_tcp_conn_cb_ex(VMINT handle, VMINT event, void* user_data) + * { + * char* my_data = (char*)user_data; + * switch (event) + * { + * case VM_TCP_EVT_CONNECTED: + * vm_tcp_close(handle); + * return; + * default: + * return; + * } + * } + * void hl_tcp_connect(void) + * { + * char* my_data; + * my_data = (char*)vm_malloc(10); + * strcpy(my_data, "aa"); + * vm_enable_proxy(FALSE); + * g_hl_tcp_hd = vm_tcp_connect_ex("www.mediatek.com", 80, VM_TCP_APN_CMNET, (void*)my_data, hl_tcp_conn_cb_ex); + * } + * +*****************************************************************************/ +VMINT vm_tcp_connect_ex(const char* host, const VMINT port, const VMINT apn, void *user_data, + void (*callback)(VMINT handle, VMINT event, void *user_data)); + + +/***************************************************************************** + * FUNCTION + * vm_tcp_close + * DESCRIPTION + * close tcp connection. + * PARAMETERS + * handle : [IN] tcp handle. + * EXAMPLE + * + * void hl_tcp_conn_cb(VMINT handle, VMINT event) + * { + * switch (event) + * { + * case VM_TCP_EVT_CONNECTED: + * vm_tcp_close(handle); + * return; + * default: + * return; + * } + * } + * +*****************************************************************************/ +void vm_tcp_close(VMINT handle); + +#define VM_TCP_READ_EOF (-1) + +/***************************************************************************** + * FUNCTION + * vm_tcp_read + * DESCRIPTION + * read data from tcp connection. + * PARAMETERS + * handle : [IN] tcp handle. + * buf : [OUT] data buffer. + * len : [OUT] data length. + * RETURNS + * read data size. + * RETURN VALUES + * read size, if value = VM_TCP_READ_EOF, means finishing reading. + * EXAMPLE + * + * void hl_tcp_conn_cb(VMINT handle, VMINT event) + * { + * char buf[100]; + * VMINT nread, nwrite; + * switch (event) + * { + * case VM_TCP_EVT_CONNECTED: + * nwrite = vm_tcp_write( + * handle, + * "GET www.mediatek.com HTTP/1.1\r\nHost: www.mediatek.com\r\n\r\n", + * strlen("GET www.mediatek.com HTTP/1.1\r\nHost: www.mediatek.com\r\n\r\n")); + * break; + * case VM_TCP_EVT_CAN_READ: + * memset(buf, 0, 100); + * nread = vm_tcp_read(handle, buf, 100); + * vm_tcp_close(handle); + * return; + * default: + * return; + * } + * return; + * } + * +*****************************************************************************/ +VMINT vm_tcp_read(VMINT handle, void* buf, VMINT len); + +/***************************************************************************** + * FUNCTION + * vm_tcp_write + * DESCRIPTION + * write data to tcp connection. + * PARAMETERS + * handle : [IN] tcp handle. + * buf : [IN] data to write. + * len : [IN] data length. + * RETURNS + * write data success or not. + * RETURN VALUES + * if value >= 0 , it is right, else is wrong. + * EXAMPLE + * + * void hl_tcp_conn_cb(VMINT handle, VMINT event) + * { + * VMINT nwrite; + * switch (event) + * { + * case VM_TCP_EVT_CONNECTED: + * nwrite = vm_tcp_write( + * handle, + * "GET www.mediatek.com HTTP/1.1\r\nHost: www.mediatek.com\r\n\r\n", + * strlen("GET www.mediatek.com HTTP/1.1\r\nHost: www.mediatek.com\r\n\r\n")); + * break; + * default: + * return; + * } + * return; + * } + * +*****************************************************************************/ +VMINT vm_tcp_write(VMINT handle, void* buf, VMINT len); + +VMINT vm_tcp_get_soc_id(VMINT hdl); + +/***************************************************************************** + * FUNCTION + * vm_tcp_connect_sync + * DESCRIPTION + * create tcp connection. + * PARAMETERS + * pi: [IN] dest host ip. format is "123.123.123.123" + * port : [IN] dest host port. + * apn : [IN] apn id. + * RETURNS + * create tcp success or not. + * RETURN VALUES + * tcp handle, if value >=0, that is right, else is wrong + * EXAMPLE + * + * static VMINT g_tcp_sync_hd; + * void hl_tcp_sync(void) + * { + * g_tcp_sync_hd = vm_tcp_connect_sync("172.21.90.164", 80, VM_TCP_APN_CMNET); + * } + * +*****************************************************************************/ +VMINT vm_tcp_connect_sync(const char* ip, const VMINT port, VMINT apn); +/***************************************************************************** + * FUNCTION + * vm_tcp_read_sync + * DESCRIPTION + * read data from tcp connection. + * PARAMETERS + * handle : [IN] tcp handle. + * buf : [OUT] data buffer. + * len : [OUT] data length. + * RETURNS + * read data size. + * RETURN VALUES + * read size, if value = VM_TCP_READ_EOF, means finishing reading. + * EXAMPLE + * + * static VMINT g_tcp_sync_hd; + * void hl_tcp_sync(void) + * { + * VMINT read_data; + * VMBYTE buf[1024]; + * VMINT ret; + * g_tcp_sync_hd = vm_tcp_connect_sync("172.21.90.164", 80, VM_TCP_APN_CMNET); + * read_data = vm_tcp_read_sync(g_tcp_sync_hd, buf, 1024); + * ret = vm_tcp_close_sync(g_tcp_sync_hd); + * } + * +*****************************************************************************/ +VMINT vm_tcp_read_sync(VMINT handle, void* buf, VMINT len); +/***************************************************************************** + * FUNCTION + * vm_tcp_write_sync + * DESCRIPTION + * write data to tcp connection. + * PARAMETERS + * handle : [IN] tcp handle. + * buf : [IN] data to write. + * len : [IN] data length. + * RETURNS + * write data success or not. + * RETURN VALUES + * if value >= 0 , it is right, else is wrong. + * EXAMPLE + * + * static VMINT g_tcp_sync_hd; + * #define send ("GET / HTTP/1.1\r\nHost: www.mediatek.com:80\r\n\r\n") + * void hl_tcp_sync(void) + * { + * VMINT read_data; + * VMINT ret; + * g_tcp_sync_hd = vm_tcp_connect_sync("172.21.90.164", 80, VM_TCP_APN_CMNET); + * ret = vm_tcp_write_sync(g_tcp_sync_hd, send, strlen(send)); + * ret = vm_tcp_close_sync(g_tcp_sync_hd); + * } + * +*****************************************************************************/ +VMINT vm_tcp_write_sync(VMINT handle, void* buf, VMINT len); +/***************************************************************************** + * FUNCTION + * vm_tcp_close_sync + * DESCRIPTION + * close tcp connection. + * PARAMETERS + * handle : [IN] tcp handle. + * EXAMPLE + * + * static VMINT g_tcp_sync_hd; + * void hl_tcp_sync(void) + * { + * g_tcp_sync_hd = vm_tcp_connect_sync("172.21.90.164", 80, VM_TCP_APN_CMNET); + * ret = vm_tcp_close_sync(g_tcp_sync_hd); + * } + * +*****************************************************************************/ +VMINT vm_tcp_close_sync(VMINT handle); + +/* Http server event */ +typedef enum +{ + VM_SOC_SVR_EVT_ACCEPT, /* Notify for accept */ + VM_SOC_SVR_EVT_READ, /* Notify for read */ + VM_SOC_SVR_EVT_WRITE, /* Notify for write */ + VM_SOC_SVR_EVT_CLOSED, /* Notify for close */ + VM_SOC_SVR_EVT_ACTIVED, /* Notify for actived */ + VM_SOC_SVR_EVT_DEACTIVATED, /* Notify for deactived */ + VM_SOC_SVR_EVT_FAILED, /* Notify for failed */ + VM_SOC_SVR_EVT_MAX +}vm_http_server_evt_t; + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_init + * DESCRIPTION + * Initiate server socket + * PARAMETERS + * apn : [IN] apn id. + * port: [IN] the port of server + * user_data: [IN] user's data, engine can pass it to callback + * callback: [IN] app's callback function + * RETURNS + * if successed return server handle, else return error code + * EXAMPLE + * + * static VMINT svr_async_hdl; + * static VMINT clt_async_hdl; + * #define MAX_SIZE 1024*2 + * VMBYTE buf[MAX_SIZE] = {0}; + * static void svr_callback_async_cb(VMINT handle, VMINT event, VMINT param, void *user_data) + * { + * + * if (handle == svr_async_hdl || -8 == svr_async_hdl) + * { + * vm_trace("evt[%d]", event); + * + * switch (event) + * { + * case VM_SOC_SVR_EVT_ACTIVED: + * { + * svr_async_hdl = handle; + * vm_trace("ACTIVED"); + * vm_trace("[async svr] shdl[%d] [%d]", svr_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_ACCEPT: + * { + * clt_async_hdl = param; + * vm_trace("ACCEPTED"); + * vm_trace("[async svr] chdl[%d] [%d]", clt_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_READ: + * { + * VMINT ret = 0; + * ret = vm_soc_svr_read(svr_async_hdl, clt_async_hdl, buf, MAX_SIZE); + * vm_trace("READ [%d/%d]", ret, MAX_SIZE); + * ret = vm_soc_svr_send(svr_async_hdl, clt_async_hdl, "abc", 3); + * vm_trace("SENT [%d]", ret); + * vm_soc_svr_close_client(clt_async_hdl); + * } + * break; + * case VM_SOC_SVR_EVT_WRITE: + * break; + * case VM_SOC_SVR_EVT_CLOSED: + * break; + * default: + * break; + * } + * } + * } + * void hl_tcp_srv(void) + * { + * svr_async_hdl = vm_soc_svr_init(1, 3501, (void*)1, svr_callback_async_cb); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_init(VMINT apn, VMINT port, void *user_data, void (*callback)(VMINT handle, VMINT event, VMINT param, void *user_data)); + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_send + * DESCRIPTION + * Send data + * PARAMETERS + * s_hdl : [IN]server handle. + * c_hdl: [IN] client handle. + * data: [IN] data to be sent + * len: [IN] data length + * RETURNS + * if >=0 means number of bytes sent, else send failed + * EXAMPLE + * + * static VMINT svr_async_hdl; + * static VMINT clt_async_hdl; + * #define MAX_SIZE 1024*2 + * VMBYTE buf[MAX_SIZE] = {0}; + * static void svr_callback_async_cb(VMINT handle, VMINT event, VMINT param, void *user_data) + * { + * + * if (handle == svr_async_hdl || -8 == svr_async_hdl) + * { + * vm_trace("evt[%d]", event); + * + * switch (event) + * { + * case VM_SOC_SVR_EVT_ACTIVED: + * { + * svr_async_hdl = handle; + * vm_trace("ACTIVED"); + * vm_trace("[async svr] shdl[%d] [%d]", svr_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_ACCEPT: + * { + * clt_async_hdl = param; + * vm_trace("ACCEPTED"); + * vm_trace("[async svr] chdl[%d] [%d]", clt_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_READ: + * { + * VMINT ret = 0; + * ret = vm_soc_svr_read(svr_async_hdl, clt_async_hdl, buf, MAX_SIZE); + * vm_trace("READ [%d/%d]", ret, MAX_SIZE); + * ret = vm_soc_svr_send(svr_async_hdl, clt_async_hdl, "abc", 3); + * vm_trace("SENT [%d]", ret); + * vm_soc_svr_close_client(clt_async_hdl); + * } + * break; + * case VM_SOC_SVR_EVT_WRITE: + * break; + * case VM_SOC_SVR_EVT_CLOSED: + * break; + * default: + * break; + * } + * } + * } + * void hl_tcp_srv(void) + * { + * svr_async_hdl = vm_soc_svr_init(1, 3501, (void*)1, svr_callback_async_cb); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_send(VMINT s_hdl, VMINT c_hdl, const void *data, VMUINT len); + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_read + * DESCRIPTION + * Read data + * PARAMETERS + * s_hdl : [IN]server handle. + * c_hdl: [IN] client handle. + * data: [IN] data to be sent + * len: [IN] data length + * RETURNS + * if >=0 means number of bytes received, else receive failed + * EXAMPLE + * + * static VMINT svr_async_hdl; + * static VMINT clt_async_hdl; + * #define MAX_SIZE 1024*2 + * VMBYTE buf[MAX_SIZE] = {0}; + * static void svr_callback_async_cb(VMINT handle, VMINT event, VMINT param, void *user_data) + * { + * + * if (handle == svr_async_hdl || -8 == svr_async_hdl) + * { + * vm_trace("evt[%d]", event); + * + * switch (event) + * { + * case VM_SOC_SVR_EVT_ACTIVED: + * { + * svr_async_hdl = handle; + * vm_trace("ACTIVED"); + * vm_trace("[async svr] shdl[%d] [%d]", svr_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_ACCEPT: + * { + * clt_async_hdl = param; + * vm_trace("ACCEPTED"); + * vm_trace("[async svr] chdl[%d] [%d]", clt_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_READ: + * { + * VMINT ret = 0; + * ret = vm_soc_svr_read(svr_async_hdl, clt_async_hdl, buf, MAX_SIZE); + * vm_trace("READ [%d/%d]", ret, MAX_SIZE); + * ret = vm_soc_svr_send(svr_async_hdl, clt_async_hdl, "abc", 3); + * vm_trace("SENT [%d]", ret); + * vm_soc_svr_close_client(clt_async_hdl); + * } + * break; + * case VM_SOC_SVR_EVT_WRITE: + * break; + * case VM_SOC_SVR_EVT_CLOSED: + * break; + * default: + * break; + * } + * } + * } + * void hl_tcp_srv(void) + * { + * svr_async_hdl = vm_soc_svr_init(1, 3501, (void*)1, svr_callback_async_cb); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_read(VMINT s_hdl, VMINT c_hdl, void *data, VMUINT len); + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_close_client + * DESCRIPTION + * Close client + * PARAMETERS + * c_hdl: [IN] client handle. + * RETURNS + * If return 0 means success, else fail. + * EXAMPLE + * + * static VMINT svr_async_hdl; + * static VMINT clt_async_hdl; + * #define MAX_SIZE 1024*2 + * VMBYTE buf[MAX_SIZE] = {0}; + * static void svr_callback_async_cb(VMINT handle, VMINT event, VMINT param, void *user_data) + * { + * + * if (handle == svr_async_hdl || -8 == svr_async_hdl) + * { + * vm_trace("evt[%d]", event); + * + * switch (event) + * { + * case VM_SOC_SVR_EVT_ACTIVED: + * { + * svr_async_hdl = handle; + * vm_trace("ACTIVED"); + * vm_trace("[async svr] shdl[%d] [%d]", svr_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_ACCEPT: + * { + * clt_async_hdl = param; + * vm_trace("ACCEPTED"); + * vm_trace("[async svr] chdl[%d] [%d]", clt_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_READ: + * { + * VMINT ret = 0; + * ret = vm_soc_svr_read(svr_async_hdl, clt_async_hdl, buf, MAX_SIZE); + * vm_trace("READ [%d/%d]", ret, MAX_SIZE); + * ret = vm_soc_svr_send(svr_async_hdl, clt_async_hdl, "abc", 3); + * vm_trace("SENT [%d]", ret); + * vm_soc_svr_close_client(clt_async_hdl); + * } + * break; + * case VM_SOC_SVR_EVT_WRITE: + * break; + * case VM_SOC_SVR_EVT_CLOSED: + * break; + * default: + * break; + * } + * } + * } + * void hl_tcp_srv(void) + * { + * svr_async_hdl = vm_soc_svr_init(1, 3501, (void*)1, svr_callback_async_cb); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_close_client(VMINT c_hdl); + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_deinit + * DESCRIPTION + * Deinit socket server + * PARAMETERS + * handle: [IN] server handle. + * RETURNS + * 0 + * EXAMPLE + * + * static VMINT svr_async_hdl; + * static VMINT clt_async_hdl; + * #define MAX_SIZE 1024*2 + * VMBYTE buf[MAX_SIZE] = {0}; + * static void svr_callback_async_cb(VMINT handle, VMINT event, VMINT param, void *user_data) + * { + * + * if (handle == svr_async_hdl || -8 == svr_async_hdl) + * { + * vm_trace("evt[%d]", event); + * + * switch (event) + * { + * case VM_SOC_SVR_EVT_ACTIVED: + * { + * svr_async_hdl = handle; + * vm_trace("ACTIVED"); + * vm_trace("[async svr] shdl[%d] [%d]", svr_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_ACCEPT: + * { + * clt_async_hdl = param; + * vm_trace("ACCEPTED"); + * vm_trace("[async svr] chdl[%d] [%d]", clt_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_READ: + * { + * VMINT ret = 0; + * ret = vm_soc_svr_read(svr_async_hdl, clt_async_hdl, buf, MAX_SIZE); + * vm_trace("READ [%d/%d]", ret, MAX_SIZE); + * ret = vm_soc_svr_send(svr_async_hdl, clt_async_hdl, "abc", 3); + * vm_trace("SENT [%d]", ret); + * vm_soc_svr_close_client(clt_async_hdl); + * vm_soc_svr_deinit(svr_async_hdl); + * } + * break; + * case VM_SOC_SVR_EVT_WRITE: + * break; + * case VM_SOC_SVR_EVT_CLOSED: + * break; + * default: + * break; + * } + * } + * } + * void hl_tcp_srv(void) + * { + * svr_async_hdl = vm_soc_svr_init(1, 3501, (void*)1, svr_callback_async_cb); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_deinit(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_get_soc_id + * DESCRIPTION + * Get the socket id of the server + * PARAMETERS + * handle: [IN] server handle. + * RETURNS + * return -2 if failed, else return the socket id + * EXAMPLE + * + * static VMINT svr_async_hdl; + * static VMINT clt_async_hdl; + * #define MAX_SIZE 1024*2 + * VMBYTE buf[MAX_SIZE] = {0}; + * static void svr_callback_async_cb(VMINT handle, VMINT event, VMINT param, void *user_data) + * { + * VMINT svr_soc_id; + * if (handle == svr_async_hdl || -8 == svr_async_hdl) + * { + * vm_trace("evt[%d]", event); + * + * switch (event) + * { + * case VM_SOC_SVR_EVT_ACTIVED: + * { + * svr_async_hdl = handle; + * svr_soc_id = vm_soc_svr_get_soc_id(svr_async_hdl); + * vm_trace("ACTIVED"); + * vm_trace("[async svr] shdl[%d] soc_id[%d] [%d]", svr_async_hdl, svr_soc_id, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_ACCEPT: + * { + * clt_async_hdl = param; + * vm_trace("ACCEPTED"); + * vm_trace("[async svr] chdl[%d] [%d]", clt_async_hdl, (VMINT)user_data); + * } + * break; + * case VM_SOC_SVR_EVT_READ: + * { + * VMINT ret = 0; + * ret = vm_soc_svr_read(svr_async_hdl, clt_async_hdl, buf, MAX_SIZE); + * vm_trace("READ [%d/%d]", ret, MAX_SIZE); + * ret = vm_soc_svr_send(svr_async_hdl, clt_async_hdl, "abc", 3); + * vm_trace("SENT [%d]", ret); + * vm_soc_svr_close_client(clt_async_hdl); + * vm_soc_svr_deinit(svr_async_hdl); + * } + * break; + * case VM_SOC_SVR_EVT_WRITE: + * break; + * case VM_SOC_SVR_EVT_CLOSED: + * break; + * default: + * break; + * } + * } + * } + * void hl_tcp_srv(void) + * { + * svr_async_hdl = vm_soc_svr_init(1, 3501, (void*)1, svr_callback_async_cb); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_get_soc_id(VMINT handle); + + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_init_sync + * DESCRIPTION + * Initiate socket server synchronously + * PARAMETERS + * apn: [IN] apn id. + * port: [IN] port number associate to the server. + * RETURNS + * if successed return server handle, else return error code + * EXAMPLE + * + * void hl_tcp_sync_srv(void) + * { + * vm_sockaddr_struct addr; + * VMINT ret; + * char buf[1024] = {0}; + * VMINT hdl_c; + * VMINT hdl_s = vm_soc_svr_init_sync(1, 3500); + * hdl_c = vm_soc_svr_accept_sync(hdl_s, &addr); + * ret = vm_soc_svr_read_sync(hdl_c, buf, 1024); + * ret = vm_soc_svr_send_sync(hdl_c, "aaa", 3); + * vm_soc_svr_close_client_sync(hdl_c); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_init_sync(VMINT apn, VMINT port); + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_accept_sync + * DESCRIPTION + * Waits for the incoming connections and return a socket handle + * of new connection. + * PARAMETERS + * s_hdl: [IN] server handle. + * addr: [IN] address of foreign host + * RETURNS + * if successed return a socket handle, else return error code + * EXAMPLE + * + * void hl_tcp_sync_srv(void) + * { + * vm_sockaddr_struct addr; + * VMINT ret; + * char buf[1024] = {0}; + * VMINT hdl_c; + * VMINT hdl_s = vm_soc_svr_init_sync(1, 3500); + * hdl_c = vm_soc_svr_accept_sync(hdl_s, &addr); + * ret = vm_soc_svr_read_sync(hdl_c, buf, 1024); + * ret = vm_soc_svr_send_sync(hdl_c, "aaa", 3); + * vm_soc_svr_close_client_sync(hdl_c); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_accept_sync(VMINT s_hdl, vm_sockaddr_struct *addr); + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_send_sync + * DESCRIPTION + * sends data to a host which already connected previously. + * PARAMETERS + * c_hdl: [IN] apn id. + * data: [IN] data to be sent. + * len: [IN] data length + * RETURNS + * if >=0 means number of bytes sent, else sent failed + * EXAMPLE + * + * void hl_tcp_sync_srv(void) + * { + * vm_sockaddr_struct addr; + * VMINT ret; + * char buf[1024] = {0}; + * VMINT hdl_c; + * VMINT hdl_s = vm_soc_svr_init_sync(1, 3500); + * hdl_c = vm_soc_svr_accept_sync(hdl_s, &addr); + * ret = vm_soc_svr_read_sync(hdl_c, buf, 1024); + * ret = vm_soc_svr_send_sync(hdl_c, "aaa", 3); + * vm_soc_svr_close_client_sync(hdl_c); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_send_sync(VMINT c_hdl, const void *data, VMUINT len); + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_read_sync + * DESCRIPTION + * Read data synchronously + * PARAMETERS + * c_hdl: [IN] client handle. + * data: [IN] buffer for read data. + * len: [IN} buffer length + * RETURNS + * if >=0 means number of bytes read, else read failed + * EXAMPLE + * + * void hl_tcp_sync_srv(void) + * { + * vm_sockaddr_struct addr; + * VMINT ret; + * char buf[1024] = {0}; + * VMINT hdl_c; + * VMINT hdl_s = vm_soc_svr_init_sync(1, 3500); + * hdl_c = vm_soc_svr_accept_sync(hdl_s, &addr); + * ret = vm_soc_svr_read_sync(hdl_c, buf, 1024); + * ret = vm_soc_svr_send_sync(hdl_c, "aaa", 3); + * vm_soc_svr_close_client_sync(hdl_c); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_read_sync(VMINT c_hdl, void *data, VMUINT len); + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_close_client_sync + * DESCRIPTION + * Close client socket synchronously + * PARAMETERS + * c_hdl [IN] Client handle + * RETURNS + * If return 0 means success, else fail. + * EXAMPLE + * + * void hl_tcp_sync_srv(void) + * { + * vm_sockaddr_struct addr; + * VMINT ret; + * char buf[1024] = {0}; + * VMINT hdl_c; + * VMINT hdl_s = vm_soc_svr_init_sync(1, 3500); + * hdl_c = vm_soc_svr_accept_sync(hdl_s, &addr); + * ret = vm_soc_svr_read_sync(hdl_c, buf, 1024); + * ret = vm_soc_svr_send_sync(hdl_c, "aaa", 3); + * vm_soc_svr_close_client_sync(hdl_c); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_close_client_sync(VMINT c_hdl); + +/***************************************************************************** + * FUNCTION + * vm_soc_svr_deinit_sync + * DESCRIPTION + * Deinitiate socket server synchronously + * PARAMETERS + * s_hdl [IN] server handle + * RETURNS + * if return 0 means operate successfully, else failed + * EXAMPLE + * + * void hl_tcp_sync_srv(void) + * { + * vm_sockaddr_struct addr; + * VMINT ret; + * char buf[1024] = {0}; + * VMINT hdl_c; + * VMINT hdl_s = vm_soc_svr_init_sync(1, 3500); + * hdl_c = vm_soc_svr_accept_sync(hdl_s, &addr); + * ret = vm_soc_svr_read_sync(hdl_c, buf, 1024); + * ret = vm_soc_svr_send_sync(hdl_c, "aaa", 3); + * vm_soc_svr_close_client_sync(hdl_c); + * vm_soc_svr_deinit_sync(hdl_s); + * } + * +*****************************************************************************/ +VMINT vm_soc_svr_deinit_sync(VMINT s_hdl); + + +#ifdef __cplusplus +} +#endif + +#endif /* VMTCP_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtel.h b/hardware/arduino/mtk/system/libmtk/include/vmtel.h new file mode 100644 index 00000000..e5af7637 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtel.h @@ -0,0 +1,405 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMTEL_SDK_H +#define VMTEL_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + + +typedef enum +{ + VM_CALLOUT_ERR_STATE = -7, /* application is not foreground state */ + VM_CALLOUT_ERR_NO_SIM , /* No SIM */ + VM_CALLOUT_ERR_FLIGHT, /* flight mode */ + VM_CALLOUT_ERR_BUSY, /* device busy */ + VM_CALLOUT_ERR_PHONE_NUM, /* destination number error */ + VM_CALLOUT_ERR_PROCESS, /* process error */ + VM_CALLOUT_ERR_NO_RES, /* resource unavailable*/ + VM_CALLOUT_NO_ERR +}vm_callout_error_t; + +typedef enum +{ + VM_CALLOUT_IDEL = 0, + VM_CALLOUT_BUSY +}vm_callout_status_t; + +/***************************************************************************** +* +* + * FUNCTION + * VM_CALLOUT_RESPONSE_T + * DESCRIPTION + * callback function of callout + * PARAMETERS + * VMWSTR : [IN] destination phone number string encoding with UCS2 format + * VMINT : [IN] calling result. +*****************************************************************************/ +typedef void (*VM_CALLOUT_RESPONSE_T)(VMWSTR, VMINT); + +/***************************************************************************** +* FUNCTION + * vm_callout + * DESCRIPTION + * make call. + * Application can use this funtion only during foreground running and END key + * will be handled by call application for hang up calling firstly. + * PARAMETERS + * phnum : [IN] destination phone number string encoding with UCS2 format. +*****************************************************************************/ +void vm_callout(VMWSTR phnum); + +/***************************************************************************** +* FUNCTION + * vm_callout + * DESCRIPTION + * make call. + * Application can use this funtion only during foreground running and END key + * will be handled by call application for hang up calling firstly. + * PARAMETERS + * phnum : [IN] destination phone number string encoding with UCS2 format. + * callback : [IN] callback function +* RETURNS + * refer to vm_callout_error_t +*****************************************************************************/ +VMINT vm_callout_ex(VMWSTR phnum, VM_CALLOUT_RESPONSE_T callback); + + + +/***************************************************************************** + * FUNCTION + * vm_dialer_launch + * DESCRIPTION + * 1. Launch a dialer + * PARAMETERS + * phone_num : [IN] phone num, can be NULL + * RETURNS + * 0:success + *****************************************************************************/ +VMINT vm_dialer_launch(VMWSTR phone_num); + + +/** + *Open URL successfully + */ +#define VM_OPEN_WAP_URL_SUCCESS (0) +/** + * Parameter error + */ +#define VM_OPEN_WAP_URL_ERROR_PARAM (-1) +/** + * No WAP service + */ +#define VM_OPEN_WAP_URL_NO_SERVICE (-2) +/** + * Process not during foreground running + */ +#define VM_OPEN_WAP_URL_ERROR_STATUS (-3) + +/***************************************************************************** +* FUNCTION + * vm_open_wap_url + * DESCRIPTION + * Lauch WAP brower and go to specified address. + * PARAMETERS + * url : [IN] WAP address. + * RETURNS + * result of Open browser URL + * RETURN VALUES + * VM_OPEN_WAP_URL_SUCCESS : Open URL successfully. + * VM_OPEN_WAP_URL_ERROR_PARAM : Parameter error. + * VM_OPEN_WAP_URL_NO_SERVICE : No WAP service. + * VM_OPEN_WAP_URL_ERROR_STATUS : Process not during foreground running. + * +*****************************************************************************/ +VMINT vm_open_wap_url(VMWSTR url); + +typedef enum +{ + VM_IVR_FAIL = -1,//vm_ivr_call fail + VM_IVR_CALLED_OUT, //already called out + VM_IVR_INTERRUPT, //end by interrupt (incoming call) + VM_IVR_CALL_END, //call end normally +}vm_ivr_status_enum; + +typedef struct +{ + vm_ivr_status_enum status; + void* user_data; +}ivr_callback_data; + +typedef void (*vm_ivr_cb)(ivr_callback_data* data); + +typedef struct +{ + VMWSTR phone_num; //destination phone number + VMINT sim_card; //sim card: 1,2,3,4... + vm_ivr_cb callback; + void* user_data; +}vm_ivr_call_data; + +/***************************************************************************** +* FUNCTION + * vm_ivr_call + * DESCRIPTION + * start call in background + * PARAMETERS + * vm_ivr_call_data : [IN] + * RETURNS + * 0 means success, others fail +*****************************************************************************/ +VMINT vm_ivr_call(vm_ivr_call_data* data); + +/***************************************************************************** +* FUNCTION + * vm_ivr_dial_number + * DESCRIPTION + * dial number after vm_ivr_call invoked + * PARAMETERS + * number : [IN] number to dial. e.g. "3"; + * RETURNS + * 0 means success, others fail +*****************************************************************************/ +VMINT vm_ivr_dial_number(VMCHAR number); + +/***************************************************************************** +* FUNCTION + * vm_ivr_end + * DESCRIPTION + * end call start by vm_ivr_call + * PARAMETERS + * + * RETURNS + * 0 means success, others fail +*****************************************************************************/ +VMINT vm_ivr_end(void); + + +/* Maximum number length */ +#define VM_UCM_MAX_NUM_URI_LEN (41) + +/* Maximum error message length */ +#define VM_UCM_MAX_ERR_MSG_LEN (50) + +/* Maximum IP number length */ +#define VM_UCM_MAX_IP_NUMBER_LEN (10) + +/* UCM error cause enum */ +typedef enum +{ + VM_UCM_RESULT_OK, /* OK */ + VM_UCM_RESULT_UNSPECIFIED_ERROR, /* Unspecified error */ + VM_UCM_RESULT_CANCEL, /* Cancel */ + VM_UCM_RESULT_USER_ABORT, /* User abort */ + VM_UCM_RESULT_ACTION_NOT_ALLOWED, /* Action not allowed */ + VM_UCM_RESULT_NOT_ALLOWED_TO_DIAL, /* Not allowed to dial */ + VM_UCM_RESULT_NOT_ALLOWED_TO_ACCEPT, /* Not allowed to accept */ + VM_UCM_RESULT_NO_ACTIVE_CALL, /* No active call */ + VM_UCM_RESULT_CALLED_PARTY_BUSY, /* Called party busy */ + VM_UCM_RESULT_NETWORK_NOT_AVAILABLE, /* Network not available */ + VM_UCM_RESULT_CALLED_PARTY_NOT_ANSWERED, /* Called party not answered */ + VM_UCM_RESULT_SOS_NUMBER_ONLY, /* SOS number only */ + VM_UCM_RESULT_INVALID_NUMBER, /* Invalid number */ + VM_UCM_RESULT_EMPTY_NUMBER, /* Empty number */ + VM_UCM_RESULT_SOS_CALL_EXISTS, /* Exist SOS call */ + VM_UCM_RESULT_PREFERRED_MODE_PROHIBIT, /* Preferred mode prohibit */ + VM_UCM_RESULT_FLIGHT_MODE_PROHIBIT, /* Flight mode prohibit */ + VM_UCM_RESULT_LOW_BATTERY, /* Low battery */ + VM_UCM_RESULT_UCM_BUSY, /* Busy */ + VM_UCM_RESULT_VT_FALLBACK, /* VT fallback */ + VM_UCM_RESULT_END_OF_ENUM /* end of the enum */ +} vm_ucm_result_enum; + + + +/* Indication opcode enum */ +typedef enum +{ + VM_UCM_INCOMING_CALL_IND = 0,//incomming + VM_UCM_OUTGOING_CALL_IND, //outcomming + VM_UCM_CALL_END, //call end normally +}vm_ucm_ind_opcode_enum; + +/* Call id struct, should be unique */ +typedef struct +{ + vm_ucm_ind_opcode_enum call_type; /* Call type */ + VMUINT16 group_id; /* group id */ + VMUINT16 call_id; /* call id*/ +} vm_ucm_id_info_struct; + +typedef struct +{ + vm_ucm_id_info_struct uid_info; /* Call id */ + VMUINT8 num_uri[VM_UCM_MAX_NUM_URI_LEN + 1]; /* Number, ascii */ +} vm_ucm_incoming_call_ind_struct; + + +/* Outgoing call indication struct */ +typedef struct +{ + vm_ucm_id_info_struct uid_info; /* Call id */ + VMUINT8 num_uri[VM_UCM_MAX_NUM_URI_LEN + 1]; /* Number, ascii */ +} vm_ucm_outgoing_call_ind_struct; + +/* Listen call event callback structure */ +typedef struct +{ + vm_ucm_ind_opcode_enum type_op; // vm_call_type incomming ,outcomming + void* data; //data of the event +}vm_call_listener_data; + +typedef void (*vm_call_listener_func)(vm_call_listener_data* data); + + + +/* Action opcode enum */ +typedef enum +{ + VM_UCM_NO_ACT = 0, /* No action */ + VM_UCM_DIAL_ACT, /* Dial action, vm_ucm_dial_act_req_struct, vm_ucm_act_rsp_struct*/ + VM_UCM_ACCEPT_ACT, /* Accept action, vm_ucm_single_call_act_req_struct, vm_ucm_act_rsp_struct*/ + VM_UCM_HOLD_ACT, /* Hold action, vm_ucm_single_group_act_req_struct, vm_ucm_act_rsp_struct*/ + VM_UCM_END_SINGLE_ACT, /* End single action, vm_ucm_single_call_act_req_struct, vm_ucm_act_rsp_struct */ +}vm_call_action_type; + +/* Call type enum */ +typedef enum +{ + VM_UCM_VOICE_CALL_TYPE = 0x0001, /* SIM1 voice call type */ + VM_UCM_VOICE_CALL_TYPE_SIM2 = 0x0020, /* SIM2 voice call type */ + VM_UCM_VOICE_CALL_TYPE_SIM3 = 0x0200, /* SIM3 voice call type */ + VM_UCM_VOICE_CALL_TYPE_SIM4 = 0x1000, /* SIM4 voice call type */ +} vm_ucm_call_type_enum; + + + +/* action struct VM_UCM_DIAL_ACT */ +typedef struct +{ + vm_ucm_call_type_enum call_type; /* Call type */ + VMUINT16 num_uri[VM_UCM_MAX_NUM_URI_LEN + 1]; /* Number, ucs2 */ + VMUINT8 module_id; /* Initiate module id, set 0 as default */ + VMBOOL is_ip_dial; /* IP dial, currently only for GSM&3G, set 0 as default */ + void *phb_data; /* Bypass phonebook data for call service to query caller info. set NULL as default*/ +} vm_ucm_dial_act_req_struct; + +/* action struct VM_UCM_ACCEPT_ACT & VM_UCM_END_SINGLE_ACT */ +typedef struct +{ + vm_ucm_id_info_struct action_uid; /* Call id */ +} vm_ucm_single_call_act_req_struct; + +/* action struct VM_UCM_HOLD_ACT */ +typedef struct +{ + vm_ucm_call_type_enum call_type; /* Call type */ + VMUINT16 action_group; /* Group id */ +} vm_ucm_single_group_act_req_struct; + + + + +/* Action CALLBACK structure */ +typedef struct +{ + vm_ucm_result_enum result; /* Result */ + VMUINT16 error_msg[VM_UCM_MAX_ERR_MSG_LEN + 1]; /* Recommand error message, ucs2 */ +} vm_ucm_result_info_struct; + +typedef struct +{ + vm_ucm_result_info_struct result_info; /* Result */ + VMBOOL no_counter; /* Start to count duration or not, only for accept action */ +} vm_ucm_act_rsp_struct; + +typedef struct +{ + vm_call_action_type type_act; // action type accept ,hold on, end + vm_ucm_act_rsp_struct data_act_rsp; //data of the action callback struct + void* userdata; //userdata of APP +}vm_call_actions_callback_data; + +typedef void (*vm_call_actions_func)(vm_call_actions_callback_data* data); + + + +/* Action structure */ +typedef struct +{ + vm_call_action_type type_act; // action type accept ,hold on, end + void* data_act; //data of the action struct + void* userdata; //user data of APP + vm_call_actions_func callback; //callback function of the action +}vm_call_actions_data; + + + +/***************************************************************************** +* FUNCTION + * vm_call_reg_listener + * DESCRIPTION + * APP use this function to register a callback function to listen call events + * PARAMETERS + * func : [IN] callback functions, reference vm_call_listener_func +* RETURNS + * 0 is success +*****************************************************************************/ +VMINT vm_call_reg_listener(vm_call_listener_func func); + + +/***************************************************************************** +* FUNCTION + * vm_call_actions + * DESCRIPTION + * APP use this function to control call progress, accept a incoming call, + * or hold on/ hung up a going call + * PARAMETERS + * data : [IN] Action command , please reference vm_call_actions_data +* RETURNS + * 0 is success +*****************************************************************************/ +VMINT vm_call_actions(const vm_call_actions_data* data); + +#ifdef __cplusplus +} +#endif + +#endif /* VMTEL_SDK_H */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmthread.h b/hardware/arduino/mtk/system/libmtk/include/vmthread.h new file mode 100644 index 00000000..b135d383 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmthread.h @@ -0,0 +1,618 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmthread_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ + * $Log$ + * + * 01 24 2014 zhiwei.yang + * [MAUI_03477387] [Blocking]Stuck on uploading screen while uploading image from file manager + * . + * + * 01 20 2014 xiufeng.zhang + * [MAUI_03479763] [IOT]Merge IOT code to 11C + * . + * + * 01 20 2014 xiufeng.zhang + * [MAUI_03479763] [IOT]Merge IOT code to 11C + * . + * + * 01 17 2014 xiufeng.zhang + * [MAUI_03479763] [IOT]Merge IOT code to 11C + * . + * + * *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== + *******************************************************************************/ + +#ifndef VMTHREAD_SDK_H +#define VMTHREAD_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + + +/* thread handle, return by vm_thread_create */ +#define VM_THREAD_HANDLE VMUINT32 + +/* signal id, return by vm_signal_init */ +#define VM_SIGNAL_ID VMUINT32 + +/* wake up by the signal */ +#define VM_SIGNAL_RESULT_SUCCESS 0 +/* time out */ +#define VM_SIGNAL_RESULT_TIMEOUT 1 +/* wake up forcely without the signal */ +#define VM_SIGNAL_RESULT_CANCEL 2 + + +/* used for storing message. */ +typedef struct +{ + VMUINT16 message_id; /* the value of message id */ + void* user_data; /* the content data of the message */ +}VM_MSG_STRUCT; + +typedef struct +{ + VMUINT8 unused; +}*vm_taskid; + + +typedef struct _vm_mutex_list_note +{ + VMUINT8 unused; +}vm_mutex_list_note; + +/* used for creating mutex. */ +typedef struct +{ + VMUINT32 guard; /* system used, initialyze when ivoking vm_mutex_create. */ + vm_mutex_list_note* mutex_info; /* system used, initialyze when ivoking vm_mutex_create. */ +}vm_thread_mutex_struct; + + +/***************************************************************************** + * FUNCTION + * VM_THREAD_FUNC + * DESCRIPTION + * Thread main function type, and the thread will be closed when it returned. + * PARAMETERS + * thread_handle [IN] The thread handler, used for thread management + * user_data [IN] The create param transfer to main function. + * RETURNS + * return + *****************************************************************************/ +typedef VMINT32 (*VM_THREAD_FUNC)(VM_THREAD_HANDLE thread_handle, void* user_data); + +/***************************************************************************** + * FUNCTION + * vm_thread_create + * DESCRIPTION + * used for create a thread. + * PARAMETERS + * thread_function [IN] The thread main function. + * data [IN] The param of thread_function. + * priority [IN] Thread priority, + * 1 is the highest priority, 255 is the lowest priority, and main thread's priority + * is higher than 129 and lower than 128. 0 is default priority lower than main thread. + * RETURNS + * return The handle of the creating thread. + * + * Example + * + * + * VMINT vm_sub_thread_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * //do_some_thing(); + * return 0; + * } + * + * vm_thread_create(vm_sub_thread_proc, NULL, 0 ); + * + * + *****************************************************************************/ +extern VM_THREAD_HANDLE vm_thread_create(VM_THREAD_FUNC thread_function, void* data,VMUINT8 priority); + +/***************************************************************************** + * FUNCTION + * vm_thread_get_current_handle + * DESCRIPTION + * used for get thread handle. this API does not support in main thread. + * PARAMETERS + * None + * RETURNS + * return The handle of current thread. + * SEE ALSO + * vm_thread_get_main_handle + *****************************************************************************/ +extern VM_THREAD_HANDLE vm_thread_get_current_handle(void); + +/***************************************************************************** + * FUNCTION + * vm_thread_get_main_handle + * DESCRIPTION + * used for get main thread handle. + * PARAMETERS + * None + * RETURNS + * return The handle of main thread. + * SEE ALSO + * vm_thread_get_current_handle + *****************************************************************************/ +extern VM_THREAD_HANDLE vm_thread_get_main_handle(void); + +/***************************************************************************** + * FUNCTION + * vm_thread_send_msg + * DESCRIPTION + * used for sending msg between threads. + * PARAMETERS + * thread [IN] The thread handler of reciever. + * msg_id [IN] The message id to be send. + * user_data [IN] The customer data of the message. + * RETURNS + * None. + * + * Example + * + * VMINT32 vm_sub_thread_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * VM_THREAD_HANDLE main_handle; + * //do_some_thing(); + * main_handle = vm_thread_get_main_handle(); + * vm_thread_send_msg(main_handle, MSG_ID_XXX, NULL); + * return 0; + * } + * + *****************************************************************************/ +extern void vm_thread_send_msg(VM_THREAD_HANDLE thread_handle, VMUINT32 msg_id, void* user_data); + +/***************************************************************************** + * FUNCTION + * vm_thread_get_msg + * DESCRIPTION + * used for read msg from ext msg queue, and it will be blocked if the queue is empty. + * PARAMETERS + * msg [OUT] The msg content. + * RETURNS + * None + * + * Example + * + * VMINT vm_sub_thread_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * VM_MSG_STRUCT msg; + * + * vm_thread_get_msg(&msg); + * if (msg.message_id == MSG_ID_XXX) + * { + * //do_some_thing(); + * } + * return 0; + * } + * + *****************************************************************************/ +extern void vm_thread_get_msg(VM_MSG_STRUCT* msg); + +/***************************************************************************** + * FUNCTION + * vm_signal_init + * DESCRIPTION + * Initial a signal for thread communication. + * PARAMETERS + * None + * RETURNS + * The signal id of create. + * + * Example + * + * VM_SIGNAL_ID s_id; + * + * + * VMINT vm_sub_thread_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * //do_some_thing(); + * + * // wait main thread handle MSG_ID_XXX. + * vm_signal_wait(s_id); + * do_other_thing(); + * return 0; + * } + * + * void handle_sysevt(VMINT message, VMINT param) + * { + * switch (message) + * { + * case VM_MSG_CREATE: + * //create signal. + * s_id = vm_signal_init(); + * sub_thread_proc(vm_sub_thread_proc, NULL, 0 ); + * + * break; + * case VM_MSG_QUIT: + * //release signal. + * vm_signal_deinit(s_id); + * break; + * case VM_MSG_XXX: + * handle_xxx_msg(); + * //post signal + * vm_signal_post(s_id); + * break; + * } + * } + * } + * + * + *****************************************************************************/ +extern VM_SIGNAL_ID vm_signal_init(void); + +/***************************************************************************** + * FUNCTION + * vm_signal_clean + * DESCRIPTION + * The id of the signal which was clean. + * PARAMETERS + * None + * RETURNS + * The signal id of create. + *****************************************************************************/ +extern void vm_signal_clean(VM_SIGNAL_ID s_id); + +/***************************************************************************** + * FUNCTION + * vm_signal_post + * DESCRIPTION + * post a signal then all the threads, which are waiting for it, will be waken up. + * the signal id is get from vm_signal_init(void) + * PARAMETERS + * The id of the signal which was post. + * RETURNS + * None. + * EXAMPLE + * + * VM_SIGNAL_ID s_id; + * + * + * VMINT vm_sub_thread_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * //do_some_thing(); + * + * // wait main thread handle MSG_ID_XXX. + * vm_signal_wait(s_id); + * do_other_thing(); + * return 0; + * } + * + * void handle_sysevt(VMINT message, VMINT param) + * { + * switch (message) + * { + * case VM_MSG_CREATE: + * //create signal. + * s_id = vm_signal_init(); + * sub_thread_proc(vm_sub_thread_proc, NULL, 0 ); + * + * break; + * case VM_MSG_QUIT: + * //release signal. + * vm_signal_deinit(s_id); + * break; + * case VM_MSG_XXX: + * handle_xxx_msg(); + * //post signal + * vm_signal_post(s_id); + * break; + * } + * } + * } + * + * + *****************************************************************************/ +extern void vm_signal_post(VM_SIGNAL_ID s_id); + +/***************************************************************************** + * FUNCTION + * vm_signal_wait + * DESCRIPTION + * wait a signal then the thread will getting blocking if the signal was not set. + * then it will geting wake up when other thread post the signal. + * and this API only support in sub-thread, it can't be invoke from main thread. + * PARAMETERS + * the waiting for signal id. + * RETURNS + * VM_SIGNAL_RESULT_SUCCESS, if it is wake up by the signal. + * VM_SIGNAL_RESULT_CANCEL, if it is wake up forcely without the signal, FW doesn't suply force waking up API. + * EXAMPLE + * + * VM_SIGNAL_ID s_id; + * + * + * VMINT vm_sub_thread_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * //do_some_thing(); + * + * // wait main thread handle MSG_ID_XXX. + * vm_signal_wait(s_id); + * do_other_thing(); + * return 0; + * } + * + * void handle_sysevt(VMINT message, VMINT param) + * { + * switch (message) + * { + * case VM_MSG_CREATE: + * //create signal. + * s_id = vm_signal_init(); + * sub_thread_proc(vm_sub_thread_proc, NULL, 0 ); + * + * break; + * case VM_MSG_QUIT: + * //release signal. + * vm_signal_deinit(s_id); + * break; + * case VM_MSG_XXX: + * handle_xxx_msg(); + * //post signal + * vm_signal_post(s_id); + * break; + * } + * } + * } + * + * + *****************************************************************************/ +extern VMINT32 vm_signal_wait(VM_SIGNAL_ID s_id); + +/***************************************************************************** + * FUNCTION + * vm_signal_timedwait + * DESCRIPTION + * wait a signal then the thread will getting blocking if the signal was not set. + * then it will geting wake up when other thread post the signal. + * and this API only support in sub-thread, it can't be invoke from main task. + * PARAMETERS + * s_id: [IN] the waiting for signal id. + * time_count: [IN] the max time to wait..(microsecond) + * RETURNS + * VM_SIGNAL_RESULT_SUCCESS, if it is wake up by the signal. + * VM_SIGNAL_RESULT_TIMEOUT, if time out. + * VM_SIGNAL_RESULT_CANCEL, if it is wake up forcely without the signal. + *****************************************************************************/ +extern VMINT32 vm_signal_timedwait(VM_SIGNAL_ID s_id, VMUINT32 time_count); + +/***************************************************************************** + * FUNCTION + * vm_signal_deinit + * DESCRIPTION + * destory a signal when app will not use it any more. + * PARAMETERS + * the signal id of deinit. + * RETURNS + * None + * EXAMPLE + * + * VM_SIGNAL_ID s_id; + * + * + * VMINT vm_sub_thread_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * //do_some_thing(); + * + * // wait main thread handle MSG_ID_XXX. + * vm_signal_wait(s_id); + * do_other_thing(); + * return 0; + * } + * + * void handle_sysevt(VMINT message, VMINT param) + * { + * switch (message) + * { + * case VM_MSG_CREATE: + * //create signal. + * s_id = vm_signal_init(); + * sub_thread_proc(vm_sub_thread_proc, NULL, 0 ); + * + * break; + * case VM_MSG_QUIT: + * //release signal. + * vm_signal_deinit(s_id); + * break; + * case VM_MSG_XXX: + * handle_xxx_msg(); + * //post signal + * vm_signal_post(s_id); + * break; + * } + * } + * } + * + * *****************************************************************************/ +extern void vm_signal_deinit(VM_SIGNAL_ID s_id); + +/***************************************************************************** + * FUNCTION + * vm_mutex_create + * DESCRIPTION + * create a mutex. And it need not destroy, + * PARAMETERS + * mutex : [OUT] the mutex that needs to create. + * RETURNS + * void + * Example + * + * static vm_thread_mutex_struct my_mutex; + * + * VMINT vm_sub_thread1_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * vm_mutex_create(&my_mutex); + * vm_mutex_lock(&my_mutex); + * //access global data; + * change_global_data(); + * vm_mutex_unlock(&my_mutex); + * } + * + * VMINT vm_sub_thread2_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * do_some_thing(); + * vm_mutex_lock(&my_mutex); //suppose my_mutex has already been created. + * //access global data; + * change_global_data(); + * vm_mutex_unlock(&my_mutex); + * } + * + *****************************************************************************/ +extern void vm_mutex_create(vm_thread_mutex_struct *mutex); + +/***************************************************************************** + * FUNCTION + * vm_mutex_lock + * DESCRIPTION + * get the mutex. + * PARAMETERS + * mutex : [IN] The mutex + * RETURNS + * void + * Example + * + * static vm_thread_mutex_struct my_mutex; + * + * VMINT vm_sub_thread1_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * vm_mutex_create(&my_mutex); + * vm_mutex_lock(&my_mutex); + * //access global data; + * change_global_data(); + * vm_mutex_unlock(&my_mutex); + * } + * + * VMINT vm_sub_thread2_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * do_some_thing(); + * vm_mutex_lock(&my_mutex); //suppose my_mutex has already been created. + * //access global data; + * change_global_data(); + * vm_mutex_unlock(&my_mutex); + * } + * + *****************************************************************************/ +extern void vm_mutex_lock(vm_thread_mutex_struct *mutex); + +/***************************************************************************** + * FUNCTION + * vm_mutex_unlock + * DESCRIPTION + * release the mutex. + * PARAMETERS + * mutex : [IN] The mutex + * RETURNS + * void + * Example + * + * static vm_thread_mutex_struct my_mutex; + * + * VMINT vm_sub_thread1_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * vm_mutex_create(&my_mutex); + * vm_mutex_lock(&my_mutex); + * //access global data; + * change_global_data(); + * vm_mutex_unlock(&my_mutex); + * } + * + * VMINT vm_sub_thread2_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * do_some_thing(); + * vm_mutex_lock(&my_mutex); //suppose my_mutex has already been created. + * //access global data; + * change_global_data(); + * vm_mutex_unlock(&my_mutex); + * } + * + *****************************************************************************/ +extern void vm_mutex_unlock(vm_thread_mutex_struct *mutex); + +/***************************************************************************** + * FUNCTION + * vm_thread_sleep + * DESCRIPTION + * sleep one thread. + * PARAMETERS + * timeout : [IN] time to sleep (milli_secs) + * RETURNS + * void + * + * + * VMINT vm_sub_thread_proc(VM_THREAD_HANDLE thread_handle, void* user_data) + * { + * //do someting + * vm_thread_sleep(3000); + * } + * + * + *****************************************************************************/ +extern void vm_thread_sleep(VMUINT32 timeout); + +#ifdef __cplusplus +} +#endif + +#endif /* VMXML_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtimer.h b/hardware/arduino/mtk/system/libmtk/include/vmtimer.h new file mode 100644 index 00000000..bf13b936 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtimer.h @@ -0,0 +1,227 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMTIMER_SDK_H_ +#define VMTIMER_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +typedef enum +{ + + VM_TIMER_MTK_TIMER_NO_FREE = -5, + VM_TIMER_ERROR_OF_PROCESS, + VM_TIMER_ERROR_OF_RES , + VM_TIMER_ERROR_OF_MEM , + VM_TIMER_ERROR , + VM_TIMER_OK +} vm_timer_error_t; + +typedef struct +{ + VMUINT8 unused; +}*vm_kal_timerid; + +/* prototype of timer callback function */ +typedef void (*vm_kal_timer_func_ptr)(void *param_ptr); + +/*callback function VM_TIMERPROC_T */ +typedef void (*VM_TIMERPROC_T)(VMINT tid); + +/***************************************************************************** + * FUNCTION + * vm_create_timer + * DESCRIPTION + * create timer. + * Once the timer is created, it will be looply called till user delete it. It is a non-aligned timer, so it is a precise timer and will be stopped + * when the LCD backlight is off. For one application , the max number of this kind of timer is 10 + * PARAMETERS + * millisec : [IN] the length if the interval. The unit of interval is millisecond + * timerproc : [IN] the callback function when the timer is over time + * RETURNS + * The timer handle,the handle >0 when succeed,otherwise, handle <0 + * EAMPLE + * + * void customer_timer_example_proc(VMINT tid) + * { + * static VMINT s_restore_num = 0; + * s_restore_num++; + * if(s_restore_num > 10) + * { + * vm_delete_timer(tid); + * } + * } + * + * void customer_run_timer(void) + * { + * VMINT timer_id = 0; + * timer_id = vm_create_timer(1000, (VM_TIMERPROC_T)customer_timer_example_proc); + * if(timer_id < 0) + * { + * vm_log_debug("customer_run_timer create timer fail"); + * } + * } + * + *****************************************************************************/ +VMINT vm_create_timer(VMUINT32 millisec, VM_TIMERPROC_T timerproc); + + +/***************************************************************************** + * FUNCTION + * vm_delete_timer + * DESCRIPTION + * delete the timer created by vm_create_timer + * PARAMETERS + * timerid : [IN] the timer handler + * RETURNS + * succeed when return 0,otherwise, fail + * EXAMPLE + * + * refer from vm_create_timer code example + * + *****************************************************************************/ +VMINT vm_delete_timer(VMINT timerid); + + + +/***************************************************************************** + * FUNCTION + * vm_create_timer_ex + * DESCRIPTION + * create timer. + * Once the timer is created, it will be looply called till user delete it. It is an aligned timer, so it is not a precise timer. but it will still work + * when the LCD backlight is off. For one application , the max number of this kind of timer is 10 + * PARAMETERS + * millisec : [IN] the length if the interval. The unit of interval is millisecond + * timerproc : [IN] the callback function when the timer is over time + * RETURNS + * The timer handle,the handle >0 when succeed,otherwise, handle <0 + * EAMPLE + * + * void customer_timer_example_proc_ex(VMINT tid) + * { + * static VMINT s_restore_num = 0; + * s_restore_num++; + * if(s_restore_num > 10) + * { + * vm_delete_timer_ex(tid); + * } + * } + * + * void customer_run_timer_ex(void) + * { + * VMINT timer_id = 0; + * timer_id = vm_create_timer_ex(1000, (VM_TIMERPROC_T)customer_timer_example_proc_ex); + * if(timer_id < 0) + * { + * vm_log_debug("customer_run_timer_ex create timer fail!"); + * } + * } + * + *****************************************************************************/ +VMINT vm_create_timer_ex(VMUINT32 millisec, VM_TIMERPROC_T timerproc); + + +/***************************************************************************** + * FUNCTION + * vm_delete_timer_ex + * DESCRIPTION + * delete the timer created by vm_create_timer_ex + * PARAMETERS + * timerid : [IN] the timer handler + * RETURNS + * succeed when return 0,otherwise, fail + * EXAMPLE + * + * refer from vm_create_timer_ex code example + * + *****************************************************************************/ +VMINT vm_delete_timer_ex(VMINT timerid); + +/***************************************************************************** +* FUNCTION +* vm_create_kal_timer +* DESCRIPTION +* This interface used to create a kal timer, the priority higher than mmi task, it is related with interrupt. +* PARAMETERS +* timer_name : [IN] timer name. It's used for debug only, and only the +* first 8 characters retain. +* RETURN VALUES +* Success: timer pointer. +* Error: system enter fatal error handling. +*****************************************************************************/ +vm_kal_timerid vm_create_kal_timer(VMINT8 *timer_name); + +/***************************************************************************** +* FUNCTION +* vm_set_kal_timer +* DESCRIPTION +* This interface used to start a timer. this will cancel previous set timeout event , and start a new one. +* PARAMETERS +* timer_ptr : [IN] timer pointer. +* handler_func_ptr: [IN] pointer of timeout handler, it will be called after +* timeout happens, not use LinkIt API +* handler_param_ptr: [IN] user supply argument for handler_func_ptr +* delay: [IN] timeout duration in terms of time ticks, the maximum value is 0xFFFFFFFF +* reschedule_time: [IN] reset delay to reschedule_time after timeout happens. +* If it's zero, no reschedule happens and the timer is one-shot. +* Otherwise, it's a periodic timer. +* RETURN VALUES +* pointer of timder id, NULL means failed to create +*****************************************************************************/ +void vm_set_kal_timer(vm_kal_timerid timer_ptr, vm_kal_timer_func_ptr handler_func_ptr,void *handler_param_ptr, VMUINT32 delay, VMUINT32 reshedule_time); + +/***************************************************************************** +* FUNCTION +* vm_cancel_kal_timer +* DESCRIPTION +* This interface used to cancel a timer. Please note that canceling timer inside HISR may cancel a timer which is +* in expired stage but the callback function not yet been serviced. +* PARAMETERS +* ext_timer : [IN] timer pointer. +* RETURN VALUES +* pointer of timder id, NULL means failed to create +*****************************************************************************/ +void vm_cancel_kal_timer(vm_kal_timerid timer_ptr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtls.h b/hardware/arduino/mtk/system/libmtk/include/vmtls.h new file mode 100644 index 00000000..4c94e4cc --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtls.h @@ -0,0 +1,508 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VM_TLS_SDK_H +#define VM_TLS_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "vmsys.h" +#include "vmsock.h" + +typedef enum { + VM_TLS_ERR_NONE = 0, /* No error. */ + VM_TLS_ERR_WOULDBLOCK = -1, /* Operation cannot complete now. */ + VM_TLS_ERR_NO_FREE_CTX = -2, /* No free global context slots. */ + VM_TLS_ERR_NO_MEMORY = -3, /* Allocate memory failed. */ + VM_TLS_ERR_INVALID_CONTEXT = -4, /* Invalid global context id. */ + VM_TLS_ERR_INVALID_CIPHER = -5, /* Invalid cipher enum value. */ + VM_TLS_ERR_EXCESS_MAX_CIPHERS = -6, /* Too many ciphers. */ + VM_TLS_ERR_INVALID_PARAMS = -7, /* Invalid parameter. */ + VM_TLS_ERR_INVALID_ROOT_CERT = -8, /* Invalid root certificate id. */ + VM_TLS_ERR_INVALID_PRIV_KEY = -9, /* Invalid private key id. */ + VM_TLS_ERR_INVALID_PERSONAL_CERT = -10, /* Invalid personal certificate id. */ + VM_TLS_ERR_INVALID_FILE_TYPE = -11, /* Invalid file encoding type. */ + VM_TLS_ERR_INVALID_AUTH_MODE = -12, /* Invalid client auth mode. */ + VM_TLS_ERR_EXCESS_MAX_AUTH_MODES = -13, /* Too many client auth modes. */ + VM_TLS_ERR_ALREADY = -14, /* The operation is progressing. */ + VM_TLS_ERR_HANDSHAKED = -15, /* Handshaked completed. */ + VM_TLS_ERR_INVALID_SOCK_ID = -16, /* Invalid socket id. */ + VM_TLS_ERR_NO_CONN_CTX = -17, /* No associated connection context. */ + VM_TLS_ERR_HANDSHAKING = -18, /* Opreation denied when connection is handshaking. */ + VM_TLS_ERR_REHANDSHAKING = -19, /* Connection is rehandshaking. */ + VM_TLS_ERR_REHANDSHAKED = -20, /* TLS auto re-handshaked completed. */ + VM_TLS_ERR_SHUTDOWNED = -21, /* Opreation denied when connection is shutdowned. */ + VM_TLS_ERR_REQ_HANDSHAKE = -22, /* TLS peer requested handshake. */ + VM_TLS_ERR_NEED_HANDSHAKE = -23, /* Need handshake first. */ + VM_TLS_ERR_REHANDSHAKE_REJ = -24, /* Peer rejects our renegotiation, connection still valid. */ + VM_TLS_ERR_CONN_CLOSED = -25, /* Connection closed by peer. */ + VM_TLS_ERR_IO_ERROR = -26, /* Lower-layer IO error. */ + VM_TLS_ERR_OP_DENIED = -27, /* Operation denied due to incorrect state. */ + VM_TLS_ERR_READ_REQUIRED = -28, /* Application data need to be read before processing rehandshake. */ + VM_TLS_ERR_CERT_VALIDATE = -29, /* Certificate validation failed. */ + VM_TLS_ERR_PRNG_FAIL = -30, /* Set PRNG failed. */ + VM_TLS_ERR_WAITING_CERT = -32, /* Waiting certificate confirm from CERTMAN. */ + VM_TLS_ERR_FILESYS = -33, /* File system operation failed. */ + VM_TLS_ERR_TASK_NOT_READY = -34, /* TLS task not ready, waiting for CERTMAN confirm message. */ + VM_TLS_ERR_SSL_INTERNAL = -100,/* SSL layer internal error. */ + VM_TLS_ERR_SOC_INTERNAL = -101,/* Socket layer internal error. */ + VM_TLS_ERR_CERTMAN_INTERNAL = -102 /* Certman internal error. */ +} vm_tls_error_enum; + +typedef enum { + VM_TLS_ALL_VERSIONS = 0, /* ALL supported SSL/TLS versions */ + VM_SSLv2 = 0x01u << 0, /* SSLv2 */ + VM_SSLv3 = 0x01u << 1, /* SSLv3 */ + VM_TLSv1 = 0x01u << 2, /* TLSv1 */ + VM_TLS_UNKNOWN_VERSION = 0xffu /* Unknown */ +} vm_tls_version_enum; + +typedef enum { + VM_TLS_CLIENT_SIDE = 0, /* Client side */ + VM_TLS_SERVER_SIDE = 1 /* Server side */ +} vm_tls_side_enum; + +typedef enum { + VM_TLS_NULL_MD5 = 0, /* 0x0001, TLS_RSA_WITH_NULL_MD5. */ + VM_TLS_EXP_RC4_MD5 = 1, /* 0x0003, TLS_RSA_EXPORT_WITH_RC4_40_MD5.(*) */ + VM_TLS_RC4_MD5 = 2, /* 0x0004, TLS_RSA_WITH_RC4_128_MD5. */ + VM_TLS_RC4_SHA = 3, /* 0x0005, TLS_RSA_WITH_RC4_128_SHA, TLS Profile MUST. */ + VM_TLS_EXP_DES_CBC_SHA = 4, /* 0x0008, TLS_RSA_EXPORT_WITH_DES40_CBC_SHA.(*) */ + VM_TLS_DES_CBC_SHA = 5, /* 0x0009, TLS_RSA_WITH_DES_CBC_SHA. */ + VM_TLS_DES_CBC3_SHA = 6, /* 0x000A, TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS Profile MUST. */ + VM_TLS_EXP_EDH_DSS_DES_CBC_SHA = 7, /* 0x0011, TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA.(*) */ + VM_TLS_EDH_DSS_CBC_SHA = 8, /* 0x0012, TLS_DHE_DSS_WITH_DES_CBC_SHA. */ + VM_TLS_EDH_DSS_DES_CBC3_SHA = 9, /* 0x0013, TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA. */ + VM_TLS_EXP_EDH_RSA_DES_CBC_SHA = 10, /* 0x0014, TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA.(*) */ + VM_TLS_EDH_RSA_DES_CBC_SHA = 11, /* 0x0015, TLS_DHE_RSA_WITH_DES_CBC_SHA. */ + VM_TLS_EDH_RSA_DES_CBC3_SHA = 12, /* 0x0016, TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA. */ + VM_TLS_EXP_ADH_RC4_MD5 = 13, /* 0x0017, TLS_DH_anon_EXPORT_WITH_RC4_40_MD5.(*) */ + VM_TLS_ADH_RC4_MD5 = 14, /* 0x0018, TLS_DH_anon_WITH_RC4_128_MD5. */ + VM_TLS_EXP_ADH_DES_CBC_SHA = 15, /* 0x0019, TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA.(*) */ + VM_TLS_ADH_DES_CBC_SHA = 16, /* 0x001A, TLS_DH_anon_WITH_DES_CBC_SHA. */ + VM_TLS_ADH_DES_CBC3_SHA = 17, /* 0x001B, TLS_DH_anon_WITH_3DES_EDE_CBC_SHA. */ + + VM_TLS_AES128_SHA = 18, /* 0x002F, TLS_RSA_WITH_AES_128_CBC_SHA. */ + VM_TLS_AES256_SHA = 19, /* 0x0035, TLS_RSA_WITH_AES_256_CBC_SHA. */ + + VM_TLS_EXP1024_DES_CBC_SHA = 20, /* 0x0062, TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA. */ + VM_TLS_EXP1024_RC4_SHA = 21, /* 0x0064, TLS_RSA_EXPORT1024_WITH_RC4_56_SHA. */ + VM_TLS_DHE_DSS_RC4_SHA = 22, /* 0x0066, TLS_DHE_DSS_WITH_RC4_128_SHA. */ + + VM_TLS_ECDH_SECT163K1_RC4_SHA = 23, /* 0xC002 in RFC 4492, TLS_ECDH_ECDSA_WITH_RC4_128_SHA. */ + VM_TLS_ECDH_SECT163K1_NULL_SHA = 24, /* 0xC001 in RFC 4492, TLS_ECDH_ECDSA_WITH_NULL_SHA. */ + + VM_TLS_PSK_AES128_SHA = 25, /* 0x008C in RFC 4279, TLS_PSK_WITH_AES_128_CBC_SHA. */ + VM_TLS_PSK_DES_CBC3_SHA = 26, /* 0x008B in RFC 4279, TLS_PSK_WITH_3DES_EDE_CBC_SHA. */ + VM_TLS_UNKNOWN_CIPHER, + VM_TLS_TOTAL_CIPHER_NUM = VM_TLS_UNKNOWN_CIPHER +} vm_tls_cipher_enum ; + +typedef enum { + VM_TLS_NULL_WITH_NULL_NULL = 0x0000, /* (NULL, NULL, NULL)*/ + + VM_TLS_RSA_WITH_NULL_MD5 = 0x0001, /* (RSA, NULL, MD5) */ + VM_TLS_RSA_WITH_NULL_SHA = 0x0002, /* (RSA, NULL, SHA) */ + VM_TLS_RSA_EXPORT_WITH_RC4_40_MD5 = 0x0003, /* (RSA_EXPORT, RC4_40), MD5, TLS 1.0 */ + VM_TLS_RSA_WITH_RC4_128_MD5 = 0x0004, /* (RSA, RC4_128, MD5) */ + VM_TLS_RSA_WITH_RC4_128_SHA = 0x0005, /* (RSA, RC4_128, SHA) */ + VM_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = 0x0006, /* (RSA_EXPORT, RC2_CBC_40, MD5), TLS 1.0 */ + VM_TLS_RSA_WITH_IDEA_CBC_SHA = 0x0007, /* (RSA, IDEA_CBC, SHA) */ + VM_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x0008, /* (RSA_EXPORT, DES40_CBC, SHA), TLS 1.0 */ + VM_TLS_RSA_WITH_DES_CBC_SHA = 0x0009, /* (RSA, DES_CBC, SHA) */ + VM_TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0x000A, /* (RSA, 3DES_EDE_CBC, SHA) */ + + VM_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = 0x000B, /* (DH_DSS_EXPORT, DES40_CBC, SHA), TLS 1.0 */ + VM_TLS_DH_DSS_WITH_DES_CBC_SHA = 0x000C, /* (DH_DSS, DES_CBC, SHA) */ + VM_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = 0x000D, /* (DH_DSS, 3DES_EDE_CBC, SHA) */ + VM_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x000E, /* (DH_RSA_EXPORT, DES40_CBC, SHA), TLS 1.0 */ + VM_TLS_DH_RSA_WITH_DES_CBC_SHA = 0x000F, /* (DH_RSA, DES_CBC, SHA) */ + VM_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = 0x0010, /* (DH_RSA, 3DES_EDE_CBC, SHA) */ + VM_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = 0x0011, /* (DHE_DSS_EXPORT, DES40_CBC, SHA), TLS 1.0 */ + VM_TLS_DHE_DSS_WITH_DES_CBC_SHA = 0x0012, /* (DHE_DSS, DES_CBCi, SHA) */ + VM_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0x0013, /* (DHE_DSS, 3DES_EDE_CBC, SHA) */ + VM_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x0014, /* (DHE_RSA_EXPORT, DES40_CBC, SHA), TLS 1.0 */ + VM_TLS_DHE_RSA_WITH_DES_CBC_SHA = 0x0015, /* (DHE_RSA, DES_CBCi, SHA) */ + VM_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x0016, /* (DHE_RSA, 3DES_EDE_CBC, SHA) */ + + VM_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = 0x0017, /* (DH_anon_EXPORT, RC4_40, MD5), TLS 1.0 */ + VM_TLS_DH_anon_WITH_RC4_128_MD5 = 0x0018, /* (DH_anon, RC4_128, MD5) */ + VM_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = 0x0019, /* (DH_anon, DES40_CBC, SHA), TLS 1.0 */ + VM_TLS_DH_anon_WITH_DES_CBC_SHA = 0x001A, /* (DH_anon, DES_CBC, SHA) */ + VM_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = 0x001B, /* (DH_anon, DES_CBC, SHA) */ + + VM_TLS_KRB5_WITH_DES_CBC_SHA = 0x001E, /* (Kerberos, DES_CBC, SHA) */ + VM_TLS_KRB5_WITH_3DES_EDE_CBC_SHA = 0x001F, /* (Kerberos, 3DES_EDE_CBC, SHA) */ + VM_TLS_KRB5_WITH_RC4_128_SHA = 0x0020, /* (Kerberos, RC4_128, SHA) */ + VM_TLS_KRB5_WITH_IDEA_CBC_SHA = 0x0021, /* (Kerberos, IDEA_CBC, SHA) */ + VM_TLS_KRB5_WITH_DES_CBC_MD5 = 0x0022, /* (Kerberos, DES_CBC, MD5) */ + VM_TLS_KRB5_WITH_3DES_EDE_CBC_MD5 = 0x0023, /* (Kerberos, 3DES_EDE_CBC, MD5) */ + VM_TLS_KRB5_WITH_RC4_128_MD5 = 0x0024, /* (Kerberos, RC4_128, MD5) */ + VM_TLS_KRB5_WITH_IDEA_CBC_MD5 = 0x0025, /* (Kerberos, IDEA_CBC, MD5) */ + + VM_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA = 0x0026, /* (Kerberos, DES_CBC_40, SHA), MUST NOT */ + VM_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA = 0x0027, /* (Kerberos, RC2_CBC_40, SHA), MUST NOT */ + VM_TLS_KRB5_EXPORT_WITH_RC4_40_SHA = 0x0028, /* (Kerberos, RC4_40, SHA), MUST NOT */ + VM_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 = 0x0029, /* (Kerberos, DES_DBC_40, MD5), MUST NOT */ + VM_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5 = 0x002A, /* (Kerberos, RC2_CBC_40, MD5), MUST NOT */ + VM_TLS_KRB5_EXPORT_WITH_RC4_40_MD5 = 0x002B, /* (Kerberos, RC4_40, MD5), MUST NOT */ + + VM_TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F, /* (RSA, AES_128_CBC, SHA) */ + VM_TLS_DH_DSS_WITH_AES_128_CBC_SHA = 0x0030, /* (DH_DSS, AES_128_CBC, SHA) */ + VM_TLS_DH_RSA_WITH_AES_128_CBC_SHA = 0x0031, /* (DH_RSA, AES_128_CBC, SHA) */ + VM_TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032, /* (DHE_DSS, AES_128_CBC, SHA) */ + VM_TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033, /* (DHE_RSA, AES_128_CBC, SHA) */ + VM_TLS_DH_anon_WITH_AES_128_CBC_SHA = 0x0034, /* (DH_anon, AES_128_CBC, SHA) */ + VM_TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035, /* (RSA, AES_256_CBC, SHA) */ + VM_TLS_DH_DSS_WITH_AES_256_CBC_SHA = 0x0036, /* (DH_DSS, AES_256_CBC, SHA) */ + VM_TLS_DH_RSA_WITH_AES_256_CBC_SHA = 0x0037, /* (DHE_RSA, AES_256_CBC, SHA) */ + VM_TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038, /* (DHE_RSA, AES_256_CBC, SHA) */ + VM_TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039, /* (DH_anon, AES_256_CBC, SHA) */ + VM_TLS_DH_anon_WITH_AES_256_CBC_SHA = 0x003A, /* (DH_anon, AES_256_CBC, SHA) */ + VM_TLS_CIPHER_UNKNOWN = 0xFFFF +} vm_tls_ciphersuites_enum; + + +typedef enum { + VM_TLS_FILETYPE_PEM = 0, /* PEM encoding */ + VM_TLS_FILETYPE_DER /* DER encoding */ +} vm_tls_filetype_enum; + +typedef enum { + VM_TLS_CLIENT_AUTH_BEGIN, + VM_TLS_CLIENT_AUTH_RSA_CLIENT, /* RSA client side */ + VM_TLS_CLIENT_AUTH_RSA_SERVER, /* RSA server side */ + VM_TLS_CLIENT_AUTH_DSS_CLIENT, /* DSS(DSA) cient side */ + VM_TLS_CLIENT_AUTH_DSS_SERVER, /* DSS(DSA) server side */ + VM_TLS_CLIENT_AUTH_END = 0xff +} vm_tls_auth_mode_enum; + + +typedef enum { + VM_TLS_ENC_ALGO_UNKNOWN, + VM_TLS_ENC_ALGO_NULL, /* NULL */ + + VM_TLS_ENC_ALGO_DES_40, /* DES 40 */ + VM_TLS_ENC_ALGO_DES, /* DES(56) */ + VM_TLS_ENC_ALGO_3DES, /* 3DES */ + + VM_TLS_ENC_ALGO_RC5, /* RC5 */ + VM_TLS_ENC_ALGO_RC5_56, /* RC5_56 */ + + VM_TLS_ENC_ALGO_AES_128, /* AES_128 */ + VM_TLS_ENC_ALGO_AES_192, /* AES_192, new for OpenSSL */ + VM_TLS_ENC_ALGO_AES_256, /* AES_256 */ + + VM_TLS_ENC_ALGO_ARC4_40, /* RC4_40 */ + VM_TLS_ENC_ALGO_ARC4_56, /* RC4_56, new for OpenSSL */ + VM_TLS_ENC_ALGO_ARC4_64, /* RC4_64, new for OpenSSL */ + VM_TLS_ENC_ALGO_ARC4_128, /* RC4_128 */ + + VM_TLS_ENC_ALGO_ARC2_40, /* RC2_40 */ + VM_TLS_ENC_ALGO_ARC2_56, /* RC2_56, new for OpenSSL */ + VM_TLS_ENC_ALGO_ARC2_64, /* RC4_64 */ + VM_TLS_ENC_ALGO_ARC2_128 /* RC2_128 */ +} vm_tls_encryption_enum; + +typedef enum { + VM_TLS_KEY_ALGO_UNKNOWN, + VM_TLS_KEY_ALGO_RSA, /* RSA */ + VM_TLS_KEY_ALGO_RSA_EXPORT, /* RSA_EXPORT */ + VM_TLS_KEY_ALGO_DH, /* DH */ + VM_TLS_KEY_ALGO_DH_EXPORT, /* DH_EXPORT */ + VM_TLS_KEY_ALGO_DHE, /* DH */ + VM_TLS_KEY_ALGO_DHE_EXPORT, /* DH_EXPORT */ + VM_TLS_KEY_ALGO_ECDH, /* ECDH */ + VM_TLS_KEY_ALGO_ECDHE, /* ECDHE */ + VM_TLS_KEY_ALGO_ECMQV, /* ECMQV */ + VM_TLS_KEY_ALGO_DSA, /* DSA */ + VM_TLS_KEY_ALGO_PSK, /* PSK */ + VM_TLS_KEY_ALGO_DHE_PSK, /* DHE_PSK */ + VM_TLS_KEY_ALGO_RSA_PSK, /* RSA_PSK */ + VM_TLS_KEY_ALGO_MAX +} vm_tls_key_exchange_enum; + +typedef enum { + VM_TLS_AUTH_ALGO_UNKNOWN, + VM_TLS_AUTH_ALGO_ANON, /* ANON */ + VM_TLS_AUTH_ALGO_RSA, /* RSA */ + VM_TLS_AUTH_ALGO_DSS, /* DSS */ + VM_TLS_AUTH_ALGO_ECDSA, /* ECDSA */ + VM_TLS_AUTH_ALGO_PSK /* PSK */ +} vm_tls_auth_enum; + +typedef enum { + VM_TLS_HASH_UNKNOWN, + VM_TLS_HASH_MD2, /* MD2 */ + VM_TLS_HASH_MD4, /* MD4 */ + VM_TLS_HASH_MD5, /* MD5 */ + VM_TLS_HASH_SHA1, /* SHA1 */ + VM_TLS_HASH_SHA224, /* SHA224 */ + VM_TLS_HASH_SHA256, /* SHA256 */ + VM_TLS_HASH_SHA384, /* SHA384 */ + VM_TLS_HASH_SHA512 /* SHA512 */ +} vm_tls_hash_enum; + +typedef struct { + vm_tls_version_enum version; /* SSL version number */ + vm_tls_encryption_enum enc; /* bulk encryption algrotithm */ + vm_tls_key_exchange_enum key_ex; /* key exchange algorithm */ + vm_tls_auth_enum auth; /* authentication algorithm */ + vm_tls_hash_enum hash; /* message digest algorithm */ +} vm_tls_cipher_info_struct; + + +/* Socket Type */ +typedef enum +{ + VM_SOC_SOCK_STREAM = 0, /* stream socket, TCP */ + VM_SOC_SOCK_DGRAM, /* datagram socket, UDP */ + VM_SOC_SOCK_SMS, /* SMS bearer */ + VM_SOC_SOCK_RAW /* raw socket */ +} vm_socket_type_enum; + +typedef enum { + VM_TLS_HANDSHAKE_READY = 0x01u << 0, /* The connection is ready for performing handshake. */ + VM_TLS_HANDSHAKE_DONE = 0x01u << 1, /* Handshake procedure is finished, success or failure. */ + VM_TLS_READ = 0x01u << 2, /* There is data for reading. */ + VM_TLS_WRITE = 0x01u << 3, /* There is buffer for writing. */ + VM_TLS_CLOSE = 0x01u << 4 /* The SSL connection is closed. */ +} vm_tls_event_enum; + +typedef enum { + VM_TLS_ALERT_LV_WARNING = 1, /* Warning alert. */ + VM_TLS_ALERT_LV_FATAL = 2 /* Fatal alert, application MUST terminate the connection immediately. */ +} vm_tls_alert_level_enum; + +typedef enum { + VM_TLS_ALERT_CLOSE_NOTIFY = 0, /* Peer shuts down the connection. */ + VM_TLS_ALERT_UNEXPECTED_MESSAGE = 10, /* Received an unexped mesage, always a fatal. */ + VM_TLS_ALERT_BAD_RECORD_MAC = 20, /* Bad MAC, always a fatal. */ + VM_TLS_ALERT_DECRYPTION_FAILED = 21, /* Decryption failed, always a fatal. */ + VM_TLS_ALERT_RECORD_OVERFLOW = 22, /* Record size exceeds the limitation, always a fatal. */ + VM_TLS_ALERT_DECOMPRESSION_FAILURE = 30, /* Deccompression failed, always a fatal. */ + VM_TLS_ALERT_HANDSHAKE_FAILURE = 40, /* Handshake failed, fatal. */ + VM_TLS_ALERT_NOCERTIFICATE_RESERVED = 41, /* Response to a certification request if no appropriate certificate is available, SSLv3 only. */ + VM_TLS_ALERT_BAD_CERTIFICATE = 42, /* A certificate was corrupt, signatures that did not verify correctly. */ + VM_TLS_ALERT_UNSUPPORTED_CERTIFICATE = 43, /* Unsupported certificate type. */ + VM_TLS_ALERT_CERTIFICATE_REVOKED = 44, /* Received a revoked certificate from peer. */ + VM_TLS_ALERT_CERTIFICATE_EXPIRED = 45, /* A certificate has expired or not yet valid. */ + VM_TLS_ALERT_CERTIFICATE_UNKNOWN = 46, /* Some unspecificate issue in processing the certificate. */ + VM_TLS_ALERT_ILLEGAL_PARAMETER = 47, /* Illegal parameter in the message, always a fatal. */ + VM_TLS_ALERT_UNKNOWN_CA = 48, /* The certificate chain cannot be verified successfully due to untrusted CA, always a fatal. */ + VM_TLS_ALERT_ACCESS_DENIED = 49, /* sender decided not to proceed with negotiation when access control was applied, always a fatal. */ + VM_TLS_ALERT_DECODE_ERROR = 50, /* The field in a message is incorrect, always a fatal. */ + VM_TLS_ALERT_DECRYPT_ERROR = 51, /* a handshake cryptographic operation failed, including verify a signature, decrypt a key exchange, or validate a finished mesasge. */ + VM_TLS_ALERT_EXPORT_RESTRICTION_RESERVED = 60, /* A negotiation not in compliance with export restrictions was detected. */ + VM_TLS_ALERT_PROTOCOL_VERSION = 70, /* The protocol version proposed by client is not supported by server side, always a fatal. */ + VM_TLS_ALERT_INSUFFICIENT_SECURITY = 71, /* The server requires cphers more secure than those supported by the client, always a fatal. */ + VM_TLS_ALERT_INTERNAL_ERROR = 80, /* An internal error unrelated to the peer, always a fatal. */ + VM_TLS_ALERT_USER_CANCELLED = 90, /* The handshake is canceled for some reason unrelated to a protocol failure, generally a warning. */ + VM_TLS_ALERT_NO_RENEGOTIATION = 100 /* When peer suggest to renegotiate again but local rejects it, always a warning. */ +} vm_tls_alert_desc_enum; + +typedef enum { + VM_TLS_USER_REJECT = 0, /* User rejects the invalid certificate. */ + VM_TLS_USER_ACCEPT_ONCE = 1, /* User accepts the invalid certificate for this time */ + VM_TLS_USER_ACCEPT_FOREVER = 2 /* User accepts the invalid cert forever */ +} vm_tls_inval_cert_action; + +typedef struct +{ + vm_socket_type_enum sock_type; /* socket type */ + VMINT16 addr_len; /* address length */ + VMUINT16 port; /* port number */ + VMUINT8 addr[VM_MAX_SOCK_ADDR_LEN]; +}vm_sockaddr_ex_struct; + +typedef struct { + VMUINT32 len; /* The size of the certificate in bytes */ + VMUINT8 *data; /* Data of the certficate in DER format */ +} vm_tls_cert_struct; + +#define VM_MSG_ID_APP_SOC_NOTIFY_IND 0 +#define VM_MSG_ID_APP_TLS_NOTIFY_IND 1 +#define VM_MSG_ID_APP_TLS_ALERT_IND 2 +#define VM_MSG_ID_APP_TLS_INVALID_CERT_IND 3 +#define VM_MSG_ID_APP_TLS_CLIENT_AUTH_IND 4 + +#define VM_TLS_EVT_PARAM_HEADER \ + VMINT msg; \ + VMINT res_id; \ + VMINT soc_id + +typedef struct +{ + VM_TLS_EVT_PARAM_HEADER; +}vm_tls_event_struct; + + +/* event */ +typedef enum +{ + VM_SOC_READ = 0x01, /* Notify for read */ + VM_SOC_WRITE = 0x02, /* Notify for write */ + VM_SOC_ACCEPT = 0x04, /* Notify for accept */ + VM_SOC_CONNECT = 0x08, /* Notify for connect */ + VM_SOC_CLOSE = 0x10 /* Notify for close */ +} vm_soc_event_enum; + +typedef struct +{ + VM_TLS_EVT_PARAM_HEADER; + vm_soc_event_enum event_type; /* vm_soc_event_enum */ + VMINT result; /* notification result. KAL_TRUE: success, KAL_FALSE: error */ + VMINT error_cause; /* vm_soc_error_enum used only when EVENT is close/connect */ + VMINT detail_cause; /* refer to ps_cause_enum if error_cause is + * VM_SOC_BEARER_FAIL */ +}vm_tls_soc_notify_ind_struct; + +/*************************************************************************** + * + * + * Indication to app for a common event. + * Local parameter of MSG_ID_APP_TLS_NOTIFY_IND. + ***************************************************************************/ +typedef struct +{ + VM_TLS_EVT_PARAM_HEADER; + vm_tls_event_enum event; /* Reported event from TLS task. + Applications should verifiy the event type and calls the corresponding + handler. + + * VM_TLS_HANDSHAKE_READY is an indication of the result of connection context + creation procedure. vm_tls_new_conn() might return TLS_ERR_WAITING_CERT for + loading certificates and waiting response from MOD_CERTMAN. After received + this message, application can then call vm_tls_handshake() to start TLS + handshake procedure. + + * VM_TLS_HANDSHAKE_DONE is an indication of the handshake result procedure. + Application can call vm_tls_read() to receive data from or call tls_write() to + send data to the peer. + + * For VM_TLS_READ, application should call vm_tls_read() repeatedly until + WOULDBLOCK returned. + + * For VM_TLS_WRITE, application is allowed to transmit the holding data by + calling vm_tls_write(). + + * For VM_TLS_CLOSE, application should call vm_tls_delete_conn() to de-associate + the connection with a socket id. + */ + VMINT result; /* Success or failure of the notification. */ + VMINT error; /* Error code. */ + VMINT detail_cause; /* Detail error cause. */ +} vm_tls_notify_ind_struct; + +/*************************************************************************** + * + * + * Indication to app for received an alert from peer. + * Local parameter of MSG_ID_APP_TLS_ALERT_IND. + ***************************************************************************/ +typedef struct +{ + VM_TLS_EVT_PARAM_HEADER; + vm_tls_alert_level_enum alert_level; /* Alert level. */ + vm_tls_alert_desc_enum alert_desc; /* Alert description. */ + VMINT error; /* Error code. */ + VMINT cause; /* Detail error cause. */ +} vm_tls_alert_ind_struct; + +/*************************************************************************** + * + * + * Indication of invalid certificate. + * Local parameter of MSG_ID_APP_TLS_INVALID_CERT_IND. + ***************************************************************************/ +typedef struct +{ + VM_TLS_EVT_PARAM_HEADER; + VMINT result; /* TRUE: user confirms to proceed the handshake against the received invalid certificate */ + vm_tls_inval_cert_action action; /* User's decision */ +} vm_tls_invalid_cert_ind_struct; + +#define VM_TLS_MAX_CLIENT_AUTH (7) +/*************************************************************************** + * + * + * Indication of client authentication request freom server. + * Local parameter of MSG_ID_APP_TLS_CLIENT_AUTH_IND. + ***************************************************************************/ +typedef struct +{ + VM_TLS_EVT_PARAM_HEADER; + VMINT result; /* TRUE: user selects a positive answer to the client authentication */ + VMINT auth_mode_num; /* auth modes in the following auth_modes array */ + vm_tls_auth_mode_enum auth_modes[VM_TLS_MAX_CLIENT_AUTH]; /* authmodes in the certificate request message from server */ + VMUINT identity_id; /* user selected certificate id. This field would be zero if no user certificate meets the criteria in the certificate request message. */ +} vm_tls_client_auth_ind_struct; + +typedef void (*callback_t)(vm_tls_event_struct * data); + + +VMINT vm_tls_new_ctx(vm_tls_version_enum ver, vm_socket_type_enum sock_type, VMINT apn, vm_tls_side_enum side, callback_t cb); +VMINT vm_tls_delete_ctx(VMINT res_id); +VMINT vm_tls_set_ciphers(VMINT res_id, const vm_tls_cipher_enum ciphers[], VMINT num); +VMINT vm_tls_set_verify(VMINT res_id, VMUINT32 cert_id[], VMINT cert_num, vm_tls_filetype_enum type); +VMINT vm_tls_set_client_auth(VMINT res_id, vm_tls_auth_mode_enum modes[], VMINT num); +VMINT vm_tls_set_identity(VMINT res_id, VMUINT32 cert_id); + +VMINT vm_tls_new_conn(VMINT res_id, vm_sockaddr_ex_struct * faddr); +VMINT vm_tls_delete_conn(VMINT res_id); +VMINT vm_tls_get_cipher(VMINT res_id, vm_tls_ciphersuites_enum *cipher); +VMINT vm_tls_get_cipher_info(VMINT res_id, vm_tls_cipher_info_struct *cipher_info); +VMINT vm_tls_get_peer_cert(VMINT res_id, vm_tls_cert_struct *cert); +VMINT vm_tls_check_invalid_cert(VMINT res_id, VMINT onoff); +VMINT vm_tls_set_null_client_auth(VMINT res_id); +VMINT vm_tls_check_peer_name(VMINT res_id, const VMCHAR * name); +VMINT vm_tls_auto_rehandshake(VMINT res_id, VMINT onoff); +VMINT vm_tls_handshake(VMINT res_id); +VMINT vm_tls_rehandshake(VMINT res_id); +VMINT vm_tls_read(VMINT res_id, void* buf, VMINT32 len); +VMINT vm_tls_write(VMINT res_id, const void* buf, VMINT32 len); +VMINT vm_tls_shutdown(VMINT res_id); +VMINT vm_tls_connect(VMINT res_id, vm_sockaddr_ex_struct * faddr); +VMINT vm_tls_soc_connect(VMINT res_id, vm_sockaddr_ex_struct * faddr); +VMINT vm_tls_log_plaintext(VMINT onoff); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* VM_TLS_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtouch.h b/hardware/arduino/mtk/system/libmtk/include/vmtouch.h new file mode 100644 index 00000000..ae46380a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtouch.h @@ -0,0 +1,272 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMTOUCH_SDK_H +#define VMTOUCH_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +typedef enum +{ + VM_MULTI_TOUCH_ERR_NO_RES = -7, /* no avalible resource */ + VM_MULTI_TOUCH_ERR_PARAM, /* input invalid parameter */ + VM_MULTI_TOUCH_ERR_NO_MEMORY, /* no memmory */ + VM_MULTI_TOUCH_ERR_NO_DISK, /* driver path failure */ + VM_MULTI_TOUCH_ERR_EXCEPTION, /* exception */ + VM_MULTI_TOUCH_ERR_NOT_SUPPORT, /* platform dose not support */ + VM_MULTI_TOUCH_ERR_NOT_AUTHORIZED, /* no authrization */ + VM_MULTI_TOUCH_ERR_SUCCESS = 0 /* success */ +}vm_multi_touch_error_t; + + +/* Touch screen mode */ +typedef enum +{ + /* Single touch mode, just send one finger event to application, this is default behavior */ + VM_SINGLE_TOUCH, + /* Multi-touch mode, send several events to application, according to how many fingers on the screen, at most it is five */ + VM_MULTI_TOUCH, + /* Total touch event total, no need to handle this */ + VM_MULTI_TOUCH_TOTAL +} vm_touch_mode; + + +/* structure of Point */ +typedef struct +{ + /* x coordinate */ + VMINT16 x; + /* x coordinate */ + VMINT16 y; +} vm_pen_point_struct; + +/* The touch position structure */ +typedef struct +{ + /* The coordinates of this event */ + vm_pen_point_struct pos; + /* The timestamp of this event */ + VMUINT32 timestamp; +} vm_touch_pos_struct; + +/* + * Each finger touch data information + * Example: + * typedef struct + * { + * vm_pen_point_struct down_pos; // ((200, 110), 29999) + * VMUINT16 merge_num; // 2 + * vm_pen_point_struct* merge_points; // ((200, 200), 30010), ((200, 250), 30020) + * VMUINT16* merge_area; // (50, 40) + * } mmi_touch_data_struct; + */ +typedef struct +{ + VMUINT16 id; /* finger id */ + VMINT event; /* current touch event */ + vm_touch_pos_struct currpos; /* current touch info */ + VMUINT16 area; /* current finger area */ + VMINT pre_event; /* previous touch event */ + vm_touch_pos_struct pre_pos; /* previous touch info */ + vm_touch_pos_struct down_pos; /* pen down info */ + VMUINT16 merge_num; /* if there are several pen move events, we will send several pen move events together to application */ + vm_touch_pos_struct* merge_points; /* pen move events array */ + VMUINT16* merge_area; /* related pen move area */ +} vm_multi_touch_data_struct; + +typedef struct +{ + /* The finger number of this event, at most it is five */ + VMUINT16 touch_num; + /* The touch data of each event */ + vm_multi_touch_data_struct * touch_data; +}vm_multi_touch_event_struct; + +/***************************************************************************** + * FUNCTION + * vm_multi_touch_get_mode + * DESCRIPTION + * get current screen touch mode + * PARAMETERS + * void + * RETURNS + * VMINT + *****************************************************************************/ +VMINT vm_multi_touch_get_mode(void); + +/***************************************************************************** + * FUNCTION + * vm_multi_touch_set_mode + * DESCRIPTION + * set touch screen mode + * PARAMETERS + * mode : [IN] the parameter should be vm_touch_mode, single or multiple + * RETURNS + * VMINT + *****************************************************************************/ +VMINT vm_multi_touch_set_mode(vm_touch_mode mode); + +/***************************************************************************** + * + * FUNCTION + * vm_multi_touch_proc_t + * DESCRIPTION + * PARAMETERS + * param : [IN] vm_multi_touch_event_struct. + * user_data : [IN] user data. + * RETURNS + * VMINT + *****************************************************************************/ +typedef VMINT (*vm_multi_touch_proc_t) (vm_multi_touch_event_struct * evt_info, void * user_data); + +/***************************************************************************** + * FUNCTION + * vm_touch_register_proc + * DESCRIPTION + * Register touch proc by screen level, no need to reset, the single touch event or + * PARAMETERS + * proc : [IN] the proc, the event in the proc should be vm_multi_touch_event_struct. + * user_data : [IN] user data, framework will send this user_data to your proc + * RETURNS + * vm_touch_register_proc + *****************************************************************************/ +VMINT vm_multi_touch_register_proc(vm_multi_touch_proc_t proc, void *user_data); + + +/***************************************************************************** + * FUNCTION + * vm_pen_configure_sampling_period + * DESCRIPTION + * Config sampling period of Event-based + * PARAMETERS + * sp :[IN] (Pen Event)Sampling period in pen-moving (multiple of 10ms) + * RETURNS + * VMINT + * RETURN VALUES + * 0 : success + * non-zero : failure + * -1 : no authorization + *****************************************************************************/ +VMINT vm_pen_configure_sampling_period(VMUINT sp); + +/***************************************************************************** + * FUNCTION + * vm_is_finger_touch_version + * DESCRIPTION + * Check whether the phone support finger touch feature or not. + * PARAMETERS + * void + * RETURN VALUES + * TRUE : Supports finger touch feature. + * FALSE : Not support. + *****************************************************************************/ +VMINT vm_is_finger_touch_version(void); + +/***************************************************************************** + * FUNCTION + * vm_is_support_pen_touch + * DESCRIPTION + * Check whether the phone support touch panel or not. + * PARAMETERS + * void + * RETURN VALUES + * TRUE : Supports touch panel. + * FALSE : Not support. + *****************************************************************************/ +VMINT vm_is_support_pen_touch(void); + +/* Pen events supported by MRE. */ + +/* Pen down event */ +#define VM_PEN_EVENT_TAP 1 +/* Pen release event */ +#define VM_PEN_EVENT_RELEASE 2 +/* Pen move event */ +#define VM_PEN_EVENT_MOVE 3 + /* Pen long tap event. + Note: + 1. LongTap handler is invoked when the pen is tapped for a period of time + and stays at the same place where it is tapped down. + 2. If pen move happen after pen down, there will be no pen LongTap event. + 3. Pen long tap can only happen one time at most.*/ +#define VM_PEN_EVENT_LONG_TAP 4 +/* Pen double click event */ +#define VM_PEN_EVENT_DOUBLE_CLICK 5 +/* Pen repeat event. + Note: + 1. Repeat can happen after LongTap or move or another repeat. + 2. Repeat event's coordinate will follow the previous events.*/ +#define VM_PEN_EVENT_REPEAT 6 +/* Pen abort event */ +#define VM_PEN_EVENT_ABORT 7 + +/***************************************************************************** + * + * + * FUNCTION + * vm_pen_handler_t + * DESCRIPTION + * + * PARAMETERS + * event : [IN] Key event. + * x : [IN] x coordinate. + * y : [IN] y coordinate. + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_pen_handler_t)(VMINT event, VMINT x, VMINT y); + +/***************************************************************************** + * FUNCTION + * vm_reg_pen_callback + * DESCRIPTION + * Registers pen event handler. + * PARAMETERS + * handler : [IN] Pen event handler. + * RETURNS + * void + *****************************************************************************/ +void vm_reg_pen_callback(vm_pen_handler_t handler); + +#ifdef __cplusplus +} +#endif + +#endif /* VMTOUCH_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtsdcl.h b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl.h new file mode 100644 index 00000000..97b6acab --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl.h @@ -0,0 +1,335 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef __VM_DCL_H__ +#define __VM_DCL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmtssys.h" + + +/***************************************************************************** + * DESCRIPTION + * VM_TS_DCL_DEV is the type used to represent a special device such as UART,I2C,GPIO and so on. + * The value for every device group is defined in VM_TS_DCL_DEV_T. + * The value of a special device is defined in the header file of the device. + *****************************************************************************/ +typedef VMUINT16 VM_TS_DCL_DEV; + + +/***************************************************************************** +* This is the device number group enum. +* Each group device may have several devices. +* The specific device number please reference to the device driver. +* DUMMY_DEV group is for other users(not driver user) to register it's callback +*****************************************************************************/ +typedef enum +{ + VM_TS_DCL_UART_GROUP_START = 0, /*UART device number starts.*/ + VM_TS_DCL_I2C_GROUP_START = 0x100,/*I2C device number starts.*/ + VM_TS_DCL_SPI_GROUP_START = 0x200, /*SPI device number starts.*/ + VM_TS_DCL_ADC_GROUP_START = 0x300, /*ADC device number starts.*/ + VM_TS_DCL_GPIO_GROUP_START = 0x400, /*GPIO device number starts.*/ + VM_TS_DCL_PWM_GROUP_START = 0x500, /*PWM device number starts.*/ + VM_TS_DCL_RTC_GROUP_START = 0xA00, /*RTC device number starts.*/ + VM_TS_DCL_PMU_GROUP_START = 0xB00, /*PMU device number starts.*/ + VM_TS_DCL_EINT_GROUP_START = 0x1C00, /* EINT device number starts. */ + VM_TS_DCL_DUMMY_DEV_GROUP_START = 0x8000 /*DUMMY device number starts. For other user(not user driver)register callback in tiny system*/ +} VM_TS_DCL_DEV_T; + +/***************************************************************************** +* This is enum define dummy device, it's for other users(not driver user) to register callback +*****************************************************************************/ +typedef enum +{ + VM_TS_DCL_DUMMY_DEV_START = VM_TS_DCL_DUMMY_DEV_GROUP_START, + VM_TS_DCL_DUMMY_DEV +}VM_TS_DCL_DUMMY_DEV_T; + +/***************************************************************************** + * DESCRIPTION + * VM_TS_DCL_FLAGS is the type used to represent the flag that pass to the vm_ts_dcl_open. + * The value depend on each special device. + *****************************************************************************/ +typedef VMUINT32 VM_TS_DCL_FLAGS; + + +/***************************************************************************** + * DESCRIPTION + * VM_TS_DCL_HANDLE is the type used to record a specific device that opened by vm_ts_dcl_open. + * This value will be pass to other API to tell the driver which device will response to the corresponding operation. + *****************************************************************************/ +typedef VMINT32 VM_TS_DCL_HANDLE; + + +/*Represent invalid handle, returned by vm_ts_dcl_open.*/ +#define VM_TS_DCL_HANDLE_INVALID (-1) + + +/***************************************************************************** + * DESCRIPTION + * VM_TS_DCL_EVENT is the type used to register three level callcbcack, VM_TS_DCL_EVENT_T show the detail. + * Driver(UART/I2C/EINT,etc.) user can use VM_TS_DCL_REGISTER_CALLBACK_LEVEL0 to register level0 callback, + * VM_TS_DCL_REGISTER_CALLBACK_LEVEL2 to register level2 callback,and use VM_TS_DCL_REGISTER_CALLBACK_LEVEL3 to register level3 callback; + * But,other user(not user driver) just can use VM_TS_DCL_REGISTER_CALLBACK_LEVEL2 to register level2 callback, + * and use VM_TS_DCL_REGISTER_CALLBACK_LEVEL3 to register level3 callback. + *****************************************************************************/ +typedef VMUINT32 VM_TS_DCL_EVENT; + +typedef enum +{ + VM_TS_DCL_REGISTER_CALLBACK_LEVEL0=0,/*register LISR level*/ + VM_TS_DCL_REGISTER_CALLBACK_LEVEL2, /*register HISR level1*/ + VM_TS_DCL_REGISTER_CALLBACK_LEVEL3 /*register HISR level2*/ +}VM_TS_DCL_EVENT_T; + + +/***************************************************************************** + * DESCRIPTION + * VM_TS_DCL_CALLBACK_LEVEL is the type used to active callcbcack, VM_TS_DCL_CALLBACK_LEVEL_T show the detail. + * user can use VM_TS_DCL_CALLBACK_LEVEL2 to active level2 callback, and use VM_TS_DCL_CALLBACK_LEVEL3 to active level3 callback + *****************************************************************************/ +typedef VMUINT32 VM_TS_DCL_CALLBACK_LEVEL; +typedef enum +{ + VM_TS_DCL_CALLBACK_LEVEL2,/* HISR level1*/ + VM_TS_DCL_CALLBACK_LEVEL3 /* HISR level2*/ +}VM_TS_DCL_CALLBACK_LEVEL_T; + + +/***************************************************************************** + * DESCRIPTION + * VM_TS_DCL_CB_LEVEL0 is the prototype of the level0 callback function, + * with input parameter for driver(UART/I2C/EINT,etc.)sync status with user + * VM_TS_DCL_CB_LEVEL2 is the prototype of the level2 callback function. + * VM_TS_DCL_CB_LEVEL3 is the prototype of the level3 callback function. + *****************************************************************************/ +typedef void (* VM_TS_DCL_CB_LEVEL0)(VMUINT32 para); +typedef void (* VM_TS_DCL_CB_LEVEL2)(void); +typedef void (* VM_TS_DCL_CB_LEVEL3)(void); + + +/***************************************************************************** + * DESCRIPTION + * VM_TS_DCL_CTRL_CMD is the type used to represent the operation the driver need to do. + * The value of the type variable is depend on specific device driver. + * The detail please reference to the command enum of driver. + *****************************************************************************/ +typedef VMUINT32 VM_TS_DCL_CTRL_CMD; + +/***************************************************************************** + * DESCRIPTION + * VM_TS_DCL_STATUS is the type used to represent the status the driver returned. + * The meaning of the value please reference to VM_TS_DCL_STATUS. + *****************************************************************************/ +typedef VMINT32 VM_TS_DCL_STATUS; + + +/* This used to represent the status of dcl operations.*/ +typedef enum +{ + VM_TS_DCL_STATUS_OK = 0, /*Operation success*/ + VM_TS_DCL_STATUS_FAIL = -1, /*Operation failed*/ + VM_TS_DCL_STATUS_INVALID_CMD = -2, /*The command send to device is invalid*/ + VM_TS_DCL_STATUS_UNSUPPORTED = -3, /*The device do not support the operation*/ + VM_TS_DCL_STATUS_NOT_OPENED = -4, /*The device isn't open*/ + VM_TS_DCL_STATUS_INVALID_EVENT = -5, /*The event is invalid*/ + VM_TS_DCL_STATUS_INVALID_DCL_HANDLE = -6, /*The handle used to operate the device is invalid. The invalid handle returned by vm_dcl_open is another value.*/ + VM_TS_DCL_STATUS_INVALID_CTRL_DATA = -7, /*The data used to control the device is invalid.*/ + VM_TS_DCL_STATUS_INVALID_ARGUMENT = -9, /*The data used to control the device is invalid.*/ + VM_TS_DCL_STATUS_ERROR_TIMEOUT = -10, /*Operation timeout.*/ + VM_TS_DCL_STATUS_ERROR_CRCERROR = -11, /*CRC error.*/ + VM_TS_DCL_STATUS_ERROR_READONLY = -12, /*device is readonly.*/ + VM_TS_DCL_STATUS_ERROR_WRONG_STATE = -13, /*wrong state.*/ + VM_TS_DCL_STATUS_INVALID_DEVICE = -14, /*invalid device.*/ + VM_TS_DCL_STATUS_ALREADY_OPENED = -15, /*device is already opened.*/ + VM_TS_DCL_STATUS_INVALID_OPERATION = -17, /*operation is invalid.*/ + VM_TS_DCL_STATUS_DEVICE_NOT_EXIST = -18,/*device is not exist.*/ + VM_TS_DCL_STATUS_DEVICE_IS_BUSY = -20,/*device is busy.*/ +} VM_TS_DCL_STATUS_T; + + + +/***************************************************************************** +* FUNCTION + * vm_ts_dcl_open + * DESCRIPTION + * 1 Open one device. Every device must be opened with this function before use it. + * The device number passed to this function was defined in device driver's header file(except dummy device). + * The returned handle is the device's identify which will be passed to the other functions at runtime + * PARAMETERS + * device: [IN] The number of device, given by device driver. It's a 16 bits integer. + * flags: [IN] The parameter needed for the device. It's a 32 bits unsigned integer. Some driver may not need this. + * RETURNS + * The return value is the handle which record the information of corresponding device. + * + * RETURN VALUES + * VM_TS_DCL_HANDLE: The handle record the information of corresponding device. + * If the value of returned handle equal to VM_TS_DCL_HANDLE_INVALID, the open operation failed. + * + * EXAMPLE + * + * VM_TS_DCL_HANDLE uart_handle; + * uart_handle = vm_dcl_open(vm_uart_port1,0); + * if(VM_TS_DCL_HANDLE_INVALID==uart_handle) + * return; + * else + * //Do something with the handle. + * +*****************************************************************************/ +VM_TS_DCL_HANDLE vm_ts_dcl_open(VM_TS_DCL_DEV dev, VM_TS_DCL_FLAGS flags); + + +/***************************************************************************** +* FUNCTION + * vm_ts_dcl_control + * DESCRIPTION + * Send command to control the device. + * This function used to control the device after open the device successfully. + * The command tell the driver what to do and the arg will give the information needed for the control to driver. + * The command is defined in device driver's header file and represent different meaning even have the same value + * for different device. So the handle, command and arg must be match, otherwise the operation maybe given to wrong + * device or do wrong operation. + * This function maybe synchronous or asynchronous operation depending on which devices' which command. + * The details please reference to the command description in the specific driver's document. + * PARAMETERS + * handle: [IN] The handle which returned by vm_dcl_open. + * cmd: [IN] The command used to control the device. The detail reference to the device document. + * arg: [IN] The argument used by the command. The detail reference to the device document. + * RETURNS + * The return value is status. The meaning reference to VM_TS_DCL_STATUS_T; + * + * RETURN VALUES + * VM_TS_DCL_STATUS : The return value is status.The meaning reference to VM_TS_DCL_STATUS_T; + * + * EXAMPLE + * + * VM_TS_DCL_STATUS status; + * vm_ts_sio_ctrl_dcb_t config; + * VM_TS_DCL_MODULE_TYPE_T usr_id; + * VM_TS_DCL_HANDLE uart_handle; + * + * uart_handle = vm_ts_dcl_open(vm_ts_uart_port1,usr_id); + * config.u4OwenrId = usr_id; + * config.rUARTConfig.fgDSRCheck = 0; + * config.rUARTConfig.u1DataBits = 8; + * config.rUARTConfig.u1FlowControl = VM_FC_NONE; + * config.rUARTConfig.u1Parity = VM_PA_NONE; + * config.rUARTConfig.u1StopBits = VM_SB_1; + * config.rUARTConfig.u4Baud = 115200; + * config.rUARTConfig.ucXoffChar = 0x13; + * config.rUARTConfig.ucXonChar = 0x11; + * status=vm_ts_dcl_control(uart_handle,VM_TS_SIO_CMD_SET_DCB_CONFIG,&config); + * +*****************************************************************************/ +VM_TS_DCL_STATUS vm_ts_dcl_control(VM_TS_DCL_HANDLE handle,VM_TS_DCL_CTRL_CMD cmd, void* arg); + + +/***************************************************************************** +* FUNCTION + * vm_ts_dcl_close + * DESCRIPTION + * Close the device, after the device finished the operation, user should close the device. + * PARAMETERS + * handle: [IN] The handle which returned by vm_dcl_open. + * RETURNS + * The return value is status. The meaning reference to VM_DCL_STATUS_T; + * + * RETURN VALUES + * VM_DCL_STATUS : The return value is status.The meaning reference to VM_DCL_STATUS_T; + * +* EXAMPLE + * + * status = vm_dcl_close(i2c_handle); + * status = vm_dcl_close(user_handle); + * +*****************************************************************************/ +VM_TS_DCL_STATUS vm_ts_dcl_close(VM_TS_DCL_HANDLE handle); + + +/***************************************************************************** +* FUNCTION + * vm_ts_dcl_register_callback + * DESCRIPTION + * Register user's callback. + * For Driver(UART/I2C/EINT,etc.) user, the callback is for device to do asynchronous operations. + * For other(not driver user) user,the callback support one context to run code. + * In both case, it's should be register the callback, before active it. + * The implementation of the callback please reference to prototype of the callback function. + * PARAMETERS + * handle: [IN] The handle which returned by vm_ts_dcl_open. + * event: [IN] The event indicate register which level of callback, include: VM_TS_DCL_REGISTER_CALLBACK_LEVEL0, + * VM_TS_DCL_REGISTER_CALLBACK_LEVEL2,VM_TS_DCL_REGISTER_CALLBACK_LEVEL3 + * callback: [IN] callback function. + * + * RETURN VALUES + * VM_TS_DCL_STATUS : The return value is status. + * +* EXAMPLE + * + + * +*****************************************************************************/ +VM_TS_DCL_STATUS vm_ts_dcl_register_callback(VM_TS_DCL_HANDLE handle,VM_TS_DCL_EVENT event, void* callback); + + +/***************************************************************************** + * FUNCTION + * vm_ts_dcl_active_callback + * DESCRIPTION + * Active callback,use to active just level2 or level3 callback,(not include level0 callback),if register before. + * PARAMETERS + * handle: [IN] The handle which returned by vm_ts_dcl_open. + * level: [IN] The level indicate active which level of callback, include: VM_TS_DCL_CALLBACK_LEVEL2, + * VM_TS_DCL_CALLBACK_LEVEL3 + * RETURN VALUES + * VM_TS_DCL_STATUS : The return value is status. + * + * EXAMPLE + * + + * +*****************************************************************************/ +void vm_ts_dcl_active_callback(VM_TS_DCL_HANDLE handle, VM_TS_DCL_CALLBACK_LEVEL level); + + +#ifdef __cplusplus +} +#endif + +#endif /* __VM_DCL_H__ */ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_eint.h b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_eint.h new file mode 100644 index 00000000..3dc4d31a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_eint.h @@ -0,0 +1,80 @@ +#ifndef __VM_TS_DCL_EINT_H__ +#define __VM_TS_DCL_EINT_H__ + + +/****************************************************************** +* DESCRIPTION +* This enum defines the device for EINT module,used in vm_ts_dcl_open as a parameter. +* To control GPIOs, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vmtsdcl.h" +* VM_TS_DCL_HANDLE eint_handle; // Declare a VM_TS_DCL_HANDLE variable. +* eint_handle = vm_ts_dcl_open(VM_TS_DCL_EINT,12); // Call vm_ts_dcl_open to get a handle. 12 means eint's number is 12. +* +*******************************************************************/ +typedef enum +{ + VM_TS_EINT_GROUP_START = VM_TS_DCL_EINT_GROUP_START, + VM_TS_DCL_EINT /*This is for control normal eint function. */ +}VM_TS_DCL_EINT_DEV; + +/****************************************************************** +* DESCRIPTION +* This enum define the control command for EINT module,used in vm_ts_dcl_control as parameter. +* With different commands, user could control the different function of the EINT. +* To control EINT, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vmtsdcl.h" +* VM_TS_DCL_HANDLE eint_handle; // Declare a VM_TS_DCL_HANDLE variable. +* VM_TS_DCL_EINT_CTRL_CONFIG_T eint_config; //Declare a VM_TS_DCL_EINT_CTRL_CONFIG_T variable. +* VM_TS_DCL_EINT_CTRL_SET_HW_DEBOUNCE_T deboun_time; //Declare a VM_TS_DCL_EINT_CTRL_SET_HW_DEBOUNCE_T variable. +* eint_handle = vm_ts_dcl_open(VM_TS_DCL_EINT,19); // First, we call vm_ts_dcl_open to get a handle. 19 means eint19 +* vm_ts_dcl_control(eint_handle,VM_TS_EINT_CMD_MASK,NULL); // Usually, before we config eint, we mask it firstly. +* vm_ts_dcl_register_callback(eint_handle,VM_TS_DCL_REGISTER_CALLBACK_LEVEL2,(void)eint_callback); // register callback function,Note: eint calback is given by user +* deboun_time.debounce_time = 10; //Debounce time 10ms +* vm_ts_dcl_control(eint_handle,VM_TS_EINT_CMD_SET_HW_DEBOUNCE,(void *)&deboun_time); // Set debounce time +* eint_config.act_polarity = 0; // 1 means positive active, 0 means negative active. +* eint_config.debounce_en = 1; // 1 means enable hw debounce, 0 means disable. +* eint_config.act_sens = 1; // 1 means level, 0 means edge. +* vm_ts_dcl_control(eint_handle,VM_TS_EINT_CMD_CONFIG,(void *)&eint_config); // Please call this api finally, because we will unmask eint in this command. +* vm_ts_dcl_control(eint_handle,VM_TS_EINT_CMD_UNMASK,NULL); // call this function to unmask this eint. +* vm_ts_dcl_close(eint_handle); // Finally, if you are sure you will not use eint, you call vm_dcl_close ,otherwise, not call this api. +* +*******************************************************************/ +typedef enum{ + VM_TS_DCL_EINT_CMD_CONFIG, /* EINT config command. */ + VM_TS_DCL_EINT_CMD_SET_HW_DEBOUNCE, /* EINT set hardware debounce command. */ + VM_TS_DCL_EINT_CMD_MASK, /* EINT mask command. */ + VM_TS_DCL_EINT_CMD_UNMASK, /* EINT unmask command. */ + VM_TS_DCL_EINT_CMD_ACK, /* EINT ack command, after callback, user should act the eint*/ +}VM_TS_DCL_EINT_CTRL_CMD; + + + /****************************************************************** + * DESCRIPTION + * This struct is for VM_TS_DCL_EINT_CMD_CONFIG control command,used in vm_ts_dcl_control as parameter. + * You can find the sample code in the description of VM_TS_DCL_EINT_CTRL_CMD. + *******************************************************************/ +typedef struct +{ + VMUINT8 debounce_en; /* The value is 1 or 0. 1 means enable hw debounce, 0 means disable */ + VMUINT8 act_sens; /* The value is 1 0r 0. 1 means level trigger, 0 means edge trigger.*/ + VMUINT8 act_polarity; /* The value is 1 0r 0. 1 means positive active, 0 means negative active.*/ +}VM_TS_DCL_EINT_CTRL_CONFIG_T; + + /****************************************************************** + * DESCRIPTION + * This struct is for VM_TS_DCL_EINT_CMD_SET_HW_DEBOUNCE control command,used in vm_ts_dcl_control as parameter. + * You can find the sample code in the description of VM_TS_DCL_EINT_CTRL_CMD. + *******************************************************************/ +typedef struct +{ + VMUINT32 debounce_time;/* HW debounce time. the unit is ms.*/ +} VM_TS_DCL_EINT_CTRL_SET_HW_DEBOUNCE_T; + + + +#endif + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_gpio.h b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_gpio.h new file mode 100644 index 00000000..dc9cf765 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_gpio.h @@ -0,0 +1,174 @@ +#ifndef __VM_TS_DCL_GPIO_H__ +#define __VM_TS_DCL_GPIO_H__ + + + +/****************************************************************** +* DESCRIPTION +* This enum defines the device for gpio module,used in vm_ts_dcl_open as a +parameter. +* To control GPIOs, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vmtsdcl.h" +* VM_TS_DCL_HANDLE gpio_handle; // Declare a VM_TS_DCL_HANDLE variable. +* gpio_handle = vm_ts_dcl_open(VM_TS_DCL_GPIO,55); // Call vm_ts_dcl_open to get a handle. 55 means gpio55 +* +*******************************************************************/ + +typedef enum +{ + VM_TS_GPIO_GROUP_START = VM_TS_DCL_GPIO_GROUP_START, + VM_TS_DCL_GPIO, /*This is for control normal gpio function. */ + VM_TS_DCL_GPIO_CLK /*This is for control clock out for some gpio. */ +}VM_TS_DCL_GPIO_DEV; + + +/****************************************************************** +* DESCRIPTION +* This enum is for VM_TS_DCL_GPIO_CMD_SET_CLK_OUT command,used in vm_ts_dcl_control as parameter. +* Please refer the introduction of VM_TS_DCL_GPIO_CTRL_SET_CLK_OUT_T for more details. +*******************************************************************/ +typedef enum { + VM_TS_MODE_DEFAULT = 0, /*The default mode is 0. User should refer to the GPIO datasheet to see the specified value*/ + VM_TS_MODE_F32K_CK = 0x82, /*Use this enum value to set the 32K clock out in a faster way*/ + VM_TS_MODE_MAX_NUM /*This value defines the max number of mode, do not exceed this value*/ + } VM_TS_DCL_GPIO_CLK_MODE; + + +/****************************************************************** +* DESCRIPTION +* This enum is for VM_TS_DCL_GPIO_CMD_SET_CLK_DIV,used in vm_ts_dcl_control as parameter. +* Please refer the introduction of VM_TS_DCL_GPIO_CTRL_SET_CLK_DIV_T for more details. +*******************************************************************/ +typedef enum { + VM_TS_DIV_MAX_NUM =16 /*This value defines the max number of div, do not exceed this value*/ +} VM_TS_DCL_GPIO_CLK_DIV; + + +/****************************************************************** +* DESCRIPTION +* This enum define the control command for GPIO module,used in vm_ts_dcl_control as parameter. +* With different commands, user could control the different function of the GPIOs. +* To control GPIOs, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vmtsdcl.h" +* VM_TS_DCL_HANDLE gpio_handle; // Declare a VM_TS_DCL_HANDLE variable. +* VM_TS_DCL_GPIO_CTRL_READ_T gpio_input_data; //Declare a variable for read IO. +* VM_TS_DCL_GPIO_CTRL_SET_PUPD_R0_R1_T pupd_r0r1_data; //Declare a VM_TS_DCL_GPIO_CTRL_SET_PUPD_R0_R1_T variable. +* gpio_handle = vm_ts_dcl_open(VM_TS_DCL_GPIO,55); // First, we call vm_ts_dcl_open to get a handle. 55 means gpio55 +* vm_ts_dcl_control(gpio_handle,VM_TS_DCL_GPIO_CMD_SET_MODE_3,NULL); // we call vm_ts_dcl_control to set gpio55 as mode3. +* vm_ts_dcl_control(gpio_handle,VM_TS_DCL_GPIO_CMD_READ,(void *)&gpio_input_data); // We call vm_ts_dcl_control to read gpio55 . +* vm_ts_dcl_control(gpio_handle,VM_TS_DCL_GPIO_CMD_WRITE_HIGH,0); // we call vm_ts_dcl_control to write gpio55 . +* pupd_r0r1_data.fgSetPupd = 1; // More details, please refer to the GPIO datasheet. +* pupd_r0r1_data.fgSetR0 = 1; // More details, please refer to the GPIO datasheet. +* pupd_r0r1_data.fgSetR1 = 0; // More details, please refer to the GPIO datasheet. +* vm_ts_dcl_control(gpio_handle,VM_TS_DCL_GPIO_CMD_SET_PUPD_R0_R1,(void *)&pupd_r0r1_data); //we call vm_ts_dcl_control to set pupd of gpio55 . +* vm_ts_dcl_close(gpio_handle); // Finally, we call vm_ts_dcl_close +* +*******************************************************************/ +typedef enum +{ + VM_TS_DCL_GPIO_CMD_READ, /*read data from GPIO Pin*/ + VM_TS_DCL_GPIO_CMD_WRITE_LOW, /*write low to GPIO pin*/ + VM_TS_DCL_GPIO_CMD_WRITE_HIGH, /*write high to GPIO Pin*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_0, /*set GPIO mode as mode 0*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_1, /*set GPIO mode as mode 1*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_2, /*set GPIO mode as mode 2*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_3, /*set GPIO mode as mode 3*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_4, /*set GPIO mode as mode 4 ,only for chip support 4-bit mode*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_5, /*set GPIO mode as mode 5*,only for chip support 4-bit mode*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_6, /*set GPIO mode as mode 6*,only for chip support 4-bit mode*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_7, /*set GPIO mode as mode 7*,only for chip support 4-bit mode*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_8, /*set GPIO mode as mode 8*,only for chip support 4-bit mode*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_9, /*set GPIO mode as mode 9*,only for chip support 4-bit mode*/ + VM_TS_DCL_GPIO_CMD_SET_MODE_10, /*set GPIO mode as mode 10*,only for chip support 4-bit mode*/ + VM_TS_DCL_GPIO_CMD_SET_DIR_OUT, /*set GPIO direction as output*/ + VM_TS_DCL_GPIO_CMD_SET_DIR_IN, /*set GPIO direction as input*/ + VM_TS_DCL_GPIO_CMD_ENABLE_PULL, /*enable GPIO pull-up/pull-down seting */ + VM_TS_DCL_GPIO_CMD_DISABLE_PULL, /*disable GPIO pull-up/pull-down seting*/ + VM_TS_DCL_GPIO_CMD_SET_PULL_HIGH, /*set GPIO as pull-up*/ + VM_TS_DCL_GPIO_CMD_SET_PULL_LOW, /*set GPIO as pull-down*/ + VM_TS_DCL_GPIO_CMD_SET_CLK_OUT, /*select the clock output source of GPIO*/ + VM_TS_DCL_GPIO_CMD_SET_CLK_DIV, /*select the clock div of GPIO*/ + VM_TS_DCL_GPIO_CMD_SET_PUPD_R0_R1, /*set the pupd ,r0,r1 register of gpio*/ +}VM_TS_DCL_GPIO_CTRL_CMD_T; + +/****************************************************************** +* DESCRIPTION +* This struct is for VM_TS_DCL_GPIO_CMD_READ control command,used in vm_ts_dcl_control as parameter. +* You can find the sample code in the description of VM_TS_DCL_GPIO_CTRL_CMD_T. +*******************************************************************/ +typedef struct +{ + VMUINT8 u1IOData; /* The returned value. 0 means the GPIO pin input level is low. 1 means level is high*/ +} VM_TS_DCL_GPIO_CTRL_READ_T; + +/****************************************************************** +* DESCRIPTION +* This struct is for VM_TS_DCL_GPIO_CMD_SET_PUPD_R0_R1 control command,used in vm_ts_dcl_control as parameter. +* With this command, you can set the pupd,r0,r1 funtion of a specified GPIOs. +* You can find the sample code in the description of VM_TS_DCL_GPIO_CTRL_CMD_T. +* All commands have similar usage. +*******************************************************************/ +typedef struct +{ + VMBOOL fgSetPupd; /*This function set the pull up/down resisters of some special GPIO pins. Different fgSetPupd,fgSetR0,fgSetR1 means defferent pull up/down resisters.Please get more details in datasheet.*/ + VMBOOL fgSetR0; /*This function set the pull up/down resisters of some special GPIO pins. Different fgSetPupd,fgSetR0,fgSetR1 means defferent pull up/down resisters.Please get more details in datasheet.*/ + VMBOOL fgSetR1; /*This function set the pull up/down resisters of some special GPIO pins. Different fgSetPupd,fgSetR0,fgSetR1 means defferent pull up/down resisters.Please get more details in datasheet.*/ +} VM_TS_DCL_GPIO_CTRL_SET_PUPD_R0_R1_T; + + +/****************************************************************** +* DESCRIPTION +* This struct is for VM_TS_DCL_GPIO_CMD_SET_CLK_OUT control command,used in vm_ts_dcl_control as parameter. +* To control GPIOs, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vmtsdcl.h" +* VM_TS_DCL_HANDLE gpio_handle; // Declare a VM_TS_DCL_HANDLE variable. +* VM_TS_DCL_GPIO_CTRL_SET_CLK_OUT_T clk_data; //Declare a VM_TS_DCL_GPIO_CTRL_SET_CLK_OUT_T variable. +* gpio_handle = vm_ts_dcl_open(VM_TS_DCL_GPIO_CLK,55);// Step1, we call open function to get a handle. 55 means gpio55. Notice the dev parameter is VM_TS_DCL_GPIO_CLK. +* clk_data.u2ClkNum = 2;// More details, please refer to the GPIO datasheet. +* clk_data.u2Mode = 4; //More details, please refer to the GPIO datasheet. +* vm_ts_dcl_control(gpio_handle,VM_TS_GPIO_CMD_SET_CLK_OUT,(void *)&clk_data); // Step2, we call control function to set clk of gpio. +* vm_ts_dcl_close(gpio_handle); // Finally, we call close function +* +*******************************************************************/ +typedef struct +{ + VMUINT16 u2ClkNum; /*The clock register number in datasheet.*/ + VM_TS_DCL_GPIO_CLK_MODE u2Mode; /*The clock mode in datasheet.different mode means different source clock selected*/ +} VM_TS_DCL_GPIO_CTRL_SET_CLK_OUT_T; + + +/****************************************************************** +* DESCRIPTION +* This struct is for VM_TS_DCL_GPIO_CMD_SET_CLK_DIV control command,used in vm_ts_dcl_control as parameter. +* To control GPIOs, you should use DCL(Driver Common Layer) APIs. +* Note,some platform do not have such functions and others may have. You should refer the datasheet before using GPIOs. +* EXAMPLE +* +* #include "vmtsdcl.h" +* VM_TS_DCL_HANDLE gpio_handle; // Declare a VM_TS_DCL_HANDLE variable. +* VM_TS_DCL_GPIO_CTRL_SET_CLK_DIV_T clk_data; //Declare a VM_TS_DCL_GPIO_CTRL_SET_CLK_DIV_T variable. +* gpio_handle = vm_ts_dcl_open(VM_TS_DCL_GPIO_CLK,55);// Step1, we call open function to get a handle. 55 means gpio55. Notice the dev parameter is VM_TS_DCL_GPIO_CLK. +* clk_data.u2ClkNum = 3;// More details, please refer to the GPIO datasheet. +* clk_data.u2Div = 2; //More details, please refer to the GPIO datasheet. +* vm_ts_dcl_control(gpio_handle,VM_TS_DCL_GPIO_CMD_SET_CLK_DIV,(void *)&clk_data); // Step2, we call control function to set clk div of gpio. +* vm_ts_dcl_close(gpio_handle); // Finally, we call close function +* +*******************************************************************/ +typedef struct +{ + VMUINT16 u2ClkNum; /*The clock register number in datasheet.*/ + VM_TS_DCL_GPIO_CLK_DIV u2Div; /*The division value in datasheet.Please get more details in datasheet.*/ +}VM_TS_DCL_GPIO_CTRL_SET_CLK_DIV_T; + + + + +#endif + + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_i2c.h b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_i2c.h new file mode 100644 index 00000000..daccde73 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_i2c.h @@ -0,0 +1,116 @@ +#ifndef __VM_TS_DCL_I2C_H__ +#define __VM_TS_DCL_I2C_H__ + +/****************************************************************** +* DESCRIPTION +* This enum defines the device for I2C module,used in vm_ts_dcl_open as a parameter. +* To control I2C, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vmtsdcl.h" +* VM_TS_DCL_HANDLE i2c_handle; // Declare a VM_TS_DCL_HANDLE variable. +* i2c_handle = vm_ts_dcl_open(VM_TS_DCL_I2C,0); // Call vm_ts_dcl_open to get a handle. flag fill 0. +* +*******************************************************************/ +typedef enum +{ + VM_TS_I2C_GROUP_START = VM_TS_DCL_I2C_GROUP_START, + VM_TS_DCL_I2C +}VM_TS_DCL_I2C_DEV; + +/****************************************************************** +* DESCRIPTION +* This enum defines the I2C transaction state, it will be given to user by lisr callback +* For more details , refer the VM_TS_DCL_I2C_CTRL_CMD_T description. +*******************************************************************/ + typedef enum + { + VM_TS_DCL_I2C_TRANS_STA_FINISH = 1, /* transfer finish success */ + VM_TS_DCL_I2C_TRANS_STA_ACK_ERR, /* an ack error happened */ + VM_TS_DCL_I2C_TRANS_STA_NACK_ERR, /* an n-ack error happened */ + VM_TS_DCL_I2C_TRANS_STA_FAIL, /* unexpected error happend*/ + }VM_TS_DCL_I2C_TRANSACTION_STATE; + + /****************************************************************** + * DESCRIPTION + * This enum defines the I2C transaction mode. + * For more details , refer the VM_TS_DCL_I2C_CTRL_CONFIG_T description. + *******************************************************************/ +typedef enum +{ + VM_TS_DCL_I2C_TRANSACTION_FAST_MODE, /* Fast Mode: < 400kbps */ + VM_TS_DCL_I2C_TRANSACTION_HIGH_SPEED_MODE /* Hign Speed Mode: > 400kbps */ +}VM_TS_DCL_I2C_TRANSACTION_MODE; + +/****************************************************************** +* DESCRIPTION +* This enum define the control command for I2C module,used in vm_ts_dcl_control as parameter. +* With different commands, user could control the different function of the I2C. +* To control I2C, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vmtsdcl.h" +* VM_TS_DCL_HANDLE i2c_handle; // Declare a VM_TS_DCL_HANDLE variable. +* VM_TS_DCL_I2C_CTRL_CONFIG_T i2c_config; +* i2c_handle = vm_ts_dcl_open(VM_TS_DCL_I2C,0); // First, we call vm_ts_dcl_open to get a handle. 19 means eint19 +* vm_ts_dcl_register_callback(i2c_handle,VM_TS_DCL_REGISTER_CALLBACK_LEVEL2,(void)i2c_lisr_cb); // register callback function,Note:i2c_lisr_cb is given by user +* vm_ts_dcl_control(i2c_handle,VM_TS_DCL_I2C_CMD_CONFIG,(void *)&i2c_config); // Usually, before we config eint, we mask it firstly. +* vm_ts_dcl_control(i2c_handle,VM_TS_DCL_I2C_CMD_SINGLE_WRITE_ASYNC,NULL); // Usually, before we config eint, we mask it firstly. +* vm_ts_dcl_close(i2c_handle); // Finally, if you are sure you will not use eint, you call vm_dcl_close ,otherwise, not call this api. +* +*******************************************************************/ +typedef enum +{ + VM_TS_DCL_I2C_CMD_SINGLE_WRITE_ASYNC, /* Single write of none-blocking mode */ + VM_TS_DCL_I2C_CMD_SINGLE_READ_ASYNC, /* Single read of none-blocking mode */ + VM_TS_DCL_I2C_CMD_CONT_WRITE_ASYNC, /* Continue write of none-blocking mode */ + VM_TS_DCL_I2C_CMD_CONT_READ_ASYNC, /* Continue read of none-blocking mode */ + VM_TS_DCL_I2C_CMD_WRITE_AND_READ_ASYNC, /* Write and read of none-blocking mode */ + VM_TS_DCL_I2C_CMD_SINGLE_WRITE_SYNC, /* Single write of blocking mode */ + VM_TS_DCL_I2C_CMD_SINGLE_READ_SYNC, /* Single read of blocking mode */ + VM_TS_DCL_I2C_CMD_CONT_WRITE_SYNC, /* Continue write of blocking mode */ + VM_TS_DCL_I2C_CMD_CONT_READ_SYNC, /* Continue read of blocking mode */ + VM_TS_DCL_I2C_CMD_WRITE_AND_READ_SYNC, /* Write and read of blocking mode */ + VM_TS_DCL_I2C_CMD_CONFIG +}VM_TS_DCL_I2C_CTRL_CMD_T; + +/* For I2C_CMD_SINGLE_WRITE, I2C_CMD_SINGLE_READ command. */ +typedef struct +{ + VMUINT8 *pu1Data; /* Pointer to the buffer of data */ + VMUINT32 u4DataLen; /* Data length */ +}VM_TS_DCL_I2C_CTRL_SINGLE_WRITE_T, VM_TS_DCL_I2C_CTRL_SINGLE_READ_T; + +/* For I2C_CMD_CONT_WRITE, I2C_CMD_CONT_READ command. */ +typedef struct +{ + VMUINT8 *pu1Data; /* Pointer to the buffer of data */ + VMUINT32 u4DataLen; /* Data length of each transfer */ + VMUINT32 u4TransferNum; /* Transfer number */ +}VM_TS_DCL_I2C_CTRL_CONT_WRITE_T, VM_TS_DCL_I2C_CTRL_CONT_READ_T; + +/* For I2C_CMD_WRITE_AND_READ command. */ +typedef struct +{ + VMUINT8 *pu1InData; /* Pointer to the read data */ + VMUINT32 u4InDataLen; /* Read data length */ + VMUINT8 *pu1OutData; /* Pointer to the write data */ + VMUINT32 u4OutDataLen; /* Write data length */ +}VM_TS_DCL_I2C_CTRL_WRITE_AND_READE_T; + +/* DCL I2C configure structure */ +typedef struct +{ + VMUINT8 u1SlaveAddress; /* Slave address */ + VMUINT8 u1DelayLen; /* Wait delay between consecutive transfers (the unit is half pulse width) */ + VM_TS_DCL_I2C_TRANSACTION_MODE eTransactionMode; /* Fast mode or high speed mode */ + VMUINT32 u4FastModeSpeed; /* The transfer speed under fast mode. But even under high speed mode, you should alse configure this parameter */ + VMUINT32 u4HSModeSpeed; /* The transfer speed under high speed mode */ +} VM_TS_DCL_I2C_CTRL_CONFIG_T; + + +#endif + + + + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_rtc.h b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_rtc.h new file mode 100644 index 00000000..8db5d031 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_rtc.h @@ -0,0 +1,100 @@ +#ifndef __VM_TS_DCL_RTC_H__ +#define __VM_TS_DCL_RTC_H__ + + +/****************************************************************** +* DESCRIPTION +* This enum defines the device for RTC module,used in vm_ts_dcl_open as a parameter. +* To control GPIOs, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vmtsdcl.h" +* VM_TS_DCL_HANDLE rtc_handle; // Declare a VM_TS_DCL_HANDLE variable. +* rtc_handle = vm_ts_dcl_open(VM_TS_DCL_RTC,0); // Call vm_ts_dcl_open to get a handle. +* +*******************************************************************/ +typedef enum +{ + VM_TS_RTC_GROUP_START = VM_TS_DCL_RTC_GROUP_START, + VM_TS_DCL_RTC /*This is for control normal rtc function. */ +}VM_TS_DCL_RTC_DEV; + +/****************************************************************** +* DESCRIPTION +* This enum define the control command for RTC module,used in vm_ts_dcl_control as parameter. +* With different commands, user could control the different function of the RTC. +* To control RTC, you should use DCL(Driver Common Layer) APIs. +* EXAMPLE +* +* #include "vmtsdcl.h" +* VM_TS_DCL_HANDLE rtc_handle; // Declare a VM_TS_DCL_HANDLE variable. +* VM_TS_DCL_RTC_CTRL_GET_TIME_T getTime; // Declare a VM_TS_DCL_RTC_CTRL_GET_TIME_T variable. +* VM_TS_DCL_RTC_CTRL_SET_TIME_UPDATE_PERIOD_T setTimeUpdatePeriod; // Declare a VM_TS_DCL_RTC_CTRL_SET_TIME_UPDATE_PERIOD_T variable. +* rtc_handle = vm_ts_dcl_open(VM_TS_DCL_RTC,0); // First, we call vm_ts_dcl_open to get a handle. +* vm_ts_dcl_register_callback(rtc_handle,VM_TS_DCL_REGISTER_CALLBACK_LEVEL2,(void)rtc_callback); // register callback function,Note: rtc calback is given by user +* setTimeUpdatePeriod.time_update_period = VM_TC_EN_ChkS; // Wish to get time update notify per second. +* vm_ts_dcl_control(rtc_handle, VM_TS_RTC_CMD_SET_TIME_UPDATE_PERIOD, (void *)&setTimeUpdatePeriod); // Set debounce time +* vm_ts_dcl_control(rtc_handle, VM_TS_RTC_CMD_GET_TIME,(void *)&getTime); // Get current RTC time; +* vm_ts_dcl_close(rtc_handle); // Finally, if you are sure you will not use rtc, you call vm_dcl_close ,otherwise, not call this api. +* +*******************************************************************/ +typedef enum { + VM_TS_RTC_CMD_GET_TIME, /* To Get Time*/ + VM_TS_RTC_CMD_SET_TIME_UPDATE_PERIOD, /* To Set Time Update Period*/ +}VM_TS_DCL_RTC_CTRL_CMD_T; + + /****************************************************************** + * DESCRIPTION + * This enum define the different time update period choices. + * You can find the sample code in the description of VM_TS_DCL_RTC_CTRL_CMD_T. + *******************************************************************/ +typedef enum{ + VM_TC_EN_None, /* Time Counter Enable None */ + VM_TC_EN_ChkS, /* Time Counter Enable Check Sec */ + VM_TC_EN_ChkM, /* Time Counter Enable Check Min & Sec */ + VM_TC_EN_ChkH, /* Time Counter Enable Check Hour, Min & Sec */ + VM_TC_EN_ChkD, /* Time Counter Enable Check DOM, Hour, Min & Sec */ + VM_TC_EN_ChkW, /* Time Counter Enable Check DOW, Hour, Min & Sec */ + VM_TC_EN_ChkMon, /* Time Counter Enable Check Month, DOM, Hour, Min & Sec */ + VM_TC_EN_ChkY, /* Time Counter Enable Check Year, Month, DOM, Hour, Min & Sec */ + VM_TC_EN_NoChange, /* Time Counter Enable No Change */ +}VM_TS_DCL_RTC_TIME_UPDATE_PERIOD; + + /****************************************************************** + * DESCRIPTION + * This struct is the member VM_TS_DCL_RTC_CTRL_GET_TIME_T. + * You can find the sample code in the description of VM_TS_DCL_RTC_CTRL_CMD_T. + *******************************************************************/ +typedef struct +{ + VMUINT8 rtc_sec; /* Seconds after the minute - [0,59] */ + VMUINT8 rtc_min; /* Minutes after the hour - [0,59] */ + VMUINT8 rtc_hour; /* Hours after the midnight - [0,23] */ + VMUINT8 rtc_day; /* Day of the month - [1,31] */ + VMUINT8 rtc_mon; /* Months - [1,12] */ + VMUINT8 rtc_wday; /* Days in a week - [1,7] */ + VMUINT8 rtc_year; /* Years - [0,127] */ +}VM_TS_DCL_RTC_TIME_T; + + /****************************************************************** + * DESCRIPTION + * This struct is for VM_TS_RTC_CMD_GET_TIME control command,used in vm_ts_dcl_control as parameter. + * You can find the sample code in the description of VM_TS_DCL_RTC_CTRL_CMD_T. + *******************************************************************/ +typedef struct +{ + VM_TS_DCL_RTC_TIME_T time; +}VM_TS_DCL_RTC_CTRL_GET_TIME_T; + + /****************************************************************** + * DESCRIPTION + * This struct is for VM_TS_RTC_CMD_SET_TIME_UPDATE_PERIOD control command,used in vm_ts_dcl_control as parameter. + * You can find the sample code in the description of VM_TS_DCL_RTC_CTRL_CMD_T. + *******************************************************************/ +typedef struct +{ + VM_TS_DCL_RTC_TIME_UPDATE_PERIOD time_update_period; +}VM_TS_DCL_RTC_CTRL_SET_TIME_UPDATE_PERIOD_T; + +#endif + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_uart.h b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_uart.h new file mode 100644 index 00000000..3b8d3de0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtsdcl_uart.h @@ -0,0 +1,291 @@ + +#ifndef __VM_TS_DCL_UART_H_STRUCT__ +#define __VM_TS_DCL_UART_H_STRUCT__ + +/***************************************************************************** + * DESCRIPTION + * VM_TS_UART_PORT is the type of VMDCL_UINT16 ,which define the type UART_PORT + * user select + *****************************************************************************/ +typedef VMDCL_UINT16 VM_TS_UART_PORT; + +/******************************************************************************* + * DESCRIPTION + * VM_TS_UART_T_OWNER_TO_HANDLE(owner) is the owner and handler mapping MACRO + *******************************************************************************/ +#define VM_TS_UART_T_OWNER_TO_HANDLE(owner) (owner | VM_TS_DCL_UART_T_DEV_MAGIC_NUM) + +/******************************************************************************* + * DESCRIPTION + * VM_TS_DCL_UART_T_DEV_MAGIC_NUM is the magic number + *******************************************************************************/ +#define VM_TS_DCL_UART_T_DEV_MAGIC_NUM 0xA0000000 + +/***************************************************************************** + * DESCRIPTION + * VM_TS_DCL_UART_DEV_T is the uart type ENUM, user can select one of + * the port to use + * EXAMPLE + * + * uart_handle = vm_ts_dcl_open(VM_TS_UART_PORT1,0); + * if(VM_TS_DCL_HANDLE_INVALID==uart_handle) return; + * //Do something with the handle. + * + *****************************************************************************/ +typedef enum +{ + VM_TS_UART_PORT1=VM_TS_DCL_UART_GROUP_START, + VM_TS_UART_PORT2, + VM_TS_UART_PORT3 +} VM_TS_DCL_UART_DEV_T; + + +/***************************************************************************** + * DESCRIPTION + * VM_TS_DRV_UART_ID_CNT is the number of uart ports + *****************************************************************************/ +#define VM_TS_DRV_UART_ID_CNT 6 + + +/***************************************************************************** + * DESCRIPTION + * VM_TS_UART1_HISR_ID is UART1_HISR ID + *****************************************************************************/ +#define VM_TS_UART1_HISR_ID (VM_TS_DRV_UART_ID_START + 1) + +/***************************************************************************** + * DESCRIPTION + * VM_TS_UART1_HISR_RX_ID is UART1_HISR_RX ID + *****************************************************************************/ +#define VM_TS_UART1_HISR_RX_ID (VM_TS_DRV_UART_ID_START + 1) + +/***************************************************************************** + * DESCRIPTION + * VM_TS_UART1_HISR_TX_ID is UART1_HISR_TX ID + *****************************************************************************/ +#define VM_TS_UART1_HISR_TX_ID (VM_TS_DRV_UART_ID_START + 2) + +/***************************************************************************** + * DESCRIPTION + * VM_TS_UART2_HISR_ID is UART2_HISR ID + *****************************************************************************/ +#define VM_TS_UART2_HISR_ID (VM_TS_DRV_UART_ID_START + 3) + +/***************************************************************************** + * DESCRIPTION + * VM_TS_UART2_HISR_RX_ID is UART2_HISR_RX ID + *****************************************************************************/ +#define VM_TS_UART2_HISR_RX_ID (VM_TS_DRV_UART_ID_START + 3) + +/***************************************************************************** + * DESCRIPTION + * VM_TS_UART2_HISR_TX_ID is UART2_HISR_TX ID + *****************************************************************************/ +#define VM_TS_UART2_HISR_TX_ID (VM_TS_DRV_UART_ID_START + 4) + +/***************************************************************************** + * DESCRIPTION + * VM_TS_UART3_HISR_ID is UART3_HISR ID + *****************************************************************************/ +#define VM_TS_UART3_HISR_ID (VM_TS_DRV_UART_ID_START + 5) + +/***************************************************************************** + * DESCRIPTION + * VM_TS_UART3_HISR_RX_ID is UART3_HISR_RX ID + *****************************************************************************/ +#define VM_TS_UART3_HISR_RX_ID (VM_TS_DRV_UART_ID_START + 5) + +/***************************************************************************** + * DESCRIPTION + * VM_TS_UART3_HISR_TX_ID is UART3_HISR_TX ID + *****************************************************************************/ +#define VM_TS_UART3_HISR_TX_ID (VM_TS_DRV_UART_ID_START + 6) + +/************************************************************************************************************ + * DESCRIPTION + * VM_TS_UART_CTRL_CMD_T is the CMD type ENUM, user can use VM_TS_UART_CTRL_CMD_T + * command to control UART + * EXAMPLE + * + * VM_TS_DCL_HANDLE user_handler; + * VM_TS_UART_CTRL_GET_BYTES_T user_get_Data; + * user_get_Data.puBuffaddr = test_uart_Rx_buffer; + * user_get_Data.u2Length = ts_uart_total_get_num-ts_uart_have_get_num; + * user_handler = VM_TS_DCL_Open(VM_TS_UART_PORT1,0); + * VM_TS_DCL_Control(user_handler,VM_TS_UART_CMD_GET_BYTES,(void*)&user_get_Data); + * ts_uart_have_get_num += user_get_Data.u2RetSize; + * VM_TS_DCL_Close(user_handler); + * + **************************************************************************************************************/ +typedef enum +{ + VM_TS_UART_CMD_GET_BYTES, /*interrupt mode */ + VM_TS_UART_CMD_PUT_BYTES, /*interrupt mode */ + VM_TS_UART_CMD_GET_BYTE, /*polling mode */ + VM_TS_UART_CMD_PUT_BYTE /*polling mode */ +}VM_TS_UART_CTRL_CMD_T; + +/************************************************************************************************************ + * DESCRIPTION + * VM_TS_UART_CTRL_GET_BYTES_T is the cmd struct, user can use VM_TS_UART_CMD_GET_BYTES + * command to get data in interrupt mode + * EXAMPLE + * + * VM_TS_DCL_HANDLE user_handler; + * VM_TS_UART_CTRL_GET_BYTES_T user_get_Data; + * user_get_Data.puBuffaddr = test_uart_Rx_buffer; + * user_get_Data.u2Length = ts_uart_total_get_num-ts_uart_have_get_num; + * user_handler = VM_TS_DCL_Open(VM_TS_UART_PORT1,0); + * VM_TS_DCL_Control(user_handler,VM_TS_UART_CMD_GET_BYTES,(void*)&user_get_Data); + * ts_uart_have_get_num += user_get_Data.u2RetSize; + * VM_TS_DCL_Close(user_handler); + * + **************************************************************************************************************/ +typedef struct +{ + VMDCL_UINT16 u2Length; + VMDCL_UINT32 u4OwenrId; + VMDCL_UINT8* puBuffaddr; + VMDCL_UINT16 u2RetSize; +}VM_TS_UART_CTRL_GET_BYTES_T; + +/************************************************************************************************************ + * DESCRIPTION + * VM_TS_UART_CTRL_PUT_BYTES_T is the cmd struct, user can use VM_TS_UART_CTRL_PUT_BYTES_T + * command to put data in interrupt mode + * EXAMPLE + * + * VM_TS_DCL_HANDLE user_handler; + * VM_TS_UART_CTRL_PUT_BYTES_T user_put_Data; + * user_handler = VM_TS_DCL_Open(VM_TS_UART_PORT1,0); + * user_put_Data.puBuffaddr = test_uart_Tx_buffer; + * user_put_Data.u2Length = ts_uart_total_put_num-ts_uart_have_put_num; + * VM_TS_DCL_Control(user_handler,VM_TS_UART_CMD_PUT_BYTES,(void*)&user_put_Data); + * ts_uart_have_put_num += user_put_Data.u2RetSize; + * VM_TS_DCL_Close(user_handler); + * + **************************************************************************************************************/ +typedef struct +{ + VMDCL_UINT16 u2Length; + VMDCL_UINT32 u4OwenrId; + VMDCL_UINT8* puBuffaddr; + VMDCL_UINT16 u2RetSize; +}VM_TS_UART_CTRL_PUT_BYTES_T; + +/************************************************************************************************************ + * DESCRIPTION + * VM_TS_UART_CTRL_GET_BYTE_T is the cmd struct, user can use VM_TS_UART_CMD_GET_BYTE + * command to get data in polling mode + * EXAMPLE + * + * VM_TS_DCL_HANDLE user_handler; + * VM_TS_UART_CTRL_GET_BYTE_T user_get_Data; + * user_get_Data.puBuffaddr = &test_uart_Rx_one_data; + * user_handler = VM_TS_DCL_Open(TS_UART_PORT1,0); + * VM_TS_DCL_Control(user_handler,VM_TS_UART_CMD_GET_BYTE,(void*)&user_get_Data); + * if( user_get_Data.u1IsGetData ) + * { + * //get byte success + * } + * else + * { + * //there is no data + * } + * TS_DCL_Close(user_handler); + * + **************************************************************************************************************/ +typedef struct +{ + VMDCL_UINT32 u4OwenrId; + VMDCL_UINT8* puBuffaddr; + VMDCL_UINT8 u1IsGetData; +}VM_TS_UART_CTRL_GET_BYTE_T; + + +/************************************************************************************************************ + * DESCRIPTION + * VM_TS_UART_CTRL_PUT_BYTE_T is the cmd struct, user can use VM_TS_UART_CMD_PUT_BYTE + * command to put data in polling mode + * EXAMPLE + * + * VM_TS_DCL_HANDLE user_handler; + * VM_TS_UART_CTRL_PUT_BYTE_T user_put_Data; + * user_put_Data.puBuffaddr = &test_uart_Tx_one_data; + * user_handler = VM_TS_DCL_Open(TS_UART_PORT1,0); + * VM_TS_DCL_Control(user_handler,VM_TS_UART_CMD_PUT_BYTE,(void*)&user_get_Data); + * TS_DCL_Close(user_handler); + * + **************************************************************************************************************/ +typedef struct +{ + VMDCL_UINT32 u4OwenrId; + VMDCL_UINT8* puBuffaddr; +}VM_TS_UART_CTRL_PUT_BYTE_T; + + +extern VM_TS_DCL_STATUS VM_TS_Dcl_UART_Initialize(void); + +/************************************************************************* +* FUNCTION +* VM_TS_Dcl_UART_Open +* +* DESCRIPTION +* This function is to open the UART module and get a handle. Note that +* multiple opens are prohibited. +* +* PARAMETERS +* eDev - only valid for VM_TS_UART_PORT1, VM_TS_UART_PORT2, VM_TS_UART_PORT3(if exists) and +* DCL_UART_XXX. +* flags - user id (VM_TS_UART1_HISR_ID,VM_TS_UART2_HISR_ID.VM_TS_UART3_HISR_ID) +* +* RETURNS +* VM_TS_DCL_HANDLE_INVALID - The device is not valid. +* other value - a valid handle +* +*************************************************************************/ +extern VM_TS_DCL_HANDLE VM_TS_Dcl_UART_Open(TS_DCL_DEV dev, TS_DCL_FLAGS flags); + +/************************************************************************* +* FUNCTION +* VM_TS_Dcl_UART_Control +* +* DESCRIPTION +* This function is support UART module commands. +* +* CALLS +* It is called to send command to control the UART module. +* +* PARAMETERS +* handle - a valid handle return by VM_TS_Dcl_UART_Open() +* cmd - please refer to VM_TS_UART_CTRL_CMD_T STRUCT +* data - user's setting data +* +* RETURNS +* VM_TS_STATUS_OK: command is executed successfully. +* VM_TS_STATUS_INVALID_CMD: It's a invalid command. +* VM_TS_STATUS_INVALID_HANDLE: It's a invalid handle. +* +*************************************************************************/ +extern VM_TS_DCL_STATUS VM_TS_Dcl_UART_Control(TS_DCL_HANDLE handle, TS_DCL_CTRL_CMD cmd, void *data); + +/************************************************************************* +* FUNCTION +* VM_TS_Dcl_UART_Close +* +* DESCRIPTION +* This function is to close the UART module. +* +* PARAMETERS +* handle - hanlde previous got from VM_TS_Dcl_UART_Open() +* +* RETURNS +* VM_TS_STATUS_OK - successfully close the UART module. +* VM_TS_STATUS_INVALID_HANDLE - invalid handle + +*************************************************************************/ +extern VM_TS_DCL_STATUS VM_TS_Dcl_UART_Close(TS_DCL_HANDLE handle); + + +#endif + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtsloader.h b/hardware/arduino/mtk/system/libmtk/include/vmtsloader.h new file mode 100644 index 00000000..2c5be56a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtsloader.h @@ -0,0 +1,260 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ +/***************************************************************************** + * + * Filename: + * --------- + * vmtsloader.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * tiny system driver loader. + * + * Author: + * ------- + * + * + *============================================================================ + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ + * $Revision$ + * $Modtime$ + * $Log$ + * + * 05 28 2014 zhiwei.yang + * [MAUI_03492870] [Car Kit] GPS feature update + * . + * + * 05 26 2014 zhiwei.yang + * [MAUI_03492870] [Car Kit] GPS feature update + * . + * + * 05 20 2014 zhiwei.yang + * [MAUI_03492870] [Car Kit] GPS feature update + * . + * + * 04 21 2014 nan.zhao + * [MAUI_03493340] Check in LINKIT SDK + * . + * + * 04 18 2014 zhiwei.yang + * [MAUI_03488298] [MRE]tiny system check in + * . + * + *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================ + ****************************************************************************/ + +#ifndef _VM_TSLOADER_SDK_H +#define _VM_TSLOADER_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Definitions of tiny system driver loader return value */ +#define VM_TS_LOAD_ERR_UNKNOWN (-1) /* tiny system driver load failed */ +#define VM_TS_LOAD_ERR_FORMAT (-2) /* tiny system driver load file format error */ +#define VM_TS_LOAD_ERR_IO (-3) /* tiny system driver load file IO error */ +#define VM_TS_LOAD_ERR_MEMORY (-4) /* tiny system driver memory not enough */ +#define VM_TS_LOAD_ERR_MAXSIZE (-5) /* tiny system driver load driver too much */ + +/***************************************************************************** + * FUNCTION + * vm_ts_driver_load + * DESCRIPTION + * this interface used in AP mode, it allow the application load another appliction into memory, the loaded application will run on tiny mode. + * the first parameter is the file path to load, the second parameter is shared memory size, the memory can be accessed by both AP mode + * application(vm_ts_driver_get_mem) and tiny mode application(vm_ts_get_mem), so it can used by sharing data. this interface only load + * the application into memory, and the loaded application will auto run when system switch to tiny mode. + * You can load the tiny mode application in vm_main, or when you received VM_MSG_CREATE msg; and you also need unload the tiny mode + * application use vm_ts_driver_free when you want exit or not need tiny mode application anymore. + * PARAMETERS + * fileName : [IN] tiny system driver file without suffix or fullpath. + * size : size of shared memory + * RETURN VALUES + * >=0 : tiny driver handle. + * VM_TS_LOAD_ERR_UNKNOWN : If unsuccessful. + * VM_TS_LOAD_ERR_FORMAT : If unsuccessful. + * VM_TS_LOAD_ERR_IO : If unsuccessful. + * VM_TS_LOAD_ERR_MEMORY : If unsuccessful. + * VM_TS_LOAD_ERR_MAXSIZE : If unsuccessful. + * EXAMPLE + * + * // this interface allow application to load tiny mode driver into RAM, and the driver will auto launch when system + * // switch to tiny mode, + * VMINT hdl = -1; + * void handle_sysevt(VMINT message, VMINT param) { + * switch (message) { + * case VM_MSG_LOAD_TINY: + * hdl = vm_ts_driver_load(wszBuf,512); + * + * if (hdl < 0) + * { + * vm_log_fatal("failed to load tiny driver"); + * } + * break; + * case VM_MSG_QUIT: + * if(hdl>=0) + * { + * vm_ts_driver_free(hdl); + * hdl = -1; + * } + * break; + * } + * } + * + *****************************************************************************/ +VMINT vm_ts_driver_load(VMWSTR fileName, VMINT size); + +/***************************************************************************** + * FUNCTION + * vm_ts_driver_free + * DESCRIPTION + * this interface used in AP mode, unload tiny system driver, you need unload the tiny driver when you not used it or + * your application exit + * PARAMETERS + * handle : [IN] tiny system driver file handler, get from vm_ts_driver_load + * RETURN VALUES + * NULL + * SEE ALSO + * vm_ts_driver_load + * EXAMPLE + * + * void handle_sysevt(VMINT message, VMINT param) { + * switch (message) { + * case VM_MSG_CREATE: + * break; + * case VM_MSG_QUIT: + * if(hdl>=0) + * { + * vm_ts_driver_free(hdl); + * hdl = -1; + * } + * break; + * } + * } + * + *****************************************************************************/ +void vm_ts_driver_free(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_ts_driver_get_mem + * DESCRIPTION + * this interface used in AP mode, get share memory pointer form tiny driver, when system switch tiny mode to ap mode, it will + * receive msg of VM_MSG_AP_MODE, you can use this interface to get memory address to get data. + * PARAMETERS + * handle : [IN] tiny driver file handler get from vm_ts_driver_load + * RETURN VALUES + * >0 : shared memory address + * NULL : no memory shared + * SEE ALSO + * vm_ts_driver_load + * EXAMPLE + * + * void* share_mem = NULL; + * void handle_sysevt(VMINT message, VMINT param) { + * switch (message) { + * case VM_MSG_CREATE: + * break; + * case VM_MSG_SUSPEND_TO_AP_MODE: + * if(hdl>=0) + * { + * share_mem = (VMCHAR *)vm_ts_driver_get_mem(hdl); + * // use the data in the memory + * } + * break; + * case VM_MSG_QUIT: + * if(hdl>=0) + * { + * vm_ts_driver_free(hdl); + * hdl = -1; + * } + * break; + * } + * } + * + *****************************************************************************/ +void* vm_ts_driver_get_mem(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_ts_driver_get_handle + * DESCRIPTION + * get tiny app handle when return AP mode from Hibernation mode + * PARAMETERS + * void + * RETURN VALUES + * >=0 : handle + * <0 : not find the handle + * EXAMPLE + * + * void* share_mem = NULL; + * void handle_sysevt(VMINT message, VMINT param) { + * switch (message) { + * case VM_MSG_CREATE: + * break; + * case VM_MSG_HIBERNATION_TO_AP_MODE: + * hdl = vm_ts_driver_get_handle(); + * if(hdl>=0) + * { + * share_mem = (VMCHAR *)vm_ts_driver_get_mem(hdl); + * // use the data in the memory + * } + * break; + * case VM_MSG_QUIT: + * if(hdl>=0) + * { + * vm_ts_driver_free(hdl); + * hdl = -1; + * } + * break; + * } + * } + * + *****************************************************************************/ +VMINT vm_ts_driver_get_handle(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/hardware/arduino/mtk/system/libmtk/include/vmtssys.h b/hardware/arduino/mtk/system/libmtk/include/vmtssys.h new file mode 100644 index 00000000..be2eab19 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmtssys.h @@ -0,0 +1,503 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMTSSYS_SDK_H_ +#define VMTSSYS_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +typedef unsigned char VMUINT8; +typedef unsigned short VMUINT16; +typedef unsigned int VMUINT; +typedef unsigned long VMUINT32; + + +typedef unsigned long long VMUINT64 ; +typedef long long VMINT64 ; + + +typedef char VMINT8; +typedef short VMINT16; +typedef int VMINT; +typedef long VMINT32; + +typedef VMUINT8 VMUCHAR; +typedef VMUINT16 VMUWCHAR; +typedef VMUINT8 * VMUSTR; +typedef VMUINT16 * VMUWSTR; + +typedef VMINT8 VMCHAR; +typedef VMINT16 VMWCHAR; +typedef VMINT8 * VMSTR; +typedef VMINT16 * VMWSTR; + +typedef unsigned char VMBYTE; +typedef unsigned short VMUSHORT; +typedef short VMSHORT; + +typedef float VMFLOAT; + +typedef VMINT VMBOOL; + + +typedef struct +{ + VMUINT8 unused; +}*vm_ts_timerid; + +#ifndef BIT +#define BIT(i) (1U << i) +#endif + +#ifndef KHZ +#define KHZ(x) ((x) * 1000) +#endif + +#ifndef MHZ +#define MHZ(x) (KHZ(x) * 1000) +#endif + +typedef int VM_TS_BSSS_MODE; +#define VM_TS_BTSS_SUSPEND 0xcafebabe /* suspend mode */ +#define VM_TS_BTSS_HIBERNATION 0xfee1dead /* hibernation mode */ +#define VM_TS_BTSS_INVALID_MODE 0xDEADFA11 /* invalid mode */ + +/* For mode swith and blocker */ +typedef enum _VM_TS_BTSS_CLIENT{ + VM_TS_BTSS_CLIENT_MEMORY_DUMP = BIT(0), /* memdump */ + VM_TS_BTSS_CLIENT_TIMER = BIT(1), /* timer */ + VM_TS_BTSS_CLIENT_LOG = BIT(2), /* log */ + VM_TS_BTSS_CLIENT_KEYPAD = BIT(3), /* keypad */ + VM_TS_BTSS_CLIENT_DEF_INT = BIT(4), /* define INT */ + VM_TS_BTSS_CLIENT_CUST = BIT(30), /* cust */ +}VM_TS_BTSS_CLIENT; + + +/* DOM-NOT_FOR_SDK-BEGIN */ +void vm_ts_assert(VMSTR file, VMINT line); +void* vm_ts_csci_addr(char* key); +/* DOM-NOT_FOR_SDK-END */ + + +/* prototype of timer callback function */ +typedef void (*vm_ts_timer_func_ptr)(void *param_ptr); + +/* prototype of msg handler callback function */ +typedef void* (*vm_ts_service_hdlr_t)(VMINT func_id); + +typedef void (*vm_ts_swatch_pedometer_cb)(void* data); + +/***************************************************************************** + * FUNCTION + * vm_ts_irq_mask + * DESCRIPTION + * This interface used in tiny mode, Mask the I bit of the processor. Note this function must be used in pairs with vm_ts_irq_restore. + * And more, the I bit mask time should not exceed 5ms. + * PARAMETERS + * + * RETURN VALUES + * mask status of the current I bit, it should be an input parameter of vm_ts_irq_restore + * EXAMPLE + * + * VMUIN32 savedMask; + * savedMask = vm_ts_irq_mask(); + * ... // your code need to protect + * vm_ts_irq_restore(savedMask); + * + * + *****************************************************************************/ +VMUINT32 vm_ts_irq_mask(void); + +/***************************************************************************** + * FUNCTION + * vm_ts_irq_restore + * DESCRIPTION + * This interface used in tiny mode, restore the I bit of the processor. Note, this function must be used in pairs with vm_ts_irq_mask. + * PARAMETERS + * saved_mask:[in] the return value of vm_ts_irq_mask + * RETURN VALUES + * EXAMPLE + * + * VMUIN32 savedMask; + * savedMask = vm_ts_irq_mask(); + * ... // your code need to protect + * vm_ts_irq_restore(savedMask); + * + * + *****************************************************************************/ +void vm_ts_irq_restore(VMUINT32 saved_mask); + +/***************************************************************************** + * FUNCTION + * vm_ts_take_protect + * DESCRIPTION + * To get system thread protect. Note this function must be used in pairs with vm_ts_give_protect. + * PARAMETERS + * None + * RETURN VALUES + * protect status which should be a parameter of vm_ts_give_protect. + * EXAMPLE + * + * VMUIN32 ret; + * ret = vm_ts_take_protect (); + * ... // your code need to protect + * vm_ts_give_protect(ret); + * + * + *****************************************************************************/ +VMUINT32 vm_ts_take_protect(void); + +/***************************************************************************** + * FUNCTION + * vm_ts_give_protect + * DESCRIPTION + * To give the protect. Note, this function must be used in pairs with vm_ts_take_protect. + * PARAMETERS + * saved_mask :[in] the return value of vm_ts_take_protect + * RETURN VALUES + * none + * EXAMPLE + * + * VMUIN32 ret; + * ret = vm_ts_take_protect (); + * ... // your code need to protect + * vm_ts_give_protect(ret); + * + * + *****************************************************************************/ +void vm_ts_give_protect(VMUINT32 saved_mask); + +/***************************************************************************** +* FUNCTION +* vm_ts_create_timer +* DESCRIPTION +* This interface used in tiny mode, create a timer. +* PARAMETERS +* timer_name : [IN] timer name. It's used for debug only, and only the +* first 8 characters retain. +* RETURN VALUES +* Success: timer pointer. +* Error: system enter fatal error handling. +*****************************************************************************/ +vm_ts_timerid vm_ts_create_timer(VMINT8 *timer_name); + +/***************************************************************************** +* FUNCTION +* vm_ts_set_timer +* DESCRIPTION +* This interface used in tiny mode, start a timer. this will cancel previous set timeout event , and start a new one. +* PARAMETERS +* timer_ptr : [IN] timer pointer. +* handler_func_ptr: [IN] pointer of timeout handler, it will be called after +* timeout happens +* handler_param_ptr: [IN] user supply argument for handler_func_ptr +* delay: [IN] timeout duration in terms of time ticks, the maximum value is 0xFFFFFFFF +* reschedule_time: [IN] reset delay to reschedule_time after timeout happens. +* If it's zero, no reschedule happens and the timer is one-shot. +* Otherwise, it's a periodic timer. +* RETURN VALUES +* N/A +*****************************************************************************/ +void vm_ts_set_timer(vm_ts_timerid timer_ptr, vm_ts_timer_func_ptr handler_func_ptr,void *handler_param_ptr, VMUINT32 delay, VMUINT32 reshedule_time); + +/***************************************************************************** +* FUNCTION +* vm_ts_cancel_timer +* DESCRIPTION +* This interface used in tiny mode, cancel a timer. Please note that canceling timer inside HISR may cancel a timer which is +* in expired stage but the callback function not yet been serviced. +* PARAMETERS +* ext_timer : [IN] timer pointer. +* RETURN VALUES +* N/A +*****************************************************************************/ +void vm_ts_cancel_timer(vm_ts_timerid timer_ptr); + +/***************************************************************************** +* FUNCTION +* vm_ts_get_mem +* DESCRIPTION +* This interface used in tiny mode, get shared memory address +* RETURN VALUES +* pointer of shared memory, NULL means there is no shared memory +*****************************************************************************/ +void* vm_ts_get_mem(void); + +/***************************************************************************** +* FUNCTION +* vm_ts_get_mem_size +* DESCRIPTION +* This interface used in tiny mode, get shared memory size +* RETURN VALUES +* size of shared memory +*****************************************************************************/ +VMINT vm_ts_get_mem_size(void); + +/***************************************************************************** +* FUNCTION +* vm_ts_log_int +* DESCRIPTION +* This interface used in tiny mode, log function for application, for reducing code size, we not support formatted +* output of log, this function can output three integer and on string +* PARAMETERS +* str : [IN] string to output. +* i : [IN] integer to output +* j : [IN] integer to output +* k : [IN] integer to output +*****************************************************************************/ +void vm_ts_log_int(VMSTR str, VMINT i, VMINT j, VMINT k); + +/***************************************************************************** +* FUNCTION +* vm_ts_log_float +* DESCRIPTION +* This interface used in tiny mode, log function for application, for reducing code size, we not support formatted +* output of log, this function can output three float number and on string +* PARAMETERS +* str : [IN] string to output. +* i : [IN] float number to output +* j : [IN] float number to output +* k : [IN] float number to output +*****************************************************************************/ +void vm_ts_log_float(VMSTR str, VMFLOAT i, VMFLOAT j, VMFLOAT k); + +/***************************************************************************** +* FUNCTION +* vm_ts_log_hex +* DESCRIPTION +* This interface used in tiny mode, log function for application, for reducing code size, we not support formatted +* output of log, this function can output three unsigned integer and one string +* PARAMETERS +* str : [IN] string to output, the max size is 64 bytes, more then it will cut off. +* i : [IN] integer to output +* j : [IN] integer to output +* k : [IN] integer to output +*****************************************************************************/ +void vm_ts_log_hex(VMSTR str, VMUINT i, VMUINT j, VMUINT k); + +/***************************************************************************** +* FUNCTION +* vm_ts_get_mode +* DESCRIPTION +* This interface used in tiny mode, get current tiny mode +* AP system Tiny Suspend Tiny Hibernation +* PSRAM power down? No No Yes +* PSRAM can enter standby? Yes Yes N/A +* Access PSRAM Yes No No +* Switch mode latency N/A 40 ms 1 sec +* CPU performance FULL speed 26MHz 32KHz +* Power consumption High Low Lowest +* Scenario Run Second level sleep Minute level sleep +* +* PARAMETERS +* N/A +* RETURN VALUES +* VM_TS_BTSS_SUSPEND +* VM_TS_BTSS_HIBERNATION +* VM_TS_BTSS_INVALID_MODE +*****************************************************************************/ +VM_TS_BSSS_MODE vm_ts_get_mode(void); + +/***************************************************************************** +* FUNCTION +* vm_ts_mode_block +* DESCRIPTION +* This interface used in tiny mode, disable tiny system from entering AP system, use this when preparing shared information +* PARAMETERS +* client : [IN] please refer VM_TS_BTSS_CLIENT +*****************************************************************************/ +void vm_ts_mode_block(VM_TS_BTSS_CLIENT client); + +/***************************************************************************** +* FUNCTION +* vm_ts_mode_unblock +* DESCRIPTION +* This interface used in tiny mode, enable tiny system from entering AP system +* PARAMETERS +* client : [IN] please refer VM_TS_BTSS_CLIENT +*****************************************************************************/ +void vm_ts_mode_unblock(VM_TS_BTSS_CLIENT client); + +/***************************************************************************** +* FUNCTION +* vm_ts_switch_to_ap_mode +* DESCRIPTION +* This interface used in tiny mode, trigger entering AP system +* PARAMETERS +* client : [IN] please refer VM_TS_BTSS_CLIENT +*****************************************************************************/ +void vm_ts_switch_to_ap_mode(VM_TS_BTSS_CLIENT client); + +/***************************************************************************** +* FUNCTION +* vm_ts_requirement +* DESCRIPTION +* This interface used in tiny mode, request CPU frequency, scale down CPU frequency according to system requirement +* OR for power saving , set different voltage for different frequency +* PARAMETERS +* hz : [IN] only support 32KHz and 26MHz +* RETURN VALUES +* the number to set, unit is Hz + * EXAMPLE + * + * vm_ts_requirement(MHZ(100)) + * vm_ts_requirement(-1*MHZ(100)) +*****************************************************************************/ +void vm_ts_requirement(VMINT hz); + +/***************************************************************************** +* FUNCTION +* vm_ts_get_freq +* DESCRIPTION +* This interface used in tiny mode, to get current CPU speed +* RETURN VALUES +* current CPU's speed, the unit is Hz and maximum frequency is 26MHz +*****************************************************************************/ +VMINT vm_ts_get_freq(void); + +/***************************************************************************** +* FUNCTION +* VM_TS_ASSERT +* DESCRIPTION +* This interface used in tiny mode, debug for assert +* RETURN VALUES +* N/A +*****************************************************************************/ +#ifdef __MRE_DEBUG__ + #define VM_TS_ASSERT(expr) do {if(!(expr)) vm_ts_assert((VMSTR)__FILE__, __LINE__); } while (0) +#else + #define VM_TS_ASSERT(expr) do {if(!(expr)) {} } while (0) +#endif + +/***************************************************************************** +* FUNCTION +* vm_ts_reg_service +* DESCRIPTION +* This interface used in tiny mode, driver app can register service for other app use +* PARAMETERS +* name : [IN] server name, must less the 8 charactors +* hdlr : [IN] service handler +* RETURN VALUES +* TRUE : if register success +* FALSE : failed +*****************************************************************************/ +VMBOOL vm_ts_reg_service(char* name, vm_ts_service_hdlr_t hdlr); + +/***************************************************************************** +* FUNCTION +* vm_ts_get_service +* DESCRIPTION +* This interface used in tiny mode, app can get service form the app that had been +* register service to engine. +* PARAMETERS +* service_name : [IN] server name register to engine use vm_ts_reg_service +* func_id : [IN] function id that server provide +* RETURN VALUES +* function interface pointer +*****************************************************************************/ +void* vm_ts_get_service(char* service_name, VMINT func_id ); + +/***************************************************************************** +* FUNCTION +* vm_ts_get_systicks +* DESCRIPTION +* This interface used in tiny mode, return elapsed system ticks from boot up +* PARAMETERS +* N/A +* RETURN VALUES +* elapsed system ticks from boot up +*****************************************************************************/ +VMUINT32 vm_ts_get_systicks(void); + +/***************************************************************************** +* FUNCTION +* vm_ts_updata_screen +* DESCRIPTION +* This interface used in tiny mode, refresh the LCD screen, please use it after update the display buffer. +* PARAMETERS +* startx : [IN] update area left up point x +* starty : [IN] update area left up point y +* endx : [IN] update area right down point x +* endy : [IN] update area right down point y +* RETURN VALUES +* 0 success +*****************************************************************************/ +VMUINT8 vm_ts_updata_screen(VMUINT16 startx, VMUINT16 starty, VMUINT16 endx, VMUINT16 endy); + +/***************************************************************************** +* FUNCTION +* vm_ts_get_tiny_fb_size +* DESCRIPTION +* This interface used in tiny mode, get display buffer size. +* PARAMETERS +* N/A +* RETURN VALUES +* size of display buffer in byte +*****************************************************************************/ +VMUINT32 vm_ts_get_tiny_fb_size(); + +/***************************************************************************** +* FUNCTION +* vm_ts_get_display_buffer +* DESCRIPTION +* This interface used in tiny mode, get display buffer pointer +* PARAMETERS +* N/A +* RETURN VALUES +* display buffer pointer +*****************************************************************************/ +VMUINT8* vm_ts_get_display_buffer(); + +void vm_ts_swatch_pedometer_resgiter_callback(vm_ts_swatch_pedometer_cb cb); + +#ifdef __cplusplus +} +#endif + +#endif /* VMSYS_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmuart.h b/hardware/arduino/mtk/system/libmtk/include/vmuart.h new file mode 100644 index 00000000..22412bdb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmuart.h @@ -0,0 +1,146 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMUART_SDK_H_ +#define VMUART_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* Enum values of uart port */ +typedef enum { + vm_uart_port1=0, + vm_uart_port2, + vm_uart_port3, + vm_uart_port_swdbg, + vm_uart_port_irda, + vm_uart_port_usb, + vm_uart_port_usb2, + vm_uart_port_usb3, + vm_uart_port_bluetooth, + vm_uart_max_port, + vm_uart_port_null = 99 +} vm_port; + + +/******************************************************************************* +* FUNCTION +* vm_uart_open +* DESCRIPTION +* open uart port +* PARAMETERS +* port: [IN] uart port +* RETURNS +* uart port handle +* GLOBALS AFFECTED +* +*******************************************************************************/ +VMINT32 vm_uart_open(vm_port port); + +/******************************************************************************* +* FUNCTION +* vm_read_from_uart +* DESCRIPTION +* read data from specific uart port handle +* PARAMETERS +* handle: [IN] return value of vm_uart_open +* buffer: [OUT] memory space of read data +* length: [IN] the expected length of read data +* RETURNS +* real length of read data +* GLOBALS AFFECTED +* +*******************************************************************************/ +VMUINT16 vm_read_from_uart(VMINT32 handle, VMUINT8 *buffer, VMUINT16 length); + +/******************************************************************************* +* FUNCTION +* vm_write_to_uart +* DESCRIPTION +* write data using uart port +* PARAMETERS +* handle: [IN] return value of vm_uart_open +* buffer: [IN] write data space +* length: [IN] the expected length of write data +* RETURNS +* real length of write data +* GLOBALS AFFECTED +* +*******************************************************************************/ +VMUINT16 vm_write_to_uart(VMINT32 handle, VMUINT8 *buffer, VMUINT16 length); + +/******************************************************************************* +* FUNCTION +* vm_uart_close +* DESCRIPTION +* close uart port +* PARAMETERS +* hanle: [IN] return value of vm_uart_open +* RETURNS +* VMINT32 0 is success, other fail +* GLOBALS AFFECTED +* +*******************************************************************************/ +VMINT32 vm_uart_close(VMINT32 handle); + + +/* +using sample code + +VMINT32 handle; +VMUINT16 length; +VMUINT8 buffer[7]; +handle = vm_uart_open(vm_uart_port1); +if(handle != 0) +{ + length = vm_write_to_uart(result, buffer, 7); + + (or length = vm_read_from_uart(result, buffer, 7);) +} +if(handle != 0) +{ + vm_uart_close(handle); +} +*/ + + +#ifdef __cplusplus +} +#endif + +#endif /* VMUART_SDK_H_ */ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmudp.h b/hardware/arduino/mtk/system/libmtk/include/vmudp.h new file mode 100644 index 00000000..68f9b909 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmudp.h @@ -0,0 +1,198 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMUDP_SDK_H +#define VMUDP_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + + + +/* write status */ +#define VM_UDP_EVT_WRITE 2 + +/* read status */ +#define VM_UDP_EVT_READ 3 + +/* broken status */ +#define VM_UDP_EVT_PIPE_BROKEN 4 + +/* udp pipe closed */ +#define VM_UDP_EVT_PIPE_CLOSED 6 + + +/***************************************************************************** + * FUNCTION + * vm_udp_create + * DESCRIPTION + * create udp socket. + * PARAMETERS + * port : [IN] port number for binding. + * apn : [IN] apn id. + * callback : [IN] callback function for udp notification. + * loopback : [IN] loopback flag, non-zero: loopback; zero: no loopback. + * RETURNS + * create udp success or not. + * RETURN VALUES + * udp handle, if value >= 0; failue if < 0 + * EXAMPLE + * + * static VMINT g_hdll; + * void hl_udp_create(void) + * { + * VMINT port = 0x1234; + * g_hdl1 = vm_udp_create(port, VM_TCP_APN_CMNET, udp_callback, 1); + * } + * +*****************************************************************************/ +VMINT vm_udp_create(VMINT port, VMINT apn, void (*callback)(VMINT hdl, VMINT event), VMINT loopback); +/***************************************************************************** + * FUNCTION + * vm_udp_sendto + * DESCRIPTION + * send data to the destination. + * PARAMETERS + * hdl : [IN] udp handle. + * buf : [IN] buf. + * len : [IN] buf len. + * addr : [IN] the address of destination. + * RETURNS + * size of sent data. + * RETURN VALUES + * udp handle, if value >= 0; failue if < 0 + * EXAMPLE + * + * static void udp_callback(VMINT hdl, VMINT evt) + * { + * vm_sockaddr_struct sendto = {0}; + * sendto.addr[0] = 192; + * sendto.addr[1] = 168; + * sendto.addr[2] = 1; + * sendto.addr[3] = 33; + * sendto.addr_len = 4; + * + * switch (evt) + * { + * case VM_UDP_EVT_WRITE: + * { + * VMINT ret = 0; + * sendto.port = 2500; + * sendto.addr[1], + * sendto.addr[2], + * sendto.addr[3], + * sendto.port, + * sendto.addr_len); + * ret = vm_udp_sendto(hdl, buf, 1024, &sendto); + * }break; + * default: + * { + * + * }break; + * } + * } + * +*****************************************************************************/ +VMINT vm_udp_sendto(VMINT hdl, const void * buf, VMINT32 len, const vm_sockaddr_struct * addr); +/***************************************************************************** + * FUNCTION + * vm_udp_recvfrom + * DESCRIPTION + * receive data from the destination. + * PARAMETERS + * hdl : [IN] udp handle. + * buf : [OUT] buf. + * len : [IN] buf len. + * addr : [OUT] the address of destination. + * RETURNS + * size of received data. + * RETURN VALUES + * udp handle, if value >= 0; failue if < 0 + * EXAMPLE + * + * static void udp_callback(VMINT hdl, VMINT evt) + * { + * VMCHAR buf[1024] = {0}; + * switch (evt) + * { + * case VM_UDP_EVT_READ: + * { + * VMINT ret = 0; + * vm_sockaddr_struct recvfrom = {0}; + * ret = vm_udp_recvfrom(hdl, buf, 1024, &recvfrom); + * }break; + * default: + * { + * + * }break; + * } + * } + * +*****************************************************************************/ +VMINT vm_udp_recvfrom(VMINT hdl, void * buf, VMINT32 len, vm_sockaddr_struct * addr); +/***************************************************************************** + * FUNCTION + * vm_udp_close + * DESCRIPTION + * close udp socket. + * PARAMETERS + * port : [IN] dest host port. + * apn : [IN] apn id. + * callback : [IN] callback function for udp notification. + * RETURNS + * create udp success or not. + * RETURN VALUES + * udp handle, if value >= 0; failue if < 0 + * EXAMPLE + * + * static VMINT g_hdll; + * void hl_udp_create(void) + * { + * VMINT port = 0x1234; + * g_hdl1 = vm_udp_create(port, VM_TCP_APN_CMNET, udp_callback, 1); + * vm_udp_close(g_hdll); + * } + * +*****************************************************************************/ +VMINT vm_udp_close(VMINT hdl); +#ifdef __cplusplus +} +#endif + +#endif /* VMUDP_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmuiapp.h b/hardware/arduino/mtk/system/libmtk/include/vmuiapp.h new file mode 100644 index 00000000..9ea31621 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmuiapp.h @@ -0,0 +1,283 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMUIAPP_SDK_H +#define VMUIAPP_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +/* This enumeration defines the error code of dispatching URI request or registering URI request handler by scheme or by prefix. */ +typedef enum +{ + VM_SRV_URIAGENT_ERR_OK, /* Success to process this request. */ + VM_SRV_URIAGENT_ERR_SCHEME_IS_REGISTERED, /* Fail to process this registration because handler was already registered for this scheme; this error code is used for URI request handler registration only. */ + VM_SRV_URIAGENT_ERR_PREFIX_IS_REGISTERED, /* Fail to process this registration because handler was already registered for this prefix; this error code is used for URI request handler registration only. */ + VM_SRV_URIAGENT_ERR_PROCESSING, /* Fail to process this URI request because the previous request from the same URA is still in processing; this error code is used for URI request dispatch only. */ + VM_SRV_URIAGENT_ERR_UNSUPPORTED /* Fail to process this request. */ +}vm_srv_uriagent_err_enum; + + +/***************************************************************************** + * FUNCTION + * vm_uriagent_uri_request + * DESCRIPTION + * wtai + * PARAMETERS + * str [IN] string of wati + * confirm [IN] confirm + * RETURNS + * -1 : no authorization + * -2 : not be supported + * refer to vm_srv_uriagent_err_enum + *****************************************************************************/ +VMINT vm_uriagent_uri_request(const VMCHAR * str, VMINT confirm); + +/***************************************************************************** + * FUNCTION + * vm_start_native_browser + * DESCRIPTION + * query if specified key code is supported + * PARAMETERS + * url [IN] open native browser if there dose exist. + * RETURNS + * -1 : no authorization + * -2 : not be supported + * refer to return value of vm_open_wap_url + *****************************************************************************/ +VMINT vm_start_native_browser(const VMWSTR url); + + +/***************************************************************************** + * FUNCTION + * vm_startup_email + * DESCRIPTION + * startup email + * PARAMETERS + * to_addr : [IN] email address of receiver (UCS2) + * RETURN VALUES + * 0 : success + * non-zero : failure + * -2 : platform not support + * -3 : no email account + *****************************************************************************/ +VMINT vm_startup_email(const VMWSTR to_addr); + +typedef enum +{ + VM_CAM_ERR_BUSY = -4, + VM_CAM_ERR_EXCEPTION, + VM_CAM_ERR_NOT_SUPPORT, + VM_CAM_ERR_NOT_AUTHORIZED, + VM_CAM_ERR_SUCCESS = 0, +}vm_camera_startup_error_t; + + +/***************************************************************************** + * FUNCTION + * vm_camera_startup + * DESCRIPTION + * Run Camrea APP directly, In lowend project, APP maybe need to exit cause of Out of Memory. + * PARAMETERS + * Void + * RETURNS + * Run result + * RETURN VALUES + * 0 : success + * non-zero : failure + *****************************************************************************/ +VMINT vm_camera_startup(void); + +typedef enum +{ + VM_SELECTOR_ERR_NO_RES = -7, /* no avalible resource */ + VM_SELECTOR_ERR_PARAM, /* input invalid parameter */ + VM_SELECTOR_ERR_NO_MEMORY, /* no memmory */ + VM_SELECTOR_ERR_NO_DISK, /* driver path failure */ + VM_SELECTOR_ERR_EXCEPTION, /* exception */ + VM_SELECTOR_ERR_NOT_SUPPORT, /* platform dose not support */ + VM_SELECTOR_ERR_NOT_AUTHORIZED, /* no authrization */ + VM_SELECTOR_ERR_SUCCESS = 0 /* success */ +}vm_selector_error_t; + +typedef enum +{ + VM_SELECTOR_TYPE_ALL = 0, /* all file type */ + VM_SELECTOR_TYPE_IMAGE, /* image type */ + VM_SELECTOR_TYPE_TXT /* txt type */ +}vm_selector_type_t; + +/***************************************************************************** + * FUNCTION + * vm_selector_run + * DESCRIPTION + * Start Fmgr to select a file. + * PARAMETERS + * type : [IN] the browse type of file, define in vm_selector_type_t + * folder_path : [IN] witch path need to be browsed, NULL means root + * callback : [IN] the result callback of file selection. file_path is the path name of current selected file, + * it be set NULL if error. wlen is the length of path name in words. + * RETURNS + * 0 or error code define in vm_selector_error_t + * RETURN VALUES + * vm_selector_error_t +*****************************************************************************/ +VMINT vm_selector_run(VMINT type, const VMWCHAR * folder_path, VMINT (*callback)(VMWCHAR * file_path, VMINT wlen)); + +typedef enum +{ + VM_FOLDER_BROWSER_ERR_NO_RES = -7, /* no avalible resource */ + VM_FOLDER_BROWSER_ERR_PARAM, /* input invalid parameter */ + VM_FOLDER_BROWSER_ERR_NO_MEMORY, /* no memmory */ + VM_FOLDER_BROWSER_ERR_NO_DISK, /* driver path failure */ + VM_FOLDER_BROWSER_ERR_EXCEPTION, /* exception */ + VM_FOLDER_BROWSER_ERR_NOT_SUPPORT, /* platform dose not support */ + VM_FOLDER_BROWSER_ERR_NOT_AUTHORIZED, /* no authrization */ + VM_FOLDER_BROWSER_ERR_SUCCESS = 0 /* success */ +} vm_folder_browser_error_t; + +typedef enum +{ + VM_FOLDER_BROWSER_TYPE_ALL = 0, /* all file type */ + VM_FOLDER_BROWSER_TYPE_IMAGE, /* image type */ + VM_FOLDER_BROWSER_TYPE_TXT /* txt type */ +} vm_folder_browser_type_t; + +/******************************************************************************* + * FUNCTION + * vm_folder_browser_run + * DESCRIPTION + * launch folder browser CUI. + * PARAMETER + * type : [IN] which type of file should be shown in folder browser. + * the optional values are : + * VM_FOLDER_BROWSER_TYPE_ALL + * VM_FOLDER_BROWSER_TYPE_IMAGE + * VM_FOLDER_BROWSER_TYPE_TXT + * folder_path : [IN] the folder that you want to enter. + * NOTE: it can NOT be L"root" or only a Driver name + * such as L"D:\\". + * RETURNS + * if success, return VM_FOLDER_BROWSER_ERR_SUCCESS. + * otherwise, a value in type of vm_folder_browser_type_t will be returned. + ******************************************************************************/ +VMINT vm_folder_browser_run(VMINT type, const VMWCHAR *folder_path); + +typedef enum +{ + VM_FOLDER_SELECTOR_ERR_NO_RES = -7, /* no avalible resource */ + VM_FOLDER_SELECTOR_ERR_PARAM, /* input invalid parameter */ + VM_FOLDER_SELECTOR_ERR_NO_MEMORY, /* no memmory */ + VM_FOLDER_SELECTOR_ERR_NO_DISK, /* driver path failure */ + VM_FOLDER_SELECTOR_ERR_EXCEPTION, /* exception */ + VM_FOLDER_SELECTOR_ERR_NOT_SUPPORT, /* platform doesn't support */ + VM_FOLDER_SELECTOR_ERR_NOT_AUTHORIZED, /* no authrization */ + VM_FOLDER_SELECTOR_ERR_SUCCESS = 0 /* success */ +} vm_folder_selector_error_t; + +typedef enum +{ + VM_FOLDER_SELECTOR_STYLE_READ, /* CUI_FOLDER_SELECTOR_STYLE_READ */ + VM_FOLDER_SELECTOR_STYLE_WRITE, /* CUI_FOLDER_SELECTOR_STYLE_WRITE */ + VM_FOLDER_SELECTOR_STYLE_TOTAL /* CUI_FOLDER_SELECTOR_STYLE_TOTAL */ +} vm_folder_selector_style_t; + +/****************************************************************************** + * FUNCTION + * vm_folder_selector_run + * DESCRIPTION + * Start a file manager to select a folder. + * PARAMETERS + * start_folder_path : [IN] the path of start folder. when file manager + * is opened, it will enter this folder + * directly. + * folder_selector_style : [IN] if it's VM_FOLDER_SELECTOR_STYLE_READ, that + * means you can NOT create a folder, + * rename it or delete it. + * if it's VM_FOLDER_SELECTOR_STYLE_WRITE, that + * means you can create a folder, rename it + * , or delete it. + * callback : [IN] user provided callback function. when a + * folder is selected, this function will be + * called to handle the selection. + * selected_folder_path indicates which folder + * is selected. if it's NULL, that means + * an error occurs. + * wlen is the length of selected folder's path + * in words. + * RETURNS + * VM_FOLDER_SELECTOR_ERR_SUCCESS : the CUI runs successfully. + * other values means an error occurs, please refer to + * vm_folder_selector_error_t for detailed information. +******************************************************************************/ +VMINT vm_folder_selector_run( + const VMWCHAR *start_folder_path, + VMINT folder_selector_style, + VMINT (*callback)(VMWCHAR *selected_folder_path, VMINT wlen)); + +/***************************************************************************** + * FUNCTION + * vm_is_support_gsensor + * DESCRIPTION + * Check whether the phone support G-sensor or not. + * PARAMETERS + * void + * RETURN VALUES + * TRUE : Supports G-sensor. + * FALSE : Not support. + *****************************************************************************/ +VMINT vm_is_support_gsensor(void); + +/***************************************************************************** + * FUNCTION + * vm_is_support_camera_sensor + * DESCRIPTION + * Check whether the phone support camera sensor or not. + * PARAMETERS + * void + * RETURN VALUES + * TRUE : Supports camera sensor. + * FALSE : Not support. + *****************************************************************************/ +VMINT vm_is_support_camera_sensor(void); + +#ifdef __cplusplus +} +#endif + +#endif /* VMUIAPP_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmuimisc.h b/hardware/arduino/mtk/system/libmtk/include/vmuimisc.h new file mode 100644 index 00000000..ffe9f1eb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmuimisc.h @@ -0,0 +1,192 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmuimisc_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * ui misc + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ +#ifndef VM_UIMISC_SDK_H +#define VM_UIMISC_SDK_H +#ifdef __cplusplus +extern "C"{ +#endif/*__cplusplus*/ +#include "vmsys.h" +typedef enum +{ + VM_TOUCH_FEEDBACK_DOWN, + VM_TOUCH_FEEDBACK_DOWN_VIBRATE, + VM_TOUCH_FEEDBACK_DOWN_TONE, + VM_TOUCH_FEEDBACK_HOLD, + VM_TOUCH_FEEDBACK_SPECIAL, + VM_TOUCH_FEEDBACK_TOTAL +} vm_touch_feedback_enum; + +typedef enum +{ + VM_SCREEN_ROTATE_0, /* Normal screen */ + VM_SCREEN_ROTATE_90, /* Rotate 90 clockwise */ + VM_SCREEN_ROTATE_180, /* Rotate 180 */ + VM_SCREEN_ROTATE_270, /* Rotate 270 clockwise */ + + /*Add new enums above this*/ + VM_SCREEN_ROTATE_END = 0XFFFF +} vm_screen_rotate_enum; + +#define VM_PI 3.1415926f + +/* General color type methods */ +#define VM_COLOR32_MAKE(a, r, g, b) ((VMCOLOR32)((VMUINT32)(a) << 24 | (VMUINT32)(r) << 16 | (VMUINT32)(g) << 8 | (VMUINT32)(b))) +#define VM_COLOR32_GET_A(c) ((c) >> 24) +#define VM_COLOR32_GET_R(c) ((c) << 8 >> 24) +#define VM_COLOR32_GET_G(c) ((c) << 16 >> 24) +#define VM_COLOR32_GET_B(c) ((c) << 24 >> 24) + +/* default colors */ +#define VM_COLOR32_BLACK VM_COLOR32_MAKE(255, 0, 0, 0) +#define VM_COLOR32_WHITE VM_COLOR32_MAKE(255, 255, 255, 255) +#define VM_COLOR32_RED VM_COLOR32_MAKE(255, 255, 0, 0) +#define VM_COLOR32_GREEN VM_COLOR32_MAKE(255, 0, 255, 0) +#define VM_COLOR32_BLUE VM_COLOR32_MAKE(255, 0, 0, 255) +#define VM_COLOR32_AQUA VM_COLOR32_MAKE(255, 0, 255, 255) +#define VM_COLOR32_FUCHSIA VM_COLOR32_MAKE(255, 255, 0, 255) +#define VM_COLOR32_YELLOW VM_COLOR32_MAKE(255, 255, 255, 0) +#define VM_COLOR32_GREY VM_COLOR32_MAKE(255, 128, 128, 128) +#define VM_COLOR32_TEAL VM_COLOR32_MAKE(255, 0, 128, 128) +#define VM_COLOR32_PURPLE VM_COLOR32_MAKE(255, 128, 0, 128) +#define VM_COLOR32_OLIVE VM_COLOR32_MAKE(255, 128, 128, 0) +#define VM_COLOR32_SILVER VM_COLOR32_MAKE(255, 192, 192, 192) +#define VM_COLOR32_TRANSPARENT VM_COLOR32_MAKE(0, 0, 0, 255) + +/* Redian convert macros */ +#define VM_DEG_TO_RAD(x) ((VMFLOAT)((VMFLOAT)(x)) * VM_PI / 180.0f) +#define VM_RAD_TO_DEG(x) ((VMFLOAT)((VMFLOAT)(x)) * 180.0f / VM_PI) + +/* Float, Fixed conversion */ +#define VM_X_TO_F(x) ((VMFLOAT)x / 65536.0f) +#define VM_F_TO_X(x) (VMINT32)((x) * 65536.0f) + +/***************************************************************************** + * FUNCTION + * vm_get_sys_scene + * DESCRIPTION + * get system setting profile + * PARAMETERS + * void + * RETURNS + * 0 : standard mode + * 1: meeting mode + * 2: outside mode + * 3: indoor mode + * 4: earphone mode + * 5: silent mode + * 6: bluetooth mode + *****************************************************************************/ +VMINT vm_get_sys_scene(void); +/***************************************************************************** + * FUNCTION + * vm_clipboard_is_available + * DESCRIPTION + * Check whether the current project support clipboard + * PARAMETERS + * NULL + * RETURNS + * TRUE : Support clipboard + * FALSE: Not support clipboard + *****************************************************************************/ +VMBOOL vm_clipboard_is_available(void); + +/***************************************************************************** + * FUNCTION + * vm_clipboard_text_set_data + * DESCRIPTION + * Set text data to clipboard. + * The text encoded type should be unicode. + * Clipboard only could stores 2048 wchars at most. + * The memory is provided by system. + * PARAMETERS + * str : [IN] unicode string pointer + * str_len : [IN] string length (could be less than the total length, in other words, a part of string) + * RETURNS + * TRUE : 1. Operation success + * 2. str == NULL (clear the clipboard) + * FALSE: 1. memory not enough + * 2. memory overlapped + * 3. str_len <= 0 + *****************************************************************************/ +VMBOOL vm_clipboard_text_set_data(const VMWSTR str, VMUINT str_len); + + +/***************************************************************************** + * FUNCTION + * vm_clipboard_text_get_data + * DESCRIPTION + * Get text data from clipboard. + * This is a blobal string pointer saved in system memory. + * PARAMETERS + * void + * RETURNS + * Valid pointer: unicode string pointer + * NULL: clipboard is empty + *****************************************************************************/ +VMWSTR vm_clipboard_text_get_data(void); + +void vm_set_touch_feedback ( vm_touch_feedback_enum type); + +#ifdef __cplusplus +} +#endif/*__cplusplus*/ + +#endif/*VM_UIMISC_SDK_H*/ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmusb.h b/hardware/arduino/mtk/system/libmtk/include/vmusb.h new file mode 100644 index 00000000..15fb3b30 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmusb.h @@ -0,0 +1,85 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2006 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +/******************************************************************************* + * Filename: + * --------- + * vmusb_sdk.h + * + * Project: + * -------- + * MAUI + * + * Description: + * ------------ + * usb + * + * Author: + * ------- + * + * +*============================================================================== + * HISTORY + * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *------------------------------------------------------------------------------ +* *------------------------------------------------------------------------------ + * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! + *============================================================================== +*******************************************************************************/ + +#ifndef VM_USB_SDK_H +#define VM_USB_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +/******************************************************************************* +* FUNCTION +* vm_usb_get_cable_status +* DESCRIPTION +* get usb cable plug in and plut out state +* PARAMETERS +* N/A +* RETURNS +* 0: usb is in plug in state; 1:usb is in plug out state +*******************************************************************************/ +VMINT vm_usb_get_cable_status(void); +#ifdef __cplusplus +} +#endif + +#endif /* VM_USB_SDK_H */ \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/include/vmvad.h b/hardware/arduino/mtk/system/libmtk/include/vmvad.h new file mode 100644 index 00000000..c6442699 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmvad.h @@ -0,0 +1,125 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMVAD_SDK_H +#define VMVAD_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + + + /***************************************************************************** + * + * + * FUNCTION + * vm_vad_msg_hdlr + * DESCRIPTION + * This function is used to handle msg data. + * PARAMETERS + * msg : [IN] message id. + * param : [IN] message parameter. + * RETURNS + * void + *****************************************************************************/ +typedef void (*vm_vad_msg_hdlr)(VMINT msg, VMINT param); + +/***************************************************************************** + * FUNCTION + * vm_vad_switch_on_off + * DESCRIPTION + * switch on/off VAD. + * PARAMETERS + * on : [IN] on/off VAD + * param : reserve, NULL is ok + * RETURN VALUES + * TRUE : if the operation is successful. + * FALSE : means error illegal + *****************************************************************************/ +VMBOOL vm_vad_switch_on_off(VMBOOL on, void* param); + +/***************************************************************************** + * FUNCTION + * vm_vad_set_level + * DESCRIPTION + * Set VAD Detect sensitivity + * PARAMETERS + * level : [IN] 0¨C255, 0 is the highest level sensitivity + * RETURN VALUES + * TRUE : if the operation is successful. + * FALSE : means error illegal + *****************************************************************************/ +VMBOOL vm_vad_set_level(VMUINT8 level); + +/***************************************************************************** + * FUNCTION + * vm_vad_is_on + * DESCRIPTION + * check VAD on/off + * RETURN VALUES + * TRUE : on. + * FALSE : off + *****************************************************************************/ +VMBOOL vm_vad_is_on(void); + +/***************************************************************************** + * FUNCTION + * vm_vad_get_level + * DESCRIPTION + * get current VAD sensitivity level + * RETURN VALUES + * 0-255 + *****************************************************************************/ +VMUINT8 vm_vad_get_level(void); + +/***************************************************************************** + * FUNCTION + * vm_vad_register_callback + * DESCRIPTION + * Register the callback function that deal with the detect result + * PARAMETERS + * callback : [IN] the function to deal with the detect result + *****************************************************************************/ +void vm_vad_register_callback(vm_vad_msg_hdlr callback); + + +#ifdef __cplusplus +} +#endif + +#endif /* VMVAD_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmvdorec.h b/hardware/arduino/mtk/system/libmtk/include/vmvdorec.h new file mode 100644 index 00000000..7163187f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmvdorec.h @@ -0,0 +1,334 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef _VM_VDOREC_SDK_H +#define _VM_VDOREC_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/* msg when record finish */ +#define VM_MSG_VDOREC_FINISH 1000 + +/* msg when file merge done */ +#define VM_MSG_VDOREC_FILE_MERGE_DONE 2000 + +/* video recorder result */ +#define VM_RES_VDOREC_SUCCESS 0 /* Success */ +#define VM_RES_VDOREC_FAILED (-1) /* Common failed */ +#define VM_RES_VDOREC_REACH_SIZE_LIMIT (-2) /* reach max size, mp4 file max size is 2G */ +#define VM_RES_VDOREC_REACH_TIME_LIMIT (-3) /* reach max time, LINKIT not support this parameter, so there is no limit */ +#define VM_RES_VDOREC_DISK_FULL (-4) /* disk space full */ +#define VM_RES_VDOREC_ERR_STORAGE_TOO_SLOW (-5) /* storage too slow */ +#define VM_RES_VDOREC_ERR_NO_FRAME_ENCODED (-6) /* frame encode error */ + +#ifndef MAX_APP_NAME_LEN +#define MAX_APP_NAME_LEN (260) +#endif + +/* Video recorder image format */ +typedef enum +{ + VM_VDOREC_FORMAT_MPEG4 = 0, /* MPEG4 */ + VM_VDOREC_FORMAT_H263 = 1, /* H263 */ + VM_VDOREC_FORMAT_H264 = 2, /* H264 */ + VM_VDOREC_FORMAT_MJPEG = 3, /* MJPEG */ + VM_VDOREC_FORMAT_MAX = 0x1FFF +} vm_vdorec_format_enum_t; + +/* Video recorder image quality */ +typedef enum +{ + VM_VDOREC_QUALITY_FINE = 0, /* FINE */ + VM_VDOREC_QUALITY_HIGH = 1, /* HIGH */ + VM_VDOREC_QUALITY_NORMAL = 2, /* NORMAL */ + VM_VDOREC_QUALITY_LOW = 3, /* LOW */ + VM_VDOREC_QUALITY_MAX = 0x1FFF +} vm_vdorec_quality_enum_t; + +/* Video record camera id */ +enum +{ + VM_VDOREC_MAIN_CAMERA, /* main camera */ + VM_VDOREC_SUB_CAMERA /* sub camera */ +}; + +/* Video recorder param */ +#define VM_VDOREC_CAMERA_CONTRAST (1) /* contrast */ +#define VM_VDOREC_CAMERA_SHARPNESS (2) /* sharpness */ +#define VM_VDOREC_CAMERA_WB (3) /* wb */ +#define VM_VDOREC_CAMERA_DIGITAL_ZOOM (4) /* digital zoom */ +#define VM_VDOREC_CAMERA_EV_VALUE (5) /* ev value */ + +/* Video recorder param contrast */ +typedef enum +{ + VM_VDOREC_CONTRAST_LOW=0, /* low */ + VM_VDOREC_CONTRAST_MEDIUM, /* medium */ + VM_VDOREC_CONTRAST_HIGH, /* high */ + VM_VDOREC_CONTRAST_MAX +} VM_VDOREC_CONTRAST_ENUM; + +/* Video recorder param sharpness */ +typedef enum +{ + VM_VDOREC_SHARPNESS_LOW=0, /* low */ + VM_VDOREC_SHARPNESS_MEDIUM, /* medium */ + VM_VDOREC_SHARPNESS_HIGH, /* high */ + VM_VDOREC_SHARPNESS_MAX +} VM_VDOREC_SHARPNESS_ENUM; + +/* Video recorder param wb */ +typedef enum +{ + VM_VDOREC_WB_AUTO = 0, /* auto */ + VM_VDOREC_WB_CLOUD, /* cloud */ + VM_VDOREC_WB_DAYLIGHT, /* daylight */ + VM_VDOREC_WB_INCANDESCENCE, /* incandescence */ + VM_VDOREC_WB_FLUORESCENT, /* fluorescent */ + VM_VDOREC_WB_TUNGSTEN, /* tungsten */ + VM_VDOREC_WB_MANUAL, /* manual */ + VM_VDOREC_NO_OF_WB /* no wb */ +} VM_VDOREC_WB_ENUM; + +/* Video recorder param zoom */ +typedef enum +{ + VM_VDOREC_DZ_TYPE_RANGE, /* ISP supported digital zoom . (for Raw/YUV sensors) */ + VM_VDOREC_DZ_TYPE_LIST, /* Sensor supported digial zoom. (for JPEG sensor) */ + VM_VDOREC_DZ_TYPE_MAX +} VM_VDOREC_DIGITAL_ZOOM_TYPE_ENUM; + +/* Video recorder param ev */ +typedef enum +{ + VM_VDOREC_EV_NEG_4_3 = 0, /* EV_NEG_4_3 */ + VM_VDOREC_EV_NEG_3_3, /* EV_NEG_3_3 */ + VM_VDOREC_EV_NEG_2_3, /* EV_NEG_2_3 */ + VM_VDOREC_EV_NEG_1_3, /* EV_NEG_1_3 */ + VM_VDOREC_EV_ZERO, /* EV_ZERO */ + VM_VDOREC_EV_POS_1_3, /* EV_POS_1_3 */ + VM_VDOREC_EV_POS_2_3, /* EV_POS_2_3 */ + VM_VDOREC_EV_POS_3_3, /* EV_POS_3_3 */ + VM_VDOREC_EV_POS_4_3, /* EV_POS_4_3 */ + VM_VDOREC_EV_NIGHT_SHOT, /* EV_NIGHT_SHOT */ + VM_VDOREC_NO_OF_EV +} VM_VDOREC_EV_ENUM; + +/* Video recorder preview setting structure */ +typedef struct +{ + VMUINT16 width; /* Width of the video */ + VMUINT16 height; /* Height of the video */ + VMUINT16 bit_stream_type; /* image type, refer vm_vdorec_format_enum_t */ + VMUINT16 encode_quality; /* image quality, refer vm_vdorec_quality_enum_t */ +}vm_vdorec_preview_struct; + +/* Video recorder record setting structure */ +typedef struct +{ + VMWCHAR fullFileName[MAX_APP_NAME_LEN + 1]; /* full file name to save */ +}vm_vdorec_record_struct; + + +/***************************************************************************** +* FUNCTION +* vm_vdorec_callback +* DESCRIPTION +* When record done or file merge done, application will receive this callback +* PARAMETERS +* msg : [IN] msg id , it should be VM_MSG_VDOREC_FINISH/VM_MSG_VIDEO_FILE_MERGE_DONE +* VMINT : [INT] please refer the video recorder result +* RETURNS +* void +*****************************************************************************/ +typedef void (*vm_vdorec_callback)(VMINT msg, VMINT ret); + + + /***************************************************************************** + * FUNCTION + * vm_vdorec_start + * DESCRIPTION + * video record start + * PARAMETERS + * camere_id : [IN] camear id, VM_VDOREC_MAIN_CAMERA/VM_VDOREC_SUB_CAMERA + * callback : [IN] callback function, please refer vm_vdorec_callback + * RETURN VALUES + * VM_RES_VDOREC_SUCCESS : Succeed to record. + * VM_RES_VDOREC_FAILED : Fail to record. + *****************************************************************************/ +VMINT vm_vdorec_power_up(VMUINT16 camere_id, vm_vdorec_callback callback); + +/***************************************************************************** + * FUNCTION + * vm_vdorec_preview + * DESCRIPTION + * video record preview start + * PARAMETERS + * para : [IN] video record setting, please refer vm_vdorec_preview_struct + * RETURN VALUES + * VM_RES_VDOREC_SUCCESS : Succeed to record. + * VM_RES_VDOREC_FAILED : Fail to record. + *****************************************************************************/ +VMINT vm_vdorec_preview(vm_vdorec_preview_struct* para); + +/***************************************************************************** + * FUNCTION + * vm_vdorec_set_param + * DESCRIPTION + * video record set parameters + * PARAMETERS + * param_id : [IN] video record setting, please refer the marco of Video recorder param + * value : [IN] value + * RETURN VALUES + * VM_RES_VDOREC_SUCCESS : Succeed to set. + * VM_RES_VDOREC_FAILED : Fail to set. + *****************************************************************************/ +VMINT vm_vdorec_set_param(VMUINT32 param_id, VMUINT16 value); + +/***************************************************************************** + * FUNCTION + * vm_vdorec_record + * DESCRIPTION + * video record start + * PARAMETERS + * para : [IN] video record setting, please refer vm_vdorec_record_struct + * RETURN VALUES + * VM_RES_VDOREC_SUCCESS : Succeed to record. + * VM_RES_VDOREC_FAILED : Fail to record. + *****************************************************************************/ +VMINT vm_vdorec_record(vm_vdorec_record_struct* para); + + /***************************************************************************** + * FUNCTION + * vm_video_close_file + * DESCRIPTION + * To stop video record. + * PARAMETERS + * void + * RETURN VALUES + * VM_RES_VDOREC_SUCCESS : Succeed to stop. + * VM_RES_VDOREC_FAILED : Fail to stop. + *****************************************************************************/ +VMINT vm_vdorec_stop(void); + + /***************************************************************************** + * FUNCTION + * vm_video_pause + * DESCRIPTION + * To pause video record. + * PARAMETERS + * void + * RETURN VALUES + * VM_RES_VDOREC_SUCCESS : Succeed to pause. + * VM_RES_VDOREC_FAILED : Fail to pause. + *****************************************************************************/ +VMINT vm_vdorec_pause(void); + + /***************************************************************************** + * FUNCTION + * vm_video_resume + * DESCRIPTION + * To resume video record. + * PARAMETERS + * void + * RETURN VALUES + * VM_RES_VDOREC_SUCCESS : Succeed to resume. + * VM_RES_VDOREC_FAILED : Fail to resume. + *****************************************************************************/ +VMINT vm_vdorec_resume(void); + +/***************************************************************************** + * FUNCTION + * vm_vdorec_power_down + * DESCRIPTION + * video record power down + * PARAMETERS + * void + * RETURN VALUES + * VM_RES_VDOREC_SUCCESS : Succeed to resume. + * VM_RES_VDOREC_FAILED : Fail to resume. + *****************************************************************************/ +VMINT vm_vdorec_power_down(void); + +/***************************************************************************** + * FUNCTION + * vm_vdorec_save_to_file + * DESCRIPTION + * Save record data to file + * PARAMETERS + * filepath : filepath to save + * callback : save result callback + * RETURN VALUES + * N/A +*****************************************************************************/ +void vm_vdorec_save_to_file(VMWSTR filepath, vm_vdorec_callback callback); + +/***************************************************************************** + * FUNCTION + * vm_vdorec_rtsp_local_save_start + * DESCRIPTION + * Save record data to local file + * PARAMETERS + * filepath : filepath to save + * callback : save result callback + * RETURN VALUES + * VM_RES_VDOREC_SUCCESS : Succeed to start. + * VM_RES_VDOREC_FAILED : Fail to start. +*****************************************************************************/ +VMINT vm_vdorec_rtsp_local_save_start(VMWSTR filepath, vm_vdorec_callback callback); + +/***************************************************************************** + * FUNCTION + * vm_vdorec_rtsp_local_save_stop + * DESCRIPTION + * Save record data to file + * PARAMETERS + * void + * RETURN VALUES + * VM_RES_VDOREC_SUCCESS : Succeed to stop. + * VM_RES_VDOREC_FAILED : Fail to stop. +*****************************************************************************/ +VMINT vm_vdorec_rtsp_local_save_stop(void); + +#ifdef __cplusplus +} +#endif + +#endif /*_VM_VDOREC_H*/ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmvibr.h b/hardware/arduino/mtk/system/libmtk/include/vmvibr.h new file mode 100644 index 00000000..2061da1e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmvibr.h @@ -0,0 +1,75 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMVIBR_SDK_H_ +#define VMVIBR_SDK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/***************************************************************************** + * FUNCTION + * vm_vibrator_once + * DESCRIPTION + * vibrator once, vibrator on 1 second then off. +*****************************************************************************/ +void vm_vibrator_once(void); + + +/***************************************************************************** + * FUNCTION + * vm_vibrator_on + * DESCRIPTION + * vibrator on. +*****************************************************************************/ +void vm_vibrator_on(void); + + +/***************************************************************************** + * FUNCTION + * vm_vibrator_off + * DESCRIPTION + * vibrator off. +*****************************************************************************/ +void vm_vibrator_off(void); + +#ifdef __cplusplus +} +#endif + +#endif /* VMVIBR_SDK_H_ */ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmvideo.h b/hardware/arduino/mtk/system/libmtk/include/vmvideo.h new file mode 100644 index 00000000..9a29c2f9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmvideo.h @@ -0,0 +1,608 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef _VM_VIDEO_SDK_H +#define _VM_VIDEO_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" +#include "vmmm.h" + +/** + * operation succeed + */ +#define VM_VIDEO_SUCCESS (0) +/** + * operation fail + */ +#define VM_VIDEO_FAILED (-1) + + +/** + * data not enough + */ +#define VM_VIDEO_PROGRESSIVE_FILE_NOT_ENOUGH -101 + + + + +/** + * file open failed + */ +#define VM_VIDEO_ERR_OPEN_FILE_FAILED -103 + +/** + * file size too large + */ +#define VM_VIDEO_ERR_FILE_TOO_LARGE -104 + +/** + * snapshot failed + */ +#define VM_VIDEO_ERR_SNAPSHOT_FAILED -105 + +/** + * play failed + */ +#define VM_VIDEO_ERR_PLAY_FAILED -106 + + + +/** + * snapshot failed for disk full + */ +#define VM_VIDEO_ERR_SNAPSHOT_DISK_FULL -107 + +/** + * snapshot failed for disk read-only + */ +#define VM_VIDEO_ERR_SNAPSHOT_WRITE_PROTECTION -108 + +/** + * invalid resoulution + */ +#define VM_VIDEO_ERR_INVALID_RESOULTION -109 + +/** + * unsupported format + */ +#define VM_VIDEO_ERR_UNSUPPORTED_FORMAT -110 + +/** + * memory insufficient + */ +#define VM_VIDEO_ERR_MEMORY_INSUFFICIENT -111 + +/** + * DRM prohibited + */ +#define VM_VIDEO_ERR_DRM_PROHIBITED -112 + +/** + * DRM during usage + */ +#define VM_VIDEO_ERR_DRM_DURATION_USED -113 + +/** + * framerate too high + */ +#define VM_VIDEO_ERR_FRAMERATE_TOO_HIGH -114 + + + +/** + * one grade darker than N4 + */ +#define VM_VIDEO_BRIGHTNESS_N5 0 +/** + * one grade darker than N3 + */ +#define VM_VIDEO_BRIGHTNESS_N4 1 +/** + * one grade darker than N2 + */ +#define VM_VIDEO_BRIGHTNESS_N3 2 +/** + * one grade darker than N1 + */ +#define VM_VIDEO_BRIGHTNESS_N2 3 +/** + * one grade darker than 0 + */ +#define VM_VIDEO_BRIGHTNESS_N1 4 +/** + * default brightness + */ +#define VM_VIDEO_BRIGHTNESS_0 5 +/** + * one grade brighter than 0 + */ +#define VM_VIDEO_BRIGHTNESS_P1 6 +/** + * one grade brighter than P1 + */ +#define VM_VIDEO_BRIGHTNESS_P2 7 +/** + * one grade brighter than P2 + */ +#define VM_VIDEO_BRIGHTNESS_P3 8 +/** + * one grade brighter than P3 + */ +#define VM_VIDEO_BRIGHTNESS_P4 9 +/** + * one grade brighter than P4 + */ +#define VM_VIDEO_BRIGHTNESS_P5 10 + + +/** + * one grade lower than N4 + */ +#define VM_VIDEO_CONTRAST_N5 0 +/** + * one grade lower than N3 + */ +#define VM_VIDEO_CONTRAST_N4 1 +/** + * one grade lower than N2 + */ +#define VM_VIDEO_CONTRAST_N3 2 +/** + * one grade lower than N1 + */ +#define VM_VIDEO_CONTRAST_N2 3 +/** + * one grade lower than 0 + */ +#define VM_VIDEO_CONTRAST_N1 4 +/** + * default contrast + */ +#define VM_VIDEO_CONTRAST_0 5 +/** + * one grade higher than 0 + */ +#define VM_VIDEO_CONTRAST_P1 6 +/** + * one grade higher than P1 + */ +#define VM_VIDEO_CONTRAST_P2 7 +/** + * one grade higher than P2 + */ +#define VM_VIDEO_CONTRAST_P3 8 +/** + * one grade higher than P3 + */ +#define VM_VIDEO_CONTRAST_P4 9 +/** + * one grade higher than P4 + */ +#define VM_VIDEO_CONTRAST_P5 10 + + +/** + * rotate 0 degree + */ +#define VM_VIDEO_LCD_ROTATE_0 0 +/** + * rotate 90 degree + */ +#define VM_VIDEO_LCD_ROTATE_90 1 +/** + * rotate 180 degree + */ +#define VM_VIDEO_LCD_ROTATE_180 2 +/** + * rotate 270 degree + */ +#define VM_VIDEO_LCD_ROTATE_270 3 + +/* Video track type enum */ +typedef enum +{ + VM_VIDEO_TRACK_NONE, + VM_VIDEO_TRACK_AV, /* Video has both audio and video tracks */ + VM_VIDEO_TRACK_A_ONLY, /* Video has audio track only */ + VM_VIDEO_TRACK_V_ONLY /* Video has video track only */ +} vm_video_track_enum; + + +/* Max length of content info */ +#define VM_VIDEO_MAX_CONTENT_INFO_LEN 80 + + +/* Video information structure */ +typedef struct +{ + VMUINT16 width; /* Width of the video */ + VMUINT16 height; /* Height of the video */ + VMUINT32 total_frame_count; /* Total framecount of the video */ + VMUINT64 total_time_duration; /* Total time duration of the video */ + vm_video_track_enum track; + VMINT handle; /* Handle of the opened video file */ + VMINT is_seekable; /* Is this video seekable */ + VMUINT8 aud_channel_no; /* Audio channel count information */ + VMUINT16 aud_sample_rate; /* Audio sample rate information */ + + VMINT is_drm_streaming; /* Is this is a drm streaming file */ + VMUINT drm_handle; /* DRM handle of this video */ + + VMWCHAR title_desc[VM_VIDEO_MAX_CONTENT_INFO_LEN+1]; /* Title information */ + VMWCHAR artist_desc[VM_VIDEO_MAX_CONTENT_INFO_LEN+1]; /* Artist information */ + VMWCHAR album_desc[VM_VIDEO_MAX_CONTENT_INFO_LEN+1]; /* Album information */ + VMWCHAR author_desc[VM_VIDEO_MAX_CONTENT_INFO_LEN+1]; /* Author information */ + VMWCHAR copyright_desc[VM_VIDEO_MAX_CONTENT_INFO_LEN+1]; /* Copyright information */ + VMWCHAR date_desc[VM_VIDEO_MAX_CONTENT_INFO_LEN+1]; /* Date information */ +} vm_video_info_struct; + + + + + +/***************************************************************************** +* FUNCTION +* vm_video_open_result_callback +* DESCRIPTION +* When open a file in async mode, if there is any error or indication (open succeefully) from media-task, MDI-Video module will invoke this callback function and pass the result to MMI appliactions. +* MMI application should handle this kind of error. +* PARAMETERS +* ret : [IN] The result in MDI_RESULT enum type. +* video_info : [OUT] video information of this opened file, it will contain valid data if the open operation is succeeded. +* RETURNS +* void +*****************************************************************************/ +typedef void (*vm_video_open_result_callback)(VMINT ret, vm_video_info_struct *video_info); + + +/***************************************************************************** +* FUNCTION +* vm_video_finish_callback +* DESCRIPTION +* When playing a video, if there is any error or indication (finished playing) from media-task, MDI-Video module will invoke this callback function and pass the result to MMI applications. +* MMI application should handle this kind of error. +* PARAMETERS +* ret: [IN] The result in MDI_RESULT enum type. +* RETURNS +* void +*****************************************************************************/ +typedef void (*vm_video_finish_callback) (VMINT ret); + + + + /***************************************************************************** + * FUNCTION + * vm_video_open_file + * DESCRIPTION + * To open video file (non-blocking open). + * PARAMETERS + * filename : [IN] Videe clip's full file name + * open_result_callback : [IN] Open file result callback function + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to open video file, need to wait callback function when open operation is finished. + * VM_VIDEO_ERR_DRM_PROHIBITED : Fail to open video file due to drm is prohibited. + * VM_VIDEO_ERR_MEMORY_INSUFFICIENT : Fail to open video file due to memory is insufficient. + * VM_VIDEO_ERR_FRAMERATE_TOO_HIGH : Fail to open video file due to file is too large. + * VM_VIDEO_ERR_INVALID_RESOULTION : Fail to open video file due to framerate is too high. + * VM_VIDEO_ERR_OPEN_FILE_FAILED : Fail to open video file. + *****************************************************************************/ + VMINT vm_video_open_file( + const VMWSTR filename, + vm_video_open_result_callback open_result_callback); + + + /***************************************************************************** + * FUNCTION + * vm_video_close_file + * DESCRIPTION + * To close video file. + * PARAMETERS + * void + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to close video file. + * VM_VIDEO_FAILED : Fail to close video file. + *****************************************************************************/ + VMINT vm_video_close_file(void); + + + /***************************************************************************** + * FUNCTION + * vm_video_open_buffer + * DESCRIPTION + * To open video clip from buffer. + * PARAMETERS + * file_buffer : [IN] Video clip file buffer + * buffer_len : [IN] Video clip's buffer size + * info : [OUT] Video clip's info + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to open video buffer, need to wait callback function when open operation is finished. + * VM_VIDEO_ERR_MEMORY_INSUFFICIENT : Fail to open video buffer due to memory is insufficient. + * VM_VIDEO_ERR_FRAMERATE_TOO_HIGH : Fail to open video buffer due to framerate is too high. + * VM_VIDEO_ERR_OPEN_FILE_FAILED : Fail to open video file. + *****************************************************************************/ + VMINT vm_video_open_buffer( + const VMUSTR buffer, + const VMUINT buffer_len, + vm_video_info_struct *info); + + + /***************************************************************************** + * FUNCTION + * vm_video_close_buffer + * DESCRIPTION + * To close video clip from buffer + * PARAMETERS + * void + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to close video clip buffer. + * VM_VIDEO_FAILED : Fail to close video clip buffer. + *****************************************************************************/ + VMINT vm_video_close_buffer(void); + + +/***************************************************************************** +* FUNCTION +* mdi_video_ply_play +* DESCRIPTION +* To start play opened video. +* PARAMETERS +* player_layer_handle : [IN] Layer handle of playback layer. +* base_layer_handle : [IN] Layer handle of tool component layer. +* repeat_count : [IN] Repeat how many times. +* is_play_audio : [IN] To play audio or not. +* audio_path : [IN] Audio output path. +* play_finish_callback : [IN] Callback function. +* RETURN VALUES +* VM_VIDEO_SUCCESS : Succeed to start play. +* VM_VIDEO_ERR_DRM_PROHIBITED : Fail to start play due to drm check is prohibited. +* MDI_RES_VDOPLY_PROGRESSIVE_FILE_NOT_ENOUGH : Fail to start play due to the download data is not enough for progressive playback. +* VM_VIDEO_PROGRESSIVE_FILE_NOT_ENOUGH : Fail to start play due to it is stopped due to stop time is reached. +* VM_VIDEO_ERR_PLAY_FAILED : Fail to start play. +*****************************************************************************/ + VMINT vm_video_play( + VMUINT player_layer_handle, + VMUINT base_layer_handle, + VMUINT16 repeat_count, + VMINT is_play_audio, + VMINT audio_path, + vm_video_finish_callback play_finish_callback); + + +/***************************************************************************** + * FUNCTION + * vm_video_stop + * DESCRIPTION + * To stop video playing. + * PARAMETERS + * void + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to stop player. + * VM_VIDEO_FAILED : Fail to stop player due to it is already stopped. + *****************************************************************************/ + VMINT vm_video_stop(void); + + + /***************************************************************************** + * FUNCTION + * vm_video_pause + * DESCRIPTION + * To pause video playing. + * PARAMETERS + * void + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to pause. + * VM_VIDEO_FAILED : Fail to pause. + *****************************************************************************/ +VMINT vm_video_pause(void); + + + /***************************************************************************** + * FUNCTION + * vm_video_resume + * DESCRIPTION + * To resume video playing. + * PARAMETERS + * void + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to resume. + * VM_VIDEO_FAILED : Fail to resume. + *****************************************************************************/ +VMINT vm_video_resume(void); + + + /***************************************************************************** + * FUNCTION + * vm_video_seek_and_getframe + * DESCRIPTION + * To seek video and get seek frame. + * PARAMETERS + * time : [IN] Seek time stamp. + * player_layer_handle : [IN] Get frame on this layer. + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to seek. + * VM_VIDEO_FAILED : Fail to seek. + *****************************************************************************/ + VMINT vm_video_seek_and_getframe(VMUINT64 time, VMUINT player_layer_handle); + + + /***************************************************************************** + * FUNCTION + * vm_video_snapshot + * DESCRIPTION + * To snapshot video and save as jpeg file. + * PARAMETERS + * layer_handle : [IN] Video play layer. + * file_name : [IN] Filename for jpeg. + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to snapshot. + * VM_VIDEO_ERR_SNAPSHOT_DISK_FULL : Fail to snapshot due to disk is full. + * VM_VIDEO_ERR_SNAPSHOT_WRITE_PROTECTION : Fail to snapshot due to the disk is in write protection mode. + * VM_VIDEO_ERR_SNAPSHOT_FAILED : Fail to snapshot. + *****************************************************************************/ + VMINT vm_video_snapshot(VMUINT player_layer_handle, VMWSTR file_name); + + + + /***************************************************************************** + * FUNCTION + * vm_video_set_brightness + * DESCRIPTION + * To set brightness parameter for video player. + * PARAMETERS + * brightness : [IN] Brightness value + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to set brightness parameter to video player. + * VM_VIDEO_FAILED : Fail to set brightness parameter to video player. + *****************************************************************************/ + VMINT vm_video_set_brightness(VMUINT16 brightness); + + + /***************************************************************************** + * FUNCTION + * vm_video_set_contrast + * DESCRIPTION + * To set contrast parameter to video player. + * PARAMETERS + * contrast : [IN] Contrast value + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to set EV parameter to video player. + * VM_VIDEO_FAILED : Fail to set EV parameter to video player. + *****************************************************************************/ + VMINT vm_video_set_contrast(VMUINT16 contrast); + + + + /***************************************************************************** + * FUNCTION + * vm_video_get_cur_play_time + * DESCRIPTION + * To get current play time. + * PARAMETERS + * cur_play_time : [OUT] Current play time. + * RETURNS + * result of get play time + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to set EV parameter to video player. + * VM_VIDEO_FAILED : Fail to set EV parameter to video player. + *****************************************************************************/ + VMINT vm_video_get_cur_play_time(VMUINT64 *cur_play_time); + + + /***************************************************************************** + * FUNCTION + * vm_video_play_stream_from_rtsp_link + * DESCRIPTION + * launch native Video Player to play specified RTSP link + * PARAMETERS + * url : [IN] RTSP URL link encoding with UCS2 format. + * RETURNS + * result of launch video player applicaiton + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to launch video player application + * VM_VIDEO_FAILED : Fail to launch video player application. + *****************************************************************************/ +VMINT vm_video_play_stream_from_rtsp_link(VMWSTR url); + +/***************************************************************************** + * FUNCTION + * vm_video_play_stream_from_sdp_file + * DESCRIPTION + * launch native Video Player to play specified sdp file + * PARAMETERS + * filename : [IN] sdp file name encoding with UCS2 format. + * is_short : [IN] is 8.3 format file name or not. + * RETURNS + * result of launch video player applicaiton + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to launch video player application + * VM_VIDEO_FAILED : Fail to launch video player application. + *****************************************************************************/ +VMINT vm_video_play_stream_from_sdp_file(VMWSTR filename, VMUCHAR is_short); + + +/***************************************************************************** + * FUNCTION + * vm_video_play_by_filepath + * DESCRIPTION + * launch native Video Player to play specified file path + * PARAMETERS + * filename : [IN] file name encoding with UCS2 format. + * RETURNS + * result of launch video player applicaiton + * RETURN VALUES + * VM_VIDEO_SUCCESS : Succeed to launch video player application + * or else failure. + *****************************************************************************/ +VMINT vm_video_play_by_filepath(VMWSTR filename); + +/***************************************************************************** + * FUNCTION + * vm_video_is_support_rtsp_link_play + * DESCRIPTION + * support rstp play or not + * PARAMETERS + * + * RETURNS + * + * RETURN VALUES + * TRUE : support rtsp play + * FALSE : not support + *****************************************************************************/ +VMBOOL vm_video_is_support_rtsp_link_play(void); + +/***************************************************************************** + * FUNCTION + * vm_video_is_support_sdp_file_play + * DESCRIPTION + * support sdp file play or not + * PARAMETERS + * + * RETURNS + * + * RETURN VALUES + * TRUE : support sdp file play + * FALSE : not support + *****************************************************************************/ +VMBOOL vm_video_is_support_sdp_file_play(void); + +#ifdef __cplusplus +} +#endif + +#endif /*_VM_VIDEO_H*/ diff --git a/hardware/arduino/mtk/system/libmtk/include/vmwdt.h b/hardware/arduino/mtk/system/libmtk/include/vmwdt.h new file mode 100644 index 00000000..c3b40d65 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmwdt.h @@ -0,0 +1,138 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMWDT_SDK_H +#define VMWDT_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +void vm_assert(VMSTR file, VMINT line); + +/***************************************************************************** + * FUNCTION + * vm_wdt_start + * DESCRIPTION + * start a watch dog + * PARAMETERS + * millisec : [IN] watch dog reset time + * RETURN VALUES + * >=0 : the handle of watch dog + * <0 : error + * EXAMPLE + * + * VMINT handle = vm_wdt_start(1000); + * // do somting + * vm_wdt_feed(handle); + * // finish doing + * vm_wdt_stop(handle); + * + *****************************************************************************/ +VMINT vm_wdt_start(VMUINT tick); + +/***************************************************************************** + * FUNCTION + * vm_wdt_feed + * DESCRIPTION + * feed watch + * PARAMETERS + * handle : [IN] watch dog handle that vm_wdt_start returned. + * RETURN + * void + * EXAMPLE + * + * VMINT handle = vm_wdt_start(1000); + * // do somting + * vm_wdt_feed(handle); + * // finish doing + * vm_wdt_stop(handle); + *****************************************************************************/ +void vm_wdt_feed(VMINT handle); + +/***************************************************************************** + * FUNCTION + * vm_wdt_stop + * DESCRIPTION + * stop watch dog + * PARAMETERS + * handle : [IN] watch dog handle that vm_wdt_start returned. + * RETURN + * void + * EXAMPLE + * + * VMINT handle = vm_wdt_start(1000); + * // do somting + * vm_wdt_feed(handle); + * // finish doing + * vm_wdt_stop(handle); + *****************************************************************************/ +void vm_wdt_stop(VMINT handle); + + +/***************************************************************************** + * FUNCTION + * VM_ASSERT + * DESCRIPTION + * assert the phone if the expression is false + * PARAMETERS + * expr : [IN] expression to check + * RETURN VALUES + * N/A + *****************************************************************************/ +#ifdef __LINKIT_DEBUG__ +#ifdef WIN32 + #define VM_ASSERT(__expr__) \ + do { \ + if (!(__expr__)) \ + { \ + _asm {int 3} \ + } \ + } while (0) +#else + #define VM_ASSERT(expr) do {if(!(expr)) vm_assert((VMSTR)__FILE__, __LINE__); } while (0) +#endif +#else + #define VM_ASSERT(expr) do {if(!(expr)) {} } while (0) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* VMWDT_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/include/vmxml.h b/hardware/arduino/mtk/system/libmtk/include/vmxml.h new file mode 100644 index 00000000..f0c327fb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/include/vmxml.h @@ -0,0 +1,337 @@ +/***************************************************************************** +* Copyright Statement: +* -------------------- +* This software is protected by Copyright and the information contained +* herein is confidential. The software may not be copied and the information +* contained herein may not be used or disclosed except with the written +* permission of MediaTek Inc. (C) 2005 +* +* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON +* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH +* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO +* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S +* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. +* +* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE +* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO +* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +* +* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE +* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF +* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND +* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER +* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). +* +*****************************************************************************/ + +#ifndef VMXML_SDK_H +#define VMXML_SDK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vmsys.h" + +/***************************************************************************** + * + * + * FUNCTION + * XML_start_doctype_hdlr + * DESCRIPTION + * This function is document type start handler. + * PARAMETERS + * data : [IN] Reserved. + * doctypeName : [IN] Document type name. + * sysid : [IN] System id. + * pubid : [IN] Public id. + * internal_subset : [IN] Internal subset. + * error : [IN] Error code. + * RETURNS + * void + *****************************************************************************/ +typedef void (*XML_start_doctype_hdlr) (void *data, + const VMCHAR *doctypeName, + const VMCHAR **sysid, + const VMCHAR **pubid, VMINT internal_subset, VMINT error); + + /***************************************************************************** + * + * + * FUNCTION + * XML_end_doctype_hdlr + * DESCRIPTION + * This function is document type end handler. + * PARAMETERS + * data : [IN] Reserved. + * error : [IN] Error code, refer to VM_XML_ERROR_ENUM. + * RETURNS + * void + *****************************************************************************/ +typedef void (*XML_end_doctype_hdlr) (void *data, VMINT error); + + /***************************************************************************** + * + * + * FUNCTION + * XML_start_elem_hdlr + * DESCRIPTION + * This function is element start handler. + * PARAMETERS + * data : [IN] Reserved. + * el : [IN] Element name. + * attr : [IN] Attribution list. + * error : [IN] Error code, refer to VM_XML_ERROR_ENUM. + * RETURNS + * void + *****************************************************************************/ +typedef void (*XML_start_elem_hdlr) (void *data, const VMCHAR *el, const VMCHAR **attr, VMINT error); + + /***************************************************************************** + * + * + * FUNCTION + * XML_end_elem_hdlr + * DESCRIPTION + * This function is element end handler. + * PARAMETERS + * data : [IN] Reserved. + * el : [IN] Element name. + * error : [IN] Error code, refer to VM_XML_ERROR_ENUM. + * RETURNS + * void + *****************************************************************************/ +typedef void (*XML_end_elem_hdlr) (void *data, const VMCHAR *el, VMINT error); + + /***************************************************************************** + * + * + * FUNCTION + * XML_data_hdlr + * DESCRIPTION + * This function is used to handle data. + * PARAMETERS + * resv : [IN] Reserved. + * el : [IN] Element name. + * data : [IN] Data. + * len : [IN] Length. + * error : [IN] Error code. + * RETURNS + * void + *****************************************************************************/ +typedef void (*XML_data_hdlr) (void *resv, const VMCHAR *el, const VMCHAR *data, VMINT len, VMINT error); + + /* Define the error code */ +typedef enum +{ + VM_XML_RESULT_FILE_NOT_FOUND = -4, /* The file isn't found */ + VM_XML_RESULT_OUT_OF_MEMORY = -3, /* The memory isn't enough */ + VM_XML_RESULT_ENCODING_ERROR = -2, /* The char encoding error */ + VM_XML_RESULT_FAIL = -1, /* Failed to parse xml */ + VM_XML_RESULT_OK = 0 /* Parsing xml successfully */ +} VM_XML_RESULT_ENUM; + +/* Define the error code */ +typedef enum +{ + VM_XML_NO_ERROR, /* No error */ + VM_XML_ERROR_MISMATCH_TAG, /* Error string: end tag name */ + VM_XML_ERROR_MISMATCH_DOCTYPENAME_ROOTNAME, /* Error string: root element name */ + VM_XML_ERROR_INVALID_ATTRIBUTE, /* Error string: attribute name */ + VM_XML_ERROR_DUPLICATE_ATTRIBUTE, /* Error string: attribute name */ + VM_XML_ERROR_ENTITY_DEFINITION, /* Error string: entity name */ + VM_XML_ERROR_UNDEFINED_ENTITY /* Error string: entity name */ +} VM_XML_ERROR_ENUM; + + /* XML parser struct with all the tag handler */ +typedef struct _VM_XML_PARSER_STRUCT +{ + XML_start_doctype_hdlr start_doctype_hdlr; /* Function pointer provided by app */ + XML_end_doctype_hdlr end_doctype_hdlr; /* Function pointer provided by app */ + XML_start_elem_hdlr start_elem_hdlr; /* Function pointer provided by app */ + XML_end_elem_hdlr end_elem_hdlr; /* Function pointer provided by app */ + XML_data_hdlr data_hdlr; /* Function pointer provided by app */ +} VM_XML_PARSER_STRUCT; + +/***************************************************************************** + * FUNCTION + * vm_xml_new_parser + * DESCRIPTION + * Initialize a new XML parser. The default handlers will be assigned. + * PARAMETERS + * parser : [IN] Pointer to a parser struct. + * RETURN VALUES + * VM_XML_RESULT_OK : If successful. + * VM_XML_RESULT_FAIL : If unsuccessful. + * EXAMPLE + * + * + * #define VMXML_TEST_FILE_RES "

Q's working space

Mediatek " + * + * static void vmxml_doctype_start(void *data, const VMCHAR *doctypeName, const VMCHAR **sysid, + * const VMCHAR **pubid, VMINT internal_subset, VMINT error) + * { + * vm_log_info("doctype_start: doctypeName: %s, %d", doctypeName, error); + * } + * + * static void vmxml_doctype_end(void *data, VMINT error) + * { + * vm_log_info("doctype_end: %d", error); + * } + * + * static void vmxml_elem_start(void *data, const VMCHAR *el, const VMCHAR **attr, VMINT error) + * { + * vm_log_info("elem_start: [%s] [res = %d]", el, error); + * } + * + * static void vmxml_elem_end(void *data, const VMCHAR *el, VMINT error) + * { + * if (VM_XML_NO_ERROR != error) + * { + * VMSTR err_str = vm_xml_get_error(); + * if (err_str != NULL) + * { + * vm_log_info("parse normally, error string %s", err_str); + * } + * } + * else + * { + * if (0 == strcmp(el, "html")) + * { + * vm_log_info("parse normally."); + * } + * } + * } + * + * static void vmxml_data(void *resv, const VMCHAR *el, const VMCHAR *data, VMINT len, VMINT error) + * { + * vm_log_info("Data: [%s][len = %d][res = %d]", el, len, error); + * + * if (0 == strcmp(el, "h1")) + * { + * if (0 == strcmp(data, "Q's working space")) + * { + * vm_log_info("get title text is correct"); + * } + * else + * { + * vm_log_info("get incorrect title"); + * } + * } + * } + * + * void xml_test(void) + * { + * VM_XML_RESULT_ENUM ret = VM_XML_RESULT_FAIL; + * VM_XML_PARSER_STRUCT parser; + * + * memset(&parser, 0, sizeof(VM_XML_PARSER_STRUCT)); + * ret = vm_xml_new_parser(&parser); + * + * if (ret == VM_XML_RESULT_OK) + * { + * vm_xml_set_data_handler(&parser, vmxml_data); + * vm_xml_set_doctype_handlers(&parser, vmxml_doctype_start, vmxml_doctype_end); + * vm_xml_set_element_handlers(&parser, vmxml_elem_start, vmxml_elem_end); + * ret = vm_xml_parse(&parser, VMXML_TEST_FILE_RES, strlen(VMXML_TEST_FILE_RES)); + * if (ret != VM_XML_RESULT_OK) + * { + * vm_log_info("vm_xml_parse() failed. error = %d", ret); + * } + * } + * } + * + *****************************************************************************/ +VMINT vm_xml_new_parser(VM_XML_PARSER_STRUCT *parser); + +/***************************************************************************** + * FUNCTION + * vm_xml_set_doctype_handlers + * DESCRIPTION + * Set document handlers. + * PARAMETERS + * parser : [IN] Pointer to a parser struct. + * start_hdlr : [IN] Function handler to handle start doc data. + * end_hdlr : [IN] Function handler to handle end doc data. + * SEE ALSO + * vm_xml_new_parser + *****************************************************************************/ +void vm_xml_set_doctype_handlers( + VM_XML_PARSER_STRUCT *parser, + XML_start_doctype_hdlr start_hdlr, + XML_end_doctype_hdlr end_hdlr); + +/***************************************************************************** + * FUNCTION + * vm_xml_set_element_handlers + * DESCRIPTION + * Set element handlers. + * PARAMETERS + * parser : [IN] Pointer to a parser struct. + * start_hdlr : [IN] Function handler to handle start element data. + * end_hdlr : [IN] Function handler to handle end element data. + * SEE ALSO + * vm_xml_new_parser + *****************************************************************************/ +void vm_xml_set_element_handlers( + VM_XML_PARSER_STRUCT *parser, + XML_start_elem_hdlr start_hdlr, + XML_end_elem_hdlr end_hdlr); + +/***************************************************************************** + * FUNCTION + * vm_xml_set_data_handler + * DESCRIPTION + * Set data handlers. + * PARAMETERS + * parser : [IN] Pointer to a parser struct. + * start_hdlr : [IN] Function handler to handle data. + * SEE ALSO + * vm_xml_new_parser + *****************************************************************************/ +void vm_xml_set_data_handler(VM_XML_PARSER_STRUCT *parser, XML_data_hdlr data_hdlr); + +/***************************************************************************** + * FUNCTION + * vm_xml_parse + * DESCRIPTION + * This function is called by application to start parsing if application pass. + * PARAMETERS + * parser : [IN] Pointer to a parser struct. + * xmlsource : [IN] Xml file name or XML string buffer. + * length : [IN] 0-from file; >0-from memory. + * RETURN VALUES + * VM_XML_RESULT_OK : If successful. + * VM_XML_RESULT_FAIL : If unsuccessful. + * SEE ALSO + * vm_xml_new_parser + *****************************************************************************/ +VMINT vm_xml_parse(VM_XML_PARSER_STRUCT *parser, const VMCHAR *xmlsource, VMINT length); + +/***************************************************************************** + * FUNCTION + * vm_xml_get_error + * DESCRIPTION + * Get the error string. + * RETURN + * Error string. + * SEE ALSO + * vm_xml_new_parser + *****************************************************************************/ +VMCHAR *vm_xml_get_error(void); + +#ifdef __cplusplus +} +#endif + +#endif /* VMXML_SDK_H */ + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head.c new file mode 100644 index 00000000..d6b9d654 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_get_http_head_t)(http_session_t* session, const char* name, char* value); +_get_http_head_t _get_http_head = NULL; + +int get_http_head(http_session_t* session, const char* name, char* value) +{ + int ret = {-1}; + if (NULL == _get_http_head) + _get_http_head = (_get_http_head_t)vm_get_sym_entry("get_http_head"); + + if (NULL != _get_http_head) + return _get_http_head(session,name,value); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head_by_index.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head_by_index.c new file mode 100644 index 00000000..43eab96a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head_by_index.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_get_http_head_by_index_t)(http_session_t* session, int index, char* name, char* value); +_get_http_head_by_index_t _get_http_head_by_index = NULL; + +int get_http_head_by_index(http_session_t* session, int index, char* name, char* value) +{ + int ret = {-1}; + if (NULL == _get_http_head_by_index) + _get_http_head_by_index = (_get_http_head_by_index_t)vm_get_sym_entry("get_http_head_by_index"); + + if (NULL != _get_http_head_by_index) + return _get_http_head_by_index(session,index,name,value); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head_number.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head_number.c new file mode 100644 index 00000000..82d513db --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_http_head_number.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_get_http_head_number_t)(http_session_t* session); +_get_http_head_number_t _get_http_head_number = NULL; + +int get_http_head_number(http_session_t* session) +{ + int ret = {-1}; + if (NULL == _get_http_head_number) + _get_http_head_number = (_get_http_head_number_t)vm_get_sym_entry("get_http_head_number"); + + if (NULL != _get_http_head_number) + return _get_http_head_number(session); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_today_from_2000.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_today_from_2000.c new file mode 100644 index 00000000..a065b5eb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/get_today_from_2000.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_get_today_from_2000_t)(void); +_get_today_from_2000_t _get_today_from_2000 = NULL; + +VMINT get_today_from_2000(void) +{ + if (NULL == _get_today_from_2000) + _get_today_from_2000 = (_get_today_from_2000_t)vm_get_sym_entry("get_today_from_2000"); + + if (NULL != _get_today_from_2000) + return _get_today_from_2000(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/rand.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/rand.c new file mode 100644 index 00000000..3f4a4856 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/rand.c @@ -0,0 +1,17 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int(*_rand_t)(void); + _rand_t _rand = NULL; +int rand(void) +{ + if (_rand == NULL) { + _rand = (_rand_t)vm_get_sym_entry("rand"); + } + if (_rand != NULL) { + return _rand(); + } + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/srand.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/srand.c new file mode 100644 index 00000000..19d1c354 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/srand.c @@ -0,0 +1,17 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int(*_srand_t)(unsigned int seed); + _srand_t _srand = NULL; +void srand(unsigned int seed) +{ + if (_srand == NULL) { + _srand = (_srand_t)vm_get_sym_entry("srand"); + } + if (_srand != NULL) { + _srand(seed); + } + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/strtoi.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/strtoi.c new file mode 100644 index 00000000..7ac6a2b0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/strtoi.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_strtoi_t)(char* s); +_strtoi_t _strtoi = NULL; + +int strtoi(char* s) +{ + int ret = {-1}; + if (NULL == _strtoi) + _strtoi = (_strtoi_t)vm_get_sym_entry("strtoi"); + + if (NULL != _strtoi) + return _strtoi(s); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm4res.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm4res.c new file mode 100644 index 00000000..4b68c51d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm4res.c @@ -0,0 +1,252 @@ +#include "vmsys.h" +#include "vm4res.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_res_init_t)(void); +_vm_res_init_t _vm_res_init = NULL; +VMINT32 vm_res_init(void) +{ + if (NULL == _vm_res_init) + _vm_res_init = (_vm_res_init_t)vm_get_sym_entry("vm_res_init"); + + if (NULL != _vm_res_init) + return _vm_res_init(); + + return (VMINT32 )-1; +} + +typedef VMINT32 (*_vm_res_init_with_language_t)(VMUINT32 language); +_vm_res_init_with_language_t _vm_res_init_with_language = NULL; +VMINT32 vm_res_init_with_language(VMUINT32 language) +{ + if (NULL == _vm_res_init_with_language) + _vm_res_init_with_language = (_vm_res_init_with_language_t)vm_get_sym_entry("vm_res_init_with_language"); + + if (NULL != _vm_res_init_with_language) + return _vm_res_init_with_language(language); + + return (VMINT32 )-1; +} + +typedef VMINT32 (*_vm_res_deinit_t)(void); +_vm_res_deinit_t _vm_res_deinit = NULL; +VMINT32 vm_res_deinit(void) +{ + if (NULL == _vm_res_deinit) + _vm_res_deinit = (_vm_res_deinit_t)vm_get_sym_entry("vm_res_deinit"); + + if (NULL != _vm_res_deinit) + return _vm_res_deinit(); + + return (VMINT32 )-1; +} + +typedef VMUINT8 * (*_vm_res_get_string_t)(VMUINT32 string_id); +_vm_res_get_string_t _vm_res_get_string = NULL; +VMUINT8 *vm_res_get_string(VMUINT32 string_id) +{ + if (NULL == _vm_res_get_string) + _vm_res_get_string = (_vm_res_get_string_t)vm_get_sym_entry("vm_res_get_string"); + + if (NULL != _vm_res_get_string) + return _vm_res_get_string(string_id); + + return NULL; +} + +typedef VMINT32 (*_vm_res_load_image_start_t)(void); +_vm_res_load_image_start_t _vm_res_load_image_start = NULL; +VMINT32 vm_res_load_image_start(void) +{ + if (NULL == _vm_res_load_image_start) + _vm_res_load_image_start = (_vm_res_load_image_start_t)vm_get_sym_entry("vm_res_load_image_start"); + + if (NULL != _vm_res_load_image_start) + return _vm_res_load_image_start(); + + return (VMINT32 )-1; +} + +typedef VMINT32 (*_vm_res_load_image_end_t)(void); +_vm_res_load_image_end_t _vm_res_load_image_end = NULL; +VMINT32 vm_res_load_image_end(void) +{ + if (NULL == _vm_res_load_image_end) + _vm_res_load_image_end = (_vm_res_load_image_end_t)vm_get_sym_entry("vm_res_load_image_end"); + + if (NULL != _vm_res_load_image_end) + return _vm_res_load_image_end(); + + return (VMINT32 )-1; +} + +typedef VMINT (*_vm_res_get_image_and_size_from_file_t)(VMWSTR filename, VMUINT32 image_id, void* buff, VMUINT32 *size); +_vm_res_get_image_and_size_from_file_t _vm_res_get_image_and_size_from_file = NULL; +VMINT vm_res_get_image_and_size_from_file(VMWSTR filename, VMUINT32 image_id, void* buff, VMUINT32 *size) +{ + if (NULL == _vm_res_get_image_and_size_from_file) + _vm_res_get_image_and_size_from_file = (_vm_res_get_image_and_size_from_file_t)vm_get_sym_entry("vm_res_get_image_and_size_from_file"); + + if (NULL != _vm_res_get_image_and_size_from_file) + return _vm_res_get_image_and_size_from_file(filename, image_id, buff, size); + + return (VMINT )-1; +} + +typedef VMINT (*_vm_res_get_audio_and_size_from_file_t)(VMWSTR filename, VMUINT32 audio_id, void* buff, VMUINT32 *size); +_vm_res_get_audio_and_size_from_file_t _vm_res_get_audio_and_size_from_file = NULL; +VMINT vm_res_get_audio_and_size_from_file(VMWSTR filename, VMUINT32 audio_id, void* buff, VMUINT32 *size) +{ + if (NULL == _vm_res_get_audio_and_size_from_file) + _vm_res_get_audio_and_size_from_file = (_vm_res_get_image_and_size_from_file_t)vm_get_sym_entry("vm_res_get_audio_and_size_from_file"); + + if (NULL != _vm_res_get_audio_and_size_from_file) + return _vm_res_get_audio_and_size_from_file(filename, audio_id, buff, size); + + return (VMINT )-1; +} + +typedef VMINT (*_vm_res_get_string_and_size_from_file_t)(VMWSTR filename, VMUINT32 string_id, void* buff, VMUINT32 *size); +_vm_res_get_string_and_size_from_file_t _vm_res_get_string_and_size_from_file = NULL; +VMINT vm_res_get_string_and_size_from_file(VMWSTR filename, VMUINT32 string_id, void* buff, VMUINT32 *size) +{ + if (NULL == _vm_res_get_string_and_size_from_file) + _vm_res_get_string_and_size_from_file = (_vm_res_get_string_and_size_from_file_t)vm_get_sym_entry("vm_res_get_string_and_size_from_file"); + + if (NULL != _vm_res_get_string_and_size_from_file) + return _vm_res_get_string_and_size_from_file(filename, string_id, buff, size); + + return (VMINT )-1; +} + +typedef VMINT (*_vm_res_get_image_and_size_from_rom_t)(VMWSTR filename, VMUINT32 image_id, void** buff, VMUINT32 *size); +_vm_res_get_image_and_size_from_rom_t _vm_res_get_image_and_size_from_rom = NULL; +VMINT vm_res_get_image_and_size_from_rom(VMWSTR filename, VMUINT32 image_id, void** buff, VMUINT32 *size) +{ + if (NULL == _vm_res_get_image_and_size_from_rom) + _vm_res_get_image_and_size_from_rom = (_vm_res_get_image_and_size_from_rom_t)vm_get_sym_entry("vm_res_get_image_and_size_from_rom"); + + if (NULL != _vm_res_get_image_and_size_from_rom) + return _vm_res_get_image_and_size_from_rom(filename, image_id, buff, size); + + return (VMINT )-1; +} + +typedef VMINT (*_vm_res_get_audio_and_size_from_rom_t)(VMWSTR filename, VMUINT32 audio_id, void** buff, VMUINT32 *size); +_vm_res_get_audio_and_size_from_rom_t _vm_res_get_audio_and_size_from_rom = NULL; +VMINT vm_res_get_audio_and_size_from_rom(VMWSTR filename, VMUINT32 audio_id, void** buff, VMUINT32 *size) +{ + if (NULL == _vm_res_get_audio_and_size_from_rom) + _vm_res_get_audio_and_size_from_rom = (_vm_res_get_audio_and_size_from_rom_t)vm_get_sym_entry("vm_res_get_audio_and_size_from_rom"); + + if (NULL != _vm_res_get_audio_and_size_from_rom) + return _vm_res_get_audio_and_size_from_rom(filename, audio_id, buff, size); + + return (VMINT )-1; +} + +typedef VMINT (*_vm_res_get_string_and_size_from_rom_t)(VMWSTR filename, VMUINT32 string_id, void** buff, VMUINT32 *size); +_vm_res_get_string_and_size_from_rom_t _vm_res_get_string_and_size_from_rom = NULL; +VMINT vm_res_get_string_and_size_from_rom(VMWSTR filename, VMUINT32 string_id, void** buff, VMUINT32 *size) +{ + if (NULL == _vm_res_get_string_and_size_from_rom) + _vm_res_get_string_and_size_from_rom = (_vm_res_get_string_and_size_from_rom_t)vm_get_sym_entry("vm_res_get_string_and_size_from_rom"); + + if (NULL != _vm_res_get_string_and_size_from_rom) + return _vm_res_get_string_and_size_from_rom(filename, string_id, buff, size); + + return (VMINT )-1; +} + +typedef VMUINT8 * (*_vm_res_get_image_and_size_t)(VMUINT32 image_id, VMUINT32 *size); +_vm_res_get_image_and_size_t _vm_res_get_image_and_size = NULL; +VMUINT8 *vm_res_get_image_and_size(VMUINT32 image_id, VMUINT32 *size) +{ + if (NULL == _vm_res_get_image_and_size) + _vm_res_get_image_and_size = (_vm_res_get_image_and_size_t)vm_get_sym_entry("vm_res_get_image_and_size"); + + if (NULL != _vm_res_get_image_and_size) + return _vm_res_get_image_and_size(image_id,size); + + return NULL; +} + +typedef VMUINT8 * (*_vm_res_get_image_t)(VMUINT32 image_id); +_vm_res_get_image_t _vm_res_get_image = NULL; +VMUINT8 *vm_res_get_image(VMUINT32 image_id) +{ + if (NULL == _vm_res_get_image) + _vm_res_get_image = (_vm_res_get_image_t)vm_get_sym_entry("vm_res_get_image"); + + if (NULL != _vm_res_get_image) + return _vm_res_get_image(image_id); + + return NULL; +} + +typedef VMUINT8 * (*_vm_res_get_image_with_header_t)(VMUINT32 image_id); +_vm_res_get_image_with_header_t _vm_res_get_image_with_header = NULL; +VMUINT8 *vm_res_get_image_with_header(VMUINT32 image_id) +{ + if (NULL == _vm_res_get_image_with_header) + _vm_res_get_image_with_header = (_vm_res_get_image_with_header_t)vm_get_sym_entry("vm_res_get_image_with_header"); + + if (NULL != _vm_res_get_image_with_header) + return _vm_res_get_image_with_header(image_id); + + return NULL; +} + +typedef VMUINT8 * (*_vm_res_get_image_and_size_with_header_t)(VMUINT32 image_id, VMUINT32 *size); +_vm_res_get_image_and_size_with_header_t _vm_res_get_image_and_size_with_header = NULL; +VMUINT8 *vm_res_get_image_and_size_with_header(VMUINT32 image_id, VMUINT32 *size) +{ + if (NULL == _vm_res_get_image_and_size_with_header) + _vm_res_get_image_and_size_with_header = (_vm_res_get_image_and_size_with_header_t)vm_get_sym_entry("vm_res_get_image_and_size_with_header"); + + if (NULL != _vm_res_get_image_and_size_with_header) + return _vm_res_get_image_and_size_with_header(image_id, size); + + return NULL; +} + +typedef VMUINT8 * (*_vm_res_get_audio_t)(VMUINT32 audio_id); +_vm_res_get_audio_t _vm_res_get_audio = NULL; +VMUINT8 *vm_res_get_audio(VMUINT32 audio_id) +{ + if (NULL == _vm_res_get_audio) + _vm_res_get_audio = (_vm_res_get_audio_t)vm_get_sym_entry("vm_res_get_audio"); + + if (NULL != _vm_res_get_audio) + return _vm_res_get_audio(audio_id); + + return NULL; +} + +typedef VMINT32 (*_vm_res_delete_t)(VMUINT32 id); +_vm_res_delete_t _vm_res_delete = NULL; +VMINT32 vm_res_delete(VMUINT32 id) +{ + if (NULL == _vm_res_delete) + _vm_res_delete = (_vm_res_delete_t)vm_get_sym_entry("vm_res_delete"); + + if (NULL != _vm_res_delete) + return _vm_res_delete(id); + + return (VMINT32 )-1; +} + +typedef VMUINT8 * (*_vm_res_get_virtual_image_t)(VMUINT32 image_id); +_vm_res_get_virtual_image_t _vm_res_get_virtual_image = NULL; +VMUINT8 *vm_res_get_virtual_image(VMUINT32 image_id) +{ + if (NULL == _vm_res_get_virtual_image) + _vm_res_get_virtual_image = (_vm_res_get_virtual_image_t)vm_get_sym_entry("vm_res_get_virtual_image"); + + if (NULL != _vm_res_get_virtual_image) + return _vm_res_get_virtual_image(image_id); + + return NULL; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_accept.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_accept.c new file mode 100644 index 00000000..058bdaae --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_accept.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_accept_t)(int sock, SOCKADDR *addr, int *addrlen); +_vm_accept_t _vm_accept = NULL; + +int vm_accept(int sock, SOCKADDR *addr, int *addrlen) +{ + if (NULL == _vm_accept) + _vm_accept = (_vm_accept_t)vm_get_sym_entry("vm_accept"); + if (NULL != _vm_accept) + return _vm_accept(sock,addr,addrlen); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_app_log.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_app_log.c new file mode 100644 index 00000000..06d05ba0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_app_log.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_app_log_t)(char* info); +_vm_app_log_t _vm_app_log = NULL; +void vm_app_log(char* info) +{ + if (_vm_app_log == NULL) + _vm_app_log = (_vm_app_log_t)vm_get_sym_entry("vm_app_log"); + + if (_vm_app_log != NULL) + _vm_app_log(info); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_dereg_msg_proc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_dereg_msg_proc.c new file mode 100644 index 00000000..2d10c4d9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_dereg_msg_proc.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmappcomm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_appcomm_dereg_msg_proc_t)(VMINT handle, VM_MESSAGE_PROC proc); +_vm_appcomm_dereg_msg_proc_t _vm_appcomm_dereg_msg_proc = NULL; + +VMINT vm_appcomm_dereg_msg_proc(VMINT handle, VM_MESSAGE_PROC proc) +{ + if (NULL == _vm_appcomm_dereg_msg_proc) + _vm_appcomm_dereg_msg_proc = (_vm_appcomm_dereg_msg_proc_t)vm_get_sym_entry("vm_appcomm_dereg_msg_proc"); + + if (NULL != _vm_appcomm_dereg_msg_proc) + return _vm_appcomm_dereg_msg_proc(handle,proc); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_dispatch_msg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_dispatch_msg.c new file mode 100644 index 00000000..6ebbbafd --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_dispatch_msg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmappcomm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_appcomm_dispatch_msg_t)(void); +_vm_appcomm_dispatch_msg_t _vm_appcomm_dispatch_msg = NULL; + +void vm_appcomm_dispatch_msg(void) +{ + if (NULL == _vm_appcomm_dispatch_msg) + _vm_appcomm_dispatch_msg = (_vm_appcomm_dispatch_msg_t)vm_get_sym_entry("vm_appcomm_dispatch_msg"); + + if (NULL != _vm_appcomm_dispatch_msg) + _vm_appcomm_dispatch_msg(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_init.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_init.c new file mode 100644 index 00000000..02c518eb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_init.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmappcomm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_appcomm_init_t)(void); +_vm_appcomm_init_t _vm_appcomm_init = NULL; + +void vm_appcomm_init(void) +{ + if (NULL == _vm_appcomm_init) + _vm_appcomm_init = (_vm_appcomm_init_t)vm_get_sym_entry("vm_appcomm_init"); + + if (NULL != _vm_appcomm_init) + _vm_appcomm_init(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_post_msg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_post_msg.c new file mode 100644 index 00000000..2f4dd172 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_post_msg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmappcomm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_appcomm_post_msg_t)(VMINT handle, VMUINT msg_id, VMINT wparam, VMINT lparam); +_vm_appcomm_post_msg_t _vm_appcomm_post_msg = NULL; + +VMINT vm_appcomm_post_msg(VMINT handle, VMUINT msg_id, VMINT wparam, VMINT lparam) +{ + if (NULL == _vm_appcomm_post_msg) + _vm_appcomm_post_msg = (_vm_appcomm_post_msg_t)vm_get_sym_entry("vm_appcomm_post_msg"); + + if (NULL != _vm_appcomm_post_msg) + return _vm_appcomm_post_msg(handle,msg_id,wparam,lparam); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_reg_msg_proc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_reg_msg_proc.c new file mode 100644 index 00000000..3c46e413 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_reg_msg_proc.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmappcomm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_appcomm_reg_msg_proc_t)(VMINT handle, VM_MESSAGE_PROC proc); +_vm_appcomm_reg_msg_proc_t _vm_appcomm_reg_msg_proc = NULL; + +VMINT vm_appcomm_reg_msg_proc(VMINT handle, VM_MESSAGE_PROC proc) +{ + if (NULL == _vm_appcomm_reg_msg_proc) + _vm_appcomm_reg_msg_proc = (_vm_appcomm_reg_msg_proc_t)vm_get_sym_entry("vm_appcomm_reg_msg_proc"); + + if (NULL != _vm_appcomm_reg_msg_proc) + return _vm_appcomm_reg_msg_proc(handle,proc); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_send_msg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_send_msg.c new file mode 100644 index 00000000..cdac05eb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_appcomm_send_msg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmappcomm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_appcomm_send_msg_t)(VMINT handle, VMUINT msg_id, VMINT wparam, VMINT lparam); +_vm_appcomm_send_msg_t _vm_appcomm_send_msg = NULL; + +VMINT vm_appcomm_send_msg(VMINT handle, VMUINT msg_id, VMINT wparam, VMINT lparam) +{ + if (NULL == _vm_appcomm_send_msg) + _vm_appcomm_send_msg = (_vm_appcomm_send_msg_t)vm_get_sym_entry("vm_appcomm_send_msg"); + + if (NULL != _vm_appcomm_send_msg) + return _vm_appcomm_send_msg(handle,msg_id,wparam,lparam); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ascii_to_ucs2.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ascii_to_ucs2.c new file mode 100644 index 00000000..b1abb802 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ascii_to_ucs2.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmchset.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ascii_to_ucs2_t)(VMWSTR dst, VMINT size, VMSTR src); +_vm_ascii_to_ucs2_t _vm_ascii_to_ucs2 = NULL; + +VMINT vm_ascii_to_ucs2(VMWSTR dst, VMINT size, VMSTR src) +{ + if (NULL == _vm_ascii_to_ucs2) + _vm_ascii_to_ucs2 = (_vm_ascii_to_ucs2_t)vm_get_sym_entry("vm_ascii_to_ucs2"); + + if (NULL != _vm_ascii_to_ucs2) + return _vm_ascii_to_ucs2(dst,size,src); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_assert.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_assert.c new file mode 100644 index 00000000..03b1270c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_assert.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmwdt.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_assert_t)(VMSTR file, VMINT line); +_vm_assert_t _vm_assert = NULL; + +void vm_assert(VMSTR file, VMINT line) +{ + if (NULL == _vm_assert) + _vm_assert = (_vm_assert_t)vm_get_sym_entry("vm_assert"); + + if (NULL != _vm_assert) + _vm_assert(file,line); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_asyn_http_req.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_asyn_http_req.c new file mode 100644 index 00000000..d51aa349 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_asyn_http_req.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_asyn_http_req_t)(asyn_http_req_t *request, void (*http_hook)(VMINT, void*), void (*http_state_notify)(VMINT state, VMINT param, void* session)); +_vm_asyn_http_req_t _vm_asyn_http_req = NULL; + +VMINT vm_asyn_http_req(asyn_http_req_t *request, void (*http_hook)(VMINT, void*), void (*http_state_notify)(VMINT state, VMINT param, void* session)) +{ + if (NULL == _vm_asyn_http_req) + _vm_asyn_http_req = (_vm_asyn_http_req_t)vm_get_sym_entry("vm_asyn_http_req"); + + if (NULL != _vm_asyn_http_req) + return _vm_asyn_http_req(request,http_hook,http_state_notify); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_atof.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_atof.c new file mode 100644 index 00000000..7426e065 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_atof.c @@ -0,0 +1,17 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef double(*_atof_t)(const char * nptr); + _atof_t _atof = NULL; +double vm_atof(const char * nptr) +{ + if (_atof == NULL) { + _atof = (_atof_t)vm_get_sym_entry("atof"); + } + if (_atof != NULL) { + return _atof(nptr); + } + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_bytes_duration.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_bytes_duration.c new file mode 100644 index 00000000..a5c1db90 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_bytes_duration.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_bytes_duration_t)(void *audio_data, VMUINT len, VMUINT8 format); +_vm_audio_bytes_duration_t _vm_audio_bytes_duration = NULL; + +VMINT vm_audio_bytes_duration(void *audio_data, VMUINT len, VMUINT8 format) +{ + if (NULL == _vm_audio_bytes_duration) + _vm_audio_bytes_duration = (_vm_audio_bytes_duration_t)vm_get_sym_entry("vm_audio_bytes_duration"); + + if (NULL != _vm_audio_bytes_duration) + return _vm_audio_bytes_duration(audio_data,len,format); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_clear_interrupt_callback.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_clear_interrupt_callback.c new file mode 100644 index 00000000..e5bd6454 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_clear_interrupt_callback.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_audio_clear_interrupt_callback_t)(VMINT handle); +_vm_audio_clear_interrupt_callback_t _vm_audio_clear_interrupt_callback = NULL; + +void vm_audio_clear_interrupt_callback(VMINT handle) +{ + if (NULL == _vm_audio_clear_interrupt_callback) + _vm_audio_clear_interrupt_callback = (_vm_audio_clear_interrupt_callback_t)vm_get_sym_entry("vm_audio_clear_interrupt_callback"); + + if (NULL != _vm_audio_clear_interrupt_callback) + _vm_audio_clear_interrupt_callback(handle); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_duration.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_duration.c new file mode 100644 index 00000000..86ee42c7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_duration.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_duration_t)(VMWSTR filename); +_vm_audio_duration_t _vm_audio_duration = NULL; + +VMINT vm_audio_duration(VMWSTR filename) +{ + if (NULL == _vm_audio_duration) + _vm_audio_duration = (_vm_audio_duration_t)vm_get_sym_entry("vm_audio_duration"); + + if (NULL != _vm_audio_duration) + return _vm_audio_duration(filename); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_get_time.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_get_time.c new file mode 100644 index 00000000..8945df4f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_get_time.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_get_time_t)(void); +_vm_audio_get_time_t _vm_audio_get_time = NULL; + +VMINT vm_audio_get_time(void) +{ + if (NULL == _vm_audio_get_time) + _vm_audio_get_time = (_vm_audio_get_time_t)vm_get_sym_entry("vm_audio_get_time"); + + if (NULL != _vm_audio_get_time) + return _vm_audio_get_time(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_is_app_playing.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_is_app_playing.c new file mode 100644 index 00000000..40e03cff --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_is_app_playing.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_audio_is_app_playing_t)(void); +_vm_audio_is_app_playing_t _vm_audio_is_app_playing = NULL; + +VMBOOL vm_audio_is_app_playing(void) +{ + if (NULL == _vm_audio_is_app_playing) + _vm_audio_is_app_playing = (_vm_audio_is_app_playing_t)vm_get_sym_entry("vm_audio_is_app_playing"); + + if (NULL != _vm_audio_is_app_playing) + return _vm_audio_is_app_playing(); + + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_is_calling.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_is_calling.c new file mode 100644 index 00000000..7f6d3a3d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_is_calling.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_is_calling_t)(void); +_vm_audio_is_calling_t _vm_audio_is_calling = NULL; + +VMINT vm_audio_is_calling(void) +{ + if (NULL == _vm_audio_is_calling) + _vm_audio_is_calling = (_vm_audio_is_calling_t)vm_get_sym_entry("vm_audio_is_calling"); + + if (NULL != _vm_audio_is_calling) + return _vm_audio_is_calling(); + + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_close.c new file mode 100644 index 00000000..7623a442 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_close.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_audio_mixed_close_t)(VMINT handle); +_vm_audio_mixed_close_t _vm_audio_mixed_close = NULL; + +void vm_audio_mixed_close(VMINT handle) +{ + if (NULL == _vm_audio_mixed_close) + _vm_audio_mixed_close = (_vm_audio_mixed_close_t)vm_get_sym_entry("vm_audio_mixed_close"); + + if (NULL != _vm_audio_mixed_close) + _vm_audio_mixed_close(handle); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_close_all.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_close_all.c new file mode 100644 index 00000000..5474f9fc --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_close_all.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_audio_mixed_close_all_t)(void); +_vm_audio_mixed_close_all_t _vm_audio_mixed_close_all = NULL; + +void vm_audio_mixed_close_all(void) +{ + if (NULL == _vm_audio_mixed_close_all) + _vm_audio_mixed_close_all = (_vm_audio_mixed_close_all_t)vm_get_sym_entry("vm_audio_mixed_close_all"); + + if (NULL != _vm_audio_mixed_close_all) + _vm_audio_mixed_close_all(); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_get_time.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_get_time.c new file mode 100644 index 00000000..6566fbda --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_get_time.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_mixed_get_time_t)(VMINT handle, VMUINT *current_time); +_vm_audio_mixed_get_time_t _vm_audio_mixed_get_time = NULL; + +VMINT vm_audio_mixed_get_time(VMINT handle, VMUINT *current_time) +{ + if (NULL == _vm_audio_mixed_get_time) + _vm_audio_mixed_get_time = (_vm_audio_mixed_get_time_t)vm_get_sym_entry("vm_audio_mixed_get_time"); + + if (NULL != _vm_audio_mixed_get_time) + return _vm_audio_mixed_get_time(handle,current_time); + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_open.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_open.c new file mode 100644 index 00000000..75aca2f8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_open.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_mixed_open_t)(vm_auido_mixed_open_struct* mixed_play); +_vm_audio_mixed_open_t _vm_audio_mixed_open = NULL; + +VMINT vm_audio_mixed_open(vm_auido_mixed_open_struct* mixed_open) +{ + if (NULL == _vm_audio_mixed_open) + _vm_audio_mixed_open = (_vm_audio_mixed_open_t)vm_get_sym_entry("vm_audio_mixed_open"); + + if (NULL != _vm_audio_mixed_open) + return _vm_audio_mixed_open(mixed_open); + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_pause.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_pause.c new file mode 100644 index 00000000..168dfb6e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_pause.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_mixed_pause_t)(VMINT handle); +_vm_audio_mixed_pause_t _vm_audio_mixed_pause = NULL; + +VMINT vm_audio_mixed_pause(VMINT handle) +{ + if (NULL == _vm_audio_mixed_pause) + _vm_audio_mixed_pause = (_vm_audio_mixed_pause_t)vm_get_sym_entry("vm_audio_mixed_pause"); + + if (NULL != _vm_audio_mixed_pause) + return _vm_audio_mixed_pause(handle); + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_play.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_play.c new file mode 100644 index 00000000..27e5cfb0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_play.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_mixed_play_t)(VMINT handle); +_vm_audio_mixed_play_t _vm_audio_mixed_play = NULL; + +VMINT vm_audio_mixed_play(VMINT handle) +{ + if (NULL == _vm_audio_mixed_play) + _vm_audio_mixed_play = (_vm_audio_mixed_play_t)vm_get_sym_entry("vm_audio_mixed_play"); + + if (NULL != _vm_audio_mixed_play) + return _vm_audio_mixed_play(handle); + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_resume.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_resume.c new file mode 100644 index 00000000..152516be --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_resume.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_mixed_resume_t)(VMINT handle); +_vm_audio_mixed_resume_t _vm_audio_mixed_resume = NULL; + +VMINT vm_audio_mixed_resume(VMINT handle) +{ + if (NULL == _vm_audio_mixed_resume) + _vm_audio_mixed_resume = (_vm_audio_mixed_resume_t)vm_get_sym_entry("vm_audio_mixed_resume"); + + if (NULL != _vm_audio_mixed_resume) + return _vm_audio_mixed_resume(handle); + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_set_speedup_mode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_set_speedup_mode.c new file mode 100644 index 00000000..517e49b8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_set_speedup_mode.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_audio_mixed_set_speedup_mode_t)(VMBOOL mode); +_vm_audio_mixed_set_speedup_mode_t _vm_audio_mixed_set_speedup_mode = NULL; + +void vm_audio_mixed_set_speedup_mode(VMBOOL mode) +{ + if (NULL == _vm_audio_mixed_set_speedup_mode) + _vm_audio_mixed_set_speedup_mode = (_vm_audio_mixed_set_speedup_mode_t)vm_get_sym_entry("vm_audio_mixed_set_speedup_mode"); + + if (NULL != _vm_audio_mixed_set_speedup_mode) + _vm_audio_mixed_set_speedup_mode(mode); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_set_start_time.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_set_start_time.c new file mode 100644 index 00000000..903157c3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_set_start_time.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_mixed_set_start_time_t)(VMINT handle, VMUINT start_time); +_vm_audio_mixed_set_start_time_t _vm_audio_mixed_set_start_time = NULL; + +VMINT vm_audio_mixed_set_start_time(VMINT handle, VMUINT start_time) +{ + if (NULL == _vm_audio_mixed_set_start_time) + _vm_audio_mixed_set_start_time = (_vm_audio_mixed_set_start_time_t)vm_get_sym_entry("vm_audio_mixed_set_start_time"); + + if (NULL != _vm_audio_mixed_set_start_time) + return _vm_audio_mixed_set_start_time(handle,start_time); + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_stop.c new file mode 100644 index 00000000..2235607a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_mixed_stop.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_audio_mixed_stop_t)(VMINT handle); +_vm_audio_mixed_stop_t _vm_audio_mixed_stop = NULL; + +void vm_audio_mixed_stop(VMINT handle) +{ + if (NULL == _vm_audio_mixed_stop) + _vm_audio_mixed_stop = (_vm_audio_mixed_stop_t)vm_get_sym_entry("vm_audio_mixed_stop"); + + if (NULL != _vm_audio_mixed_stop) + _vm_audio_mixed_stop(handle); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pause.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pause.c new file mode 100644 index 00000000..a3a0d8f3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pause.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_pause_t)(void (*f)(VMINT result)); +_vm_audio_pause_t _vm_audio_pause = NULL; + +VMINT vm_audio_pause(void (*f)(VMINT result)) +{ + if (NULL == _vm_audio_pause) + _vm_audio_pause = (_vm_audio_pause_t)vm_get_sym_entry("vm_audio_pause"); + + if (NULL != _vm_audio_pause) + return _vm_audio_pause(f); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_set_level.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_set_level.c new file mode 100644 index 00000000..133caf23 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_set_level.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_pitch_shifting_set_level_t)(VMINT16 level); +_vm_audio_pitch_shifting_set_level_t _vm_audio_pitch_shifting_set_level = NULL; + +VMINT vm_audio_pitch_shifting_set_level(VMINT16 level) +{ + if (NULL == _vm_audio_pitch_shifting_set_level) + _vm_audio_pitch_shifting_set_level = (_vm_audio_pitch_shifting_set_level_t)vm_get_sym_entry("vm_audio_pitch_shifting_set_level"); + + if (NULL != _vm_audio_pitch_shifting_set_level) + return _vm_audio_pitch_shifting_set_level(level); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_turn_off.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_turn_off.c new file mode 100644 index 00000000..e4fcb926 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_turn_off.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_pitch_shifting_turn_off_t)(void); +_vm_audio_pitch_shifting_turn_off_t _vm_audio_pitch_shifting_turn_off = NULL; + +VMINT vm_audio_pitch_shifting_turn_off(void) +{ + if (NULL == _vm_audio_pitch_shifting_turn_off) + _vm_audio_pitch_shifting_turn_off = (_vm_audio_pitch_shifting_turn_off_t)vm_get_sym_entry("vm_audio_pitch_shifting_turn_off"); + + if (NULL != _vm_audio_pitch_shifting_turn_off) + return _vm_audio_pitch_shifting_turn_off(); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_turn_on.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_turn_on.c new file mode 100644 index 00000000..d908d096 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_pitch_shifting_turn_on.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_pitch_shifting_turn_on_t)(void); +_vm_audio_pitch_shifting_turn_on_t _vm_audio_pitch_shifting_turn_on = NULL; + +VMINT vm_audio_pitch_shifting_turn_on(void) +{ + if (NULL == _vm_audio_pitch_shifting_turn_on) + _vm_audio_pitch_shifting_turn_on = (_vm_audio_pitch_shifting_turn_on_t)vm_get_sym_entry("vm_audio_pitch_shifting_turn_on"); + + if (NULL != _vm_audio_pitch_shifting_turn_on) + return _vm_audio_pitch_shifting_turn_on(); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_beep.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_beep.c new file mode 100644 index 00000000..7dc81ef3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_beep.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_audio_play_beep_t)(void); +_vm_audio_play_beep_t _vm_audio_play_beep = NULL; + +void vm_audio_play_beep(void) +{ + if (NULL == _vm_audio_play_beep) + _vm_audio_play_beep = (_vm_audio_play_beep_t)vm_get_sym_entry("vm_audio_play_beep"); + + if (NULL != _vm_audio_play_beep) + _vm_audio_play_beep(); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_bytes.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_bytes.c new file mode 100644 index 00000000..73a4fc06 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_bytes.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_play_bytes_t)(void *audio_data, VMUINT len, VMUINT8 format, VMUINT start_time, VMUINT path, void (*f)(VMINT result)); +_vm_audio_play_bytes_t _vm_audio_play_bytes = NULL; + +VMINT vm_audio_play_bytes(void *audio_data, VMUINT len, VMUINT8 format, VMUINT start_time, VMUINT path, void (*f)(VMINT result)) +{ + if (NULL == _vm_audio_play_bytes) + _vm_audio_play_bytes = (_vm_audio_play_bytes_t)vm_get_sym_entry("vm_audio_play_bytes"); + + if (NULL != _vm_audio_play_bytes) + return _vm_audio_play_bytes(audio_data,len,format,start_time,path,f); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_bytes_no_block.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_bytes_no_block.c new file mode 100644 index 00000000..09dcba7b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_bytes_no_block.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_play_bytes_no_block_t)(void *audio_data, VMUINT len, VMUINT8 format, VMUINT path, void (*f)(VMINT result)); +_vm_audio_play_bytes_no_block_t _vm_audio_play_bytes_no_block = NULL; + +VMINT vm_audio_play_bytes_no_block(void *audio_data, VMUINT len, VMUINT8 format, VMUINT path, void (*f)(VMINT result)) +{ + if (NULL == _vm_audio_play_bytes_no_block) + _vm_audio_play_bytes_no_block = (_vm_audio_play_bytes_no_block_t)vm_get_sym_entry("vm_audio_play_bytes_no_block"); + + if (NULL != _vm_audio_play_bytes_no_block) + return _vm_audio_play_bytes_no_block(audio_data, len, format, path, f); + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_file.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_file.c new file mode 100644 index 00000000..3668cb6f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_file.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_play_file_t)(VMWSTR filename, void (*f)(VMINT result)); +_vm_audio_play_file_t _vm_audio_play_file = NULL; + +VMINT vm_audio_play_file(VMWSTR filename, void (*f)(VMINT result)) +{ + if (NULL == _vm_audio_play_file) + _vm_audio_play_file = (_vm_audio_play_file_t)vm_get_sym_entry("vm_audio_play_file"); + + if (NULL != _vm_audio_play_file) + return _vm_audio_play_file(filename,f); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_file_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_file_ex.c new file mode 100644 index 00000000..a88e11fd --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_play_file_ex.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_play_file_ex_t)(VMWSTR filename, VMUINT start_time, VMUINT path, void (*f)(VMINT result)); +_vm_audio_play_file_ex_t _vm_audio_play_file_ex = NULL; + +VMINT vm_audio_play_file_ex(VMWSTR filename, VMUINT start_time, VMUINT path, void (*f)(VMINT result)) +{ + if (NULL == _vm_audio_play_file_ex) + _vm_audio_play_file_ex = (_vm_audio_play_file_ex_t)vm_get_sym_entry("vm_audio_play_file_ex"); + + if (NULL != _vm_audio_play_file_ex) + return _vm_audio_play_file_ex(filename,start_time,path,f); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_register_interrupt_callback.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_register_interrupt_callback.c new file mode 100644 index 00000000..bb673997 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_register_interrupt_callback.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_register_interrupt_callback_t)(vm_audio_result_callback callback); +_vm_audio_register_interrupt_callback_t _vm_audio_register_interrupt_callback = NULL; + +VMINT vm_audio_register_interrupt_callback(vm_audio_result_callback callback) +{ + if (NULL == _vm_audio_register_interrupt_callback) + _vm_audio_register_interrupt_callback = (_vm_audio_register_interrupt_callback_t)vm_get_sym_entry("vm_audio_register_interrupt_callback"); + + if (NULL != _vm_audio_register_interrupt_callback) + return _vm_audio_register_interrupt_callback(callback); + + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_resume.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_resume.c new file mode 100644 index 00000000..ec6d3aa4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_resume.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_resume_t)(void (*f)(VMINT result)); +_vm_audio_resume_t _vm_audio_resume = NULL; + +VMINT vm_audio_resume(void (*f)(VMINT result)) +{ + if (NULL == _vm_audio_resume) + _vm_audio_resume = (_vm_audio_resume_t)vm_get_sym_entry("vm_audio_resume"); + + if (NULL != _vm_audio_resume) + return _vm_audio_resume(f); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_resume_bg_play.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_resume_bg_play.c new file mode 100644 index 00000000..bfca2be4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_resume_bg_play.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_audio_resume_bg_play_t)(void); +_vm_audio_resume_bg_play_t _vm_audio_resume_bg_play = NULL; + +void vm_audio_resume_bg_play(void) +{ + if (NULL == _vm_audio_resume_bg_play) + _vm_audio_resume_bg_play = (_vm_audio_resume_bg_play_t)vm_get_sym_entry("vm_audio_resume_bg_play"); + + if (NULL != _vm_audio_resume_bg_play) + _vm_audio_resume_bg_play(); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_set_volume_type.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_set_volume_type.c new file mode 100644 index 00000000..c6d13fde --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_set_volume_type.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_set_volume_type_t)(VMINT type); +_vm_audio_set_volume_type_t _vm_audio_set_volume_type = NULL; + +VMINT vm_audio_set_volume_type(VMINT type) +{ + if (NULL == _vm_audio_set_volume_type) + _vm_audio_set_volume_type = (_vm_audio_set_volume_type_t)vm_get_sym_entry("vm_audio_set_volume_type"); + + if (NULL != _vm_audio_set_volume_type) + return _vm_audio_set_volume_type(type); + + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_stop.c new file mode 100644 index 00000000..5a4592b8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_stop.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_stop_t)(void (*f)(VMINT result)); +_vm_audio_stop_t _vm_audio_stop = NULL; + +VMINT vm_audio_stop(void (*f)(VMINT result)) +{ + if (NULL == _vm_audio_stop) + _vm_audio_stop = (_vm_audio_stop_t)vm_get_sym_entry("vm_audio_stop"); + + if (NULL != _vm_audio_stop) + return _vm_audio_stop(f); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_stop_all.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_stop_all.c new file mode 100644 index 00000000..c75b0c37 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_stop_all.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_stop_all_t)(void); +_vm_audio_stop_all_t _vm_audio_stop_all = NULL; + +VMINT vm_audio_stop_all(void) +{ + if (NULL == _vm_audio_stop_all) + _vm_audio_stop_all = (_vm_audio_stop_all_t)vm_get_sym_entry("vm_audio_stop_all"); + + if (NULL != _vm_audio_stop_all) + return _vm_audio_stop_all(); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_suspend_bg_play.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_suspend_bg_play.c new file mode 100644 index 00000000..00a47156 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_suspend_bg_play.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_audio_suspend_bg_play_t)(void); +_vm_audio_suspend_bg_play_t _vm_audio_suspend_bg_play = NULL; + +void vm_audio_suspend_bg_play(void) +{ + if (NULL == _vm_audio_suspend_bg_play) + _vm_audio_suspend_bg_play = (_vm_audio_suspend_bg_play_t)vm_get_sym_entry("vm_audio_suspend_bg_play"); + + if (NULL != _vm_audio_suspend_bg_play) + _vm_audio_suspend_bg_play(); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_terminate_background_play.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_terminate_background_play.c new file mode 100644 index 00000000..f0bbe1b9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_terminate_background_play.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_audio_terminate_background_play_t)(void); +_vm_audio_terminate_background_play_t _vm_audio_terminate_background_play = NULL; + +void vm_audio_terminate_background_play(void) +{ + if (NULL == _vm_audio_terminate_background_play) + _vm_audio_terminate_background_play = (_vm_audio_terminate_background_play_t)vm_get_sym_entry("vm_audio_terminate_background_play"); + + if (NULL != _vm_audio_terminate_background_play) + _vm_audio_terminate_background_play(); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_vocal_removal_turn_off.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_vocal_removal_turn_off.c new file mode 100644 index 00000000..3cdca67b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_vocal_removal_turn_off.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_vocal_removal_turn_off_t)(void); +_vm_audio_vocal_removal_turn_off_t _vm_audio_vocal_removal_turn_off = NULL; + +VMINT vm_audio_vocal_removal_turn_off(void) +{ + if (NULL == _vm_audio_vocal_removal_turn_off) + _vm_audio_vocal_removal_turn_off = (_vm_audio_vocal_removal_turn_off_t)vm_get_sym_entry("vm_audio_vocal_removal_turn_off"); + + if (NULL != _vm_audio_vocal_removal_turn_off) + return _vm_audio_vocal_removal_turn_off(); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_vocal_removal_turn_on.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_vocal_removal_turn_on.c new file mode 100644 index 00000000..ab41165d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_audio_vocal_removal_turn_on.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_audio_vocal_removal_turn_on_t)(void); +_vm_audio_vocal_removal_turn_on_t _vm_audio_vocal_removal_turn_on = NULL; + +VMINT vm_audio_vocal_removal_turn_on(void) +{ + if (NULL == _vm_audio_vocal_removal_turn_on) + _vm_audio_vocal_removal_turn_on = (_vm_audio_vocal_removal_turn_on_t)vm_get_sym_entry("vm_audio_vocal_removal_turn_on"); + + if (NULL != _vm_audio_vocal_removal_turn_on) + return _vm_audio_vocal_removal_turn_on(); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_decode_basic.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_decode_basic.c new file mode 100644 index 00000000..a8e7f401 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_decode_basic.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmbase64.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_base64_decode_basic_t)(const VMCHAR *src, VMINT32 srcl,VMCHAR *dst,VMINT32 dstl); +_vm_base64_decode_basic_t _vm_base64_decode_basic = NULL; + +VMINT32 vm_base64_decode_basic(const VMCHAR *src, VMINT32 srcl,VMCHAR *dst,VMINT32 dstl) +{ + if (NULL == _vm_base64_decode_basic) + _vm_base64_decode_basic = (_vm_base64_decode_basic_t)vm_get_sym_entry("vm_base64_decode_basic"); + + if (NULL != _vm_base64_decode_basic) + return _vm_base64_decode_basic(src, srcl, dst, dstl); + else + return -255; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_encode_basic.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_encode_basic.c new file mode 100644 index 00000000..5e0e9bc5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_encode_basic.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmbase64.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_base64_encode_basic_t)(const VMCHAR *src, VMINT32 srcl, VMCHAR *dst,VMINT32 dstl,VMBOOL auto_line_wrap); +_vm_base64_encode_basic_t _vm_base64_encode_basic = NULL; + +VMINT32 vm_base64_encode_basic(const VMCHAR *src, VMINT32 srcl, VMCHAR *dst,VMINT32 dstl,VMBOOL auto_line_wrap) +{ + if (NULL == _vm_base64_encode_basic) + _vm_base64_encode_basic = (_vm_base64_encode_basic_t)vm_get_sym_entry("vm_base64_encode_basic"); + + if (NULL != _vm_base64_encode_basic) + return _vm_base64_encode_basic(src, srcl, dst, dstl, auto_line_wrap); + else + return -255; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_append.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_append.c new file mode 100644 index 00000000..97f8fe7d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_append.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmbase64.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_base64_part_decode_append_t)(vm_base64_part_context* cntx,const VMCHAR *src, VMINT32 *srcl,VMCHAR *dst,VMINT32 dstl); +_vm_base64_part_decode_append_t _vm_base64_part_decode_append = NULL; + +VMINT32 vm_base64_part_decode_append(vm_base64_part_context* cntx,const VMCHAR *src, VMINT32 *srcl,VMCHAR *dst,VMINT32 dstl) +{ + if (NULL == _vm_base64_part_decode_append) + _vm_base64_part_decode_append = (_vm_base64_part_decode_append_t)vm_get_sym_entry("vm_base64_part_decode_append"); + + if (NULL != _vm_base64_part_decode_append) + return _vm_base64_part_decode_append(cntx, src, srcl, dst, dstl); + else + return -255; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_finish.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_finish.c new file mode 100644 index 00000000..f8fbf151 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_finish.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmbase64.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_base64_part_decode_finish_t)(vm_base64_part_context* cntx,VMBOOL* illegal_format); +_vm_base64_part_decode_finish_t _vm_base64_part_decode_finish = NULL; + +VMINT32 vm_base64_part_decode_finish(vm_base64_part_context* cntx,VMBOOL* illegal_format) +{ + if (NULL == _vm_base64_part_decode_finish) + _vm_base64_part_decode_finish = (_vm_base64_part_decode_finish_t)vm_get_sym_entry("vm_base64_part_decode_finish"); + + if (NULL != _vm_base64_part_decode_finish) + return _vm_base64_part_decode_finish(cntx, illegal_format); + else + return -255; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_init.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_init.c new file mode 100644 index 00000000..70581b10 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_decode_init.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmbase64.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_base64_part_decode_init_t)(vm_base64_part_context *cntx, VMINT32 max_part_buf_size); +_vm_base64_part_decode_init_t _vm_base64_part_decode_init = NULL; + +VMINT32 vm_base64_part_decode_init( vm_base64_part_context *cntx, VMINT32 max_part_buf_size) +{ + if (NULL == _vm_base64_part_decode_init) + _vm_base64_part_decode_init = (_vm_base64_part_decode_init_t)vm_get_sym_entry("vm_base64_part_decode_init"); + + if (NULL != _vm_base64_part_decode_init) + return _vm_base64_part_decode_init(cntx, max_part_buf_size); + else + return -255; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_append.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_append.c new file mode 100644 index 00000000..b5f1db5e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_append.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmbase64.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_base64_part_encode_append_t)(vm_base64_part_context *cntx,const VMCHAR *src,VMINT32 *srcl,VMCHAR *dst,VMINT32 dstl); +_vm_base64_part_encode_append_t _vm_base64_part_encode_append = NULL; + +VMINT32 vm_base64_part_encode_append(vm_base64_part_context *cntx,const VMCHAR *src,VMINT32 *srcl,VMCHAR *dst,VMINT32 dstl) +{ + if (NULL == _vm_base64_part_encode_append) + _vm_base64_part_encode_append = (_vm_base64_part_encode_append_t)vm_get_sym_entry("vm_base64_part_encode_append"); + + if (NULL != _vm_base64_part_encode_append) + return _vm_base64_part_encode_append(cntx, src, srcl, dst, dstl); + else + return -255; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_finish.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_finish.c new file mode 100644 index 00000000..ecc19685 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_finish.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmbase64.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_base64_part_encode_finish_t)(vm_base64_part_context* cntx,VMCHAR *dst,VMINT32 dstl); +_vm_base64_part_encode_finish_t _vm_base64_part_encode_finish = NULL; + +VMINT32 vm_base64_part_encode_finish(vm_base64_part_context* cntx,VMCHAR *dst,VMINT32 dstl) +{ + if (NULL == _vm_base64_part_encode_finish) + _vm_base64_part_encode_finish = (_vm_base64_part_encode_finish_t)vm_get_sym_entry("vm_base64_part_encode_finish"); + + if (NULL != _vm_base64_part_encode_finish) + return _vm_base64_part_encode_finish(cntx, dst, dstl); + else + return -255; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_init.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_init.c new file mode 100644 index 00000000..89df0b45 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_base64_part_encode_init.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmbase64.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_base64_part_encode_init_t)(vm_base64_part_context *cntx,VMINT32 max_part_buf_size,VMBOOL auto_line_wrap); +_vm_base64_part_encode_init_t _vm_base64_part_encode_init = NULL; + +VMINT32 vm_base64_part_encode_init(vm_base64_part_context *cntx,VMINT32 max_part_buf_size,VMBOOL auto_line_wrap) +{ + if (NULL == _vm_base64_part_encode_init) + _vm_base64_part_encode_init = (_vm_base64_part_encode_init_t)vm_get_sym_entry("vm_base64_part_encode_init"); + + if (NULL != _vm_base64_part_encode_init) + return _vm_base64_part_encode_init(cntx, max_part_buf_size, auto_line_wrap); + else + return -255; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bearer_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bearer_close.c new file mode 100644 index 00000000..3c23913d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bearer_close.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_bearer_close_t)(VMINT hdl); +_vm_bearer_close_t _vm_bearer_close = NULL; + +VMINT vm_bearer_close(VMINT hdl) +{ + if (NULL == _vm_bearer_close) + _vm_bearer_close = (_vm_bearer_close_t)vm_get_sym_entry("vm_bearer_close"); + if (NULL != _vm_bearer_close) + return _vm_bearer_close(hdl); + return (VMINT)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bearer_open.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bearer_open.c new file mode 100644 index 00000000..dd46f441 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bearer_open.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_bearer_open_t)(VMINT apn, void *user_data, void (*callback)(VMINT handle, VMINT event, VMUINT param, void *user_data)); +_vm_bearer_open_t _vm_bearer_open = NULL; + +VMINT vm_bearer_open(VMINT apn, void *user_data, void (*callback)(VMINT handle, VMINT event, VMUINT param, void *user_data)) +{ + if (NULL == _vm_bearer_open) + _vm_bearer_open = (_vm_bearer_open_t)vm_get_sym_entry("vm_bearer_open"); + if (NULL != _vm_bearer_open) + return _vm_bearer_open(apn,user_data,callback); + return (VMINT)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bind.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bind.c new file mode 100644 index 00000000..68332503 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bind.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_bind_t)(int sock, const SOCKADDR *addr, int addrlen, int type); +_vm_bind_t _vm_bind = NULL; + +int vm_bind(int sock, const SOCKADDR *addr, int addrlen, int type) +{ + if (NULL == _vm_bind) + _vm_bind = (_vm_bind_t)vm_get_sym_entry("vm_bind"); + if (NULL != _vm_bind) + return _vm_bind(sock,addr,addrlen,type); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bridge_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bridge_close.c new file mode 100644 index 00000000..181995b5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bridge_close.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmbridge.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_bridge_close_t)(vm_bridge_info *firPeer, vm_bridge_info *secPeer); +_vm_bridge_close_t _vm_bridge_close = NULL; + +VMINT vm_bridge_close(vm_bridge_info *firPeer, vm_bridge_info *secPeer) +{ + if (NULL == _vm_bridge_close) + _vm_bridge_close = (_vm_bridge_close_t)vm_get_sym_entry("vm_bridge_close"); + + if (NULL != _vm_bridge_close) + return _vm_bridge_close(firPeer,secPeer); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bridge_create.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bridge_create.c new file mode 100644 index 00000000..ea144b5d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bridge_create.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmbridge.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_bridge_create_t)(vm_bridge_info *firPeer, vm_bridge_info *secPeer); +_vm_bridge_create_t _vm_bridge_create = NULL; + +VMINT vm_bridge_create(vm_bridge_info *firPeer, vm_bridge_info *secPeer) +{ + if (NULL == _vm_bridge_create) + _vm_bridge_create = (_vm_bridge_create_t)vm_get_sym_entry("vm_bridge_create"); + + if (NULL != _vm_bridge_create) + return _vm_bridge_create(firPeer,secPeer); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_cm_send_passkey.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_cm_send_passkey.c new file mode 100644 index 00000000..0e28275e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_cm_send_passkey.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_bt_cm_send_passkey_t)(vm_srv_bt_cm_bt_addr* dev_addr, VMUINT8* dev_passkey, VMBOOL result); +_vm_bt_cm_send_passkey_t _vm_bt_cm_send_passkey = NULL; + +VMINT vm_bt_cm_send_passkey(vm_srv_bt_cm_bt_addr* dev_addr, VMUINT8* dev_passkey, VMBOOL result) +{ + if (NULL == _vm_bt_cm_send_passkey) + _vm_bt_cm_send_passkey = (_vm_bt_cm_send_passkey_t)vm_get_sym_entry("vm_bt_cm_send_passkey"); + if (NULL != _vm_bt_cm_send_passkey) + return _vm_bt_cm_send_passkey(dev_addr,dev_passkey,result); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_noti_check_channel_valid.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_noti_check_channel_valid.c new file mode 100644 index 00000000..55c5ba89 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_noti_check_channel_valid.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmbtnotify.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_bt_noti_check_channel_valid_t)(VMINT cntx_chnl); +_vm_bt_noti_check_channel_valid_t _vm_bt_noti_check_channel_valid = NULL; + +VMINT vm_bt_noti_check_channel_valid(VMINT cntx_chnl) +{ + if (NULL == _vm_bt_noti_check_channel_valid) + _vm_bt_noti_check_channel_valid = (_vm_bt_noti_check_channel_valid_t)vm_get_sym_entry("vm_bt_noti_check_channel_valid"); + if (NULL != _vm_bt_noti_check_channel_valid) + return _vm_bt_noti_check_channel_valid(cntx_chnl); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_noti_get_bt_device_addr.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_noti_get_bt_device_addr.c new file mode 100644 index 00000000..aecdf4f1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_bt_noti_get_bt_device_addr.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmbtnotify.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_bt_noti_get_bt_device_addr_t)(VMINT cntx_chnl, vm_srv_bt_cm_bt_addr *bt_addr); +_vm_bt_noti_get_bt_device_addr_t _vm_bt_noti_get_bt_device_addr = NULL; + +VMINT vm_bt_noti_get_bt_device_addr(VMINT cntx_chnl, vm_srv_bt_cm_bt_addr *bt_addr) +{ + if (NULL == _vm_bt_noti_get_bt_device_addr) + _vm_bt_noti_get_bt_device_addr = (_vm_bt_noti_get_bt_device_addr_t)vm_get_sym_entry("vm_bt_noti_get_bt_device_addr"); + if (NULL != _vm_bt_noti_get_bt_device_addr) + return _vm_bt_noti_get_bt_device_addr(cntx_chnl,bt_addr); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_exit.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_exit.c new file mode 100644 index 00000000..475de421 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_exit.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_exit_t)(VMINT res_hd); +_vm_btcm_exit_t _vm_btcm_exit = NULL; +VMINT vm_btcm_exit(VMINT res_hd) +{ + if (NULL == _vm_btcm_exit) + _vm_btcm_exit = (_vm_btcm_exit_t)vm_get_sym_entry("vm_btcm_exit"); + + if (NULL != _vm_btcm_exit) + return _vm_btcm_exit(res_hd); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_dev_info_by_index.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_dev_info_by_index.c new file mode 100644 index 00000000..c4531cbc --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_dev_info_by_index.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_get_dev_info_by_index_t)(VMUINT idx, vm_srv_bt_cm_dev_type_enum dev_type, vm_srv_bt_cm_dev_struct * info); +_vm_btcm_get_dev_info_by_index_t _vm_btcm_get_dev_info_by_index = NULL; +VMINT vm_btcm_get_dev_info_by_index(VMUINT idx, vm_srv_bt_cm_dev_type_enum dev_type, vm_srv_bt_cm_dev_struct * info) +{ + if (NULL == _vm_btcm_get_dev_info_by_index) + _vm_btcm_get_dev_info_by_index = (_vm_btcm_get_dev_info_by_index_t)vm_get_sym_entry("vm_btcm_get_dev_info_by_index"); + + if (NULL != _vm_btcm_get_dev_info_by_index) + return _vm_btcm_get_dev_info_by_index(idx,dev_type,info); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_dev_num.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_dev_num.c new file mode 100644 index 00000000..2fa62cff --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_dev_num.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_get_dev_num_t)(vm_srv_bt_cm_dev_type_enum dev_type); +_vm_btcm_get_dev_num_t _vm_btcm_get_dev_num = NULL; +VMINT vm_btcm_get_dev_num(vm_srv_bt_cm_dev_type_enum dev_type) +{ + if (NULL == _vm_btcm_get_dev_num) + _vm_btcm_get_dev_num = (_vm_btcm_get_dev_num_t)vm_get_sym_entry("vm_btcm_get_dev_num"); + + if (NULL != _vm_btcm_get_dev_num) + return _vm_btcm_get_dev_num(dev_type); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_host_dev_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_host_dev_info.c new file mode 100644 index 00000000..8fdb5895 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_host_dev_info.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_get_host_dev_info_t)(vm_srv_bt_cm_dev_struct * info); +_vm_btcm_get_host_dev_info_t _vm_btcm_get_host_dev_info = NULL; +VMINT vm_btcm_get_host_dev_info(vm_srv_bt_cm_dev_struct * info) +{ + if (NULL == _vm_btcm_get_host_dev_info) + _vm_btcm_get_host_dev_info = (_vm_btcm_get_host_dev_info_t)vm_get_sym_entry("vm_btcm_get_host_dev_info"); + + if (NULL != _vm_btcm_get_host_dev_info) + return _vm_btcm_get_host_dev_info(info); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_power_status.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_power_status.c new file mode 100644 index 00000000..4a1b61cc --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_get_power_status.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_get_power_status_t)(void); +_vm_btcm_get_power_status_t _vm_btcm_get_power_status = NULL; +VMINT vm_btcm_get_power_status(void) +{ + if (NULL == _vm_btcm_get_power_status) + _vm_btcm_get_power_status = (_vm_btcm_get_power_status_t)vm_get_sym_entry("vm_btcm_get_power_status"); + + if (NULL != _vm_btcm_get_power_status) + return _vm_btcm_get_power_status(); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_init.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_init.c new file mode 100644 index 00000000..fe2a047a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_init.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_init_t)(void (*callback)(VMUINT evt, void * param, void * user_data), VMUINT evt_mask, void * user_data); +_vm_btcm_init_t _vm_btcm_init = NULL; +VMINT vm_btcm_init(void (*callback)(VMUINT evt, void * param, void * user_data), VMUINT evt_mask, void * user_data) +{ + if (NULL == _vm_btcm_init) + _vm_btcm_init = (_vm_btcm_init_t)vm_get_sym_entry("vm_btcm_init"); + + if (NULL != _vm_btcm_init) + return _vm_btcm_init(callback, evt_mask, user_data); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_search.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_search.c new file mode 100644 index 00000000..9cf84ff7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_search.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_search_t)(VMUINT8 max_response, VMUINT16 time_out, VMUINT cod, VMBYTE is_name_discovery); +_vm_btcm_search_t _vm_btcm_search = NULL; +VMINT vm_btcm_search(VMUINT8 max_response, VMUINT16 time_out, VMUINT cod, VMBYTE is_name_discovery) +{ + if (NULL == _vm_btcm_search) + _vm_btcm_search = (_vm_btcm_search_t)vm_get_sym_entry("vm_btcm_search"); + + if (NULL != _vm_btcm_search) + return _vm_btcm_search(max_response,time_out,cod,is_name_discovery); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_search_abort.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_search_abort.c new file mode 100644 index 00000000..525604af --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_search_abort.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_search_abort_t)(void); +_vm_btcm_search_abort_t _vm_btcm_search_abort = NULL; +VMINT vm_btcm_search_abort(void) +{ + if (NULL == _vm_btcm_search_abort) + _vm_btcm_search_abort = (_vm_btcm_search_abort_t)vm_get_sym_entry("vm_btcm_search_abort"); + + if (NULL != _vm_btcm_search_abort) + return _vm_btcm_search_abort(); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_set_host_name.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_set_host_name.c new file mode 100644 index 00000000..0402803a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_set_host_name.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_set_host_name_t)(VMUINT8 * name); +_vm_btcm_set_host_name_t _vm_btcm_set_host_name = NULL; +VMINT vm_btcm_set_host_name(VMUINT8 * name) +{ + if (NULL == _vm_btcm_set_host_name) + _vm_btcm_set_host_name = (_vm_btcm_set_host_name_t)vm_get_sym_entry("vm_btcm_set_host_name"); + + if (NULL != _vm_btcm_set_host_name) + return _vm_btcm_set_host_name(name); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_srv_get_visibility.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_srv_get_visibility.c new file mode 100644 index 00000000..d25047f9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_srv_get_visibility.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_srv_get_visibility_t)(void); +_vm_btcm_srv_get_visibility_t _vm_btcm_srv_get_visibility = NULL; +VMINT vm_btcm_srv_get_visibility(void) +{ + if (NULL == _vm_btcm_srv_get_visibility) + _vm_btcm_srv_get_visibility = (_vm_btcm_srv_get_visibility_t)vm_get_sym_entry("vm_btcm_srv_get_visibility"); + + if (NULL != _vm_btcm_srv_get_visibility) + return _vm_btcm_srv_get_visibility(); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_srv_set_visibility.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_srv_set_visibility.c new file mode 100644 index 00000000..bc33d364 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_srv_set_visibility.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_srv_set_visibility_t)(vm_srv_bt_cm_visibility_type type); +_vm_btcm_srv_set_visibility_t _vm_btcm_srv_set_visibility = NULL; +VMINT vm_btcm_srv_set_visibility(vm_srv_bt_cm_visibility_type type) +{ + if (NULL == _vm_btcm_srv_set_visibility) + _vm_btcm_srv_set_visibility = (_vm_btcm_srv_set_visibility_t)vm_get_sym_entry("vm_btcm_srv_set_visibility"); + + if (NULL != _vm_btcm_srv_set_visibility) + return _vm_btcm_srv_set_visibility(type); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_switch_off.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_switch_off.c new file mode 100644 index 00000000..d9263e3d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_switch_off.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_switch_off_t)(void); +_vm_btcm_switch_off_t _vm_btcm_switch_off = NULL; +VMINT vm_btcm_switch_off(void) +{ + if (NULL == _vm_btcm_switch_off) + _vm_btcm_switch_off = (_vm_btcm_switch_off_t)vm_get_sym_entry("vm_btcm_switch_off"); + + if (NULL != _vm_btcm_switch_off) + return _vm_btcm_switch_off(); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_switch_on.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_switch_on.c new file mode 100644 index 00000000..e55b44bd --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btcm_switch_on.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btcm_switch_on_t)(void); +_vm_btcm_switch_on_t _vm_btcm_switch_on = NULL; +VMINT vm_btcm_switch_on(void) +{ + if (NULL == _vm_btcm_switch_on) + _vm_btcm_switch_on = (_vm_btcm_switch_on_t)vm_get_sym_entry("vm_btcm_switch_on"); + + if (NULL != _vm_btcm_switch_on) + return _vm_btcm_switch_on(); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_accept.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_accept.c new file mode 100644 index 00000000..eeb8f7c2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_accept.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_accept_t)(VMINT conn_id, void * buf, VMUINT tx_size, VMUINT rx_size ); +_vm_btspp_accept_t _vm_btspp_accept = NULL; +VMINT vm_btspp_accept(VMINT conn_id, void * buf, VMUINT tx_size, VMUINT rx_size ) +{ + if (NULL == _vm_btspp_accept) + _vm_btspp_accept = (_vm_btspp_accept_t)vm_get_sym_entry("vm_btspp_accept"); + + if (NULL != _vm_btspp_accept) + return _vm_btspp_accept(conn_id,buf,tx_size,rx_size); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_bind.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_bind.c new file mode 100644 index 00000000..f2005563 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_bind.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_bind_t)(VMINT res_hd, VMUINT16 uuid); +_vm_btspp_bind_t _vm_btspp_bind = NULL; +VMINT vm_btspp_bind(VMINT res_hd, VMUINT16 uuid) +{ + if (NULL == _vm_btspp_bind) + _vm_btspp_bind = (_vm_btspp_bind_t)vm_get_sym_entry("vm_btspp_bind"); + + if (NULL != _vm_btspp_bind) + return _vm_btspp_bind(res_hd, uuid); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_close.c new file mode 100644 index 00000000..d92018f3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_close.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_close_t)(VMINT res_hd); +_vm_btspp_close_t _vm_btspp_close = NULL; +VMINT vm_btspp_close(VMINT res_hd) +{ + if (NULL == _vm_btspp_close) + _vm_btspp_close = (_vm_btspp_close_t)vm_get_sym_entry("vm_btspp_close"); + + if (NULL != _vm_btspp_close) + return _vm_btspp_close(res_hd); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_connect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_connect.c new file mode 100644 index 00000000..23e20f3c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_connect.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_connect_t)(VMINT res_hd, const vm_srv_bt_cm_bt_addr * bt_addr, void * buf, VMUINT tx_size, VMUINT rx_size, VMUINT16 uuid ); +_vm_btspp_connect_t _vm_btspp_connect = NULL; +VMINT vm_btspp_connect(VMINT res_hd, const vm_srv_bt_cm_bt_addr * bt_addr, void * buf, VMUINT tx_size, VMUINT rx_size, VMUINT16 uuid ) +{ + if (NULL == _vm_btspp_connect) + _vm_btspp_connect = (_vm_btspp_connect_t)vm_get_sym_entry("vm_btspp_connect"); + + if (NULL != _vm_btspp_connect) + return _vm_btspp_connect(res_hd,bt_addr,buf,tx_size,rx_size, uuid); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_connect_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_connect_ex.c new file mode 100644 index 00000000..350f0889 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_connect_ex.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_connect_ex_t)(VMINT res_hd, const vm_srv_bt_cm_bt_addr * bt_addr, void * buf, VMUINT tx_size, VMUINT rx_size, vm_srv_spp_connect_type conn_type, VMUINT16 uuid ); +_vm_btspp_connect_ex_t _vm_btspp_connect_ex = NULL; +VMINT vm_btspp_connect_ex(VMINT res_hd, const vm_srv_bt_cm_bt_addr * bt_addr, void * buf, VMUINT tx_size, VMUINT rx_size, vm_srv_spp_connect_type conn_type, VMUINT16 uuid ) +{ + if (NULL == _vm_btspp_connect_ex) + _vm_btspp_connect_ex = (_vm_btspp_connect_ex_t)vm_get_sym_entry("vm_btspp_connect_ex"); + + if (NULL != _vm_btspp_connect_ex) + return _vm_btspp_connect_ex(res_hd,bt_addr,buf,tx_size,rx_size,conn_type, uuid); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_disconnect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_disconnect.c new file mode 100644 index 00000000..47136ed2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_disconnect.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_disconnect_t)(VMINT conn_id); +_vm_btspp_disconnect_t _vm_btspp_disconnect = NULL; +VMINT vm_btspp_disconnect(VMINT conn_id) +{ + if (NULL == _vm_btspp_disconnect) + _vm_btspp_disconnect = (_vm_btspp_disconnect_t)vm_get_sym_entry("vm_btspp_disconnect"); + + if (NULL != _vm_btspp_disconnect) + return _vm_btspp_disconnect(conn_id); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_get_dev_addr.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_get_dev_addr.c new file mode 100644 index 00000000..6f70ad57 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_get_dev_addr.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_get_dev_addr_t)(VMINT conn_id, vm_srv_bt_cm_bt_addr * bt_addr); +_vm_btspp_get_dev_addr_t _vm_btspp_get_dev_addr = NULL; +VMINT vm_btspp_get_dev_addr(VMINT conn_id, vm_srv_bt_cm_bt_addr * bt_addr) +{ + if (NULL == _vm_btspp_get_dev_addr) + _vm_btspp_get_dev_addr = (_vm_btspp_get_dev_addr_t)vm_get_sym_entry("vm_btspp_get_dev_addr"); + + if (NULL != _vm_btspp_get_dev_addr) + return _vm_btspp_get_dev_addr(conn_id,bt_addr); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_get_min_buf_size.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_get_min_buf_size.c new file mode 100644 index 00000000..c4018f32 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_get_min_buf_size.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_get_min_buf_size_t)(void); +_vm_btspp_get_min_buf_size_t _vm_btspp_get_min_buf_size = NULL; +VMINT vm_btspp_get_min_buf_size(void) +{ + if (NULL == _vm_btspp_get_min_buf_size) + _vm_btspp_get_min_buf_size = (_vm_btspp_get_min_buf_size_t)vm_get_sym_entry("vm_btspp_get_min_buf_size"); + + if (NULL != _vm_btspp_get_min_buf_size) + return _vm_btspp_get_min_buf_size(); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_open.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_open.c new file mode 100644 index 00000000..3d39beb9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_open.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_open_t)(VMUINT evt_mask, void (*callback)(VMUINT evt, void * param, void * user_data), void * user_data); +_vm_btspp_open_t _vm_btspp_open = NULL; +VMINT vm_btspp_open(VMUINT evt_mask, void (*callback)(VMUINT evt, void * param, void * user_data), void * user_data) +{ + if (NULL == _vm_btspp_open) + _vm_btspp_open = (_vm_btspp_open_t)vm_get_sym_entry("vm_btspp_open"); + + if (NULL != _vm_btspp_open) + return _vm_btspp_open(evt_mask,callback,user_data); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_read.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_read.c new file mode 100644 index 00000000..60ae74ae --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_read.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_read_t)(VMUINT conn_id, void * buf, VMUINT size); +_vm_btspp_read_t _vm_btspp_read = NULL; +VMINT vm_btspp_read(VMUINT conn_id, void * buf, VMUINT size) +{ + if (NULL == _vm_btspp_read) + _vm_btspp_read = (_vm_btspp_read_t)vm_get_sym_entry("vm_btspp_read"); + + if (NULL != _vm_btspp_read) + return _vm_btspp_read(conn_id,buf,size); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_reject.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_reject.c new file mode 100644 index 00000000..2da225c8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_reject.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_reject_t)(VMINT conn_id); +_vm_btspp_reject_t _vm_btspp_reject = NULL; +VMINT vm_btspp_reject(VMINT conn_id) +{ + if (NULL == _vm_btspp_reject) + _vm_btspp_reject = (_vm_btspp_reject_t)vm_get_sym_entry("vm_btspp_reject"); + + if (NULL != _vm_btspp_reject) + return _vm_btspp_reject(conn_id); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_set_security_level.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_set_security_level.c new file mode 100644 index 00000000..2c5fb2f1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_set_security_level.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_set_security_level_t)(VMINT res_hd, VMINT level); +_vm_btspp_set_security_level_t _vm_btspp_set_security_level = NULL; +VMINT vm_btspp_set_security_level(VMINT res_hd, VMINT level) +{ + if (NULL == _vm_btspp_set_security_level) + _vm_btspp_set_security_level = (_vm_btspp_set_security_level_t)vm_get_sym_entry("vm_btspp_set_security_level"); + + if (NULL != _vm_btspp_set_security_level) + return _vm_btspp_set_security_level(res_hd,level); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_set_service_name.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_set_service_name.c new file mode 100644 index 00000000..866998ca --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_set_service_name.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_set_service_name_t)(VMINT res_hd, VMWCHAR * name); +_vm_btspp_set_service_name_t _vm_btspp_set_service_name = NULL; +VMINT vm_btspp_set_service_name(VMINT res_hd, VMWCHAR * name) +{ + if (NULL == _vm_btspp_set_service_name) + _vm_btspp_set_service_name = (_vm_btspp_set_service_name_t)vm_get_sym_entry("vm_btspp_set_service_name"); + + if (NULL != _vm_btspp_set_service_name) + return _vm_btspp_set_service_name(res_hd,name); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_write.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_write.c new file mode 100644 index 00000000..d524ca02 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_btspp_write.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmbtspp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_btspp_write_t)(VMUINT conn_id, void * buf, VMUINT size); +_vm_btspp_write_t _vm_btspp_write = NULL; +VMINT vm_btspp_write(VMUINT conn_id, void * buf, VMUINT size) +{ + if (NULL == _vm_btspp_write) + _vm_btspp_write = (_vm_btspp_write_t)vm_get_sym_entry("vm_btspp_write"); + + if (NULL != _vm_btspp_write) + return _vm_btspp_write(conn_id,buf,size); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cache_read_char.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cache_read_char.c new file mode 100644 index 00000000..5aab1f8e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cache_read_char.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_cache_read_char_t)(vm_cache_t *cache, char *ch); +_vm_cache_read_char_t _vm_cache_read_char = NULL; + +VMINT vm_cache_read_char(vm_cache_t *cache, char *ch) +{ + if (NULL == _vm_cache_read_char) + _vm_cache_read_char = (_vm_cache_read_char_t)vm_get_sym_entry("vm_cache_read_char"); + + if (NULL != _vm_cache_read_char) + return _vm_cache_read_char(cache,ch); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_call_actions.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_call_actions.c new file mode 100644 index 00000000..70ad501c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_call_actions.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_call_actions_t)(const vm_call_actions_data* data); +_vm_call_actions_t _vm_call_actions = NULL; + +VMINT vm_call_actions(const vm_call_actions_data* data) +{ + if (NULL == _vm_call_actions) + _vm_call_actions = (_vm_call_actions_t)vm_get_sym_entry("vm_call_actions"); + + if (NULL != _vm_call_actions) + return _vm_call_actions(data); + + return -1; + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_call_reg_listener.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_call_reg_listener.c new file mode 100644 index 00000000..bb7dd311 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_call_reg_listener.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_call_reg_listener_t)(vm_call_listener_func func); +_vm_call_reg_listener_t _vm_call_reg_listener = NULL; + +VMINT vm_call_reg_listener(vm_call_listener_func func) +{ + if (NULL == _vm_call_reg_listener) + _vm_call_reg_listener = (_vm_call_reg_listener_t)vm_get_sym_entry("vm_call_reg_listener"); + + if (NULL != _vm_call_reg_listener) + return _vm_call_reg_listener(func); + + return -1; + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_calloc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_calloc.c new file mode 100644 index 00000000..05b024b3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_calloc.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void *(*_vm_calloc_t)(int size); +_vm_calloc_t _vm_calloc = NULL; + +void *vm_calloc(int size) +{ + if (NULL == _vm_calloc) + _vm_calloc = (_vm_calloc_t)vm_get_sym_entry("vm_calloc"); + + if (NULL != _vm_calloc) + return _vm_calloc(size); + return NULL; + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_callout.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_callout.c new file mode 100644 index 00000000..8f67a1e1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_callout.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_callout_t)(VMWSTR phnum); +_vm_callout_t _vm_callout = NULL; + +void vm_callout(VMWSTR phnum) +{ + if (NULL == _vm_callout) + _vm_callout = (_vm_callout_t)vm_get_sym_entry("vm_callout"); + + if (NULL != _vm_callout) + _vm_callout(phnum); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_callout_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_callout_ex.c new file mode 100644 index 00000000..dbfd378c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_callout_ex.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_callout_ex_t)(VMWSTR phnum, VM_CALLOUT_RESPONSE_T callback); +_vm_callout_ex_t _vm_callout_ex = NULL; + +VMINT vm_callout_ex(VMWSTR phnum, VM_CALLOUT_RESPONSE_T callback) +{ + if (NULL == _vm_callout_ex) + _vm_callout_ex = (_vm_callout_ex_t)vm_get_sym_entry("vm_callout_ex"); + + if (NULL != _vm_callout_ex) + return _vm_callout_ex(phnum,callback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_camera_startup.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_camera_startup.c new file mode 100644 index 00000000..a54beb82 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_camera_startup.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vm_camera_startup_t)(void); +_vm_vm_camera_startup_t _vm_camera_startup = NULL; +VMINT vm_camera_startup(void) +{ + if (NULL == _vm_camera_startup) + _vm_camera_startup = (_vm_vm_camera_startup_t)vm_get_sym_entry("vm_camera_startup"); + + if (NULL != _vm_camera_startup) + return _vm_camera_startup(); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_all_http_sessions.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_all_http_sessions.c new file mode 100644 index 00000000..04f9078f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_all_http_sessions.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_cancel_all_http_sessions_t)(void); +_vm_cancel_all_http_sessions_t _vm_cancel_all_http_sessions = NULL; + +void vm_cancel_all_http_sessions(void) +{ + if (NULL == _vm_cancel_all_http_sessions) + _vm_cancel_all_http_sessions = (_vm_cancel_all_http_sessions_t)vm_get_sym_entry("vm_cancel_all_http_sessions"); + + if (NULL != _vm_cancel_all_http_sessions) + _vm_cancel_all_http_sessions(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_asyn_http_req.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_asyn_http_req.c new file mode 100644 index 00000000..e2c3f2df --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_asyn_http_req.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_cancel_asyn_http_req_t)(VMINT handle); +_vm_cancel_asyn_http_req_t _vm_cancel_asyn_http_req = NULL; + +VMINT vm_cancel_asyn_http_req(VMINT handle) +{ + if (NULL == _vm_cancel_asyn_http_req) + _vm_cancel_asyn_http_req = (_vm_cancel_asyn_http_req_t)vm_get_sym_entry("vm_cancel_asyn_http_req"); + + if (NULL != _vm_cancel_asyn_http_req) + return _vm_cancel_asyn_http_req(handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_kal_timer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_kal_timer.c new file mode 100644 index 00000000..e977cd50 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_kal_timer.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmtimer.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_cancel_kal_timer_t)(vm_kal_timerid timer_ptr); +_vm_cancel_kal_timer_t _vm_cancel_kal_timer = NULL; +void vm_cancel_kal_timer(vm_kal_timerid timer_ptr) + +{ + if (NULL == _vm_cancel_kal_timer) + _vm_cancel_kal_timer = (_vm_cancel_kal_timer_t)vm_get_sym_entry("vm_cancel_kal_timer"); + if (NULL != _vm_cancel_kal_timer) + _vm_cancel_kal_timer(timer_ptr); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_send_sms.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_send_sms.c new file mode 100644 index 00000000..f68f5da4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cancel_send_sms.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_cancel_send_sms_t)(void); +_vm_cancel_send_sms_t _vm_cancel_send_sms = NULL; + +void vm_cancel_send_sms(void) +{ + if (NULL == _vm_cancel_send_sms) + _vm_cancel_send_sms = (_vm_cancel_send_sms_t)vm_get_sym_entry("vm_cancel_send_sms"); + + if (NULL != _vm_cancel_send_sms) + _vm_cancel_send_sms(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cbm_hold_bearer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cbm_hold_bearer.c new file mode 100644 index 00000000..7cf26460 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cbm_hold_bearer.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_cbm_hold_bearer_t)(vm_res_type_t type, VMINT hdl); +_vm_cbm_hold_bearer_t _vm_cbm_hold_bearer = NULL; + +VMINT vm_cbm_hold_bearer(vm_res_type_t type, VMINT hdl) +{ + if (NULL == _vm_cbm_hold_bearer) + _vm_cbm_hold_bearer = (_vm_cbm_hold_bearer_t)vm_get_sym_entry("vm_cbm_hold_bearer"); + + if (NULL != _vm_cbm_hold_bearer) + return _vm_cbm_hold_bearer(type,hdl); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cbm_release_bearer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cbm_release_bearer.c new file mode 100644 index 00000000..2b0c5bff --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cbm_release_bearer.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_cbm_release_bearer_t)(void); +_vm_cbm_release_bearer_t _vm_cbm_release_bearer = NULL; + +VMINT vm_cbm_release_bearer(void) +{ + if (NULL == _vm_cbm_release_bearer) + _vm_cbm_release_bearer = (_vm_cbm_release_bearer_t)vm_get_sym_entry("vm_cbm_release_bearer"); + + if (NULL != _vm_cbm_release_bearer) + return _vm_cbm_release_bearer(); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ce_auth_app_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ce_auth_app_ex.c new file mode 100644 index 00000000..1bddfa65 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ce_auth_app_ex.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcert.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ce_auth_app_ex_t)(VMWSTR filename, VMUCHAR * cache_buf, VMINT cache_len, VMINT mode ); +_vm_ce_auth_app_ex_t _vm_ce_auth_app_ex = NULL; + +VMINT vm_ce_auth_app_ex( VMWSTR filename, VMUCHAR * cache_buf, VMINT cache_len, VMINT mode ) +{ + if (NULL == _vm_ce_auth_app_ex) + _vm_ce_auth_app_ex = (_vm_ce_auth_app_ex_t)vm_get_sym_entry("vm_ce_auth_app_ex"); + + if (NULL != _vm_ce_auth_app_ex) + return _vm_ce_auth_app_ex(filename,cache_buf,cache_len, mode); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_close.c new file mode 100644 index 00000000..f16cf97b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_close.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcell.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_cell_close_t)(void); +_vm_cell_close_t _vm_cell_close = NULL; + +void vm_cell_close(void) +{ + if (NULL == _vm_cell_close) + _vm_cell_close = (_vm_cell_close_t)vm_get_sym_entry("vm_cell_close"); + + if (NULL != _vm_cell_close) + _vm_cell_close(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_cur_cell_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_cur_cell_info.c new file mode 100644 index 00000000..9faf66bb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_cur_cell_info.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcell.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_cell_info_struct* (*_vm_cell_get_cur_cell_info_t)(void); +_vm_cell_get_cur_cell_info_t _vm_cell_get_cur_cell_info = NULL; + +vm_cell_info_struct* vm_cell_get_cur_cell_info(void) +{ + if (NULL == _vm_cell_get_cur_cell_info) + _vm_cell_get_cur_cell_info = (_vm_cell_get_cur_cell_info_t)vm_get_sym_entry("vm_cell_get_cur_cell_info"); + + if (NULL != _vm_cell_get_cur_cell_info) + return _vm_cell_get_cur_cell_info(); + + return (vm_cell_info_struct* )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_nbr_cell_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_nbr_cell_info.c new file mode 100644 index 00000000..a4161793 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_nbr_cell_info.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcell.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_cell_info_struct** (*_vm_cell_get_nbr_cell_info_t)(void); +_vm_cell_get_nbr_cell_info_t _vm_cell_get_nbr_cell_info = NULL; + +vm_cell_info_struct** vm_cell_get_nbr_cell_info(void) +{ + if (NULL == _vm_cell_get_nbr_cell_info) + _vm_cell_get_nbr_cell_info = (_vm_cell_get_nbr_cell_info_t)vm_get_sym_entry("vm_cell_get_nbr_cell_info"); + + if (NULL != _vm_cell_get_nbr_cell_info) + return _vm_cell_get_nbr_cell_info(); + + return (vm_cell_info_struct** )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_nbr_num.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_nbr_num.c new file mode 100644 index 00000000..7a86f095 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_get_nbr_num.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcell.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT* (*_vm_cell_get_nbr_num_t)(void); +_vm_cell_get_nbr_num_t _vm_cell_get_nbr_num = NULL; + +VMINT* vm_cell_get_nbr_num(void) +{ + if (NULL == _vm_cell_get_nbr_num) + _vm_cell_get_nbr_num = (_vm_cell_get_nbr_num_t)vm_get_sym_entry("vm_cell_get_nbr_num"); + + if (NULL != _vm_cell_get_nbr_num) + return _vm_cell_get_nbr_num(); + + return (VMINT* )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_open.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_open.c new file mode 100644 index 00000000..87e40340 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_cell_open.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcell.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_cell_open_t)(void); +_vm_cell_open_t _vm_cell_open = NULL; + +VMINT vm_cell_open(void) +{ + if (NULL == _vm_cell_open) + _vm_cell_open = (_vm_cell_open_t)vm_get_sym_entry("vm_cell_open"); + + if (NULL != _vm_cell_open) + return _vm_cell_open(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_charbat_is_charging.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_charbat_is_charging.c new file mode 100644 index 00000000..a4abecbb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_charbat_is_charging.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_charbat_is_charging_t)(void) ; +_vm_charbat_is_charging_t _vm_charbat_is_charging = NULL; + +VMBOOL vm_charbat_is_charging(void) +{ + if (NULL == _vm_charbat_is_charging) + _vm_charbat_is_charging = (_vm_charbat_is_charging_t)vm_get_sym_entry("vm_charbat_is_charging"); + + if (NULL != _vm_charbat_is_charging) + return _vm_charbat_is_charging(); + + return VM_FALSE; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_deinit.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_deinit.c new file mode 100644 index 00000000..70e0aee9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_deinit.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmche.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_che_deinit_t)(vm_stche *che_context_p ); +_vm_che_deinit_t _vm_che_deinit = NULL; + +void vm_che_deinit(vm_stche *che_context_p) +{ + if (NULL == _vm_che_deinit) + _vm_che_deinit = (_vm_che_deinit_t)vm_get_sym_entry("vm_che_deinit"); + + if (NULL != _vm_che_deinit) + _vm_che_deinit(che_context_p); + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_init.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_init.c new file mode 100644 index 00000000..498fc7fd --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_init.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmche.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_che_init_t)(vm_stche *che_context_p, VMUINT type); +_vm_che_init_t _vm_che_init = NULL; + +void vm_che_init(vm_stche *che_context_p, VMUINT type) +{ + if (NULL == _vm_che_init) + _vm_che_init = (_vm_che_init_t)vm_get_sym_entry("vm_che_init"); + + if (NULL != _vm_che_init) + _vm_che_init(che_context_p,type); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_key_action.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_key_action.c new file mode 100644 index 00000000..4aeef36b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_key_action.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmche.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_che_key_action_t)(vm_stche *che_context_p, vm_che_key_action_type type, VMUINT8 *key, VMINT key_len); +_vm_che_key_action_t _vm_che_key_action = NULL; + +void vm_che_key_action(vm_stche *che_context_p, vm_che_key_action_type type, VMUINT8 *key, VMINT key_len) +{ + if (NULL == _vm_che_key_action) + _vm_che_key_action = (_vm_che_key_action_t)vm_get_sym_entry("vm_che_key_action"); + + if (NULL != _vm_che_key_action) + _vm_che_key_action(che_context_p,type,key,key_len); + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_process.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_process.c new file mode 100644 index 00000000..b1d291ef --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_process.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmche.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8 (*_vm_che_process_t)(vm_stche *che_context_p,vm_che_type type,vm_che_operation_mode mode, + vm_che_action act, VMUINT8 *source,VMUINT8 *dest,VMUINT source_length,VMUINT8 last_block); +_vm_che_process_t _vm_che_process = NULL; + +VMUINT8 vm_che_process(vm_stche *che_context_p,vm_che_type type,vm_che_operation_mode mode, + vm_che_action act, VMUINT8 *source,VMUINT8 *dest,VMUINT source_length,VMUINT8 last_block) +{ + if (NULL == _vm_che_process) + _vm_che_process = (_vm_che_process_t)vm_get_sym_entry("vm_che_process"); + + if (NULL != _vm_che_process) + return _vm_che_process(che_context_p,type,mode,act,source,dest,source_length,last_block); + + return (VMUINT8 )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_private_decrypt.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_private_decrypt.c new file mode 100644 index 00000000..6d688ef1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_private_decrypt.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmche.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_che_rsa_private_decrypt_t)(vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding); +_vm_che_rsa_private_decrypt_t _vm_che_rsa_private_decrypt = NULL; + +VMINT vm_che_rsa_private_decrypt(vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding) +{ + if (NULL == _vm_che_rsa_private_decrypt) + _vm_che_rsa_private_decrypt = (_vm_che_rsa_private_decrypt_t)vm_get_sym_entry("vm_che_rsa_private_decrypt"); + + if (NULL != _vm_che_rsa_private_decrypt) + return _vm_che_rsa_private_decrypt(ctx,src,src_len,dst,dst_len,padding); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_private_encrypt.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_private_encrypt.c new file mode 100644 index 00000000..c958b6ad --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_private_encrypt.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmche.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_che_rsa_private_encrypt_t)( vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding); +_vm_che_rsa_private_encrypt_t _vm_che_rsa_private_encrypt = NULL; + +VMINT vm_che_rsa_private_encrypt(vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding) +{ + if (NULL == _vm_che_rsa_private_encrypt) + _vm_che_rsa_private_encrypt = (_vm_che_rsa_private_encrypt_t)vm_get_sym_entry("vm_che_rsa_private_encrypt"); + + if (NULL != _vm_che_rsa_private_encrypt) + return _vm_che_rsa_private_encrypt(ctx,src,src_len,dst,dst_len,padding); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_public_decrypt.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_public_decrypt.c new file mode 100644 index 00000000..84af926c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_public_decrypt.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmche.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_che_rsa_public_decrypt_t)( vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding); +_vm_che_rsa_public_decrypt_t _vm_che_rsa_public_decrypt = NULL; + +VMINT vm_che_rsa_public_decrypt(vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding) +{ + if (NULL == _vm_che_rsa_public_decrypt) + _vm_che_rsa_public_decrypt = (_vm_che_rsa_public_decrypt_t)vm_get_sym_entry("vm_che_rsa_public_decrypt"); + + if (NULL != _vm_che_rsa_public_decrypt) + return _vm_che_rsa_public_decrypt(ctx,src,src_len,dst,dst_len,padding); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_public_encrypt.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_public_encrypt.c new file mode 100644 index 00000000..e28cd918 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_rsa_public_encrypt.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmche.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_che_rsa_public_encrypt_t)( vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding); +_vm_che_rsa_public_encrypt_t _vm_che_rsa_public_encrypt = NULL; + +VMINT vm_che_rsa_public_encrypt(vm_stche *ctx, VMUINT8 *src, VMUINT src_len, VMUINT8 *dst, + VMUINT *dst_len, vm_che_rsa_padding_mode_enum padding) +{ + if (NULL == _vm_che_rsa_public_encrypt) + _vm_che_rsa_public_encrypt = (_vm_che_rsa_public_encrypt_t)vm_get_sym_entry("vm_che_rsa_public_encrypt"); + + if (NULL != _vm_che_rsa_public_encrypt) + return _vm_che_rsa_public_encrypt(ctx,src,src_len,dst,dst_len,padding); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_set_iv.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_set_iv.c new file mode 100644 index 00000000..fb606d23 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_che_set_iv.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmche.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_che_set_iv_t)(vm_stche *che_context_p, VMUINT8 *iv, VMUINT iv_len); +_vm_che_set_iv_t _vm_che_set_iv = NULL; + +void vm_che_set_iv(vm_stche *che_context_p, VMUINT8 *iv, VMUINT iv_len) +{ + if (NULL == _vm_che_set_iv) + _vm_che_set_iv = (_vm_che_set_iv_t)vm_get_sym_entry("vm_che_set_iv"); + + if (NULL != _vm_che_set_iv) + _vm_che_set_iv(che_context_p,iv,iv_len); + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_chset_convert.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_chset_convert.c new file mode 100644 index 00000000..049ae598 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_chset_convert.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmchset.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_chset_convert_t)(vm_chset_enum src_type, vm_chset_enum dest_type, VMCHAR *src, VMCHAR *dest, VMINT dest_size); +_vm_chset_convert_t _vm_chset_convert = NULL; + +VMINT vm_chset_convert(vm_chset_enum src_type, vm_chset_enum dest_type, VMCHAR *src, VMCHAR *dest, VMINT dest_size) +{ + if (NULL == _vm_chset_convert) + _vm_chset_convert = (_vm_chset_convert_t)vm_get_sym_entry("vm_chset_convert"); + + if (NULL != _vm_chset_convert) + return _vm_chset_convert(src_type,dest_type,src,dest,dest_size); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_closesocket.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_closesocket.c new file mode 100644 index 00000000..eeb9e6f4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_closesocket.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_closesocket_t)(int sock); +_vm_closesocket_t _vm_closesocket = NULL; + +int vm_closesocket(int sock) +{ + if (NULL == _vm_closesocket) + _vm_closesocket = (_vm_closesocket_t)vm_get_sym_entry("vm_closesocket"); + if (NULL != _vm_closesocket) + return _vm_closesocket(sock); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_close_port.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_close_port.c new file mode 100644 index 00000000..07145a9a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_close_port.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmatcmd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_command_close_port_t)(VMUINT16 port); +_vm_command_close_port_t _vm_command_close_port = NULL; + +void vm_command_close_port(VMUINT16 port) +{ + if (NULL == _vm_command_close_port) + _vm_command_close_port = (_vm_command_close_port_t)vm_get_sym_entry("vm_command_close_port"); + if (NULL != _vm_command_close_port) + _vm_command_close_port(port); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_open_port.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_open_port.c new file mode 100644 index 00000000..680bc70c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_open_port.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmatcmd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT16 (*_vm_command_open_port_t)(VMUINT16 port, vm_command_callback call_back, void *user_data); +_vm_command_open_port_t _vm_command_open_port = NULL; + +VMUINT16 vm_command_open_port(VMUINT16 port, vm_command_callback call_back, void *user_data) +{ + if (NULL == _vm_command_open_port) + _vm_command_open_port = (_vm_command_open_port_t)vm_get_sym_entry("vm_command_open_port"); + if (NULL != _vm_command_open_port) + return _vm_command_open_port(port,call_back,user_data); + return 0; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_reply.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_reply.c new file mode 100644 index 00000000..64888632 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_command_reply.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmatcmd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_command_reply_t)(char* reply_buf, VMUINT32 buf_size, VMUINT32 reply_type); +_vm_command_reply_t _vm_command_reply = NULL; +void vm_command_reply(char* reply_buf, VMUINT32 buf_size, VMUINT32 reply_type) +{ + if (NULL == _vm_command_reply) + _vm_command_reply = (_vm_command_reply_t)vm_get_sym_entry("vm_command_reply"); + + if (NULL != _vm_command_reply) + _vm_command_reply(reply_buf, buf_size, reply_type); +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_connect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_connect.c new file mode 100644 index 00000000..ab24b73b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_connect.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_connect_t)(int sock, SOCKADDR *addr, int addrlen); +_vm_connect_t _vm_connect = NULL; + +int vm_connect(int sock, SOCKADDR *addr, int addrlen) +{ + if (NULL == _vm_connect) + _vm_connect = (_vm_connect_t)vm_get_sym_entry("vm_connect"); + if (NULL != _vm_connect) + return _vm_connect(sock,addr,addrlen); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_array_stack.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_array_stack.c new file mode 100644 index 00000000..abfc88ce --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_array_stack.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_create_array_stack_t)(VMINT capability, VMINT* handle); +_vm_create_array_stack_t _vm_create_array_stack = NULL; + +VMINT vm_create_array_stack(VMINT capability, VMINT* handle) +{ + if (NULL == _vm_create_array_stack) + _vm_create_array_stack = (_vm_create_array_stack_t)vm_get_sym_entry("vm_create_array_stack"); + + if (NULL != _vm_create_array_stack) + return _vm_create_array_stack(capability,handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_dyn_array.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_dyn_array.c new file mode 100644 index 00000000..00c31005 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_dyn_array.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_dyn_array_t* (*_vm_create_dyn_array_t)(VMINT init_size, VMINT inc_size, VMINT block_size); +_vm_create_dyn_array_t _vm_create_dyn_array = NULL; + +vm_dyn_array_t* vm_create_dyn_array(VMINT init_size, VMINT inc_size, VMINT block_size) +{ + if (NULL == _vm_create_dyn_array) + _vm_create_dyn_array = (_vm_create_dyn_array_t)vm_get_sym_entry("vm_create_dyn_array"); + + if (NULL != _vm_create_dyn_array) + return _vm_create_dyn_array(init_size,inc_size,block_size); + + return (vm_dyn_array_t* )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_kal_timer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_kal_timer.c new file mode 100644 index 00000000..1b9f6b27 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_kal_timer.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmtimer.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_kal_timerid (*_vm_create_kal_timer_t)(VMINT8 *timer_name); +_vm_create_kal_timer_t _vm_create_kal_timer = NULL; + +vm_kal_timerid vm_create_kal_timer(VMINT8 *timer_name) +{ + if (NULL == _vm_create_kal_timer) + _vm_create_kal_timer = (_vm_create_kal_timer_t)vm_get_sym_entry("vm_create_kal_timer"); + if (NULL != _vm_create_kal_timer) + return _vm_create_kal_timer(timer_name); + return (vm_kal_timerid)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_linked_stack.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_linked_stack.c new file mode 100644 index 00000000..4bc3bdc9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_linked_stack.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_create_linked_stack_t)(VMINT capability, VMINT* handle); +_vm_create_linked_stack_t _vm_create_linked_stack = NULL; + +VMINT vm_create_linked_stack(VMINT capability, VMINT* handle) +{ + if (NULL == _vm_create_linked_stack) + _vm_create_linked_stack = (_vm_create_linked_stack_t)vm_get_sym_entry("vm_create_linked_stack"); + + if (NULL != _vm_create_linked_stack) + return _vm_create_linked_stack(capability,handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_timer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_timer.c new file mode 100644 index 00000000..ce666db8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_timer.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtimer.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_create_timer_t)(VMUINT32 millisec, VM_TIMERPROC_T timerproc); +_vm_create_timer_t _vm_create_timer = NULL; + +VMINT vm_create_timer(VMUINT32 millisec, VM_TIMERPROC_T timerproc) +{ + if (NULL == _vm_create_timer) + _vm_create_timer = (_vm_create_timer_t)vm_get_sym_entry("vm_create_timer"); + + if (NULL != _vm_create_timer) + return _vm_create_timer(millisec,timerproc); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_timer_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_timer_ex.c new file mode 100644 index 00000000..847b5cf0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_create_timer_ex.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtimer.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_create_timer_ex_t)(VMUINT32 millisec, VM_TIMERPROC_T timerproc); +_vm_create_timer_ex_t _vm_create_timer_ex = NULL; + +VMINT vm_create_timer_ex(VMUINT32 millisec, VM_TIMERPROC_T timerproc) +{ + if (NULL == _vm_create_timer_ex) + _vm_create_timer_ex = (_vm_create_timer_ex_t)vm_get_sym_entry("vm_create_timer_ex"); + + if (NULL != _vm_create_timer_ex) + return _vm_create_timer_ex(millisec,timerproc); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_custom_set_bt_pairing_method.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_custom_set_bt_pairing_method.c new file mode 100644 index 00000000..bea7f5bb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_custom_set_bt_pairing_method.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmbtcm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_custom_set_bt_pairing_method_t)(vm_bt_pairing_Type config_type); +_vm_custom_set_bt_pairing_method_t _vm_custom_set_bt_pairing_method = NULL; +void vm_custom_set_bt_pairing_method(vm_bt_pairing_Type config_type) + +{ + if (NULL == _vm_custom_set_bt_pairing_method) + _vm_custom_set_bt_pairing_method = (_vm_custom_set_bt_pairing_method_t)vm_get_sym_entry("vm_custom_set_bt_pairing_method"); + if (NULL != _vm_custom_set_bt_pairing_method) + _vm_custom_set_bt_pairing_method(config_type); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_display_download_list.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_display_download_list.c new file mode 100644 index 00000000..5a56cc67 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_display_download_list.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmda.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_da_display_download_list_t)(void); +_vm_da_display_download_list_t _vm_da_display_download_list = NULL; + +VMINT vm_da_display_download_list(void) +{ + if (NULL == _vm_da_display_download_list) + _vm_da_display_download_list = (_vm_da_display_download_list_t)vm_get_sym_entry("vm_da_display_download_list"); + + if (NULL != _vm_da_display_download_list) + return _vm_da_display_download_list(); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_http_dl_operation.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_http_dl_operation.c new file mode 100644 index 00000000..443c0d11 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_http_dl_operation.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmda.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_da_http_dl_operation_t)(VMINT hdl, vm_srv_da_download_cause_enum cause); +_vm_da_http_dl_operation_t _vm_da_http_dl_operation = NULL; + +VMINT vm_da_http_dl_operation(VMINT hdl, vm_srv_da_download_cause_enum cause) +{ + if (NULL == _vm_da_http_dl_operation) + _vm_da_http_dl_operation = (_vm_da_http_dl_operation_t)vm_get_sym_entry("vm_da_http_dl_operation"); + + if (NULL != _vm_da_http_dl_operation) + return _vm_da_http_dl_operation(hdl,cause); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_http_start_download.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_http_start_download.c new file mode 100644 index 00000000..c45eb2c6 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_da_http_start_download.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmda.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_da_http_start_download_t)(vm_srv_da_start_download_struct * arg); +_vm_da_http_start_download_t _vm_da_http_start_download = NULL; + +VMINT vm_da_http_start_download(vm_srv_da_start_download_struct * arg) +{ + if (NULL == _vm_da_http_start_download) + _vm_da_http_start_download = (_vm_da_http_start_download_t)vm_get_sym_entry("vm_da_http_start_download"); + + if (NULL != _vm_da_http_start_download) + return _vm_da_http_start_download(arg); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_delete_timer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_delete_timer.c new file mode 100644 index 00000000..7eb08df5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_delete_timer.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtimer.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_delete_timer_t)(VMINT timerid); +_vm_delete_timer_t _vm_delete_timer = NULL; + +VMINT vm_delete_timer(VMINT timerid) +{ + if (NULL == _vm_delete_timer) + _vm_delete_timer = (_vm_delete_timer_t)vm_get_sym_entry("vm_delete_timer"); + + if (NULL != _vm_delete_timer) + return _vm_delete_timer(timerid); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_delete_timer_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_delete_timer_ex.c new file mode 100644 index 00000000..10158fc0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_delete_timer_ex.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtimer.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_delete_timer_ex_t)(VMINT timerid); +_vm_delete_timer_ex_t _vm_delete_timer_ex = NULL; + +VMINT vm_delete_timer_ex(VMINT timerid) +{ + if (NULL == _vm_delete_timer_ex) + _vm_delete_timer_ex = (_vm_delete_timer_ex_t)vm_get_sym_entry("vm_delete_timer_ex"); + + if (NULL != _vm_delete_timer_ex) + return _vm_delete_timer_ex(timerid); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_decrypt.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_decrypt.c new file mode 100644 index 00000000..a9ed68da --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_decrypt.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmdes.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8 * (*_vm_des_decrypt_t)( VMDESHANDLE handle, VMUINT8 * input, VMINT input_len, VMINT * output_len ); +_vm_des_decrypt_t _vm_des_decrypt = NULL; + +VMUINT8 * vm_des_decrypt( VMDESHANDLE handle, VMUINT8 * input, VMINT input_len, VMINT * output_len ) +{ + if (NULL == _vm_des_decrypt) + _vm_des_decrypt = (_vm_des_decrypt_t)vm_get_sym_entry("vm_des_decrypt"); + + if (NULL != _vm_des_decrypt) + return _vm_des_decrypt(handle,input,input_len,output_len); + + return (VMUINT8 * )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_encrypt.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_encrypt.c new file mode 100644 index 00000000..44a13ff9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_encrypt.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmdes.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8 * (*_vm_des_encrypt_t)( VMDESHANDLE handle, VMUINT8 * input, VMINT input_len, VMINT * output_len ); +_vm_des_encrypt_t _vm_des_encrypt = NULL; + +VMUINT8 * vm_des_encrypt( VMDESHANDLE handle, VMUINT8 * input, VMINT input_len, VMINT * output_len ) +{ + if (NULL == _vm_des_encrypt) + _vm_des_encrypt = (_vm_des_encrypt_t)vm_get_sym_entry("vm_des_encrypt"); + + if (NULL != _vm_des_encrypt) + return _vm_des_encrypt(handle,input,input_len,output_len); + + return (VMUINT8 * )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_reset_key.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_reset_key.c new file mode 100644 index 00000000..9683cc56 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_reset_key.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmdes.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_des_reset_key_t)( VMDESHANDLE handle ); +_vm_des_reset_key_t _vm_des_reset_key = NULL; + +VMINT vm_des_reset_key( VMDESHANDLE handle ) +{ + if (NULL == _vm_des_reset_key) + _vm_des_reset_key = (_vm_des_reset_key_t)vm_get_sym_entry("vm_des_reset_key"); + + if (NULL != _vm_des_reset_key) + return _vm_des_reset_key(handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_set_key.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_set_key.c new file mode 100644 index 00000000..2828801f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_des_set_key.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmdes.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMDESHANDLE (*_vm_des_set_key_t)( VMUINT8 key[8] ); +_vm_des_set_key_t _vm_des_set_key = NULL; + +VMDESHANDLE vm_des_set_key( VMUINT8 key[8] ) +{ + VMDESHANDLE ret = {-1}; + if (NULL == _vm_des_set_key) + _vm_des_set_key = (_vm_des_set_key_t)vm_get_sym_entry("vm_des_set_key"); + + if (NULL != _vm_des_set_key) + return _vm_des_set_key(key); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_destroy_stack.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_destroy_stack.c new file mode 100644 index 00000000..de4303ed --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_destroy_stack.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_destroy_stack_t)(VMINT stackHandle); +_vm_destroy_stack_t _vm_destroy_stack = NULL; + +VMINT vm_destroy_stack(VMINT stackHandle) +{ + if (NULL == _vm_destroy_stack) + _vm_destroy_stack = (_vm_destroy_stack_t)vm_get_sym_entry("vm_destroy_stack"); + + if (NULL != _vm_destroy_stack) + return _vm_destroy_stack(stackHandle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_client_get_mode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_client_get_mode.c new file mode 100644 index 00000000..8ec8cc7d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_client_get_mode.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmdhcp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dhcp_client_get_mode_t)(void); +_vm_dhcp_client_get_mode_t _vm_dhcp_client_get_mode = NULL; +VMINT vm_dhcp_client_get_mode(void) +{ + if (NULL == _vm_dhcp_client_get_mode) + _vm_dhcp_client_get_mode = (_vm_dhcp_client_get_mode_t)vm_get_sym_entry("vm_dhcp_client_get_mode"); + + if (NULL != _vm_dhcp_client_get_mode) + return _vm_dhcp_client_get_mode(); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_client_set_mode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_client_set_mode.c new file mode 100644 index 00000000..be980512 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_client_set_mode.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmdhcp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dhcp_client_set_mode_t)(VMUINT32 mode); +_vm_dhcp_client_set_mode_t _vm_dhcp_client_set_mode = NULL; +VMINT vm_dhcp_client_set_mode(VMUINT32 mode) +{ + if (NULL == _vm_dhcp_client_set_mode) + _vm_dhcp_client_set_mode = (_vm_dhcp_client_set_mode_t)vm_get_sym_entry("vm_dhcp_client_set_mode"); + + if (NULL != _vm_dhcp_client_set_mode) + return _vm_dhcp_client_set_mode(mode); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_get_mode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_get_mode.c new file mode 100644 index 00000000..2eb0dc4d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_get_mode.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmdhcp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dhcp_server_get_mode_t)(void); +_vm_dhcp_server_get_mode_t _vm_dhcp_server_get_mode = NULL; +VMINT vm_dhcp_server_get_mode(void) +{ + if (NULL == _vm_dhcp_server_get_mode) + _vm_dhcp_server_get_mode = (_vm_dhcp_server_get_mode_t)vm_get_sym_entry("vm_dhcp_server_get_mode"); + + if (NULL != _vm_dhcp_server_get_mode) + return _vm_dhcp_server_get_mode(); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_get_param.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_get_param.c new file mode 100644 index 00000000..4c70a54c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_get_param.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmdhcp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dhcp_server_get_param_t)(vm_dhcp_server_config_struct *param); +_vm_dhcp_server_get_param_t _vm_dhcp_server_get_param = NULL; +VMINT vm_dhcp_server_get_param(vm_dhcp_server_config_struct *param) +{ + if (NULL == _vm_dhcp_server_get_param) + _vm_dhcp_server_get_param = (_vm_dhcp_server_get_param_t)vm_get_sym_entry("vm_dhcp_server_get_param"); + + if (NULL != _vm_dhcp_server_get_param) + return _vm_dhcp_server_get_param(param); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_set_mode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_set_mode.c new file mode 100644 index 00000000..cace0f64 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_set_mode.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmdhcp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dhcp_server_set_mode_t)(VMUINT32 mode); +_vm_dhcp_server_set_mode_t _vm_dhcp_server_set_mode = NULL; +VMINT vm_dhcp_server_set_mode(VMUINT32 mode) +{ + if (NULL == _vm_dhcp_server_set_mode) + _vm_dhcp_server_set_mode = (_vm_dhcp_server_set_mode_t)vm_get_sym_entry("vm_dhcp_server_set_mode"); + + if (NULL != _vm_dhcp_server_set_mode) + return _vm_dhcp_server_set_mode(mode); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_set_param.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_set_param.c new file mode 100644 index 00000000..48782a68 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dhcp_server_set_param.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmdhcp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dhcp_server_set_param_t)(vm_dhcp_server_config_struct *param); +_vm_dhcp_server_set_param_t _vm_dhcp_server_set_param = NULL; +VMINT vm_dhcp_server_set_param(vm_dhcp_server_config_struct *param) +{ + if (NULL == _vm_dhcp_server_set_param) + _vm_dhcp_server_set_param = (_vm_dhcp_server_set_param_t)vm_get_sym_entry("vm_dhcp_server_set_param"); + + if (NULL != _vm_dhcp_server_set_param) + return _vm_dhcp_server_set_param(param); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dialer_launch.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dialer_launch.c new file mode 100644 index 00000000..aa7c646e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dialer_launch.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dialer_launch_t)(VMWSTR phone_num); +_vm_dialer_launch_t _vm_dialer_launch = NULL; + +VMINT vm_dialer_launch(VMWSTR phone_num) +{ + if (NULL == _vm_dialer_launch) + _vm_dialer_launch = (_vm_dialer_launch_t)vm_get_sym_entry("vm_dialer_launch"); + + if (NULL != _vm_dialer_launch) + return _vm_dialer_launch(phone_num); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_get_state.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_get_state.c new file mode 100644 index 00000000..fae9db23 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_get_state.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmdns.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dns_get_state_t)(void); +_vm_dns_get_state_t _vm_dns_get_state = NULL; +VMINT vm_dns_get_state(void) +{ + if (NULL == _vm_dns_get_state) + _vm_dns_get_state = (_vm_dns_get_state_t)vm_get_sym_entry("vm_dns_get_state"); + + if (NULL != _vm_dns_get_state) + return _vm_dns_get_state(); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_start.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_start.c new file mode 100644 index 00000000..a091fda3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_start.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmdns.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dns_start_t)(VMUINT32 port, VMCHAR *config_path, VMCHAR *domain_path); +_vm_dns_start_t _vm_dns_start = NULL; +VMINT vm_dns_start(VMUINT32 port, VMCHAR *config_path, VMCHAR *domain_path) +{ + if (NULL == _vm_dns_start) + _vm_dns_start = (_vm_dns_start_t)vm_get_sym_entry("vm_dns_start"); + + if (NULL != _vm_dns_start) + return _vm_dns_start(port, config_path, domain_path); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_stop.c new file mode 100644 index 00000000..801c3ea2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dns_stop.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmdns.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dns_stop_t)(void); +_vm_dns_stop_t _vm_dns_stop = NULL; +VMINT vm_dns_stop(void) +{ + if (NULL == _vm_dns_stop) + _vm_dns_stop = (_vm_dns_stop_t)vm_get_sym_entry("vm_dns_stop"); + + if (NULL != _vm_dns_stop) + return _vm_dns_stop(); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dtacct_select.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dtacct_select.c new file mode 100644 index 00000000..461b0cf1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dtacct_select.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dtacct_select_t)(VMINT sim_id, VMINT (*callback)(VMUINT32 dtacct)); +_vm_dtacct_select_t _vm_dtacct_select = NULL; +VMINT vm_dtacct_select(VMINT sim_id, VMINT (*callback)(VMUINT32 dtacct)) +{ + if (NULL == _vm_dtacct_select) + _vm_dtacct_select = (_vm_dtacct_select_t)vm_get_sym_entry("vm_dtacct_select"); + + if (NULL != _vm_dtacct_select) + return _vm_dtacct_select(sim_id, callback); + + return -1; +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dtacct_set.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dtacct_set.c new file mode 100644 index 00000000..8c1c7517 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dtacct_set.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + + +typedef VMINT (*_vm_dtacct_set_t)(VMINT sim_id, VMUINT32 dtacct); +_vm_dtacct_set_t _vm_dtacct_set = NULL; +VMINT vm_dtacct_set(VMINT sim_id, VMUINT32 dtacct) +{ + if (NULL == _vm_dtacct_set) + _vm_dtacct_set = (_vm_dtacct_set_t)vm_get_sym_entry("vm_dtacct_set"); + + if (NULL != _vm_dtacct_set) + return _vm_dtacct_set(sim_id, dtacct); + + return -1; +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_add.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_add.c new file mode 100644 index 00000000..8b2185f3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_add.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dyn_array_add_t)(vm_dyn_array_t *array, void* data); +_vm_dyn_array_add_t _vm_dyn_array_add = NULL; + +VMINT vm_dyn_array_add(vm_dyn_array_t *array, void* data) +{ + if (NULL == _vm_dyn_array_add) + _vm_dyn_array_add = (_vm_dyn_array_add_t)vm_get_sym_entry("vm_dyn_array_add"); + + if (NULL != _vm_dyn_array_add) + return _vm_dyn_array_add(array,data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_del.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_del.c new file mode 100644 index 00000000..905efc31 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_del.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dyn_array_del_t)(vm_dyn_array_t *array, VMINT idx); +_vm_dyn_array_del_t _vm_dyn_array_del = NULL; + +VMINT vm_dyn_array_del(vm_dyn_array_t *array, VMINT idx) +{ + if (NULL == _vm_dyn_array_del) + _vm_dyn_array_del = (_vm_dyn_array_del_t)vm_get_sym_entry("vm_dyn_array_del"); + + if (NULL != _vm_dyn_array_del) + return _vm_dyn_array_del(array,idx); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_del_all.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_del_all.c new file mode 100644 index 00000000..24154c56 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_dyn_array_del_all.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_dyn_array_del_all_t)(vm_dyn_array_t *array); +_vm_dyn_array_del_all_t _vm_dyn_array_del_all = NULL; + +VMINT vm_dyn_array_del_all(vm_dyn_array_t *array) +{ + if (NULL == _vm_dyn_array_del_all) + _vm_dyn_array_del_all = (_vm_dyn_array_del_all_t)vm_get_sym_entry("vm_dyn_array_del_all"); + + if (NULL != _vm_dyn_array_del_all) + return _vm_dyn_array_del_all(array); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_em_send_command.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_em_send_command.c new file mode 100644 index 00000000..48f30282 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_em_send_command.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmemcmd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_emcmd_enum (*_vm_em_send_command_t)(VMCHAR *atCmdStr, VM_EM_CMD_CB atcmd_cb); +_vm_em_send_command_t _vm_em_send_command = NULL; + +vm_emcmd_enum vm_em_send_command(VMCHAR *atCmdStr, VM_EM_CMD_CB atcmd_cb) +{ + if (NULL == _vm_em_send_command) + _vm_em_send_command = (_vm_em_send_command_t)vm_get_sym_entry("vm_em_send_command"); + + if (NULL != _vm_em_send_command) + return _vm_em_send_command(atCmdStr, atcmd_cb); + + return (vm_emcmd_enum)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_enable_proxy.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_enable_proxy.c new file mode 100644 index 00000000..b077ec09 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_enable_proxy.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_enable_proxy_t)(VMINT use_proxy); +_vm_enable_proxy_t _vm_enable_proxy = NULL; + +void vm_enable_proxy(VMINT use_proxy) +{ + if (NULL == _vm_enable_proxy) + _vm_enable_proxy = (_vm_enable_proxy_t)vm_get_sym_entry("vm_enable_proxy"); + + if (NULL != _vm_enable_proxy) + _vm_enable_proxy(use_proxy); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ends_with.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ends_with.c new file mode 100644 index 00000000..4a01eba4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ends_with.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ends_with_t)(const char *s1, const char *s2); +_vm_ends_with_t _vm_ends_with = NULL; + +VMINT vm_ends_with(const char *s1, const char *s2) +{ + if (NULL == _vm_ends_with) + _vm_ends_with = (_vm_ends_with_t)vm_get_sym_entry("vm_ends_with"); + + if (NULL != _vm_ends_with) + return _vm_ends_with(s1,s2); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_exit_app.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_exit_app.c new file mode 100644 index 00000000..96b647f7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_exit_app.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_exit_app_t)(void); +_vm_exit_app_t _vm_exit_app = NULL; + +void vm_exit_app(void) +{ + if (NULL == _vm_exit_app) + _vm_exit_app = (_vm_exit_app_t)vm_get_sym_entry("vm_exit_app"); + + if (NULL != _vm_exit_app) + _vm_exit_app(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_close.c new file mode 100644 index 00000000..35d011e5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_close.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_file_close_t)(VMFILE handle); +_vm_file_close_t _vm_file_close = NULL; + +void vm_file_close(VMFILE handle) +{ + if (NULL == _vm_file_close) + _vm_file_close = (_vm_file_close_t)vm_get_sym_entry("vm_file_close"); + + if (NULL != _vm_file_close) + _vm_file_close(handle); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_commit.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_commit.c new file mode 100644 index 00000000..3c7a695c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_commit.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_commit_t)(VMFILE handle); +_vm_file_commit_t _vm_file_commit = NULL; + +VMINT vm_file_commit(VMFILE handle) +{ + if (NULL == _vm_file_commit) + _vm_file_commit = (_vm_file_commit_t)vm_get_sym_entry("vm_file_commit"); + + if (NULL != _vm_file_commit) + return _vm_file_commit(handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_copy.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_copy.c new file mode 100644 index 00000000..4c9859de --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_copy.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_copy_t)(const VMWSTR dst, const VMWSTR src, vm_file_copy_cb cb); +_vm_file_copy_t _vm_file_copy = NULL; + +VMINT vm_file_copy(const VMWSTR dst, const VMWSTR src, vm_file_copy_cb cb) +{ + if (NULL == _vm_file_copy) + _vm_file_copy = (_vm_file_copy_t)vm_get_sym_entry("vm_file_copy"); + + if (NULL != _vm_file_copy) + return _vm_file_copy(dst, src, cb); + + return (VMINT )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_copy_abort.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_copy_abort.c new file mode 100644 index 00000000..54fcea95 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_copy_abort.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_copy_abort_t)(VMINT hdl); +_vm_file_copy_abort_t _vm_file_copy_abort = NULL; + +VMINT vm_file_copy_abort(VMINT hdl) +{ + if (NULL == _vm_file_copy_abort) + _vm_file_copy_abort = (_vm_file_copy_abort_t)vm_get_sym_entry("vm_file_copy_abort"); + + if (NULL != _vm_file_copy_abort) + return _vm_file_copy_abort(hdl); + + return (VMINT )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_delete.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_delete.c new file mode 100644 index 00000000..df4bd34e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_delete.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_delete_t)(const VMWSTR filename); +_vm_file_delete_t _vm_file_delete = NULL; + +VMINT vm_file_delete(const VMWSTR filename) +{ + if (NULL == _vm_file_delete) + _vm_file_delete = (_vm_file_delete_t)vm_get_sym_entry("vm_file_delete"); + + if (NULL != _vm_file_delete) + return _vm_file_delete(filename); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_get_attributes.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_get_attributes.c new file mode 100644 index 00000000..98286286 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_get_attributes.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_get_attributes_t)(const VMWSTR filename); +_vm_file_get_attributes_t _vm_file_get_attributes = NULL; + +VMINT vm_file_get_attributes(const VMWSTR filename) +{ + if (NULL == _vm_file_get_attributes) + _vm_file_get_attributes = (_vm_file_get_attributes_t)vm_get_sym_entry("vm_file_get_attributes"); + + if (NULL != _vm_file_get_attributes) + return _vm_file_get_attributes(filename); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_get_modify_time.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_get_modify_time.c new file mode 100644 index 00000000..04329fac --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_get_modify_time.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_get_modify_time_t)(const VMWSTR filename, vm_time_t * modify_time); +_vm_file_get_modify_time_t _vm_file_get_modify_time = NULL; + +VMINT vm_file_get_modify_time(const VMWSTR filename, vm_time_t * modify_time) +{ + if (NULL == _vm_file_get_modify_time) + _vm_file_get_modify_time = (_vm_file_get_modify_time_t)vm_get_sym_entry("vm_file_get_modify_time"); + + if (NULL != _vm_file_get_modify_time) + return _vm_file_get_modify_time(filename,modify_time); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_getfilesize.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_getfilesize.c new file mode 100644 index 00000000..cee8b8e1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_getfilesize.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_getfilesize_t)(VMFILE handle, VMUINT *file_size); +_vm_file_getfilesize_t _vm_file_getfilesize = NULL; + +VMINT vm_file_getfilesize(VMFILE handle, VMUINT *file_size) +{ + if (NULL == _vm_file_getfilesize) + _vm_file_getfilesize = (_vm_file_getfilesize_t)vm_get_sym_entry("vm_file_getfilesize"); + + if (NULL != _vm_file_getfilesize) + return _vm_file_getfilesize(handle,file_size); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_is_eof.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_is_eof.c new file mode 100644 index 00000000..4d5eec35 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_is_eof.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_is_eof_t)(VMFILE handle); +_vm_file_is_eof_t _vm_file_is_eof = NULL; + +VMINT vm_file_is_eof(VMFILE handle) +{ + if (NULL == _vm_file_is_eof) + _vm_file_is_eof = (_vm_file_is_eof_t)vm_get_sym_entry("vm_file_is_eof"); + + if (NULL != _vm_file_is_eof) + return _vm_file_is_eof(handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_mkdir.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_mkdir.c new file mode 100644 index 00000000..edf56986 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_mkdir.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_mkdir_t)(const VMWSTR dirname); +_vm_file_mkdir_t _vm_file_mkdir = NULL; + +VMINT vm_file_mkdir(const VMWSTR dirname) +{ + if (NULL == _vm_file_mkdir) + _vm_file_mkdir = (_vm_file_mkdir_t)vm_get_sym_entry("vm_file_mkdir"); + + if (NULL != _vm_file_mkdir) + return _vm_file_mkdir(dirname); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_open.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_open.c new file mode 100644 index 00000000..0f03e3ac --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_open.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMFILE (*_vm_file_open_t)(const VMWSTR filename, VMUINT mode, VMUINT binary); +_vm_file_open_t _vm_file_open = NULL; + +VMFILE vm_file_open(const VMWSTR filename, VMUINT mode, VMUINT binary) +{ + if (NULL == _vm_file_open) + _vm_file_open = (_vm_file_open_t)vm_get_sym_entry("vm_file_open"); + + if (NULL != _vm_file_open) + return _vm_file_open(filename,mode,binary); + + return (VMFILE )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_read.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_read.c new file mode 100644 index 00000000..5646e770 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_read.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_read_t)(VMFILE handle, void * data, VMUINT length, VMUINT *nread); +_vm_file_read_t _vm_file_read = NULL; + +VMINT vm_file_read(VMFILE handle, void * data, VMUINT length, VMUINT *nread) +{ + if (NULL == _vm_file_read) + _vm_file_read = (_vm_file_read_t)vm_get_sym_entry("vm_file_read"); + + if (NULL != _vm_file_read) + return _vm_file_read(handle,data,length,nread); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_rename.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_rename.c new file mode 100644 index 00000000..0f5a41e1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_rename.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_rename_t)(const VMWSTR filename, const VMWSTR newname); +_vm_file_rename_t _vm_file_rename = NULL; + +VMINT vm_file_rename(const VMWSTR filename, const VMWSTR newname) +{ + if (NULL == _vm_file_rename) + _vm_file_rename = (_vm_file_rename_t)vm_get_sym_entry("vm_file_rename"); + + if (NULL != _vm_file_rename) + return _vm_file_rename(filename,newname); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_rmdir.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_rmdir.c new file mode 100644 index 00000000..19384861 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_rmdir.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_rmdir_t)(const VMWSTR dirname); +_vm_file_rmdir_t _vm_file_rmdir = NULL; + +VMINT vm_file_rmdir(const VMWSTR dirname) +{ + if (NULL == _vm_file_rmdir) + _vm_file_rmdir = (_vm_file_rmdir_t)vm_get_sym_entry("vm_file_rmdir"); + + if (NULL != _vm_file_rmdir) + return _vm_file_rmdir(dirname); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_seek.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_seek.c new file mode 100644 index 00000000..2111ebac --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_seek.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_seek_t)(VMFILE handle, VMINT offset, VMINT base); +_vm_file_seek_t _vm_file_seek = NULL; + +VMINT vm_file_seek(VMFILE handle, VMINT offset, VMINT base) +{ + if (NULL == _vm_file_seek) + _vm_file_seek = (_vm_file_seek_t)vm_get_sym_entry("vm_file_seek"); + + if (NULL != _vm_file_seek) + return _vm_file_seek(handle,offset,base); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_set_attributes.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_set_attributes.c new file mode 100644 index 00000000..3129f2f7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_set_attributes.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_set_attributes_t)(const VMWSTR filename, VMBYTE attributes); +_vm_file_set_attributes_t _vm_file_set_attributes = NULL; + +VMINT vm_file_set_attributes(const VMWSTR filename, VMBYTE attributes) +{ + if (NULL == _vm_file_set_attributes) + _vm_file_set_attributes = (_vm_file_set_attributes_t)vm_get_sym_entry("vm_file_set_attributes"); + + if (NULL != _vm_file_set_attributes) + return _vm_file_set_attributes(filename,attributes); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_tell.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_tell.c new file mode 100644 index 00000000..3da23422 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_tell.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_tell_t)(VMFILE handle); +_vm_file_tell_t _vm_file_tell = NULL; + +VMINT vm_file_tell(VMFILE handle) +{ + if (NULL == _vm_file_tell) + _vm_file_tell = (_vm_file_tell_t)vm_get_sym_entry("vm_file_tell"); + + if (NULL != _vm_file_tell) + return _vm_file_tell(handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_write.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_write.c new file mode 100644 index 00000000..a92fa996 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_file_write.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_file_write_t)(VMFILE handle, void * data, VMUINT length, VMUINT * written); +_vm_file_write_t _vm_file_write = NULL; + +VMINT vm_file_write(VMFILE handle, void * data, VMUINT length, VMUINT * written) +{ + if (NULL == _vm_file_write) + _vm_file_write = (_vm_file_write_t)vm_get_sym_entry("vm_file_write"); + + if (NULL != _vm_file_write) + return _vm_file_write(handle,data,length,written); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_close.c new file mode 100644 index 00000000..95d449fa --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_close.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_find_close_t)(VMINT handle); +_vm_find_close_t _vm_find_close = NULL; + +void vm_find_close(VMINT handle) +{ + if (NULL == _vm_find_close) + _vm_find_close = (_vm_find_close_t)vm_get_sym_entry("vm_find_close"); + + if (NULL != _vm_find_close) + _vm_find_close(handle); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_close_ext.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_close_ext.c new file mode 100644 index 00000000..19d26f66 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_close_ext.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_find_close_ext_t)(VMINT handle); +_vm_find_close_ext_t _vm_find_close_ext = NULL; + +void vm_find_close_ext(VMINT handle) +{ + if (NULL == _vm_find_close_ext) + _vm_find_close_ext = (_vm_find_close_ext_t)vm_get_sym_entry("vm_find_close_ext"); + + if (NULL != _vm_find_close_ext) + _vm_find_close_ext(handle); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_first.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_first.c new file mode 100644 index 00000000..11616226 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_first.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_find_first_t)(VMWSTR pathname, struct vm_fileinfo_t* info); +_vm_find_first_t _vm_find_first = NULL; + +VMINT vm_find_first(VMWSTR pathname, struct vm_fileinfo_t* info) +{ + if (NULL == _vm_find_first) + _vm_find_first = (_vm_find_first_t)vm_get_sym_entry("vm_find_first"); + + if (NULL != _vm_find_first) + return _vm_find_first(pathname,info); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_first_ext.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_first_ext.c new file mode 100644 index 00000000..f8c031c6 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_first_ext.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_find_first_ext_t)(VMWSTR pathname, vm_fileinfo_ext * direntry); +_vm_find_first_ext_t _vm_find_first_ext = NULL; + +VMINT vm_find_first_ext(VMWSTR pathname, vm_fileinfo_ext * direntry) +{ + if (NULL == _vm_find_first_ext) + _vm_find_first_ext = (_vm_find_first_ext_t)vm_get_sym_entry("vm_find_first_ext"); + + if (NULL != _vm_find_first_ext) + return _vm_find_first_ext(pathname,direntry); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_next.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_next.c new file mode 100644 index 00000000..e40b8d0c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_next.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_find_next_t)(VMINT handle, struct vm_fileinfo_t* info); +_vm_find_next_t _vm_find_next = NULL; + +VMINT vm_find_next(VMINT handle, struct vm_fileinfo_t* info) +{ + if (NULL == _vm_find_next) + _vm_find_next = (_vm_find_next_t)vm_get_sym_entry("vm_find_next"); + + if (NULL != _vm_find_next) + return _vm_find_next(handle,info); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_next_ext.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_next_ext.c new file mode 100644 index 00000000..cfce886e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_find_next_ext.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_find_next_ext_t)(VMINT handle, vm_fileinfo_ext * direntry); +_vm_find_next_ext_t _vm_find_next_ext = NULL; + +VMINT vm_find_next_ext(VMINT handle, vm_fileinfo_ext * direntry) +{ + if (NULL == _vm_find_next_ext) + _vm_find_next_ext = (_vm_find_next_ext_t)vm_get_sym_entry("vm_find_next_ext"); + + if (NULL != _vm_find_next_ext) + return _vm_find_next_ext(handle,direntry); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_is_network_service_available.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_is_network_service_available.c new file mode 100644 index 00000000..9047e5ad --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_is_network_service_available.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpwr.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_fly_mode_is_network_service_available_t)(void); +_vm_fly_mode_is_network_service_available_t _vm_fly_mode_is_network_service_available = NULL; + +VMBOOL vm_fly_mode_is_network_service_available(void) +{ + if (NULL == _vm_fly_mode_is_network_service_available) + _vm_fly_mode_is_network_service_available = (_vm_fly_mode_is_network_service_available_t)vm_get_sym_entry("vm_fly_mode_is_network_service_available"); + + if (NULL != _vm_fly_mode_is_network_service_available) + return _vm_fly_mode_is_network_service_available(); + + return (VMBOOL)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_is_switching.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_is_switching.c new file mode 100644 index 00000000..c577677e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_is_switching.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpwr.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_fly_mode_is_switching_t)(void); +_vm_fly_mode_is_switching_t _vm_fly_mode_is_switching = NULL; + +VMBOOL vm_fly_mode_is_switching(void) +{ + if (NULL == _vm_fly_mode_is_switching) + _vm_fly_mode_is_switching = (_vm_fly_mode_is_switching_t)vm_get_sym_entry("vm_fly_mode_is_switching"); + + if (NULL != _vm_fly_mode_is_switching) + return _vm_fly_mode_is_switching(); + + return (VMBOOL)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_switch.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_switch.c new file mode 100644 index 00000000..a139db3f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fly_mode_switch.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpwr.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_fly_mode_switch_t)(VMBOOL flight_mode_on, VMBOOL check_sim, vm_fly_mode_cb cb, void *user_data); +_vm_fly_mode_switch_t _vm_fly_mode_switch = NULL; + +VMBOOL vm_fly_mode_switch(VMBOOL flight_mode_on, VMBOOL check_sim, vm_fly_mode_cb cb, void *user_data) +{ + if (NULL == _vm_fly_mode_switch) + _vm_fly_mode_switch = (_vm_fly_mode_switch_t)vm_get_sym_entry("vm_fly_mode_switch"); + + if (NULL != _vm_fly_mode_switch) + return _vm_fly_mode_switch(flight_mode_on, check_sim, cb, user_data); + + return (VMBOOL)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_free.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_free.c new file mode 100644 index 00000000..da5b4d8d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_free.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_free_t)(void* ptr); +_vm_free_t _vm_free = NULL; + +void vm_free(void* ptr) +{ + if (NULL == _vm_free) + _vm_free = (_vm_free_t)vm_get_sym_entry("vm_free"); + + if (NULL != _vm_free) + _vm_free(ptr); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_free_dyn_array.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_free_dyn_array.c new file mode 100644 index 00000000..c17947e7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_free_dyn_array.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_free_dyn_array_t)(vm_dyn_array_t *array); +_vm_free_dyn_array_t _vm_free_dyn_array = NULL; + +void vm_free_dyn_array(vm_dyn_array_t *array) +{ + if (NULL == _vm_free_dyn_array) + _vm_free_dyn_array = (_vm_free_dyn_array_t)vm_get_sym_entry("vm_free_dyn_array"); + + if (NULL != _vm_free_dyn_array) + _vm_free_dyn_array(array); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_abort.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_abort.c new file mode 100644 index 00000000..7cae9f64 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_abort.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_fs_async_abort_t)(vm_fs_job_id jid); +_vm_fs_async_abort_t _vm_fs_async_abort = NULL; + +VMINT vm_fs_async_abort(vm_fs_job_id jid) +{ + if (NULL == _vm_fs_async_abort) + _vm_fs_async_abort = (_vm_fs_async_abort_t)vm_get_sym_entry("vm_fs_async_abort"); + + if (NULL != _vm_fs_async_abort) + return _vm_fs_async_abort(jid); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_close.c new file mode 100644 index 00000000..e0e3f512 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_close.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_fs_async_close_t)(VM_FS_HANDLE fs_hdl); +_vm_fs_async_close_t _vm_fs_async_close = NULL; + +VMINT vm_fs_async_close(VM_FS_HANDLE fs_hdl) +{ + if (NULL == _vm_fs_async_close) + _vm_fs_async_close = (_vm_fs_async_close_t)vm_get_sym_entry("vm_fs_async_close"); + + if (NULL != _vm_fs_async_close) + return _vm_fs_async_close(fs_hdl); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_commit.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_commit.c new file mode 100644 index 00000000..9eb3f88a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_commit.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_fs_async_commit_t)(VM_FS_HANDLE fs_hdl); +_vm_fs_async_commit_t _vm_fs_async_commit = NULL; + +VMINT vm_fs_async_commit(VM_FS_HANDLE fs_hdl) +{ + if (NULL == _vm_fs_async_commit) + _vm_fs_async_commit = (_vm_fs_async_commit_t)vm_get_sym_entry("vm_fs_async_commit"); + + if (NULL != _vm_fs_async_commit) + return _vm_fs_async_commit(fs_hdl); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_delete.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_delete.c new file mode 100644 index 00000000..781266b2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_delete.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_fs_async_delete_t)(const VMWSTR filename, vm_fs_overlapped_struct *overlapped); +_vm_fs_async_delete_t _vm_fs_async_delete = NULL; + +VMINT vm_fs_async_delete(const VMWSTR filename, vm_fs_overlapped_struct *overlapped) +{ + if (NULL == _vm_fs_async_delete) + _vm_fs_async_delete = (_vm_fs_async_delete_t)vm_get_sym_entry("vm_fs_async_delete"); + + if (NULL != _vm_fs_async_delete) + return _vm_fs_async_delete(filename,overlapped); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_get_working_buf_size.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_get_working_buf_size.c new file mode 100644 index 00000000..1cfeaa96 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_get_working_buf_size.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_fs_async_get_working_buf_size_t)(void); +_vm_fs_async_get_working_buf_size_t _vm_fs_async_get_working_buf_size = NULL; + +VMINT vm_fs_async_get_working_buf_size(void) +{ + if (NULL == _vm_fs_async_get_working_buf_size) + _vm_fs_async_get_working_buf_size = (_vm_fs_async_get_working_buf_size_t)vm_get_sym_entry("vm_fs_async_get_working_buf_size"); + + if (NULL != _vm_fs_async_get_working_buf_size) + return _vm_fs_async_get_working_buf_size(); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_open.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_open.c new file mode 100644 index 00000000..03115928 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_open.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_fs_async_open_t)(const VMWSTR file_name, VMINT flag, vm_fs_overlapped_struct *overlapped); +_vm_fs_async_open_t _vm_fs_async_open = NULL; + +VMINT vm_fs_async_open(const VMWSTR file_name, VMINT flag, vm_fs_overlapped_struct *overlapped) +{ + if (NULL == _vm_fs_async_open) + _vm_fs_async_open = (_vm_fs_async_open_t)vm_get_sym_entry("vm_fs_async_open"); + + if (NULL != _vm_fs_async_open) + return _vm_fs_async_open(file_name,flag,overlapped); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_read.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_read.c new file mode 100644 index 00000000..8ea7e8a2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_read.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_fs_async_read_t)(VM_FS_HANDLE fs_hdl, void *data, VMUINT length, VMUINT *read, vm_fs_overlapped_struct *overlapped); +_vm_fs_async_read_t _vm_fs_async_read = NULL; + +VMINT vm_fs_async_read(VM_FS_HANDLE fs_hdl, void *data, VMUINT length, VMUINT *read, vm_fs_overlapped_struct *overlapped) +{ + if (NULL == _vm_fs_async_read) + _vm_fs_async_read = (_vm_fs_async_read_t)vm_get_sym_entry("vm_fs_async_read"); + + if (NULL != _vm_fs_async_read) + return _vm_fs_async_read(fs_hdl,data,length,read,overlapped); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_seek.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_seek.c new file mode 100644 index 00000000..72fba570 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_seek.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_fs_async_seek_t)(VM_FS_HANDLE fs_hdl, VMINT64 * offset, VMINT whence, vm_fs_overlapped_struct *overlapped); +_vm_fs_async_seek_t _vm_fs_async_seek = NULL; + +VMINT vm_fs_async_seek(VM_FS_HANDLE fs_hdl, VMINT64 * offset, VMINT whence, vm_fs_overlapped_struct *overlapped) +{ + if (NULL == _vm_fs_async_seek) + _vm_fs_async_seek = (_vm_fs_async_seek_t)vm_get_sym_entry("vm_fs_async_seek"); + + if (NULL != _vm_fs_async_seek) + return _vm_fs_async_seek(fs_hdl,offset,whence,overlapped); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_write.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_write.c new file mode 100644 index 00000000..d1e3629a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_fs_async_write.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_fs_async_write_t)(VM_FS_HANDLE fs_hdl, void *data, VMUINT length, VMUINT *written, vm_fs_overlapped_struct *overlapped); +_vm_fs_async_write_t _vm_fs_async_write = NULL; + +VMINT vm_fs_async_write(VM_FS_HANDLE fs_hdl, void *data, VMUINT length, VMUINT *written, vm_fs_overlapped_struct *overlapped) +{ + if (NULL == _vm_fs_async_write) + _vm_fs_async_write = (_vm_fs_async_write_t)vm_get_sym_entry("vm_fs_async_write"); + + if (NULL != _vm_fs_async_write) + return _vm_fs_async_write(fs_hdl,data,length,written,overlapped); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gb2312_string.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gb2312_string.c new file mode 100644 index 00000000..e618dd25 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gb2312_string.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmchset.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef char *(*_vm_gb2312_string_t)(VMWSTR s); +_vm_gb2312_string_t _vm_gb2312_string = NULL; + +char *vm_gb2312_string(VMWSTR s) +{ + if (NULL == _vm_gb2312_string) + _vm_gb2312_string = (_vm_gb2312_string_t)vm_get_sym_entry("vm_gb2312_string"); + + if (NULL != _vm_gb2312_string) + return _vm_gb2312_string(s); + + return (char *)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gb2312_to_ucs2.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gb2312_to_ucs2.c new file mode 100644 index 00000000..3c031145 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gb2312_to_ucs2.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmchset.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_gb2312_to_ucs2_t)(VMWSTR dst, VMINT size, VMSTR src); +_vm_gb2312_to_ucs2_t _vm_gb2312_to_ucs2 = NULL; + +VMINT vm_gb2312_to_ucs2(VMWSTR dst, VMINT size, VMSTR src) +{ + if (NULL == _vm_gb2312_to_ucs2) + _vm_gb2312_to_ucs2 = (_vm_gb2312_to_ucs2_t)vm_get_sym_entry("vm_gb2312_to_ucs2"); + + if (NULL != _vm_gb2312_to_ucs2) + return _vm_gb2312_to_ucs2(dst,size,src); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_apn_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_apn_info.c new file mode 100644 index 00000000..e7b0f8fe --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_apn_info.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_apn_info_t)(vm_apn_info_ext *current_apn_info); +_vm_get_apn_info_t _vm_get_apn_info = NULL; + +VMINT vm_get_apn_info(vm_apn_info_ext *current_apn_info) +{ + if (NULL == _vm_get_apn_info) + _vm_get_apn_info = (_vm_get_apn_info_t)vm_get_sym_entry("vm_get_apn_info"); + + if (NULL != _vm_get_apn_info) + return _vm_get_apn_info(current_apn_info); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_asyn_http_req_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_asyn_http_req_handle.c new file mode 100644 index 00000000..2b6cadd1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_asyn_http_req_handle.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_asyn_http_req_handle_t)(asyn_http_req_t* request, VMINT* handle); +_vm_get_asyn_http_req_handle_t _vm_get_asyn_http_req_handle = NULL; + +VMINT vm_get_asyn_http_req_handle(asyn_http_req_t* request, VMINT* handle) +{ + if (NULL == _vm_get_asyn_http_req_handle) + _vm_get_asyn_http_req_handle = (_vm_get_asyn_http_req_handle_t)vm_get_sym_entry("vm_get_asyn_http_req_handle"); + + if (NULL != _vm_get_asyn_http_req_handle) + return _vm_get_asyn_http_req_handle(request,handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_battery_level.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_battery_level.c new file mode 100644 index 00000000..f30ef1d9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_battery_level.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_battery_level_t)(void) ; +_vm_get_battery_level_t _vm_get_battery_level = NULL; + +VMINT vm_get_battery_level(void) +{ + if (NULL == _vm_get_battery_level) + _vm_get_battery_level = (_vm_get_battery_level_t)vm_get_sym_entry("vm_get_battery_level"); + + if (NULL != _vm_get_battery_level) + return _vm_get_battery_level(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_cache_free_space.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_cache_free_space.c new file mode 100644 index 00000000..c7f25367 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_cache_free_space.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_cache_free_space_t)(vm_cache_t *cache); +_vm_get_cache_free_space_t _vm_get_cache_free_space = NULL; + +VMINT vm_get_cache_free_space(vm_cache_t *cache) +{ + if (NULL == _vm_get_cache_free_space) + _vm_get_cache_free_space = (_vm_get_cache_free_space_t)vm_get_sym_entry("vm_get_cache_free_space"); + + if (NULL != _vm_get_cache_free_space) + return _vm_get_cache_free_space(cache); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_curr_utc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_curr_utc.c new file mode 100644 index 00000000..53568ea0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_curr_utc.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_curr_utc_t)(VMUINT * utc); +_vm_get_curr_utc_t _vm_get_curr_utc = NULL; +VMINT vm_get_curr_utc(VMUINT * utc) +{ + if (_vm_get_curr_utc == NULL) + _vm_get_curr_utc = (_vm_get_curr_utc_t)vm_get_sym_entry("vm_get_curr_utc"); + + if (_vm_get_curr_utc != NULL) + return _vm_get_curr_utc(utc); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_current_lang_country_code.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_current_lang_country_code.c new file mode 100644 index 00000000..752462a5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_current_lang_country_code.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmchset.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUSTR (*_vm_get_current_lang_country_code_t)(void); +_vm_get_current_lang_country_code_t _vm_get_current_lang_country_code = NULL; + +VMUSTR vm_get_current_lang_country_code(void) +{ + if (NULL == _vm_get_current_lang_country_code) + _vm_get_current_lang_country_code = (_vm_get_current_lang_country_code_t)vm_get_sym_entry("vm_get_current_lang_country_code"); + + if (NULL != _vm_get_current_lang_country_code) + return _vm_get_current_lang_country_code(); + + return (VMUSTR)NULL; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_cust_apn_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_cust_apn_info.c new file mode 100644 index 00000000..6d690449 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_cust_apn_info.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_cust_apn_info_t)(vm_dtcnt_info_t * info); +_vm_get_cust_apn_info_t _vm_get_cust_apn_info = NULL; + +VMINT vm_get_cust_apn_info(vm_dtcnt_info_t * info) +{ + if (NULL == _vm_get_cust_apn_info) + _vm_get_cust_apn_info = (_vm_get_cust_apn_info_t)vm_get_sym_entry("vm_get_cust_apn_info"); + + if (NULL != _vm_get_cust_apn_info) + return _vm_get_cust_apn_info(info); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_customer_name.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_customer_name.c new file mode 100644 index 00000000..e6a763a3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_customer_name.c @@ -0,0 +1,22 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_customer_name_t)(VMCHAR *value, VMUINT len); +_vm_get_customer_name_t _vm_get_customer_name = NULL; + +VMUINT vm_get_customer_name(VMCHAR *value, VMUINT len) +{ + if (_vm_get_customer_name == NULL) + { + _vm_get_customer_name = (_vm_get_customer_name_t) vm_get_sym_entry("vm_get_customer_name"); + } + + if (_vm_get_customer_name != NULL) + { + return _vm_get_customer_name(value, len); + } + + return (VMUINT) 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_default_apn_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_default_apn_info.c new file mode 100644 index 00000000..32c554ae --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_default_apn_info.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_default_apn_info_t)(vm_apn_info_ext *apn_info); +_vm_get_default_apn_info_t _vm_get_default_apn_info = NULL; + +VMINT vm_get_default_apn_info( vm_apn_info_ext *apn_info) +{ + if (NULL == _vm_get_default_apn_info) + _vm_get_default_apn_info = (_vm_get_default_apn_info_t)vm_get_sym_entry("vm_get_default_apn_info"); + + if (NULL != _vm_get_default_apn_info) + return _vm_get_default_apn_info(apn_info); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_default_folder_path.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_default_folder_path.c new file mode 100644 index 00000000..2c8cdf2f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_default_folder_path.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef const VMWCHAR * (*_vm_get_default_folder_path_t)(vm_fmgr_default_folder_enum type); +_vm_get_default_folder_path_t _vm_get_default_folder_path = NULL; + +const VMWCHAR * vm_get_default_folder_path(vm_fmgr_default_folder_enum type) +{ + if (NULL == _vm_get_default_folder_path) + _vm_get_default_folder_path = (_vm_get_default_folder_path_t)vm_get_sym_entry("vm_get_default_folder_path"); + + if (NULL != _vm_get_default_folder_path) + return _vm_get_default_folder_path(type); + return NULL; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_disk_free_space.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_disk_free_space.c new file mode 100644 index 00000000..f1272f9b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_disk_free_space.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_disk_free_space_t)(VMWSTR drv_name); +_vm_get_disk_free_space_t _vm_get_disk_free_space = NULL; + +VMUINT vm_get_disk_free_space(VMWSTR drv_name) +{ + if (NULL == _vm_get_disk_free_space) + _vm_get_disk_free_space = (_vm_get_disk_free_space_t)vm_get_sym_entry("vm_get_disk_free_space"); + + if (NULL != _vm_get_disk_free_space) + return _vm_get_disk_free_space(drv_name); + + return (VMUINT )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_disk_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_disk_info.c new file mode 100644 index 00000000..6ff53939 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_disk_info.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_disk_info_t)(const VMCHAR * drv_name, vm_fs_disk_info * fs_disk, vm_fs_di_enum e_di); +_vm_get_disk_info_t _vm_get_disk_info = NULL; + +VMINT vm_get_disk_info(const VMCHAR * drv_name, vm_fs_disk_info * fs_disk, vm_fs_di_enum e_di) +{ + if (NULL == _vm_get_disk_info) + _vm_get_disk_info = (_vm_get_disk_info_t)vm_get_sym_entry("vm_get_disk_info"); + + if (NULL != _vm_get_disk_info) + return _vm_get_disk_info(drv_name,fs_disk,e_di); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_encoded_dtacct_id.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_encoded_dtacct_id.c new file mode 100644 index 00000000..336e2d6d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_encoded_dtacct_id.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_encoded_dtacct_id_t)(VMINT apn, VMUINT * dtacct_id); +_vm_get_encoded_dtacct_id_t _vm_get_encoded_dtacct_id = NULL; + +VMINT vm_get_encoded_dtacct_id(VMINT apn, VMUINT * dtacct_id) +{ + if (NULL == _vm_get_encoded_dtacct_id) + _vm_get_encoded_dtacct_id = (_vm_get_encoded_dtacct_id_t)vm_get_sym_entry("vm_get_encoded_dtacct_id"); + + if (NULL != _vm_get_encoded_dtacct_id) + return _vm_get_encoded_dtacct_id(apn,dtacct_id); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_exec_filename.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_exec_filename.c new file mode 100644 index 00000000..4fcc2f62 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_exec_filename.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_exec_filename_t)(VMWSTR filename); +_vm_get_exec_filename_t _vm_get_exec_filename = NULL; + +VMINT vm_get_exec_filename(VMWSTR filename) +{ + if (NULL == _vm_get_exec_filename) + _vm_get_exec_filename = (_vm_get_exec_filename_t)vm_get_sym_entry("vm_get_exec_filename"); + + if (NULL != _vm_get_exec_filename) + return _vm_get_exec_filename(filename); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_filename.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_filename.c new file mode 100644 index 00000000..a937f920 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_filename.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_get_filename_t)(VMWSTR path, VMWSTR filename); +_vm_get_filename_t _vm_get_filename = NULL; + +void vm_get_filename(VMWSTR path, VMWSTR filename) +{ + if (NULL == _vm_get_filename) + _vm_get_filename = (_vm_get_filename_t)vm_get_sym_entry("vm_get_filename"); + + if (NULL != _vm_get_filename) + _vm_get_filename(path,filename); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_full_path_by_short_name.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_full_path_by_short_name.c new file mode 100644 index 00000000..d2e66a50 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_full_path_by_short_name.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_full_path_by_short_name_t)(VMWSTR short_name, VMWSTR full_path); +_vm_get_full_path_by_short_name_t _vm_get_full_path_by_short_name = NULL; +VMINT vm_get_full_path_by_short_name(VMWSTR short_name, VMWSTR full_path) +{ + if (_vm_get_full_path_by_short_name == NULL) + _vm_get_full_path_by_short_name = (_vm_get_full_path_by_short_name_t)vm_get_sym_entry("vm_get_full_path_by_short_name"); + if (_vm_get_full_path_by_short_name != NULL) + return _vm_get_full_path_by_short_name(short_name, full_path); + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imei.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imei.c new file mode 100644 index 00000000..d74bee55 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imei.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMSTR (*_vm_get_imei_t)(void); +_vm_get_imei_t _vm_get_imei = NULL; + +VMSTR vm_get_imei(void) +{ + if (NULL == _vm_get_imei) + _vm_get_imei = (_vm_get_imei_t)vm_get_sym_entry("vm_get_imei"); + + if (NULL != _vm_get_imei) + return _vm_get_imei(); + + return (VMSTR )NULL; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imei_ext.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imei_ext.c new file mode 100644 index 00000000..e1fab049 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imei_ext.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMSTR (*_vm_get_imei_ext_t)(VMINT sim); +_vm_get_imei_ext_t _vm_get_imei_ext = NULL; + +VMSTR vm_get_imei_ext(VMINT sim) +{ + if (NULL == _vm_get_imei_ext) + _vm_get_imei_ext = (_vm_get_imei_ext_t)vm_get_sym_entry("vm_get_imei_ext"); + + if (NULL != _vm_get_imei_ext) + return _vm_get_imei_ext(sim); + + return (VMSTR )NULL; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imsi.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imsi.c new file mode 100644 index 00000000..b2fbdd7a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_imsi.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMSTR (*_vm_get_imsi_t)(void); +_vm_get_imsi_t _vm_get_imsi = NULL; + +VMSTR vm_get_imsi(void) +{ + if (NULL == _vm_get_imsi) + _vm_get_imsi = (_vm_get_imsi_t)vm_get_sym_entry("vm_get_imsi"); + + if (NULL != _vm_get_imsi) + return _vm_get_imsi(); + + return (VMSTR )NULL; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_language.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_language.c new file mode 100644 index 00000000..b214356e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_language.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmchset.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_language_t (*_vm_get_language_t)(void); +_vm_get_language_t _vm_get_language = NULL; + +vm_language_t vm_get_language(void) +{ + vm_language_t ret = {-1}; + if (NULL == _vm_get_language) + _vm_get_language = (_vm_get_language_t)vm_get_sym_entry("vm_get_language"); + + if (NULL != _vm_get_language) + return _vm_get_language(); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_language_ssc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_language_ssc.c new file mode 100644 index 00000000..c943cdac --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_language_ssc.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmchset.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_get_language_ssc_t)(VMINT8 *ssc); +_vm_get_language_ssc_t _vm_get_language_ssc = NULL; + +VMINT32 vm_get_language_ssc(VMINT8 *ssc) +{ + if (NULL == _vm_get_language_ssc) + _vm_get_language_ssc = (_vm_get_language_ssc_t)vm_get_sym_entry("vm_get_language_ssc"); + + if (NULL != _vm_get_language_ssc) + return _vm_get_language_ssc(ssc); + + return (VMINT32 )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_malloc_stat.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_malloc_stat.c new file mode 100644 index 00000000..ed7f8c1b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_malloc_stat.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef malloc_stat_t* (*_vm_get_malloc_stat_t)(void); +_vm_get_malloc_stat_t _vm_get_malloc_stat = NULL; + +malloc_stat_t* vm_get_malloc_stat(void) +{ + if (NULL == _vm_get_malloc_stat) + _vm_get_malloc_stat = (_vm_get_malloc_stat_t)vm_get_sym_entry("vm_get_malloc_stat"); + + if (NULL != _vm_get_malloc_stat) + return _vm_get_malloc_stat(); + + return (malloc_stat_t* )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_modules.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_modules.c new file mode 100644 index 00000000..ca80bd4e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_modules.c @@ -0,0 +1,18 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_modules_t)(vm_module_struct *modules, VMUINT size); +_vm_get_modules_t _vm_get_modules = NULL; + +VMINT vm_get_modules(vm_module_struct *modules, VMUINT size) +{ + if (NULL == _vm_get_modules) + _vm_get_modules = (_vm_get_modules_t)vm_get_sym_entry("vm_get_modules"); + + if (NULL != _vm_get_modules) + return _vm_get_modules(modules,size); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_modules.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_modules.c new file mode 100644 index 00000000..7bd5e5dc --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_modules.c @@ -0,0 +1,18 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_mre_modules_t)(vm_module_struct *modules, VMUINT size); +_vm_get_mre_modules_t _vm_get_mre_modules = NULL; + +VMINT vm_get_mre_modules(vm_module_struct *modules, VMUINT size) +{ + if (NULL == _vm_get_mre_modules) + _vm_get_mre_modules = (_vm_get_mre_modules_t)vm_get_sym_entry("vm_get_mre_modules"); + + if (NULL != _vm_get_mre_modules) + return _vm_get_mre_modules(modules,size); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_total_mem_size.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_total_mem_size.c new file mode 100644 index 00000000..86581665 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_total_mem_size.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_mre_total_mem_size_t)(void); +_vm_get_mre_total_mem_size_t _vm_get_mre_total_mem_size = NULL; + +VMUINT vm_get_mre_total_mem_size(void) +{ + if (NULL == _vm_get_mre_total_mem_size) + _vm_get_mre_total_mem_size = (_vm_get_mre_total_mem_size_t)vm_get_sym_entry("vm_get_mre_total_mem_size"); + + if (NULL != _vm_get_mre_total_mem_size) + return _vm_get_mre_total_mem_size(); + + return (VMUINT )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_version.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_version.c new file mode 100644 index 00000000..5a723e07 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_mre_version.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_mre_version_t)(void); +_vm_get_mre_version_t _vm_get_mre_version = NULL; + +VMUINT vm_get_mre_version(void) +{ + if (NULL == _vm_get_mre_version) + _vm_get_mre_version = (_vm_get_mre_version_t)vm_get_sym_entry("vm_get_mre_version"); + + if (NULL != _vm_get_mre_version) + return _vm_get_mre_version(); + + return (VMUINT )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_multi_tags.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_multi_tags.c new file mode 100644 index 00000000..01fa02ff --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_multi_tags.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmgettag.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_multi_tags_t)( short* filename, MULTI_TAG * tag_req); +_vm_get_multi_tags_t _vm_get_multi_tags = NULL; + +VMINT vm_get_multi_tags( short* filename, MULTI_TAG * tag_req) +{ + if (NULL == _vm_get_multi_tags) + _vm_get_multi_tags = (_vm_get_multi_tags_t)vm_get_sym_entry("vm_get_multi_tags"); + + if (NULL != _vm_get_multi_tags) + return _vm_get_multi_tags(filename,tag_req); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_multi_tags_by_lang_id.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_multi_tags_by_lang_id.c new file mode 100644 index 00000000..afa5e691 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_multi_tags_by_lang_id.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmgettag.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_multi_tags_by_lang_id_t)( short* filename, MULTI_TAG * tag_req, int lang_id ); +_vm_get_multi_tags_by_lang_id_t _vm_get_multi_tags_by_lang_id = NULL; + +VMINT vm_get_multi_tags_by_lang_id( short* filename, MULTI_TAG * tag_req, int lang_id ) +{ + if (NULL == _vm_get_multi_tags_by_lang_id) + _vm_get_multi_tags_by_lang_id = (_vm_get_multi_tags_by_lang_id_t)vm_get_sym_entry("vm_get_multi_tags_by_lang_id"); + + if (NULL != _vm_get_multi_tags_by_lang_id) + return _vm_get_multi_tags_by_lang_id(filename,tag_req,lang_id); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_operator.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_operator.c new file mode 100644 index 00000000..ffc5d18b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_operator.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef operator_t (*_vm_get_operator_t)(void); +_vm_get_operator_t _vm_get_operator = NULL; + +operator_t vm_get_operator(void) +{ + operator_t ret = {-1}; + if (NULL == _vm_get_operator) + _vm_get_operator = (_vm_get_operator_t)vm_get_sym_entry("vm_get_operator"); + + if (NULL != _vm_get_operator) + return _vm_get_operator(); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_origin_release_verno.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_origin_release_verno.c new file mode 100644 index 00000000..76c1eed3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_origin_release_verno.c @@ -0,0 +1,22 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_origin_release_verno_t)(VMCHAR *value, VMUINT len); +_vm_get_origin_release_verno_t _vm_get_origin_release_verno = NULL; + +VMUINT vm_get_origin_release_verno(VMCHAR *value, VMUINT len) +{ + if (_vm_get_origin_release_verno == NULL) + { + _vm_get_origin_release_verno = (_vm_get_origin_release_verno_t) vm_get_sym_entry("vm_get_origin_release_verno"); + } + + if (_vm_get_origin_release_verno != NULL) + { + return _vm_get_origin_release_verno(value, len); + } + + return (VMUINT) 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_path.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_path.c new file mode 100644 index 00000000..133d9741 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_path.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_path_t)(VMWSTR fullpath, VMWSTR path); +_vm_get_path_t _vm_get_path = NULL; + +VMINT vm_get_path(VMWSTR fullpath, VMWSTR path) +{ + if (NULL == _vm_get_path) + _vm_get_path = (_vm_get_path_t)vm_get_sym_entry("vm_get_path"); + + if (NULL != _vm_get_path) + return _vm_get_path(fullpath,path); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_removable_driver.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_removable_driver.c new file mode 100644 index 00000000..4cee9fce --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_removable_driver.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_removeable_driver_t)(void); +_vm_get_removeable_driver_t _vm_get_removeable_driver = NULL; + + +VMINT vm_get_removeable_driver(void) { + if (_vm_get_removeable_driver == NULL) + _vm_get_removeable_driver = (_vm_get_removeable_driver_t)vm_get_sym_entry("vm_get_removeable_driver"); + + if (_vm_get_removeable_driver != NULL) + return _vm_get_removeable_driver(); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_res_header.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_res_header.c new file mode 100644 index 00000000..8f507284 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_res_header.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmres.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_res_header_t)(void); +_vm_get_res_header_t _vm_get_res_header = NULL; + +VMINT vm_get_res_header(void) +{ + if (NULL == _vm_get_res_header) + _vm_get_res_header = (_vm_get_res_header_t)vm_get_sym_entry("vm_get_res_header"); + + if (NULL != _vm_get_res_header) + return _vm_get_res_header(); + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_resource_offset.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_resource_offset.c new file mode 100644 index 00000000..5ec9e4c0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_resource_offset.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmres.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_resource_offset_t)(char* res_name); +_vm_get_resource_offset_t _vm_get_resource_offset = NULL; + +VMUINT vm_get_resource_offset(char *res_name) +{ + if (NULL == _vm_get_resource_offset) + _vm_get_resource_offset = (_vm_get_resource_offset_t)vm_get_sym_entry("vm_get_resource_offset"); + + if (NULL != _vm_get_resource_offset) + return _vm_get_resource_offset(res_name); + + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_resource_offset_from_file.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_resource_offset_from_file.c new file mode 100644 index 00000000..37a368ab --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_resource_offset_from_file.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmres.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_resource_offset_from_file_t)(VMWSTR filename, char *res_name); +_vm_get_resource_offset_from_file_t _vm_get_resource_offset_from_file = NULL; + +VMUINT vm_get_resource_offset_from_file(VMWSTR filename, char *res_name) +{ + if (NULL == _vm_get_resource_offset_from_file) + _vm_get_resource_offset_from_file = (_vm_get_resource_offset_from_file_t)vm_get_sym_entry("vm_get_resource_offset_from_file"); + + if (NULL != _vm_get_resource_offset_from_file) + return _vm_get_resource_offset_from_file(filename, res_name); + + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_rtc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_rtc.c new file mode 100644 index 00000000..ea371755 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_rtc.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_rtc_t)(VMUINT * rtc); +_vm_get_rtc_t _vm_get_rtc = NULL; +VMINT vm_get_rtc(VMUINT * rtc) +{ + if (_vm_get_rtc == NULL) + _vm_get_rtc = (_vm_get_rtc_t)vm_get_sym_entry("vm_get_rtc"); + + if (_vm_get_rtc != NULL) + return _vm_get_rtc(rtc); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sim_card_status.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sim_card_status.c new file mode 100644 index 00000000..71ebae39 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sim_card_status.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_sim_state_t (*_vm_get_sim_card_status_t)(VMINT card_id); +_vm_get_sim_card_status_t _vm_get_sim_card_status = NULL; + +vm_sim_state_t vm_get_sim_card_status(VMINT card_id) +{ + vm_sim_state_t ret = {-1}; + if (NULL == _vm_get_sim_card_status) + _vm_get_sim_card_status = (_vm_get_sim_card_status_t)vm_get_sym_entry("vm_get_sim_card_status"); + + if (NULL != _vm_get_sim_card_status) + return _vm_get_sim_card_status(card_id); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_property.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_property.c new file mode 100644 index 00000000..6c5a5bef --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_property.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_sys_property_t)(const VMINT key, VMCHAR* value, VMUINT len); +_vm_get_sys_property_t _vm_get_sys_property = NULL; + +VMUINT vm_get_sys_property(const VMINT key, VMCHAR* value, VMUINT len) +{ + if (NULL == _vm_get_sys_property) + _vm_get_sys_property = (_vm_get_sys_property_t)vm_get_sym_entry("vm_get_sys_property"); + + if (NULL != _vm_get_sys_property) + return _vm_get_sys_property(key,value,len); + + return (VMUINT )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_scene.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_scene.c new file mode 100644 index 00000000..a625eea1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_scene.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_sys_scene_t)(void); +_vm_get_sys_scene_t _vm_get_sys_scene = NULL; + +VMINT vm_get_sys_scene(void) +{ + if (NULL == _vm_get_sys_scene) + _vm_get_sys_scene = (_vm_get_sys_scene_t)vm_get_sym_entry("vm_get_sys_scene"); + + if (NULL != _vm_get_sys_scene) + return _vm_get_sys_scene(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_time_zone.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_time_zone.c new file mode 100644 index 00000000..aff8bb0f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_sys_time_zone.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef float (*_vm_get_sys_time_zone_t)(void); +_vm_get_sys_time_zone_t _vm_get_sys_time_zone = NULL; + +float vm_get_sys_time_zone(void) +{ + float ret = {-1}; + if (NULL == _vm_get_sys_time_zone) + _vm_get_sys_time_zone = (_vm_get_sys_time_zone_t)vm_get_sym_entry("vm_get_sys_time_zone"); + + if (NULL != _vm_get_sys_time_zone) + return _vm_get_sys_time_zone(); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_system_driver.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_system_driver.c new file mode 100644 index 00000000..e8ce550e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_system_driver.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_system_driver_t)(void); +_vm_get_system_driver_t _vm_get_system_driver = NULL; + +VMINT vm_get_system_driver(void) +{ + if (NULL == _vm_get_system_driver) + _vm_get_system_driver = (_vm_get_system_driver_t)vm_get_sym_entry("vm_get_system_driver"); + + if (NULL != _vm_get_system_driver) + return _vm_get_system_driver(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_tag_by_lang_id.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_tag_by_lang_id.c new file mode 100644 index 00000000..0f02d198 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_tag_by_lang_id.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmgettag.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_tag_by_lang_id_t)( short* filename, int tag_num, void* buf, int* buf_size, int lang_id ); +_vm_get_tag_by_lang_id_t _vm_get_tag_by_lang_id = NULL; + +VMINT vm_get_tag_by_lang_id( short* filename, int tag_num, void* buf, int* buf_size, int lang_id ) +{ + if (NULL == _vm_get_tag_by_lang_id) + _vm_get_tag_by_lang_id = (_vm_get_tag_by_lang_id_t)vm_get_sym_entry("vm_get_tag_by_lang_id"); + + if (NULL != _vm_get_tag_by_lang_id) + return _vm_get_tag_by_lang_id(filename,tag_num,buf,buf_size,lang_id); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_tick_count.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_tick_count.c new file mode 100644 index 00000000..7eb5ad58 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_tick_count.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_tick_count_t)(void); +_vm_get_tick_count_t _vm_get_tick_count = NULL; + +VMINT vm_get_tick_count(void) +{ + if (NULL == _vm_get_tick_count) + _vm_get_tick_count = (_vm_get_tick_count_t)vm_get_sym_entry("vm_get_tick_count"); + + if (NULL != _vm_get_tick_count) + return _vm_get_tick_count(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_time.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_time.c new file mode 100644 index 00000000..555865e2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_time.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_time_t)(vm_time_t* time); +_vm_get_time_t _vm_get_time = NULL; + +VMINT vm_get_time(vm_time_t* time) +{ + if (NULL == _vm_get_time) + _vm_get_time = (_vm_get_time_t)vm_get_sym_entry("vm_get_time"); + + if (NULL != _vm_get_time) + return _vm_get_time(time); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_total_mem_size.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_total_mem_size.c new file mode 100644 index 00000000..cb19d505 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_total_mem_size.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_total_mem_size_t)(void); +_vm_get_total_mem_size_t _vm_get_total_mem_size = NULL; + +VMUINT vm_get_total_mem_size(void) +{ + if (NULL == _vm_get_total_mem_size) + _vm_get_total_mem_size = (_vm_get_total_mem_size_t)vm_get_sym_entry("vm_get_total_mem_size"); + + if (NULL != _vm_get_total_mem_size) + return _vm_get_total_mem_size(); + + return (VMUINT )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_version.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_version.c new file mode 100644 index 00000000..e4751f8a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_version.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_get_version_t)(void); +_vm_get_version_t _vm_get_version = NULL; + +VMUINT vm_get_version(void) +{ + if (NULL == _vm_get_version) + _vm_get_version = (_vm_get_version_t)vm_get_sym_entry("vm_get_version"); + + if (NULL != _vm_get_version) + return _vm_get_version(); + + return (VMUINT )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_vm_tag.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_vm_tag.c new file mode 100644 index 00000000..ca2bd4d8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_vm_tag.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmgettag.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_vm_tag_t)(short* filename,int tag_num, void* buf ,int* buf_size); +_vm_get_vm_tag_t _vm_get_vm_tag = NULL; + +VMINT vm_get_vm_tag(short* filename,int tag_num, void* buf ,int* buf_size) +{ + if (NULL == _vm_get_vm_tag) + _vm_get_vm_tag = (_vm_get_vm_tag_t)vm_get_sym_entry("vm_get_vm_tag"); + + if (NULL != _vm_get_vm_tag) + return _vm_get_vm_tag(filename,tag_num,buf ,buf_size); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_volume.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_volume.c new file mode 100644 index 00000000..253255dd --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_get_volume.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_get_volume_t)(void); +_vm_get_volume_t _vm_get_volume = NULL; + +VMINT vm_get_volume(void) +{ + if (NULL == _vm_get_volume) + _vm_get_volume = (_vm_get_volume_t)vm_get_sym_entry("vm_get_volume"); + + if (NULL != _vm_get_volume) + return _vm_get_volume(); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getpeername.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getpeername.c new file mode 100644 index 00000000..55434b1c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getpeername.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_getpeername_t)(int s, SOCKADDR *addr, int *len); +_vm_getpeername_t _vm_getpeername = NULL; + +int vm_getpeername(int s, SOCKADDR *addr, int *len) +{ + if (NULL == _vm_getpeername) + _vm_getpeername = (_vm_getpeername_t)vm_get_sym_entry("vm_getpeername"); + if (NULL != _vm_getpeername) + return _vm_getpeername(s,addr,len); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getsockname.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getsockname.c new file mode 100644 index 00000000..1625f166 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getsockname.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_getsockname_t)(int s, SOCKADDR *addr, int *len); +_vm_getsockname_t _vm_getsockname = NULL; + +int vm_getsockname(int s, SOCKADDR *addr, int *len) +{ + if (NULL == _vm_getsockname) + _vm_getsockname = (_vm_getsockname_t)vm_get_sym_entry("vm_getsockname"); + if (NULL != _vm_getsockname) + return _vm_getsockname(s,addr,len); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getsockopt.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getsockopt.c new file mode 100644 index 00000000..0e5097bc --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_getsockopt.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_getsockopt_t)(int sock, VMUINT32 option, void *val, VMUINT8 val_size); +_vm_getsockopt_t _vm_getsockopt = NULL; + +int vm_getsockopt(int sock, VMUINT32 option, void *val, VMUINT8 val_size) +{ + if (NULL == _vm_getsockopt) + _vm_getsockopt = (_vm_getsockopt_t)vm_get_sym_entry("vm_getsockopt"); + if (NULL != _vm_getsockopt) + return _vm_getsockopt(sock,option,val,val_size); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_free.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_free.c new file mode 100644 index 00000000..9c46d4d2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_free.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_global_free_t)(void* ptr); +_vm_global_free_t _vm_global_free = NULL; + +void vm_global_free(void* ptr) +{ + if (NULL == _vm_global_free) + _vm_global_free = (_vm_global_free_t)vm_get_sym_entry("vm_global_free"); + + if (NULL != _vm_global_free) + _vm_global_free(ptr); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_get_max_alloc_size.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_get_max_alloc_size.c new file mode 100644 index 00000000..a2390764 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_get_max_alloc_size.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_global_get_max_alloc_size_t)(void); +_vm_global_get_max_alloc_size_t _vm_global_get_max_alloc_size = NULL; + +VMINT vm_global_get_max_alloc_size(void) +{ + if (NULL == _vm_global_get_max_alloc_size) + _vm_global_get_max_alloc_size = (_vm_global_get_max_alloc_size_t)vm_get_sym_entry("vm_global_get_max_alloc_size"); + + if (NULL != _vm_global_get_max_alloc_size) + return _vm_global_get_max_alloc_size(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_malloc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_malloc.c new file mode 100644 index 00000000..ca68aba5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_global_malloc.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void *(*_vm_global_malloc_t)(unsigned int size); +_vm_global_malloc_t _vm_global_malloc = NULL; + +void *vm_global_malloc(unsigned int size) +{ + if (NULL == _vm_global_malloc) + _vm_global_malloc = (_vm_global_malloc_t)vm_get_sym_entry("vm_global_malloc"); + + if (NULL != _vm_global_malloc) + return _vm_global_malloc(size); + + return NULL; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_close.c new file mode 100644 index 00000000..f1110233 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_close.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmgps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_gps_close_t)(void); +_vm_gps_close_t _vm_gps_close = NULL; + +VMINT vm_gps_close(void) +{ + if (NULL == _vm_gps_close) + _vm_gps_close = (_vm_gps_close_t)vm_get_sym_entry("vm_gps_close"); + + if (NULL != _vm_gps_close) + return _vm_gps_close(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_open.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_open.c new file mode 100644 index 00000000..60854f6f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_open.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmgps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_gps_open_t)(VMUINT period, vm_gps_type_enum type, VM_GPS_CAlLBACK_FUNC callback); +_vm_gps_open_t _vm_gps_open = NULL; + +VMINT vm_gps_open(VMUINT period, vm_gps_type_enum type, VM_GPS_CAlLBACK_FUNC callback) +{ + if (NULL == _vm_gps_open) + _vm_gps_open = (_vm_gps_open_t)vm_get_sym_entry("vm_gps_open"); + + if (NULL != _vm_gps_open) + return _vm_gps_open(period, type, callback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_set_mode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_set_mode.c new file mode 100644 index 00000000..71f3c822 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_gps_set_mode.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmgps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_gps_set_mode_t)(vm_gps_mode_enum mode); +_vm_gps_set_mode_t _vm_gps_set_mode = NULL; + +VMINT vm_gps_set_mode(vm_gps_mode_enum mode) +{ + if (NULL == _vm_gps_set_mode) + _vm_gps_set_mode = (_vm_gps_set_mode_t)vm_get_sym_entry("vm_gps_set_mode"); + + if (NULL != _vm_gps_set_mode) + return _vm_gps_set_mode(mode); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_has_sim_card.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_has_sim_card.c new file mode 100644 index 00000000..48aa1910 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_has_sim_card.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_has_sim_card_t)(void); +_vm_has_sim_card_t _vm_has_sim_card = NULL; + +VMINT vm_has_sim_card(void) +{ + if (NULL == _vm_has_sim_card) + _vm_has_sim_card = (_vm_has_sim_card_t)vm_get_sym_entry("vm_has_sim_card"); + + if (NULL != _vm_has_sim_card) + return _vm_has_sim_card(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_htonl.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_htonl.c new file mode 100644 index 00000000..c4f42f2a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_htonl.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT32 (*_vm_htonl_t)(VMUINT32 a); +_vm_htonl_t _vm_htonl = NULL; + +VMUINT32 vm_htonl(VMUINT32 a) +{ + if (NULL == _vm_htonl) + _vm_htonl = (_vm_htonl_t)vm_get_sym_entry("vm_htonl"); + if (NULL != _vm_htonl) + return _vm_htonl(a); + return (VMUINT32)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_htons.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_htons.c new file mode 100644 index 00000000..8df484d0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_htons.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT16 (*_vm_htons_t)(VMUINT16 a); +_vm_htons_t _vm_htons = NULL; + +VMUINT16 vm_htons(VMUINT16 a) +{ + if (NULL == _vm_htons) + _vm_htons = (_vm_htons_t)vm_get_sym_entry("vm_htons"); + if (NULL != _vm_htons) + return _vm_htons(a); + return (VMUINT16)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_add_header.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_add_header.c new file mode 100644 index 00000000..3271fee5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_add_header.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_http_add_header_t)(VMINT handle, VMCHAR* name, VMCHAR* value); +_vm_http_add_header_t _vm_http_add_header = NULL; + +VMINT vm_http_add_header(VMINT handle, VMCHAR* name, VMCHAR* value) +{ + if (NULL == _vm_http_add_header) + _vm_http_add_header = (_vm_http_add_header_t)vm_get_sym_entry("vm_http_add_header"); + + if (NULL != _vm_http_add_header) + return _vm_http_add_header(handle,name,value); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_fetch_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_fetch_handle.c new file mode 100644 index 00000000..4efde0c0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_fetch_handle.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_http_fetch_handle_t)(VMINT type, void* p); +_vm_http_fetch_handle_t _vm_http_fetch_handle = NULL; + +VMINT vm_http_fetch_handle(VMINT type, void* p) +{ + if (NULL == _vm_http_fetch_handle) + _vm_http_fetch_handle = (_vm_http_fetch_handle_t)vm_get_sym_entry("vm_http_fetch_handle"); + + if (NULL != _vm_http_fetch_handle) + return _vm_http_fetch_handle(type,p); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_free_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_free_handle.c new file mode 100644 index 00000000..d95c14de --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_free_handle.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_http_free_handle_t)(VMINT handle); +_vm_http_free_handle_t _vm_http_free_handle = NULL; + +void vm_http_free_handle(VMINT handle) +{ + if (NULL == _vm_http_free_handle) + _vm_http_free_handle = (_vm_http_free_handle_t)vm_get_sym_entry("vm_http_free_handle"); + + if (NULL != _vm_http_free_handle) + _vm_http_free_handle(handle); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_get_current_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_get_current_handle.c new file mode 100644 index 00000000..9e98aae3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_get_current_handle.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_http_get_current_handle_t)(void); +_vm_http_get_current_handle_t _vm_http_get_current_handle = NULL; + +VMINT vm_http_get_current_handle(void) +{ + if (NULL == _vm_http_get_current_handle) + _vm_http_get_current_handle = (_vm_http_get_current_handle_t)vm_get_sym_entry("vm_http_get_current_handle"); + + if (NULL != _vm_http_get_current_handle) + return _vm_http_get_current_handle(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_recv_data.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_recv_data.c new file mode 100644 index 00000000..d69e2d0d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_recv_data.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_http_recv_data_t)(VMINT handle, VMUINT8* data, VMINT len); +_vm_http_recv_data_t _vm_http_recv_data = NULL; + +VMINT vm_http_recv_data(VMINT handle, VMUINT8* data, VMINT len) +{ + if (NULL == _vm_http_recv_data) + _vm_http_recv_data = (_vm_http_recv_data_t)vm_get_sym_entry("vm_http_recv_data"); + + if (NULL != _vm_http_recv_data) + return _vm_http_recv_data(handle,data,len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_reg_receiver.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_reg_receiver.c new file mode 100644 index 00000000..2bce0adb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_reg_receiver.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_http_reg_receiver_t)(VMINT handle, http_data_receiver reciever); +_vm_http_reg_receiver_t _vm_http_reg_receiver = NULL; + +VMINT vm_http_reg_receiver(VMINT handle, http_data_receiver reciever) +{ + if (NULL == _vm_http_reg_receiver) + _vm_http_reg_receiver = (_vm_http_reg_receiver_t)vm_get_sym_entry("vm_http_reg_receiver"); + + if (NULL != _vm_http_reg_receiver) + return _vm_http_reg_receiver(handle,reciever); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_reg_sender.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_reg_sender.c new file mode 100644 index 00000000..abfe95bd --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_reg_sender.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_http_reg_sender_t)(VMINT handle, http_data_sender sender); +_vm_http_reg_sender_t _vm_http_reg_sender = NULL; + +VMINT vm_http_reg_sender(VMINT handle, http_data_sender sender) +{ + if (NULL == _vm_http_reg_sender) + _vm_http_reg_sender = (_vm_http_reg_sender_t)vm_get_sym_entry("vm_http_reg_sender"); + + if (NULL != _vm_http_reg_sender) + return _vm_http_reg_sender(handle,sender); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_request.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_request.c new file mode 100644 index 00000000..1fcec6b9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_request.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_http_request_t)(http_request_t *request, http_session_t *session); +_vm_http_request_t _vm_http_request = NULL; + +int vm_http_request(http_request_t *request, http_session_t *session) +{ + int ret = {-1}; + if (NULL == _vm_http_request) + _vm_http_request = (_vm_http_request_t)vm_get_sym_entry("vm_http_request"); + + if (NULL != _vm_http_request) + return _vm_http_request(request,session); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_send_data.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_send_data.c new file mode 100644 index 00000000..71e981b2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_send_data.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_http_send_data_t)(VMINT handle, VMUINT8* data, VMINT len); +_vm_http_send_data_t _vm_http_send_data = NULL; + +VMINT vm_http_send_data(VMINT handle, VMUINT8* data, VMINT len) +{ + if (NULL == _vm_http_send_data) + _vm_http_send_data = (_vm_http_send_data_t)vm_get_sym_entry("vm_http_send_data"); + + if (NULL != _vm_http_send_data) + return _vm_http_send_data(handle,data,len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_body.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_body.c new file mode 100644 index 00000000..8f86f83b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_body.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_http_set_body_t)(VMINT handle, VMUINT8* data, VMINT len); +_vm_http_set_body_t _vm_http_set_body = NULL; + +VMINT vm_http_set_body(VMINT handle, VMUINT8* data, VMINT len) +{ + if (NULL == _vm_http_set_body) + _vm_http_set_body = (_vm_http_set_body_t)vm_get_sym_entry("vm_http_set_body"); + + if (NULL != _vm_http_set_body) + return _vm_http_set_body(handle,data,len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_current_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_current_handle.c new file mode 100644 index 00000000..356eaa68 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_current_handle.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_http_set_current_handle_t)(VMINT handle); +_vm_http_set_current_handle_t _vm_http_set_current_handle = NULL; + +VMINT vm_http_set_current_handle(VMINT handle) +{ + if (NULL == _vm_http_set_current_handle) + _vm_http_set_current_handle = (_vm_http_set_current_handle_t)vm_get_sym_entry("vm_http_set_current_handle"); + + if (NULL != _vm_http_set_current_handle) + return _vm_http_set_current_handle(handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_url.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_url.c new file mode 100644 index 00000000..7d1fbe64 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_http_set_url.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_http_set_url_t)(VMINT handle, VMCHAR* url, VMINT len); +_vm_http_set_url_t _vm_http_set_url = NULL; + +VMINT vm_http_set_url(VMINT handle, VMCHAR* url, VMINT len) +{ + if (NULL == _vm_http_set_url) + _vm_http_set_url = (_vm_http_set_url_t)vm_get_sym_entry("vm_http_set_url"); + + if (NULL != _vm_http_set_url) + return _vm_http_set_url(handle,url,len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_register_wps_cntxt_and_callback.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_register_wps_cntxt_and_callback.c new file mode 100644 index 00000000..36695126 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_register_wps_cntxt_and_callback.c @@ -0,0 +1,44 @@ +#include "vmsys.h" +#include "vmhttps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; +typedef VMUINT8 (*_vm_https_register_wps_cntxt_and_callback_t)( + VMINT apn, + wps_send_set_channel_rsp_cb set_channel_rsp_cb, + wps_unset_channel_rsp_cb unset_channel_cb, + wps_send_release_all_req_rsp_cb release_all_req_cb, + wps_send_wps_termination_ind_cb terminal_ind_cb, + wps_send_http_rsp_cb http_rsp_cb, + wps_send_read_content_rsp_cb read_content_rsp_cb, + wps_send_cancel_rsp_cb cancel_rsp_cb, + wps_send_status_query_rsp_cb status_query_rsp_cb); +_vm_https_register_wps_cntxt_and_callback_t _vm_https_register_wps_cntxt_and_callback = NULL; +VMUINT8 vm_https_register_wps_cntxt_and_callback( + VMINT apn, + wps_send_set_channel_rsp_cb set_channel_rsp_cb, + wps_unset_channel_rsp_cb unset_channel_cb, + wps_send_release_all_req_rsp_cb release_all_req_cb, + wps_send_wps_termination_ind_cb terminal_ind_cb, + wps_send_http_rsp_cb http_rsp_cb, + wps_send_read_content_rsp_cb read_content_rsp_cb, + wps_send_cancel_rsp_cb cancel_rsp_cb, + wps_send_status_query_rsp_cb status_query_rsp_cb) +{ + if (_vm_https_register_wps_cntxt_and_callback == NULL) { + _vm_https_register_wps_cntxt_and_callback = (_vm_https_register_wps_cntxt_and_callback_t)vm_get_sym_entry("vm_https_register_wps_cntxt_and_callback"); + } + if (_vm_https_register_wps_cntxt_and_callback != NULL) { + return _vm_https_register_wps_cntxt_and_callback( + apn, + set_channel_rsp_cb, + unset_channel_cb, + release_all_req_cb, + terminal_ind_cb, + http_rsp_cb, + read_content_rsp_cb, + cancel_rsp_cb, + status_query_rsp_cb); + } + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_cancel_req.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_cancel_req.c new file mode 100644 index 00000000..501e74bc --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_cancel_req.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmhttps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8 (*_vm_https_send_cancel_req_t)(VMUINT16 request_id); + _vm_https_send_cancel_req_t _vm_https_send_cancel_req = NULL; +VMUINT8 vm_https_send_cancel_req(VMUINT16 request_id) +{ + if (_vm_https_send_cancel_req == NULL) { + _vm_https_send_cancel_req = (_vm_https_send_cancel_req_t)vm_get_sym_entry("vm_https_send_cancel_req"); + } + if (_vm_https_send_cancel_req != NULL) { + return _vm_https_send_cancel_req(request_id); + } + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_post_content_res.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_post_content_res.c new file mode 100644 index 00000000..813fa3ee --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_post_content_res.c @@ -0,0 +1,30 @@ +#include "vmsys.h" +#include "vmhttps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8 (*_vm_https_send_post_content_res_t)(VMUINT16 request_id, + VMUINT8 seq_num, + VMBYTE more, + VMUINT32 post_segment_len, + VMUINT8* post_segment); +_vm_https_send_post_content_res_t _vm_https_send_post_content_res = NULL; +VMINT vm_https_send_post_content_res(VMUINT16 request_id, + VMUINT8 seq_num, + VMBYTE more, + VMUINT32 post_segment_len, + VMUINT8* post_segment) +{ + if (_vm_https_send_post_content_res == NULL) { + _vm_https_send_post_content_res = (_vm_https_send_post_content_res_t)vm_get_sym_entry("vm_https_send_post_content_res"); + } + if (_vm_https_send_post_content_res != NULL) { + return _vm_https_send_post_content_res(request_id, + seq_num, + more, + post_segment_len, + post_segment); + } + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_read_content_req.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_read_content_req.c new file mode 100644 index 00000000..b81535c9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_read_content_req.c @@ -0,0 +1,29 @@ +#include "vmsys.h" +#include "vmhttps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + + +typedef VMUINT8 (*_vm_https_send_read_content_req_t)( + VMUINT16 request_id, + VMUINT8 seq_num, + VMUINT32 read_segnemtn_len); +_vm_https_send_read_content_req_t _vm_https_send_read_content_req = NULL; + +VMUINT8 vm_https_send_read_content_req( + VMUINT16 request_id, + VMUINT8 seq_num, + VMUINT32 read_segnemtn_len) +{ + if (_vm_https_send_read_content_req == NULL) { + _vm_https_send_read_content_req = (_vm_https_send_read_content_req_t)vm_get_sym_entry("vm_https_send_read_content_req"); + } + if (_vm_https_send_read_content_req != NULL) { + return _vm_https_send_read_content_req( + request_id, + seq_num, + read_segnemtn_len); + } + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_req.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_req.c new file mode 100644 index 00000000..6982565c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_req.c @@ -0,0 +1,52 @@ +#include "vmsys.h" +#include "vmhttps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8(*_vm_https_send_req_t)( + VMUINT16 request_id, + VMUINT8 method, + VMUINT32 option, + VMUINT8 reply_type, + VMUINT32 reply_segment_len, + VMUINT32 request_url_len, + VMUINT8 *request_url, + VMUINT32 request_header_len, + VMUINT8 *request_header, + VMUINT32 post_segment_len, + VMUINT8 *post_segment); +_vm_https_send_req_t _vm_https_send_req = NULL; + +VMUINT8 vm_https_send_req( + VMUINT16 request_id, + VMUINT8 method, + VMUINT32 option, + VMUINT8 reply_type, + VMUINT32 reply_segment_len, + VMUINT32 request_url_len, + VMUINT8 *request_url, + VMUINT32 request_header_len, + VMUINT8 *request_header, + VMUINT32 post_segment_len, + VMUINT8 *post_segment) +{ + if (_vm_https_send_req == NULL) { + _vm_https_send_req = (_vm_https_send_req_t)vm_get_sym_entry("vm_https_send_req"); + } + if (_vm_https_send_req != NULL) { + return _vm_https_send_req( + request_id, + method, + option, + reply_type, + reply_segment_len, + request_url_len, + request_url, + request_header_len, + request_header, + post_segment_len, + post_segment); + } + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_req_ext.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_req_ext.c new file mode 100644 index 00000000..1ec58070 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_req_ext.c @@ -0,0 +1,44 @@ +#include "vmsys.h" +#include "vmhttps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_https_send_req_ext_t)(VMUINT16 request_id, + VMUINT8 method, + VMUINT32 option, + VMUINT8 reply_type, + VMUINT32 reply_segment_len, + VMBYTE more_post, + VMUINT8 post_type, + const vm_wps_http_req_var_struct * req, + wps_post_ind_cb cb); +_vm_https_send_req_ext_t _vm_https_send_req_ext = NULL; +VMINT vm_https_send_req_ext(VMUINT16 request_id, + VMUINT8 method, + VMUINT32 option, + VMUINT8 reply_type, + VMUINT32 reply_segment_len, + VMBYTE more_post, + VMUINT8 post_type, + const vm_wps_http_req_var_struct * req, + wps_post_ind_cb cb) +{ + if (_vm_https_send_req_ext == NULL) { + _vm_https_send_req_ext = (_vm_https_send_req_ext_t)vm_get_sym_entry("vm_https_send_req_ext"); + } + if (_vm_https_send_req_ext != NULL) { + return _vm_https_send_req_ext(request_id, + method, + option, + reply_type, + reply_segment_len, + more_post, + post_type, + req, + cb); + } + return -1; +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_set_channel_req.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_set_channel_req.c new file mode 100644 index 00000000..4ce83f3d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_set_channel_req.c @@ -0,0 +1,60 @@ +#include "vmsys.h" +#include "vmhttps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8 (*_vm_https_send_set_channel_req_t)( + VMUINT16 req_id, + VMUINT8 use_proxy, + VMUINT8 prx_ip[4], + VMUINT16 prx_port, + VMUINT8 *username, + VMUINT8 username_len, + VMUINT8 *password, + VMUINT8 password_len, + VMUINT8 *server_auth_username, + VMUINT8 server_auth_username_len, + VMUINT8 *server_auth_password, + VMUINT8 server_auth_password_len, + VMUINT32 static_header_len, + VMUINT8 *static_header ); +_vm_https_send_set_channel_req_t _vm_https_send_set_channel_req = NULL; + +VMUINT8 vm_https_send_set_channel_req(VMUINT16 req_id, + VMUINT8 use_proxy, + VMUINT8 prx_ip[4], + VMUINT16 prx_port, + VMUINT8 *username, + VMUINT8 username_len, + VMUINT8 *password, + VMUINT8 password_len, + VMUINT8 *server_auth_username, + VMUINT8 server_auth_username_len, + VMUINT8 *server_auth_password, + VMUINT8 server_auth_password_len, + VMUINT32 static_header_len, + VMUINT8 *static_header) +{ + if (_vm_https_send_set_channel_req == NULL) { + _vm_https_send_set_channel_req = (_vm_https_send_set_channel_req_t)vm_get_sym_entry("vm_https_send_set_channel_req"); + } + if (_vm_https_send_set_channel_req != NULL) { + return _vm_https_send_set_channel_req( + req_id, + use_proxy, + prx_ip, + prx_port, + username, + username_len, + password, + password_len, + server_auth_username, + server_auth_username_len, + server_auth_password, + server_auth_password_len, + static_header_len, + static_header); + } + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_unset_channel_req.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_unset_channel_req.c new file mode 100644 index 00000000..7ea5d9be --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_https_send_unset_channel_req.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttps.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8(*_vm_https_send_unset_channel_req_t)(VMUINT8 channel_id); +_vm_https_send_unset_channel_req_t _vm_https_send_unset_channel_req = NULL; + +VMUINT8 vm_https_send_unset_channel_req(VMUINT8 channel_id) +{ + if (_vm_https_send_unset_channel_req == NULL) { + _vm_https_send_unset_channel_req = (_vm_https_send_unset_channel_req_t)vm_get_sym_entry("vm_https_send_unset_channel_req"); + } + if (_vm_https_send_unset_channel_req != NULL) { + return _vm_https_send_unset_channel_req(channel_id); + } + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_idle_swatch_pedometer_register_callback.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_idle_swatch_pedometer_register_callback.c new file mode 100644 index 00000000..674a3755 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_idle_swatch_pedometer_register_callback.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmsettings.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_idle_swatch_pedometer_register_callback_t)(vm_idle_swatch_pedometer_cb event_hdlr); +_vm_idle_swatch_pedometer_register_callback_t _vm_idle_swatch_pedometer_register_callback = NULL; +void vm_idle_swatch_pedometer_register_callback(vm_idle_swatch_pedometer_cb event_hdlr) + +{ + if (NULL == _vm_idle_swatch_pedometer_register_callback) + _vm_idle_swatch_pedometer_register_callback = (_vm_idle_swatch_pedometer_register_callback_t)vm_get_sym_entry("vm_idle_swatch_pedometer_register_callback"); + if (NULL != _vm_idle_swatch_pedometer_register_callback) + _vm_idle_swatch_pedometer_register_callback(event_hdlr); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_addr.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_addr.c new file mode 100644 index 00000000..69998b42 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_addr.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_inet_addr_t)(const char* addr); +_vm_inet_addr_t _vm_inet_addr = NULL; + +VMUINT vm_inet_addr(const char* addr) +{ + if (NULL == _vm_inet_addr) + _vm_inet_addr = (_vm_inet_addr_t)vm_get_sym_entry("vm_inet_addr"); + if (NULL != _vm_inet_addr) + return _vm_inet_addr(addr); + return (VMUINT)0; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_restart.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_restart.c new file mode 100644 index 00000000..65d1ddda --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_restart.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmftpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_ftpsrv_error_enum (*_vm_inet_ftpd_restart_t)(VMUINT32 port, VMCHAR* root_dir); +_vm_inet_ftpd_restart_t _vm_inet_ftpd_restart = NULL; + +vm_ftpsrv_error_enum vm_inet_ftpd_restart(VMUINT32 port, VMCHAR* root_dir) +{ + if (NULL == _vm_inet_ftpd_restart) + _vm_inet_ftpd_restart = (_vm_inet_ftpd_restart_t)vm_get_sym_entry("vm_inet_ftpd_restart"); + + if (NULL != _vm_inet_ftpd_restart) + return _vm_inet_ftpd_restart(port, root_dir); + + return (vm_ftpsrv_error_enum)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_start.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_start.c new file mode 100644 index 00000000..b9000cf2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_start.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmftpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_ftpsrv_error_enum (*_vm_inet_ftpd_start_t)(VMUINT32 port, VMCHAR* root_dir); +_vm_inet_ftpd_start_t _vm_inet_ftpd_start = NULL; + +vm_ftpsrv_error_enum vm_inet_ftpd_start(VMUINT32 port, VMCHAR* root_dir) +{ + if (NULL == _vm_inet_ftpd_start) + _vm_inet_ftpd_start = (_vm_inet_ftpd_start_t)vm_get_sym_entry("vm_inet_ftpd_start"); + + if (NULL != _vm_inet_ftpd_start) + return _vm_inet_ftpd_start(port, root_dir); + + return (vm_ftpsrv_error_enum)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_stop.c new file mode 100644 index 00000000..89631f18 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ftpd_stop.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmftpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_ftpsrv_error_enum (*_vm_inet_ftpd_stop_t)(void); +_vm_inet_ftpd_stop_t _vm_inet_ftpd_stop = NULL; + +vm_ftpsrv_error_enum vm_inet_ftpd_stop(void) +{ + if (NULL == _vm_inet_ftpd_stop) + _vm_inet_ftpd_stop = (_vm_inet_ftpd_stop_t)vm_get_sym_entry("vm_inet_ftpd_stop"); + + if (NULL != _vm_inet_ftpd_stop) + return _vm_inet_ftpd_stop(); + + return (vm_ftpsrv_error_enum)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_cgi_job_finish.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_cgi_job_finish.c new file mode 100644 index 00000000..83522a11 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_cgi_job_finish.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmhttpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_inet_httpd_cgi_job_finish_t)(VMUINT32 hc_handle); +_vm_inet_httpd_cgi_job_finish_t _vm_inet_httpd_cgi_job_finish = NULL; + +void vm_inet_httpd_cgi_job_finish(VMUINT32 hc_handle) +{ + if (NULL == _vm_inet_httpd_cgi_job_finish) + _vm_inet_httpd_cgi_job_finish = (_vm_inet_httpd_cgi_job_finish_t)vm_get_sym_entry("vm_inet_httpd_cgi_job_finish"); + + if (NULL != _vm_inet_httpd_cgi_job_finish) + _vm_inet_httpd_cgi_job_finish(hc_handle); + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_disable_ssl.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_disable_ssl.c new file mode 100644 index 00000000..c2370153 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_disable_ssl.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmhttpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_inet_httpd_disable_ssl_t)(); +_vm_inet_httpd_disable_ssl_t _vm_inet_httpd_disable_ssl = NULL; + +void vm_inet_httpd_disable_ssl() +{ + if (NULL == _vm_inet_httpd_disable_ssl) + _vm_inet_httpd_disable_ssl = (_vm_inet_httpd_disable_ssl_t)vm_get_sym_entry("vm_inet_httpd_disable_ssl"); + + if (NULL != _vm_inet_httpd_disable_ssl) + _vm_inet_httpd_disable_ssl(); + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_enable_ssl.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_enable_ssl.c new file mode 100644 index 00000000..b9b9b941 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_enable_ssl.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmhttpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_inet_httpd_enable_ssl_t)(VMUINT32 port, VMINT8* cer_dir, VMINT8* peer_cn, VMINT8* server_key_passwd); +_vm_inet_httpd_enable_ssl_t _vm_inet_httpd_enable_ssl = NULL; + +void vm_inet_httpd_enable_ssl(VMUINT32 port, VMINT8* cer_dir, VMINT8* peer_cn, VMINT8* server_key_passwd) +{ + if (NULL == _vm_inet_httpd_enable_ssl) + _vm_inet_httpd_enable_ssl = (_vm_inet_httpd_enable_ssl_t)vm_get_sym_entry("vm_inet_httpd_enable_ssl"); + + if (NULL != _vm_inet_httpd_enable_ssl) + _vm_inet_httpd_enable_ssl(port,cer_dir,peer_cn,server_key_passwd); + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_getenv.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_getenv.c new file mode 100644 index 00000000..107c2de2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_getenv.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT8* (*_vm_inet_httpd_getenv_t)(VMUINT32 hc_handle, VMINT8* name); +_vm_inet_httpd_getenv_t _vm_inet_httpd_getenv = NULL; + +VMINT8* vm_inet_httpd_getenv(VMUINT32 hc_handle, VMINT8* name) +{ + if (NULL == _vm_inet_httpd_getenv) + _vm_inet_httpd_getenv = (_vm_inet_httpd_getenv_t)vm_get_sym_entry("vm_inet_httpd_getenv"); + + if (NULL != _vm_inet_httpd_getenv) + return _vm_inet_httpd_getenv(hc_handle,name); + + return (VMINT8* )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_read.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_read.c new file mode 100644 index 00000000..5aeb2c5f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_read.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_inet_httpd_read_t)(VMUINT32 hc_handle, VMINT8* buf, VMINT32 buf_size); +_vm_inet_httpd_read_t _vm_inet_httpd_read = NULL; + +VMINT32 vm_inet_httpd_read(VMUINT32 hc_handle, VMINT8* buf, VMINT32 buf_size) +{ + if (NULL == _vm_inet_httpd_read) + _vm_inet_httpd_read = (_vm_inet_httpd_read_t)vm_get_sym_entry("vm_inet_httpd_read"); + + if (NULL != _vm_inet_httpd_read) + return _vm_inet_httpd_read(hc_handle,buf,buf_size); + + return (VMINT32 )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_restart.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_restart.c new file mode 100644 index 00000000..e46b8ba5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_restart.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_httpsrv_error_enum (*_vm_inet_httpd_restart_t)(VMUINT32 port, VMINT8* root_dir, VMINT8* cgi_pattern); +_vm_inet_httpd_restart_t _vm_inet_httpd_restart = NULL; + +vm_httpsrv_error_enum vm_inet_httpd_restart(VMUINT32 port, VMINT8* root_dir, VMINT8* cgi_pattern) +{ + if (NULL == _vm_inet_httpd_restart) + _vm_inet_httpd_restart = (_vm_inet_httpd_restart_t)vm_get_sym_entry("vm_inet_httpd_restart"); + + if (NULL != _vm_inet_httpd_restart) + return _vm_inet_httpd_restart(port,root_dir,cgi_pattern); + + return (vm_httpsrv_error_enum )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_start.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_start.c new file mode 100644 index 00000000..9f1559c1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_start.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_httpsrv_error_enum (*_vm_inet_httpd_start_t)(VMUINT32 port, VMINT8* root_dir, VMINT8* cgi_pattern); +_vm_inet_httpd_start_t _vm_inet_httpd_start = NULL; + +vm_httpsrv_error_enum vm_inet_httpd_start(VMUINT32 port, VMINT8* root_dir, VMINT8* cgi_pattern) +{ + if (NULL == _vm_inet_httpd_start) + _vm_inet_httpd_start = (_vm_inet_httpd_start_t)vm_get_sym_entry("vm_inet_httpd_start"); + + if (NULL != _vm_inet_httpd_start) + return _vm_inet_httpd_start(port, root_dir, cgi_pattern); + + return (vm_httpsrv_error_enum )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_stop.c new file mode 100644 index 00000000..65507060 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_stop.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_httpsrv_error_enum (*_vm_inet_httpd_stop_t)(void); +_vm_inet_httpd_stop_t _vm_inet_httpd_stop = NULL; + +vm_httpsrv_error_enum vm_inet_httpd_stop(void) +{ + if (NULL == _vm_inet_httpd_stop) + _vm_inet_httpd_stop = (_vm_inet_httpd_stop_t)vm_get_sym_entry("vm_inet_httpd_stop"); + + if (NULL != _vm_inet_httpd_stop) + return _vm_inet_httpd_stop(); + + return (vm_httpsrv_error_enum )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_write.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_write.c new file mode 100644 index 00000000..89d398a7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_httpd_write.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttpd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_inet_httpd_write_t)(VMUINT32 hc_handle, VMINT8* buf, VMINT32 content_size); +_vm_inet_httpd_write_t _vm_inet_httpd_write = NULL; + +VMINT32 vm_inet_httpd_write(VMUINT32 hc_handle, VMINT8* buf, VMINT32 content_size) +{ + if (NULL == _vm_inet_httpd_write) + _vm_inet_httpd_write = (_vm_inet_httpd_write_t)vm_get_sym_entry("vm_inet_httpd_write"); + + if (NULL != _vm_inet_httpd_write) + return _vm_inet_httpd_write(hc_handle,buf,content_size); + + return (VMINT32 )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ntoa.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ntoa.c new file mode 100644 index 00000000..30af8084 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_ntoa.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef char* (*_vm_inet_ntoa_t)(IN_ADDR in); +_vm_inet_ntoa_t _vm_inet_ntoa = NULL; + +char* vm_inet_ntoa(IN_ADDR in) +{ + if (NULL == _vm_inet_ntoa) + _vm_inet_ntoa = (_vm_inet_ntoa_t)vm_get_sym_entry("vm_inet_ntoa"); + if (NULL != _vm_inet_ntoa) + return _vm_inet_ntoa(in); + return (char*)NULL; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_register_cb.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_register_cb.c new file mode 100644 index 00000000..79cd2bb2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_register_cb.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmrtspd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_rtspd_error_enum (*_vm_inet_rtspd_register_cb_t)(VM_RTSPD_CB callback); +_vm_inet_rtspd_register_cb_t _vm_inet_rtspd_register_cb = NULL; + +vm_rtspd_error_enum vm_inet_rtspd_register_cb(VM_RTSPD_CB callback) +{ + if (NULL == _vm_inet_rtspd_register_cb) + _vm_inet_rtspd_register_cb = (_vm_inet_rtspd_register_cb_t)vm_get_sym_entry("vm_inet_rtspd_register_cb"); + + if (NULL != _vm_inet_rtspd_register_cb) + return _vm_inet_rtspd_register_cb(callback); + + return (vm_rtspd_error_enum)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_restart.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_restart.c new file mode 100644 index 00000000..4f21649e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_restart.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmrtspd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_rtspd_error_enum (*_vm_inet_rtspd_restart_t)(VMUINT32 port, VMCHAR* root_dir); +_vm_inet_rtspd_restart_t _vm_inet_rtspd_restart = NULL; + +vm_rtspd_error_enum vm_inet_rtspd_restart(VMUINT32 port, VMCHAR* root_dir) +{ + if (NULL == _vm_inet_rtspd_restart) + _vm_inet_rtspd_restart = (_vm_inet_rtspd_restart_t)vm_get_sym_entry("vm_inet_rtspd_restart"); + + if (NULL != _vm_inet_rtspd_restart) + return _vm_inet_rtspd_restart(port,root_dir); + + return (vm_rtspd_error_enum)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_set_stream_identify.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_set_stream_identify.c new file mode 100644 index 00000000..e31c2421 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_set_stream_identify.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmrtspd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_inet_rtspd_set_stream_identify_t)(VMCHAR* stream_name); +_vm_inet_rtspd_set_stream_identify_t _vm_inet_rtspd_set_stream_identify = NULL; + +void vm_inet_rtspd_set_stream_identify(VMCHAR* stream_name) +{ + if (NULL == _vm_inet_rtspd_set_stream_identify) + _vm_inet_rtspd_set_stream_identify = (_vm_inet_rtspd_set_stream_identify_t)vm_get_sym_entry("vm_inet_rtspd_set_stream_identify"); + + if (NULL != _vm_inet_rtspd_set_stream_identify) + _vm_inet_rtspd_set_stream_identify(stream_name); + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_start.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_start.c new file mode 100644 index 00000000..c0b9e610 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_start.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmrtspd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_rtspd_error_enum (*_vm_inet_rtspd_start_t)(VMUINT32 port, VMCHAR* root_dir); +_vm_inet_rtspd_start_t _vm_inet_rtspd_start = NULL; + +vm_rtspd_error_enum vm_inet_rtspd_start(VMUINT32 port, VMCHAR* root_dir) +{ + if (NULL == _vm_inet_rtspd_start) + _vm_inet_rtspd_start = (_vm_inet_rtspd_start_t)vm_get_sym_entry("vm_inet_rtspd_start"); + + if (NULL != _vm_inet_rtspd_start) + return _vm_inet_rtspd_start(port,root_dir); + + return (vm_rtspd_error_enum)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_stop.c new file mode 100644 index 00000000..d36c66c3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_inet_rtspd_stop.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmrtspd.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_rtspd_error_enum (*_vm_inet_rtspd_stop_t)(void); +_vm_inet_rtspd_stop_t _vm_inet_rtspd_stop = NULL; + +vm_rtspd_error_enum vm_inet_rtspd_stop(void) +{ + if (NULL == _vm_inet_rtspd_stop) + _vm_inet_rtspd_stop = (_vm_inet_rtspd_stop_t)vm_get_sym_entry("vm_inet_rtspd_stop"); + + if (NULL != _vm_inet_rtspd_stop) + return _vm_inet_rtspd_stop(); + + return (vm_rtspd_error_enum)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_empty_stack.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_empty_stack.c new file mode 100644 index 00000000..cc54789c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_empty_stack.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_is_empty_stack_t)(VMINT stackHandle); +_vm_is_empty_stack_t _vm_is_empty_stack = NULL; + +VMINT vm_is_empty_stack(VMINT stackHandle) +{ + if (NULL == _vm_is_empty_stack) + _vm_is_empty_stack = (_vm_is_empty_stack_t)vm_get_sym_entry("vm_is_empty_stack"); + + if (NULL != _vm_is_empty_stack) + return _vm_is_empty_stack(stackHandle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_exist_stack.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_exist_stack.c new file mode 100644 index 00000000..e122a93b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_exist_stack.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_is_exist_stack_t)(VMINT stackHandle, void* ptr); +_vm_is_exist_stack_t _vm_is_exist_stack = NULL; + +VMINT vm_is_exist_stack(VMINT stackHandle, void* ptr) +{ + if (NULL == _vm_is_exist_stack) + _vm_is_exist_stack = (_vm_is_exist_stack_t)vm_get_sym_entry("vm_is_exist_stack"); + + if (NULL != _vm_is_exist_stack) + return _vm_is_exist_stack(stackHandle,ptr); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_camera_sensor.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_camera_sensor.c new file mode 100644 index 00000000..51c60827 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_camera_sensor.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_is_support_camera_sensor_t)(void); +_vm_is_support_camera_sensor_t _vm_is_support_camera_sensor = NULL; + +VMINT vm_is_support_camera_sensor(void) +{ + if (NULL == _vm_is_support_camera_sensor) + _vm_is_support_camera_sensor = (_vm_is_support_camera_sensor_t)vm_get_sym_entry("vm_is_support_camera_sensor"); + + if (NULL != _vm_is_support_camera_sensor) + return _vm_is_support_camera_sensor(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_gsensor.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_gsensor.c new file mode 100644 index 00000000..c961934b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_gsensor.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_is_support_gsensor_t)(void); +_vm_is_support_gsensor_t _vm_is_support_gsensor = NULL; + +VMINT vm_is_support_gsensor(void) +{ + if (NULL == _vm_is_support_gsensor) + _vm_is_support_gsensor = (_vm_is_support_gsensor_t)vm_get_sym_entry("vm_is_support_gsensor"); + + if (NULL != _vm_is_support_gsensor) + return _vm_is_support_gsensor(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_wifi.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_wifi.c new file mode 100644 index 00000000..b3959edc --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_is_support_wifi.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_is_support_wifi_t)(void); +_vm_is_support_wifi_t _vm_is_support_wifi = NULL; + +VMINT vm_is_support_wifi(void) +{ + if (NULL == _vm_is_support_wifi) + _vm_is_support_wifi = (_vm_is_support_wifi_t)vm_get_sym_entry("vm_is_support_wifi"); + + if (NULL != _vm_is_support_wifi) + return _vm_is_support_wifi(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_call.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_call.c new file mode 100644 index 00000000..cbe1efbf --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_call.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ivr_call_t)(vm_ivr_call_data* data); +_vm_ivr_call_t _vm_ivr_call = NULL; + +VMINT vm_ivr_call(vm_ivr_call_data* data) +{ + if (NULL == _vm_ivr_call) + _vm_ivr_call = (_vm_ivr_call_t)vm_get_sym_entry("vm_ivr_call"); + + if (NULL != _vm_ivr_call) + return _vm_ivr_call(data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_dial_number.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_dial_number.c new file mode 100644 index 00000000..4706415c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_dial_number.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ivr_dial_number_t)(VMCHAR number); +_vm_ivr_dial_number_t _vm_ivr_dial_number = NULL; + +VMINT vm_ivr_dial_number(VMCHAR number) +{ + if (NULL == _vm_ivr_dial_number) + _vm_ivr_dial_number = (_vm_ivr_dial_number_t)vm_get_sym_entry("vm_ivr_dial_number"); + + if (NULL != _vm_ivr_dial_number) + return _vm_ivr_dial_number(number); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_end.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_end.c new file mode 100644 index 00000000..cfeb84bc --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ivr_end.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ivr_end_t)(void); +_vm_ivr_end_t _vm_ivr_end = NULL; + +VMINT vm_ivr_end(void) +{ + if (NULL == _vm_ivr_end) + _vm_ivr_end = (_vm_ivr_end_t)vm_get_sym_entry("vm_ivr_end"); + + if (NULL != _vm_ivr_end) + return _vm_ivr_end(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_listen.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_listen.c new file mode 100644 index 00000000..f46249ee --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_listen.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_listen_t)(int sock, int backlog); +_vm_listen_t _vm_listen = NULL; + +int vm_listen(int sock, int backlog) +{ + if (NULL == _vm_listen) + _vm_listen = (_vm_listen_t)vm_get_sym_entry("vm_listen"); + if (NULL != _vm_listen) + return _vm_listen(sock,backlog); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource.c new file mode 100644 index 00000000..6a6a3794 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmres.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8* (*_vm_load_resource_t)(char* res_name, VMINT* res_size); +_vm_load_resource_t _vm_load_resource = NULL; + +VMUINT8* vm_load_resource(char* res_name, VMINT* res_size) +{ + if (NULL == _vm_load_resource) + _vm_load_resource = (_vm_load_resource_t)vm_get_sym_entry("vm_load_resource"); + + if (NULL != _vm_load_resource) + return _vm_load_resource(res_name,res_size); + + return (VMUINT8* )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource_from_file.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource_from_file.c new file mode 100644 index 00000000..a56ed4ec --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource_from_file.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmres.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8* (*_vm_load_resource_from_file_t)(VMWSTR filename, char *res_name, VMINT *res_size); +_vm_load_resource_from_file_t _vm_load_resource_from_file = NULL; + +VMUINT8* vm_load_resource_from_file(VMWSTR filename, char *res_name, VMINT *res_size) +{ + if (NULL == _vm_load_resource_from_file) + _vm_load_resource_from_file = (_vm_load_resource_from_file_t)vm_get_sym_entry("vm_load_resource_from_file"); + + if (NULL != _vm_load_resource_from_file) + return _vm_load_resource_from_file(filename,res_name,res_size); + + return (VMUINT8* )0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource_use_outside_memory.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource_use_outside_memory.c new file mode 100644 index 00000000..a8c9d1ad --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_load_resource_use_outside_memory.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmres.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_load_resource_use_outside_memory_t)(VMWSTR filename, char *res_name, void* buffer, VMINT buffer_size, vm_res_read_hint_struct* hint); +_vm_load_resource_use_outside_memory_t _vm_load_resource_use_outside_memory = NULL; + +VMBOOL vm_load_resource_use_outside_memory(VMWSTR filename, char *res_name, void* buffer, VMINT buffer_size, vm_res_read_hint_struct* hint) +{ + if (NULL == _vm_load_resource_use_outside_memory) + _vm_load_resource_use_outside_memory = (_vm_load_resource_use_outside_memory_t)vm_get_sym_entry("vm_load_resource_use_outside_memory"); + + if (NULL != _vm_load_resource_use_outside_memory) + return _vm_load_resource_use_outside_memory(filename,res_name,buffer,buffer_size,hint); + + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_lower_case.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_lower_case.c new file mode 100644 index 00000000..67205b5b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_lower_case.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_lower_case_t)(char* dst, char* src); +_vm_lower_case_t _vm_lower_case = NULL; + +void vm_lower_case(char* dst, char* src) +{ + if (NULL == _vm_lower_case) + _vm_lower_case = (_vm_lower_case_t)vm_get_sym_entry("vm_lower_case"); + + if (NULL != _vm_lower_case) + _vm_lower_case(dst,src); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_magic_wrapper_for_customer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_magic_wrapper_for_customer.c new file mode 100644 index 00000000..a12db9b7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_magic_wrapper_for_customer.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmmagic.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_magic_wrapper_for_customer_t)(VMINT index, void* param, void* reserve); +_vm_magic_wrapper_for_customer_t _vm_magic_wrapper_for_customer = NULL; + +VMINT vm_magic_wrapper_for_customer(VMINT index, void* param, void* reserve) +{ + if (NULL == _vm_magic_wrapper_for_customer) + _vm_magic_wrapper_for_customer = (_vm_magic_wrapper_for_customer_t)vm_get_sym_entry("vm_magic_wrapper_for_customer"); + if (NULL != _vm_magic_wrapper_for_customer) + return _vm_magic_wrapper_for_customer(index,param,reserve); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc.c new file mode 100644 index 00000000..41a308ac --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void *(*_vm_malloc_t)(int size); +_vm_malloc_t _vm_malloc = NULL; + +void *vm_malloc(int size) +{ + if (NULL == _vm_malloc) + _vm_malloc = (_vm_malloc_t)vm_get_sym_entry("vm_malloc"); + + if (NULL != _vm_malloc) + return _vm_malloc(size); + return NULL; + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_nc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_nc.c new file mode 100644 index 00000000..71792379 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_nc.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void *(*_vm_malloc_nc_t)(int size); +_vm_malloc_nc_t _vm_malloc_nc = NULL; + +void *vm_malloc_nc(int size) +{ + if (NULL == _vm_malloc_nc) + _vm_malloc_nc = (_vm_malloc_nc_t)vm_get_sym_entry("vm_malloc_nc"); + + if (NULL != _vm_malloc_nc) + return _vm_malloc_nc(size); + else + return NULL; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_nc_topmost.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_nc_topmost.c new file mode 100644 index 00000000..cf7e31c7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_nc_topmost.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void *(*_vm_malloc_nc_topmost_t)(int size); +_vm_malloc_nc_topmost_t _vm_malloc_nc_topmost = NULL; + +void *vm_malloc_nc_topmost(int size) +{ + if (NULL == _vm_malloc_nc_topmost) + _vm_malloc_nc_topmost = (_vm_malloc_nc_topmost_t)vm_get_sym_entry("vm_malloc_nc_topmost"); + + if (NULL != _vm_malloc_nc_topmost) + return _vm_malloc_nc_topmost(size); + else + return NULL; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_topmost.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_topmost.c new file mode 100644 index 00000000..6cd0a3f8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_malloc_topmost.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void *(*_vm_malloc_topmost_t)(int size); +_vm_malloc_topmost_t _vm_malloc_topmost = NULL; + +void *vm_malloc_topmost(int size) +{ + if (NULL == _vm_malloc_topmost) + _vm_malloc_topmost = (_vm_malloc_topmost_t)vm_get_sym_entry("vm_malloc_topmost"); + + if (NULL != _vm_malloc_topmost) + return _vm_malloc_topmost(size); + return NULL; + + +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_memcpy.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_memcpy.c new file mode 100644 index 00000000..fe00188d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_memcpy.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_memcpy_t)(void* dst, void* src, VMINT count); +_vm_memcpy_t _vm_memcpy = NULL; + +void vm_memcpy(void* dst, void* src, VMINT count) +{ + if (NULL == _vm_memcpy) + _vm_memcpy = (_vm_memcpy_t)vm_get_sym_entry("vm_memcpy"); + + if (NULL != _vm_memcpy) + _vm_memcpy(dst,src,count); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_get_time.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_get_time.c new file mode 100644 index 00000000..829d2a25 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_get_time.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_midi_get_time_t)(VMINT handle, VMUINT *current_time); +_vm_midi_get_time_t _vm_midi_get_time = NULL; + +VMINT vm_midi_get_time(VMINT handle, VMUINT *current_time) +{ + if (NULL == _vm_midi_get_time) + _vm_midi_get_time = (_vm_midi_get_time_t)vm_get_sym_entry("vm_midi_get_time"); + + if (NULL != _vm_midi_get_time) + return _vm_midi_get_time(handle,current_time); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_pause.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_pause.c new file mode 100644 index 00000000..75ba4619 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_pause.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_midi_pause_t)(VMINT handle); +_vm_midi_pause_t _vm_midi_pause = NULL; + +VMINT vm_midi_pause(VMINT handle) +{ + if (NULL == _vm_midi_pause) + _vm_midi_pause = (_vm_midi_pause_t)vm_get_sym_entry("vm_midi_pause"); + + if (NULL != _vm_midi_pause) + return _vm_midi_pause(handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play.c new file mode 100644 index 00000000..1cdf6a07 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_midi_play_t)(VMINT resid, VMINT repeat, void (*f)(VMINT handle, VMINT event)); +_vm_midi_play_t _vm_midi_play = NULL; + +VMINT vm_midi_play(VMINT resid, VMINT repeat, void (*f)(VMINT handle, VMINT event)) +{ + if (NULL == _vm_midi_play) + _vm_midi_play = (_vm_midi_play_t)vm_get_sym_entry("vm_midi_play"); + + if (NULL != _vm_midi_play) + return _vm_midi_play(resid,repeat,f); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_by_bytes.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_by_bytes.c new file mode 100644 index 00000000..15bb6a02 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_by_bytes.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_midi_play_by_bytes_t)( VMUINT8 * midibuf, VMINT len, VMINT repeat, void (*f)(VMINT handle, VMINT event) ); +_vm_midi_play_by_bytes_t _vm_midi_play_by_bytes = NULL; + +VMINT vm_midi_play_by_bytes( VMUINT8 * midibuf, VMINT len, VMINT repeat, void (*f)(VMINT handle, VMINT event) ) +{ + if (NULL == _vm_midi_play_by_bytes) + _vm_midi_play_by_bytes = (_vm_midi_play_by_bytes_t)vm_get_sym_entry("vm_midi_play_by_bytes"); + + if (NULL != _vm_midi_play_by_bytes) + return _vm_midi_play_by_bytes(midibuf,len,repeat,f); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_by_bytes_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_by_bytes_ex.c new file mode 100644 index 00000000..30753e46 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_by_bytes_ex.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_midi_play_by_bytes_ex_t)( VMUINT8 * midibuf, VMINT len, VMUINT start_time, VMINT repeat, VMUINT path, void (*f)(VMINT handle, VMINT event) ); +_vm_midi_play_by_bytes_ex_t _vm_midi_play_by_bytes_ex = NULL; + +VMINT vm_midi_play_by_bytes_ex( VMUINT8 * midibuf, VMINT len, VMUINT start_time, VMINT repeat, VMUINT path, void (*f)(VMINT handle, VMINT event) ) +{ + if (NULL == _vm_midi_play_by_bytes_ex) + _vm_midi_play_by_bytes_ex = (_vm_midi_play_by_bytes_ex_t)vm_get_sym_entry("vm_midi_play_by_bytes_ex"); + + if (NULL != _vm_midi_play_by_bytes_ex) + return _vm_midi_play_by_bytes_ex(midibuf,len,start_time,repeat,path,f); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_ex.c new file mode 100644 index 00000000..123dbbec --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_play_ex.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_midi_play_ex_t)(VMINT resid, VMUINT start_time, VMINT repeat, VMUINT path, void (*f)(VMINT handle, VMINT event)); +_vm_midi_play_ex_t _vm_midi_play_ex = NULL; + +VMINT vm_midi_play_ex(VMINT resid, VMUINT start_time, VMINT repeat, VMUINT path, void (*f)(VMINT handle, VMINT event)) +{ + if (NULL == _vm_midi_play_ex) + _vm_midi_play_ex = (_vm_midi_play_ex_t)vm_get_sym_entry("vm_midi_play_ex"); + + if (NULL != _vm_midi_play_ex) + return _vm_midi_play_ex(resid,start_time,repeat,path,f); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_resume.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_resume.c new file mode 100644 index 00000000..6baf3bc2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_resume.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_midi_resume_t)(VMINT handle); +_vm_midi_resume_t _vm_midi_resume = NULL; + +VMINT vm_midi_resume(VMINT handle) +{ + if (NULL == _vm_midi_resume) + _vm_midi_resume = (_vm_midi_resume_t)vm_get_sym_entry("vm_midi_resume"); + + if (NULL != _vm_midi_resume) + return _vm_midi_resume(handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_set_type.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_set_type.c new file mode 100644 index 00000000..a74b2da9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_set_type.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_midi_set_type_t)(VMINT type); +_vm_midi_set_type_t _vm_midi_set_type = NULL; + +void vm_midi_set_type(VMINT type) +{ + if (NULL == _vm_midi_set_type) + _vm_midi_set_type = (_vm_midi_set_type_t)vm_get_sym_entry("vm_midi_set_type"); + + if (NULL != _vm_midi_set_type) + _vm_midi_set_type(type); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_stop.c new file mode 100644 index 00000000..fd80b842 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_stop.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_midi_stop_t)(VMINT handle); +_vm_midi_stop_t _vm_midi_stop = NULL; + +void vm_midi_stop(VMINT handle) +{ + if (NULL == _vm_midi_stop) + _vm_midi_stop = (_vm_midi_stop_t)vm_get_sym_entry("vm_midi_stop"); + + if (NULL != _vm_midi_stop) + _vm_midi_stop(handle); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_stop_all.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_stop_all.c new file mode 100644 index 00000000..00316385 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_midi_stop_all.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_midi_stop_all_t)(void); +_vm_midi_stop_all_t _vm_midi_stop_all = NULL; + +void vm_midi_stop_all(void) +{ + if (NULL == _vm_midi_stop_all) + _vm_midi_stop_all = (_vm_midi_stop_all_t)vm_get_sym_entry("vm_midi_stop_all"); + + if (NULL != _vm_midi_stop_all) + _vm_midi_stop_all(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_cancel_download.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_cancel_download.c new file mode 100644 index 00000000..e8696247 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_cancel_download.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmmms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_mms_cancel_download_t)(VMINT msg_id); +_vm_mms_cancel_download_t _vm_mms_cancel_download = NULL; + +void vm_mms_cancel_download(VMINT msg_id) +{ + if (NULL == _vm_mms_cancel_download) + _vm_mms_cancel_download = (_vm_mms_cancel_download_t)vm_get_sym_entry("vm_mms_cancel_download"); + + if (NULL != _vm_mms_cancel_download) + _vm_mms_cancel_download(msg_id); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_cancel_send_mms.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_cancel_send_mms.c new file mode 100644 index 00000000..e3d2fcdf --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_cancel_send_mms.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_mms_cancel_send_mms_t)(void); +_vm_mms_cancel_send_mms_t _vm_mms_cancel_send_mms = NULL; + +void vm_mms_cancel_send_mms(void) +{ + if (NULL == _vm_mms_cancel_send_mms) + _vm_mms_cancel_send_mms = (_vm_mms_cancel_send_mms_t)vm_get_sym_entry("vm_mms_cancel_send_mms"); + + if (NULL != _vm_mms_cancel_send_mms) + _vm_mms_cancel_send_mms(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_clear_interrupt_event_handler.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_clear_interrupt_event_handler.c new file mode 100644 index 00000000..3cd1f929 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_clear_interrupt_event_handler.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_mms_clear_interrupt_event_handler_t)(vm_mms_event_enum event); +_vm_mms_clear_interrupt_event_handler_t _vm_mms_clear_interrupt_event_handler = NULL; + +VMINT vm_mms_clear_interrupt_event_handler(vm_mms_event_enum event) +{ + if (NULL == _vm_mms_clear_interrupt_event_handler) + _vm_mms_clear_interrupt_event_handler = (_vm_mms_clear_interrupt_event_handler_t)vm_get_sym_entry("vm_mms_clear_interrupt_event_handler"); + + if (NULL != _vm_mms_clear_interrupt_event_handler) + return _vm_mms_clear_interrupt_event_handler(event); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_delete.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_delete.c new file mode 100644 index 00000000..1cf25582 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_delete.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmmms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_mms_delete_t)(VMUINT* msg_id_list, VMUINT msg_num, vm_mms_folder_enum folder, vm_mms_delete_callback callback,void* user_data); +_vm_mms_delete_t _vm_mms_delete = NULL; + +VMINT vm_mms_delete(VMUINT* msg_id_list, VMUINT msg_num, vm_mms_folder_enum folder, vm_mms_delete_callback callback,void* user_data) +{ + if (NULL == _vm_mms_delete) + _vm_mms_delete = (_vm_mms_delete_t)vm_get_sym_entry("vm_mms_delete"); + + if (NULL != _vm_mms_delete) + return _vm_mms_delete(msg_id_list,msg_num,folder,callback,user_data); + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_download.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_download.c new file mode 100644 index 00000000..18ca76a6 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_download.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_mms_download_t)(VMUINT msg_id, vm_mms_sim_id_enum sim, vm_mms_msg_storage_type_enum storage_type); +_vm_mms_download_t _vm_mms_download = NULL; + +VMINT vm_mms_download(VMUINT msg_id, vm_mms_sim_id_enum sim, vm_mms_msg_storage_type_enum storage_type) +{ + if (NULL == _vm_mms_download) + _vm_mms_download = (_vm_mms_download_t)vm_get_sym_entry("vm_mms_download"); + + if (NULL != _vm_mms_download) + return _vm_mms_download(msg_id,sim,storage_type ); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_get_content.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_get_content.c new file mode 100644 index 00000000..594b2fde --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_get_content.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmmms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_mms_get_content_t)(vm_mms_get_content_req_struct *req_data); +_vm_mms_get_content_t _vm_mms_get_content = NULL; + +VMINT vm_mms_get_content(vm_mms_get_content_req_struct *req_data) +{ + if (NULL == _vm_mms_get_content) + _vm_mms_get_content = (_vm_mms_get_content_t)vm_get_sym_entry("vm_mms_get_content"); + + if (NULL != _vm_mms_get_content) + return _vm_mms_get_content(req_data); + + return (VMINT)-1; +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_get_msg_id_list.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_get_msg_id_list.c new file mode 100644 index 00000000..e59cfaab --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_get_msg_id_list.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmmms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_mms_get_msg_id_list_t)(vm_mms_folder_enum folder, vm_mms_get_msg_id_list_callback_type callback, void* user_data); +_vm_mms_get_msg_id_list_t _vm_mms_get_msg_id_list = NULL; + +VMINT vm_mms_get_msg_id_list(vm_mms_folder_enum folder, vm_mms_get_msg_id_list_callback_type callback, void* user_data) +{ + if (NULL == _vm_mms_get_msg_id_list) + _vm_mms_get_msg_id_list = (_vm_mms_get_msg_id_list_t)vm_get_sym_entry("vm_mms_get_msg_id_list"); + + if (NULL != _vm_mms_get_msg_id_list) + return _vm_mms_get_msg_id_list(folder,callback, user_data); + + return (VMINT)-1; +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_launch.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_launch.c new file mode 100644 index 00000000..827e0d15 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_launch.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_mms_launch_t)(vm_mms_launch_data* data, VMINT data_size); +_vm_mms_launch_t _vm_mms_launch = NULL; + +VMINT vm_mms_launch(vm_mms_launch_data* data, VMINT data_size) +{ + if (NULL == _vm_mms_launch) + _vm_mms_launch = (_vm_mms_launch_t)vm_get_sym_entry("vm_mms_launch"); + + if (NULL != _vm_mms_launch) + return _vm_mms_launch(data,data_size); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_send_mms.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_send_mms.c new file mode 100644 index 00000000..54a222e2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_send_mms.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_mms_send_mms_t)(vm_send_mms_req_t * req_ptr, vm_mms_callback_type callback); +_vm_mms_send_mms_t _vm_mms_send_mms = NULL; + +VMINT vm_mms_send_mms(vm_send_mms_req_t * req_ptr, vm_mms_callback_type callback) +{ + if (NULL == _vm_mms_send_mms) + _vm_mms_send_mms = (_vm_mms_send_mms_t)vm_get_sym_entry("vm_mms_send_mms"); + + if (NULL != _vm_mms_send_mms) + return _vm_mms_send_mms(req_ptr,callback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_set_interrupt_event_handler.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_set_interrupt_event_handler.c new file mode 100644 index 00000000..27dea822 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mms_set_interrupt_event_handler.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_mms_set_interrupt_event_handler_t)(vm_mms_event_enum event, vm_mms_interrupt_callback callback, void* user_data); +_vm_mms_set_interrupt_event_handler_t _vm_mms_set_interrupt_event_handler = NULL; + +VMINT vm_mms_set_interrupt_event_handler(vm_mms_event_enum event, vm_mms_interrupt_callback callback, void* user_data) +{ + if (NULL == _vm_mms_set_interrupt_event_handler) + _vm_mms_set_interrupt_event_handler = (_vm_mms_set_interrupt_event_handler_t)vm_get_sym_entry("vm_mms_set_interrupt_event_handler"); + + if (NULL != _vm_mms_set_interrupt_event_handler) + return _vm_mms_set_interrupt_event_handler(event,callback,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mode_block.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mode_block.c new file mode 100644 index 00000000..afbb612c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mode_block.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmpwr.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_mode_block_t)(void); +_vm_mode_block_t _vm_mode_block = NULL; +void vm_mode_block(void) +{ + if (NULL == _vm_mode_block) + _vm_mode_block = (_vm_mode_block_t)vm_get_sym_entry("vm_mode_block"); + + if (NULL != _vm_mode_block) + _vm_mode_block(); +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mode_unblock.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mode_unblock.c new file mode 100644 index 00000000..da4e6d0c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_mode_unblock.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmpwr.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_mode_unblock_t)(void); +_vm_mode_unblock_t _vm_mode_unblock = NULL; +void vm_mode_unblock(void) +{ + if (NULL == _vm_mode_unblock) + _vm_mode_unblock = (_vm_mode_unblock_t)vm_get_sym_entry("vm_mode_unblock"); + + if (NULL != _vm_mode_unblock) + _vm_mode_unblock(); +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_nvram_get_data.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_nvram_get_data.c new file mode 100644 index 00000000..cd72f40f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_nvram_get_data.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmnvram.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_nvram_get_data_t)(vm_nvram_sensor_lid id, void* buff, VMUINT size); +_vm_nvram_get_data_t _vm_nvram_get_data = NULL; +VMINT vm_nvram_get_data(vm_nvram_sensor_lid id, void* buff, VMUINT size) +{ + if (NULL == _vm_nvram_get_data) + _vm_nvram_get_data = (_vm_nvram_get_data_t)vm_get_sym_entry("vm_nvram_get_data"); + + if (NULL != _vm_nvram_get_data) + return _vm_nvram_get_data(id, buff, size); + + return -1; +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_nvram_set_data.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_nvram_set_data.c new file mode 100644 index 00000000..a903738c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_nvram_set_data.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmnvram.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_nvram_set_data_t)(vm_nvram_sensor_lid id, void* buff, VMUINT size); +_vm_nvram_set_data_t _vm_nvram_set_data = NULL; +VMINT vm_nvram_set_data(vm_nvram_sensor_lid id, void* buff, VMUINT size) +{ + if (NULL == _vm_nvram_set_data) + _vm_nvram_set_data = (_vm_nvram_set_data_t)vm_get_sym_entry("vm_nvram_set_data"); + + if (NULL != _vm_nvram_set_data) + return _vm_nvram_set_data(id, buff, size); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_peek_stack.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_peek_stack.c new file mode 100644 index 00000000..33397d1f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_peek_stack.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_peek_stack_t)(VMINT stackHandle, void** ptr); +_vm_peek_stack_t _vm_peek_stack = NULL; + +VMINT vm_peek_stack(VMINT stackHandle, void** ptr) +{ + if (NULL == _vm_peek_stack) + _vm_peek_stack = (_vm_peek_stack_t)vm_get_sym_entry("vm_peek_stack"); + + if (NULL != _vm_peek_stack) + return _vm_peek_stack(stackHandle,ptr); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_add_contact.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_add_contact.c new file mode 100644 index 00000000..6abbef87 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_add_contact.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_phb_req_error_enum (*_vm_phb_add_contact_t)(vm_phb_add_req_struct *req_info, vm_phb_callback_type cb); +_vm_phb_add_contact_t _vm_phb_add_contact = NULL; + +vm_phb_req_error_enum vm_phb_add_contact(vm_phb_add_req_struct *req_info, vm_phb_callback_type cb) +{ + vm_phb_req_error_enum ret = {-1}; + if (NULL == _vm_phb_add_contact) + _vm_phb_add_contact = (_vm_phb_add_contact_t)vm_get_sym_entry("vm_phb_add_contact"); + + if (NULL != _vm_phb_add_contact) + return _vm_phb_add_contact(req_info,cb); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_delete_contact.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_delete_contact.c new file mode 100644 index 00000000..2a6f77c7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_delete_contact.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_phb_req_error_enum (*_vm_phb_delete_contact_t)(vm_phb_delete_req_struct *req_info, vm_phb_callback_type cb); +_vm_phb_delete_contact_t _vm_phb_delete_contact = NULL; + +vm_phb_req_error_enum vm_phb_delete_contact(vm_phb_delete_req_struct *req_info, vm_phb_callback_type cb) +{ + vm_phb_req_error_enum ret = {-1}; + if (NULL == _vm_phb_delete_contact) + _vm_phb_delete_contact = (_vm_phb_delete_contact_t)vm_get_sym_entry("vm_phb_delete_contact"); + + if (NULL != _vm_phb_delete_contact) + return _vm_phb_delete_contact(req_info,cb); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_contact.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_contact.c new file mode 100644 index 00000000..5e3850ec --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_contact.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_phb_req_error_enum (*_vm_phb_get_contact_t)(vm_phb_get_req_struct *req_info, vm_phb_callback_type cb); +_vm_phb_get_contact_t _vm_phb_get_contact = NULL; + +vm_phb_req_error_enum vm_phb_get_contact(vm_phb_get_req_struct *req_info, vm_phb_callback_type cb) +{ + vm_phb_req_error_enum ret = {-1}; + if (NULL == _vm_phb_get_contact) + _vm_phb_get_contact = (_vm_phb_get_contact_t)vm_get_sym_entry("vm_phb_get_contact"); + + if (NULL != _vm_phb_get_contact) + return _vm_phb_get_contact(req_info,cb); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_contact_syn.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_contact_syn.c new file mode 100644 index 00000000..14dcfc7f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_contact_syn.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_phb_req_error_enum (*_vm_phb_get_contact_syn_t)(vm_phb_get_req_struct *req_info); +_vm_phb_get_contact_syn_t _vm_phb_get_contact_syn = NULL; + +vm_phb_req_error_enum vm_phb_get_contact_syn(vm_phb_get_req_struct *req_info) +{ + vm_phb_req_error_enum ret = {-1}; + if (NULL == _vm_phb_get_contact_syn) + _vm_phb_get_contact_syn = (_vm_phb_get_contact_syn_t)vm_get_sym_entry("vm_phb_get_contact_syn"); + + if (NULL != _vm_phb_get_contact_syn) + return _vm_phb_get_contact_syn(req_info); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_list.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_list.c new file mode 100644 index 00000000..5c3f2ac9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_list.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_phb_get_group_list_t)(vm_phb_group_struct *group_array, VMINT group_array_len); +_vm_phb_get_group_list_t _vm_phb_get_group_list = NULL; + +VMINT vm_phb_get_group_list(vm_phb_group_struct *group_array, VMINT group_array_len) +{ + if (NULL == _vm_phb_get_group_list) + _vm_phb_get_group_list = (_vm_phb_get_group_list_t)vm_get_sym_entry("vm_phb_get_group_list"); + + if (NULL != _vm_phb_get_group_list) + return _vm_phb_get_group_list(group_array,group_array_len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_list_count.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_list_count.c new file mode 100644 index 00000000..ced51de3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_list_count.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_phb_get_group_list_count_t)(void); +_vm_phb_get_group_list_count_t _vm_phb_get_group_list_count = NULL; + +VMINT vm_phb_get_group_list_count(void) +{ + if (NULL == _vm_phb_get_group_list_count) + _vm_phb_get_group_list_count = (_vm_phb_get_group_list_count_t)vm_get_sym_entry("vm_phb_get_group_list_count"); + + if (NULL != _vm_phb_get_group_list_count) + return _vm_phb_get_group_list_count(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_name_by_id.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_name_by_id.c new file mode 100644 index 00000000..726fa310 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_group_name_by_id.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_phb_get_group_name_by_id_t)(VMUINT group_id, VMWCHAR *group_name, VMINT len); +_vm_phb_get_group_name_by_id_t _vm_phb_get_group_name_by_id = NULL; + +VMINT vm_phb_get_group_name_by_id(VMUINT group_id, VMWCHAR *group_name, VMINT len) +{ + if (NULL == _vm_phb_get_group_name_by_id) + _vm_phb_get_group_name_by_id = (_vm_phb_get_group_name_by_id_t)vm_get_sym_entry("vm_phb_get_group_name_by_id"); + + if (NULL != _vm_phb_get_group_name_by_id) + return _vm_phb_get_group_name_by_id(group_id,group_name,len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_total_contacts.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_total_contacts.c new file mode 100644 index 00000000..688c3508 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_total_contacts.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_phb_get_total_contacts_t)(vm_phb_storage_loc_enum storage); +_vm_phb_get_total_contacts_t _vm_phb_get_total_contacts = NULL; + +VMINT vm_phb_get_total_contacts(vm_phb_storage_loc_enum storage) +{ + if (NULL == _vm_phb_get_total_contacts) + _vm_phb_get_total_contacts = (_vm_phb_get_total_contacts_t)vm_get_sym_entry("vm_phb_get_total_contacts"); + + if (NULL != _vm_phb_get_total_contacts) + return _vm_phb_get_total_contacts(storage); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_used_contacts.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_used_contacts.c new file mode 100644 index 00000000..5a221e15 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_used_contacts.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_phb_get_used_contacts_t)(vm_phb_contact_pos_struct *pos_array, vm_phb_storage_loc_enum storage); +_vm_phb_get_used_contacts_t _vm_phb_get_used_contacts = NULL; + +VMINT vm_phb_get_used_contacts(vm_phb_contact_pos_struct *pos_array, vm_phb_storage_loc_enum storage) +{ + if (NULL == _vm_phb_get_used_contacts) + _vm_phb_get_used_contacts = (_vm_phb_get_used_contacts_t)vm_get_sym_entry("vm_phb_get_used_contacts"); + + if (NULL != _vm_phb_get_used_contacts) + return _vm_phb_get_used_contacts(pos_array,storage); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_used_contacts_count.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_used_contacts_count.c new file mode 100644 index 00000000..163d53a4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_get_used_contacts_count.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_phb_get_used_contacts_count_t)(vm_phb_storage_loc_enum storage); +_vm_phb_get_used_contacts_count_t _vm_phb_get_used_contacts_count = NULL; + +VMINT vm_phb_get_used_contacts_count(vm_phb_storage_loc_enum storage) +{ + if (NULL == _vm_phb_get_used_contacts_count) + _vm_phb_get_used_contacts_count = (_vm_phb_get_used_contacts_count_t)vm_get_sym_entry("vm_phb_get_used_contacts_count"); + + if (NULL != _vm_phb_get_used_contacts_count) + return _vm_phb_get_used_contacts_count(storage); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact.c new file mode 100644 index 00000000..31bc8220 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_phb_req_error_enum (*_vm_phb_search_contact_t)(vm_phb_search_req_struct *req_info, vm_phb_callback_type cb); +_vm_phb_search_contact_t _vm_phb_search_contact = NULL; + +vm_phb_req_error_enum vm_phb_search_contact(vm_phb_search_req_struct *req_info, vm_phb_callback_type cb) +{ + vm_phb_req_error_enum ret = {-1}; + if (NULL == _vm_phb_search_contact) + _vm_phb_search_contact = (_vm_phb_search_contact_t)vm_get_sym_entry("vm_phb_search_contact"); + + if (NULL != _vm_phb_search_contact) + return _vm_phb_search_contact(req_info,cb); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact_list.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact_list.c new file mode 100644 index 00000000..8a3b26f1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact_list.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_phb_search_contact_list_t)( vm_phb_search_list_req_struct *req_info, vm_phb_contact_pos_struct *pos_array, VMINT post_array_len); +_vm_phb_search_contact_list_t _vm_phb_search_contact_list = NULL; + +VMINT vm_phb_search_contact_list( vm_phb_search_list_req_struct *req_info, vm_phb_contact_pos_struct *pos_array, VMINT post_array_len) +{ + if (NULL == _vm_phb_search_contact_list) + _vm_phb_search_contact_list = (_vm_phb_search_contact_list_t)vm_get_sym_entry("vm_phb_search_contact_list"); + + if (NULL != _vm_phb_search_contact_list) + return _vm_phb_search_contact_list(req_info,pos_array,post_array_len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact_syn.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact_syn.c new file mode 100644 index 00000000..534fad6a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_search_contact_syn.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_phb_req_error_enum (*_vm_phb_search_contact_syn_t)(vm_phb_search_req_struct *req_info); +_vm_phb_search_contact_syn_t _vm_phb_search_contact_syn = NULL; + +vm_phb_req_error_enum vm_phb_search_contact_syn(vm_phb_search_req_struct *req_info) +{ + vm_phb_req_error_enum ret = {-1}; + if (NULL == _vm_phb_search_contact_syn) + _vm_phb_search_contact_syn = (_vm_phb_search_contact_syn_t)vm_get_sym_entry("vm_phb_search_contact_syn"); + + if (NULL != _vm_phb_search_contact_syn) + return _vm_phb_search_contact_syn(req_info); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_update_contact.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_update_contact.c new file mode 100644 index 00000000..88e4e1f8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_phb_update_contact.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmcontact.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_phb_req_error_enum (*_vm_phb_update_contact_t)(vm_phb_update_req_struct *req_info, vm_phb_callback_type cb); +_vm_phb_update_contact_t _vm_phb_update_contact = NULL; + +vm_phb_req_error_enum vm_phb_update_contact(vm_phb_update_req_struct *req_info, vm_phb_callback_type cb) +{ + vm_phb_req_error_enum ret = {-1}; + if (NULL == _vm_phb_update_contact) + _vm_phb_update_contact = (_vm_phb_update_contact_t)vm_get_sym_entry("vm_phb_update_contact"); + + if (NULL != _vm_phb_update_contact) + return _vm_phb_update_contact(req_info,cb); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_delete_process.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_delete_process.c new file mode 100644 index 00000000..809621d5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_delete_process.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pmng_delete_process_t)(VM_P_HANDLE p_handle); +_vm_pmng_delete_process_t _vm_pmng_delete_process = NULL; +VMINT vm_pmng_delete_process(VM_P_HANDLE p_handle) +{ + if (_vm_pmng_delete_process == NULL) + _vm_pmng_delete_process = (_vm_pmng_delete_process_t)vm_get_sym_entry("vm_pmng_delete_process"); + if (_vm_pmng_delete_process != NULL) + return _vm_pmng_delete_process(p_handle); + return -1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_app_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_app_handle.c new file mode 100644 index 00000000..9839f638 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_app_handle.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pmng_get_app_handle_t)(void); +_vm_pmng_get_app_handle_t _vm_pmng_get_app_handle = NULL; + +VMINT vm_pmng_get_app_handle(void) +{ + if (NULL == _vm_pmng_get_app_handle) + _vm_pmng_get_app_handle = (_vm_pmng_get_app_handle_t)vm_get_sym_entry("vm_pmng_get_app_handle"); + + if (NULL != _vm_pmng_get_app_handle) + return _vm_pmng_get_app_handle(); + + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_current_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_current_handle.c new file mode 100644 index 00000000..c809ae51 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_current_handle.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_P_HANDLE (*_vm_pmng_get_current_handle_t)(void); +_vm_pmng_get_current_handle_t _vm_pmng_get_current_handle = NULL; + +VM_P_HANDLE vm_pmng_get_current_handle(void) +{ + VM_P_HANDLE ret = {-1}; + if (NULL == _vm_pmng_get_current_handle) + _vm_pmng_get_current_handle = (_vm_pmng_get_current_handle_t)vm_get_sym_entry("vm_pmng_get_current_handle"); + + if (NULL != _vm_pmng_get_current_handle) + return _vm_pmng_get_current_handle(); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_handle.c new file mode 100644 index 00000000..014304c2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_get_handle.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_P_HANDLE (*_vm_pmng_get_handle_t)(VMWSTR file_name); +_vm_pmng_get_handle_t _vm_pmng_get_handle = NULL; + +VM_P_HANDLE vm_pmng_get_handle(VMWSTR file_name) +{ + VM_P_HANDLE ret = {-1}; + if (NULL == _vm_pmng_get_handle) + _vm_pmng_get_handle = (_vm_pmng_get_handle_t)vm_get_sym_entry("vm_pmng_get_handle"); + + if (NULL != _vm_pmng_get_handle) + return _vm_pmng_get_handle(file_name); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_reset_ctx.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_reset_ctx.c new file mode 100644 index 00000000..8d263dfd --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_reset_ctx.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pmng_reset_ctx_t)(void); +_vm_pmng_reset_ctx_t _vm_pmng_reset_ctx = NULL; + +VMINT vm_pmng_reset_ctx(void) +{ + if (NULL == _vm_pmng_reset_ctx) + _vm_pmng_reset_ctx = (_vm_pmng_reset_ctx_t)vm_get_sym_entry("vm_pmng_reset_ctx"); + + if (NULL != _vm_pmng_reset_ctx) + return _vm_pmng_reset_ctx(); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_restore_default_event_filter.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_restore_default_event_filter.c new file mode 100644 index 00000000..087a1543 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_restore_default_event_filter.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pmng_restore_default_event_filter_t)(void); +_vm_pmng_restore_default_event_filter_t _vm_pmng_restore_default_event_filter = NULL; + +VMINT vm_pmng_restore_default_event_filter(void) +{ + if (NULL == _vm_pmng_restore_default_event_filter) + _vm_pmng_restore_default_event_filter = (_vm_pmng_restore_default_event_filter_t)vm_get_sym_entry("vm_pmng_restore_default_event_filter"); + + if (NULL != _vm_pmng_restore_default_event_filter) + return _vm_pmng_restore_default_event_filter(); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_send_app_sys_event.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_send_app_sys_event.c new file mode 100644 index 00000000..e46d8e77 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_send_app_sys_event.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pmng_send_app_sys_event_t)(VM_PROCESS_STATUS pmng_status); +_vm_pmng_send_app_sys_event_t _vm_pmng_send_app_sys_event = NULL; + +VMINT vm_pmng_send_app_sys_event(VM_PROCESS_STATUS pmng_status) +{ + if (NULL == _vm_pmng_send_app_sys_event) + _vm_pmng_send_app_sys_event = (_vm_pmng_send_app_sys_event_t)vm_get_sym_entry("vm_pmng_send_app_sys_event"); + + if (NULL != _vm_pmng_send_app_sys_event) + return _vm_pmng_send_app_sys_event(pmng_status); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_bg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_bg.c new file mode 100644 index 00000000..f2880e7e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_bg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pmng_set_bg_t)(void); +_vm_pmng_set_bg_t _vm_pmng_set_bg = NULL; + +VMINT vm_pmng_set_bg(void) +{ + if (NULL == _vm_pmng_set_bg) + _vm_pmng_set_bg = (_vm_pmng_set_bg_t)vm_get_sym_entry("vm_pmng_set_bg"); + + if (NULL != _vm_pmng_set_bg) + return _vm_pmng_set_bg(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_ctx.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_ctx.c new file mode 100644 index 00000000..930aef2a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_ctx.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pmng_set_ctx_t)(VM_P_HANDLE p_handle); +_vm_pmng_set_ctx_t _vm_pmng_set_ctx = NULL; + +VMINT vm_pmng_set_ctx(VM_P_HANDLE p_handle) +{ + if (NULL == _vm_pmng_set_ctx) + _vm_pmng_set_ctx = (_vm_pmng_set_ctx_t)vm_get_sym_entry("vm_pmng_set_ctx"); + + if (NULL != _vm_pmng_set_ctx) + return _vm_pmng_set_ctx(p_handle); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_event_filter.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_event_filter.c new file mode 100644 index 00000000..e8ca705a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_event_filter.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pmng_set_event_filter_t)(_event_filter_t* be_filter); +_vm_pmng_set_event_filter_t _vm_pmng_set_event_filter = NULL; + +VMINT vm_pmng_set_event_filter(_event_filter_t* be_filter) +{ + if (NULL == _vm_pmng_set_event_filter) + _vm_pmng_set_event_filter = (_vm_pmng_set_event_filter_t)vm_get_sym_entry("vm_pmng_set_event_filter"); + + if (NULL != _vm_pmng_set_event_filter) + return _vm_pmng_set_event_filter(be_filter); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_fg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_fg.c new file mode 100644 index 00000000..04cce5c3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_set_fg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_P_HANDLE (*_vm_pmng_set_fg_t)(VMWSTR fileName); +_vm_pmng_set_fg_t _vm_pmng_set_fg = NULL; + +VM_P_HANDLE vm_pmng_set_fg(VMWSTR fileName) +{ + if (NULL == _vm_pmng_set_fg) + _vm_pmng_set_fg = (_vm_pmng_set_fg_t)vm_get_sym_entry("vm_pmng_set_fg"); + + if (NULL != _vm_pmng_set_fg) + return _vm_pmng_set_fg(fileName); + else + return (VM_P_HANDLE)VM_PMNG_NO_SCHEDULE; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_state.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_state.c new file mode 100644 index 00000000..e5fa11e7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pmng_state.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_PROCESS_STATUS (*_vm_pmng_state_t)(VM_P_HANDLE p_handle); +_vm_pmng_state_t _vm_pmng_state = NULL; +VM_PROCESS_STATUS vm_pmng_state(VM_P_HANDLE p_handle) +{ + if (_vm_pmng_state == NULL) + _vm_pmng_state = (_vm_pmng_state_t)vm_get_sym_entry("vm_pmng_state"); + if (_vm_pmng_state != NULL) + return _vm_pmng_state(p_handle); + return VM_PMNG_UNLOAD; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_dereg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_dereg.c new file mode 100644 index 00000000..370ca12a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_dereg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpn.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pn_dereg_t)(); +_vm_pn_dereg_t _vm_pn_dereg = NULL; + +VMINT vm_pn_dereg() +{ + if (NULL == _vm_pn_dereg) + _vm_pn_dereg = (_vm_pn_dereg_t)vm_get_sym_entry("vm_pn_dereg"); + + if (NULL != _vm_pn_dereg) + return _vm_pn_dereg(); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_global_setting.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_global_setting.c new file mode 100644 index 00000000..895134b6 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_global_setting.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpn.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pn_get_global_setting_t)(void); +_vm_pn_get_global_setting_t _vm_pn_get_global_setting = NULL; + +VMINT vm_pn_get_global_setting(void) +{ + if (NULL == _vm_pn_get_global_setting) + _vm_pn_get_global_setting = (_vm_pn_get_global_setting_t)vm_get_sym_entry("vm_pn_get_global_setting"); + + if (NULL != _vm_pn_get_global_setting) + return _vm_pn_get_global_setting(); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_mps_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_mps_info.c new file mode 100644 index 00000000..bcc6c11d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_mps_info.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpn.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pn_get_mps_info_t)(const VMCHAR * msgBody, vm_srv_pns_msg_mps_struct * mpsPtr); +_vm_pn_get_mps_info_t _vm_pn_get_mps_info = NULL; + +VMINT vm_pn_get_mps_info(const VMCHAR * msgBody, vm_srv_pns_msg_mps_struct * mpsPtr) +{ + if (NULL == _vm_pn_get_mps_info) + _vm_pn_get_mps_info = (_vm_pn_get_mps_info_t)vm_get_sym_entry("vm_pn_get_mps_info"); + + if (NULL != _vm_pn_get_mps_info) + return _vm_pn_get_mps_info(msgBody,mpsPtr); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_mps_info_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_mps_info_ex.c new file mode 100644 index 00000000..6047d34f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_mps_info_ex.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpn.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pn_get_mps_info_ex_t)(const VMCHAR * msgBody, vm_srv_pns_msg_mps_struct_ex* mpsPtr); +_vm_pn_get_mps_info_ex_t _vm_pn_get_mps_info_ex = NULL; + +VMINT vm_pn_get_mps_info_ex(const VMCHAR * msgBody, vm_srv_pns_msg_mps_struct_ex * mpsPtr) +{ + if (NULL == _vm_pn_get_mps_info_ex) + _vm_pn_get_mps_info_ex = (_vm_pn_get_mps_info_ex_t)vm_get_sym_entry("vm_pn_get_mps_info_ex"); + + if (NULL != _vm_pn_get_mps_info_ex) + return _vm_pn_get_mps_info_ex(msgBody,mpsPtr); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_object.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_object.c new file mode 100644 index 00000000..9b30f0cb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_get_object.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpn.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pn_get_object_t)(const VMCHAR * msgBody, const VMCHAR * key, vm_srv_pns_msg_value_struct * value); +_vm_pn_get_object_t _vm_pn_get_object = NULL; + +VMINT vm_pn_get_object(const VMCHAR * msgBody, const VMCHAR * key, vm_srv_pns_msg_value_struct * value) +{ + if (NULL == _vm_pn_get_object) + _vm_pn_get_object = (_vm_pn_get_object_t)vm_get_sym_entry("vm_pn_get_object"); + + if (NULL != _vm_pn_get_object) + return _vm_pn_get_object(msgBody,key,value); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_is_support.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_is_support.c new file mode 100644 index 00000000..3136cc15 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_is_support.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpn.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pn_is_support_t)(void); +_vm_pn_is_support_t _vm_pn_is_support = NULL; + +VMINT vm_pn_is_support(void) +{ + if (NULL == _vm_pn_is_support) + _vm_pn_is_support = (_vm_pn_is_support_t)vm_get_sym_entry("vm_pn_is_support"); + + if (NULL != _vm_pn_is_support) + return _vm_pn_is_support(); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_query.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_query.c new file mode 100644 index 00000000..a2fdd1b3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_query.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpn.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pn_query_t)(vm_srv_pns_query_event query_id, void * user_data); +_vm_pn_query_t _vm_pn_query = NULL; + +VMINT vm_pn_query(vm_srv_pns_query_event query_id, void * user_data) +{ + if (NULL == _vm_pn_query) + _vm_pn_query = (_vm_pn_query_t)vm_get_sym_entry("vm_pn_query"); + + if (NULL != _vm_pn_query) + return _vm_pn_query(query_id,user_data); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_reg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_reg.c new file mode 100644 index 00000000..8a2689e8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_reg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpn.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pn_reg_t)(vm_pn_cb cb, void* user_data); +_vm_pn_reg_t _vm_pn_reg = NULL; + +VMINT vm_pn_reg(vm_pn_cb cb, void* user_data) +{ + if (NULL == _vm_pn_reg) + _vm_pn_reg = (_vm_pn_reg_t)vm_get_sym_entry("vm_pn_reg"); + + if (NULL != _vm_pn_reg) + return _vm_pn_reg(cb,user_data); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_set_badge.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_set_badge.c new file mode 100644 index 00000000..e4f8de5a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_set_badge.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpn.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pn_set_badge_t)(VMINT32 badege_number); +_vm_pn_set_badge_t _vm_pn_set_badge = NULL; + +VMINT vm_pn_set_badge(VMINT32 badege_number) +{ + if (NULL == _vm_pn_set_badge) + _vm_pn_set_badge = (_vm_pn_set_badge_t)vm_get_sym_entry("vm_pn_set_badge"); + + if (NULL != _vm_pn_set_badge) + return _vm_pn_set_badge(badege_number); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_set_notify_style.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_set_notify_style.c new file mode 100644 index 00000000..54eae6e5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_pn_set_notify_style.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpn.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_pn_set_notify_style_t)(vm_srv_pns_notify_switch OnOff, vm_srv_pns_notify_style style); +_vm_pn_set_notify_style_t _vm_pn_set_notify_style = NULL; + +VMINT vm_pn_set_notify_style(vm_srv_pns_notify_switch OnOff, vm_srv_pns_notify_style style) +{ + if (NULL == _vm_pn_set_notify_style) + _vm_pn_set_notify_style = (_vm_pn_set_notify_style_t)vm_get_sym_entry("vm_pn_set_notify_style"); + + if (NULL != _vm_pn_set_notify_style) + return _vm_pn_set_notify_style(OnOff,style); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_popup_stack.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_popup_stack.c new file mode 100644 index 00000000..efe93bc1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_popup_stack.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_popup_stack_t)(VMINT stackHandle, void** ptr); +_vm_popup_stack_t _vm_popup_stack = NULL; + +VMINT vm_popup_stack(VMINT stackHandle, void** ptr) +{ + if (NULL == _vm_popup_stack) + _vm_popup_stack = (_vm_popup_stack_t)vm_get_sym_entry("vm_popup_stack"); + + if (NULL != _vm_popup_stack) + return _vm_popup_stack(stackHandle,ptr); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_post_msg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_post_msg.c new file mode 100644 index 00000000..286963c7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_post_msg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_post_msg_t)(VM_P_HANDLE phandle, VMUINT msg_id, VMINT wparam, VMINT lparam); +_vm_post_msg_t _vm_post_msg = NULL; + +VMINT vm_post_msg(VM_P_HANDLE phandle, VMUINT msg_id, VMINT wparam, VMINT lparam) +{ + if (NULL == _vm_post_msg) + _vm_post_msg = (_vm_post_msg_t)vm_get_sym_entry("vm_post_msg"); + + if (NULL != _vm_post_msg) + return _vm_post_msg(phandle,msg_id,wparam,lparam); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_push_stack.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_push_stack.c new file mode 100644 index 00000000..623af049 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_push_stack.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_push_stack_t)(VMINT stackHandle, void* ptr); +_vm_push_stack_t _vm_push_stack = NULL; + +VMINT vm_push_stack(VMINT stackHandle, void* ptr) +{ + if (NULL == _vm_push_stack) + _vm_push_stack = (_vm_push_stack_t)vm_get_sym_entry("vm_push_stack"); + + if (NULL != _vm_push_stack) + return _vm_push_stack(stackHandle,ptr); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_query_operator_code.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_query_operator_code.c new file mode 100644 index 00000000..8509fe7b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_query_operator_code.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_query_operator_code_t)(VMCHAR *buffer, VMUINT buffer_size); +_vm_query_operator_code_t _vm_query_operator_code = NULL; + +VMINT vm_query_operator_code(VMCHAR *buffer, VMUINT buffer_size) +{ + if (NULL == _vm_query_operator_code) + _vm_query_operator_code = (_vm_query_operator_code_t)vm_get_sym_entry("vm_query_operator_code"); + + if (NULL != _vm_query_operator_code) + return _vm_query_operator_code(buffer,buffer_size); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_cache.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_cache.c new file mode 100644 index 00000000..463c38e3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_cache.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_read_cache_t)(vm_cache_t *cache, void *buf, VMINT buf_size, VMINT len); +_vm_read_cache_t _vm_read_cache = NULL; + +VMINT vm_read_cache(vm_cache_t *cache, void *buf, VMINT buf_size, VMINT len) +{ + if (NULL == _vm_read_cache) + _vm_read_cache = (_vm_read_cache_t)vm_get_sym_entry("vm_read_cache"); + + if (NULL != _vm_read_cache) + return _vm_read_cache(cache,buf,buf_size,len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_from_uart.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_from_uart.c new file mode 100644 index 00000000..a414d583 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_from_uart.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmuart.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT16 (*_vm_read_from_uart_t)(VMINT32 handle, VMUINT8 *buffer, VMUINT16 length); + _vm_read_from_uart_t _vm_read_from_uart = NULL; + +VMUINT16 vm_read_from_uart(VMINT32 handle, VMUINT8 *buffer, VMUINT16 length) +{ + if (NULL == _vm_read_from_uart) + _vm_read_from_uart = (_vm_read_from_uart_t)vm_get_sym_entry("vm_read_from_uart"); + + if (NULL != _vm_read_from_uart) + _vm_read_from_uart(handle, buffer, length); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_line.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_line.c new file mode 100644 index 00000000..fb4041b9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_read_line.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_read_line_t)(char* line, VMINT size, vm_cache_t* cache); +_vm_read_line_t _vm_read_line = NULL; + +VMINT vm_read_line(char* line, VMINT size, vm_cache_t* cache) +{ + if (NULL == _vm_read_line) + _vm_read_line = (_vm_read_line_t)vm_get_sym_entry("vm_read_line"); + + if (NULL != _vm_read_line) + return _vm_read_line(line,size,cache); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_realloc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_realloc.c new file mode 100644 index 00000000..d9a6214e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_realloc.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void *(*_vm_realloc_t)(void* p, int size); +_vm_realloc_t _vm_realloc = NULL; + +void *vm_realloc(void* p, int size) +{ + if (NULL == _vm_realloc) + _vm_realloc = (_vm_realloc_t)vm_get_sym_entry("vm_realloc"); + + if (NULL != _vm_realloc) + return _vm_realloc(p,size); + return NULL; + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_realloc_topmost.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_realloc_topmost.c new file mode 100644 index 00000000..021791f3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_realloc_topmost.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void *(*_vm_realloc_topmost_t)(void* p, int size); +_vm_realloc_topmost_t _vm_realloc_topmost = NULL; + +void *vm_realloc_topmost(void* p, int size) +{ + if (NULL == _vm_realloc_topmost) + _vm_realloc_topmost = (_vm_realloc_topmost_t)vm_get_sym_entry("vm_realloc_topmost"); + + if (NULL != _vm_realloc_topmost) + return _vm_realloc_topmost(p,size); + return NULL; + + +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reboot_normal_start.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reboot_normal_start.c new file mode 100644 index 00000000..ef999857 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reboot_normal_start.c @@ -0,0 +1,16 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8 (*_vm_reboot_normal_start_t)(void); +_vm_reboot_normal_start_t _vm_reboot_normal_start = NULL; + +void vm_reboot_normal_start(void) +{ + if (NULL == _vm_reboot_normal_start) + _vm_reboot_normal_start = (_vm_reboot_normal_start_t)vm_get_sym_entry("vm_reboot_normal_start"); + + if (NULL != _vm_reboot_normal_start) + _vm_reboot_normal_start(); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_pause.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_pause.c new file mode 100644 index 00000000..018f306e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_pause.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_record_pause_t)(void); +_vm_record_pause_t _vm_record_pause = NULL; + +VMINT vm_record_pause(void) +{ + if (NULL == _vm_record_pause) + _vm_record_pause = (_vm_record_pause_t)vm_get_sym_entry("vm_record_pause"); + + if (NULL != _vm_record_pause) + return _vm_record_pause(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_resume.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_resume.c new file mode 100644 index 00000000..4731dfc3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_resume.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_record_resume_t)(void); +_vm_record_resume_t _vm_record_resume = NULL; + +VMINT vm_record_resume(void) +{ + if (NULL == _vm_record_resume) + _vm_record_resume = (_vm_record_resume_t)vm_get_sym_entry("vm_record_resume"); + + if (NULL != _vm_record_resume) + return _vm_record_resume(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_start.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_start.c new file mode 100644 index 00000000..c02e02a0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_start.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_record_start_t)(VMSTR drv_name, VMSTR dir_name, VMSTR rec_name, VMUINT8 format, VMWSTR full_rec_file_wname, vm_recorder_callback vm_record_cb); +_vm_record_start_t _vm_record_start = NULL; + +VMINT vm_record_start(VMSTR drv_name, VMSTR dir_name, VMSTR rec_name, VMUINT8 format, VMWSTR full_rec_file_wname, vm_recorder_callback vm_record_cb) +{ + if (NULL == _vm_record_start) + _vm_record_start = (_vm_record_start_t)vm_get_sym_entry("vm_record_start"); + + if (NULL != _vm_record_start) + return _vm_record_start(drv_name,dir_name,rec_name,format,full_rec_file_wname,vm_record_cb); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_stop.c new file mode 100644 index 00000000..c0839ea8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_record_stop.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_record_stop_t)(void); +_vm_record_stop_t _vm_record_stop = NULL; + +VMINT vm_record_stop(void) +{ + if (NULL == _vm_record_stop) + _vm_record_stop = (_vm_record_stop_t)vm_get_sym_entry("vm_record_stop"); + + if (NULL != _vm_record_stop) + return _vm_record_stop(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_recv.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_recv.c new file mode 100644 index 00000000..943f56ff --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_recv.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_recv_t)(int sock, char *buf, int len, int flags); +_vm_recv_t _vm_recv = NULL; + +int vm_recv(int sock, char *buf, int len, int flags) +{ + if (NULL == _vm_recv) + _vm_recv = (_vm_recv_t)vm_get_sym_entry("vm_recv"); + if (NULL != _vm_recv) + return _vm_recv(sock,buf,len,flags); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_recvfrom.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_recvfrom.c new file mode 100644 index 00000000..7f8d4f4e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_recvfrom.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_recvfrom_t)(int sock, char *buf, int len, int flags, SOCKADDR *from, int *fromlen); +_vm_recvfrom_t _vm_recvfrom = NULL; + +int vm_recvfrom(int sock, char *buf, int len, int flags, SOCKADDR *from, int *fromlen) +{ + if (NULL == _vm_recvfrom) + _vm_recvfrom = (_vm_recvfrom_t)vm_get_sym_entry("vm_recvfrom"); + if (NULL != _vm_recvfrom) + return _vm_recvfrom(sock,buf,len,flags,from,fromlen); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_func_callback.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_func_callback.c new file mode 100644 index 00000000..bbc8a018 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_func_callback.c @@ -0,0 +1,17 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void(*_vm_reg_func_callback_t)(VMINT (*f)(VMSTR symbol)); +_vm_reg_func_callback_t _vm_reg_func_callback = NULL; + +void vm_reg_func_callback(VMINT (*f)(VMSTR symbol)) +{ + if (_vm_reg_func_callback == NULL) { + _vm_reg_func_callback = (_vm_reg_func_callback_t)vm_get_sym_entry("vm_reg_func_callback"); + } + if (_vm_reg_func_callback != NULL) { + _vm_reg_func_callback(f); + } +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_http_notification.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_http_notification.c new file mode 100644 index 00000000..f7e79528 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_http_notification.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmhttp.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_reg_http_notification_t)(void (*f)(VMINT state, VMINT param)); +_vm_reg_http_notification_t _vm_reg_http_notification = NULL; + +void vm_reg_http_notification(void (*f)(VMINT state, VMINT param)) +{ + if (NULL == _vm_reg_http_notification) + _vm_reg_http_notification = (_vm_reg_http_notification_t)vm_get_sym_entry("vm_reg_http_notification"); + + if (NULL != _vm_reg_http_notification) + _vm_reg_http_notification(f); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_msg_proc.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_msg_proc.c new file mode 100644 index 00000000..89e86380 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_msg_proc.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_reg_msg_proc_t)(VM_MESSAGE_PROC proc); +_vm_reg_msg_proc_t _vm_reg_msg_proc = NULL; + +void vm_reg_msg_proc(VM_MESSAGE_PROC proc) +{ + if (NULL == _vm_reg_msg_proc) + _vm_reg_msg_proc = (_vm_reg_msg_proc_t)vm_get_sym_entry("vm_reg_msg_proc"); + + if (NULL != _vm_reg_msg_proc) + _vm_reg_msg_proc(proc); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_sysevt_callback.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_sysevt_callback.c new file mode 100644 index 00000000..d195b60e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reg_sysevt_callback.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_reg_sysevt_callback_t)(void (*f)(VMINT message, VMINT param)); +_vm_reg_sysevt_callback_t _vm_reg_sysevt_callback = NULL; + +void vm_reg_sysevt_callback(void (*f)(VMINT message, VMINT param)) +{ + if (NULL == _vm_reg_sysevt_callback) + _vm_reg_sysevt_callback = (_vm_reg_sysevt_callback_t)vm_get_sym_entry("vm_reg_sysevt_callback"); + + if (NULL != _vm_reg_sysevt_callback) + _vm_reg_sysevt_callback(f); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reset_stack.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reset_stack.c new file mode 100644 index 00000000..3f9c5041 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_reset_stack.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_reset_stack_t)(VMINT stackHandle); +_vm_reset_stack_t _vm_reset_stack = NULL; + +VMINT vm_reset_stack(VMINT stackHandle) +{ + if (NULL == _vm_reset_stack) + _vm_reset_stack = (_vm_reset_stack_t)vm_get_sym_entry("vm_reset_stack"); + + if (NULL != _vm_reset_stack) + return _vm_reset_stack(stackHandle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_resource_get_data.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_resource_get_data.c new file mode 100644 index 00000000..81e7b247 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_resource_get_data.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmres.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_resource_get_data_t)(VMUINT8 *data, VMUINT32 offset, VMUINT32 size); +_vm_resource_get_data_t _vm_resource_get_data = NULL; + +VMINT32 vm_resource_get_data(VMUINT8 *data, VMUINT32 offset, VMUINT32 size) +{ + if (NULL == _vm_resource_get_data) + _vm_resource_get_data = (_vm_resource_get_data_t)vm_get_sym_entry("vm_resource_get_data"); + + if (NULL != _vm_resource_get_data) + return _vm_resource_get_data(data,offset,size); + + return (VMINT32 )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_resource_get_data_from_file.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_resource_get_data_from_file.c new file mode 100644 index 00000000..dec94c50 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_resource_get_data_from_file.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmres.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_resource_get_data_from_file_t)(VMWSTR filename, VMUINT8 *data, VMUINT32 offset, VMUINT32 size); +_vm_resource_get_data_from_file_t _vm_resource_get_data_from_file = NULL; + +VMINT32 vm_resource_get_data_from_file(VMWSTR filename, VMUINT8 *data, VMUINT32 offset, VMUINT32 size) +{ + if (NULL == _vm_resource_get_data_from_file) + _vm_resource_get_data_from_file = (_vm_resource_get_data_from_file_t)vm_get_sym_entry("vm_resource_get_data_from_file"); + + if (NULL != _vm_resource_get_data_from_file) + return _vm_resource_get_data_from_file(filename, data,offset,size); + + return (VMINT32 )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_restore_irq_mask.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_restore_irq_mask.c new file mode 100644 index 00000000..6004c9a9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_restore_irq_mask.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmdcl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_restore_irq_mask_t)(VMUINT32 mask); +_vm_restore_irq_mask_t _vm_restore_irq_mask = NULL; +void vm_restore_irq_mask(VMUINT32 mask) +{ + if (NULL == _vm_restore_irq_mask) + _vm_restore_irq_mask = (_vm_restore_irq_mask_t)vm_get_sym_entry("vm_restore_irq_mask"); + + if (NULL != _vm_restore_irq_mask) + _vm_restore_irq_mask(mask); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_safe_wstrcpy.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_safe_wstrcpy.c new file mode 100644 index 00000000..37945ff0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_safe_wstrcpy.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_safe_wstrcpy_t)(VMWSTR dest, VMINT size, VMWSTR src); +_vm_safe_wstrcpy_t _vm_safe_wstrcpy = NULL; + +VMINT vm_safe_wstrcpy(VMWSTR dest, VMINT size, VMWSTR src) +{ + if (NULL == _vm_safe_wstrcpy) + _vm_safe_wstrcpy = (_vm_safe_wstrcpy_t)vm_get_sym_entry("vm_safe_wstrcpy"); + + if (NULL != _vm_safe_wstrcpy) + return _vm_safe_wstrcpy(dest,size,src); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_save_irq_mask.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_save_irq_mask.c new file mode 100644 index 00000000..698a1480 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_save_irq_mask.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmdcl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + + +typedef VMUINT32 (*_vm_save_irq_mask_t)(void); +_vm_save_irq_mask_t _vm_save_irq_mask = NULL; +VMUINT32 vm_save_irq_mask(void) +{ + if (NULL == _vm_save_irq_mask) + _vm_save_irq_mask = (_vm_save_irq_mask_t)vm_get_sym_entry("vm_save_irq_mask"); + + if (NULL != _vm_save_irq_mask) + return _vm_save_irq_mask(); + + return (VMUINT32)0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_select.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_select.c new file mode 100644 index 00000000..0eae2e5b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_select.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_select_t)(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const timeval *timeout); +_vm_select_t _vm_select = NULL; + +int vm_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const timeval *timeout) +{ + if (NULL == _vm_select) + _vm_select = (_vm_select_t)vm_get_sym_entry("vm_select"); + if (NULL != _vm_select) + return _vm_select(nfds,readfds,writefds,exceptfds,timeout); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send.c new file mode 100644 index 00000000..34ce3dab --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_send_t)(int sock, const char *buf, int len, int flags); +_vm_send_t _vm_send = NULL; + +int vm_send(int sock, const char *buf, int len, int flags) +{ + if (NULL == _vm_send) + _vm_send = (_vm_send_t)vm_get_sym_entry("vm_send"); + if (NULL != _vm_send) + return _vm_send(sock,buf,len,flags); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send_msg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send_msg.c new file mode 100644 index 00000000..3dfca8ef --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send_msg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_send_msg_t)(VM_P_HANDLE phandle, VMUINT msg_id, VMINT wparam, VMINT lparam); +_vm_send_msg_t _vm_send_msg = NULL; + +VMINT vm_send_msg(VM_P_HANDLE phandle, VMUINT msg_id, VMINT wparam, VMINT lparam) +{ + if (NULL == _vm_send_msg) + _vm_send_msg = (_vm_send_msg_t)vm_get_sym_entry("vm_send_msg"); + + if (NULL != _vm_send_msg) + return _vm_send_msg(phandle,msg_id,wparam,lparam); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send_sms.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send_sms.c new file mode 100644 index 00000000..e085c19f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_send_sms.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtel.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_send_sms_t)(VMWSTR phone_number, VMWSTR content, void (*callback)(VMINT result)); +_vm_send_sms_t _vm_send_sms = NULL; + +VMINT vm_send_sms(VMWSTR phone_number, VMWSTR content, void (*callback)(VMINT result)) +{ + if (NULL == _vm_send_sms) + _vm_send_sms = (_vm_send_sms_t)vm_get_sym_entry("vm_send_sms"); + + if (NULL != _vm_send_sms) + return _vm_send_sms(phone_number,content,callback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sendto.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sendto.c new file mode 100644 index 00000000..cf4cc4f8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sendto.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_sendto_t)(int sock, const char *buf, int len, int flags, const SOCKADDR *to, int tolen); +_vm_sendto_t _vm_sendto = NULL; + +int vm_sendto(int sock, const char *buf, int len, int flags, const SOCKADDR *to, int tolen) +{ + if (NULL == _vm_sendto) + _vm_sendto = (_vm_sendto_t)vm_get_sym_entry("vm_sendto"); + if (NULL != _vm_sendto) + return _vm_sendto(sock,buf,len,flags,to,tolen); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_active_sim_card.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_active_sim_card.c new file mode 100644 index 00000000..200d24ac --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_active_sim_card.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_set_active_sim_card_t)(VMINT card_id); +_vm_set_active_sim_card_t _vm_set_active_sim_card = NULL; + +VMINT vm_set_active_sim_card(VMINT card_id) +{ + if (NULL == _vm_set_active_sim_card) + _vm_set_active_sim_card = (_vm_set_active_sim_card_t)vm_get_sym_entry("vm_set_active_sim_card"); + + if (NULL != _vm_set_active_sim_card) + return _vm_set_active_sim_card(card_id); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_app_desired_input_mode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_app_desired_input_mode.c new file mode 100644 index 00000000..75689757 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_app_desired_input_mode.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmio.h" +#include "vminput.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_set_app_desired_input_mode_t)(vm_input_mode_enum desired_input_mode); +_vm_set_app_desired_input_mode_t _vm_set_app_desired_input_mode = NULL; + +void vm_set_app_desired_input_mode(vm_input_mode_enum desired_input_mode) +{ + if (NULL == _vm_set_app_desired_input_mode) + _vm_set_app_desired_input_mode = (_vm_set_app_desired_input_mode_t)vm_get_sym_entry("vm_set_app_desired_input_mode"); + + if (NULL != _vm_set_app_desired_input_mode) + _vm_set_app_desired_input_mode(desired_input_mode); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_cust_apn_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_cust_apn_info.c new file mode 100644 index 00000000..3cefb775 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_cust_apn_info.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_set_cust_apn_info_t)(const vm_dtcnt_info_t * info, VMUINT32 * dtacct); +_vm_set_cust_apn_info_t _vm_set_cust_apn_info = NULL; + +VMINT vm_set_cust_apn_info(const vm_dtcnt_info_t * info, VMUINT32 * dtacct) +{ + if (NULL == _vm_set_cust_apn_info) + _vm_set_cust_apn_info = (_vm_set_cust_apn_info_t)vm_get_sym_entry("vm_set_cust_apn_info"); + + if (NULL != _vm_set_cust_apn_info) + return _vm_set_cust_apn_info(info, dtacct); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_kal_timer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_kal_timer.c new file mode 100644 index 00000000..158eaad3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_kal_timer.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmtimer.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_set_kal_timer_t)(vm_kal_timerid timer_ptr, vm_kal_timer_func_ptr handler_func_ptr,void *handler_param_ptr, VMUINT32 delay, VMUINT32 reshedule_time); +_vm_set_kal_timer_t _vm_set_kal_timer = NULL; +void vm_set_kal_timer(vm_kal_timerid timer_ptr, vm_kal_timer_func_ptr handler_func_ptr,void *handler_param_ptr, VMUINT32 delay, VMUINT32 reshedule_time) + +{ + if (NULL == _vm_set_kal_timer) + _vm_set_kal_timer = (_vm_set_kal_timer_t)vm_get_sym_entry("vm_set_kal_timer"); + if (NULL != _vm_set_kal_timer) + _vm_set_kal_timer(timer_ptr,handler_func_ptr,handler_param_ptr,delay,reshedule_time); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_ringtone.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_ringtone.c new file mode 100644 index 00000000..e78a9c86 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_ringtone.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_set_ringtone_t)(VMWSTR filepath); +_vm_set_ringtone_t _vm_set_ringtone = NULL; + +VMINT vm_set_ringtone(VMWSTR filepath) +{ + if (NULL == _vm_set_ringtone) + _vm_set_ringtone = (_vm_set_ringtone_t)vm_get_sym_entry("vm_set_ringtone"); + + if (NULL != _vm_set_ringtone) + return _vm_set_ringtone(filepath); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_volume.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_volume.c new file mode 100644 index 00000000..a2f6dd6d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_set_volume.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_set_volume_t)(VMINT volume); +_vm_set_volume_t _vm_set_volume = NULL; + +void vm_set_volume(VMINT volume) +{ + if (NULL == _vm_set_volume) + _vm_set_volume = (_vm_set_volume_t)vm_get_sym_entry("vm_set_volume"); + + if (NULL != _vm_set_volume) + _vm_set_volume(volume); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setsockopt.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setsockopt.c new file mode 100644 index 00000000..bda553fc --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setsockopt.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_setsockopt_t)(int sock, VMUINT32 option, void *val, VMUINT8 val_size); +_vm_setsockopt_t _vm_setsockopt = NULL; + +int vm_setsockopt(int sock, VMUINT32 option, void *val, VMUINT8 val_size) +{ + if (NULL == _vm_setsockopt) + _vm_setsockopt = (_vm_setsockopt_t)vm_get_sym_entry("vm_setsockopt"); + if (NULL != _vm_setsockopt) + return _vm_setsockopt(sock,option,val,val_size); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_date_format.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_date_format.c new file mode 100644 index 00000000..7e753631 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_date_format.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsettings.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_setting_get_date_format_t)(void); +_vm_setting_get_date_format_t _vm_setting_get_date_format = NULL; + +VMINT vm_setting_get_date_format(void) +{ + if (NULL == _vm_setting_get_date_format) + _vm_setting_get_date_format = (_vm_setting_get_date_format_t)vm_get_sym_entry("vm_setting_get_date_format"); + + if (NULL != _vm_setting_get_date_format) + return _vm_setting_get_date_format(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_date_seperator.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_date_seperator.c new file mode 100644 index 00000000..31571952 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_date_seperator.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsettings.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_setting_get_date_seperator_t)(void); +_vm_setting_get_date_seperator_t _vm_setting_get_date_seperator = NULL; + +VMINT vm_setting_get_date_seperator(void) +{ + if (NULL == _vm_setting_get_date_seperator) + _vm_setting_get_date_seperator = (_vm_setting_get_date_seperator_t)vm_get_sym_entry("vm_setting_get_date_seperator"); + + if (NULL != _vm_setting_get_date_seperator) + return _vm_setting_get_date_seperator(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_time_format.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_time_format.c new file mode 100644 index 00000000..006943f8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_get_time_format.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsettings.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_setting_get_time_format_t)(void); +_vm_setting_get_time_format_t _vm_setting_get_time_format = NULL; + +VMINT vm_setting_get_time_format(void) +{ + if (NULL == _vm_setting_get_time_format) + _vm_setting_get_time_format = (_vm_setting_get_time_format_t)vm_get_sym_entry("vm_setting_get_time_format"); + + if (NULL != _vm_setting_get_time_format) + return _vm_setting_get_time_format(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_srv_command.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_srv_command.c new file mode 100644 index 00000000..e42c8be2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_setting_srv_command.c @@ -0,0 +1,29 @@ +#include "vmsys.h" +#include "vmsettings.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT32 (*_vm_setting_srv_command_t)(VMUINT16 type, + VMUINT16 operation, + void *in, + void *out, + vm_setting_srv_result_callback cb, + void *user_data); +_vm_setting_srv_command_t _vm_setting_srv_command = NULL; + +VMINT32 vm_setting_srv_command(VMUINT16 type, + VMUINT16 operation, + void *in, + void *out, + vm_setting_srv_result_callback cb, + void *user_data) +{ + if (NULL == _vm_setting_srv_command) + _vm_setting_srv_command = (_vm_setting_srv_command_t)vm_get_sym_entry("vm_setting_srv_command"); + + if (NULL != _vm_setting_srv_command) + return _vm_setting_srv_command(type, operation, in, out, cb, user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_settings_set_tone.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_settings_set_tone.c new file mode 100644 index 00000000..b1471ac2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_settings_set_tone.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsettings.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_settings_set_tone_t)(vm_settings_tone_enum type, VMWCHAR* path); +_vm_settings_set_tone_t _vm_settings_set_tone = NULL; + +VMINT vm_settings_set_tone(vm_settings_tone_enum type, VMWCHAR* path) +{ + if (NULL == _vm_settings_set_tone) + _vm_settings_set_tone = (_vm_settings_set_tone_t)vm_get_sym_entry("vm_settings_set_tone"); + + if (NULL != _vm_settings_set_tone) + return _vm_settings_set_tone(type,path); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_settings_set_wallpaper.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_settings_set_wallpaper.c new file mode 100644 index 00000000..d23f301c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_settings_set_wallpaper.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsettings.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_settings_set_wallpaper_t)(vm_setttings_wallpaper_enum type, VMWCHAR* path,vm_settings_set_wallpaper_callback callback, void* user_data); +_vm_settings_set_wallpaper_t _vm_settings_set_wallpaper = NULL; + +VMINT vm_settings_set_wallpaper(vm_setttings_wallpaper_enum type, VMWCHAR* path,vm_settings_set_wallpaper_callback callback, void* user_data) +{ + if (NULL == _vm_settings_set_wallpaper) + _vm_settings_set_wallpaper = (_vm_settings_set_wallpaper_t)vm_get_sym_entry("vm_settings_set_wallpaper"); + + if (NULL != _vm_settings_set_wallpaper) + return _vm_settings_set_wallpaper(type,path,callback,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_shutdown.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_shutdown.c new file mode 100644 index 00000000..83aa4684 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_shutdown.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_shutdown_t)(int sock, int how); +_vm_shutdown_t _vm_shutdown = NULL; + +int vm_shutdown(int sock, int how) +{ + if (NULL == _vm_shutdown) + _vm_shutdown = (_vm_shutdown_t)vm_get_sym_entry("vm_shutdown"); + if (NULL != _vm_shutdown) + return _vm_shutdown(sock,how); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_shutdown_normal_start.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_shutdown_normal_start.c new file mode 100644 index 00000000..e925db93 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_shutdown_normal_start.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmpwr.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_shutdown_normal_start_t)(VMUINT16 trigger_man_app_id); +_vm_shutdown_normal_start_t _vm_shutdown_normal_start = NULL; + +void vm_shutdown_normal_start(VMUINT16 trigger_man_app_id) +{ + if (NULL == _vm_shutdown_normal_start) + _vm_shutdown_normal_start = (_vm_shutdown_normal_start_t)vm_get_sym_entry("vm_shutdown_normal_start"); + + if (NULL != _vm_shutdown_normal_start) + _vm_shutdown_normal_start(trigger_man_app_id); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_card_count.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_card_count.c new file mode 100644 index 00000000..6fc0c1b7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_card_count.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sim_card_count_t)(void); +_vm_sim_card_count_t _vm_sim_card_count = NULL; + +VMINT vm_sim_card_count(void) +{ + if (NULL == _vm_sim_card_count) + _vm_sim_card_count = (_vm_sim_card_count_t)vm_get_sym_entry("vm_sim_card_count"); + + if (NULL != _vm_sim_card_count) + return _vm_sim_card_count(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_active_sim_card.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_active_sim_card.c new file mode 100644 index 00000000..24f29b47 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_active_sim_card.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sim_get_active_sim_card_t)(void); +_vm_sim_get_active_sim_card_t _vm_sim_get_active_sim_card = NULL; + +VMINT vm_sim_get_active_sim_card(void) +{ + if (NULL == _vm_sim_get_active_sim_card) + _vm_sim_get_active_sim_card = (_vm_sim_get_active_sim_card_t)vm_get_sym_entry("vm_sim_get_active_sim_card"); + + if (NULL != _vm_sim_get_active_sim_card) + return _vm_sim_get_active_sim_card(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_card_status.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_card_status.c new file mode 100644 index 00000000..7bec59b2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_card_status.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_sim_state_t (*_vm_sim_get_card_status_t)(VMINT sim); +_vm_sim_get_card_status_t _vm_sim_get_card_status = NULL; + +vm_sim_state_t vm_sim_get_card_status(VMINT sim) +{ + if (NULL == _vm_sim_get_card_status) + _vm_sim_get_card_status = (_vm_sim_get_card_status_t)vm_get_sym_entry("vm_sim_get_card_status"); + if (NULL != _vm_sim_get_card_status) + return _vm_sim_get_card_status(sim); + return (vm_sim_state_t)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_iccid.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_iccid.c new file mode 100644 index 00000000..76ce5e18 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_iccid.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sim_get_iccid_t)(VMINT sim, vm_sim_get_iccid_cb callback, VMCHAR* iccid, VMINT buff_len, void* user_data); +_vm_sim_get_iccid_t _vm_sim_get_iccid = NULL; + +VMINT vm_sim_get_iccid(VMINT sim, vm_sim_get_iccid_cb callback, VMCHAR* iccid, VMINT buff_len, void* user_data) +{ + if (NULL == _vm_sim_get_iccid) + _vm_sim_get_iccid = (_vm_sim_get_iccid_t)vm_get_sym_entry("vm_sim_get_iccid"); + + if (NULL != _vm_sim_get_iccid) + return _vm_sim_get_iccid(sim,callback,iccid,buff_len,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imei.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imei.c new file mode 100644 index 00000000..477ea739 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imei.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMSTR (*_vm_sim_get_imei_t)(void); +_vm_sim_get_imei_t _vm_sim_get_imei = NULL; + +VMSTR vm_sim_get_imei(void) +{ + if (NULL == _vm_sim_get_imei) + _vm_sim_get_imei = (_vm_sim_get_imei_t)vm_get_sym_entry("vm_sim_get_imei"); + if (NULL != _vm_sim_get_imei) + return _vm_sim_get_imei(); + return (VMSTR)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imei_ext.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imei_ext.c new file mode 100644 index 00000000..59140a95 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imei_ext.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMSTR (*_vm_sim_get_imei_ext_t)(VMINT sim); +_vm_sim_get_imei_ext_t _vm_sim_get_imei_ext = NULL; + +VMSTR vm_sim_get_imei_ext(VMINT sim) +{ + if (NULL == _vm_sim_get_imei_ext) + _vm_sim_get_imei_ext = (_vm_sim_get_imei_ext_t)vm_get_sym_entry("vm_sim_get_imei_ext"); + if (NULL != _vm_sim_get_imei_ext) + return _vm_sim_get_imei_ext(sim); + return (VMSTR)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imsi.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imsi.c new file mode 100644 index 00000000..aa961ca9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_imsi.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMSTR (*_vm_sim_get_imsi_t)(void); +_vm_sim_get_imsi_t _vm_sim_get_imsi = NULL; + +VMSTR vm_sim_get_imsi(void) +{ + if (NULL == _vm_sim_get_imsi) + _vm_sim_get_imsi = (_vm_sim_get_imsi_t)vm_get_sym_entry("vm_sim_get_imsi"); + if (NULL != _vm_sim_get_imsi) + return _vm_sim_get_imsi(); + return (VMSTR)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_operator.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_operator.c new file mode 100644 index 00000000..1d593089 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_operator.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef operator_t (*_vm_sim_get_operator_t)(void); +_vm_sim_get_operator_t _vm_sim_get_operator = NULL; + +operator_t vm_sim_get_operator(void) +{ + if (NULL == _vm_sim_get_operator) + _vm_sim_get_operator = (_vm_sim_get_operator_t)vm_get_sym_entry("vm_sim_get_operator"); + if (NULL != _vm_sim_get_operator) + return _vm_sim_get_operator(); + return (operator_t)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_prefer_sim_card.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_prefer_sim_card.c new file mode 100644 index 00000000..89c1d7ea --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_get_prefer_sim_card.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sim_get_prefer_sim_card_t)(void); +_vm_sim_get_prefer_sim_card_t _vm_sim_get_prefer_sim_card = NULL; + +VMINT vm_sim_get_prefer_sim_card(void) +{ + if (NULL == _vm_sim_get_prefer_sim_card) + _vm_sim_get_prefer_sim_card = (_vm_sim_get_prefer_sim_card_t)vm_get_sym_entry("vm_sim_get_prefer_sim_card"); + + if (NULL != _vm_sim_get_prefer_sim_card) + return _vm_sim_get_prefer_sim_card(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_has_card.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_has_card.c new file mode 100644 index 00000000..5100d73b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_has_card.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_sim_has_card_t)(void); +_vm_sim_has_card_t _vm_sim_has_card = NULL; + +VMBOOL vm_sim_has_card(void) +{ + if (NULL == _vm_sim_has_card) + _vm_sim_has_card = (_vm_sim_has_card_t)vm_get_sym_entry("vm_sim_has_card"); + if (NULL != _vm_sim_has_card) + return _vm_sim_has_card(); + return (VMBOOL)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_max_card_count.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_max_card_count.c new file mode 100644 index 00000000..81a67c85 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_max_card_count.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sim_max_card_count_t)(void); +_vm_sim_max_card_count_t _vm_sim_max_card_count = NULL; + +VMINT vm_sim_max_card_count(void) +{ + if (NULL == _vm_sim_max_card_count) + _vm_sim_max_card_count = (_vm_sim_max_card_count_t)vm_get_sym_entry("vm_sim_max_card_count"); + + if (NULL != _vm_sim_max_card_count) + return _vm_sim_max_card_count(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_query_operator_code.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_query_operator_code.c new file mode 100644 index 00000000..151e9ab1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_query_operator_code.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sim_query_operator_code_t)(VMCHAR* buffer, VMUINT buffer_size); +_vm_sim_query_operator_code_t _vm_sim_query_operator_code = NULL; + +VMINT vm_sim_query_operator_code(VMCHAR* buffer, VMUINT buffer_size) +{ + if (NULL == _vm_sim_query_operator_code) + _vm_sim_query_operator_code = (_vm_sim_query_operator_code_t)vm_get_sym_entry("vm_sim_query_operator_code"); + if (NULL != _vm_sim_query_operator_code) + return _vm_sim_query_operator_code(buffer,buffer_size); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_set_active_card.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_set_active_card.c new file mode 100644 index 00000000..4a96353c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sim_set_active_card.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsim.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_sim_set_active_card_t)(VMINT sim); +_vm_sim_set_active_card_t _vm_sim_set_active_card = NULL; + +VMBOOL vm_sim_set_active_card(VMINT sim) +{ + if (NULL == _vm_sim_set_active_card) + _vm_sim_set_active_card = (_vm_sim_set_active_card_t)vm_get_sym_entry("vm_sim_set_active_card"); + if (NULL != _vm_sim_set_active_card) + return _vm_sim_set_active_card(sim); + return (VMBOOL)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sla_custom_logging.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sla_custom_logging.c new file mode 100644 index 00000000..8429c3de --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sla_custom_logging.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_sla_custom_logging_t)(VMSTR custom_label, vm_sla_action_type action); +_vm_sla_custom_logging_t _vm_sla_custom_logging = NULL; + +void vm_sla_custom_logging(VMSTR custom_label, vm_sla_action_type action) +{ + if (NULL == _vm_sla_custom_logging) + _vm_sla_custom_logging = (_vm_sla_custom_logging_t)vm_get_sym_entry("vm_sla_custom_logging"); + + if (NULL != _vm_sla_custom_logging) + _vm_sla_custom_logging(custom_label, action); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_add_msg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_add_msg.c new file mode 100644 index 00000000..0dda5333 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_add_msg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_add_msg_t)(vm_sms_add_msg_data_t * msg_data, VmSmsCallbackFunc callback_func, void* user_data); +_vm_sms_add_msg_t _vm_sms_add_msg = NULL; + +VMINT vm_sms_add_msg(vm_sms_add_msg_data_t * msg_data, VmSmsCallbackFunc callback_func, void* user_data) +{ + if (NULL == _vm_sms_add_msg) + _vm_sms_add_msg = (_vm_sms_add_msg_t)vm_get_sym_entry("vm_sms_add_msg"); + + if (NULL != _vm_sms_add_msg) + return _vm_sms_add_msg(msg_data,callback_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_clear_interrupt_event_handler.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_clear_interrupt_event_handler.c new file mode 100644 index 00000000..6c5a59df --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_clear_interrupt_event_handler.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_clear_interrupt_event_handler_t)(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data); +_vm_sms_clear_interrupt_event_handler_t _vm_sms_clear_interrupt_event_handler = NULL; + +VMINT vm_sms_clear_interrupt_event_handler(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data) +{ + if (NULL == _vm_sms_clear_interrupt_event_handler) + _vm_sms_clear_interrupt_event_handler = (_vm_sms_clear_interrupt_event_handler_t)vm_get_sym_entry("vm_sms_clear_interrupt_event_handler"); + + if (NULL != _vm_sms_clear_interrupt_event_handler) + return _vm_sms_clear_interrupt_event_handler(event_id,event_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_clear_interrupt_event_handler_forpay.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_clear_interrupt_event_handler_forpay.c new file mode 100644 index 00000000..e01e5455 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_clear_interrupt_event_handler_forpay.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_clear_interrupt_event_handler_forpay_t)(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data); +_vm_sms_clear_interrupt_event_handler_forpay_t _vm_sms_clear_interrupt_event_handler_forpay = NULL; + +VMINT vm_sms_clear_interrupt_event_handler_forpay(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data) +{ + if (NULL == _vm_sms_clear_interrupt_event_handler_forpay) + _vm_sms_clear_interrupt_event_handler_forpay = (_vm_sms_clear_interrupt_event_handler_forpay_t)vm_get_sym_entry("vm_sms_clear_interrupt_event_handler_forpay"); + + if (NULL != _vm_sms_clear_interrupt_event_handler_forpay) + return _vm_sms_clear_interrupt_event_handler_forpay(event_id,event_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg.c new file mode 100644 index 00000000..31730d08 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_delete_msg_t)(VMUINT16 msg_id, VmSmsCallbackFunc callback_func, void* user_data); +_vm_sms_delete_msg_t _vm_sms_delete_msg = NULL; + +VMINT vm_sms_delete_msg(VMUINT16 msg_id, VmSmsCallbackFunc callback_func, void* user_data) +{ + if (NULL == _vm_sms_delete_msg) + _vm_sms_delete_msg = (_vm_sms_delete_msg_t)vm_get_sym_entry("vm_sms_delete_msg"); + + if (NULL != _vm_sms_delete_msg) + return _vm_sms_delete_msg(msg_id,callback_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg_forpay.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg_forpay.c new file mode 100644 index 00000000..46254c77 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg_forpay.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_delete_msg_forpay_t)(VMUINT16 msg_id, VmSmsCallbackFunc callback_func, void* user_data); +_vm_sms_delete_msg_forpay_t _vm_sms_delete_msg_forpay = NULL; + +VMINT vm_sms_delete_msg_forpay(VMUINT16 msg_id, VmSmsCallbackFunc callback_func, void* user_data) +{ + if (NULL == _vm_sms_delete_msg_forpay) + _vm_sms_delete_msg_forpay = (_vm_sms_delete_msg_forpay_t)vm_get_sym_entry("vm_sms_delete_msg_forpay"); + + if (NULL != _vm_sms_delete_msg_forpay) + return _vm_sms_delete_msg_forpay(msg_id,callback_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg_list.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg_list.c new file mode 100644 index 00000000..14b67f23 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_delete_msg_list.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_delete_msg_list_t)(vm_sms_box_enum box_type, vm_sms_sim_enum sim_id, VmSmsCallbackFunc callback_func, void* user_data); +_vm_sms_delete_msg_list_t _vm_sms_delete_msg_list = NULL; + +VMINT vm_sms_delete_msg_list(vm_sms_box_enum box_type, vm_sms_sim_enum sim_id, VmSmsCallbackFunc callback_func, void* user_data) +{ + if (NULL == _vm_sms_delete_msg_list) + _vm_sms_delete_msg_list = (_vm_sms_delete_msg_list_t)vm_get_sym_entry("vm_sms_delete_msg_list"); + + if (NULL != _vm_sms_delete_msg_list) + return _vm_sms_delete_msg_list(box_type,sim_id,callback_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_box_size.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_box_size.c new file mode 100644 index 00000000..2f64adbb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_box_size.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT16 (*_vm_sms_get_box_size_t)(vm_sms_box_enum box_type); +_vm_sms_get_box_size_t _vm_sms_get_box_size = NULL; + +VMINT16 vm_sms_get_box_size(vm_sms_box_enum box_type) +{ + if (NULL == _vm_sms_get_box_size) + _vm_sms_get_box_size = (_vm_sms_get_box_size_t)vm_get_sym_entry("vm_sms_get_box_size"); + + if (NULL != _vm_sms_get_box_size) + return _vm_sms_get_box_size(box_type); + + return (VMINT16 )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_msg_id.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_msg_id.c new file mode 100644 index 00000000..4de5c5b3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_msg_id.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT16 (*_vm_sms_get_msg_id_t)(vm_sms_box_enum box_type, VMUINT16 msg_index); +_vm_sms_get_msg_id_t _vm_sms_get_msg_id = NULL; + +VMINT16 vm_sms_get_msg_id(vm_sms_box_enum box_type, VMUINT16 msg_index) +{ + if (NULL == _vm_sms_get_msg_id) + _vm_sms_get_msg_id = (_vm_sms_get_msg_id_t)vm_get_sym_entry("vm_sms_get_msg_id"); + + if (NULL != _vm_sms_get_msg_id) + return _vm_sms_get_msg_id(box_type,msg_index); + + return (VMINT16 )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_msg_id_list.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_msg_id_list.c new file mode 100644 index 00000000..2962d8be --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_msg_id_list.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_get_msg_id_list_t)(vm_sms_query_t* query_data, VmSmsCallbackFunc callback_func, void* user_data); +_vm_sms_get_msg_id_list_t _vm_sms_get_msg_id_list = NULL; + +VMINT vm_sms_get_msg_id_list(vm_sms_query_t* query_data, VmSmsCallbackFunc callback_func, void* user_data) +{ + if (NULL == _vm_sms_get_msg_id_list) + _vm_sms_get_msg_id_list = (_vm_sms_get_msg_id_list_t)vm_get_sym_entry("vm_sms_get_msg_id_list"); + + if (NULL != _vm_sms_get_msg_id_list) + return _vm_sms_get_msg_id_list(query_data,callback_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_sc_address.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_sc_address.c new file mode 100644 index 00000000..94b435fe --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_sc_address.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_get_sc_address_t)( vm_sms_sim_enum sim_id, VmSmsCallbackFunc callback_func, void* user_data); +_vm_sms_get_sc_address_t _vm_sms_get_sc_address = NULL; + +VMINT vm_sms_get_sc_address( vm_sms_sim_enum sim_id, VmSmsCallbackFunc callback_func, void* user_data) +{ + if (NULL == _vm_sms_get_sc_address) + _vm_sms_get_sc_address = (_vm_sms_get_sc_address_t)vm_get_sym_entry("vm_sms_get_sc_address"); + + if (NULL != _vm_sms_get_sc_address) + return _vm_sms_get_sc_address(sim_id,callback_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_sc_address_syn.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_sc_address_syn.c new file mode 100644 index 00000000..0a7675d2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_get_sc_address_syn.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_get_sc_address_syn_t)(vm_sms_get_sc_addr_cb_t * vm_sc_addr, vm_sms_sim_enum sim_id); +_vm_sms_get_sc_address_syn_t _vm_sms_get_sc_address_syn = NULL; + +VMINT vm_sms_get_sc_address_syn(vm_sms_get_sc_addr_cb_t * vm_sc_addr, vm_sms_sim_enum sim_id) +{ + if (NULL == _vm_sms_get_sc_address_syn) + _vm_sms_get_sc_address_syn = (_vm_sms_get_sc_address_syn_t)vm_get_sym_entry("vm_sms_get_sc_address_syn"); + + if (NULL != _vm_sms_get_sc_address_syn) + return _vm_sms_get_sc_address_syn(vm_sc_addr,sim_id); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_is_sms_ready.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_is_sms_ready.c new file mode 100644 index 00000000..78dc1793 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_is_sms_ready.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_sms_is_sms_ready_t)(void); +_vm_sms_is_sms_ready_t _vm_sms_is_sms_ready = NULL; + +VMBOOL vm_sms_is_sms_ready(void) +{ + if (NULL == _vm_sms_is_sms_ready) + _vm_sms_is_sms_ready = (_vm_sms_is_sms_ready_t)vm_get_sym_entry("vm_sms_is_sms_ready"); + if (NULL != _vm_sms_is_sms_ready) + return _vm_sms_is_sms_ready(); + return (VMBOOL)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_launch.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_launch.c new file mode 100644 index 00000000..7decb785 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_launch.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_launch_t)(vm_sms_launch_data* data, VMINT data_size); +_vm_sms_launch_t _vm_sms_launch = NULL; + +VMINT vm_sms_launch(vm_sms_launch_data* data, VMINT data_size) +{ + if (NULL == _vm_sms_launch) + _vm_sms_launch = (_vm_sms_launch_t)vm_get_sym_entry("vm_sms_launch"); + + if (NULL != _vm_sms_launch) + return _vm_sms_launch(data, data_size); + return -1; + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_read_msg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_read_msg.c new file mode 100644 index 00000000..b0346361 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_read_msg.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_read_msg_t)(VMUINT16 msg_id, VMINT change_status, vm_sms_msg_data_t* msg_data, VmSmsCallbackFunc callback_func, void* user_data); +_vm_sms_read_msg_t _vm_sms_read_msg = NULL; + +VMINT vm_sms_read_msg(VMUINT16 msg_id, VMINT change_status, vm_sms_msg_data_t* msg_data, VmSmsCallbackFunc callback_func, void* user_data) +{ + if (NULL == _vm_sms_read_msg) + _vm_sms_read_msg = (_vm_sms_read_msg_t)vm_get_sym_entry("vm_sms_read_msg"); + + if (NULL != _vm_sms_read_msg) + return _vm_sms_read_msg(msg_id,change_status,msg_data,callback_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_set_interrupt_event_handler.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_set_interrupt_event_handler.c new file mode 100644 index 00000000..0d7f88ad --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_set_interrupt_event_handler.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_set_interrupt_event_handler_t)(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data); +_vm_sms_set_interrupt_event_handler_t _vm_sms_set_interrupt_event_handler = NULL; + +VMINT vm_sms_set_interrupt_event_handler(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data) +{ + if (NULL == _vm_sms_set_interrupt_event_handler) + _vm_sms_set_interrupt_event_handler = (_vm_sms_set_interrupt_event_handler_t)vm_get_sym_entry("vm_sms_set_interrupt_event_handler"); + + if (NULL != _vm_sms_set_interrupt_event_handler) + return _vm_sms_set_interrupt_event_handler(event_id,event_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_set_interrupt_event_handler_forpay.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_set_interrupt_event_handler_forpay.c new file mode 100644 index 00000000..57d63d13 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sms_set_interrupt_event_handler_forpay.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsms.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sms_set_interrupt_event_handler_forpay_t)(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data); +_vm_sms_set_interrupt_event_handler_forpay_t _vm_sms_set_interrupt_event_handler_forpay = NULL; + +VMINT vm_sms_set_interrupt_event_handler_forpay(vm_sms_event_enum event_id, VmSmsEventFunc event_func, void* user_data) +{ + if (NULL == _vm_sms_set_interrupt_event_handler_forpay) + _vm_sms_set_interrupt_event_handler_forpay = (_vm_sms_set_interrupt_event_handler_forpay_t)vm_get_sym_entry("vm_sms_set_interrupt_event_handler_forpay"); + + if (NULL != _vm_sms_set_interrupt_event_handler_forpay) + return _vm_sms_set_interrupt_event_handler_forpay(event_id,event_func,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_account_localip.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_account_localip.c new file mode 100644 index 00000000..1fa1f77c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_account_localip.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_get_account_localip_t)(VMINT8 sock, VMUINT8 *local_ip); +_vm_soc_get_account_localip_t _vm_soc_get_account_localip = NULL; + +VMINT vm_soc_get_account_localip(VMINT8 sock, VMUINT8 *local_ip) +{ + if (NULL == _vm_soc_get_account_localip) + _vm_soc_get_account_localip = (_vm_soc_get_account_localip_t)vm_get_sym_entry("vm_soc_get_account_localip"); + if (NULL != _vm_soc_get_account_localip) + return _vm_soc_get_account_localip(sock,local_ip); + return (VMINT)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_host_by_name.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_host_by_name.c new file mode 100644 index 00000000..f1a7081e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_host_by_name.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_get_host_by_name_t)(VMINT apn, const VMCHAR * host, vm_soc_dns_result * result, VMINT (*callback)(vm_soc_dns_result *)); +_vm_soc_get_host_by_name_t _vm_soc_get_host_by_name = NULL; + +VMINT vm_soc_get_host_by_name(VMINT apn, const VMCHAR * host, vm_soc_dns_result * result, VMINT (*callback)(vm_soc_dns_result *)) +{ + if (NULL == _vm_soc_get_host_by_name) + _vm_soc_get_host_by_name = (_vm_soc_get_host_by_name_t)vm_get_sym_entry("vm_soc_get_host_by_name"); + + if (NULL != _vm_soc_get_host_by_name) + return _vm_soc_get_host_by_name(apn,host,result,callback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_host_by_name_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_host_by_name_ex.c new file mode 100644 index 00000000..2ddb5578 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_host_by_name_ex.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_get_host_by_name_ex_t)(VMINT apn, const VMCHAR * host, vm_soc_dns_result * result, VMINT (*callback)(VMINT, vm_soc_dns_result *, void *), void *user_data); +_vm_soc_get_host_by_name_ex_t _vm_soc_get_host_by_name_ex = NULL; + +VMINT vm_soc_get_host_by_name_ex(VMINT apn, const VMCHAR * host, vm_soc_dns_result * result, VMINT (*callback)(VMINT, vm_soc_dns_result *, void *), void *user_data) +{ + if (NULL == _vm_soc_get_host_by_name_ex) + _vm_soc_get_host_by_name_ex = (_vm_soc_get_host_by_name_ex_t)vm_get_sym_entry("vm_soc_get_host_by_name_ex"); + if (NULL != _vm_soc_get_host_by_name_ex) + return _vm_soc_get_host_by_name_ex(apn,host,result,callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_last_error.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_last_error.c new file mode 100644 index 00000000..e7d81fd5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_get_last_error.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_get_last_error_t)(void); +_vm_soc_get_last_error_t _vm_soc_get_last_error = NULL; + +VMINT vm_soc_get_last_error(void) +{ + if (NULL == _vm_soc_get_last_error) + _vm_soc_get_last_error = (_vm_soc_get_last_error_t)vm_get_sym_entry("vm_soc_get_last_error"); + if (NULL != _vm_soc_get_last_error) + return _vm_soc_get_last_error(); + return (VMINT)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_accept_sync.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_accept_sync.c new file mode 100644 index 00000000..7935ebaa --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_accept_sync.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_accept_sync_t)(VMINT s_hdl, vm_sockaddr_struct *addr); +_vm_soc_svr_accept_sync_t _vm_soc_svr_accept_sync = NULL; + +VMINT vm_soc_svr_accept_sync(VMINT s_hdl, vm_sockaddr_struct *addr) +{ + if (NULL == _vm_soc_svr_accept_sync) + _vm_soc_svr_accept_sync = (_vm_soc_svr_accept_sync_t)vm_get_sym_entry("vm_soc_svr_accept_sync"); + if (NULL != _vm_soc_svr_accept_sync) + return _vm_soc_svr_accept_sync(s_hdl,addr); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_close_client.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_close_client.c new file mode 100644 index 00000000..98958b66 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_close_client.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_close_client_t)(VMINT c_hdl); +_vm_soc_svr_close_client_t _vm_soc_svr_close_client = NULL; + +VMINT vm_soc_svr_close_client(VMINT c_hdl) +{ + if (NULL == _vm_soc_svr_close_client) + _vm_soc_svr_close_client = (_vm_soc_svr_close_client_t)vm_get_sym_entry("vm_soc_svr_close_client"); + if (NULL != _vm_soc_svr_close_client) + return _vm_soc_svr_close_client(c_hdl); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_close_client_sync.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_close_client_sync.c new file mode 100644 index 00000000..eb582730 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_close_client_sync.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_close_client_sync_t)(VMINT c_hdl); +_vm_soc_svr_close_client_sync_t _vm_soc_svr_close_client_sync = NULL; + +VMINT vm_soc_svr_close_client_sync(VMINT c_hdl) +{ + if (NULL == _vm_soc_svr_close_client_sync) + _vm_soc_svr_close_client_sync = (_vm_soc_svr_close_client_sync_t)vm_get_sym_entry("vm_soc_svr_close_client_sync"); + if (NULL != _vm_soc_svr_close_client_sync) + return _vm_soc_svr_close_client_sync(c_hdl); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_deinit.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_deinit.c new file mode 100644 index 00000000..ef8c159a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_deinit.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_deinit_t)(VMINT handle); +_vm_soc_svr_deinit_t _vm_soc_svr_deinit = NULL; + +VMINT vm_soc_svr_deinit(VMINT handle) +{ + if (NULL == _vm_soc_svr_deinit) + _vm_soc_svr_deinit = (_vm_soc_svr_deinit_t)vm_get_sym_entry("vm_soc_svr_deinit"); + if (NULL != _vm_soc_svr_deinit) + return _vm_soc_svr_deinit(handle); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_deinit_sync.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_deinit_sync.c new file mode 100644 index 00000000..952328fa --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_deinit_sync.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_deinit_sync_t)(VMINT s_hdl); +_vm_soc_svr_deinit_sync_t _vm_soc_svr_deinit_sync = NULL; + +VMINT vm_soc_svr_deinit_sync(VMINT s_hdl) +{ + if (NULL == _vm_soc_svr_deinit_sync) + _vm_soc_svr_deinit_sync = (_vm_soc_svr_deinit_sync_t)vm_get_sym_entry("vm_soc_svr_deinit_sync"); + if (NULL != _vm_soc_svr_deinit_sync) + return _vm_soc_svr_deinit_sync(s_hdl); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_get_soc_id.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_get_soc_id.c new file mode 100644 index 00000000..99a57df8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_get_soc_id.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_get_soc_id_t)(VMINT hdl); +_vm_soc_svr_get_soc_id_t _vm_soc_svr_get_soc_id = NULL; + +VMINT vm_soc_svr_get_soc_id(VMINT hdl) +{ + if (NULL == _vm_soc_svr_get_soc_id) + _vm_soc_svr_get_soc_id = (_vm_soc_svr_get_soc_id_t)vm_get_sym_entry("vm_soc_svr_get_soc_id"); + if (NULL != _vm_soc_svr_get_soc_id) + return _vm_soc_svr_get_soc_id(hdl); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_init.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_init.c new file mode 100644 index 00000000..a55ccb8a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_init.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_init_t)(VMINT apn, VMINT port, void *user_data, void (*callback)(VMINT handle, VMINT event, VMINT param, void *user_data)); +_vm_soc_svr_init_t _vm_soc_svr_init = NULL; + +VMINT vm_soc_svr_init(VMINT apn, VMINT port, void *user_data, void (*callback)(VMINT handle, VMINT event, VMINT param, void *user_data)) +{ + if (NULL == _vm_soc_svr_init) + _vm_soc_svr_init = (_vm_soc_svr_init_t)vm_get_sym_entry("vm_soc_svr_init"); + if (NULL != _vm_soc_svr_init) + return _vm_soc_svr_init(apn,port,user_data,callback); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_init_sync.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_init_sync.c new file mode 100644 index 00000000..46c93fcf --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_init_sync.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_init_sync_t)(VMINT apn, VMINT port); +_vm_soc_svr_init_sync_t _vm_soc_svr_init_sync = NULL; + +VMINT vm_soc_svr_init_sync(VMINT apn, VMINT port) +{ + if (NULL == _vm_soc_svr_init_sync) + _vm_soc_svr_init_sync = (_vm_soc_svr_init_sync_t)vm_get_sym_entry("vm_soc_svr_init_sync"); + if (NULL != _vm_soc_svr_init_sync) + return _vm_soc_svr_init_sync(apn,port); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_read.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_read.c new file mode 100644 index 00000000..0491d58f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_read.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_read_t)(VMINT s_hdl, VMINT c_hdl, void *data, VMUINT len); +_vm_soc_svr_read_t _vm_soc_svr_read = NULL; + +VMINT vm_soc_svr_read(VMINT s_hdl, VMINT c_hdl, void *data, VMUINT len) +{ + if (NULL == _vm_soc_svr_read) + _vm_soc_svr_read = (_vm_soc_svr_read_t)vm_get_sym_entry("vm_soc_svr_read"); + if (NULL != _vm_soc_svr_read) + return _vm_soc_svr_read(s_hdl,c_hdl,data,len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_read_sync.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_read_sync.c new file mode 100644 index 00000000..fe74ddd6 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_read_sync.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_read_sync_t)(VMINT c_hdl, void *data, VMUINT len); +_vm_soc_svr_read_sync_t _vm_soc_svr_read_sync = NULL; + +VMINT vm_soc_svr_read_sync(VMINT c_hdl, void *data, VMUINT len) +{ + if (NULL == _vm_soc_svr_read_sync) + _vm_soc_svr_read_sync = (_vm_soc_svr_read_sync_t)vm_get_sym_entry("vm_soc_svr_read_sync"); + if (NULL != _vm_soc_svr_read_sync) + return _vm_soc_svr_read_sync(c_hdl,data,len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_send.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_send.c new file mode 100644 index 00000000..9f1b772c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_send.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_send_t)(VMINT s_hdl, VMINT c_hdl, const void *data, VMUINT len); +_vm_soc_svr_send_t _vm_soc_svr_send = NULL; + +VMINT vm_soc_svr_send(VMINT s_hdl, VMINT c_hdl, const void *data, VMUINT len) +{ + if (NULL == _vm_soc_svr_send) + _vm_soc_svr_send = (_vm_soc_svr_send_t)vm_get_sym_entry("vm_soc_svr_send"); + if (NULL != _vm_soc_svr_send) + return _vm_soc_svr_send(s_hdl,c_hdl,data,len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_send_sync.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_send_sync.c new file mode 100644 index 00000000..d202a028 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_soc_svr_send_sync.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_soc_svr_send_sync_t)(VMINT c_hdl, const void *data, VMUINT len); +_vm_soc_svr_send_sync_t _vm_soc_svr_send_sync = NULL; + +VMINT vm_soc_svr_send_sync(VMINT c_hdl, const void *data, VMUINT len) +{ + if (NULL == _vm_soc_svr_send_sync) + _vm_soc_svr_send_sync = (_vm_soc_svr_send_sync_t)vm_get_sym_entry("vm_soc_svr_send_sync"); + if (NULL != _vm_soc_svr_send_sync) + return _vm_soc_svr_send_sync(c_hdl,data,len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_socket.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_socket.c new file mode 100644 index 00000000..8e29d1ce --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_socket.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_socket_t)(int family, int type, int protocol); +_vm_socket_t _vm_socket = NULL; + +int vm_socket(int family, int type, int protocol) +{ + if (NULL == _vm_socket) + _vm_socket = (_vm_socket_t)vm_get_sym_entry("vm_socket"); + if (NULL != _vm_socket) + return _vm_socket(family,type,protocol); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_socket_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_socket_ex.c new file mode 100644 index 00000000..d5ac7880 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_socket_ex.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_socket_ex_t)(int family, int type, int protocol, VMUINT32 data_account); +_vm_socket_ex_t _vm_socket_ex = NULL; + +int vm_socket_ex(int family, int type, int protocol, VMUINT32 data_account) +{ + if (NULL == _vm_socket_ex) + _vm_socket_ex = (_vm_socket_ex_t)vm_get_sym_entry("vm_socket_ex"); + if (NULL != _vm_socket_ex) + return _vm_socket_ex(family,type,protocol,data_account); + return (int)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sprintf.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sprintf.c new file mode 100644 index 00000000..18642cd3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sprintf.c @@ -0,0 +1,24 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_sprintf_t)( char * buf, const char * fmt, ... ); +_vm_sprintf_t _vm_sprintf = NULL; + +int vm_sprintf( char * buf, const char * fmt, ... ) +{ + int ret = {-1}; + if (NULL == _vm_sprintf) + _vm_sprintf = (_vm_sprintf_t)vm_get_sym_entry("vm_vsprintf"); + + if (NULL != _vm_sprintf) + { + va_list args; + va_start( args, fmt ); + ret = _vm_sprintf(buf, fmt, args); + va_end( args ); + } + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_check_connection.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_check_connection.c new file mode 100644 index 00000000..490bc3eb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_check_connection.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmbtnotify.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_srv_bt_noti_check_connection_t)(void); +_vm_srv_bt_noti_check_connection_t _vm_srv_bt_noti_check_connection = NULL; + +VMINT vm_srv_bt_noti_check_connection(void) +{ + if (NULL == _vm_srv_bt_noti_check_connection) + _vm_srv_bt_noti_check_connection = (_vm_srv_bt_noti_check_connection_t)vm_get_sym_entry("vm_srv_bt_noti_check_connection"); + if (NULL != _vm_srv_bt_noti_check_connection) + return _vm_srv_bt_noti_check_connection(); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_register_callback.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_register_callback.c new file mode 100644 index 00000000..802f515f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_register_callback.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmbtnotify.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_srv_bt_noti_register_callback_t)(const vm_srv_bt_cm_bt_addr *bt_addr, const VMCHAR sender[VM_MAX_IOER], vm_srv_bt_noti_callback cb); +_vm_srv_bt_noti_register_callback_t _vm_srv_bt_noti_register_callback = NULL; + +VMINT vm_srv_bt_noti_register_callback(const vm_srv_bt_cm_bt_addr *bt_addr, const VMCHAR sender[VM_MAX_IOER], vm_srv_bt_noti_callback cb) +{ + if (NULL == _vm_srv_bt_noti_register_callback) + _vm_srv_bt_noti_register_callback = (_vm_srv_bt_noti_register_callback_t)vm_get_sym_entry("vm_srv_bt_noti_register_callback"); + if (NULL != _vm_srv_bt_noti_register_callback) + return _vm_srv_bt_noti_register_callback(bt_addr,sender,cb); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_send_cmd_ext.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_send_cmd_ext.c new file mode 100644 index 00000000..3c09d343 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_send_cmd_ext.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmbtnotify.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_srv_bt_noti_send_cmd_ext_t)(const vm_srv_bt_cm_bt_addr *bt_addr, const VMCHAR reader[VM_MAX_IOER], VMINT data_type, const VMBYTE *data, VMINT len); +_vm_srv_bt_noti_send_cmd_ext_t _vm_srv_bt_noti_send_cmd_ext = NULL; + +VMINT vm_srv_bt_noti_send_cmd_ext(const vm_srv_bt_cm_bt_addr *bt_addr, const VMCHAR reader[VM_MAX_IOER], VMINT data_type, const VMBYTE *data, VMINT len) +{ + if (NULL == _vm_srv_bt_noti_send_cmd_ext) + _vm_srv_bt_noti_send_cmd_ext = (_vm_srv_bt_noti_send_cmd_ext_t)vm_get_sym_entry("vm_srv_bt_noti_send_cmd_ext"); + if (NULL != _vm_srv_bt_noti_send_cmd_ext) + return _vm_srv_bt_noti_send_cmd_ext(bt_addr,reader,data_type,data,len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_send_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_send_ex.c new file mode 100644 index 00000000..eacfeee0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_bt_noti_send_ex.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmbtnotify.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_srv_bt_noti_send_ex_t)(const vm_srv_bt_cm_bt_addr *bt_addr, const VMCHAR sender[VM_MAX_IOER], const VMCHAR receiver[VM_MAX_IOER], VMINT data_type, const VMBYTE *data, VMINT len); +_vm_srv_bt_noti_send_ex_t _vm_srv_bt_noti_send_ex = NULL; + +VMINT vm_srv_bt_noti_send_ex(const vm_srv_bt_cm_bt_addr *bt_addr, const VMCHAR sender[VM_MAX_IOER], const VMCHAR receiver[VM_MAX_IOER], VMINT data_type, const VMBYTE *data, VMINT len) +{ + if (NULL == _vm_srv_bt_noti_send_ex) + _vm_srv_bt_noti_send_ex = (_vm_srv_bt_noti_send_ex_t)vm_get_sym_entry("vm_srv_bt_noti_send_ex"); + if (NULL != _vm_srv_bt_noti_send_ex) + return _vm_srv_bt_noti_send_ex(bt_addr,sender,receiver,data_type,data,len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_funet_trigger.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_funet_trigger.c new file mode 100644 index 00000000..71d20f64 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_funet_trigger.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmfota.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef vm_srv_funet_flag_enum (*_vm_srv_funet_trigger_t)(VMWCHAR * file_name, vm_srv_funet_update_type_enum update_type); +_vm_srv_funet_trigger_t _vm_srv_funet_trigger = NULL; + +vm_srv_funet_flag_enum vm_srv_funet_trigger(VMWCHAR * file_name, vm_srv_funet_update_type_enum update_type) +{ + if (NULL == _vm_srv_funet_trigger) + _vm_srv_funet_trigger = (_vm_srv_funet_trigger_t)vm_get_sym_entry("vm_srv_funet_trigger"); + + if (NULL != _vm_srv_funet_trigger) + return _vm_srv_funet_trigger(file_name,update_type); + + return (vm_srv_funet_flag_enum )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_nw_info_get_protocol.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_nw_info_get_protocol.c new file mode 100644 index 00000000..23f83219 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_nw_info_get_protocol.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_srv_nw_info_get_protocol_t)(VMINT sim_card); +_vm_srv_nw_info_get_protocol_t _vm_srv_nw_info_get_protocol = NULL; + +VMINT vm_srv_nw_info_get_protocol(VMINT sim_card) +{ + if (NULL == _vm_srv_nw_info_get_protocol) + _vm_srv_nw_info_get_protocol = (_vm_srv_nw_info_get_protocol_t)vm_get_sym_entry("vm_srv_nw_info_get_protocol"); + + if (NULL != _vm_srv_nw_info_get_protocol) + return _vm_srv_nw_info_get_protocol(sim_card); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_nw_info_get_service_availability.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_nw_info_get_service_availability.c new file mode 100644 index 00000000..59304339 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_nw_info_get_service_availability.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_srv_nw_info_get_service_availability_t)(VMINT sim_card); +_vm_srv_nw_info_get_service_availability_t _vm_srv_nw_info_get_service_availability = NULL; + +VMINT vm_srv_nw_info_get_service_availability(VMINT sim_card) +{ + if (NULL == _vm_srv_nw_info_get_service_availability) + _vm_srv_nw_info_get_service_availability = (_vm_srv_nw_info_get_service_availability_t)vm_get_sym_entry("vm_srv_nw_info_get_service_availability"); + + if (NULL != _vm_srv_nw_info_get_service_availability) + return _vm_srv_nw_info_get_service_availability(sim_card); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_acc_data_rigister_cb.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_acc_data_rigister_cb.c new file mode 100644 index 00000000..4d0457ed --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_acc_data_rigister_cb.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmsettings.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_srv_sensor_acc_data_rigister_cb_t)(vm_srv_sensor_acc_data_cb event_hdlr); +_vm_srv_sensor_acc_data_rigister_cb_t _vm_srv_sensor_acc_data_rigister_cb = NULL; +void vm_srv_sensor_acc_data_rigister_cb(vm_srv_sensor_acc_data_cb event_hdlr) + +{ + if (NULL == _vm_srv_sensor_acc_data_rigister_cb) + _vm_srv_sensor_acc_data_rigister_cb = (_vm_srv_sensor_acc_data_rigister_cb_t)vm_get_sym_entry("vm_srv_sensor_acc_data_rigister_cb"); + if (NULL != _vm_srv_sensor_acc_data_rigister_cb) + _vm_srv_sensor_acc_data_rigister_cb(event_hdlr); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_disable_mode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_disable_mode.c new file mode 100644 index 00000000..a1db84a6 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_disable_mode.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsensor.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_SRV_SENSOR_RESULT (*_vm_srv_sensor_disable_mode_t)(VM_SRV_SENSOR_HANDLE handle, VMUINT16 sensor_mode); +_vm_srv_sensor_disable_mode_t _vm_srv_sensor_disable_mode = NULL; + +VM_SRV_SENSOR_RESULT vm_srv_sensor_disable_mode(VM_SRV_SENSOR_HANDLE handle, VMUINT16 sensor_mode) +{ + if (NULL == _vm_srv_sensor_disable_mode) + _vm_srv_sensor_disable_mode = (_vm_srv_sensor_disable_mode_t)vm_get_sym_entry("vm_srv_sensor_disable_mode"); + + if (NULL != _vm_srv_sensor_disable_mode) + return _vm_srv_sensor_disable_mode(handle,sensor_mode); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_enable_mode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_enable_mode.c new file mode 100644 index 00000000..abc9d559 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_enable_mode.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsensor.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_SRV_SENSOR_RESULT (*_vm_srv_sensor_enable_mode_t)(VM_SRV_SENSOR_HANDLE handle , VMUINT16 sensor_mode); +_vm_srv_sensor_enable_mode_t _vm_srv_sensor_enable_mode = NULL; + +VM_SRV_SENSOR_RESULT vm_srv_sensor_enable_mode(VM_SRV_SENSOR_HANDLE handle , VMUINT16 sensor_mode) +{ + if (NULL == _vm_srv_sensor_enable_mode) + _vm_srv_sensor_enable_mode = (_vm_srv_sensor_enable_mode_t)vm_get_sym_entry("vm_srv_sensor_enable_mode"); + + if (NULL != _vm_srv_sensor_enable_mode) + return _vm_srv_sensor_enable_mode(handle,sensor_mode); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_hr_data_rigister_cb.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_hr_data_rigister_cb.c new file mode 100644 index 00000000..d1621753 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_hr_data_rigister_cb.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmsettings.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_srv_sensor_hr_data_rigister_cb_t)(vm_srv_sensor_hr_data_cb event_hdlr); +_vm_srv_sensor_hr_data_rigister_cb_t _vm_srv_sensor_hr_data_rigister_cb = NULL; +void vm_srv_sensor_hr_data_rigister_cb(vm_srv_sensor_hr_data_cb event_hdlr) + +{ + if (NULL == _vm_srv_sensor_hr_data_rigister_cb) + _vm_srv_sensor_hr_data_rigister_cb = (_vm_srv_sensor_hr_data_rigister_cb_t)vm_get_sym_entry("vm_srv_sensor_hr_data_rigister_cb"); + if (NULL != _vm_srv_sensor_hr_data_rigister_cb) + _vm_srv_sensor_hr_data_rigister_cb(event_hdlr); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_is_available.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_is_available.c new file mode 100644 index 00000000..b1c6ed39 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_is_available.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsensor.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_srv_sensor_is_available_t)(vm_srv_sensor_type_enum sensor_type); +_vm_srv_sensor_is_available_t _vm_srv_sensor_is_available = NULL; + +VMINT vm_srv_sensor_is_available(vm_srv_sensor_type_enum sensor_type) +{ + if (NULL == _vm_srv_sensor_is_available) + _vm_srv_sensor_is_available = (_vm_srv_sensor_is_available_t)vm_get_sym_entry("vm_srv_sensor_is_available"); + + if (NULL != _vm_srv_sensor_is_available) + return _vm_srv_sensor_is_available(sensor_type); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_start_listen.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_start_listen.c new file mode 100644 index 00000000..727fd95d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_start_listen.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsensor.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_srv_sensor_start_listen_t)(vm_srv_sensor_type_enum type, void *option, VM_SRV_SENSOR_EVENT_HDLR event_hdlr, void *user_data); +_vm_srv_sensor_start_listen_t _vm_srv_sensor_start_listen = NULL; + +VM_SRV_SENSOR_HANDLE vm_srv_sensor_start_listen(vm_srv_sensor_type_enum type, void *option, VM_SRV_SENSOR_EVENT_HDLR event_hdlr, void *user_data) +{ + if (NULL == _vm_srv_sensor_start_listen) + _vm_srv_sensor_start_listen = (_vm_srv_sensor_start_listen_t)vm_get_sym_entry("vm_srv_sensor_start_listen"); + + if (NULL != _vm_srv_sensor_start_listen) + return _vm_srv_sensor_start_listen(type,option,event_hdlr,user_data); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_stop_listen.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_stop_listen.c new file mode 100644 index 00000000..b1ea5e93 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_srv_sensor_stop_listen.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsensor.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_SRV_SENSOR_RESULT (*_vm_srv_sensor_stop_listen_t)(VM_SRV_SENSOR_HANDLE handle); +_vm_srv_sensor_stop_listen_t _vm_srv_sensor_stop_listen = NULL; + +VM_SRV_SENSOR_RESULT vm_srv_sensor_stop_listen(VM_SRV_SENSOR_HANDLE handle) +{ + if (NULL == _vm_srv_sensor_stop_listen) + _vm_srv_sensor_stop_listen = (_vm_srv_sensor_stop_listen_t)vm_get_sym_entry("vm_srv_sensor_stop_listen"); + + if (NULL != _vm_srv_sensor_stop_listen) + return _vm_srv_sensor_stop_listen(handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sscanf.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sscanf.c new file mode 100644 index 00000000..ae0995a9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sscanf.c @@ -0,0 +1,24 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_sscanf_t)(const char * str, const char *format, va_list args); +_vm_sscanf_t _vm_sscanf = NULL; +int vm_sscanf(const char *str, const char *format, ...) +{ + VMINT result = -1; + if (_vm_sscanf == NULL) { + _vm_sscanf = (_vm_sscanf_t)vm_get_sym_entry("vm_sscanf"); + } + + if (_vm_sscanf != NULL) + { + va_list args; + va_start(args, format ); + result = _vm_sscanf(str, format, args); + va_end( args ); + } + return result; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_base64_decode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_base64_decode.c new file mode 100644 index 00000000..f1a6e616 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_base64_decode.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmssl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ssl_base64_decode_t)(VMBYTE *dst, VMINT *dlen, VMBYTE *src, VMINT slen); +_vm_ssl_base64_decode_t _vm_ssl_base64_decode = NULL; + +VMINT vm_ssl_base64_decode(VMBYTE *dst, VMINT *dlen, VMBYTE *src, VMINT slen) +{ + if (NULL == _vm_ssl_base64_decode) + _vm_ssl_base64_decode = (_vm_ssl_base64_decode_t)vm_get_sym_entry("vm_ssl_base64_decode"); + if (NULL != _vm_ssl_base64_decode) + return _vm_ssl_base64_decode(dst,dlen,src,slen); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_base64_encode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_base64_encode.c new file mode 100644 index 00000000..47b3ed4a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_base64_encode.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmssl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ssl_base64_encode_t)(VMBYTE *dst, VMINT *dlen, VMBYTE *src, VMINT slen); +_vm_ssl_base64_encode_t _vm_ssl_base64_encode = NULL; + +VMINT vm_ssl_base64_encode(VMBYTE *dst, VMINT *dlen, VMBYTE *src, VMINT slen) +{ + if (NULL == _vm_ssl_base64_encode) + _vm_ssl_base64_encode = (_vm_ssl_base64_encode_t)vm_get_sym_entry("vm_ssl_base64_encode"); + if (NULL != _vm_ssl_base64_encode) + return _vm_ssl_base64_encode(dst,dlen,src,slen); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_close.c new file mode 100644 index 00000000..a4abf78b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_close.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmssl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ssl_close_t)(VMINT handle); +_vm_ssl_close_t _vm_ssl_close = NULL; + +VMINT vm_ssl_close(VMINT handle) +{ + if (NULL == _vm_ssl_close) + _vm_ssl_close = (_vm_ssl_close_t)vm_get_sym_entry("vm_ssl_close"); + if (NULL != _vm_ssl_close) + return _vm_ssl_close(handle); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_connect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_connect.c new file mode 100644 index 00000000..70dbba95 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_connect.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmssl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ssl_connect_t)(const vm_ssl_cntx *ctx); +_vm_ssl_connect_t _vm_ssl_connect = NULL; + +VMINT vm_ssl_connect(const vm_ssl_cntx *ctx) +{ + if (NULL == _vm_ssl_connect) + _vm_ssl_connect = (_vm_ssl_connect_t)vm_get_sym_entry("vm_ssl_connect"); + if (NULL != _vm_ssl_connect) + return _vm_ssl_connect(ctx); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_get_verify_result.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_get_verify_result.c new file mode 100644 index 00000000..bb57cc2a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_get_verify_result.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmssl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ssl_get_verify_result_t)(VMINT handle); +_vm_ssl_get_verify_result_t _vm_ssl_get_verify_result = NULL; + +VMINT vm_ssl_get_verify_result(VMINT handle) +{ + if (NULL == _vm_ssl_get_verify_result) + _vm_ssl_get_verify_result = (_vm_ssl_get_verify_result_t)vm_get_sym_entry("vm_ssl_get_verify_result"); + if (NULL != _vm_ssl_get_verify_result) + return _vm_ssl_get_verify_result(handle); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_is_support.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_is_support.c new file mode 100644 index 00000000..6a858d26 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_is_support.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmssl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ssl_is_support_t)(void); +_vm_ssl_is_support_t _vm_ssl_is_support = NULL; + +VMINT vm_ssl_is_support(void) +{ + if (NULL == _vm_ssl_is_support) + _vm_ssl_is_support = (_vm_ssl_is_support_t)vm_get_sym_entry("vm_ssl_is_support"); + if (NULL != _vm_ssl_is_support) + return _vm_ssl_is_support(); + return (VMINT)0; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_load_ca_chain_cert.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_load_ca_chain_cert.c new file mode 100644 index 00000000..d68fba70 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_load_ca_chain_cert.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmssl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ssl_load_ca_chain_cert_t)(VMINT handle, const void *cert_buf, VMINT buf_len); +_vm_ssl_load_ca_chain_cert_t _vm_ssl_load_ca_chain_cert = NULL; + +VMINT vm_ssl_load_ca_chain_cert(VMINT handle, const void *cert_buf, VMINT buf_len) +{ + if (NULL == _vm_ssl_load_ca_chain_cert) + _vm_ssl_load_ca_chain_cert = (_vm_ssl_load_ca_chain_cert_t)vm_get_sym_entry("vm_ssl_load_ca_chain_cert"); + if (NULL != _vm_ssl_load_ca_chain_cert) + return _vm_ssl_load_ca_chain_cert(handle,cert_buf,buf_len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_read.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_read.c new file mode 100644 index 00000000..91519db1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_read.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmssl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ssl_read_t)(VMINT handle, VMUINT8 *buf, VMINT len); +_vm_ssl_read_t _vm_ssl_read = NULL; + +VMINT vm_ssl_read(VMINT handle, VMUINT8 *buf, VMINT len) +{ + if (NULL == _vm_ssl_read) + _vm_ssl_read = (_vm_ssl_read_t)vm_get_sym_entry("vm_ssl_read"); + if (NULL != _vm_ssl_read) + return _vm_ssl_read(handle,buf,len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_sha1_hmac.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_sha1_hmac.c new file mode 100644 index 00000000..73be6453 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_sha1_hmac.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmssl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ssl_sha1_hmac_t)(VMBYTE *key, VMINT keylen, VMBYTE *input, VMINT ilen, VMBYTE output[20]); +_vm_ssl_sha1_hmac_t _vm_ssl_sha1_hmac = NULL; + +VMINT vm_ssl_sha1_hmac(VMBYTE *key, VMINT keylen, VMBYTE *input, VMINT ilen, VMBYTE output[20]) +{ + if (NULL == _vm_ssl_sha1_hmac) + _vm_ssl_sha1_hmac = (_vm_ssl_sha1_hmac_t)vm_get_sym_entry("vm_ssl_sha1_hmac"); + if (NULL != _vm_ssl_sha1_hmac) + return _vm_ssl_sha1_hmac(key,keylen,input,ilen,output); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_write.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_write.c new file mode 100644 index 00000000..2245b694 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ssl_write.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmssl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ssl_write_t)(VMINT handle, const VMUINT8 *buf, VMINT len); +_vm_ssl_write_t _vm_ssl_write = NULL; + +VMINT vm_ssl_write(VMINT handle, const VMUINT8 *buf, VMINT len) +{ + if (NULL == _vm_ssl_write) + _vm_ssl_write = (_vm_ssl_write_t)vm_get_sym_entry("vm_ssl_write"); + if (NULL != _vm_ssl_write) + return _vm_ssl_write(handle,buf,len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_add_account.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_add_account.c new file mode 100644 index 00000000..33ea74d4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_add_account.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_add_account_t)(VMUINT32 provider, const VMWCHAR * username, const VMWCHAR * password, vm_sso_account_callback callback, void * user_data); +_vm_sso_add_account_t _vm_sso_add_account = NULL; + +VMINT vm_sso_add_account(VMUINT32 provider, const VMWCHAR * username, const VMWCHAR * password, vm_sso_account_callback callback, void * user_data) +{ + if (NULL == _vm_sso_add_account) + _vm_sso_add_account = (_vm_sso_add_account_t)vm_get_sym_entry("vm_sso_add_account"); + + if (NULL != _vm_sso_add_account) + return _vm_sso_add_account(provider,username,password,callback,user_data); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_cancel.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_cancel.c new file mode 100644 index 00000000..0a38a8d2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_cancel.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_cancel_t)(VMINT req_id); +_vm_sso_cancel_t _vm_sso_cancel = NULL; + +VMINT vm_sso_cancel(VMINT req_id) +{ + if (NULL == _vm_sso_cancel) + _vm_sso_cancel = (_vm_sso_cancel_t)vm_get_sym_entry("vm_sso_cancel"); + + if (NULL != _vm_sso_cancel) + return _vm_sso_cancel(req_id); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_del_account.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_del_account.c new file mode 100644 index 00000000..f6c2b617 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_del_account.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_del_account_t)(VMUINT32 provider, VMUINT8 account, vm_sso_result_callback callback, void * user_data); +_vm_sso_del_account_t _vm_sso_del_account = NULL; + +VMINT vm_sso_del_account(VMUINT32 provider, VMUINT8 account, vm_sso_result_callback callback, void * user_data) +{ + if (NULL == _vm_sso_del_account) + _vm_sso_del_account = (_vm_sso_del_account_t)vm_get_sym_entry("vm_sso_del_account"); + + if (NULL != _vm_sso_del_account) + return _vm_sso_del_account(provider,account,callback,user_data); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account.c new file mode 100644 index 00000000..f76933f0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_get_account_t)(VMUINT32 provider, VMUINT8 account, vm_sso_account_struct * buffer); +_vm_sso_get_account_t _vm_sso_get_account = NULL; + +VMINT vm_sso_get_account(VMUINT32 provider, VMUINT8 account, vm_sso_account_struct * buffer) +{ + if (NULL == _vm_sso_get_account) + _vm_sso_get_account = (_vm_sso_get_account_t)vm_get_sym_entry("vm_sso_get_account"); + + if (NULL != _vm_sso_get_account) + return _vm_sso_get_account(provider,account,buffer); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account_count.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account_count.c new file mode 100644 index 00000000..43f3c16f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account_count.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_get_account_count_t)(VMUINT32 provider, vm_sso_login_state login_state); +_vm_sso_get_account_count_t _vm_sso_get_account_count = NULL; + +VMINT vm_sso_get_account_count(VMUINT32 provider, vm_sso_login_state login_state) +{ + if (NULL == _vm_sso_get_account_count) + _vm_sso_get_account_count = (_vm_sso_get_account_count_t)vm_get_sym_entry("vm_sso_get_account_count"); + + if (NULL != _vm_sso_get_account_count) + return _vm_sso_get_account_count(provider,login_state); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account_name.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account_name.c new file mode 100644 index 00000000..e232e7f2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_account_name.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_get_account_name_t)(VMUINT32 provider, VMUINT8 account, VMWCHAR * buffer); +_vm_sso_get_account_name_t _vm_sso_get_account_name = NULL; + +VMINT vm_sso_get_account_name(VMUINT32 provider, VMUINT8 account, VMWCHAR * buffer) +{ + if (NULL == _vm_sso_get_account_name) + _vm_sso_get_account_name = (_vm_sso_get_account_name_t)vm_get_sym_entry("vm_sso_get_account_name"); + + if (NULL != _vm_sso_get_account_name) + return _vm_sso_get_account_name(provider,account,buffer); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_accounts.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_accounts.c new file mode 100644 index 00000000..6d57a446 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_accounts.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_get_accounts_t)(VMUINT32 provider, vm_sso_login_state login_state, vm_sso_account_struct * buffer, VMUINT8 buffer_items); +_vm_sso_get_accounts_t _vm_sso_get_accounts = NULL; + +VMINT vm_sso_get_accounts(VMUINT32 provider, vm_sso_login_state login_state, vm_sso_account_struct * buffer, VMUINT8 buffer_items) +{ + if (NULL == _vm_sso_get_accounts) + _vm_sso_get_accounts = (_vm_sso_get_accounts_t)vm_get_sym_entry("vm_sso_get_accounts"); + + if (NULL != _vm_sso_get_accounts) + return _vm_sso_get_accounts(provider,login_state,buffer,buffer_items); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_credentials.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_credentials.c new file mode 100644 index 00000000..e40c5eee --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_credentials.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_get_credentials_t)(VMUINT32 provider, VMUINT8 account, vm_sso_credential_struct * buffer); +_vm_sso_get_credentials_t _vm_sso_get_credentials = NULL; + +VMINT vm_sso_get_credentials(VMUINT32 provider, VMUINT8 account, vm_sso_credential_struct * buffer) +{ + if (NULL == _vm_sso_get_credentials) + _vm_sso_get_credentials = (_vm_sso_get_credentials_t)vm_get_sym_entry("vm_sso_get_credentials"); + + if (NULL != _vm_sso_get_credentials) + return _vm_sso_get_credentials(provider,account,buffer); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider.c new file mode 100644 index 00000000..59e1303d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_get_provider_t)(VMUINT32 provider, vm_sso_provider_struct * buffer); +_vm_sso_get_provider_t _vm_sso_get_provider = NULL; + +VMINT vm_sso_get_provider(VMUINT32 provider, vm_sso_provider_struct * buffer) +{ + if (NULL == _vm_sso_get_provider) + _vm_sso_get_provider = (_vm_sso_get_provider_t)vm_get_sym_entry("vm_sso_get_provider"); + + if (NULL != _vm_sso_get_provider) + return _vm_sso_get_provider(provider,buffer); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_count.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_count.c new file mode 100644 index 00000000..b000142d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_count.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_get_provider_count_t)(void); +_vm_sso_get_provider_count_t _vm_sso_get_provider_count = NULL; + +VMINT vm_sso_get_provider_count(void) +{ + if (NULL == _vm_sso_get_provider_count) + _vm_sso_get_provider_count = (_vm_sso_get_provider_count_t)vm_get_sym_entry("vm_sso_get_provider_count"); + + if (NULL != _vm_sso_get_provider_count) + return _vm_sso_get_provider_count(); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_icon.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_icon.c new file mode 100644 index 00000000..811e08aa --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_icon.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_get_provider_icon_t)(VMUINT32 provider, vm_sso_icon_enum type, VMWCHAR ** icon_path); +_vm_sso_get_provider_icon_t _vm_sso_get_provider_icon = NULL; + +VMINT vm_sso_get_provider_icon(VMUINT32 provider, vm_sso_icon_enum type, VMWCHAR ** icon_path) +{ + if (NULL == _vm_sso_get_provider_icon) + _vm_sso_get_provider_icon = (_vm_sso_get_provider_icon_t)vm_get_sym_entry("vm_sso_get_provider_icon"); + + if (NULL != _vm_sso_get_provider_icon) + return _vm_sso_get_provider_icon(provider,type,icon_path); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_name.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_name.c new file mode 100644 index 00000000..bec8fa54 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_provider_name.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_get_provider_name_t)(VMUINT32 provider, VMWCHAR * buffer); +_vm_sso_get_provider_name_t _vm_sso_get_provider_name = NULL; + +VMINT vm_sso_get_provider_name(VMUINT32 provider, VMWCHAR * buffer) +{ + if (NULL == _vm_sso_get_provider_name) + _vm_sso_get_provider_name = (_vm_sso_get_provider_name_t)vm_get_sym_entry("vm_sso_get_provider_name"); + + if (NULL != _vm_sso_get_provider_name) + return _vm_sso_get_provider_name(provider,buffer); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_providers.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_providers.c new file mode 100644 index 00000000..5bc2f2ab --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_get_providers.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_get_providers_t)(vm_sso_provider_struct * buffer, VMUINT8 buffer_items); +_vm_sso_get_providers_t _vm_sso_get_providers = NULL; + +VMINT vm_sso_get_providers(vm_sso_provider_struct * buffer, VMUINT8 buffer_items) +{ + if (NULL == _vm_sso_get_providers) + _vm_sso_get_providers = (_vm_sso_get_providers_t)vm_get_sym_entry("vm_sso_get_providers"); + + if (NULL != _vm_sso_get_providers) + return _vm_sso_get_providers(buffer,buffer_items); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_login_account.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_login_account.c new file mode 100644 index 00000000..4c03ff2b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_login_account.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_login_account_t)(VMUINT32 provider, VMUINT8 account, const VMWCHAR * password, vm_sso_account_callback callback, void * user_data); +_vm_sso_login_account_t _vm_sso_login_account = NULL; + +VMINT vm_sso_login_account(VMUINT32 provider, VMUINT8 account, const VMWCHAR * password, vm_sso_account_callback callback, void * user_data) +{ + if (NULL == _vm_sso_login_account) + _vm_sso_login_account = (_vm_sso_login_account_t)vm_get_sym_entry("vm_sso_login_account"); + + if (NULL != _vm_sso_login_account) + return _vm_sso_login_account(provider,account,password,callback,user_data); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_logout_account.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_logout_account.c new file mode 100644 index 00000000..c0c6cdf3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_logout_account.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_logout_account_t)(VMUINT32 provider, VMUINT8 account, vm_sso_result_callback callback, void * user_data); +_vm_sso_logout_account_t _vm_sso_logout_account = NULL; + +VMINT vm_sso_logout_account(VMUINT32 provider, VMUINT8 account, vm_sso_result_callback callback, void * user_data) +{ + if (NULL == _vm_sso_logout_account) + _vm_sso_logout_account = (_vm_sso_logout_account_t)vm_get_sym_entry("vm_sso_logout_account"); + + if (NULL != _vm_sso_logout_account) + return _vm_sso_logout_account(provider,account,callback,user_data); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_refresh_credentials.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_refresh_credentials.c new file mode 100644 index 00000000..c9f558ff --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sso_refresh_credentials.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsso.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sso_refresh_credentials_t)(VMUINT32 provider, VMUINT8 account, vm_sso_result_callback callback, void * user_data); +_vm_sso_refresh_credentials_t _vm_sso_refresh_credentials = NULL; + +VMINT vm_sso_refresh_credentials(VMUINT32 provider, VMUINT8 account, vm_sso_result_callback callback, void * user_data) +{ + if (NULL == _vm_sso_refresh_credentials) + _vm_sso_refresh_credentials = (_vm_sso_refresh_credentials_t)vm_get_sym_entry("vm_sso_refresh_credentials"); + + if (NULL != _vm_sso_refresh_credentials) + return _vm_sso_refresh_credentials(provider,account,callback,user_data); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_start_app.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_start_app.c new file mode 100644 index 00000000..1575c2ac --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_start_app.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_start_app_t)(const VMWCHAR* filepath, VMINT parent_app_handle, VMINT flag); +_vm_start_app_t _vm_start_app = NULL; + +void vm_start_app(const VMWCHAR* filepath, VMINT parent_app_handle, VMINT flag) +{ + if (NULL == _vm_start_app) + _vm_start_app = (_vm_start_app_t)vm_get_sym_entry("vm_start_app"); + + if (NULL != _vm_start_app) + _vm_start_app(filepath, parent_app_handle, flag); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_start_app_with_para.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_start_app_with_para.c new file mode 100644 index 00000000..24faa450 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_start_app_with_para.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmpromng.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_start_app_with_para_t)(const VMWCHAR* filepath, VMINT parent_app_handle, VMINT is_parent_exit,void* parameter,VMINT parameter_size); +_vm_start_app_with_para_t _vm_start_app_with_para = NULL; + +void vm_start_app_with_para(const VMWCHAR* filepath, VMINT parent_app_handle, VMINT is_parent_exit,void* parameter,VMINT parameter_size) +{ + if (NULL == _vm_start_app_with_para) + _vm_start_app_with_para = (_vm_start_app_with_para_t)vm_get_sym_entry("vm_start_app_with_para"); + + if (NULL != _vm_start_app_with_para) + _vm_start_app_with_para(filepath, parent_app_handle, is_parent_exit, parameter, parameter_size); +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_close.c new file mode 100644 index 00000000..d9780d54 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_close.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_storage_close_t)(VMINT h); +_vm_storage_close_t _vm_storage_close = NULL; + +void vm_storage_close(VMINT h) +{ + if (NULL == _vm_storage_close) + _vm_storage_close = (_vm_storage_close_t)vm_get_sym_entry("vm_storage_close"); + + if (NULL != _vm_storage_close) + _vm_storage_close(h); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_open.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_open.c new file mode 100644 index 00000000..5a5b3cb1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_open.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_storage_open_t)(void); +_vm_storage_open_t _vm_storage_open = NULL; + +VMINT vm_storage_open(void) +{ + if (NULL == _vm_storage_open) + _vm_storage_open = (_vm_storage_open_t)vm_get_sym_entry("vm_storage_open"); + + if (NULL != _vm_storage_open) + return _vm_storage_open(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_read.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_read.c new file mode 100644 index 00000000..cf4ebd52 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_read.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_storage_read_t)(VMINT h, void * data, VMUINT offset, VMUINT size, VMUINT * read); +_vm_storage_read_t _vm_storage_read = NULL; + +VMINT vm_storage_read(VMINT h, void * data, VMUINT offset, VMUINT size, VMUINT * read) +{ + if (NULL == _vm_storage_read) + _vm_storage_read = (_vm_storage_read_t)vm_get_sym_entry("vm_storage_read"); + + if (NULL != _vm_storage_read) + return _vm_storage_read(h,data,offset,size,read); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_write.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_write.c new file mode 100644 index 00000000..004abd40 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_storage_write.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_storage_write_t)(VMINT h, const void * data, VMUINT offset, VMUINT size, VMUINT * written); +_vm_storage_write_t _vm_storage_write = NULL; + +VMINT vm_storage_write(VMINT h, const void * data, VMUINT offset, VMUINT size, VMUINT * written) +{ + if (NULL == _vm_storage_write) + _vm_storage_write = (_vm_storage_write_t)vm_get_sym_entry("vm_storage_write"); + + if (NULL != _vm_storage_write) + return _vm_storage_write(h,data,offset,size,written); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_connect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_connect.c new file mode 100644 index 00000000..6cd215b9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_connect.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstream.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_stream_connect_t)(vm_stream_connect_struct connect_info); +_vm_stream_connect_t _vm_stream_connect = NULL; + +VMINT vm_stream_connect(vm_stream_connect_struct connect_info) +{ + if (NULL == _vm_stream_connect) + _vm_stream_connect = (_vm_stream_connect_t)vm_get_sym_entry("vm_stream_connect"); + + if (NULL != _vm_stream_connect) + return _vm_stream_connect(connect_info); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_disconnect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_disconnect.c new file mode 100644 index 00000000..0490aca8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_disconnect.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstream.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_stream_disconnect_t)(VMUINT8 session_id); +_vm_stream_disconnect_t _vm_stream_disconnect = NULL; + +VMINT vm_stream_disconnect(VMUINT8 session_id) +{ + if (NULL == _vm_stream_disconnect) + _vm_stream_disconnect = (_vm_stream_disconnect_t)vm_get_sym_entry("vm_stream_disconnect"); + + if (NULL != _vm_stream_disconnect) + return _vm_stream_disconnect(session_id); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_set_volume.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_set_volume.c new file mode 100644 index 00000000..a39e0d79 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_stream_set_volume.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmstream.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_stream_set_volume_t)(vm_stream_volume_enum type, VMUINT value); +_vm_stream_set_volume_t _vm_stream_set_volume = NULL; + +void vm_stream_set_volume(vm_stream_volume_enum type, VMUINT value) +{ + if (NULL == _vm_stream_set_volume) + _vm_stream_set_volume = (_vm_stream_set_volume_t)vm_get_sym_entry("vm_stream_set_volume"); + + if (NULL != _vm_stream_set_volume) + _vm_stream_set_volume(type, value); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_string_equals_ignore_case.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_string_equals_ignore_case.c new file mode 100644 index 00000000..f28e6ec9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_string_equals_ignore_case.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_string_equals_ignore_case_t)(const char *s1, const char *s2); +_vm_string_equals_ignore_case_t _vm_string_equals_ignore_case = NULL; + +VMINT vm_string_equals_ignore_case(const char *s1, const char *s2) +{ + if (NULL == _vm_string_equals_ignore_case) + _vm_string_equals_ignore_case = (_vm_string_equals_ignore_case_t)vm_get_sym_entry("vm_string_equals_ignore_case"); + + if (NULL != _vm_string_equals_ignore_case) + return _vm_string_equals_ignore_case(s1,s2); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_strtol.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_strtol.c new file mode 100644 index 00000000..42908af5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_strtol.c @@ -0,0 +1,17 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef long(*_strtol_t)(const char * nptr, char **endptr, int base); + _strtol_t _strtol = NULL; +long vm_strtol(const char * nptr, char **endptr, int base) +{ + if (_strtol == NULL) { + _strtol = (_strtol_t)vm_get_sym_entry("strtol"); + } + if (_strtol != NULL) { + return _strtol(nptr, endptr, base); + } + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_switch_backlight.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_switch_backlight.c new file mode 100644 index 00000000..cd3b4916 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_switch_backlight.c @@ -0,0 +1,15 @@ +#include "vmsys.h" +#include "vmpwr.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_switch_backlight_t)(VMINT turn_on); +_vm_switch_backlight_t _vm_switch_backlight = NULL; +void vm_switch_backlight(VMINT turn_on) +{ + if (NULL == _vm_switch_backlight) + _vm_switch_backlight = (_vm_switch_backlight_t)vm_get_sym_entry("vm_switch_backlight"); + if (NULL != _vm_switch_backlight) + _vm_switch_backlight(turn_on); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_switch_power_saving_mode.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_switch_power_saving_mode.c new file mode 100644 index 00000000..df6bd722 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_switch_power_saving_mode.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_switch_power_saving_mode_t)(power_saving_mode_enum mode); +_vm_switch_power_saving_mode_t _vm_switch_power_saving_mode = NULL; + +VMINT vm_switch_power_saving_mode(power_saving_mode_enum mode) +{ + if (NULL == _vm_switch_power_saving_mode) + _vm_switch_power_saving_mode = (_vm_switch_power_saving_mode_t)vm_get_sym_entry("vm_switch_power_saving_mode"); + + if (NULL != _vm_switch_power_saving_mode) + return _vm_switch_power_saving_mode(mode); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_close.c new file mode 100644 index 00000000..7058bcff --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_close.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_sys_file_close_t)(VMFILE h); + _vm_sys_file_close_t _vm_sys_file_close = NULL; +void vm_sys_file_close(VMFILE h) +{ + if (_vm_sys_file_close == NULL) + _vm_sys_file_close = (_vm_sys_file_close_t)vm_get_sym_entry("vm_sys_file_close"); + + if (_vm_sys_file_close != NULL) + _vm_sys_file_close(h); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_delete.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_delete.c new file mode 100644 index 00000000..49a326d1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_delete.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sys_file_delete_t)(void); + _vm_sys_file_delete_t _vm_sys_file_delete = NULL; +VMINT vm_sys_file_delete(void) +{ + if (_vm_sys_file_delete == NULL) + _vm_sys_file_delete = (_vm_sys_file_delete_t)vm_get_sym_entry("vm_sys_file_delete"); + + if (_vm_sys_file_delete != NULL) + return _vm_sys_file_delete(); + else + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_get_space.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_get_space.c new file mode 100644 index 00000000..eb7a1c34 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_get_space.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_sys_file_get_space_t)(void); + _vm_sys_file_get_space_t _vm_sys_file_get_space = NULL; +VMINT vm_sys_file_get_space(void) +{ + if (_vm_sys_file_get_space == NULL) + _vm_sys_file_get_space = (_vm_sys_file_get_space_t)vm_get_sym_entry("vm_sys_file_get_space"); + + if (_vm_sys_file_get_space != NULL) + return _vm_sys_file_get_space(); + else + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_open.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_open.c new file mode 100644 index 00000000..add1bc0f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_open.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMFILE (*_vm_sys_file_open_t)(VMUINT mode, VMUINT binary); + _vm_sys_file_open_t _vm_sys_file_open = NULL; +VMFILE vm_sys_file_open(VMUINT mode, VMUINT binary) +{ + if (_vm_sys_file_open == NULL) + _vm_sys_file_open = (_vm_sys_file_open_t)vm_get_sym_entry("vm_sys_file_open"); + + if (_vm_sys_file_open != NULL) + return _vm_sys_file_open(mode, binary); + else + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_read.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_read.c new file mode 100644 index 00000000..2994fd62 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_read.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sys_file_read_t)(VMFILE handle, void * data, VMUINT length, VMUINT *nread); + _vm_sys_file_read_t _vm_sys_file_read = NULL; +VMINT vm_sys_file_read(VMFILE handle, void * data, VMUINT length, VMUINT *nread) +{ + if (_vm_sys_file_read == NULL) + _vm_sys_file_read = (_vm_sys_file_read_t)vm_get_sym_entry("vm_sys_file_read"); + + if (_vm_sys_file_read != NULL) + return _vm_sys_file_read(handle, data, length, nread); + else + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_seek.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_seek.c new file mode 100644 index 00000000..1e656aa5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_seek.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sys_file_seek_t)(VMFILE handle, VMINT offset, VMINT base); + _vm_sys_file_seek_t _vm_sys_file_seek = NULL; +VMINT vm_sys_file_seek(VMFILE handle, VMINT offset, VMINT base) +{ + if (_vm_sys_file_seek == NULL) + _vm_sys_file_seek = (_vm_sys_file_seek_t)vm_get_sym_entry("vm_sys_file_seek"); + + if (_vm_sys_file_seek != NULL) + return _vm_sys_file_seek(handle, offset, base); + else + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_write.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_write.c new file mode 100644 index 00000000..1f6f8db7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_sys_file_write.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_sys_file_write_t)(VMFILE handle, void * data, VMUINT length, VMUINT * written); + _vm_sys_file_write_t _vm_sys_file_write = NULL; +VMINT vm_sys_file_write(VMFILE handle, void * data, VMUINT length, VMUINT * written) +{ + if (_vm_sys_file_write == NULL) + _vm_sys_file_write = (_vm_sys_file_write_t)vm_get_sym_entry("vm_sys_file_write"); + + if (_vm_sys_file_write != NULL) + return _vm_sys_file_write(handle, data, length, written); + else + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_close.c new file mode 100644 index 00000000..d8abe855 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_close.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_tcp_close_t)(VMINT handle); +_vm_tcp_close_t _vm_tcp_close = NULL; + +void vm_tcp_close(VMINT handle) +{ + if (NULL == _vm_tcp_close) + _vm_tcp_close = (_vm_tcp_close_t)vm_get_sym_entry("vm_tcp_close"); + + if (NULL != _vm_tcp_close) + _vm_tcp_close(handle); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_close_sync.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_close_sync.c new file mode 100644 index 00000000..3b46b33a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_close_sync.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tcp_close_sync_t)(VMINT handle); +_vm_tcp_close_sync_t _vm_tcp_close_sync = NULL; + +VMINT vm_tcp_close_sync(VMINT handle) +{ + if (NULL == _vm_tcp_close_sync) + _vm_tcp_close_sync = (_vm_tcp_close_sync_t)vm_get_sym_entry("vm_tcp_close_sync"); + if (NULL != _vm_tcp_close_sync) + return _vm_tcp_close_sync(handle); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect.c new file mode 100644 index 00000000..51dfd7f4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tcp_connect_t)(const char* host, const VMINT port, const VMINT apn, void (*callback)(VMINT handle, VMINT event)); +_vm_tcp_connect_t _vm_tcp_connect = NULL; + +VMINT vm_tcp_connect(const char* host, const VMINT port, const VMINT apn, void (*callback)(VMINT handle, VMINT event)) +{ + if (NULL == _vm_tcp_connect) + _vm_tcp_connect = (_vm_tcp_connect_t)vm_get_sym_entry("vm_tcp_connect"); + + if (NULL != _vm_tcp_connect) + return _vm_tcp_connect(host,port,apn,callback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect_ex.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect_ex.c new file mode 100644 index 00000000..699c4d29 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect_ex.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tcp_connect_ex_t)(const char* host, const VMINT port, const VMINT apn, void *user_data, void (*callback)(VMINT handle, VMINT event, void *user_data)); +_vm_tcp_connect_ex_t _vm_tcp_connect_ex = NULL; + +VMINT vm_tcp_connect_ex(const char* host, const VMINT port, const VMINT apn, void *user_data, void (*callback)(VMINT handle, VMINT event, void *user_data)) +{ + if (NULL == _vm_tcp_connect_ex) + _vm_tcp_connect_ex = (_vm_tcp_connect_ex_t)vm_get_sym_entry("vm_tcp_connect_ex"); + + if (NULL != _vm_tcp_connect_ex) + return _vm_tcp_connect_ex(host,port,apn, user_data, callback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect_sync.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect_sync.c new file mode 100644 index 00000000..13816d88 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_connect_sync.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tcp_connect_sync_t)(const char* ip, const VMINT port, VMINT apn); +_vm_tcp_connect_sync_t _vm_tcp_connect_sync = NULL; + +VMINT vm_tcp_connect_sync(const char* ip, const VMINT port, VMINT apn) +{ + if (NULL == _vm_tcp_connect_sync) + _vm_tcp_connect_sync = (_vm_tcp_connect_sync_t)vm_get_sym_entry("vm_tcp_connect_sync"); + if (NULL != _vm_tcp_connect_sync) + return _vm_tcp_connect_sync(ip,port,apn); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_get_soc_id.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_get_soc_id.c new file mode 100644 index 00000000..31be9893 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_get_soc_id.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tcp_get_soc_id_t)(VMINT hdl); +_vm_tcp_get_soc_id_t _vm_tcp_get_soc_id = NULL; + +VMINT vm_tcp_get_soc_id(VMINT hdl) +{ + if (NULL == _vm_tcp_get_soc_id) + _vm_tcp_get_soc_id = (_vm_tcp_get_soc_id_t)vm_get_sym_entry("vm_tcp_get_soc_id"); + if (NULL != _vm_tcp_get_soc_id) + return _vm_tcp_get_soc_id(hdl); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_read.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_read.c new file mode 100644 index 00000000..bb49165d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_read.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tcp_read_t)(VMINT handle, void* buf, VMINT len); +_vm_tcp_read_t _vm_tcp_read = NULL; + +VMINT vm_tcp_read(VMINT handle, void* buf, VMINT len) +{ + if (NULL == _vm_tcp_read) + _vm_tcp_read = (_vm_tcp_read_t)vm_get_sym_entry("vm_tcp_read"); + + if (NULL != _vm_tcp_read) + return _vm_tcp_read(handle,buf,len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_read_sync.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_read_sync.c new file mode 100644 index 00000000..a06a12ad --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_read_sync.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tcp_read_sync_t)(VMINT handle, void* buf, VMINT len); +_vm_tcp_read_sync_t _vm_tcp_read_sync = NULL; + +VMINT vm_tcp_read_sync(VMINT handle, void* buf, VMINT len) +{ + if (NULL == _vm_tcp_read_sync) + _vm_tcp_read_sync = (_vm_tcp_read_sync_t)vm_get_sym_entry("vm_tcp_read_sync"); + if (NULL != _vm_tcp_read_sync) + return _vm_tcp_read_sync(handle,buf,len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_write.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_write.c new file mode 100644 index 00000000..1dbce8b0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_write.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tcp_write_t)(VMINT handle, void* buf, VMINT len); +_vm_tcp_write_t _vm_tcp_write = NULL; + +VMINT vm_tcp_write(VMINT handle, void* buf, VMINT len) +{ + if (NULL == _vm_tcp_write) + _vm_tcp_write = (_vm_tcp_write_t)vm_get_sym_entry("vm_tcp_write"); + + if (NULL != _vm_tcp_write) + return _vm_tcp_write(handle,buf,len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_write_sync.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_write_sync.c new file mode 100644 index 00000000..48e38069 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tcp_write_sync.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tcp_write_sync_t)(VMINT handle, void* buf, VMINT len); +_vm_tcp_write_sync_t _vm_tcp_write_sync = NULL; + +VMINT vm_tcp_write_sync(VMINT handle, void* buf, VMINT len) +{ + if (NULL == _vm_tcp_write_sync) + _vm_tcp_write_sync = (_vm_tcp_write_sync_t)vm_get_sym_entry("vm_tcp_write_sync"); + if (NULL != _vm_tcp_write_sync) + return _vm_tcp_write_sync(handle,buf,len); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_create.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_create.c new file mode 100644 index 00000000..ab5da42c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_create.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmthread.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_THREAD_HANDLE (*_vm_thread_create_t)(VM_THREAD_FUNC thread_function, void* data,VMUINT8 priority); +_vm_thread_create_t _vm_thread_create = NULL; + +VM_THREAD_HANDLE vm_thread_create(VM_THREAD_FUNC thread_function, void* data,VMUINT8 priority) +{ + if (NULL == _vm_thread_create) + _vm_thread_create = (_vm_thread_create_t)vm_get_sym_entry("vm_thread_create"); + if (NULL != _vm_thread_create) + return _vm_thread_create(thread_function,data,priority); + return 0; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_current_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_current_handle.c new file mode 100644 index 00000000..4a56dc3d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_current_handle.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmthread.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_THREAD_HANDLE (*_vm_thread_get_current_handle_t)(void); +_vm_thread_get_current_handle_t _vm_thread_get_current_handle = NULL; + +VM_THREAD_HANDLE vm_thread_get_current_handle(void) +{ + if (NULL == _vm_thread_get_current_handle) + _vm_thread_get_current_handle = (_vm_thread_get_current_handle_t)vm_get_sym_entry("vm_thread_get_current_handle"); + if (NULL != _vm_thread_get_current_handle) + return _vm_thread_get_current_handle(); + return 0; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_main_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_main_handle.c new file mode 100644 index 00000000..5cbd1df7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_main_handle.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmthread.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_THREAD_HANDLE (*_vm_thread_get_main_handle_t)(void); +_vm_thread_get_main_handle_t _vm_thread_get_main_handle = NULL; + +VM_THREAD_HANDLE vm_thread_get_main_handle(void) +{ + if (NULL == _vm_thread_get_main_handle) + _vm_thread_get_main_handle = (_vm_thread_get_main_handle_t)vm_get_sym_entry("vm_thread_get_main_handle"); + if (NULL != _vm_thread_get_main_handle) + return _vm_thread_get_main_handle(); + return 0; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_msg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_msg.c new file mode 100644 index 00000000..d5abb811 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_get_msg.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmthread.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_thread_get_msg_t)(VM_MSG_STRUCT* msg); +_vm_thread_get_msg_t _vm_thread_get_msg = NULL; + +void vm_thread_get_msg(VM_MSG_STRUCT* msg) +{ + if (NULL == _vm_thread_get_msg) + _vm_thread_get_msg = (_vm_thread_get_msg_t)vm_get_sym_entry("vm_thread_get_msg"); + if (NULL != _vm_thread_get_msg) + _vm_thread_get_msg(msg); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_send_msg.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_send_msg.c new file mode 100644 index 00000000..5eade812 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_thread_send_msg.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmthread.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_thread_send_msg_t)(VM_THREAD_HANDLE thread_handle, VMUINT32 msg_id, void* user_data); +_vm_thread_send_msg_t _vm_thread_send_msg = NULL; + +void vm_thread_send_msg(VM_THREAD_HANDLE thread_handle, VMUINT32 msg_id, void* user_data) +{ + if (NULL == _vm_thread_send_msg) + _vm_thread_send_msg = (_vm_thread_send_msg_t)vm_get_sym_entry("vm_thread_send_msg"); + if (NULL != _vm_thread_send_msg) + _vm_thread_send_msg(thread_handle,msg_id,user_data); +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_auto_rehandshake.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_auto_rehandshake.c new file mode 100644 index 00000000..15fb2524 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_auto_rehandshake.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_auto_rehandshake_t)(VMINT res_id, VMINT onoff); +_vm_tls_auto_rehandshake_t _vm_tls_auto_rehandshake = NULL; + +VMINT vm_tls_auto_rehandshake(VMINT res_id, VMINT onoff) +{ + if (NULL == _vm_tls_auto_rehandshake) + _vm_tls_auto_rehandshake = (_vm_tls_auto_rehandshake_t)vm_get_sym_entry("vm_tls_auto_rehandshake"); + + if (NULL != _vm_tls_auto_rehandshake) + return _vm_tls_auto_rehandshake(res_id,onoff); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_check_invalid_cert.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_check_invalid_cert.c new file mode 100644 index 00000000..621420de --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_check_invalid_cert.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_check_invalid_cert_t)(VMINT res_id, VMINT onoff); +_vm_tls_check_invalid_cert_t _vm_tls_check_invalid_cert = NULL; + +VMINT vm_tls_check_invalid_cert(VMINT res_id, VMINT onoff) +{ + if (NULL == _vm_tls_check_invalid_cert) + _vm_tls_check_invalid_cert = (_vm_tls_check_invalid_cert_t)vm_get_sym_entry("vm_tls_check_invalid_cert"); + + if (NULL != _vm_tls_check_invalid_cert) + return _vm_tls_check_invalid_cert(res_id,onoff); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_check_peer_name.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_check_peer_name.c new file mode 100644 index 00000000..84ca2342 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_check_peer_name.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_check_peer_name_t)(VMINT res_id, const VMCHAR *const name); +_vm_tls_check_peer_name_t _vm_tls_check_peer_name = NULL; + +VMINT vm_tls_check_peer_name(VMINT res_id, const VMCHAR *const name) +{ + if (NULL == _vm_tls_check_peer_name) + _vm_tls_check_peer_name = (_vm_tls_check_peer_name_t)vm_get_sym_entry("vm_tls_check_peer_name"); + + if (NULL != _vm_tls_check_peer_name) + return _vm_tls_check_peer_name(res_id,name); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_connect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_connect.c new file mode 100644 index 00000000..9202460b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_connect.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_connect_t)(VMINT res_id, vm_sockaddr_ex_struct * faddr); +_vm_tls_connect_t _vm_tls_connect = NULL; + +VMINT vm_tls_connect(VMINT res_id, vm_sockaddr_ex_struct * faddr) +{ + if (NULL == _vm_tls_connect) + _vm_tls_connect = (_vm_tls_connect_t)vm_get_sym_entry("vm_tls_connect"); + + if (NULL != _vm_tls_connect) + return _vm_tls_connect(res_id,faddr); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_delete_conn.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_delete_conn.c new file mode 100644 index 00000000..06ea3232 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_delete_conn.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_delete_conn_t)(VMINT res_id); +_vm_tls_delete_conn_t _vm_tls_delete_conn = NULL; + +VMINT vm_tls_delete_conn(VMINT res_id) +{ + if (NULL == _vm_tls_delete_conn) + _vm_tls_delete_conn = (_vm_tls_delete_conn_t)vm_get_sym_entry("vm_tls_delete_conn"); + + if (NULL != _vm_tls_delete_conn) + return _vm_tls_delete_conn(res_id); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_delete_ctx.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_delete_ctx.c new file mode 100644 index 00000000..454c2c55 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_delete_ctx.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_delete_ctx_t)(VMINT res_id); +_vm_tls_delete_ctx_t _vm_tls_delete_ctx = NULL; + +VMINT vm_tls_delete_ctx(VMINT res_id) +{ + if (NULL == _vm_tls_delete_ctx) + _vm_tls_delete_ctx = (_vm_tls_delete_ctx_t)vm_get_sym_entry("vm_tls_delete_ctx"); + + if (NULL != _vm_tls_delete_ctx) + return _vm_tls_delete_ctx(res_id); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_cipher.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_cipher.c new file mode 100644 index 00000000..4acb1a98 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_cipher.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_get_cipher_t)(VMINT res_id, vm_tls_ciphersuites_enum *cipher); +_vm_tls_get_cipher_t _vm_tls_get_cipher = NULL; + +VMINT vm_tls_get_cipher(VMINT res_id, vm_tls_ciphersuites_enum *cipher) +{ + if (NULL == _vm_tls_get_cipher) + _vm_tls_get_cipher = (_vm_tls_get_cipher_t)vm_get_sym_entry("vm_tls_get_cipher"); + + if (NULL != _vm_tls_get_cipher) + return _vm_tls_get_cipher(res_id,cipher); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_cipher_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_cipher_info.c new file mode 100644 index 00000000..1388e344 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_cipher_info.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_get_cipher_info_t)(VMINT res_id, vm_tls_cipher_info_struct *cipher_info); +_vm_tls_get_cipher_info_t _vm_tls_get_cipher_info = NULL; + +VMINT vm_tls_get_cipher_info(VMINT res_id, vm_tls_cipher_info_struct *cipher_info) +{ + if (NULL == _vm_tls_get_cipher_info) + _vm_tls_get_cipher_info = (_vm_tls_get_cipher_info_t)vm_get_sym_entry("vm_tls_get_cipher_info"); + + if (NULL != _vm_tls_get_cipher_info) + return _vm_tls_get_cipher_info(res_id,cipher_info); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_peer_cert.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_peer_cert.c new file mode 100644 index 00000000..1511ecd0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_get_peer_cert.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_get_peer_cert_t)(VMINT res_id, vm_tls_cert_struct *cert); +_vm_tls_get_peer_cert_t _vm_tls_get_peer_cert = NULL; + +VMINT vm_tls_get_peer_cert(VMINT res_id, vm_tls_cert_struct *cert) +{ + if (NULL == _vm_tls_get_peer_cert) + _vm_tls_get_peer_cert = (_vm_tls_get_peer_cert_t)vm_get_sym_entry("vm_tls_get_peer_cert"); + + if (NULL != _vm_tls_get_peer_cert) + return _vm_tls_get_peer_cert(res_id,cert); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_handshake.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_handshake.c new file mode 100644 index 00000000..084d5b56 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_handshake.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_handshake_t)(VMINT res_id); +_vm_tls_handshake_t _vm_tls_handshake = NULL; + +VMINT vm_tls_handshake(VMINT res_id) +{ + if (NULL == _vm_tls_handshake) + _vm_tls_handshake = (_vm_tls_handshake_t)vm_get_sym_entry("vm_tls_handshake"); + + if (NULL != _vm_tls_handshake) + return _vm_tls_handshake(res_id); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_log_plaintext.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_log_plaintext.c new file mode 100644 index 00000000..5adad45d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_log_plaintext.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_log_plaintext_t)(VMINT onoff); +_vm_tls_log_plaintext_t _vm_tls_log_plaintext = NULL; + +VMINT vm_tls_log_plaintext(VMINT onoff) +{ + if (NULL == _vm_tls_log_plaintext) + _vm_tls_log_plaintext = (_vm_tls_log_plaintext_t)vm_get_sym_entry("vm_tls_log_plaintext"); + + if (NULL != _vm_tls_log_plaintext) + return _vm_tls_log_plaintext(onoff); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_new_conn.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_new_conn.c new file mode 100644 index 00000000..bff4f29b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_new_conn.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_new_conn_t)(VMINT res_id, vm_sockaddr_ex_struct * faddr); +_vm_tls_new_conn_t _vm_tls_new_conn = NULL; + +VMINT vm_tls_new_conn(VMINT res_id, vm_sockaddr_ex_struct * faddr) +{ + if (NULL == _vm_tls_new_conn) + _vm_tls_new_conn = (_vm_tls_new_conn_t)vm_get_sym_entry("vm_tls_new_conn"); + + if (NULL != _vm_tls_new_conn) + return _vm_tls_new_conn(res_id,faddr); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_new_ctx.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_new_ctx.c new file mode 100644 index 00000000..4d5ac109 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_new_ctx.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_new_ctx_t)(vm_tls_version_enum ver, vm_socket_type_enum sock_type, VMINT apn, vm_tls_side_enum side, callback_t cb); +_vm_tls_new_ctx_t _vm_tls_new_ctx = NULL; + +VMINT vm_tls_new_ctx(vm_tls_version_enum ver, vm_socket_type_enum sock_type, VMINT apn, vm_tls_side_enum side, callback_t cb) +{ + if (NULL == _vm_tls_new_ctx) + _vm_tls_new_ctx = (_vm_tls_new_ctx_t)vm_get_sym_entry("vm_tls_new_ctx"); + + if (NULL != _vm_tls_new_ctx) + return _vm_tls_new_ctx(ver,sock_type, apn, side,cb); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_read.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_read.c new file mode 100644 index 00000000..6d67c384 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_read.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_read_t)(VMINT res_id, void* buf, VMINT32 len); +_vm_tls_read_t _vm_tls_read = NULL; + +VMINT vm_tls_read(VMINT res_id, void* buf, VMINT32 len) +{ + if (NULL == _vm_tls_read) + _vm_tls_read = (_vm_tls_read_t)vm_get_sym_entry("vm_tls_read"); + + if (NULL != _vm_tls_read) + return _vm_tls_read(res_id,buf,len); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_rehandshake.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_rehandshake.c new file mode 100644 index 00000000..e35e4898 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_rehandshake.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_rehandshake_t)(VMINT res_id); +_vm_tls_rehandshake_t _vm_tls_rehandshake = NULL; + +VMINT vm_tls_rehandshake(VMINT res_id) +{ + if (NULL == _vm_tls_rehandshake) + _vm_tls_rehandshake = (_vm_tls_rehandshake_t)vm_get_sym_entry("vm_tls_rehandshake"); + + if (NULL != _vm_tls_rehandshake) + return _vm_tls_rehandshake(res_id); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_ciphers.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_ciphers.c new file mode 100644 index 00000000..26b36555 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_ciphers.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_set_ciphers_t)(VMINT res_id, const vm_tls_cipher_enum ciphers[], VMINT num); +_vm_tls_set_ciphers_t _vm_tls_set_ciphers = NULL; + +VMINT vm_tls_set_ciphers(VMINT res_id, const vm_tls_cipher_enum ciphers[], VMINT num) +{ + if (NULL == _vm_tls_set_ciphers) + _vm_tls_set_ciphers = (_vm_tls_set_ciphers_t)vm_get_sym_entry("vm_tls_set_ciphers"); + + if (NULL != _vm_tls_set_ciphers) + return _vm_tls_set_ciphers(res_id,ciphers,num); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_client_auth.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_client_auth.c new file mode 100644 index 00000000..9b040473 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_client_auth.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_set_client_auth_t)(VMINT res_id, vm_tls_auth_mode_enum modes[], VMINT num); +_vm_tls_set_client_auth_t _vm_tls_set_client_auth = NULL; + +VMINT vm_tls_set_client_auth(VMINT res_id, vm_tls_auth_mode_enum modes[], VMINT num) +{ + if (NULL == _vm_tls_set_client_auth) + _vm_tls_set_client_auth = (_vm_tls_set_client_auth_t)vm_get_sym_entry("vm_tls_set_client_auth"); + + if (NULL != _vm_tls_set_client_auth) + return _vm_tls_set_client_auth(res_id,modes,num); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_identity.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_identity.c new file mode 100644 index 00000000..0b463e95 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_identity.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_set_identity_t)(VMINT res_id, VMUINT32 cert_id); +_vm_tls_set_identity_t _vm_tls_set_identity = NULL; + +VMINT vm_tls_set_identity(VMINT res_id, VMUINT32 cert_id) +{ + if (NULL == _vm_tls_set_identity) + _vm_tls_set_identity = (_vm_tls_set_identity_t)vm_get_sym_entry("vm_tls_set_identity"); + + if (NULL != _vm_tls_set_identity) + return _vm_tls_set_identity(res_id,cert_id); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_null_client_auth.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_null_client_auth.c new file mode 100644 index 00000000..cb3a8bea --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_null_client_auth.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_set_null_client_auth_t)(VMINT res_id); +_vm_tls_set_null_client_auth_t _vm_tls_set_null_client_auth = NULL; + +VMINT vm_tls_set_null_client_auth(VMINT res_id) +{ + if (NULL == _vm_tls_set_null_client_auth) + _vm_tls_set_null_client_auth = (_vm_tls_set_null_client_auth_t)vm_get_sym_entry("vm_tls_set_null_client_auth"); + + if (NULL != _vm_tls_set_null_client_auth) + return _vm_tls_set_null_client_auth(res_id); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_verify.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_verify.c new file mode 100644 index 00000000..b49453b8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_set_verify.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_set_verify_t)(VMINT res_id, VMUINT32 cert_id[], VMINT cert_num, vm_tls_filetype_enum type); +_vm_tls_set_verify_t _vm_tls_set_verify = NULL; + +VMINT vm_tls_set_verify(VMINT res_id, VMUINT32 cert_id[], VMINT cert_num, vm_tls_filetype_enum type) +{ + if (NULL == _vm_tls_set_verify) + _vm_tls_set_verify = (_vm_tls_set_verify_t)vm_get_sym_entry("vm_tls_set_verify"); + + if (NULL != _vm_tls_set_verify) + return _vm_tls_set_verify(res_id,cert_id,cert_num,type); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_shutdown.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_shutdown.c new file mode 100644 index 00000000..585b548f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_shutdown.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_shutdown_t)(VMINT res_id); +_vm_tls_shutdown_t _vm_tls_shutdown = NULL; + +VMINT vm_tls_shutdown(VMINT res_id) +{ + if (NULL == _vm_tls_shutdown) + _vm_tls_shutdown = (_vm_tls_shutdown_t)vm_get_sym_entry("vm_tls_shutdown"); + + if (NULL != _vm_tls_shutdown) + return _vm_tls_shutdown(res_id); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_soc_connect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_soc_connect.c new file mode 100644 index 00000000..c18b6d25 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_soc_connect.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + + +typedef VMINT (*_vm_tls_soc_connect_t)(VMINT res_id, vm_sockaddr_ex_struct * faddr); +_vm_tls_soc_connect_t _vm_tls_soc_connect = NULL; +VMINT vm_tls_soc_connect(VMINT res_id, vm_sockaddr_ex_struct * faddr) +{ + if (NULL == _vm_tls_soc_connect) + _vm_tls_soc_connect = (_vm_tls_soc_connect_t)vm_get_sym_entry("vm_tls_soc_connect"); + + if (NULL != _vm_tls_soc_connect) + return _vm_tls_soc_connect(res_id,faddr); + + return (VMINT)-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_write.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_write.c new file mode 100644 index 00000000..570a4e73 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tls_write.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtls.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_tls_write_t)(VMINT res_id, const void* buf, VMINT32 len); +_vm_tls_write_t _vm_tls_write = NULL; + +VMINT vm_tls_write(VMINT res_id, const void* buf, VMINT32 len) +{ + if (NULL == _vm_tls_write) + _vm_tls_write = (_vm_tls_write_t)vm_get_sym_entry("vm_tls_write"); + + if (NULL != _vm_tls_write) + return _vm_tls_write(res_id,buf,len); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tmp_filename.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tmp_filename.c new file mode 100644 index 00000000..fc70ef48 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_tmp_filename.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_tmp_filename_t)(char* prefix, char* filename); +_vm_tmp_filename_t _vm_tmp_filename = NULL; + +void vm_tmp_filename(char* prefix, char* filename) +{ + if (NULL == _vm_tmp_filename) + _vm_tmp_filename = (_vm_tmp_filename_t)vm_get_sym_entry("vm_tmp_filename"); + + if (NULL != _vm_tmp_filename) + _vm_tmp_filename(prefix,filename); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_free.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_free.c new file mode 100644 index 00000000..cddbc113 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_free.c @@ -0,0 +1,16 @@ +#include "vmsys.h" +#include "vmtsloader.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_ts_driver_free_t)(VMINT handle); +_vm_ts_driver_free_t _vm_ts_driver_free = NULL; +void vm_ts_driver_free(VMINT handle) +{ + if (NULL == _vm_ts_driver_free) + _vm_ts_driver_free = (_vm_ts_driver_free_t)vm_get_sym_entry("vm_ts_driver_free"); + + if (NULL != _vm_ts_driver_free) + _vm_ts_driver_free(handle); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_get_handle.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_get_handle.c new file mode 100644 index 00000000..f3121d0e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_get_handle.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtsloader.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ts_driver_get_handle_t)(void); +_vm_ts_driver_get_handle_t _vm_ts_driver_get_handle = NULL; +VMINT vm_ts_driver_get_handle(void) +{ + if (NULL == _vm_ts_driver_get_handle) + _vm_ts_driver_get_handle = (_vm_ts_driver_get_handle_t)vm_get_sym_entry("vm_ts_driver_get_handle"); + + if (NULL != _vm_ts_driver_get_handle) + return _vm_ts_driver_get_handle(); + + return -1; +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_get_mem.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_get_mem.c new file mode 100644 index 00000000..a3f497a1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_get_mem.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmtsloader.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void* (*_vm_ts_driver_get_mem_t)(VMINT handle); +_vm_ts_driver_get_mem_t _vm_ts_driver_get_mem = NULL; +void* vm_ts_driver_get_mem(VMINT handle) +{ + if (NULL == _vm_ts_driver_get_mem) + _vm_ts_driver_get_mem = (_vm_ts_driver_get_mem_t)vm_get_sym_entry("vm_ts_driver_get_mem"); + + if (NULL != _vm_ts_driver_get_mem) + return _vm_ts_driver_get_mem(handle); + + return (void*)NULL; +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_load.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_load.c new file mode 100644 index 00000000..0765b6cd --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ts_driver_load.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmtsloader.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + + +typedef VMINT (*_vm_ts_driver_load_t)(VMWSTR fileName, VMINT size); +_vm_ts_driver_load_t _vm_ts_driver_load = NULL; +VMINT vm_ts_driver_load(VMWSTR fileName, VMINT size) +{ + if (NULL == _vm_ts_driver_load) + _vm_ts_driver_load = (_vm_ts_driver_load_t)vm_get_sym_entry("vm_ts_driver_load"); + + if (NULL != _vm_ts_driver_load) + return _vm_ts_driver_load(fileName, size); + + return (VMINT )-1; +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_string_by_ascii.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_string_by_ascii.c new file mode 100644 index 00000000..396d6b0d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_string_by_ascii.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmchset.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMWSTR (*_vm_ucs2_string_by_ascii_t)(VMSTR s); +_vm_ucs2_string_by_ascii_t _vm_ucs2_string_by_ascii = NULL; + +VMWSTR vm_ucs2_string_by_ascii(VMSTR s) +{ + if (NULL == _vm_ucs2_string_by_ascii) + _vm_ucs2_string_by_ascii = (_vm_ucs2_string_by_ascii_t)vm_get_sym_entry("vm_ucs2_string_by_ascii"); + + if (NULL != _vm_ucs2_string_by_ascii) + return _vm_ucs2_string_by_ascii(s); + + return (VMWSTR )NULL; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_to_ascii.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_to_ascii.c new file mode 100644 index 00000000..64a94a31 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_to_ascii.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmchset.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ucs2_to_ascii_t)(VMSTR dst, VMINT size, VMWSTR src); +_vm_ucs2_to_ascii_t _vm_ucs2_to_ascii = NULL; + +VMINT vm_ucs2_to_ascii(VMSTR dst, VMINT size, VMWSTR src) +{ + if (NULL == _vm_ucs2_to_ascii) + _vm_ucs2_to_ascii = (_vm_ucs2_to_ascii_t)vm_get_sym_entry("vm_ucs2_to_ascii"); + + if (NULL != _vm_ucs2_to_ascii) + return _vm_ucs2_to_ascii(dst,size,src); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_to_gb2312.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_to_gb2312.c new file mode 100644 index 00000000..829a7214 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ucs2_to_gb2312.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmchset.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_ucs2_to_gb2312_t)(VMSTR dst, VMINT size, VMWSTR src); +_vm_ucs2_to_gb2312_t _vm_ucs2_to_gb2312 = NULL; + +VMINT vm_ucs2_to_gb2312(VMSTR dst, VMINT size, VMWSTR src) +{ + if (NULL == _vm_ucs2_to_gb2312) + _vm_ucs2_to_gb2312 = (_vm_ucs2_to_gb2312_t)vm_get_sym_entry("vm_ucs2_to_gb2312"); + + if (NULL != _vm_ucs2_to_gb2312) + return _vm_ucs2_to_gb2312(dst,size,src); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_close.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_close.c new file mode 100644 index 00000000..9dfaeaf7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_close.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_udp_close_t)(VMINT hdl); +_vm_udp_close_t _vm_udp_close = NULL; + +VMINT vm_udp_close(VMINT hdl) +{ + if (NULL == _vm_udp_close) + _vm_udp_close = (_vm_udp_close_t)vm_get_sym_entry("vm_udp_close"); + + if (NULL != _vm_udp_close) + return _vm_udp_close(hdl); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_create.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_create.c new file mode 100644 index 00000000..5fbc2c32 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_create.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_udp_create_t)(VMINT port, VMINT apn, void (*callback)(VMINT hdl, VMINT event), VMINT loopback); +_vm_udp_create_t _vm_udp_create = NULL; + +VMINT vm_udp_create(VMINT port, VMINT apn, void (*callback)(VMINT hdl, VMINT event), VMINT loopback) +{ + if (NULL == _vm_udp_create) + _vm_udp_create = (_vm_udp_create_t)vm_get_sym_entry("vm_udp_create"); + + if (NULL != _vm_udp_create) + return _vm_udp_create(port, apn, callback, loopback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_recvfrom.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_recvfrom.c new file mode 100644 index 00000000..9d26509f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_recvfrom.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_udp_recvfrom_t)(VMINT hdl, void * buf, VMINT32 len, vm_sockaddr_struct * addr); +_vm_udp_recvfrom_t _vm_udp_recvfrom = NULL; + +VMINT vm_udp_recvfrom(VMINT hdl, void * buf, VMINT32 len, vm_sockaddr_struct * addr) +{ + if (NULL == _vm_udp_recvfrom) + _vm_udp_recvfrom = (_vm_udp_recvfrom_t)vm_get_sym_entry("vm_udp_recvfrom"); + + if (NULL != _vm_udp_recvfrom) + return _vm_udp_recvfrom(hdl, buf, len, addr); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_sendto.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_sendto.c new file mode 100644 index 00000000..3b433741 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_udp_sendto.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_udp_sendto_t)(VMINT hdl, const void * buf, VMINT32 len, const vm_sockaddr_struct * addr); +_vm_udp_sendto_t _vm_udp_sendto = NULL; + +VMINT vm_udp_sendto(VMINT hdl, const void * buf, VMINT32 len, const vm_sockaddr_struct * addr) +{ + if (NULL == _vm_udp_sendto) + _vm_udp_sendto = (_vm_udp_sendto_t)vm_get_sym_entry("vm_udp_sendto"); + + if (NULL != _vm_udp_sendto) + return _vm_udp_sendto(hdl, buf, len, addr); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_cancel.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_cancel.c new file mode 100644 index 00000000..359d778e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_cancel.c @@ -0,0 +1,18 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT(*_vm_update_cancel_t)(VMINT handle); +_vm_update_cancel_t _vm_update_cancel = NULL; + +VMINT vm_update_cancel(VMINT handle) +{ + if (_vm_update_cancel == NULL) { + _vm_update_cancel = (_vm_update_cancel_t)vm_get_sym_entry("vm_update_cancel"); + } + if (_vm_update_cancel != NULL) { + return _vm_update_cancel(handle); + } + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_check_launch.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_check_launch.c new file mode 100644 index 00000000..eafe5832 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_check_launch.c @@ -0,0 +1,18 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT(*_vm_update_check_launch_t)(VMWSTR path, VMWSTR new_path); +_vm_update_check_launch_t _vm_update_check_launch = NULL; + +VMINT vm_update_check_launch(VMWSTR path, VMWSTR new_path) +{ + if (_vm_update_check_launch == NULL) { + _vm_update_check_launch = (_vm_update_check_launch_t)vm_get_sym_entry("vm_update_check_launch"); + } + if (_vm_update_check_launch != NULL) { + return _vm_update_check_launch(path, new_path); + } + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_check_version.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_check_version.c new file mode 100644 index 00000000..ab239b22 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_check_version.c @@ -0,0 +1,18 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT(*_vm_update_check_version_t)(VMSTR URL, VMINT port, VMINT apn, vm_update_app_callback callback, void* user_data); +_vm_update_check_version_t _vm_update_check_version = NULL; + +VMINT vm_update_check_version(VMSTR URL, VMINT port, VMINT apn, vm_update_app_callback callback, void* user_data) +{ + if (_vm_update_check_version == NULL) { + _vm_update_check_version = (_vm_update_check_version_t)vm_get_sym_entry("vm_update_check_version"); + } + if (_vm_update_check_version != NULL) { + return _vm_update_check_version(URL, port, apn, callback, user_data); + } + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_download.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_download.c new file mode 100644 index 00000000..f2051fc8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_download.c @@ -0,0 +1,18 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT(*_vm_update_download_t)(VMINT handle, VMINT bOnCard, vm_update_app_callback callback, void* user_data); +_vm_update_download_t _vm_update_download = NULL; + +VMINT vm_update_download(VMINT handle, VMINT bOnCard, vm_update_app_callback callback, void* user_data) +{ + if (_vm_update_download == NULL) { + _vm_update_download = (_vm_update_download_t)vm_get_sym_entry("vm_update_download"); + } + if (_vm_update_download != NULL) { + return _vm_update_download(handle, bOnCard, callback, user_data); + } + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_update_file.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_update_file.c new file mode 100644 index 00000000..b8c4eb49 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_update_update_file.c @@ -0,0 +1,18 @@ +#include "vmsys.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT(*_vm_update_update_file_t)(void); +_vm_update_update_file_t _vm_update_update_file = NULL; + +VMINT vm_update_update_file(void) +{ + if (_vm_update_update_file == NULL) { + _vm_update_update_file = (_vm_update_update_file_t)vm_get_sym_entry("vm_update_update_file"); + } + if (_vm_update_update_file != NULL) { + return _vm_update_update_file(); + } + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upnp_get_ext_ip.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upnp_get_ext_ip.c new file mode 100644 index 00000000..25278712 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upnp_get_ext_ip.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnat.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_upnp_get_ext_ip_t)(VMUINT8 request_id, vm_upnp_result_cb cb, void *user_data); +_vm_upnp_get_ext_ip_t _vm_upnp_get_ext_ip = NULL; + +VMINT vm_upnp_get_ext_ip(VMUINT8 request_id, vm_upnp_result_cb cb, void *user_data) +{ + if (NULL == _vm_upnp_get_ext_ip) + _vm_upnp_get_ext_ip = (_vm_upnp_get_ext_ip_t)vm_get_sym_entry("vm_upnp_get_ext_ip"); + if (NULL != _vm_upnp_get_ext_ip) + return _vm_upnp_get_ext_ip(request_id,cb,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upnp_mapping_ports.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upnp_mapping_ports.c new file mode 100644 index 00000000..eca81a61 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upnp_mapping_ports.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnat.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_upnp_mapping_ports_t)(VMUINT8 request_id, vm_upnp_result_cb cb, vm_upnp_map_info* request_data, void* user_data); +_vm_upnp_mapping_ports_t _vm_upnp_mapping_ports = NULL; + +VMINT vm_upnp_mapping_ports(VMUINT8 request_id, vm_upnp_result_cb cb, vm_upnp_map_info* request_data, void* user_data) +{ + if (NULL == _vm_upnp_mapping_ports) + _vm_upnp_mapping_ports = (_vm_upnp_mapping_ports_t)vm_get_sym_entry("vm_upnp_mapping_ports"); + if (NULL != _vm_upnp_mapping_ports) + return _vm_upnp_mapping_ports(request_id,cb,request_data,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upper_case.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upper_case.c new file mode 100644 index 00000000..7ff97225 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_upper_case.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_upper_case_t)(char* dst, char* src); +_vm_upper_case_t _vm_upper_case = NULL; + +void vm_upper_case(char* dst, char* src) +{ + if (NULL == _vm_upper_case) + _vm_upper_case = (_vm_upper_case_t)vm_get_sym_entry("vm_upper_case"); + + if (NULL != _vm_upper_case) + _vm_upper_case(dst,src); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_uriagent_uri_request.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_uriagent_uri_request.c new file mode 100644 index 00000000..31939c02 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_uriagent_uri_request.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmio.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_uriagent_uri_request_t)(const VMCHAR * str, VMINT confirm); +_vm_uriagent_uri_request_t _vm_uriagent_uri_request = NULL; + +VMINT vm_uriagent_uri_request(const VMCHAR * str, VMINT confirm) +{ + if (NULL == _vm_uriagent_uri_request) + _vm_uriagent_uri_request = (_vm_uriagent_uri_request_t)vm_get_sym_entry("vm_uriagent_uri_request"); + + if (NULL != _vm_uriagent_uri_request) + return _vm_uriagent_uri_request(str,confirm); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_url_decode_gb2312.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_url_decode_gb2312.c new file mode 100644 index 00000000..f756841b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_url_decode_gb2312.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_url_decode_gb2312_t)(VMSTR dst, VMUINT size, VMSTR src); +_vm_url_decode_gb2312_t _vm_url_decode_gb2312 = NULL; + +VMUINT vm_url_decode_gb2312(VMSTR dst, VMUINT size, VMSTR src) { + if (_vm_url_decode_gb2312 == NULL) + _vm_url_decode_gb2312 = (_vm_url_decode_gb2312_t)vm_get_sym_entry("vm_url_decode_gb2312"); + + if (_vm_url_decode_gb2312 != NULL) + return _vm_url_decode_gb2312(dst, size, src); + + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_url_encode_gb2312.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_url_encode_gb2312.c new file mode 100644 index 00000000..0a6c33ee --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_url_encode_gb2312.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT (*_vm_url_encode_gb2312_t)(VMSTR dst, VMUINT size, const VMSTR src); +_vm_url_encode_gb2312_t _vm_url_encode_gb2312 = NULL; + +VMUINT vm_url_encode_gb2312(VMSTR dst, VMUINT size, const VMSTR src) { + if (_vm_url_encode_gb2312 == NULL) + _vm_url_encode_gb2312 = (_vm_url_encode_gb2312_t)vm_get_sym_entry("vm_url_encode_gb2312"); + + if (_vm_url_encode_gb2312 != NULL) + return _vm_url_encode_gb2312(dst, size, src); + + return 0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_usb_get_cable_status.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_usb_get_cable_status.c new file mode 100644 index 00000000..c1c936f7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_usb_get_cable_status.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmusb.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_usb_get_cable_status_t)(); +_vm_usb_get_cable_status_t _vm_usb_get_cable_status = NULL; + +VMINT vm_usb_get_cable_status() +{ + if (NULL == _vm_usb_get_cable_status) + _vm_usb_get_cable_status = (_vm_usb_get_cable_status_t)vm_get_sym_entry("vm_usb_get_cable_status"); + + if (NULL != _vm_usb_get_cable_status) + return _vm_usb_get_cable_status(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ust_get_current_time.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ust_get_current_time.c new file mode 100644 index 00000000..4c9899f4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ust_get_current_time.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT32 (*_vm_ust_get_current_time_t)(void); +_vm_ust_get_current_time_t _vm_ust_get_current_time = NULL; +VMUINT32 vm_ust_get_current_time(void) +{ + if (_vm_ust_get_current_time == NULL) + _vm_ust_get_current_time = (_vm_ust_get_current_time_t)vm_get_sym_entry("vm_ust_get_current_time"); + + if (_vm_ust_get_current_time != NULL) + return _vm_ust_get_current_time(); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ust_get_duration.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ust_get_duration.c new file mode 100644 index 00000000..5df9d5f4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_ust_get_duration.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT32 (*_vm_ust_get_duration_t)(VMUINT32 start,VMUINT32 end); +_vm_ust_get_duration_t _vm_ust_get_duration = NULL; +VMUINT32 vm_ust_get_duration(VMUINT32 start,VMUINT32 end) +{ + if (_vm_ust_get_duration == NULL) + _vm_ust_get_duration = (_vm_ust_get_duration_t)vm_get_sym_entry("vm_ust_get_duration"); + + if (_vm_ust_get_duration != NULL) + return _vm_ust_get_duration(start,end); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_get_level.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_get_level.c new file mode 100644 index 00000000..cfdd6251 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_get_level.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvad.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMUINT8 (*_vm_vad_get_level_t)(void); +_vm_vad_get_level_t _vm_vad_get_level = NULL; + +VMUINT8 vm_vad_get_level(void) +{ + if (NULL == _vm_vad_get_level) + _vm_vad_get_level = (_vm_vad_get_level_t)vm_get_sym_entry("vm_vad_get_level"); + + if (NULL != _vm_vad_get_level) + return _vm_vad_get_level(); + + return (VMUINT8)0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_is_on.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_is_on.c new file mode 100644 index 00000000..7a41513a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_is_on.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvad.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_vad_is_on_t)(void); +_vm_vad_is_on_t _vm_vad_is_on = NULL; + +VMBOOL vm_vad_is_on(void) +{ + if (NULL == _vm_vad_is_on) + _vm_vad_is_on = (_vm_vad_is_on_t)vm_get_sym_entry("vm_vad_is_on"); + + if (NULL != _vm_vad_is_on) + return _vm_vad_is_on(); + + return (VMBOOL)0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_register_callback.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_register_callback.c new file mode 100644 index 00000000..a28a21be --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_register_callback.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmvad.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_vad_register_callback_t)(vm_vad_msg_hdlr callback); +_vm_vad_register_callback_t _vm_vad_register_callback = NULL; + +void vm_vad_register_callback(vm_vad_msg_hdlr callback) +{ + if (NULL == _vm_vad_register_callback) + _vm_vad_register_callback = (_vm_vad_register_callback_t)vm_get_sym_entry("vm_vad_register_callback"); + + if (NULL != _vm_vad_register_callback) + _vm_vad_register_callback(callback); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_set_level.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_set_level.c new file mode 100644 index 00000000..711d3ef3 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_set_level.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvad.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_vad_set_level_t)(VMUINT8 level); +_vm_vad_set_level_t _vm_vad_set_level = NULL; + +VMBOOL vm_vad_set_level(VMUINT8 level) +{ + if (NULL == _vm_vad_set_level) + _vm_vad_set_level = (_vm_vad_set_level_t)vm_get_sym_entry("vm_vad_set_level"); + + if (NULL != _vm_vad_set_level) + return _vm_vad_set_level(level); + + return (VMBOOL)0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_switch_on_off.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_switch_on_off.c new file mode 100644 index 00000000..596645a1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vad_switch_on_off.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmvad.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMBOOL (*_vm_vad_switch_on_off_t)(VMBOOL on, void* param); +_vm_vad_switch_on_off_t _vm_vad_switch_on_off = NULL; + +VMBOOL vm_vad_switch_on_off(VMBOOL on, void* param) +{ + if (NULL == _vm_vad_switch_on_off) + _vm_vad_switch_on_off = (_vm_vad_switch_on_off_t)vm_get_sym_entry("vm_vad_switch_on_off"); + + if (NULL != _vm_vad_switch_on_off) + return _vm_vad_switch_on_off(on,param); + + return (VMBOOL)0; +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_pause.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_pause.c new file mode 100644 index 00000000..f40b209e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_pause.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vdorec_pause_t)(void); +_vm_vdorec_pause_t _vm_vdorec_pause = NULL; + +VMINT vm_vdorec_pause(void) +{ + if (NULL == _vm_vdorec_pause) + _vm_vdorec_pause = (_vm_vdorec_pause_t)vm_get_sym_entry("vm_vdorec_pause"); + + if (NULL != _vm_vdorec_pause) + return _vm_vdorec_pause(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_power_down.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_power_down.c new file mode 100644 index 00000000..f22d4a19 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_power_down.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vdorec_power_down_t)(void); +_vm_vdorec_power_down_t _vm_vdorec_power_down = NULL; + +VMINT vm_vdorec_power_down(void) +{ + if (NULL == _vm_vdorec_power_down) + _vm_vdorec_power_down = (_vm_vdorec_power_down_t)vm_get_sym_entry("vm_vdorec_power_down"); + + if (NULL != _vm_vdorec_power_down) + return _vm_vdorec_power_down(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_power_up.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_power_up.c new file mode 100644 index 00000000..a2362b69 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_power_up.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vdorec_power_up_t)(VMUINT16 camere_id, vm_vdorec_callback callback); +_vm_vdorec_power_up_t _vm_vdorec_power_up = NULL; + +VMINT vm_vdorec_power_up(VMUINT16 camere_id, vm_vdorec_callback callback) +{ + if (NULL == _vm_vdorec_power_up) + _vm_vdorec_power_up = (_vm_vdorec_power_up_t)vm_get_sym_entry("vm_vdorec_power_up"); + + if (NULL != _vm_vdorec_power_up) + return _vm_vdorec_power_up(camere_id, callback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_preview.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_preview.c new file mode 100644 index 00000000..a7c25aba --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_preview.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vdorec_preview_t)(vm_vdorec_preview_struct* para); +_vm_vdorec_preview_t _vm_vdorec_preview = NULL; + +VMINT vm_vdorec_preview(vm_vdorec_preview_struct* para) +{ + if (NULL == _vm_vdorec_preview) + _vm_vdorec_preview = (_vm_vdorec_preview_t)vm_get_sym_entry("vm_vdorec_preview"); + + if (NULL != _vm_vdorec_preview) + return _vm_vdorec_preview(para); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_record.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_record.c new file mode 100644 index 00000000..d9d9757f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_record.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vdorec_record_t)(vm_vdorec_record_struct* para); +_vm_vdorec_record_t _vm_vdorec_record = NULL; + +VMINT vm_vdorec_record(vm_vdorec_record_struct* para) +{ + if (NULL == _vm_vdorec_record) + _vm_vdorec_record = (_vm_vdorec_record_t)vm_get_sym_entry("vm_vdorec_record"); + + if (NULL != _vm_vdorec_record) + return _vm_vdorec_record(para); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_resume.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_resume.c new file mode 100644 index 00000000..c564d920 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_resume.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vdorec_resume_t)(void); +_vm_vdorec_resume_t _vm_vdorec_resume = NULL; + +VMINT vm_vdorec_resume(void) +{ + if (NULL == _vm_vdorec_resume) + _vm_vdorec_resume = (_vm_vdorec_resume_t)vm_get_sym_entry("vm_vdorec_resume"); + + if (NULL != _vm_vdorec_resume) + return _vm_vdorec_resume(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_rtsp_local_save_start.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_rtsp_local_save_start.c new file mode 100644 index 00000000..43802606 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_rtsp_local_save_start.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vdorec_rtsp_local_save_start_t)(VMWSTR filepath, vm_vdorec_callback callback); +_vm_vdorec_rtsp_local_save_start_t _vm_vdorec_rtsp_local_save_start = NULL; + +VMINT vm_vdorec_rtsp_local_save_start(VMWSTR filepath, vm_vdorec_callback callback) +{ + if (NULL == _vm_vdorec_rtsp_local_save_start) + _vm_vdorec_rtsp_local_save_start = (_vm_vdorec_rtsp_local_save_start_t)vm_get_sym_entry("vm_vdorec_rtsp_local_save_start"); + + if (NULL != _vm_vdorec_rtsp_local_save_start) + return _vm_vdorec_rtsp_local_save_start(filepath,callback); + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_rtsp_local_save_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_rtsp_local_save_stop.c new file mode 100644 index 00000000..6727e0af --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_rtsp_local_save_stop.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vdorec_rtsp_local_save_stop_t)(void); +_vm_vdorec_rtsp_local_save_stop_t _vm_vdorec_rtsp_local_save_stop = NULL; + +VMINT vm_vdorec_rtsp_local_save_stop(void) +{ + if (NULL == _vm_vdorec_rtsp_local_save_stop) + _vm_vdorec_rtsp_local_save_stop = (_vm_vdorec_rtsp_local_save_stop_t)vm_get_sym_entry("vm_vdorec_rtsp_local_save_stop"); + + if (NULL != _vm_vdorec_rtsp_local_save_stop) + return _vm_vdorec_rtsp_local_save_stop(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_save_to_file.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_save_to_file.c new file mode 100644 index 00000000..fd09413e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_save_to_file.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_vdorec_save_to_file_t)(VMWSTR filepath, vm_vdorec_callback callback); +_vm_vdorec_save_to_file_t _vm_vdorec_save_to_file = NULL; + +void vm_vdorec_save_to_file(VMWSTR filepath, vm_vdorec_callback callback) +{ + if (NULL == _vm_vdorec_save_to_file) + _vm_vdorec_save_to_file = (_vm_vdorec_save_to_file_t)vm_get_sym_entry("vm_vdorec_save_to_file"); + + if (NULL != _vm_vdorec_save_to_file) + _vm_vdorec_save_to_file(filepath,callback); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_set_param.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_set_param.c new file mode 100644 index 00000000..5d4d1cf8 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_set_param.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vdorec_set_param_t)(VMUINT32 param_id, VMUINT16 value); +_vm_vdorec_set_param_t _vm_vdorec_set_param = NULL; + +VMINT vm_vdorec_set_param(VMUINT32 param_id, VMUINT16 value) +{ + if (NULL == _vm_vdorec_set_param) + _vm_vdorec_set_param = (_vm_vdorec_set_param_t)vm_get_sym_entry("vm_vdorec_set_param"); + + if (NULL != _vm_vdorec_set_param) + return _vm_vdorec_set_param(param_id, value); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_stop.c new file mode 100644 index 00000000..127e0092 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vdorec_stop.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvdorec.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_vdorec_stop_t)(void); +_vm_vdorec_stop_t _vm_vdorec_stop = NULL; + +VMINT vm_vdorec_stop(void) +{ + if (NULL == _vm_vdorec_stop) + _vm_vdorec_stop = (_vm_vdorec_stop_t)vm_get_sym_entry("vm_vdorec_stop"); + + if (NULL != _vm_vdorec_stop) + return _vm_vdorec_stop(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_off.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_off.c new file mode 100644 index 00000000..a9df16ef --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_off.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_vibrator_off_t)(void); +_vm_vibrator_off_t _vm_vibrator_off = NULL; + +void vm_vibrator_off(void) +{ + if (NULL == _vm_vibrator_off) + _vm_vibrator_off = (_vm_vibrator_off_t)vm_get_sym_entry("vm_vibrator_off"); + + if (NULL != _vm_vibrator_off) + _vm_vibrator_off(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_on.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_on.c new file mode 100644 index 00000000..dc23f733 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_on.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_vibrator_on_t)(void); +_vm_vibrator_on_t _vm_vibrator_on = NULL; + +void vm_vibrator_on(void) +{ + if (NULL == _vm_vibrator_on) + _vm_vibrator_on = (_vm_vibrator_on_t)vm_get_sym_entry("vm_vibrator_on"); + + if (NULL != _vm_vibrator_on) + _vm_vibrator_on(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_once.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_once.c new file mode 100644 index 00000000..4d5db696 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vibrator_once.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmmm.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_vibrator_once_t)(void); +_vm_vibrator_once_t _vm_vibrator_once = NULL; + +void vm_vibrator_once(void) +{ + if (NULL == _vm_vibrator_once) + _vm_vibrator_once = (_vm_vibrator_once_t)vm_get_sym_entry("vm_vibrator_once"); + + if (NULL != _vm_vibrator_once) + _vm_vibrator_once(); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_close_buffer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_close_buffer.c new file mode 100644 index 00000000..8d9b4c88 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_close_buffer.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_close_buffer_t)(void); +_vm_video_close_buffer_t _vm_video_close_buffer = NULL; + +VMINT vm_video_close_buffer(void) +{ + if (NULL == _vm_video_close_buffer) + _vm_video_close_buffer = (_vm_video_close_buffer_t)vm_get_sym_entry("vm_video_close_buffer"); + + if (NULL != _vm_video_close_buffer) + return _vm_video_close_buffer(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_close_file.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_close_file.c new file mode 100644 index 00000000..43f49170 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_close_file.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_close_file_t)(void); +_vm_video_close_file_t _vm_video_close_file = NULL; + +VMINT vm_video_close_file(void) +{ + if (NULL == _vm_video_close_file) + _vm_video_close_file = (_vm_video_close_file_t)vm_get_sym_entry("vm_video_close_file"); + + if (NULL != _vm_video_close_file) + return _vm_video_close_file(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_get_cur_play_time.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_get_cur_play_time.c new file mode 100644 index 00000000..fabd26fa --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_get_cur_play_time.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_get_cur_play_time_t)(VMUINT64 *cur_play_time); +_vm_video_get_cur_play_time_t _vm_video_get_cur_play_time = NULL; + +VMINT vm_video_get_cur_play_time(VMUINT64 *cur_play_time) +{ + if (NULL == _vm_video_get_cur_play_time) + _vm_video_get_cur_play_time = (_vm_video_get_cur_play_time_t)vm_get_sym_entry("vm_video_get_cur_play_time"); + + if (NULL != _vm_video_get_cur_play_time) + return _vm_video_get_cur_play_time(cur_play_time); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_open_buffer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_open_buffer.c new file mode 100644 index 00000000..bc7d8300 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_open_buffer.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_open_buffer_t)( const VMUSTR buffer, const VMUINT buffer_len, vm_video_info_struct *info); +_vm_video_open_buffer_t _vm_video_open_buffer = NULL; + +VMINT vm_video_open_buffer( const VMUSTR buffer, const VMUINT buffer_len, vm_video_info_struct *info) +{ + if (NULL == _vm_video_open_buffer) + _vm_video_open_buffer = (_vm_video_open_buffer_t)vm_get_sym_entry("vm_video_open_buffer"); + + if (NULL != _vm_video_open_buffer) + return _vm_video_open_buffer(buffer,buffer_len,info); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_open_file.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_open_file.c new file mode 100644 index 00000000..d6ab5043 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_open_file.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_open_file_t)( const VMWSTR filename, vm_video_open_result_callback open_result_callback); +_vm_video_open_file_t _vm_video_open_file = NULL; + +VMINT vm_video_open_file( const VMWSTR filename, vm_video_open_result_callback open_result_callback) +{ + if (NULL == _vm_video_open_file) + _vm_video_open_file = (_vm_video_open_file_t)vm_get_sym_entry("vm_video_open_file"); + + if (NULL != _vm_video_open_file) + return _vm_video_open_file(filename,open_result_callback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_pause.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_pause.c new file mode 100644 index 00000000..b090ca1d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_pause.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_pause_t)(void); +_vm_video_pause_t _vm_video_pause = NULL; + +VMINT vm_video_pause(void) +{ + if (NULL == _vm_video_pause) + _vm_video_pause = (_vm_video_pause_t)vm_get_sym_entry("vm_video_pause"); + + if (NULL != _vm_video_pause) + return _vm_video_pause(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play.c new file mode 100644 index 00000000..63644dfa --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_play_t)( VMUINT player_layer_handle, VMUINT base_layer_handle, VMUINT16 repeat_count, VMINT is_play_audio, VMINT audio_path, vm_video_finish_callback play_finish_callback); +_vm_video_play_t _vm_video_play = NULL; + +VMINT vm_video_play( VMUINT player_layer_handle, VMUINT base_layer_handle, VMUINT16 repeat_count, VMINT is_play_audio, VMINT audio_path, vm_video_finish_callback play_finish_callback) +{ + if (NULL == _vm_video_play) + _vm_video_play = (_vm_video_play_t)vm_get_sym_entry("vm_video_play"); + + if (NULL != _vm_video_play) + return _vm_video_play(player_layer_handle,base_layer_handle,repeat_count,is_play_audio,audio_path,play_finish_callback); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_by_filepath.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_by_filepath.c new file mode 100644 index 00000000..a68d8cb2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_by_filepath.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_play_by_filepath_t)(VMWSTR filename); +_vm_video_play_by_filepath_t _vm_video_play_by_filepath = NULL; + +VMINT vm_video_play_by_filepath(VMWSTR filename) +{ + if (NULL == _vm_video_play_by_filepath) + _vm_video_play_by_filepath = (_vm_video_play_by_filepath_t)vm_get_sym_entry("vm_video_play_by_filepath"); + + if (NULL != _vm_video_play_by_filepath) + return _vm_video_play_by_filepath(filename); + + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_stream_from_rtsp_link.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_stream_from_rtsp_link.c new file mode 100644 index 00000000..2493fec6 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_stream_from_rtsp_link.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_play_stream_from_rtsp_link_t)(VMWSTR url); +_vm_video_play_stream_from_rtsp_link_t _vm_video_play_stream_from_rtsp_link = NULL; + +VMINT vm_video_play_stream_from_rtsp_link(VMWSTR url) +{ + if (NULL == _vm_video_play_stream_from_rtsp_link) + _vm_video_play_stream_from_rtsp_link = (_vm_video_play_stream_from_rtsp_link_t)vm_get_sym_entry("vm_video_play_stream_from_rtsp_link"); + + if (NULL != _vm_video_play_stream_from_rtsp_link) + return _vm_video_play_stream_from_rtsp_link(url); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_stream_from_sdp_file.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_stream_from_sdp_file.c new file mode 100644 index 00000000..4a7a5b23 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_play_stream_from_sdp_file.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_play_stream_from_sdp_file_t)(VMWSTR filename, VMUCHAR is_short); +_vm_video_play_stream_from_sdp_file_t _vm_video_play_stream_from_sdp_file = NULL; + +VMINT vm_video_play_stream_from_sdp_file(VMWSTR filename, VMUCHAR is_short) +{ + if (NULL == _vm_video_play_stream_from_sdp_file) + _vm_video_play_stream_from_sdp_file = (_vm_video_play_stream_from_sdp_file_t)vm_get_sym_entry("vm_video_play_stream_from_sdp_file"); + + if (NULL != _vm_video_play_stream_from_sdp_file) + return _vm_video_play_stream_from_sdp_file(filename,is_short); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_resume.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_resume.c new file mode 100644 index 00000000..0b88727b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_resume.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_resume_t)(void); +_vm_video_resume_t _vm_video_resume = NULL; + +VMINT vm_video_resume(void) +{ + if (NULL == _vm_video_resume) + _vm_video_resume = (_vm_video_resume_t)vm_get_sym_entry("vm_video_resume"); + + if (NULL != _vm_video_resume) + return _vm_video_resume(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_seek_and_getframe.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_seek_and_getframe.c new file mode 100644 index 00000000..528d643b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_seek_and_getframe.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_seek_and_getframe_t)(VMUINT64 time, VMUINT player_layer_handle); +_vm_video_seek_and_getframe_t _vm_video_seek_and_getframe = NULL; + +VMINT vm_video_seek_and_getframe(VMUINT64 time, VMUINT player_layer_handle) +{ + if (NULL == _vm_video_seek_and_getframe) + _vm_video_seek_and_getframe = (_vm_video_seek_and_getframe_t)vm_get_sym_entry("vm_video_seek_and_getframe"); + + if (NULL != _vm_video_seek_and_getframe) + return _vm_video_seek_and_getframe(time,player_layer_handle); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_set_brightness.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_set_brightness.c new file mode 100644 index 00000000..4aeaa1aa --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_set_brightness.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_set_brightness_t)(VMUINT16 brightness); +_vm_video_set_brightness_t _vm_video_set_brightness = NULL; + +VMINT vm_video_set_brightness(VMUINT16 brightness) +{ + if (NULL == _vm_video_set_brightness) + _vm_video_set_brightness = (_vm_video_set_brightness_t)vm_get_sym_entry("vm_video_set_brightness"); + + if (NULL != _vm_video_set_brightness) + return _vm_video_set_brightness(brightness); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_set_contrast.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_set_contrast.c new file mode 100644 index 00000000..a2bb4b9d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_set_contrast.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_set_contrast_t)(VMUINT16 contrast); +_vm_video_set_contrast_t _vm_video_set_contrast = NULL; + +VMINT vm_video_set_contrast(VMUINT16 contrast) +{ + if (NULL == _vm_video_set_contrast) + _vm_video_set_contrast = (_vm_video_set_contrast_t)vm_get_sym_entry("vm_video_set_contrast"); + + if (NULL != _vm_video_set_contrast) + return _vm_video_set_contrast(contrast); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_snapshot.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_snapshot.c new file mode 100644 index 00000000..1f3f3fc1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_snapshot.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_snapshot_t)(VMUINT player_layer_handle, VMWSTR file_name); +_vm_video_snapshot_t _vm_video_snapshot = NULL; + +VMINT vm_video_snapshot(VMUINT player_layer_handle, VMWSTR file_name) +{ + if (NULL == _vm_video_snapshot) + _vm_video_snapshot = (_vm_video_snapshot_t)vm_get_sym_entry("vm_video_snapshot"); + + if (NULL != _vm_video_snapshot) + return _vm_video_snapshot(player_layer_handle,file_name); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_stop.c new file mode 100644 index 00000000..a6ae2a44 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_video_stop.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmvideo.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_video_stop_t)(void); +_vm_video_stop_t _vm_video_stop = NULL; + +VMINT vm_video_stop(void) +{ + if (NULL == _vm_video_stop) + _vm_video_stop = (_vm_video_stop_t)vm_get_sym_entry("vm_video_stop"); + + if (NULL != _vm_video_stop) + return _vm_video_stop(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vsprintf.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vsprintf.c new file mode 100644 index 00000000..c3adf140 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vsprintf.c @@ -0,0 +1,20 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef int (*_vm_vsprintf_t)(char *buf, const char *fmt, va_list args); +_vm_vsprintf_t _vm_vsprintf = NULL; + +int vm_vsprintf(char *buf, const char *fmt, va_list args) +{ + int ret = {-1}; + if (NULL == _vm_vsprintf) + _vm_vsprintf = (_vm_vsprintf_t)vm_get_sym_entry("vm_vsprintf"); + + if (NULL != _vm_vsprintf) + return _vm_vsprintf(buf,fmt,args); + + return ret; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vwsprintf.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vwsprintf.c new file mode 100644 index 00000000..81486bad --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_vwsprintf.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef int (*_vm_vwsprintf_t)(VMWSTR buf, VMINT size, const VMWSTR fmt, va_list args); +_vm_vwsprintf_t _vm_vwsprintf = NULL; + +VMINT vm_vwsprintf(VMWSTR buf, VMINT size, const VMWSTR fmt, va_list args) +{ + int ret = {-1}; + if (NULL == _vm_vwsprintf) + _vm_vwsprintf = (_vm_vwsprintf_t)vm_get_sym_entry("vm_vwsprintf"); + + if (NULL != _vm_vwsprintf) + { + ret = _vm_vwsprintf(buf, size, fmt, args); + } + + return ret; +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_feed.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_feed.c new file mode 100644 index 00000000..e890724f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_feed.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmwdt.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_wdt_feed_t)(VMINT handle); +_vm_wdt_feed_t _vm_wdt_feed = NULL; + +void vm_wdt_feed(VMINT handle) +{ + if (NULL == _vm_wdt_feed) + _vm_wdt_feed = (_vm_wdt_feed_t)vm_get_sym_entry("vm_wdt_feed"); + + if (NULL != _vm_wdt_feed) + _vm_wdt_feed(handle); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_start.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_start.c new file mode 100644 index 00000000..6678cf28 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_start.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmwdt.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wdt_start_t)(VMUINT tick); +_vm_wdt_start_t _vm_wdt_start = NULL; + +VMINT vm_wdt_start(VMUINT tick) +{ + if (NULL == _vm_wdt_start) + _vm_wdt_start = (_vm_wdt_start_t)vm_get_sym_entry("vm_wdt_start"); + + if (NULL != _vm_wdt_start) + return _vm_wdt_start(tick); + + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_stop.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_stop.c new file mode 100644 index 00000000..188b1ce0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wdt_stop.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmwdt.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_wdt_stop_t)(VMINT handle); +_vm_wdt_stop_t _vm_wdt_stop = NULL; + +void vm_wdt_stop(VMINT handle) +{ + if (NULL == _vm_wdt_stop) + _vm_wdt_stop = (_vm_wdt_stop_t)vm_get_sym_entry("vm_wdt_stop"); + + if (NULL != _vm_wdt_stop) + _vm_wdt_stop(handle); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wends_with.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wends_with.c new file mode 100644 index 00000000..5e9746de --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wends_with.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wends_with_t)(const VMWSTR s1, const VMWSTR s2); +_vm_wends_with_t _vm_wends_with = NULL; + +VMINT vm_wends_with(const VMWSTR s1, const VMWSTR s2) +{ + if (NULL == _vm_wends_with) + _vm_wends_with = (_vm_wends_with_t)vm_get_sym_entry("vm_wends_with"); + + if (NULL != _vm_wends_with) + return _vm_wends_with(s1,s2); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wifi_is_connected.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wifi_is_connected.c new file mode 100644 index 00000000..a6d33562 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wifi_is_connected.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wifi_is_connected_t)(void); +_vm_wifi_is_connected_t _vm_wifi_is_connected = NULL; + +VMINT vm_wifi_is_connected(void) +{ + if (NULL == _vm_wifi_is_connected) + _vm_wifi_is_connected = (_vm_wifi_is_connected_t)vm_get_sym_entry("vm_wifi_is_connected"); + + if (NULL != _vm_wifi_is_connected) + return _vm_wifi_is_connected(); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_connect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_connect.c new file mode 100644 index 00000000..b8654076 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_connect.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_connect_t)(vm_wlan_ap_info_struct *ap_info, vm_wlan_conn_res_cb_func_ptr callback, void *user_data); +_vm_wlan_connect_t _vm_wlan_connect = NULL; + +VMINT vm_wlan_connect(vm_wlan_ap_info_struct *ap_info, vm_wlan_conn_res_cb_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_connect) + _vm_wlan_connect = (_vm_wlan_connect_t)vm_get_sym_entry("vm_wlan_connect"); + if (NULL != _vm_wlan_connect) + return _vm_wlan_connect(ap_info,callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_dereg_noti.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_dereg_noti.c new file mode 100644 index 00000000..4e6b7d75 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_dereg_noti.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_dereg_noti_t)(VMINT noti_type, vm_wlan_noti_func_ptr callback, void *user_data); +_vm_wlan_dereg_noti_t _vm_wlan_dereg_noti = NULL; + +VMINT vm_wlan_dereg_noti(VMINT noti_type, vm_wlan_noti_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_dereg_noti) + _vm_wlan_dereg_noti = (_vm_wlan_dereg_noti_t)vm_get_sym_entry("vm_wlan_dereg_noti"); + if (NULL != _vm_wlan_dereg_noti) + return _vm_wlan_dereg_noti(noti_type,callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_disconnect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_disconnect.c new file mode 100644 index 00000000..7fdfec1c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_disconnect.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_disconnect_t)(vm_wlan_cb_func_ptr callback, void *user_data); +_vm_wlan_disconnect_t _vm_wlan_disconnect = NULL; + +VMINT vm_wlan_disconnect(vm_wlan_cb_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_disconnect) + _vm_wlan_disconnect = (_vm_wlan_disconnect_t)vm_get_sym_entry("vm_wlan_disconnect"); + if (NULL != _vm_wlan_disconnect) + return _vm_wlan_disconnect(callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_connected_ap_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_connected_ap_info.c new file mode 100644 index 00000000..d66b692a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_connected_ap_info.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_get_connected_ap_info_t)(void *info, VMINT info_type); +_vm_wlan_get_connected_ap_info_t _vm_wlan_get_connected_ap_info = NULL; + +VMINT vm_wlan_get_connected_ap_info(void *info, VMINT info_type) +{ + if (NULL == _vm_wlan_get_connected_ap_info) + _vm_wlan_get_connected_ap_info = (_vm_wlan_get_connected_ap_info_t)vm_get_sym_entry("vm_wlan_get_connected_ap_info"); + if (NULL != _vm_wlan_get_connected_ap_info) + return _vm_wlan_get_connected_ap_info(info,info_type); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_ip_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_ip_info.c new file mode 100644 index 00000000..47cc7765 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_ip_info.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_get_ip_info_t)(vm_wlan_ip_info_struct* ip_info); +_vm_wlan_get_ip_info_t _vm_wlan_get_ip_info = NULL; + +VMINT vm_wlan_get_ip_info(vm_wlan_ip_info_struct* ip_info) +{ + if (NULL == _vm_wlan_get_ip_info) + _vm_wlan_get_ip_info = (_vm_wlan_get_ip_info_t)vm_get_sym_entry("vm_wlan_get_ip_info"); + if (NULL != _vm_wlan_get_ip_info) + return _vm_wlan_get_ip_info(ip_info); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_mac_address.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_mac_address.c new file mode 100644 index 00000000..8bd84ec7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_mac_address.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_get_mac_address_t)(vm_wlan_prof_str_info_qry_struct *mac_address_out); +_vm_wlan_get_mac_address_t _vm_wlan_get_mac_address = NULL; + +VMINT vm_wlan_get_mac_address(vm_wlan_prof_str_info_qry_struct *mac_address_out) +{ + if (NULL == _vm_wlan_get_mac_address) + _vm_wlan_get_mac_address = (_vm_wlan_get_mac_address_t)vm_get_sym_entry("vm_wlan_get_mac_address"); + if (NULL != _vm_wlan_get_mac_address) + return _vm_wlan_get_mac_address(mac_address_out); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_para.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_para.c new file mode 100644 index 00000000..4667760b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_get_para.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_get_para_t)(vm_wlan_set_mode_enum mode, void *para); +_vm_wlan_get_para_t _vm_wlan_get_para = NULL; + +VMINT vm_wlan_get_para(vm_wlan_set_mode_enum mode, void *para) +{ + if (NULL == _vm_wlan_get_para) + _vm_wlan_get_para = (_vm_wlan_get_para_t)vm_get_sym_entry("vm_wlan_get_para"); + if (NULL != _vm_wlan_get_para) + return _vm_wlan_get_para(mode,para); + return (VMINT)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_get_connected_info.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_get_connected_info.c new file mode 100644 index 00000000..743e910f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_get_connected_info.c @@ -0,0 +1,18 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_loc_get_connected_info_t)(vm_wlan_loc_supc_abm_bss_info_struct * info); +_vm_wlan_loc_get_connected_info_t _vm_wlan_loc_get_connected_info = NULL; +VMINT vm_wlan_loc_get_connected_info(vm_wlan_loc_supc_abm_bss_info_struct * info) +{ + if (_vm_wlan_loc_get_connected_info == NULL) + _vm_wlan_loc_get_connected_info = (_vm_wlan_loc_get_connected_info_t)vm_get_sym_entry("vm_wlan_loc_get_connected_info"); + + if (_vm_wlan_loc_get_connected_info != NULL) + return _vm_wlan_loc_get_connected_info(info); + else + return -1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_search.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_search.c new file mode 100644 index 00000000..cdfeb39d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_search.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_loc_search_t)(void (*callback)(vm_wlan_loc_data_t * data, void * user_data), void * user_data); +_vm_wlan_loc_search_t _vm_wlan_loc_search = NULL; +VMINT vm_wlan_loc_search(void (*callback)(vm_wlan_loc_data_t * data, void * user_data), void * user_data) +{ + if (_vm_wlan_loc_search == NULL) + _vm_wlan_loc_search = (_vm_wlan_loc_search_t)vm_get_sym_entry("vm_wlan_loc_search"); + + if (_vm_wlan_loc_search != NULL) + return _vm_wlan_loc_search(callback, user_data); + else + return -1; +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_search_abort.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_search_abort.c new file mode 100644 index 00000000..5aee5dec --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_loc_search_abort.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_loc_search_abort_t)(VMINT handle); +_vm_wlan_loc_search_abort_t _vm_wlan_loc_search_abort = NULL; +VMINT vm_wlan_loc_search_abort(VMINT handle) +{ + if (_vm_wlan_loc_search_abort == NULL) + _vm_wlan_loc_search_abort = (_vm_wlan_loc_search_abort_t)vm_get_sym_entry("vm_wlan_loc_search_abort"); + + if (_vm_wlan_loc_search_abort != NULL) + return _vm_wlan_loc_search_abort(handle); + else + return -1; +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_mode_get.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_mode_get.c new file mode 100644 index 00000000..db8da0c0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_mode_get.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_mode_get_t)(void); +_vm_wlan_mode_get_t _vm_wlan_mode_get = NULL; + +VMINT vm_wlan_mode_get(void) +{ + if (NULL == _vm_wlan_mode_get) + _vm_wlan_mode_get = (_vm_wlan_mode_get_t)vm_get_sym_entry("vm_wlan_mode_get"); + if (NULL != _vm_wlan_mode_get) + return _vm_wlan_mode_get(); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_mode_set.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_mode_set.c new file mode 100644 index 00000000..f532dfcd --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_mode_set.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_mode_set_t)(vm_wlan_set_mode_enum mode, vm_wlan_cb_func_ptr callback, void *user_data); +_vm_wlan_mode_set_t _vm_wlan_mode_set = NULL; + +VMINT vm_wlan_mode_set(vm_wlan_set_mode_enum mode, vm_wlan_cb_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_mode_set) + _vm_wlan_mode_set = (_vm_wlan_mode_set_t)vm_get_sym_entry("vm_wlan_mode_set"); + if (NULL != _vm_wlan_mode_set) + return _vm_wlan_mode_set(mode,callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_perfer.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_perfer.c new file mode 100644 index 00000000..ce3e975f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_perfer.c @@ -0,0 +1,21 @@ +#include "vmsys.h" +#include "vmsock.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_perfer_t)(VMINT disable); +_vm_wlan_perfer_t _vm_wlan_perfer = NULL; +VMINT vm_wlan_perfer(VMINT disable) +{ + if (NULL == _vm_wlan_perfer) + _vm_wlan_perfer = (_vm_wlan_perfer_t)vm_get_sym_entry("vm_wlan_perfer"); + + if (NULL != _vm_wlan_perfer) + return _vm_wlan_perfer(disable); + + return -1; + +} + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_add.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_add.c new file mode 100644 index 00000000..ba8a5951 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_add.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_prof_add_t)(const vm_wlan_prof_struct *prof, VMUINT32 *prof_id); +_vm_wlan_prof_add_t _vm_wlan_prof_add = NULL; + +VMINT vm_wlan_prof_add(const vm_wlan_prof_struct *prof, VMUINT32 *prof_id) +{ + if (NULL == _vm_wlan_prof_add) + _vm_wlan_prof_add = (_vm_wlan_prof_add_t)vm_get_sym_entry("vm_wlan_prof_add"); + if (NULL != _vm_wlan_prof_add) + return _vm_wlan_prof_add(prof,prof_id); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_connect.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_connect.c new file mode 100644 index 00000000..af043e1e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_connect.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_prof_connect_t)(VMUINT32 prof_id, vm_wlan_conn_res_cb_func_ptr callback, void *user_data); +_vm_wlan_prof_connect_t _vm_wlan_prof_connect = NULL; + +VMINT vm_wlan_prof_connect(VMUINT32 prof_id, vm_wlan_conn_res_cb_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_prof_connect) + _vm_wlan_prof_connect = (_vm_wlan_prof_connect_t)vm_get_sym_entry("vm_wlan_prof_connect"); + if (NULL != _vm_wlan_prof_connect) + return _vm_wlan_prof_connect(prof_id,callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_delete.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_delete.c new file mode 100644 index 00000000..c87b289e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_delete.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_prof_delete_t)(VMUINT32 prof_id); +_vm_wlan_prof_delete_t _vm_wlan_prof_delete = NULL; + +VMINT vm_wlan_prof_delete(VMUINT32 prof_id) +{ + if (NULL == _vm_wlan_prof_delete) + _vm_wlan_prof_delete = (_vm_wlan_prof_delete_t)vm_get_sym_entry("vm_wlan_prof_delete"); + if (NULL != _vm_wlan_prof_delete) + return _vm_wlan_prof_delete(prof_id); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_get_reconn_id.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_get_reconn_id.c new file mode 100644 index 00000000..99fd390c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_get_reconn_id.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_prof_get_reconn_id_t)(VMUINT32 *prof_id); +_vm_wlan_prof_get_reconn_id_t _vm_wlan_prof_get_reconn_id = NULL; + +VMINT vm_wlan_prof_get_reconn_id(VMUINT32 *prof_id) +{ + if (NULL == _vm_wlan_prof_get_reconn_id) + _vm_wlan_prof_get_reconn_id = (_vm_wlan_prof_get_reconn_id_t)vm_get_sym_entry("vm_wlan_prof_get_reconn_id"); + if (NULL != _vm_wlan_prof_get_reconn_id) + return _vm_wlan_prof_get_reconn_id(prof_id); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_init.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_init.c new file mode 100644 index 00000000..4b61dba0 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_init.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_prof_init_t)(vm_wlan_prof_struct *profile); +_vm_wlan_prof_init_t _vm_wlan_prof_init = NULL; + +VMINT vm_wlan_prof_init(vm_wlan_prof_struct *profile) +{ + if (NULL == _vm_wlan_prof_init) + _vm_wlan_prof_init = (_vm_wlan_prof_init_t)vm_get_sym_entry("vm_wlan_prof_init"); + if (NULL != _vm_wlan_prof_init) + return _vm_wlan_prof_init(profile); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_query.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_query.c new file mode 100644 index 00000000..f0a0c61a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_query.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_prof_query_t)(VMUINT32 prof_id, vm_wlan_prof_struct *prof); +_vm_wlan_prof_query_t _vm_wlan_prof_query = NULL; + +VMINT vm_wlan_prof_query(VMUINT32 prof_id, vm_wlan_prof_struct *prof) +{ + if (NULL == _vm_wlan_prof_query) + _vm_wlan_prof_query = (_vm_wlan_prof_query_t)vm_get_sym_entry("vm_wlan_prof_query"); + if (NULL != _vm_wlan_prof_query) + return _vm_wlan_prof_query(prof_id,prof); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_query_list.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_query_list.c new file mode 100644 index 00000000..b60a4eb5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_query_list.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_prof_query_list_t)(vm_wlan_prof_list_struct *prof_list); +_vm_wlan_prof_query_list_t _vm_wlan_prof_query_list = NULL; + +VMINT vm_wlan_prof_query_list(vm_wlan_prof_list_struct *prof_list) +{ + if (NULL == _vm_wlan_prof_query_list) + _vm_wlan_prof_query_list = (_vm_wlan_prof_query_list_t)vm_get_sym_entry("vm_wlan_prof_query_list"); + if (NULL != _vm_wlan_prof_query_list) + return _vm_wlan_prof_query_list(prof_list); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_set_reconn_id.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_set_reconn_id.c new file mode 100644 index 00000000..62a4ed43 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_set_reconn_id.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_prof_set_reconn_id_t)(VMUINT32 prof_id); +_vm_wlan_prof_set_reconn_id_t _vm_wlan_prof_set_reconn_id = NULL; + +VMINT vm_wlan_prof_set_reconn_id(VMUINT32 prof_id) +{ + if (NULL == _vm_wlan_prof_set_reconn_id) + _vm_wlan_prof_set_reconn_id = (_vm_wlan_prof_set_reconn_id_t)vm_get_sym_entry("vm_wlan_prof_set_reconn_id"); + if (NULL != _vm_wlan_prof_set_reconn_id) + return _vm_wlan_prof_set_reconn_id(prof_id); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_update.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_update.c new file mode 100644 index 00000000..a0b4c3ee --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_prof_update.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_prof_update_t)(VMUINT32 prof_id, vm_wlan_prof_struct *prof, VMUINT32 prof_fields); +_vm_wlan_prof_update_t _vm_wlan_prof_update = NULL; + +VMINT vm_wlan_prof_update(VMUINT32 prof_id, vm_wlan_prof_struct *prof, VMUINT32 prof_fields) +{ + if (NULL == _vm_wlan_prof_update) + _vm_wlan_prof_update = (_vm_wlan_prof_update_t)vm_get_sym_entry("vm_wlan_prof_update"); + if (NULL != _vm_wlan_prof_update) + return _vm_wlan_prof_update(prof_id,prof,prof_fields); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_reg_noti.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_reg_noti.c new file mode 100644 index 00000000..31747a0b --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_reg_noti.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_reg_noti_t)(VMINT noti_type, vm_wlan_noti_func_ptr callback, void *user_data); +_vm_wlan_reg_noti_t _vm_wlan_reg_noti = NULL; + +VMINT vm_wlan_reg_noti(VMINT noti_type, vm_wlan_noti_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_reg_noti) + _vm_wlan_reg_noti = (_vm_wlan_reg_noti_t)vm_get_sym_entry("vm_wlan_reg_noti"); + if (NULL != _vm_wlan_reg_noti) + return _vm_wlan_reg_noti(noti_type,callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_roaming_get.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_roaming_get.c new file mode 100644 index 00000000..6c9a72d9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_roaming_get.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_roaming_get_t)(VMINT *is_roaming); +_vm_wlan_roaming_get_t _vm_wlan_roaming_get = NULL; + +VMINT vm_wlan_roaming_get(VMINT *is_roaming) +{ + if (NULL == _vm_wlan_roaming_get) + _vm_wlan_roaming_get = (_vm_wlan_roaming_get_t)vm_get_sym_entry("vm_wlan_roaming_get"); + if (NULL != _vm_wlan_roaming_get) + return _vm_wlan_roaming_get(is_roaming); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_roaming_set.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_roaming_set.c new file mode 100644 index 00000000..de283acd --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_roaming_set.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_roaming_set_t)(VMINT enable_roaming, vm_wlan_cb_func_ptr callback, void *user_data); +_vm_wlan_roaming_set_t _vm_wlan_roaming_set = NULL; + +VMINT vm_wlan_roaming_set(VMINT enable_roaming, vm_wlan_cb_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_roaming_set) + _vm_wlan_roaming_set = (_vm_wlan_roaming_set_t)vm_get_sym_entry("vm_wlan_roaming_set"); + if (NULL != _vm_wlan_roaming_set) + return _vm_wlan_roaming_set(enable_roaming,callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan.c new file mode 100644 index 00000000..1ef93ada --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_scan_t)(vm_wlan_scan_res_cb_func_ptr callback, void *user_data); +_vm_wlan_scan_t _vm_wlan_scan = NULL; + +VMINT vm_wlan_scan(vm_wlan_scan_res_cb_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_scan) + _vm_wlan_scan = (_vm_wlan_scan_t)vm_get_sym_entry("vm_wlan_scan"); + if (NULL != _vm_wlan_scan) + return _vm_wlan_scan(callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_abort.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_abort.c new file mode 100644 index 00000000..4578bec1 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_abort.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_scan_abort_t)(VMUINT32 job_id); +_vm_wlan_scan_abort_t _vm_wlan_scan_abort = NULL; + +VMINT vm_wlan_scan_abort(VMUINT32 job_id) +{ + if (NULL == _vm_wlan_scan_abort) + _vm_wlan_scan_abort = (_vm_wlan_scan_abort_t)vm_get_sym_entry("vm_wlan_scan_abort"); + if (NULL != _vm_wlan_scan_abort) + return _vm_wlan_scan_abort(job_id); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_get_param.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_get_param.c new file mode 100644 index 00000000..b52f54e9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_get_param.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_scan_get_param_t)(void *param, VMINT32 param_type); +_vm_wlan_scan_get_param_t _vm_wlan_scan_get_param = NULL; + +VMINT vm_wlan_scan_get_param(void *param, VMINT32 param_type) +{ + if (NULL == _vm_wlan_scan_get_param) + _vm_wlan_scan_get_param = (_vm_wlan_scan_get_param_t)vm_get_sym_entry("vm_wlan_scan_get_param"); + if (NULL != _vm_wlan_scan_get_param) + return _vm_wlan_scan_get_param(param,param_type); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_set_param.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_set_param.c new file mode 100644 index 00000000..af358c82 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_scan_set_param.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_scan_set_param_t)(void *param, VMINT32 param_type, vm_wlan_cb_func_ptr callback, void *user_data); +_vm_wlan_scan_set_param_t _vm_wlan_scan_set_param = NULL; + +VMINT vm_wlan_scan_set_param(void *param, VMINT32 param_type, vm_wlan_cb_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_scan_set_param) + _vm_wlan_scan_set_param = (_vm_wlan_scan_set_param_t)vm_get_sym_entry("vm_wlan_scan_set_param"); + if (NULL != _vm_wlan_scan_set_param) + return _vm_wlan_scan_set_param(param,param_type,callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_set_para.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_set_para.c new file mode 100644 index 00000000..f2cb4a43 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_set_para.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_set_para_t)(vm_wlan_set_mode_enum mode, void *para, VMINT32 flag); +_vm_wlan_set_para_t _vm_wlan_set_para = NULL; + +VMINT vm_wlan_set_para(vm_wlan_set_mode_enum mode, void *para, VMINT32 flag) +{ + if (NULL == _vm_wlan_set_para) + _vm_wlan_set_para = (_vm_wlan_set_para_t)vm_get_sym_entry("vm_wlan_set_para"); + if (NULL != _vm_wlan_set_para) + return _vm_wlan_set_para(mode,para,flag); + return (VMINT)-100; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_sniffer_off.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_sniffer_off.c new file mode 100644 index 00000000..9e66624d --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_sniffer_off.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_sniffer_off_t)(vm_wlan_sniffer_off_cb_func_ptr callback, void *user_data); +_vm_wlan_sniffer_off_t _vm_wlan_sniffer_off = NULL; + +VMINT vm_wlan_sniffer_off(vm_wlan_sniffer_off_cb_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_sniffer_off) + _vm_wlan_sniffer_off = (_vm_wlan_sniffer_off_t)vm_get_sym_entry("vm_wlan_sniffer_off"); + if (NULL != _vm_wlan_sniffer_off) + return _vm_wlan_sniffer_off(callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_sniffer_on.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_sniffer_on.c new file mode 100644 index 00000000..65abe2c9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_sniffer_on.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_sniffer_on_t)(vm_wlan_sniffer_on_cfg_struct *sniffer_on_config, vm_wlan_sniffer_on_cb_func_ptr callback, void *user_data); +_vm_wlan_sniffer_on_t _vm_wlan_sniffer_on = NULL; + +VMINT vm_wlan_sniffer_on(vm_wlan_sniffer_on_cfg_struct *sniffer_on_config, vm_wlan_sniffer_on_cb_func_ptr callback, void *user_data) +{ + if (NULL == _vm_wlan_sniffer_on) + _vm_wlan_sniffer_on = (_vm_wlan_sniffer_on_t)vm_get_sym_entry("vm_wlan_sniffer_on"); + if (NULL != _vm_wlan_sniffer_on) + return _vm_wlan_sniffer_on(sniffer_on_config,callback,user_data); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_status.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_status.c new file mode 100644 index 00000000..514fa161 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wlan_status.c @@ -0,0 +1,17 @@ +#include "vmsys.h" +#include "vmnwsetting.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wlan_status_t)(void); +_vm_wlan_status_t _vm_wlan_status = NULL; + +VMINT vm_wlan_status(void) +{ + if (NULL == _vm_wlan_status) + _vm_wlan_status = (_vm_wlan_status_t)vm_get_sym_entry("vm_wlan_status"); + if (NULL != _vm_wlan_status) + return _vm_wlan_status(); + return (VMINT)-1; +} \ No newline at end of file diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_write_cache.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_write_cache.c new file mode 100644 index 00000000..9b2cb6a2 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_write_cache.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_write_cache_t)(vm_cache_t *cache, void *buf, VMINT buf_len); +_vm_write_cache_t _vm_write_cache = NULL; + +VMINT vm_write_cache(vm_cache_t *cache, void *buf, VMINT buf_len) +{ + if (NULL == _vm_write_cache) + _vm_write_cache = (_vm_write_cache_t)vm_get_sym_entry("vm_write_cache"); + + if (NULL != _vm_write_cache) + return _vm_write_cache(cache,buf,buf_len); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstarts_with.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstarts_with.c new file mode 100644 index 00000000..f15e966e --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstarts_with.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wstarts_with_t)(VMWSTR a, VMWSTR b); +_vm_wstarts_with_t _vm_wstarts_with = NULL; + +VMINT vm_wstarts_with(VMWSTR a, VMWSTR b) +{ + if (NULL == _vm_wstarts_with) + _vm_wstarts_with = (_vm_wstarts_with_t)vm_get_sym_entry("vm_wstarts_with"); + + if (NULL != _vm_wstarts_with) + return _vm_wstarts_with(a,b); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcat.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcat.c new file mode 100644 index 00000000..edcb131c --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcat.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wstrcat_t)(VMWSTR dst, const VMWSTR src); +_vm_wstrcat_t _vm_wstrcat = NULL; + +VMINT vm_wstrcat(VMWSTR dst, const VMWSTR src) +{ + if (NULL == _vm_wstrcat) + _vm_wstrcat = (_vm_wstrcat_t)vm_get_sym_entry("vm_wstrcat"); + + if (NULL != _vm_wstrcat) + return _vm_wstrcat(dst,src); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcmp.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcmp.c new file mode 100644 index 00000000..4e92c3b7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcmp.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wstrcmp_t)(VMWSTR str_1, VMWSTR str_2); +_vm_wstrcmp_t _vm_wstrcmp = NULL; + +VMINT vm_wstrcmp(VMWSTR str_1, VMWSTR str_2) +{ + if (NULL == _vm_wstrcmp) + _vm_wstrcmp = (_vm_wstrcmp_t)vm_get_sym_entry("vm_wstrcmp"); + + if (NULL != _vm_wstrcmp) + return _vm_wstrcmp(str_1,str_2); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcmp_ignore_case.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcmp_ignore_case.c new file mode 100644 index 00000000..5c6e031a --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcmp_ignore_case.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wstrcmp_ignore_case_t)(VMWSTR str_1, VMWSTR str_2); +_vm_wstrcmp_ignore_case_t _vm_wstrcmp_ignore_case = NULL; + +VMINT vm_wstrcmp_ignore_case(VMWSTR str_1, VMWSTR str_2) +{ + if (NULL == _vm_wstrcmp_ignore_case) + _vm_wstrcmp_ignore_case = (_vm_wstrcmp_ignore_case_t)vm_get_sym_entry("vm_wstrcmp_ignore_case"); + + if (NULL != _vm_wstrcmp_ignore_case) + return _vm_wstrcmp_ignore_case(str_1,str_2); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcpy.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcpy.c new file mode 100644 index 00000000..d9f8eff9 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrcpy.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wstrcpy_t)(VMWSTR dst, const VMWSTR src); +_vm_wstrcpy_t _vm_wstrcpy = NULL; + +VMINT vm_wstrcpy(VMWSTR dst, const VMWSTR src) +{ + if (NULL == _vm_wstrcpy) + _vm_wstrcpy = (_vm_wstrcpy_t)vm_get_sym_entry("vm_wstrcpy"); + + if (NULL != _vm_wstrcpy) + return _vm_wstrcpy(dst,src); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrlen.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrlen.c new file mode 100644 index 00000000..01d5c9e4 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrlen.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wstrlen_t)(VMWSTR s); +_vm_wstrlen_t _vm_wstrlen = NULL; + +VMINT vm_wstrlen(VMWSTR s) +{ + if (NULL == _vm_wstrlen) + _vm_wstrlen = (_vm_wstrlen_t)vm_get_sym_entry("vm_wstrlen"); + + if (NULL != _vm_wstrlen) + return _vm_wstrlen(s); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrncpy.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrncpy.c new file mode 100644 index 00000000..248f8acb --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_wstrncpy.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmstdlib.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_wstrncpy_t)(VMWSTR dst, const VMWSTR src, VMINT length); +_vm_wstrncpy_t _vm_wstrncpy = NULL; + +VMINT vm_wstrncpy(VMWSTR dst, const VMWSTR src, VMINT length) +{ + if (NULL == _vm_wstrncpy) + _vm_wstrncpy = (_vm_wstrncpy_t)vm_get_sym_entry("vm_wstrncpy"); + + if (NULL != _vm_wstrncpy) + return _vm_wstrncpy(dst,src,length); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_get_error.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_get_error.c new file mode 100644 index 00000000..029bf5ca --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_get_error.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmxml.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMCHAR *(*_vm_xml_get_error_t)(void); +_vm_xml_get_error_t _vm_xml_get_error = NULL; + +VMCHAR *vm_xml_get_error(void) +{ + if (NULL == _vm_xml_get_error) + _vm_xml_get_error = (_vm_xml_get_error_t)vm_get_sym_entry("vm_xml_get_error"); + + if (NULL != _vm_xml_get_error) + return _vm_xml_get_error(); + + return (VMCHAR *)0; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_new_parser.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_new_parser.c new file mode 100644 index 00000000..926b9f9f --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_new_parser.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmxml.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_xml_new_parser_t)(VM_XML_PARSER_STRUCT *parser); +_vm_xml_new_parser_t _vm_xml_new_parser = NULL; + +VMINT vm_xml_new_parser(VM_XML_PARSER_STRUCT *parser) +{ + if (NULL == _vm_xml_new_parser) + _vm_xml_new_parser = (_vm_xml_new_parser_t)vm_get_sym_entry("vm_xml_new_parser"); + + if (NULL != _vm_xml_new_parser) + return _vm_xml_new_parser(parser); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_parse.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_parse.c new file mode 100644 index 00000000..1687b903 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_parse.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmxml.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VMINT (*_vm_xml_parse_t)(VM_XML_PARSER_STRUCT *parser, const VMCHAR *xmlsource, VMINT length); +_vm_xml_parse_t _vm_xml_parse = NULL; + +VMINT vm_xml_parse(VM_XML_PARSER_STRUCT *parser, const VMCHAR *xmlsource, VMINT length) +{ + if (NULL == _vm_xml_parse) + _vm_xml_parse = (_vm_xml_parse_t)vm_get_sym_entry("vm_xml_parse"); + + if (NULL != _vm_xml_parse) + return _vm_xml_parse(parser,xmlsource,length); + + return (VMINT )-1; +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_data_handler.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_data_handler.c new file mode 100644 index 00000000..fbb3b9f7 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_data_handler.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmxml.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_xml_set_data_handler_t)(VM_XML_PARSER_STRUCT *parser, XML_data_hdlr data_hdlr); +_vm_xml_set_data_handler_t _vm_xml_set_data_handler = NULL; + +void vm_xml_set_data_handler(VM_XML_PARSER_STRUCT *parser, XML_data_hdlr data_hdlr) +{ + if (NULL == _vm_xml_set_data_handler) + _vm_xml_set_data_handler = (_vm_xml_set_data_handler_t)vm_get_sym_entry("vm_xml_set_data_handler"); + + if (NULL != _vm_xml_set_data_handler) + _vm_xml_set_data_handler(parser,data_hdlr); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_doctype_handlers.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_doctype_handlers.c new file mode 100644 index 00000000..0d5f7abe --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_doctype_handlers.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmxml.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_xml_set_doctype_handlers_t)( VM_XML_PARSER_STRUCT *parser, XML_start_doctype_hdlr start_hdlr, XML_end_doctype_hdlr end_hdlr); +_vm_xml_set_doctype_handlers_t _vm_xml_set_doctype_handlers = NULL; + +void vm_xml_set_doctype_handlers( VM_XML_PARSER_STRUCT *parser, XML_start_doctype_hdlr start_hdlr, XML_end_doctype_hdlr end_hdlr) +{ + if (NULL == _vm_xml_set_doctype_handlers) + _vm_xml_set_doctype_handlers = (_vm_xml_set_doctype_handlers_t)vm_get_sym_entry("vm_xml_set_doctype_handlers"); + + if (NULL != _vm_xml_set_doctype_handlers) + _vm_xml_set_doctype_handlers(parser,start_hdlr,end_hdlr); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_element_handlers.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_element_handlers.c new file mode 100644 index 00000000..136e8d93 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vm_xml_set_element_handlers.c @@ -0,0 +1,19 @@ +#include "vmsys.h" +#include "vmxml.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef void (*_vm_xml_set_element_handlers_t)( VM_XML_PARSER_STRUCT *parser, XML_start_elem_hdlr start_hdlr, XML_end_elem_hdlr end_hdlr); +_vm_xml_set_element_handlers_t _vm_xml_set_element_handlers = NULL; + +void vm_xml_set_element_handlers( VM_XML_PARSER_STRUCT *parser, XML_start_elem_hdlr start_hdlr, XML_end_elem_hdlr end_hdlr) +{ + if (NULL == _vm_xml_set_element_handlers) + _vm_xml_set_element_handlers = (_vm_xml_set_element_handlers_t)vm_get_sym_entry("vm_xml_set_element_handlers"); + + if (NULL != _vm_xml_set_element_handlers) + _vm_xml_set_element_handlers(parser,start_hdlr,end_hdlr); + + +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmdcl.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmdcl.c new file mode 100644 index 00000000..64c7edcf --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmdcl.c @@ -0,0 +1,134 @@ +#include "vmsys.h" +#include "vmdcl.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + + +typedef VM_DCL_HANDLE (*_vm_dcl_open_t)(VM_DCL_DEV dev, VM_DCL_FLAGS flags); +_vm_dcl_open_t _vm_dcl_open = NULL; +VM_DCL_HANDLE vm_dcl_open(VM_DCL_DEV dev, VM_DCL_FLAGS flags) +{ + if (NULL == _vm_dcl_open) + _vm_dcl_open = (_vm_dcl_open_t)vm_get_sym_entry("vm_dcl_open"); + + if (NULL != _vm_dcl_open) + return _vm_dcl_open(dev, flags); + + return (VMINT )VM_DCL_HANDLE_INVALID; +} + +typedef VM_DCL_STATUS (*_vm_dcl_control_t)(VM_DCL_HANDLE device_handle,VM_DCL_CTRL_CMD cmd, void* arg); +_vm_dcl_control_t _vm_dcl_control = NULL; +VM_DCL_STATUS vm_dcl_control(VM_DCL_HANDLE device_handle,VM_DCL_CTRL_CMD cmd, void* arg) +{ + if (NULL == _vm_dcl_control) + _vm_dcl_control = (_vm_dcl_control_t)vm_get_sym_entry("vm_dcl_control"); + + if (NULL != _vm_dcl_control) + return _vm_dcl_control(device_handle, cmd, arg); + + return (VMINT )VM_DCL_STATUS_FAIL; +} + +typedef VM_DCL_STATUS (*_vm_dcl_close_t)(VM_DCL_HANDLE device_handle); +_vm_dcl_close_t _vm_dcl_close = NULL; +VM_DCL_STATUS vm_dcl_close(VM_DCL_HANDLE device_handle) +{ + if (NULL == _vm_dcl_close) + _vm_dcl_close = (_vm_dcl_close_t)vm_get_sym_entry("vm_dcl_close"); + + if (NULL != _vm_dcl_close) + return _vm_dcl_close(device_handle); + + return (VMINT )VM_DCL_STATUS_FAIL; +} + +typedef VM_DCL_STATUS (*_vm_dcl_registercallback_t)(VM_DCL_HANDLE device_handle,VM_DCL_EVENT event, VM_DCL_CALLBACK callback,void* user_data); +_vm_dcl_registercallback_t _vm_dcl_registercallback = NULL; +VM_DCL_STATUS vm_dcl_registercallback(VM_DCL_HANDLE device_handle,VM_DCL_EVENT event, VM_DCL_CALLBACK callback,void* user_data) +{ + if (NULL == _vm_dcl_registercallback) + _vm_dcl_registercallback = (_vm_dcl_registercallback_t)vm_get_sym_entry("vm_dcl_registercallback"); + + if (NULL != _vm_dcl_registercallback) + return _vm_dcl_registercallback(device_handle,event, callback, user_data); + + return (VMINT )VM_DCL_STATUS_FAIL; +} + +typedef VM_DCL_STATUS (*_vm_dcl_addlistenevent_t)(VM_DCL_HANDLE device_handle,VM_DCL_EVENT event, void* user_data); +_vm_dcl_addlistenevent_t _vm_dcl_addlistenevent = NULL; +VM_DCL_STATUS vm_dcl_addlistenevent(VM_DCL_HANDLE device_handle,VM_DCL_EVENT event, void* user_data) +{ + if (NULL == _vm_dcl_addlistenevent) + _vm_dcl_addlistenevent = (_vm_dcl_addlistenevent_t)vm_get_sym_entry("vm_dcl_addlistenevent"); + + if (NULL != _vm_dcl_addlistenevent) + return _vm_dcl_addlistenevent(device_handle,event, user_data); + + return (VMINT )VM_DCL_STATUS_FAIL; +} + +typedef VM_DCL_STATUS (*_vm_dcl_read_t)(VM_DCL_HANDLE device_handle, VM_DCL_BUFF* buf, VM_DCL_BUFF_LEN buf_len, VM_DCL_BUFF_LEN* returned_len,VM_DCL_OPTIONS options); +_vm_dcl_read_t _vm_dcl_read = NULL; +VM_DCL_STATUS vm_dcl_read(VM_DCL_HANDLE device_handle, VM_DCL_BUFF* buf, VM_DCL_BUFF_LEN buf_len, VM_DCL_BUFF_LEN* returned_len,VM_DCL_OPTIONS options) +{ + if (NULL == _vm_dcl_read) + _vm_dcl_read = (_vm_dcl_read_t)vm_get_sym_entry("vm_dcl_read"); + + if (NULL != _vm_dcl_read) + return _vm_dcl_read(device_handle, buf, buf_len, returned_len, options); + + return (VMINT )VM_DCL_STATUS_FAIL; +} + +typedef VM_DCL_STATUS (*_vm_dcl_write_t)(VM_DCL_HANDLE device_handle,VM_DCL_BUFF* buf, VM_DCL_BUFF_LEN buf_len, VM_DCL_BUFF_LEN* writed_len,VM_DCL_OPTIONS options); +_vm_dcl_write_t _vm_dcl_write = NULL; +VM_DCL_STATUS vm_dcl_write(VM_DCL_HANDLE device_handle,VM_DCL_BUFF* buf, VM_DCL_BUFF_LEN buf_len, VM_DCL_BUFF_LEN* writed_len,VM_DCL_OPTIONS options) +{ + if (NULL == _vm_dcl_write) + _vm_dcl_write = (_vm_dcl_write_t)vm_get_sym_entry("vm_dcl_write"); + + if (NULL != _vm_dcl_write) + return _vm_dcl_write(device_handle,buf, buf_len, writed_len, options); + + return (VMINT )VM_DCL_STATUS_FAIL; +} + +typedef VM_DCL_MODULE_TYPE_T (*_vm_dcl_get_ownerid_t)(); +_vm_dcl_get_ownerid_t _vm_dcl_get_ownerid = NULL; +VM_DCL_MODULE_TYPE_T vm_dcl_get_ownerid() +{ + if (NULL == _vm_dcl_get_ownerid) + _vm_dcl_get_ownerid = (_vm_dcl_get_ownerid_t)vm_get_sym_entry("vm_dcl_get_ownerid"); + + if (NULL != _vm_dcl_get_ownerid) + return _vm_dcl_get_ownerid(); + + return 0; +} + +typedef VMUINT32 (*_vm_irq_mask_t)(); +_vm_irq_mask_t _vm_irq_mask = NULL; +VMUINT32 vm_irq_mask() +{ + if (NULL == _vm_irq_mask) + _vm_irq_mask = (_vm_irq_mask_t)vm_get_sym_entry("vm_irq_mask"); + + if (NULL != _vm_irq_mask) + return _vm_irq_mask(); + + return 0; +} + +typedef void (*_vm_irq_restore_t)(); +_vm_irq_restore_t _vm_irq_restore = NULL; +void vm_irq_restore(VMUINT32 mask) +{ + if (NULL == _vm_irq_restore) + _vm_irq_restore = (_vm_irq_restore_t)vm_get_sym_entry("vm_irq_restore"); + + if (NULL != _vm_irq_restore) + _vm_irq_restore(mask); +} diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmlog.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmlog.c new file mode 100644 index 00000000..b90f8937 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmlog.c @@ -0,0 +1,115 @@ + +#include "vmlog.h" +#include "vmio.h" +#include "vmsys.h" +#include "vmchset.h" + +#include "vmstdlib.h" + +#define MAX_APP_NAME_LEN (260) + +static char * _cache_file_ = NULL; +static int _lineNo = 0; +static char g_log_buffer[MAX_APP_NAME_LEN]; + +static void log_it(VMINT level, char* fmt, va_list ap); + + +int _vm_log_module(const char* __file__, const int __line__) +{ + _lineNo = __line__; + _cache_file_ = (char*)__file__; + return 1; +} + +void vm_log_init(char* filename, int log_level) +{ + return ; +} + +void _vm_log_debug(char* fmt, ...) { + va_list ap; + + va_start(ap, fmt); + log_it(VM_DEBUG_LEVEL, fmt, ap); + va_end(ap); +} + +void _vm_log_info(char* fmt, ...) { + va_list ap; + + va_start(ap, fmt); + log_it(VM_INFO_LEVEL, fmt, ap); + va_end(ap); +} + +void _vm_log_warn(char* fmt, ...) { + va_list ap; + + va_start(ap, fmt); + log_it(VM_WARN_LEVEL, fmt, ap); + va_end(ap); +} + +void _vm_log_error(char* fmt, ...) { + va_list ap; + + va_start(ap, fmt); + log_it(VM_ERROR_LEVEL, fmt, ap); + va_end(ap); +} + +void _vm_log_fatal(char* fmt, ...) { + va_list ap; + + va_start(ap, fmt); + log_it(VM_FATAL_LEVEL, fmt, ap); + va_end(ap); +} + +void log_it(VMINT level, char* fmt, va_list ap) { + vm_time_t tm; + int len; + int i = 0; + char text[MAX_APP_NAME_LEN]; + + memset(text, 0x00, sizeof(text)); + + vm_get_time(&tm); + + len = strlen(_cache_file_); + + while (len>0) + { + if (_cache_file_[len-1] != '\\' && _cache_file_[len-1] != '/') + { + len--; + } + else + { + break; + } + } + + strncpy(g_log_buffer, (char*)&_cache_file_[len], 10); + + sprintf(text, "%d-%02.2d-%02.2d %02.2d:%02.2d:%02.2d\t%d\t%s:%d\t", tm.year, tm.mon, tm.day, tm.hour, + tm.min, tm.sec, level, g_log_buffer ,_lineNo); + + vsprintf(text + strlen(text), fmt, ap); + strcat(text, "\r\n"); + vm_app_log(text); +} + +void vm_log_close(void) +{ + return ; +} + +void vm_set_log_level(int log_level) +{ + return; +} + + + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmthread.c b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmthread.c new file mode 100644 index 00000000..8906c845 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/libmtk/vmthread.c @@ -0,0 +1,134 @@ +#include "vmsys.h" +#include "vmthread.h" + +typedef VMINT (*vm_get_sym_entry_t)(char* symbol); +extern vm_get_sym_entry_t vm_get_sym_entry; + +typedef VM_SIGNAL_ID (*_vm_signal_init_t)(void); +_vm_signal_init_t _vm_signal_init = NULL; +VM_SIGNAL_ID vm_signal_init(void) +{ + if (NULL == _vm_signal_init) + _vm_signal_init = (_vm_signal_init_t)vm_get_sym_entry("vm_signal_init"); + + if (NULL != _vm_signal_init) + return _vm_signal_init(); + + return 0; +} + +typedef void (*_vm_signal_clean_t)(VM_SIGNAL_ID s_id); +_vm_signal_clean_t _vm_signal_clean = NULL; +void vm_signal_clean(VM_SIGNAL_ID s_id) +{ + if (NULL == _vm_signal_clean) + _vm_signal_clean = (_vm_signal_clean_t)vm_get_sym_entry("vm_signal_clean"); + + if (NULL != _vm_signal_clean) + _vm_signal_clean(s_id); +} + +typedef void (*_vm_signal_post_t)(VM_SIGNAL_ID s_id); +_vm_signal_post_t _vm_signal_post = NULL; +void vm_signal_post(VM_SIGNAL_ID s_id) +{ + if (NULL == _vm_signal_post) + _vm_signal_post = (_vm_signal_post_t)vm_get_sym_entry("vm_signal_post"); + + if (NULL != _vm_signal_post) + _vm_signal_post(s_id); +} + +typedef VMINT32 (*_vm_signal_wait_t)(VM_SIGNAL_ID s_id); +_vm_signal_wait_t _vm_signal_wait = NULL; +VMINT32 vm_signal_wait(VM_SIGNAL_ID s_id) +{ + if (NULL == _vm_signal_wait) + _vm_signal_wait = (_vm_signal_wait_t)vm_get_sym_entry("vm_signal_wait"); + + if (NULL != _vm_signal_wait) + return _vm_signal_wait(s_id); + + return (VMINT )-1; +} + +typedef VMINT32 (*_vm_signal_timedwait_t)(VM_SIGNAL_ID s_id, VMUINT32 time_count); +_vm_signal_timedwait_t _vm_signal_timedwait = NULL; +VMINT32 vm_signal_timedwait(VM_SIGNAL_ID s_id, VMUINT32 time_count) +{ + if (NULL == _vm_signal_timedwait) + _vm_signal_timedwait = (_vm_signal_timedwait_t)vm_get_sym_entry("vm_signal_timedwait"); + + if (NULL != _vm_signal_timedwait) + return _vm_signal_timedwait(s_id, time_count); + + return (VMINT )0; +} + +typedef void (*_vm_signal_deinit_t)(VM_SIGNAL_ID s_id); +_vm_signal_deinit_t _vm_signal_deinit = NULL; +void vm_signal_deinit(VM_SIGNAL_ID s_id) +{ + if (NULL == _vm_signal_deinit) + _vm_signal_deinit = (_vm_signal_deinit_t)vm_get_sym_entry("vm_signal_deinit"); + + if (NULL != _vm_signal_deinit) + _vm_signal_deinit(s_id); +} + + +typedef void (*_vm_mutex_create_t)(vm_thread_mutex_struct *mutex); +_vm_mutex_create_t _vm_mutex_create = NULL; +void vm_mutex_create(vm_thread_mutex_struct *mutex) +{ + if (NULL == _vm_mutex_create) + _vm_mutex_create = (_vm_mutex_create_t)vm_get_sym_entry("vm_mutex_create"); + + if (NULL != _vm_mutex_create) + _vm_mutex_create(mutex); +} + +typedef void (*_vm_mutex_lock_t)(vm_thread_mutex_struct *mutex); +_vm_mutex_lock_t _vm_mutex_lock = NULL; +void vm_mutex_lock(vm_thread_mutex_struct *mutex) +{ + if (NULL == _vm_mutex_lock) + _vm_mutex_lock = (_vm_mutex_lock_t)vm_get_sym_entry("vm_mutex_lock"); + + if (NULL != _vm_mutex_lock) + _vm_mutex_lock(mutex); +} + +typedef void (*_vm_mutex_unlock_t)(vm_thread_mutex_struct *mutex); +_vm_mutex_unlock_t _vm_mutex_unlock = NULL; +void vm_mutex_unlock(vm_thread_mutex_struct *mutex) +{ + if (NULL == _vm_mutex_unlock) + _vm_mutex_unlock = (_vm_mutex_unlock_t)vm_get_sym_entry("vm_mutex_unlock"); + + if (NULL != _vm_mutex_unlock) + _vm_mutex_unlock(mutex); +} + +typedef void (*_vm_thread_sleep_t)(VMUINT32 timeout); +_vm_thread_sleep_t _vm_thread_sleep = NULL; +void vm_thread_sleep(VMUINT32 timeout) +{ + if (NULL == _vm_thread_sleep) + _vm_thread_sleep = (_vm_thread_sleep_t)vm_get_sym_entry("vm_thread_sleep"); + + if (NULL != _vm_thread_sleep) + _vm_thread_sleep(timeout); +} + +typedef void (*_vm_thread_change_priority_t)(VM_THREAD_HANDLE thread_handle, VMUINT32 new_priority); +_vm_thread_change_priority_t _vm_thread_change_priority = NULL; +void vm_thread_change_priority(VM_THREAD_HANDLE thread_handle, VMUINT32 new_priority) +{ + if (NULL == _vm_thread_change_priority) + _vm_thread_change_priority = (_vm_thread_change_priority_t)vm_get_sym_entry("vm_thread_change_priority"); + + if (NULL != _vm_thread_change_priority) + _vm_thread_change_priority(thread_handle, new_priority); +} + diff --git a/hardware/arduino/mtk/system/libmtk/source/modules/makefile b/hardware/arduino/mtk/system/libmtk/source/modules/makefile new file mode 100644 index 00000000..03133dd5 --- /dev/null +++ b/hardware/arduino/mtk/system/libmtk/source/modules/makefile @@ -0,0 +1,29 @@ + +STUB_INC = -I "../../../../system/libmtk/include" +OUTDIR = ../../debug + +STUB_SOURCES_PATH = ./$(MODULE) +STUB_SOURCES = $(patsubst $(STUB_SOURCES_PATH)/%, %,$(wildcard $(STUB_SOURCES_PATH)/*.c)) +STUB_OBJS = $(patsubst %.c, $(OUTDIR)/%.o, $(STUB_SOURCES)) + +INC_PATH_LIST = $(patsubst "%",%,$(filter "%",$(STUB_INC))) +STUB_HEADER_LIST = $(filter-out %enum_list.h,$(foreach list, $(INC_PATH_LIST), $(wildcard $(list)/*.h))) + +ifeq ($(strip $(COMPILER)), GCC) +CC=arm-none-eabi-gcc.exe +AR=arm-none-eabi-ar.exe +STUBCFLAG=-c -fpic -fvisibility=hidden -mthumb -mcpu=arm7tdmi-s -mlittle-endian -O2 -D__MRE_COMPILER_GCC__ -fno-exceptions -fno-non-call-exceptions +STUBARFLAG=cr +endif + +INC=$(STUB_INC) +OBJECTS=$(STUB_OBJS) +VPATH=$(STUB_SOURCES_PATH) + +$(OUTDIR)/%.o: %.c $(STUB_HEADER_LIST) + @echo Compiling $< & + @$(CC) $(STUBCFLAG) $(INC) $< -o $@ + +$(MODULE).a: $(OBJECTS) + @echo Linking $@ & + @$(AR) $(STUBARFLAG)$(OUTDIR)/$(MODULE).a $(OBJECTS) diff --git a/hardware/arduino/mtk/variants/arduino_due_x/linker_scripts/gcc/scat.ld b/hardware/arduino/mtk/variants/arduino_due_x/linker_scripts/gcc/scat.ld new file mode 100644 index 00000000..56e73f6c --- /dev/null +++ b/hardware/arduino/mtk/variants/arduino_due_x/linker_scripts/gcc/scat.ld @@ -0,0 +1,134 @@ + +/* Script for --shared -z combreloc: shared library, combine & sort relocs */ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(gcc_entry) + +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + . = SEGMENT_START("text-segment", 0) + SIZEOF_HEADERS; + .hash : { *(.hash) } + .gnu.hash : { *(.gnu.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .rel.dyn : + { + *(.rel.init) + *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) + *(.rel.fini) + *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) + *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) + *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) + *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) + *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) + *(.rel.ctors) + *(.rel.dtors) + *(.rel.got) + *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) + *(.rel.iplt) + } + .rela.dyn : + { + *(.rela.init) + *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) + *(.rela.fini) + *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) + *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) + *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) + *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) + *(.rela.ctors) + *(.rela.dtors) + *(.rela.got) + *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) + *(.rela.iplt) + } + .rel.plt : + { + *(.rel.plt) + } + .rela.plt : + { + *(.rela.plt) + } + .init : + { + KEEP (*(.init)) + } =0 + .plt : { *(.plt) } + .iplt : { *(.iplt) } + .text : + { + *(.text.unlikely .text.*_unlikely) + *(.text .stub .text.* .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx) + } =0 + .fini : + { + KEEP (*(.fini)) + } =0 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } + PROVIDE_HIDDEN (__exidx_end = .); + .init_array : + { + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + } + .fini_array : + { + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + } + .jcr : { KEEP (*(.jcr)) } + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } + .dynamic : { *(.dynamic) } + .got : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) } + .data : + { + __data_start = . ; + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + _edata = .; PROVIDE (edata = .); + __bss_start = .; + __bss_start__ = .; + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we don't + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + } + _bss_end__ = . ; __bss_end__ = . ; + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + __end__ = . ; + _end = .; PROVIDE (end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) } + .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } +} diff --git a/hardware/arduino/mtk/variants/arduino_due_x/pins_arduino.h b/hardware/arduino/mtk/variants/arduino_due_x/pins_arduino.h new file mode 100644 index 00000000..4e279aa7 --- /dev/null +++ b/hardware/arduino/mtk/variants/arduino_due_x/pins_arduino.h @@ -0,0 +1,21 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +// API compatibility +#include "variant.h" + diff --git a/hardware/arduino/mtk/variants/arduino_due_x/variant.cpp b/hardware/arduino/mtk/variants/arduino_due_x/variant.cpp new file mode 100644 index 00000000..89d28c15 --- /dev/null +++ b/hardware/arduino/mtk/variants/arduino_due_x/variant.cpp @@ -0,0 +1,313 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Pins descriptions + */ +PinDescription g_APinDescription[]= +{ + { VM_DCL_HANDLE_INVALID, 10, PIO_END, 0 }, + { VM_DCL_HANDLE_INVALID, 11, PIO_END, 0 }, + { VM_DCL_HANDLE_INVALID, 46, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 13, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 47, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 49, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 45, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 50, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 48, PIO_END, 0 }, + { VM_DCL_HANDLE_INVALID, 19, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 26, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 28, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 29, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 27, PIO_END, 1 }, + { VM_DCL_HANDLE_INVALID, 0, PIO_END, 0 }, + { VM_DCL_HANDLE_INVALID, 1, PIO_END, 0 }, + { VM_DCL_HANDLE_INVALID, 2, PIO_END, 0 }, + { VM_DCL_HANDLE_INVALID, 3, PIO_END, 0 }, + { VM_DCL_HANDLE_INVALID, 44, PIO_END, 0 }, + { VM_DCL_HANDLE_INVALID, 43, PIO_END, 0 } +} ; + +#ifdef __cplusplus +} +#endif + +boolean changePinType(uint32_t ulPin, uint32_t ulPinType, VM_DCL_HANDLE* handle) +{ + VM_DCL_HANDLE gpio_handle; + + if (ulPin > PIO_MAX_NUM) + { + return false; + } + + + + if(g_APinDescription[ulPin].ulPinType == ulPinType && g_APinDescription[ulPin].ulHandle != VM_DCL_HANDLE_INVALID) + { + *handle = g_APinDescription[ulPin].ulHandle; + return true; + } + + *handle = VM_DCL_HANDLE_INVALID; + + if(ulPinType == PIO_DIGITAL) + { + if(g_APinDescription[ulPin].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[ulPin].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[ulPin].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_0,NULL); + vm_dcl_close(gpio_handle); + } + else if(ulPinType == PIO_ANALOG) + { + if(g_APinDescription[ulPin].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[ulPin].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[ulPin].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_2,NULL); + vm_dcl_close(gpio_handle); + } + else if(ulPinType == PIO_EINT) + { + if(g_APinDescription[ulPin].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[ulPin].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[ulPin].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_2,NULL); + vm_dcl_close(gpio_handle); + } + else if(ulPinType == PIO_PWM) + { + if(g_APinDescription[ulPin].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[ulPin].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[ulPin].ulGpioId); + + if(ulPin == 3) + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_3,NULL); + else + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_2,NULL); + + vm_dcl_close(gpio_handle); + } + else if(ulPinType == PIO_SPI) + { + for(int i = 10; i<14; i++) + { + if(g_APinDescription[i].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[i].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[i].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_4,NULL); + vm_dcl_close(gpio_handle); + g_APinDescription[i].ulHandle = VM_DCL_HANDLE_INVALID; + + } + } + else if(ulPinType == PIO_UART) + { + for(int i = 0; i<2; i++) + { + if(g_APinDescription[i].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[i].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[i].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_1,NULL); + vm_dcl_close(gpio_handle); + g_APinDescription[i].ulHandle = VM_DCL_HANDLE_INVALID; + + } + } + else if(ulPinType == PIO_I2C) + { + for(int i = 18; i<20; i++) + { + if(g_APinDescription[i].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[i].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[i].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_1,NULL); + vm_dcl_close(gpio_handle); + g_APinDescription[i].ulHandle = VM_DCL_HANDLE_INVALID; + + } + } + else + { + return false; + } + + g_APinDescription[ulPin].ulPinType = (EPioType)ulPinType; + + return true; +} + +void spiPinsRest(void) +{ + int i; + VM_DCL_HANDLE gpio_handle; + + for(int i = 10; i<14; i++) + { + gpio_handle = vm_dcl_open(VM_DCL_GPIO, g_APinDescription[i].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_0,NULL); + vm_dcl_close(gpio_handle); + g_APinDescription[i].ulHandle = VM_DCL_HANDLE_INVALID; + g_APinDescription[i].ulPinType = PIO_DIGITAL; + } +} + +void setPinHandle(uint32_t ulPin, VM_DCL_HANDLE handle) +{ + g_APinDescription[ulPin].ulHandle = handle; +} + +/* + * UART objects + */ +RingBuffer rx_buffer1; +RingBuffer rx_buffer2; + +UARTClass Serial(1, &rx_buffer1); +UARTClass Serial1(2, &rx_buffer2); + +void serialEvent() __attribute__((weak)); +void serialEventRun(void) +{ + if (Serial.available()) + { + if(serialEvent) + { + serialEvent(); + } + } + if (Serial1.available()) + { + if(serialEvent) + { + serialEvent(); + } + } +} + +#ifdef __cplusplus +extern "C" { +#endif + +void init( void ) +{ +#if 0 + SystemInit(); + + // Set Systick to 1ms interval, common to all SAM3 variants + if (SysTick_Config(SystemCoreClock / 1000)) + { + // Capture error + while (true); + } + + // Disable watchdog + WDT_Disable(WDT); + + // Disable pull-up on every pin + for (int i = 0; i < PINS_COUNT; i++) + digitalWrite(i, LOW); + + // Enable parallel access on PIO output data registers + PIOA->PIO_OWER = 0xFFFFFFFF; + PIOB->PIO_OWER = 0xFFFFFFFF; + PIOC->PIO_OWER = 0xFFFFFFFF; + PIOD->PIO_OWER = 0xFFFFFFFF; + + // Initialize Serial port U(S)ART pins + PIO_Configure( + g_APinDescription[PINS_UART].pPort, + g_APinDescription[PINS_UART].ulPinType, + g_APinDescription[PINS_UART].ulPin, + g_APinDescription[PINS_UART].ulPinConfiguration); + digitalWrite(0, HIGH); // Enable pullup for RX0 + PIO_Configure( + g_APinDescription[PINS_USART0].pPort, + g_APinDescription[PINS_USART0].ulPinType, + g_APinDescription[PINS_USART0].ulPin, + g_APinDescription[PINS_USART0].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_USART1].pPort, + g_APinDescription[PINS_USART1].ulPinType, + g_APinDescription[PINS_USART1].ulPin, + g_APinDescription[PINS_USART1].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_USART3].pPort, + g_APinDescription[PINS_USART3].ulPinType, + g_APinDescription[PINS_USART3].ulPin, + g_APinDescription[PINS_USART3].ulPinConfiguration); + + // Initialize USB pins + PIO_Configure( + g_APinDescription[PINS_USB].pPort, + g_APinDescription[PINS_USB].ulPinType, + g_APinDescription[PINS_USB].ulPin, + g_APinDescription[PINS_USB].ulPinConfiguration); + + // Initialize CAN pins + PIO_Configure( + g_APinDescription[PINS_CAN0].pPort, + g_APinDescription[PINS_CAN0].ulPinType, + g_APinDescription[PINS_CAN0].ulPin, + g_APinDescription[PINS_CAN0].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_CAN1].pPort, + g_APinDescription[PINS_CAN1].ulPinType, + g_APinDescription[PINS_CAN1].ulPin, + g_APinDescription[PINS_CAN1].ulPinConfiguration); + + // Initialize Analog Controller + pmc_enable_periph_clk(ID_ADC); + adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST); + adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1); + adc_configure_trigger(ADC, ADC_TRIG_SW, 0); // Disable hardware trigger. + adc_disable_interrupt(ADC, 0xFFFFFFFF); // Disable all ADC interrupts. + adc_disable_all_channel(ADC); + + // Initialize analogOutput module + analogOutputInit(); +#endif +} + +#ifdef __cplusplus +} +#endif + diff --git a/hardware/arduino/mtk/variants/arduino_due_x/variant.h b/hardware/arduino/mtk/variants/arduino_due_x/variant.h new file mode 100644 index 00000000..6f5fba30 --- /dev/null +++ b/hardware/arduino/mtk/variants/arduino_due_x/variant.h @@ -0,0 +1,99 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ARDUINO_DUE_X_ +#define _VARIANT_ARDUINO_DUE_X_ + +/*---------------------------------------------------------------------------- + * Definitions + *----------------------------------------------------------------------------*/ + +/** Frequency of the board main oscillator */ +#define VARIANT_MAINOSC 12000000 + +/** Master clock frequency */ +#define VARIANT_MCK 84000000 + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "Arduino.h" +#ifdef __cplusplus +#include "UARTClass.h" +#endif + + +static const uint8_t A0 = 14;/*analog input pin A0*/ +static const uint8_t A1 = 15;/*analog input pin A1*/ +static const uint8_t A2 = 16;/*analog input pin A2*/ +static const uint8_t A3 = 17;/*analog input pin A3*/ + +#ifdef __cplusplus +extern UARTClass Serial; +extern UARTClass Serial1; +#endif + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 1 + +#define SPI_INTERFACE SPI0 +#define SPI_INTERFACE_ID ID_SPI0 +#define SPI_CHANNELS_NUM 4 +#define PIN_SPI_SS0 (10) +#define PIN_SPI_SS1 (10) +#define PIN_SPI_SS2 (10) +#define PIN_SPI_SS3 (10) +#define PIN_SPI_MOSI (11) +#define PIN_SPI_MISO (12) +#define PIN_SPI_SCK (13) +#define BOARD_SPI_SS0 (10) +#define BOARD_SPI_SS1 (10) +#define BOARD_SPI_SS2 (10) +#define BOARD_SPI_SS3 PIN_SPI_SS3 +#define BOARD_SPI_DEFAULT_SS BOARD_SPI_SS3 + +#define BOARD_PIN_TO_SPI_PIN(x) \ + (x==BOARD_SPI_SS0 ? PIN_SPI_SS0 : \ + (x==BOARD_SPI_SS1 ? PIN_SPI_SS1 : \ + (x==BOARD_SPI_SS2 ? PIN_SPI_SS2 : PIN_SPI_SS3 ))) +#define BOARD_PIN_TO_SPI_CHANNEL(x) \ + (x==BOARD_SPI_SS0 ? 0 : \ + (x==BOARD_SPI_SS1 ? 1 : \ + (x==BOARD_SPI_SS2 ? 2 : 3))) + +static const uint8_t SS = BOARD_SPI_SS0; +static const uint8_t SS1 = BOARD_SPI_SS1; +static const uint8_t SS2 = BOARD_SPI_SS2; +static const uint8_t SS3 = BOARD_SPI_SS3; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + + +#endif /* _VARIANT_ARDUINO_DUE_X_ */ + diff --git a/hardware/arduino/mtk/variants/linkit_one/libmtk.a b/hardware/arduino/mtk/variants/linkit_one/libmtk.a new file mode 100644 index 0000000000000000000000000000000000000000..4b3feb1efee82d4ae14da2b78d512187c4adf70a GIT binary patch literal 975864 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

bq;^`+$Y& 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 #*)E3Rq;=T)?kyN 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 PIO_MAX_NUM) + { + return false; + } + + + + if(g_APinDescription[ulPin].ulPinType == ulPinType && g_APinDescription[ulPin].ulHandle != VM_DCL_HANDLE_INVALID) + { + *handle = g_APinDescription[ulPin].ulHandle; + return true; + } + + *handle = VM_DCL_HANDLE_INVALID; + + if(ulPinType == PIO_DIGITAL) + { + if(g_APinDescription[ulPin].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[ulPin].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[ulPin].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_0,NULL); + vm_dcl_close(gpio_handle); + } + else if(ulPinType == PIO_ANALOG) + { + if(g_APinDescription[ulPin].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[ulPin].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[ulPin].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_2,NULL); + vm_dcl_close(gpio_handle); + } + else if(ulPinType == PIO_EINT) + { + if(g_APinDescription[ulPin].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[ulPin].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[ulPin].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_2,NULL); + vm_dcl_close(gpio_handle); + } + else if(ulPinType == PIO_PWM) + { + if(g_APinDescription[ulPin].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[ulPin].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[ulPin].ulGpioId); + + if(ulPin == 3) + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_3,NULL); + else + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_2,NULL); + + vm_dcl_close(gpio_handle); + } + else if(ulPinType == PIO_SPI) + { + for(int i = 11; i<14; i++) + { + if(g_APinDescription[i].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[i].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[i].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_4,NULL); + vm_dcl_close(gpio_handle); + g_APinDescription[i].ulHandle = VM_DCL_HANDLE_INVALID; + + } + } + else if(ulPinType == PIO_UART) + { + for(int i = 0; i<2; i++) + { + if(g_APinDescription[i].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[i].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[i].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_1,NULL); + vm_dcl_close(gpio_handle); + g_APinDescription[i].ulHandle = VM_DCL_HANDLE_INVALID; + + } + } + else if(ulPinType == PIO_I2C) + { + for(int i = 18; i<20; i++) + { + if(g_APinDescription[i].ulHandle != VM_DCL_HANDLE_INVALID) + { + vm_dcl_close(g_APinDescription[i].ulHandle); + } + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[i].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_1,NULL); + vm_dcl_close(gpio_handle); + g_APinDescription[i].ulHandle = VM_DCL_HANDLE_INVALID; + + } + } + else + { + return false; + } + + g_APinDescription[ulPin].ulPinType = (EPioType)ulPinType; + + return true; +} + +void spiPinsRest(void) +{ + int i; + VM_DCL_HANDLE gpio_handle; + + for(int i = 11; i<14; i++) + { + gpio_handle = vm_dcl_open(VM_DCL_GPIO, g_APinDescription[i].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_0,NULL); + vm_dcl_close(gpio_handle); + g_APinDescription[i].ulHandle = VM_DCL_HANDLE_INVALID; + g_APinDescription[i].ulPinType = PIO_DIGITAL; + } +} + +void setPinHandle(uint32_t ulPin, VM_DCL_HANDLE handle) +{ + g_APinDescription[ulPin].ulHandle = handle; +} + +/* + * UART objects + */ +RingBuffer rx_buffer1; +RingBuffer rx_buffer2; + +UARTClass Serial(1, &rx_buffer1); +UARTClass Serial1(2, &rx_buffer2); + +void serialEvent() __attribute__((weak)); +void serialEvent1() __attribute__((weak)); +void serialEventRun(void) +{ + if (Serial.available()) + { + if(serialEvent) + { + serialEvent(); + } + } + if (Serial1.available()) + { + if(serialEvent1) + { + serialEvent1(); + } + } +} + +#ifdef __cplusplus +extern "C" { +#endif + +void init( void ) +{ + int i; + VM_DCL_HANDLE gpio_handle; + + for(i=2;i<14;i++) + { + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[i].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_0,NULL); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_DIR_OUT, NULL); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_WRITE_LOW, NULL); + vm_dcl_close(gpio_handle); + } + for(i=18;i<20;i++) + { + gpio_handle = vm_dcl_open(VM_DCL_GPIO,g_APinDescription[i].ulGpioId); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_MODE_0,NULL); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_SET_DIR_OUT, NULL); + vm_dcl_control(gpio_handle,VM_GPIO_CMD_WRITE_LOW, NULL); + vm_dcl_close(gpio_handle); + } +#if 0 + SystemInit(); + + // Set Systick to 1ms interval, common to all SAM3 variants + if (SysTick_Config(SystemCoreClock / 1000)) + { + // Capture error + while (true); + } + + // Disable watchdog + WDT_Disable(WDT); + + // Disable pull-up on every pin + for (int i = 0; i < PINS_COUNT; i++) + digitalWrite(i, LOW); + + // Enable parallel access on PIO output data registers + PIOA->PIO_OWER = 0xFFFFFFFF; + PIOB->PIO_OWER = 0xFFFFFFFF; + PIOC->PIO_OWER = 0xFFFFFFFF; + PIOD->PIO_OWER = 0xFFFFFFFF; + + // Initialize Serial port U(S)ART pins + PIO_Configure( + g_APinDescription[PINS_UART].pPort, + g_APinDescription[PINS_UART].ulPinType, + g_APinDescription[PINS_UART].ulPin, + g_APinDescription[PINS_UART].ulPinConfiguration); + digitalWrite(0, HIGH); // Enable pullup for RX0 + PIO_Configure( + g_APinDescription[PINS_USART0].pPort, + g_APinDescription[PINS_USART0].ulPinType, + g_APinDescription[PINS_USART0].ulPin, + g_APinDescription[PINS_USART0].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_USART1].pPort, + g_APinDescription[PINS_USART1].ulPinType, + g_APinDescription[PINS_USART1].ulPin, + g_APinDescription[PINS_USART1].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_USART3].pPort, + g_APinDescription[PINS_USART3].ulPinType, + g_APinDescription[PINS_USART3].ulPin, + g_APinDescription[PINS_USART3].ulPinConfiguration); + + // Initialize USB pins + PIO_Configure( + g_APinDescription[PINS_USB].pPort, + g_APinDescription[PINS_USB].ulPinType, + g_APinDescription[PINS_USB].ulPin, + g_APinDescription[PINS_USB].ulPinConfiguration); + + // Initialize CAN pins + PIO_Configure( + g_APinDescription[PINS_CAN0].pPort, + g_APinDescription[PINS_CAN0].ulPinType, + g_APinDescription[PINS_CAN0].ulPin, + g_APinDescription[PINS_CAN0].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_CAN1].pPort, + g_APinDescription[PINS_CAN1].ulPinType, + g_APinDescription[PINS_CAN1].ulPin, + g_APinDescription[PINS_CAN1].ulPinConfiguration); + + // Initialize Analog Controller + pmc_enable_periph_clk(ID_ADC); + adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST); + adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1); + adc_configure_trigger(ADC, ADC_TRIG_SW, 0); // Disable hardware trigger. + adc_disable_interrupt(ADC, 0xFFFFFFFF); // Disable all ADC interrupts. + adc_disable_all_channel(ADC); + + // Initialize analogOutput module + analogOutputInit(); +#endif +} + +#ifdef __cplusplus +} +#endif + diff --git a/hardware/arduino/mtk/variants/linkit_one/variant.h b/hardware/arduino/mtk/variants/linkit_one/variant.h new file mode 100644 index 00000000..e01dd821 --- /dev/null +++ b/hardware/arduino/mtk/variants/linkit_one/variant.h @@ -0,0 +1,104 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ARDUINO_DUE_X_ +#define _VARIANT_ARDUINO_DUE_X_ + +/*---------------------------------------------------------------------------- + * Definitions + *----------------------------------------------------------------------------*/ + +/** Frequency of the board main oscillator */ +#define VARIANT_MAINOSC 12000000 + +/** Master clock frequency */ +#define VARIANT_MCK 84000000 + +//#define __LINKIT_V1__ + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "Arduino.h" +#ifdef __cplusplus +#include "UARTClass.h" +#endif + + +static const uint8_t A0 = 14;/*analog input pin A0*/ +static const uint8_t A1 = 15;/*analog input pin A1*/ +static const uint8_t A2 = 16;/*analog input pin A2*/ + +#ifdef __LINKIT_V1__ +static const uint8_t A3 = 17;/*analog input pin A3*/ +#endif + +#ifdef __cplusplus +extern UARTClass Serial; +extern UARTClass Serial1; +#endif + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 1 + +#define SPI_INTERFACE SPI0 +#define SPI_INTERFACE_ID ID_SPI0 +#define SPI_CHANNELS_NUM 4 +#define PIN_SPI_SS0 (10) +#define PIN_SPI_SS1 (10) +#define PIN_SPI_SS2 (10) +#define PIN_SPI_SS3 (10) +#define PIN_SPI_MOSI (11) +#define PIN_SPI_MISO (12) +#define PIN_SPI_SCK (13) +#define BOARD_SPI_SS0 (10) +#define BOARD_SPI_SS1 (10) +#define BOARD_SPI_SS2 (10) +#define BOARD_SPI_SS3 PIN_SPI_SS3 +#define BOARD_SPI_DEFAULT_SS BOARD_SPI_SS3 + +#define BOARD_PIN_TO_SPI_PIN(x) \ + (x==BOARD_SPI_SS0 ? PIN_SPI_SS0 : \ + (x==BOARD_SPI_SS1 ? PIN_SPI_SS1 : \ + (x==BOARD_SPI_SS2 ? PIN_SPI_SS2 : PIN_SPI_SS3 ))) +#define BOARD_PIN_TO_SPI_CHANNEL(x) \ + (x==BOARD_SPI_SS0 ? 0 : \ + (x==BOARD_SPI_SS1 ? 1 : \ + (x==BOARD_SPI_SS2 ? 2 : 3))) + +static const uint8_t SS = BOARD_SPI_SS0; +static const uint8_t SS1 = BOARD_SPI_SS1; +static const uint8_t SS2 = BOARD_SPI_SS2; +static const uint8_t SS3 = BOARD_SPI_SS3; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + + +#endif /* _VARIANT_ARDUINO_DUE_X_ */ + diff --git a/hardware/tools/mtk/FirmwareUpdater.exe b/hardware/tools/mtk/FirmwareUpdater.exe new file mode 100644 index 0000000000000000000000000000000000000000..1652adf37bf5258a10f0ad92e8d214366d92a6fa GIT binary patch literal 591360 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

SrCd+NYsGNb(siUf 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 literal 0 HcmV?d00001 diff --git a/hardware/tools/mtk/PushTool.exe b/hardware/tools/mtk/PushTool.exe new file mode 100644 index 0000000000000000000000000000000000000000..048b446ea77434ba9164badc123ff559384df4c6 GIT binary patch literal 274432 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

)Bm@uGw|Q7)W7|h1ddUghsLu5VEiW z8l=9hzFf6GR_~^b0c6!5Fw-wn=gPTeY5Q8^^`Wlc8o+Gr(l~?g|{l`nohlm#SO zx^*^khR2?8-iVXFGZEtxidmJ)QzP3RpZYz|pBh#!XV^pG8GB~le4pRV7mGVaffsll zN{^B5dTw_JYzNh3sdezAQ$5(W)r}=y)2F}nYMdp*X#Cg98zyC--VIuhQ*pv9D0>xF>io>We z&~c8xcRoAulR-RQk_0;USQg_d7;zA_uwM1bx0qkvvXGE~8$j=nShQwCVel*r1vB-n zwP5!moBF!0P!ks)E$=}_K&B7eu9!HLUR4^+mU*2Bj%7E?CEID%>+M>{>6FTL%^}`f l{0ZQ@bns>QQ*f@8z}nQqG;XknsINefgc5S?|BlC~* z1>(k^;MPO$Tzcdma6)Qty}^v_O+pS)N7|kDX5Q|2$7_En>1DPB$D+6 zDOiRmZ3oyU!brZp`?y)$eX-Sm1trQB*;@E2yT-1E z;w-_|*-hmE13nz}gxN+fT;JOgxz>9wtWN@X*Ayo3_HYQ?9S|XPhG&6y2ECruM+w&A zrVy^vJ`mP0IN$}`E!0qp7XmHySr0I|aDZ>1Ukot0UzkwQQ;gP=E{fxBz(eTC4!wCY z`L7cojUm!c>trobOROQLHQN+KJH(;lkVZPnKMTB!e@8$yq{+Hf3}DTD8UKmEzgvDp z>Q;T7l)+y_tuga!5+%Jd6_4TO8U~jzb_EALUknHJNuCuUJjcXW0)ff8l1o1w55pNf z#@Iq$^)bc$rz=psFsPF>A_jMG&W&T!yOTcR<;Q8{_a+3sxa--BVn)w~QWYCg5{7vB3YT)c` G4F3S3j+MOt literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_disable_ssl.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_disable_ssl.o new file mode 100644 index 0000000000000000000000000000000000000000..244458a07e07885983194451e3058b850faeadc6 GIT binary patch literal 1252 zcma)6-EI;=6g~q>p%Nple^9G#Vl_0_$x=xq#zZN=6vTn-^>|i&+xHo))-@;j6oKr5r8R!SRoK( zAqfdceM!Dbnjb3b8NCNt?Hn#{U8c_18Pwyu@y6@JbozP^F0NkcZy@{Y{Kxl4YIEi5 z>H7Pj)jx8D)f3{lYjyj+?F?MY_Xnh@m&?!eY-@DlbzE<(*K;}D>1{8qkL z+|&!a!1GXgf^yrnoj$Nlgt5}W-qUtvZ+EK&OOXUyW~ zD5Gm#3gvXSl@OEDLVO4Pa)`-&!-S5WI9gA-1dfMc97RudD&1t3pAaC24C!ZesuqbA zHW1UAZ6eWVzx4pgiFA~I5qil2d`3Vul&QK6B(UbO;=dx0{UjNsTah{?gWre_Cy}g4 zA?YJCyoQ?_NM1qi8V)*N3J2Yj`mG3|fQe58LQ{2Bto$sm!OuU6Cm#)}PnqaH6)3O4 z-Dw&T1083&Q)#oilRg&YRTf(q9!vv7^LY(l=&Z?lFDKOe{;JEQAPVu|yON65tVS4^ zG8N2pZ_Zq-TAS{5C4%$9$ICmgAz-5m+$fnu7 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_enable_ssl.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_enable_ssl.o new file mode 100644 index 0000000000000000000000000000000000000000..c685f6360bb04c58094e7e6f91bcdc8764b7464b GIT binary patch literal 1284 zcma)6O=}ZD7=9-oH8p-ERGQXBL#dcryKHK};zg1)lc;F}O~4+6&8AsQp!w)#D(2LS zH!mJMNbzSVc*sHU5A;7MdJ^g_c+vOG?Bojq4$M5y`@GN0J3BkOCz(8FjDczlVlavT z+A{Db28I{}ApreP&p78_K86c(S~z#I{hohaTF{njm$g&=j>FyHnW3#|D_WYvxz@kb zd&^IGzsGuz4Ll9x{_Jl>LNz$Q(l7GYJW__(ud^RNQ)&Y)2D0Vs%Z6ER+QO^}(XN_y z)2bZWW~XyFuw>KehtXKEb?hA2PB)reUytVN!j5hlapNey5#QQcizf7h9*5+8oM72j zr4DQjsXw{5^Psf7^LV2ObDjX3XJOw0yUrH95w^sZ*-g(q270I45LN|II1+1$IrgD0 z>{kNxswFJYE1eGLPKyF^$Mpp02dzfKZlVQi>6Q>qy>cwHKRh zC-Axa2I9QS3BF?@ibxvGCtm>jZ8!EJQu`obILg-yu#O7($9<|6nH4vX)0|BbvC(?k zfXRV;lz-%+Q~^FCp&F{Gx;YfEW?SjskjOhH73B*_pR&OsCiaJstVtpHJ!5(d7dKG6 zh}u=`w7+ZE>73NFB87cSydmN?RaeCd$8{h4{;PCC@1Xif@lI5ryl>*HXt(sfOT#JS ztCQb9$Pd#PuZ#j@(|I4sjRnYTk1Bc{pI#<{;X8OU*<_oE0-Yjrl%#_ShGL_GmWPgFb2K-9# f#~_?8n6nDXb6vts(>;j<0iGi+<3%b{j2GY^Sjn5L literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_getenv.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_getenv.o new file mode 100644 index 0000000000000000000000000000000000000000..a66a63ab3711538475316ec0b61b4875767dc90f GIT binary patch literal 1248 zcma)6&2JJx6o0dP2yG0s(FjQD#?}NxHcKVic(Ht=Zi^`#xUCCpghW1Erj5iyul@_( z{3pEiz}<`f6`nNp)|}+Yn!AWM`@4fe%`OUtW+0%+qWsHGr3{r6E0knk^$S(*f zScecyzD8a}jF07H{C+=}yqScD!S8x9orLqm#pFym3)R9e!}ZVYSZu8i=g|u#slI{K zuODo?UHtuXUVS3PTpO*;t0zNqFtWMX=X}yL-`d(rRAIYdI)9#tD{fbq2uF2m^(qgQuK%35n-0Gm^j<9`+9Q&Qd?GGHZp2aQDI@2j=&X^ox=d?U%-SKc}kC1{| zn#H*@=p1u<>VDXNn0v^f5(ix_)w$(jGJY4|MH_Z8nK>p@v=pQH#0z16;QBta)IJI0 zjp8@~G8iHLGEZs|Sz;YA&Do_OHd-&XKw=;s<)6D&L;=1aAPw21ZXE-tIg#;i2*lkI z5y{&SJV}GUh}xbfG|45tvJ{Wv;yMP`Fc!g1`-@_yI>~QE2>X~gCEzxxD}8B~<9_%< z+whuiq3*f3{;~q;`LEQ9c1!2D?@d`=o%n%8-biZygUZ^cwVJ>aefJDL8zs`|QWrn-CHR*f2C4CG*tf~5t}5k@e# z5TsxO6qtVsKMptFRKCTdYGJUZUQ|ES;LiFNT}`VuRX9z|=QH0-sVjS-#F4)?Ea;+AKdiqRnZqNSn*+{|`=(=CeGJyiLEwgORh ziCyu>Sezx;HQ!wZ+GIN7Ru_>w0tb>g_6v>MuQ_Oai(8;|Clk<|F&U)JYB|t)IxnDa6CZlNFh0~L`K?Id5eBA2+#&NxTjHue z0Ke!pyy0Jbxo2Yj)e2NE0GF3xWDMdsS3KWpcG3qIaW9Ovx-^iTjR)YyUvW{d?fK5; zm#0h!{II^*BT~_tEgypi-dfSOWiDacZk+lW@!@>_(rP`}=CIud%_!?Q6`zzF%>(@( zN-*n2vs5(9X06t$w#|02WK>NOKF8kx-b@qkmNNzOd=YvL>SG)?m(Emd1HeE`;K6xH HHg5PI?X!tO literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_restart.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_httpd_restart.o new file mode 100644 index 0000000000000000000000000000000000000000..e82f63829d1e8d27bedb00aa3e8f0e89a1e5988f GIT binary patch literal 1256 zcma)6&ut%F$BwXiLYy2~t}_z0D=1$tmkX&(Yk2A& zI_@}C-`q@@ec`0GjjZt^yOqu7H&QvC<5?))L%Z$R-9E4lq=Dkz?)`RUcW0{wL0^c4 z*}6Z*uCS|GoF!P2UH9E(z(?bOu)B!DmDp3vb)IwKyb{2VY+(cMjz+-UAqC{l@*MEP z;b7n#qXlbmTL`z`Jr&M~HvWI(2HL32LC;RT?s%NQ@9}GhVUH7h#zYE{G`gRBA-ryT zv4%+Fy@c5;Un#&QD&$}Esaj-K+(1tEY?FwC){9S>oXAJ{2Odfl;3E>Mp@yp4Kmlu> zDE$i(dA_8gd{OCBHqbD!*cas^^vzrVF z3Kw-h{QjeKLT&owb4B~70_FXXn5U63&~dKJw8hoQADHH6X^iQ7%*VyNAJX$AGFh)Z z(=M*BPMI`lumT(@x#*sCA6wX)?AyMyPG{=lGcTsTMtwLh{c!mqqy?mpfSY9lr{be> zqq%1+H-l9-o28;@HEXq2wQaSFC9`Ug_bL7m@cXpz3vPj3=Y5TCdFDcG1ogDD{Drq%?c-7J+v!o~8R#;uq_4DqsEU{gq>)aBJkH1Xom zqaVO8;f-(LML&T@FUHgxH=SYkEl3(CdGGg|ncvRr&c5Au6|Kq`17Qr3utUqr@qv1YW zZp_|Sb0?7e`HkIe7k~Z8i-rycYA3ZYg!Yz zmQKssfSdBZno(b7_A7f~&~sntckQQN75V*&FF7|Hwf*3h)UD^$;fd)-ixR&qe$T z68mh~5upp)Iw6BU$d>0KbcB+t0tjJo6@%9>wtG}o|%`xPIp(uExkJ3Uael8Rg5NvYmA zRiBh86VR_{GoND&Z;H-TbR9rLjN`$1 INb?TynEiIH}{Z)U#T@&5U9)v7VZKpKM#L>@pra1wc6kbxyo zA^C0j)w1=mvYFC*kWqfXM7v0y#m-by-Bs(a4>j#Z4<;)Y`VnL%KUw;ybpGq1EFjU; z%=ZJkf9wjoC&WqD9*N-zCe3pBsh(*LPrZ)ojde4d)vdm8^&KN;yvuFp3WY5_&+|M7 z#m6XjT&LX!wuLlNJlK2Es_gABvPHJ0th1Z!c3fjAw!!Yk9x>pf@jy6jMBxS4 zlgxA9a^Zduz`KrcfVW2@;NFlNQs;OccxN~mxW_2LTHF!B>$gvZJCcj~Ki)$LZRtWN zrG2f3oInZr9mK_u6MV&ljz}>YPdXLbgV2v7l6?wb+6Tu6ki`h;XLYg`i6u9X)0iC! zqS1WoJ_|b1QT|1UK@{K%5~?9h)}^&!O*&cMzGENUrNEcERdnUIQRW=mA(7CejxZ*J zggD5+;B}-c*y#I`*l3?-=QA)d#+WoYpY$cp#ufPeN5%=`{>r0B{89zVD{w1HBV&-l zK3ebW?4(cl`DjQ2HX{ewd|rY3m-0cq$}~1Vzr1CEAP(33Ga?m@S&K1vJ{=qETWijD zL!b6_HHQ7wN6R~q7Le`&x5@@~#r<-1fM&2AD=6h4=~4mPIHUqPKp2BK%sqgn<#^LG zK^)dWg6WsQ<3R0g@kb;iXL~;Ry8NjO_t(Cuazfsg;W9d%PFxeIA|3jx&zs?Jum_hL z(+}m$3B-SWXLpaWc{HvlSyLN*q!4=>D)VUA;! zWHP2EW($?_iEb?6WmA=cdgGJT||H=(jn+1QRhtiqZ9?lW^U$eK#W6 zM+=PT5Dh9CUxrl#7 zVx283B6LAZCuHy!+2UM;j?m?(00LNC#o#rJZQ!E&3*e$TiDyL$2bg$A#5Pe+_yQN> z9{5AI;h1~&ZJG1@=hB4TXP55a^3^m|K+WI4JWo- zUz{>a;D$BWMM^5VX4A#s08tpt?U`^8$v?GynrqO7`-+cN>A(($oh~R^LB%ciq)@FL ztE;4-SF~C_r|GqFxn64Mja*(U>7+cx9|3-wI(}W|81xlwW^;_-P0^VOuLEd^Q9L+L I$;TJ|55GQ(j{pDw literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_ntoa.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_ntoa.o new file mode 100644 index 0000000000000000000000000000000000000000..0a9d149161f9e58c6e5a08f9fe0f955969ffee4f GIT binary patch literal 1208 zcma)5&2AGh5FT%mvTapp%U@C=SfL`Ngj$;ti3lMe4$?<;x)$X%wh_~s zEh5p5a4Zv0MmowrR$kHY2?5p6rt8*`z?yF~{|$k>OOnyL6{*uQI6<^Gjbu#XZIfgkWRhfPgYxSI62%`8fRft9kOVN%fG4%~YU#e5O})+RG>} zOqWD=Cw*d)pQbUs76ypU=i@;4A~ac#dMxey{`!{5Yz!_;?+dM2HQ4k&lY;sd?j_@w zlt81tt{6B+A1v>{x`6e4;7-ZLsraH)Z|vGL8gOe)W4q|MjcT=7X}PW9wo`FQa)8es iU!#lfDHwwr-B|W4g$H_sb(4z#PtdR7B`H&kKldM}a(O5K literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_rtspd_register_cb.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_rtspd_register_cb.o new file mode 100644 index 0000000000000000000000000000000000000000..aeace3c6281b74b4dd0aafebc24e4a3abe50d585 GIT binary patch literal 1264 zcma)6&u*_(_FimvU`dIy1Y3{ZU^m&V zNQ$LdhTT;jG2qT@BFsLbuss|}W?S#Lus#alLsOW*`;G(Lo{~fA0xtp|OeYiT5G7cP zn?l&*{;{weI{5$DJ(STEFZpu1=Qlnli2D3CV#4PHXP8hCDMsr_7sv6y_alg8UpxqA z?{fm=F+%#VPSzr^-Bb4;>@0 zh+92yasO}ysuzVj^E5IBD$dV>Sa^5R$J~67Mt@`OAiJ86;%g0?S5FT@SNE4)<_RKj z&Hb*VqBZLZb5Sm*dvo8QA0S`0Hr?x*g7d=1%LlM2U~>puuWC4zUsqf0eQogqFq(S1 zQr3-jqtU5%jc&Q3*A3Di;GYA&Qv+X`Jp*H5NjwwXZ5j`{ipxJ-@2gNY~q z1#kWn-g@Z4n-~2nJZb8!H+_%USqSODm(0BHeec`(hS^!(*R2L)3{)`4!mI-5$Rbjl z3bL>aF&KSGJV{vZYI^#{epJ7x!|mvIQ_tyenmHRCYsax>{BgYXsgp`A?ZavEOw*0$ zkp1<8-Rx9;|2%2jQ)YfnHcuLFhW6mV6}BhFqrUCAW8rv$`ps(ffsx%iJo0+3H!+&| zykQN5YiyVW^L1gpu(_EtioD1RP`-l#j@FjMc zT?wUFnq}BE?G6Jzo(zT4#VkCT_Z9NoS6sMn1@OKj9N^vY7`S&x1*r?X2)uVV9J&W6 zK`-tI;SIV+!X4Ab|1YkijE*?!%julkKBg4*@m0)mA5;2@4FfZA^gQWeIBxlM2s6b; znSxoqPJlczq@UL*FA^(kBBp0Hh{T}vQd1-+(oz4RpCt?M83B2yP`)iB&~v2tZwTbw zl8n-=NS%_wUqqdtlActOUYp~SxVVYr5^@O~w7(<{Iw$p85kd(Y9|-uNd{wRTJRgQX zw2dG_Q}>|6_2(VPFAV8f8xaE?=TgAUuTJ{Nv>&vwru#9A#eNvpW=%xW?`gm-uCH#H z6olXcaD=3yXI3=^HQAcZbZ*ZU>X&{^=enZdeC~(Kd$1;8tq3u8w(OloW3S$}+vSQ?w@Lc~{}Ax|wDAk`CSadyh5IPsNaJQ{@2O<~x?>rbT&X?_8>k(wNOsAQbPkVvE{_7)Lw zpb}5P9q|U-dgvR_x8MR&d+QBm?A;{f5=PpcZ@&4~vz}f1Q^_hb#y}Z^6pSK(gD{9@ z13?PrAqKhc3ojR}kHuu-UMHG_2hsCX5-#Fbxl?uumDr0|^~-)dKG%VZ>sMORcm=7; z^WQ(u%3KwZez9^^e&4gZhpwkW)b zI&D~8;ToG}#(bCA$mDYCMwVxJ2J(+k?zm2~3v3->G{3j=xKZ4BzEOu6EyiZqa%6?w zWViGFBF|FAo672-X8Ubmfqx@6pB@JH@Pz`0OZWRfvd8GIs2*Udn zGD^1;>XZz0OzaP%uqK71*T(o2e7K3^9C9~s(Eb*2P@mMhB7`C)z7de7>Z(}zaXtc< ze-uw%52}wC{htbyj|As2QqUI$kQ)-?PbYme$Pd#PkM|I-^h7=abUq^s>rszGn|!{y zWnor_Yp{ioRJ3MUV{j0rf|>f}O~jvNOnqI_aGv@R^A@ZLSZf2f3MNkZ-9ojtXHH)T zcEze~=PkQdF4s#9yOH0vN;a)~L%)ha&&Ds$8-P7^3%FP6c>-VP3Htavz%%r#c*%+s HU2hUW6uq;22(1R%)D&>lO|1z?yICsH#+WGIs9Q0G7~a+eHibkA?oN$F6JPxc zCjJc*ANtTYU-eh`q^WOBe9(K@9iW7GlbLhwxo76i4!gWB>1D8CJPRVeZI2#^I$DvC2ak%=i8H+7-;WTC*{|DqjzX=!{*MgV>sNjIY6aQxThrRgCo0b*(0TrPAhtk zTgr}>(OzY?GrPMfC97uD4CHR(UZ!QXdcaah1G)XZyN%-BqwP8br4S3VRsR~h%+`G| z7H0`|P1<6hI-@=}TZr6tu`8Huy;QmNhJ)HMxe02^aX_^Pl#n~4WlK{r)6Xe5;#AcXtTSMKQOLO%9vlBCdlUNe%Lrycl$k?X!HAvx6C#8 z-~wzRB^Rw(mDtSL+!pU#$mR8tLCypGBfxLdz^}_5fw7>?_^fd}R1wb-TLz$aD}gVLPC5SI F{{VeBi5~y} literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_inet_rtspd_stop.o b/hardware/arduino/mtk/system/libmtk/debug/vm_inet_rtspd_stop.o new file mode 100644 index 0000000000000000000000000000000000000000..a7f009a6bbaca6fb5572955fb7d46144e1e4d367 GIT binary patch literal 1228 zcmah}&2G~`5T13M;?hb@O97`;V5A_Wgj!CCM1&BKU#G%tq$Y=oi|Zs7iA0)WZxInl zyaErxl@omkcnXdUx87jJ_Qq+7#7Mi}H#6Vvc>nylX4M&EAdEp4Vh^AZI>|yH$ifmR zkova#YT5c&-ArqJ$jU!pqF$uVq%*}-c9q8KLsh-ehsnx?b_ChUPnJ0PAv1aCSnl<3AwqxXtclqsnvACrb^n#v; z(qoi6uG1L++d`Tw9qc`6SNC?eTd*K0Y>}+B}GolsetZLqu2BL=!Z9&)FH$h{Ez zf_d&+ox2}6=skx!pm%&9bZNP?v=5IDAcqms&+0@i5({o1r!hMe zM5FoE0~U6qqx_2q!zjQPBveC~s7q_Znsl;(eaAk$OQA1xtLTbvqs%$BLn4t09ib$G zggD5+;B}-c*y#IG*l3?-=QA)d#+WcMpYR3F#%1{ZN5lye!OG)E;!*|5%Wx}BBV&-p zK3?za?4(Zy`FKbYHe(0bd|rn8m-1n~>NGY#zqn}07V5@Vv2zv@;R;J|HN=thVlb$8lGJb3X# z=(q6Vt%oLl0sR!-ntHM~eUI4zq!(W@^M3F5emigW&CG|gRbh;QG6rdwMgaRVh~&nC zG%P_B@?V#qEnDwPsl=^bBn4ZM@97krCol3R+DWt;dm5{KZtMDD569Zf~ zc6;~i=V@g}6$*U3dRjRi*nQu22Zv&0`@-qIqFl9Dd|;%T!y~WjdLyHn$rx5&xWfd@g~C0QJFe5|1KUIxDKz%(w@Q0Ywwth^MOlokhS%6SyB5+}f+g7v z?JfiEj|Rf&pckI>J%v2?H5cwX0sO!b4)Bie1NVj$kUGnAz`Mi2zH6yng3M zxIS(C|Li8psI?1$ocg;TU~=IAUq>GcFu5<7Fwhf6-;*wi<4zEV(35?XZZgYb1jrym z`dOW-MPh|b#Pp3iFIsO6hcePp{!!o+{|N!rP^RkEkieRUivNZ{-YLl_-HOyH8T>}n zob2!(dF4h-5u$!p*O*ZkZH>;0kOZBo%$L zsQO%`W$%@(chMm@teJ1@=6jmgI~2|Itgcq^U;ZN5~_wDhif0&vDi`%&Z6f^Qhg4o zAK%!mcH!su)5<;B%)@B)v~n~s`i@~8_Z`=8T(kRqw0Ov zQn$6N_9nZP-PuX2IiBNL$lpb~X_=iqur$&@zOjG5RoZ{F)r6oDVqv!GUt{a+sxQXk zEWxfTcNlPIJaEkpqH7E6NoHHGxN9A|zzUqcLgoZu4{R7BF~dGdvD-1c%GBE@?F(^(uP zKn4}^&--LAGE1%@r)RcF#Gv)oCQMA^qxwS+g$nQy3H6X6`_@pvo+GJ$K_c#zP^51~ z_@oVfBWq7H(UVg0D|7l~TwFtO3AG3gdcPSEQfZc3Mk`;?%Le&gSojAp9vJv#*<&y+w7}kbIO6z%CB)b=0NtwuUK*WpJnX;4 CtA$Ab literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_is_support_camera_sensor.o b/hardware/arduino/mtk/system/libmtk/debug/vm_is_support_camera_sensor.o new file mode 100644 index 0000000000000000000000000000000000000000..4b79290f38fe41a9ffe3db9c26f7c4d7d14c5759 GIT binary patch literal 1260 zcmah|OK;Oa5T13M;?hce0KzF1SSUy-p_Wr35g{bV)2VPt)#Oldah=qVNTdn214JP4 zCphp&xb?=B1N;h(gcH5NjMp2dJ%o{Vzi(#0+1cmEs#Rl*fiMOch&_OP?j-Y}AOlOF z!0MOfr_0v+%4SOILPq`$6ZLHMR612mWml;`KUCE#U6`z#X-ANm{9x&$(yyO)MFD}P zYQE{)J>T|6!{NXS?2glSJ;(Ol6Mx_VnC0?AEz=x~ypHRQH8Y#ltX|-1J4ViUo!ib8 z3R_xU&+9oT-p4r|*J<~FZ6Qq-5B46kDto)zO<0f=w#e4ytLz%Po={neZLpitJqEfz z?gvgAG4MEc1@qijdf>hbKtFZ@2lTe@gYFH;A$3mAgWehR`|b%!u$Jxwf!Aw~0@oLt z`#;`72_5Z1B&GAMN1Q;8_zlFxh!cFn0S%F2lutSZ+nvZyAd-FHFzxv@0%S2l`dOW* zMPk7X_}zs(ziJ*RBArxad#0oSN50X#z7zz6k&e0&K101`%$sQ>@~ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_is_support_gsensor.o b/hardware/arduino/mtk/system/libmtk/debug/vm_is_support_gsensor.o new file mode 100644 index 0000000000000000000000000000000000000000..ebb785561fee0cfe3260b796c65429959f0494c9 GIT binary patch literal 1240 zcma)5&2G~`5S~q(;?hb@3kauF;6sqohOV3vi3lMIr+aC>w123@8eD~ZRc$7EG<;QxaIT(2z*Bk3*Hmh5`z}5GRobfuhn=2Hy z^*qn>926g-+;N?D57;)+MDg(8QLA#WzuSbRn97#fhH{hLVz=WOOR-IMH}-%5_s9Lf zX(I-nz^-JT`-%td+W`2f6F9)zz7O0RkVEPm&jara`hE8tC0L6)LE!b;qrmm);Qwd$ zP)2QC3gy(>ddLZskl#UE4mrUWOz4OdqxGayaoi96I3n450kc{BLVzqrNI$QWwMZJsn=82l* zl0G&US8#I!gV!;(hJ((R#6f+M--;CSnD|H}G+9^r66fOz{Q4u~gz;(hC=&mt0_7D* zMQLOVws4NVcYb%$C#LymNdoA8M0Pc=Ksrhy6ZI;y*wy{zEfaz`Tmz1jRJ3Lz#-=E; zqHo92L8Lyu41H`LtjBO(_;7g#(gCDTfm>w*r{arpy>VzP7K3eCjZ)FF8?{=q+Ok{4 rl2x@yd*%inr)2VQY)MQbyah=oX2)fi(S8iNeP5kQ>>$^68SfhAC2 z_1p5ZW$R;QE2VWIBmaQ0dbWBZohYWVr_^5@s_K<4j91RIBgl+@vh-2u^w(WcK%l9b z?|QZu*uiix==-7l-h1g`(kz!BYMEw#=yzOyq?y^QW_h8j?HW1bZEh!5C~RwaJ+J4W zcpvSK>$E*!+enkegZ&4s%KqL?6BZhmkm@wXvkMd6<%kz4bsWv~qxMkdsfJ>7zA{UKWml!;rj^+E-nv2~i zrhQ$Lu)p|d^$w&%NFRf4l@08Q&&&13f$2_QA}vDlckbKjEVAZLERQpNaVI%U?U_Tx=b612QPjA z4_^Erp6sC?K|h7JT5rASd+ZKuIXKDg@6Y?~yxp1Ek5xlwjDZ{sGO$npbytM)vp@#c zAPj|X>o3-g50zBnPCt}_?a+@*3eJ-kg%jl@T#G!9)W5dl@zp+@M=z9=dI*`bpX_eC zboT31-<6F#jMh%|TycFe9d90JtJyg ztAi*U7yFVq_K*wvy#U^`gay1anE-djBq*KZdEnjgXk@>^2=?NZ5YC`;B<#u3NBu|M z#u_c@ikG2ved%$6pvP|_Mm$dN1q&)7dGtKx!g$^DbO4dYCl}^-cl!Xc=uqCDlf5V` zxrUsck^4mRUBycd%2EA^htmIygnGy!`_|FGo^Pf99f^CETu0_M+?%MRTmpV{AID3ah zfp@6fs=NJ+xwkyOJY{Ym09PQ5lv4CeOkqI#EeEZe zE(Id#SDvPI-B9rE`&oGx(gM;w;6_=)TXDZ!Zyad;2$(gaQ7Rf{L)V+tmf0$njH*eA m*S0Y6Uo`P=a;9MVrk$-<0-Ha@p7Aw+3Stru2%V)kZtOqLp?MYn literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ivr_dial_number.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ivr_dial_number.o new file mode 100644 index 0000000000000000000000000000000000000000..902a3eeff128344c7e8c8c959cdd2a4606aa67f4 GIT binary patch literal 1236 zcma)5U2hUW6uq-Rg*K_QsR~GR)tXSTlif-pF-GMZ?N*w?18?gB8zCu0m!*;T;EO*( z|A)Typ^1M$e}!*NeX?(QFSD~y>VuQaoO91TGk14BK9r0yV+>?tkb-Fhuq%R4W@1Re z5`-c9b$NT)cwbD$Z+AmUxEK1KO2TR4EPJFJg)5O4k?QAWEVkH%)99I!R9`{rmoA-ayhu4InA&t3bS3%p~w7Vy?^2;3P^KyIC9fVT(zzI}ieti>(Yb$YFl zYY)Aj`VY8?9@^Rk&rAEe>v4jh$FCzsJWlWh6DlHUG@pE7?03C5fJp750Dlz62#`jF z{Ifn;i_DU1$Z3u|FIsO6yKLm6{8JC5{s{@ykWJRDqJTBuNc|fUai@eLeJjEzZSWge z(~m?=3dyg`=wV!3Lvazc%h>7rqS$Glfgc5S?|L;?jtwr3j}WutbnjLRU_SM1+uNzFXlEsR>fW#dQ*kL?R71+lmMz zt{nI`h+BUI{E8k4x7=VR>y6W1Sjqd|ym{X7j(5LQof=~d)L@W-C<54(K|DV*WMBmh zNd8E?OgNt^cT-jmGWt)LnA7CBc5c*-ePi#7rOKm!Dag=I}J=_`%q!XS0^m7rwP)=j;!;?OdU-W#xIE=b-om?Vj(o z`@pu4#*2psPg|9P{p}_!X$D(n>-q+}#csz;mSUUip7xjlAB_jXYa@z4Vo$Naf5(OY zQ2_6H!UNtOjerM33do(~dElMlVBnvi1#59nh@js-75+$V=KpvfE!4`T&`SN>3ps%v z@;ivjAt(5T2@8=ldY^m-J`ck^@WQ!5%0VR d#^6SaQaS2Z3O}ZRXs!S}N8H3l?oy0D_8(Xobq@dl literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_listen.o b/hardware/arduino/mtk/system/libmtk/debug/vm_listen.o new file mode 100644 index 0000000000000000000000000000000000000000..9b70062cdb164dc115cf7ea6e46e1ceb6782db7e GIT binary patch literal 1204 zcma)5&ue*ZkFJru=!Ow>DPyBSKd6ic()(k26K zIvcrG7twV%4g_=T1I@MHyP)+g*8;6Oor30!DIj-VD}dG;k4E+(TCkR8xvn$p9=Z0E zHh#Hw2W@n$5#LT{+x9tu?DJcQF`pBB#)OJU8qFtP6#G3t4k1$e#32~@F9gV;LjFac zs6}SMb>uW>n?!81-c^tBfqayI;v-jae@Li?XrgWd1*|y{`Zpx}K5<3(R=H2u;4iXH z5b>H6l3!ZTWn5fGaS63JcG_P8JDrpGR-{nC#493x6Lm!_a8Z}x&p)9PhP>)?C3LO= zx)~)4I#J!>qyB(bJipV zn>^)>bZ(^!am$bCTvsI=gU71%V8extK4?Z+$D#P5+-UCWa|4)lqgg5%X0ujnRoiB} rSTd?6<=@z@iSN+Fm*mXA43@+iyVz5>kqTmR8G!Cj8ZU=IG5*y5zqNOi literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_load_resource.o b/hardware/arduino/mtk/system/libmtk/debug/vm_load_resource.o new file mode 100644 index 0000000000000000000000000000000000000000..8d4c4b8cfb17c0ced8b175561d7c24ec909fabe6 GIT binary patch literal 1228 zcma)5&2AGh5FT%S*tVjyRZ)|$f)y%KLa4PVk%%fJNb?J9Nz~-f+p_=s zq+tbA7=K!QvTD95Yss7axOQ2C+wrf4meJrWaXvm(PSu+FSgn6JN+g#1aJG7`X!v&}MEZ3QgPTa2Jr)s6ro}O;`fIHP|*{p63JV)O(a>mQt zPOebM=y{&!IVj%63AST*2Ea1t#)^jr_uA!yM>{QuD=J%J8_`X6m2E{5EXh*rx^jmB zpG=3I-9hWQ!uF--I>+2|UVFfMwr2zHOeVnH5e3A~@jUSEXgG9UAO*F!?RoB?bK*IZ z;86czZXkzB8xOct-)7*Gi3a{Pv`c|c<|8I_w1m-o;;Gng1#tu|wRghIMsbY*Swx5* z=1DCgOW#1B=E(b^^)|7~Mm)+t2&}~4qeB|9N!>aEs5zGS7j(p%5{Trj3!bFGZ}g64 zkWw~&5+HYL0|@ne2|mc}?W571l8M}gkYya_#X1}v^GUzs38;1bYBAr{TqP#Elq zls{74nhUWV#8lUH1;@ot%e%1c!FCV0Su$`aJ}uQ7hsHlVuxe&wzi3*GYPD5qTkYb$ qS+R)r-0>{@l@|UhcM8^`fT&**H}??tkXQjIqfOz1p|_R5i~b8Q?tx_h literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_load_resource_from_file.o b/hardware/arduino/mtk/system/libmtk/debug/vm_load_resource_from_file.o new file mode 100644 index 0000000000000000000000000000000000000000..5fabe73b9906ae114bafb5c9bf4136b26795808b GIT binary patch literal 1272 zcma)5&u_LC%G;Q<5>G#Z&PS-|LIiKHF6SYag z8L8z|N;NvJt#0XQ{Y`o^oy{iIjF!>Tkb8)B%eERFU`eD)xx@X(^}_z%W)1vOkS(({ zUxeLYH{~dcv30f~Jz$^>Mm^VRAi566wqTCk)m;0X3tG!^EzlZ+0ccL20&=Id3~0@M zuV=qP3)a#s*L6CLp=%GkkGlfgMh_jc-}BO0*F8?)^Y|^qWsej5z=VoO8qFtP5c@qZ zmJz9a;xHZgF9k@ULjHN5s6}SMb>uW>i$rX+o-$#4ARpzQc*s?NuSlqdXrgWf1+4j6 z=--j>`^6RE3v-{afsBcxX~b(%NPcNfkKp1uiq}vJVW<6F$4=)Yz7;7HF!7m)*F;?r z3!K+|aPddzgz}{NOp*VoKzSc*%+kmh+`(~Ys?D!X{-sHNn#MRj3y>}5eLxp|)_A>V zQ(FQ#)1OE_Nsc(o?PU5K|pGx9nPxr2PA zdZ_A=?^4ENH0}?-)$KQ|mQ?(!; zWBK{~PR-h?+hxmjyn4gkbgYKwSoMbRs%6KjIkmdG2awNZ@5d9xw!z(t=ab2}Srtxv z)<_vIQ!}Z#x#@UXPwOej+{L+V$1YWYO(TtFR+sOs<(8LbiqI2^v0gS58D>}5)$k}A zW8>^v=r#l0+p7t?geY8z6~$a)tnb-!CJa4 zgj+2&gyWrh+5d!-n4=@<@jY}dyFMp~_LI`1vQ8 z3%9FxmGD0ms9pqacGJih+`_)x(Soy+KibZB(iqQl17xT3kfgc5S?|LkhUVURZ*Q{frSc68oF{yBr1diX+9|~K}`;oIJiz~k)VbIXA49e zxbPFWaN|#Kt3-c7{{`d+JE*_vX#>&U$zKrDT;EV<3Y;3MLtVC_FY&_1=-!a=oEZ$z%+xBV1#{%$o1B z>)FlCw2|XEo`w8Fv^%cT>;Ow6jplcE9yN+P&)4e^Q{rrfEvifGCR>hZEXh{bZRG(2 zJ{Wd|(?k@Wk8R03_mB(slK_6;2nTp`FaYlLC?R*2=YY3*-LCr%E!c}YLU^6#k#GmJ z@T_ukDP2}{BJS&=S9)}F_QT=IvQvZg8ddQG{t0-X4zSMsq@$ZwbNZ*3*lQ#H^Y;TGNr3HxryQ|YBzAu`e?nhPx4!lLJkXWi3B10%3R{KuEP00sS`#<-6u*U)Pd?M z(05FN!4f7<#=`XME%OZ#xCZx;l8fG1R9NUN zXy3MR$e{dnkkGy^DEJKhu)GDU0#*-zTLlvz`Im)iZPyH&z^+)et-NK|%H?{gVK?$y rR>>yM8&}x)Kic?5c|)*6Q)55cwJ#;Q{{#_w;<* literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_magic_wrapper_for_customer.o b/hardware/arduino/mtk/system/libmtk/debug/vm_magic_wrapper_for_customer.o new file mode 100644 index 0000000000000000000000000000000000000000..028c0f4c653bbabb16ccc09170215f2688615f56 GIT binary patch literal 1288 zcma)5O^?!06uqx}3`oojlQ9A|S`{P6OjAapgpJ{wi5)Qm3*x3zpbi)-Sc*z!;l`y) zSN;aK?&e46%B4$P7&GqJ>AkcMm{|~C(s#~1_q=ysZ(rY*)e2(__+XHLMFh}w0$*lk zNI(bzF#WvoaHD=)`X1d9b3MO!QT$MWJ8NGQF)7{<;WRd#o(Ly_YG5x|d(w(T!aX=$ zpT4VP4NTEXhWgo9aX3iDlv}Tt?9JHTA#2w_L`~w$V89pJQ8hr4& zH59Pskn7)&IQPs^xG(JZxD7&>Sndn=5ejn`fQXwbC|*Eq9UnU120qj${;o(t#l%M< z?%@0JnB%hUg+G6}PUxAv`9krWsX%!zTwkP-F^J<_nrq9ulixSX&(j#+UIfU_=e@9f zChyd1&b9OV^IPT^Jg^4$kdlkmYzl0KPS)w$GaevPACKLb`WhB+Uikyd9f;cy?}Drr z6`b;qinaQIvU(9{RkdEot6IHMX_T8^_XJ35dQ#e6r3gi literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_malloc.o b/hardware/arduino/mtk/system/libmtk/debug/vm_malloc.o new file mode 100644 index 0000000000000000000000000000000000000000..8fa45ad5342260387a2e803c87f92b6139ba5174 GIT binary patch literal 1196 zcma)5&2G~`5T13M;UW~SXGfylCGQ*i3lM<{sXu~YI5ia?K>7_FzWxRm&&u?J- z`p#vOFt60V)ZPy5p)(kax}??1<@-juH9GXVt~W92nT%oeeb?AAbLN}ecCJv^GV(mn zb5OjCcE@!(ePCM%mR2YwA^Yja`rFEXmf{O(n~Kk0(Rl>0tIf zk$Vz(?tuI5J0JLg<2%4R<1uh=M1>jLG+ehs9>Yv=6ztI^UL8ONCGyYuWG`|{Y$B#> zc1XlH!gY~A804e+!!U<393!9}GGyNd3fS|t)ITE--;q$HZ&moD4SpcnpEA*tDEXBc z{SOio#U<1(#BnL^k?N=*z{rZ0Jv2)aVtJ6H=289WB|KvHA_XyZq{n8YTIrXOIFpU`b*ch k@jtZjPx2;UPj87mXjVx)$OFv!GQcCu>-ce0h~rEB2j5e4r~m)} literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_malloc_nc.o b/hardware/arduino/mtk/system/libmtk/debug/vm_malloc_nc.o new file mode 100644 index 0000000000000000000000000000000000000000..b49bdc979b067db27dbc8732881c17116b6dd8d0 GIT binary patch literal 1208 zcma)5&2AGh5FT%mvTapp%U@C=SXD(z3AHvQ5)ndzG{3->NKFpqv~1E<6Det6<02vs z^bt71gK(k;9s!<$8!flqU?#S++nyL{J>Puu+2bACA1h9kF$UTgWFU+H>M}^=CxQ&j zg9(MN3ojO&59M@fwVO!8y~K}98cvgEg=6E`teMZv`j_2ga;^)fm(Pr}^%^q2e}Z-L zi|ZoFFV?*Y6KI?m=fl*Gi>FR;D>T3_5-=wrbg|<@AJaZQ42eZEho1D6Cs~ zp659zKEMf{@3nit))6L(JKGOiz}uq{@L)&*sdGFJyfYjO`~#F=E$#^s^xB8QAE_Vu4|fMO z)Y2KHrM@}}lZz{S3;nFZqubDH=6&3K;9+EXx)<3X&Ia#+MPzSCWWLo zB0Mc_BRPlM75r#_v|s9z{#S%xV`86xGF?~4+DG{~{Q0YS^07(vkcpkEK>7H&UeRu^ zqP#Gj5?!72iAjE%#`s1UAi9{31Ko?zWIgJ!w2SNOTPCwHxHP>lG-ugh({m;T^(|aW z#;+)WMtxl}aEv}!-hnj%YkR<*l8r<0WvSlSvCnD1tvQXYqT@EI)n=vTwu)O$#U;tU kFI;?$F21K=3~qE`*|QXG=rPt!&I3F}zk-*fOfeqrKPB3D!~g&Q literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_malloc_nc_topmost.o b/hardware/arduino/mtk/system/libmtk/debug/vm_malloc_nc_topmost.o new file mode 100644 index 0000000000000000000000000000000000000000..3f1f45592e6c3f9673a9528545fc17a3df105cd5 GIT binary patch literal 1240 zcma)5&2G~`5T13C;8~LD^E>Fj zesEbN!sXhR>RZqDoPOW$*!vw@_y?Xp5TkUhRC=hVoBm%^>Uo~$IVjx61&-^qd%!l4CJH;-4_f8zr`aaVDJq+1tMRMs8oM6TSdy)=b>$ud zJ{Wq!X(Ngt#I9t4+vmc4CxGuc!U5hM41fndIi$|9;SQo7 z`wzH@8fxuaq^15^5hsX8{08ED#0frQLPw++ttXv|<4)wq5Xp{5^JEH-5g>yh(ogGT zEmBKvAg4836hu45p%ICUbd-M_VHAcBNT`N1S+|Y>ta%{gUy+1&DvU_oN~n`E_=9YB z?1eSSCA~5gSMlQp1{W}P1qbbK83*-A{wq>2F>ypBGFeyp5~t&F`2APL31g$`lSpi) z0_Ec~y`tUHIhx}o(_bfjVw4}J(O;i9$j;~EaC;^n)}tPWcK-YFmWA0ET!Ji8Qqh`K zg+Vb)jb`fGbkE7}MS1G$ih}b+50`gfL%_x!aI0kCRCrOUH+GB*wP4q*MzLVojcT=7 uY1yqp(W=-aeeDVxU#E@lD;R=(QK7JxN!-{Y+>f>h@C0!UFHf0#JoJCx@P~K+ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_malloc_topmost.o b/hardware/arduino/mtk/system/libmtk/debug/vm_malloc_topmost.o new file mode 100644 index 0000000000000000000000000000000000000000..128863fb4bda0c1ce6b6bb41edab2a50fbbecbf6 GIT binary patch literal 1228 zcma)5&2G~`5T13M;{xIqz@-e4y7)*-zx((Zio&9^)2S?{}wRb`BUGzJ-nBLFK5lKHV9 z1M{Fk;nTwN1?z1&ox0mgreQPrHIs&O{i1NDoM|=fnO6U>uj_L?IKO_Oq>Y!5`SA^m zpWnGG68Xj2m+FaUd(L3scWvPxdHzsPu2w2NG%_v!IOw{;$f#wrhSe9Yv18`U*SYOn zp|D}(d7kH>cpv4C>va0SHV`I@&AkWh^4`EQoo zcTh%cor&bsTPwok)Ck`~KO13kA2DH|Cyv&WPQ!68iWBI`PRDaRg;xlWMT+#3I$4X< z5}Sx=%?^=hr#My!L`FKwKaPAv!+Qi&Lz=8xM*?deN&Yhe`etcTw}gZ|8|8lE*e4K~ z)R9*tiC)D;CX#cAZ%~Y55eM~Ya=$z#PLPu(_mi>ole`MQ{z#sDV*KSXllZ3s{Pv_@Y#AG|j6*uxnOhw`kdoYPD5q+wJ16 qRk2BT=n5O(rHwBu7=eAI1lFb=rtpAtUVR?m3HmksY04DiW&Z^Trh;7n literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_memcpy.o b/hardware/arduino/mtk/system/libmtk/debug/vm_memcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..6dcbeb838cd22383029b759b973208b8be60d56d GIT binary patch literal 1204 zcma)5%Wl&^6upx;k5ZzLQiM|?u&N>@q_vz9LDUV+)2VP9)MQbyz;#lKL?Wa(E+S&V zh6NwcUtw2?U+5pOWWlBto9y6TkH<-~Vx*aK?zv~?j>j`!>PCYx2BI;@!Yl$Xcn~Ri zhAb>Y9H!rsFO#j$wV&zL%uYX=No39&@FaGrWpbJI3|z_6=>@w0J+>EbzCM!WR3EMq z)31%vF=VeVfB$+WiuoAVkM)m3b7&8HrxVijYIR4+wnt}9&vqt?p3f`Bz_pcat)P7< zY!ynSoKjSaY5~em(QesRcK|GhG*Uj?f8MF>?`^dq8j7m< zsN>1dwYrF|!?7=zW4}{f`;!amiRD_LcE@8-oe>4(E~rINd!ymdevcNcrCP4*47z8o zJ*JKSUwec$I@YLfr?c(&oIvvV1H>ht6P#m0K_rdllP`|_u^)#KseR)RjQke@X;cMfg(OCv5Ns z*-;SjniP^hG^b0rxQ5~_)RNd~e|NCcIf-vY3Pnu3A>ubtSHuG6bqTKj3Y{?QRi7#0 z8x<%oL1LCh#=O1k2HO1U1A{Rho$c&7jW literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_midi_get_time.o b/hardware/arduino/mtk/system/libmtk/debug/vm_midi_get_time.o new file mode 100644 index 0000000000000000000000000000000000000000..990300573517943fc75b93465defb607cd0d904e GIT binary patch literal 1232 zcma)5O>fgc5S?{CNLo##C z7m)Z7T)6en8&~)hoIvGPi37}dy@{J%7|A2<~!2xE|iMFh~{L8Ryj zvakvo_=~u>hU5xz3H)e(N&Ki!;$IQMeM|(8Nz|oW(1Lsze*X>T zLSFR+6FO6Y>V?nrigvq+@`v*&!PQA0@$&OD#+gNcXgMDSx<3o!^`6a%<@LoaJ<%#($h+_b)cQofzi-g z<&ti+>h*T5V{}Soy=IV%oSH(S~RsrZvW$?o26yrhv1Lzck A00000 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_midi_pause.o b/hardware/arduino/mtk/system/libmtk/debug/vm_midi_pause.o new file mode 100644 index 0000000000000000000000000000000000000000..3d6e173f877b46cb1da6b5e76ff0e2a448ad7d8f GIT binary patch literal 1216 zcma)5O>fgc5S?}GlC)AutD+_$0t*UC30*lQ5)ndze23x^)Z`F}gK-jz1QAl44I<*e zg`dEM8-IdZCHfQKS8%I}xby}yu{Vi(>PYMN=FRiYdUyS)Y*rX!AcH{)<{5zLC0cfB zNWlt(A@_at>8km$l#Ji#X-T-F{Y)j{G;x+YQjWsa$X=xOwH1pk_uw>orX=;3kUIIr zZng?1zmF@svXPI`>T%`$z#8q z_-HZ^b{kQ+9`+=2oi|)K9|Z8OEo|WJ(FnLZq=eiVo(0|+4hGI!v|ul83*q+LW8sWw z;TMbRXrpai^6j*@&wWmy`ur+l#ODOxu%IK7M(>j^jN_J{hY%?~doX)?M+lHch5U;? z*^A7Q8_4M$c~&%E6o(A*QT>sRQvZU4ddQG{YbapPL#h8j;@u}tk-jz0CvET-S!vY@Ltxq;#`YL{`)`e?nhPx4!lLKX|JiTEM=%3R{2uEL*xQYQ>eyU&$Spaa!a zpzoLmgAGg`&VaY$`Ka+j~4z>?gXsB)Yy;qEsl$Lj2K%1C?O_rgXvDi@PPjVc*17=a7z1t$(y;IV+O8AH z&jo2%0}*DQV~=CaH`VXSO{q9okuFIe>Tq}Ut14xrTN0e5X0ub_RMf=XXybV&k%$lA zY<>2wUO0gC&u{E@r~K@hi{&MA3NdgIZ^dVvzG zrI?Om54$IhHSvDvKj0>6sJ$zmmU`UrI6>Is*Ab&0C-{U38IfW%pL8OAcRW9YNcP?Z ze{_!$Ad3;w2X(v_i8)u1)0`a&qS1P>IdccnQT~yKZWQ1n5~{(C*KJ?`Yaa9X7bNbz zawA+9cXeC_e~<nyCfU$M_Xn(X{>J$H0r0@_EheSN%>v5lBFdl~A ze|elRH2?EOB(zk4^5LakQKv4Wyy{O0u1@;MJnyH`zq)XcozI7X?#05~dTl>&etmw+ zTtNs{{rf_5HU#FMGbyNVbY9%Zf95&V*SLUV@WCoQ*m7X24~kw>Flh4~rGS7y}s$Qs8C) zeLL}ICx#S+AqeA7kA)ClJ}y-Q%2N4o>x1|jTUO$o%gT{>FW^@Ao2sOh8%jaI>FW5> z=$$wc=H{;xAvfV*u+%KQ>S?`hyQ}s0 z^r6y#Qf&3k`>xSOy z0!t(H=XbX6*0;7Ftk)pm39=Ad^ewZiY{eU8F&1a5p4$xgVA!+t7NTX^*pbXM_PAxd zwt%;FO9$Q>41k;al#n~av%q)vdp+X?TCf+_Ez9h-4xEkC=Kmkp(LzTbaIAFxdk!b? zIs6)8$l(M(u#i9`jnJ!I>3pnVUxA(K1jMnWOl#KnKt`;dCP2r7cKxtN-kQn=wYyBmnJiv+mo66xs%hm zMm#vr{c!m%BrQm`fmaGDPWeZLa&P&U7z=Eq5{PXo>lT|x^dSAgwCW-WZ6der7B;p?Ys+>qG%=CH zi-{MF7sac800+Er;7`CmK`(l&Hxfzoz0OW4BqUC{^L_7o-^`nxneD4ZoioNjHU?2R zi2&Y+U?ABwL}3X0(E0k5bAGTF)+d$l<1hR;yTgBE3w)yTdUsH{q>L&bImCw#gP(^! z!3XwUQ)0@La$kYYjU(^w#r=1Dhj;cp`~F-oU*=a<1NpH^DGQy@QGsvsa0#N{zp#))%B{;teI`2Oh3nJ8P--K7`d@(*!9ix4ZGBnOn!MqJJ%0J zPG3%^bYq$G!eY@VrqcSNLH1{sW8hb6;CE)X!8os=*w-;!G+nOn5P*X?ju(mkNWypl F{s9Ugr9l7y literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_midi_play_ex.o b/hardware/arduino/mtk/system/libmtk/debug/vm_midi_play_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..1a84de4dfbbc8a05414e829c5ef68918e191485a GIT binary patch literal 1264 zcmaJ>OHUI~6h5~v3;5!pZD9h{KvGhfOtFbX7upB6H4ZePO=LGrVPcz5i_^i-#6%PS zfbNvFKY)eqy68{9zn}|E+|(Tl6FsMQZW(6bN#>sOo%5Y@?sHzR>zpwLQW&J*9042& z5Y7$>DVTsL48A<&ocBM+^aUmMJm%kuRX*2vdlFHuC^O0j4(Y3>;~zBz-rrW1 zl?Mt8Zk+{BF8AK?V?O8wdePE&xz4Az$I6MuP7wx^XI1`&$9Ew0{VQ8){x4)MKtq>J$S>)a0Xl;zjXWa&Ztf$%#;-Q5-iw8a>4K@?Ein*};tyRdya0VPsD~8Uw~P+#c_972&=7Y|cqDI9@FWcuFt9yB zq9;M(2Rwcai)-i{N8dI4Xnr(b+9$bIG+_q=qe&o^eJSP@uRjF8|9WFVUsmu!2kIAs zX>S7ZZz67teBSEB4-ey`Fyh2HK+7Kw!Tg1|=!dVy6@Pts%S1Q`m+)^O)=oK70S0Ss zCMnvtO&>N~O#3<+z|r?$)m>P0U~vyry`bTc+bonTTbiE+MoF*abGlLCyt-a9YPr0= nZV>C41V*A)XJ|WI<7B7oK7!Ua$Q1_Fh literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_midi_resume.o b/hardware/arduino/mtk/system/libmtk/debug/vm_midi_resume.o new file mode 100644 index 0000000000000000000000000000000000000000..e0c160c8bf529532256a9ac61dcf42b9711e0529 GIT binary patch literal 1220 zcma)5O>fgc5S?|LlC)B3BPyH_z=9%DLRU_SAVNrx?*J}AO%Ayr<0KY|gb6qfBI3Y> zpTLDXe}P*i`V-(+aI1>A^ae9oZ@x}lY4^Q(^LED`uRoQ|3S$i9V32}Y1Yn9FoShg_ zum%yxeP4gNZhkB!tLcf_kryo4d)N`?=?&Nk9QleqC{Af#ncOIi(L$9EY1?_igKF) zAC6t$ZX^1hz@B8D^P2n42OoIX_HE$p;Sjhtpn%*No(0|+xUTaCEm(`&zVG$hBi|VY zFLVaDiXLj~O5mm5J`Xs78t_Yq(SQ?t!-S4V8to@v1m}$)4k6O`EMU5dPY94kh5YkA zS&Ph)8^~#o{8n_{22MH1NBM^VO8pBGsv(E0TSEbBzLok9B;q~^Mfx^{Puk!wveq;b zH7O*&GN-F}xPjs-YUgp%^U?ECpX9qDg)AmqBEgV#Wh`-CSK-e;sS}1K)n`g*p#tSq zh|SW-7;NGCV5-fZPX6#DKTTt-%>rc0c@-`%4_#((tUpEz87k^mZfo&hQyTHw&flK~bu~t7YmRw*}&3YkkTJ=h$QEpnz te8DVRWP0WJ7XFbI{!`u;!6w=ZX5)gJg1{2j|x>wT$r^%!{*M zKToS%iG+T+c3S-~a0dNu-x+zr5#vKIDAh`(9m8x6kNl43kBwS3YuJ6^8QWIQdY{|M z6$+b1p67WEiVtyt>$&YduuX*V;{M*FR(bE)Ruks51e<58`Wm~*)?-PQVrh0;d%%E? z#slHD(FbJ^kEvlARrB8O1F*))I3!A9|+`qk{QKYkvv6%--r$- zk<_G+_*x{dwqLiCuFF4dwI&FgUSCt8aI>eEc@iUR5B zS9(ReT}OIhvLyO-;>Uyfq>OQT8X%gj>p=HsYEqASEN%At>XylB46Xq^6k^euRgJ-p zECn<5?bS@|hB5VZMZ=tdOQLQ#BEvHr7 qwJQ$M-r)1cSLxup^2gxJ3dsJYaC47w56MME+XPU zAAuu02q${zBlImeA=+DSFcaImo1PfS{=S*{?D3AhU#fPEF$UTgWFhnb8q!G=rh+Ui zLK2EUmR>H|pDUU4-F_ki_Y)`C44kIUi%0AT>d6<$#`nEcYM~FOm(Pui`3ACQC%=Ck z*SIdCaJhb5`#5xlgWkXyi_!aOxLz(lHnXkKf#3D~iCNF(OnV?abIZzGAM%^|VsXPP z@B+_6=^-v~J-0Iewt+NJ+TD57uIxPDY{8t7WbPBtf%_wJNS)^e;N8)1=)FS;*5a-Z{-ARpys`SA|A0HF zp_a}mE%nt_oFK0FEyQ`n3BF;%M5Gw4CtVW9J>|y`$quJ;ILYe+$YF@|QJt5WL7Hn%XifUzq$=zMfu>XZIfq+nrUpNKMDSNj^H@i?6Q)p5euw0anc%~YU#e5O}) z+N&rp21}y5lRh!c2Wj+ggbuQc`8d$K2u;?b9!tBpzkX#h8-q*1d!aR}1`F<)6x6qH zFX_Lg1RC{q#lSiG!}2by3s~;~x62kzrB~%fbJv>DfK#`d+a=p+)@rS4+i91!?W#kP meNQ;}H#+z~`4e!W8_S-h@jy?oZfX(W8R8l~k_!2Fx&Hu!n|dJt literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_midi_stop_all.o b/hardware/arduino/mtk/system/libmtk/debug/vm_midi_stop_all.o new file mode 100644 index 0000000000000000000000000000000000000000..42ffdfb3760a150283446fd763fb64d73709626c GIT binary patch literal 1216 zcmah|-EI;=6g~q>p%Nqg(E=LXi)v_SCrc%fG$xkvvovm{DO@z(tP5-k2}oV0ro;fUwYf?a?a-H+B@A19M5UAVe^t-pcHugf3bo~X?g zno0Bhz#jBEJ$odEr?%7YPf}*7w4-Ml!!xh#dSl(pW_7D4Tz%Wf8Sipixk6z>&+|Ob zLGdXra9pR=1Ga%~q?+T5`&_u^0(i#}4)E4!1l$`^Kfgc5S?|B;Ex|$A`N#EhnX}SDJS{?JAkVEOs;*~Rg{G;99=w-(&}r-93TGr zIjL~bB*f+Fr1IV|9cN^=twG!Fo1Ni@L4Rm<&`>QFAF7$gaL;Yq?pUp6v#QbaY;{x1 zY436yIbB~@^E}UUP`HnF%eGoQVCzT|g`MpO&C>SMjRwp~GMi_s@yqNAyBbqilBL)U z=`I648atlVLiF4KyMnoPpL_O44|vD&Ea0ut2)H|>gxoov2i_h!jy*sN_TrZ3xxLn& zXOF@c`wzH@9vbaj=%x7@At#83{2JnX$O$G`P!UO^>&YkMx*g^*M2dZXkG9|#0kSBO zf7T~@ky~&LIbE|!BE~*0g-96Wqx$0zLm9pzp&lYc-x>QW6)EUg_(CKM(O2XGXZ1K7{}DQ2%QwH8In8xN!u{+Ym$zZfgS8HDqp0Clcu}m?ceHcdU{;O#R>3gq zl}e-BG@FGjqimA-jqREEhno10xnnTTZbpwpGfm7%Smd33lg@?wNtP5;}qzk%CO^FXa z`R<=FF|j|Q|H8*spZZqsWp)6Yns}3$bMCok=g!W~ey-Xz#u%tzkcC+WP?t%pFfn8y z2?%%U+=-`)idKQWPcx@{CubuS7_v z*3&0UPUNHdix8y>@D&O5P@($PQNW(>mHq>Xyh~D1z9s2XHaJ1HH_c>EO35FY(`j)N z#Ve>?!$JE?;h=L;?}`*mEPNpnhU%+wh4Z=wzs{9T7@c&VDbc?=P+fz}tc;AoU7YDm zWz4Tm{@A3hs(6LLm?g+A*0ss^o>^qS&8cv4eRa#EAqsJLjFeoPIF=&}YKSW6+}@}J zk#axG>0Fm0IA8wb@(!#DSnUG0%O*~xSLJ$R*ZhYY9LsKOm29U`t2L`Fr&Zdrs}7mp mdBVXz)WLr&7=v?pGujfJX&N_3cS%nI6cICciJnuAAO8;&nTNdq literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_mms_clear_interrupt_event_handler.o b/hardware/arduino/mtk/system/libmtk/debug/vm_mms_clear_interrupt_event_handler.o new file mode 100644 index 0000000000000000000000000000000000000000..6d2b18b814aabc278a025b8dffc3475053606d13 GIT binary patch literal 1308 zcma)5&2AD=6h3!=3MHwu(FjO%qBWsnZ-z=DF&gC`btj1C&f^!^6XhgW3B3$ezci!K^)8%8E|i4&7LsQ_ z+1+OT?DuJTPZshpQaLRj*@kV8jCS8L9iul8mg9^Mg<&0817UQ{L8osyQ+lOPc&sMt z!?Dx0oQYaVrBuBqEOk#yYwy#$>1=jK&F~CQL+&9an3mb<0oy?}kUQ9a)F|%1*sa5w z5@aE^<-f+Rvm3rBi?KMnr95E3M-y9^EkxnC*p-@N^|`Q)1@Mk3OyI522)HvOgV<@F z0p1?kHr^OG*5alRPOmi<*2w$N72q~&fT3+xO3)uByZE@Ng9MP(41LrO)`nEEcg?6xQ5Pk^j*b8_lw}7KFM!I6?6=IBgGS0 zSK1O6{eJlKPx=Xc)9Q1NZ>a*s{Y$-~+fq-S%u*IlCw^e5XE?&ZXIxS)$NfMvKNq*2 zK66|?Urw1z@WB;$iYl=vXG>wwazoRd`gVND{_NS**G&cYRUR^L!?u9!4sgAo;g)+{ zsMZd&m2$zT=(T)KH)`c_z0@!oxx8L7DD|Bs41B!?zCULI#wr(admqCOdye;yh5?F* MaU3?9%P0=Xf3_f`umAu6 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_mms_delete.o b/hardware/arduino/mtk/system/libmtk/debug/vm_mms_delete.o new file mode 100644 index 0000000000000000000000000000000000000000..85840d9378489f9663738dca03c8643b00c01728 GIT binary patch literal 1260 zcma)5yKWOf6usj|upM3rMvjveHYh=kOjhe)i3ketBV$80M2amDiDF|XD;#8FSWl26 zA%VmXKnJP$02k1u@CQ)9FF*kjjpg}opbKFXXnn&%)VSTIb#e|Fi5~K z18B>{pY9tHFbM(ZeR{w-?|zJ!F)gz8f&a-L@^ASPpR2v@OlW7cu=b8a^6Zz;dqab_ zSF}a#mIl4c$KKBAqc{AJ_l`VAfkLQQKwjuHTD_f{#fBxw5 zvRagjfx?}_^M=)Ew5(mbZVQ|ALN0eRo+vfK{xVb0n__C2Qo~4#jD=Ulf zw4T;ekhzZbie0Jh0b4}s&up&WDCgJjE|p-y6JS9$?F+MuEaIJEQ8vpid9E?gTL%qM zsUiwTVofo}uIs{X3($8fq5^ug)dJmVQbO*Oo(6rV*=X2L(1N}6iV)6Tbzj&mTKNA( z3~h7-6Rw@k;f2cyd@i3u47!})GZx~Aq|y823*fWh=3YdKj)cJ|j~gI~3i(HUsu!6R zH;~gi%OqmZeCPX24&8f3C3 zrR4XF=mt)1pcq2!96q!@S}*OB`c|Z{jfKZV+)#a0u5eWM!SBCHC-nBa4;AlN2devk zzGD~+!kE+s!szVe_xJ0AGUkzCg6w472ijO&_G=Hclk=-vCJkOV1y_-hi{6>`u(7kC zeY=N`3d$e43GM5Y2gk7=R^Nen0rR_{n>hoA%>7((W78NnfmJX!vKiCb;Jmb2w#u2T pxoVN;ku5CzA1(Z&oCC1NrpA7>Z&6%C9dTw-UZPptU_m(^@IUtVkSYKG literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_mms_download.o b/hardware/arduino/mtk/system/libmtk/debug/vm_mms_download.o new file mode 100644 index 0000000000000000000000000000000000000000..4b2d49fc7508dce8ca3d9112cfc9c63c23f3d9fe GIT binary patch literal 1228 zcmaJ=&u%D zVIj!C3P>>j5`7YFy{-L7tfxxDrPP(w#|GS6{-&g|soN34` zbGfuOvd#3il2=~lxAMheHeHYlavsVLFppsxy%Df1(r|fy_hF~DyR+4XrGUgDY%R3T zuCW`zI7_f3+X&oeAWvsw+vp+M7RRArmU$@K<{KO2fnggU_oh>jtqB>V&dUXm`;+n5 zJVFW9k`3FoM!jR(ocez30`nHesJ%;$hI-s}I6=taHxVNaC-{tkG$Q$EJ?SL;?mBi5 zk;VrO?#z!8Acr2(dv&4~i3L}X)0%B^;-Gxd1>+OxDE`<%?gjXSgldQ(>Ne4VHD3t- zS0wyiagWf&xK7C6FEVdmgpM%assJuyas{22(6@>o?T_|LeG>nQ6dqx~-2~bqAH}@G z>kq-7f8JQow<>t90@Vw_Rqq1SUq`#<`n=gmA6~@WFxrVT1DQV_f{k-=Ua#Z&{Q1Q# zC$o~QV CyM#Lc literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_mms_get_content.o b/hardware/arduino/mtk/system/libmtk/debug/vm_mms_get_content.o new file mode 100644 index 0000000000000000000000000000000000000000..63abb06bf9f1c052e243f8c90e8f8e6d8e85f4ba GIT binary patch literal 1236 zcma)6&u@Zuk# z|A*dsXyQMhe}%WEp6pHEV|ErwJvhnC_r33ZGjDfhc0W|iDq{>(V~~bP1h6B6NN#LM z!vaJh|8;R|(R^P{C2sa2DYz5)o=(9@@-%;_9Y$-hXR-R{c04}cgOjCGEv3JJ^zjdN zt6e<)c~sq0g?wD99aZ1Dmg^3!myWQygMH!b3ryBZr3ZStIXLjTjyKY4nT&4sg`;m8 zS>sK1Bb(2!>p7m|St#5?yY1MWKCpG9k;3lw{Z@JV=|&Ugv?z(X;_ti^31yng3E zI79!X{sXR~hqiXk_tO6E_?#f@^Q(w4pA&q+gpNoW%_m68~jGr z4kB5TLh@@RpjS9up%Xep7W-tZ-Tn!>>O|Ck&0NPn6J^ z3X~7S*c>bg1U04&awg=oS88{T4m+FmO;~!42YG$KYFs(+l+N`v! tR-tHCEHctR0KZHNzb$VB*7+jz7_^TGJlrRU@dbb~ViGS7-LW_x_+Jb?h0Oo} literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_mms_get_msg_id_list.o b/hardware/arduino/mtk/system/libmtk/debug/vm_mms_get_msg_id_list.o new file mode 100644 index 0000000000000000000000000000000000000000..f1d9093a69862d984a3f24cd755b955cf207fe13 GIT binary patch literal 1260 zcma)6O^?!06uqx}OmSicCKv%x8yyo6r+>JDzbP|c! z5Y9HHZ`9%;WPW^QH#?P|-%GrpkD_*{y|4_+a*QL>H7w`I7!8c$k>jF4t5!==rZqmX z`=&jSv|LWoN3JRDD0$_1emh?*W~G8$kn>Q!hxV@7?TvtCk%r3qd-vP5z1{5=gawgB z*k&-!F0spj1WU3MyC&RWAUhMw?e-8|+ruGews|bO=1UjkLD%hq+;bd|?J))9&dUXm z`(w*8pP~h8$z9jAN4*o*bo>|l54esVYIE54Qm;EcCkXod3Sz|P1fMV=A(BS-lTXC! zmLCTYX}t4bK6_gVkVA$1%RXL<%$zI8>7E@DanO2+8S^IcQT~CCo(k{*3Dw|(*KMGH zHJ@?)GZOE7c?$Q%JRi3~029l7;XXoP?gEJ8;tGlvP}{(Zo-c|Q^@+bLQmA3#EfIh4 z^?1y2Sr5Xm-&`jQ%-(#V1pcZ(`5>egX=Dtp;#`|+%d3+=G|SJ^7)y%)*=jyG+wXI{UFwQSVk3>C9;sew9N~{Cu Nh$%cok158@{{xTak6!=) literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_mms_launch.o b/hardware/arduino/mtk/system/libmtk/debug/vm_mms_launch.o new file mode 100644 index 0000000000000000000000000000000000000000..e54db68d08177d0971361f5d37a7379ff2ddacf5 GIT binary patch literal 1220 zcma)5O>fgc5S?{CNLrz^RZ){*fdvI6gsz+tLBxgTI~12xO%9Pb7$>zzP~8N_K|~z5 z@)O|BU*Oh5CH?^X3QnMMqBod{y-D0tN7{XF-aPNDckK@qt;!e!5e!l=&j9w_B$S&P zQm_mW7=DdCi)ru6a^hAmEMJx3UiiBzr)4-xo)1r?lSnPP8?AqC$Ky*qI9oZFWaTBK ze*Iv#+r{5MPpc0_GY?m4r`5NXZdoJ!$QU1Yd!*M&rN>IDIT+hr)1D}`Oh(cAj;U;` zS@lhJE1S=!l^oCUEEFD~-7t+#A6Ob`sBp0Ns8!y3y48fR6k$=e7F=i7*hV1E5-iDX zNcS1=(Zq6$4x(eb*b~e)kGNyLbATTjjsd(g8UeQll#n~ibHKX;%QBDAg1xxmICj4? zcFYlN{Bm&sG0ecRG{tb!yO}UEjt-3y8 zgTKhyv&`*DDfy)ZJ%Wp?C@!HE!$JF_{n9y!cSQ<$EW9S-h3G4Cfs1+&{`?aegOag literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_mms_send_mms.o b/hardware/arduino/mtk/system/libmtk/debug/vm_mms_send_mms.o new file mode 100644 index 0000000000000000000000000000000000000000..edd8a41c256432c7503cfc8055ab2efa99e55126 GIT binary patch literal 1224 zcma)5%Wl(95S{BhNLrz!<&^}hSWu*dP|GP1L~J1M0B%z?S!8FN#3GSM6C4*2v0%$5 zz#s4f?7FDL55QNj0+kir!A!2N>w48I`OY~rXJ)SN<3n9*^zVlBbfayoBtp zAM8%A^84p;%a3TF2&gB#>>rRvqh|1M1LpOi=stIjHuO2&oHd5!AtSGO-R&g1uDJaqMyb z(6MmY7ag}yNLw3q6KH?CE+!Lp@lCXG7nAvd0R=7jD4%pO{O-CugqFrfZoHWvBS0QK zr1$GYFA@u^A*P&da^j$R$tB_w=_vlhwcHEv2?6yGL-cK-1AESd{~H2+r?^Mx*0@f{ z;4h+{$9PYoq?dgD7#7#ixq`j~ezZPXFYS}~SAn7)UKn}$j35fe!?1BK&in0ozF>WE%eWu}m++PIf2W*v zi9yNB<@>f9;D*a-U)Lm@0}oamz@`J6Ls0dqhEsXB+G_7>K^YiLy)fKL`q8s`vW7$|;&1rd_=LQrWqTO+wW*1lv=~!WV z^HF1cb7Q#<<1vLL*-T=V-C#H4X*S2^+3na810I}s!f7H3Kg5n?zPrbT`&s~RJHi3p z3#PK9TsYHeG;!b-4Bt5z&ncCAvWmm7AYP_)W6Eqsap8TjSe`0e>8U|)U+ ZIyUuv4quAyV0se3LY&8ownZ^skpIRNrBeU^ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_mode_block.o b/hardware/arduino/mtk/system/libmtk/debug/vm_mode_block.o new file mode 100644 index 0000000000000000000000000000000000000000..ef4df3f08e053ab53058ffeb5ed6b18c4bf14ed5 GIT binary patch literal 1204 zcma)5Pj3=I6n_Itp%Npl)k1A_57lggoh+3^VoZecXQ^%_DI6L-tP5-eEuzcRlz8y! z2k@I1Z~YMc7Cl-$antvh9bkL%B{T2$e($&QX5Y+wt=cul7${?4z&rvd${?1X3Jgd> z0#ZMdFOv3`%4SCIfuWtl0Lf(JYcRDI|SlfuCStB6$tD z8#rixv|s9z`d5T_JptYk2u#&gvGR+&2EYF*o_us#ea=Kf6)3L({m0xGtYJVsmA1G# z>0{Hp%HkD<^?88kYF>lQP+rz6&bX`Vt6L@oQHTS*K~fcQtVUSqEU0hKaVVqsbr4Wr zS0Xrv9xU&`mVm7;aJy{cRC-yiHxA9P2pr39?3HY%QL8npEvHr5v#Sni-g?5p_vqk@ e^2gwWmd1M2w+wEA?n^oeP(Z(d4Sq^79`HZ*k$C3- literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_mode_unblock.o b/hardware/arduino/mtk/system/libmtk/debug/vm_mode_unblock.o new file mode 100644 index 0000000000000000000000000000000000000000..e17ec04428e46d643053733f707ce8b284fe2ba5 GIT binary patch literal 1208 zcmah|&2G~`5S~q(CM81j2TD><@u5YjLRU_SM1+uNnjfdaZKNiLii>d)i$pXHI2+W6 z16Lk__dwkG5PgdtDV%bH8Lu~WePJc`9U+`hpy! zAq7i6({Iw&m+IrJ-iMra3D;}0r3-ceX7V7}czcq`toGsh?o59Nxj&b`uAZvRl{GWw z=b=3u^;~;$);S$@KLD7O%1b@h8cn>e>rHhtpVzH{aP?iIV00kCa^iSqH`i+1(!V5bEOu@qZmE82bbfIW<7SeC7`jo32=d^{Zrr-N2_()Jbd z+*2;xa{;{P2nTp)JO=KKh>*I#i@>|1;m|!p3FhLC5Z<6O5$;%B=>PT!N~n|zft2c5 z4KNukz>m-_2AIru4CrXdN9#$K!fz|!akMnfrJ2w2w*lnQL;A2zciR$>fFGUU%xx1$KR15R~a zj^P}6u)GVK0ycZVt%`wD`KZ!p9ve{^*rwIoFI#rAUT@XfcDuZ9)ofC|cZH2_(#BWi cO~H#_c?z_6yV2lAb1{qj-06o_U z7aTzbHbH>J=h)L&>uv2vDj}AJ5%IeCu>pG<-xM(`-Vxz4y;xiXE(BFLj5eS5lF9fG zF1Hr%8^sgI{QA!B_A0-BmUuxA1@%OojrFscWsLO~rmdeEwm~_yS}jSL&g9%0nATiU zb2&*H*`{=$Ql?rk}&O`YD$_>-#kAP*7hRf}vhuzxI;eH1q0f9x?b|}Gi z*o|P4rC6HX3fyNPPv>LX=p)*ei$l&V^QCN?Z)}jAv&jAF6l7~c4yp5U0p!7CJT}iz zg0*DBwyjbB+%~6l@c*;hD5DlfJUR8b=W&9N$8RD=Jx=fi6A~iDXg%o!9QQmwh)DLq z1%DozffHDB@gS0wJ; zawA+9cXeC_f03>Bh3g0dz6v0Qn=2T+hOsRibiNo4>J$G~r0@h2Ga{bx{kYF@H6DUL zbPV5u&X@Zx?!Q`r>V;runMTGSiF3`5t?o|xu#@-G=+l2++Il_&(lUw6t=IKq>-+Ot z<_dza0eeVEMQgSL3?8{DXQsZj*ZhI!Q(xl&YU28%l?SkE!|o}_T2;ZR{H)q+wUw(v z&{eHfDQkMG(dg8>dbeEB>N@G@{o}jT@nu#_c?z_6yV2lAb1{qj-06o_U z7aTzbHbH>J=h)L&>uv2vDj}AJ5%IeCu>pG<-xM(`-Vxz4y;xiXE(BFLj5eS5lF9fG zF1Hr%8^sgI{QA!B_A0-BmUuxA1@%OojrFscWsLQyY3rwkZBS0FR!dT*GdZ^grZtz; zTu#zPwkaJbdF6F}KVK|nrGi|L^H6?(a>F$GBVbvi;d1-vVYha4xZijT2DFw$34#vB9eV@ z!JkP>mcv2%RUNNIdCnE&wB~?$4@dLh_Zrjap7;#~7%tGkmv?BxA4`t;wIww@1xv`iv%>vjFu`u_Zu zxq={Uz#dXk(VFc5gGX-4nW=B>HGkmw)Yo``nz;UGiDv(Ip|kPU~TGQ3J*y4DY*%tA*S)t9Fvbf F`ybB;hm`;T literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_peek_stack.o b/hardware/arduino/mtk/system/libmtk/debug/vm_peek_stack.o new file mode 100644 index 0000000000000000000000000000000000000000..d2bf8f79ff2295e3b62b95ece66b092e7d7d20cc GIT binary patch literal 1220 zcma)5%Wl&^6usj-NLrz!RZ){*fdvI6gj!CCAYw!F4#jP%CW}ZcjFVaSb@rl?%>{xCy%bU(#$#c+~c|98T)i-uZO3l+fTfTI@&~&Qnx);xn+*smAr@w<{xx=mt@~mu&JygJ za+iTV8uz)~M&z!*u4JzBQs>TF4*H?ZZP44J5$NuK5^`tsEa;s&vf97<_OEZX+cZ zJ+rE?g}b10+rc4&@~2)x=enZcyzs;79oXQoaR|CuG;qrA6>IeaW6=aw)vOotrd6+0 w8s(3%>V!Z literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_add_contact.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_add_contact.o new file mode 100644 index 0000000000000000000000000000000000000000..74f74ccbdd9bcb904cc38d4d5a4963a57378a1f1 GIT binary patch literal 1244 zcma)5y>1gh5S~5%;5Z^UQ3!T8!GVHgW3oC2OGGIE$A1AX7{xB!9cTN5E#cUlHwcS@ z7vKfxcnLZe^fd4khyp2e>B5Zn_G}W0thD=mGxP1t-R$m%vQ=S>ff@|bFtY%f(um}z zf;22b42EA4&l1-AlAgNVjp~KPr5^^;IExfF?}*M<{q6063Z#`ZonlgW4& zj+ag}-FOMR$K_3&XIfPqLp+E2O|&O5#xLZtCg zLa@r?1jwR?^z%AZi^PhX$Z5|OIdM?F)hUw;=_vllN9hIljD%{aq3Z6T18WYI{~Ho{ zx1>kumZeU~;1t<>UzCne3se9JOm3nxj=n26>H88msZZ)(k-}pPjEVR|W?^IuQn;1^-+Xq`N2c*0jJ7^Ake!W(;nqKKS+5cJ&gNIQ zObSA9X?jMaqCG1bgNMOh*|%9PX}f-$`ns&)dj8S!Hf#vk=m58hCN72N#l6~r`5z_N zRjamJu~vgMGdTeFpV0g@;RbD!B+?A+F=ac|kTF F_+OK|hCBcO literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_delete_contact.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_delete_contact.o new file mode 100644 index 0000000000000000000000000000000000000000..a130d33c3c4a3c20f6ff6e37849bf0eb4bc8e009 GIT binary patch literal 1256 zcma)5&u#e@W>;N_#oMh+w-uJ$pH~V(xUD>WM#y|}QX_!U;&twqJ zj}2*9geVL?#~;P*wAixSvSG zI&iXdsu|{UNdNkAX8!)Ur3wZZuYRe#?m2@_(`kDLp75Mj|4_IsLHTO2xMim6{Ug8S z`6IKM&6;*sc;<$cvtH%abDNtPGtcup2Zg(6cRjb+1(rb?F6`~xYm{~#tk)r;McD#d z39Yir?5dt%Nw&tWYj+s%;ixCvCZg~qb`eK<*sR18?#nUV$9@3KFZ$@P^ti*kWdXZRNWd1SaYEC zZ%E|%l8W*zOP{iVj)~d6C?BCVaRIF2;ueZA)Gpye`-|g4eNx|w6iS$QPb3&>JrygQ z)kE;-OzDLB_{*n?{!azUhafpkBV%CTT$*UJtCK%G&QH=9)A^W=^Z5{@rb%S7USp!2 zUtgUvY0%*UaHQm-cUCkuvp3ndr_wr}sgEy%nEJY`;XL=^@)o27q}sskqJ>l8aj~|$ zXU#W*Q?+-u3%0Xcsnp92r%~9p%MN*8c*4Q^>EI3XN8rpYh5Mj>CUJ9gwi1f~HsTr{ KpeGdLkN*qx>x#et literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_contact.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_contact.o new file mode 100644 index 0000000000000000000000000000000000000000..2bf914c74ecc4534e907268a35fd1b925bd276c1 GIT binary patch literal 1244 zcma)6&2G~`5T12@NK;YLs+6QyU{H|~LRU_SMAZY3<`-}YYI4ZUIH^SM8ts? z;03tx65Mj&&IO(VaX>1!-pWkY>x7m=SMq+}%zQgz&+hs|*{U$cKn(_Im{|ZVX+-i< zK^hhz2E#9jX9??lNl)GGM)k`&+>L)X^^6Y3`bj97T#7`~Yr}~)iB)4yW3^AMWHR1` zDPSaE&c9XTHg8=C-#pMxN(+4hr{C?zm372P}g$QrO>n&@Ame*=#^mi?Ic^5?*Cj z*|kuTrPw;Vq1|J^N8`S5+K9rF*j3DPUvuHU6TlA~;Q()sM!>xR8KlnfJn+t--**pD zg0;9Kgx6~y33udw)CJ%sYN*9gUrT*%`J5o^^XrHUJ|~!9z(6D)ttVX!pF6%CLZtCg zLNLqi1jwR?^z%AZi^PhX$Z5?MIdM?F)hUw`=_vllN9hIljD%{aq3YJqfi;K9{|$*e zThgO+%TlLgaEffcFG@$K1uB39CO6R;N8c5E==~D-P@mMdB8A5o7!&b_%BO6F^ZqdW zq1OmTX!_-WiTUR%P`xm$&BDkSq;M_;zWMB=k4)o17;SxKAUhim!>xbfvR*Uroz1UK znG}TJ(sYkVMQc_x1`mU^vTw6o(sung^>tap`TV8j9oP`CaRA&Znm84n7i;x>^FK|#vl!|2%s&3 zNNy@f!!oFl{~UiDx89ahiR-;c3U0=}r&Dm8ItfL!l}I#wF@K~SsWtVHTL0MAw51*# zube0;{W+w6{W#Ts|GX>Bd|a)4slFcA2fdE{!sT{%G~`Z~+vCX)1+`M?zMgK54!y4H zP4rqOqg#FM>f2`4e3jkG=JT6+&d3>ADBeN2<2s!_uuY_q;@$2aL{m42CzNfYezd2S#@^ z7`Q`}pqJrr?)5u|+#UNb_8)K!HMGT1UrYPk@;O1+=a&&^J;4 zgh=g!fM68I36Q}I>F0IQi^P(f$myAFN@An=v?&t<>8Sp|N09~igoHd~lfHFKpyz?i ze?ubfmdHrmn$SrZoFZ!nk?^FD^vYa*6(=__xrDhmc3R&mcG@TTu1KMPh4)1KCVgcr zaXuf0KeUXXg{JO7i1W`okY5;*vobOUS8yx@x%t^iADPyJGRFEWK(<&9PtSWM5q?jD z#Nzz&mI*-!&cSV@q@rim6$VvNnvS$@&lci=AJe|BDL9_};Tm1o;IOd|hE+0gC_X9G z8++zI)L_@F#!k_)8`WyF(z08{9jjuKnEnU&h1&Ryc@wbDHlrmKuqSZAWkhWmfbLlm KFOfwt9{yh=kBqkf literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_group_list.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_group_list.o new file mode 100644 index 0000000000000000000000000000000000000000..d375f3603597369d62141bdf71e573a0e59cb3d4 GIT binary patch literal 1252 zcma)6O^*^m5Un0Qgxwg}jYhzUP81Umw==9nH(ul$)LAhL2jXP}cCru`!C^2G4R_ma27pRRP6<% ze*IuK+r{5MPpkK&nVX}v)9Ra{IqrAOBg-+5?9p^=9uFoC^=qZl11;4YP3@j#&$L=5 zqZtFo(suQ%{yMvp-P=oRIiBNLDBMMP$Le$kz|sfc+*YaeEc zk0N=qc%1+lWJtfPlU^j2SVv6H>=KDV>&50sOr)d!LpKW+;4=d9kRg5RNTBCf^4}1M zyCoQ@+Y&k{gTIK{UL`!KB)zi4M{#i-$qnQpIB0)S9CS|dw<3f*Ha-w=L;A{E=4IXw ze`p(C_~!0jiR&*rke?soi#8$#D$aS2TV9>?fqCC+V@>yC5vzSaBo|FY!ta^Kt*$R` znGpEk0&s++qGz@h24&Hj&vb6jSL&B;P3O9$;Jo(3;x)_#F!{Qm&UC$g+t?I3v?|cMQ|BZqKW^6 z2mcXoy?OPZe}zZ!WN-T3&JIg^z?bZN-+S}DdGm8WmaPh743sfQLf`@HODB@`1W8x| z9im^BpDkPOOB->c14->WOk(HJv(TAt>brXN#bGRVtpk&lbK?k-lOHT`RQUDto+_Zw zjG1qG_Mp?UPaI*Nxc$+`QLd}Ji+{gK;t+_7P%QijzPjy#Qf&2p;v*|QjU0_>CBl&~9hmF$S?sgp(LONSyYua^ogWU|rSe&i1+oAgm z_;B14%@(3?C3X~Zol`EHcLMlvQ#66MhC|?PpBz$WcoulO-|IOzO^&sAQwX=)8VP5p z7WaR=gA&@>1z$@0TlG1C=JQ*Ki#{j#h8+eX#VDV2I)0nJA4VkmAYt0dV+2THg!HpI zRg1)mr;$_64h7L@ybX`ZhIG{b#77wg_>6>VC{uN5ZCG=l;$M--J0&AZw<>i?27izp zPCZ$ZT+)YT;yMnV#^68!Vi{eN7q}GZQa@g^Sh;OQ{@)gd;HTeBk#R;fgmGQc=!Y zh{66eSMJ-(Oa5Emr+r-wVLRvX@-`#{B#wbw#WXhg=f!I6AU!VyY}2Y0@|InzRO;o1 s-N+ZLvP~KEcfhx5<7;!rV9zP*ttpO&p2IoDmH-|juH%JzN&uKUysW@s;EN(A#XS+OX_D4s-{ws+P6*VSV=3d(nslRHYsJ~jGTu2LtIlgb)yd~iLNhycKWDUIz2gRfL{o* z5Zm$YvRmx7C(2?h&h82i7|7%4z}5{!+j6kSJl1ig{|;iv^$EUXLP8{t=94an z-+>!@5Xn9|uo#_V1xO)7`c)mTMPlwN=+m5IBGG6)aqc+-=_vo$MTZ6Wgbvl<#_QIQ zz?vh@e?!N)V-CZ05l6>m5WvK0U$~A?Sf~J^xVVDk4dk}*qu&?CkNU*-iZ0YJaY>GA zd_5j>T;;v+=P&08J@cI}8P9(eDDMS2-=#6w!=SVvR#zvzZ=PSIF{ble+Irp#hsz{- zPQB)WTVJ2wGDqNnz`XaQqB%PPgJ+AmPTyXv#c$l0`Wg{%-0*ni4(!{o-vwDMDmdhy z7Hjo0Wz!VUs%pKESG9Vj(kM5zX1<`7HJU;H4)|6zd~Mbgv<+qF{f*(F(_M>h0jP*^ Lyil~aC|-nrFtV4Z literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_total_contacts.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_total_contacts.o new file mode 100644 index 0000000000000000000000000000000000000000..2c41c1f0a6c130dc2f703eeee1ab7272201ddbb2 GIT binary patch literal 1264 zcmah}&uR;ilskh$rz1^K<(}ehvneTh=eKT*EeZ%Lv-e8P@GzK}Cc>q1ni4|Qz z4wfJer60?$mi14yZ2G|hY zdarWv`>e4e3;CFAo;5yO*0xJ6b_|U)U~`N}Fnt7kL57k5O*grZoh%i8NN;-+R)n?Y-FUz=9HI3AP$tW4GAt zNQ$LdhTT)P81Tt-BuooYI35lpbL>Md?2iKYfhkPj)?@2qjpH zn?g84>qOY@!Rhe-xBDoeD_-!WbkA>mP7w9^9mIss3C=O0B2tXjlP-?qq3=f!$-a0H z%--h&$YX@`VV$f+V#zh+v_^h6+AoVk8tEwi+(#Mzj)ZDRlXY7dz?#Q0{u7DUTV6!! zRy>`Q!Cz#(!1HR7OL`>~PvYhp1{X1Q69=6yiG%J*{#K;0i;1s9e3NyhFEJdC!XG+D zU=g=^;Nt$_3REu&cV}s23{;$-1+nn%q>s7zAdUX|%t3ZNAH~-iHm{x@gs$%|yUY_r z;D-BMNkwZ`73QK`PWNU>2a$Z)+H|ig3eIyMFYm*KfQ5`6{u%I{8u-$jDHwB0;+g1f(|FKb#MBZ%4KahwM17aSCin;B Crjh6X literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_used_contacts.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_used_contacts.o new file mode 100644 index 0000000000000000000000000000000000000000..b6c13dfbaf9c954568366a22f70b22b19397465b GIT binary patch literal 1264 zcmaJ>O>fgc5S_J?khDT+t0IzOfmMn~2(|1ILB$2~9g0g(n?nysu9H|K5@}Lri>Nqo zMdBB5=Pz*Uq5pvLD>#A5tv8tQdXuzLyOQ_4dGmH>GhXLY#jY~OKn?~Om_z_?L=epf zh78O?9ERVMFO&AivX)-%#Q+OWc5r2~dtGI1)rD%BfX z=B0jcYIdVou$@M=x?O2H%|g+xIAo{)1^h}K{LcJCa4st-`kKZ=m+@?=Spd3gOL&oN Iitz&c2M2wSJpcdz literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_used_contacts_count.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_get_used_contacts_count.o new file mode 100644 index 0000000000000000000000000000000000000000..866c18cc27bc35ebabe7ed10b496bf74da63f15b GIT binary patch literal 1284 zcma)6&ul)5_@i7{UM zCp>ubU+~sL{{!`ZF!9#ZTW|Uvy92a`>LfGY_rCYdyxp1E{ZKY4j4_anfey0>;Dr|i zvlD|3OAvzG*X1Y6#=BA?w%!XS;CAr4o`941Y3@)t3{}IA!?jPXXmqg$Cy`Snp}hqC z_y@b$Djfehs%*(ZK1QlXl{W+Ppw~8E*}@#TcGv6-_l4CFE|Sr{Kx4I7yr=1n;mGOO z&RDA^lbX>Nwziedq+e%JnOtsD%knJGK>jY;E!%4Mfo&oU=683to28vcsRk@4Ar@w< zfi-r8T~(tj#^UU{a)$wT#{*%t5ryMnPcp~e zk=jQOrlWVH07+EHKkt*Z$SippIn9x0N9$?WWg{QuANVNsFG#3{Y_e_*1*~}>^>0YL z`{gOpx8nJv4OC3Drjb{ZLh>tf`Wh~tMsX3f%h>7pBG_r4x%73y_`92OxDO@6|J=+WGb6 zE%OX2T!L++J9Q7_~TvtFq*%1yJGFBoN$CeeQazgQE$IcE&!#l`7SX|H4WA`cOxOL*>xalBk~ J52JV~{sM`?nZf`7 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_search_contact.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_search_contact.o new file mode 100644 index 0000000000000000000000000000000000000000..1dc14553e1aacb3d3d9af4dbcc8c5969edbeb61c GIT binary patch literal 1256 zcma)5&u}&cO@fvvlB5c8gM)I!!j}k92+NkB(W5Zq^}H)w4-P>`Y>Aiw3kT4 zI&i#nq8a9MNdNwMYX14Pr3wZZuYRq(={bW=%NcsE-|jf={(*4Yg7Vd3am!3M`iFko z^G9Yin>FpO@XQS>XT8p?=QcMpW}fGH4hnbC?s{&k3oL^)T-e>Y*DUQkSZ_c?i?Ri_ z5?W=K*;PHkl5CA#*X}Uj!%?r1Yuek8u3gG*$aDlgmL*Ra&0&?eg9(cRo z>v;!g!CKrE!tb^Yg*T*)pKshi8?`wS*s0fh0VfCr{2JmyzzM!#!bBvE-X~uapIbq! zBhvUNVKU2K3XnyG{Ifn)i_D5!$myL85^>Oai7}HC`6z!sK&b+JMnW~zP<3l4V9kNj zzax?7ODf8@EPcubIwofOqI`tf#09X5i(4qhP`iW=?JtfG^+|mzQYc~K1Cd~;^;E2I zRu947Q>7E?<1e2o`hOKDAA;mGjf{bTb7`W@u1@~&I6p~aOy^@d&gMgqnkJFSdd-P; zc71iqq(O%Zz>$)R-dWMu%-&?*o=WR@rarz5V(RO%hV$Hu%iE9=klF`s7cHC$kBhbX zt~K8bPSvh&7i_0qsWi$>r&-vx%MN*8c*4Q^>EI3XN8rpYh5Mj>CUJ9gwi1f~HsTr{ KpeGdLkN*b;J&Mc# literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_search_contact_list.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_search_contact_list.o new file mode 100644 index 0000000000000000000000000000000000000000..e6efeeadf6481babc27df154955f6e2cfc84cfca GIT binary patch literal 1276 zcma)5&u6<$LNNOnc^qlHs(g!YOZ$U>bX9s^gL}bGijYfnb(-B6IU42f1%>1LUr4gKUi{Aa_pA zgWMaBM&>D6u$F9aZVkH=Zrbk0{RiAc4;^*D_0oB_T~6S0`3=Od%L%?>B8f;E%_m<7 z`&~EoB2s(nz+!ZMD?k<%@~`?tEiwzPAg4KdBx0lWq&ag2@=^Ygi;fEL0SVO*P1LQU zfHlvA{soD1#~elYqK;44Ac%?8a}hp5&%y-|!^IU8ub{Sxo%R>OPUj@P6)Ds)@s5bw z#CjqYxT^c$*KeT{dgouhRJ?yxpu7)umT6=RZsAy2XsfG}-#^bU(io?f0kZYH59p#V zn^Ui~5Z2chx6CnkAqezl$VGFuJPeMU)O@6K>#xNVH^$?Gs0YW(AFtel6o*tFWUZ{= zP&_Kv8^_8&W`M40jZ#t58?{=q+R|Ial2+Ae!ZVZW_)>LzYt|I>%Zt+XD%j(=dAe({ Q4FC->ffwot#ds0^0D}^iKL7v# literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_search_contact_syn.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_search_contact_syn.o new file mode 100644 index 0000000000000000000000000000000000000000..971cc0ee6c32c7bdf00b2bb5ea3d9a68fe0209c0 GIT binary patch literal 1268 zcma)6O>fgc5S_J?khD_MRt20Az=9&Bgsz+tLBxfo`6}QN)a1|ul5t#%L?TJCT|~rz zD<|&U`3u~7;2!`I{{aaJsoZ)iGg)sEB1P&*yYuGF+Z}s%?DrM3$`}J_3^Fi|0G^8= znjZ=>Fb{Dkd`Uh@n(xZ#)QxsD4Yw2DGif+UpQkC zWZ_gv>n|Yl`^TC7=hr=1EcA=DuhlnQ>#*IjeAo7zw&nDDf$apAKj@LBRw_NvGmZX{ z=eXWLuVu5k*$G^I)5saGa~rurVO`JjJkLS#F3N4!ZgqgIBa9aJcJDXKyN@;+5L4nT z!ImQ{>>|6YYAnT8*)`=31MUyHf!#tMc*3_O^4wQEaNh>N5A47O-tv9mUY`O|=Xf5t z)9-fO9!jtlw}Zgzw2lJTrw2cuT}K%mb1an8SvNyWE)wD^=o29(_Y)I3dg5q3>EbwU zg|UjB?1ONlSzIYV78%k{>SQevOKc#fHJe1D(SGS65)K=hYjq;5&*qzqI{?2jT*lS0xf6Z{HpZXh{_ToMO8-y#k=C;6@jp^S--1VWQ_ zWi0(9AA!GTk|(bYtB)D=zY3I(z}0aY5d$6PEgZrocPD*xn3q{>VYoRC5KZSJ_{C0| zsP}9{P46$eObArCFuYe%(VAt2fjL?$&aE{S%hslIT~ctK`SEfG)&f{N0B)8HoQh9N zJM}$d_5!eKW_`P8TJ>tRQE6Ju;HFU=c(HM1l>(-w{tUU(V3HV;7k Nwu;R}@1d literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_phb_update_contact.o b/hardware/arduino/mtk/system/libmtk/debug/vm_phb_update_contact.o new file mode 100644 index 0000000000000000000000000000000000000000..bde13c9c9c253b221d9364c3da5cb82310c38aac GIT binary patch literal 1256 zcma)5&u}&cO@fvvlB5c8gM)I!!j}k92v)YB(W5Zq^}GPwZmvN`Y>Aiw3kT4 zI&idftQqEWNdNwMV*dHHr3wZZuYRq(={bW=%NY&!UEw+H{(*4Yg7Vd3am!3M`Xj&X z`D3%1&6;*sc;<$cvtH-cbDNtPGtcup2Zg(6cRjb&1(rb?F6{2yYnFB%tT!N{McD#d z39Yir?5dt%Nw&tWYj+s%;kYN<7NYPab`)aFQFr(W*`oFEkNYlsU0C-{a56OlA}pL|h#ZUwQ9 zNaLe~=`4RKKo%A9&-+v@GAnK&r*}3;#6jyNCQMG`qx}5sVLvF^eG$Yn3(U2@)2rN7r-hmZlM@M?Giq;zc@bBC-tpJp@fMKM1rB#Q?bH% zJp_MGluoEmzI>+W|5c!T2$HijG6n|DrKvW*I{Cws{4|X*osZc#oex23mP97&HK*F? z_0=hp1|2Q{M@lYwXGLRkdy{>8Dy@^5`uH-4sjtf#&Szd+-iDNb)IM;#XyH_NT&&f1 zt+UPGRPFk9!FKAEN~7F#nuTqvrMqI-K K^n_yk@&5o%PKy8l literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_delete_process.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_delete_process.o new file mode 100644 index 0000000000000000000000000000000000000000..2692f9f540412edb7b7e71fcdffa9b6a1529684f GIT binary patch literal 1252 zcma)5&uQ+qQz`Dyfua z^n|T#>S_H|dLy09u4@^d;c3X-L%U^Ltsby-q@mo-_Wee2`|(B{7L+iHu+`v2c8OgM zs4T|f?3!|i0UwSWVYLv2>tR3Z;K-jeI|7_RMN87vL`)QA#`%i|jD8*`*HK(V?E-dMUlcp-ll)htu!V^aMEoY}%2?v89)zF2rA`fPO%3f+b(!RZziyc3veO*y-Jp1ADHmnI)>i{fgc5S?|LCM80o<;w|QJ`|KHba6@~B7{WKd^i;@k(wMTRLOM`tBF)6!EsR| z4xG62XONKSkLbVP*utqdn8|vRP!%!K?tAm*dB0QXEr*MAfB6*^m#Ld`NtoCkK({6U*{Q8By51C)5XFs0E#U+}W z`N6Y?UjM*8a0A;J4(+bf?;N^lFiWMEdZsZr^4qRI*3E2Iw|arAuNyhzeQqsRD6Hyv zp659zK1aLbI;|eCRix44&i0FDd3$TE0Sii;EwW|x7Q4;vMl_aUY4%Wg%7Bl?Uf{G4 z17BcQGT%MqfqNVP?>K=2yfqpD_Xm`aJIC|D+XK&Y`)I*l+zA4|*E$N^k$kZK<0G`t zmM(-=+ShW(3Dl6^LtG3w!8a`Eh@{c=LF;J~CMNPx{dI^!1^9x5ddQG{YbapPq13-45obv#(zhgh(gtV9cBh%>Nh$f2 zIh__aP`rlP4IFfTNgT9K@>!9BfrZaR!jOGsE^%I0;pcCu6GkT8XG-L+4pdhmJu4$) z@BnApQxWs4lRrAC%PJmW&}Rv<%XM|~zGoKEZ(}N4USFOvVTeEso*^aI299NgK^0L3 z?c1JA5GnVX3?_i)oP>Cw423E qt74Oxeh2u4+W3w6W3aDoMz=(Jn!+2Tv!o>e3W#YuM6W2vm;VO?v4@%f literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_get_current_handle.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_get_current_handle.o new file mode 100644 index 0000000000000000000000000000000000000000..b8a13f12f2c33c5d87285af820ba103ecf39a7cd GIT binary patch literal 1260 zcmah}&uY89e#ZHz=A~7aP`PsNFP2tdZ*)FgtBn9fS7>OqS z4c`1my!GbQgZ>pB#go11d&~}tB-KfFzVChSn|U+C4DX9pi7^JUF-Srf0UU}Tnwc1q zuml>!J}tjkw%!&t;zk>i>Q@-+m$3`wLMv-~TIJ=juHR_Gc;(VKf#mobOPuWf`2Ii^ zkXY8suer+7PG|vEU_PbqNE^w^H9pCpljiK)j zDkaWUWoUoc@Hl1Agnr{Q-$h$D#9-U*oY;%5X%p+f#y zpR7e@$xY-mW`{&}fe-@xn0X`z38nVf{v^T7IF7?ky#GMj~^sNe?w81ZA z$J0pEq>%i|jIQD2CW_ZlTfvXk7sHRvN$wRXWHIr9NYG?m8B3hiRrvW^>V%O=^-ziY zRe|y0_?I?-OX8cwN$DV v>vlc2YZYx8Kz|MRQf+)|-U#fgi_-GweB-$IETX;y@DyI<}8pb literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_get_handle.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_get_handle.o new file mode 100644 index 0000000000000000000000000000000000000000..de1ec17da04578ff28284118ebfffb3e9e20f4fe GIT binary patch literal 1236 zcma)6U2hUW6uq-Rg*K_QsR~GR)tXSTlckclF-GMZbt_Hbfwy&mO(7{zm#vZb;EO*( z|A)Typ^1M$e}!*NeX?(QFSD~y>VuQaoO91TGk2K}K9r0yV+>?tkb-Fhup@#{c4A1u z5`;njy8Lq4cwbD$Z+AmUxEK1KO2TR4Og~bN!j;I2NcD3w7F+DXY4l7!rXd$wzKtwCqs#$=^Xc%-K4!$YTSJ7cwyPOC=Gwbd;x zqrJ&&W^{c+&GIbIK<)wBE!%4KfNdZR<#x9pHj3NNH|wyVgjs~G2G`gXb}bNNah6~= zl=}?$Xxw+L7NYA2>`La?``oqPxxhP?YXNVKM!=mR1?0}~Eb#WQ-?s;7!CKsMU8mPN zbnTJ%qy7VKqKCG2!SmAo?s%La=<(}_5swpm!GwxP8qFtP82eo>4j@wdD8L`ZF#@Df zA^)sT)*`dy8giN=&x_Vu!!8^7DF4($seeL3HDr@@t0-X21F3&QBJPw>q;Ey|qz!%} zYxNg?@_89j`PYbY+Fb{RW;Ulcp-ll-knLC3_Hh}UFY8B3higYfH*)CmKV>Qg0f zt^(zQaCMqS#vqR4V_%zHo&2Fm-cMtkoCe6|^Fg?EE-&gCzBa$Uyk)`=fJ>7zA{WhB zRTw<+=Zbx6%*FI1snNc!C^%kxw7d=LF06Ne8wCxA+^a&hwyXWa31-Ep<#UEvE0^n~ vhS|vFjgm=5`U}99Y2w>*#$aA7Lf=697{|kXh8SA{C?Y2C;?Nz7;er1JE82x6 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_reset_ctx.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_reset_ctx.o new file mode 100644 index 0000000000000000000000000000000000000000..a81be3288c60efa28e8e39114edb893abd57ae2c GIT binary patch literal 1224 zcma)5&2G~`5T13M;?hb@ODmj$z=t5Egsz+ti3lMPorNENxe793JTUy&g zJ;{9UJrBIg0Qj*RxWGH35paJ<4yp6J0K7XK47^j6U@h(jf#2_(2i}Md{(truWz^Dz zNKSoiM4Uj4_yfenh!cFpgn>vgT2DF+$CJoUAd-C&FrCHc1IS^7^s_oyi^P(f$Z5?E z1<`1~^^l2)bd-M`p@;%}K|(d8$+~nmta&Em-;s!aNkpV>Rp_J)u8|!~JyDZf(knA@ z+T6t8U5u^Zp!210P@m*ok%Ebd3nG!py3&_88&~1?9~mc1gw^9n;-3nXS79SgBV(ZB z9N%|#chV=re7qzH^xb2d&#Pd>No1m4bsC%BU;br6kbpZt?~qiqW=&!6N~FS>`qrHD zyOB?QT~(-w^N*HyArnC67`R!sfTGiU=dMYg7Dm%_|v>0A3yeAE17`D literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_restore_default_event_filter.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_restore_default_event_filter.o new file mode 100644 index 0000000000000000000000000000000000000000..67bd0da53a8d6b9028951009f0b962da976bd3c0 GIT binary patch literal 1300 zcma)5OK(y^6h6bFQro1o)(F+;U0_1RPN0%Vj7E9Wcq>U^(KIHv7nl|jDD^TlC7QVQ zf4Fz$uKz*(6)wfZMR$4*bBEVPCb{!{=bUfm%$$4XW8N$<#y}4SQJ7c&Z!{ypmcN?3f*eLaP8VShUoAIiyUWu{d}Yo zXe@?`7ai-ob9QPuq9?nKuo~jT?zg2SF2tF%PFig#oRPek%|0`tm2Tgu3uj;yV==>Q zNnz~96Y+P6okS|NZ6tY;Cm{U<7udqCwSa9S^`{T^pH_4Gdpi|a@&wp2+wg6&+w6`v z#KLTg-S<3Zzj8JVWRN<+lfdiUP6rPR9CLA7 zN~cxpOVQI8{XafH36*)tl~S!sE+_E0{4V0M%L)Eqz(6D)ttVXozlW~vMWpdT!FX1` z6d;Bk(ogGjE)r`VM^0;Y$%%vZi;kF@NJsIPE-Ej;XC#zE51p6phB?o*{~Hq3U&^C( z>q@6(;Kjh<*it#kB)wv1RKDEUF~7g=G9~cB z4S0c+RJ3Np!=R=@qnYYkuj znY3w@3x!I)YE{!2GjGw-Qz0#Uy%xSdX8_hB2T`>Tb5k61Gja7O(Agscb7)u!HfTZ zM{oWU-g@ZWizfaL-kN&rP2Xd87D7_vOJ=_Bz4y($+1a=Ip`un9V<3z{8s;8A+jT;@ znIH{o5QhBM^;hfa`*JdVuOCXn!_fD15-t*#`BUjMT#LMn)IYalvDH3YL@%YJ{2J2d zKiK_t@%-0WbypPfFj_mSo|xL$93E@7G3;sjc&yn|TQg3Kp@X7Ysq|D%H%AkzYgkjc zmdVKKz%k@qC9Ay6?qu`%Z8^ttJPU=#DAx_WGXS=YG*md+f6^-Nzu0NQiWFuMwi&#^ zZn9f}7>lz6+maqJ;P%vX^bVq9x!4!XGTv~5dM(W81*35jmvJ@*ME)$TaDk z9BXmiajZdS;uyB~aQ^{!P(xR|;%Vug4?Rv0^!RPWh{p+jVnRlw7_BE=7{>$84h@!n{^Bo1Muqx^FZMf?jAsv%6&tz!Udjz#<%61TV9 zh|q1gIw6BU$lAW=)+Cqo(n36nn=2Sx#n^QmbiODKx+n3hNMR2XpNM!S>Iz@rVmt`H z=@`BRX4QQc_g}0)^@6Z9Pa|V+7w2bwY;kwehh}*{jectGAY0A{ff{{oZavixEblM6 z%oPOS8qhaGDq6ECF*tBjvzhL#x8zSepYC--!ujftmv)Du%!ZTw literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_set_bg.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_set_bg.o new file mode 100644 index 0000000000000000000000000000000000000000..b9b8cf4e465cec3f935ce11840132430e6cdfbae GIT binary patch literal 1212 zcmah|%Wl&^6usj(#if;+1}dEL@*;?ow3bsMh!7Iw=~TFl)MQa1A=gQ*Boc0l<02xE z_yInF-#~2o5%3i(SP*tyAi=#EPn=}KNS<@;6x(EXq-_TJaO4F}8!_-X z_5}0Y*LvW-3qU_{0tfW=a0t3Tpn%*tJr8tK-IpjAHmqSkQ850^JX*8aE3V!#(IEF~=1BYqPe;q&;74pyeL@hE4ZXl;I zyChFiRtumYmG0`L@Z6EDkiit#7^1FegD_W%F@ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_set_ctx.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_set_ctx.o new file mode 100644 index 0000000000000000000000000000000000000000..798c35b8105e1edb35672e3d5898523463173b6c GIT binary patch literal 1220 zcmaJ=&2AGh5FT$fC26J7mcJxKWd%h_3AK_Ei3lM<{sU|q)Z~!cvPoA>B+`_PiyCp@ z!Xt3u&MR=ML>~d3f?HL@r8k&~*W2wLuw>7CGvCbEWBX&xtTV7oxD4Urr|;KM9vR*GYX-74qa#d z;s<%E7Lk>nL!DyOT~WRzoN5q{{Leh8?4MDg8fvJzO*CN517-h?ihNJfqIk=ar)cm8 zwXTn3O@hSN0(Kpf=g>HhwyQX4f3#oflR7J^P(X*j3B;-{`GO;8*Wvfypf3`Nid?Ed z^>nxv3_$)(#7})&Fgx+1Gr#XfoV)<2h5b6LUh>O&rf&=9SFcPGB5(zNxI8<>tY{31 zeyr@p}ktZv=1L^u5l`Qb?LO$;|h?_r94o`(|c8maH;k3{+!~f=dgaDUDEO zEJ(o|gdzKF{`I`|p_q&>bwf#b9Qv6`!g=B%d!n6$E0K*z^-D7ro9)7R^g>JO+mJf@ z#U3>CXTML&Ybue4(aLH0xNjfy_jm1~BW&l`*%$V^-kxyWv7}NcJl9k8!I9f>+>u^M zr**3*9DU6&jYD(Q%w|{g49{>Aa!+wW%W1WHz*dlka$B3v8pX|5t96*s!YslTgSXgi zb|(;Hah72Bv?mPsaMTyAHllDPb`^7-JuaO00{Bi#w1BsVL*VX!3{sms1H3cn_i@9( zF&A$M;r7}`!WnuW_aAT{HB{mmPfK-v>v4jh$L}IWJWlWf13Du4Xg=w}*dKa!0Fl}! z3H~UL6CjNq(ogDCE)pwlAg4L%+-SWdcGXBn@s}Pd|5qfGLp7DRiVnogg=Ul8|a)x-%aeazbJO9lloSqu#SPxM7*Z*DqG>CKL~$l z8-5Fnv->8lKbe8@1+UbKc1!2|!k;p^I_X2>xF1G)>C!-UJsyNdSK>0C<@>I$uWp$X z1mFgkNJ&L=7BvPNGBh5kZrj)FL(itVE@(JTd%U~@%L0~nfLjFvhuoV&wYFtU)q`EJ zYWbXH*UII3sbM#Ad8=fTd>4NU_)2YjXYL5>X$fUr{xC$AMFdCs}#9?!M!%zP{x6~-9I!5{_G2*40QC_6T! zU>PEi`?j*PVtgni<2QPtB-{!8NG0Jcah^L?jw99RvuN#0OI4S8aJG7`B(+zNI{g{G z*(#j=I;m{SLO!lmPb%*m^UyiynnT+&Uw1K4EfybYsm9>Q?bz-}tESVM(f4d^ThHik zGh3NlZd1$hEYCpx9@;J2YWIO{A`RvDb{{lLyHB?o5LO~A%3{GwY@J;Ws4UJB?3!|y z0UwSW&uSxjuE3sTuKk94_InTbzU5iK+ruGncR&HTGdv5tGjJUH04-RHTb}3k+ee-~ z^nd6-;5vG!tzq9wy?xPneE}?c2ANoG}Uh0$lSEP`|ghRw1vaXCJ&gwz<{a5OQfpPVz5}2z% z`5?rmX=Du6aeg$>W>+VFXq=ytCJ8$}(b{PSY1zNas^z^oeeLf$azl}e-B uG@JQ?Q8vlc#cPi@(!@LEj=-E>oJv#g;`m`t5Y=UX5@G@m3!N(!H~Alr8-8v8 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_state.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pmng_state.o new file mode 100644 index 0000000000000000000000000000000000000000..9c28d881ca3b4765e4e712fba29be663f8c61aa7 GIT binary patch literal 1212 zcma)5Pfrs;6o0dAae<&fFl=$78-u1$m~63$jWN;Ezv5yO+5?G)bz3&H#!}o4#>Rtu z1g|E34Nr3LBj~5_CV1nf?{#O|E+=0y^M3F5elu_O&CbV?Q)Y~TG6pFaM*!6@NMwhC z6wHDSxvz82=bR5kGkLe2FkwCMBW1#cahW^Q&h(1DqgOxg8^%l_S?*6CYM{Y zvOLQ(kbi)3&-a=gU~32y`MuqTjpFXJ%{okJI-6#T@g;VXEyoO&WGn2pw!wh+2VLPc z(TgDTZG{5=4Hy1<0sO!d9`I(r4?O5mK$RsD?6Cw~7STJXZWS1mV9FGD^1)>XZ!55$%tnuqK71 z*Cu${+(vQ+xf?j>d~{ywlloSKU}NGn0conPij|+_pK`)yGUMQi1YupzjzP zgCz`dBVuxQ(kF)bQ5xgrae(M*J`QFiAJ(HDhjw*;^_PX&7+iz<2uVe27Bv>R3+mer z4rLU-lmYd1LBl!nV0jBx1*{$bcM3L6`4@$1ZO@L1z^yp7?Y!gG%H?{g;WqNyPRS+B mp)Xu~k1oEbU;u7pYph3oOX49Oqc>&&o}ypD1{W#D3;qYchkF44 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pn_dereg.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pn_dereg.o new file mode 100644 index 0000000000000000000000000000000000000000..2d0b02c66639f8635e6920d1147beb209c812d7a GIT binary patch literal 1196 zcmah|%Wl&^6usj(#ify&1}dC@z>6TIgpQmNi3lOlJe>-cN=>9zY+NU?nnkI7!3iDqqe^UE>^+Xg9XsE`A zv2}iC4II}w1u*LM7h0h+xp4cAJJXC}Q8P!LqwVM={e5Y>RHDT@?Eyc?j=-~WjXdxddh%LXJgOqA$o3rL&03<9rv7% z9`J$f*}!|#DR6f}g3={k2Hu~H$Icl>uokyH&mHwHJZCBv^M8DV5!%X?FiQK`4mp7w z^81LZAt(5T0~#WE^giVjd>)57fk^Fh0Lwl&Hh>~Jl#k~`EeZ>+Bd2$E$iznTrF<52 zl%w%iAqFnMS0q$JG*Oq7!7~h#M02 zv7eRqA@4zc0NkwW*j3-u+XshwJOY+s9@MI)bcnq8|~t(i@W5~q%5;lF6%-{j7~ aicRb9R~Cy`u%@~O@DeeH7i5<-9_&9B6n2yV literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pn_get_global_setting.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pn_get_global_setting.o new file mode 100644 index 0000000000000000000000000000000000000000..eae2f8812bc39f160d76d33c01f8d45b5e293bea GIT binary patch literal 1252 zcmah}&2G~`5T13M;?hb@3y7ptV4)yVLan4kB0@-z{}fz;nj9)Fj+0tRr2Mqb77>BO z1MmX82)Ewg0pKY(5>E66GhT20q==Pvzi(!~-Ps-Q`eVT?GR8nQ1~Hgg0I!7+OnHJB ztbqohFY7PY&G-48h~9>n`W?pM%g}{#p_Q})t^DRV9KP0u@y4ZIhuHWBi`KKhem;;1 zB$mRZw>|5$Z?zn5wYr0b-L-}e=be7blaz9~CwixNdg1qwgn@iL>Nh zGM(PlQ%1^2Lgo=pupPV60k(@Ym^nIpT+1IG>{Ve!(by{6Qm?Zc>}DX$B5a%8Rvt1i zhNB+08;IN$*p|$7x(0XNaWGD7ZiCSn4#98-WRN;(q`+tndOfF)63k`ToV%UIId_Kg zaR0|UD527>_)@BG+2;hR&u<~F`kde!26RO7(R|Wr*zfsv0Fl}U0h3XDMu0eaNI$ES zxkxN|0y)juCnq*qZ^vU|ARWb@`6#>qpOH`w*<@Zi8|FNf{;x>Hof00Y+Y~w}gFncQ zCzi-bCh3(KzlMt^(0LVo8`x=oA?#Eqc~+#5#=s{cev^5nEpgVb!tcM*PZ;pBPd$OT z3=~)AYDK%H?>#;5?CPWsdhzLsLAX0LkS)elxIY&c`SKIr;`;KI2|)m^KoTjbXwH_x z;DrczBh{_GV4wLm)pb+BaoOWFnh@m>JpseaC2+{R%9SfeiKTk5N@gXSF|A6mSS{47 rS|)22ERxfY0bi+w@5~*6wJf2iYXmo)#=V8t0G=Xl<3)N-HeP^#F&>Pv literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pn_get_mps_info.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pn_get_mps_info.o new file mode 100644 index 0000000000000000000000000000000000000000..c006ffe713240ef3c41dc261707d1958b6fd4451 GIT binary patch literal 1240 zcma)6%Wl&^6usj-NLofUj=+v&j{TCm_8S-YuH{<5TcZ(hXFvhDGdv5tJ?Qo9K3cFA zw_Mlhw)R|myPMAB$J`9j!lc(D(W+Is=h zQ5+>e8Wr--`(!OLORgiQIqM{1qxDuMObq0s{6i0g3h)sL)sRirt)hT6hf@E7MBFQ( zNZ*q1NgMn|)|^J7CWYiz=Jd0;xQ^liY7y-8d{OMQPx4)n!hKAPiFi%cm9fNm-4DP1 zNS)9(sXkMD$0|_X4;N->WDMdsZcerN)yW^2Kqn zSutw)oMG0=<$9@MHgb8RWRj770{CT`_-#33Fi#hu$JoRk$A>B+#ufqSZYA*I7!>1y F{{@+whQYuW6uocw5ZV}MqY-eT6Rin|eHkjz#*KV~IxVKKAZ|vWqY&l8VQNZTn7HyU zxbsiA>!J&HZuD2U($rmddM|I@KnM$O^4>l7+%xYy-n`*`*{CqaKn8;(%qxJFC<57; zAPMUbg7KHglZf%Iq{eUbg6c&TZU?{XYD$H(#QFF{ISEz6kHfW3typZW2WQc9Mb(}| z^4AY`vsL*0^R#kLnz=bzJ*~VQnB$@O(sInfcw+X4FGi+yO#N!H_&`fGMn`tnvZq=# zoz{%LV`)2jMt_sp&g|}{v@Fl^4CL>kylu5RePAhsf&9VV{bp(J(RKrZN{EHorvDPV z%&z!iEY1?_nsSE$pG*f%yMx)WMea#tTd%oe9Xr4e+fEyJXEFh9kEkGZhG&6yM}vVi zLZBKmCDswsGdo0L(0Z{M5)>NbQ<%HS`emRAW+DoL*_@KIb`M{*6h2oBm`6bGG?{H+Kfhm8*e+>pMqmU)r) z!ynp)7rvRhSK|7M4&>*D_`HpXfr@j^;}%yZePGu2+E~;5n8$M84_oslBH{PcYZYeWhQ zLIyTKhWV%1!&v)u?OQ6Ll!j}{W#xSXZm)mQm8^0@fs6EfelDHMO?f}sdeTcK<3qUE zoWE@pk0A5oE4$gN{QO=L1wE9TN6nXG^Yp}gYIAeae`XK(BGjx_OKPSwIdcZKGgF(n zoNA1?t?uc0{Y8E^Uo2+Tf>zM-P`--`EZgdjfMrpQln)Q?b!!LvyB%1QWEN#x;RL(F zwnIslVrh0wy2C)5&c@v8BXY;Zq0k)rxyJ2R9JFJLTcGu)Q_!3V8N|+O1<(eQ@z_2= z3f9sr&Ye;JjN4Q1qy7V~BZpeN=5eXdJx?bHd-_$xsHYQr#DI!OK3Y#a8OJTp4k41f zbHSh8;{?c|hxkFBs6}L<>!{P3J#wN@zQjUvC*o23zK57775>kt zxOdC-2wvRf2^#!HE!Y>qBb0m=Kn#=X=)8o!O&qkp7!K-__*PWm0S1D{B=S)#C_#T1 ze$h632`#?dH!**(0@Vxu)hp`MHqvYUl3;e?M;38EjCOiyptc$h1Kppcxb?ceV>Q3H zWiBBE>p%~MShQwKVi0_n)VIetgph4{2K6;A;k^22wE^sK*f|ExsOmVCA5~lJL;W8f zm`$TyDH~?H(dg8>X1821>L$_X2Y|2A#CPS)z+5fh_AiB-p}Uma05A~KcwuO-Nj&I3 DX0?T^ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pn_is_support.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pn_is_support.o new file mode 100644 index 0000000000000000000000000000000000000000..c3686f7d1aef016b173fd4bceadef1d1755c25d7 GIT binary patch literal 1220 zcmah|&2G~`5T13M;?hb@OHrMGz=t5Egj!CCL{uR`{!`%+)Z|ccah=p6kw_D42N8k9 zEASA!0w?+q@Dv;yZoR>b*BiUxz)HLG&CIv^?auCguA2?U7>LFo2ayNR;!d&{5OS~v z3Z%ZRzgRav*6yaY0p#Q#Fjucq7t)2&R1THa>l0PIHGuiXm39ib`A?QTtz7R9#-P+ONUI$hrg{`tJd7Is4I|-GgS%%${9x>3p*~qthXnmL4 zfk3YFR`;C`KImt*Z-d_RJkZ@SIm9mLMbP`>(a1SR3To-L@4Lg^)OS2_sQ=shNTHIh zgjA|)E5u~v5Z^(&8e%eEF`=QQ7|kc1g8f10C(u&+#LZ&l*9VZt2=U`Qp+#hY4a78O zpMuzEz3l+;fq0aE7Fr$!_=12mL=(DnHq@Mm_;&>SE%AupZE~KV!6l-Tg~v6?CB77k z)8YmOZ(?i%JMAxpo$4gciVzG;#IH%{QZC-&aT$L9iRTi5dK5`qQy@M0TCHfeJ4lbt z8(*FH$sixCn1oE^AX?7LK<_7NT(7nWEUzzK87Cy*2GB<#7R}j`7##3aFjC!KE%|on zQ(ZSD9G5?>-iNFY*)!11s)0lKWwq5lHvZv()im3cvT3y&jZVF5b;}jAZV~N`<6HPE gE&NyR46J1VUcWSMu7rC~*8rZP&ESK1PCj1rU$i`begFUf literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pn_query.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pn_query.o new file mode 100644 index 0000000000000000000000000000000000000000..b723dbeb95e4ae19b81836efe707a23e73dddf72 GIT binary patch literal 1208 zcmaJ=&u8zGTGVKFuyy!r=t z&_Bdm6Z8 zhbTXSH(kjoaGE}w981U1dhAK8@wt;st_|QcekLjEOUVBG z&Te+fzkZw;_e3#2#_K1>n~^m+unyQfYM!D!*=ZM5LgajxU|1_zg^vXyxoF`6lF1%kT0_>b|sW#DVAo}q&p0> z+0n?gyBOUmj{||G&TGwe-nyXmZPx~^JDY(v9TOpUK`VmR8;?fL0a~z@X1nfm*qyu1 zY~`c=L$70wjy2+Y=xp0QrXc(HD#n0mk|0{m%aA^o=k=a1wAJ;+E#rm|T!0Kha?zZG z#6agMZ=`cGR`?5_)46U+I0hc8)`N@-nLcP{MaQA^tkP)i>p=@xb+cJ6nO4&zM-P<()P%eJ}$U|FQ$;{M*Fc4hDBRtq9hl*QPZe4X83H$zF5Vrh0;+GLzKO|H`G*P#K0@fT0{TmW~pSU7?tK27S@E2Jp zhdIIqj_=bz9CLtgcn61q@< z@-nQ<(#V*%m)$^{U!DA6FCU~azBUVxE#_rNUdZ!$F9U6HeR0dUAp}=o9VxkJ&YHwv zlc&6q&aJc%xBQsSbydPKc&u6vHeA>^0L>`tI22!$8_j)vW&pEpG)qOpY}RV6YTIlV rOGeeC{Gsid_zq2cNzN3^U`ed8i#>%KsURko0qFju@p2dx<4^q$vAcHR literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_pn_set_badge.o b/hardware/arduino/mtk/system/libmtk/debug/vm_pn_set_badge.o new file mode 100644 index 0000000000000000000000000000000000000000..5129bda06badc894b0132a647a432c0a71425b1d GIT binary patch literal 1220 zcmaJ=&2G~`5T13MlC)Au%U=?rV$mX{gsz+ti3lM<{sXuTYI4ZUIEmFnB295zM8ts$ zkHCdHufVMmeFS(4ZdDPN-e4x{bzL7=X?NzE`DSK!cK2h=s58bu4hC7cKmdjS(ZZaN zg(ZkV@!RstW#dCNle#;MX5fDGM>Ydz>GR^TavW>KU&NbVy2<3?5Y7_kN=ADP+0&nF zy<0y0byDA!g*=&PoYdcq&BFt8YP)978tmHujY{RQmTgatoWAYMv_>wc86(%$w)MRJ zHouiG7B{s5FYr8+9%3HLwt6FAo2W)hdpnOh)t%>CZCFrZEY4Qd>+A-*6-lxbOS3iQ z0Rujrja{pU(shI!O3ks~aMynC0v}ke1-v(%0(T|^h@IyJ;Qh&XY#$&6YjMkUol)<| zwWpzj{RiGbAGLMC<4|v3c{&Nz({H1Udpe1)=+ID-jpB(H!+Foc5tKAO3E{8e3ITFx zA%2i2YY|!MI_eZ7?~3vzaLPeE@;~*Yw0}m0YRDn$Hqn4J52gJ(D&jo}i{z~co}|Ga z)Ve+rH3<@53D{LkuA^}gZC7#9{%F6{CwW#>p@0s56NqJ9@&!lGuEOuXL0=>k6}eP_ z>Zx!o7=Zknh@bejV0Pk1=YHRfICTL~3;R`AyW|)34Br;cFJGA;MBobkaB+5uSydPm z{aDer-4HfCOnqHZa1DJ}-iHkrHU_|rijGTZx6*9w>0ug}4Wm^q8D^_qZ`V3zr&Km- oCb9PM>*Jp^@mD!BFhl9*y-VSRKEwLSC4ef*G(Hx3S4q6&e*&X_!TYuG7=CB@5ZV}MqY)5wqcs7s>r#m}UgR6pt(d}rgUJeX6_WDdGBpwpo=p4; z-ux5Zdg#%_i~b5vntJO^-*;zcA*4;5WafF^_kDJr*_qjWUoonTF_4Wx3g!_&TLgie zBS^t2gkbU|@+4xsD<|XE`@!V-B-{#q*OTca94AgDhst577JeMAe`?2KD}6YQo+wH6 z1*CrcU^m*u-#?G4_oSJN(b`e<&Cr~T%&EoA(U=cj&de#F?OQ0Ql}ZoPRC9b__bhv+ z)-oB@7;sD7(zE*O>}Ga*JFVuloR)>cU6gmMPImw-jWkf$-MQZ??>yRULQn~@FkAOu zU>DgXUyQ|Bf?ZW^Gtj29A@6h%xh=3SnQiTB+dFFRjD5J?I{AYwEt(f50`=&=v<>E$ws5N;(dOr=@yh zS3g4yX3c063x?UKR-2WU*(wx`ib>*E_(Q-i)WmPho`HF~87(P~J&p@5BgR$%=$<9; K5*ZZZ;r|0zE{>i6 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_popup_stack.o b/hardware/arduino/mtk/system/libmtk/debug/vm_popup_stack.o new file mode 100644 index 0000000000000000000000000000000000000000..7277d239ac83c2091966b65c37609fe7f3e9c065 GIT binary patch literal 1224 zcma)5%Wl&^6usj-NLrz^5fx4_U_lWHp(Ce65V4_o2XIN%WRVRrPHK?|LX6`eA{K1< z1o#7ffL#}r_yPC|R-m$?JGeLYYIUK5ACsSj9jz(0u!}T>Asq34#!T{awcjmlTr1)YpJ_h zR(qY@$>#HEHOF&23xzvqH!ZW%2bM+}Dje?LYnAsO?ld7RMOc)@gBREqyBLsJf+g7% z={5sCnhadCgXlUQ_5^dRm)y19y1pK0; z*tJIf2mJ?JMGqZq*!R-;wtP+y^!X*ksLu&LV?sqFjpmatg8hac2N0=!@L)E2zY!pV z3i%g(q86D2*O1ekT@ta;dK**b4dkQz10OvV;3E>MA)2ULM*(ZvLjQ`yyHlPbe4Cz6 z*x(Pc_AK&hQb>MjL66|#8j5SE#jw-_v#(YwAJ;+E%OWkI0rY8 zl8ffVB?gOclFm)XE*iy8{eaGOQ^Ili!SXI_yRdx(TrX)j6rPmojYDn41x8J86bri1 zs8*YmmeDE{^@>5J=ay^Wi!|^}ITJ9J7pKyD*b}&sGNQZ=K=&z$mxcBz<4^tv?+$<- literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_post_msg.o b/hardware/arduino/mtk/system/libmtk/debug/vm_post_msg.o new file mode 100644 index 0000000000000000000000000000000000000000..e8b8047669c66ca85a40ad5fd5db3de71aa2c3e0 GIT binary patch literal 1232 zcmaJ=&2AD=6h4=q3Q}XCZ3LWDVlV-*lcADG+!&x-Fis^YB<;dv7+_LJiqv6hWYvui z;KGIJst@48h3;6G_yW4}5t_KFJK{#qVdi$GEIi4*=R4o|?mhSSq^fep7zksK0XG8Z z*+H-{7i1s;A((yH@^~_|^bUHRnZ~elHTXxC7fJA@;Y)ivC;Zg zu+ce*y&?n^6FmZsiMk>d-pdEz_g}%2_s^@ljQ>gn$_M6aa1{(<7`XfJ&QAK^Jn!m* zu{7%!LIbYQg7@kUI}P5wNWmqT7&auwWYO6Wwol2;=r&p{EHg?CUXLsXWIFB XC9wDltQn60w9zN=fzbWM@nZi0o;8M2 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_push_stack.o b/hardware/arduino/mtk/system/libmtk/debug/vm_push_stack.o new file mode 100644 index 0000000000000000000000000000000000000000..c7703ecb183273e47966c4652a7640932a6e9db3 GIT binary patch literal 1220 zcma)5O>fgc5S?{CNLrz!RZ){*fdvI6gj!CCAmT#v9g0h;CWlBIjFVaDM zegfS23*36B#2T&L;^F?ic4hzJb_>E%ghknUaD!c9n}GyNvJ|@_ z-DaRV(;+vzh}?FuFPLq;RJrw*gL-6g6V$HbfNGB@A$LyAgW4Mnht?~!U@z6=+#Yl% z+;V8+{})%$Mn@a=>~y|uj}rtveim(EGND^e(6;W-g6L|>5$T-Jl|`>)Um1GDZ6 zCE)8o^&rrDEP}xXCcATCd3ExKX7za)^UXzq?0h{4vajy;JD6+d*B4)zYY4yvxQUcp z^vt@%e0M?TwueImmVEC5Ce!Do5xQPm4VikbCr4$~pPB~uiKd_E|IRF3v literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_query_operator_code.o b/hardware/arduino/mtk/system/libmtk/debug/vm_query_operator_code.o new file mode 100644 index 0000000000000000000000000000000000000000..6ce1a8c787eff7e12e70df810b48bc4b9a359d58 GIT binary patch literal 1256 zcma)5O>YuW6uocw5ZV}MqY)5wqBQ}r<4}n10ikVOWwQZoO|ZoH}B(pP1hJ>AR2=VEEqtClTg7m zWMCa4F!>UD64T#R)5+_DaQb{2ZiT1-N~Qzw%{=`d1{K8`j%brOlS0UXCqq_q43 zGQWPX8=dm+pGVp~QOt|+`jPf#WE{*adv1&;mTfv?+vtt^78>f6$^$vm8qe$=rsaAr zC+kDUl6Ta+dXV4F@9t*hf>KcOP`ZnD(=xk5U|EEr(*EB4c6IO3b_>E%ghknA@B+KY zE(H=S$x`g9ben-PosS%|i_x)p90+7vuN236>wwZX9TSx9bP9?+CPMDKQUIkl9*wNm zXu(>F={WYVJ9Dh5_hbJNuAzsvIP7_8pW7a$5cKe6j8P9$_=*V`BWd(K`6AeFdOU!U z+D9Jzksl{O4i)k*`$R1=3#=lhZ+1w;M)M_H#0TZPCqn;* zfZr{y2;TqiGM{1MNE7k;5AWKa1odF zApD_a_$}a8_bJZ5T!HEZA+<;&VsHh=qOUE_PX3Ua_tVJb1wpi$54z{Qu<&}%d|`Ed zam%ctP> z!Gr0kAHjp(IGFea^y~*{;;G(<7k!W2=|WGwWaj_Kp2A*xDi0l z4*a>9AO&Fv!t~1%&iU8RtM!1iT0PwQ$iKy-QlfWRI^rKV+zNkJrL=TiDsebnpI(~0 z=SO@x@l1l1(4$cG&t5(j>A~spw87u;SPN1oKUlI={B^>`Asip9v?^}~nrY}=t)q8( z2Jw|r>7JZw3=hnXVUFcWCL`DSmLYGdS@m^xBb(2s<(!gJvQW5#a^29|ePC&X{=)9| z-R9QzgN+6RJV6#>E50bZ!q&Vo7H0{z?zzoC8I1>)-bQbkw(kjK8vBZ6ytP2->Xr^l zdo%*Y98y5)tdawzGaL+zmngwnif&nEzkOgCBRcs1*)^0=%L9&_`o8aAay|!NMIUl7 zxd|p@^u*D6(gktcaAGfdvg6t8PWJTzWRN2LyiU|2wZJN3TC+(c+A)r00*;Z6^7kF@ z(C`TX)et7?R*}G(uLS=Sf&H)9jL=1Foshv2Cic!EyC#LC_ssD!ZmuGE5xFHCbUr#S z^+|jyLU@dc7X%y=bww=vJnw_we+5t8JFD(8-h~R3_W^x}YYd_oxZg3qJL&ziysP)a znj0WGpZ9^Zkhkmg&bagYi@(ekc;N!vL`W)Hv*KY3cR_u7h(j2~Po04J8u8$~@L-h= zBrQmGL8+BgoC-UoYJFE-6oFQ$)r*CiR_DA?Zfea!u~ybd^W3mBe2*HwD02+j!q!-i X`WDASJVPG~1GLa5u)$r5@q+&WH71Ct literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_read_from_uart.o b/hardware/arduino/mtk/system/libmtk/debug/vm_read_from_uart.o new file mode 100644 index 0000000000000000000000000000000000000000..448604689d0a1c00055a7e7792e1c2e5223332a3 GIT binary patch literal 1236 zcma)5O>fgc5S?|tTuN0^rNSu@Sg1%zLoKI75LK0Enh&SKB`C?E;^I1qA(03HXHyYz z;KG3)z>%K;x8Aw-A8_QrrM*Ss05h>S3F(EAcHf&fZ+F&f`$NerGsZv!gCxu{fQFZZ zvJ*oRmO+N`x78=B)%V38@mONF6HcroK9^xDa;_&*iMt87P{!jk=}a~vhjQilv7$sf zaIrG}Sk9e5^78!G&xfL!kFs%Moc1i&vD?-Qx8Jjdw#%tz6bid)vfdxMEyo?HMmnvU zUGAtmdPaYn+0Nv0DK)EQwG8ARpxt)tW*1lrX((SidekT$9d6elEXiz%tp#Ijo!ty5 zEY3FAZRtJ(Z7}L_yNSqM4?BXn&MS>O?>J~}o7s z*_^xG=8!uBI{5#^9kkK)hJ8ETal_{XL7(43T=F@=S1hQAq|tiv$vE!$c>s~(lLyn; zdzAobRLDQ?6TQeRxQ?9G?2w2-`^6^Ao5)A?$3A*0z!xOcLxkvCK>>Td5&Cx|^voiJ zFN%UV8`XZ}I40tU@DWNvM7)lRbQG^4U&TS^yMcr5X@0*wES#byLhL7Uf%AG0F8>If zFfe)YnG*P?1J#4DJ}V<*py0ee)#i66e`r#lmNBRIK8wYA5Y$-_nb+^xR9oC%d}W>? z01?7=a7z1t$(y;IV+O8AH z&jo2%0}*DQV~=CaH`VXSO{q9okuFIe>Tq}Ut14xrTN0e5X0ub_RMf=XXybV&k%$lA zY<>2wUO0gC&u{E@r~Kw&r22QYp&m*7(HkS@u-cvRPRl zI+nbn=G2$D?OdUdk@HGk$wBEpPB1OAI|Pd8^S#X%49ln%r2s1yEx#?wvH6XdhLMHHysm{?qmXrJtl|LIVBHDZ#)`V$0)&C zis?A^uzTWI6Yq!q18$;*+PmUusmC3U6NEi}9Wm;0f=`%`5h+IVNhjiW$MZvoWba+@ zNB1ZJvKS$KP{(VLm~$05&Do(K8m$+bGj|{z4RY zFOL(3=6}A3gqA8$KD^W`>eOYFSN$o$)kzfgc5S?{Ca9ap%RfJP4u%Ji@p)03EqC!aE<`ZxUYJ$|8aZ-y!N=R^AM8ts$ zKY#-leh4Re;3vSZ;DlOky}?Y@8>cySrQP@D&GU{u>-|`^D~vIagFyzO2%si{L}6mc zz!Io1{FZu_vOkpc^vzCEzof&RTsf+4v&;0wW>Z`3N&Jsx=P1KfpAFz`m<$D9Lh zpodzT487FX7a=Ezhx{7iLdXfeV8TEojh-i;it~0D#}H|J5-?rG@d4yeA^)sT)*`dy zCUSa4o)hhN5vLsFqx_=~rT!TS)sREht)YN5hf@EJMEpxak-in-lQuX;wm*$TO$y1c z%;>baiQ*z^mvPejE#ss<$!|ppCMH}W;gEG@EOAzk!{2{WCyY(1M@sBW1mA^D5LORg*<`#z`#_DZ#;+A|e)S z_z3t9*mZ%#55QNjLX;KV!M(93NmCY#G;_{9_sm>-9&gK5g)s)QF-XBA0@w|LSZ-uU z!2+nz|CHEHSZ_*t@vX$b%NAb0=M4lVtHt6yBUSef{g&$wjcO)iSRLUS8)nvg znO)E3^Jyc;b36-$J7{-Yr`Z9PMj9*Z?c8mYb{?yOk4BctjQC330) z<)d(El19cLiR1mTHoZFeW25{yjj=unkj>_!aQ#$1sAr9}+4bcu3k(rBH##G7(VS(4 z!GrPKVBZ=uu^Yy;uS*J!XCEzZ!J2@z1K?KC#G&xCxK-OT|KS9?YSlIimR+k<>g9&r uC~R6~n~cw0VdKlR@oo7-u+J8u&!Bxw;^96*)D{3rh^u&U=#FW4;C}%EVTDfs literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_reboot_normal_start.o b/hardware/arduino/mtk/system/libmtk/debug/vm_reboot_normal_start.o new file mode 100644 index 0000000000000000000000000000000000000000..4e2f7dddd1b6f8d97e60affe8727db894a8f0bda GIT binary patch literal 1240 zcmah|O>fgc5S>k&CM80o<;w{Ld?+YY=;D+}LR<$ip-PXv!o}8XNME zh7@GJrC+A)Pqn42(TBWt45zowGDqwPtmJ00`Fcm!ulM2f>Y4Et^1qKyem+!-E3|a$ zqwj=XHwc8YAB4WU=M04#3N%>N>N6wX4i3Ve7mf_8P%!L)@QgLHXnrWJ7R%)oqr^+R z2$d&jcRjZ|0JefOQQ6*l+No`AuC`$=mSXd4QM?;;}dt7*j0{E^gT;Sc|5O^3+Lhd3j0q+IA@9m=ndvRBYaL_#v-cWtm|M5OrXiMiJ zEA4A7;sjd6?;y@coZvea3`ElCdGe)jJc#l*BE_ME$t;f#pnwYbXML&{nH4vY(=%%% zV$gc}n8}HJRDThnQ~|ysp&lw!-zEy!^S#o4Adz=TD$2JYeaZ$W$aW@~>`5v4V>3D} zZlZVvwQD%&{W3UcpVYS^1rrNjh(w|Ks$Ai$uEDQ!r4z=--KR?YuMSk#AU7=|V{jK| z+EW>`tCK%5uB$3uVKAl%vWs*~5LJa52e_Y;!WdX~(!0oDuQ{`2)+1fV$;ReUDTN@SIX*C+{ddKNhHtf1X o=69ZO@DFwH9}7p|T;7aciS{&$FGzPuPXm+@b9jlKQ;vuK2T%ftp#T5? literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_record_pause.o b/hardware/arduino/mtk/system/libmtk/debug/vm_record_pause.o new file mode 100644 index 0000000000000000000000000000000000000000..e60338ac5d5fc1c148223391c87fa05bd33244a0 GIT binary patch literal 1212 zcmah|&2G~`5T13M;?hb@TYj8^iVsCfNxO1NBqD?a`E@GXMrv}XxVTPYkw}CT$3a9O z@d7*ouYtJqA>b)Ea3I`zK!Ta9H*tMoCGULS%r`r`v)+$YyT%v;IT&PM!2l|PB=a*t z23A0W)R)!gtM>cK-L%nzjQS0x`eo`uxzH@_P^-T<)%DFDOxG@rGssN8vz@cjuOAO& z0ckDWdOL7@uQT+!&bd1tc>q?q{Mg7ehhx9v`4hv+W(~U^c*cR5GvDO)bA`gLk>`1y zgW^M6$MxKHAJ{I!Wbx$aQLA!vxZi{&MPtisL%qRnvfBxrrP&tSR`wY1(PR*~ZM1NJd&L9qT>!l61}^aSXaw9J5+QYt=Ye;IgMs%NC0L8QLE!h>rq1O4CLLkYEW zDU?!A>meqihWHNJA&0C>XTzH3(*G5K_>Y7~>ehu$%HSuW(>W70iIQH4 z`2Qd=(Rm$xYxvRrXus4ac~*q5hk^MfkjuIhi;k#Yh2MXpu|zB@ais#)Q(-fjfcjg= z7w3(xPWt35zDP+zdO;Ay<0@=liHmxbxi7xH{L6$O0oU+li?dVChQgpQ&lP<;j&UdC z)Yo+d=h%bg9oPwArwiOJn>ZDZ%k{>I8JB@$*^N@sb{e%>v)Xc6#gbihNcGYS9DI`w fzAAqLPHg#E@6vdov`>8n;0f9-{8^q6$4mYP_ga1A literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_record_resume.o b/hardware/arduino/mtk/system/libmtk/debug/vm_record_resume.o new file mode 100644 index 0000000000000000000000000000000000000000..85123af1e8ab2e2aecc61b67f9860e07cdbd9b1b GIT binary patch literal 1220 zcmah|&2G~`5T13M;?hb@OHrMGz=t5Egsz+tiKs$?{HMaDsL7$?;yQ^%A`t?PgNQ)l z6?h0y6!TV5QypX6D=dc4v1#*R2L)3}j=FgUADD2`5<$2su~- z4N~9MpRHRTYq!(J0CMUNnCq9RbLCuXYKL0u<*BaU7{Gkv(l~?M{3pwvRW5$rmjco@ z_2&DL?YX_N*GDs%j@%&CtX2<7kCkPZ#){gZ;*mo-0^*H*q!?BL>}t@_AXMWq$?qn z>e>o188yVW(5{A<%vVepXembXiKk(|7y1db)IJHb7{&DggcwjfJ<4W1Gj~k74y<>OE6{~I&?Un1>_$zJv eSKbWlWdTvYG;Xehd(hVa9;40RgLz6mUi4q%}x_h6h5~tSc*mps4YyOC?qA7$rPJNbfKl~ZH)sYw2AD7X*;nb)avwNXhI^1 zFQ9Rwxb*>8;En|gA3zgdKsUOx?pT=UIi0y>n1v^q`<5_|Z8|H&Wl@A)#HY`i=iR4ysw%3BVpkRuP5mU_)xQwXF(kSAbeKg$Zi4-3HZekwNUVngO-eYBsGWNWosJDTKXM-4RyX zx3K@1(-@;;7<4&w7W=MF5OVcN#35HF_=hUVu-iP!B1xZwVdP^QrXzLWR~WMe?HPkaMHh z4Gehii{udoh~P>FlQeWj(7ucx&5!0w`{b=x$3TA)7?br-Jttm&2!8+d27|t=;JFUe zF9c)W1ms^ud%N%RRww>IFWwKM9X~Tr^T$IlbuRAo+w1%M_2n&d2tl}je*|aklrtJ& zu+-0W_HET?8?H_J8V%s+d$4K^W(CaFLDh2_4%yXQX>DEe)4(X|Ys*>PSmV50s2G*( pvR*KV_1F>yzDWaLmE8fuSH8D*aXe5uyVx**K%BtKvP(7|@;_AQm5cxY literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_record_stop.o b/hardware/arduino/mtk/system/libmtk/debug/vm_record_stop.o new file mode 100644 index 0000000000000000000000000000000000000000..ceca39d59548ff67b4ee0145f80579d10cf07b90 GIT binary patch literal 1212 zcmah|&2G~`5T13M;?hb@0~JpB^Pz~8v@54X5FsSUuT$X?smY;2LavioBoZOuY!MMi zya12DYalLt2zUw(90<1_kYL94)=4gmwDWy4^X<;=+WWC)*BN6VjX@UT2%s7U$wDB= z!U|}R`m*|D)qY>SmNEK}RlmVhKTDk|r<$ehYmH||x_+q-)3r0>7_!svZ0orE>&G40 zK%%8vZ-?tELfGw10&lSo%mhPpBPpyXV?Sb8GB~le3ReJ7mM3Qffsll zN_SE2dTwU`Y#V8^ba-&TT|L;}ZNZYFv1OK4FS8AHC84tn+hjMC9R_?n849<9DEtun zlKI|CF1&XFc+V9s@XmM)+#gXu>O3z1?~aB;?-fe07k7p52b~k)jpc#&M@1fQ{BAX1LzlTO2ND~c0{WFJB}_u;1l$YF-`vpU&}#FCrHY0e%c z(P+I?z(Pklsy~V_%mREuLOrC(zH~P1NnbXwujs@7D2%0U9YeV{s{F)pL?kk)BUEG( z@ec+jCNCmi!$JF_{n9bn5_27>u0lF4BV(|E zK0fd4>ZDHw^>|7W^f*AaSXbftTs`bpJ>$-w|{=xDtYzf%v0k&2AD=6h4=~g7v4gRRJe;VlV-*lcADGTxfuD2P2iFkl2OEFu+7eis&$HWYvui z;KGIJilq;rI~FFsfX0Vt;;Qb58$E}a+o8mGl6%iN-}l{n?wpxBN98JKjDau)Dey9Y zrjrD7GeHWLAq>;c&p78_KCRV4(pu$c`vd(~arH z$vb|`rxV{KtVNzgD!=#gv1k`gSEhCTmdBcqI{Ds7Hj6(`xHyFC!&*~2?CX}YW;UNs%Q+>dWT9{m*BhqM>H$k*7%c4W+;42} zJl?EB$QNc2wi;MxSJ`!cjKx`kZTRjoP==$vZM4wamgBo3vdn$OHs9EwbPU@7r8OLa zVht!EbymrN(jN5t=1Y`dEyb{HtJgZP&EdiW{U^PN9JM;+YN+4)ZcHxV#y8MM+?d=L z2^l?Mw4QWf9Jk%vkDhEio4v_-tpFK>NI$O=wMZ>u6=PbnMIhQ32dxuEI^rL>Uf>@w zpc=wN-3kI&^OeAVVBmaX4kC0>M<-;kgv8!i=G3H=^u9SfhMTJhUO?;$4m#fo4(gM5 zRt%wn#J~0?`jrwqQFRIdpqz%aq zDAkgRQ{ic;QrlGp4Z2pX6$@3p#(BNm&>MwfwX75S!nAd~gF4wJ2FVlU0RR910 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_recvfrom.o b/hardware/arduino/mtk/system/libmtk/debug/vm_recvfrom.o new file mode 100644 index 0000000000000000000000000000000000000000..d387424f462c12c66cd0d695046ce1a8fad0a89b GIT binary patch literal 1252 zcmaJ=OK%cU6h4=iwA5Izjg(FV4NYjUlcAE>=t6m2Fis^YB<*g>V-%7ib(l77Vqz2j zfX0p1tv{fPx?{n@AD}-$H=4M?T^A;L4l@^~U3inZ-*>+A%{epo@v@+D#u$jfAOVvI z;J^yJ>5(A;0r11{(wvfI9;mqt6Nj0h1PZ+hQYH6KjPtSNPPR+Txw;1 z{uuBr@nJUliw}zX9nH`i`%jE+2cVeC-HjzG-94kB8;7xCG8t3brXE{WQp)qxN@{Iw zIhK~watboHu|`d=)!V?9k$N*5>vyX8^@l4J@VWeKiiJFLY@S_nhuH#)u_((KN_|W&w;zR2s{uL=~W1>mK9-^Lz1v+&P{QfI+Ligy;CyM)A z2g-X!-!O472w|`@7M#_|?;YjGX^iJ50kVsE4@A!8t$r`Y+Qs_flvxHhT!J`Ka?v{> z7X#XFF=*Ym2oNdWv}0P=pbKZmWtAHcHzD2xSN`lDpZ@uM zQs$yah|86e^5?GUI{W7P!GUesR;San><@mrQYbuCll9)fwH-~nHwT{6 z4}a_ma2GYy+PP3m{WU^P5Dobq#QBgD{KSNcNHJPZIvK}<(2pRJ9r^Qk3XTyVg(1>U z>O?J43$7ujHCq%!JHnw535|4=e;#5OhHpryhA>gLiUF+oQN({C3GP%75xSK?CuHy! z+3v^-YLZKOX(BG;$2ANtVC)7C+TSt`>XZ0aq@ZKskVt5vuJ8p;#-nilPs9l$e)VxA zGF5@{(Wze1Zs{EL(UQrplRoC>M``re#}2Z~`6%3<$_MqR$AMk`zPM#UHUifmjg(Zh zW>sR44^sY2eVgn#`Ry=IeO-}op7n6K4I3V8>;X3l8cw-4g=%d_o2dn}V$||E!>pCd w^-{xZi}+Rcl$}C3wiT;<-Hpd*T5xgeDwNdrAa!~E z``1~Ct0Do;m(NNc+Lq@WSS=wAtxi|C@7$&>+-}F0l=Jx)TB_DP_L`2@*UIU%X1c=B z)^$TaGS-Z2c2&#p3^yS63>Vmr-Ee`eB8}#Dwx8Dv+ppJZFcpfiX|@=-!|t+s;W$gM zCH5fnlmYMc+rn-j3QuB7G0%C=h4WDW-?xPgywU3c_qybe+Ta=B&2GExbWnn|xGjX| zHjahU3qI~Y;2~Wl_=yP(kz%x-bTJ%{0zZsMcH+;&N&ZTJ zG=@k&s#CQ{t+MCF1XgmU!e^s0? z>{lN~!ebRE9~tWvotFN0cCci0chX1w{2-0~^3XvxnUBEZvAnEDJ(f1Pzq(~I8-^QT zASD&8Sqw4Qk|}?tzU@u;M}bd$T?pZP-Q(p=SP`(Y58TY_IOX2vE7cwST0K~0v$~lx zt!k-ME7q-gZqqDUBtLM3g|F1YcjooMx~`z?YXT3wfoF@)0=z<8!i!WOA1}Z^Y5|X3 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_reg_msg_proc.o b/hardware/arduino/mtk/system/libmtk/debug/vm_reg_msg_proc.o new file mode 100644 index 0000000000000000000000000000000000000000..49f54dba7ddc06e3e2c17295ae56ea4e9226d9f2 GIT binary patch literal 1216 zcmaJ=Pfrs;6o0dAu|QD3e=Rn+F_;tzlPxx}F(z92S6ygAd*C*1%cgB&Ep7*6<3T=x zS8sj^PjcWR@GU$U;l@qh>+H149(>8n`~BYg&Ai#SGhfPfg)s)&7^Gp!0BVZFa$`Xn z<{=LG9}905?9ZiC@=-UIf{oaDIt3SrtNbZDg=+kDy!P!Nk(lek#my@tWxj><<@xVl zXBDoC_5Q+TzS=$}7xnQ2^s_!D_Z<@^dWz9{(#3H+_IU(7*~xgGPU`moWH3bfpib8! zwZ;}=TC+_-v=bbQ1bibMJks%>2-ICt5v^NNIxT}ghz=%9 z)g(%KBM_&}Eey_K>=q6>ADx%_q`ws*SeTd`0=ceBxu6B(QMmjY%tb=0BG)QVy(ruc zEg$q$bLheHHmpflI|ObQEu0E_#aeye3d=xL?fOo^7WGP{QErN6VaF~D nQgvJ@@J$MQRo)0hX#4T`l6a8kSU)ij@DlwBUX~JZ{K@|SG+%!h literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_reg_sysevt_callback.o b/hardware/arduino/mtk/system/libmtk/debug/vm_reg_sysevt_callback.o new file mode 100644 index 0000000000000000000000000000000000000000..6ec121ff5a2cec187d361ada7fb0290ae49c0e2b GIT binary patch literal 1248 zcma)6%Wl(95S{BJ#cfq+D-ccyV4)(VgkGEy2@4@Xn#2j<64YeT1(I=6tBHsS*ltC{ zf^PT+_z-qoMB)ef7p#!l72Uy%?VE(ENQ`vvIdkUNV~-!7s;0ph0}%{zFv$R3MoFp| z8geiXGU(qHo-ddmE7|m|ZYm3RQb)Ng94n{#Av=Vc{7kNY-By&jE*xJxm9pw<$ekSh z{4p}PXcFUMZDj1bmgnqR{?K>!1FK{A`)#}P1`V}x`JtL?4)(l`;|o!^WuiDsI{3x0&C%mX|@%-~B@p&TFnAFh3i AX8-^I literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_reset_stack.o b/hardware/arduino/mtk/system/libmtk/debug/vm_reset_stack.o new file mode 100644 index 0000000000000000000000000000000000000000..ee103021141f19ccc923f49bf830e8b37261aa3b GIT binary patch literal 1220 zcma)5O>fgc5S?|LlC)B3BPyH_z=9%DLM^965FsSUcL0~5CWl;*aZ-y!U;_3Q5pm$c zPvF9xzrd{${R!|ZxK%}5dV`s)H(w`K+I?@{yxpyK5d#ux)R7-V1?0azl4=EsH% ztUwG3-&P;5S|2LuyPw$Hmh3$?&>>c&U~BO z&J_w`eCOz4QD(SGv9a9#`J2qKM70w$~YgaBDo$Up0o zwa6^FiJbPxZ$;;=;go}Xl)oRM)ITGk8gj_G4HU5E8>xRsBJPt=q;FmLqz(Qc>r5h1 zlS1+m7eX2y}Do|d9 z#59eJ!3M7PCfe-jRl2a>;a;-0#HFr;bozFrQt{Z2gqH1r2qf` literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_resource_get_data.o b/hardware/arduino/mtk/system/libmtk/debug/vm_resource_get_data.o new file mode 100644 index 0000000000000000000000000000000000000000..8a17f1fed0abc3572e72aa3e2d66dfd936b8241c GIT binary patch literal 1252 zcma)6O^?!06uqwnrZ_PJ6O4e(NSv7jM4B>^NZ1%Y%fybDfdw%pox(IiBBG^ZBray- z(xpGazu<0`?$ux5(v30Wj-B4y_VF=c;Y;2-=iYPPyY1zb^Sa((i~%1E(y)jCo_RsA z;2P4f2@=dcM;=95?`l61F}XAd$=BtN4Y<4UO_ek99T_f@v)P4kA!*WKxcRgjk4Fb^ zxix#=D4sz2*LSwtt^EF3;st$_v=i;k$gr)+_{{EG#&gRtPEE&jWvyB*rP6Izv8O35 zn@#CM$4VWjdG&QZmoFAGse)2a@=(5y8%)dW4S{8l2Fu4s4?4A@!(1Ceg2cjXI}l?x z*iA9c5-iDfgnJB>$#mqHJw(U$aKM>uy-*zMtpketFiLMS0mU9uK<>O!0Hr@3jjWew z!CH#xIQFo2=2#Q|#r^|sqlelY^1amSuFnYqKEH(+_Bp{96jF$kqy6NQaPIrDh)Cmu z2lJJ@G_p9!zwG0+NatKdPJ0e0iG$9IyUbh2NBTn_y)3{dBvgYBUbl$}toe%PzasJO zmzUwbsORH05K&m}3-=KUa~D7i4_7gH4Rc#K>G>i!sZab}kwOiHb0YrW=kb{1ay|fm z{_;Gb=)UJe1T+!#;-rfy3S4Hzk>LEQPFH5v zrtkS7pG{p;e>w0tQ2D)+3x|4ex-hHrcRbvL#L0ISZx()>aIpwG`peDoo1v;}|tFOWoB+Lv^=5&`?+|79U87x~b47QaP29s(nL~)|HI%I+M=ia!DyGXXOm! z@1wk>wc34PNrc|~_SQyYbL&yM4nCKk1=ylzncZZ!++h}BQMTf`$3PxWhDNK6(a^2f z6G+zvvZ3u8Ak(5iZjZ+x>my1?osqL3cSggZ_7Wx7OKus4-f!<2+Sq=<{|Kw7p-#+Yd7r@GjLHiox#TQ;=OTG<_pjVAIV zeDPoS;v0$l1pb9jCJR*lIqOp?m00OSQ*b|enohx4{33tMj-eWR9;{|2C1EIu;QjsBt6cD;d7&14L#D_mpK%$f(; zjch)@X5@H|XQA)_*K%B^)djYOFk0Bze%LH+Kig=)lon&tY*AlgH`#I|&Jrxi?r7@_ zxIgF#r-fN~VeTm8xo^2}KMLS`j&Ojtd>^>iCqnKl&jD}udp-9ZTCf*)gz&npL*e=p zFZUmM7i)B^Q_@3cYe`H=m-rUuX^AO)$AW>GG_=xD#^n0ymW9;_T!VFl9Tu#}EDw;+=++ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_safe_wstrcpy.o b/hardware/arduino/mtk/system/libmtk/debug/vm_safe_wstrcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..5b46c3fcc7ca8bdba6814d81d442e7d04b779f16 GIT binary patch literal 1228 zcmaJ=J#Q015S{f`YyyfM0@%h176i%0}uq-6x&vV2jMzITv=5lrpYzgCVcL6L4 z8cIq^egZ9BdRq7elr#v1&JqR8cyBM4E3(q zC}h>KZDhCPqWrSBSuB_H*^*R}icr0Wd2~Y`jDh8mhO2u!_j`?R7%o`Y^_C_2H^|ojCJivgv3A9B%ig}0E zAA&#sys@BfRq#v&suzOG-UXu2J;UeERU^NU-? z1wmNCm(Ks4)~p5?l-;$wZ@WHQb8PBsB7n2+!Ae8euwml>B(*N%RNbw&JA1NU2AZOF zYE@P1v|8O}PwQ1{YEvWCGsD*KO=|e6%o%9D^o!o5@IdJvC6@tI#57)($7JIn{|9hT Bgp&XO literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_save_irq_mask.o b/hardware/arduino/mtk/system/libmtk/debug/vm_save_irq_mask.o new file mode 100644 index 0000000000000000000000000000000000000000..ee2c8e52ee8991821368f4da5e90b66c001c759b GIT binary patch literal 1216 zcmah|&2G~`5T13MCM80orO+fG@S&hoX;)5(L{uTsG(S#-OHh+T#l<+OMIs2H_O@!o zffwK*cnQR%57D>az=6W42PBxudK)(!7-{#L`R3aldv^C@-EJ_(KpBHPOe27r4C1AU zAP*@>Li$VUS<3!UyPGxokk`-P{PsoqR69*tiJe6A<$fk}vk&LjFN{}^|8@4`+e5Xv zLMvk(51qh0_MCx#=nUQ9%_L=2tD8o?Jv#DxoH!ZS9^qIp50kBncv?QBni~16~#g=0kmSs71Pg`TagYi(fT}0ta z>?_ar-g4oc2;c{vLttVX)$Ad7AA(EX)xSZwD0ThrSeN?Avky!aA`m|<) zNHp4SY2wL=bd-M@qGSO+p+hy4sk%)hu;zQke?>>$BgrV;g48J)d`EBpGLkhZB)t~l ze`8=Gc@4Q6IOzM*IH*tRU(tm%Ohk`K)umk2qPz}2|3q`KN%bicyHbJb=~sG1U%QNQ z>Z!Eo?xc@T@+ym07;@79z1h4DbbqEM>up^Uv-_)CCIvA_06i2^ZQ)qd7;GXcqrSaR z0V2h27*k&tG@NH2E$_jKfRzK_cGbkG^1Rw??V11Rz_IMscExsDjYhlPaXOW4yY7(e kwI>{Wl@7iue+;8hlvL zmbH5t^lqK|PsY3N`7!TxecezYT&(h`-O=J~eJ>Ba$a#ss<KM82ZdKnt8F*znjo!^%iWD9O07euW;>mDA(@Pu2f~i887bpsYBjaKz8p{MX*~s* z+i0)YmFfYoWu(E(&gPwRe)HjK2}XP&Hp(Ug)9ePD@kiM#n`1Y9D-85@rzt8`MBzxR zE9Te@UD!tg^!!Sc`ks6t>`QL!N2GQl!5igK10+!)|FBQhBD3NKa{6YC zL~JzQc%R9Ee3ZZMqEvBxNT`Nts%{YltocIeXGr9|lZx_1q)*u(hKXG-k~JwLzi&ui z!O0C2!>C=uPV2jlo%TunR;2I*6Hke_P1RMg!eKoCzyB(o(BH2#u%GwR7*7oXWS8>+h+fFcdPkmid46@vq`?nYU;!z)=$lC&gB6+TkF;;u zOL57KX%_F|BRROB-dYoXMIS7UiGW l!oqiG;Y)HlV0lww4ce<&Tu1{kIwmj999|CkZ;0Zd{sR{2iJ<@h literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_send.o b/hardware/arduino/mtk/system/libmtk/debug/vm_send.o new file mode 100644 index 0000000000000000000000000000000000000000..18e5f85bb1f40eb0181c45ca47579d181f317ee8 GIT binary patch literal 1216 zcmaJ>&2AD=6h4=~g7v4gRRKwz7)(IyWT+$(7aE{kFis^YBz9pk3@{OrQgoOaS#{$B zxNu>*V(A0uj)jRYpz$G^xT-tiM$cj9cBaI5l6%iN-}l{n?wpxBM-`Pb#y}W@G`JZ+ z%T9v%xgZV85Qf?3XPomdpVsQ3BX-;`t~c`I4waJn(O zIDN;D`E2T&hO3b$k=pOQLM+;Y)0J6+zvZzOq))zgQ?1g^6D|(n_;9sVeLc`d#z7aL zS}s43(v9Jv*)hzqRLy23wQm{HmXcFm_zO z2xN0e38`~(9^}q&Ffa~Kg0*Dbvdn(_&@x5~5A>h(CUVs3kfWh~?>jNMfD_+9A8}%G z6C@<`gwcA^g>l?=azA>q$$WMv`?UgO5hA@;Cu)&e#0ti=W{W_y2@YB(jC905a=gGl zVn8*7iMlleu;xpF|G>ch#%x6BqP9-RUwEpI3Jg|G5fOFM#*PYYZ-9>elt{PWs@ScUJ^~`rz6k zAAoBviIH8ecZMzQFTOHc;D;rUFeDYNS@qFhz%}aILpPoGvF_y5*QgI?=c39TNLi5T zf~=MmoQhA&wfe3iXwa%^y;M}SI_Hf_Q)?DWYDFXVg<)xU2Q|D!<`^__@2N*|Jiv4G QF>GQBeFB@&r5s=8U$wh`Jpcdz literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_send_msg.o b/hardware/arduino/mtk/system/libmtk/debug/vm_send_msg.o new file mode 100644 index 0000000000000000000000000000000000000000..5095d5c08348a609d2686540ffb9756709caf48f GIT binary patch literal 1232 zcmaJ=&2AD=6h4=q3Q}XCZ3LWDVlV-*lcADG+!&x-Fis^YB<;dv7+_LJO3`6zWYvui z;KGIJst@48h3;6G_yW4}5t_KFJK{#qVdi$GEIi4*=R4o|?mhSSq^fep7zksK0XG8Z z*+H-{7i1s;A((yH@^~_|^bUHRnZeh( z!Q?(+B88qf8c(_qwtG(OM^AP(@7>P6T7Vo~elHTXxC7fJA@;Y)ivC;Zg zu+ce*y&?n^6FmZsiMk>d-pdEz_g}%2_s^@ljQ>gn$_M6aa1{(<7`XfJ&QAK^Jn!m* zu{7%!LIbYQg7@kUI}P5wNWmqT7&auwWYO6Wwol2;=r&p{EHg?CUXLsXWIFB XC9wDltQn60w9zN=fzbWM@nZi04Y7sd literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_send_sms.o b/hardware/arduino/mtk/system/libmtk/debug/vm_send_sms.o new file mode 100644 index 0000000000000000000000000000000000000000..5832de808642a080c1e941d2807fcaf37a37d69e GIT binary patch literal 1212 zcma)5zi-n}5WeRmtwTXgqE;lq0t-?pA=Gk8B%&-RzwA`Fq-r7&vAFqRkw~Ng+eJhS zER2i{4E!5x-S`LKFJNRrs7z#oyVx&rJ8_cV_ubw1?(BQdZyScj7z1t$vas?14m~GQ zTnMtT0V2#l#~#I6Z|dJuTT*$nCS8+0XmEG^t19KB+Y+3o=kqh+Ow`5wX!B_|nT(I% zd~^OzD;-1j=QnnzTmAK;%p3YB>c{%4iRoA;L(`c!0D7%fmb2~YsXeglnXKpYvN3io zc~32=r+r+%=%+lDnkWKos~Z?SE5J(OfA zmS#7Fdkhq3HgS7>MA!Ck#F=e9S6u703(BzP_CV=74k-4N98wpQA}E9DWMZA51bZnx z*R{v}Q`f@R{$IO=LK^Lwzk%l4^*KS<=Qj|eJ}3Bu2^o=Mw4Zb$K0Cf2LL__d!E*JE z5g?Bd(g$_C7l}Dnk<*?%3ZhZHs|)5Wq@(;pAH68RM&OoD0_x3QHA!6Bbu7cm-pd_|W^s@S!>JZ$%0vObm(m#_MsPV=x|u-+y_W zFtqscRU~ww1LebucUUPHB+#iZ1HtN~k1X=bH2T{s2ifI(7}6K=Ucb&VcDX*kWu71e z>ySZ8D%z6}7|?lhqq%9^K_vf)@8kF&F5nvYS(O1~T*wSTF={Fqresz|@Ua zwPKhpO=~wgW~Wj$8YU^8S+0ryqKSW#Jp(gPb}_FMHmAFj+yF2T(|AD+$;X5J2Mtku AD*ylh literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sendto.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sendto.o new file mode 100644 index 0000000000000000000000000000000000000000..fcdcf07e455e319cacea8b7756b154fadbae9147 GIT binary patch literal 1248 zcma)5OKTHR6h1ePnl>%=B_{1)Vrd~E?J%hUi!L;;n}|~bO~9_4<}sK;)9B<@S`aMw z2NXA2xBh@G>Mo1?1pNuRQE(G?T?l$kX6_{I$_sP9?|kRG_uRRUS9zT?#y~a(F&IVw zhj!pk4Gb{|LIC=oA9K!oXCXbJgdTq4e{v`Md#=nEo3BsDlqqFidCws+{bk}~@B_SK zZ#5;ZEGc&t=-)i|o=$e(@Dtwedb)waM6t%_w#SR%=1va!Gv{S~%tJd6`}Vc5(#-t) z(c{~4VGafg_X{stM#tQ5h&E}3Z1zqxR&F0yb<;YE77~f5zAMb=x|YfZC{vDyX$i2UM#~0lAZE3e`4qrqZcQ`>06H!FcXgv7>_^mjx7m?bT4Q_8AH$Vav@{jstEiy~4 zA*V6xBx0laCI`&!$Vd5m4%#ZN4++(fP1Y@R)6AA(d#09(@hZN(X{sY1|i(LQ! literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_set_active_sim_card.o b/hardware/arduino/mtk/system/libmtk/debug/vm_set_active_sim_card.o new file mode 100644 index 0000000000000000000000000000000000000000..1ba2d7de20e3ee27abcd39b40290108b3e7d7795 GIT binary patch literal 1252 zcma)6O>fgc5S?|BlC-F#6$mE;u%JjOp^H-@5ur+u??7FGnjCUKGEQQVNSJ`Vt%x{q zfggdy-{96m4@g|$S8%J!tr7>AiM>gPio{C0@6DU%9eY3gu3}UfV;~!YG)yCamLEiN zV?!F2APV`<%iGJw+j1&#tshCj&B(WO3XYQ}`2*!3T8ll3)jzgXb+He}@e?JbJ%jYo zcXqv9Jo<51-IRp_jMomU`;O_^!nC?#uy32*z%jd)+e1UGRJy07o5MY~Yr7+@mdR+w zK-k)*p4DGxH?sNsx|ZWPo`u34v|F~-830>H8Y%4V+-;S29&R*YL5Z>$TMeIQ7udy+ z$`UNet|+${aBt)YtAi+9AN!KI_6siTHv)Li5*F}|=K*(z6p%a1bHKYp$FX0c1#59j z2zSug6Sfz8*nhxP^w9Dy1YTO>Cjlo22mBIZEZ_uRFrgumM$eNkiv30qhY+c~_hB;n zTM3Xsh5WNVS&Ph)>&WRDxo0$=id{DHQT~2_QvZa6YRD$*)=|KkucZDJiGQwqMfz5J zpR~a*WbH}h*QAjA%8Y&%C)ZJ2MC}}QdcQb!S||CfNMQ>TABY4^)|IiuSv?Fte@mS( zG_F2XLVs1Dd>E3`G%^O4aon0{v$K;wGR{xZ7;Do2*?c}c-tVc!uV+kz`T6B3^9><5 z1GkZqi=J6k7*ze#c%*fEIu|=ZOzXO$;CTAQlk4yE&uKo`Xdh z{3pEi(7TuZ0p2~Cw71^$J!S`xL(`YcyzjmD&3vt9YHz#DqQ*6h(?z>aC-Gzi|cP8d3N&W z_i>3U5#LA3$E8m_%X5Tf4+d7-@w%?lwz~U+p|E=WwnMyfKL1ot*7`%Y<+vlgoJ#3t zS2+5%kv2Z2x6;|{hMwUWo`&2bq}z_&>;l_B7|QMKKB*UWUvAZ4K?}1*widk3Zm^qy zD2uUmc3azIz`apV*iH1pmA<2p>wMtC`7D69ZD9j%dLD4MPXV#hJOjMd@AaI0q@WhJ zg>bvgp>RAp_~q;l(x}A?KArk(`j}kM$G6Zg`k34=Ea>PdN9&0f#&O?|1L(;P$MbZO zuM;4JDdNxaloqiSHW1UAZAzjY;?Qv@BOcYC`(EY0BOncBO1FXu)Eub%PXzLA$&BKy zN}i&@Uqp>bBsD1{zBZGO;N}JE}YB*o`0rM6l1SHzP&AfqA?oGZ@-7_v;1XkIs z?&M6XS}N6wb*rA+F^d+hd53=r{9Y~m;@lBf7fR##sLwHch-c`d%lOXGuj9okP>dJi EAC?lA&Hw-a literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_set_cust_apn_info.o b/hardware/arduino/mtk/system/libmtk/debug/vm_set_cust_apn_info.o new file mode 100644 index 0000000000000000000000000000000000000000..661ba0c1d960d7074de6ab9a48f2c4fa04c71b9c GIT binary patch literal 1248 zcma)6OK;Oa5T11&B&|@=3Pcj3V$mWcgji0ApyERF4&XMZ$ssr6q=rNy4{Qe!ap;x5 zz>Pn_t%uyXz^~v0D!1NX#_M&{DhF2Doo{Bo-ETd+>yw&RXN-Yp3^H)x0d%<&D!POW ztV0B*Ut=#~+Q(`-d3O*_Ur)pR@OL$xO~YC0e0nOKMjFxQ(dOrFBC$4rv-r7`mR~{U z*AKScE&u+xs6P^7o{cva_4gy)HXXe`vmM=-j`iXA^~6m#DwQX4rahTiebbuDja*LF zhK?!kss;63Az#?r%gRNis1%^|5GNR>(HjEGA`F#|4jy-^2hZ|t2ul$bWt+hp>?XSv zNU$VJu`THV1I3q?1EARr9T;s%rR0> zOEDbB8un(6X?q{`ALb5nsKjB9OLgvem`u>ax6wvDOlE-z87;+VKJg;h?|FUzEwxYF z_#;0~fE-4MzswU_L>5>@OmlWAh>g}uxQGwLqx@6P@+iO;1f(IF&~0J>HK!u}4FSJf zJR*1-oF{1T7g5*uxF)&8mzLsjTwKNA8pdMSX@7C-R44JR2w@)+Cj`7EbcHYMay$rs zXd8YDxaz)(>n|&iUhq<_Xt#8Z`~H;W)rlW+^L`rrtqTXy)qD`PFXg%3OFwpXeR0b; zApqAPkC0e2XH#NO<|%iix-Hk7{Gpepx^74~u6npiA9ftrIR-_ms5q1kE6vuCx{?ce zLu-{wn%=6{+qI6~DV4RFPSiK}Kfu?i&N)B%Hf2V&si$A~@7y6j%a!?jFR@)KQOMBZA&6eYKQ-y4HB^EF5?74NvJ%|;O$(Y#`PHf3Y8Lv}|spaKFEUl;Y z6lCt>0Nb%^O<)Oh!2bJ8~lf^O&1tM&iO@t=dEjAsTVY6(G-45JiptlcN!mc3- zS7JkXuCuKRXJ3H6WeXehTDuLpyF&q~Q+gWo`cA9myg~`q(rqE!W^GS6ZSSN01EQ#* zBN+0ubPoHTPZ09_dBkDQC-{Mh7$R{ro^%mxcfB}>NcL4iub0OSkVJ;`ex0gCV&xm? z)0ib9(P+NOt|vRvQT~yKk_9+HhiWKOb&E(~&0WQxqa*L0WRz}P>XZzknAq$^vL=P3 z5BPWkCpVBBL2e8it?vdl+9&m`=t30}{$o;gDd#soAA(j}3aMz!M1aAHOm%zO zxAlS8_F~%C@c{ONk5;e4f`ElB(9NuYUFKP~SlTfD(ScPkORE{vDsf)USFB2A)y!KY ndx8G|e3cfyEB64b!2)vsW^r*1T*J&Lz&7F>UYK2q@u2?#+H90* literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_set_ringtone.o b/hardware/arduino/mtk/system/libmtk/debug/vm_set_ringtone.o new file mode 100644 index 0000000000000000000000000000000000000000..cd29ae15915558c71f8ae34d9e90c27516305932 GIT binary patch literal 1220 zcmaJ=&2AGh5FT%mlC)B3%U=?rvVtO|gj$;ti3lM<{sU|q)Z~!cvPoA>B$B|!MMNC9 z@CaPE^9tN5(MN!%;8qoJ=?!M$^>(`lEZH;P%r`Uk*#1~E>x?l_gFzO~5r8Q{tS~2J zVF}_;{I>jJ+5Aw=q;3yl8Mqhwk^^IIh1NSyM+??r?k{CSwPnQK>xAv+c>D+jrcV-pJ*2b0{2r+sGSl z^IQ31aZ@kw0?$L~0p_tCyEg>3iE6C0xAU-5-Fddvh6OFo5^ODcm0e>uB1x8FX|}H2 zXTYbkk+6Fxg)8MiX|D5{3+KH6zHbW~cyBrd?oJ30JI@Qi`;*bg86yR2aa#y?*gF)? zG<2~4z+32}wk~)a>g`KUClU4Zno5FqI@ej)gT`EpLkN)Kchl5)KGPsXuz6pl>Iv@@;yn5;;l-aqQM{3 zx;~OM2@+om*rS--K;t6XF5{&A(SE5<>a3_j0UiD(5UaZ63yz>Y3cvpbeUVU9Xk`C1TNtZmuIJ#HH|^h zkClDf4Pnc})YnxF*U*RMeb^ANu@Bs=7`T*nE6vuP5vGCFFk9u4X|?M0cCBM|N@cTV o5$gbdKmJJzf0a7}E0liTyA)pNQ>>p{0;r-)<71(BmBdT_2OVU9ng9R* literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_set_volume.o b/hardware/arduino/mtk/system/libmtk/debug/vm_set_volume.o new file mode 100644 index 0000000000000000000000000000000000000000..8246bb59be64cd03c1e538eef00a4a911a7bf51a GIT binary patch literal 1212 zcma)5&2G~`5T3Q;lC~JG5)ndzG`|#=NKFovI2b3jNKiw-*;GUv z=p%4N;x#zYLm#1U!3ojcdV`sGH;H>O zuhTMDMWkP>oR*KeZr>N~QSWfj^@*<(3Qx>*y*CJ2elRpEnT+Xlgl}$Hw)N58v~#%) zGt0BwhWsOxd%oA~0NX%l#n~)dj;*kpY*kONBwJ&*wTBFNf7lgX z6TJvR-&QE_54rF^3E&5w@PIe_ec(Zl0#e&N3%u3qcK!D#!CKrCBIq;+!tc|;|IhBA zj9NM)<DjQq&G(SaT?>*Nr32TJ_e~sKCDMQ4(;mx>MskkI$VSM2uVe2mNgc+3+mer z4rLU-mI3v3Ny9nvV0jDH1*{(ccM29x`B#N%ZO@8|z^yp7?Y!gG%H?{g;WqNyPRS+B mTYUNW9$kDx1Fmc&CmMW2`lc#eJz8(gFqFZdtT?R+8t literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_setsockopt.o b/hardware/arduino/mtk/system/libmtk/debug/vm_setsockopt.o new file mode 100644 index 0000000000000000000000000000000000000000..d3965dcf9c381277769ad85961ecc210bdc976ad GIT binary patch literal 1244 zcma)5y>1gh5T5lPHU=e5jN+J6I3a@^LQdykiHHW-j`s{WF^Vk_38eGi2?t^v&KrcQ zG&}$W1xl4ipn%Q=5-$KX4-knebQTTF_-=D{Dn{C!Z@&3&minT`6!lT^d~) zzUN1LH1rL_M&wbX^k-*15$nL|?5N7$@kAZcCqLS$dj8i5mxpkD*r*$Cx@O-J{a)*3 zZ(k5^6bkp$bhUS2w=8?08Y?Smc~@BKnx4^LXI3-o>&t3Z%W4_O-9dT7YBYC&Eh7x( zwm0wAHZ~uuRw3jIvk03D#Mu?L;7_ncmSju5+YGe+peq_p^ul(0M>jhXriu98@S&P&X>xgO18j)znIA#gBMmoyh zcfCu)Cj?YOnygzw0&DI|{wD(GUvn6#i#a+egBeWhoJCGe3Q6yq;8omQNAeV_P0rfTJ!+Gk# zYAr|!NVP#L7j&F*TZK|(Tb~wzX_PDZT-mH}UM<$lS}tEMnxuJd2@~I=i7(0?fH}1_ Z)}y{H;vt@)PecLg=#$vsHpO_s{{Y!dii-dM literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_setting_get_date_format.o b/hardware/arduino/mtk/system/libmtk/debug/vm_setting_get_date_format.o new file mode 100644 index 0000000000000000000000000000000000000000..cbd1044d1af56cb0c8aa6a21d4c5ee2d08e551a1 GIT binary patch literal 1260 zcmah}O>fgc5S?|L;?hd}0EAPjVx%CYgj!CCM1+tapH79_peBcki|Zt&i9{N3Hi!r$ zegilD2)Ew2a)4jKk#M3nn8|wM5UH?|_q}=Zc4v39oA+g>!WaYD7^EPI0G^5cep-IA?7S^)CX5cG)UPns&sWcsGtJiawCb}XUBA+S@yfYz45{%qmOL)}_z+ICIq#mHxF~<_l;dEW4+4k zWOBJ}BWq^O4CL>j-SfR>7uYt^c>ZwzextO%w^N4&MPrL>UA@Y#vFkCNCD;brQtmP^ z2csVMnut6Q*pV#oUzpr~!@AFYdE=u;$_rU@T2vu;z#Es_lgv9nD{^>Y_hJ5CC=(9{QNC-!q}vGq{RNJ zKzS9mqBJrFx3G`)J3Bl1y*MGL$9L9tppwEi&yT-&J?@{U`pRO;o1 t+sGH3vP%Q#e*s^ri*GF$fqQXLS{|Km0vDe{)RzDrB5vS?dQ351gg^Y8kURhY literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_setting_get_date_seperator.o b/hardware/arduino/mtk/system/libmtk/debug/vm_setting_get_date_seperator.o new file mode 100644 index 0000000000000000000000000000000000000000..03480d2d115dac888f48343b1571503315ef2d31 GIT binary patch literal 1272 zcma)6O>fgc5S>k&;?hV>3katmFj5dHX;)5(AVNrxPp86dq$Y=oi|eFT6GWQgY!OkB z_#cSB!L4_$aN{3vB-|=-fSK4Er#VEd4Ans%)NqvZ?z0MeuHEOk))_4A=D zAkoy!cRhRH3ei12vX5M0A3DNC;l%YE(f7z_mP$|cbfbUjwOwzho0*Jmb%m>M8Cm0P zb~BsLuj@IU<5?&?Lc8NStuC;2q_M)@&XZ<&XM3{&3lWtqvQ_0eyTNWoHI`&+>`r8Z z0Ur!|!f7E2&&Q5rp8JLi_q_m)t8#$11_R(;p8|4cc@B8H-|M-@Xu(?C5yI=XPK7(5 zh5ui>i#9smg}_c{TnjjX67XAyivcJ2fe9UvG#XDn6`%V-97Uw|!G}rjze<1%D&(K` z$y#KV+(1rawn)TA^XWu_Mn1|v4=|A7GZLyHo2*NF!BE51+K;19C> zN#xh0ko=J;J&uzbC|*Tv86R3-0v|djxmTp{3=^M-1WneJvBYUzf!}|nP8c0m50&Vp z3Y1siUYJJ4AccLn-|5-O9~H^=h?I vY1+*~(W=-qhW-%vz1sN2c|)-0md5qbIVW)wc|>gq-#OwMUaS`sfgc5S?|L;?hd}0EAPjVx%CYgj!CCM1+tapH79_peBcki|Zt&i9{N3Hi!r$ zegilD2)Ew2a)4jKk#M3nn8|wM5UH@z?tAm*?T&Y|oA+g>!WaYD7^EPI0G^5cep-IA?7S^)CX5cG)UPns&sWcsGtJiawCb}XUBA+S@yfYz45{%qmOL)}_z+ICIq#mHxFJ-X8`nKNuNyI&C;z?i;&S#(I_6 z$>eg|M%K)l8OYy5yXSk&F0gH+@%-Wb{YGhjZ>J6mipCb%x_XseW7lIkORx>LrQBs; z4n{rhH4%9rup?REzc9J~hJ)GmxCdr)FaR^?Q$X&FnFX`e@Adpsv|ugM<2>j#huj~? z&HW#5qJ@rjA+*x@RzpsphWrNNV#o=;V8TEojpmb2!+txAV~Et=37C%JX9P&2LjGBw ztVL$YE#x$3mqcu|-sXgffqayI6rxZ8J|dwSvdOx%H>~+m>YtH_J0%q9TN6HMgI~yw zrje*gA^DXVUBksK6fdK;f}Or^6+4}i+$&PZVd4Xku*teImN=`c@bkCS31gG$krMl> z0_9cMiqgm!+`=*1@9gU2k5BT^lsF`#0NH$A1-j@_6ZJ|{VSasi%Y-2Ymw?_3xoFP1 z!r(xpCL^6&doCV^v5L5+;CS)lHCvG6kZgnL6fGR`2gPdb(E7&=aBZhn$UAPWQmL04 uZX;iC$}UZy{{?)hF21#31n$K}>GSA(6Zr8tM12Y1A>syJsK*rJMfd|;$&i2m literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_setting_srv_command.o b/hardware/arduino/mtk/system/libmtk/debug/vm_setting_srv_command.o new file mode 100644 index 0000000000000000000000000000000000000000..9d9f0abac73b252965f97b9e73ceba385baf87f3 GIT binary patch literal 1300 zcma)5O=}ZT6umEBrm13EE2iyeM`~LyZlSGz{ko@_d?1kWmtL5AwKXi^0xmC zykakPWlFiE+)$u-@yNe-^56yE<;?@%K{yx57x|gxzWhjeB@4~LqXOUI(G`e&{=_EB z>2F^T`LbM?hvD4q+*Zx3+d@><*UY-JWv*`2YSwxQ4Y^F_x*98NY&xs9(@=BqxN1~{ zt@iFS`su`r@f9Atfg5( zIF;h2u?~Vz(ZE@4ux^ z=x^=3qxk=-K=}ZScGAcgoX4@+*1BgWf3THrr!iJL0kYnFpmpCJi(Bt;Tj-r%zB1R~ zhZArGDY@vIAs++ordlJN+k>9C=EZcbgFYOO|8ccdm=G{g0?o+iIHc}n@(YXlKipvE zjD>W{Fc&y4%q^KqskAX?l6lP*CjOx&{$ox9%;SsElIToFaKZGjqWu5@aTFiXHpO`P Fe*mi9q5}W` literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_settings_set_tone.o b/hardware/arduino/mtk/system/libmtk/debug/vm_settings_set_tone.o new file mode 100644 index 0000000000000000000000000000000000000000..3a50bca5532e55bb341f608f05281a118555f879 GIT binary patch literal 1248 zcma)6J8u&~5S~3huoEFW5eVB@;Y5ODV|+RX3nCigw}DHHVi)d?vvZ0q;Rkmcghi2- zzd*;IpiAMN27UzFjPBn(y zR=4$n{;rTO?CfOKqE^%jP& zPJkRnh`-E}T11vuM@)0JDTs~MODvEWh)4P7o)uAmF9=9OHmTdh0BTNU{2Kysw?stp z)&x(|;4h-C?+HzEiLWfh?uz4vj^j`b1tLw{KCI|tz z0eOVPqB-jdgR)31MylI#&B-5nd8+H0g5z}$SL?$Thpj`+1T^?JM3F*~KQQ8S5pguelNohH67X9nhVLZX&Q+*lR&lUN0y`<24WV~~%B{tty? Biu3>g literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_settings_set_wallpaper.o b/hardware/arduino/mtk/system/libmtk/debug/vm_settings_set_wallpaper.o new file mode 100644 index 0000000000000000000000000000000000000000..bbd809dfaa59c23f1cfb932beb39d7ab9d1dc468 GIT binary patch literal 1292 zcma)6&rcIU6n?X9u@#LJFcw&GqnNY;n=Lkxcrm4Pw#LOKltd0B+bwKplNNAyP&sk& zY&>`{ocJU3)`N-vfc_OE#sl6OFZy10hpi+{e96rF-uJ$lH#Kq77hd3-5_xW0 z7w#JY`i>(U&>OxFy0=dOsq=aP^zHpl$K68-*3umzyjJ5-xIQiX|LhLRX!}P(Ih{c} z#N^^3o&7wAqehWz(`#>&`BB0U}Ezk3TjeFdS!rLz{w3H zuOfE?8?A2)8|{<)R)nyHiFX7-lXYb*{U9HQUwVPIX14fd^ZDVA58 z_BE|wKlJhH+b}0!ZU=O$WMEf(UaC~rjo|~pHm&MP(Xy+Y*UB6AMsdX|+oa#cp8~#9 i8(*4t1oqI9xF*`$DLn8k^qEnBI{In6Ogj|gCHM>1@SjKk literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_shutdown.o b/hardware/arduino/mtk/system/libmtk/debug/vm_shutdown.o new file mode 100644 index 0000000000000000000000000000000000000000..5221a5451832f3a044493c6087b6f133e8731747 GIT binary patch literal 1208 zcmaJ=%Z?I36us3n2s0WO;zU5A9mNF1=`gYR0~kLjcatRZf^uEhcH+=*uUGZ?mygVK}ZU-2#d=X**3crNU$VJu`ALo z2I_1vcDg-`j?LpxAlrJWI@VhU)Irzjg4&zSK(!}C$X!s2p!O%@v2}1jpmatjQxhk0~o1&;9)uPUkH## zh5UY>s6}RhHN-S$mqcu|-gy`Cfqay|??tWxd_+JsL=$xzC}7R0(7z(!_lYaQx5a(J z27eHBmW!m4iVX$%CcfU!D9xH@{3H-(C?!>v)1|h)zPM%F5P)-#K}ar| z6PFlhJmrpbZu%O3=5adLEeS{8V^#Z*aUe4Q)u?DVl%7-?%>&JE0kdv2%O%5X>Uyiz tHru7LQ8UT$!g5S}izdD%djY0zS@*n>xS1-}Ol$(s9ZKN^F^J=j{Rb)Wdu{*# literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_shutdown_normal_start.o b/hardware/arduino/mtk/system/libmtk/debug/vm_shutdown_normal_start.o new file mode 100644 index 0000000000000000000000000000000000000000..7521061225786edfe72a15c88aca5717a185efcd GIT binary patch literal 1256 zcma)5O>fgc5S?|BlC~7u3Pe&Ou&N?bLRWT)M1(3qnoo*Lq$Y>nTqm(eq$Z*E28cM& zJHG&lzrn4C-r(4O!3n9oRpJ0Mwl`l=rH-`w-pst+S&w(W6pSKc45Tqg!pH-t`A#J5 z36d}mQONvQc(Y)9&L`rltw;i%M9z{4IFDUsPS^>QqC3&@xBXabt_A0}E|r9O0LhE9 zKfh0lTows%v2$SKk~#Jv7xpIsylDvwc-?h@J3Vqpt@AYSMz7PcyC}h0+!DfR z*ZabDgO9rgJVXt(cP7wMkBxv6gadvbaW>!tzc8U9QjFG&j=gy_`M(k% zg(1?9>trobORgcOHJcPfJI0Y95*XMjB6Ul? zPRigfvi+gw*Cdzp%2@m+ZmwZ)4r8}*(D@c|P@m+tB84qXd?gZ?tSfzqe0ZW)bXxk~nc5bUqA^C-Qzh>alOr`^#JAXG3rU zbfl!BHOmTv9Y5vG)VG5v|0wXOuS*KfS3O?dfHeVYP2fgO!zueVSFY@7SL(qm8I|p< zVOEO8YN2M6jAnD|Ofd}q!8%&Q9eeU0OxxA1JSd4N}lD|nIeew_-JNJ$P=FRtTQBoZOuI292{ zyaJEG3vi+j0Z+lP;no|>c)f8*FO0N1-+c4!&hFUzxn|WFV<3$|4&n%)A%avf6y#tH zR7ihYf4OdbtlrJ&eaI<4V5VKAFA^83sUE3~(-Td*)rZ-}m3{`f*-w@|D_{P4C<{n$ zYUcUS9uJ1L>-as}9ZlW_lrt-pr+ThEn)t5gPjxe&*R4U|=?6x^cwg8r93JlJMPB3u zC_P5G<2l^{uswvSQtS9hr+R#}--eZh%2wHyvdwnb?WD#sY?s|jJYvAd(_!Fr(FeZp zeTjVU4G+8z0q~v^IKaE(F>rrG0jUeT2;3bFhaMi3V=e9kfj{U@0&h$Q|3ABrGHU5c zB&WVMB1}$+@E!E45hnK)6FPe0Xg%pv91o&6iJt6}aPwJwK7c$jq+is@S|pa(Kul{6 zh(x3PwnHQ)(oz0-h!|)% z$M;>_o%E?NA1_G(efQXw^9ty35|OA^opa0k%fCzrl5hj)9g>RHY$X^x6RB{fzO|NO zH;SpRn+a;-@}uQ0WCO_dfLj#)4%A*{a#3d+h}_ jzDpZlmOlmiS_!O8JY89e#ZHz=A~7b)&!ur&OySUY*)FgV5)oaNMxu#- zgE#*XZ@qc-pnru&@nmoM9<#$DNp+H$?|a|-X5P*)!~2R|WsHGr4AKxq08d2_&rJsPukSvxmQAU*lUQYXb9-|xr* z5-r_2?K{I>-+Ar@j@u4;r`|MdyM6~vR;l#BNH+!}zwP;B!^&g~yBB!Io|!dYXLqyt z{Em_1Ii7{WJ+!-?+v)+^K^iX{9o%o05B7H(u%u{gnQf?7*)?`Orn4m5WZTMJ27EZ~ z2W|^7@C9}y^Su{5@ZJQ#J8s|tZw-gQ{Q(8!&hi}a_MqSQUZMqSaW@G3UTYM1L%F&C z<4v^C(JqBnI^SBz3Dl6^KwJ(v!52&zh@{bc@@d#_hj9#%+B*TWQT&Vm8C1wW?~}F2 zEV+rC=IoJ(jn>k@{d9kD!@l1R6{mdm-dD=UrGHl5^<-5B7N(^CvETx+3_qA zH7O*&GN)^}xQXIr)Yh=m_a(5?Imx{ug*+xc5DA;CD`ScCx(YvkOPw$_tsW_{zba5( zh3zPfjKM7&qy5gWPX72bA5DovDhiM-=2f7J9yL*~JQEhzm$yt9VsHuQ&5(=cY$yy4 zMQS?IxpfxeQ5dU;>k5t+KVII3Q~;?CaJyvUP&h2r>PO~3W`JYa^eXta(sY`I rqFr%l0{u7OOLg$A`D1V{E=r$A=bOZj&m-z901pv2@j^YO7%##fQv8p^ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_card_status.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_card_status.o new file mode 100644 index 0000000000000000000000000000000000000000..f315b4bee33d040070ff813a317406e20121a4ac GIT binary patch literal 1256 zcma)6O>YuW6uocwaA=d#Hhuu2PE1Xx*bypG;zlT+>Qqc&!NO!5U?L=r=i+$mHbfPb#n@)} zEIY?8gc2;tQtYyFgMmJoIo#@D=B~&?iCp`+&h0lG^nt}K(0h{!==$UkUb@A(JL*ljP5b`OxPm@9;;8SZbME+LEk+ZK8lZUrPNO z0&%y5B7GaeCv9+os2ecRlPLL>1$`YC&!M=2S{w)MZyg7nll-j+p@fC^1pJVFC6{?o z55phYMi3#ddq8ph#SYXj45@h;5ra!OmjZ2Zb@E5NdQe8L%?YCAdf0p4bBpNrI1rZC zm$yt9LU0CdA|w|*v#Btsi;_3fxjk9pj?d{_Hx!&t|8Vs_Y;o8cfNoTBIF%n&nyrJ} zKipt8jMiS+FkAI{yVfx~aUhW#nXJ~q5>Y6?udxvujABcq+pO&swiFXsZ%`~n z0*N1h4pQ?0E}%=1f)9X>8VcwzT?!<)*Rx}9Ov6Y!_uO;O%$c3X^SsU(V;~!YI1Dp@ z1Caz%eL);1Aq2e-4>{+@@5B1M62AA2|IQuquemaxYrO1^Dd&_KeNYZ>ik%XnltMzdCH*88PGHoG2+mv{H)Z{PsaGOJBs%Ls$%&5fIt+{WFNGK~2`Y@AI8X4qvG_D5Kh&9W=L>kQO( zr{$PcjE*g0Ln7PSQ5|dF0kv*ACaBeR8&rFj5>hAC6sWb`R?B*f67*6{$FZB$J;!Rh zKlLAB9yN3fW3HCY;=sie0xq7zIPPK!U$79vNF0qPT?oG=H}_+t))isUiz5d}AVYeu zPI{48Vhu5kStSx1%{S9Wq9YyEZ@W>j03Q*MhiuZfhy;2*k^D~t;{FLn>ZXKF%HSFn zwg#E-q?GhN51+!xH6$mHyMQ09?;?J*Px4<8LLCdb)Ea3I`zK!Ta9H*tMoCGULS%r`r`v)+#ltH~GxIT++&&H(CyWJ*&( z9+p6b?3d+d%hvn)-JCvvyz&hu+GX}4b)lN-f!cb0qG{^`n5N#OSKl{^#+%|^v0UEKOT5I3 zP6=5<;gzunTj4+wc7|_v@kMc>U;HrGpA$?pYYmr!D12N_7 zlM@H6mz^Rpk&fa|A}hQApAb+DIb>Zr8`gX+{a+D?|44YGZdK@{41OXynK4n5DCtu% z{~sgg z{JiniNuQa<=P4P;%?YApT!GCiaZ#^6^Cj1pf0+=Z;TpbdadygCOEDc65NhB z^>sCcbK=4BK5T`sbq3t388}srYOVIMk(7aLTJ37ZvfIsOr_r^$m8#XSNkuOo-=vMN eDj0*ESbo~O99}5xQ(FRfjCKQmmZ!w=lK%mo&wZc( literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_imei_ext.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_imei_ext.o new file mode 100644 index 0000000000000000000000000000000000000000..829620723e4fd9e6fcc5be334632f235b21487b9 GIT binary patch literal 1236 zcmaJ>U2hUW6uq-Rg*K_QX;VPdO|1!)cCu6wi7~N!qi&@s#PGIV=%#GqiY`+l(Zm;j zg#HhG>q8U&fc^^Kn)+nl^j>xcC?QTVbIv{Y?A+Oz+5K47D~vIajX?^=5x~9|gt9|J z3Kk#?xo?Zl7WMa~WPH6FO2WO+k5m#a5|_DC%g zPOEVK>#VXP3;7tWo>ksDM&EXfV@nveW7&rFP5@Mk#fNID(K~TFmOD_Z>9nfb!cup% zjP@q8oyp}k)hy5Q4CL?QT&88VZD5;7L-~Wf2hGynlkEn~DPb02%fS`4%GLrg7H0`| zOW9(;`vXUqZA9UE*pd0GL|^02jTZ$sS^f<)yGQU zN(IUXVQrj7#vp;?qmec_JNZMy{3wm_&2fNiIv<4fD|xS;KGLS=m$%F_1mGHMAte_* zv#c=KMU;*9?S%{wDL(dN+Sero#~B|j@4$wDjU(WCQNtnsyjZIrXtS(fRP}lxuN(DB wrBQAg&3r*G8|0+F0DhYWeqHVWj2UHy`xwVX?c!Qu3jig=1YR7vV=+ANf2YKUG5`Po literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_imsi.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_imsi.o new file mode 100644 index 0000000000000000000000000000000000000000..a4176b828800042f605dcf7493134c111921efca GIT binary patch literal 1212 zcmah|&2G~`5T13M;?hb@TYj8^iVv-nlGbucBqD?a`E@GXMrv}XxVTPg5lfhW?II$O zcmW=P*FaqQ5bzWnI1p|MJH}+>7~es=7-KS@F`%I(ALWxy!EZa}8MHJ$a5J0v)d3XIL;9pn)FQFK24c$D zCnpYCFE>SeA|1t_#Fl#jJ|UnQVu-qQHmvzt_`f3H{}J~H-741!8T>?aGGn|ZQPN8Z z{~sgg z{JhE4NuQm@=P6mp&k3S*T!zgnabB-6^QG4pe;F5K;2OSces;=PlNeNHxx8;jDQ?G{ z`noFNoO-bO0Jb97Is@IR8#q;u>g~?4k(PmNTAfZwduER3`tiBy)EHwR2ZJm`5kOr8$-+dC zg$2+c^=F|y6UY0&Y5kzwa@hSTG|v2Eq8cloV+vAAIr z%z~MR(j(l<^SyQt*ap&M>0tkHtFphh)r2`kWAki9U1c}fT0&=OmSK05O$O$0)aPCs zkp}|1k_G-7llvbym`5J>z-$kPUXSSxQn0WP?~U}OT71OwD*U~O*Af%=D3iG4Kz=H$MP+0R zGB`))jqgtSTksq~^;ZyZ>&q~O|4W4GkEjasc)ZMm(|u2XeM mNq+(SHeLL>f)ThgY$kn7<4qOuUi1Zkr-&JRads%i2mTLFVug?Z literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_prefer_sim_card.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sim_get_prefer_sim_card.o new file mode 100644 index 0000000000000000000000000000000000000000..1b155f1479246acf0cb2b74692a67afae2a1a145 GIT binary patch literal 1260 zcmah}O>fgc5S?|L;?hd}0EAPjVx%CYgsz+ti3lME66GhS~TA{AEJeQ(~p-SKXA^S*3V7-JwCgA_y&z@Z4@*}#y3 zCD35?)AEyL>uqT>VRRv-euasCzIvvdX;p1ct35r|^($SNtehJskeYmB$&?RXtDRg1+3MyfFwd2QDl8`X5$uzJ30?3x+#Rc0rX z%WWH3p5+(N)4YsA+Wx$8y zzVEaUeNSLlGS7X%efNzIyyN%|@YZk$+#66p?hMZYZx8x?_a$1e7I%E#>$OI{JCvLI zKi)(O9qmGBrSq+YoInlv4aCKe6MVshfk+z7C!dD>b{NMHsl5|09mUTGkVb|4vp!ji z%#xePY0fT**l4}YfQf;8lz$YWPys$7p&GKuy0kZ}c`EhKNW`5IiuA1spR~a*WXID; z)TEI7%8ahz;wFlhQCq=I-?xgL&PnbSDdaHmfk@b7T^UQ9)m8ZUTk3?dpn9al{;EKE z6}F-@G6uJBjP^UbI{D*4KAIATWE3Eq&#OQeJ!+y}X)4UGFK?MJ#NZOpn;{p?Syvbw zh*U7rxpn5^Q5dU;YYL7RKVII3qz}msaI0wIkUuEa>PO~3W`JF_>V>>z*DIAqxoJ1^ r1*>e+1p05lmull%^TuFbT$DbK&NqP{pF`A_03IT4;DvfjFb)Ea3I`zK!Ta9H*tMoCGULS%r`r`v)+$&tHBrpIT++%!2oK4q>3{^ z4pu;g^q19VtJeG4-HbkfobnB(+GYA8aiN;(q1t?Ys%e`8n66#wXONqIXW6sLuOIhi z0clOmd^@uJ;m961zTI=YK7d)RKGJjT@wwM?y@_t-^SU(*T>Zc(7;g&ug;Hr(FY+QU zK=}c#_8&VeaQp&T>!lA1P<`7?*sS7L`YrWMc}>hXym>^3D)9H5O~AxdEol;K>xS*P(tlo z3Z>N3W{AlsA-;olImBc>V?aksKFTMZir-GilW1vt5N1A$s{_cRhxAdMtVLpp4aAgl zKu#RAUV4VaL^_H;39aw~d_q7qaP` zi}OZTCw*!bU!tyZOM*{w#SUGLbPa>c6Kq1pc(bzKEP_MHa>}En|X|~C3EB6@i;n)w| zHewhE>`4}QFL~&lg}}RR=mKvKhrojYIi$|>0`Shj_dPr)$6DMC!=T?Dh2D@3{(p7{ zWz^QCNKUvgT2DF+$KA+JAdUFf6?ej_`cd7>t{ zq*vzRDsFCK@G8dEaM1ZuIH*tZTaiKm6Ca60ChJOH;(T0%Uw>qrFfpwjM-u;3pu7s{ zIE{?K7S8ea&hJk8T)$izuxqF!|tyS%@=WkQgEE5MPGiq>o>Y>FZ) z`gS56MC#*<$jA1NGiir9Oz$3&>yg*OL#~=R}-EfC% literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sim_query_operator_code.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sim_query_operator_code.o new file mode 100644 index 0000000000000000000000000000000000000000..8a601a6289e6322358b291622ebc2ddbdd6e8885 GIT binary patch literal 1272 zcma)5&u`` z^zOglt%v>x>dpValcwH!)AyJiK$03Knfbo=y>I5t&d$6o8x_VFh{hlV^9bN64}!U= zAqA@thT*5^SoynySU(eKpl^#%>4G zYBiHljlO5AJ9<_>%5GIw$e1NTGy@_eA_A>WWz4 zq8@->zlBaHPpi)r`L7C;55U$ujf}xH9QS70;_BoNPV=)g#>shrY&jnQy6E%9>phtX z%j=6<#tkxD0D3dzqB$E9g9DzLj&yF_rFiVebgt_Xj^{sKtpiC9l3mb@qK-rUpjfLP z>i?JlX4R+{@`hQjR2t=`*~}M=vPl!3+n$Lp)x@{vPQX0BC~a>KdmJ}kLX52f(49-* Kg)%6{i|_}%#FSS6 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sim_set_active_card.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sim_set_active_card.o new file mode 100644 index 0000000000000000000000000000000000000000..b5d1c0c643a10996d3c038c4f2c53d5c4930dae7 GIT binary patch literal 1252 zcma)6O>YuW6uobN3azQM(KsOLL~BCDK8H#oF->&%7|>3|6c#K@#sMZmBBH}CNA_|W*#7^i7$EYoO|w>cW2(myenHKV+>?tkcMdl(C~vu zZfr=y5=0^Yd3k%;dRs~*u5}|RxEcADPQh{VB!8eBL@TjJvFgXBsxEfnIDVp}v}ce$ z`p&L53r9Z=%}rS-z8Fw zORyxnqTFJ@hoio5T8P5)u`8M9zTm=rBY<}t;Q((9hrqo71?0~19Psv_-*;c41#59f z2(Q=L6Yenhu>XLo=%M9Z2)wk$PXbO54)`U+SilLsU_wJAjh-i86#I=J4k1!|@55yD zw-O+O3i)S!vKE;o*OAjRa?fZ!6}xQYqx}5q^nP*dv`+F{k-`=xJ`f3-tSe)Qvw9eQ{+2pn zXk2}&g#M~P`7k7>X=Ds8?yx&ucU(cEd^YhD7<{LtA z25uuI7d^A8Ffjepc%*fEIv4kYnAUYg!SVEq%iFLfV66k(D(W~GkBimXuKo`<*cGc* zFf6-fn)PzSZWsltY?Jvp{txhm+IYvj5!j~}qgSFeP2dYZKvb6iN{C53M0DO%-26Y; CCyYe^ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sla_custom_logging.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sla_custom_logging.o new file mode 100644 index 0000000000000000000000000000000000000000..08b401d2b99a7b9021fd7374de52075eb3e600f7 GIT binary patch literal 1248 zcma)5&u}07VHl~SEeyUqBg+t?IUFZggP;eQH#Dj_P zpD^*?@YVx2ul+B)cxZ1;Jm`Du4j}2FFPZti_q}iD&Cbq#E|^8e7|39dfLR7m^O8_z zVo1OWM4-Kq+5Nr8wfx@m%_@YI2wP(7!5i!*yA@Db zjBT(x%0mWxFzO1sjwoCYTavj>hYRPU0Dfo-8+d&%0PglEA$OW*fH!*Gu5*MI?8R*% z+;)8^oB?h8a&Z@Jbi85TPG|hu=LA8Y-$q>WIl&kUIwEQGJozFx?)!NFk>aZd)7kr! z04Y?+Kkt*h$Sk>moSu>2jMh_e$RHoppZX~E??|YJ4B5Ag0`}}n{U;LdUU`c2t$99a zgFna)rkU51Qt~Tv`c+)qKyewh>o{nCt2pSKVzV+b1{%&gQ*C~A@`on%X&H06AG27j2O&NyBJ=v0Q*Cj5dCNRQ0ImQ> zN-lb4U15;-N|Tw+?ae~|&d=#w*A$#D{Bd~$;sWA_z|EY2Q}$J^T-i4+HiK0%E4x|K zsuYXWLd~jWcg=!D-liig{68)H!`u;A7q-HE(0Rsiv(FIK6_~uk23{b#Ybt*Df3_Wq AD*ylh literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sms_add_msg.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sms_add_msg.o new file mode 100644 index 0000000000000000000000000000000000000000..af97db262dc4616df8794ad21ea52478aec49740 GIT binary patch literal 1228 zcma)5O>fgc5S`6e9SUj^wIT@yA}Asu)N)D$QG|r@oeGzrCWiJUWE4 zjmf)u;Skb4zp?Ax@~5k>-#$cdZ&JiXWl}a&{ZjX=czGJ7_mdqc;MUK^iO_?BDBD_xE<%5b{YZ%wmB}w#6>` z<1E3F?27L;1I0P9T%(8R+8l?1+2%9FHD9}+3=G!*rRO-H*kcOFom29l^v9NEK1U1I zQViF%N4;a$bi5Dx54egRYH!H%QjfbHCkS}_5@Oin1fMXGLL`meC!d7R4KMa1(s<8d zHuGNzkVS?3i#}0{%z~@P>788?anO2^DdQ9QDF47it^#~SLN&w?b(<()%@;!df`p$d zt_WY0`-BbtAY1H<@DciEE`am6xQgOA)Hd*;{n37@PvTpV!hK9wM7$x^6S2TWJpjM| z3Z2kD{qniuU#dX)0L12LWDK@&uFkZ@)yW^6=4WY)t`lhYKPraD>8uj74d|{P7Y`d^M07a{)IF%k%nymwM#RYmp zYn4ly-m2HzwT|8?m9?5qrX$nU@kZ)+r|c8Zmlvnf)Vl<3jLuPfo$oJ+hvhNF_>=zu DbdZ7` literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sms_clear_interrupt_event_handler.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sms_clear_interrupt_event_handler.o new file mode 100644 index 0000000000000000000000000000000000000000..1031358883815ecc832de8201c497a2d09b13397 GIT binary patch literal 1316 zcma)5OK(y^6h6bNU}FlkMnIxOF`?E@E|o;m#2DT*-ij$K8aKBWdLtw}>Sbt3T)1&# z;?n=&MtA)Y`U|>rV@%z#({q?RyjDyy^L^*ccjnwV_soZ)USf=a8Vr&!vj95M@TMn% zB&>rU#@~Z4gVpzitH@StzvYYFjD0D= z8{?0q%n2la|6~u3bANvAtAq~v%O~aYt}*BijAq9&ZKK^2mTeEugkhaqJz=!W-f73O zC-QPWzaLN5`a`>E*`s)QXD6<=g%#h^Qrf%JZYq=6j;DE=ry%DnLnNM-i4ZB3j?2O zi7fAXfO>v5WWM^;v3$PjGAVGw8azizDvH^3F=)uG$x3y*Sh7DkHq|xc!gZC0%$tx9 zkT?ad=QUiiukw}Zk+xDS7-hYh%j!n8RH_y0Mm?L;iw1?hwSvLuBnE Ucroh3@H&8w7{z9LO*S^kf9d9@o&W#< literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sms_clear_interrupt_event_handler_forpay.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sms_clear_interrupt_event_handler_forpay.o new file mode 100644 index 0000000000000000000000000000000000000000..6ac9ece2dc59ff52b77f2e899ad7a24e0353ff29 GIT binary patch literal 1340 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 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_box_size.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_box_size.o new file mode 100644 index 0000000000000000000000000000000000000000..416043dcf851819084b7217b094ef593cf6658f4 GIT binary patch literal 1244 zcmaJ>UvCmY5T8Ac3atsW!4wedrK!nP+RIUi5??IkuX>fF5X0LE^ioJf^zLekn)n6$ z0>1ereB;4)U-VO$n3&YJzSWuA+k+C~CcE>SncvRr&duJ(icw{Zffx)_m}&rRu7vX* zL4_5FK;dibY0P+E&ZIW`;SAi3{!lY;zHt$flh?ztnkY=9Nu(Be5~+V~CzH#4IFDaQ z8RZ42zkka0KfmsaWWKz-1c=wZRo@OxXXuzGmTPuLXQnfFX93horH6{z9G%)d%N{GW zY*sM_uBGhhIsHv;H&-ZZD|s!i<)C;E<8`b~cK~b~VYqm7_@Grje7xI)B`Lz9Y)wwE z8*Dw4WGR+r8`2H~%^45fP8X$XbJ-Wjwq9zkb>@P0+;KagbsYyZdqfJcb6Os>-e@?q zULgf@X&u+K2i;TGa^^1hAN4l+sKiS?hw9w+F$vknH&I4?Ok#o#1tr;NKk*_s@A!HM zC5=y91S|iX09mvUf0ie55m{gzG40tSBMyp}@DN{!NB&2?Ll)p5cbjWfq*|mJfRCY zYnS0K9U~Ya@8*Gu@nD*Ij4Fn)$zpFsjjOMt_vQm)`Kk1&W Ibo}7|0Mb2)4*&oF literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_msg_id.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_msg_id.o new file mode 100644 index 0000000000000000000000000000000000000000..f6182e00ed4a9dc7ee5de0ceae1c39bf9d29432d GIT binary patch literal 1244 zcma)6&2G~`5T13MkftEgDiuz#iiL`lG}LlRB&rGtrTGP1f|4A1sATeEHIWDjwp$T# z;1#%X=M}i+z#9NhfjA(QTW@71>y54S!brRG&CIv^IkUU@STU=NF%ZTe13?6E!h>jG zPRPJ2#9{I^`66k4D68rFgP3|tg`LC?L(Qsiv2_`dm77sHlbXz=S-cj19xn@5k^<)df2Er>~Rw!+rs z6x(2TA__~hO|~UHWT3m#k=N;>_Z;pA0y*{@-Lv0&p!Yjo2lTG%g6@ndAa-6afZiLA zM)q5zpqAe8JZIQF^K6$s{QvA8(x}ZbpH96#@i95s$9K`M_?X-b3mSUL(R$*=aXj$j z2zs(l+%0B)qyRb05I@WlT0|DuKul})D2Yb<>h+yG(5phili7$onDcsz^WCC-yanScAaZsPcZ$$`YESwYYP3VeP z_;6l^zj#vvi_F!-aae)$WY`GGh!`k1mlwJ4?!=GI>x(kRbnbyI*JaRxA|kFA^l5p2 zam)Ck2;6`jgv6pX>k@+}yfmMwZ_TB+=f~97HHn(I{Al$aYW!vx zod{OVY#bI%t5L1CDs8J>JTxm7@#r4_-=&2w%b9|8O#-#4hiUvkx=+d~fQfz+FU>28 H@v#2^wt9tM literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_msg_id_list.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_msg_id_list.o new file mode 100644 index 0000000000000000000000000000000000000000..cd3955c3e3a18862ecd6d4c38d5022862724142d GIT binary patch literal 1260 zcma)6O^?!06uqx}OmSicCKv%x8yyo6r+>JDzbP|c! z5Y9HHZ`9%;WPW^QH#?P|-%GrpkD_*{y|4_&a*QL>H7w`I7!8c$k>jF4t5!==rZqmX z`=&jSv|LWoN3JRDD0$_1emh?*W~G8$kn>Q!hxV@7?TvtCk%r3qd-vP5z1{5=gawgB z*k&-!F0spj1WU3MyC&RWAUhMw?e-8|+ruGews|bO=1UjkLD%hq+;bd|?J))9&dUXm z`(w*8pP~h8$z9jAN4*o*bo>|l54esVYIE54Qm;EcCkXod3Sz|P1fMV=A(BS-lTXC! zmLCTYX}t4bK6_gVkVA$1%RXL<%$zI8>7E@DanO2+8S^IcQT~CCo(k{*3Dw|(*KMGH zHJ@?)GZOE7c?$Q%JRi3~029l7;XXoP?gEJ8;tGlvP}{(Zo-c|Q^@+bLQmA3#EfIh4 z^?1y2Sr5Xm-&`jQ%-(#V1pcZ(`5>egX=Dtp;#`|+%d3+=G|SJ^7)y%)*=jyG+wXI{UFwQSVk3>C9;sew9N~{Cu Nh$%cok158@{{yl5k9Pn7 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_sc_address.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sms_get_sc_address.o new file mode 100644 index 0000000000000000000000000000000000000000..3c081ebde813338e02f378ceaffd443a44af3799 GIT binary patch literal 1256 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 Z*wpt0d?~tvi5UPBaS<=t4#jvu{sZdyrE35H literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sms_set_interrupt_event_handler_forpay.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sms_set_interrupt_event_handler_forpay.o new file mode 100644 index 0000000000000000000000000000000000000000..2c3956cd5660b57a314d5f152ada6d9b8b335681 GIT binary patch literal 1336 zcma)6O>fgc5S?|BHl;#ss-h+(f(VL~(01jNNJPD$d^!~_K}`-3m#xzp5-DHU+lq(- z65_}W{t6O@ir)agfCC3E2$frIFcW)|&{Ib8&YL%HcXr2XzbTnz#uzALkc4RjFz|v< zW-Lg;GK69DY4!1H^>y)kY(2i;T8Lkde=NiO#jkoi6~7aQ%gxc~Lc0hX;e(~hvqm%; zX~E^n=v_H`49Q>L*xg3{_s@M*(Dz~E*f{SBx9bYmmZII0w&R=)q_EHJo)j&sciOQX z@x1R0tRc-Y3WfbdverLyPHbnGFt)c7W?R~cJw2_zOz)<%*;FFKGdvBs2Pn5}tJwyY zLKw;&9X_lV4-a;0u%Lz65?c$dvm0z95M?p8$!=*o47fY&N~?)pI-YMShYDPz`0OZUqUfIZ*r$1m2zV7^RDNIwgY*Ow9I0>Bwsn6+jXf*O9!2+zLLl zzg2vwPwK1)p@E4n1bkELsaW}0J_vvQDxQ2`eDWz1_^$%xgRnbIBVs`PEKa!D)kz;3 z=O<~5=}u4WYCZ_rX%dlFuRh_fuCH#HCkVhI`` z^zOglt%v>x>dpValcwH!)Ax3F07=^Tl6l{I-}`3XFgwG$vQ}Y?0XGIIm}daby(E}( z1u0mCFpNG&pGLK}B`JQh8dWFdbK<%VUnd%)5d2J?se51OU@$J-4E31Jpt z8-Y!BgaOSsEG8BYg}(MEJ^54$|Ft-j(|ZyZoMhGT%z9*;q>hm?>ytK>j2 zhl7E2gc9tf7>;B2+7rhb`#^N9^+!H>EWjrWs0TORw}u4v zq%Z5*7xdo!@^Y?Q$CU4lDk2tIp2YQBM<^`tn>a~Das|044%*)u4mzjB^-5UyfE+iz z9?v;0@&Wk$hx3G@`^)Ey_)iC_2ViSn#)!cU^m{XIadpxM-TJJId2*g$v|JAWUG%wm z{hrN;<@Nb3^8_MX0(vu~qB$D^g9ESRdOEkxQaI@fgp{rQhqF(K(dvIB}%RMF)R zinaQodch3Pt6IH~*YtX&(kM6eX1<`6b(%o`4fs-Zd~5a;^z)n2_V#eZaq}g_*eU?s NxddJ)jdHvQe*tPUlllMv literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_get_host_by_name.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_get_host_by_name.o new file mode 100644 index 0000000000000000000000000000000000000000..46f3bbc438c959b2c9b68cf72bcc07f1a796dd19 GIT binary patch literal 1280 zcmaJ>&u`s@G;7exS`@Z+hyxIA&hovfKjDau)NpKLr zz6HG5sUQhK@WbTOQ_lI9k1I7_bft2*^?`p~UyVk3m!n7gJ%>BNZ*nvhy%{ZXIE_s% zjoe^7n8) zRa4u2U?~i}`JL_ijjioR8+Gux{4BthJ*(_0TXTomI*YKF>n;Py7!6Fdjo#EP-xHCp z?MkNh+61YqnkqWXIFq>8xW0NFzo1S)HgwY7xsA)0j;n z(T=f&DX@)nlz(V@n}*LAPz_4Xf{Fws0iR!xGWcg^rg zoLoloB63%-(fXFK(LRZ9#Sog9cuRq8qOQQg&+;Dl{a5hh-P7t0<33k`@*bdbbBsX@ zf%6@+vy4K9{%Z_0G8Y`Nb`>1a7zh;(Te$vWo$ok1*P|=K`Q7 zJhU$t#YxUO&zpoKnym#9k^5C0#KZ<^i! literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_get_host_by_name_ex.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_get_host_by_name_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..c74f4cb25e97b982c226b719f4d91628ec1a4516 GIT binary patch literal 1312 zcma)6Pfrs;6o1n{Sc?BZOk3DMF(oOfY_`}$q9$5erZp~*&?a(Qwq;{UDAn!M(8NR& z{Qz=P&VB$6dgH(c@StBo4|=R8Ihg2sot?IlV0_7&_j|whn|agOnLb}OIb#fzF-Sr` z19&BqV5Tcb!U%+*^Wh=q{P=yuoYo=_-tk}g1O6pn;*+(PheO&0ZCrc9A$9Rn_^qMA z{xxk*yRAWI=EQ$^{^&J7;GHAiQK%3uR``{T;bN?|nTO8kNr}JU(M?Ex{mf=-OW(g8 z^Rn8M7ej@6g{O6^*{E8N9AVWOO<`5q)~;Q5EN2fzgha(?ChdYm$*{%z_f>F3K))aD`9bGtk0`x6g*q~RMP0-y2C8SR48PKbZdfnMY3HH)$ zA>8dsOE^vM$Nfi`Mh$(AAx}%+Q#|^Gd`e3)-D`TGMCx}kh13(wOZ?Ydf8)>K4SGP=7 z{csNG&5(-bjQJR>%2IcvbK5$Vx4fLrb<~IB*^gJRLP9`d3v@GQ;E-L-71!2{f6M@@ zV6H7?O>2$w(sJ1+GhqJv!eQZhi-2bVOdZ3A|8(a=ZwC E02rjD@Bjb+ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_get_last_error.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_get_last_error.o new file mode 100644 index 0000000000000000000000000000000000000000..789ac6392b4d0ff8237a2a64b9d636004888fe1a GIT binary patch literal 1240 zcma)6&2G~`5T13M;?hb@3kauF;6sqohOV3vi3lM0`Tr=IP_kk1Z#0O4E;gpEc608`2X1* zlu=ukB02T85pe=F;fk^gVz-$(;5Fm#U($DK;EfPy^ zBBwQb6hx!_^eGb)=_vm=LJJsn=82l* zl3tmMtGKy|!K)Zs!$Idu;h;XrXGIDHOnf8~nXD^)iSuz4e*KYg!o;+C97+6Bf$}P( z<1{h`TR6whJHI>Wlhb^>BnfmsV!NDIArmK&iF(yp?DGEdmI*-ut^h|$Dq6FluqleH z=-aV$5UGzZA|Kla>k7^bKV060ObD4CaJypSRC-ovG!M2HAFr-NUZKL%%EDLe=DGmVEUBI+vuj}SNU0zDxgU;JP5ZHN*8 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_accept_sync.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_accept_sync.o new file mode 100644 index 0000000000000000000000000000000000000000..3d0137908d3debb33f3bf44f6247b6df216e6cf6 GIT binary patch literal 1256 zcma)6O>fgc5S?{CNLrz!6^JARu%Ji@p~fi@R9wh+0=NVX|a1(5|BI3Xa ziNC;&Kf$es9+9}fuiykKx87hT>vf{2NUXH`-n@CuAwyfww_I2A4aq1vv4c=P0i-BaFRKl97#v9R{U|i{jr})tqkELc`9Y) z7m)k;o!#hHfBiUa-V?=qOty}jhqmsHP2D|obi*{QiKn~MeG?6>TJ3?H>y8f`({iSA zt5A@&k!Q(UYEgY%+$?Ty=jD=8Qi@Qyi*~~@1|wj3q>;+*&i!6}=h0>tqEd{-*?RZ_ zyT~quQY_6f?5cE|f#ObW&ln(j4#%Njj`d3MtT!GgdxmF#GH_i`oG}IDE-EEZ%&~1- z`)I*his5OqL}FIJ#>VaUwW$QWF~u^ecNvy(qE%Li$U<#~W?IUk;#_uRtkJqv{8 z`Nb{ch7g>CJ4nez&#X%fnmjcdY2ThN#kL>QzOG3)p8eq}CTw`Hu?LD)Q*o#~t+hM5 z>Ob6|x3o^RqUoJxv)kzDy-HPU=wyCr(T~8^@f&ldpr2igmQ==`#s$|AQ>y@U&oX$4 JG>Y-?{{n%HjsgGx literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_close_client.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_close_client.o new file mode 100644 index 0000000000000000000000000000000000000000..b40bc095ae8b95439657c1d74d1357d6b9a252ac GIT binary patch literal 1252 zcmaJ=O>fgc5S?|BlC-F#6$mFp#XvzRp)03EB0`lQ--WsaH96#jaZ-y!YB1Q_iiiUj z4*Ufq{sy-mdO+d|zk*v;Zk0H|Ozch4NMWSiH}B2!&U)AWP%)~EF_6I^4Pyq-^hqQ) zG^AkxqLBZ(xV>n+FQ*bWyO9*!jr>Tb;52!bKT?jOwb;|x*5{V0&UfK7ex{_fmykaB z$!@iZC%=xX8?sS=@!E0quy1-!$Mg5% z$`UNeR+M`TxHsqvtBojJAGsiu5h{ zK52tLn6*aC?@5&W%7lIq7uQjoN9__0+Fu+8os)c5OkooXpC}1J_LW@Xq#lOff2B?s z8g?Hmp>rLm9tOI%aWGgxvN;kaS0{gDSRa*<-xw3jrt4w2bFS|9Ge+9<`tmFD4I#Jy z@_y-=WrYFVj|@7u7m^?ncLGl5x}@MdI2E3iw(7h3EIXJrqh2f+ zX1!W%RGMb9P&6tgxnJ4B#DCPpzswzgIiub1OcS`l$G9(b0icYS#E*#HN5#wk2b&3w AegFUf literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_close_client_sync.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_close_client_sync.o new file mode 100644 index 0000000000000000000000000000000000000000..5441e67acf612c01eb9fdb0ac38b5bd0f5d3539c GIT binary patch literal 1276 zcma)6O>fgc5S_J?lC)B3t0IyRfkg{S30*lQhzKD;z5}=fB{}4PWE|Hbk(vf5jxpS+^tv8s-dXqGVh?REVo0&H|-tpQW%SMGU268Y+!NdZ1C5&)( zBuK#$L?HKV`T4T(p_Gi@?1qzYC;TIogtNqX?pQgFRHM(LwJ+^hY_SVxE9Xj5dkv}6 zpKPODIQ@N6*^z|;T&bQ^j{2rIuubpCHSPU@=iu6N4t&!a9@ryUwOD+prJ937*LK{Y zR!yfhqvt!?j-JuqWwtZ9+?JN*S)PIXJxs71tJ4Fvg*2RR>^^9fcAsuHVL^$oC|e7y zvn%YX8e?&mVAqwq47fM!`&I|hcLjDObDe$eJMVqqdzNnj?|2??cR&WIGdv629`yV8 zxWKU%w|w92bq;;U3l8`na04~e=7m5@y?z;Rf>6M(Aw~mE@CySPBKatvbP=4l0$W9- z@kzjV6|WQ^jULiZ>trnwORgiQ9Qp2OKMkiGq@(!b0Hyyc5~?AGtXo3|)_g1d-;s#> zB|K8MDs)l?DhAqPOVlKj^vaZf9XHp}xrn~YIO+LTa8jS-S&>2s1D}ZmL)MkH#A$yB z{`{4GLUmMq;!!VDpm+$hNf;S}4O}0Mebc*>K0Jz#!)V{07|3Shp$k2x(`u+P#yPY5 z%UdP{DqMp5NJ&LGYYKyg2#r?iTX)7D1~&C|Rl#-M2h45Q^kH)kxKY$`$-gMp>J5Ev z4wzM=UdS6}y;5nGTV^X?Fv=#Sym9Ea&^PgWbBAEgD=c~(#{)dU=Zr1k`$kOQrK0;6 H!^`jw^v0Hy literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_deinit.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_deinit.o new file mode 100644 index 0000000000000000000000000000000000000000..4401428a731cce8c23666223363b4d0eb5fa4172 GIT binary patch literal 1232 zcma)5Pj3=I6o0cog*K_QY2$)KH(C=~>}07V5@Vv2zv{L$z=7Mkz(z=<=rSb|4_^Eb z`YpV8>!FEXKtF}Irk?Cg-(z+F>BX1Kyx;r1-_DzTGxMQnl^A27j6o7+5x|iQLYavm z2`dnW?AO&7tJeEMB6g=6O2AI&dolqR@yqO~b{Z~6o<}O5o4UT-g^TE=mM~sI^85$8 z+uT3@c~;s}g?t|^pOr>^dpKy@!;xoq+}?3dP_CTMKQfZ_!HL&)y|GbFr3|YlTw~8n zn{U&*>1=k}$nXqLL+$~}9oK2~fNdiTH6yk6@> zxI^0b|JiMnQEQicIraC*$K--OzKK5KV{%_GVW20Dz9(H6$2~s|peOq%-E@}62#`XC z^z%AZi^K|>i0K=3UbNl@4rQdH{1e|R{u2VKp-k1SAb~aCDE=D)d8Z_!bZb(lWbhkN za~jE-6p~(>R%B;784@^zNxw@R(_rj!mmGyCm)zppD}@d zDo{QMo3k_`20G4&n5y^Vilv`Y1-7+Z%z%|%GNGkef zU1M{5lYOg6>13upw*8p;x~5SR7auKe!kgSE@Dhsu1k5Ro%~7cC}Qh w7aMjXw{I0~(!FwpjqlRNm*tJYzET2fQx9Xfp{MBe6@UWzI9?jMUpgN4U*Up;3;+NC literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_deinit_sync.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_deinit_sync.o new file mode 100644 index 0000000000000000000000000000000000000000..4303624dfc89face412ba2957ad4240795992b49 GIT binary patch literal 1252 zcma)6&u_HEJGCXpI08Q=x@uZ#Pwbz1vew#(kVDep5_mw!)P`3C|3K}lI5iyoWxJ1l=2+X z$KTnFR`K}9k+v-g1sJa$X$Q994m*Z>;22%2Kj?dgI~sJ*P%V}2De1;=-|1M+NU3Hr zir)7uWn0avud`d(e122O@f^=W;SSnO%WU_7Z6b{n_IB?!%exP^8n7TmS&XfPFR+X3 zQb=YAmSk6@TMW26vOTkn=s7<21aqvH+_Trxw4SJ`v{E7q`qe zgkTYFBPAEjS(6xOeri0@zCD|Z?I5OoU6pV=`@`iOSodJP3tTU$I24|gYV|$!A8s(J zdc9cCjk=~aDovwVDC!l1%r7kZ5!eQPW6lVSvy0Iq(Viyofgd2s%K&A>BwixAZ!#YK EAKGk<0RR91 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_get_soc_id.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_get_soc_id.o new file mode 100644 index 0000000000000000000000000000000000000000..3b447bfeb7d374c25dfc1c5218cd05d9f6379044 GIT binary patch literal 1248 zcma)6&uaB?feQ$RMu;JiKX1?!z@7sC9>?|LuMvXBBG8klFo&mJ|B$D?G z8CZiT6uz!MUN_!XQiND6L6zGqT!k~}RODM!(I>`|=oxudG912~DFDk<$bWR8EZ z8=cbe&uMK(HVQCapVkgXraSJL?xAD8u!YBmeX7^X<$GGDH9l~9wlmS{*{o&^g{|%A zIsI*JJ69-dX?dRKIVj#iyJcJ5A+Rl^k>dW|-F9W~;dTpFlqid_&G1EbiCqqy$C;3~E!Y&p*5(z@~mAS-4Jq*A8NS!d`b)PGt ze>zY-42gLe8G{tgyEAQZb@E5N`mBsO-H&;kt%o5!FCz2%88hwd`tp|fh7gm)!34x^mP#V=Vt_JWq{S2xdoWr4ZG@y0UAB#!dhr8z z@L+oCNARFG4o&<5diDb}@l_KnQ~rED=E8 z1m4`7kb)riVfO76=ltwzxbBOGtH)cP`S<90Jl4M%KjEJ^JPiI&;_3MPc!|SBVs>Nt zk)QC{)HU^20xts9zkB&es1Fybvj+dbBP~ds|76Kl@%K3wo3OOM(yAN{)$ypSj*oP8 za4;|cDy7m>Db*Mq>RnBrNR>=RstpWH+ElX2yX;0bpHE9UIVWeK@EF%=YwgYeSQ<@l zVR!pUb8GwgMgx2_xdc;5;PliUjgWAwd-4~Xw?aPMt-T=AR zHrgO}#$%B65dmUnl*h8~ zq7GO#sWS{nsL4n9#Pj2LU|~0ElGFLToXqP5$e@e(cAlt3Y+);CQ_dziQBHBJl3@w) zDE`dSmK(mHK{bSkx>a;w&9}n;3k~zFnI6FlnLI&*6%6bxkXe%;@m)5*go`WaypFyV z9JD{$FZD^B6-{`FfyE{ei@FrEi{0;mKmY78wR5i> XyC`1hYpfp$0<=)a@Uip=<0bzG52uY< literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_init_sync.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_init_sync.o new file mode 100644 index 0000000000000000000000000000000000000000..de34b013717b0e640a1f0d406618f391e9a1e8b5 GIT binary patch literal 1248 zcma)6OK;Oa5T11&B&|@=3PcjDV$mWcgji0ApyERF4&XMZ$ssr6q!zJ69@uV0#GzOI z0yq8yw;pom0>6S2sN8yknXK1Ms~#B1JKxNFyWe_t?UTCRV2pt<23fd>0D3%#loo_6 ztU?T?UlXqq`p24_zCVo0H)VJj{jSM58O}22(^Kg*){MW5w?6k$sg)s|CC?>Uc>~#B zKiFok^84q!@kEIEKG~c%jz@+&85r)dW7uQcGu+vDuqZdH)n`h!GdXewmNQeD`Mjdr zo~3MSMeTjDP~6$cDJ8X}7NPtYCzzJmw}IslM#=|!PrJ3f7ljT)r5KB|_3$lro81Ye zSej+nhV+Pm>dr=<*+=g=+z$nEtaqwseegg%G(8j4zUzYOOei3BQ7wTwn2bi&7%8Zw znx5y_{UgtE{TKTWcMmz#;;7H1K6iagF6`sG=;J;nH^+j4o^mvwcrkn)_;Cn5*(dIT zksl{O9y7#W<_Rq#3#=igIop&(qxDh?#0TP0{kiXX7T^m4(hw$eTbMx2smOmr!0#5% z2;Lg!2^#!G)C(f6Ng?s2rF;?>*D$$)xdcA6za&1?C-JTbVHXQ01bh>^A{Kr*ABI1) zjle<+^&rIcmla4ae5qHoTRO+xV9N69#E&fMK^fzXivZEpdKfk@)w$m5Aa`|ramzR% z1UI07kXSTlU1Ct-rNu~nTkbiipygWL^c&D|OBo10f93utWfT z3;6SMLK;F4fZ5j!+p3|n>G1+9&JPV{0B?5OTW&!*o3VE)pqr0sE$Wnb$n!~ zhOYGhs^#)yDcu|$8eQF(NY!jsst-(E+EQ}L+uUZZP{>GmIWOm+_z>68bgeT0mO;~B z+}nB7+TMA(*@P8OfCbsQZ-d=nx4cmnV{w-BJYXP?Cqq-~pf(Ll_l0HX2ePTZGePcY zrUr6nJOL>&V$??4Tt(`q+l&sGfiXAIW+aL>tO$ZcQ8gRU$HsV_XFD|<+JVE zsDrjm>I?%CYVuJ&@d7yR+1QJkE~;o=H9ucB`i z2knpcOMMb&MH8N5V6h3rqAtap;`ICA_g`ns>&o(8szCL85OF3T|0d$)Ih?B#-#?Ep zQ~VHH0<_$5A0#iut$O{1&%M5QWfs8;SMc{+XQ!NX4}-!Y*XrA@3#&G!zJ@(GyFRSk zg_H@Y9?12wf>Uv~Tx;wpZW^f7dZSdVs}0VZm6qBnmg*IiSg&+b#XqUyuQDc}x|W~! XE`}HS66;4p0BzK9d@Mb}c**|&lQfL_ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_read_sync.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_read_sync.o new file mode 100644 index 0000000000000000000000000000000000000000..57c295cd2015a7a45c2423d93b2270067ee2cf7f GIT binary patch literal 1252 zcma)6O>YuW6upnH4mPIHU<4$U*fs%?$xuloYz*HtPQ?@!#F$J6mAmyj@zJpGCG*a?=brcO%$+xLQB&)TF%W}63KkK-3m*9M zjv)n`Ai?Z&=t-#cuKFVuNfd{H#LdLVI^5s*rX`WnV0i&4oVMkfo|x%5wJ8;f9d$>QKx!zm~BJABe5Xc z_C?q&cH0|eF&1Y#o(BwMYdW^|9-?h>913O{uVmYJYlA${Z5`yEWr1u?C?I!E&V$^a zjK{_)TCkR^+qOCCo!N%vKG=W2UGz|!1Fn~P-E}#E&*gUzgDxldf{7#|X|$ev5?=dm z>_w#Ufx~>}uM{AI3i+3Pq86D2SCG@10}^r2eo=?>^hIJ|UqRVu-p;6tL!N zp?^if&lgvOFU)2&6Bk6>A@&oo zz-8SBfBp)c(Ca+;Lh-ItpuBITSJWwbkJb5-<=x5eck=Tz#yg7u+4Z~+c31MeUT3ad z-(Q?EZt%heWRa4K)@*wilzGaTsc*|Yr+DP%sjp!V&g(v0xet3b>w zSXt`@t)aHcB~@$H>+M=c>y*lBO(W||!^YphSi|qjoPxHl5btFSZ;Z}WbQ3^DjN{>X IMlrthe^I)ODF6Tf literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_send.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_send.o new file mode 100644 index 0000000000000000000000000000000000000000..14b57d22d7fe9eac2ea5d7f6a967810bafdd8688 GIT binary patch literal 1248 zcmaJ=y>1gh5S~5T!6u-@NdVhe;e?Fj5OO*POIS3>cCu&0B}TC&QXrlGPS{c$!`&q! zRT>_Ef&!(=BTzu+A`&kEH4hMpDs&bN%=m8Y%M}@EcjlYAT}5v%;&EhOSyxR@W+_y?Y7K=%A6%QQ;A&$-xyr=wa!JM0_wpl#TP zmSLOw9RRIdekx~cg9EE=T1T?Bx+?2E$CTIAocb=emMauiom<~s|Rca z%}8-)>q&iM>-ky@W~3;Kv4!vwyT$H=5-iD5Y*~85K(UYdPP2vDv0U91mSyfKj``jJ zrPFkpptNio6l*|$*f}K+N_)`noBK$?T1wM#tX}KDG3~&?u7LM2MlGN5IMnw&&n6Z2 z?7OIAo=xfu12SszQ9kjaI39R7gqq}ZJWnV0dI46^MSMR`)FQU9RkSH*ot!AAIOfUl zgm@Hx=4sCjU(lc$LPXsPIJ_5@$sdUSeRf3B;l<#r)#;hvCmZe=HQp3SFu|^}?{|PeA@{#M5*5S0{dC z9G|8{AUOqS1><2@z7%)sbtk^y`r?(jgb-ZA-|wECauy^8g-Nd4x9tEnJWPF!OE?EU ztkQ;z1DOsedRfJ(xLvMPchn#a3{9_=in>wdytY|4>cx`2X%Op;=@|GY4g6Ks5g38x Y$GuD9g}%o6iCKUK>J&bf4q?3H|J(+RG5`Po literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_send_sync.o b/hardware/arduino/mtk/system/libmtk/debug/vm_soc_svr_send_sync.o new file mode 100644 index 0000000000000000000000000000000000000000..8b9afa00e6f074b6b63d2a47ab9910a073708f62 GIT binary patch literal 1252 zcma)6O>YuW6upm+cCayp1|uM;#I^~DOomD#VPp6l8mD3k3t~*B15AWOKxd|n#6>qQ zUHTLJ3+}pful@p;Zj7lrc6u*w9v=-0Uo!8Ud+vGf&fIx37geps7y~gFBw-N&yx@U9 zH!~z*3nZ9+4n7Gs-c^1?!|_6YBYrdfu?F`yzbWxl{9YWcV$#H^L{84hStvfl1%_#K2EbBC{l$~xN3F{7QKktS9*G6m zjxWq^vD@AVi?SHo^*mr8+moSVbPyejV_z`Kd?h>PTLt;W*ZybLN<~`(Xb8chN&_-f+Ft>$b}Yd@jF(7;rhk7fd7&Nu%}Tlkhrl zV=p3&4;`1M*(ZT z7W!8t{Csgm_(I$#Y~aPja$kgx&@*=dgmH5P#T%$?<3;xu#EbeQo)sxnFmXY|9b!Kb z3tZNH@aM143B9u?Unt&{3Y7P)^olw~@3Aspvb;O_{j>Z$jq&axKz2RvgT0kJuh*Ju z*Y_8vj2pbL2^pm1qBT1n1|^=F&D6K$o>M$<^VHXn2j_JkuH1!v2ljg)Yh?we;?r`y zaiXmCg05LfE5v&l#T%n@71;vN5My|F Jo>7c1{U4pGj9~x( literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_socket.o b/hardware/arduino/mtk/system/libmtk/debug/vm_socket.o new file mode 100644 index 0000000000000000000000000000000000000000..0a6681f54f5e13ede7cb05d3b652feab5748d788 GIT binary patch literal 1208 zcma)5O>fgc5S?|B)}d5QN)bu0z$!&bNNYJI5>YNFpH78KswRhs1Fn-;B!UodTtviy z3rCI|_#@nU;}5_u;K&7`aw0dFvAs^3Q&;l7H*cPI*5lpxHNDOl13nm}VIBb-c|j!a z8q%-^BFw(T9>tpPsy~ujQgN^%txKQkaBuaSDrKZ?3C>fq*_m)AYT`k(@uZVT#0PM` zG5b(2oIv{5_x_zu`S;HvFX*GFooH`H#$?=kZaJiBl}b@gx5lS-&$6eomd(og(6Quw zHK)GL?d1xEjGR~UN)Af*(QaC1cL*$lG*UV~e9*2Q9_+PXMG#q(ZHBklb#^0^U`du@ zw}f2=%49ln%r2s1dpO|Cwq7WX_0|EUZ#pI@-N^(LdrSejb4nhR-gq>!UZMqSDW>Dt z!|thLO=#nn8@JI$tzGf$)ZdQJ3Bo?Vi5T@c!Dmd!h@{c`&GEP8Xr9fX74uw zWKkjiqL0@iGv_LDdS{Tg#sp?67dILkH;Jr^)UST$92Mx z`{i>bbfE&}!>~S2BV+Dfs)4q+I{71RK1gGHZ5|+7&W9m!A@9{|2io%b{FHfy5Uj#B zQgYEdn*xJfFXhhExAIcl@?+|2T);WFtV$1d9N6iDqE}R$N{=gz=CL|AfT8Kla!EIu y^?Iw;Hrl1KUNb2F%yJC8hX&pxdkRLdB-Wr_C2=EkZW3z%I${bB#}UQ&Q~v|U?|K{n literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_socket_ex.o b/hardware/arduino/mtk/system/libmtk/debug/vm_socket_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..e785855dc1e15161df54a1fa413fd87acbb05d92 GIT binary patch literal 1240 zcma)5Pj3=I6o0e)5k%8cssfU_F_?hZ%~DAuUJRuS7`I{yi8V1<{%s1eh%Q@GPQCa6 zJa{lY^&@!D!~+Ktzkr_o08KpA8}Xv=u{$jE#M7pK{K>eu`B6iAd#W>jVE5TTR5fmlMbQJ%`(&?`k5QxS1$&I9r=s z8o%Smd@`2CfpYLsu<~a&9}RcmYuk-}Lq2p#8$I zbmMSJmy5;wa;i2sFx!SXlFONlto1BI-cYmZ>+E_qpHIsujb^I{ERC+O zu(N%yzP0^uy#{_Mz=CYWyUMPxYn~{Ju{c|k?l4e>qrTN_AzG%5UE!I=zG4}N7AT#j z)dZzA9D-sFC?IuK$$`=y^!vt3lwd8TX<25kbzm7o=ZF3SZlH!*?sv4*_kG7F@H+l= z#GvC7e8Gf_NF2>4T>!sZPV7M>JDHB|U>`3)1}W0d>qIS53tvT_=4=p&c7oqBIgXKz z@(&zzX!wW@)et7?R*=A&uLS=S9s91?jL?N`oshv2CU$3$U6Vr6OLM%8i>pXpL~aQ` z+8^zg`Xv4pU3h|tJ#riqbww<2p7+AS|4r1wqp z?utIR>IUeY&wGLHg===b?u0M6s@S@P?ZlD(AIQU9T55wUSPfJ$&@|8g+b6<_Prp Zh3%fja0Ab=ZZrhYK#b!h=}?S^`ws*^h)w_i literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sprintf.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..c75ddb298d373f8ce6b3ad00775a66db36e9dadf GIT binary patch literal 1216 zcmaJ=&ubGw6n>LU(yb}6DHW5p=zPjDZ*oR0tw~ z1`i^+u|b6x$PoWD`aEwYYA;JCsZ9IzFuDSn*jM=@dwcRoUzvFaqvg}kaC9smOT(lg z-;=A~ca&tJ4Wsy}x(n*hZ!EoA`1NB`6!lRyRO6^?9rX{~&c62qz$g}PD{8%W=(Zep zpct8qVs<=7S=Y1r^Xyu7V`EjxX*n$m`J1?h?byu@uvMgy{PxzZMrrHrS{V?RjpedFVO)sgL?kcolQh-l*@P9zXUuLD=WZh_gN?_<#uoku+LQJ{h0u zek>uXZ0Zq_Bwzn}|O| zT@eeM)Wh)muh0plarHov&Q+j%7~(-183Xz*>H!~?v8RjmbS57K*}nMEC^ z{QY9JwyjS%z%tBQA#Yl>N~KUb93L<{edI{+)#l*&=RQus0^VloEs N0C5Q$*`OGI>_1BPfYAT| literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_bt_noti_check_connection.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_bt_noti_check_connection.o new file mode 100644 index 0000000000000000000000000000000000000000..7150d17db160df56991e9aa165785cbc529574a3 GIT binary patch literal 1276 zcmah|O>fgc5S?|LlF~>`3katmutY#9p)03EB0@-zPp86dq$Y=oi<`I>i6AjJ+lmOJ z{t*uR32wb}g*$hSgj*#JFcW*@w3m#u``*mF-SLihPit14F$U5YWFhhZ+JO@bZUh*~t%pf@j!ICh{6xBCz3GP)8k-D`&CuQ&# z*}=>UYLZKOWiFn?%?%7*#n>ti`o0tn>XSSxQh0`mFGNC73dM{&&O;yj(BH$4l`aa2uHk literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_bt_noti_register_callback.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_bt_noti_register_callback.o new file mode 100644 index 0000000000000000000000000000000000000000..d578a031f1022ba0210624afcdd75a9a4ca48919 GIT binary patch literal 1300 zcma)5&u-}m18-n`kjGjEDUi7^IpFi60K1<)48 zT*eh7U;%pbvHH63ePvnAwgc)_^+O5P=D+A_QoXIhd2BQ~Q_h0r;C868--t#d zZ8#5)-jy~FAo24nyVKbE^&=|_dKfGpluvu+z&SOW+&u2{j_KG(odLHUvt@O=O{?|X zm6r4QY&=oxpExbs8OF=0RNUxrJHDZ(^_S`O^yX$Vp3yQ|8gdUY!LqGp2Urs6TyAgY zQN6IUyjj*mYl&t*{uosoZCv4Te2#H4(WZuq~NmcQtOm;-DQ`+ybpR z7=Y&V$sl!F%YfGE_j>j*O0bq@aqe`QC)^%*ANe0}3pLd8fTyLtH#|<@_xKIOkjDxB zU?7f2KFTLu5a(Ub_94=EFJQci-wTjJ59ud$vKEOY*O61s203xieyc7M3+X8S#6#f) z_=JRN$RX=i(1A5yNdGq^;;spg)J23&${>t^$-YP(p)yusPjGV`ombEo#!2T}#7TXU z--;A=G4PRyH{^cOmN@D6!|%V+Pv~>M{KDg#sz7o7RIjL0_fTFKr%din`Z+f~4x_zx zVIaF4_rrs!xTsej`!4S+VLB^Bi?DGc^S$X%&#;~#~b?6+=2^fjVj6K6eQ ztp%$bRu4fl@;WZLXZcEXPoJ3wX4$B2OHWfl6h6}j7VrgPC~zZ{KvJyS++q`nnrLY|t>GeuHj&-X$JI8WRBtZ`iHRoq z12l1=to;EjbjN}p;6nd`E_7K}vM|we?%Zi>7d^?$`ObH~nKO4D_j$(Tj4@EgAPSub z;FS!530Dw>VF*F%(*w@=@yBsrlB=*lIJgYcoU-Ezp}aN^3NZ~ zyr354`B3&wcDF8?_O2*7V!PqgMAO=?h;qFmtUU)Hn@Zh?MDvXuyKLF}k!&m$F>8($ zSv2CtllVe>X=y%^&=YzblGkv~qE#%_fXyQeCf8T57t*VD7xFOR3$Z~q8W>|2*|KfVhO!tOJ7yUwzhPK)}U94P7(A{vkAK0pn%kIJpp>TQLkIuD8X8K z(Q)irX~(geJs;U8oW>j-$AG7yGkNA=asdxdp&#_H>w*9gkE8LV3t^kXMzJ3o*`ajp zo^oU{Y^3kjsalj**g#BU7Kuco`7{^Fj&zj2?Rm)pd`3Vul&QKoB(UaV#s5Yi@1bOr zZba&o3}TqrXh*Upg{1d&@waet1IZ!e&S9hVoySIdr@j>-Y+>Rp0nb!j6)WG(2jJIV z#gq5D)jN#;zY3HO0G)5g7|dW$Z4=$IlRoI?+i8sHJUiB#55Sd95|OO8*XDZXSGPwib6L{!bxW@3Xylj(rq3~}4VY~?c E0HngF`2YX_ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_bt_noti_send_ex.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_bt_noti_send_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..70bb64bed7c3beaf6854f246307775301e3f5282 GIT binary patch literal 1300 zcma)6O=}ZT6umD=YtkyVwc@lL?IRmr_@pPHHXO1$APzl zZ{QVsX{a;mCH001t&4~L-IMz-_zrLF`}TwBflQH~SqWvvDyvCo4Ik$CHdj_5{P`1` zt}J}}dcarY#5@e9Z>KlvR@2$Aio#lJh^p1J*UFZ?iH39{aa{}N8tYEUcDA&1B%+yB zVQX_n)OZw~jn2={XfZveMinzc0u_Y$Pzs&a!iU zg^jUscENX`eiBxgZLl7n@DcodyNuj_NVcOO1NnUPBAk z(hEX3)#AFao8E{02TY=ewxi$k(w=O4oFL%w3B-`c34UNgLnMvfCtnbsX)pF8QrmN( z)4N*_5J83fy*^os%#s_(>76+evC()+o4FnND1XaCR|WWhglfnp>t;~Enh&M^6N!5c zT}AqaU7xf;1QWgIM*0YS9T&h&9Na*00JYQj(ENt*p>>kqiWF*?cuvG?ay%JJ?9~JC z{kPN!{p~OBD*nGJP(A?T-83===drJKwBFIl-`CD}(im&q0NK%epuOK+i(Bt;M>smZ zJY}xI4=3OXQgYEdBR&S)O|^SkxBExpx);;B4*Re_{^IH-m=Z8m2Hi{;*v0QAGTCM0 zA8xSHW_BTNT3OC>sl1hsFPJHd%nxi~;SII$jyYRk9bb&5L~A;R6Q+Zu3<3zmaXduy J3sG?M{{Vfeq2mAm literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_funet_trigger.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_funet_trigger.o new file mode 100644 index 0000000000000000000000000000000000000000..b5b983b4f9bf0c5bdc98112e93b4b6478287dc0e GIT binary patch literal 1244 zcma)6OK;Oa5T11&xGjXX0^t;^SWu*d5X&i%s8A)yJAg}2lS6ODNlg-oG{JEyA`ZRq zCy@9X+;ZT?6@CRLM7dSsP-e2;JgOYJ((d=o%(px1*X^tX@;$LHLKE##J~~&UzzhB$wnDa{2RtqAa)IG;$`X+8c=d z{&}wb`L!()`M6s8Ry^)lefQXUJ2-MY%X8b!rsIyorCjcb7OQp#Zo_ehS}Bpx%(mxf z+eXTGpGu~7cH&xEPwOejJi-aKW7pfj;z&c8{k_Mv{ND3q6~dCtme_jm2D`~_1r!!# z8*Ed0$UyH8JDy!f^jwZD!CdE^?l~Vk&<}0T2EE?zgYI_8AazPlgWl+NI?fSFFqdw7 zxbgbHbNc>=T>|c)hRPfEwN&HRJ|_tJ{5Il}&k05t&=AQ-^GPRTzwg@tL~5TnOh$f` z015PvepV-Pkyvm8In5DgM(ZiqMI#->pZX~LUyx7^(L~-dIxuHX_`f6J_lkRjZjI}N z4E`ZIm{>d~nWUFy{8w>t1D(t0yN;dqw~C$WB)%0X>|)@Ah~GqBVGEq~2jTCz@Dm2c z*{7bsTn35<=W0c}rE}b!OqpGs^r3Nl5=MJ-Y9PB955m27Xjw~Pw{a0QY` zNkwzkB?eg@8jn=B*_xBx_TyC7H3`Q>4_9x%mIqshpqn`Zhs>*7xw3C8)PhwqE7^=` zRf@%Gp=Q-GS+ih~w26NLe4Q4)FLwymqC~uwQQX)w+>f#XkVo9W%R~1}!9)KKmXe9| literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_nw_info_get_protocol.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_nw_info_get_protocol.o new file mode 100644 index 0000000000000000000000000000000000000000..82d540340ea2521375e4c0522daf8cbf86ec8d4a GIT binary patch literal 1268 zcmaJ>&uI3XZ)W*e)+>xLkj5Yd69&+7Nhs?G zQm_PJ$bDOWwXAP6*rV2tcjV|ZrthliH&))dCEZ3(Mu9RXB}#iwejVV&4r(;lnU zbXwK>!c@1ljP@?GmC5Bc)GW{P4CEiyw97|QSOK53SAUu-pCK?$=6TMgb~ zx7nRQjKx`k-BTVh;G^+Cv^(g9?fRZXwt2*b`Cb4&Xp1)R&S(VOwuq2A!?VD<)?i=` zQG&I2TL`<~IT7Y)=10z<_c2E;Uhp*3=hq%47xeI5^brq}`-KS=J;i7}>B2Z3dOU!h z?33&K*}YDHG)722t&_D#EU|`|*2sIK{gODOk&g1uJul;55l{_jvTh9nSo2uMzawzp zmK%|}6;~%^@E1|bXKqcRq*tcmQQTa^;3CFu;-K?IaZsP+Z$$_@nD|V8ImC z_(R9=E#Or5DegaAf$9Z;?ssAg){s2&1Jk>cKIG*6G;+GniOuGNusKO0a_i}SY<7S7 z%3MJJZaBRs6|GrS*ne-2`gZ6_otgNV$EmL?3eIyrUfzXu0qY0A^`eGTey>=o?`!jx zfKk=!g}iRmE0spMX*BZ%y=>45`d7ej)xfXK9)mHbtkd5(9(D)M7+V4;p-YuW6uobN3MHwu(FjO%qBWsnUxrGQ7!%7k>Qqc&!EPL2lu7u|nJG$4bmQK& z|G}+^i!S;TbmdQQ*VJ8idM`7NuZ7_yZ_c^rp8M{+HxE9R)G}iX#9)wwSp?8=gFt3t zNJ1Ebko~stbVGe#OvG+<0|~et_>oM&S^PYEEFA|cp(mm0mu57&-i5Qsxs;G!K=Sk_ zyV=a2{yr)1iAEkqDktSpU$d=|Hh8O&P+er49clypB0K?lsRtXa3yd1b&ZSMGSeIz#jmR5lN$Z z@&$3;@?sw%jZZF2pYEpxNTEXhd7tP-X2BKYR3pA2t(U|p2Kgxe$U~ujMM6Eq5PhpC zV9(b=|AoZ8XRacAo32mTAdHFTG;(`VNPcNfPvGJTitDId#7XZL!Aa*N_KFl#OnfKe z4bfM`0_Sx<{P`<%Lf@qOOz|yrpuB(K4Crk++8<6!=2s_wV3MDvF;33{WXpL!+*`=I z{nV+pyuP?)uE7TvU>_;DsAfxI&_xu3&h3K;5Gnrb#dNNl5=HMB-9ua-2bp8Ru+`x^cVtubgTzRu(u#Bf9VxQ}QU Ppokd9OGo!JikIad=+&si literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_acc_data_rigister_cb.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_acc_data_rigister_cb.o new file mode 100644 index 0000000000000000000000000000000000000000..b453859ea762a31875d8b12a99c1e916b8f8272b GIT binary patch literal 1296 zcma)5O>fgc5S_J?lC~0|hX~|;ExcZ^z7*rJd+l%>9)?eoaTr9;bI0r$Dv?)_>i3;!bgm79>*reBcn`_5 z)4zXC%3L)GaItbyKI{t5Jrtg^@AX_^w_0M?mbP#^dmT?Yu4pyUTqzWu7|D9?z->8h z->9V1hSiadv0-M+Pnq>hE|)U0Jj*kXe}s11v6~%WDWu{2_SWM@aqH!J9cHu$n`O(P z6?T)|(xWWKR@ohGjRE)iU1>KFrR!r`G1vLPrSn+=r)>dmdLD4MM+vzzJPW+l>vo-e zv|ul8OX+r+2h#C^m%IYpMGqbGOyH%nwgOHN3ixfr*?FL+zJd=oQJh2V1`gWaA`Uty^{z;vh=rd-f>3=`u5eNh z!P!5h6Y9h6V@1Evf$AZ6FfJowkit1P(k7oy{_wCqDr3GjPLNI4Ly);p_xsTq`!W4| zb<6y!4%gr*QgYFnWsSi*zcifb+~idLEy(Fymo%I&|A~1E5)u--z^#IbQ~ph%TH7|S zuo6VYs%_>iQ7f10rG{waH?5MOg?o+^_~#1z_uM{+%Qr#WrgM+sOFcu3&I7zaT*Zr4 Iq#Q5Ee@HE#SO5S3 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_disable_mode.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_disable_mode.o new file mode 100644 index 0000000000000000000000000000000000000000..1ffc0d7eb18f60a1ec90a6109789cd1c9bc67d4e GIT binary patch literal 1272 zcma)5&uWr$NdLfM-Lry(DTw+H$6_^_xLr$u*V6$VM0M9jpmatg#ES` z`w*$U<1icfF9pb;LjFacs6}SMHRLpBn?!81o;+oIARpx)dB|0Ok4UJ7XrgWn1*|y| z`e!8kesM+k*0@jDz=w&}EaEjOB)_zvZ{Xq@iYur^u+#pc*y)_aw<3iSCf*bAny4#c zfs48ye*G3Yp>JA!uK50{KzToG&eO;k+`w^nrY){c{=hUpOJkgz2gsK5exQp!Z@k{K znXtURxMkengG)efhFmmfU1G4$Q`3>ot-BPDy_n8*O~Ucw$E$WA=|Zv#s$SG^$nO_x z^#ko6Gr*|o^+H}Z>Xk~P+%%f`f?hUg!b{6F@TD5~*6axw7Z;`N?P8DP=1YjNRRFqk M3A|7`#ds0^067?w_W%F@ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_enable_mode.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_enable_mode.o new file mode 100644 index 0000000000000000000000000000000000000000..ca4691d9c8454f1b4899c984b7f0cff49b779bc4 GIT binary patch literal 1268 zcma)6OK;Oa5T11&B&|@=s)!^QuxODILM^96P;sGo2XF~$a>xP6*oj3VH4kjJBI3Z6 z6L;?X1#Ug`9{>{nffK0QdV`s)Hwl#@G1BgQ^Ub$A_U_p4DteVM2ErJmVIBdz;6W%q z6{KMmA~60Odm7Wk<`!KiDKrdBFFRMO4Sk<+oA ziBijE6}|7-%8r)PUgx%RySo`BujbVp6z-wiv`woIEQ2sqIM{#CD(^quZbDd!uqay( zZm=utY9PUqEX8g}cNwVeWZ;<=de7m$Cy-+ws-FGE1GQ^q0DAo6dDj!g=Y(t9D?^gRL&8dP&2n@T^pC z9B9iIfKk&M#e!}$s?}ztWwZ)Ky<(95mF*e$o#L;-b0%OcEs4*xha-s>UPhl-1)zRQ MVKdQtC9nzp0=!m|E&u=k literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_hr_data_rigister_cb.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_hr_data_rigister_cb.o new file mode 100644 index 0000000000000000000000000000000000000000..a737fc86ce2632fbc027a4d1251ecdcd0b61880a GIT binary patch literal 1292 zcma)5Pfrs;6o0eZVu7GQFt*s}#?+)(nQXC%4KdNuzv@C0+5-oYaa%UDiKRNb5E~DY z_$j;_zkxRnd;|FwUNnIlH+^q+r>(uzm(0B1`@P@nn|(9$sccmkW1x&d8b%Soeh@@+ zz90?r5QF^ph1Uz#$5Jx!pc75Pqv%CC377Hf{24ogYV1|4_GK>~pXYrs z-DY?6I7_fqc29fEfV+d9XSdLMGVmRRr1O@0&Ib=T?F)Fzb%D!11*FdM9PoC(*K>|g zg0;Bqd9vF&_8gZs{(p8KWz^=GP)@zJLQF0a;=AZ)Lrm@$CJgk%(R$Lwa6AlS9X;8p zKaZy1NC7fPk$zmKYLQxD6EUsXAQJ5qM~Xmbq@(=v(1$d9ML;!_sk${Ju;x3(|3DDj zuYggyr9h`-pkrch7zH&cB)vAqui(c`B#=3J&9wP<4Fo67!82>uyqkevv#(2Dkc%>)u5uo!KSx}F99N6Ud z)h!FMI^2LwgruT1%Nm3IAmz{0H#rf14rA);l7{otN6g!h@*s5p+$x$l6?TfX`mQ;B zA&9C~-zr$5Ua2(7P0=iDS!F@%4joV6yA}BI3i(XLP%x6PM zK^oQ|4Ee9?FV^+<3|?c` z*^NMq#aV)FDGwNMXF3#S8&TLU_9U~d0T=!#c7E#31=j}rtveiJd`ae|+iP!TCc>q!^JanJJuh-4pK z@MrgT0%R~k`bC|rMPkV{v8y=fd{G>9Px4!l!X73*5%EmcmA=Hqco2Tm zF?H^nG8cv17(tiC&`^O3} zYI?m`(2aVv+Nd;*W}&E83|jEo5(d6h1K*lG1>^FfbUeD>I39ivF}4O!MoeHsQSZgD G5&i<1Jd@D? literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_start_listen.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_start_listen.o new file mode 100644 index 0000000000000000000000000000000000000000..9668ba4e072d5163487939994b892f4d0729d613 GIT binary patch literal 1296 zcma)5&u7@Ez(`9{NbI4>vcN`23h3_8$f+0q z08KoYp87}Vjf08*fc_OtJk=ZVqVKUgU2Ib0Bs1UlzW2?(nc11+VudrtKsE*`@FD== z1i{SIkb($=VDk9|=lsj3#p;~0SU%qV$iK#yl;zG%<%ECW@G$aCQ`VIGN`b@q>g2}w z9Y5idv2PqIg`bDZzxK1SXa~;cCpG?-#~P42`_7V${Ess(7vW;4)F>VGblW=8ZL@C= zEZr7{CG^9tEzCZeN`=CcM5;CzS}oHWB}(h-iAqc$UQ>4 zVH(XYur;K?+}_UP`u5JV%^J-4LM+S{0!!>RyW@|sI9q0`z6}PdJ?aUgi6|@wJCa%E zp(@Nb0@Su43{ac44XQPufZS;{18Qr~>zRGDU@g@U!s<4M!nEDZ{RiAd4;}xU>!p8i z=yHO9%U2M?E+;t0L;{gCnoqtE_6Kh4N2GQ-9lgQ%)d1@#k$=`FYmr-W4LQx(A`#mu zc7=%B$Vd67F1j*|kx&iUWZg0fSo4+C&yYCx&QYW<>iDD$Rxq)D5jiy}B)@M)-@uP+ zC|*bH7Is?SJa#%KxmTocfQk1++$QVFSmLZ6fSc^|LASoc(2DMVqaLDZz%GEvXA2UENRjT=1MXz#RE7tXTE?+6?G~uNw lbbP5gzBOwE`qf2gd33&UT>JrIECSF#T*eDUdx_yi_yaZwp^X3l literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_stop_listen.o b/hardware/arduino/mtk/system/libmtk/debug/vm_srv_sensor_stop_listen.o new file mode 100644 index 0000000000000000000000000000000000000000..bfcd71b7d7e81b06679e95304056d0f39282810f GIT binary patch literal 1264 zcma)5&uOku+>YE;4DjN?jMul(T3(_Bz)1)=4B5`*0P%R?_M_$Xxzn z>z&f&@AKM@EaYLleqK8r8jgKxIM&D++lC{?$HvjX5!Q$_^>X>SnrV$s?4D&$)Ot3n z>H}e^J6cZrklW4`3Y%)4=Xnl_Pf>1KW_JK=6KSM)u=lK8*?YC!f(0eYVr(_M#_q7Y zp#)2^6nmgNVZfcqP?%jrVY}Fu%(jlWus#alho&%rcO3_~Jtl|LIi3gJ8xM!p2qjpH zn?l%w?uoD*I{5$DLzK}KFL-jg=eHgw2z&eIL@-CI{Wh~&%Grh8pcaGv{kc@H)OY#ajD%NkC_{c@vupv_+ZMqO`~ zin`IP)mqiI(Jq$sszLhqmN4+08u-%e2^e!r;+g1flX%cw#KaOn1u=!qM17aQCin-N CL6aN+ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sscanf.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sscanf.o new file mode 100644 index 0000000000000000000000000000000000000000..c3ffd19d6f105edf5fd74b9f7937d85fa1068203 GIT binary patch literal 1212 zcma)5&ubGw6n?Y$(XFYqsftNkbdd;K(hi#%ut-6YG(W_xDNPO)#O)?sO~5p|*@^){ z@GlT=f`5Uh9Q4+^SN#`+A|8ZzD|pcNc6O4qCkJ-E?|tu^d9!b4Ul+|1V+`bApu;!< zsEZ(y^$j}2K!w>)!_RYOy!vYMIGJv}8AO*L9s8<&Wbck27)w*{VYqmr42DPQQD~4T ztM}B(_gyU!Z^3Z(MBfAb=Qozx%m4bZA&Um6mi6+Bj@9cm?Ssdpl?#R2nqKQ3x=qLJ zYvpuWGuxh{tr;2Pd1f`UzP_wwd6s7&cN6WlV>jBsmXStsJ6pHvn_G8RYY1N#;6Fx#zs}fbZL$4ZP9o0e8C;kUPV(z?&d6$b0dgD zh&0{`7|r5S0;EwP|D;dWBD3TMa$2)SA`aSb#%E$8ALZ`^C{#Qj5~?AGtXn|=Yd(|u z7bN0d2}Szi!Y6I;2ifi@5;Z9#zcQiE;N}L3=TN(V51nrgAL^5QSER6kiAO|&A?wOm z;-nsi-+!e}81k!+mC&gQln=xCaT*!(&q6&AV{&)$NBq3Z;uVIA;{e&&d>9g^@}l0j zPiOa+w@fSw!4zCaN-kP6uP|5mAf~>?6`V&uD{n%|gVa87vtZzqyI-hO zcZ{(Ctg>0n=S-_wD%Fa0tDei7MT_!J9M8i4(852-?SnPi5^GSel6VjkF%bjUMqI$l JQKuL`>OaF#ekK3_ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ssl_base64_decode.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ssl_base64_decode.o new file mode 100644 index 0000000000000000000000000000000000000000..77288e315e5f3cd55f159700943a7f22c395d9d9 GIT binary patch literal 1272 zcma)5&rcIU6n@iRwxW>&hJqX1C?-W@v&BY<7t{9!~+Kt{{g*u_dwzaZ;cmyZ+C_*qz5ONdEfiqH}l@S-8tAWIAaXtV338- z1K16mc-|LeVFHpc{Pc`-{^jFzHK9yb4%R>LuX8iXeD|ty$lr6gJMm3dmXupciNoo_ z@XGN!e#nQ%k>g}J^)yxa(^$)-yKp)=tns%z(}e8FcedCp{yO2Z2w{`uX8CpBbln}Z zWx4i)yxFnagO2To%casIHCr3(Ic?k7SIf)Gs?qaobyd&luW~E7wY4QRujREI6z<~& z%eGoQU`q(&h3(CU_4UmsD>X<&k}SohVl(VIn~i4J9Ghngk$Vg@cfaphEwr8!*ses5 zy`y>d8xOROJKO-FDY_i(i~EPAlm0nI4sxD>WZmFl)WRtsj?s1^%`S>?R8Q8(*_qOoC;^o8x2 j_&QB|U(P<5;}Qk+&0(R>v7XEXKojje{yZJ>@uU9($Pbg7 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ssl_base64_encode.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ssl_base64_encode.o new file mode 100644 index 0000000000000000000000000000000000000000..db2b61655450f52b0fd4c50c3604ab511b072314 GIT binary patch literal 1272 zcma)6O>fgc5S?|Bl28!+LQRSlEGSY+>B=b)R9sM!W)nn8q$UzQAURHAkw{HbY!}f} zFZ=)w98gdF5g>8s0f|2VH|`uNaVocn3(VNwI;nbKrQLb+=IzdS*7iZEDi~uR2ZIcR z9>A{e#B!b>1CtPk;iu<9h%X;!YZK~h)O56o@+V5gZ+oOi5hDCM4+Yq zZwHu6G{85|CIU?62L?2>#L<4z#c|#V{0LeaN8TDP{xt(EBSrdAoyvxNfdUiOfQjAfvBbgWlYE!|`I z9HXa`KIX;46JwAL9Yp8jQMf%8_w#knxbx@Bx6Btr;1aALBo*zMQ5Y2bkhfCb!dm@4 z_JTO|by~soq7Rq1VbO)f4)AJG$0h%)SgCF57iz&MS8IiQ)u;(kFExxtzECY0BzAu%JjOp)03EB0@-z{{SvQO%CB?oYZO}B?N325pm$c zBXB|DHMmuxj{r}>tt#Tu8_ZWndv#vlvx2*40Qv@jE7 zVFhAP{J#2p)%aM=q;3tO8Mqt$na#jS`m}hc9L5^)XYuCOZZf$%fRn_jlF?p6_V^dO z-7O#gKB{laLOv!MNA>q(({)E?e>8FJ8QrK<9%|Y4+kYg z`C@TXEARr(L+L(FuxzV01h$E8w6wePpi|v>y48jyCC1`xUA@e%uxpVdOR+S&q1pV3cx=Bx3D)A4=Q+dPfoHq^ z51j*UqK4YK+xB96==eEFk!bBLv7HL;A2z z)*`X=b@XYDJS$o+fkPVUDF4_;$$vqIYDklHn@C{Ix03&Xj<`>Pk-9aZlQQ^=UN?wD zO$te`gm@Jf*O6RC?jjD_AMKa=B>xp%C}3ir9N%PJ8A}ZFD*X8;dBVu7`kaX@RG_@N z&@0;QC6qr3ri51~eRP%&(imTz2k4#6t3dZ+ZlazM5NFqyw@e5ka3Q!aG-q95!8wzH z`bOs^jpA2+Kz&_P@Ed-xybl{5Z0rFyDms2jFDlK}uD+lFvthK#CBtmh>+M>{?3Btz p%_Pab?V0!*O?*$z6wL6#qGu`Gz!R*STmh&erty-{{*rjO{{h%Pdp7_8 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ssl_connect.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ssl_connect.o new file mode 100644 index 0000000000000000000000000000000000000000..1cab47fad06eb35d3381165edd82cabbd926df15 GIT binary patch literal 1220 zcma)5O>fgc5S?|LlC)B3BPyH_z=9%DLRU_SAVNrx?*J}AO%AyrCh zegYTn`~_~6=ud!O!L2Id(i_ZVz4f{%@ z*(#j;KCbM@LIJK-k1Ox{mggN>l|?3`QQWJw|yIU+w*|CLkh^9;aT9FVZZMT(1NwN?fY)8eds%0 z@IvQ+>*%4jE(Kod?aP1@r~$u%7!5eVH%#b=q|tuzMR48<;t(Q@&jKc^_=EsyRLDQ; zleNe!xq+Pa$ZtjGt>Kh|e3XA2pwz!0p&D|?x-}HA=3A-%KqBswP^52N_@oW~B5O?| zQIkUQD>J%^hZ`s^qjnJ|Js&+U^+~=fQpjSWPb3(!u8bwl>MH#CCw0QmxcXEH%~hbh z3bAP#8G{X6A5FB`)5#wm=O<~5wP}ECF|WeaxxA=nPPE1Ig&3K>--PPJFw})=00$1 zRinpkbt|K14)skvm)lUYT2|8`{}?A&w$<(d+dvx1@9jQmmUdrkHef*svj|%a-e5P` ztw4;$S%TeB9x>3|@qk-xMD7UeO6J&ojoTkMXa^RzKx?}$XwHxfQtMh4w9arau-~Bs zb7>amPOm-Uw(EV|72qyvsKg7Nmg@Z4;{-vE-$smhoZu%0R7CR8eA0!n-}meQBDK!~ z{81byKpH)ypVrA-B$hmboaV@LqxF*5Wg{KMpL;0%-;hua*<{`tIxy#Z>HmR5+%4ge zx)q_5GWdtAU){FdN8X- zy^uG|dZp4RH_c|gV3bXg(|-Y9sfq8*8G|`5p{Q#dH@%H}i!A|^5EFQj=+4FP0{jP| CB#`$2 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ssl_is_support.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ssl_is_support.o new file mode 100644 index 0000000000000000000000000000000000000000..5faa5ca55a7b86baacbe972f8ff6102e9210b213 GIT binary patch literal 1220 zcma)5&2AD=6h3zt3Y8e!+Uih^&Y~JB?afe0B*w&2ejBGH0Tzv$ai9|+DS|VXro@FW z;A8j-#!VlhZ{fm))m0ZJdJcCkAl-P9JKuM{^KsAR%$<)VyUZ8^6%0}^%>arriDt)! z6eJ)HOJ5SN684AU{iNA}lzsu1cdnMswexr-wjZm$J~E8k9k{%CWxj#buZthw9;?k2 zR*cGN&k2GPryDrIa4_imf@+mQ;klV=^oM@i^G9YSoi^>R@XQ@6W4+I8XL7ksGt09) z1Noi(w0&fKYaKBFpxidTqyxs5hymx59UfdPJ@3w}*3+Ukg7Z1@!<6H>s zG}B_p3G|TPLtG3w!DlR(h@{c)$rs16lW49PxpR&PsWJi-s_N0{j+Km1i z6AQ%~sNKRv=Uc)>b5j2mDQscklt>t=ugVq9>N@=VqjbW^xcgLz{L_KzI;>60$QT&- zq?yW?-JSf=aa~pM3Io0OY0TGkFsDUivfu7Ro8MpEGHHlF44xn**DkIVjll~<6*RZH zN)Rb;hdIr4S)(D&f3&;}8v-_tf!hTOANj*VwN|&T8^NjAwY|LU)XL>Xsp&NHdv?ho o-&;>O_+2{qW%(m;uC>74G{Ynwi0+P&0LUS(5Gt+=1BvvwAuU@_G>aOX2Q_-r7G2q4^3Cjqe;|77O zBS^v)h%o;Yc^qlHE`N{jO8G%hx+;CB!oARERZ2;BB)Ck>=NH0-SQC%J^{4GvEINS8 z?fKhkt^>)RU)Wx|`0GcW7xcVX>(pM3_33n^k0wT6?-_b;U<}Xno@v>nsg+83IoX_? zTgc4hS~@LjL)(-O)r|TgbCAj9QgT+wDj6s|K)GQW-660P!a(8l_+hJje00!+pdhj^ z+wt$RYwWr&#^Nl&ZVC4pDAU>4HoE9-%k=|}EOVsT<|`YNzF`}nbf;5LtO*6A&L~+> zdXw?kJVOcAQViR+hTU`9oYKbs&u*iPS{?M{)bF;3$@x8e1AW-T(-IL zn$J1^6@h!lT!!nSu8zwfgo)L@a2YuW6upnH4pvhjZ3LVsQJR3*m!XnK*ciTPoJvzjByOeyOoXI}&PpyN%Pf2v#e9iH1r`rvsx{sGM(v}IWWvws+r5B)Uj=( z_LaQyGQXEE7PF}WFYr8+?_&+!(EDRxS){@8@!^AR?eJi)10kQp!YmfpW;^V? z$!_}YG2qs0V(WcG+jMXwm}#7H+jwmQAL_Oayl+{+%_#-s&hrBB!E`b)o}&eOaox7f zasSLVthGh`C%lC@+S-uoq5bW-oFL%x8;D_-6MVu%3XwE=pL`NNyKd}9r19Q?wbl;-Gq07tEQ+NBM^?Ix4_NB-BF;(YJ*H_Ix4qFG!p_M3@;ooG=K=YJc>{kMt)7^=00;q^dydXyul0ebVS2fbNu98C1Rot<{67bn?y-}~M-^UcnW=gT^0jDc(nGSJHa z_C+#K@C6wdfjD$NJmj1ozfbB@O7h-2{=0m@zm{u!(tde3sGL*Als6o5=RXa<)f9Mr zRmm#16zEK!L=Vp%z2XPFa}+s>SB9$%erbKEI$>{=p_4eN@fUo212W$}vsruT$M<7i zmx~HwymF`VtZlgNmf_lF-mu$d(=Sy@rNwlnw!PytEoU!X$>q}ere~$+wY>H;KbK!v z$fgTwLCr()1`aSSv#|**i*TU0wsNyxUb#D0gTY9g4YASK7`x1p(Q!7xQtV3PIs?_+ zYkOt`qvwcdOXOHvs%PzbptelU1hwJ1pgP->kUFmxKy7Zf+ty>0pqFZTp0nB5@hms^ zss9L5sG(yR4779>`vIm93-Bbyp#W3(f`v3j;%GeS;`q%5c@!hHLlL^YIC6j-GNcdd zq!)=L))3Q}c_OjVd}BTm9qFikJBWe>_=tc!WRt#CB+&DTHBgKJn= z?`Fc2Qqo64d;urdkQ_$t0)DiNX=%J8`#*9W7 zEQ*rf)4o0E%grFCeN9BL?|-yv6J|V^X@RPjH0+A^OV!mi?H?T&6@7K7s2i)C*Ou!> ry||<=8zg&Vc?P~p1K*Xi2S&ev*uM!}+!n53d_-KP6kZsQay;n2Lk5&# literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_ssl_write.o b/hardware/arduino/mtk/system/libmtk/debug/vm_ssl_write.o new file mode 100644 index 0000000000000000000000000000000000000000..aae4d3423d12dafad248bba30e561218638c720f GIT binary patch literal 1220 zcma)5O>fgc5S`6e9SUkv3M9b-3yPEwYB?nmQG|r@=~TD`H8}(>u9I3#q=ta)0ucu; z96562$Y0>rJ6HGx9JwG=Zjm^^Ozd@>o*2pd-pst+Su#7;s~dg@p&ub)9H& zF37?v2r&Dcc$jFvseeyzh~;5SydZvP!tIr>ikK5`h;W*j%}zomf-3C9TTgqbRB{NX zYqNLF(mrH=eq%R#)n7l#yr74Iy05+*>$ZKQzp_S-IS;F~T3O0=Cdbymw5F1p&r2HS zq-~|3yeMoHN~N4sl#6l!DtB>$VH*7rupH88WpDRhx4yfx)qz+@U~#q{*F42+~WkFFd-pQjOLS0!0(plhY`u%yWo%R zQ3B*KLi(VN*CH|J3UZpWO+hqTFEMBCKsw4l@X(C{d_+PuxbeCz3}DUYJpKiVd#~IG z*CkyYm%$%o!M<=EVaQhjoX5o#44%W-8h*4t+AsBq|0`0skBLJfp7Hg#&oLN}!0*32 zP8gp5`63ctszCY3Qm?2}7g1jKrvz6geRQ7p)97DbILOZCBS80JVQ#&yA2_={zh$l< z3@iS9p*iaz=ASbusBd&$+{l08In>u=2*==ql?Sltz~%wST1~;B@~GBo?h` zU(x2ZTN-p{4*a{P_g;w|(cSayh4PU?SzK5T7oxR|EObW>isFTs*ns%A&up%?{Nww+ zD5<7A4CU|UpEb-@t7%%*s%cd!&Guu7$$TbrGZrs4+fK!HILi#$&E!!&Bfz6{EOs}onC}mgfEfitM7h+*H8W>|2*|>j#McE{~?7PN* zw>k}Jl@X=mVoiCDy~(A$C4pBhX#p>{TELwq1*A^$6!1#3(Xg>kjOWu_HFOL^o|evH+w%zmo__kbY37 zYLQs^I{Gwckw`RJZ>;CJ1L-J#$3vF|_=pbGP^Rh@kieQx6#o+)`e$WIH-d!fjdE8p zv93gjN=N7$;8QqBM>2xkIsB-<^Z3y|4X#(kLyP3I{rxUn)_YWj(XwImQ z!R`KBci&3KV%v*pUq^g6o_w^t0<#iktH6znjzjuErm(uE|3e98-dJ5u8|JDI#aziO srI(GINy10AH1TDc__mx5m?w)+8?=v6JlsvhiDCCrP2$Co6yt&a1!d%z*8l(j literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sso_cancel.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sso_cancel.o new file mode 100644 index 0000000000000000000000000000000000000000..04a48a643f36f52cee7b82edae8529fb68648575 GIT binary patch literal 1216 zcma)5O>fgc5S?|LlC)AutD+_$0t*UC30>JG5)ndze23x^)Z`F}gK<)e1T_uVTSUZx z3qOGiH~s{-O7thdui#b{ap?_aVs8@n#7OJ+=FRiYdUyS?YStKIAcH{`W*LC#C(-=G zkcB0PLE+o-(`EBRC6l_*k7nRb^hY)WXX*38v2q-%$9Lk5FP&s^u@7g7b0wp_gzV{0 zcC%AD{dH2?mW={T)K6;fhL-1zte$zcG+Nx-z2C0vKG|x)f)ZnKwyLhND{MWIWGR+r*Oa>q zxHldOyNf7XAN!KI&H)$BdjWjk7B=v%=K*&|l#tutdEmX#aOfPO1$%K@2zSsu5{^d; z|G&77Hrm#Oz)pMnJm3Usz^@|415WT23mPJ6^gj7wIBo@b1d-yC57VcAgaA2I$UpCs zy~r%Nj-1|+XGQZRaL6DZ)gJ{Y_0LGChYZ=bfdck?BlYh{{QKl9(zoLKqz(Qc>r6Ah zC#B?9=5!S&*HK(V?J^EpAFY@6Nq#F*$YbF(ksxGWnM<74Rrvi^>V%O=_n8t2b)dQm z^c}Ncu!hOQsW3k~`JM^M+^TbcMMi&YV1e*mcm6mMocaNR1nj+!E~pRc)Y73!v7^meJMp zX0tzhZDF#Q&p(bOs{NtaG|W+~m`ujX9m|MqswwqtY9p1&tjE$k%~Ozlh;rS~8y#Tl z=z6oe+mC8n+s`(t;B)y|fGvB%>^i&Yj<6_OWoxbn4ESKwv-Ad{W!l)5o@sQsWxTh5 zw{%Mf-WUvkn|%sMo#JWW&3>OYjA70Z=ewyafzs1|BkEt@MBG!nitEDc|#hHuLpfp)P8 ZZG+A+ikJHmF%kr*Bd+3))1nwJ{4Zg%l0^Uj literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_account.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_account.o new file mode 100644 index 0000000000000000000000000000000000000000..278989bb488e4ffe2c305aa711589f82a763ddf7 GIT binary patch literal 1244 zcma)6&5ja55U%EL2RCM6g9Kn?NjDyk4&Y>K z@vdGtg7lBC>_)fz^LtSibWv#>HC~O3$z*IiwH(9j_s7%c4h9>QN->pgkEeFuvS+DA zHk;Cij+NTea@xz>Zmv+sr1Ct^b5Od2a?>(3QC0LSO@!e*?C$o`b_7ELg;6O6ldd3~=wFCUvbWGsA$ppAPCWF*Do(J9^k46^m zlVdGzI*vW;O&x3EzSMufRn$<6L#~$k+;urYz~z?_!!9S7V<3e{K3Y#Y1)rO)?MI~X zUVt}?;{?c}hxF?@S&PJyYshKM9yxJPzSxq9iF6dd@1pPmd_+PuY_p?W$+u>dS9fD(C4WDBA8r5=Q;Fk;Y0h2;6r_q?}`*2U|>eX9WtM^C9eAe z@Qb$L4gd1ZJrnbiO2QlRmhNdttQIm4WPZJOJ1Jii>(3&v!b% zyk$b*hmGYKk&4!A`xxBw){4HZatYgVYuW6uocw5ZV}MQzPI+C$&ZpI~gj`#*OlgbtJ~Hn!4*w@0~Y~uY{y8nRm`T_q=x>ci!-+q?Z|EAO?dZOe26dJP2f6 zLlRaY1cUF9ml6GAQI2nRg7S449t6)dIVHnI;&N~*orWsmy>RtwGZtIvz(w>@l9fY9 z{{G4CHuHaeos}PpVje~-XXW=jV>s*^Z!O0#+wK17*fHGMwNwg)r%JNkAK7io9xIh} zTG6|XrR-=K?Ig3E+1*VkSv9L>AomCtn3mb<0!twcZE#w(Ag-LM+VI{Tu8C zyXlLuI7_hG(nAL7aNKju7NTQw>Yvfo%@5fyM?x2U-9Q3@@>xRb({2srB81^{9IVKcD(r7*TLipVCVjm)n z&m1N*f29CvRLDQ;6Sc@JxQ3k8?2w3q_LE)4C-PDLnTK2j_=bdPh#~4$QNWr5q5nX_ z?-y5uZ;kte4SbkrP9k2DLh?&9`UY;Up}2xt1RpwI6d&r7_^n8xh>0&mydmm}Sm3Pg zhrj=XPUv&1PZi%>1&5ja55U%EL!HrqiU<913qpk+T?F=i4gp1*yjk97F4#XH|2X-PP!ssv5%rvkhSjqHP_0`v1J=Hz)wxU)UV<3z{5*87_6DROz zXM!YbLJ+2(!wIwWD%{@qrbsF2x&&v5>Gafd8mt8mLiNY(SS-?m zv#sg7YVH`4zrM2@?c(pBc~Q{CVC}f}YM_lqruNLRHND$4$3t5i>H`CyRx0J?WYZj5 zUBjBlwRBom`?ewPD;ecwW-pV=rQ|Hn@(dL2;(EHFcly9m==uvshxc0L!-Ksh1Ux|& zV%xqbyTmSgV=T@RY{zql0Uu2Uw%$RsEeCtTvyA85HeTDnPjp)c-WiR6TP6jh&hRYo zt~nSOLzG}GuG_ZN?~H9@wDN-g39n*~+8l5-)a$nE6Zl;J3S!9h3BF)LMkJ2rlP-wQ zO*i%;l6`PsJ~~GVkVb~|%Q{hu#KKq5r#bsXqS1P>ndc0oqx^jr9TwmdI#ffLs9Q$@ zYrYWtS9F~Fb2(F>iXiAIRYYuW6upm+3Zk(TOaZZy1{08WGE@?Y8wJV(BbB5O?ZRXjU{Xk+=r9;bOuF$0 zxNu>*>W`>97AF3I`U_k(aaDK3jo!=5>(GXUH+k=zd+vGfKHki5Sgdfy7>Hny06PQd znTb0yGbF$V9+-Z8#X0|W5~wak1Lec*FZ_Er7>#spMvwSs4i9{%ax@uTj}|zbuT5`E zKJgkN{!OHzA_vRlzq)m z)K+USIxvO+r9$CxEKwVb^p>WNW2ICoR_PjAY)ekdZ_}IUY&IFoNEs;&xrexys;SK` zuq0AA{x4h9l><1CmGs% z1EjWUs30|mLy+_VCFD*^8IW3oeqTF43-*#!!_d3Uk)h$S|2OWTk*bM5H*L&GuwIVt^D%BMow$CNW?hC5hP*- z`KbQHLQ94dB-BHM=vzhsd%h9+PbB91W-7wxH+{ke0W9oYWM)rF$?urcV}5t? zyJvNKi5u?P39_qo7pz~ZoBcW$+SUEVTV@)Za1Az)l8e@?I2b%d6hZg)QY46!?^`+D ztKWh1f{#{eLEM0N8>C7>#wqurP_FLEi>#oOD%E_hqEtDr73)epm#-8Ra?-y5ewzw@ fUHTZ51#M>c7{)`r#JTjhIj?uNPp7qQbm`7tYXytN2Ni|2u zcGt2eik8VJ`oOW29W|@I$Zluz`LvSbIi7{$J+zya*%<&!BMlVy_wKhUd%N3B2>N6e zVw?UbyTmR_F&1YDcFlK(0Uu9>j@dzUY!~~2+13$vtXB^3p6QstJL55Mdqe@bvpfg9 zI~opgufVYuHyy_wbdDX1_WhsZI{K*1LC;UUZhM@-@9`^$A&(P$#)N`M8r@Gm8LwMj zEFsc(@4|d`UnxKa74k3pL@hE4t|F&&0fwoybS|2OhdAz(*uhLkv;3jsn(v zF7z)*-1Frs!WVIU!Uhs1mir=ngub~8Ac~8tC|*Eq125WN7%%FRcvhrP!NfZv-Vp1F zSm3hmhu?pMPAJWue4$AHRG_>c5{oo423K*e%(dm!$sd^I=V^?UMSyHI@1MQzg~hGc znhUGzi&N$rBv^yHNXbR_Z2B0~+|+EQz8$Q@LocSjMtnG*{o(R1Y&o#i1Fn}jvEY3Z3I4yBKYWdK$+K)A@?61L%ke LJVcKv#+UyWy)KV` literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_provider.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_provider.o new file mode 100644 index 0000000000000000000000000000000000000000..932ce73d4d61733f580b910eac6b43cd76a010e5 GIT binary patch literal 1240 zcmaJ>O>fgc5S?{CNLorK)qVx^sV^X7SHJ>K>El3r$vffx*uFpU5jJP2gR zf+Q?M2!@{{Pa^u;q8#7o2IWgK+zNivFcbR4RLABU?So3YqZ7fz#RlB~Rd z3Wa-0vOYMp+m=02D(SSM z_gqWa(K6cW%ywpXH>G6NteSz`ZCuN=%vKLr3Sl6(zjwD$+w zFUI05!LCVL3{+>-cg+@h*XF(}kZrwGUF(etYR7aRkbYJtYLQrA4KY2lLnIDbZ*7dYAsyu(c%HKWpAb+DF+|-e5?FI6_^$}~ zx#En_t#F-?!5>7;NyKYXNP208zle)#NG>54!Abjz;-o%_cSQ*IG4YOoH$+_#3qQ;I z;rCy`llP6QPZ{623Y7Q5`ZSG*K?3c=2{*es=>y~ZB#rUaX@F=x?}v?Zd0y|?gqvSq zoH8!(!3EetNGf_}Rbn%H<9&P1rDIEdJn&-b>xzVS!KGE(u<62P2UNYFp~*chRBQX% zA}JUZy_V1EMy*_~ml{SRm)A=MDd{hOchkVzWsksEP-eW>IBu$ldxkq9ofQxSp0 zKj6$C;no`$j_@lu5>E66Gg)sOB1K}P-S3;3Z+F)F@Q12dV~l|`25E>qfak(VBrrd{d5c(q14`d!DfI_~gwKpLZ5ex#?H?$GNv-bgnx8Qts$j=q=8W#8m> zbA`f=p67X~}+m7At1KUBGC>|X=Y*h~Scbl-JsBD>S#;>w#?0QUNNw&pqDfbz0 ze>4c}He%oj>`CT1uXy0R4S;v;zy{v-ec+x;4ykiI54__J1`aNiV=Zn6f!A*j1IMR@ z|DWAP8Ex%SD5w3chnyfD@*9ZDAt(5X2_2DQG@f)Sw!5JpLnM1IVA_jg1jt~7^s_oy zi^P&=k<*wx3Zl_`+Y=@_(oz0Nh$0H`2?^DZChO9-Va-z+|AIu^DG`yn4WW}V_>Js% z>WP}H;^*S?r33<$B{NyLbRthS?|;O{-C>HLESF sRVnCl8=|*FP}D#Hvj+t literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_provider_icon.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_provider_icon.o new file mode 100644 index 0000000000000000000000000000000000000000..e081151787a473717db122374ccdeb487d191a94 GIT binary patch literal 1268 zcma)6%Wl&^6upyos8Exth$L7Ll_C;CExSY_$_C|~f=f`7Ma0H=StJr^THCFNSg>IS zOFn`hVAqcT!JZ`>gvu^ExHsd;ON!KyJm=hV&&;*2$9`AR%8W4(gFyo35kQLv-t^Rv zfDH)1Ci*^ETOeYo75 zyf0^3kof(L-EHRo{K|@g4hAZ%%K1>Ytdai8u=NvjbUx@AratJ7j;EGNp^%Ly>Z3EW zYnbDBC6$V61KWu2E2?s;?x~qfGM<*xvI@CJxS(ycI|E=zq~6@o;p0Z}@L;bFK39MR z*_LOU-C#G}5f)`JcH8xkfozS3cDsXUn;iRsnZ|3`Hs07E_u6(Fp@(w<@PW z?v92-;}|ViOK#h?Iq00(hUGlm72pnfsMS8lOZ{#-oWSGoTZlo26a2tL9Fa6yPrd+N z_ng>`NaG`i+00)nKnfM|FZx6+G7GLCr#1T|;-LMcDdQ9QDF4Jkt^#~ULN&w?b*m^~ z%@d)2N5an-SA;LjeZmHQOf2?A_y}Dy7eE9zS5Ul$+9qCfe<8f6PvTjTLKPDqh&V&+ zCt`t%x(ELL6FQ-L`s8!Py;Onno~2$A!$qsgB>7IR<@QLEhIW-ZY)D$OeFh7{i0~ Jf?_-X{{eW4lUV=& literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_provider_name.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_provider_name.o new file mode 100644 index 0000000000000000000000000000000000000000..d429851392b0ed43b89139040420c031db9087ab GIT binary patch literal 1264 zcma)6O>YuW6uoZ-5ZV}MQzPI+C$&ZpI~gj`#*Olgbt^4+0mul2qU_el<9g&VuF8Ua0b=5sj{N;4*S0De564 ze*Iu~8@b;<&r6R*F%Ki<^U`V091i>DTiZ1UPXDyqwjJ}x>e*vUIiG*3CTjf?r)4`M zwVX<+M%T5~9X+idr?=C)yGb>pWwbP8AK?PawwhgFNu>Vl!TytaVgJQ;4FXb-h1j}p zgWX^^IJ+%9WS|X4J=ba?x(>&VV2=GxbM5yoXl={2Kx+<%pgDaC$eq?QptbtF zo_&NCtfg75>vWqZu08aA+<(9w^iZ1vo|k%E_c(#i` zBhvW9VKVbq3XnpD{Ifn$i_C)S$Z5?Ei8yFKWz6_QKFUAykgEV+kx&gWMBNGsSaTrs z?@0Ll;)?LCai6e(jETl1;x#EGzciz7;O07tE2xF>q4P!Xp+1S@H<-Z$4PIxW5L=aVI~yOZBP&QH=9Z%zYbi+La1pUd-luP55# z{^FK#gACUojg(xpW?f>i$5Z2(`gXVwAA2$Nbxp!~*~hE3V9SNAHfTm($0_?NU#TAG zOZ{M$jcP7ynAK9LR;-)#Y|bc}WT*cH{7Oyy&YTgL%L?+o#_-SuJX>@XfbLoxFOoqq GUVwj&<&c>G literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_providers.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sso_get_providers.o new file mode 100644 index 0000000000000000000000000000000000000000..e20dbb07f122ca22036b4e134ed57e32d75a3a92 GIT binary patch literal 1248 zcmaJ>O>fgc5S?{CNLrz!6^JBQ#iB(@2(g?JLB)mUJAg}2lS6LCNh}hHkYKwN5rdYsu*+=Wz+>QjYt+%RceQ-e?nyv|I-*G^-r{oa3sFpw-OeYiT9a2zB zHC@*p_m5nQ@7({o|C>9QrV>Ye8r8Y$V=`eM-$onvF_{G>6tonh`NWH1zvufQwA4Ov z6O8;g0rD6j{xVN!5m{gjG0oYfAU0Yrb6{S^2dIj>bfD}xa#4m1K4q4X9%iZ)o>`kthU;R+Da}M zO}$+y>qfiL=+wJLw_MTd22tr>fUncQ_hrw)SS7@3nZ}LPa6hSa0J>ipygWMjc+5K1GZvEwb=Y{K@Z&@A^pyTG zHJh5BPsGwZ%~O!Mj{_{*sy2WnkPc*)7avsei%)0EFz5@iAvO{iWj9&GA7x`~oK5=f zG2rc;rfXFZT}NVFF~{EEuD$I7U$a~bc(vUI?zAW%cZ#Qh*ILb{jVt9?i(9ViG^$&! z-S%GWKVS+ybQFW0m(Jt0#|Z)+pFkY)IKeR{Vu+;Cc=84Dnek#jBDDhvyXuNznlF_88;QJwQc=FJ^eG$M z#l%W4k~JwLzpqc9$H{dRL#SQDht_u;AKEANu1KMdiCrRIQ*~9WuwM_rufIws^mnVD zD*iJSC?7bpSF~C>$9iu_|Lo)+=;nKAj3-Y6Wask%xN{~i>uvY6^Yg1)CJlbL1hYuV zMPo*M46-uS?P=fo_nhK}m#2LV`>?<0!{s%Yc42xAxRKMb%RI}KmX`Gky_*qC#>n$8cdAxSr^+yjbISdFba6#Y6uGqllc{ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sso_logout_account.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sso_logout_account.o new file mode 100644 index 0000000000000000000000000000000000000000..cb63dae4386fec62e609c4d3634cdc098685d2d7 GIT binary patch literal 1276 zcma)5&ubGw6n>K*H8F}!TWJ!P8YDt$?Xal1G_z&pan}>p@dJA6kz3fgmh8}z{^L_7o-|U;6ojq8q3C0+xV2}kr z1K4+yaDHUSLJT4>{PUy^fLs&iR86z>Gwihb3!MeT-G7I3;S zymb6l9E#y_;5br=K8#j>Zxs^p4xCO88{&;fG$DKPjb)mppC>|X!ox_VS$WwtdOh3N zvv=&iG|YC}?mw4QuawL8(%FXHciNUSNLQAY(zRV_rC0Qv{vx-WD-;&fd7kGvDBeN4 zX_>8EV2en@#f|m5o2%;&mK!h?h_EP|3C*#qY(AJ^NtR*@f!hptZ_t%y3sE{Qb`*20 zJua{iu7w-r*o&J|I=ijDw0gAh|BLHrqobel>~#Kn z9w!KS{2F4^;{@NakVYhp){`%S0?8DI$|@{jveFLEocBd0YhBw`%l zND%RYd{n>hp(n#9B-BHN>RUwtd+sa!2NL(rxr*||U7xbSJQlXjGPftCXxy;Q6jbs-vSo5p6bR9iF1yJJZM j|4#$|FlPY9xvg*?be>7v>{G-<44{da!V9!bIez%R98;Jy literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sso_refresh_credentials.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sso_refresh_credentials.o new file mode 100644 index 0000000000000000000000000000000000000000..e17a5812a66d86fd746c8b04a086a13c28b9b12e GIT binary patch literal 1296 zcma)5PiqrF6n~RHHL;5QC#LNZqeMteJ8Wve;zg1)lZa^pO~D=tn@zHsKx1@wD)!Wi zA3(u_^wbZbw;Tk&fPRXAr+N!s^u6p(HwIdKF!O%z_kM5Q?Ci{Ou_72_po~EZ{0Kn0 zK{z`Sq+l8%F#PgN2=Vpve055jFCTAy65kdVw59fS?L>SOaDV!{uB~WywSs`N`0!f) zy*LrWexM&IMW05?zxOs`vu!w=8P>!*5vxOL@Pj4m`JV%!HsSe5sa|^1H5{jB*w%B~ za@t1Iwp!Lp*)b0s6qO2vM~PIecW5^)`zTRLrxTTqv=ZxjMt_}I%WQ0{B(glqGmv|L za?>&!9bhX6!?~TUhr63wPu6NM6^O7Xn+q+lo9tFF#unKUiw9O2aObEi%?5gDyS}ZE zZ5?oFy_LXQrZj;!90$1Fqkz;Io(10Qb-TD%;Mj|sQrexyp|oh<|7o{TN5?FFOF zc$i$s!^`NS9wv8&i3ED$sGf8Y9QV99h@R|pH2ahLs{ztTk$zmKdXZXT9Wm9c6Nz?; zLnGiB=_vo$^BxU-1k^*B>RUzvd%jZq0D*h&Tt?|;U7eD_GA8!UBey4oqz{botGKw1 zeJ1!%2g-*a?xztkxP!C* z9pkH$K0M0%C1FVV0iwx#2oZaZ}nJo$n%Uejj~o8laAT2`?0VOAIf1gh5T5n#g(xx(0qk&s6AF@z$>|&{u+o6zpL4_|j$#*q=5lsUu_cVdd4sSh zXef993QAsrE*&qBH=v}TNh;jIjQ93zr(&etZ|0kCclKuYK31(7V+^D*$iOrL*b_mt zFcD;65fm7IPrOJpK2(0DSJcgJOkGmH)Zk(K+)%UXeHAWJQpqk{ zER8?aiieQ7JpcXci7e)$Vji0B`u31J9=Dy7lL>8>%bQxJIXLw?t~b)mTu!rk+|@RW zyzw@_o-Y=&T0t-9c_=-`1&-^qd%&{jMoarUPg|9p?e!+aLJC`8%aIj!lid!dSemV} zyP-!6^x>$_oi-x(1a_t8xvzEZzUQDHIotugJsg7W4JaUWUN3;&8T9+^8i+VT2|*a* z!F!=K%OMurGbyNVbYIdae(49)*JKFi*&kN#z#50OBham~fm3O>TyN|fa~iNstFcwG y>_)BDthVe{Y0IkGBsq4ujenz!|C2WYdv;^dvos!{f^}1i;#{lvNGyu+a{mFGxPA@* literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_start_app_with_para.o b/hardware/arduino/mtk/system/libmtk/debug/vm_start_app_with_para.o new file mode 100644 index 0000000000000000000000000000000000000000..f6cbb2bb286e52f3a30ab6a7d1d9a5bbcfc020e3 GIT binary patch literal 1292 zcma)5&rcIU6n@hdY(Yg3v4z!c6q7cUb&E|TdeG7`Epf4ilE}ei*|rtoG}KnF^EAg z0(kBQ1F4Q72E!19_U8wj^Sw_KMpT)&`+@(;Zu5g|kxx}$?F=fXlyT)9hs5dqq4&B1 zZ!alv<(2~N=%Ih-)5e9uh7Gh(8adwWK_lH@8O|px=s|>W( zR$W*nMB%ttmCUi%HDPZG&?=U&Kr6Lcpg9c+$eq+upp_f-y8Rd}SWB~naB8IuVYj>= z`wxhshmK*;^U_&tdYmBO@hQZR#|ge;LPaEvz9(N0`xP(tBU1b5LU$xDwFGwZ_xofm z%1f>zr*CFS#76UlJIo!(NBP?xx+=gIBveB-SvQXY)@(}s2NL)Gxr+3Sx;|-x%a~a0 zMs7_C$?xmaQ#iSf;t*;h*lB%du+u)te?y=OqcEQ~%mU}d xg%xupJ#Q?SWPW4|6JMx_Z_L>O^Y~)4B-+ymF1U&q9tK!PoWx5+7cGp3{|BdZpCm6kEyK=$(d z*Uz&WS0bTbte@3B3~XNvJ?GH1yGKLc4NCQLdCSPQhR0sl^+rZLmou!saE(nfZ@$lO zsfkW0O_LQGB%@g4NDAtv_?3kG`1(R$(~a6Aa(7<#gkV4h6!2mx}KB7T&o zw1};+iI~=GQWEV1#|nYah)4Bjp%2sW1p#R&Q@RaIpyoT3|A9c>Cz(;aCCO7X_>E|P z97#5eH22JZcwpD9=61=lo3&c2+P2%J qZL4Y%?a&oAzDgV4l{W%=T0r(Mg`0bddq~a$JV&3#3sa#O5Be`TkbxNh literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_storage_open.o b/hardware/arduino/mtk/system/libmtk/debug/vm_storage_open.o new file mode 100644 index 0000000000000000000000000000000000000000..f11bd7782356f6eb6881f89a0a080f6df58191b2 GIT binary patch literal 1212 zcmah|&2G~`5T13M;?hb@TYj8^iVs0bNxO1NBqD?a`E@GXMrv}XxVTPgHIYbD92XIR z#0&5UyawXZhk&Qxz=3e<0SRWZ-o*8VmAvzPGvDm&&U!!A>^fr%J+1NTNY~eUFj=`Wjv+hw&N9d4Uq2qn z0@7N#^>*Nlf}!u8dd~3NI|HyPm8V9wHN5b2PmO- zE`(C*X(PmB)DYi8yBK0JpD|#dB_HLJPQ&kE$P;L3d=O?fi>m|3p@;NQovcM-iA}_m zvrA4Kv|eh8#6&uZKM$?&0(?S1HRO18Hv5dV?zNZqQ?Ng4b^bTnh4CQ;HW z5&s_~COU7TZv{WvAMKa=B+rTvwlOf<1aeuIV$l)xtML18G?s{EC9YMVdMd0(6HtE# z`TV@m)k&Y6#^)(XNY4qPcwB|eYjIJpI`hTXmw%ZMB;W?VY;ktVSyLDkXSt$p2Qlu1 zocg+|;2e9fybGBCGAF?8iiuO{pweg_nsFI8mfb9uY^PbTw`y&tT`Jo(hg7Ft;NY8d f@KyO^aAM0(dzZ!wrG4s40MF2F;Lq}cI9~EUE$@B| literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_storage_read.o b/hardware/arduino/mtk/system/libmtk/debug/vm_storage_read.o new file mode 100644 index 0000000000000000000000000000000000000000..50d0689c1821347332301381e8ad1ec2c1ac75dc GIT binary patch literal 1264 zcmaJ>Pfrs;6o1neEX9BPQ7CMn8c0ein=Lkx=s`=%w8jMz+C*;KZP`!~YIQr9l9*`X z7tot>_5*Ox8wWlDeg!>f;-%g=nCN?*on_gBlkB|r`@P@Ho0&JWuUAdZ7z5Q9q~RO^ zbR`(b^#y4dhB)-TJms99e4a38wTUO6_@Ck-|5mK<>E_#`LG6k*u6^K;xq6!TXlU^M zwzi->(4cqgEP8bL_#Hpwz2nGnyp$-{`PkM_IoYfgp*M0?;cxh44btDgviau9&mSke zsutzhc4Y}+ zA2^FKD#4(qp*plW1^A~({9g^QZvzgk`kMGC4 zq88=FaPdy@X~SxXrfY9G)-$&*oQ_n?vwr>`LG|1HHA^ z5Ox)#aAmA1IKFoiEDBrp<3mb>YkM!GKlq|qU1XM#cRkwr$)_kn^p9tjrlZ^5WOP{jAH5Asm znXE}E`2#*agOeLbMv=RKAFb~qezZ^OUlGD43jSkKbxHF#KOcf$fBagoQ@zIoPgS6L zp;LQBtBs?*)*a%Xo%{nGy(?or-b)bm>mi`~(`&NcZkOnvU)?fk2*Melhe9qIGZJ91 zD5XwM`}UwOx4oS9bvS^1|D)A6U|PWRCg^6)z%F|~S6W#${_%lTG*_0grnSO(xlpkx r*(I}Jk!{Nn7QRXg-<7)uR(}Dxe`C0~ZCu0Xki1Oecwq$Pc+h_VZ_t(n literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_stream_connect.o b/hardware/arduino/mtk/system/libmtk/debug/vm_stream_connect.o new file mode 100644 index 0000000000000000000000000000000000000000..d8d095bfc3650df9e0251dcfb2e78350873fdc72 GIT binary patch literal 1292 zcma)5&u7gbj+XXg)VGAw~BM0^3 zAK;I~_~X*6H%#=_KSKWkFHO97s3&`}oniMCq!%Zd_sx9sy*IOOcb{j~9AgZGF^Iw- z18CTZC)pQ7!3SP=(QAF3+3**ht#yL2+S^{}$x`&oBTHaX?vlTJO1q^0UF@~?z57xxkoVplU;n%v5BO?uIC&(6qdO2i_|76b>0dupF@%GGyqte* zYHe;Ax~Wx~ySqk(Q!Ss#+>oQCX2+@+R#(n1Ey-$~8}dp#5r33ePOPpj%1I@uBp`JS z<+`Dl>%bN<^rSWm*SFRRca}>q=JK*}HZ9FCKfB}(upkSuc~^{q((amEFC%ix#+ryM zqoHu)2?wRBa~+g&yA6ufq=eK7B?(HUX`03^O0burb8gkk9d5K~@c*;RD5Gm1bL4dQ z4JRg$oOl*-+=&Seun=`P+D|$!`W1A_-RNX{{dKU|uNYtnDbf$?L@!c{IF2#xSs@Z_ z4}FFL$4E!@TMjxje8GTv2ortRk-(lU!T-R3o>`dCO(7v>quK>5Yzq;h&=IJs>eH=sU%`QSN* zPba;nUmtAo0KNBtjn*ZQ2StqRezj9>^nCG^*#bA5gR2;liuO#q7~Hf={gv)5Gm_sM z$sam7-SdKVvC!U?uxxBI|$k%sa|2alVjgXif6tSDg?VVl95>=wHnP+5${ z*_QHsT&M$dxY84U)`5G9yPw>fwF z?PKnE{=xnO?xKduyW(r9#;<%%5cK&S#E8!cCK%8V$w%`^7sh_yw*!dOJ`0$Q;wk}B z=pp^0PUa%9Q;_9RiP2;mL+FNr2+0}RuwlBp+K6B=~y1sm6LJ)v!kVZ-> znzN}eD2UK>q`EEEob0|Ir@C$^I4=9RdIxqm>~ujliv|w)!(y#|WGvN!RW<8{ylK@d xl}5Q~HS-0tY?1Vh!!7)s7XB}H4A!zlqLwk-*fZRZx&}}}jN{{>cc$W{{{sdPiBA9k literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_stream_set_volume.o b/hardware/arduino/mtk/system/libmtk/debug/vm_stream_set_volume.o new file mode 100644 index 0000000000000000000000000000000000000000..04e47f3fd5f655274cc3cefc99f83a6157150e15 GIT binary patch literal 1244 zcma)6OK;Oa5T11&q%DND0^t;^ShPq9AuFduqC%A*?*J}AO%A;oC$&hVh6Kl{h&c4Z zpFrYoaLb`LuKgEWIJCD)9AGBv&7;bJm3F^xX1?87&+huPXqFgbARB`?Of7)AFhZHJ zAPy@Kf!>eko2dDvpv4}x!rCnj9*55jEuq1Mdes}T5tJjZBb9H5s=C~Qi|Cc2>F*(a zdH(y?S!qWm@^Q6%Ryyfeeb04l1jn;Zy2pc#GY*&Y`R97P)*ZM_#~teBWKuWVo}=#= zY2#BmmEPS==oy~jX~;gs3AST5+Q1S>L)nAYBXD2Hq^Zv`EgvnTyOk%)UGJW{tNbW#R? zkR47ek&{f)D>MF^xVVANW%S*~PWxNMPIZ#siWK%Ra7x5)GOx5H&iaFJ`B(Z01LN#d zPhc(s#e;LTqTSLt?oFo5u1@;UI6euZy*V|IU5^K0Yc4MGnG@gj_2n%Sf&kor6jD;r zoOOjkPK3rI)or%sWVih|)pbq5anZx&P1yEe`v|z1H*mGZ={rx4wb# z4SWH2UGxz&zJNPdn!4*w&tdKb%7S>4x!-rb^PPL<-nsL>sFfIFAO?d3%p-t9H}GYq zh6HRt07hRzFGJe9LOgoA>yKZF!#)33HJ*&adF*0zDxC((!56{Gr)DIw-i7n>8Xo|;xq(!1&X{iK{xGD;e<53s;6jaCm>5~(j+J9ykE96aBxgI@}; zAlvd@W!KnsPlQETjNO#(Gf?bF-!WQ@xg`J?0!~&6e{Fj^od?%7FNF({5#S zy`I%9uP<(yYw*AtJVZ(^s@akl)ZEl`rgQ5q#SX| z%2%p2b!83cWv!aaYI?O)suvr2Bb(ETI+b)xN5{Wa$N$ZmfWE4+d&W`RKmp$~vVq?l MF@~2)qZlv4Kd%{=jQ{`u literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_strtol.o b/hardware/arduino/mtk/system/libmtk/debug/vm_strtol.o new file mode 100644 index 0000000000000000000000000000000000000000..a1f3559fd5cc92680b60ad1963727ea4e174adfd GIT binary patch literal 1196 zcma)6J#W)c6umE>E>#p#ig1brR#l{gv`{IUA?_J<0mTLj;j7GqnAr<7#^8)bha4@i6qXo0L<+@J4bLQHk;D`JN z+(!=`X)N&4xwZpN5DEBQ#HD}}e8Gl_NE)ptpM=+gpbjI_`0T@U_8%WW4i)mx`$QI* z1=o<%nr#ws(0;T|4DwO`X@Eliii9%65V;K$F!PPje<1PSC0`M~ljh94%A#z16a9)qV)nB0#hQ0Ke626u|{Rkvx zZDh>5m))s0zdQM(UVqxg`qr#Kw%Ct=e68>29Za>w{l#168^REWb)@8?H7g+on|{li z>DnuprV0H$s<%O%5X*6XcW+iaK0 qM$M%DE88{kJ2df2a>fws2e6A7X}pOlqP&d%J&0@gVi;881N{eoCw6%N literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_switch_backlight.o b/hardware/arduino/mtk/system/libmtk/debug/vm_switch_backlight.o new file mode 100644 index 0000000000000000000000000000000000000000..15543f5461dd36451e531e49ac4fc810f2424fb8 GIT binary patch literal 1232 zcmaJ=T~8B16uq#+Yd7r@GjLHiox#TQ+SYwYnYDMicoF zzW6VE@r^`&0{_A%6NoRo>Akx%v@{JjnK|d4duHzJ?C#g1Rbq^R3I<6SW&l=@gfqS& z39}G^?9aIubJpiVBDT^FC*XegB$t9YHzrJW~0-8;#Di;q>~smM~sJ^6cc# z@8c3zO(f2jk4qoAcK>5XG~0H=X};O-wAuoooXw#b+3R-Qw`jp$+!4a-G!BH@ zAA7hf(z{rrYn_rFx?4+f0$uW3h|`i2{J?^NNE)ptUj)ZJnTHT54*hvJ1+Newg%bHk zeX19^6*rO7noSZh4sk3IkwHGHKanV9_=bdfs8D??C}7WbO8_(REuf&zMzy~< zc8SPPK0-~2h&nDZQJg`3gK`}6IOv{6_sd}63u-FVekxZus_Ss}Pw9jq|H+3+=u!u& z>##g5BV!Q9IeVdv?oR%&U%x10etVc88?WoIa;YBlqdN{_e1G+o1=SE-gLS0jqBV;e zgQtip=-ytb1d;NV%;{biG@K{=w7dzc0#^5cTX_?w+{=8Wx?@hVf?c+%TRF?FmP)l^ u-LB`htfEcMmMd)hH*Ng8yaCt~+W7Yv!$UpBvqWdXKYJWMoC4+e!v6y`t%ei; literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_switch_power_saving_mode.o b/hardware/arduino/mtk/system/libmtk/debug/vm_switch_power_saving_mode.o new file mode 100644 index 0000000000000000000000000000000000000000..e583794ba124a3daf6b7873e003b22fd26fee88d GIT binary patch literal 1268 zcmaJ=&u(i;vY*V|ZeBEPJ9> z(`i-j3rpSAGTOV$P9~SzQnNhEGmw9XdzzNn?gQIG7|I{)KWditpY1eYNeQzETMyn~ zH`%Q~jKx`k-BBJe;G@Yvm~HgJc70DG+j`4|^$le#jNel{P3 zKXeS=0*<;L;{LM=q!$Fb->EU!z~G6WnBATDA*b$_F{b;R+I&3-+tVTK`;nJFH7G4*v#!Fj>Y%R8_sV6zKcFKRgDUlwci18va~ zFsgdJkk^fRrP3%jjb^@}mknBRXbA)VRRjMvdjiG+S*O2oJnSBxF}4CwLZ83~MQ<;L G58)pPS(VBF literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_close.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_close.o new file mode 100644 index 0000000000000000000000000000000000000000..8a27e85d299695a8cc089b131300fb948c84302c GIT binary patch literal 1228 zcma)6O>fgc5S?|LlC~cnUV-XXzB28<+VLb^_JJ%S7$#zG2LD;r!;MmNH*M`r_=@ z&(jK5CShKzo>qd1wLWCG zvibamnd3R0g~B70yPn(b0oyqgnyB#xFlC813+Cv6B z7!8Em#w>i9y9)VUp9}A!0Dj;K7kE1efcrx#NS)<5;GN-M;Jrf$dU00>zt=t#UO)%` zzqp4o8tY6br`g&erlg1X4(8bqQ~HJt6EksiJ?Rp-9)xuaGsW?Ek2d)T0WwIDep08r zNUgAin6B9-65|-x3V|?4NBw7E4r%y;fIL(v-x?C=`Cjoq5XkpQGD^23bxH=m5$#`9 z(vwQkYZJVVH@A?SL+%zXI^QBLnv?pi2qA}!BLZP4UsbC-$?I_ONAZ+nWA})O{o_D= z9af_@A_fNT`73Vn?xc^8`&VtO>A6QS-Pgg4nuw$y%~;0t{ncA0yD_){n+Qoo*DPxc zp32sEr@1wz>P}eGT$eN&;`B$$JFqTb{Q$UKv~Vlz6>If|bzKNf)voUpY^PqSG|Mfg tRoJo14(Z-{0{;mH4t`nw2%Kvc=uIkjVCc;YlgVkFNw_uMmcJrDbH#i}yKKsE+xh$4WR2okx8Aq`8Q z!s@r>7t7Yi@>WvsLR$F&W9@wPGYiGAd8BFAx-ecj*N-7R{>f6u#j{`cWdVt% zX1*WT{>Zmq_4=;earj<9N;bA2ks3iAa|DMfVYQ(f%^t6Sc^MB;PqN3f$Pgf{U7h3g|>7d zw9>xTLQbHB{1)P3$O*n;LPsQx#*oEpTr(?ywHRodb zB&pH9uEnsw{L%6@qyk8FfLkR4yTU=KRzEcU;RM^X>cxU(*Q?b=rD-<{MXO?y@wFS^ kzhGeFx8;q%zFdUff%Y+phnq*#mH?h0ZsNsxPB9+%U$Lu#6aWAK literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_get_space.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_get_space.o new file mode 100644 index 0000000000000000000000000000000000000000..801433a185883efe630e73f84cdf0b9463e9f0b6 GIT binary patch literal 1240 zcma)6&2G~`5S~q(;?hb@3kauF;6sqohOV3vi3lMLzM#~?S9|Pe7mzAul=EJH5g+cjX@4#55N*msu&7# zummckKQBLBw%*k?GI}3!$~Ty37wPlFxoWDrYV+_w)2{VlvT~sxL2mM$WsfR9e{9JD z5>3r~GqnA&Z$BTLxb_P-u>Dh~=ThFRRv+rQ_UO#(x!zbe^LgDG1g^eg6pYt}?Lw)v zsTX;X7odC}<&Nug2f#Lwrpo(!4?4BI-R(9kBviJ@)|Bh)2D_QmSca{$+lhM&xIZ2S zP8Tuo1okEK+!G$SZv)`RPT&CV`aW=PL=LG7ya>EE8V=o8D8X9X2?B4>Jqui)4*q|3 z2W8aOg-A}lZAP3xiTEwV#fTGp!Gw-TF&$UX&lri`K(Bxh>4FxB9nEcFL5@mz^^|tPM8d<$C2be6)3Mj zCQc(`uz_>@ytBKLJ{9KUB`Ki$5!>aw0@*l;Ow_AQW0&`rw@e6fgc5S?{CNLox`AO?dh%rk%vPa;K6 zkcDN4!Q^w|NkV^HmDAS;QTdV#x1wJ)IVZzu=4^5-9mg8+$MNQeZYs4jfYaoeBrDG$ z`{NtC(JlY{ep0_H%>0;aoYY^B3}@;XFNOz}F`ih5Ua3*3>?qmx_{i>C_Ec%)^NK!n zEoDn9Xs-&Jh3)N}QdEm-0ZMmpfoYk&A+Q|6NNI2PUZ=YIXtNDbDaPV#HN3_yv-MDl zrCEkum2NXoo$1Imdl+4t$ALh$b)dS|8yD1l(=|cuIS#1ym=aPK)FP<;@n~cnq6EEE z({=4(@5r?r|402txP}^PZ`9XPk2^l55ccsEjBy`R_=E)oBXP8zbTNEx`gsT=jrTmv zX8tMx^2m@rs1sf!7Fa_}Yqp5QLHn(Fh)<-W`U5|57T_ZS@(@G#HjzNjiQvB=;P;9% zLbt+oLI%GPb!Qp(q?GhhfWL^FYe+63m%xY4m&AwqBz`MGxQ~V4YZAUx3yvTkhF^bz zwUFmNXF}&3$S-`ZS9IESls}v;3GPn%h*zJLG0)5sM2qz>(EXVY?)Pj)EbcFE85e}$ z0?>y-Dq6EDG1%cHZ>GM@_u_pt{W|q^MZ$UUqgDH`;ljo~sCq@isr0ncZ0%|P=)h>` zt#U~>TJ?In)-gJzvR*St_R@0ke_&+bcV$n(STx}MOXK0Hc!tz60Ntq!UKpKne9?aa DkEert literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_read.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_read.o new file mode 100644 index 0000000000000000000000000000000000000000..fc5aacde5e41baed7c453d60f1c92203e4df66d2 GIT binary patch literal 1256 zcma)6&usbw&shn>ulW{V{w*X8=kuiq{(z-Y8~{ZVfns@41Fk>`dbsE zo@QzwbtV&#j4>s|&PxT5y5rGEe~A>-k~Gsa2Au;_pV$xeAMPe{sO>8@mwG?6V{$$_ zzJWey$K<|ZA%&hWT2H(Hj@x$bMNf9Tn4QUb#Q-^ki0|eJEnEVy5j(50H&+_(>Z{c+d43v~zaUQi%C--TY$Y1fhNJcoOC;`A;wWYR7<$6^m+6&#p|G-Ga@5-2h bx-4MzFOG+MhG&R{0NUsicwu^!QJGkRZx>)fdxfM2(_FNi6|GyuT$X?)Z`Fxah=qVh=zdeA|ei4 zICA6xcnG-l4YROKfQU3u~kwYzx`&{aC-`5GEzJ3`o;p+q+F(4z7kJb}U#Bsy7BZwsL zJP2m*H~|XiA%2+0YZ002D(bXmkDMr!FSXFTiFg#h>!ard_<#!4;KJ*+(SbFebN^>l zyu0OjIB(PAaT@$aE!-E*BNPG_KoXOy=)8cw4IH$;Bo68m|5jAt9tOh4#Pd-sEMb2X ze$h4pi7dW6Ffo6)0@aKD)hp`MHqslxl5lq7#}@G*jCOWuptc&10^Ogbc=dXLV>Lg& zWgZ~{Yd{Z$ShQwKU=V(n)VGH?xR7o72K9AQz2&}dF^d<5_L|0n F{sYMYh4cUb literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_write.o b/hardware/arduino/mtk/system/libmtk/debug/vm_sys_file_write.o new file mode 100644 index 0000000000000000000000000000000000000000..9f23e6902751d34732a21dbf35acf3b7ff0c52e4 GIT binary patch literal 1260 zcma)6&u^BOs|8g9#M7St^Odm>8f87^x&cVh<+E0;`aK=(4SH>cv06 zg9p=7|A>0)!NjWv{R=!c@l3V+u%}m2)6>$D@({5+ztm)=bkFboNYrLL2`-yNNPtyU&(W?}s)f=dtk( z^Z^@_`-%w(J#n<2bbcJS?bwZ;>}WnalXb)Z8Kg+Rs1vnFEwF-^)@%`pc7!8Bz&6rR z{-Nz{8jcZA4Pl~g6$z~QO7K4rSoh6hgf3+1gbc!%*gcP|niP`WwZJFw;R=$Mk-LV2 z_P2tA`Xt^JA+#{DPrx=&SH!|E@*ep0NATp`^Xd-c{-*-vJ+S7a5iyA3?7YX~(@F20 z=ba^9pmTR@Iqw0MpGR%-QPp{CY3Zhko*7u literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_close.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_close.o new file mode 100644 index 0000000000000000000000000000000000000000..04acb1577f8b2cc000fd6ece1338859ab911bdb5 GIT binary patch literal 1208 zcma)5&2AGh5FT%mlC~)&@$skttkUA-_e<~zuqpZ@-J zQsugc@{6^T>c_q-ItOlNe=zjNbgfi+YG#{*!=U2_BeRyvnNCmm=7yEGKIGT)#p0S- z;02xs`!P=Ne6QUDwuUfaZ*M(mmA785H(|y|vRSqqzrk*@+p!c&vlVvNc*KAYM}6V7 z(ThO(u10~s&xQX<0N?e52fRHT0uKfhkUGx`z&nF}-+zx1ti?Scf?oSj_(SzW|KaYT zhFUtKwA5EeVRCVW@1UPmnA|r^nCOY4`J_wY_dvxl^khflF&yOa0pyS(eN?Awky>L5 zG0oW^672}TMFPr5NBQTkA-8vFj^FZ@I5y-nF8LeBAIxT}gh;}BCtVtp1 zjR;SRTS(3!cMU(G-G+nUmVTXPzlw&OOc)n=vTw(L!(;*w;~ k7cRa=7vEDb0yny_>{%K&^bG5!<^f)yU%^XKrWgQcK_oX8 zq+to7kpH^;YT0;SP9^U3A}QF4d{3v~GI^ChQ_iBb*vnY`b4OJddvF=QQc~J$NMHP5 z_dCUlpXb#bSt#)F+IjVKVEXp4X&(+f$Mi-=Hsxxi(i1J+8lJeeogA7FCf0N+L*3oyAan9$G@N8gh!isL~LhtQLK6mBw$V+6<` zL;6{rtVLppb;R_IJTF>r4Tm(+QT|!rCI1Nl)sQCZ){(%P$CCesK-?+8NZpFiNg4b` z)R{!0CWWL|X80&Bt|PgK+)W&`zc>!+ll)hNkjKO+fxu*48B0IQhvC;B$&(L_t52EG zKNTn+hV^M05d#(HrxR{=b<#)1`AHgMI`^r~=fj{)lZZq;W5Ug^FK?L;gy05jAtV)j zv#PL}y@|dxg>*bqAMGHfzOE?L#Q8_dZP@T(;{do((s3&6mFkVAeq9J=&1e)0hS{iA xTa~uiE)&VJU|uVMwW)^*+|YCM>JmU1eG)GX-7ggn`!CRkga7~l literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_connect.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_connect.o new file mode 100644 index 0000000000000000000000000000000000000000..9bf9d4a1769fe2da875a51e1df1a3a8e840c7c6d GIT binary patch literal 1248 zcma)5&u4l9}&&-}`3X?Ci{8(cp|Rkc~kK{0N}s z2BGZGkb-Fl!{F-+&iUz=h00W7p?tXUiGPbNCgQEDi6j1z!`-5QXDnOESma)r9>{fYz*w zI%ti4A2g>&0l70;7Bs8Z>DXPgU@fgKgwt;93%l=q(0{;9^w5z{d0smAU5^t4J$@ZA z;&FmgOsI&Y(R}iSvETOM03x;H;ph+U?*&MsME+5qtVM3gb>uW>jYMq6*k_4&jeL}U z?4c*aXCzcZHd(if0@mD<`cEY8U2_%bn{$2A1~Zu0xrp4F6p~*V(N$brNAWUhGuUZ= zv|l35h2D z1A0@={sA2H#({%>fZjdnL2uR@2NQj7XQ!>@;v_rY_rCYdyxIBje9_{JF;I;`9NH1U zfed<5z99|+5QXN4C!F(>_oLRNHu~rt|D8SLU$aF%QGI#Tt6k8BwKp6R7eDpCH8psB zU7OMFY0$iO8a_II{E8p)=5gpan(NP3_?6YZ{8)7@3(djPB7ebSYY_kTnN3$0etbXS zCAFvkqq&E<-I^_&ZQH4DZMlxH-95_XGMT%2yjb7y9M{{|bBTm*Z3tJNGn3}CtjQaVK%}>!!b6-#@W@-Ee1wo zzb48RMBz!SD(1PHhH&=;80%$G2BXqwfZ^3CAa~M8f#K9^HFpawSj#92;cZlQgxjEn z|6iL#8y!P$V5hS<2sl9`;1h^_0Vnu^2_2C%8c)6`e$zo5Mx=Hmq1DSH2S}ho{!X8& zMP|iK#V`7&`&{SO&E9}%G@avD#3B!K%wi5oQ z0_7tx(oQ2|5W~LO(mH1+e~+JUr7@;+Z@2Dz1oU3V*TE2NV)vsp9GDU?wGM`rF|kWO&g54L=2;`yIcsGhZP_cF w7Z*!*DZOAV+T?rc3LD?0jW5gF2m4G3tWA43h6~(8j19;OHIA1?P>hHD7dxAmP5=M^ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_connect_sync.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_connect_sync.o new file mode 100644 index 0000000000000000000000000000000000000000..73d856e3934d4921163e23437d29843a35f2a2a5 GIT binary patch literal 1244 zcmaJ>Pj3=Y5TD1tE;gpnUasNwO}u#Y z=m+pic;g#*(NEyfi!t@aO=sAB3zEi3-uwM#=C?Duvv2oZRjDz?Kp2A*EIfdY?f7$Z zK?>GEg4yTL<52TW<$ElWDD(n}>xqvwxWD#QPNWmt3Al{UW>e2ps!NB##`8`z8t%d6 z#_WA9e*&qW-`L$w>DP~fXy~9+KdHYOsFr@N>Z9S%&@FX58R`J_a=DO9wMG}FZkUr~ zJ(Ec)ealGh%UStlb}yUHr;|CJ<5?&^z*?H2b^E~5Nd3j*qlfLv(cxYT0v?G4*`_bT zZm=zHl*L$_-S+G<;N!`_(z=M2X=6_?(|ExxIUx`9}`gQGicKsE07ow}Aodc`o8# zkl1I-jtE`Y)(IK>LAE>>p(FITDu56cmoaz^V;i{W{zABDPU2aS!T~1U5^+q_6TZOZ zxDS5QZMf#0Ke_8-{pAkS&j(wJG%^Np+$(NuxjO0n^Sqlz|JK4mwwm|B_CI;MU)znX z))%MD7I-*8T1DjsQ7i66Hu>cGoND&Z;H-TbR9rJjN`$1 IN literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_get_soc_id.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_get_soc_id.o new file mode 100644 index 0000000000000000000000000000000000000000..fa0282f411f7e53667b632ea86c8f02bb37b4fdd GIT binary patch literal 1232 zcma)6Pj3=I6o0cog*K_QY2$)KH(C=~>;x)_#F!}mQMaW54&2sd*$9b9U8ar1gBL%9 zehV+&dT8Po&`;s5sV95W_m~|(dhsPQ@ArQ1H}i%!vwSF<6~-7SV~~Vd1aK&WP_q|WdxaA!CexNlH`wYV*W*Y6w) zcSHyOKf8@GYVDFQr~V%Lm|W1uH_=CYOzsON4D`g&deVh)-1FlAda{qwO=o$H04Zch zKd)1@NUU%gF|ASeMf+{wP)0h+Kk>cdKOvwR%2eGN5?J#{@!t^0HzgURTa!8^gWrhS z(@55&ko4LdAI8noNG>CH9S5B+ii7&3ek(%AVd8{p|}m7nK>@avD_$ptLc`^*;eK`>@XM6#YauS^O8a1C}4l8V-> zYi#apvTqG3oy^on$B(J6YZ^6i@uTGqYzf%v0ym3kobm_7TD_6JDg>)))(d&ls#hw_ va?5Jv3uf6O-Q*u&Jh1S~^2T6YDS@@AhcP_RQ}p@@KnZ;u9}T@P9WVPY94&)* literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_read.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_read.o new file mode 100644 index 0000000000000000000000000000000000000000..2b4a110dcab7c59b3a1c9803f0da59784b74ea73 GIT binary patch literal 1212 zcmaJ=O>YuW6upnH4pvhjZ3LVsQJR3*m!XnK*ciSB8mH0}5{aAX023h*sl(JrT)1)R z(uE8EhP&?k1NsYGx-q7%WT*Es^I*!tm&`loo_prrc^~t(uBnVM5Q9MmRuRCF69fwj zLk2cMg8Apjqe$yb?R#QdE)7HSHTi=IcQ?K&a#p@A!$opFKlhzW4e21;O`Mo~Ti_C&6$myMZ5^+$ys|)5#x*0F82qpS zX{6+$cVa#UblzgnzNsQWr1*&&PPwAhb#gp2Z5{tb9see42D+#0V!smDobFD16F@^u;srUP7!URzi1d8J literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_read_sync.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_read_sync.o new file mode 100644 index 0000000000000000000000000000000000000000..7a7d466d27bb04bd2960db68688be953e7460482 GIT binary patch literal 1236 zcma)5&2G~`5T12@>QJF3RZx>)fdxfM2(_FNi6|GyuT$ZYs>vbZ;yQ^%B9W#zE+XQ< zg(F8EfQNuv-+&7|0Y@$fm0NBw6MG#KE{wGMeKYgz&U(E2rlB_(W5A6;7FHfW&vhcj zr63ENAj0BP{BgYfy8bPll**&1bX9uagu5GGR4FIjlHfA4SX>Afq9z{1T2FhaRAK~| zTZ^~N(g|dLd}X(L)t}$Xyr74ocA~wU7|!6#uq|_F%;u+qWlF2n%5t_dJ+}vzJ(sn7 zUe?EsCGV>R^+jQ?P%7o*qEb`}P`Qr_Ov~(#f#r}!D#wQpy7j|@y$(bLk;T|{ILWTD zoluIUS%%#Z?lDki^NC~j5gpsb5ofmbTyd;d4k$y@F+u6iW}w(pa!6fJil7XplZkbT z60D_|j$@De=Z-b=KI%W~`#Dt7UF$>tH^21J_XTezvPm+6X_`b&_g#0@BsFUG z_ininu1mN&E`#65f_>pSLcv!7#Bp;KgI6%Ng@eu)$3cDK--;9-VIugO_J@cr2jz8tNpN@4N0xa%jech3AY0Fef$q=B+7=U}WCaQm0W!_ZwyZ35_s8N4ub))fBe EKcNMM*Z=?k literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_write.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_write.o new file mode 100644 index 0000000000000000000000000000000000000000..71a9332d22e5ddb38887c3060f2d5aced7179f36 GIT binary patch literal 1220 zcma)5O>fgc5S?{C>QGRVQXmNySWu*dP|GQih$1AEPp85qsL3I4ah=p^A`wy?7l=4; z;mDCANB#o0-nqgr;K&7`a*M518%Q;Ri&(SLxR)vY<41?h?=+)Yd-BJlZgSG zuFc*xiu;iH`HkJ|R(|~`@q!+T+P?O3WH|jJKcOP`-;3Ov~&Ifn||K%6q%_IauA_$98}+o*H)eqy18!_`f2B`XFpqk-?qo`Mlv*zH*gH$eMIt^(+YX}lzl$;ZR}2NXwt AGynhq literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_write_sync.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tcp_write_sync.o new file mode 100644 index 0000000000000000000000000000000000000000..dab78ded3e60738220974b01a9cede0a9f8f02d5 GIT binary patch literal 1240 zcma)5&2G~`5T12@>QJF3RVtETfdxfM8frNu5>bQ%`E@E>QYAS=T-?O9NF>q}$1Ox0 zxNzji1Mm_^9Qp=a;0ZW#L8#nvgPGXtMCpZ*yx%u7-|nnuci+|YI%5pDF-XJ01L(R= zC_fjZVI4%6eU3hjHs4l%B;!(X5SFe>AM3EQ_Dz*C(j5sdQ?uEHa3N~qex&idn@Ge4 zaJeyiUoRX%`qy`Mw_E=Gv&aj2C~8OA`N(k0Q{%NgbSz^sJuxY#RVqa}-5#IWre#lM zEt{2f%*%UfPJNZz%@qn6Ij`iE9F!iQyl3_LLtq)Cp;GJMVW)bqzuSheAhHPC493|O zyAepRBulYd!hHtHWIA$seMHB0aln~vy;L0QjRVSY&*_2EpG-ip$K;SYr{qB~$D@&T zf)cEy^c=??_Rkz^LL2`-yNxnxaoCenpSvC>2zvY`V#MPFUoasfQjF%4PQ>q?=LZnU zKDgkI?r{QSF+%!f9j`@V&Q;_zXODttv|fD9+<|nIf9#!)2-n429hbphWXpZwIzqu$0Yq_e6@%9>wt*k*FNz=aiT^87c!G&@BA)T}xX*Dp z9)v%%4c`LuKlfc+f4KtH3&PeSjf_D8$EqJ&UY+!zdEQT>Pv^d{)qD`-MG~1?uj9v7 z*XOs)6$D@nc94>a=4=WK9=WOcNPTOq_@?JmUtdS?G^9Es2 z&`|ILDESdIbm?jH4=5>UlFkwZ%y@6@i)k3?cHX>syR$dD`=M&q7-JxfK^hhjKwAW% z{7jIBRZwC2ZT;zb^L^z3DAPp7BKsalWhsg37H@p!Zk z=WElCwZbu^FV24bd?1T?UacS3-wrL_cOAQDb#dg*ELAU;i>Y*LbmDd$cao}Svng}H zoz#wzGv4I3bA>`CmDlrn4odfNg6-Iy0k90hQ0Z|0VY{-wx7~uUqOujX5sb0xY%>sN z36^9xm3s{I@np#D4tnki-Bm$6v+84J5B1w~im}?;3v8C;6`k;SnbM$0X}g&ToD`2p50+ zxxlRYf(cxzK=p!`dPTe4MER5X6#wd^56$xPG{(tAfM_`%1iC*96ZM|WiRJa>EfazO zM1UR&sc6oI!k{Qpvyu9?SWEQL_VU!%sDk72qt&~x#bK)lx>+`GC>@j=%|qiK9awd< zxmz-=X06t$wykz)*Q{D3d*N^kU!{fb%AJ6HS#NPb$5JuYlzM1)U#~$zcbJ?me#y}c_49q-$*MSqwPXrlA zKpc|a60Z{0r_$ZD=0Qds!}+a?YJlf>beK#S1+`;koi6S`Qwq?T%wsW zKlW_l`L5Hk-?_qW4}IS~5w_=?bdKGL%q$k4YneuW=(k;eq?y^QW_5+D?dUoELvA}) zC~RqYp659*p5OwwuZtT$QS%S z-bV?wb|sWje@h`JP(ywPaW&)wV@zm>6r=T|i{p40`VmC3(*UM(@EHNJ7$N<lnO(v1>T!`I0!OPx4)nLID$Bh=eBVN?+o9T!mkMWt=cFsXmKD7AjC) z1#Ol_#^3?Y)YHJ`cPD*xl9yRL!mxN}F6Y&S9@E=uxOjKE!R7tsDGLMYi4-rw79z>*ec%WO@*&Tg<ryDEyDf*9oF3xa=$AuG?mH$7^u*D6(#3H+2;&HPvJ>ehv;2erS!75*t5dZ| ztgwlg*6a|8M*D39NKT}q{PWOD7T^m4s-aBPts#Lm-zokZ0@+WJQMy&BQ!@C2=x`Fr zniP^=o8fib+(hyUa#wNC`I0#3p44we2zg9=CJ>sct77G6c^!UTDxQ2Ks6J&P|5Tv7 z4tJ($L<|g^=}x81?oRq>kXKo3VYojH5Y6Xxe4(=@>%Evz^ZTnVlY$7ug6~QyTC=7x zuw^Qk>E2p%v1)C)*HsPYg^!oFVN<|n2e@4_aVowl)#?Z4;sxMXc73;KJN0U{QE58O r;;vnBNKbzY_)Z;sY5o|Tg(dM!bhl|dIQ3L20Z>4{j?MIpVr+uH0(p#` literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_thread_get_msg.o b/hardware/arduino/mtk/system/libmtk/debug/vm_thread_get_msg.o new file mode 100644 index 0000000000000000000000000000000000000000..74fdca2ef379e8044e0d640d5881a5de1368b63e GIT binary patch literal 1228 zcma)5&2G~`5T13MlC~yglgm{dXwATHF&N=(Uc7KctQS zpWQVMarKCa{ZoPR zI;=-&L<|g^?Fl#ib<)Sj`AHgMI`_zC^E#MO5|OM&J(f26eRa!ZHU>9f8zHG^&8o)W zsZ5P$>RWv#Zig}Tbw#5l&OTb+hD`yR9pFyE!YTi{P_5Oi>q2lVPHivmxV3V*QEIx) r{GL;CNk`8g-=&K$D;R-$tpwJl9wu>vv|nQp;5qsYyfj6M@v#2_)hU8{ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_thread_send_msg.o b/hardware/arduino/mtk/system/libmtk/debug/vm_thread_send_msg.o new file mode 100644 index 0000000000000000000000000000000000000000..1a55012e513b14d9b969b07ef57461cff7645c35 GIT binary patch literal 1240 zcma)5yKWOf6usj|><}X3$bcPIu%IB>n5@>p0xLog$IpljMzM>CX0x_eu_YYC?gU{` z&`|IJl>7z~MS9x&0VM@Z(pjQ_dp$dAC!t`ZnRD*BXXftC<3q)$GR8nQ25Fc^04))O z^AkfF79a}aud!#b#{2S*R6<$r%_)n@=PKNb9P3I(xud{Iay&j_M^KAwMe8qjlgW4w zP8P=>tA#yCpC14E`A`<~Fk0KIy&agm=h#-)bnSz#IdJzeSu2&+)pT=s=yYsnq}H-o z)#!6uUDI>=o7`%yP{^oxEwAOE_yFyeZMFNrGDyS4o$W`h^7hth6XpU@HqVwq33ioT z4<=cPEwh_}`wTR9G~iYnkvjr=k~#J(joa@yXkCk2ptW5WG-pTwxpP_`w9araun*9J zwKR)!r{6y0w(I@Wf50vD(Du%GUfSc9#|c6nzkxXKae{A{P!UO^`Q(dYzw5<8L~5S| z_@g*VfGjHHpY_RFWR_e6+&+^R^qhgYA-{vO1OcURhGXnEs5&Db`>?!=HGGcN8fbP~ZUL1pB GJn+9orHBjw literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_auto_rehandshake.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_auto_rehandshake.o new file mode 100644 index 0000000000000000000000000000000000000000..31108d80ab4c89a227a7ff70bf7a5a6b29a96c88 GIT binary patch literal 1256 zcmaJ=O>fgc5S?{CNLrz!6^JB6#Xvy`p_Wr3sJPI42XF~$a>xneBo>KinqY4b5eKgP z1#bKaZawsf#07o@Cs4Wd1~akOHIdShc4yw3=bhcz^@plfV~l|?1{pX*038Q}3UfgQ zRv`kDFR`aF?R_PkyfFx;FQ(y6_`90Urr{)YIysV#BK7E#Xya2SkyshPN&Hkw%P%4G z>j%5pDgFL=T)QudxjtS$uDu=U{J_?YDIe>WIWP|U_P}^;0@TaphjOMho?1QAn#uKC zPS%Fpl(*Hq`X;}X-`UB^1*M?mp?DA1Gfbm91eV1xRNUWt(5~z~-fBTuim)hK4_;!I z*_A+oC0UAXNOu`1_H4wBE_!Y`ejp;tJW#m#j)T%SxB*Jnwn4GR1W27%3ZV4Hqmg-t z60D^doLj^0l$-X#0ndTgFh?y8yBg|q+l|Qu-S{f{s2h{}iU}D#ar8auA~eiZ;0|%3JfsGKM;4*C_9=v+; z?%jXETMzvY)WrY6lcwH!)AyJiKoXL^WafSEd*964oq6-VWR@9YAdNv1rV+pk5d^Yh zK@yfB1cNV;rxEjAQH|ef2i40e+zEa&)RYQmiSxmUauTY9pMao~T8_uHVimJVY z_!Jz3Sl6(zx$w8+WrQRz1i>e zoI{jgE#2na?KF~42Gp)UH`Jhy@YPq~wvPl2R;TFDA3tyT$0&8JO{H7foalG&%`q(l6^;-g) KiT*2wP4EvLf04of literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_check_peer_name.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_check_peer_name.o new file mode 100644 index 0000000000000000000000000000000000000000..8befa52529014c353a79daba42324f902f200bd0 GIT binary patch literal 1256 zcma)5%Wl&^6usj-NLrz!6^JAlu%Ji@p~fi@RBXsQ1zdufEV4i{PHK^ex(SYph*+>f z;uqNQ6YRR^5{V6b1uIb5bqDu)JWdp~5+lvrbM8H!GoHu$y53-nfoKe}Fk=8+P9jB5 zkcDN4!T3w!NkV^DlhfA+QTe#1^aob|l`*y~$JjS*3kA(;^?{OYj}Dx^eMqxCjKr5KB|)$j#& zkzER&s|HC+?b-edx*Ga^Fjf?5Q%KeBCW zA0_Ceny%{%dk3yH@qg?;!Zp;;7Ds(8?Q_S+6v95fj4|$G3SY6HV5A&6;BoVx##|9^wP(sQ%E8JPYs{0eOffe77)xo@0^! zhJfEKo)Nkgt`jo&i>Mng?n#vN(p)}?lWUkH&xzWq=?_=!!Q-w< zJ3|ddQ*Twuy3uMh+VzgnDOdEmLE@K|Yv2nt@QpcBFitn4C6%zJalti=sbv7VXBoUi II&nPwe}9;bMgRZ+ literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_connect.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_connect.o new file mode 100644 index 0000000000000000000000000000000000000000..8872db52265a5ac484cb0d7211147e8b8690e38d GIT binary patch literal 1224 zcma)5%Wl&^6usj-NLrz!5fx4_U_lWHp_Wr3h}h7)1GuDWvd9J*C$&hV=7BRsL@e0y z3GfH}0J|k00@lFwQM0u7bh`mTDa67o=D)%=*;Sv+;w-^# zNcS0N<4K=eZA9+4*cHsNk2G$-gJ$ z*x)a+)+};sQb>MjK@Z{LI*MzkMX=NUXuot$;#-kI4ikMMUK4diEO1fx!=HabC-hCL z&lTTN1IeFY3(TrfFXRog zUa2(7O|zLV7-f@8uWfGPi!|{~ITJ9K7pKy@*yFg75~92gK=&zumxcBz<4^t%sSJPW literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_delete_conn.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_delete_conn.o new file mode 100644 index 0000000000000000000000000000000000000000..db71d16f3c4fd8c6fd259e25b8886179e0ec169c GIT binary patch literal 1236 zcma)5U2hUW6uq-Rg*K_QsR~GR)tXSTlckbKj8XYU-AYq<;B8%CA|!n1GBpw(eDO!< z|IoKSH1QAUukfv@PxejkWp{v5ADm?7oO|w>xx4f6p=g#EW1t#?1k56UJvRuXCx!&9 zKoBxtSD&w%?+fwh%}yW=cLLuNaX5*cW)8K(U^(~Emh<@sdZIQwa9Y9{>*ZupH@i~kJ4VWQ zliE&YGFy6@r+Esp_t0(&yV(V{g*1@e-@RWi>^|MD!IBnaA-3+{V3*hxUxYA2WY%n>~<#XAYSZA%+?b2I|(3@IRYil>3MhW)-6papAjTS}+fJdk4K z{nUTJb@b5IE_q(s-#w2L_&t6VG30TAFPP8~Nu&AX3u3?R#Xdx8A6=M^?lA%+Q6c}l zPt_u`;s$b>qt1)g+rX|G`6&O`L#2O0LN!!Vbt@=f&DTo*hQz&7uA+Qvu20$EH?qbw za%)mZer-+<;^GF1%cxz%PTv>CPWz<(6)9veF(%?QRaeCd=XF2)`lED0-=z9X@tvta zc|Tm9rI9g+;`nf?&96@Wz$8CSV;r9a$QJW{xN#=$)-$Kt;`-{AxdtCxn4A&0XwJIE z;L&uhyKnV{Sa>n*>zan+`A5rJuqk1)4cyEdIAmYsE7g7DA5O5!W;K^Jt!k-ME7q-g tHfI(sGQJYh!k1~`+j7QWoi9S4LHiiR!+nAnSpg^@#_;0M9gE}07V5@Vv2zv@;R;J|HNU?U_Tx=foA4_^Eb z`YpV8>!FEXKtF}Irk?Cg-(z+F>BX1Kyx;r1-_DzTGxMQnl^A27j6o7+5x}7gLYavm z2`dnW?AO&7tJeEMB6g=6O2AI&dolqR@yqO~b{Z~6o<}O5o4UT-g^TE=mM~sH^85$8 z+uT3@c~;s}g?t|^pOuaWw&;)Sj@x&IYq!M-<;wZ|BO_TK9(iro8yn?R%CLIEHTKN3 z`7XVi&Stlb4A1a1df`dmRmgMuT(~C!c*hYA@YZMq+#6Cr>NL*)Zx06p_YF$07I%d3daWbj zj%efmXSY#CtzGiv)ZarNlMDLzCi;kv$$i0ufu1<}o^)Xx_xw13p6sJ^(^(!PKnfYs z&+Akz5-V&Xrf<}F(Rv#=l#!0|PkgWVPY9@nGF7*N1lD}3_-_d0osx{wtx27d!EZ#( zX(Ve>NP2CK598t{lFP_l$3gpx;-EgMe?pr>eQ1)OrZJ{-pV?wQ2*xalNY=Ba+~WG`mPtVXuE7pMQqec- z8k^gj>|0GrCo}c2?Z?#DHI16M_-J_>wghZ-fLnPJr`*eYrCKwu3c)U0)%~1hS4*XO wv0*oI`&Q8=-D_9a_%3aHS>71zD1$1-1r*>;M1& literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_get_cipher.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_get_cipher.o new file mode 100644 index 0000000000000000000000000000000000000000..754811473ab5bf753f4d1830a28dcbef3843f686 GIT binary patch literal 1236 zcma)6&uaB?feUI4zq?f*A=6&yb-_Ezp%<{fulo?|ngFzBz6+lxIf$T(( zgk=c9@Jr-b#CTU!@Y}f4chF#mCUZqfYq$L}JBd23KW37@-Yevtt zwQW74zsYQ6c6L%)mS=eea`#bg*;cy;EQK(TtM5N-7WbcQH6W;jSeUK)*VsC{?u)TF zOR$^DJqCOhSv+Ic5mB_IVxof|5fgf0|1-v~P0e1#ekUGP&z&nF}-+qk}^x~H5 zI=%LhYmex~FBi8^M%x?o%hbeu=hK89qdY*J49Cy9ihneDoNYhyy zB|sV(($DLp7l|d-5z{l|bmynC#p!bX7pna0R6(Q_mfgc5S?{CNLrz!6^JAlu%Ji@p~fi@R9wiXQ@|yt$sq?MCx zB>n<7{sgxkdPL#^zk(B}+hHGTe%O*W{cG$C;Dyp>!B)#2?4EK6O&5r9K=dPb67+ z0oh+a*o{u*_s=8!o-p$<**MbQ3{7`$V!pCnvo{#`ZO0t!zZ{{UQLR2uvaQj9)3cqa z(#Yo(W8m7#hE~vC7uE}#n>nSZ7S#fj@1oqYt?mF=4r!#kvwgo^+kUj(f~XW@akd)1 zz%H^&p%hEA47)1bW}r@{L)Ypex(>&_V2-_~y7pTa)LqN9K#;d-2CjMk9hT8 zb4NQv4Q9h=R?3Fi)b&=qZMMr5qi&Lz{s;Jln)r=5Q!r0Aqa~HFr*XkG#MCkX-Lni{ JB7Q+qQz-?XVMo5a_GBpwpz4|YB z^Plk619va_S9sFYTW|W_&d!!LJvhnE``-7ynQwSI%W>UoFvdU*23a`I0D2;clsrKe zRv`w{uZb54^J7g--yKHP>nhxjemB&d3a6Q~>4|a@YsR0)Tc3NW)XES}lV^&my@u?s zA8fN%`TcXzcqGmIm~1W@@5dHDoLO%iZcQD>wFZvMy>hc!eWGPMlOq?Yxz^0*HFLxr zZQCds?}~-u&Q4A%=_S1g<%hVycI^HLSPo&NyubIjTibh9=s;A7u{c`~-(WY{tx$@k zS%z&W4;bjP`Iy^%jNBD*D3R+N>fHIjK|ip$4SIhz1KpiaLh7Pk0(~$UkDa$DK`-6r z+#U6gxHI#A*nfmOsG$}|eJ%C5>thOGAK%6p_c4V97Bq~+(R$Lw@VV#bA&fLWi4e@< zbpqs(A^oyWdXZRS12L`HCK3njm-3L9NJsUjeiSUg7X;)XhxBbBfu2*ze?uVdmSCiA zP3WWy{vzrHnee2P^vV*S#LW#PSCC8KL+4B4Lw%CJ6(Q_m;h2Cwq_50nT;{{@hmH}9 zkmnwxxc{;P`Gqg^icU-KaW`19ygTV5UOgydzHy!)x?B&#=7qZOdlhh(_m{U!2tsfT z3J6I>Yt|J86;bkL>f3V9DIfWD>g$?<^Hm?NK7cI_TL++Xs{J-6ARd7vR@v;rHdv!Me&w^fHYHtKoT4s{nMrGI)7R%JHTD1FxWp ASO5S3 literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_handshake.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_handshake.o new file mode 100644 index 0000000000000000000000000000000000000000..540fc23142a5b49e1d90ed70432acdc5e9465162 GIT binary patch literal 1228 zcma)5O>YuG7=CAg3T;wpQ&T{q8?6ZyJAq0fX-t%F)UA-hf!n&kMu?^8?$k&;c=1Q* zfAH$9hbI03{T1Gtda^ftUuFlkcyW@M=lytQo|$)MK2(eSdkb=1f(3DOnHzlNC z1;UX3y83L@cwbJ&Zw*38xEuPOO2T>KB7dTtglmzfk^1LOEVev=^XP?^)L%gA><7Eu zDW3g2t?nuz52Lly>f4bi4qbC#9rfLT^~#>6YNgVio@$Mcou2JX^jbQt8$)61yP0g} zO?D@n&u{BFp5s|4+{X!)ZFPshw$Tg~4)!0k%ll7uTCk*rS%j?zH`q0{8HlksORyW- zJqFyJjD*!i6pqA!vK;%63;Ue_-nWDWyz9EaoiRDY&hi}a-gq>!kC1{|+!DeWc8`Va zdWZTCxQQGp?UKi(`ZhhAAn4iG5hI>W@C6e(BE@Jv@xs{eczytp+D8eqQC=fJ8Y9H_ z^OP2mm7PJG=BWFk^)|4pMm)+t@=(P;p+Op|Dcw2-Q1i8le?vpQDH&0`HOW&n_>ER) z=1EO*iLd$MVO%_e!DWnH#ZLQ+Vy8N(v!V%kO!%)!=~B+${P7_C`s2?9rt0%Z;F1FA z1uxZ#cDsr6hqEdE)rlXP=4Wa26LSZx#e5Lx{mh%xGiHIs_0=nrgaBLt`Y6PrIqMpO zJ(-%0RJZ1WZ+Sk|bxp%@@ze4iYzf%v12;+;9171%^~OQwA0C)BqfsmvW}{kdRoZ5| rP&6tg(O%lZ#9wLRzj7vEE(*x{#c^|waSyQ-fHGnN9}K;%7+&;WMi7DT literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_log_plaintext.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_log_plaintext.o new file mode 100644 index 0000000000000000000000000000000000000000..b4ee1179aebac2b0edb474a7253833e828583c1f GIT binary patch literal 1244 zcma)5&uXrGkU_- zcJz$?K9kPma@$&#XL$zlPjG@|TkRgOZKR?6{@&AOY42sa0ZU4lMc8`qHoL>_22>Vf zakim6X23_|fw0<$!tt;xnPd04yA6I|2@808Gy?7n$sl!xXMuNygMob{fMYIh3E}kG zC&C{22m24Wj~XiPlCPy2zx6pm(C7CMBR(gXU_e78AI&FS82dxt4j@wd?7?*Ot`Z=H z9@5Y2WG)g*t|O;8^3G^I6}xPtqxf?lrT;4u$|0M~TSEutJeL0NNW6FDd8BU5(@7cp zLDrgDUQRMeugv*x;^I0wm(h0%JMAxuo$4gdiWGJ+a7x5)GOx5H&ijM#`>*s92Hfm3 zPvA-hiU+UMigru)xI3LPzdGqdZhRU>dt+uGyB-h1=9RdY&zSnIuP;>*eT>&T|#_{pcJ5%w}{{evjiK_qr literal 0 HcmV?d00001 diff --git a/hardware/arduino/mtk/system/libmtk/debug/vm_tls_new_conn.o b/hardware/arduino/mtk/system/libmtk/debug/vm_tls_new_conn.o new file mode 100644 index 0000000000000000000000000000000000000000..520b4ce97f469e632cc8ffcc7ebed8040f5ba162 GIT binary patch literal 1224 zcmaJ=%Wl&^6usj-NLrz^<&^}hSWu*dP|GP1L~J1M0B%z?S!8FN)FP3Z2aXFwEZFi1 z@CW<=yDlp61Mn5BKxIXDaBs%rx?Xf7&pqedGjqrD_)yd9j4=?6K?cqkz%D0|!orY& zWr)G_YvM&he_xeTw+B)AvJCg4-!(Za!%6yddL$ji8u91x=I3rQxio;2l~YMpUP9*A z4|bH4FUM1@so?XltXchxWJQVhUjw-^3VqF@-OfP%x54K_DTFJLMURwTLf}Zmva8**TeAVpFbB0 zj0&BrK=s0K#XkW3*O5Q