mirror of
https://github.com/apache/nuttx.git
synced 2026-05-31 23:40:19 +08:00
arch/sim/can: add loopback support for CAN character dev
add loopback support for sim CAN character dev Signed-off-by: raiden00pl <raiden00@railab.me>
This commit is contained in:
@@ -184,3 +184,35 @@ bool host_can_avail(struct sim_can_s *can)
|
|||||||
|
|
||||||
return select(can->fd + 1, &fdset, NULL, NULL, &tv) > 0;
|
return select(can->fd + 1, &fdset, NULL, NULL, &tv) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: host_can_loopback
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int host_can_loopback(struct sim_can_s *can, bool enable)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
/* Receive own messages */
|
||||||
|
|
||||||
|
tmp = 1;
|
||||||
|
ret = setsockopt(can->fd, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS,
|
||||||
|
&tmp, sizeof(tmp));
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set loopback mode */
|
||||||
|
|
||||||
|
tmp = 1;
|
||||||
|
ret = setsockopt(can->fd, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &tmp,
|
||||||
|
sizeof(tmp));
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -361,10 +361,18 @@ int sim_canchar_initialize(int devidx, int devno)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
canerr("host_can_init failed %d\n", ret);
|
canerr("host_can_init failed %d\n", ret);
|
||||||
kmm_free(priv);
|
goto errout;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CAN_LOOPBACK
|
||||||
|
ret = host_can_loopback(&priv->host, true);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
canerr("host_can_loopback failed %d\n", ret);
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialzie CAN character driver */
|
/* Initialzie CAN character driver */
|
||||||
|
|
||||||
priv->dev.cd_ops = &g_sim_can_ops;
|
priv->dev.cd_ops = &g_sim_can_ops;
|
||||||
@@ -377,9 +385,12 @@ int sim_canchar_initialize(int devidx, int devno)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
canerr("can_register failed %d\n", ret);
|
canerr("can_register failed %d\n", ret);
|
||||||
kmm_free(priv);
|
goto errout;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
|
errout:
|
||||||
|
kmm_free(priv);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,5 +62,6 @@ int host_can_send(struct sim_can_s *can, void *frame, size_t len);
|
|||||||
int host_can_ifup(struct sim_can_s *can);
|
int host_can_ifup(struct sim_can_s *can);
|
||||||
int host_can_ifdown(struct sim_can_s *can);
|
int host_can_ifdown(struct sim_can_s *can);
|
||||||
bool host_can_avail(struct sim_can_s *can);
|
bool host_can_avail(struct sim_can_s *can);
|
||||||
|
int host_can_loopback(struct sim_can_s *can, bool enable);
|
||||||
|
|
||||||
#endif /* __ARCH_SIM_SRC_SIM_CAN_H */
|
#endif /* __ARCH_SIM_SRC_SIM_CAN_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user