mp_flipper_modflipperzero_uart.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <furi.h>
  2. #include <furi_hal.h>
  3. #include <mp_flipper_modflipperzero.h>
  4. typedef struct {
  5. FuriHalSerialHandle* handle;
  6. FuriStreamBuffer* rx_buffer;
  7. } mp_flipper_uart_ctx_t;
  8. static void on_uart_rx(FuriHalSerialHandle* handle, FuriHalSerialRxEvent event, void* context) {
  9. FuriStreamBuffer* buffer = context;
  10. if(event & FuriHalSerialRxEventData) {
  11. uint8_t data = furi_hal_serial_async_rx(handle);
  12. furi_stream_buffer_send(buffer, &data, 1, 0);
  13. }
  14. }
  15. inline void* mp_flipper_uart_open(uint8_t raw_mode, uint32_t baud_rate) {
  16. FuriHalSerialId mode = raw_mode == MP_FLIPPER_UART_MODE_USART ? FuriHalSerialIdUsart :
  17. FuriHalSerialIdLpuart;
  18. if(furi_hal_serial_control_is_busy(mode)) {
  19. return NULL;
  20. }
  21. mp_flipper_uart_ctx_t* ctx = malloc(sizeof(mp_flipper_uart_ctx_t));
  22. ctx->handle = furi_hal_serial_control_acquire(mode);
  23. ctx->rx_buffer = furi_stream_buffer_alloc(512, 1);
  24. furi_hal_serial_init(ctx->handle, baud_rate);
  25. furi_hal_serial_async_rx_start(ctx->handle, on_uart_rx, ctx->rx_buffer, false);
  26. return ctx;
  27. }
  28. inline bool mp_flipper_uart_close(void* handle) {
  29. mp_flipper_uart_ctx_t* ctx = handle;
  30. furi_hal_serial_deinit(ctx->handle);
  31. furi_hal_serial_control_release(ctx->handle);
  32. furi_stream_buffer_free(ctx->rx_buffer);
  33. free(ctx);
  34. return true;
  35. }
  36. inline bool mp_flipper_uart_sync(void* handle) {
  37. mp_flipper_uart_ctx_t* ctx = handle;
  38. furi_hal_serial_tx_wait_complete(ctx->handle);
  39. }
  40. inline size_t mp_flipper_uart_read(void* handle, void* buffer, size_t size, int* errcode) {
  41. mp_flipper_uart_ctx_t* ctx = handle;
  42. size_t read = 0;
  43. size_t total = 0;
  44. size_t left = size;
  45. do {
  46. read = furi_stream_buffer_receive(ctx->rx_buffer, &buffer[read], left, 0);
  47. total += read;
  48. left -= read;
  49. } while(read > 0);
  50. return total;
  51. }
  52. inline size_t mp_flipper_uart_write(void* handle, const void* buffer, size_t size, int* errcode) {
  53. mp_flipper_uart_ctx_t* ctx = handle;
  54. furi_hal_serial_tx(ctx->handle, buffer, size);
  55. return size;
  56. }