Что нового?
По сравнению с предыдущими решениями OpenCPU, новый OpenCPU модуль предоставляет RIL драйвер на уровне User API, который значительно облегчает разработку. Когда разработчик посылает AT команды ядру системы, полученные ответы обрабатываются сперва в RIL, а затем RIL возвращает данные в приложение. Следующий код демонстрирует различия в деталях.
Новое OpenCPU решение:
s32
RIL_NW_GetSignalQuality(u32 * rssi, u32 * ber)
{
s32 retRes = 0;
char strAT[] = "AT+CSQ\0";
ST_CSQ_Reponse pCSQ_Reponse;
// Здесь отправка “AT+CSQ” команды
retRes = Ql_RIL_SendATCmd(strAT,Ql_strlen(strAT), ATResponse_CSQ_Handler,(void*)&pCSQ_Reponse,0);
// Теперь ответ на “AT+CSQ” записывается в pCSQ_Reponse и из нее можно получить значение CSQ
if(RIL_AT_SUCCESS == retRes)
{
*rssi = pCSQ_Reponse.rssi;
*ber = pCSQ_Reponse.ber;
}
return retRes;
}
Ранее используемое OpenCPU решение:
// Здесь отправка “AT+CSQ” команды
void SendAtCmd()
{
s32 ret;
ret = Ql_SendToModem(ql_md_port1, (u8*)"AT+CSQ\r", Ql_strlen("AT+CSQ\r"));
}
//Здесь получаем ответ “AT+CSQ” в главном цикле программы.
void ql_entry( )
{
switch (g_cmd_idx)
{
case 1:// Echo mode off
Ql_sprintf((char *)buffer, "ATE0\n");
while(1)
{
Ql_GetEvent(&g_event);
switch(g_event.eventType)
{
case EVENT_MODEMDATA:
{
//TODO: receive and handle data from CORE through virtual modem port
PortData_Event* pPortEvt = (PortData_Event*)&g_event.eventData.modemdata_evt;
// Here receive URC and the AT response
break;
}
}
}
}
}
Поддержка GCC компилятора
M66 OpenCPU поддерживает бесплатный компилятор GCC от Sourcery CodeBench ARM EABI, а также поддерживает ARM RVCT компилятор. Предыдущий OpenCPU поддерживал лишь RVCT.
Поддержка IDE
M66 OpenCPU поддерживает большое количество инструментов таких, как Source Insight, Eclipse и Microsoft Visual Studio.
Простота конфигурации и инициализации GPIO
M66 OpenCPU предоставляет очень простой метод конфигурации и инициализации GPIO. Далее простой пример кода инициализации пина NETLIGHT. После подачи питания NETLIGHT пин должен быть сконфигурирован как выход с низким уровнем и подтяжкой к нулю.
Имя функции / Название пина / Направление вход-выход / Уровень / Подтяжка GPIO_ITEM ( PINNAME_NETLIGHT, PINDIRECTION_OUT, PINLEVEL_LOW, PINPULLSEL_PULLDOWN)
Кроме того, разработчик может вызвать API функцию перепрограммирования GPIO. Например, вызов QI_GPIO_SetLevel() может изменить логический уровень на пине GPIO.
Простота добавления новой задачи (потока)
Добавить новую задачу стало еще проще, просто добавив ее в “custom_task_cfg.h” файл.
ID имя задачи: Разработчик может определить имя задачи и система будет автоматически определять и присваивать значение.
Размер стека задачи: Диапазон размера стека в пределах от 1 до 10 кбайт, если есть какие-либо операции с файлами в задаче, то размер стека должен быть установлен по меньшей мере в 5 кбайт, чтобы предотвратить переполнение стека.
TASK_ITEM (Proc_main_task, main_task_id, 4*1024, DEFAULT_VALUE1, DEFAULT_VALUE2)
Программирование пина Power Key в приложении
Дадим пример как включать и выключать питание модуля с помощью пина Power Key.
static const ST_PowerKeyCfg pwrkeyCfg = {
{
TRUE, // включение питания по нажатию PWRKEY
TRUE, // выключение питания по нажатию PWRKEY
};
Программирование пина Reset в приложении
EMERG_OFF пин может работать в двух режимах. Один режим “Power Down” и другой “Reset”, который как раз и есть режим по умолчанию:
static const ST_EmergOffCfg emergoffCfg = {
EMERGOFF_RESET
};
В режиме EMERGOFF_RESET по низкому логическом уровню на пине EMERG_OFF модуль сбросится.
В режиме EMERGOFF_POWEROFF по низкому логическом уровню на пине EMERG_OFF модуль выключится.
Язык программирования для пользовательского приложения по умолчанию Си.

static const ST_PowerKeyCfg pwrkeyCfg = {
{
TRUE, // включение питания по низкому уровню на входе PWRKEY
TRUE, // выключение питания по низкому уровню на входе PWRKEY
};