Skip to content

Commit a3cc233

Browse files
CYFS3Rbb666
authored andcommitted
feat[can][gd32]: Implement non-blocking send mechanism
1 parent 17a796a commit a3cc233

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

bsp/gd32/arm/libraries/gd32_drivers/drv_can.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,12 +662,74 @@ static rt_ssize_t _can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t
662662
return RT_EOK;
663663
}
664664

665+
rt_ssize_t _can_get_freebox(rt_uint32_t can_x)
666+
{
667+
rt_uint32_t freebox = 0;
668+
if ((CAN_STAT(can_x) & CAN_TSTAT_TME0) != 0U)
669+
{
670+
freebox++;
671+
}
672+
if ((CAN_STAT(can_x) & CAN_TSTAT_TME1) != 0U)
673+
{
674+
freebox++;
675+
}
676+
if ((CAN_STAT(can_x) & CAN_TSTAT_TME2) != 0U)
677+
{
678+
freebox++;
679+
}
680+
return freebox;
681+
}
682+
683+
rt_ssize_t _can_sendmsg_nonblocking(struct rt_can_device *can, const void *buf)
684+
{
685+
RT_ASSERT(can);
686+
687+
can_trasnmit_message_struct transmit_message;
688+
can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &transmit_message);
689+
rt_uint32_t can_x = ((struct gd32_can_device *)can->parent.user_data)->can_x;
690+
struct rt_can_msg *pmsg = (struct rt_can_msg *)buf;
691+
692+
if(_can_get_freebox(can_x) == 0)
693+
{
694+
return -RT_EBUSY;
695+
}
696+
if (RT_CAN_STDID == pmsg->ide)
697+
{
698+
transmit_message.tx_ff = CAN_FF_STANDARD;
699+
transmit_message.tx_sfid = pmsg->id;
700+
}
701+
else
702+
{
703+
transmit_message.tx_ff = CAN_FF_EXTENDED;
704+
transmit_message.tx_efid = pmsg->id;
705+
}
706+
707+
if (RT_CAN_DTR == pmsg->rtr)
708+
{
709+
transmit_message.tx_ft = CAN_FT_DATA;
710+
memcpy(transmit_message.tx_data, pmsg->data, pmsg->len);
711+
}
712+
else
713+
{
714+
transmit_message.tx_ft = CAN_FT_REMOTE;
715+
}
716+
717+
transmit_message.tx_dlen = pmsg->len;
718+
if(can_message_transmit(can_x, &transmit_message) == CAN_NOMAILBOX)
719+
{
720+
return -RT_ERROR;
721+
}
722+
723+
return RT_EOK;
724+
}
725+
665726
static const struct rt_can_ops _can_ops =
666727
{
667728
_can_config,
668729
_can_control,
669730
_can_sendmsg,
670731
_can_recvmsg,
732+
_can_sendmsg_nonblocking,
671733
};
672734

673735
static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo)

0 commit comments

Comments
 (0)