feat: add FT1 factory test host and protocol updates
This commit is contained in:
@@ -5,7 +5,6 @@
|
||||
#include "ql_audio.h"
|
||||
#include "ql_fs.h"
|
||||
#include "ql_gpio.h"
|
||||
#include "ql_power.h"
|
||||
#include "ql_rtos.h"
|
||||
|
||||
#include "factory_audio.h"
|
||||
@@ -16,7 +15,9 @@
|
||||
#define ES8311_DEVICE_ID 0x83
|
||||
#define ES8311_VOLUME_100 0x8E
|
||||
#define FT_PCM_CHUNK_BYTES 640
|
||||
#define FT_MP3_TIMEOUT_TICKS (15000 / 5)
|
||||
#define FT_PCM_CHUNK_MS 20
|
||||
#define FT_PCM_WRITE_RETRIES 40
|
||||
#define FT_MP3_TIMEOUT_MS 15000
|
||||
|
||||
extern void sw_i2c_init(void);
|
||||
extern int8 sw_i2c_start(void);
|
||||
@@ -157,7 +158,7 @@ int factory_audio_play_prompt(const char *path)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = ql_rtos_semaphore_wait(g_mp3_sem, FT_MP3_TIMEOUT_TICKS);
|
||||
ret = ql_rtos_semaphore_wait(g_mp3_sem, FT_MP3_TIMEOUT_MS);
|
||||
if (ret != 0 || g_mp3_result != 2) {
|
||||
ql_stop_mp3_play(g_mp3_handle, 0);
|
||||
factory_pa_control(0);
|
||||
@@ -167,15 +168,20 @@ int factory_audio_play_prompt(const char *path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wait_pwrkey_level(unsigned char expected, u32 timeout_ms)
|
||||
static int wait_loopback_key_level(PIN_LEVEL_E expected, u32 timeout_ms)
|
||||
{
|
||||
PIN_LEVEL_E level = PIN_LEVEL_HIGH;
|
||||
u32 start = ft_now_ms();
|
||||
while (ql_get_pwrkey_status() != expected) {
|
||||
if (ft_now_ms() - start >= timeout_ms) return -1;
|
||||
do {
|
||||
ql_gpio_get_level(FT_LOOPBACK_KEY_PIN, &level);
|
||||
if (level == expected) {
|
||||
ql_rtos_task_sleep_ms(40);
|
||||
ql_gpio_get_level(FT_LOOPBACK_KEY_PIN, &level);
|
||||
if (level == expected) return 0;
|
||||
}
|
||||
ql_rtos_task_sleep_ms(10);
|
||||
}
|
||||
ql_rtos_task_sleep_ms(40);
|
||||
return ql_get_pwrkey_status() == expected ? 0 : -1;
|
||||
} while (ft_now_ms() - start < timeout_ms);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int factory_audio_wait_and_loopback(u32 wait_timeout_ms, u32 *recorded_ms)
|
||||
@@ -187,21 +193,29 @@ int factory_audio_wait_and_loopback(u32 wait_timeout_ms, u32 *recorded_ms)
|
||||
audio_record_handle record_handle = 0;
|
||||
audio_track_handle track_handle = 0;
|
||||
int ret = -1;
|
||||
u32 release_wait_start = 0;
|
||||
|
||||
if (recorded_ms) *recorded_ms = 0;
|
||||
if (wait_pwrkey_level(0, 10000) != 0 ||
|
||||
wait_pwrkey_level(1, wait_timeout_ms) != 0) {
|
||||
ql_gpio_init(FT_LOOPBACK_KEY_PIN, PIN_DIRECTION_IN, PIN_PULL_PU, PIN_LEVEL_HIGH);
|
||||
if (wait_loopback_key_level(PIN_LEVEL_HIGH, 5000) != 0 ||
|
||||
wait_loopback_key_level(PIN_LEVEL_LOW, wait_timeout_ms) != 0) {
|
||||
return -4;
|
||||
}
|
||||
|
||||
buffer = (unsigned char *)malloc(FT_AUDIO_BUFFER_BYTES);
|
||||
if (!buffer) return -1;
|
||||
if (!buffer) {
|
||||
ret = -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
record_handle = ql_audio_record_open(FT_AUDIO_RATE_HZ, FT_AUDIO_CHANNELS,
|
||||
0, factory_record_callback);
|
||||
if (!record_handle) goto cleanup;
|
||||
|
||||
while (ql_get_pwrkey_status() && total < FT_AUDIO_BUFFER_BYTES) {
|
||||
while (total < FT_AUDIO_BUFFER_BYTES) {
|
||||
PIN_LEVEL_E level = PIN_LEVEL_HIGH;
|
||||
ql_gpio_get_level(FT_LOOPBACK_KEY_PIN, &level);
|
||||
if (level != PIN_LEVEL_LOW) break;
|
||||
request = FT_PCM_CHUNK_BYTES;
|
||||
if (request > FT_AUDIO_BUFFER_BYTES - total) {
|
||||
request = FT_AUDIO_BUFFER_BYTES - total;
|
||||
@@ -215,10 +229,21 @@ int factory_audio_wait_and_loopback(u32 wait_timeout_ms, u32 *recorded_ms)
|
||||
ql_audio_record_close(record_handle, 0);
|
||||
record_handle = 0;
|
||||
|
||||
if (total == FT_AUDIO_BUFFER_BYTES && ql_get_pwrkey_status()) {
|
||||
if (wait_pwrkey_level(0, 30000) != 0) goto cleanup;
|
||||
} else if (wait_pwrkey_level(0, 3000) != 0) {
|
||||
goto cleanup;
|
||||
{
|
||||
PIN_LEVEL_E level = PIN_LEVEL_HIGH;
|
||||
ql_gpio_get_level(FT_LOOPBACK_KEY_PIN, &level);
|
||||
if (total == FT_AUDIO_BUFFER_BYTES && level == PIN_LEVEL_LOW) {
|
||||
release_wait_start = ft_now_ms();
|
||||
while (1) {
|
||||
ql_gpio_get_level(FT_LOOPBACK_KEY_PIN, &level);
|
||||
if (level != PIN_LEVEL_LOW) break;
|
||||
if (ft_now_ms() - release_wait_start >= 30000) goto cleanup;
|
||||
ql_rtos_task_sleep_ms(10);
|
||||
}
|
||||
ql_rtos_task_sleep_ms(40);
|
||||
} else if (wait_loopback_key_level(PIN_LEVEL_HIGH, 3000) != 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
if (total < FT_PCM_CHUNK_BYTES) {
|
||||
@@ -233,8 +258,9 @@ int factory_audio_wait_and_loopback(u32 wait_timeout_ms, u32 *recorded_ms)
|
||||
es8311_write(0x32, ES8311_VOLUME_100);
|
||||
ql_set_volume(AUDIOHAL_SPK_VOL_11);
|
||||
factory_pa_control(1);
|
||||
/* Match the SDK PCM path and feed the asynchronous track in real time. */
|
||||
track_handle = ql_audio_track_open(FT_AUDIO_RATE_HZ, FT_AUDIO_CHANNELS,
|
||||
0, factory_track_callback);
|
||||
0x100, factory_track_callback);
|
||||
if (!track_handle) {
|
||||
ret = -3;
|
||||
goto cleanup;
|
||||
@@ -242,11 +268,16 @@ int factory_audio_wait_and_loopback(u32 wait_timeout_ms, u32 *recorded_ms)
|
||||
|
||||
for (offset = 0; offset < total; offset += FT_PCM_CHUNK_BYTES) {
|
||||
unsigned int size = total - offset;
|
||||
unsigned int retries = 0;
|
||||
if (size > FT_PCM_CHUNK_BYTES) size = FT_PCM_CHUNK_BYTES;
|
||||
if (ql_audio_track_write(track_handle, (char *)(buffer + offset), size) != 0) {
|
||||
ret = -3;
|
||||
goto cleanup;
|
||||
while (ql_audio_track_write(track_handle, (char *)(buffer + offset), size) != 0) {
|
||||
if (++retries > FT_PCM_WRITE_RETRIES) {
|
||||
ret = -3;
|
||||
goto cleanup;
|
||||
}
|
||||
ql_rtos_task_sleep_ms(5);
|
||||
}
|
||||
ql_rtos_task_sleep_ms(FT_PCM_CHUNK_MS);
|
||||
}
|
||||
ql_rtos_task_sleep_ms(total * 1000U /
|
||||
(FT_AUDIO_RATE_HZ * 2U * FT_AUDIO_CHANNELS) + 300U);
|
||||
|
||||
Reference in New Issue
Block a user