@@ -180,6 +180,158 @@ static int test_peripbus(void)
180180 return 0 ;
181181}
182182
183+ /* Register address macros for testing */
184+ #define RDSR0_ADDR 0x05
185+ #define RDSR1_ADDR 0x1F
186+ #define RDSR2_ADDR 0x2F
187+ #define WRSR2_ADDR 0x3F
188+
189+ static int test_rdsr0 (void )
190+ {
191+ int ret ;
192+ uint8_t val ;
193+
194+ LOG_INF ("Testing RDSR0" );
195+
196+ ret = rpu_read_reg (RDSR0_ADDR , & val );
197+ if (ret ) {
198+ LOG_ERR ("Failed to read RDSR0: %d" , ret );
199+ return -1 ;
200+ }
201+
202+ LOG_INF ("RDSR0 value: 0x%x" , val );
203+
204+ if (val == 0x42 ) {
205+ return 0 ;
206+ }
207+ LOG_ERR ("RDSR0 test failed: expected 0x42, got 0x%x" , val );
208+ return -1 ;
209+ }
210+
211+ /* Helper function to write and verify a test pattern */
212+ static int test_rdsr2_pattern (uint8_t test_pattern , const char * pattern_name )
213+ {
214+ int ret ;
215+ uint8_t read_val ;
216+ uint8_t masked_pattern = test_pattern & 0xFE ; /* Ensure bit 0 is 0 */
217+
218+ LOG_INF ("Testing RDSR2 pattern %s (0x%02x)" , pattern_name , masked_pattern );
219+
220+ ret = rpu_write_reg (WRSR2_ADDR , masked_pattern );
221+ if (ret ) {
222+ LOG_ERR ("Failed to write RDSR2 pattern %s" , pattern_name );
223+ return -1 ;
224+ }
225+
226+ ret = rpu_read_reg (RDSR2_ADDR , & read_val );
227+ if (ret ) {
228+ LOG_ERR ("Failed to read RDSR2 after writing pattern %s" , pattern_name );
229+ return -1 ;
230+ }
231+
232+ /* Compare only bits 7:1 */
233+ if ((read_val & 0xFE ) != masked_pattern ) {
234+ LOG_ERR ("RDSR2 pattern %s test failed: wrote 0x%02x, read 0x%02x (bits 7:1)" ,
235+ pattern_name , masked_pattern , read_val & 0xFE );
236+ return -1 ;
237+ }
238+
239+ LOG_INF ("RDSR2 pattern %s test passed: wrote 0x%02x, read 0x%02x" ,
240+ pattern_name , masked_pattern , read_val );
241+ return 0 ;
242+ }
243+
244+ /* Individual test for pattern 0xAA (10101010) */
245+ static int test_rdsr2_pattern_0xAA (void )
246+ {
247+ return test_rdsr2_pattern (0xAA , "0xAA (10101010)" );
248+ }
249+
250+ /* Individual test for pattern 0x54 (01010100) */
251+ static int test_rdsr2_pattern_0x54 (void )
252+ {
253+ return test_rdsr2_pattern (0x54 , "0x54 (01010100)" );
254+ }
255+
256+ /* Helper function to test walking bit patterns */
257+ static int test_rdsr2_walking_pattern (bool walking_ones , const char * test_name )
258+ {
259+ int ret , i ;
260+ uint8_t read_val , test_val ;
261+
262+ LOG_INF ("Starting %s test for RDSR2 bits 7:1" , test_name );
263+
264+ for (i = 1 ; i <= 7 ; i ++ ) {
265+ if (walking_ones ) {
266+ test_val = (1 << i ); /* Set walking bit */
267+ } else {
268+ test_val = (0xFE & ~(1 << i )); /* Clear walking bit */
269+ }
270+
271+ ret = rpu_write_reg (WRSR2_ADDR , test_val & 0xFE );
272+ /* Ensure bit 0 is 0 when writing */
273+ if (ret ) {
274+ LOG_ERR ("Failed to write RDSR2 %s bit %d" , test_name , i );
275+ return -1 ;
276+ }
277+
278+ ret = rpu_read_reg (RDSR2_ADDR , & read_val );
279+ if (ret ) {
280+ LOG_ERR ("Failed to read RDSR2 after writing %s bit %d" , test_name , i );
281+ return -1 ;
282+ }
283+
284+ /* Compare only bits 7:1 */
285+ if ((read_val & 0xFE ) != (test_val & 0xFE )) {
286+ LOG_ERR ("RDSR2 %s bit %d test failed: wrote 0x%02x, read 0x%02x (bits 7:1)" ,
287+ test_name , i , test_val & 0xFE , read_val & 0xFE );
288+ return -1 ;
289+ }
290+ LOG_DBG ("RDSR2 %s bit %d passed: wrote 0x%02x, read 0x%02x" ,
291+ test_name , i , test_val & 0xFE , read_val );
292+ }
293+
294+ LOG_INF ("%s test completed successfully" , test_name );
295+ return 0 ;
296+ }
297+
298+ /* Individual test for walking '1' pattern */
299+ static int test_rdsr2_walking_ones (void )
300+ {
301+ return test_rdsr2_walking_pattern (true, "walking '1'" );
302+ }
303+
304+ /* Individual test for walking '0' pattern */
305+ static int test_rdsr2_walking_zeros (void )
306+ {
307+ return test_rdsr2_walking_pattern (false, "walking '0'" );
308+ }
309+
310+ /* Test for RDSR1 register */
311+ static int test_rdsr1 (void )
312+ {
313+ int ret ;
314+ uint8_t val ;
315+
316+ LOG_INF ("Testing RDSR1" );
317+
318+ ret = rpu_read_reg (RDSR1_ADDR , & val );
319+ if (ret ) {
320+ LOG_ERR ("Failed to read RDSR1: %d" , ret );
321+ return -1 ;
322+ }
323+
324+ LOG_INF ("RDSR1 value: 0x%x" , val );
325+
326+ /* RDSR1 should have RPU_AWAKE_BIT set when RPU is awake */
327+ if (val & 0x02 ) { /* RPU_AWAKE_BIT = BIT(1) */
328+ LOG_INF ("RDSR1 test passed: RPU is awake" );
329+ return 0 ;
330+ }
331+ LOG_ERR ("RDSR1 test failed: RPU is not awake (0x%x)" , val );
332+ return -1 ;
333+ }
334+
183335ZTEST_SUITE (bustest_suite , NULL , (void * )wifi_on , NULL , NULL , wifi_off );
184336
185337ZTEST (bustest_suite , test_sysbus )
@@ -196,3 +348,33 @@ ZTEST(bustest_suite, test_dataram)
196348{
197349 zassert_equal (0 , memtest (DATARAM_ADDR , "DATA RAM" ), "DATA RAM memtest failed!!!" );
198350}
351+
352+ ZTEST (bustest_suite , test_rdsr0 )
353+ {
354+ zassert_equal (0 , test_rdsr0 (), "RDSR0 test failed!!!" );
355+ }
356+
357+ ZTEST (bustest_suite , test_rdsr2_pattern_0xAA )
358+ {
359+ zassert_equal (0 , test_rdsr2_pattern_0xAA (), "RDSR2 pattern 0xAA test failed!!!" );
360+ }
361+
362+ ZTEST (bustest_suite , test_rdsr2_pattern_0x54 )
363+ {
364+ zassert_equal (0 , test_rdsr2_pattern_0x54 (), "RDSR2 pattern 0x54 test failed!!!" );
365+ }
366+
367+ ZTEST (bustest_suite , test_rdsr2_walking_ones )
368+ {
369+ zassert_equal (0 , test_rdsr2_walking_ones (), "RDSR2 walking '1' test failed!!!" );
370+ }
371+
372+ ZTEST (bustest_suite , test_rdsr2_walking_zeros )
373+ {
374+ zassert_equal (0 , test_rdsr2_walking_zeros (), "RDSR2 walking '0' test failed!!!" );
375+ }
376+
377+ ZTEST (bustest_suite , test_rdsr1 )
378+ {
379+ zassert_equal (0 , test_rdsr1 (), "RDSR1 test failed!!!" );
380+ }
0 commit comments