@@ -89,6 +89,28 @@ const struct zcan_frame test_ext_msg_2 = {
8989 .data = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 }
9090};
9191
92+ /**
93+ * @brief Standard (11-bit) CAN ID RTR frame 1.
94+ */
95+ const struct zcan_frame test_std_rtr_msg_1 = {
96+ .id_type = CAN_STANDARD_IDENTIFIER ,
97+ .rtr = CAN_REMOTEREQUEST ,
98+ .id = TEST_CAN_STD_ID_1 ,
99+ .dlc = 0 ,
100+ .data = {0 }
101+ };
102+
103+ /**
104+ * @brief Extended (29-bit) CAN ID RTR frame 1.
105+ */
106+ const struct zcan_frame test_ext_rtr_msg_1 = {
107+ .id_type = CAN_EXTENDED_IDENTIFIER ,
108+ .rtr = CAN_REMOTEREQUEST ,
109+ .id = TEST_CAN_EXT_ID_1 ,
110+ .dlc = 0 ,
111+ .data = {0 }
112+ };
113+
92114const struct zcan_filter test_std_filter_1 = {
93115 .id_type = CAN_STANDARD_IDENTIFIER ,
94116 .rtr = CAN_DATAFRAME ,
@@ -154,6 +176,30 @@ const struct zcan_filter test_ext_masked_filter_2 = {
154176 .id_mask = TEST_CAN_EXT_MASK
155177};
156178
179+ /**
180+ * @brief Standard (11-bit) CAN ID RTR filter 1. This filter matches
181+ * ``test_std_rtr_frame_1``.
182+ */
183+ const struct zcan_filter test_std_rtr_filter_1 = {
184+ .id_type = CAN_STANDARD_IDENTIFIER ,
185+ .rtr = CAN_REMOTEREQUEST ,
186+ .id = TEST_CAN_STD_ID_1 ,
187+ .rtr_mask = 1 ,
188+ .id_mask = CAN_STD_ID_MASK
189+ };
190+
191+ /**
192+ * @brief Extended (29-bit) CAN ID RTR filter 1. This filter matches
193+ * ``test_ext_rtr_frame_1``.
194+ */
195+ const struct zcan_filter test_ext_rtr_filter_1 = {
196+ .id_type = CAN_EXTENDED_IDENTIFIER ,
197+ .rtr = CAN_REMOTEREQUEST ,
198+ .id = TEST_CAN_EXT_ID_1 ,
199+ .rtr_mask = 1 ,
200+ .id_mask = CAN_EXT_ID_MASK
201+ };
202+
157203const struct zcan_filter test_std_some_filter = {
158204 .id_type = CAN_STANDARD_IDENTIFIER ,
159205 .rtr = CAN_DATAFRAME ,
@@ -517,6 +563,55 @@ static void send_receive(const struct zcan_filter *filter1,
517563 can_detach (can_dev , filter_id_1 );
518564}
519565
566+ /**
567+ * @brief Perform a send/receive test with a set of CAN ID filters and CAN frames, RTR and data
568+ * frames.
569+ *
570+ * @param data_filter CAN data filter
571+ * @param rtr_filter CAN RTR filter
572+ * @param data_frame CAN data frame
573+ * @param rtr_frame CAN RTR frame
574+ */
575+ void send_receive_rtr (const struct zcan_filter * data_filter ,
576+ const struct zcan_filter * rtr_filter ,
577+ const struct zcan_frame * data_frame ,
578+ const struct zcan_frame * rtr_frame )
579+ {
580+ struct zcan_frame frame ;
581+ int filter_id ;
582+ int err ;
583+
584+ filter_id = attach_msgq (can_dev , rtr_filter );
585+
586+ /* Verify that RTR filter does not match data frame */
587+ send_test_msg (can_dev , data_frame );
588+ err = k_msgq_get (& can_msgq , & frame , TEST_RECEIVE_TIMEOUT );
589+ zassert_equal (err , - EAGAIN , "Data frame passed RTR filter" );
590+
591+ /* Verify that RTR filter matches RTR frame */
592+ send_test_msg (can_dev , rtr_frame );
593+ err = k_msgq_get (& can_msgq , & frame , TEST_RECEIVE_TIMEOUT );
594+ zassert_equal (err , 0 , "receive timeout" );
595+ check_msg (& frame , rtr_frame , 0 );
596+
597+ can_detach (can_dev , filter_id );
598+
599+ filter_id = attach_msgq (can_dev , data_filter );
600+
601+ /* Verify that data filter does not match RTR frame */
602+ send_test_msg (can_dev , rtr_frame );
603+ err = k_msgq_get (& can_msgq , & frame , TEST_RECEIVE_TIMEOUT );
604+ zassert_equal (err , - EAGAIN , "RTR frame passed data filter" );
605+
606+ /* Verify that data filter matches data frame */
607+ send_test_msg (can_dev , data_frame );
608+ err = k_msgq_get (& can_msgq , & frame , TEST_RECEIVE_TIMEOUT );
609+ zassert_equal (err , 0 , "receive timeout" );
610+ check_msg (& frame , data_frame , 0 );
611+
612+ can_detach (can_dev , filter_id );
613+ }
614+
520615/*
521616 * Set driver to loopback mode
522617 * The driver stays in loopback mode after that.
@@ -691,6 +786,24 @@ void test_send_receive_buffer(void)
691786 can_detach (can_dev , filter_id );
692787}
693788
789+ /**
790+ * @brief Test send/receive with standard (11-bit) CAN IDs and remote transmission request (RTR).
791+ */
792+ void test_send_receive_std_id_rtr (void )
793+ {
794+ send_receive_rtr (& test_std_filter_1 , & test_std_rtr_filter_1 ,
795+ & test_std_msg_1 , & test_std_rtr_msg_1 );
796+ }
797+
798+ /**
799+ * @brief Test send/receive with extended (29-bit) CAN IDs and remote transmission request (RTR).
800+ */
801+ void test_send_receive_ext_id_rtr (void )
802+ {
803+ send_receive_rtr (& test_ext_filter_1 , & test_ext_rtr_filter_1 ,
804+ & test_ext_msg_1 , & test_ext_rtr_msg_1 );
805+ }
806+
694807/*
695808 * Attach to a filter that should not pass the message and send a message
696809 * with a different id.
@@ -746,6 +859,8 @@ void test_main(void)
746859 ztest_unit_test (test_send_receive_ext ),
747860 ztest_unit_test (test_send_receive_std_masked ),
748861 ztest_unit_test (test_send_receive_ext_masked ),
862+ ztest_user_unit_test (test_send_receive_std_id_rtr ),
863+ ztest_user_unit_test (test_send_receive_ext_id_rtr ),
749864 ztest_unit_test (test_send_receive_buffer ),
750865 ztest_unit_test (test_send_receive_wrong_id ));
751866 ztest_run_test_suite (can_driver );
0 commit comments