Skip to content

Commit b1cf9c6

Browse files
committed
drivers: can: replace canbus_np_context with socket_can_context
Move struct socket_can_context to socket_can_context.h to ensure struct socket_can_context can be included without replying on socket_can_generic.h. Change rx thread of canbus to be preemptive to avoid can frame loss. Update naming of _ENABLE to _ENABLED to follow convention in Kconfig.native_posix. Signed-off-by: Pin Loon Lee <[email protected]>
1 parent cdcc8be commit b1cf9c6

File tree

4 files changed

+99
-120
lines changed

4 files changed

+99
-120
lines changed

drivers/can/Kconfig.native_posix

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
# Kconfig.native_posix - native_posix CAN configuration options
1+
# Native posix CAN configuration options
22

3-
#
43
# Copyright (c) 2019 Intel Corporation
5-
#
64
# SPDX-License-Identifier: Apache-2.0
7-
#
85

96
config CAN_NATIVE_POSIX
107
bool "native_posix CAN Driver"
@@ -24,51 +21,51 @@ config CAN_MAX_FILTER
2421
Must be at least the size of concurrent reads.
2522

2623
## Interface 1
27-
config CAN_NATIVE_POSIX_INTERFACE_1_ENABLE
24+
config CAN_NATIVE_POSIX_INTERFACE_1_ENABLED
2825
bool "CANBUS interface 1"
29-
default y
30-
depends on CAN_NATIVE_POSIX
26+
default y
27+
depends on CAN_NATIVE_POSIX
3128
help
3229
This option enables the CANBUS network interface for Native POSIX board.
3330

3431
config CAN_NATIVE_POSIX_INTERFACE_1_NAME
3532
string "CANBUS interface 1 name on Linux side"
36-
depends on CAN_NATIVE_POSIX_INTERFACE_1_ENABLE
33+
depends on CAN_NATIVE_POSIX_INTERFACE_1_ENABLED
3734
default "vcan0"
3835
help
3936
This option sets the CANBUS network interface 1 name in host system.
4037

4138
config CAN_NATIVE_POSIX_INTERFACE_1_SOCKETCAN_NAME
4239
string "Network device name"
43-
depends on CAN_NATIVE_POSIX_INTERFACE_1_ENABLE
40+
depends on CAN_NATIVE_POSIX_INTERFACE_1_ENABLED
4441
default "SOCKET_CAN_1"
4542
help
4643
Name of the network device driver for SocketCAN.
4744

4845
## Interface 2
49-
config CAN_NATIVE_POSIX_INTERFACE_2_ENABLE
46+
config CAN_NATIVE_POSIX_INTERFACE_2_ENABLED
5047
bool "CANBUS interface 2"
51-
default y
52-
depends on CAN_NATIVE_POSIX
48+
default n
49+
depends on CAN_NATIVE_POSIX
5350
help
5451
This option enables the CANBUS network interface for Native POSIX board.
5552

56-
if CAN_NATIVE_POSIX_INTERFACE_2_ENABLE
53+
if CAN_NATIVE_POSIX_INTERFACE_2_ENABLED
5754

5855
config CAN_NATIVE_POSIX_INTERFACE_2_NAME
5956
string "CANBUS interface 2 name on Linux side"
60-
depends on CAN_NATIVE_POSIX_INTERFACE_2_ENABLE
57+
depends on CAN_NATIVE_POSIX_INTERFACE_2_ENABLED
6158
default "vcan1"
6259
help
63-
This option sets the CANBUS network interface 1 name in host system.
60+
This option sets the CANBUS network interface 2 name in host system.
6461

6562
config CAN_NATIVE_POSIX_INTERFACE_2_SOCKETCAN_NAME
6663
string "Network device name"
67-
depends on CAN_NATIVE_POSIX_INTERFACE_2_ENABLE
64+
depends on CAN_NATIVE_POSIX_INTERFACE_2_ENABLED
6865
default "SOCKET_CAN_2"
6966
help
7067
Name of the network device driver for SocketCAN.
71-
72-
endif # CAN_NATIVE_POSIX_INTERFACE_2_ENABLE
7368

74-
endif # CAN_NATIVE_POSIX
69+
endif #CAN_NATIVE_POSIX_INTERFACE_2_ENABLED
70+
71+
endif #CAN_NATIVE_POSIX

drivers/can/can_native_posix.c

Lines changed: 49 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -35,32 +35,27 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
3535
#include <net/socket_can.h>
3636

3737
#include "can_native_posix_priv.h"
38+
#include "socket_can_context.h"
3839

3940
#define NET_BUF_TIMEOUT K_MSEC(100)
4041

41-
struct canbus_np_context {
42-
const struct device *can_dev;
43-
struct k_msgq *msgq;
44-
struct net_if *iface;
45-
const char *if_name;
46-
47-
int dev_fd;
48-
struct can_frame frame;
49-
};
50-
51-
static int read_data(struct canbus_np_context *ctx, int fd)
42+
static int read_data(struct socket_can_context *ctx, int fd)
5243
{
5344
struct net_pkt *pkt;
5445
int count;
5546

56-
count = canbus_np_read_data(fd, (void *)(&ctx->frame),
57-
sizeof(ctx->frame));
47+
struct can_frame frame;
48+
49+
count = canbus_np_read_data(fd, (void *)(&frame), sizeof(frame));
50+
5851
if (count <= 0) {
5952
return 0;
6053
}
6154

6255
struct zcan_frame zframe;
63-
can_copy_frame_to_zframe(&ctx->frame, &zframe);
56+
57+
can_copy_frame_to_zframe(&frame, &zframe);
58+
6459
pkt = net_pkt_rx_alloc_with_buffer(ctx->iface, sizeof(zframe), AF_CAN,
6560
0, NET_BUF_TIMEOUT);
6661
if (!pkt) {
@@ -79,7 +74,7 @@ static int read_data(struct canbus_np_context *ctx, int fd)
7974
return 0;
8075
}
8176

82-
static void canbus_np_rx(struct canbus_np_context *ctx)
77+
static void canbus_np_rx(struct socket_can_context *ctx)
8378
{
8479
LOG_DBG("Starting ZCAN RX thread");
8580

@@ -98,7 +93,7 @@ static int canbus_np_send(const struct device *dev,
9893
const struct zcan_frame *msg, k_timeout_t timeout,
9994
can_tx_callback_t callback_isr, void *callback_arg)
10095
{
101-
struct canbus_np_context *ctx = dev->data;
96+
struct socket_can_context *ctx = dev->data;
10297
int ret = -ENODEV;
10398

10499
ARG_UNUSED(timeout);
@@ -161,15 +156,15 @@ static const struct can_driver_api can_api_funcs = {
161156
.register_state_change_isr = canbus_np_register_state_change_isr
162157
};
163158

164-
#ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLE
159+
#ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLED
165160
K_KERNEL_STACK_DEFINE(canbus_rx_stack1,
166161
CONFIG_ARCH_POSIX_RECOMMENDED_STACK_SIZE);
167162
static struct k_thread rx_thread_data1;
168-
static struct canbus_np_context canbus_context_data1;
163+
static struct socket_can_context canbus_context_data1;
169164

170165
static int canbus_np1_init(const struct device *dev)
171166
{
172-
struct canbus_np_context *ctx = dev->data;
167+
struct socket_can_context *ctx = dev->data;
173168

174169
ctx->if_name = CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_NAME;
175170

@@ -181,7 +176,7 @@ static int canbus_np1_init(const struct device *dev)
181176
k_thread_create(&rx_thread_data1, canbus_rx_stack1,
182177
K_THREAD_STACK_SIZEOF(canbus_rx_stack1),
183178
(k_thread_entry_t)canbus_np_rx, ctx, NULL, NULL,
184-
K_PRIO_COOP(14), 0, K_NO_WAIT);
179+
K_PRIO_PREEMPT(14), 0, K_NO_WAIT);
185180
}
186181

187182
return 0;
@@ -191,17 +186,17 @@ DEVICE_DT_INST_DEFINE(0, &canbus_np1_init, NULL,
191186
(void *)&canbus_context_data1, NULL,
192187
POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
193188
&can_api_funcs);
194-
#endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLE */
189+
#endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLED */
195190

196-
#ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLE
191+
#ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLED
197192
K_KERNEL_STACK_DEFINE(canbus_rx_stack2,
198193
CONFIG_ARCH_POSIX_RECOMMENDED_STACK_SIZE);
199194
static struct k_thread rx_thread_data2;
200-
static struct canbus_np_context canbus_context_data2;
195+
static struct socket_can_context canbus_context_data2;
201196

202197
static int canbus_np2_init(const struct device *dev)
203198
{
204-
struct canbus_np_context *ctx = dev->data;
199+
struct socket_can_context *ctx = dev->data;
205200

206201
ctx->if_name = CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_NAME;
207202

@@ -213,7 +208,7 @@ static int canbus_np2_init(const struct device *dev)
213208
k_thread_create(&rx_thread_data2, canbus_rx_stack2,
214209
K_THREAD_STACK_SIZEOF(canbus_rx_stack2),
215210
(k_thread_entry_t)canbus_np_rx, ctx, NULL, NULL,
216-
K_PRIO_COOP(14), 0, K_NO_WAIT);
211+
K_PRIO_PREEMPT(14), 0, K_NO_WAIT);
217212
}
218213

219214
return 0;
@@ -223,61 +218,20 @@ DEVICE_DT_INST_DEFINE(1, &canbus_np2_init, NULL,
223218
(void *)&canbus_context_data2, NULL,
224219
POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
225220
&can_api_funcs);
226-
#endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLE */
221+
#endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLED */
227222

228-
#if defined(CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLE) || \
229-
defined(CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLE)
223+
#if defined(CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLED) || \
224+
defined(CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLED)
230225

231226
#if defined(CONFIG_NET_SOCKETS_CAN)
232227

233-
#define SEND_TIMEOUT K_MSEC(100)
234-
#define BUF_ALLOC_TIMEOUT K_MSEC(50)
228+
#include "socket_can_generic.h"
235229

236-
static void socket_can_iface_init(struct net_if *iface)
237-
{
238-
const struct device *dev = net_if_get_device(iface);
239-
struct canbus_np_context *socket_context = dev->data;
240-
241-
socket_context->iface = iface;
242-
243-
LOG_DBG("Init CAN interface %p dev %p", iface, dev);
244-
}
245-
246-
static void tx_irq_callback(uint32_t error_flags, void *arg)
247-
{
248-
if (error_flags) {
249-
LOG_DBG("Callback! error-code: %d", error_flags);
250-
}
251-
}
252-
253-
/* This is called by net_if.c when packet is about to be sent */
254-
static int socket_can_send(const struct device *dev, struct net_pkt *pkt)
255-
{
256-
struct canbus_np_context *socket_context = dev->data;
257-
int ret;
258-
259-
if (net_pkt_family(pkt) != AF_CAN) {
260-
return -EPFNOSUPPORT;
261-
}
262-
263-
ret = can_send(socket_context->can_dev,
264-
(struct zcan_frame *)pkt->frags->data, SEND_TIMEOUT,
265-
tx_irq_callback, NULL);
266-
if (ret) {
267-
LOG_DBG("Cannot send socket CAN msg (%d)", ret);
268-
}
269-
270-
/* If something went wrong, then we need to return negative value to
271-
* net_if.c:net_if_tx() so that the net_pkt will get released.
272-
*/
273-
return -ret;
274-
}
275-
276-
static int socket_can_setsockopt(const struct device *dev, void *obj, int level,
230+
static int socket_can_np_setsockopt(const struct device *dev, void *obj, int level,
277231
int optname, const void *optval,
278232
socklen_t optlen)
279233
{
280-
struct canbus_np_context *socket_context = dev->data;
234+
struct socket_can_context *socket_context = dev->data;
281235
struct can_filter filter;
282236

283237
if (level != SOL_CAN_RAW && optname != CAN_RAW_FILTER) {
@@ -305,26 +259,24 @@ static int socket_can_setsockopt(const struct device *dev, void *obj, int level,
305259
&filter, sizeof(filter));
306260
}
307261

308-
static void socket_can_close(const struct device *dev, int filter_id)
309-
{
310-
struct canbus_np_context *socket_context = dev->data;
311-
312-
can_detach(socket_context->can_dev, filter_id);
313-
}
314-
315-
static struct canbus_api socket_can_api = {
262+
static struct canbus_api socket_can_np_api = {
316263
.iface_api.init = socket_can_iface_init,
317264
.send = socket_can_send,
318265
.close = socket_can_close,
319-
.setsockopt = socket_can_setsockopt,
266+
.setsockopt = socket_can_np_setsockopt,
320267
};
321268

322-
#ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLE
323-
// static struct socket_can_context socket_can_context_1;
269+
#ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLED
270+
324271
static int socket_can_init_1(const struct device *dev)
325272
{
273+
/* To avoid warning, use socket_can_api defined in socket_can_generic.h.
274+
* For native posix, use socket_can_np_api instead.
275+
*/
276+
(void)socket_can_api;
277+
326278
const struct device *can_dev = DEVICE_DT_INST_GET(0);
327-
struct canbus_np_context *socket_context = dev->data;
279+
struct socket_can_context *socket_context = dev->data;
328280

329281
LOG_DBG("Init socket CAN device %p (%s) for dev %p (%s)", dev,
330282
dev->name, can_dev, can_dev->name);
@@ -338,15 +290,21 @@ NET_DEVICE_INIT_INSTANCE(socket_can_native_posix_1,
338290
CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_SOCKETCAN_NAME, 0,
339291
socket_can_init_1, NULL,
340292
&canbus_context_data1, NULL,
341-
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &socket_can_api,
293+
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &socket_can_np_api,
342294
CANBUS_RAW_L2, NET_L2_GET_CTX_TYPE(CANBUS_RAW_L2), CAN_MTU);
343-
#endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLE */
295+
#endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLED */
296+
297+
#ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLED
344298

345-
#ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLE
346299
static int socket_can_init_2(const struct device *dev)
347300
{
301+
/* To avoid warning, use socket_can_api defined in socket_can_generic.h.
302+
* For native posix, use socket_can_np_api instead.
303+
*/
304+
(void)socket_can_api;
305+
348306
const struct device *can_dev = DEVICE_DT_INST_GET(1);
349-
struct canbus_np_context *socket_context = dev->data;
307+
struct socket_can_context *socket_context = dev->data;
350308

351309
LOG_DBG("Init socket CAN device %p (%s) for dev %p (%s)", dev,
352310
dev->name, can_dev, can_dev->name);
@@ -360,10 +318,10 @@ NET_DEVICE_INIT_INSTANCE(socket_can_native_posix_2,
360318
CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_SOCKETCAN_NAME, 1,
361319
socket_can_init_2, NULL,
362320
&canbus_context_data2, NULL,
363-
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &socket_can_api,
321+
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &socket_can_np_api,
364322
CANBUS_RAW_L2, NET_L2_GET_CTX_TYPE(CANBUS_RAW_L2), CAN_MTU);
365-
#endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLE */
323+
#endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLED */
366324

367325
#endif /* CONFIG_NET_SOCKETS_CAN */
368326

369-
#endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_1 */
327+
#endif /* CAN_NATIVE_POSIX_INTERFACE_1_ENABLED || CAN_NATIVE_POSIX_INTERFACE_2_ENABLED */

drivers/can/socket_can_context.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Copyright (c) 2019 Intel Corporation.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
*/
7+
8+
/* CANBUS related functions that are generic in all the drivers. */
9+
10+
#include <net/net_pkt.h>
11+
#include <net/socket_can.h>
12+
13+
#ifndef ZEPHYR_DRIVERS_CAN_SOCKET_CAN_CONTEXT_H_
14+
#define ZEPHYR_DRIVERS_CAN_SOCKET_CAN_CONTEXT_H_
15+
16+
struct socket_can_context {
17+
const struct device *can_dev;
18+
struct net_if *iface;
19+
20+
/* for can on native posix */
21+
const char *if_name;
22+
int dev_fd;
23+
24+
/* for can on embedded board */
25+
struct k_msgq *msgq;
26+
27+
/* TODO: remove the thread and push data to net directly from rx isr */
28+
k_tid_t rx_tid;
29+
struct k_thread rx_thread_data;
30+
};
31+
32+
#endif /* ZEPHYR_DRIVERS_CAN_SOCKET_CAN_CONTEXT_H_ */

0 commit comments

Comments
 (0)