1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-01-22 21:30:56 +00:00

fixup! feat(core:): introduce BLE driver

This commit is contained in:
tychovrahe 2025-01-03 12:06:37 +01:00
parent 191fa1a026
commit b23337ea08
2 changed files with 35 additions and 52 deletions

View File

@ -35,9 +35,11 @@ typedef enum {
BLE_MODE_DFU, BLE_MODE_DFU,
} ble_mode_t; } ble_mode_t;
// changing value of TX_QUEUE_LEN is not allowed
// as it might result in order of messages being changed
#define TX_QUEUE_LEN 1
#define EVENT_QUEUE_LEN 4 #define EVENT_QUEUE_LEN 4
#define DATA_QUEUE_LEN 16 #define RX_QUEUE_LEN 16
#define SEND_QUEUE_LEN 1
#define LOOP_PERIOD_MS 20 #define LOOP_PERIOD_MS 20
#define PING_PERIOD 100 #define PING_PERIOD 100
@ -49,17 +51,17 @@ typedef struct {
bool initialized; bool initialized;
bool status_valid; bool status_valid;
bool accept_msgs; bool accept_msgs;
ble_event_t event_buffers[EVENT_QUEUE_LEN]; ble_event_t event_queue_buffers[EVENT_QUEUE_LEN];
tsqueue_entry_t event_queue_entries[EVENT_QUEUE_LEN]; tsqueue_entry_t event_queue_entries[EVENT_QUEUE_LEN];
tsqueue_t event_queue; tsqueue_t event_queue;
uint8_t data_buffers[DATA_QUEUE_LEN][BLE_RX_PACKET_SIZE]; uint8_t rx_queue_buffers[RX_QUEUE_LEN][BLE_RX_PACKET_SIZE];
tsqueue_entry_t data_queue_entries[DATA_QUEUE_LEN]; tsqueue_entry_t rx_queue_entries[RX_QUEUE_LEN];
tsqueue_t data_queue; tsqueue_t rx_queue;
uint8_t send_buffer[SEND_QUEUE_LEN][NRF_MAX_TX_DATA_SIZE]; uint8_t tx_queue_buffers[TX_QUEUE_LEN][NRF_MAX_TX_DATA_SIZE];
tsqueue_entry_t send_queue_entries[SEND_QUEUE_LEN]; tsqueue_entry_t ts_queue_entries[TX_QUEUE_LEN];
tsqueue_t send_queue; tsqueue_t tx_queue;
systimer_t *timer; systimer_t *timer;
uint16_t ping_cntr; uint16_t ping_cntr;
@ -230,7 +232,7 @@ static void ble_process_data(const uint8_t *data, uint32_t len) {
return; return;
} }
tsqueue_enqueue(&drv->data_queue, data, len, NULL); tsqueue_enqueue(&drv->rx_queue, data, len, NULL);
} }
// background loop, called from systimer every 10ms // background loop, called from systimer every 10ms
@ -253,11 +255,11 @@ static void ble_loop(void *context) {
} }
uint8_t data[NRF_MAX_TX_DATA_SIZE] = {0}; uint8_t data[NRF_MAX_TX_DATA_SIZE] = {0};
if (tsqueue_dequeue(&drv->send_queue, data, NRF_MAX_TX_DATA_SIZE, NULL, if (tsqueue_dequeue(&drv->tx_queue, data, NRF_MAX_TX_DATA_SIZE, NULL,
NULL)) { NULL)) {
if (!nrf_send_msg(NRF_SERVICE_BLE, data, NRF_MAX_TX_DATA_SIZE, NULL, if (!nrf_send_msg(NRF_SERVICE_BLE, data, NRF_MAX_TX_DATA_SIZE, NULL,
NULL)) { NULL)) {
tsqueue_enqueue(&drv->send_queue, data, NRF_MAX_TX_DATA_SIZE, NULL); tsqueue_enqueue(&drv->tx_queue, data, NRF_MAX_TX_DATA_SIZE, NULL);
} }
} }
@ -288,16 +290,16 @@ void ble_init(void) {
memset(drv, 0, sizeof(ble_driver_t)); memset(drv, 0, sizeof(ble_driver_t));
tsqueue_init(&drv->event_queue, drv->event_queue_entries, tsqueue_init(&drv->event_queue, drv->event_queue_entries,
(uint8_t *)drv->event_buffers, sizeof(ble_event_t), (uint8_t *)drv->event_queue_buffers, sizeof(ble_event_t),
EVENT_QUEUE_LEN); EVENT_QUEUE_LEN);
tsqueue_init(&drv->data_queue, drv->data_queue_entries, tsqueue_init(&drv->rx_queue, drv->rx_queue_entries,
(uint8_t *)drv->data_buffers, BLE_RX_PACKET_SIZE, (uint8_t *)drv->rx_queue_buffers, BLE_RX_PACKET_SIZE,
DATA_QUEUE_LEN); RX_QUEUE_LEN);
tsqueue_init(&drv->send_queue, drv->send_queue_entries, tsqueue_init(&drv->tx_queue, drv->ts_queue_entries,
(uint8_t *)drv->send_buffer, NRF_MAX_TX_DATA_SIZE, (uint8_t *)drv->tx_queue_buffers, NRF_MAX_TX_DATA_SIZE,
SEND_QUEUE_LEN); TX_QUEUE_LEN);
drv->timer = systimer_create(ble_loop, NULL); drv->timer = systimer_create(ble_loop, NULL);
@ -320,8 +322,8 @@ void ble_deinit(void) {
systimer_delete(drv->timer); systimer_delete(drv->timer);
tsqueue_reset(&drv->event_queue); tsqueue_reset(&drv->event_queue);
tsqueue_reset(&drv->data_queue); tsqueue_reset(&drv->rx_queue);
tsqueue_reset(&drv->send_queue); tsqueue_reset(&drv->tx_queue);
nrf_unregister_listener(NRF_SERVICE_BLE); nrf_unregister_listener(NRF_SERVICE_BLE);
nrf_unregister_listener(NRF_SERVICE_BLE_MANAGER); nrf_unregister_listener(NRF_SERVICE_BLE_MANAGER);
@ -357,7 +359,7 @@ void ble_stop(void) {
} }
drv->accept_msgs = false; drv->accept_msgs = false;
tsqueue_reset(&drv->data_queue); tsqueue_reset(&drv->rx_queue);
} }
bool ble_can_write(void) { bool ble_can_write(void) {
@ -371,7 +373,7 @@ bool ble_can_write(void) {
return false; return false;
} }
return !tsqueue_full(&drv->send_queue); return !tsqueue_full(&drv->tx_queue);
} }
bool ble_write(const uint8_t *data, uint16_t len) { bool ble_write(const uint8_t *data, uint16_t len) {
@ -388,7 +390,7 @@ bool ble_write(const uint8_t *data, uint16_t len) {
bool sent = nrf_send_msg(NRF_SERVICE_BLE, data, len, NULL, NULL); bool sent = nrf_send_msg(NRF_SERVICE_BLE, data, len, NULL, NULL);
if (!sent) { if (!sent) {
bool queued = tsqueue_enqueue(&drv->send_queue, data, len, NULL); bool queued = tsqueue_enqueue(&drv->tx_queue, data, len, NULL);
return queued; return queued;
} }
@ -402,7 +404,7 @@ bool ble_can_read(void) {
return false; return false;
} }
return !tsqueue_empty(&drv->data_queue); return !tsqueue_empty(&drv->rx_queue);
} }
uint32_t ble_read(uint8_t *data, uint16_t max_len) { uint32_t ble_read(uint8_t *data, uint16_t max_len) {
@ -412,17 +414,13 @@ uint32_t ble_read(uint8_t *data, uint16_t max_len) {
return 0; return 0;
} }
tsqueue_t *queue = &drv->data_queue; tsqueue_t *queue = &drv->rx_queue;
uint16_t read_len = 0; uint16_t read_len = 0;
bool received = tsqueue_dequeue(queue, data, max_len, &read_len, NULL); tsqueue_dequeue(queue, data, max_len, &read_len, NULL);
if (!received) { return read_len;
return 0;
}
return max_len;
} }
bool ble_issue_command(ble_command_t command) { bool ble_issue_command(ble_command_t command) {
@ -469,31 +467,13 @@ bool ble_get_event(ble_event_t *event) {
return false; return false;
} }
ble_event_t tmp_event = {0}; return tsqueue_dequeue(&drv->event_queue, (uint8_t *)event, sizeof(*event),
uint16_t len = 0; NULL, NULL);
bool read = tsqueue_dequeue(&drv->event_queue, (uint8_t *)&tmp_event,
sizeof(tmp_event), &len, NULL);
if (!read) {
return false;
}
if (len != sizeof(ble_event_t)) {
return false;
}
memcpy(event, &tmp_event, sizeof(ble_event_t));
return true;
} }
void ble_get_state(ble_state_t *state) { void ble_get_state(ble_state_t *state) {
const ble_driver_t *drv = &g_ble_driver; const ble_driver_t *drv = &g_ble_driver;
if (state == NULL) {
return;
}
if (!drv->initialized) { if (!drv->initialized) {
memset(state, 0, sizeof(ble_state_t)); memset(state, 0, sizeof(ble_state_t));
return; return;

View File

@ -495,11 +495,14 @@ bool nrf_abort_msg(int32_t id) {
return true; return true;
} }
irq_key_t key = irq_lock();
if (drv->tx_msg_id == id) { if (drv->tx_msg_id == id) {
drv->tx_msg_id = -1; drv->tx_msg_id = -1;
irq_unlock(key);
return true; return true;
} }
irq_unlock(key);
return false; return false;
} }