Files
MXC_A59/lib/bt/fsc_bt/fsc_bt.c
2024-10-10 17:41:53 +08:00

125 lines
3.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "config.h"
#include "console.h"
#include "board.h"
static bt_sw_cfg_t g_bt_cfg;
static TaskHandle_t fsc_bt_task_handle = NULL;
void fsc_bt_register_pcm_interface(void *itfc)
{
memcpy((void*)&g_bt_cfg, itfc, sizeof(bt_sw_cfg_t));
}
static void fsc_bt_callback(char * cAtStr)
{
char* cmd = NULL;
//printf("fsc_bt_callback %s\r\n", cAtStr);
if (0) {
} else if (0 == strncmp(cAtStr, "+VER", 4)) {
cmd = "AT+ADDR\r\n";
console_send_atcmd(cmd, strlen(cmd));//get mac addr
} else if (0 == strncmp(cAtStr, "+ADDR=", 6)) {
char cmd_str[64] = {0};
sprintf(cmd_str, "AT+NAME=EY_%s\r\n", (cAtStr + 6));
console_send_atcmd(cmd_str, strlen(cmd_str));//get mac addr
}
}
static int fsc_bt_play_state_callback(BT_PLAY_STATE_E state, unsigned short samplerate, unsigned char channel)
{
printf("fsc_bt_play_state_callback state %d samplerate %d channel %d\r\n", state, samplerate, channel);
return 0;
}
static int fsc_bt_a2dp_pcm_data_callback(unsigned char* buffer, unsigned short length)
{
/* 蓝牙音乐播放数据 采样率为44100或480002 channel 16bit直接输出到I2S设备 */
//printf("a2dp length %d 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x \r\n", length, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]);
return 0;
}
static int fsc_bt_hfp_spk_pcm_data_callback(unsigned char* buffer, unsigned short length)
{
/* 蓝牙电话下行数据 采样率为8000或160001 channel 16bit直接输出到I2S设备 */
//if (buffer[0] || buffer[1] || buffer[2] || buffer[3])
//printf("spk length %d 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x \r\n", length, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]);
return 0;
}
static void bt_task(void* arg)
{
// bluetooth stack require none volatile storage to store configuration (e.g. device name) and paired record link key and etc.
// the file name is "bw_conf0.db" and "bw_conf1.db"
// do not setup uart in itpInit , as blueware will do this job.
bt_hw_cfg_t bt_hw_cfg = {BT_RESET_IO, BT_UART_PORT};
bt_sw_cfg_t bt_sw_cfg;
// for AT-Command sent from upper layer application to blueware
tx_queue = xQueueCreate(AT_CMD_TX_QUEUE_LEN, (unsigned portBASE_TYPE) sizeof(char)*AT_CMD_PAYLOAD_LEN);
// for AT-Response sent from blueware to upper layer application
rx_queue = xQueueCreate(AT_CMD_RX_QUEUE_LEN, (unsigned portBASE_TYPE) sizeof(char)*AT_CMD_PAYLOAD_LEN);
if(!tx_queue || !rx_queue)
{
goto die;
}
console_init(fsc_bt_callback);
bt_hw_cfg.bt_en_pin = BT_RESET_IO;
bt_hw_cfg.uartport = BT_UART_PORT;
bt_hw_cfg.flashaddr = DB0_START_ADDR;
bt_hw_cfg.flashaddr1 = DB1_START_ADDR;
bt_sw_cfg.rx_queue = rx_queue;
bt_sw_cfg.tx_queue = tx_queue;
bt_sw_cfg.a2dp_resampler = 0;
bt_sw_cfg.debug_mode = 0; // debug toggle
#if CARLINK_EC
bt_sw_cfg.ble_connection_type = BLE_EASY_CONNECTION;
#else
bt_sw_cfg.ble_connection_type = BLE_ERYA_CONNECTION;
#endif
bt_sw_cfg.ancs_enable = 0;
bt_sw_cfg.absvol_enable = 0;
if (g_bt_cfg.play_state_cb)
bt_sw_cfg.play_state_cb = g_bt_cfg.play_state_cb;
else
bt_sw_cfg.play_state_cb = fsc_bt_play_state_callback;
if (g_bt_cfg.a2dp_cb)
bt_sw_cfg.a2dp_cb = g_bt_cfg.a2dp_cb;
else
bt_sw_cfg.a2dp_cb = fsc_bt_a2dp_pcm_data_callback;
if (g_bt_cfg.hfp_spk_cb)
bt_sw_cfg.hfp_spk_cb = g_bt_cfg.hfp_spk_cb;
else
bt_sw_cfg.hfp_spk_cb = fsc_bt_hfp_spk_pcm_data_callback;
fscbt_init(&bt_hw_cfg, &bt_sw_cfg);
while(!initialize_timeout)
{
// do nothing else here
fscbt_run();
}
die:
console_deinit();
}
int fsc_bt_main(void)
{
if (fsc_bt_task_handle)
return 0;
/* Create a task to process uart rx data */
if (xTaskCreate(bt_task, "bt_main", 4096, NULL,
configMAX_PRIORITIES / 3, &fsc_bt_task_handle) != pdPASS) {
printf("create fsc_bt_thread task fail.\n");
return -1;
}
return 0;
}