feat: add FT1 factory test host and protocol updates

This commit is contained in:
chenjintao
2026-09-23 21:53:27 +08:00
parent 99cdd2db8a
commit 04b3b761db
15 changed files with 1603 additions and 176 deletions
@@ -8,7 +8,6 @@
#include "ql_gpio.h"
#include "ql_iic.h"
#include "ql_nw.h"
#include "ql_ping.h"
#include "ql_power.h"
#include "ql_rtos.h"
#include "ql_sim.h"
@@ -21,10 +20,6 @@
#include "nfc.h"
#include "reg.h"
#define FT_PING_COUNT 3
#define FT_PING_REQUIRED 2
#define FT_PING_TIMEOUT_MS 4000
#define FT_PING_WAIT_TICKS (20000 / 5)
#define FT_NFC_VERSION_EXPECTED 0x82
int g_testmode = 1;
@@ -35,22 +30,14 @@ extern s8 Read_NTAG213(u8 *uid_buf, u8 *data_buf, u16 *data_len);
void handle_nfc_bind(const char *uid) { (void)uid; }
void handle_nfc_trigger(const char *uid) { (void)uid; }
static ql_sem_t g_ping_sem;
static ql_ping_stat_t g_ping_stats;
static volatile int g_ping_finished;
static char g_ip_address[64];
static int iccid_valid(const char *iccid)
{
unsigned int i;
unsigned int len;
if (!iccid) return 0;
len = strlen(iccid);
if (len < 18 || len > 22) return 0;
for (i = 0; i < len; ++i) {
if (iccid[i] < '0' || iccid[i] > '9') return 0;
}
return 1;
return len >= 18 && len <= 22;
}
static ft_error_t run_boot_audio(char *data, unsigned int data_size)
@@ -111,43 +98,6 @@ static ft_error_t run_audio_loopback(char *data, unsigned int data_size)
return FT_OK;
}
static int wait_gpio_level(unsigned int pin, PIN_LEVEL_E expected, u32 timeout_ms)
{
PIN_LEVEL_E level = PIN_LEVEL_HIGH;
u32 start = ft_now_ms();
do {
ql_gpio_get_level(pin, &level);
if (level == expected) {
ql_rtos_task_sleep_ms(40);
ql_gpio_get_level(pin, &level);
if (level == expected) return 0;
}
ql_rtos_task_sleep_ms(10);
} while (ft_now_ms() - start < timeout_ms);
return -1;
}
static ft_error_t run_key_triple(char *data, unsigned int data_size)
{
int count = 0;
u32 start = ft_now_ms();
ql_gpio_init(FT_TRIPLE_KEY_PIN, PIN_DIRECTION_IN, PIN_PULL_PU, PIN_LEVEL_HIGH);
if (wait_gpio_level(FT_TRIPLE_KEY_PIN, PIN_LEVEL_HIGH, 5000) != 0) {
return FT_ERR_TRIPLE_KEY_TIMEOUT;
}
while (count < 3 && ft_now_ms() - start < FT_TRIPLE_KEY_TIMEOUT_MS) {
u32 remaining = FT_TRIPLE_KEY_TIMEOUT_MS - (ft_now_ms() - start);
if (wait_gpio_level(FT_TRIPLE_KEY_PIN, PIN_LEVEL_LOW, remaining) != 0) break;
++count;
ft_protocol_node_progress(FT_NODE_KEY_TRIPLE, count, 3);
remaining = FT_TRIPLE_KEY_TIMEOUT_MS - (ft_now_ms() - start);
if (wait_gpio_level(FT_TRIPLE_KEY_PIN, PIN_LEVEL_HIGH, remaining) != 0) break;
}
snprintf(data, data_size, "{\"press_count\":%d,\"required\":3}", count);
return count == 3 ? FT_OK : FT_ERR_TRIPLE_KEY_TIMEOUT;
}
static ft_error_t run_esim(char *data, unsigned int data_size)
{
int status = QL_SIM_STATUS_UNKNOWN;
@@ -207,54 +157,6 @@ static ft_error_t run_data_call(char *data, unsigned int data_size)
return FT_OK;
}
static void factory_ping_callback(ql_ping_state_e state, int err,
ql_ping_stat_t *stats)
{
(void)err;
if (stats) memcpy(&g_ping_stats, stats, sizeof(g_ping_stats));
if (state == QL_PING_FINISHED) {
g_ping_finished = 1;
if (g_ping_sem) ql_rtos_semaphore_release(g_ping_sem);
}
}
static ft_error_t run_ping(char *data, unsigned int data_size)
{
ql_ping_ctx_t *ctx;
ql_ping_cfg_t cfg = {
.pdpCid = 1,
.host = FT_PING_HOST,
.timeout = FT_PING_TIMEOUT_MS,
.dataSize = 32,
.pingNum = FT_PING_COUNT
};
int ret;
memset(&g_ping_stats, 0, sizeof(g_ping_stats));
g_ping_finished = 0;
if (ql_rtos_semaphore_create(&g_ping_sem, 0) != 0) return FT_ERR_PING_INIT;
ctx = ql_ping_init(cfg, factory_ping_callback);
if (!ctx) {
ql_rtos_semaphore_delete(g_ping_sem);
g_ping_sem = NULL;
return FT_ERR_PING_INIT;
}
ret = ql_ping(ctx);
if (ret == 0) ret = ql_rtos_semaphore_wait(g_ping_sem, FT_PING_WAIT_TICKS);
ql_ping_deinit(ctx);
ql_rtos_semaphore_delete(g_ping_sem);
g_ping_sem = NULL;
snprintf(data, data_size,
"{\"host\":\"%s\",\"sent\":%u,\"received\":%u,"
"\"lost\":%u,\"avg_rtt_ms\":%lu}",
FT_PING_HOST, g_ping_stats.sentNum, g_ping_stats.rcvdNum,
g_ping_stats.lostNum, (unsigned long)g_ping_stats.avgRtt);
if (ret != 0 || !g_ping_finished) return FT_ERR_PING_START;
if (g_ping_stats.rcvdNum < FT_PING_REQUIRED) return FT_ERR_PING_LOSS;
return FT_OK;
}
static ft_error_t run_nfc(char *data, unsigned int data_size)
{
u8 uid[7] = {0};
@@ -292,10 +194,8 @@ static ft_error_t run_node(ft_node_t node, char *data, unsigned int data_size)
case FT_NODE_BOOT_AUDIO: return run_boot_audio(data, data_size);
case FT_NODE_POWER_ADC: return run_power_adc(data, data_size);
case FT_NODE_AUDIO_LOOPBACK: return run_audio_loopback(data, data_size);
case FT_NODE_KEY_TRIPLE: return run_key_triple(data, data_size);
case FT_NODE_ESIM: return run_esim(data, data_size);
case FT_NODE_DATA_CALL: return run_data_call(data, data_size);
case FT_NODE_PING: return run_ping(data, data_size);
case FT_NODE_NFC: return run_nfc(data, data_size);
default: return FT_ERR_NFC_LOCKED;
}