Skip to content

Commit f1b89c7

Browse files
author
Felipe
committed
transports: use zephyr DT macros to set the serial
port for serial transport. Signed-off-by: Felipe <felipe.neves@linaro.org>
1 parent ceb7813 commit f1b89c7

File tree

6 files changed

+39
-47
lines changed

6 files changed

+39
-47
lines changed

boards/disco_l475_iot1.overlay

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/ {
2+
aliases {
3+
uros-serial-port = &usart1;
4+
};
5+
};
6+
7+
&usart1 {
8+
status = "okay";
9+
};

modules/libmicroros/microros_transports/serial-usb/microros_transports.c

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ char uart_out_buffer[RING_BUF_SIZE];
2222

2323
struct ring_buf out_ringbuf, in_ringbuf;
2424

25-
static void uart_fifo_callback(struct device *dev){
25+
static void uart_fifo_callback(const struct device *dev, void *user_data){
2626
while (uart_irq_update(dev) && uart_irq_is_pending(dev)) {
2727
if (uart_irq_rx_ready(dev)) {
2828
int recv_len;
@@ -53,13 +53,15 @@ static void uart_fifo_callback(struct device *dev){
5353
}
5454

5555
bool zephyr_transport_open(struct uxrCustomTransport * transport){
56-
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
57-
5856
int ret;
5957
uint32_t baudrate, dtr = 0U;
58+
const struct device *uart_dev;
6059

61-
params->uart_dev = device_get_binding("CDC_ACM_0");
62-
if (!params->uart_dev) {
60+
/* for serial-usb transport we just override the device pointer
61+
* with USB to use the same interface
62+
*/
63+
transport->args = (void *)device_get_binding("CDC_ACM_0");
64+
if (!transport->args) {
6365
printk("CDC ACM device not found\n");
6466
return false;
6567
}
@@ -70,13 +72,15 @@ bool zephyr_transport_open(struct uxrCustomTransport * transport){
7072
return false;
7173
}
7274

75+
uart_dev = (const struct device *)transport->args;
7376
ring_buf_init(&out_ringbuf, sizeof(uart_out_buffer), uart_out_buffer);
7477
ring_buf_init(&in_ringbuf, sizeof(uart_in_buffer), uart_out_buffer);
7578

7679
printk("Waiting for agent connection\n");
7780

7881
while (true) {
79-
uart_line_ctrl_get(params->uart_dev, UART_LINE_CTRL_DTR, &dtr);
82+
83+
uart_line_ctrl_get(uart_dev, UART_LINE_CTRL_DTR, &dtr);
8084
if (dtr) {
8185
break;
8286
} else {
@@ -88,46 +92,46 @@ bool zephyr_transport_open(struct uxrCustomTransport * transport){
8892
printk("Serial port connected!\n");
8993

9094
/* They are optional, we use them to test the interrupt endpoint */
91-
ret = uart_line_ctrl_set(params->uart_dev, UART_LINE_CTRL_DCD, 1);
95+
ret = uart_line_ctrl_set(uart_dev, UART_LINE_CTRL_DCD, 1);
9296
if (ret) {
9397
printk("Failed to set DCD, ret code %d\n", ret);
9498
}
9599

96-
ret = uart_line_ctrl_set(params->uart_dev, UART_LINE_CTRL_DSR, 1);
100+
ret = uart_line_ctrl_set(uart_dev, UART_LINE_CTRL_DSR, 1);
97101
if (ret) {
98102
printk("Failed to set DSR, ret code %d\n", ret);
99103
}
100104

101105
/* Wait 1 sec for the host to do all settings */
102106
k_busy_wait(1000*1000);
103107

104-
ret = uart_line_ctrl_get(params->uart_dev, UART_LINE_CTRL_BAUD_RATE, &baudrate);
108+
ret = uart_line_ctrl_get(uart_dev, UART_LINE_CTRL_BAUD_RATE, &baudrate);
105109
if (ret) {
106110
printk("Failed to get baudrate, ret code %d\n", ret);
107111
}
108112

109-
uart_irq_callback_set(params->uart_dev, uart_fifo_callback);
113+
uart_irq_callback_set(uart_dev, uart_fifo_callback);
110114

111115
/* Enable rx interrupts */
112-
uart_irq_rx_enable(params->uart_dev);
116+
uart_irq_rx_enable(uart_dev);
113117

114118
return true;
115119
}
116120

117121
bool zephyr_transport_close(struct uxrCustomTransport * transport){
118-
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
122+
(void)transport;
119123

120124
return true;
121125
}
122126

123127
size_t zephyr_transport_write(struct uxrCustomTransport* transport, const uint8_t * buf, size_t len, uint8_t * err){
124-
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
128+
const struct device * uart_dev = (const struct device *) transport->args;
125129

126130
size_t wrote;
127131

128132
wrote = ring_buf_put(&out_ringbuf, buf, len);
129133

130-
uart_irq_tx_enable(params->uart_dev);
134+
uart_irq_tx_enable(uart_dev);
131135

132136
while (!ring_buf_is_empty(&out_ringbuf)){
133137
k_sleep(K_MSEC(5));
@@ -137,7 +141,7 @@ size_t zephyr_transport_write(struct uxrCustomTransport* transport, const uint8_
137141
}
138142

139143
size_t zephyr_transport_read(struct uxrCustomTransport* transport, uint8_t* buf, size_t len, int timeout, uint8_t* err){
140-
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
144+
const struct device * uart_dev = (const struct device *) transport->args;
141145

142146
size_t read = 0;
143147
int spent_time = 0;
@@ -147,9 +151,9 @@ size_t zephyr_transport_read(struct uxrCustomTransport* transport, uint8_t* buf,
147151
spent_time++;
148152
}
149153

150-
uart_irq_rx_disable(params->uart_dev);
154+
uart_irq_rx_disable(uart_dev);
151155
read = ring_buf_get(&in_ringbuf, buf, len);
152-
uart_irq_rx_enable(params->uart_dev);
156+
uart_irq_rx_enable(uart_dev);
153157

154158
return read;
155159
}

modules/libmicroros/microros_transports/serial-usb/microros_transports.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,7 @@ extern "C"
2424
{
2525
#endif
2626

27-
typedef struct {
28-
size_t fd;
29-
struct device *uart_dev;
30-
} zephyr_transport_params_t;
31-
3227
#define MICRO_ROS_FRAMING_REQUIRED true
33-
static zephyr_transport_params_t default_params;
3428

3529
bool zephyr_transport_open(struct uxrCustomTransport * transport);
3630
bool zephyr_transport_close(struct uxrCustomTransport * transport);

modules/libmicroros/microros_transports/serial/microros_transports.c

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,15 @@ static void uart_fifo_callback(const struct device * dev, void * args){
4040
}
4141
}
4242

43-
4443
bool zephyr_transport_open(struct uxrCustomTransport * transport){
45-
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
46-
47-
char uart_descriptor[8];
48-
sprintf(uart_descriptor,"UART_%d", params->fd);
49-
params->uart_dev = device_get_binding(uart_descriptor);
50-
if (!params->uart_dev) {
51-
printk("Serial device not found\n");
52-
return false;
53-
}
44+
const struct device * uart_dev = (const struct device *) transport->args;
5445

5546
ring_buf_init(&in_ringbuf, sizeof(uart_in_buffer), uart_out_buffer);
5647

57-
uart_irq_callback_set(params->uart_dev, uart_fifo_callback);
48+
uart_irq_callback_set(uart_dev, uart_fifo_callback);
5849

5950
/* Enable rx interrupts */
60-
uart_irq_rx_enable(params->uart_dev);
51+
uart_irq_rx_enable(uart_dev);
6152

6253
return true;
6354
}
@@ -69,18 +60,18 @@ bool zephyr_transport_close(struct uxrCustomTransport * transport){
6960
}
7061

7162
size_t zephyr_transport_write(struct uxrCustomTransport* transport, const uint8_t * buf, size_t len, uint8_t * err){
72-
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
63+
const struct device * uart_dev = (const struct device *) transport->args;
7364

7465
for (size_t i = 0; i < len; i++)
7566
{
76-
uart_poll_out(params->uart_dev, buf[i]);
67+
uart_poll_out(uart_dev, buf[i]);
7768
}
7869

7970
return len;
8071
}
8172

8273
size_t zephyr_transport_read(struct uxrCustomTransport* transport, uint8_t* buf, size_t len, int timeout, uint8_t* err){
83-
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
74+
const struct device * uart_dev = (const struct device *) transport->args;
8475

8576
size_t read = 0;
8677
int spent_time = 0;
@@ -90,9 +81,9 @@ size_t zephyr_transport_read(struct uxrCustomTransport* transport, uint8_t* buf,
9081
spent_time++;
9182
}
9283

93-
uart_irq_rx_disable(params->uart_dev);
84+
uart_irq_rx_disable(uart_dev);
9485
read = ring_buf_get(&in_ringbuf, buf, len);
95-
uart_irq_rx_enable(params->uart_dev);
86+
uart_irq_rx_enable(uart_dev);
9687

9788
return read;
9889
}

modules/libmicroros/microros_transports/serial/microros_transports.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,7 @@ extern "C"
2424
{
2525
#endif
2626

27-
typedef struct {
28-
size_t fd;
29-
const struct device * uart_dev;
30-
} zephyr_transport_params_t;
31-
3227
#define MICRO_ROS_FRAMING_REQUIRED true
33-
volatile static zephyr_transport_params_t default_params = {.fd = 1};
3428

3529
bool zephyr_transport_open(struct uxrCustomTransport * transport);
3630
bool zephyr_transport_close(struct uxrCustomTransport * transport);

src/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ void main(void)
3333
{
3434
rmw_uros_set_custom_transport(
3535
MICRO_ROS_FRAMING_REQUIRED,
36-
(void *) &default_params,
36+
(void *) DEVICE_DT_GET(DT_ALIAS(uros_serial_port)),
3737
zephyr_transport_open,
3838
zephyr_transport_close,
3939
zephyr_transport_write,

0 commit comments

Comments
 (0)