@@ -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