@@ -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+
665726static 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
673735static void _can_rx_isr (struct rt_can_device * can , rt_uint32_t fifo )
0 commit comments