66 * Change Logs:
77 * Date Author Notes
88 * 2021-10-29 mazhiyuan first version
9+ * 2025-02-11 kurisaW support can and canfd drivers for RZ family
910 */
1011
1112#include "drv_can.h"
@@ -47,6 +48,18 @@ static const struct ra_baud_rate_tab can_baud_rate_tab[] =
4748 {CAN10kBaud , 4 , 14 , 5 , 1 + 249 }
4849};
4950
51+ #if defined(BSP_USING_CANFD )
52+
53+ #define can_instance_ctrl_t canfd_instance_ctrl_t
54+
55+ #define R_CAN_Open R_CANFD_Open
56+ #define R_BSP_IrqStatusClear R_BSP_IrqClearPending
57+ #define R_CAN_ModeTransition R_CANFD_ModeTransition
58+ #define R_CAN_InfoGet R_CANFD_InfoGet
59+ #define R_CAN_Write R_CANFD_Write
60+
61+ #endif
62+
5063static rt_uint32_t get_can_baud_index (rt_uint32_t baud )
5164{
5265 rt_uint32_t len , index ;
@@ -66,13 +79,13 @@ static void ra_can_get_config(void)
6679 struct can_configure config = CANDEFAULTCONFIG ;
6780#ifdef BSP_USING_CAN0
6881 can_obj [CAN0_INDEX ].can_dev .config = config ;
69- can_obj [CAN0_INDEX ].can_dev .config .msgboxsz = CAN_NO_OF_MAILBOXES_g_can0 ;
82+ can_obj [CAN0_INDEX ].can_dev .config .msgboxsz = 32 ;
7083 can_obj [CAN0_INDEX ].can_dev .config .sndboxnumber = 1 ;
7184 can_obj [CAN0_INDEX ].can_dev .config .ticks = 50 ;
7285#endif
7386#ifdef BSP_USING_CAN1
7487 can_obj [CAN1_INDEX ].can_dev .config = config ;
75- can_obj [CAN1_INDEX ].can_dev .config .msgboxsz = CAN_NO_OF_MAILBOXES_g_can1 ;
88+ can_obj [CAN1_INDEX ].can_dev .config .msgboxsz = 32 ;
7689 can_obj [CAN1_INDEX ].can_dev .config .sndboxnumber = 1 ;
7790 can_obj [CAN1_INDEX ].can_dev .config .ticks = 50 ;
7891#endif
@@ -168,7 +181,7 @@ rt_err_t ra_can_control(struct rt_can_device *can_dev, int cmd, void *arg)
168181 }
169182 return RT_EOK ;
170183}
171- int ra_can_sendmsg (struct rt_can_device * can_dev , const void * buf , rt_uint32_t boxno )
184+ rt_ssize_t ra_can_sendmsg (struct rt_can_device * can_dev , const void * buf , rt_uint32_t boxno )
172185{
173186 struct ra_can * can ;
174187 can_frame_t g_can_tx_frame ;
@@ -180,7 +193,13 @@ int ra_can_sendmsg(struct rt_can_device *can_dev, const void *buf, rt_uint32_t b
180193 g_can_tx_frame .id_mode = msg_rt -> ide ;
181194 g_can_tx_frame .type = msg_rt -> rtr ;
182195 g_can_tx_frame .data_length_code = msg_rt -> len ;
196+ #if defined(BSP_USING_CANFD ) && defined(BSP_USING_CAN_RZ )
197+ g_can_tx_frame .options = 0 ;
198+ #elif defined(BSP_USING_CANFD )
199+ g_can_tx_frame .options = CANFD_FRAME_OPTION_FD | CANFD_FRAME_OPTION_BRS ;
200+ #else
183201 g_can_tx_frame .options = 0 ;
202+ #endif
184203 memcpy (g_can_tx_frame .data , msg_rt -> data , 8 );
185204 can = rt_container_of (can_dev , struct ra_can , can_dev );
186205 RT_ASSERT (boxno < can -> config -> num_of_mailboxs );
@@ -193,7 +212,7 @@ int ra_can_sendmsg(struct rt_can_device *can_dev, const void *buf, rt_uint32_t b
193212 return RT_EOK ;
194213}
195214
196- int ra_can_recvmsg (struct rt_can_device * can_dev , void * buf , rt_uint32_t boxno )
215+ rt_ssize_t ra_can_recvmsg (struct rt_can_device * can_dev , void * buf , rt_uint32_t boxno )
197216{
198217 struct rt_can_msg * msg_rt = (struct rt_can_msg * )buf ;
199218 can_frame_t * msg_ra ;
@@ -205,7 +224,11 @@ int ra_can_recvmsg(struct rt_can_device *can_dev, void *buf, rt_uint32_t boxno)
205224 RT_ASSERT (boxno < can -> config -> num_of_mailboxs );
206225 if (can -> callback_args -> mailbox != boxno )
207226 return 0 ;
227+ #if defined(BSP_USING_CANFD )
228+ msg_ra = & can -> callback_args -> frame ;
229+ #else
208230 msg_ra = can -> callback_args -> p_frame ;
231+ #endif
209232
210233 msg_rt -> id = msg_ra -> id ;
211234 msg_rt -> ide = msg_ra -> id_mode ;
0 commit comments