Quectel M66-OpenCPU User Guide V1.0
Quectel M66-OpenCPU User Guide V1.0
User Guide
Rev. M66-OpenCPU_User_Guide_V6.0
Date: 2014-10-14
www.quectel.com
GSM/GPRS Module Series
M66-OpenCPU User Guide
Our aim is to provide customers with timely and comprehensive service. For any
assistance, please contact our company headquarters:
l
http://www.quectel.com/support/salesupport.aspx
t e
For technical support, to report documentation errors, please visit:
c l
http://www.quectel.com/support/techsupport.aspx
u e t ia
GENERAL NOTES
n
QUECTEL OFFERS THIS INFORMATION AS A SERVICE TO ITS CUSTOMERS. THE INFORMATION
PROVIDED IS BASED UPON CUSTOMERS REQUIREMENTS. QUECTEL MAKES EVERY EFFORT
Q ide
TO ENSURE THE QUALITY OF THE INFORMATION IT MAKES AVAILABLE. QUECTEL DOES NOT
MAKE ANY WARRANTY AS TO THE INFORMATION CONTAINED HEREIN, AND DOES NOT ACCEPT
ANY LIABILITY FOR ANY INJURY, LOSS OR DAMAGE OF ANY KIND INCURRED BY USE OF OR
f
RELIANCE UPON THE INFORMATION. ALL INFORMATION SUPPLIED HEREIN IS SUBJECT TO
CHANGE WITHOUT PRIOR NOTICE.
COPYRIGHT
o n
THIS INFORMATION CONTAINED HERE IS PROPRIETARY TECHNICAL INFORMATION OF
C
QUECTEL CO., LTD. TRANSMITTABLE, REPRODUCTION, DISSEMINATION AND EDITING OF THIS
DOCUMENT AS WELL AS UTILIZATION OF THIS CONTENTS ARE FORBIDDEN WITHOUT
PERMISSION. OFFENDERS WILL BE HELD LIABLE FOR PAYMENT OF DAMAGES. ALL RIGHTS
ARE RESERVED IN THE EVENT OF A PATENT GRANT OR REGISTRATION OF A UTILITY MODEL
OR DESIGN.
Copyright Quectel Wireless Solutions Co., Ltd. 2014. All rights reserved.
APPLICATIVE PRODUCT
MODULE TYPE
M66
t el
e c ia l
u n t
Q ide
n f
Co
History
el
Revision Date Author Description
c t l
1.0 2014-10-14 Stanley YONG Initial
u e t ia
Q ide n
n f
Co
Contents
1 Introduction ........................................................................................................................................ 14
2 OpenCPU Platform............................................................................................................................. 15
2.1. System Architecture ................................................................................................................ 15
l
2.2. Open Resources ..................................................................................................................... 16
2.2.1. Processor ....................................................................................................................... 16
t e
2.2.2. Memory Scheme ............................................................................................................ 16
l
2.3. Interfaces ................................................................................................................................. 16
c
2.3.1. Serial Interfaces ............................................................................................................. 16
a
2.3.2. GPIO .............................................................................................................................. 16
e i
2.3.3. EINT ............................................................................................................................... 17
u t
2.3.4. PWM............................................................................................................................... 17
n
2.3.5. ADC ................................................................................................................................ 17
2.3.6. IIC ................................................................................................................................... 17
Q ide
2.3.7. SPI .................................................................................................................................. 17
2.3.8. Power Key ...................................................................................................................... 17
2.4. Development Environment ...................................................................................................... 18
f
2.4.1. SDK ................................................................................................................................ 18
2.4.2. Editor .............................................................................................................................. 18
n
2.4.3. Compiler & Compiling .................................................................................................... 18
o
2.4.3.1. Complier ............................................................................................................ 18
2.4.3.2. Compiling ........................................................................................................... 18
C
2.4.3.3. Compiling Output ............................................................................................... 19
2.4.4. Download ....................................................................................................................... 19
2.4.5. How to Program ............................................................................................................. 19
2.4.5.1. Program Composition ........................................................................................ 19
2.4.5.2. Program Framework .......................................................................................... 20
2.4.5.3. Makefile ............................................................................................................. 22
2.4.5.4. How to Add .c File.............................................................................................. 23
2.4.5.5. How to Add Directory ......................................................................................... 23
4 System Configuration........................................................................................................................ 26
4.1. Configuration for Tasks............................................................................................................ 26
4.2. Configuration for GPIO............................................................................................................ 27
l
5.1.1.5. Event.................................................................................................................. 32
e
5.1.1.6. Backup Critical Data .......................................................................................... 32
t
5.1.2. API Functions ................................................................................................................. 33
l
5.1.2.1. Ql_Reset ............................................................................................................ 33
c
5.1.2.2. Ql_Sleep ............................................................................................................ 33
e ia
5.1.2.3. Ql_GetUID ......................................................................................................... 34
t
5.1.2.4. Ql_GetCoreVer .................................................................................................. 34
u
5.1.2.5. Ql_GetSDKVer .................................................................................................. 35
n
5.1.2.6. Ql_GetMsSincePwrOn ...................................................................................... 35
Q ide
5.1.2.7. Ql_OS_GetMessage ......................................................................................... 35
5.1.2.8. Ql_OS_SendMessage....................................................................................... 36
5.1.2.9. Ql_OS_CreateMutex ......................................................................................... 37
5.1.2.10. Ql_OS_TakeMutex ............................................................................................ 37
f
5.1.2.11. Ql_OS_GiveMutex............................................................................................. 37
n
5.1.2.12. Ql_OS_CreateSemaphore ................................................................................ 38
5.1.2.13. Ql_OS_TakeSemaphore ................................................................................... 38
o
5.1.2.14. Ql_OS_CreateEvent .......................................................................................... 39
5.1.2.15. Ql_OS_WaitEvent ............................................................................................. 39
C
5.1.2.16. Ql_OS_SetEvent ............................................................................................... 40
5.1.2.17. Ql_OS_GiveSemaphore.................................................................................... 40
5.1.2.18. Ql_SetLastErrorCode ........................................................................................ 41
5.1.2.19. Ql_GetLastErrorCode ........................................................................................ 41
5.1.2.20. Ql_OS_GetCurrenTaskLeftStackSize ............................................................... 42
5.1.2.21. Ql_Userdata_Backup ........................................................................................ 42
5.1.2.22. Ql_Userdata_Read ............................................................................................ 43
5.1.3. Possible Error Code ....................................................................................................... 43
5.1.4. Example ......................................................................................................................... 44
5.2. Time API .................................................................................................................................. 45
5.2.1. Usage ............................................................................................................................. 45
5.2.2. API Functions ................................................................................................................. 45
5.2.2.1. Ql_SetLocalTime ............................................................................................... 46
5.2.2.2. Ql_GetLocalTime ............................................................................................... 46
5.2.2.3. Ql_Mktime.......................................................................................................... 47
l
5.4.1. Usage ............................................................................................................................. 52
5.4.1.1. Power on/off....................................................................................................... 52
e
5.4.1.2. Sleep Mode ....................................................................................................... 52
t
5.4.2. API Functions ................................................................................................................. 53
c l
5.4.2.1. Ql_PowerDown.................................................................................................. 53
a
5.4.2.2. Ql_LockPower ................................................................................................... 53
e i
5.4.2.3. Ql_PwrKey_Register ......................................................................................... 53
u t
5.4.2.4. Ql_SleepEnable................................................................................................. 54
n
5.4.2.5. Ql_SleepDisable ................................................................................................ 55
5.4.3. Example ......................................................................................................................... 55
Q ide
5.5. Memory API ............................................................................................................................. 55
5.5.1. Usage ............................................................................................................................. 56
5.5.2. API Functions ................................................................................................................. 56
f
5.5.2.1. Ql_MEM_Alloc ................................................................................................... 56
5.5.2.2. Ql_MEM_Free ................................................................................................... 56
n
5.5.3. Example ......................................................................................................................... 57
o
5.6. File System API ....................................................................................................................... 57
5.6.1. Usage ............................................................................................................................. 57
5.6.2. API Functions ................................................................................................................. 58
C
5.6.2.1. Ql_FS_Open...................................................................................................... 58
5.6.2.2. Ql_FS_OpenRAMFile ........................................................................................ 59
5.6.2.3. Ql_FS_Read ...................................................................................................... 60
5.6.2.4. Ql_FS_Write ...................................................................................................... 60
5.6.2.5. Ql_FS_Seek ...................................................................................................... 61
5.6.2.6. Ql_FS_GetFilePosition ...................................................................................... 62
5.6.2.7. Ql_FS_Truncate ................................................................................................ 62
5.6.2.8. Ql_FS_Flush...................................................................................................... 63
5.6.2.9. Ql_FS_Close ..................................................................................................... 63
5.6.2.10. Ql_FS_GetSize.................................................................................................. 63
5.6.2.11. Ql_FS_Delete .................................................................................................... 64
5.6.2.12. Ql_FS_Check .................................................................................................... 64
5.6.2.13. Ql_FS_Rename ................................................................................................. 65
5.6.2.14. Ql_FS_CreateDir ............................................................................................... 66
l
5.7. Hardware Interface API ........................................................................................................... 77
5.7.1. UART .............................................................................................................................. 77
e
5.7.1.1. UART Overview ................................................................................................. 77
t
5.7.1.2. UART Usage...................................................................................................... 78
c l
5.7.1.3. API Functions .................................................................................................... 79
a
5.7.1.4. Ql_UART_Register ............................................................................................ 79
e i
5.7.1.5. Ql_UART_Open ................................................................................................ 79
u t
5.7.1.6. Ql_UART_OpenEx ............................................................................................ 80
n
5.7.1.7. Ql_UART_Write ................................................................................................. 81
5.7.1.8. Ql_UART_Read................................................................................................. 82
Q ide
5.7.1.9. Ql_UART_SetDCBConfig .................................................................................. 82
5.7.1.10. Ql_UART_GetDCBConfig ................................................................................. 84
5.7.1.11. Ql_UART_ClrRxBuffer....................................................................................... 84
f
5.7.1.12. Ql_UART_ClrTxBuffer ....................................................................................... 85
5.7.1.13. Ql_UART_GetPinStatus .................................................................................... 85
n
5.7.1.14. Ql_UART_SetPinStatus..................................................................................... 86
o
5.7.1.15. Ql_UART_SendEscap ....................................................................................... 86
5.7.1.16. Ql_UART_Close ................................................................................................ 87
5.7.1.17. Example ............................................................................................................. 87
C
5.7.2. GPIO .............................................................................................................................. 88
5.7.2.1. GPIO Overview.................................................................................................. 88
5.7.2.2. GPIO List ........................................................................................................... 88
5.7.2.3. GPIO Initial Configuration.................................................................................. 89
5.7.2.4. GPIO Usage ...................................................................................................... 90
5.7.2.5. API Functions .................................................................................................... 90
5.7.2.6. Ql_GPIO_Init ..................................................................................................... 90
5.7.2.7. Ql_GPIO_GetLevel............................................................................................ 91
5.7.2.8. Ql_GPIO_SetLevel ............................................................................................ 91
5.7.2.9. Ql_GPIO_GetDirection ...................................................................................... 91
5.7.2.10. Ql_GPIO_SetDirection ...................................................................................... 92
5.7.2.11. Ql_GPIO_GetPullSelection ............................................................................... 92
5.7.2.12. Ql_GPIO_SetPullSelection................................................................................ 93
5.7.2.13. Ql_GPIO_Uninit ................................................................................................. 93
l
5.7.3.10. Ql_EINT_Unmask.............................................................................................. 99
5.7.3.11. Example ............................................................................................................. 99
e
5.7.4. PWM............................................................................................................................. 100
t
5.7.4.1. PWM Overview ................................................................................................ 100
c l
5.7.4.2. PWM Usage .................................................................................................... 101
a
5.7.4.3. API Functions .................................................................................................. 101
e i
5.7.4.4. Ql_PWM_Init ................................................................................................... 101
u t
5.7.4.5. Ql_PWM_Uninit ............................................................................................... 102
n
5.7.4.6. Ql_PWM_Output ............................................................................................. 102
5.7.4.7. Example ........................................................................................................... 103
Q ide
5.7.5. ADC .............................................................................................................................. 103
5.7.5.1. ADC Overview ................................................................................................. 103
5.7.5.2. ADC Usage ...................................................................................................... 104
f
5.7.5.3. API Functions .................................................................................................. 104
5.7.5.4. Ql_ADC_Register ............................................................................................ 104
n
5.7.5.5. Ql_ADC_Init ..................................................................................................... 105
o
5.7.5.6. Ql_ADC_Sampling .......................................................................................... 105
5.7.5.7. Example ........................................................................................................... 106
5.7.6. IIC ................................................................................................................................. 106
C
5.7.6.1. IIC Overview .................................................................................................... 106
5.7.6.2. IIC Usage ......................................................................................................... 107
5.7.6.3. API Functions .................................................................................................. 107
5.7.6.4. Ql_IIC_Init ........................................................................................................ 107
5.7.6.5. Ql_IIC_Config .................................................................................................. 108
5.7.6.6. Ql_IIC_Write .................................................................................................... 109
5.7.6.7. Ql_IIC_Read .................................................................................................... 109
5.7.6.8. Ql_IIC_WriteRead ........................................................................................... 110
5.7.6.9. Ql_IIC_Uninit ....................................................................................................111
5.7.6.10. Example ............................................................................................................111
5.7.7. SPI ................................................................................................................................ 112
5.7.7.1. SPI Overview ................................................................................................... 112
5.7.7.2. SPI Usage........................................................................................................ 112
5.7.7.3. API Functions .................................................................................................. 113
l
5.8.3.1. Ql_GPRS_Register ......................................................................................... 118
5.8.3.2. Callback_GPRS_Actived................................................................................. 119
e
5.8.3.3. CallBack_GPRS_Deactived ............................................................................ 120
t
5.8.3.4. Ql_GPRS_Config ............................................................................................ 120
c l
5.8.3.5. Ql_GPRS_Activate .......................................................................................... 121
a
5.8.3.6. Ql_GPRS_ActivateEx ...................................................................................... 122
e i
5.8.3.7. Ql_GPRS_Deactivate ...................................................................................... 124
u t
5.8.3.8. Ql_GPRS_DeactivateEx ................................................................................. 125
n
5.8.3.9. Ql_GPRS_GetLocalIPAddress ........................................................................ 126
5.8.3.10. Ql_GPRS_GetDNSAddress ............................................................................ 126
Q ide
5.8.3.11. Ql_GPRS_SetDNS Address............................................................................ 127
5.9. Socket API ............................................................................................................................. 128
5.9.1. Overview ...................................................................................................................... 128
f
5.9.2. Usage ........................................................................................................................... 128
5.9.2.1. TCP Client Socket Usage................................................................................ 128
n
5.9.2.2. TCP Server Socket Usage .............................................................................. 128
o
5.9.2.3. UDP Service Socket Usage ............................................................................ 129
5.9.3. API Functions ............................................................................................................... 129
5.9.3.1. Ql_SOC_Register ............................................................................................ 129
C
5.9.3.2. Callback_Socket_Connect .............................................................................. 130
5.9.3.3. Callback_Socket_Close .................................................................................. 131
5.9.3.4. Callback_Socket_Accept................................................................................. 131
5.9.3.5. Callback_Socket_Read ................................................................................... 132
5.9.3.6. Callback_Socket_Write ................................................................................... 132
5.9.3.7. Ql_SOC_Create .............................................................................................. 133
5.9.3.8. Ql_SOC_Close ................................................................................................ 134
5.9.3.9. Ql_SOC_Connect ............................................................................................ 134
5.9.3.10. Ql_SOC_ConnectEx ....................................................................................... 135
5.9.3.11. Ql_SOC_Send ................................................................................................. 136
5.9.3.12. Ql_SOC_Recv ................................................................................................. 137
5.9.3.13. Ql_SOC_GetAckNumber ................................................................................ 138
5.9.3.14. Ql_SOC_SendTo ............................................................................................. 138
5.9.3.15. Ql_SOC_RecvFrom......................................................................................... 139
l
5.11.2.1. Ql_FOTA _Init .................................................................................................. 144
5.11.2.2. Ql_FOTA_WriteData ........................................................................................ 145
e
5.11.2.3. Ql_FOTA_ReadData ....................................................................................... 146
t
5.11.2.4. Ql_FOTA_Finish .............................................................................................. 146
c l
5.11.2.5. Ql_FOTA_Update ............................................................................................ 147
a
5.11.3. Example ....................................................................................................................... 148
e i
5.12. Debug API ............................................................................................................................. 150
u t
5.12.1. Usage ........................................................................................................................... 150
n
5.12.2. API Functions ............................................................................................................... 150
5.12.2.1. Ql_Debug_Trace ............................................................................................. 150
Q ide
5.13. RIL API................................................................................................................................... 152
5.13.1. AT API........................................................................................................................... 152
5.13.1.1. Ql_RIL_SendATCmd ....................................................................................... 152
f
5.13.2. Telephony API .............................................................................................................. 153
5.13.2.1. RIL_Telephony_Dial ........................................................................................ 154
n
5.13.2.2. RIL_Telephony_Answer .................................................................................. 154
o
5.13.2.3. RIL_Telephony_Hangup .................................................................................. 155
5.13.3. SMS API ....................................................................................................................... 155
5.13.3.1. RIL_SMS_ReadSMS_Text .............................................................................. 156
C
5.13.3.2. RIL_SMS_ReadSMS_PDU ............................................................................. 156
5.13.3.3. RIL_SMS_SendSMS_Text .............................................................................. 157
5.13.3.4. RIL_SMS_SendSMS_PDU ............................................................................. 158
5.13.3.5. RIL_SMS_DeleteSMS ..................................................................................... 159
5.13.4. SIM Card and Network Related API ............................................................................ 159
5.13.4.1. RIL_NW_GetSIMCardState............................................................................. 159
5.13.4.2. RIL_NW_GetGSMState................................................................................... 160
5.13.4.3. RIL_NW_GetGPRSState................................................................................. 160
5.13.4.4. RIL_NW_GetSignalQuality .............................................................................. 161
5.13.4.5. RIL_NW_SetGPRSContext ............................................................................. 161
5.13.4.6. RIL_NW_SetAPN ............................................................................................ 162
5.13.5. GSM location API ......................................................................................................... 162
5.13.5.1. RIL_GetLocation.............................................................................................. 162
5.13.6. Secure data API ........................................................................................................... 163
t el
e c ia l
u n t
Q ide
n f
Co
Table Index
l
TABLE 9: ABBREVIATIONS ............................................................................................................................ 166
c t e l
u e t ia
Q ide n
n f
Co
Figure Index
t el
e c ia l
u n t
Q ide
n f
Co
1 Introduction
OpenCPU is an embedded development solution for M2M field that GSM/GPRS module can be designed
as the main processor. And it has been designed to facilitate the design and accelerate the application
development. OpenCPU makes it possible to create innovative applications and embed them directly into
Quectel GSM/GPRS modules to run without external MCU. It has been widely used in M2M field, such as
l
tracker & tracing, automotive, energy.
c t e l
u e t ia
Q ide n
n f
Co
2 OpenCPU Platform
l
The following figure shows the fundamental principle of OpenCPU software architecture.
t e l
OpenCPU Application (App)
c
Telephony SMS Other GPRS System
a
URC Handle I/O Access File Access Watchdog
e i
Program Program Program (TCP/UDP) Program
t
Program
u
URC by Message
f
File System API WTD API
Telephony API SMS API Customized
n
API
OpenCPU RIL (API) TCP/UDP API H/W API System API
o
OpenCPU Core System (Core)
C
H/W Application Interfaces
Power Supply PCM
OpenCPU Core System is a combination of hardware and software of GSM/GPRS module. It has built-in
ARM7EJ-S processor, and has been built over Nucleus operating system, which has the characteristics of
OpenCPU User APIs are designed for access to hardware resources, radio communications resources,
user file system, or external devices. All APIs are introduced in charpter 5.
OpenCPU RIL is an open source layer, which enables developer to simply call API to send AT and get the
response when API returns. And besides, developer can easily add a new API to implement an AT
command. Please also see OpenCPU_RIL_APPLICATION_NOTE document.
In OpenCPU RIL, all URC messages of module have already reinterpreted and the result is informed App
by system message. App will receive the message MSG_ID_URC_INDICATION when an URC arrives.
t el
c a l
2.2.1. Processor
e t i
32-bit ARM7EJ-STM RISC 260MHz.
u
Q ide
2.2.2. Memory Scheme
n
The OpenCPU module builds in 4MB flash and 4MB RAM.
f
User App Code Space: 360KB space available for image bin
RAM Space: 100KB static memory and 500KB dynamic memory
n
User File System Space: 300KB available
2.3. Interfaces
Co
2.3.1. Serial Interfaces
OpenCPU provides three UART ports: MAIN UART, DEBUG UART and AUX UART. They are also named
as UART1, UART2 and UART3. Please see [5.7.1] for software API functions.
UART1 is a 9-pin serial interface with RTS/CTS HW handshake. UART2 and UART3 are 3-wire interface.
UART2 has debug function that can debug the Core System. Please see [5.12].
2.3.2. GPIO
Therere 12 I/O pins that can be configured for general purpose I/O. All pins can be accessed under
OpenCPU by API functions. Please refer to [5.7.2] for details.
2.3.3. EINT
OpenCPU supports external interrupt input. Therere two I/O pins that can be configured for external
interrupt input. But the EINT cannot be used for the purpose of highly frequent interrupt detection, which
causes module unstably working. The EINT pins can be accessed by APIs. Please refer to [5.7.3] for
details.
2.3.4. PWM
Theres one I/O pin that can be configured for PWM. Therere 32K and 13M clock sources that are
available. The PWM pin can be configured and controlled by APIs. Please refer to [5.7.4] for details.
2.3.5. ADC
t el
c l
Theres an analogue input pins that can be configured for ADC. The sampling period and count can be
a
configured by an API. Please see [5.7.5].
u e t i
Please refer to the document [2] for the characteristics of ADC interface.
Q ide n
2.3.6. IIC
M66 OpenCPU provides a hardware IIC interface. Please refer to [5.7.6] for programming API functions.
n f
2.3.7. SPI
o
M66 OpenCPU provides a hardware SPI interface. The SPI interface is multiplexing with SD interface.
And also both of them are multiplexing with GPIOs. Please see [5.7.7] for programming API functions.
C
2.3.8. Power Key
In OpenCPU, App can catch the behavior that power key is pressed down or released. Then developer
may redefine the behavior of pressing power key. Please also see [4.3.1], [5.4.2.2] and [5.4.2.3].
2.4.1. SDK
Compile environment.
Development guide and other related documents.
A set of header files that defines all API functions and type declaration.
Source code for examples.
Open source code for RIL.
l
Download tool for application image bin.
e
Pack tool for FOTA upgrade.
t l
Customer may get the latest SDK package from sale channel.
2.4.2. Editor
e c t ia
u n
Any text editor is available for editing codes, such Source Insight, visual studio and even notepad.
Q ide
The Source Insight tool is recommended to edit and manage codes. Source Insight is an advanced code
editor and browser with built-in analysis for C/C++ program, and provides syntax highlighting, code
navigation and customizable keyboard shortcuts.
n f
2.4.3. Compiler & Compiling
o
2.4.3.1. Complier
C
OpenCPU uses GCC as compiler. And the compiler edition is Sourcery CodeBench. The document
Quectel_OpenCPU_GCC_Installation_Guide tells how to establish GCC environment.
2.4.3.2. Compiling
In OpenCPU, compiling commands are executed in command line. The compiling and clean commands
are defined as below.
make clean
make new
In command-line, some compiler processing information will be output during compiling. All WARNINGs
and ERRORs are recorded in \SDK\build\gcc\build.log.
So, if there exists any compiling error during compiling, please check the build.log for the error line
number and the error hints.
t el
When compiling this example program, a compiling error will be thrown out. In build.log, it goes like this:
e c ia l
u n t
Q ide
If no any compiling error during compiling, the prompt for successfully compiling is given.
n f
o
2.4.4. Download
C
The document Quectel_QFlash_User_Guide tells the download tool and how to use it to download
application bin.
By default, the custom directory has been designed to store the customer source code files in SDK.
Item Description
el
The following codes are the least codes that comprise an OpenCPU Embedded Application.
t l
/**
c
* The entrance of this application.
a
*/
e i
void proc_main_task(s32 taskId)
u t
{
n
ST_MSG msg;
Q ide
//START MESSAGE LOOP OF THIS TASK
while (1)
{
f
Ql_OS_GetMessage(&msg);
switch(msg.message)
n
{
o
case MSG_ID_RIL_READY:
{
C
Ql_Debug_Trace("<-- RIL is ready -->\r\n");
//Before use the RIL feature, you must initialize it by calling the following API
//After receive the 'MSG_ID_RIL_READY' message.
Ql_RIL_Initialize();
case URC_SYS_INIT_STATE_IND:
Ql_Debug_Trace("<-- Sys Init Status %d -->\r\n", msg.param2);
break;
case URC_SIM_CARD_STATE_IND:
Ql_Debug_Trace("<-- SIM Card Status:%d -->\r\n", msg.param2);
break;
case URC_GSM_NW_STATE_IND:
Ql_Debug_Trace("<-- GSM Network Status:%d -->\r\n", msg.param2);
break;
case URC_GPRS_NW_STATE_IND:
Ql_Debug_Trace("<-- GPRS Network Status:%d -->\r\n", msg.param2);
l
break;
case URC_CFUN_STATE_IND:
e
Ql_Debug_Trace("<-- CFUN Status:%d -->\r\n", msg.param2);
t
break;
c l
case URC_COMING_CALL_IND:
a
{
e i
ST_ComingCall* pComingCall = (ST_ComingCall*)msg.param2;
u t
Ql_Debug_Trace("<-- Coming call, number:%s, type:%d -->\r\n",
n
pComingCall->phoneNumber, pComingCall->type);
break;
Q ide
}
case URC_CALL_STATE_IND:
switch (msg.param2)
f
{
case CALL_STATE_BUSY:
n
Ql_Debug_Trace("<-- The number you dialed is busy now -->\r\n");
o
break;
case CALL_STATE_NO_ANSWER:
Ql_Debug_Trace("<-- The number you dialed has no answer -->\r\n");
C
break;
case CALL_STATE_NO_CARRIER:
Ql_Debug_Trace("<-- The number you dialed cannot reach -->\r\n");
break;
case CALL_STATE_NO_DIALTONE:
Ql_Debug_Trace("<-- No Dial tone -->\r\n");
break;
default:
break;
}
break;
case URC_NEW_SMS_IND:
Ql_Debug_Trace("<-- New SMS Arrives: index=%d\r\n", msg.param2);
break;
case URC_MODULE_VOLTAGE_IND:
Ql_Debug_Trace("<-- VBatt Voltage Ind: type=%d\r\n", msg.param2);
break;
default:
Ql_Debug_Trace("<-- Other URC: type=%d\r\n", msg.param1);
break;
}
break;
}
//
//Case other user message ID...
l
//
default:
e
break;
t
}
c l
}
a
}
u e t i
The proc_main_task function is the entrance of Embedded Application, just like the main() in C
n
application.
Q ide
Ql_OS_GetMessage is an important system function that the Embedded Application receives messages
from message queue of the task.
f
MSG_ID_RIL_READY is a system message that RIL module sends to main task.
MSG_ID_URC_INDICATION is a system message that indicates a new URC coming.
2.4.5.3. Makefile
o n
C
In OpenCPU, compiler compiles program according to the definitions in makefile. The profile of makefile
has been pre-designed and is ready for use. However, developer needs to change some settings before
compiling program according to native conditions, such as compiler environment path.
Suppose that the new file is in custom directory, the newly added .c files will be compiled automatically.
If developer needs to add new directory in custom, please follow the steps below.
First, add the new directory name in variable SRC_DIRS in \SDK\make\gcc\gcc _makefile\gcc_makefile .
l
And define the source code files to compile.
c t e l
u e t ia
Q ide n
Secondly, define the source code files to compile in the new directory.
n f
Co
l
In OpenCPU, the base data types are defined in the ql_type.h header file.
c t e l
u e
Table 2: Base Data Type
t ia
Q ide n
Type Description
Boolean variable (should be TRUE or FALSE).
bool This variable is declared as follows:
f
typedef unsigned char bool;
8-bit signed integer.
n
s8 This variable is declared as follows:
typedef signed char s8;
o
8-bit unsigned integer.
u8 This variable is declared as follows:
C
typedef unsigned char u8;
16-bit signed integer.
s16 This variable is declared as follows:
typedef signed short s16;
16-bit unsigned integer.
u16 This variable is declared as follows:
typedef unsigned short u16;
32-bit signed integer.
s32 This variable is declared as follows:
typedef int s32;
32-bit unsigned integer.
u32 This variable is declared as follows:
typedef unsigned int u32;
t el
e c ia l
u n t
Q ide
n f
Co
4 System Configuration
In the \SDK\custom\config directory, developer can reconfigure the application according to requirements,
such as heap memory size, add tasks and stack size of tasks, GPIO initial status. All configuration files for
developer are named with prerfix custom_.
l
Table 3: System Config File List
t e
Config File Description
c l
OpenCPU features enable. Now only include RIL. Developers generally
a
custom_feature_def.h
e i
dont need to change this file.
u t
custom_gpio_cfg.h Configurations for GPIO initial status.
n
custom_heap_cfg.h Definition of heap size
Q ide
custom_task_cfg.h Multitask config
Other system config, include power key, emerg_off, specify GPIO pin for
custom_sys_cfg.c
f
external watchdog, and set working mode of debug port.
o n
4.1. Configuration for Tasks
C
OpenCPU supports multitask processing. Developers only need to simply follow suit to add a record in
custom_task_cfg.h file to define a new task. OpenCPU supports one main task, and maximum TEN
subtasks.
If there exists file operations in task, the stack size must be set to at least 5KB.
In OpenCPU, therere two ways to initialize GPIOs. One is to configure initial GPIO list in
custom_gpio_cfg.h; the other way is to call GPIO related API (please see [5.7.2]) to initialize after App
starts. But the previous is earlier than the latter on time sequence. The following figure shows the time
sequence relationship.
l
On t
t e
App starts.
Initialize GPIOs according
c l
to the configurations in Initialize GPIOs by calling
a
custom_gpio_cfg.h GPIO related APIs.
u e n t i
Figure 2: Time Sequence for GPIO Initialization
Q ide
4.3. Configuration for Customizations
f
All customization items are configured in TLV (Type-Length-Value) in custom_sys_cfg.c. Developer may
n
change Apps features by changing the value.
o
const ST_SystemConfig SystemCfg[] = {
{SYS_CONFIG_APP_ENABLE_ID, SYS_CONFIG_APPENABLE_DATA_SIZE,
C
(void*)&appEnableCfg},
{SYS_CONFIG_PWRKEY_DATA_ID, SYS_CONFIG_PWRKEY_DATA_SIZE,
(void*)&pwrkeyCfg },
{SYS_CONFIG_WATCHDOG_DATA_ID, SYS_CONFIG_WATCHDOG_DATA_SIZE,
(void*)&wtdCfg },
{SYS_CONFIG_DEBUG_MODE_ID, SYS_CONFIG_DEBUGMODE_DATA_SIZE,
(void*)&debugPortCfg},
{SYS_CONFIG_END, 0,
NULL }
};
Default
Item Type(T) Length(L) Possible Value Description
Value
App SYS_CONFIG_APP_EN APP_EN APP_ENABLE App enable
4
Enable ABLE_ID ABLE APP_DISABLE config
PWRKEY Power on/off
SYS_CONFIG_PWRKEY TRUE
Pin 2 TRUE/FALSE working mode,
_DATA_ID TRUE
Config see 4.4.1
GPIO for PINNAM GPIO for
SYS_CONFIG_WATCHD One value of
WTD 8 E_GPIO feeding WTD,
OG_DATA_ID Enum_PinName
l
Config 0 see 4.4.3
Working
e
Application
Mode SYS_CONFIG_DEBUG_ BASIC_ BASIC_MODE
t
4 mode or debug
for Debug MODE_ID MODE ADVANCE_MODE
l
mode
c
Port
e t ia
4.3.1. Power Key Config
u n
static const ST_PowerKeyCfg pwrkeyCfg =
Q ide
{
TRUE, //Working mode for power-on on PWRKEY pin
/*
Module automatically powers on when feeding a low level to POWER_KEY pin.
n f
When set to FALSE, the callback that Ql_PwrKey_Register registers will be trigged. Application
must call Ql_LockPower () to lock power supply, or module will lose power when the level of
o
PWRKEY pin goes high.
*/
C
TRUE, //Working mode for power-off on PWRKEY pin
/*
Module automatically powers off when feeding a low level to POWER_KEY pin.
When set to FALSE, the callback that Ql_PwrKey_Register registers will be trigged.
Application may do post processing before switches off the module.
*/
};
When switching on/off the module by feeding a low level to POWER_KEY, the callback in application will
be triggered. The example codes are shown below.
//Register a callback function for pressing POWER KEY.
Ql_PwrKey_Register((Callback_PowerKey_Ind)callback_pwrKey_ind);
//Callback definition
l
void Callback_PowerKey_Hdlr(s32 param1, s32 param2)
{
e
Ql_Debug_Trace("<-- Power Key: %s, %s -->\r\n",
t
param1==POWER_OFF ? "Power Off":"Power On",
c l
param2==KEY_DOWN ? "Key Down":"Key Up"
a
);
e i
if (POWER_ON==param1)
t
{
u
Ql_Debug_Trace("<-- App Lock Power Key! -->\r\n");
n
Ql_LockPower();
Q ide
}
else if (POWER_OFF==param1)
{
f
//Post processing before power down
//...
n
//Power down
Ql_PowerDown();
o
}
}
C
4.3.2. GPIO for External Watchdog
When an external watchdog is adopt to monitoring the application, the module has to feed the watchdog
in whole period that module is in power up, including the boot course, App active course, and App
upgrade course.
So, developer just needs to specify which GPIO is designed to feed the external watchdog.
el
4.3.3. Debug Port Working Mode Config
t l
The serial debug port (UART2) may work as a common serial port (BASIC_MODE), as well as work as a
c
special debug port (ADVANCE_MODE) that can debug some issues underlay application.
e ia
Usually developer doesnt need to use ADVANCE_MODE without the requirements from support engineer.
u t
If needed, please refer to the document "Catcher_Operation_UGD" for the usage of the special debug
n
mode.
Q ide
static const ST_DebugPortCfg debugPortCfg = {
BASIC_MODE // Set the serial debug port (UART2) to a common serial port
//ADVANCE_MODE // Set the serial debug port (UART2) to a special debug port
f
};
o n
C
M66-OpenCPU_User_Guide Confidential / Released 30 / 167
GSM/GPRS Module Series
M66-OpenCPU User Guide
5 API Functions
l
The ql_system.h file declares system-related APIs. These functions are essential to any customers
e
applications. Make sure to include the header file.
t l
OpenCPU supports multitasking, message, mutex, semaphore and event mechanism. These interfaces
c
are used for multitask programming. The example example_multitask.c in OpenCPU SDK shows the
e a
proper usages of these API functions.
5.1.1. Usage
u n t i
Q ide
This section introduces some important operations and the API function in system-level programming.
f
5.1.1.1. Receive Message
n
Developers can call Ql_OS_GetMessage to retrieve a message from the current task's message queue.
o
The message can be a system message, and also can be a customized message.
C
5.1.1.2. Send Message.
Developers can call Ql_OS_SendMessage to send messages to other tasks. To send message,
developers have to define a message id. In OpenCPU, user message id must bigger than 0x1000.
5.1.1.3. Mutex
A mutex object is a synchronization object whose state is set to signaled when it is not owned by any task,
and non-signaled when it is owned. Only one task at a time can own a mutex object. For example, to
prevent two tasks from writing to shared memory at the same time, each task waits for ownership of a
mutex object before executing the code that accesses the memory. After writing to the shared memory,
the task releases the mutex object.
l
Step 3: Give Mutex. Developers can call Ql_OS_GiveMutex to release the specified mutex.
c t e l
5.1.1.4. Semaphore
e ia
A semaphore object is a synchronization object that maintains a count between zero and a specified
t
maximum value. The count is decremented each time a task completes a wait for the semaphore object
u
and incremented each time a task releases the semaphore. When the count reaches zero, no more tasks
n
can successfully wait for the semaphore object state to become signaled. The state of a semaphore is set
Q ide
to signaled when its count is greater than zero and non-signaled when its count is zero.
f
Step 2: Get Semaphore. If developers want to use semaphore mechanism for programming, they can
call Ql_OSTakeSemaphore to get the specified semaphore ID.
n
Step 3: Give Semaphore. Developers can call Ql_OS_GiveSemaphore to release the specified
semaphore.
5.1.1.5. Event
Co
An event object is a synchronization object, which is useful in sending a signal to a thread indicating that a
particular event has occurred. A task uses Ql_OS_CreateEvent function to create an event object, whose
state can be explicitly set to signaled by use of the Ql_OS_SetEvent function.
OpenCPU has designed 13 blocks of system storage space to backup critical user data. Among the
storage blocks, 1~8 blocks can store 50 bytes for each block, 9~12 blocks can store 100 bytes for each
block, and the 13th block can store 500 bytes.
Developer may call Ql_Userdata_Backup() to backup data, and call Ql_Userdata_Read() to read back
data from backup space.
5.1.2.1. Ql_Reset
Prototype
l
void Ql_Reset(s32 resetType)
t e l
Parameters
c a
resetType:
e i
[in] Must be 0.
u t
Return Value
Q ide n
None.
5.1.2.2. Ql_Sleep
n f
This function suspends the execution of the current task until the time-out interval elapses. The sleep time
should not exceed 500 ms, because if the task is suspended too long, and it may receive too many
o
messages to be crushed.
C
Prototype
Parameters
msec:
[in] The time interval for which execution is to be suspended is in milliseconds.
Return Value
None.
5.1.2.3. Ql_GetUID
This function gets the module UID. UID is a 20-bytes serial number identification. The probability that
different module has same UID is 1ppm (1/10000000).
Prototype
Parameters
l
ptrUID:
e
[in] Point to the buffer which is used to store the UID. Need at least 20 bytes length of buffer.
t l
len:
c
[in] The ptrUID buffer length. The value must less than or equal the buffer size that ptrVer point.
e t ia
Return Value
u n
If the ptrUID is null, this function will return QL_RET_ERR_INVALID_PARAMETER. If this function read
the UID successfully, the length of UID will be returned.
Q ide
5.1.2.4. Ql_GetCoreVer
n f
This function gets the version ID of the core. The core version ID is a no more than 35 characters string,
and it is end with \0.
o
Prototype
C
s32 Ql_GetCoreVer(u8* ptrVer, u32 len)
Parameters
ptrVer:
[in] Point to the buffer which is used to store the version ID of the core. Need at least 35 bytes of the
buffer.
len:
[in] The ptrVer buffer length. The value must less than or equal the buffer size that ptrVer point.
Return Value
The return value is the length of version ID of the core if this function succeeds. Otherwise, the return
value is an error code. To get extended error information, please see ERROR CODES.
5.1.2.5. Ql_GetSDKVer
This function gets the version ID of the SDK. The SDK version ID is no more than 20 characters string,
and it is end with \0.
Prototype
Parameters
l
ptrVer:
e
[in] Point to the buffer which is used to store the version ID of the SDK. Need at least 20 bytes of the
t
buffer.
c l
len:
e a
[in] The ptrVer buffer length. The value must less than or equal the buffer size that ptrVer point.
u t i
Return Value
n
The return value is the length of version ID if this function succeeds. Otherwise, the return value is an
Q ide
error code. To get extended error information, please see ERROR CODES.
f
5.1.2.6. Ql_GetMsSincePwrOn
n
This function returns the number of milliseconds since the device booted.
o
Prototype
C
u64 Ql_GetMsSincePwrOn (void)
Parameters
None.
Return Value
Number of milliseconds.
5.1.2.7. Ql_OS_GetMessage
This function retrieves a message from the current task's message queue. When there is no message in
the tasks message queue, the task is in the waiting state.
Prototype
typedef struct {
u32 message;
u32 param1;
u32 param2;
u32 srcTaskId;
} ST_MSG;
l
Parameters
e
msg:
t
[in] Point to a ST_MSG object.
c l
Return Value
e ia
QL_RET_OK.
u n t
Q ide
5.1.2.8. Ql_OS_SendMessage
This function sends messages between tasks. The destination task receives messages with
Ql_OS_GetMessage.
n
Prototype
o
s32 Ql_OS_SendMessage (s32 destTaskId, u32 msgId, u32 param1, u32 param2)
C
Parameters
desttaskid:
[in] The maximum value is 10. The destination task is main task if the value is 0. The destination task is
subtask if the value is between 1 and 10.
param1:
[in] User data.
param2:
[in] User data.
Return Value
5.1.2.9. Ql_OS_CreateMutex
This function creates a mutex. A handle of be created mutex will be returned if create success.0 indicates
failure. If the same mutex is already created, this function may return a valid handle also. But the
Ql_GetLastError function returns ERROR_ALREADY_EXISTS.
Prototype
l
Parameters
e
mutexName:
t
[in] Name of the mutex to be created.
c l
Return Value
e ia
A handle of be created mutex, 0 indicates failure.
u
5.1.2.10. Ql_OS_TakeMutex
n t
Q ide
This function obtains an instance of the specified mutex. If the mutex id is invalid, the system may be
crush.
n
Prototype
o
void Ql_OS_TakeMutex(u32 mutexId)
C
Parameters
mutexid:
[in] Destination mutex to be taken.
Return Value
None.
5.1.2.11. Ql_OS_GiveMutex
Prototype
Parameters
mutexid:
[in] Destination mutex to be given.
Return Value
None.
t el
5.1.2.12. Ql_OS_CreateSemaphore
c a l
This function creates a counting semaphore. A handle of be created semaphore will be returned, if create
e i
success. 0 indicates failure. If the same semaphore is already created, this function may return a valid
t
handle also. But the Ql_GetLastError function returns ERROR_ALREADY_EXISTS.
u n
Prototype
Q ide
u32 Ql_OS_CreateSemaphore(char *semName, u32 maxCount)
f
Parameters
n
semname:
[in] Name of the semaphore to be created.
o
maxCount:
C
[in] The max count of semaphore.
Return Value
5.1.2.13. Ql_OS_TakeSemaphore
This function obtains an instance of the specified semaphore. If the mutexid is invalid, the system may be
crush.
Prototype
Parameters
semId:
[in] The destination semaphore to be taken.
wait:
[in] The waiting style determines if a task waits infinitely (TRUE) or returns immediately (FALSE).
l
Return Value
t e
OS_SUCCESS: the operation is done successfully.
l
OS_SEM_NOT_AVAILABLE: the semaphore is unavailable immediately.
e c
5.1.2.14. Ql_OS_CreateEvent
t ia
u n
This function waits until the specified type of event is in the signaled state. Developers can specify
Q ide
different types of events for purposes. The event flags are defined in Enum_EventFlag.
Prototype
f
u32 Ql_OS_CreateEvent(char* evtName);
o n
Parameters
evtName:
C
[in] Event name.
Return Value
5.1.2.15. Ql_OS_WaitEvent
This function waits until the specified type of event is in the signaled state. Developers can specify
different types of events for purposes. The event flags are defined in Enum_EventFlag.
Prototype
Parameters
evtId:
Event ID that is returned by calling Ql_OS_CreateEvent().
evtFlag:
Event flag type. Please refer to Enum_EventFlag.
el
Return Value
t
Zero indicates success, nonzero means failure.
e c
5.1.2.16. Ql_OS_SetEvent
ia l
u n t
This function sets the specified event flag. Any task waiting on the event, whose event flag request is
Q ide
satisfied, is resumed.
Prototype
f
s32 Ql_OS_SetEvent(u32 evtId, u32 evtFlag);
n
Parameters
o
evtId:
C
Event ID that is returned by calling Ql_OS_CreateEvent().
evtFlag:
Event flag type. Please refer to Enum_EventFlag.
Return Value
5.1.2.17. Ql_OS_GiveSemaphore
Parameters
semid:
[in] The destination semaphore to be given.
Return Value
None.
l
5.1.2.18. Ql_SetLastErrorCode
t e l
This function sets error code.
c a
e
Prototype
u t i
s32 Ql_SetLastErrorCode(s32 errCode)
Q ide n
Parameters
errCode:
[in] Error code.
n
Return Value
o
QL_RET_ERR_FATAL: fail to set error code.
C
5.1.2.19. Ql_GetLastErrorCode
Prototype
s32 Ql_GetLastErrorCode(void)
Parameters
None.
Return Value
5.1.2.20. Ql_OS_GetCurrenTaskLeftStackSize
This function gets the left number of bytes in the current task stack.
Prototype
l
u32 Ql_OS_GetCurrenTaskLeftStackSize(void)
t e
Parameters
c l
None.
e ia
Return Value
u t
The return value is number of bytes if this function succeeds. Otherwise an error code is returned.
Q ide
5.1.2.21. Ql_Userdata_Backup
n
This function can be used to backup some critical user data to prevent them from losing. OpenCPU has
f
designed 13 blocks of system storage space to backup critical user data. Developer may specify the first
n
parameter index [1-13] to specify different storage block. Among the storage blocks, 1~8 blocks can store
50 bytes for each block, 9~12 blocks can store 100 bytes for each block, and the 13th block can store 500
o
bytes.
C
Prototype
Parameters
index:
[in] The index of the user data. The range is: 1~13.
user_data:
[in] The data to be backed up. In 1~8 groups, every group can save 50 bytes at most. In 9~12 groups,
every group can save 100 bytes at most. If index is 13, the user data can save 500 bytes at most.
len
[in] The length of the user data. When the index is (1~8), then len<=50. When the index is (9~12), then
len<=100. When the index is 13, then len<=500.
OCPU_UserData_CB:
[callback function] Whether the user data backup success
Return Value
QL_RET_OK: succeeds.
QL_RET_ERR_PARAM: invalid parameter.
el
5.1.2.22. Ql_Userdata_Read
c t l
This functin read user data which is backed up by Ql_Userdata_Backup API.
e ia
Prototype
u t
s32 Ql_Userdata_Read(u8 index, s32 len, OCPU_UserData_CB UserData_Read_CB);
Q ide n
Parameters
index:
f
[in] The index of the user data. The range is: 1~13.
n
len:
[in] The length of the user data. When the index is (1~8), then len<=50. Whne the index is (9~12), then
o
len<=100. When index is 13, then len<=500.
C
OCPU_UserData_CB:
[callback function] Whether the user data read success, and return the user data.
Return Value
QL_RET_OK: succeeds.
QL_RET_ERR_PARAM: invalid parameter.
The frequent error-codes, which APIs in multitask programming could return, are enumerated in the
Enum_OS_ErrCode.
/**************************************************************
* Error Code Definition
**************************************************************/
typedef enum {
OS_SUCCESS,
OS_ERROR,
OS_Q_FULL,
OS_Q_EMPTY,
OS_SEM_NOT_AVAILABLE,
OS_WOULD_BLOCK,
OS_MESSAGE_TOO_BIG,
OS_INVALID_ID,
OS_NOT_INITIALIZED,
l
OS_INVALID_LENGHT,
OS_NULL_ADDRESS,
e
OS_NOT_RECEIVE,
t
OS_NOT_SEND,
c l
OS_MEMORY_NOT_VALID,
a
OS_NOT_PRESENT,
e i
OS_MEMORY_NOT_RELEASE
u t
} Enum_OS_ErrCode;
Q ide n
5.1.4. Example
1. Mutex example:
f
static int s_iMutexId = 0;
n
//Create the mutex first
o
s_iMutexId = Ql_OS_CreateMutex("MyMutex");
void MutextTest(int iTaskId) //Two task Run this function at the same time
C
{
2. Semaphore example:
l
iRet = Ql_OS_TakeSemaphore(s_iSemaphoreId, TRUE);//TRUE or FLASE indicate the task should
e
wait infinitely or return immediately.
t
Ql_OS_TakeMutex(s_iSemMutex);
l
s_iTestSemNum--; //One semaphore is be used
c
Ql_OS_GiveMutex(s_iSemMutex);
e t ia
Ql_Sleep(3000);
u n
//3 seconds later release the semaphore.
Q ide
Ql_OS_GiveSemaphore(s_iSemaphoreId);
s_iTestSemNum++;// one semaphore is released.
Ql_Debug_Trace("\r\n<--=========Task[%d]: s_iTestSemNum=%d-->", iTaskId, s_iTestSemNum);
}
n f
o
5.2. Time API
C
OpenCPU module provides time-related APIs including setting local time, getting local time, converting
the calendar time into seconds or converting seconds into the calendar time, etc.
5.2.1. Usage
Calendar time is measured from a standard point in time to the current time elapsed seconds, generally
use at 00:00:00 on January 1, 1970 as a standard point in time.
typedef struct {
s32 year; //Range:2000~2127
s32 month;
s32 day;
s32 hour; //In 24-hour time system
s32 minute;
s32 second;
s32 timezone; //Range: -12~12
}ST_Time;
The field timezone defines the time zone. A negative number indicates the western time zone, and a
positive number indicates the Eastern Time zone. For example: the time zone of Beijing is East Area 8,
timezone=8; the time zone of Washington is West Zone 5, timezone=-5.
t el
5.2.2.1. Ql_SetLocalTime
c l
Set the current local date and time.
e ia
t
Prototype
u n
s32 Ql_SetLocalTime(ST_Time *datetime)
Q ide
Parameter
datetime:
f
[in] Point to the ST_Time object.
n
Return Value
o
QL_RET_OK: indicates this function is executed successfully.
C
QL_RET_ERR_PARAM: indicates the parameter is error.
5.2.2.2. Ql_GetLocalTime
Prototype
Parameter
dateTime:
[Out] Point to the ST_Time object.
Return Value
If succeed, return the current local date and time. NULL means failure.
5.2.2.3. Ql_Mktime
This function gets the total seconds elapsed since 1970.01.01 00:00:00.
Prototype
l
u64 Ql_Mktime(ST_Time *dateTime)
t e
Parameter
c l
dateTime:
a
[in] Point to the ST_Time object.
e t i
Return Value
u n
Return the total seconds.
Q ide
5.2.2.4. Ql_MKTime2CalendarTime
f
This function converts the seconds elapsed since 1970.01.01 00:00:00 to the local date and time.
n
Prototype
o
ST_Time *Ql_MKTime2CalendarTime(u64 seconds, ST_Time *pOutDateTime)
C
Parameter
seconds:
[in] The seconds elapsed since 1970.01.01 00:00:00.
pOutDateTime:
[Out] Point to the ST_Time object.
Return Value
If succeed, return the current local date and time, NULL means operation failure.
5.2.3. Example
s32 ret;
u64 sec;
ST_Time datetime, *tm;
datetime.year=2013;
datetime.month=6;
datetime.day=12;
datetime.hour=18;
datetime.minute=12;
l
datetime.second=13;
e
datetime.timezone=-8;
c t l
//Set local time
ret=Ql_SetLocalTime(&datetime);
e ia
Ql_Debug_Trace("\r\n<--Ql_SetLocalTime,ret=%d -->\r\n",ret);
t
Ql_Sleep(5000);
u n
//Get local time
Q ide
tm=Ql_GetLocalTime(&datetime);
Ql_Debug_Trace("<--%d/%d/%d %d:%d:%d %d -->\r\n",tm->year, tm->month, tm->day, tm->hour, tm
->minute, tm->second, tm->timezone);
f
//Get total seconds elapsed since 1970.01.01 00:00:00
n
sec=Ql_Mktime(tm);
Ql_Debug_Trace("\r\n<--Ql_Mktime,sec=%lld -->\r\n",sec);
o
//Convert the seconds elapsed since 1970.01.01 00:00:00 to local date and time
C
tm=Ql_MKTime2CalendarTime(sec, & datetime);
Ql_Debug_Trace("<--%d/%d/%d %d:%d:%d %d -->\r\n",tm->year, tm->month, tm->day, tm->hour, tm
->minute, tm->second, tm->timezone);
OpenCPU provides two kinds of timers. One is Common Timer; the other is Fast Timer. OpenCPU
system allows max 10 Common Timers running at the same time in a task. The system provides only one
Fast Timer for application. The accuracy of the Fast Timer is relatively higher than a common timer.
5.3.1. Usage
Developer uses Ql_Timer_Register() to create a common timer, and register the interrupt handler. And a
timer id, which is an unsigned integer, must be specified. Ql_Timer_Start() can start the created timer, and
Ql_Timer_Stop() can stop the running timer.
Developer may call Ql_Timer_RegisterFast() to create the Fast Timer, and register the interrupt handler.
Ql_Timer_Start() can start the created timer, and Ql_Timer_Stop() can stop the running timer. The
minimum interval for Fast Timer should be integral multiple of 10ms.
l
5.3.2. API Functions
t e
5.3.2.1. Ql_Timer_Register
c l
Register a Common Timer, each task supports 10 timers running at the same time. Only the task which
e ia
registers the timer can start and stop the timer.
u t
Prototype
n
s32 Ql_Timer_Register(u32 timerId, Callback_Timer_OnTimer callback_onTimer, void* param)
Q ide
typedef void(*Callback_Timer_OnTimer)(u32 timerId, void* param)
Parameter
f
timerId:
n
[in] Timer ID. Must ensure that the ID is the only one under openCPU task.Of course, the ID that
registered by Ql_Timer_RegisterFast also cannot be the same with it.
o
callback_onTimer:
C
[Out] Notify the customer when the timer arrives.
param:
[in] One customized parameter that can be passed into the callback functions.
Return Value
5.3.2.2. Ql_Timer_RegisterFast
Register a Fast Timer, only support one timer for App.Please do not add any task schedule in the interrupt
handler of the Fast Timer.
Prototype
Parameter
l
timerId:
e
[in] Timer ID. Must ensure that the ID is not the same with the ID that registered by Ql_Timer_Register.
c t l
callback_onTimer:
[Out] Notify the customer when the timer arrives.
e t ia
param:
u
[in] One customized parameter that can be passed into the callback functions.
Q ide n
Return Value
f
QL_RET_ERR_INVALID_TIMER: indicates the timer invalid.
QL_RET_ERR_TIMER_FULL: indicates all timers are used up.
o n
5.3.2.3. Ql_Timer_Start
C
Start up the specified timer. When start or stop a specified timer in a task, the task must be the same as
registers the timer.
Prototype
Parameter
timerId:
[in] Timer ID. The timer ID must be registed.
interval:
[in] Set the interval of the timer, unit: ms.
If you start a Common Timer, the interval must be greater than or equal to 1ms. If you start a Fast Timer,
the interval must be an integer multiple of 10ms.
autoRepeat:
[in] TRUE or FALSE, indicates that the timer is executed once or repeatedly.
Return Value
5.3.2.4. Ql_Timer_Stop
t el
c a l
Stop the specified timer. When start or stop a specified timer in a task, the task must be the same as
e i
registers the timer.
u t
Prototype
Q ide n
s32 Ql_Timer_Stop(u32 timerId)
Parameter
f
timerId:
n
[in] The timer ID. The timer has been started by calling Ql_Timer_Start previously.
o
Return Value
C
QL_RET_OK: indicates stop ok;
QL_RET_ERR_PARAM: indicates the param error.
QL_RET_ERR_INVALID_TIMER: indicates the timer invalid.
QL_RET_ERR_INVALID_TASK_ID: indicates the current task is not the timer registered task.
5.3.3. Example
The following code shows how to register a Common Timer and how to start a Common Timer.
s32 ret;
u32 timerId=999; //Timer ID is 999
u32 interval=2 * 1000; //2 seconds
bool autoRepeat=TRUE;
u32 param=555;
//Callback function
void Callback_Timer(u32 timerId, void* param)
{
ret=Ql_Timer_Stop(timerId);
Ql_Debug_Trace("\r\n<--Stop: timerId=%d,ret = %d -->\r\n", timerId ,ret);
}
//Register timer
ret=Ql_Timer_Register(timerId, Callback_Timer, ¶m);
Ql_Debug_Trace("\r\n<--Register: timerId=%d, param=%d,ret=%d -->\r\n", timerId ,param,ret);
l
//Start timer
ret=Ql_Timer_Start(timerId, interval, autoRepeat);
e
Ql_Debug_Trace("\r\n<--Start: timerId=%d,repeat=%d,ret=%d -->\r\n", timerId , autoRepeat,ret);
c t a l
e i
5.4. Power Management API
u n t
Power management contains the power-related operations, such power down, power key control and low
Q ide
power consumption enable/disable.
5.4.1. Usage
n f
5.4.1.1. Power on/off
o
Developer may call Ql_PowerDown function to power off the module when PWRKEY pin has not been
shortcut to ground. And this action will become reset the module when PWRKEY pin has been shortcut to
C
ground.
The Ql_ SleepEnable function can enable the sleep mode of module. And the module enters into sleep
mode when it is idle.
The timeout of timer, coming call, coming SMS, GPRS data and an interrupt event can wake up the
module from sleep mode. The Ql_SleepDisable function can disable the sleep mode when module is
woken up.
5.4.2.1. Ql_PowerDown
This function powers off the module. When call this API to power down the module, the module will
complete the network anti-registration first. So power off the module will need more time.
Prototype
el
Parameters
t
pwrDwnType:
c l
[in] Action types of this function.
a
1=Normal power off
e t i
u
Return Value
n
None.
Q ide
5.4.2.2. Ql_LockPower
f
When getting the control right of power key, Application must call Ql_LockPower to lock power supply, or
n
module will lose power when the level of PWRKEY pin goes high. Please also see [4.4.1].
o
Prototype
C
void Ql_LockPower(void);
Parameters
None.
Return Value
None.
5.4.2.3. Ql_PwrKey_Register
This function registers the callback for PWRKEY indication. The callback function will be triggered when
the power KEY pressed down or released (including power on and power off). The configuration for power
key in sys_config.c should be set to FALSE. Or, the callback will not be triggered. Please see [4.4.1].
Prototype
Parameters
Callback_pwrKey:
[in] Callback function for PWRKEY indication.
l
param1:
e
[Out] One value of Enum_PowerKeyOpType.
c t l
param2:
[Out] One value of Enum_KeyState.
e t ia
Return Value
u n
The return value is QL_RET_OK if this function succeeds. Otherwise, the return value is an error code. To
Q ide
get extended error information, please see ERROR CODES.
5.4.2.4. Ql_SleepEnable
n f
This function enables the sleep mode of module. The module will enter sleep mode when its under idle
state.
o
Prototype
C
s32 Ql_ SleepEnable()
Parameters
None.
Return Value
5.4.2.5. Ql_SleepDisable
Prototype
s32 Ql_SleepDisable()
Parameters
None.
el
Return Value
t
QL_RET_OK: indicates this function success.
c l
Ql_RET_NOT_SUPPORT: this function is not supported.
e t ia
5.4.3. Example
u n
The following sample codes show how to enter and quit sleep module in the interrupt handler.
Q ide
void Eint_CallBack _Hdlr (Enum_PinName eintPinName, Enum_PinLevel pinLevel, void* customParam)
{
If (0==pinLevel)
f
{
SYS_DEBUG( DBG_Buffer,"DTR set to low=%d wake !!\r\n", level);
n
Ql_SleepDisable(); //Enter sleep
o
}else{
SYS_DEBUG( DBG_Buffer,"DTR set to high=%d Sleep \r\n", level);
Ql_SleepEnable(); //Quit sleep
C
}
}
OpenCPU O.S supports dynamic memory management. Ql_MEM_Alloc and QL_MEM_Free functions
are used to allocate and release the dynamic memory.
The dynamic memory is system heap space. And the maximum available system heap of application is
500KB.
5.5.1. Usage
Step 1: Call Ql_MEM_Alloc() to apply for a block of memory with the specified size. The memory allocate
by Ql_MEM_Alloc() is from system heap.
Step 2: If the memory block is not needed any more, please call Ql_MEM_Free() to free the memoryblock
that is previously allocated by calling Ql_MEM_Alloc().
l
5.5.2.1. Ql_MEM_Alloc
t e
This function allocates memory with the specified size in the memory heap.
c l
Prototype
e t ia
void *Ql_MEM_Alloc (u32 size)
u n
Parameter
Q ide
Size:
[in] Number of bytes of memory to be allocated.
f
Return Value
n
A pointer of void type to the the address of allocated memory. NULL will be returned if the allocation fails.
Co
5.5.2.2. Ql_MEM_Free
Prototype
Parameters
Ptr:
[in] Previously allocated memory block to be free.
Return Value
None.
5.5.3. Example
The following codes show how to allocate and free a specified size memory.
char *pch=NULL;
//Allocate memory
pch=(char*)Ql_MEM_Alloc(1024);
l
if (pch !=NULL)
e
{
t
Ql_Debug_Trace("Successfully apply for memory, pch=0x%x\r\n", pch);
l
}else{
c
Ql_Debug_Trace("Fail to apply for memory, size=%d\r\n", 1024);
e ia
}
t
//Free memory
u
Ql_MEM_Free(pch);
n
pch=NULL;
Q ide
5.6. File System API
n f
OpenCPU supports user file system, and provides a set of complete API functions to create, access and
delete files and directories. This section describes these APIs and the usage.
o
The storage can be flash (UFS) and RAM (RAM file). The RAM file dont support directory.
C
5.6.1. Usage
The type of storage is divided into two kinds, one is the UFS in the flash, the other is RAM file system. The
RAM file dont support directory. The customers can select the storage location according to their own
needs. When you want to create/open a file or directory, you must use a relative path. For example, if you
want to create a file in the root of the UFS, you can set as this, such as filename.ext.
The Ql_FS_GetTotalSpace function is used to obtain the amount of total space on Flash.
The Ql_FS_GetFreeSpace function is used to obtain the amount of free space on Flash.
The Ql_FS_GetSize function is used to get the size, in bytes, of the specified file.
The Ql_FS_Open function is used to create or open a file, you must define the file's opening and
access mode. If you want to know its usage, please see the detailed descriptions of this function.
The Ql_FS_Read and Ql_FS_Write functions are used to read or write a file, you must ensure that
l
The Ql_FS_XMove function is used to move or copy a file or folder.
The Ql_FS_Format function is used to format the UFS.
NOTES
c t e l
e a
1. The RAM file does not support directory.
t i
2. This stack size of the task, in which file operations will be executed, cannot be less than 5KB.
u
Q ide n
5.6.2. API Functions
5.6.2.1. Ql_FS_Open
f
This function opens or creates a file with a specified name.
o
Prototype
Parameters
lpFileName:
C
[in] The name of the file. The name is limited to 252 characters. You must use a relative path, such as
filename.ext or dirname\filename.ext.
flag:
[in] A u32 that defines the file's opening and access mode. The possible values are shown as follow:
Return Value
If the function succeeds, the return value specifies a file handle. If the function fails, the return value is an
error codes.
l
5.6.2.2. Ql_FS_OpenRAMFile
t e
This function opens or creates a file with a specified name in the RAM, you need to add prefix RAM: in
c l
the front of the file. You can create 15 files at most.
e ia
Prototype
u t
s32 Ql_FS_OpenRAMFile(char *lpFileName, u32 flag, u32 ramFileSize)
Q ide n
Parameters
lpFileName:
f
[in] The file name. The name is limited to 252 characters.You must use a relative path, such as RAM:
filename.ext.
n
flag:
o
[in] A u32 that defines the files opening and access mode. The possible values are shown as follow:
C
QL_FS_READ_WRITE: can read and write.
QL_FS_READ_ONLY: can only read.
QL_FS_CREATE: opens the file, if it exists. If the file does not exist, the function creates the file.
QL_FS_CREATE_ALWAYS: creates a new file. If the file exists, the function overwrites the file and
clears the existing attributes.
ramFileSize:
[in] The size of the specified file which you want to create.
Return Value
If the function succeeds, the return value specifies a file handle. If the function fails, the return value is an
error codes.
5.6.2.3. Ql_FS_Read
Read data from the specified file, starting at the position indicated by the file pointer. After the read
operation has been completed, the file pointer is adjusted by the number of bytes actually read.
Prototype
l
s32 Ql_FS_Read(s32 fileHandle, u8 *readBuffer, u32 numberOfBytesToRead, u32
e
*numberOfBytesRead)
c t l
Parameters
e ia
fileHandle:
t
[in] A handle to the file to be read, which is the return value of the function Ql_FS_Open.
u n
readBuffer:
Q ide
[Out] Point to the buffer that receives the data read from the file.
numberOfBytesToRead:
[in] Number of bytes to be read.
n f
numberOfBytesRead:
[Out] The number of bytes has been read. Sets this value to zero before doing taking action or checking
o
errors
C
Return Value
QL_RET_OK: success.
QL_RET_ERR_FILEREADFAILED: read file failed.
5.6.2.4. Ql_FS_Write
This function writes data from a buffer to the specifed file, and returns the real written number of bytes.
Prototype
Parameters
fileHandle:
[in] A handle to the file to be written, which is the return value of the function Ql_FS_Open.
writeBuffer:
[in] Point to the buffer containing the data to be written to the file.
numberOfBytesToWrite:
[in] Number of bytes to write to the file.
numberOfBytesToWritten:
l
[Out] Point to the number of bytes written by the function call.
t e
Return Value
c l
QL_RET_OK: success.
e ia
QL_RET_ERR_FILEDISKFULL: file disk is full.
t
QL_RET_ERR_FILEWRITEFAILED: write file failed.
u
Q ide
5.6.2.5. Ql_FS_Seek
n
This function repositions the pointer in the previously open file.
f
Prototype
n
s32 Ql_FS_Seek(s32 fileHandle, s32 offset, u32 whence)
Parameters
fileHandle:
Co
[in] File handle, which is the return value of the function Ql_FS_Open.
offset:
[in] Number of bytes to move the file pointer.
whence:
[in] Pointer movement mode. Must be one of the following values.
typedef enum
{
QL_FS_FILE_BEGIN,
QL_FS_FILE_CURRENT,
QL_FS_FILE_END
} Enum_FsSeekPos;
Return Value
QL_RET_OK: success.
QL_RET_ERR_FILESEEKFAILED: file seek failed.
5.6.2.6. Ql_FS_GetFilePosition
l
This function gets the current value of the file pointer.
e
Prototype
c t l
s32 Ql_FS_GetFilePosition(s32 fileHandle)
e t ia
Parameters
u n
fileHandle:
[in] File handle, which is the return value of the function Ql_FS_Open.
Q ide
Return Value
The return value is the current offset from the beginning of the file if this function succeeds. Otherwise, the
f
return value is an error code. QL_RET_ERR_FILEFAILED, fail to operate file.
o n
5.6.2.7. Ql_FS_Truncate
C
This function truncates the specified file to zero length.
Prototype
Parameters
fileHandle:
[in] The file handle, it is the return value of the function Ql_FS_Open.
Return Value
QL_RET_OK: success.
QL_RET_ERR_FILEFAILED: fail to operate file.
5.6.2.8. Ql_FS_Flush
Force any data remaining in the file buffer to be written to the file.
Prototype
Parameters
fileHandle:
l
[in] The file handle, which is the return value of the function Ql_FS_Open.
t e
Return Value
c l
None.
u e t ia
5.6.2.9. Ql_FS_Close
Q ide n
Closes the file associated with the file handle and makes the file unavailable for reading or writing.
Prototype
f
void Ql_FS_Close(s32 fileHandle)
o n
Parameters
fileHandle:
C
[in] The file handle, which is the return value of the function Ql_FS_Open.
Return Value
None.
5.6.2.10. Ql_FS_GetSize
Prototype
Parameters
lpFileName:
[in] The name of the file. The name is limited to 252 characters. You must use a relative path, such as
filename.ext or dirname\filename.ext.
Return Value
The return value is the bytes of the file if this function succeeds. Otherwise, the return value is an error
code.
l
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
QL_RET_ERR_FILEFAILED: fail to operate file.
5.6.2.11. Ql_FS_Delete
c t e l
e t ia
This function deletes an existing file.
u n
Prototype
Q ide
s32 Ql_FS_Delete(char *lpFileName)
f
Parameters
n
lpFileName:
[in] The name of the file. The name is limited to 252 characters. You must use a relative path, such as
o
filename.ext or dirname\filename.ext.
C
Return Value
QL_RET_OK: success.
QL_RET_ERR_PARAM: parameter error.
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
QL_RET_ERR_FILEFAILED: fail to operate file.
5.6.2.12. Ql_FS_Check
Prototype
Parameters
lpFileName:
[in] The file name. The name is limited to 252 characters. You must use a relative path, such as
filename.ext or dirname\filename.ext.
Return Value
l
QL_RET_OK: success.
e
QL_RET_ERR_PARAM: parameter error.
t
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
c l
QL_RET_ERR_FILEFAILED: fail to operate file.
a
QL_RET_ERR_FILENOTFOUND: file not found.
u e
5.6.2.13. Ql_FS_Rename
n t i
Q ide
This function renames an existing file.
Prototype
n f
s32 Ql_FS_Rename(char *lpFileName, char *newLpFileName)
o
Parameters
C
lpFileName:
[in] The current name of the file. The name is limited to 252 characters. You must use a relative path, such
as filename.ext or dirname\filename.ext.
newLpFileName:
[in] The new name of the file. The new name is different from the existing names. The name is limited to
252 characters. You must use a relative path, such as filename.ext, dirname\filename.ext.
Return Value
QL_RET_OK: success.
QL_RET_ERR_PARAM: parameter error.
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
QL_RET_ERR_FILEFAILED: fail to operate file.
5.6.2.14. Ql_FS_CreateDir
Prototype
Parameters
l
lpDirName:
[in] The name of the directory. The name is limited to 252 characters. You must use a relative path, such
e
as dirname1 or dirname1\dirname2.
c t l
Return Value
e ia
QL_RET_OK: success.
t
QL_RET_ERR_PARAM: parameter error.
u
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
n
QL_RET_ERR_FILEFAILED: fail to operate file.
Q ide
5.6.2.15. Ql_FS_DeleteDir
f
This function deletes an existing directory.
n
Prototype
o
s32 Ql_FS_DeleteDir(char *lpDirName)
C
Parameters
lpDirName:
[in] The name of the directory. The name is limited to 252 characters. You must use a relative path, such
as dirname1 or dirname1\dirname2.
Return Value
QL_RET_OK: success.
QL_RET_ERR_PARAM: parameter error.
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
QL_RET_ERR_FILEFAILED: fail to operate file.
5.6.2.16. Ql_FS_CheckDir
Prototype
Parameters
lpDirName:
l
[in] The name of the directory. The name is limited to 252 characters. You must use a relative path, such
e
as dirname1 or dirname1\dirname2.
c t l
Return Value
e ia
QL_RET_OK: success.
t
QL_RET_ERR_PARAM: parameter error.
u
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
n
QL_RET_ERR_FILEFAILED: fail to operate file.
Q ide
QL_RET_ERR_FILENOTFOUND: file not found.
f
5.6.2.17. Ql_FS_FindFirst
n
Search a directory for a file or subdirectory which name matches the specified file name.
o
Prototype
C
s32 Ql_FS_FindFirst(char *lpPath, char *lpFileName, u32 fileNameLength, u32 *fileSize, bool *isDir)
Parameters
lpPath:
[in] Pointer to a null-terminated string that specifies a valid directory or path.
lpFileName:
[in] Pointer to a null-terminated string that specifies a valid file name, which can contain wildcard
characters, such as * and?.
fileNameLength:
[in] The maximum number of bytes to be received of the name.
fileSize:
[Out] A pointer to the variable which represents the size specified by the file.
isDir:
[Out] A pointer to the variable which represents the type specified by the file.
Return Value
If the function succeeds, the return value is a search handle that can be used in a subsequent call to the
Ql_FindNextFile or Ql_FindClose function.
el
QL_RET_ERR_PARAM: parameter error.
t
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
l
QL_RET_ERR_FILEFAILED: fail to operate file.
c
QL_RET_ERR_FILENOMORE: no more file.
u e
5.6.2.18. Ql_FS_FindNext
t ia
Q ide n
This function continues a file to search from a previous call to the Ql_FS_FindFirst function.
Prototype
f
s32 Ql_FS_FindNext(s32 handle, char *lpFileName, u32 fileNameLength, u32 *fileSize, bool *isDir)
o n
Parameters
handle:
C
[in] The search handle returned by a previous call to the Ql_FS_FindFirst function.
lpFileName:
[in] Pointer to a null-terminated string that specifies a valid file name, which can contain wildcard
characters, such as * and?.
fileNameLength:
[in] The maximum number of bytes to be received of the name.
fileSize:
[Out] A pointer to the variable which represents the size specified by the file.
isDir:
[Out] A pointer to the variable whose type is specified by the file.
Return Value
QL_RET_OK: success.
QL_RET_ERR_PARAM: parameter error.
QL_RET_ERR_FILEFAILED: fail to operate file.
QL_RET_ERR_FILENOMORE: file not found.
5.6.2.19. Ql_FS_FindClose
l
Prototype
t e
void Ql_FS_FindClose(s32 handle)
c a l
e
Parameters
t i
handle:
u
[in] Find handle, returned by a previous call of the Ql_FS_FindFirst function.
Q ide n
Return Value
None.
f
5.6.2.20. Ql_FS_XDelete
n
This function deletes a file or directory.
o
Prototype
C
s32 Ql_FS_XDelete(char* lpPath, u32 flag)
Parameters
lpPath:
[in] File path to be deleted.
flag:
[in] A u32 that defines the file's opening and access mode.
Return Value
QL_RET_OK: success.
QL_RET_ERR_PARAM: parameter error.
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
QL_RET_ERR_FILENOTFOUND: file not found.
QL_RET_ERR_PATHNOTFOUND: path not found.
QL_RET_ERR_GET_MEM: fail to get memory.
QL_RET_ERR_GENERAL_FAILURE: general failture.
5.6.2.21. Ql_FS_XMove
el
This function provides a facility to move or copy a file or folder
c t l
Prototype
e ia
s32 Ql_FS_XMove(char* lpSrcPath, char* lpDestPath, u32 flag)
u n t
Parameters
Q ide
lpSrcPath:
[in] Source path to be moved or copied.
f
lpDestPath:
[in] Destination path.
n
flag:
o
[in] A u32 that defines the file's opening and access mode.
C
The possible values are shown as follow:
QL_FS_MOVE_COPY
QL_FS_MOVE_KILL
QL_FS_MOVE_OVERWRITE
Return Value
QL_RET_OK: success.
QL_RET_ERR_PARAM: parameter error.
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
QL_RET_ERR_FILENOTFOUND: file not found.
QL_RET_ERR_PATHNOTFOUND: path not found.
QL_RET_ERR_GET_MEM: fail to get memory.
QL_RET_ERR_FILE_EXISTS: file existed.
QL_RET_ERR_GENERAL_FAILURE: general failture.
Prototype
Parameters
storage:
l
[in] The type of storage, which is one value of Enum_FSStorage.
t e
typedef enum
l
{
c
Ql_FS_UFS = 1,
a
Ql_FS_SD = 2,
e i
Ql_FS_RAM = 3,
u t
}Enum_FSStorage;
Q ide
Return Value
The return value is the total number of bytes of the free space in the specified storage, if this function
succeeds. Otherwise, the return value is an error code.
f
Ql_RET_ERR_UNKOWN: unkown error.
n
5.6.2.23. Ql_FS_GetTotalSpace
o
This function obtains the amount of total space on Flash.
C
Prototype
Parameters
storage:
[in] The type of storage, which is one value of Enum_FSStorage.
Return Value
The return value is the total number of bytes in the specified storage if this function succeeds. Otherwise,
the return value is an error code.
5.6.2.24. Ql_FS_Format
Prototype
l
Parameters
t e
storage:
l
[in] The format storage,which is one value of Enum_FSStorage.
c a
e
Return Value
t i
QL_RET_OK: success.
u
QL_RET_ERR_PARAM: parameter error.
n
QL_RET_ERR_FILENAMETOOLENGTH: filename too length.
Q ide
QL_RET_ERR_FILENOTFOUND: file not found.
QL_RET_ERR_PATHNOTFOUND: path not found.
QL_RET_ERR_GET_MEM: fail to get memory.
f
QL_RET_ERR_GENERAL_FAILURE: general failture.
n
5.6.3. Example
o
The following codes show how to use the file system functions.
C
#define MEMORY_TYPE 1
#define FILE_NAME "test.txt"
#define NEW_FILE_NAME "file.txt"
#define DIR_NAME "DIR\\"
#define LPPATH "\\*"
#define LPPATH2 "\\DIR\\*"
#define XDELETE_PATH "\\"
#define WRITE_DATA "1234567890"
#define OFFSET 0
void API_TEST_File(void)
{
s32 ret;
s64 size;
s32 filehandle, findfile;
l
size=Ql_FS_GetTotalSpace(MEMORY_TYPE);
Ql_Debug_Trace("Ql_FS_GetTotalSpace()=%lld,type =%d\r\n",size,MEMORY_TYPE);
t e
//Format the UFS
c l
ret=Ql_FS_Format(MEMORY_TYPE);
a
Ql_Debug_Trace("Ql_FS_Format()=%d type =%d\r\n",ret,MEMORY_TYPE);
u e t i
//Creates a file "test.txt"
n
ret=Ql_FS_Open(FILE_NAME, QL_FS_READ_WRITE|QL_FS_CREATE);
if(ret >= QL_RET_OK)
Q ide
{
filehandle = ret;
}
f
Ql_Debug_Trace("Ql_FS_OpenCreate(%s,%08x)=%d\r\n",FILE_NAME,
QL_FS_READ_WRITE|QL_FS_CREATE, ret);
o n
//Write "1234567890" to file
ret=Ql_FS_Write(filehandle, WRITE_DATA, Ql_strlen(WRITE_DATA), &writeedlen);
Ql_Debug_Trace("Ql_FS_Write()=%d: writeedlen=%d\r\n",ret, writeedlen);
C
//Write data remaining in the file buffer to the file.
Ql_FS_Flush(filehandle);
l
//Get the position of the file pointer
e
Position=Ql_FS_GetFilePosition(filehandle);
t
Ql_Debug_Trace("Ql_FS_GetFilePosition(): Position=%d\r\n",Position);
c a l
//Close the file
e i
Ql_FS_Close(filehandle);
u t
filehandle=-1;
n
Ql_Debug_Trace("Ql_FS_Close()\r\n");
Q ide
//Get the size of the file
filesize=Ql_FS_GetSize(FILE_NAME);
Ql_Debug_Trace((char*)("Ql_FS_GetSize(%s), filesize=%d\r\n"), FILE_NAME, filesize);
f
//Check the file exists or not
n
ret=Ql_FS_Check(FILE_NAME);
o
Ql_Debug_Trace("Ql_FS_Check(%s)=%d\r\n", FILE_NAME, ret);
C
ret=Ql_FS_Rename(FILE_NAME, NEW_FILE_NAME);
Ql_Debug_Trace("Ql_FS_Rename(\"%s\",\"%s\")=%d\r\n", FILE_NAME, NEW_FILE_NAME, ret);
QL_FS_READ_WRITE|QL_FS_CREATE, ret);
l
//Create a dir.
ret=Ql_FS_CreateDir(DIR_NAME);
e
Ql_Debug_Trace("Ql_FS_CreateDir(%s)=%d\r\n", DIR_NAME, ret);
c t l
//Check the dir. exist or not
a
ret=Ql_FS_CheckDir(DIR_NAME);
e i
Ql_Debug_Trace("Ql_FS_CheckDir(%s)=%d\r\n", DIR_NAME, ret);
u n t
//Check the dir. exist or not
ret=Ql_FS_DeleteDir(DIR_NAME);
Q ide
Ql_Debug_Trace("Ql_FS_DeleteDir(%s)=%d\r\n", DIR_NAME, ret);
//Create a dir.
f
ret=Ql_FS_CreateDir(DIR_NAME);
Ql_Debug_Trace("Ql_FS_CreateDir(%s)=%d\r\n", DIR_NAME, ret);
o n
//List all files and directories under the root of the UFS
Ql_memset(strBuf,0,100);
findfile=Ql_FS_FindFirst(LPPATH, strBuf, 100, &filesize, &isdir);
C
Ql_Debug_Trace("\r\nLater:strBuf=[%s]",strBuf);
if(findfile < 0)
{
Ql_Debug_Trace("Failed Ql_FS_FindFirst(%s)=%d\r\n", LPPATH, findfile);
}else{
Ql_Debug_Trace("Sueecss Ql_FS_FindFirst(%s)\r\n", LPPATH);
}
ret=findfile;
while(ret >=0)
{
Ql_Debug_Trace("filesize(%d),isdir(%d),Name(%s)\r\n", filesize, isdir, strBuf);
ret=Ql_FS_FindNext(findfile, strBuf, 100, &filesize, &isdir);
if(ret !=QL_RET_OK)
break;
}
Ql_FS_FindClose(findfile);
l
Ql_Debug_Trace("\r\nLater:strBuf=[%s]",strBuf);
if(findfile<0)
e
{
t
Ql_Debug_Trace("Failed Ql_FS_FindFirst(%s)=%d\r\n", LPPATH2, findfile);
c a l
}else{
e i
Ql_Debug_Trace("Sueecss Ql_FS_FindFirst(%s)\r\n", LPPATH2);
u t
}
n
ret=findfile;
while(ret>=0)
Q ide
{
Ql_Debug_Trace("filesize(%d),isdir(%d),Name(%s)\r\n", filesize, isdir, strBuf);
ret=Ql_FS_FindNext(findfile, strBuf, 100, &filesize, &isdir);
f
if(ret !=QL_RET_OK)
break;
n
}
o
Ql_FS_FindClose(findfile);
//Delete all files and directories under the root of the UFS by recursive way.
C
ret=Ql_FS_XDelete(XDELETE_PATH,QL_FS_FILE_TYPE
|QL_FS_DIR_TYPE|QL_FS_RECURSIVE_TYPE);
Ql_Debug_Trace("\r\nQl_FS_XDelete(%s,%x)=%d\r\n",XDELETE_PATH,
QL_FS_RECURSIVE_TYPE, ret);
Ql_memset(strBuf,0,100);
Findfile=Ql_FS_FindFirst(LPPATH, strBuf, 100, &filesize, &isdir);
Ql_Debug_Trace("Later:strBuf=[%s]",strBuf);
if(findfile < 0)
{
Ql_Debug_Trace("Failed Ql_FS_FindFirst(%s)=%d\r\n", LPPATH, findfile);
}else{
Ql_Debug_Trace("Sueecss Ql_FS_FindFirst(%s)\r\n", LPPATH);
}
ret=findfile;
while(ret>=0)
{
Ql_Debug_Trace("filesize(%d),isdir(%d),Name(%s)\r\n", filesize, isdir, strBuf);
ret=Ql_FS_FindNext(findfile, strBuf, 100, &filesize, &isdir);
if(ret !=QL_RET_OK)
break;
}
Ql_FS_FindClose(findfile);
}
el
5.7. Hardware Interface API
c t l
5.7.1. UART
e t ia
5.7.1.1. UART Overview
u n
In OpenCPU, UART ports include physical UART ports and virtual UART ports. The physical UART ports
Q ide
can be applied to connect to external devices, and the virtual UART ports are used to communicate
between application and the bottom operating system.
One of physical UART ports has hardware handshaking function. And others are three-wire interfaces.
f
OpenCPU provides two virtual UART ports that are used for communication between App and Core.
n
These virtual ports are designed according to the features of physical serial interface. And virtual port has
its RI, DCD information. The level of DCD can be used to indicate this virtual port is in data mode or AT
o
command mode.
C
The working chart for UARTs is shown below:
OpenCPU Virtual
Send AT Command
Virtual OpenCPU
Core UART UART
System Rcv AT Response / URC Application
l
TX RX
t e
RX TX
c l
Physical UART
e ia
External Device
u n t
Q ide
Figure 3: The Working Chart of UART
f
For physical UART or virtual UART initialization and usage, you can accomplish by following a few simple
n
steps.
o
Step 1: Call Ql_UART_Register to register the UARTs callback function.
C
Step 2: Call Ql_UART_Open to open the special UART port.
Step 3: Call Ql_UART_Write to write data to the specified UART port. When the number of bytes actually
sent is less than that to send, Application should stop sending data, and application will receive
an event EVENT_UART_READY_TO_WRITE later in callback function. After receiving this
event application can continue to send data, and previously unsent data should be resent.
Step 4: In the callback function, deal with the UARTs notification. If the notification type is
EVENT_UART_READY_TO_READ, developer should read out all data in the UART RX buffer;
otherwise, there will not be such notification to be reported to application when new data comes
to UART RX buffer later.
5.7.1.4. Ql_UART_Register
This function registers the callback function for the the specified serial port. UART callback function is
used to receive the UART notification from core system.
Prototype
l
typedef void (*CallBack_UART_Notify)( Enum_SerialPort port, Enum_UARTEventType event, bool
e
pinLevel,void *customizePara)
c t l
Parameters
a
port:
e t i
[in] Port name.
u n
callback_uart:
Q ide
[in] The pointer of the UART callback function.
event:
[out] Indication the event type of uart call back, one value of Enum_UARTEventType.
f
pinLevel:
n
[out] If the event type is EVENT_UART_RI_IND or EVENT_UART_DCD_IND or
o
EVENT_UART_DTR_IND the pinLevel indication the relate pin's current level otherwise this
parameter has no meaning, just ignore it.
C
customizePara:
[in] Customized parameter, if not use just set to NULL.
Return Value
The return value is QL_RET_OK if this function succeeds. Otherwise, the return value is an error code. To
get extended error information, please see ERROR CODES.
5.7.1.5. Ql_UART_Open
This function opens a specified UART port with the specified flow control mode. Which task calls this
function, which task will own the specified UART port.
Prototype
typedef enum {
FC_NONE=1, // None Flow Control
FC_HW, // Hardware Flow Control
FC_SW // Software Flow Control
} Enum_FlowCtrl;
l
Parameters
port:
t e
[in] Port name.
c l
baudrate:
a
[in] The baud rate of the UART to be open.
e i
The physical UARTs baud rate supports 75, 150, 300, 600, 1200, 2400, 4800, 7200, 9600, 14400,
u t
19200, 28800, 38400, 57600, 115200, 230400, 460800. The parameter does not take effect on the
n
VIRTUAL_PORT1 and VIRTUAL_PORT2, just set to 0
Q ide
flowCtrl:
[in] Please refer to Enum_flowCtrl, for the physical UART ports. Only UART_PORT1 supports hardware
flow control (FC_HW).
n f
Return Value
o
The return value is QL_RET_OK if this function succeeds. Otherwise, the return value is an error code. To
get extended error information, please see ERROR CODES.
C
5.7.1.6. Ql_UART_OpenEx
This function opens a specified UART port with the specified DCB parameters. Which task calls this
function, which task will own the specified UART port.
Prototype
Parameters
port:
[in] Port name.
dcb:
[in] Pointer to the UART DCB setting, including baud rate, data bits, stop bits, parity, and flow control.
Only physical serial port1 (UART_PORT1) supports hardware flow control. And this parameter
doesn't take effect on the VIRTUAL_PORT1 and VIRTUAL_PORT2, just set to NULL.
Return Value
The return value is QL_RET_OK if this function succeeds. Otherwise, the return value is an error code. To
get extended error information, please see ERROR CODES.
l
5.7.1.7. Ql_UART_Write
t e
This function is used to send data to the specified UART port. When the number of bytes actually sent is
l
less than that to send, application should stop sending data, and application (in callback function) will
c
receive an event EVENT_UART_READY_TO_WRITE later. After receiving this event application can
e a
continue to send data, and previously unsent data should be resend.
u t i
Prototype
Q ide n
s32 Ql_UART_Write(Enum_SerialPort port, u8* data, u32 writeLen)
Parameters
f
port:
n
[in] Port name
o
data:
[in] Pointer to data to write.
C
writeLen:
[in] The length of the data to write. For VIRTUAL_UART1 and VIRTUAL_UART2, the maximum length
that can be written at one time is 1023 bytes which cannot be modified programmatically in
application.
Return Value
Number of bytes actually written. If this function fails to write data, a negative number will be returned. To
get extended information, please see ERROR CODES .
5.7.1.8. Ql_UART_Read
This function read data from the specified UART port. When the UART callback is invoken, and the
notification is EVENT_UART_READY_TO_READ, developer should read out all data in the UART RX
buffer by calling this function in loop; otherwise, there will not be such notification to be reported to
application when new data comes to UART RX buffer later.
Prototype
l
Parameters
t e
port:
c l
[in] Port name
e ia
data:
t
[in] Point to buffer for the read data.
u n
readLen:
Q ide
[in] The length of the data to be read. The max data length of the receive buffer for physical UART buffer is
3584 bytes, 1023 bytes for virtual UART. And the buffer size cannot be modified programmatically in
application.
f
Return Value
n
Number of bytes actually read. If readLen equal with the actual read len, user need continue read the
o
UART until the actual read len is less than the readLen.To get extended information please see ERROR
CODES.
C
5.7.1.9. Ql_UART_SetDCBConfig
This function sets the parameters of the specified UART port. This function works only for physical UART
ports.
Prototype
typedef enum {
DB_5BIT = 5,
DB_6BIT,
DB_7BIT,
DB_8BIT
} Enum_DataBits;
typedef enum {
SB_ONE=1,
SB_TWO,
SB_ONE_DOT_FIVE
} Enum_StopBits;
l
typedef enum {
PB_NONE=0,
e
PB_ODD,
t
PB_EVEN,
c l
PB_SPACE,
a
PB_MARK
e i
} Enum_ParityBits;
u n t
typedef enum {
FC_NONE=1, //None Flow Control
Q ide
FC_HW, //Hardware Flow Control
FC_SW //Software Flow Control
} Enum_FlowCtrl;
f
typedef struct {
n
u32 baudrate;
o
Enum_DataBits dataBits;
Enum_StopBits stopBits;
Enum_ParityBits parity;
C
Enum_FlowCtrl flowCtrl;
}ST_UARTDCB;
Parameter
port:
[in] Port name.
dcb:
[in] The pointer to the UART DCB struct. Include baud rate, databits, stopbits and parity.
Return Value
The return value is QL_RET_OK if this function succeeds. Otherwise, the return value is an error code. To
get extended error information, please see ERROR CODES.
5.7.1.10. Ql_UART_GetDCBConfig
This function gets the configuration parameters of the specified UART port. This function works only for
physical UART ports.
Prototype
Parameter
l
port:
e
[in] Port name.
t l
dcb:
c
[in] The specified UART ports current DCB configration parameter, include baud rate, databits, stopbits
e ia
and parity.
u n t
Return Value
Q ide
The return value is QL_RET_OK if this function succeeds. Otherwise, the return value is an error code. To
get extended error information, please see ERROR CODES.
f
5.7.1.11. Ql_UART_ClrRxBuffer
n
This function clears the receive-buffer of the specified UART port.
o
Prototype
C
void Ql_UART_ClrRxBuffer(Enum_SerialPort port)
Parameter
port:
[in] Port name.
Return Value
None.
5.7.1.12. Ql_UART_ClrTxBuffer
Prototype
Parameter
port:
l
[in] Port name.
t e
l
Return Value
c
None.
u e
5.7.1.13. Ql_UART_GetPinStatus
t ia
Q ide n
This function gets the pin status (include RI, DCD, DTR) of the virtual UART port. It does not work for the
physical UART ports
f
Prototype
n
s32 Ql_UART_GetPinStatus(Enum_SerialPort port, Enum_UARTPinType pin)
o
typedef enum {
C
UART_PIN_RI=0, //RI read operator only valid on the virtual UART
//RI set operator is invalid both on virtual and physical UART
UART_PIN_DCD, //DCD read operator only valid on the virtual UART
//DCD set operatir is invalid both on virtual and physical UART
} Enum_UARTPinType;
Parameters
port:
[in] Virtual UART port name.
pin:
[in] Pin name, one value of Enum_UARTPinType.
Return Value
If >=0, indicates success, and the return special pin level value. 0: low level, 1: high level.
If <=0, indicates failure.
5.7.1.14. Ql_UART_SetPinStatus
This function sets the pin level status of the virtual UART port. It doesnt work for the physical UART ports.
Prototype
l
s32 Ql_UART_SetPinStatus(Enum_SerialPort port, Enum_UARTPinType pin, bool pinLevel)
t e l
Parameters
c a
port:
e i
[in] Virtual UART port name
u t
pin:
n
[in] Pin name, one value of Enum_UARTPinType.
Q ide
pinLevel:
[in] The pin level to be set. 0: low level, 1: high level.
f
Return Value
n
The return value is QL_RET_OK if this function succeeds. Otherwise, the return value is an error code. To
o
get extended error information, please see ERROR CODES.
C
5.7.1.15. Ql_UART_SendEscap
This function notifies the virtual serial port to quit from Data Mode, and return back to Command Mode.
And this function works only for virtual ports.
Prototype
Parameters
port:
[in] Port name
Return Value
The return value is QL_RET_OK if this function succeeds. Otherwise, the return value is an error code. To
get extended error information, please see ERROR CODES.
5.7.1.16. Ql_UART_Close
Prototype
l
void Ql_UART_Close(Enum_SerialPort port)
t e l
Parameter
c a
port:
e i
[in] Port name.
u n t
Return Value
Q ide
None.
f
5.7.1.17. Example
n
This chapter gives the example of how to use the UART port.
o
//Write the call back function, for deal with the UART notifications.
static void CallBack_UART_Hdlr(Enum_SerialPort port, Enum_UARTEventType msg, bool level, void*
C
customizedPara); //Call back
{
switch(msg)
case EVENT_UART_READ_TO_READ
//Read data from the UART port
Ql_UART_Read (port,buffer,rlen);
break;
case EVENT_UART_READ_TO_WRITE:
//Resume the operation of write data to UART
QL_UART_Write(port,buffer,wlen);
break;
case EVENT _UART_RI_CHANGE:
break;
case EVENT _UART_DCD_CHANGE
break;
l
//Write data to uart port
QL_UART_Write(UART_PORT1,buffer,len)
c t e l
5.7.2. GPIO
e t ia
5.7.2.1. GPIO Overview
u n
Therere 12 I/O pins that can be designed for general purpose I/O. All pins can be accessed under
Q ide
OpenCPU by API functions.
n f
Table 6: Multiplexing Pins
o
PIN
PIN NAME RESET MODE1 MODE2 MODE3 MODE4
No
C
16 PINNAME_NETLIGHT I/PD NETLIGHT GPIO PWM_OUT
PIN
PIN NAME RESET MODE1 MODE2 MODE3 MODE4
No
31 PINNAME_PCM_ SYNC I/PD PCM_SYNC GPIO SPI_MISO
l
O means output.
PU means internal pull-up circuit.
e
PD means internal pull-down circuit.
t
EINT means external interrupt input.
c l
PWM_OUT means PWM output function.
u e t ia
5.7.2.3. GPIO Initial Configuration
n
In OpenCPU, therere two ways to initialize GPIOs. One is to configure initial GPIO list in
Q ide
custom_gpio_cfg.h, please refer to [4.3]; the other way is to call GPIO related API to initialize after App
starts.
f
The following codes show the PINNAME_NETLIGHT, PINNAME_STATUS and PINNAME_GPIO0 pins
initial Configuration in custom_gpio_cfg.h file.
o n
/*---------------------------------------------------------------------------------------------------------------------------------------
{ Pin Name | Direction | Level | Pull Selection }
C
*---------------------------------------------------------------------------------------------------------------------------------------*/
#if 1// If needed, config GPIOs here
GPIO_ITEM(PINNAME_NETLIGHT, PINDIRECTION_OUT, PINLEVEL_LOW, PINPULLSEL_PULLDOWN)
GPIO_ITEM(PINNAME_PCM_IN, PINDIRECTION_OUT, PINLEVEL_LOW, PINPULLSEL_PULLDOWN)
GPIO_ITEM(PINNAME_PCM_OUT, PINDIRECTION_OUT, PINLEVEL_LOW, PINPULLSEL_PULLUP)
#else if
#endif
Step 1: GPIO initialization. Call Ql_GPIO_Init function sets the specified pin as the GPIO function, and
initializes the configurations, including direction, level and pull selection.
Step 2: GPIO control.When the pin is initialized as GPIO.The developers can call the GPIO related
APIs to change the GPIO level.
Step 3: Release the pin.If you dont want use this pin no longer,and need use this pin for other purpose
(such as PWM, EINT).you must call Ql_GPIO_Uninit to release the pin first. This step is optional.
el
5.7.2.5. API Functions
c t l
5.7.2.6. Ql_GPIO_Init
e t ia
This function enables the GPIO function of the specified pin, and initializes the configurations, including
u
direction, level and pull selection.
Q ide
Prototype
f
Parameters
o n
pinName:
[in] Pin name, one value of Enum_PinName.
C
dir:
[in] The initial direction of GPIO, one value of Enum_PinDirection.
pullsel:
[in] The initial level of GPIO, one value of Enum_PinLevel.
level:
[in] Pull selection, one value of Enum_PinPullSel.
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.2.7. Ql_GPIO_GetLevel
Prototype
Parameters
pinName:
l
[in] Pin name, one value of Enum_PinName.
t e
Return Value
c l
Return the level of the specified GPIO. 1 means high level, 0 means low level.
u e
5.7.2.8. Ql_GPIO_SetLevel
t ia
Q ide n
This function sets the level of the specified GPIO.
Prototype
f
s32 Ql_GPIO_SetLevel(PinName pinName, PinLevel level)
o n
Parameters
pinName:
C
[in] Pin name, one value of Enum_PinName.
level:
[in] The initial level of GPIO, one value of Enum_PinLevel.
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.2.9. Ql_GPIO_GetDirection
Prototype
Parameters
pinName:
[in] Pin name, one value of Enum_PinName.
Return Value
l
Return the direction of the specified GPIO, 1 means output, 0 means input.
t e l
5.7.2.10. Ql_GPIO_SetDirection
e c a
This function sets the direction of the specified GPIO.
u t i
Prototype
Q ide n
s32 Ql_GPIO_SetDirection(PinName pinName,PinDirection dir)
Parameters
f
pinName:
[in] Pin name, one value of Enum_PinName.
o n
dir:
[in] The initial direction of GPIO, one value of Enum_PinDirection.
C
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.2.11. Ql_GPIO_GetPullSelection
Prototype
Parameters
pinName:
[in] Pin name, one value of Enum_PinName.
Return Value
Return the pull selection of the specified GPIO, one value of Enum_PinPullSel .
5.7.2.12. Ql_GPIO_SetPullSelection
l
This function sets the pull selection of the specified GPIO.
t e
Prototype
c l
s32 Ql_GPIO_SetPullSelection(PinName pinName,PinPullSel pullSel)
e t ia
Parameters
u n
pinName:
[in] Pin name, one value of Enum_PinName.
Q ide
pullSel:
[in] Pull selection, one value of Enum_PinPullSel.
n
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
Co
5.7.2.13. Ql_GPIO_Uninit
This function releases the specified GPIO that was initialized by calling Ql_GPIO_Init previously. After
releasing, the GPIO can be used for other purpose.
Prototype
Parameters
pinName:
[in] Pin name, one value of Enum_PinName.
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.2.14. Example
void API_TEST_gpio(void)
{
s32 ret;
l
Ql_Debug_Trace("\r\n<*********** GPIO API Test ***********>\r\n");
t e
ret=Ql_GPIO_Init(PINNAME_NETLIGHT, PINDIRECTION_OUT, PINLEVEL_HIGH,
l
PINPULLSEL_PULLUP);
c
Ql_Debug_Trace("\r\n<--pin(%d) Ql_GPIO_Init ret=%d-->\r\n",PINNAME_NETLIGHT,ret);
e t ia
ret=Ql_GPIO_SetLevel(PINNAME_NETLIGHT,PINLEVEL_HIGH);
u
Ql_Debug_Trace("\r\n<--pin(%d) Ql_GPIO_SetLevel =%d ret=%d-->\r\n",
n
PINNAME_NETLIGHT,PINLEVEL_HIGH,ret);
Q ide
ret=Ql_GPIO_SetDirection(PINNAME_NETLIGHT,PINDIRECTION_IN);
Ql_Debug_Trace("\r\n<--pin(%d) Ql_GPIO_SetDirection =%d ret=%d-->\r\n",
PINNAME_NETLIGHT,PINDIRECTION_IN,ret);
f
ret=Ql_GPIO_GetLevel(PINNAME_NETLIGHT);
n
Ql_Debug_Trace("\r\n<--pin(%d) Ql_GPIO_GetLevel =%d ret=%d-->\r\n",
o
PINNAME_NETLIGHT,ret,ret);
C
ret=Ql_GPIO_GetDirection(PINNAME_NETLIGHT);
Ql_Debug_Trace("\r\n<--pin(%d) Ql_GPIO_GetDirection =%d ret=%d-->\r\n",
PINNAME_NETLIGHT,ret,ret);
ret=Ql_GPIO_SetPullSelection(PINNAME_NETLIGHT,PINPULLSEL_PULLDOWN);
Ql_Debug_Trace("\r\n<--pin(%d) Ql_GPIO_SetPullSelection =%d ret=%d-->\r\n",
PINNAME_NETLIGHT,PINPULLSEL_PULLDOWN,ret);
ret=Ql_GPIO_GetPullSelection(PINNAME_NETLIGHT);
Ql_Debug_Trace("\r\n<--pin(%d) Ql_GPIO_GetPullSelection =%d ret=%d-->\r\n",
PINNAME_NETLIGHT,ret,ret);
ret=Ql_GPIO_Uninit(PINNAME_NETLIGHT);
Ql_Debug_Trace("\r\n<--pin(%d) Ql_GPIO_Uninit ret=%d-->\r\n",PINNAME_NETLIGHT,ret);
}
5.7.3. EINT
OpenCPU module have two external interrupt pins, Please refer to [5.7.2.2] for details. The interrupt
trigger mode just support level-triggered mode. And the software debounce for external interrupt sources
in order to minimize the possbility of false activations. External interrupt have higher priority, so it is not
allowed frequent interruption. Its strongly recommended that the interrupt frequency is not more than 2,
and too frequent interrupt will cause other tasks cannot be scheduled, which probably leads unexpected
exception.
el
NOTES
t l
The interrupt response time is 50ms by default, and can be re-programmed to a bigger value in
c
OpenCPU. However, its strongly recommended that the interrupt frequency cannot be more than 3Hz for
a
the sake of module stably working.
u e n t i
Q ide
The following steps are how to use the external interruption function:
f
Step 1: Register an external interrupt function. You must choose one external interrupt pin and use
Ql_EINT_Register (or Ql_EINT_RegisterFast) API to register an interrupt handler function.
n
Step 2: Initialize the interrupt configurations. Call Ql_EINT_Init function to config the software debounce
time, set level-triggered interrupt mode.
o
Step 3: Interrupt handle. The interrupt callback function will be called if the level has changed.And
developers can process something in the handler.
C
Step 4: Mask the interrupt. When you do not want external interrupt you can use the Ql_EINT_Mask
function to disable the external interrupt, and you can call the Ql_EINT_Unmask function to
enable the external interrupt.
Step 5: Releases the specified EINT pin. To call Ql_EINT_Uninit function to releases the specified EINT
pin, and the pin can be used for other purpose after it released. This step is optional.
5.7.3.4. Ql_EINT_Register
This function registers an EINT I/O, and specifies the interrupt handler.
Prototype
Parameters
eintPinName
[in] EINT pin name, one value of Enum_PinName that has the interrupt function.
l
callback_eint
e
[in] The interrupt handler.
c t l
pinLevel:
[in] The EINT pin level value, one value of Enum_PinLevel.
e t ia
customParam:
u
[in] Customize parameter, if not use just set to NULL.
Q ide n
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
n f
5.7.3.5. Ql_EINT_RegisterFast
o
This function registers an EINT I/O, and specifies the interrupt handler. The EINT that is registered by
calling this function is a tophalf interrupt. The response for interrupt request is timelier. Please don't add
C
any task schedule in the interrupt handler.And the interrupt handler cannot consume much CPU time. Or it
causes system exception or reset.
Prototype
Parameters
eintPinName:
[in] EINT pin name, one value of Enum_PinName that has the interrupt function.
callback_eint:
[in] The interrupt handler.
pinLevel:
[in] The EINT pin level value, one value of Enum_PinLevel.
customParam:
[in] Customize parameter, if not use just set to NULL.
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.3.6. Ql_EINT_Init
el
Initialize an external interrupt function.
c t l
Prototype
e a
s32 Ql_EINT_Init(PinName eintPinName,EintType eintType,u32 hwDebounce,u32 swDebounce,
t i
bool autoMask)
u n
Parameters
Q ide
eintPinName
[in] EINT pin name, one value of Enum_PinName that has the interrupt function.
f
eintType:
[in] Interrupt type, level-triggered or edge-triggered.Now, only level-triggered interrupt is supported.
o n
hwDebounce:
[in] Hardware debounce. Unit: in 10ms. Not support now.
C
swDebounce:
[in] Software debounce. Unit: in 10ms. The minimum value for this parameter is 5, which means the
minimum software debounce time is 5*10ms=50ms.
autoMask:
[in] Whether auto mask the external interrupt after the interrupt happened.0 means not, 1 means yes.
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.3.7. Ql_EINT_Uninit
Prototype
Parameters
eintPinName:
l
[in] EINT pin name.
t e
Return Value
c l
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
u e t ia
5.7.3.8. Ql_EINT_GetLevel
Q ide n
This function gets the level of the specified EINT pin.
Prototype
f
s32 Ql_EINT_GetLevel(PinName eintPinName)
n
Parameters
o
eintPinName:
C
[in] EINT pin name.
Return Value
5.7.3.9. Ql_EINT_Mask
Prototype
Parameters
eintPinName:
[in] EINT pin name.
Return Value
Void.
5.7.3.10. Ql_EINT_Unmask
l
This function unmasks the specified EINT pin.
t e
Prototype
c a l
void Ql_EINT_Unmask(PinName eintPinName)
Parameters
u e n t i
Q ide
eintPinName:
[in] EINT pin name.
Return Value
f
None.
5.7.3.11. Example
o n
C
The following sample codes show how to use the EINT function.
//You need unmask the interrupt again, because PINNAME_DTR pin interrupt initialized as auto
mask,
Ql_EINT_Unmask(eintPinName);
if(*((s32*)customParam) >= 3)
{
//If dont want the interrupt you can mask it now !!!
Ql_EINT_Mask(eintPinName);
}
}
else if(PINNAME_SIM_PRESENCE==eintPinName)
{
ret=Ql_EINT_GetLevel(eintPinName);
Ql_Debug_Trace("\r\n<--Ql_EINT_GetLevel pin(%d) levle(%d)-->\r\n",eintPinName,ret);
l
//If dont want the interrupt you can mask it now !!!
Ql_EINT_Mask(PINNAME_SIM_PRESENCE);
e
}
t
}
c l
*((s32*)customParam) +=1;
a
}
u e t i
void API_TEST_eint(void)
n
{
s32 ret;
Q ide
//Register PINNAME_SIM_PRESENCE pin for a tophalf external interrupt pin
ret=Ql_EINT_RegisterFast(PINNAME_SIM_PRESENCE,eint_callback_handle,(void
f
*)&EintcustomParam);
n
//Initialization some parameters, auto mask is false.
o
ret=Ql_EINT_Init(PINNAME_SIM_PRESENCE, EINT_LEVEL_TRIGGERED, 0,5,0);
Ql_Debug_Trace("\r\n<--pin(%d) Ql_EINT_Init ret=%d-->\r\n",PINNAME_SIM_PRESENCE,ret);
C
//Register PINNAME_DTR pin for a external interrupt pin
ret=Ql_EINT_Register(PINNAME_DTR,eint_callback_handle, (void *)&fastEintcustomParam);
5.7.4. PWM
OpenCPU module have one PWM pinPlease refer to [5.7.2.2] for details. The pwm have two clock
sources: one is 32K (the exact value is 32768Hz) and the other is 13M. When the module is in the sleep
mode, the 13M clock source will be disabled, but the 32K clock source works normally.
Step 1: Initialize a PWM pin. Call Ql_PWM_Init function to config the PWM duty cycle and frequency.
Step 2: PWM waveform control. Call Ql_PWM_Output to switch on/off the PWM waveform output.
Step 3: Release the PWM pin. Call Ql_PWM_Uninit to release the PWM pin. This step is optional.
el
5.7.4.3. API Functions
c t l
5.7.4.4. Ql_PWM_Init
e ia
This function initializes the PWM pin.
u n t
Prototype
Q ide
s32 Ql_PWM_Init(PinName pwmPinName,PwmSource pwmSrcClk,PwmSourceDiv pwmDiv,u32
lowPulseNum,u32 highPulseNum)
f
Parameters
pwmPinName:
n
[in] Pin name, only can be PINNAME_NETLIGHT.
o
pwmSrcClk:
C
[in] PWM clock source, one value of Enum_PwmSource.
pwmDiv:
[in] Clock source divide, one value of Enum_PwmSourceDiv
lowPulseNum:
[in] Set the number of clock cycles to stay at low level. The result of lowPulseNum plushighPulse Num is
less than 8193.
highPulseNum
[in] Set the number jof clock cycles to stay at high level. The resultof lowPulseNum plus highPulseNum is
less than 8193.
NOTES
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.4.5. Ql_PWM_Uninit
el
This function releases a PWM pin.
t l
Prototype
e c a
s32 Ql_PWM_Uninit(PinName pwmPinName)
Parameters
u n t i
Q ide
pwmPinName:
[in] Pin name, one value of Enum_PinName.
Return Value
f
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
o n
5.7.4.6. Ql_PWM_Output
C
This function switches on/off the PWM waveform output.
Prototype
Parameters
pwmPinName:
[in] Pin name, one value of Enum_PinName.
pwmOnOff:
[in] PWM enable. Control the PWM waveform output or disable.
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.4.7. Example
void API_TEST_pwm(void)
{
s32 ret;
l
//Initialization some parameters.
t e
ret=Ql_PWM_Init(PINNAME_NETLIGHT, PWMSOURCE_32K, PWMSOURCE_DIV4, 500, 500);
l
Ql_Debug_Trace("\r\n<--pin(%d) Ql_PWM_Init ret=%d-->\r\n",PINNAME_NETLIGHT,ret);
e c a
//PWM waveform output.
t i
ret=Ql_PWM_Output(PINNAME_NETLIGHT, 1);
u
Ql_Debug_Trace("\r\n<--pin(%d) Ql_PWM_Output start ret=%d-->\r\n",PINNAME_NETLIGHT,ret);
Q ide n
Ql_Sleep(3000);
//PWM waveform stop.
ret=Ql_PWM_Output(PINNAME_NETLIGHT, 0);
Ql_Debug_Trace("\r\n<--pin(%d) Ql_PWM_Output stop ret=%d-->\r\n",PINNAME_NETLIGHT,ret);
f
//Release the pin if you do not use it.
n
ret=Ql_PWM_Uninit(PINNAME_NETLIGHT);
o
Ql_Debug_Trace("\r\n<--pin(%d) Ql_PWM_Uninit stop ret=%d-->\r\n",PINNAME_NETLIGHT,ret);
}
C
5.7.5. ADC
OpenCPU module provides an analogue input pins that can be used to detect the external voltage. Pleae
refer to document [2] for the pin definitions and ADC h/w characteristics. The voltage range that can be
detected is 0~2800mV.
Step 1: Register an ADC sampling function. Call Ql_ADC_Register function to register a callback
function which will be invoked after ADC has sampled count times.
Step 2: ADC sampling parameter initialization. Call Ql_ADC_Init function to set the sample counts and
the interval of each sample.
Step 3: Start/stop ADC sampling. Use Ql_ADC_Sampling function with an enable parameter to start
ADC sampling, and then ADC callback function will be invoked cyclically to report the ADC value.
Again call this API function with a disable parameter may stop the ADC sampling.
t el
c a l
5.7.5.4. Ql_ADC_Register
u e t i
This function registers an ADC callback function. The callback function will be called after ADC has
n
sampled count times.
Q ide
Prototype
f
typedef void (*Callback_ADC)(ADCPin adcPin, u32 adcValue, void *customParam)
n
Parameters
o
adcPin
[in] ADC pin name, one value of Enum_ADCPin.
C
callback_adc:
[in] Callback funtion, will be called after ADC has sampled count times.
customParam:
[in] Customize parameter, if not use just set to NULL.
adcValue :
[in] The ADC value is the average of the sampled count times. The range is 0~2800 mV.
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.5.5. Ql_ADC_Init
This function initializes the configurations for ADC, including sampling count and the interval of each
sampling. The ADC callback function will be called after ADC has sampled count times to report the ADC
value, and the value is the average of the count times sampling.
Prototype
l
Parameters
e
adcpin
t
[in] ADC pin name, one value of Enum_ADCPin.
c l
count:
e ia
[in] Internal sampling times for each reporting ADC value. The minimum is 5.
u t
interval
n
[in] Interval of each internal sampling, unit is ms. the minimum is 200 (ms). That means the ADC Report
Q ide
frequency must be less than 1 Hz.
Return Value
f
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
o n
5.7.5.6. Ql_ADC_Sampling
C
This function switches on/off ADC sample.
Prototype
Parameters
adcPin
[in] ADC pin name, one value of Enum_ADCPin.
enable:
[in] Sample control, 1: start to sample 0: stop sampling.
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.5.7. Example
l
if (PIN_ADC0==adcPin )
{
t e
if( *((s32*)customParam) >= 4)
l
{
c
//Stop ADC0 to sample, if you not need
e a
ret=Ql_ADC_Sampling(PIN_ADC0, 0);
t i
}
u
}
n
*((s32*)customParam) +=1;
Q ide
}
void API_TEST_adc(void)
{
s32 ret;
f
//Register ADC0 callback function.
n
ret=Ql_ADC_Register(PIN_ADC0, ADC_callback_handle, (void * )&ADC0customParam);
o
//Set the internal sampling times, the each internal sampling interval
C
ret=Ql_ADC_Init(PIN_ADC0, 5, 200);//So the ADC0 report the ADC value frequency 1 Hz.(5*200ms).
ret=Ql_ADC_Sampling(PIN_ADC0, 1); //Start to sample
}
5.7.6. IIC
Module provides a hardware IIC interface. Besides, IIC interface can be simulated by GPIO pins, which
can be any two GPIOs in the GPIO list [5.7.2.2]. So, one or more IIC interfaces are possible.
Step 1: Initialize IIC interface. Call Ql_IIC_Init function to initialize an IIC channel, including the specified
GPIO pins for IIC and an IIC channel number.
Step 2: Configure IIC interface. Call Ql_IIC_Config to config parameters that the slave device needs.
Please refer to the API decription for extend information.
Step 3: Read data from slave. Developer can use Ql_IIC_Read function to read data from the specified
l
slave. The following figure shows the data exchange direction.
c t e l
e ia
Step 4: Write data to slave. Developer can use Ql_IIC_Write function to write data to the specified slave.
t
The following figure shows the data exchange direction.
u n
S Slave address 0 A Data A Data P
Q ide
Step 5: Write the data to the register (or the specified address) of the slave. Developer can use
Ql_IIC_Write function to write the data to a register of the slave. The following figure shows the data
f
exchange direction.
n
S Slave address 0 A Data A Data P
o
Step 6: Read the data from the register (or the specified address) of the slave. Developer can
C
useQl_IIC_Write_Read function to read the data from a register of the slave. The following figure shows
the data exchange direction.
Step 7: Release the IIC channel. Call Ql_IIC_Uninit function to release the specified IIC channel.
5.7.6.4. Ql_IIC_Init
This function initializes the configurations for an IIC channel, including the specified pins for IIC, IIC type,
and IIC channel number.
Prototype
Parameters
chnnlNo:
[in] IIC channel No, the range is 0~254.
pinSCL:
[in] IIC SCL pin.
el
pinSDA:
t
[in] IIC SDA pin.
c l
//Ctype
e ia
[in] IIC type, 0 means the IIC communication is simulated by pins, 1 means IIC contronller.
u t
Return Value
n
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
Q ide
5.7.6.5. Ql_IIC_Config
n f
This function configures the IIC interface for one slave.
o
Prototype
C
s32 Ql_IIC_Config(u32 chnnlNo, bool isHost, u8 slaveAddr, u32 speed)
Parameters
chnnlNo:
[in] IIC channel No, the No is specified by Ql_IIC_Init function.
isHost :
[in] Must be ture, just support host mode.
slaveAddr:
[in] Slave address.
speed:
[in] Just for IIC controller, and the parameter can be ingore if you use simulate IIC
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.6.6. Ql_IIC_Write
l
Prototype
t e
s32 Ql_IIC_Write(u32 chnnlNo,u8 slaveAddr,u8 *pData,u32 len)
c a l
e
Parameters
t i
chnnlNo:
u
[in] IIC channel No, the No is specified by Ql_IIC_Init function.
Q ide n
slaveAddr:
[in] Slave address.
f
pData:
[in] Setting value to slave.
n
Len:
o
[in] Number of bytes to write. If IICtype=1,1<len<8.Because our IIC contronller at most support 8 bytes for
one time transaction
C
Return Value
If no error, return the length of the write data. Negative integer indicates this function fails.
5.7.6.7. Ql_IIC_Read
This function reads data from specified slave through IIC interface.
Prototype
Parameters
chnnlNo:
[in] IIC channel No, the No is specified by Ql_IIC_Init function.
slaveAddr:
[in] Slave address.
pBuffer:
[Out] Read buffer of reading the specified register from slave.
Len:
l
[Out] Number of bytes to read. If IICtype=1,1<len<8. Because our IIC contronller at most support 8 bytes
e
for one time transaction.
t l
Return Value
c a
If no error, return the length of the read data. Negative integer indicates this function fails.
u e
5.7.6.8. Ql_IIC_WriteRead
n t i
Q ide
This function reads data form the specified register (or address) of the specified slave.
Prototype
f
s32 Ql_IIC_Write_Read(u32 chnnlNo,u8 slaveAddr,u8 * pData,u32 wrtLen,u8 * pBuffer,u32 rdLen)
Parameters
o n
C
chnnlNo:
[in] IIC channel No, the No is specified by Ql_IIC_Init function.
slaveAddr:
[in] Slave address.
pData:
[in] Setting values of the specified register of the slave.
wrtLen:
[in] Number of bytes to write.If IICtype=1, 1<wrtLen<8.
pBuffer:
[Out] Read buffer of reading the specified register from slave.
rdLen:
[Out] Number of bytes to read.If IICtype=1, 1<wrtLen<8.
Return Value
If no error, return the length of the read data. Negative integer indicates this function fails.
5.7.6.9. Ql_IIC_Uninit
l
Prototype
t e l
s32 Ql_IIC_Uninit(u32 chnnlNo)
e c ia
Parameters
u t
chnnlNo:
n
[in] IIC channel No, the No is specified by Ql_IIC_Init function.
Q ide
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
n f
5.7.6.10. Example
o
The following example code demonstrates the use of IIC interface.
C
void API_TEST_iic(void)
{
s32 ret;
u8 write_buffer[4]={0x10,0x02,0x50,0x0a};
u8 read_buffer[6]={0x14,0x22,0x33,0x44,0x55,0x66};
u8 registerAdrr[2]={0x01,0x45};
Ql_Debug_Trace("\r\n<*********** IIC API Test ***********>\r\n");
l
ret=Ql_IIC_Write_Read(1, 0x07, registerAdrr, sizeof(registerAdrr),read_buffer, sizeof(read_buffer));
e
ret=Ql_IIC_Uninit(1);
t
}
5.7.7. SPI
e c ia l
u n t
5.7.7.1. SPI Overview
Q ide
Module provides a hardware IIC interface. Besides, SPI interface can be simulated by GPIO pins, which
can be any GPIOs in the GPIO list [5.7.2.2].
n f
5.7.7.2. SPI Usage
o
The following steps tell how to use the SPI function:
C
Step 1: Initialize SPI Interface. To call Ql_SPI_Init function initializes the configurations for a SPI channel,
including the specified pins for SPI, SPI type, and SPI channel number.
Step 2: Configure. Call Ql_SPI_Config function to config some parameters for the SPI interface,
including the clock polarity and clock phase.
Step 3: Write data. To call Ql_SPI_Write function writes bytes to the specified slave bus.
Step 4: Read data. To call Ql_SPI_Read function reads bytes from the specified slave bus.
Step 5: Write and read. The Ql_SPI_WriteRead function is for SPI full-duplex communication that can
read and write data at one time.
Step 6: Release SPI interface. Invoke Ql_SPI_Uniti function to release the SPI PINs. This step is
optional.
5.7.7.4. Ql_SPI_Init
This function initializes the configurations for a SPI channel, including the SPI channel number and the
specified GPIO pins for SPI.
Prototype
el
Parameters
t
chnnlNo:
c l
[in] SPI channel No, the range is 0~254
e ia
pinClk:
u t
[in] SPI CLK pin.
n
pinMiso:
Q ide
[in] SPI MISO pin.
pinMosi:
f
[in] SPI MOSI pin.
n
spiType:
o
[in] SPI type, the type must be zero.
Return Value
C
QL_RET_OK, this function succeeds. Negative integer indicates this function fails.
5.7.7.5. Ql_SPI_Config
Prototype
s32 Ql_SPI_Config (u32 chnnlNo, bool isHost, bool cpol, bool cpha, u32 clkSpeed)
Parameters
chnnlNo:
[in] SPI channel No, the No is specified by Ql_SPI_Init function.
isHost:
[in] Must be true, not support salve mode.
cpol:
[in] Clock Polarity, more information please refer to the SPI standard protocol.
cpha:
[in] Clock Phase, more information please refer to the SPI standard protocol.
el
clkSpeed:
t
[in] The SPI speed, not support now. The input argument will be ignored.
c l
Return Value
e ia
If no error, return the length of the write data. Negative integer indicates this function fails
u
5.7.7.6. Ql_SPI_Write
n t
Q ide
This function writes data to the specified slave through SPI interface.
f
Prototype
n
s32 Ql_SPI_Write(u32 chnnlNo,u8 * pData,u32 len)
o
Parameters
C
chnnlNo:
[in] SPI channel No, the No is specified by Ql_SPI_Init function.
pData:
[in] The setting value to slave.
len:
[in] Number of bytes to write.
Return Value
If no error, return the length of the write data. Negative integer indicates this function fails.
5.7.7.7. Ql_SPI_Read
This function reads data from the specified slave through SPI interface.
Prototype
Parameters
chnnlNo:
l
[in] SPI channel No, the No is specified by Ql_SPI_Init function.
t e
pBuffer:
l
[Out] Read buffer of reading from slave.
e c ia
rdLen:
t
[Out] Number of bytes to read.
u n
Return Value
Q ide
If no error, return the length of the read data. Negative integer indicates this function fails.
f
5.7.7.8. Ql_SPI_WriteRead
n
This function is used for SPI full-duplex communication.
o
Prototype
C
s32 Ql_SPI_WriteRead(u32 chnnlNo,u8 *pData,u32 wrtLen,u8 * pBuffer,u32 rdLen)
Parameters
chnnlNo:
[in] SPI channel No, the No is specified by Ql_SPI_Init function.
pData:
[in] Setting value to slave.
wrtLen:
[in] Number of bytes to write.
pBuffer:
[Out] Read buffer of reading from slave.
rdLen:
[Out] Number of bytes to read.
NOTES
l
Return Value
t e
If no error, return the length of the read data. Negative integer indicates this function fails.
5.7.7.9. Ql_SPI_Uninit
e c ia l
u t
This function releases the SPI pins.
Q ide n
Prototype
n
Parameters
chnnlNo:
o
[in] SPI channel No, the No is specified by Ql_SPI_Init function.
C
Return Value
QL_RET_OK, this function succeeds. Negative integer indicates this function fails
5.7.7.10. Example
void API_TEST_spi(void)
{
s32 ret;
u32 rdLen=0;
u32 wdLen=0;
u8 spi_write_buffer[]={0x01,0x02,0x03,0x0a,0x11,0xaa};
u8 spi_read_buffer[100];
Ql_Debug_Trace("\r\n<*********** TEST API Test ***********>\r\n");
ret=Ql_SPI_Init(1,PINNAME_KBR0,PINNAME_KBR1,PINNAME_KBR2,0);
Ql_Debug_Trace("\r\n<--SPI channel 1 Ql_SPI_Init ret=%d-->\r\n",ret);
wdLen=Ql_SPI_Write(1,spi_write_buffer,6);
Ql_Debug_Trace("\r\n<--SPI channel 1 Ql_SPI_Write data len =%d-->\r\n",wdLen);
l
rdLen=Ql_SPI_Read(1,spi_read_buffer,6);
e
Ql_Debug_Trace("\r\n<--SPI channel 1 Ql_SPI_Read data len =%d-->\r\n",rdLen);
c t l
rdLen=Ql_SPI_WriteRead(1,spi_write_buffer,6,spi_read_buffer,3);
a
Ql_Debug_Trace("\r\n<--SPI channel 1 Ql_SPI_WriteRead Read data len =%d-->\r\n",rdLen);
u e t i
ret=Ql_SPI_Uninit(1);
n
Ql_Debug_Trace("\r\n<--SPI channel 1 Ql_SPI_Uninit ret =%d-->\r\n",ret);
}
Q ide
f
5.8. GPRS API
n
5.8.1. Overview
o
The API functions in this section are declared in ql_gprs.h.
C
The module supports to define and activate 2 PDP contexts at the same time. And each PDP context
supports at most 6 client socket connections and 5 server socket connections.
The examples in the example_tcpclient.c and example_tcpserver.c of OpenCPU SDK show the proper
usages of these methods.
5.8.2. Usage
The following steps tell how to work with GPRS PDP context:
Step 1: Register PDP callback. Call function Ql_GPRS_Register to register the GPRSs callback
function.
Step 2: Set PDP context. Call function Ql_GPRS_Config to configure the GPRS PDP context, including
APN name, user name and password.
Step 3: Activate PDP. Call function Ql_GPRS_Activate to activate the GPRS PDP context. The result
for activating GPRS will usually be informed in Callback_GPRS_Actived. See also the
description for Ql_GPRS_Activate below.
To call Ql_GPRS_AcitvateEx may activate the GPRS and get the result when this API function
returns. The callback function Callback_GPRS_Actived will not be invoked. It means this API
function will execute with blocking mode. See also the description for Ql_GPRS_ActivateEx
below.
l
Step 5: Get host IP by domain name if needed. Call Ql_GPRS_GetDNSAddress to retrieve the host IP
address by the domain name address if a domain name address for server is used.
e
Step 6: Deactivate. Call function Ql_GPRS_Deactivate to close the GPRS PDP context. The result for
t
deactivating GPRS is usually be informed in Callback_GPRS_Deactived. Besides, the callback
c l
function Callback_GPRS_Deactived will be invoked when GPRS drops down. See also the
a
description for Ql_GPRS_Activate below.
u e t i
To call Ql_GPRS_DeacitvateEx may deactivate the GPRS and get the result when this API
n
function returns. The callback function Callback_GPRS_Deactived will not be invoked. It means
this API function will execute with blocking mode. See also the description for
Q ide
Ql_GPRS_DeactivateEx below.
n f
5.8.3. API Functions
o
5.8.3.1. Ql_GPRS_Register
C
This function registers the GPRS related callback functions.The callback functions will be invoked only in
the registered task.
Prototype
typedef struct {
void (*Callback_GPRS_Actived)(u8 contexId, s32 errCode, void* customParam);
void (*CallBack_GPRS_Deactived)(u8 contextId, s32 errCode, void* customParam );
} ST_PDPContxt_Callback;
Parameters
contextid:
[in] OpenCPU supports two PDP-contexts to the destination host at a time. This parameter can be 0 or 1.
callback_func:
[in] This callback function is called by OpenCPU to inform Embedded Application whether this function
succeeds or not. And this callback function should be implemented by Embedded Application.
customerParam:
[in] One customized parameter that can be passed into the callback functions.
l
Return Value
e
The return value is 0 if sucesses. Otherwise, a value of Enum_SocError is returned.
c t
5.8.3.2. Callback_GPRS_Actived
a l
u e t i
When the return value of Ql_GPRS_Activate is SOC_WOULDBLOCK, this callback function will be
n
invoked later.
Q ide
Prototype
n f
Parameters
o
contextId:
[Out] PDP context id that is specified when calling Ql_GPRS_Activate. This parameter maybe is 0 or 1.
C
errCode:
[Out] The result code of activating GPRS, 0 indicates succeed in activating GPRS.
customerParam:
[Out] One customized parameter that was passed into when calling Ql_GPRS_Register. This paramer
maybe is NULL.
Return Value
None.
5.8.3.3. CallBack_GPRS_Deactived
When the return value of Ql_GPRS_Deactivate is SOC_WOULDBLOCK, this callback function will be
invoked by Core System later.
Prototype
Parameters
contextId:
l
[Out] PDP context id that is specified when calling GPRS_Activate. This parameter maybe is 0 or 1.
t e
errCode:
l
[Out] The result code of activating GPRS, 0 indicates succeed in activating GPRS.
e c ia
customerParam:
t
[Out] One customized parameter that was passed into when calling Ql_GPRS_Register. This paramer
u
maybe is NULL.
Q ide n
Return Value
None.
f
5.8.3.4. Ql_GPRS_Config
n
This function sets the authentication parameters apn/login/password/authentication to use with a profile
o
ID during PDP activation.
C
Prototype
typedef struct {
u8 apnName[MAX_GPRS_APN_LEN];
u8 apnUserId[MAX_GPRS_USER_NAME_LEN];
u8 apnPasswd[MAX_GPRS_PASSWORD_LEN];
u8 authtype; // pap or chap
void* Reserved1; // Qos
void* Reserved2; //
} ST_GprsConfig;
Parameters
apnName:
[in] NULL-terminated APN characters.
apnUserId:
[in] User Id, NULL-terminated characters.
apnPasswd:
[in] Password, NULL-terminated characters.
Authtype:
l
[in] Authentication method
e
1 - PAP
t
2- CHAP
c l
Return Value
e ia
The possible return values are as follows:
u n t
SOC_SUCCESS: This function succeeds.
SOC_INVAL: Invalid argument.
Q ide
SOC_ALREADY: The function is running.
f
5.8.3.5. Ql_GPRS_Activate
n
This function actives a PDP context. Depending on the network status, PDP activation will take some time,
o
the longest activation time is 150s. When the PDP activation success or failure, Callback_GPRS_Actived
callback function will be called, and give the activation result.
C
Prototype
Parameters
contextId:
[in] OpenCPU supports two PDP-contexts to the destination host at the same time. This parameter can be
0 or 1.
Return Value
Example
l
{
e
s32 ret;
t
ret=Ql_GPRS_Activate(0);
l
if (GPRS_PDP_SUCCESS==ret)
c
{
e ia
//Activate GPRS successfully
t
}
u
else if (GPRS_PDP_WOULDBLOCK==ret)
n
{
Q ide
//Activating GPRS, need to wait Callback_GPRS_Actived for the result
}
else if (GPRS_PDP_ALREADY==ret)
{
f
//GPRS has been activating...
n
}else{
//Fail to activate GPRS, error code is in "ret".
o
//Developer may retry to activate GPRS, and reset the module after 3 successive failures.
}
C
}
5.8.3.6. Ql_GPRS_ActivateEx
This function activates the specified PDP context. The maximum possible time for Activating GPRS is
180s.
Non-blocking Mode
When the "isBlocking" is set to FALSE, this function works under non-blocking mode. The result will be
returned even if the operation is not done, and the result will be reported in callback.
Blocking Mode
When the "isBlocking" is set to TRUE, this function works under blocking mode. The result will be
returned only after the operation is done.
Prototype
l
Parameters
e
contextId:
t
[in] OpenCPU supports two PDP-contexts to the destination host at the same time. This parameter can be
l
0 or 1.
e c ia
isBlocking
t
[in] Blocking mode. TRUE=blocking mode, FALSE=non-blocking mode.
u n
Return Value
Q ide
The possible return values are below:
f
GPRS_PDP_INVAL: Invalid argument.
GPRS_PDP_ALREADY: The activating operation is in process.
n
GPRS_PDP_BEARER_FAIL: Bearer is broken.
o
Example
C
The following codes show the activating GPRS processing.
{
s32 ret;
ret=Ql_GPRS_Activate(0, TRUE);
if (GPRS_PDP_SUCCESS==ret)
{
//Activate GPRS successfully
}
else if (GPRS_PDP_ALREADY==ret)
{
//GPRS has been activating...
}else{
//Fail to activate GPRS, error code is in "ret".
//Developer may retry to activate GPRS, and reset the module after 3 successive failures.
}
}
5.8.3.7. Ql_GPRS_Deactivate
This function deactivates the specified PDP context. Depending on the network status, PDP deactivation
will take some time the longest time is 90s. When the PDP deactivation success or failure,
CallBack_GPRS_Deactived callback function will be called, and give the activation result
Prototype
el
s32 Ql_GPRS_Deactivate(u8 contextId)
c t l
Parameters
e a
contextId:
t i
[in] PDP context ID that is specified when calling Ql_GPRS_Activate.
u n
Return Value
Q ide
The return value is 0 if this function succeeds. Otherwise, a value of ql_soc_error_enum is returned,
please see Possible Error Codes.
f
Example
n
The following codes show the deactivating GPRS processing.
o
{
s32 ret;
C
ret=Ql_GPRS_Deactivate(0);
if (GPRS_PDP_SUCCESS==ret)
{
//GPRS is deactivated successfully
}
else if (GPRS_PDP_WOULDBLOCK==ret)
{
//Deactivating GPRS, need to wait Callback_GPRS_Deactived for the result
}else{
//Fail to activate GPRS, error code is in "ret".
}
}
5.8.3.8. Ql_GPRS_DeactivateEx
This function deactivates the specified PDP context. The maximum possible time for Activating GPRS is
90s.
Non-blocking Mode
When the "isBlocking" is set to FALSE, this function works under non-blocking mode. The result will be
returned even if the operation is not done, and the result will be reported in callback.
l
Blocking Mode
t e
When the "isBlocking" is set to TRUE, this function works under blocking mode. The result will be
l
returned only after the operation is done.
e c ia
If working under non-blocking mode, this function is same as Ql_GPRS_Deactivate() functionally.
u t
Prototype
Q ide n
s32 Ql_GPRS_DeactivateEx(u8 contextId, bool isBlocking);
Parameters
f
contextId:
n
[in] PDP context ID that is specified when calling Ql_GPRS_Activate.
o
isBlocking
[in] Blocking mode. TRUE=blocking mode, FALSE=non-blocking mode.
C
Return Value
Example
{
s32 ret;
ret=Ql_GPRS_Deactivate(0, TRUE);
if (GPRS_PDP_SUCCESS==ret)
{
//GPRS is deactivated successfully
}else{
//Fail to activate GPRS, error code is in "ret".
}
}
5.8.3.9. Ql_GPRS_GetLocalIPAddress
l
This function retrieves the local IP of the specified PDP context.
t e l
Prototype
e c a
s32 Ql_GPRS_GetLocalIPAddress(u8 contxtId, u32* ipAddr)
u t i
Parameters
Q ide n
contextId:
[in] PDP context ID that is specified when calling Ql_GPRS_Activate.
ipAddr:
f
[Out] Point to the buffer that is the storage space for the local IPv4 address.
n
Return Value
o
If no error occurs, this return value will be SOC_SUCCESS (0). Otherwise, a value of Enum_SocError is
returned.
Prototype
C
5.8.3.10. Ql_GPRS_GetDNSAddress
This function retrieves the DNS servers IP addresses, which include the first DNS addess and the
Parameters
contextId:
[in] PDP context ID that is specified when calling Ql_GPRS_Activate.
firstAddr:
[Out] Point to the buffer that is the storage space for the primary DNS servers IP address.
secondAddr:
[Out] Point to the buffer that is the storage space for the secondary DNS servers IP address.
Return Value
l
If no error occurs, this return value will be SOC_SUCCESS (0). Otherwise, a value of Enum_SocError is
e
returned.
c t
5.8.3.11. Ql_GPRS_SetDNS Address
a l
u e t i
This function sets the DNS servers IP address.
Q ide
Prototype
f
Parameters
n
contextid:
o
[in] PDP context ID that is specified when calling Ql_GPRS_Activate.
C
firstAddr:
[in] A u32 integer that stores the IPv4 address.
secondAddr:
[in] A u32 integer that stores IPv4 address.
Return Value
If no error occurs, this return value will be SOC_SUCCESS (0). Otherwise, a value of Enum_SocError is
returned.
5.9.1. Overview
Socket program implements the TCP and UDP protocols. In OpenCPU, developer uses the API functions
to program TCP/UDP, instead of AT commands. Each PDP context supports at most 6 client socket
connections and 5 server socket connections.
l
5.9.2. Usage
t e
5.9.2.1. TCP Client Socket Usage
c a l
The following steps tell how to work with tcp client socket:
e t i
Step 1: Register. Call function Ql_SOC_Register to register the socket-related callback functions.
u
Step 2: Create socket. Call function Ql_SOC_Create to create a socket. The contextId argument
n
shoulbe be same as Ql_GPRS_Register uses, and the socketType should be set
Q ide
as SOCK_TCP.
Step 3: Connet to socket. Call Ql_SOC_Connect to request a socket connection. The
callback_socket_connect function will be invoked whether the connection is successful or not.
f
Step 4: Send data to socket. Call function Ql_SOC_Send to send data. After the data is sent out and
you can call Ql_SOC_GetAckNumber function to check whether the data is received by the
n
server. If Ql_SOC_Send retruns SOC_WOULDBLOCK the App must wait
callback_socket_write Function to send data again.
o
Step 5: Receive data from socket. When theres data coming from the socket the
Callback_socket_read function will be invoked to inform App, When received the notificatioin,
C
App may call Ql_SocketRecv to receive the data. App must read out all of the data. Otherwise,
the callback function will not be invoked when new data comes.
Step 6: Close socket. Call function Ql_SOC_Close to close the socket. App can call function
Ql_SOC_Close to close the socket. When App receives the notification that server side has
closed the socket, App has to call Ql_SOC_Close to close the socket from client side.
The following steps tell how to work with the TCP Server:
Step 1: Register. Call function Ql_SOC_Register to register the socket-related callback functions.
Step 2: Create Socket. Call function Ql_SOC_Create to create a socket.
Step 3: Bind. Call function Ql_SOC_Bind to associates a local address with a socket.
Step 4: Listen. Call function Ql_SOC_Listen to start to listen to the connection request from listening
port.
Step 5: Accept connection request. When a connection request comes, callback_socket_accept will
beinvoked to inform App. App can call function Ql_SOC_Accept to accept the connection
request.
Step 6: Send data to socket. Call function Ql_SOC_Send to send data to socket. After the data is sent
out and you can call Ql_SOC_GetAckNumber function to check whether the data is received by
the client. When this function retruns SOC_WOULDBLOCK, the App has to wait till
callback_socket_write is invoken, and then App can continue to send data.
Step 7: Receive data from socket. When data comes from the socketthe Callback_socket_read will
be invoked to inform App, App can call Ql_SocketRecv to receive the data. App must read out all
l
of the data. Otherwise, the callback function will not be invoked when new data comes.
Step 8: Close socket. Call function Ql_SOC_Close to close the socket. App can call function
e
Ql_SOC_Close to close the socket. When App receives the notification that client side has
t
closed the socket, App has to call Ql_SOC_Close to close the socket from server side.
e c
5.9.2.3. UDP Service Socket Usage
ia l
u n t
The following steps tell how to work with UDP Server:
Q ide
Step 1: Register. Call function Ql_SOC_Register to register the socket-related callback functions.
Step 2: Create socket. Call function Ql_SOC_Create to create a socket. The contextId argument
shoulbe be same as Ql_GPRS_Register uses, and the socketType should be set
f
as SOCK_UDP.
Step 3: Bind. Call function Ql_SOC_Bind to associates a local address with a socket.
n
Step 4: Send data to socket. Call function Ql_SOC_SendTo to send data. When this function retruns
o
SOC_WOULDBLOCK, the App has to wait till callback_socket_write is invoken, and then App
can continue to send data.
C
Step 5: Receive data from socket. When data comes from the socket, the Callback_socket_read
function will be invoked to inform App and App can call Ql_SocketRecvFrom to receive the data.
App must read out all of the data. Otherwise, the callback function will not be invoked when new
data comes.
Step 6: Close socket. Call function Ql_SOC_Close to close the socket. App can call function
Ql_SOC_Close to close the socket.
5.9.3.1. Ql_SOC_Register
Prototype
typedef struct {
void (*callback_socket_connect)(s32 socketId, s32 errCode, void* customParam );
void (*callback_socket_close)(s32 socketId, s32 errCode, void* customParam );
void (*callback_socket_accept)(s32 listenSocketId, s32 errCode, void* customParam );
void (*callback_socket_read)(s32 socketId, s32 errCode, void* customParam );
void (*callback_socket_write)(s32 socketId, s32 errCode, void* customParam );
}ST_SOC_Callback;
el
Parameters
t
cb:
c l
[in] The pointer of the socket-related callback function.
e ia
customParam:
u t
[in] One customized parameter that can be passed into the callback functions.
Q ide n
5.9.3.2. Callback_Socket_Connect
This callback function is invoked by Ql_SocketConnect when the return value of Ql_SocketConnect is
f
SOC_WOULDBLOCK .
n
Prototype
o
typedef void(*callback_socket_connect)(s32 socketId, s32 errCode, void* customParam)
C
Parameters
socketId:
[Out] Socket id that is returned when calling Ql_SOC_Create.
errCode:
[Out] Error code.
customParam:
[Out] Customize parameter.
5.9.3.3. Callback_Socket_Close
This callback function will be invoked when the socket connection is closed by the remote side.This
function is valid for TCP socket only. And if the socket connection is closed by the module, this function
will not be invoked.
Prototype
l
Parameters
e
socketId:
t
[Out] Socket ID that is returned when calling Ql_SOC_Create.
c l
errCode:
e ia
[Out] Error code.
u t
customParam:
n
[Out] Customize parameter.
Q ide
5.9.3.4. Callback_Socket_Accept
f
Accept a connection on a socket when module is a server. This function is valid when the module is used
n
as TCP server only.
o
Prototype
C
typedef void(*callback_socket_accept)(s32 listenSocketId, s32 errCode, void* customParam)
Parameters
listenSocketId :
[Out] Socket ID that is returned when calling Ql_SOC_Create.
error_code:
[Out] Error code.
customParam:
[Out] Customize parameter.
Return Value
None.
5.9.3.5. Callback_Socket_Read
This function will be invoked when received data from the socket. Then you can read the data via
Ql_SOC_Recv (for TCP) or Ql_SOC_RecvFrom(for UDP) APIs.
Prototype
l
typedef void(*callback_socket_read)(s32 socketId, s32 errCode, void* customParam)
t e l
Parameters
c a
socketId:
e i
[Out] Socket ID that is returned when calling Ql_SOC_Create.
u t
error_code:
n
[Out] Error code.
Q ide
customParam:
[Out] Customize parameter.
f
Return Value
n
None.
Co
5.9.3.6. Callback_Socket_Write
When the return value of Ql_SOC_Send is SOC_WOULDBLOCK, this callback function will be invoked to
enable application to continue to send TCP data.
Prototype
Parameters
socketId:
[Out] Socket ID that is returned when calling Ql_SOC_Create.
errCode:
[Out] Error code.
customParam:
[Out] Customize parameter.
Return Value
None.
l
5.9.3.7. Ql_SOC_Create
t e
This function creates a socket with the specified socket id on the specified PDP context.
c l
Prototype
e t ia
s32 Ql_SOC_Create(u8 contextId, u8 socketType)
u n
Q ide
Parameters
contextId:
[in] PDP context ID that is specified when calling Ql_GPRS_Activate. This parameter maybe is0 or 1.
f
socketType :
n
[in] This parameter is one of Enum_SocketType:
o
typedef enum{
SOCK_TCP = 0, /* stream socket, TCP */
C
SOCK_UDP, /* datagram socket, UDP */
} Enum_SocketType;
Return Value
The return value is the socket id, Otherwise, a value of Enum_SocError is returned. The possible
returned values are as follow:
5.9.3.8. Ql_SOC_Close
Prototype
Parameters
socketId:
l
[in] Socket ID that is returned when calling Ql_SOC_Create.
t e
Return Value
c l
This return value will be SOC_SUCCESS (0) if the function succeeds. Otherwise, a value of
a
Enum_SocError is returned.
u e
5.9.3.9. Ql_SOC_Connect
n t i
Q ide
This function establishes a socket connection to the host. The host is specified by an IP address and a
port number. This function is used for the TCP client only. The connecting processing will take some time,
and the longest time is 75 seconds, which depends on the network quality. When the TCP socket
f
connection succeeds, the callback_socket_connect callback function will be invoked.
n
Prototype
o
s32 Ql_SOC_Connect(s32 socketId, u32 remoteIP, u16 remotePort)
C
Parameters
socketId:
[in] Socket ID that is returned when calling Ql_SOC_Create.
remoteIP:
[in] Peer IPv4 address.
remotePort:
[in] Peer IPv4 port.
Return Value
This return value will be SOC_SUCCESS (0) if the function succeeds. Otherwise, a value of
5.9.3.10. Ql_SOC_ConnectEx
This function establishes a socket connection to the host. The host is specified by an IP address and a
l
port number. This function is used for the TCP client only. The connecting processing will take some time,
and the longest time is 75 seconds, which depends on the network quality. After the TCP socket
t e
connection succeeds or fails, this function returns, and the callback_socket_connect callback function will
l
not be invoked.
e c a
This function supports two modes:
u t i
Non-blocking Mode
n
When the "isBlocking" is set to FALSE, this function works under non-blocking mode. The result will be
Q ide
returned even if the operation is not done, and the result will be reported in callback.
Blocking Mode
f
When the isBlocking is set to TRUE, this function works under blocking mode. The result will be returned
only after the operation is done.
o n
If working under non-blocking mode, this function is same as Ql_SOC_Connect() functionally.
C
Prototype
Parameters
socketId:
[in] Socket ID that is returned when calling Ql_SOC_Create.
remoteIP:
[in] Peer IPv4 address.
remotePort:
[in] Peer IPv4 port.
isBlocking
[in] Blocking mode. TRUE=blocking mode, FALSE=non-blocking mode.
Return Value
This return value will be SOC_SUCCESS (0) if the function succeeds. Otherwise, a value of
Enum_SocError is returned.The possible returned values are as follow:
el
5.9.3.11. Ql_SOC_Send
c t l
This function sends data to a host which already connected previously. It is used for TCP socket only. If
a
you call Ql_SOC_Send function sends to many data to the socket buffer, this function will return
e i
SOC_WOULDBLOCK. Then you must stop sending data. After the socket buffer has enough space, the
t
callback_socket_write callback function will be called, and you can continue to send the data. This
u
function just sends the data to the network, whether the data received by the server is unknown. So
n
maybe you need call Ql_SOC_GetAckNumber function to check the data is received by the server.
Q ide
Prototype
f
s32 Ql_SOC_Send(s32 socketId, u8* pData, s32 dataLen)
n
Parameters
o
socketId:
[in] Socket ID that is returned when calling Ql_SOC_Create.
C
pData:
[in] Pointer to the data to send.
dataLen:
[in] Number of bytes to send.
Return Value
If no error occurs, Ql_SOC_Send returns the total number of bytes sent, which can be less than the
number requested to be sent in the dataLen parameter. Otherwise, a value of Enum_SocError is
returned.
NOTES
1. The application should call Ql_SOC_Send circularly to send data till all the data in pData are sent
out. If the number of bytes actually sent is less than the number requested to be sent in the dataLen
parameter, the application should keep sending out the left data.
2. If the Ql_SocketSend returns a negative number, but not SOC_WOULDBLOCK, which indicates
some error happened to the socket, the application has to close the socket by calling
Ql_SocketClose and reestablish a connection to the socket. If the return value is
SOC_WOULDBLOCK, embedded application should stop sending data, and wait for the
Ql_Callback_socket_write() to be invoked to continue to send data.
el
5.9.3.12. Ql_SOC_Recv
c t l
This function receives the TCP socket data from a connected or bound socket. When the TCP data
comes from the network, the callback_socket_read function will be called. You can use Ql_SOC_Recv to
e ia
read the data cyclically until it returns SOC_WOULDBLOCK in the callback function. The
t
callback_socket_read function will be called if the new data from the network again.
u n
Prototype
Q ide
s32 Ql_SOC_Recv(s32 socketId, u8* pData, s32 dataLen)
f
Parameters
n
socketId:
[in] Socket ID that is returned when calling Ql_SOC_Create.
o
pData:
C
[Out] Point to a buffer that is the storage space for the received data.
dataLen:
[Out] Length of pData, in bytes.
Return Value
If no error occurs, Ql_SOC_Recv returns the total number of bytes received. Otherwise, a value of
Enum_SocError is returned.
NOTES
1. The application should call Ql_SOC_Recv circularly in the callback_socket_read function to receive
data and do data processing work till the SOC_WOULDBLOCK is returned.
2. If this function returns 0, which indicates the server closed the socket, the application has to close the
socket by calling Ql_SOC_Close and reestablish a connection to the socket.
3. If the Ql_SOC_Recv returns a negative number, but not SOC_WOULDBLOCK, which indicates
some error happened to the socket, the application has to close the socket by calling
Ql_SOC_Close and reestablish a connection to the socket.
5.9.3.13. Ql_SOC_GetAckNumber
l
Prototype
t e
s32 Ql_SOC_GetAckNumber (s32 socketId, u64* ackNum)
c a l
e
Parameters
t i
socketId:
u
[in] Socket ID that is returned when calling Ql_SOC_Create.
Q ide n
ackNum:
[Out] Point to an u64 type that is the storage space for the TCP ACK number.
f
Return Value
If no error occurs, this return value will be SOC_SUCCESS (0). Otherwise, a value of Enum_SocError is
n
returned.
Co
5.9.3.14. Ql_SOC_SendTo
Prototype
s32 Ql_SOC_SendTo(s32 socketId, u8* pData, s32 dataLen, u32 remoteIP, u16 remotePort)
Parameters
socketId:
[in] Socket ID that is returned when calling Ql_SOC_Create.
pData:
[in] Buffer containing the data to be transmitted.
dataLen:
[in] Length of the data in pData, in bytes.
remoteIP:
[in] Pointer to the address of the target socket.
remotePort:
[in] The target port number.
l
Return Value
t e
If no error occurs, this function returns the number of bytes actually sent. Otherwise, a value of
l
Enum_SocError is returned.
e c
5.9.3.15. Ql_SOC_RecvFrom
t ia
u n
This function receives a datagram data through UDP socket.
Q ide
Prototype
f
s32 Ql_SOC_RecvFrom(s32 socketId, u8* pData, s32 recvLen, u32* remoteIP, u16* remotePort)
n
Parameters
o
socketId:
[in] Socket ID that is returned when calling Ql_SOC_Create.
C
pData:
[Out] Buffer to store the received data.
rcvLen:
[Out] Length of pData, in bytes.
remoteIP:
[Out] An optional pointer to a buffer that receives the address of the connecting entity.
remotePort:
[Out] An optional pointer to an integer that contains the port number of the connecting entity.
Return Value
If no error occurs, this function returns the number of bytes received. Otherwise, a value of
Enum_SocError is returned.
5.9.3.16. Ql_SOC_Bind
Prototype
l
s32 Ql_SOC_Bind(s32 socketId, u16 localPort)
t e l
Parameters
c a
socketId:
e i
[in] Socket ID that is returned when calling Ql_SOC_Create.
u t
localPort:
n
[in] Socket Local port number.
Q ide
Return Value
If no error occurs, this function returns SOC_SUCCESS (0). Otherwise, a value of Enum_SocError is
f
returned.
o n
5.9.3.17. Ql_SOC_Listen
C
This function places a socket in a state in which it is listening for an incoming connection.
Prototype
Parameters
listenSocketId:
[in]Socket ID that is returned when calling Ql_SOC_Create.
maxClientNum:
[in] Maximum connection number. Limiting the maximum length of the request queue. The maximum is 5.
Return Value
If no error occurs, this function returns SOC_SUCCESS (0). Otherwise, a value of Enum_SocError is
returned.
5.9.3.18. Ql_SOC_Accept
This function permits an incoming connection attempt on a socket. When the TCP server is started, and
there is a client coming, the callback_socket_accept function will be called. App can call this function in
the callback_socket_accept function to accept the connection request.The socket ID is allocated by the
l
O.S.
e
Prototype
c t l
s32 Ql_SOC_Accept(s32 listenSocketId, u32 * remoteIP, u16* remotePort)
e ia
t
Parameters
u
listenSocketId:
n
[in] The listen socket id.
Q ide
remoteIP:
[Out] An optional pointer to a buffer that receives the address of the connecting entity.
f
remotePort:
n
[Out] An optional pointer to an integer that contains the port number of the connecting entity.
o
Return Value
C
If no error occurs, this function returns a socket Id, which is greater than or equal to zero. Otherwise, a
value of Enum_SocError is returned.
Prototype
Parameters
contextId:
[in] OpenCPU supports two PDP-contexts to the destination host at a time. This parameter can be 0 or 1.
requestId:
l
[Out] Embedded in response message.
e
hostname:
t
[in] The host name.
c l
callback_getIpByName:
e ia
[in] This callback is called by Core System to notify whether this function retrieves host IP successfully or
t
not.
u n
errCode:
Q ide
[Out] Error code if fail ipAddrCnt:
[Out] Get address number.
f
ipAddr:
[Out] The host IPv4 address.
n
Return Value
o
If no error occurs, this return value will be SOC_SUCCESS (0). Otherwise, a value of Enum_SocError is
C
returned.However, if the SOC_WOULDBLOCK is returned, the application will have to wait till the
callback_getipbyname is called to know whether this function retrieves host IP successfully or not.
5.9.3.20. Ql_IpHelper_ConvertIpAddr
This function checks whether an IP address is valid IP address or not. If yes, each segment of the IP
address string will be converted into integer to store in ipaddr parameter.
Prototype
Parameters
addressstring:
[in] IP address string.
ipaddr:
[Out] Pointer to u32, each byte stores the IP digit converted from the corresponding IP string.
Return Value
l
SOC_SUCCESS: The IP address string is a valid IP address.
SOC_ERROR: The IP address string is invalid.
e
SOC_INVAL: Invalid argument.
c
5.9.4. Possible Error Codes
t a l
e t i
The error codes are enumerated in the Enum_SocError as below.
u n
typedef enum
{
Q ide
SOC_SUCCESS = 0,
SOC_ERROR = -1,
SOC_WOULDBLOCK = -2,
f
SOC_LIMIT_RESOURCE = -3, /* limited resource */
SOC_INVALID_SOCKET = -4, /* invalid socket */
n
SOC_INVALID_ACCOUNT = -5, /* invalid account id */
o
SOC_NAMETOOLONG = -6, /* address too long */
SOC_ALREADY = -7, /* operation already in progress */
SOC_OPNOTSUPP = -8, /* operation not support */
C
SOC_CONNABORTED = -9, /* Software caused connection abort */
SOC_INVAL = -10, /* invalid argument */
SOC_PIPE = -11, /* broken pipe */
SOC_NOTCONN = -12, /* socket is not connected */
SOC_MSGSIZE = -13, /* msg is too long */
SOC_BEARER_FAIL = -14, /* bearer is broken */
SOC_CONNRESET = -15, /* TCP half-write close, i.e., FINED */
SOC_DHCP_ERROR = -16,
SOC_IP_CHANGED = -17,
SOC_ADDRINUSE = -18,
SOC_CANCEL_ACT_BEARER = -19 /* cancel the activation of bearer */
} Enum_SocErrCode;
5.9.5. Example
t el
c l
OpenCPU provides FOTA (Firmware Over The Air) function that can upgrade App remotely. The related
e ia
API functions are defined & described in this section, and demonstrates how to program with FOTA.
u n t
5.11.1. Usage
Q ide
Please refer to the document Quectel_OpenCPU_FOTA_Application_Note for the complte
applicationsolution.
f
5.11.2. API Functions
o n
5.11.2.1. Ql_FOTA _Init
C
Initialise FOTA related functions. It is a simple API. Programer only needs to pass the simple parameters
to this API.
Prototype
Parameters
pFotaCfg:
[in] A pointer to to ST_FotaConfig.
el
Return Value
t
QL_RET_OK: indicates the function successes.
c l
QL_RET_ERR_PARAM: indicates parameter error.
a
Ql_RET_NOT_SUPPORT: indicates not support this function.
e i
Ql_RET_ERR_RAWFLASH_UNKNOW: indicates unkown error.
u n t
Q ide
5.11.2.2. Ql_FOTA_WriteData
This function writes the delta data of applications to the special space in the module.
f
Prototype
n
s32 Ql_FOTA_WriteData(s32 length, s8* buffer)
o
Parameters
C
length:
[in] The length of writing (Unit: Bytes).recommend 512 bytes
buffer:
[in] A pointer to the data buffer.
Return Value
5.11.2.3. Ql_FOTA_ReadData
l
This function reads data from the data region which Ql_FOTA_WriteData writes to. If Developer needs to
check the whole data package after writing, this API can read back the data.
t e l
Prototype
e c a
s32 Ql_FOTA_ReadData(u32 offset, u32 len, u8* pBuffer)
u t i
Parameters
Q ide n
offset:
[in] The offset value to the data region
len:
f
[in] The length to read (Unit: Byte).recommend 512 bytes
n
pBuffer:
o
[Out] Point to the buffer to store read data.
C
Return Value
5.11.2.4. Ql_FOTA_Finish
Compare calculated checksum with image checksum in the header after whole image is written.
Prototype
s32 Ql_FOTA_Finish(void)
Parameters
None.
Return Value
l
Ql_RET_ERR_RAWFLASH_INVLIDBLOCKID: indicates block id invalid.
e
Ql_RET_ERR_RAWFLASH_PARAMETER: indicates parameter error.
t
Ql_RET_ERR_RAWFLASH_ERASEFlASH: indicates erase flash failure.
l
Ql_RET_ERR_RAWFLASH_WRITEFLASH: indicates written flash failure.
c
Ql_RET_ERR_RAWFLASH_READFLASH: indicates read flash failure.
e ia
Ql_RET_ERR_RAWFLASH_MAXLENGATH: indicates the data length too large.
u n t
5.11.2.5. Ql_FOTA_Update
Q ide
Starts FOTA Update.
f
Prototype
n
s32 Ql_FOTA_Update(void);
o
Parameters
C
None.
Return Value
5.11.3. Example
l
int iReadSize=0;
int iReadLen=0;
e
int hFile=-1;
t l
char buf[512];
c
char *p=NULL;
a
static int s_iSizeRem=0;
u e t i
//1. Init some param.
n
Ql_memset((void *)(&FotaConfig), 0, sizeof(ST_FotaConfig)); //Do not enable watch_dog
FotaConfig.Q_gpio_pin1=0;
Q ide
FotaConfig.Q_feed_interval1=100;
FotaConfig.Q_gpio_pin2=26;
FotaConfig.Q_feed_interval2=500;
f
//2. Begin, check the Bin file.
n
iRet=Ql_FS_GetSize((u8 *)g_AppBinFile); //Get the size of upgrade file from file system
o
if(iRet <QL_RET_OK)
{
//The file does not exist
C
return -1;
}
{
return -1;
}
Ql_Debug_Trace("Ql_Fota_Init OK!\r\n");
while(iFileSize > 0)
{
Ql_memset(buf, 0, sizeof(buf));
if (iFileSize <=READ_SIZE)
{
iReadSize=iFileSize;
l
}
else
e
{
t
iReadSize=READ_SIZE;
c l
}
a
iRet=Ql_FS_Read(hFile, buf, iReadSize, &iReadLen); //read upgrade data from file system
e i
if(QL_RET_OK != iRet)
u t
{
n
Ql_Debug_Trace("Read file failed!(iRet = %x)\r\n", iRet);
return -1;
Q ide
}
//Write upgrade data to FOTA Cache region
iRet=Ql_FOTA_WriteData(iReadSize,(s8*)buf);
f
if(QL_RET_OK !=iRet)
{
n
Ql_Debug_Trace(Fota write file failed!(iRet=%d)\r\n", iRet);
o
return -1;
}else
{
C
s_iSizeRem +=iReadSize;
}
iFileSize -= iReadLen;
Ql_Sleep(5); //Sleep 5 ms for outputing catcher log!!!
}
Ql_FS_Close(hFile);
iRet=Ql_FOTA_Finish(); //Finish the upgrade operation ending with calling this API
iRet=Ql_FOTA_Update(); //Update flag fields in the FOTA Cache.
if(QL_RET_OK != iRet) //If this function succeeds, the module will automatically restart
{
Ql_Debug_Trace("[max] Ql_Fota_Update failed!(iRet=%d)\r\n", iRet);
return -1;
}
return 0;
}
Please refer to the example_fota_ftp.c, example_fota_http.c for the complete sample code in
SDK\example\.
The head file ql_trace.h must be included so that the debug functions can be called. All examples in
l
OpenCPU SDK show the proper usages of these APIs.
t e
5.12.1. Usage
c a l
There are two working modes for UART2 (DEBUG port): BASE MODE and ADVANCE MODE.
e i
Developers can config the working mode of UART2 by the debugPortCfg variable in the
t
custom_sys_cfg.c file. See also [4.4].
u n
static const ST_DebugPortCfg debugPortCfg = {
Q ide
BASIC_MODE //Set the serial debug port (UART2) to a common serial port
//ADVANCE_MODE //Set the serial debug port (UART2) to a special debug port
};
f
Under basic mode, application debug messages will be output as text through UART2 port. And the
n
UART2 port works as common serial port with RX, TX and GND. This time UART2 can be common serial
port for application.
o
Under advance mode, both application debug messages and system debug messages will be output
C
through UART2 port with special format. The Catcher Tool provided by Quectel can be used to capture
and analyze these messages. Usually developer doesnt need to use ADVANCE_MODE without the
requirements from support engineer. If needed, please refer to the document "Catcher_Operation_UGD"
for the usage of the special debug mode.
5.12.2.1. Ql_Debug_Trace
This function formats and prints a series of characters and values through the debug serial port (UART2).
Its function is same as the standard sprintf.
Prototype
Parameter
format:
Point to a null-terminated multibyte string which specifies how to interpret the data. The maximum
string length is 512 bytes.
l
%type
type, a character that determines whether the associated argument is interpreted as a character, a string,
e
or a number.
c t a l
Table 7: Format Specification for String Print
u e t i
Character Type Output Format
n
c int Specifies a single-byte character.
Q ide
d int Signed decimal integer.
f
x int Unsigned hexadecimal integer, using "abcdef."
n
f double Float point digit.
o
p Pointer to void Prints the address of the argument in hexadecimal digits.
C
Return Value
NOTES
1. The string to be printed must not be larger than the maximum number of bytes allowed in buffer;
otherwise, a buffer overrun can occur.
2. The maximum allowed number of characters to output is 512.
3. To print a 64-bit integer, please first convert it to characters using Ql_sprintf(), and then print the
characters of the 64-bit integer.
5.13.1. AT API
l
5.13.1.1. Ql_RIL_SendATCmd
t e
This function is used to send AT command with the result being returned synchronously. Before this
c l
function returns, the responses for AT command will be handled in the callback function atRsp_callback,
a
and the paring results of AT responses can be stored in the space that the parameter userData points to.
e i
All AT responses string will be passed into the callback line by line. So the callback function may be called
t
for times.
u n
Prototype
Q ide
s32 Ql_RIL_SendATCmd(char* atCmd,
u32 atCmdLen,
Callback_ATResponse atRsp_callback,
f
void* userData,
n
u32 timeout
);
o
typedef s32 (*Callback_ATResponse)(char* line, u32 len, void* userdata);
C
Parameter
atCmd:
[in]AT command string.
atCmdLen:
[in]The length of AT command string.
atRsp_callBack:
[in]Callback function for handling the response of AT command.
userData:
[out]Used to transfer the customer's parameter.
timeOut:
[in]Timeout for the AT command, unit in ms. If it is set to 0, RIL uses the default timeout time (3min).
Return Value
el
Default Callback Function
t
If this callback parameter is set to NULL, a default callback function will be called. But the default callback
c l
function only handles the simple AT response. Please see Default_atRsp_callback in ril_atResponse.c.
e ia
The following codes are the implementation for default callback function.
u n t
s32 Default_atRsp_callback(char* line, u32 len, void* userdata)
{
Q ide
if (Ql_RIL_FindLine(line, len, "OK"))// find <CR><LF>OK<CR><LF>, <CR>OK<CR><LF>OK<LF>
{
return RIL_ATRSP_SUCCESS;
f
}
else if (Ql_RIL_FindLine(line, len, "ERROR") // find <CR><LF>ERROR<CR><LF>,
n
<CR>ERROR<CR><LF>ERROR<LF>
o
|| Ql_RIL_FindString(line, len, "+CME ERROR:")//fail
|| Ql_RIL_FindString(line, len, "+CMS ERROR:"))//fail
{
C
return RIL_ATRSP_FAILED;
}
return RIL_ATRSP_CONTINUE; //continue to wait
}
This section defines telephony related API functions that are implemented bassed on OpenCPU RIL.
These APIs imeplement the same functionas as AT commands: ATD, ATA, ATH.
5.13.2.1. RIL_Telephony_Dial
Prototype
Parameter
type:
l
[In] Must be 0 , just support voice call.
t e
phoneNumber:
l
[In] Phone number, null-terminated string.
e c ia
result:
t
[Out] Result for dial, one value of Enum_CallState.
u n
Return Value
Q ide
RIL_AT_SUCCESS, send AT successfully.
RIL_AT_FAILED, send AT failed.
RIL_AT_TIMEOUT, send AT timeout.
f
RIL_AT_BUSY, sending AT.
RIL_AT_INVALID_PARAM, invalid input parameter.
n
RIL_AT_UNINITIALIZED, RIL is not ready, need to wait for MSG_ID_RIL_READY and then call
o
Ql_RIL_Initialize to initialize RIL.
C
5.13.2.2. RIL_Telephony_Answer
Prototype
Parameter
result:
[Out] Result for dial, one value of Enum_CallState.
Return Value
5.13.2.3. RIL_Telephony_Hangup
el
This function hangs up the current call.
c t l
Prototype
e ia
s32 RIL_Telephony_Hangup(void);
u n t
Parameter
Q ide
None.
Return Value
f
RIL_AT_SUCCESS, send AT successfully.
n
RIL_AT_FAILED, send AT failed.
RIL_AT_TIMEOUT, send AT timeout.
o
RIL_AT_BUSY, sending AT.
RIL_AT_INVALID_PARAM, invalid input parameter.
C
RIL_AT_UNINITIALIZED, RIL is not ready, need to wait for MSG_ID_RIL_READY and then call
Ql_RIL_Initialize to initialize RIL.
This section defines short message related API functions that are implemented bassed on OpenCPU RIL.
These APIs imeplement the same functionas as AT commands: AT+CMGR, AT+CMGS, AT+CMGD and
etc.
5.13.3.1. RIL_SMS_ReadSMS_Text
This function reads a short message of text format with the specified index.
Prototype
Parameter
l
<uIndex>:
[In] The SMS index in current SMS storage
t e
<eCharset>:
c l
[In] Character set enum value
e ia
<pTextInfo>
t
[In] The pointer of TEXT SMS info
u n
Return Value
Q ide
RIL_AT_SUCCESS, send AT successfully.
RIL_AT_FAILED, send AT failed.
RIL_AT_TIMEOUT, send AT timeout.
f
RIL_AT_BUSY, sending AT.
RIL_AT_INVALID_PARAM, invalid input parameter.
n
RIL_AT_UNINITIALIZED, RIL is not ready, need to wait for MSG_ID_RIL_READY and then call
o
Ql_RIL_Initialize to initialize RIL.
C
5.13.3.2. RIL_SMS_ReadSMS_PDU
This function reads a short message of PDU format with the specified index.
Prototype
Parameter
<index>:
[In] The SMS index in current SMS storage
<pduInfo>:
[In] The pointer of 'ST_RIL_SMS_PDUInfo' data
Return Value
t el
5.13.3.3. RIL_SMS_SendSMS_Text
c a l
This function sends a short message of text format.
e t i
Prototype
u n
s32 RIL_SMS_SendSMS_Text(char* pNumber, u8 uNumberLen, LIB_SMS_CharSetEnum eCharset, u8*
Q ide
pMsg, u32 uMsgLen,u32 *pMsgRef);
Parameter
f
<pNumber>:
[In] The pointer of phone number
o n
<uNumberLen>:
[In] The length of phone number
C
<eCharset>
[In] CharSet, its value is same as 'LIB_SMS_CharSetEnum'
<pMsg>
[In] The pointer of message content
<uMsgLen>
[In] The length of message content
<pMsgRef>
[Out] The pointer of message reference number
Return Value
5.13.3.4. RIL_SMS_SendSMS_PDU
el
This function sends a short message of PDU format.
c t l
Prototype
e ia
s32 RIL_SMS_SendSMS_PDU(char* pPDUStr,u32 uPDUStrLen,u32 *pMsgRef);
u n t
Parameter
Q ide
<pPDUStr>:
[In] The pointer of PDU string
f
<uPDUStrLen>:
[In] The length of PDU string
n
<pMsgRef>
o
[Out] The pointer of message reference number
C
Return Value
5.13.3.5. RIL_SMS_DeleteSMS
This function deletes one short message or messages in current SMS storage with the specified rule.
Prototype
Parameter
index:
l
[In] The index number of SMS message.
t e
flag:
l
[In] Delete flag, which is one value of 'Enum_RIL_SMS_DeleteFlag'.
e c ia
Return Value
u t
RIL_AT_SUCCESS, send AT successfully.
n
RIL_AT_FAILED, send AT failed.
RIL_AT_TIMEOUT, send AT timeout.
Q ide
RIL_AT_BUSY, sending AT.
RIL_AT_INVALID_PARAM, invalid input parameter.
RIL_AT_UNINITIALIZED, RIL is not ready, need to wait for MSG_ID_RIL_READY and then call
f
Ql_RIL_Initialize to initialize RIL.
n
5.13.4. SIM Card and Network Related API
o
The API functions in this section are declared in ril_network.h.
C
5.13.4.1. RIL_NW_GetSIMCardState
Prototype
Parameter
stat:
[out]SIM card State.
Return Value
SIM card state code, one value of Enum_SIMState. -1 will be returned if fail to get the SIM card state.
5.13.4.2. RIL_NW_GetGSMState
Prototype
l
s32 RIL_NW_GetGSMState(s32 *stat);
t e
Parameter
c l
stat:
a
[out]GSM State.
e t i
Return Value
u n
One value of Enum_NetworkState: network register state code. -1: fail to get the network state.
Q ide
5.13.4.3. RIL_NW_GetGPRSState
f
This function gets the GPRS network register state.
n
Prototype
o
s32 RIL_NW_GetGPRSState(s32 *stat);
C
Parameter
stat:
[out]GPRS State.
Return Value
One value of Enum_NetworkState: network register state code. -1: fail to get the network state.
5.13.4.4. RIL_NW_GetSignalQuality
This function gets the signal quality level and bit error rate.
Prototype
Parameter
rssi:
l
[out] Signal quality level, 0~31 or 99. 99 indicates module doesn't register to GSM network.
t e
ber:
l
[out] The bit error code of signal.
e c ia
Return Value
u t
QL_RET_OK indicates success.
n
QL_RET_ERR_INVALID_PARAMETER indicates something wrong for input parameters.
Q ide
5.13.4.5. RIL_NW_SetGPRSContext
f
This function sets a PDP foreground context.
n
Prototype
o
s32 RIL_NW_SetGPRSContext(u8 foregroundContext);
C
Parameter
foregroundContext
[IN] Anumeric indicates which context will be set as foreground context.The range is 0-1.
Return Value
5.13.4.6. RIL_NW_SetAPN
Prototype
Parameter
mode:
l
[IN] 0 for CSD, 1 for GPRS.
t e
apn:
l
[IN] apn string.
e c ia
userName:
t
[IN] user name.
u n
password:
Q ide
[IN] password for APN.
Return Value
f
QL_RET_OK indicates success.
QL_RET_ERR_INVALID_PARAMETER indicates something wrong for input parameters.
o n
5.13.5. GSM location API
C
The API functions in this section are declared in ril_location.h.
5.13.5.1. RIL_GetLocation
This function retrieves the longitude and latitude of the current place which module is in.
Prototype
Parameter
cb_loc:
pointer to a callback function that tells the location information.
Return Value
l
The API functions in this section are declared in ril_system.h.
c t e l
5.13.6.1. Ql_SecureData_Store
e ia
This function can be used to store some critical user data to prevent them from losing.
u n t
NOTES
Q ide
1. OpenCPU has designed 13 blocks of system storage space to backup critical user data. Developer
may specify the first parameter index [1-13] to specify different storage block. Among the storage
blocks, 1~8 blocks can store 50 bytes for each block, 9~12 blocks can store 100 bytes for each
f
block, and the 13th block can store 500 bytes.
2. User should not call this API function frequently, which is not good for life cycle of flash.
o n
Prototype
C
s32 Ql_SecureData_Store(u8 index , u8* pData, u32 len);
Parameter
index:
[in] the index of the secure data block. The range is: 1~13.
pData:
[in] The data to be backed up. In 1~8 groups, every group can save 50 bytes at most. In 9~12 groups,
every group can save 100 bytes at most. If index is 13, the user data can save 500 bytes at most.
len:
[in] The length of the user data. When the index is (1~8), then len<=50. When the index is (9~12), then
len<=100. When the index is 13, then len<=500.
Return Value
5.13.6.2. Ql_SecureData_Read
l
Prototype
e
s32 Ql_SecureData_Read(u8 index, u8* pBuffer, u32 len);
Parameter
c t a l
e t i
index:
u
[in] The index of the secure data block. The range is: 1~13.
Q ide n
len:
[in] The length of the user data. When the index is (1~8), then len<=50. When the index is (9~12), then
len<=100. When the index is 13, then len<=500.
f
Return Value
n
If this function succeeds, the real read length is returned.
QL_RET_ERR_PARAM, invalid paramter.
o
QL_RET_ERR_GET_MEM, the heap memory is no enough.
Ql_RET_ERR_UNKOWN, unknown error.
C
5.13.7. System API
5.13.7.1. RIL_QuerySysInitStatus
Prototype
Parameter
SysInitStatus
[Out] system init status. 0/1/2/3, the init status value, one value of "Enum_SysInitState". Please refer to
"AT+QINISTAT" in ATC document for the meanings.
Return Value
l
RIL_AT_INVALID_PARAM, invalid input parameter.
RIL_AT_UNINITIALIZED, RIL is not ready, need to wait for MSG_ID_RIL_READY and then call
e
Ql_RIL_Initialize to initialize RIL.
c t
5.13.7.2. RIL_GetPowerSupply
a l
u e t i
This function queries the battery balance, and the battery voltage.
Q ide
Prototype
f
Parameter
n
capacity:
o
[out] battery balance, a percent, ranges from 1 to 100.
C
voltage:
[out] battery voltage, unit in mV
Return Value
RIL_AT_SUCCESS,send AT successfully.
RIL_AT_FAILED, send AT failed.
RIL_AT_TIMEOUT,send AT timeout.
RIL_AT_BUSY, sending AT.
RIL_AT_INVALID_PARAM, invalid input parameter.
RIL_AT_UNINITIALIZED, RIL is not ready, need to wait for MSG_ID_RIL_READY and then call
Ql_RIL_Initialize to initialize RIL.
6 Appendix
6.1. Reference
l
Table 8: Reference Documents
t e
SN Document Name
c l
[1] Quectel_Mxx_AT_Commands_Manual
e ia
[2] Quctel_Mxx-OpenCPU_Hardware_Design
u t
[3] Quectel_QFlash_User_Guide
n
[4] Quectel_OpenCPU_FOTA_Application_Note
Q ide
[5] OpenCPU_GCC_Installation_Guide
[6] Quectel_OpenCPU_RIL_Application_Note
f
[7] Quectel_OpenCPU_Watchdog_Application_Note
n
[8] Quectel_OpenCPU_Security_Data_Application_Note
App
Core
Co
Table 9: Abbreviations
Abbreviation Description
OpenCPU Application
OS Operating System
KB Kilobytes
l
GPIO General Purpose Input Output
c t e l
u e t ia
Q ide n
n f
Co