@@ -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+ rt_ssize_t _can_sendmsg_nonblocking (struct rt_can_device * can , const void * buf )
683+ {
684+ RT_ASSERT (can );
685+
686+ can_trasnmit_message_struct transmit_message ;
687+ can_struct_para_init (CAN_TX_MESSAGE_STRUCT , & transmit_message );
688+ rt_uint32_t can_x = ((struct gd32_can_device * )can -> parent .user_data )-> can_x ;
689+ struct rt_can_msg * pmsg = (struct rt_can_msg * )buf ;
690+
691+ if (_can_get_freebox (can_x ) == 0 )
692+ {
693+ return - RT_EBUSY ;
694+ }
695+ if (RT_CAN_STDID == pmsg -> ide )
696+ {
697+ transmit_message .tx_ff = CAN_FF_STANDARD ;
698+ transmit_message .tx_sfid = pmsg -> id ;
699+ }
700+ else
701+ {
702+ transmit_message .tx_ff = CAN_FF_EXTENDED ;
703+ transmit_message .tx_efid = pmsg -> id ;
704+ }
705+
706+ if (RT_CAN_DTR == pmsg -> rtr )
707+ {
708+ transmit_message .tx_ft = CAN_FT_DATA ;
709+ memcpy (transmit_message .tx_data , pmsg -> data , pmsg -> len );
710+ }
711+ else
712+ {
713+ transmit_message .tx_ft = CAN_FT_REMOTE ;
714+ }
715+
716+ transmit_message .tx_dlen = pmsg -> len ;
717+ if (can_message_transmit (can_x , & transmit_message ) == CAN_NOMAILBOX )
718+ {
719+ return - RT_ERROR ;
720+ }
721+
722+ return RT_EOK ;
723+ }
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