replace asf4 C ringbuffer with Rust ByteQueue
What changed, and why it matters
This commit swaps out an old C ringbuffer for a new Rust-based byte queue used to hold data sent to the Bluetooth chip. The change touches many files but is mostly a rewrite/refactor. It removes several explicit 'will it fit?' size checks before adding data to the queue, and it changes how callers pass the queue around. The Rust ByteQueue implementation itself is not shown in the diff, so we cannot verify whether it safely handles overflow, memory allocation failures, or concurrent access. The change is therefore a security-relevant refactor with some risk, but no proven vulnerability is visible in the supplied commit.
Review the new `bitbox-bytequeue` Rust crate for correct overflow handling, allocation failure behavior, and FFI safety. Ensure that removing the C-side capacity checks does not allow unbounded queue growth, memory exhaustion, or dropped/corrupted Bluetooth protocol frames. Add tests that exercise full-queue and allocation-failure conditions across both Rust and C paths. Consider re-introducing explicit back-pressure or error propagation if the Rust queue can fail silently on `put`.
Security signals we found
Removal of explicit capacity assertions before enqueueing data
Change from bounded C ringbuffer with power-of-two sizing to heap-allocated Rust ByteQueue
Loss of visible back-pressure in da14531_protocol_poll when outgoing BLE data does not fit
New FFI boundary between C callers and Rust queue implementation
Memory allocation failure handling added in some paths (NULL check + free) but not uniformly audited
Potential behavioral change: old ringbuffer overwrote oldest data when full; new ByteQueue behavior on full queue is unknown from diff
Evidence from the diff
The patch replaces the ASF4 struct ringbuffer / utils_ringbuffer.h with a Rust ByteQueue exposed through FFI as struct RustByteQueue*. C code now calls rust_bytequeue_init, rust_bytequeue_put, rust_bytequeue_get, rust_bytequeue_num, rust_bytequeue_flush, and rust_bytequeue_free. Notable changes: (1) the buffer no longer needs a power-of-two size; (2) many ASSERT(ringbuffer_num(queue) + len <= queue->size) pre-flight capacity checks are deleted; (3) rust_bytequeue_put returns no status in the C API shown, so callers cannot detect a full queue; (4) da14531_protocol_poll previously returned NULL when the outgoing packet would not fit, but now enqueues unconditionally; (5) uart_0_write_from_queue changed from signed to unsigned length and now returns false if a byte cannot be popped. The Rust ByteQueue source is not included in the diff, so behavior on overflow, OOM, and FFI soundness cannot be audited from the supplied materials.
Changed components
src/bootloader/bootloader.csrc/bootloader/startup.csrc/da14531/da14531.csrc/da14531/da14531_handler.csrc/da14531/da14531_protocol.csrc/factorysetup.csrc/reset.csrc/rust/bitbox02-rust/src/main_loop.rssrc/rust/bitbox02/src/da14531.rssrc/rust/bitbox02/src/da14531_handler.rssrc/rust/bitbox02/src/da14531_protocol.rssrc/rust/bitbox02/src/uart.rssrc/system.csrc/uart.csrc/uart.hInspect captured patch +147 / −284
diff --git a/src/bootloader/bootloader.c b/src/bootloader/bootloader.c
index 5e89684..3d27134 100644
--- a/src/bootloader/bootloader.c
+++ b/src/bootloader/bootloader.c
@@ -34,7 +34,6 @@
#include <da14531/da14531.h>
#include <da14531/da14531_protocol.h>
#include <uart.h>
- #include <utils_ringbuffer.h>
#endif
#include <assert.h>
@@ -134,7 +133,7 @@ static const uint8_t _empty_bare_flash_hash[SHA256_DIGEST_LENGTH] = {
#endif
#if PLATFORM_BITBOX02PLUS == 1
-extern struct ringbuffer uart_write_queue;
+extern struct RustByteQueue* uart_write_queue;
#endif
// clang-format off
@@ -891,10 +890,10 @@ static size_t _api_command(const uint8_t* input, uint8_t* output, const size_t m
case OP_REBOOT: {
#if PLATFORM_BITBOX02PLUS == 1
- da14531_set_product(NULL, 0, &uart_write_queue);
+ da14531_set_product(NULL, 0, uart_write_queue);
// Send it now, because we are about to reset ourselves
- while (ringbuffer_num(&uart_write_queue)) {
- uart_poll(NULL, 0, NULL, &uart_write_queue);
+ while (rust_bytequeue_num(uart_write_queue)) {
+ uart_poll(NULL, 0, NULL, uart_write_queue);
}
#endif
_api_reboot();
diff --git a/src/bootloader/startup.c b/src/bootloader/startup.c
index 5826506..b3a739c 100644
--- a/src/bootloader/startup.c
+++ b/src/bootloader/startup.c
@@ -25,7 +25,6 @@
#include <memory/memory.h>
#include <memory/memory_shared.h>
#include <uart.h>
- #include <utils_ringbuffer.h>
#if PRODUCT_BITBOX_PLUS_MULTI == 1
#define DEVICE_MODE "{\"p\":\"bb02p-bl-multi\",\"v\":\"" BOOTLOADER_VERSION "\"}"
@@ -50,10 +49,9 @@ uint32_t __stack_chk_guard = 0;
extern volatile bool measurement_done_touch;
int bootloader_pairing_request = false;
uint8_t bootloader_pairing_code_bytes[4] = {0};
- // Must be power of 2, must fit bond_db
+ // Must fit bond_db.
#define UART_OUT_BUF_LEN 2048
-struct ringbuffer uart_write_queue;
-uint8_t uart_write_buf[UART_OUT_BUF_LEN];
+struct RustByteQueue* uart_write_queue = NULL;
#endif
int main(void)
@@ -84,7 +82,8 @@ int main(void)
uint8_t uart_read_buf[USART_0_BUFFER_SIZE] = {0};
uint16_t uart_read_buf_len = 0;
- ringbuffer_init(&uart_write_queue, &uart_write_buf, UART_OUT_BUF_LEN);
+ uart_write_queue = rust_bytequeue_init(UART_OUT_BUF_LEN);
+ ASSERT(uart_write_queue != NULL);
if (!memory_ble_enabled()) {
rust_communication_mode_ble_disable();
}
@@ -95,16 +94,16 @@ int main(void)
da14531_handler_current_product = (const uint8_t*)platform_product(&product_len);
da14531_handler_current_product_len = product_len;
da14531_set_product(
- da14531_handler_current_product, da14531_handler_current_product_len, &uart_write_queue);
+ da14531_handler_current_product, da14531_handler_current_product_len, uart_write_queue);
// Set device name, the MCU and BLE chip will probably not have the same name after a reset of
// only the MCU.
char buf[MEMORY_DEVICE_MAX_LEN_WITH_NULL] = {0};
memory_random_name(buf);
- da14531_set_name(buf, &uart_write_queue);
+ da14531_set_name(buf, uart_write_queue);
// Ask for the current conection state
- da14531_get_connection_state(&uart_write_queue);
+ da14531_get_connection_state(uart_write_queue);
da14531_protocol_init();
#endif
@@ -115,13 +114,10 @@ int main(void)
#if PLATFORM_BITBOX02PLUS == 1
if (rust_communication_mode_ble_enabled()) {
if (uart_read_buf_len < sizeof(uart_read_buf) ||
- ringbuffer_num(&uart_write_queue) > 0) {
+ rust_bytequeue_num(uart_write_queue) > 0) {
// screen_sprintf_debug(1000, "uart poll");
uart_poll(
- &uart_read_buf[0],
- sizeof(uart_read_buf),
- &uart_read_buf_len,
- &uart_write_queue);
+ &uart_read_buf[0], sizeof(uart_read_buf), &uart_read_buf_len, uart_write_queue);
}
}
#endif
@@ -133,10 +129,10 @@ int main(void)
#if PLATFORM_BITBOX02PLUS == 1
if (rust_communication_mode_ble_enabled()) {
// Enqueue a power down command to the da14531
- da14531_power_down(&uart_write_queue);
+ da14531_power_down(uart_write_queue);
// Flush out the power down command. This will be the last UART communication we do.
- while (ringbuffer_num(&uart_write_queue) > 0) {
- uart_poll(NULL, 0, NULL, &uart_write_queue);
+ while (rust_bytequeue_num(uart_write_queue) > 0) {
+ uart_poll(NULL, 0, NULL, uart_write_queue);
}
rust_communication_mode_ble_disable();
bootloader_render_default_screen();
@@ -146,11 +142,11 @@ int main(void)
#if PLATFORM_BITBOX02PLUS == 1
if (rust_communication_mode_ble_enabled()) {
struct da14531_protocol_frame* frame = da14531_protocol_poll(
- &uart_read_buf[0], &uart_read_buf_len, &hww_data, &uart_write_queue);
+ &uart_read_buf[0], &uart_read_buf_len, &hww_data, uart_write_queue);
if (frame) {
// screen_sprintf_debug(1000, "got frame");
- da14531_handler(frame, &uart_write_queue);
+ da14531_handler(frame, uart_write_queue);
}
}
#endif
@@ -201,9 +197,8 @@ int main(void)
payload,
sizeof(payload));
ASSERT(len <= sizeof(tmp));
- ASSERT(ringbuffer_num(&uart_write_queue) + len <= uart_write_queue.size);
for (int i = 0; i < len; i++) {
- ringbuffer_put(&uart_write_queue, tmp[i]);
+ rust_bytequeue_put(uart_write_queue, tmp[i]);
}
bootloader_pairing_request = false;
UG_SendBuffer();
diff --git a/src/da14531/da14531.c b/src/da14531/da14531.c
index 87e5570..de2f714 100644
--- a/src/da14531/da14531.c
+++ b/src/da14531/da14531.c
@@ -4,11 +4,12 @@
#include "da14531_protocol.h"
#include "hardfault.h"
#include "util.h"
-#include "utils_ringbuffer.h"
+#include <rust/rust.h>
+#include <utils_assert.h>
enum da14531_connected_state da14531_connected_state = DA14531_CONNECTED_ADVERTISING;
-void da14531_reset(struct ringbuffer* uart_out)
+void da14531_reset(struct RustByteQueue* uart_out)
{
util_log("da14531_reset");
uint8_t payload = CTRL_CMD_BLE_CHIP_RESET;
@@ -16,13 +17,12 @@ void da14531_reset(struct ringbuffer* uart_out)
uint16_t len = da14531_protocol_format(
&buf[0], sizeof(buf), DA14531_PROTOCOL_PACKET_TYPE_CTRL_DATA, &payload, 1);
ASSERT(len <= sizeof(buf));
- ASSERT(ringbuffer_num(uart_out) + len <= uart_out->size);
for (int i = 0; i < len; i++) {
- ringbuffer_put(uart_out, buf[i]);
+ rust_bytequeue_put(uart_out, buf[i]);
}
}
-void da14531_power_down(struct ringbuffer* uart_out)
+void da14531_power_down(struct RustByteQueue* uart_out)
{
util_log("da14531_power_down");
uint8_t payload[2] = {CTRL_CMD_BLE_POWER_DOWN, 0};
@@ -30,16 +30,15 @@ void da14531_power_down(struct ringbuffer* uart_out)
uint16_t len = da14531_protocol_format(
&buf[0], sizeof(buf), DA14531_PROTOCOL_PACKET_TYPE_CTRL_DATA, &payload[0], sizeof(payload));
ASSERT(len <= sizeof(buf));
- ASSERT(ringbuffer_num(uart_out) + len <= uart_out->size);
for (int i = 0; i < len; i++) {
- ringbuffer_put(uart_out, buf[i]);
+ rust_bytequeue_put(uart_out, buf[i]);
}
}
void da14531_set_product(
volatile const uint8_t* product,
volatile uint16_t product_len,
- struct ringbuffer* uart_out)
+ struct RustByteQueue* uart_out)
{
uint8_t payload[64] = {0};
if (product_len > sizeof(payload) - 1) {
@@ -54,13 +53,12 @@ void da14531_set_product(
uint16_t tmp_len = da14531_protocol_format(
&tmp[0], sizeof(tmp), DA14531_PROTOCOL_PACKET_TYPE_CTRL_DATA, &payload[0], 1 + product_len);
ASSERT(tmp_len <= sizeof(tmp));
- ASSERT(ringbuffer_num(uart_out) + tmp_len <= uart_out->size);
for (int i = 0; i < tmp_len; i++) {
- ringbuffer_put(uart_out, tmp[i]);
+ rust_bytequeue_put(uart_out, tmp[i]);
}
}
-void da14531_set_name(const char* name, struct ringbuffer* uart_out)
+void da14531_set_name(const char* name, struct RustByteQueue* uart_out)
{
size_t name_len = strlen(name);
uint8_t payload[64] = {0};
@@ -70,21 +68,19 @@ void da14531_set_name(const char* name, struct ringbuffer* uart_out)
uint16_t tmp_len = da14531_protocol_format(
&tmp[0], sizeof(tmp), DA14531_PROTOCOL_PACKET_TYPE_CTRL_DATA, &payload[0], 1 + name_len);
ASSERT(tmp_len <= sizeof(tmp));
- ASSERT(ringbuffer_num(uart_out) + tmp_len <= uart_out->size);
for (int i = 0; i < tmp_len; i++) {
- ringbuffer_put(uart_out, tmp[i]);
+ rust_bytequeue_put(uart_out, tmp[i]);
}
}
-void da14531_get_connection_state(struct ringbuffer* uart_out)
+void da14531_get_connection_state(struct RustByteQueue* uart_out)
{
uint8_t payload = CTRL_CMD_BLE_STATUS;
uint8_t tmp[12 + sizeof(payload) * 2];
uint16_t tmp_len = da14531_protocol_format(
&tmp[0], sizeof(tmp), DA14531_PROTOCOL_PACKET_TYPE_CTRL_DATA, &payload, 1);
ASSERT(tmp_len <= sizeof(tmp));
- ASSERT(ringbuffer_num(uart_out) + tmp_len <= uart_out->size);
for (int i = 0; i < tmp_len; i++) {
- ringbuffer_put(uart_out, tmp[i]);
+ rust_bytequeue_put(uart_out, tmp[i]);
}
}
diff --git a/src/da14531/da14531.h b/src/da14531/da14531.h
index 6b6e3d0..0574c2e 100644
--- a/src/da14531/da14531.h
+++ b/src/da14531/da14531.h
@@ -3,7 +3,7 @@
#ifndef DA14531_H
#define DA14531_H
-#include "utils_ringbuffer.h"
+#include <stdint.h>
// Control commands
#define CTRL_CMD_DEVICE_NAME 1
@@ -28,9 +28,11 @@ enum da14531_connected_state {
extern enum da14531_connected_state da14531_connected_state;
-void da14531_power_down(struct ringbuffer* uart_out);
+struct RustByteQueue;
-void da14531_reset(struct ringbuffer* uart_out);
+void da14531_power_down(struct RustByteQueue* uart_out);
+
+void da14531_reset(struct RustByteQueue* uart_out);
// product is an array of characters to be set as product characteristic (not null terminated)
// procuct_len is the number of characters in the product array
@@ -38,10 +40,10 @@ void da14531_reset(struct ringbuffer* uart_out);
void da14531_set_product(
volatile const uint8_t* product,
volatile uint16_t product_len,
- struct ringbuffer* uart_out);
+ struct RustByteQueue* uart_out);
-void da14531_set_name(const char* name, struct ringbuffer* uart_out);
+void da14531_set_name(const char* name, struct RustByteQueue* uart_out);
-void da14531_get_connection_state(struct ringbuffer* uart_out);
+void da14531_get_connection_state(struct RustByteQueue* uart_out);
#endif
diff --git a/src/da14531/da14531_handler.c b/src/da14531/da14531_handler.c
index bacf1eb..3d03f51 100644
--- a/src/da14531/da14531_handler.c
+++ b/src/da14531/da14531_handler.c
@@ -10,11 +10,11 @@
#include "usb/class/usb_size.h"
#include "usb/usb_frame.h"
#include "usb/usb_packet.h"
-#include "utils_ringbuffer.h"
#include <rust/rust.h>
#include <ui/components/confirm.h>
#include <ui/components/ui_images.h>
#include <ui/fonts/monogram_5X9.h>
+#include <utils_assert.h>
const uint8_t* da14531_handler_current_product = NULL;
uint16_t da14531_handler_current_product_len = 0;
@@ -32,7 +32,7 @@ static component_t* _ble_pairing_component = NULL;
struct pairing_callback {
uint8_t key[4];
- struct ringbuffer* queue;
+ struct RustByteQueue* queue;
};
static struct pairing_callback _ble_pairing_callback_data;
@@ -50,9 +50,8 @@ static void _ble_pairing_callback(bool ok, void* param)
uint16_t len = da14531_protocol_format(
&tmp[0], sizeof(tmp), DA14531_PROTOCOL_PACKET_TYPE_CTRL_DATA, payload, sizeof(payload));
ASSERT(len <= sizeof(tmp));
- ASSERT(ringbuffer_num(data->queue) + len <= data->queue->size);
for (int i = 0; i < len; i++) {
- ringbuffer_put(data->queue, tmp[i]);
+ rust_bytequeue_put(data->queue, tmp[i]);
}
ui_screen_stack_pop();
@@ -73,7 +72,7 @@ bool da14531_handler_bond_db_set(void)
}
#endif
-static void _ctrl_handler(const struct da14531_ctrl_frame* frame, struct ringbuffer* queue)
+static void _ctrl_handler(const struct da14531_ctrl_frame* frame, struct RustByteQueue* queue)
{
switch (frame->cmd) {
case CTRL_CMD_DEVICE_NAME: {
@@ -95,9 +94,8 @@ static void _ctrl_handler(const struct da14531_ctrl_frame* frame, struct ringbuf
&response[0],
1 + strlen((char*)&response[1]));
ASSERT(len <= sizeof(tmp));
- ASSERT(ringbuffer_num(queue) + len <= queue->size);
for (int i = 0; i < len; i++) {
- ringbuffer_put(queue, tmp[i]);
+ rust_bytequeue_put(queue, tmp[i]);
}
} break;
case CTRL_CMD_BOND_DB_GET: {
@@ -120,9 +118,8 @@ static void _ctrl_handler(const struct da14531_ctrl_frame* frame, struct ringbuf
&tmp[0], sizeof(tmp), DA14531_PROTOCOL_PACKET_TYPE_CTRL_DATA, &response[0], 1);
}
ASSERT(tmp_len <= sizeof(tmp));
- ASSERT(ringbuffer_num(queue) + tmp_len <= queue->size);
for (int i = 0; i < tmp_len; i++) {
- ringbuffer_put(queue, tmp[i]);
+ rust_bytequeue_put(queue, tmp[i]);
}
} break;
case CTRL_CMD_BOND_DB_SET:
@@ -223,7 +220,7 @@ static void _ctrl_handler(const struct da14531_ctrl_frame* frame, struct ringbuf
sizeof(response));
ASSERT(len <= sizeof(tmp));
for (int i = 0; i < len; i++) {
- ringbuffer_put(queue, tmp[i]);
+ rust_bytequeue_put(queue, tmp[i]);
}
} break;
case CTRL_CMD_PRODUCT_STRING: {
@@ -246,9 +243,8 @@ static void _ctrl_handler(const struct da14531_ctrl_frame* frame, struct ringbuf
&response[0],
sizeof(response));
ASSERT(len <= sizeof(tmp));
- ASSERT(ringbuffer_num(queue) + len <= queue->size);
for (int i = 0; i < len; i++) {
- ringbuffer_put(queue, tmp[i]);
+ rust_bytequeue_put(queue, tmp[i]);
}
} break;
#if !defined(NDEBUG)
@@ -268,7 +264,7 @@ static void _ctrl_handler(const struct da14531_ctrl_frame* frame, struct ringbuf
}
}
-static void _hww_handler(const struct da14531_protocol_frame* frame, struct ringbuffer* queue)
+static void _hww_handler(const struct da14531_protocol_frame* frame, struct RustByteQueue* queue)
{
// util_log(" in: %s", util_dbg_hex(frame->payload, 64));
(void)queue;
@@ -282,7 +278,7 @@ static void _hww_handler(const struct da14531_protocol_frame* frame, struct ring
}
// Handler must not use the frame pointer after it has returned
-void da14531_handler(const struct da14531_protocol_frame* frame, struct ringbuffer* queue)
+void da14531_handler(const struct da14531_protocol_frame* frame, struct RustByteQueue* queue)
{
// util_log("handler called");
switch (frame->type) {
diff --git a/src/da14531/da14531_handler.h b/src/da14531/da14531_handler.h
index 5a45fac..808e23d 100644
--- a/src/da14531/da14531_handler.h
+++ b/src/da14531/da14531_handler.h
@@ -5,15 +5,17 @@
#include "da14531_protocol.h"
#include <platform/platform_config.h>
-#include <utils_ringbuffer.h>
+#include <stdbool.h>
extern const uint8_t* da14531_handler_current_product;
extern uint16_t da14531_handler_current_product_len;
+struct RustByteQueue;
+
#if FACTORYSETUP == 1
bool da14531_handler_bond_db_set(void);
#endif
-void da14531_handler(const struct da14531_protocol_frame* frame, struct ringbuffer* queue);
+void da14531_handler(const struct da14531_protocol_frame* frame, struct RustByteQueue* queue);
#endif
diff --git a/src/da14531/da14531_protocol.c b/src/da14531/da14531_protocol.c
index 4cc2287..7f61170 100644
--- a/src/da14531/da14531_protocol.c
+++ b/src/da14531/da14531_protocol.c
@@ -106,7 +106,7 @@ static void _firmware_loader_poll(
struct firmware_loader* self,
const uint8_t* buf_in,
uint16_t* buf_in_len,
- struct ringbuffer* out_queue)
+ struct RustByteQueue* out_queue)
{
// if (*buf_in_len > 0) {
// util_log(
@@ -131,17 +131,16 @@ static void _firmware_loader_poll(
util_log("da14531: requested firmware");
self->state = FIRMWARE_LOADER_STATE_SEEN_STX;
// There is no point in sending anything that was scheduled to be sent out
- ringbuffer_flush(out_queue);
+ rust_bytequeue_flush(out_queue);
break;
}
}
*buf_in_len = 0;
break;
case FIRMWARE_LOADER_STATE_SEEN_STX: {
- ASSERT(ringbuffer_num(out_queue) + 3 <= out_queue->size);
- ringbuffer_put(out_queue, SOH);
- ringbuffer_put(out_queue, ble_fw_size & 0xff);
- ringbuffer_put(out_queue, (ble_fw_size >> 8) & 0xff);
+ rust_bytequeue_put(out_queue, SOH);
+ rust_bytequeue_put(out_queue, ble_fw_size & 0xff);
+ rust_bytequeue_put(out_queue, (ble_fw_size >> 8) & 0xff);
self->state = FIRMWARE_LOADER_STATE_SENT_HEADER;
} break;
@@ -150,7 +149,7 @@ static void _firmware_loader_poll(
if (buf_in[0] == ACK) {
util_log("da14513: sending firmware");
// Wait until uart tx is ready, and issue a write for the firmware.
- // Don't use ringbuffer as the source is static
+ // Don't use bytequeue as the source is static
if (ble_fw != NULL) {
// This should never happen
// TODO
@@ -170,8 +169,7 @@ static void _firmware_loader_poll(
if (*buf_in_len == 1) {
if (buf_in[0] == ble_fw_checksum) {
util_log("da14531: checksum success (%x)", buf_in[0]);
- ASSERT(ringbuffer_num(out_queue) + 1 <= out_queue->size);
- ringbuffer_put(out_queue, ACK);
+ rust_bytequeue_put(out_queue, ACK);
self->state = FIRMWARE_LOADER_STATE_DONE;
} else {
util_log(
@@ -341,21 +339,16 @@ struct da14531_protocol_frame* da14531_protocol_poll(
uint8_t* in_buf,
uint16_t* in_buf_len,
const uint8_t** hww_data,
- struct ringbuffer* out_queue)
+ struct RustByteQueue* out_queue)
{
if (hww_data && *hww_data) {
uint8_t tmp[12 + 64 * 2];
int len = da14531_protocol_format(
&tmp[0], sizeof(tmp), DA14531_PROTOCOL_PACKET_TYPE_BLE_DATA, *hww_data, 64);
ASSERT(len <= (int)sizeof(tmp));
- // If it won't fit, try again later
- if (ringbuffer_num(out_queue) + len > out_queue->size) {
- util_log("ringbuffer full");
- return NULL;
- }
util_log("out: %s", util_dbg_hex(*hww_data, 64));
for (int i = 0; i < len; i++) {
- ringbuffer_put(out_queue, tmp[i]);
+ rust_bytequeue_put(out_queue, tmp[i]);
}
*hww_data = NULL;
}
diff --git a/src/da14531/da14531_protocol.h b/src/da14531/da14531_protocol.h
index 0a82858..576f87b 100644
--- a/src/da14531/da14531_protocol.h
+++ b/src/da14531/da14531_protocol.h
@@ -2,7 +2,6 @@
#ifndef DA14531_PROTOCOL_H
#define DA14531_PROTOCOL_H
-#include "utils_ringbuffer.h"
#include <stdint.h>
enum da14531_protocol_packet_type {
@@ -19,6 +18,8 @@ struct da14531_protocol_frame {
uint8_t payload[];
} __attribute((packed));
+struct RustByteQueue;
+
void da14531_protocol_init(void);
// Will return true once the firmware is loaded to the BLE chip
@@ -33,7 +34,7 @@ struct da14531_protocol_frame* da14531_protocol_poll(
uint8_t* in_buf,
uint16_t* in_buf_len,
const uint8_t** hww_data,
- struct ringbuffer* out_queue);
+ struct RustByteQueue* out_queue);
// Formats a packet into buf for sending over serial. Worst case the buf_len needs to fit:
// SOF - 1 byte
diff --git a/src/factorysetup.c b/src/factorysetup.c
index a0ade4a..4e8fa3e 100644
--- a/src/factorysetup.c
+++ b/src/factorysetup.c
@@ -19,7 +19,6 @@
#include "usb/usb.h"
#include "usb/usb_packet.h"
#include "usb/usb_processing.h"
-#include "utils_ringbuffer.h"
#include <rust/rust.h>
#include <ui/oled/oled.h>
@@ -1121,25 +1120,28 @@ static ble_error_code_t _setup_ble(void)
da14531_protocol_init();
uint8_t uart_read_buf[1024];
uint16_t uart_read_buf_len = 0;
- uint8_t uart_write_buf[1024];
- struct ringbuffer uart_write_queue;
- ringbuffer_init(&uart_write_queue, uart_write_buf, sizeof(uart_write_buf));
+ struct RustByteQueue* uart_write_queue = rust_bytequeue_init(1024);
+ if (uart_write_queue == NULL) {
+ return BLE_ERR_NOT_BOOTED;
+ }
// If the BLE chip already was successfully booted, for example by running the factory-setup
// once already and not power cycled, we need to reset it to trigger a complete setup again.
- da14531_reset(&uart_write_queue);
+ da14531_reset(uart_write_queue);
int32_t timeout = 1000000;
while (timeout-- > 0) {
- uart_poll(uart_read_buf, sizeof(uart_read_buf), &uart_read_buf_len, &uart_write_queue);
+ uart_poll(uart_read_buf, sizeof(uart_read_buf), &uart_read_buf_len, uart_write_queue);
struct da14531_protocol_frame* frame =
- da14531_protocol_poll(uart_read_buf, &uart_read_buf_len, NULL, &uart_write_queue);
+ da14531_protocol_poll(uart_read_buf, &uart_read_buf_len, NULL, uart_write_queue);
if (frame) {
- da14531_handler(frame, &uart_write_queue);
+ da14531_handler(frame, uart_write_queue);
}
if (da14531_handler_bond_db_set()) {
// We have successfully booted the BLE chip and the bond db is stored.
+ rust_bytequeue_free(uart_write_queue);
return BLE_OK;
}
}
+ rust_bytequeue_free(uart_write_queue);
screen_print_debug("Failed to check BLE chip status", 0);
return BLE_ERR_NOT_BOOTED;
}
diff --git a/src/reset.c b/src/reset.c
index 4fa69a9..307afd8 100644
--- a/src/reset.c
+++ b/src/reset.c
@@ -18,12 +18,14 @@
void reset_ble(void)
{
#if !defined(TESTING)
- struct ringbuffer uart_queue;
- uint8_t uart_queue_buf[64];
- ringbuffer_init(&uart_queue, &uart_queue_buf[0], sizeof(uart_queue_buf));
- da14531_reset(&uart_queue);
- while (ringbuffer_num(&uart_queue)) {
- uart_poll(NULL, 0, NULL, &uart_queue);
+ struct RustByteQueue* uart_queue = rust_bytequeue_init(64);
+ if (uart_queue == NULL) {
+ return;
}
+ da14531_reset(uart_queue);
+ while (rust_bytequeue_num(uart_queue)) {
+ uart_poll(NULL, 0, NULL, uart_queue);
+ }
+ rust_bytequeue_free(uart_queue);
#endif
}
diff --git a/src/rust/Cargo.lock b/src/rust/Cargo.lock
index 7e99681..58a28ea 100644
--- a/src/rust/Cargo.lock
+++ b/src/rust/Cargo.lock
@@ -146,6 +146,7 @@ version = "0.1.0"
dependencies = [
"bip39",
"bitbox-aes",
+ "bitbox-bytequeue",
"bitbox-framed-serial-link",
"bitbox-hal",
"bitbox02-rust",
@@ -174,6 +175,7 @@ dependencies = [
"bip32-ed25519",
"bip39",
"bitbox-aes",
+ "bitbox-bytequeue",
"bitbox-executor",
"bitbox-hal",
"bitbox-secp256k1",
diff --git a/src/rust/bitbox02-rust/Cargo.toml b/src/rust/bitbox02-rust/Cargo.toml
index aa40fc7..52e966c 100644
--- a/src/rust/bitbox02-rust/Cargo.toml
+++ b/src/rust/bitbox02-rust/Cargo.toml
@@ -16,6 +16,7 @@ doctest = false
[dependencies]
bitbox-hal = { path = "../bitbox-hal" }
bitbox02 = { path = "../bitbox02" }
+bitbox-bytequeue = { path = "../bitbox-bytequeue" }
bitbox-secp256k1 = { path = "../bitbox-secp256k1" }
util = { path = "../util" }
erc20_params = { path = "../erc20_params", optional = true }
diff --git a/src/rust/bitbox02-rust/src/main_loop.rs b/src/rust/bitbox02-rust/src/main_loop.rs
index 54482f0..165ca63 100644
--- a/src/rust/bitbox02-rust/src/main_loop.rs
+++ b/src/rust/bitbox02-rust/src/main_loop.rs
@@ -2,8 +2,8 @@
use crate::hal::{Memory, System};
use alloc::boxed::Box;
+use bitbox_bytequeue::ByteQueue;
use bitbox_executor::Executor;
-use bitbox02::ringbuffer::RingBuffer;
use bitbox02::uart::USART_0_BUFFER_SIZE;
use bitbox02::usb_packet::USB_FRAME;
use core::future::Future;
@@ -11,8 +11,6 @@ use core::mem::MaybeUninit;
use core::pin::Pin;
use core::sync::atomic::{AtomicBool, Ordering};
-const UART_OUT_BUF_LEN: u32 = 2048;
-
static EXECUTOR: Executor = Executor::new();
type DynExecutorFuture = Pin<Box<dyn Future<Output = ()> + 'static>>;
@@ -28,8 +26,7 @@ pub fn main_loop<H: crate::hal::Hal>(hal: &mut H) -> ! {
let mut uart_read_buf = [0u8; USART_0_BUFFER_SIZE as usize];
let mut uart_read_buf_len = 0u16;
- let mut uart_write_buf = [0u8; UART_OUT_BUF_LEN as usize];
- let mut uart_write_queue = RingBuffer::new(&mut uart_write_buf);
+ let mut uart_write_queue = ByteQueue::with_capacity(2048);
// If the bootloader has booted the BLE chip, the BLE chip isn't aware of the name according to
// the fw. Send it over.
@@ -59,7 +56,7 @@ pub fn main_loop<H: crate::hal::Hal>(hal: &mut H) -> ! {
loop {
// Do UART I/O
if crate::communication_mode::ble_enabled(hal) {
- if uart_read_buf_len < uart_read_buf.len() as u16 || uart_write_queue.len() > 0 {
+ if uart_read_buf_len < uart_read_buf.len() as u16 || uart_write_queue.num() > 0 {
bitbox02::uart::poll(
Some(&mut uart_read_buf),
Some(&mut uart_read_buf_len),
@@ -99,7 +96,7 @@ pub fn main_loop<H: crate::hal::Hal>(hal: &mut H) -> ! {
bitbox02::da14531::power_down(&mut uart_write_queue);
// Flush out the power down command. This will be the last UART communication
// we do.
- while uart_write_queue.len() > 0 {
+ while uart_write_queue.num() > 0 {
bitbox02::uart::poll(None, None, &mut uart_write_queue);
}
crate::communication_mode::ble_disable();
diff --git a/src/rust/bitbox02-sys/build.rs b/src/rust/bitbox02-sys/build.rs
index 87d56c1..0f1048a 100644
--- a/src/rust/bitbox02-sys/build.rs
+++ b/src/rust/bitbox02-sys/build.rs
@@ -42,7 +42,6 @@ const ALLOWLIST_TYPES: &[&str] = &[
"delay_t",
"event_slider_data_t",
"event_types",
- "ringbuffer",
"securechip_error_t",
"trinary_input_string_params_t",
"UG_COLOR",
@@ -138,11 +137,6 @@ const ALLOWLIST_FNS: &[&str] = &[
"reboot_to_bootloader",
"reboot",
"reset_ble",
- "ringbuffer_flush",
- "ringbuffer_get",
- "ringbuffer_init",
- "ringbuffer_num",
- "ringbuffer_put",
"screen_clear",
"screen_init",
"screen_print_debug",
diff --git a/src/rust/bitbox02/Cargo.toml b/src/rust/bitbox02/Cargo.toml
index 957ee48..121c6fd 100644
--- a/src/rust/bitbox02/Cargo.toml
+++ b/src/rust/bitbox02/Cargo.toml
@@ -11,6 +11,7 @@ license = "Apache-2.0"
[dependencies]
bitbox02-sys = {path="../bitbox02-sys"}
bitbox-hal = { path = "../bitbox-hal" }
+bitbox-bytequeue = { path = "../bitbox-bytequeue" }
util = {path = "../util"}
zeroize = { workspace = true }
bip39 = { workspace = true }
diff --git a/src/rust/bitbox02/src/da14531.rs b/src/rust/bitbox02/src/da14531.rs
index 1f17c3c..5de5f30 100644
--- a/src/rust/bitbox02/src/da14531.rs
+++ b/src/rust/bitbox02/src/da14531.rs
@@ -1,24 +1,28 @@
// SPDX-License-Identifier: Apache-2.0
-use crate::ringbuffer::RingBuffer;
+use bitbox_bytequeue::ByteQueue;
/// Set the product string of the BLE chip. The product string must be smaller than 64 bytes.
-pub fn set_product(product: &str, queue: &mut RingBuffer) {
+pub fn set_product(product: &str, queue: &mut ByteQueue) {
let product = product.as_bytes();
unsafe {
- bitbox02_sys::da14531_set_product(product.as_ptr(), product.len() as u16, &mut queue.inner)
+ bitbox02_sys::da14531_set_product(
+ product.as_ptr(),
+ product.len() as u16,
+ queue as *mut _ as *mut _,
+ )
}
}
/// Set the device name of the BLE chip. The name must contain no null bytes.
-pub fn set_name(name: &str, queue: &mut RingBuffer) {
+pub fn set_name(name: &str, queue: &mut ByteQueue) {
let c_name = util::strings::str_to_cstr_vec(name).unwrap();
- unsafe { bitbox02_sys::da14531_set_name(c_name.as_ptr(), &mut queue.inner) }
+ unsafe { bitbox02_sys::da14531_set_name(c_name.as_ptr(), queue as *mut _ as *mut _) }
}
/// Power down the BLE chip.
-pub fn power_down(queue: &mut RingBuffer) {
- unsafe { bitbox02_sys::da14531_power_down(&mut queue.inner) }
+pub fn power_down(queue: &mut ByteQueue) {
+ unsafe { bitbox02_sys::da14531_power_down(queue as *mut _ as *mut _) }
}
#[cfg(test)]
@@ -35,9 +39,9 @@ mod tests {
const CTRL_CMD_PRODUCT_STRING: u8 = 7;
const CTRL_CMD_BLE_POWER_DOWN: u8 = 12;
- fn drain(queue: &mut RingBuffer) -> Vec<u8> {
+ fn drain(queue: &mut ByteQueue) -> Vec<u8> {
let mut out = Vec::new();
- while queue.len() > 0 {
+ while queue.num() > 0 {
out.push(queue.get().unwrap());
}
out
@@ -46,8 +50,7 @@ mod tests {
#[test]
fn test_set_product() {
let product = "foo bar";
- let mut buf = [0u8; 256];
- let mut queue = RingBuffer::new(&mut buf);
+ let mut queue = ByteQueue::with_capacity(64);
set_product(product, &mut queue);
@@ -64,8 +67,7 @@ mod tests {
#[test]
fn test_power_down() {
- let mut buf = [0u8; 256];
- let mut queue = RingBuffer::new(&mut buf);
+ let mut queue = ByteQueue::with_capacity(64);
power_down(&mut queue);
@@ -82,8 +84,7 @@ mod tests {
#[test]
fn test_set_name() {
let name = "foo bar";
- let mut buf = [0u8; 256];
- let mut queue = RingBuffer::new(&mut buf);
+ let mut queue = ByteQueue::with_capacity(64);
set_name(name, &mut queue);
diff --git a/src/rust/bitbox02/src/da14531_handler.rs b/src/rust/bitbox02/src/da14531_handler.rs
index cbcce06..9658c01 100644
--- a/src/rust/bitbox02/src/da14531_handler.rs
+++ b/src/rust/bitbox02/src/da14531_handler.rs
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: Apache-2.0
-use crate::ringbuffer::RingBuffer;
+use bitbox_bytequeue::ByteQueue;
use bitbox02_sys::da14531_protocol_frame;
-pub fn handler(frame: &'static da14531_protocol_frame, uart_write_queue: &mut RingBuffer) {
+pub fn handler(frame: &'static da14531_protocol_frame, uart_write_queue: &mut ByteQueue) {
unsafe {
- bitbox02_sys::da14531_handler(frame as *const _, &mut uart_write_queue.inner);
+ bitbox02_sys::da14531_handler(frame as *const _, uart_write_queue as *mut _ as *mut _);
}
}
diff --git a/src/rust/bitbox02/src/da14531_protocol.rs b/src/rust/bitbox02/src/da14531_protocol.rs
index ac105aa..9d70a20 100644
--- a/src/rust/bitbox02/src/da14531_protocol.rs
+++ b/src/rust/bitbox02/src/da14531_protocol.rs
@@ -1,13 +1,13 @@
// SPDX-License-Identifier: Apache-2.0
-use crate::ringbuffer::RingBuffer;
+use bitbox_bytequeue::ByteQueue;
pub use bitbox02_sys::da14531_protocol_frame;
pub fn poll(
uart_read_buf: &mut [u8],
uart_read_buf_len: &mut u16,
hww_data: &mut Option<[u8; 64]>,
- uart_write_queue: &mut RingBuffer,
+ uart_write_queue: &mut ByteQueue,
) -> Option<&'static da14531_protocol_frame> {
let mut data: *const u8 = if let Some(data) = (*hww_data).as_ref() {
data.as_ptr() as *const _
@@ -19,7 +19,7 @@ pub fn poll(
uart_read_buf.as_mut_ptr() as *mut _,
uart_read_buf_len as *mut _,
&mut data as *mut _,
- &mut uart_write_queue.inner as *mut _,
+ uart_write_queue as *mut _ as *mut _,
)
};
if data.is_null() {
diff --git a/src/rust/bitbox02/src/lib.rs b/src/rust/bitbox02/src/lib.rs
index 3b24799..e1660cc 100644
--- a/src/rust/bitbox02/src/lib.rs
+++ b/src/rust/bitbox02/src/lib.rs
@@ -38,7 +38,6 @@ pub mod memory;
pub mod platform;
pub mod queue;
pub mod random;
-pub mod ringbuffer;
pub mod screen;
pub mod screen_saver;
pub mod sd;
diff --git a/src/rust/bitbox02/src/ringbuffer.rs b/src/rust/bitbox02/src/ringbuffer.rs
deleted file mode 100644
index fcee257..0000000
--- a/src/rust/bitbox02/src/ringbuffer.rs
+++ /dev/null
@@ -1,125 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-
-use bitbox02_sys::{ringbuffer, ringbuffer_init};
-use core::marker::PhantomData;
-
-/// A wrapper around ASF4 `ringbuffer` type
-pub struct RingBuffer<'a> {
- pub(crate) inner: ringbuffer,
- _marker: PhantomData<&'a mut [u8]>,
-}
-
-impl<'a> RingBuffer<'a> {
- /// `buf` length must be a power of 2
- pub fn new(buf: &'a mut [u8]) -> Self {
- debug_assert!(buf.len().is_power_of_two());
- let mut inner = ringbuffer {
- buf: core::ptr::null_mut(),
- size: 0,
- read_index: 0,
- write_index: 0,
- };
- unsafe {
- ringbuffer_init(
- &mut inner as *mut _,
- buf as *mut _ as *mut _,
- buf.len() as u32,
- );
- };
- RingBuffer {
- inner,
- _marker: PhantomData,
- }
- }
-
- /// Bytes currently used
- pub fn len(&self) -> u32 {
- unsafe { bitbox02_sys::ringbuffer_num(&self.inner as *const _) }
- }
-}
-
-// These are currently only used in unit tests.
-#[cfg(test)]
-impl RingBuffer<'_> {
- pub fn put(&mut self, data: u8) -> Result<(), i32> {
- let result = unsafe { bitbox02_sys::ringbuffer_put(&mut self.inner as *mut _, data) };
- if result == 0 { Ok(()) } else { Err(result) }
- }
-
- pub fn get(&mut self) -> Result<u8, i32> {
- let mut out = 0u8;
- let result = unsafe { bitbox02_sys::ringbuffer_get(&mut self.inner as *mut _, &mut out) };
- if result == 0 { Ok(out) } else { Err(result) }
- }
-
- pub fn flush(&mut self) -> Result<(), u32> {
- let result = unsafe { bitbox02_sys::ringbuffer_flush(&mut self.inner as *mut _) };
- if result == 0 { Ok(()) } else { Err(result) }
- }
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn test_new_len_is_zero() {
- let mut buf = [0u8; 8];
- let rb = RingBuffer::new(&mut buf);
- assert_eq!(rb.len(), 0);
- }
-
- #[test]
- fn test_put_get_len() {
- let mut buf = [0u8; 8];
- let mut rb = RingBuffer::new(&mut buf);
-
- rb.put(1).unwrap();
- assert_eq!(rb.len(), 1);
-
- rb.put(2).unwrap();
- assert_eq!(rb.len(), 2);
-
- let out = rb.get().unwrap();
- assert_eq!(out, 1);
- assert_eq!(rb.len(), 1);
- }
-
- #[test]
- fn test_overwrite_oldest() {
- // Buf len must be a power of 2, and the ringbuffer capacity is `buf.len()`.
- let mut buf = [0u8; 8];
- let mut rb = RingBuffer::new(&mut buf);
-
- for i in 0u8..9 {
- rb.put(i).unwrap();
- }
- assert_eq!(rb.len(), 8);
-
- let out = rb.get().unwrap();
- assert_eq!(out, 1);
- }
-
- #[test]
- fn test_get_empty_returns_error() {
- let mut buf = [0u8; 8];
- let mut rb = RingBuffer::new(&mut buf);
-
- let result = rb.get();
- assert!(result.is_err());
- assert_eq!(rb.len(), 0);
- }
-
- #[test]
- fn test_flush() {
- let mut buf = [0u8; 8];
- let mut rb = RingBuffer::new(&mut buf);
-
- rb.put(1).unwrap();
- rb.put(2).unwrap();
- assert_eq!(rb.len(), 2);
-
- rb.flush().unwrap();
- assert_eq!(rb.len(), 0);
- }
-}
diff --git a/src/rust/bitbox02/src/uart.rs b/src/rust/bitbox02/src/uart.rs
index c24738c..3c70690 100644
--- a/src/rust/bitbox02/src/uart.rs
+++ b/src/rust/bitbox02/src/uart.rs
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
-use crate::ringbuffer::RingBuffer;
+use bitbox_bytequeue::ByteQueue;
pub use bitbox02_sys::USART_0_BUFFER_SIZE;
pub fn poll(
uart_read_buf: Option<&mut [u8]>,
uart_read_buf_len: Option<&mut u16>,
- uart_write_queue: &mut RingBuffer,
+ uart_write_queue: &mut ByteQueue,
) {
let (uart_read_buf, cap) = if let Some(uart_read_buf) = uart_read_buf {
(
@@ -27,7 +27,7 @@ pub fn poll(
uart_read_buf,
cap,
uart_read_buf_len,
- &mut uart_write_queue.inner,
+ uart_write_queue as *mut _ as *mut _,
);
}
}
diff --git a/src/system.c b/src/system.c
index 33ef1c5..4e36057 100644
--- a/src/system.c
+++ b/src/system.c
@@ -2,9 +2,9 @@
#include "system.h"
#include "da14531/da14531.h"
-#include "utils_ringbuffer.h"
#include <memory/memory.h>
#include <memory/memory_shared.h>
+#include <rust/rust.h>
#include <screen.h>
#ifndef TESTING
#include "uart.h"
@@ -13,17 +13,19 @@
static void _ble_clear_product(void)
{
- struct ringbuffer uart_queue;
- uint8_t uart_queue_buf[64];
- ringbuffer_init(&uart_queue, &uart_queue_buf[0], sizeof(uart_queue_buf));
- da14531_set_product(NULL, 0, &uart_queue);
- while (ringbuffer_num(&uart_queue)) {
+ struct RustByteQueue* uart_queue = rust_bytequeue_init(64);
+ if (uart_queue == NULL) {
+ return;
+ }
+ da14531_set_product(NULL, 0, uart_queue);
+ while (rust_bytequeue_num(uart_queue)) {
#ifndef TESTING
- uart_poll(NULL, 0, NULL, &uart_queue);
+ uart_poll(NULL, 0, NULL, uart_queue);
#else
- ringbuffer_flush(&uart_queue);
+ rust_bytequeue_flush(uart_queue);
#endif
}
+ rust_bytequeue_free(uart_queue);
}
void reboot_to_bootloader(void)
diff --git a/src/uart.c b/src/uart.c
index 3cef665..dc81820 100644
--- a/src/uart.c
+++ b/src/uart.c
@@ -4,6 +4,7 @@
#include "driver_init.h"
#include "util.h"
#include "utils_assert.h"
+#include <rust/rust.h>
#define EVENT_READ 0x01 // Available to read
#define EVENT_WRITE 0x02 // Available to write
@@ -83,7 +84,7 @@ bool uart_0_write(const uint8_t* buf, uint16_t buf_len)
return wrote == buf_len;
}
-bool uart_0_write_from_queue(struct ringbuffer* queue)
+bool uart_0_write_from_queue(struct RustByteQueue* queue)
{
// Must be static becuase UART driver will read from it until all bytes has been written out
// over uart. Must not touch buffer unless EVENT_WRITE is set (indicating driver is done with
@@ -93,27 +94,24 @@ bool uart_0_write_from_queue(struct ringbuffer* queue)
if (!(_usart_0_readyness & EVENT_WRITE)) {
return false;
}
- int32_t len;
- int32_t res;
- len = MIN(ringbuffer_num(queue), sizeof(_out_buf));
- for (int32_t i = 0; i < len; i++) {
- res = ringbuffer_get(queue, &_out_buf[i]);
- ASSERT(res == ERR_NONE);
- if (res != ERR_NONE) {
- break;
+ uint32_t len = MIN(rust_bytequeue_num(queue), sizeof(_out_buf));
+ for (uint32_t i = 0; i < len; i++) {
+ bool got = rust_bytequeue_get(queue, &_out_buf[i]);
+ ASSERT(got);
+ if (!got) {
+ return false;
}
}
- // util_log("will write %d char, left %d", (int)len, (int)ringbuffer_num(queue));
- int32_t wrote = _write(_out_buf, len);
- ASSERT(wrote == len);
- return wrote == len;
+ int32_t wrote = _write(_out_buf, (uint16_t)len);
+ ASSERT(wrote == (int32_t)len);
+ return wrote == (int32_t)len;
}
void uart_poll(
uint8_t* read_buf,
uint16_t read_buf_cap,
uint16_t* read_buf_len,
- struct ringbuffer* out_queue)
+ struct RustByteQueue* out_queue)
{
if (read_buf) {
*read_buf_len += uart_0_read(&read_buf[*read_buf_len], read_buf_cap - *read_buf_len);
@@ -122,7 +120,7 @@ void uart_poll(
ASSERT(*read_buf_len < USART_0_BUFFER_SIZE);
}
- if (ringbuffer_num(out_queue) > 0) {
+ if (rust_bytequeue_num(out_queue) > 0) {
uart_0_write_from_queue(out_queue);
}
}
diff --git a/src/uart.h b/src/uart.h
index 8dfe8a2..a666ce6 100644
--- a/src/uart.h
+++ b/src/uart.h
@@ -4,17 +4,18 @@
#define UART_H
#include <stdbool.h>
#include <stdint.h>
-#include <utils_ringbuffer.h>
+
+struct RustByteQueue;
void uart_init(void);
int32_t uart_0_read(uint8_t* buf, uint16_t buf_len);
bool uart_0_write(const uint8_t* buf, uint16_t buf_len);
-bool uart_0_write_from_queue(struct ringbuffer* queue);
+bool uart_0_write_from_queue(struct RustByteQueue* queue);
// Check if there are new bytes and try to send out if there are bytes to send
void uart_poll(
uint8_t* read_buf,
uint16_t read_buf_cap,
uint16_t* read_buf_len,
- struct ringbuffer* out_queue);
+ struct RustByteQueue* out_queue);
#endif
diff --git a/test/simulator-graphical-bb03/Cargo.lock b/test/simulator-graphical-bb03/Cargo.lock
index cb02a7b..16e57c8 100644
--- a/test/simulator-graphical-bb03/Cargo.lock
+++ b/test/simulator-graphical-bb03/Cargo.lock
@@ -370,6 +370,7 @@ version = "0.1.0"
dependencies = [
"bip39",
"bitbox-hal",
+ "bitbox-bytequeue",
"bitbox02-sys",
"futures-lite",
"grounded",
@@ -396,6 +397,7 @@ dependencies = [
"bitbox-aes",
"bitbox-executor",
"bitbox-hal",
+ "bitbox-bytequeue",
"bitbox-secp256k1",
"bitbox02",
"bitbox02-noise",
diff --git a/test/simulator-graphical/Cargo.lock b/test/simulator-graphical/Cargo.lock
index 51ed854..cd0ae49 100644
--- a/test/simulator-graphical/Cargo.lock
+++ b/test/simulator-graphical/Cargo.lock
@@ -332,6 +332,7 @@ version = "0.1.0"
dependencies = [
"bip39",
"bitbox-hal",
+ "bitbox-bytequeue",
"bitbox02-sys",
"futures-lite",
"grounded",
@@ -358,6 +359,7 @@ dependencies = [
"bitbox-aes",
"bitbox-executor",
"bitbox-hal",
+ "bitbox-bytequeue",
"bitbox-secp256k1",
"bitbox02",
"bitbox02-noise",
Why this scored 38/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.