@@ -89,6 +89,28 @@ const struct zcan_frame test_ext_msg_2 = {
89
89
.data = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 }
90
90
};
91
91
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
+
92
114
const struct zcan_filter test_std_filter_1 = {
93
115
.id_type = CAN_STANDARD_IDENTIFIER ,
94
116
.rtr = CAN_DATAFRAME ,
@@ -154,6 +176,30 @@ const struct zcan_filter test_ext_masked_filter_2 = {
154
176
.id_mask = TEST_CAN_EXT_MASK
155
177
};
156
178
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
+
157
203
const struct zcan_filter test_std_some_filter = {
158
204
.id_type = CAN_STANDARD_IDENTIFIER ,
159
205
.rtr = CAN_DATAFRAME ,
@@ -517,6 +563,55 @@ static void send_receive(const struct zcan_filter *filter1,
517
563
can_detach (can_dev , filter_id_1 );
518
564
}
519
565
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
+
520
615
/*
521
616
* Set driver to loopback mode
522
617
* The driver stays in loopback mode after that.
@@ -691,6 +786,24 @@ void test_send_receive_buffer(void)
691
786
can_detach (can_dev , filter_id );
692
787
}
693
788
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
+
694
807
/*
695
808
* Attach to a filter that should not pass the message and send a message
696
809
* with a different id.
@@ -746,6 +859,8 @@ void test_main(void)
746
859
ztest_unit_test (test_send_receive_ext ),
747
860
ztest_unit_test (test_send_receive_std_masked ),
748
861
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 ),
749
864
ztest_unit_test (test_send_receive_buffer ),
750
865
ztest_unit_test (test_send_receive_wrong_id ));
751
866
ztest_run_test_suite (can_driver );
0 commit comments