blob: b9a30da07dfd0919208dddd72ff45fecdff4c36e [file] [log] [blame]
/*-----------------------------------------------------------------------------------------------*/
/**
@file ql_sim_test.h
@brief SIM service API
*/
/*-----------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------
Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
mobiletek Wireless Solution Proprietary and Confidential.
-------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------
EDIT HISTORY
This section contains comments describing changes made to the file.
Notice that changes are listed in reverse chronological order.
$Header: $
when who what, where, why
-------- --------- -----------------------------------------------------------------
20241022 yq.wang Created .
-------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include "ql_type.h"
#include "ql_sim.h"
#include "ql_test_utils.h"
static void item_ql_sim_init(void)
{
int ret = 0;
printf("test ql_sim_init: ");
ret = ql_sim_init();
if(ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_deinit(void)
{
int ret = 0;
printf("test ql_sim_deinit: ");
ret = ql_sim_deinit();
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_get_imsi(void)
{
int ret = 0;
char imsi[QL_SIM_IMSI_LENGTH+1] = {0};
int input = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
printf("test ql_sim_get_imsi: \n");
printf("please enter slot(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): \n");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
ret = ql_sim_get_imsi(slot, app_type, imsi, sizeof(imsi));
if (ret == QL_ERR_OK)
{
printf("IMSI: %s\n", imsi);
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_get_iccid(void)
{
int ret = 0;
char iccid[QL_SIM_ICCID_LENGTH+1] = {0};
int input = 0;
QL_SIM_SLOT_E slot;
printf("test ql_sim_get_iccid: \n");
printf("please enter slot(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
ret = ql_sim_get_iccid(slot, iccid, sizeof(iccid));
if (ret == QL_ERR_OK)
{
printf("ICCID: %s\n", iccid);
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_get_phone_num(void)
{
int ret = 0;
char num[QL_SIM_PHONE_NUMBER_MAX+1] = {0};
int input = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
printf("test ql_sim_get_phone_num: \n");
printf("please enter slot(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): \n");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
ret = ql_sim_get_phone_num(slot, app_type, num, sizeof(num));
if (ret == QL_ERR_OK)
{
printf("Phone number: %s\n", num);
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void print_ascii(char *prefix, char *postfix, char *ascii, int len)
{
int i = 0;
printf("%s", prefix);
for (i = 0; i < len; i++)
{
putchar(ascii[i]);
}
printf("%s", postfix);
}
static void item_ql_sim_get_operators(void)
{
int ret = 0;
ql_sim_operator_list_t list = {0};
int input = 0;
QL_SIM_SLOT_E slot;
printf("test ql_sim_get_operators: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
ret = ql_sim_get_operators(slot, &list);
if (ret == QL_ERR_OK)
{
if (0 == list.len)
{
printf("No operators found\n");
}
else
{
int i = 0;
printf("found %d opertators:\n", list.len);
for (i = 0; i < list.len; i++)
{
printf(" #%02d: ", i + 1);
print_ascii("MCC: ", "", list.operators[i].mcc, (int)sizeof(list.operators[i].mcc));
print_ascii(", MNC: ", "\n",list.operators[i].mnc, list.operators[i].mnc_len);
}
}
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_enable_pin(void)
{
int ret = 0;
int len = 0;
char c;
char pin_value[QL_SIM_PIN_MAX*2] = {0};
int input = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
QL_SIM_PIN_E pin;
printf("test ql_sim_enable_pin: \n");
printf("please enter slot(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
printf("please enter pin(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
pin = QL_SIM_PIN_1;
}
else if (2 == input)
{
pin = QL_SIM_PIN_2;
}
else
{
printf("bad pin: %d\n", input);
return;
}
printf("please enter pin value(at most %d digit): ", QL_SIM_PIN_MAX);
if (NULL == fgets(pin_value, sizeof(pin_value), stdin))
{
printf("can not read pin value\n");
return;
}
len = strlen(pin_value);
if ('\n' == pin_value[len-1])
{
pin_value[len-1] = 0;
len--;
}
printf("pin value: %s\n", pin_value);
printf("proceed? [y/n]: ");
c = getchar();
if ('\n' != c)
{
getchar();
}
if ('Y' != c && 'y' != c)
{
printf("abort\n");
return;
}
ret = ql_sim_enable_pin(slot, app_type, pin, pin_value);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_disable_pin(void)
{
int ret = 0;
int len = 0;
char c;
char pin_value[QL_SIM_PIN_MAX*2] = {0};
int input = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
QL_SIM_PIN_E pin;
printf("test ql_sim_disable_pin: \n");
printf("please enter slot(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): \n");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
printf("please enter pin(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
pin = QL_SIM_PIN_1;
}
else if (2 == input)
{
pin = QL_SIM_PIN_2;
}
else
{
printf("bad pin: %d\n", input);
return;
}
printf("please enter pin value(at most %d digit): \n", QL_SIM_PIN_MAX);
if (NULL == fgets(pin_value, sizeof(pin_value), stdin))
{
printf("can not read pin value\n");
return;
}
len = strlen(pin_value);
if ('\n' == pin_value[len-1])
{
pin_value[len-1] = 0;
len--;
}
printf("pin value: %s\n", pin_value);
printf("proceed? [y/n]: \n");
c = getchar();
if ('\n' != c)
{
getchar();
}
if ('Y' != c && 'y' != c)
{
printf("abort\n");
return;
}
ret = ql_sim_disable_pin(slot, app_type, pin, pin_value);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_verify_pin(void)
{
int ret = 0;
int len = 0;
char c;
char pin_value[QL_SIM_PIN_MAX*2] = {0};
int input = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
QL_SIM_PIN_E pin;
printf("test ql_sim_verify_pin: \n");
printf("please enter slot(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): \n");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
printf("please enter pin(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
pin = QL_SIM_PIN_1;
}
else if (2 == input)
{
pin = QL_SIM_PIN_2;
}
else
{
printf("bad pin: %d\n", input);
return;
}
printf("please enter pin value(at most %d digit): \n", QL_SIM_PIN_MAX);
if (NULL == fgets(pin_value, sizeof(pin_value), stdin))
{
printf("can not read pin value\n");
return;
}
len = strlen(pin_value);
if ('\n' == pin_value[len-1])
{
pin_value[len-1] = 0;
len--;
}
printf("pin value: %s\n", pin_value);
printf("proceed? [y/n]: \n");
c = getchar();
if ('\n' != c)
{
getchar();
}
if ('Y' != c && 'y' != c)
{
printf("abort\n");
return;
}
ret = ql_sim_verify_pin(slot, app_type, pin, pin_value);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_change_pin(void)
{
int ret = 0;
int old_len = 0;
int new_len = 0;
char c;
char old_pin_value[QL_SIM_PIN_MAX*2] = {0};
char new_pin_value[QL_SIM_PIN_MAX*2] = {0};
int input = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
QL_SIM_PIN_E pin;
printf("test ql_sim_change_pin: \n");
printf("please enter slot(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): \n");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
printf("please enter pin(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
pin = QL_SIM_PIN_1;
}
else if (2 == input)
{
pin = QL_SIM_PIN_2;
}
else
{
printf("bad pin: %d\n", input);
return;
}
printf("please enter old pin value(at most %d digit): \n", QL_SIM_PIN_MAX);
if (NULL == fgets(old_pin_value, sizeof(old_pin_value), stdin))
{
printf("can not read old pin value\n");
return;
}
old_len = strlen(old_pin_value);
if ('\n' == old_pin_value[old_len-1])
{
old_pin_value[old_len-1] = 0;
old_len--;
}
printf("please enter new pin value(at most %d digit): \n", QL_SIM_PIN_MAX);
if (NULL == fgets(new_pin_value, sizeof(new_pin_value), stdin))
{
printf("can not read new pin value\n");
return;
}
new_len = strlen(new_pin_value);
if ('\n' == new_pin_value[new_len-1])
{
new_pin_value[new_len-1] = 0;
new_len--;
}
printf("old pin value: %s\n", old_pin_value);
printf("new pin value: %s\n", new_pin_value);
printf("proceed? [y/n]: ");
c = getchar();
if ('\n' != c)
{
getchar();
}
if ('Y' != c && 'y' != c)
{
printf("abort\n");
return;
}
ret = ql_sim_change_pin(slot, app_type, pin, old_pin_value, new_pin_value);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_unblock_pin(void)
{
int ret = 0;
int len = 0;
int new_len = 0;
char c;
char puk_value[QL_SIM_PIN_MAX*2] = {0};
char new_pin_value[QL_SIM_PIN_MAX*2] = {0};
int input = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
QL_SIM_PIN_E pin;
printf("test ql_sim_unblock_pin: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): \n");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
printf("please enter pin(1 or 2): \n");
scanf("%d", &input);
getchar();
if (1 == input)
{
pin = QL_SIM_PIN_1;
}
else if (2 == input)
{
pin = QL_SIM_PIN_2;
}
else
{
printf("bad pin: %d\n", input);
return;
}
printf("please enter puk value(at most %d digit): \n", QL_SIM_PIN_MAX);
if (NULL == fgets(puk_value, sizeof(puk_value), stdin))
{
printf("can not read old pin value\n");
return;
}
len = strlen(puk_value);
if ('\n' == puk_value[len-1])
{
puk_value[len-1] = 0;
len--;
}
printf("please enter new pin value(at most %d digit): \n", QL_SIM_PIN_MAX);
if (NULL == fgets(new_pin_value, sizeof(new_pin_value), stdin))
{
printf("can not read new pin value\n");
return;
}
new_len = strlen(new_pin_value);
if ('\n' == new_pin_value[new_len-1])
{
new_pin_value[new_len-1] = 0;
new_len--;
}
printf(" puk value: %s\n", puk_value);
printf("new pin value: %s\n", new_pin_value);
printf("proceed? [y/n]: ");
c = getchar();
if ('\n' != c)
{
getchar();
}
if ('Y' != c && 'y' != c)
{
printf("abort\n");
return;
}
ret = ql_sim_unblock_pin(slot, app_type, pin, puk_value, new_pin_value);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static char *card_state_desc(QL_SIM_CARD_STATE_E state)
{
switch (state)
{
case QL_SIM_CARD_STATE_UNKNOWN:
return "unknown";
case QL_SIM_CARD_STATE_ABSENT:
return "absent";
case QL_SIM_CARD_STATE_PRESENT:
return "present";
case QL_SIM_CARD_STATE_ERROR_UNKNOWN:
return "unknown error";
case QL_SIM_CARD_STATE_ERROR_POWER_DOWN:
return "power down";
case QL_SIM_CARD_STATE_ERROR_POLL_ERROR:
return "poll error";
case QL_SIM_CARD_STATE_ERROR_NO_ATR_RECEIVED:
return "failed to receive an answer to reset";
case QL_SIM_CARD_STATE_ERROR_VOLT_MISMATCH:
return "voltage mismatch";
case QL_SIM_CARD_STATE_ERROR_PARITY_ERROR:
return "parity error";
case QL_SIM_CARD_STATE_ERROR_SIM_TECHNICAL_PROBLEMS:
return "technical problems";
default:
return "N/A";
}
}
static char *card_type_desc(QL_SIM_CARD_TYPE_E type)
{
switch (type)
{
case QL_SIM_CARD_TYPE_UNKNOWN:
return "unknown";
case QL_SIM_CARD_TYPE_ICC:
return "ICC";
case QL_SIM_CARD_TYPE_UICC:
return "UICC";
default:
return "N/A";
}
}
static char *card_subscription_desc(QL_SIM_SUBSCRIPTION_E subscription)
{
switch (subscription)
{
case QL_SIM_SUBSCRIPTION_NONE:
return "nonprovisioning";
case QL_SIM_SUBSCRIPTION_PRI:
return "primary provisioning subscription";
case QL_SIM_SUBSCRIPTION_SEC:
return "secondary provisioning subscription";
default:
return "N/A";
}
}
static char *card_app_state_desc(QL_SIM_APP_STATE_E state)
{
switch (state)
{
case QL_SIM_APP_STATE_UNKNOWN:
return "unknown";
case QL_SIM_APP_STATE_DETECTED:
return "detected";
case QL_SIM_APP_STATE_PIN1_REQ:
return "PIN1 required";
case QL_SIM_APP_STATE_PUK1_REQ:
return "PUK1 required";
case QL_SIM_APP_STATE_INITALIZATING:
return "initializing";
case QL_SIM_APP_STATE_PERSO_CK_REQ:
return "personalization control key required";
case QL_SIM_APP_STATE_PERSO_PUK_REQ:
return "personalization unblock key required";
case QL_SIM_APP_STATE_PERSO_PERMANENTLY_BLOCKED:
return "personalization is permanently blocked";
case QL_SIM_APP_STATE_PIN1_PERM_BLOCKED:
return "PIN1 is permanently blocked";
case QL_SIM_APP_STATE_ILLEGAL:
return "illegal";
case QL_SIM_APP_STATE_READY:
return "ready";
default:
return "N/A";
}
}
static char *card_perso_feature_desc(QL_SIM_PERSO_FEATURE_E feature)
{
switch (feature)
{
case QL_SIM_PERSO_FEATURE_UNKNOWN:
return "unknown";
case QL_SIM_PERSO_FEATURE_3GPP_NETWORK:
return "featurization based on 3GPP MCC and MNC";
case QL_SIM_PERSO_FEATURE_3GPP_NETWORK_SUBSET:
return "featurization based on 3GPP MCC, MNC, and IMSI digits 6 and 7";
case QL_SIM_PERSO_FEATURE_3GPP_SERVICE_PROVIDER:
return "featurization based on 3GPP MCC, MNC, and GID1";
case QL_SIM_PERSO_FEATURE_3GPP_CORPORATE:
return "featurization based on 3GPP MCC, MNC, GID1, and GID2";
case QL_SIM_PERSO_FEATURE_3GPP_SIM:
return "featurization based on the 3GPP IMSI";
case QL_SIM_PERSO_FEATURE_3GPP2_NETWORK_TYPE_1:
return "featurization based on 3GPP2 MCC and MNC";
case QL_SIM_PERSO_FEATURE_3GPP2_NETWORK_TYPE_2:
return "featurization based on 3GPP2 IRM code";
case QL_SIM_PERSO_FEATURE_3GPP2_RUIM:
return "featurization based on 3GPP2 IMSI_M";
default:
return "N/A";
}
}
static char *card_pin_state_desc(QL_SIM_PIN_STATE_E state)
{
switch (state)
{
case QL_SIM_PIN_STATE_UNKNOWN:
return "unknown";
case QL_SIM_PIN_STATE_ENABLED_NOT_VERIFIED:
return "PIN required, but has not been verified";
case QL_SIM_PIN_STATE_ENABLED_VERIFIED:
return "PIN required and has been verified";
case QL_SIM_PIN_STATE_DISABLED:
return "PIN not required";
case QL_SIM_PIN_STATE_BLOCKED:
return "PIN verification has failed too many times and is blocked. "
"Recoverable through PUK verification";
case QL_SIM_PIN_STATE_PERMANENTLY_BLOCKED:
return "PUK verification has failed too many times and is not recoverable";
default:
return "N/A";
}
}
static void item_ql_sim_get_card_info(void)
{
int ret = 0;
ql_sim_card_info_t info = {0};
int input = 0;
QL_SIM_SLOT_E slot;
printf("test ql_sim_get_card_info: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
ret = ql_sim_get_card_info(slot, &info);
if (ret != QL_ERR_OK)
{
printf("failed, ret = %d\n", ret);
return;
}
printf("========= CARD INFO =========\n");
printf("state: %s\n", card_state_desc(info.state));
printf("type: %s\n", card_type_desc(info.type));
printf("3gpp:\n");
printf(" app state: %s\n", card_app_state_desc(info.app_3gpp.app_state));
printf(" PIN 1 retries: %hhu\n", info.app_3gpp.pin1_num_retries);
printf(" PUK 1 retries: %hhu\n", info.app_3gpp.puk1_num_retries);
printf(" PIN 2 retries: %hhu\n", info.app_3gpp.pin2_num_retries);
printf(" PUK 2 retries: %hhu\n", info.app_3gpp.puk2_num_retries);
printf("3gpp2:\n");
printf(" app state: %s\n", card_app_state_desc(info.app_3gpp2.app_state));
printf(" PIN 1 retries: %hhu\n", info.app_3gpp2.pin1_num_retries);
printf(" PUK 1 retries: %hhu\n", info.app_3gpp2.puk1_num_retries);
printf(" PIN 2 retries: %hhu\n", info.app_3gpp2.pin2_num_retries);
printf(" PUK 2 retries: %hhu\n", info.app_3gpp2.puk2_num_retries);
printf("isim:\n");
printf(" app state: %s\n", card_app_state_desc(info.app_isim.app_state));
printf(" PIN 1 retries: %hhu\n", info.app_isim.pin1_num_retries);
printf(" PUK 1 retries: %hhu\n", info.app_isim.puk1_num_retries);
printf(" PIN 2 retries: %hhu\n", info.app_isim.pin2_num_retries);
printf(" PUK 2 retries: %hhu\n", info.app_isim.puk2_num_retries);
}
#if 0
static void item_ql_sim_read_file(void)
{
int ret = 0;
int input = 0;
int len = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
ql_sim_file_t file = {0};
printf("test ql_sim_read_file: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
printf("please enter file path(at most %d hex[0·9A-F], e.g 3F002FE2): ", QL_SIM_PATH_MAX);
if (NULL == fgets(file.path, QL_SIM_PATH_MAX, stdin))
{
printf("can not read file path\n");
return;
}
len = strlen(file.path);
if ('\n' == file.path[len-1])
{
file.path[len-1] = 0;
len--;
}
file.path_len = (uint32_t)len;
printf("please enter record index(0 for transparent access): ");
scanf("%hhu", (uint8_t *)&file.record_idx);
getchar();
ret = ql_sim_read_file(slot, app_type, &file);
if (ret == QL_ERR_OK)
{
printf("data length: %u\n", file.data_len);
uint32_t i = 0;
printf("data: ");
for (i = 0; i < file.data_len; i++)
{
printf("%02x ", file.data[i]);
}
printf("\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_write_file(void)
{
int ret = 0;
int input = 0;
int len = 0;
uint8_t v;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
ql_sim_file_t file = {0};
printf("test ql_sim_write_file: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
printf("please enter file path(at most %d hex[0·9A-F], e.g 3F002FE2): ", QL_SIM_PATH_MAX);
if (NULL == fgets(file.path, QL_SIM_PATH_MAX, stdin))
{
printf("can not read file path\n");
return;
}
len = strlen(file.path);
if ('\n' == file.path[len-1])
{
file.path[len-1] = 0;
len--;
}
file.path_len = (uint32_t)len;
printf("please enter record index(0 for transparent access): ");
scanf("%hhu", (uint8_t *)&file.record_idx);
getchar();
printf("please enter data(hex, end with `q'): ");
while (1 == scanf("%hhx", &v))
{
file.data[file.data_len++] = v;
}
getchar(); // read `q'
getchar(); // read '\n'
printf("please enter data offset: ");
scanf("%hu", &file.offset);
getchar();
ret = ql_sim_write_file(slot, app_type, &file);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static char *file_type_desc(QL_SIM_FILE_TYPE_E type)
{
switch (type)
{
case QL_SIM_FILE_TYPE_UNKNOWN:
return "unknown";
case QL_SIM_FILE_TYPE_TRANSPARENT:
return "transparent";
case QL_SIM_FILE_TYPE_CYCLIC:
return "cyclic";
case QL_SIM_FILE_TYPE_LINEAR_FIXED:
return "linear fixed";
default:
return "N/A";
}
}
static void item_ql_sim_get_file_info(void)
{
int ret = 0;
int input = 0;
int len = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
ql_sim_file_info_t info = {0};
printf("test ql_sim_get_file_info: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
printf("please enter file path(at most %d hex[0·9A-F], e.g 3F002FE2): ", QL_SIM_PATH_MAX);
if (NULL == fgets(info.path, QL_SIM_PATH_MAX, stdin))
{
printf("can not read file path\n");
return;
}
len = strlen(info.path);
if ('\n' == info.path[len-1])
{
info.path[len-1] = 0;
len--;
}
info.path_len = (uint32_t)len;
ret = ql_sim_get_file_info(slot, app_type, &info);
if (ret == QL_ERR_OK)
{
printf("========= FILE INFO =========\n");
printf("path: %s\n", info.path);
printf("type: %s\n", file_type_desc(info.file_type));
printf("file size: %hu\n", info.file_size);
printf("record size: %hu\n", info.record_size);
printf("record count: %hu\n", info.record_count);
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_read_phone_book(void)
{
int ret = 0;
int input = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
uint8_t record_idx = 0;
ql_sim_phone_book_record_t record;
memset(&record,0,sizeof(ql_sim_phone_book_record_t));
printf("test ql_sim_read_phone_book: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
printf("please enter record index: ");
scanf("%hhu", &record_idx);
getchar();
ret = ql_sim_read_phone_book(slot, app_type, QL_SIM_PB_DEFAULT_PATH, record_idx, &record);
if (ret == QL_ERR_OK)
{
printf("Name: %s\n", record.name);
printf("Number: %s\n", record.number);
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_write_phone_book(void)
{
int ret = 0;
int input = 0;
int len = 0;
QL_SIM_SLOT_E slot;
QL_SIM_APP_TYPE_E app_type;
uint8_t record_idx = 0;
ql_sim_phone_book_record_t record;
memset(&record,0,sizeof(ql_sim_phone_book_record_t));
printf("test ql_sim_write_phone_book: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter app type(0-unknown, 1-3gpp, 2-3gpp2, 3-isim): ");
scanf("%d", &input);
getchar();
switch (input)
{
case 0:
app_type = QL_SIM_APP_TYPE_UNKNOWN;
break;
case 1:
app_type = QL_SIM_APP_TYPE_3GPP;
break;
case 2:
app_type = QL_SIM_APP_TYPE_3GPP2;
break;
case 3:
app_type = QL_SIM_APP_TYPE_ISIM;
break;
default:
printf("bad app type: %d\n", input);
return;
}
printf("please enter record index: ");
scanf("%hhu", &record_idx);
getchar();
printf("please enter name(at most %d chars): ", QL_SIM_PHONE_BOOK_NAME_MAX - 1);
if (NULL == fgets(record.name, QL_SIM_PHONE_BOOK_NAME_MAX, stdin))
{
printf("\nname will be set to 0\n");
}
else
{
len = strlen(record.name);
if ('\n' == record.name[len-1])
{
record.name[len-1] = 0;
}
}
printf("please enter number(at most %d digits): ", QL_SIM_PHONE_BOOK_NUMBER_MAX - 1);
if (NULL == fgets(record.number, QL_SIM_PHONE_BOOK_NUMBER_MAX, stdin))
{
printf("\nnumber will be set to 0\n");
}
else
{
len = strlen(record.number);
if ('\n' == record.number[len-1])
{
record.number[len-1] = 0;
}
}
ret = ql_sim_write_phone_book(slot, app_type, QL_SIM_PB_DEFAULT_PATH, record_idx, &record);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_open_logical_channel(void)
{
int ret = 0;
int input = 0;
QL_SIM_SLOT_E slot;
uint8_t channel_id = 0;
printf("test ql_sim_open_logical_channel: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
ret = ql_sim_open_logical_channel(slot, &channel_id);
if (ret == QL_ERR_OK)
{
printf("channel id: %hhu\n", channel_id);
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_close_logical_channel(void)
{
int ret = 0;
int input = 0;
QL_SIM_SLOT_E slot;
uint8_t channel_id = 0;
printf("test ql_sim_close_logical_channel: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
printf("please enter channel id: ");
scanf("%hhu", &channel_id);
getchar();
ret = ql_sim_close_logical_channel(slot, channel_id);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
static void item_ql_sim_send_apdu(void)
{
int ret = 0;
int input = 0;
uint8_t v = 0;
QL_SIM_SLOT_E slot;
ql_sim_apdu_t *p_apdu = NULL;
uint8_t channel_id = 0;
printf("test ql_sim_send_apdu: \n");
p_apdu = calloc(1, sizeof(*p_apdu));
if (NULL == p_apdu)
{
printf("run out of memory\n");
return;
}
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
slot = QL_SIM_SLOT_1;
}
else if (2 == input)
{
slot = QL_SIM_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
free(p_apdu);
p_apdu = NULL;
return;
}
printf("please enter channel id: ");
scanf("%hhu", &channel_id);
getchar();
printf("please enter apdu data(hex, end with `q'): ");
while (1 == scanf("%hhx", &v))
{
p_apdu->req_apdu[p_apdu->req_apdu_len++] = v;
}
getchar(); // read `q'
getchar(); // read '\n'
ret = ql_sim_send_apdu(slot, channel_id, p_apdu);
if (ret == QL_ERR_OK)
{
uint32_t i = 0;
printf("repsonse apdu: ");
for (i = 0; i < p_apdu->resp_apdu_len; i++)
{
printf("%c", p_apdu->resp_apdu[i]);
}
printf("\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
free(p_apdu);
p_apdu = NULL;
}
#endif
static void sim_card_status_cb(int slot, ql_sim_card_info_t *p_info)
{
printf("========= CARD STATUS =========\n");
switch (slot)
{
case 0:
printf("slot: invalid\n");
break;
case 1:
printf("slot: 1\n");
break;
case 2:
printf("slot: 2\n");
break;
}
if (NULL == p_info)
{
printf("status: unavailable\n");
return;
}
printf("state: %s\n", card_state_desc(p_info->state));
printf("type: %s\n", card_type_desc(p_info->type));
printf("3gpp:\n");
printf(" app state: %s\n", card_app_state_desc(p_info->app_3gpp.app_state));
printf(" PIN 1 retries: %hhu\n", p_info->app_3gpp.pin1_num_retries);
printf(" PUK 1 retries: %hhu\n", p_info->app_3gpp.puk1_num_retries);
printf(" PIN 2 retries: %hhu\n", p_info->app_3gpp.pin2_num_retries);
printf(" PUK 2 retries: %hhu\n", p_info->app_3gpp.puk2_num_retries);
printf("3gpp2:\n");
printf(" app state: %s\n", card_app_state_desc(p_info->app_3gpp2.app_state));
printf(" PIN 1 retries: %hhu\n", p_info->app_3gpp2.pin1_num_retries);
printf(" PUK 1 retries: %hhu\n", p_info->app_3gpp2.puk1_num_retries);
printf(" PIN 2 retries: %hhu\n", p_info->app_3gpp2.pin2_num_retries);
printf(" PUK 2 retries: %hhu\n", p_info->app_3gpp2.puk2_num_retries);
printf("isim:\n");
printf(" app state: %s\n", card_app_state_desc(p_info->app_isim.app_state));
printf(" PIN 1 retries: %hhu\n", p_info->app_isim.pin1_num_retries);
printf(" PUK 1 retries: %hhu\n", p_info->app_isim.puk1_num_retries);
printf(" PIN 2 retries: %hhu\n", p_info->app_isim.pin2_num_retries);
printf(" PUK 2 retries: %hhu\n", p_info->app_isim.puk2_num_retries);
}
static void item_ql_sim_set_card_status_cb(void)
{
int ret = 0;
printf("test ql_sim_set_card_status_cb: ");
ret = ql_sim_set_card_status_cb((ql_sim_card_status_cb_f)sim_card_status_cb);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
void sim_servicie_error_cb(int error)
{
printf("===== SIM Service Abort =====\n");
}
void item_ql_sim_set_service_error_cb(void)
{
int ret = 0;
printf("test ql_sim_set_service_error_cb: \n");
ret = ql_sim_set_service_error_cb(sim_servicie_error_cb);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
#if 0
void item_ql_sim_switch_slot(void)
{
int ret = 0;
int input = 0;
QL_SIM_PHY_SLOT_E phy_slot = 0;
printf("test item_ql_sim_switch_slot: \n");
printf("please enter slot(1 or 2): ");
scanf("%d", &input);
getchar();
if (1 == input)
{
phy_slot = QL_SIM_PHY_SLOT_1;
}
else if (2 == input)
{
phy_slot = QL_SIM_PHY_SLOT_2;
}
else
{
printf("bad slot: %d\n", input);
return;
}
ret = ql_sim_switch_slot(QL_SIM_SLOT_1, phy_slot);
if (ret == QL_ERR_OK)
{
printf("ok\n");
}
else
{
printf("failed, ret = %d\n", ret);
}
}
void item_ql_sim_get_active_slots(void)
{
int ret = 0;
ql_sim_active_slots_t *p_active_slots = (ql_sim_active_slots_t *)malloc(sizeof(ql_sim_active_slots_t));
if (p_active_slots == NULL) {
printf("Memory allocation failed.\n");
return -1;
}
p_active_slots->active_slots_len = 0;
p_active_slots->active_slots[0] = 0;
printf("test item_ql_sim_get_active_slots: \n");
ret = ql_sim_get_active_slots(p_active_slots);
if (ret == QL_ERR_OK)
{
printf("ok\n");
printf("p_active_slots(QL_SIM_PHY_SLOT_1/2 = B01/B02) = %X \n",p_active_slots->active_slots[0]);
}
else
{
printf("failed, ret = %d\n", ret);
}
free(p_active_slots);
}
#endif
static t_item_t ql_sim_items[] =
{
{"ql_sim_init", item_ql_sim_init},
{"ql_sim_get_imsi", item_ql_sim_get_imsi},
{"ql_sim_get_iccid", item_ql_sim_get_iccid},
{"ql_sim_get_phone_num", item_ql_sim_get_phone_num},
{"ql_sim_get_operators", item_ql_sim_get_operators},
{"ql_sim_enable_pin", item_ql_sim_enable_pin},
{"ql_sim_disable_pin", item_ql_sim_disable_pin},
{"ql_sim_verify_pin", item_ql_sim_verify_pin},
{"ql_sim_change_pin", item_ql_sim_change_pin},
{"ql_sim_unblock_pin", item_ql_sim_unblock_pin},
{"ql_sim_get_card_info", item_ql_sim_get_card_info},
// {"ql_sim_read_file", item_ql_sim_read_file},
// {"ql_sim_write_file", item_ql_sim_write_file},
// {"ql_sim_get_file_info", item_ql_sim_get_file_info},
// {"ql_sim_read_phone_book", item_ql_sim_read_phone_book},
// {"ql_sim_write_phone_book", item_ql_sim_write_phone_book},
// {"ql_sim_open_logical_channel", item_ql_sim_open_logical_channel},
// {"ql_sim_close_logical_channel", item_ql_sim_close_logical_channel},
// {"ql_sim_send_apdu", item_ql_sim_send_apdu},
{"ql_sim_set_card_status_cb", item_ql_sim_set_card_status_cb},
{"ql_sim_set_service_error_cb", item_ql_sim_set_service_error_cb},
// {"ql_sim_switch_slot", item_ql_sim_switch_slot},
// {"ql_sim_get_active_slots", item_ql_sim_get_active_slots},
{"ql_sim_deinit", item_ql_sim_deinit},
};
t_module_t ql_sim_module =
{
"sim",
T_ARRAY_SIZE(ql_sim_items),
ql_sim_items
};
/*-----------------------------------------------------------------------------------------------*/
/**
@brief Read a int value from stdin
@param[out] val, Return read data
@return
0 - successful
1 - read an enter
-1 - invalid input
*/
/*-----------------------------------------------------------------------------------------------*/
int t_get_int(int *val)
{
int dat;
char *ptr_end = NULL;
char buf[256] = {0};
if(NULL == fgets(buf, sizeof(buf)-1, stdin))
{
return -1;
}
#if 0
if(0 == buf[0])
{
return -1;
}
#endif
if(buf[0] == '\n')
{
return 1;
}
dat = strtol(buf, &ptr_end, 10);
if(ptr_end!=NULL && ptr_end[0]!='\n')
{
return -1;
}
if(val)
{
val[0] = dat;
}
return 0;
}
void dump_items()
{
int i;
printf("\n");
printf("The current module is: \n");
for(i=0; i< ql_sim_module.item_len; i++)
{
printf("%d\t%s\n", i, ql_sim_module.item_list[i].name);
}
printf("-1\texit\n");
}
int main(int argc, char *argv[])
{
int ret;
int idx;
dump_items();
while(1)
{
printf("Please enter your choice: ");
ret = t_get_int(&idx);
printf("\n");
if(ret < 0)
{
printf("Invalid input\n");
continue;
}
else if(ret == 1)
{
dump_items();
continue;
}
if(idx == -1)
{
break;
}
if(idx<0 || idx>=ql_sim_module.item_len)
{
printf("Not support idx: %d\n", idx);
continue;
}
printf("->Item : %s\n", ql_sim_module.item_list[idx].name);
ql_sim_module.item_list[idx].handle();
}
return 0;
}