libjoybus
Joybus implementation for 32-bit MCUs
Loading...
Searching...
No Matches
gecko.h
1
9
10#pragma once
11
12#include "em_gpio.h"
13#include "em_ldma.h"
14#include "em_timer.h"
15#include "em_usart.h"
16
17#include "sl_sleeptimer.h"
18
19#include <joybus/bus.h>
20
24#define JOYBUS_GECKO(bus) ((struct joybus_gecko *)(bus))
25
26// Number of chips per bit for the line coding
27#define CHIPS_PER_BIT 4
28
29// Edges per byte for pulse timing decoding
30#define EDGES_PER_BYTE 16
31
32// Private implementation details - do not access directly
34 // Bus state
35 uint8_t state;
36
37 // GPIO configuration
38 GPIO_Port_TypeDef gpio_port;
39 uint8_t gpio_pin;
40
41 // Peripherals
42 TIMER_TypeDef *rx_timer;
43 USART_TypeDef *tx_usart;
44
45 // RX/TX state
46 uint8_t *read_buf;
47 uint8_t read_len;
48 uint8_t read_count;
49 uint8_t *write_buf;
50 uint8_t write_len;
51 bool rx_trailing_bit;
52 sl_sleeptimer_timer_handle_t rx_timeout_timer;
53
54 // Transfer state
55 joybus_transfer_cb done_callback;
56 void *done_user_data;
57
58 // RX timings
59 uint16_t pulse_period_half;
60 uint16_t bus_idle_period;
61
62 // RX ping-pong LDMA configuration
63 unsigned int rx_dma_channel;
64 uint16_t rx_edge_timings[2][EDGES_PER_BYTE + 2];
65 LDMA_TransferCfg_t rx_config;
66 LDMA_Descriptor_t rx_descriptors[2];
67 uint8_t rx_current_buffer;
68
69 // TX ping-pong LDMA configuration
70 unsigned int tx_dma_channel;
71 uint8_t tx_encoded_bytes[2][CHIPS_PER_BIT];
72 LDMA_TransferCfg_t tx_config;
73 LDMA_Descriptor_t tx_descriptors[3];
74 uint8_t tx_initial_buffer;
75 uint8_t tx_current_buffer;
76 uint8_t tx_buffered_bytes;
77};
78
83 struct joybus base;
84 struct joybus_gecko_data data;
85};
86
95 GPIO_Port_TypeDef gpio_port;
96
98 uint8_t gpio_pin;
99
101 TIMER_TypeDef *rx_timer;
102
104 USART_TypeDef *tx_usart;
105
107 uint32_t freq;
108};
109
117static inline struct joybus_gecko_config joybus_gecko_config_default(GPIO_Port_TypeDef port, uint8_t pin)
118{
119 return (struct joybus_gecko_config){
120 .gpio_port = port,
121 .gpio_pin = pin,
122 .rx_timer = TIMER0,
123 .tx_usart = USART0,
124 .freq = JOYBUS_FREQ_NOMINAL,
125 };
126}
127
135int joybus_gecko_init(struct joybus_gecko *gecko_bus, struct joybus_gecko_config config);
136
int joybus_gecko_init(struct joybus_gecko *gecko_bus, struct joybus_gecko_config config)
Initialize a Gecko Joybus instance.
Definition joybus.c:695
static struct joybus_gecko_config joybus_gecko_config_default(GPIO_Port_TypeDef port, uint8_t pin)
Build a Gecko config with default values.
Definition gecko.h:117
void(* joybus_transfer_cb)(struct joybus *bus, int status, void *user_data)
Function type for transfer completion callbacks.
Definition bus.h:88
#define JOYBUS_FREQ_NOMINAL
Nominal Joybus frequency, matching an OEM N64/GameCube controller.
Definition bus.h:17
Configuration for a Gecko Joybus instance.
Definition gecko.h:93
uint32_t freq
Transmit frequency, in Hz.
Definition gecko.h:107
uint8_t gpio_pin
GPIO pin to use for the Joybus data line.
Definition gecko.h:98
GPIO_Port_TypeDef gpio_port
GPIO port to use for the Joybus data line.
Definition gecko.h:95
USART_TypeDef * tx_usart
USART peripheral to use for transmitting data.
Definition gecko.h:104
TIMER_TypeDef * rx_timer
TIMER peripheral to use for receiving data.
Definition gecko.h:101
Definition gecko.h:33
A Gecko Joybus instance.
Definition gecko.h:82
A Joybus instance.
Definition bus.h:108