55 */
66
77#include <zephyr/kernel.h>
8+ #include <zephyr/cache.h>
89#include <zephyr/drivers/gpio.h>
910#include <zephyr/drivers/counter.h>
1011#include <zephyr/logging/log.h>
1314
1415LOG_MODULE_REGISTER (idle_counter );
1516
17+ #define SHM_START_ADDR (DT_REG_ADDR(DT_NODELABEL(cpuapp_cpurad_ipc_shm)))
18+ volatile static uint32_t * shared_var = (volatile uint32_t * )SHM_START_ADDR ;
19+ #define HOST_IS_READY (1)
20+ #define REMOTE_IS_READY (2)
21+
1622static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET (DT_ALIAS (led ), gpios );
1723
1824#define ALARM_CHANNEL_ID (0)
1925const struct device * const counter_dev = DEVICE_DT_GET (DT_ALIAS (counter ));
2026
2127static K_SEM_DEFINE (my_sem , 0 , 1 ) ;
2228
23- #if defined(CONFIG_CLOCK_CONTROL ) && defined(CONFIG_SOC_NRF54H20_CPUAPP )
2429const uint32_t freq [] = {320 , 256 , 128 , 64 };
2530
31+ #if defined(CONFIG_GLOBAL_DOMAIN_CLOCK_FREQUENCY_SWITCHING )
2632/*
2733 * Set Global Domain frequency (HSFLL120)
2834 */
@@ -45,12 +51,11 @@ void set_global_domain_frequency(uint32_t freq)
4551 __ASSERT (err == 0 , "Wrong clock control request return code" );
4652 __ASSERT (res == 0 , "Wrong clock control request response" );
4753}
48- #endif /* CONFIG_CLOCK_CONTROL && CONFIG_SOC_NRF54H20_CPUAPP */
54+ #endif /* CONFIG_GLOBAL_DOMAIN_CLOCK_FREQUENCY_SWITCHING */
4955
5056void counter_handler (const struct device * counter_dev , uint8_t chan_id , uint32_t ticks ,
5157 void * user_data )
5258{
53- gpio_pin_set_dt (& led , 1 );
5459 k_sem_give (& my_sem );
5560 counter_stop (counter_dev );
5661}
@@ -92,6 +97,17 @@ void verify_timer(uint32_t start_time)
9297 "expected time to elapse is 1s" );
9398}
9499
100+ void sleep_with_state_indication (uint32_t sleep_duration_ms )
101+ {
102+ int ret ;
103+
104+ ret = gpio_pin_set_dt (& led , 0 );
105+ __ASSERT (ret == 0 , "Unable to turn off LED" );
106+ k_msleep (sleep_duration_ms );
107+ ret = gpio_pin_set_dt (& led , 1 );
108+ __ASSERT (ret == 0 , "Unable to turn on LED" );
109+ }
110+
95111int main (void )
96112{
97113 uint32_t start_time ;
@@ -106,28 +122,45 @@ int main(void)
106122 /* Wait a bit to solve NRFS request timeout issue. */
107123 k_msleep (500 );
108124
109- while (1 ) {
110- ret = gpio_pin_set_dt (& led , 0 );
111- __ASSERT (ret == 0 , "Unable to turn off LED" );
112- k_msleep (CONFIG_TEST_SLEEP_DURATION_MS );
113- ret = gpio_pin_set_dt (& led , 1 );
114- __ASSERT (ret == 0 , "Unable to turn on LED" );
115- k_busy_wait (100000 );
125+ /* Synchronize Remote core with Host core */
126+ #if !defined(CONFIG_TEST_ROLE_REMOTE )
127+ LOG_DBG ("HOST starts" );
128+ * shared_var = HOST_IS_READY ;
129+ sys_cache_data_flush_range ((void * )shared_var , sizeof (* shared_var ));
130+ LOG_DBG ("HOST wrote HOST_IS_READY: %u" , * shared_var );
131+ while (* shared_var != REMOTE_IS_READY ) {
132+ sys_cache_data_invd_range ((void * )shared_var , sizeof (* shared_var ));
133+ LOG_DBG ("shared_var is: %u" , * shared_var );
134+ }
135+ LOG_DBG ("HOST continues" );
136+ #else
137+ LOG_DBG ("REMOTE starts" );
138+ while (* shared_var != HOST_IS_READY ) {
139+ sys_cache_data_invd_range ((void * )shared_var , sizeof (* shared_var ));
140+ LOG_DBG ("shared_var is: %u" , * shared_var );
141+ }
142+ LOG_DBG ("REMOTE found that HOST_IS_READY" );
143+ * shared_var = REMOTE_IS_READY ;
144+ sys_cache_data_flush_range ((void * )shared_var , sizeof (* shared_var ));
145+ LOG_DBG ("REMOTE wrote REMOTE_IS_READY: %u" , * shared_var );
146+ LOG_DBG ("REMOTE continues" );
147+ #endif
116148
117- #if defined(CONFIG_CLOCK_CONTROL ) && defined(CONFIG_SOC_NRF54H20_CPUAPP )
118- for (int i = 0 ; i <= ARRAY_SIZE (freq ); i ++ ) {
149+ while (1 ) {
150+ sleep_with_state_indication (CONFIG_TEST_SLEEP_DURATION_MS );
151+ for (int i = 0 ; i < ARRAY_SIZE (freq ); i ++ ) {
119152 start_time = start_timer (counter_dev );
120- if (i ) {
121- set_global_domain_frequency (freq [i - 1 ]);
122- }
153+ k_msleep (100 );
154+ #if defined(CONFIG_GLOBAL_DOMAIN_CLOCK_FREQUENCY_SWITCHING )
155+ sleep_with_state_indication (CONFIG_TEST_SLEEP_DURATION_MS / 2 - 100 );
156+ set_global_domain_frequency (freq [(i + 1 ) % ARRAY_SIZE (freq )]);
157+ k_msleep (10 );
158+ #endif /* CONFIG_GLOBAL_DOMAIN_CLOCK_FREQUENCY_SWITCHING */
123159 verify_timer (start_time );
124- k_busy_wait (100000 );
125160 }
126- #else
127- start_time = start_timer (counter_dev );
128- verify_timer (start_time );
129- k_busy_wait (100000 );
130- #endif /* CONFIG_CLOCK_CONTROL && CONFIG_SOC_NRF54H20_CPUAPP */
161+ ret = gpio_pin_set_dt (& led , 1 );
162+ __ASSERT (ret == 0 , "Unable to turn on LED" );
163+ k_msleep (100 );
131164 }
132165
133166 return 0 ;
0 commit comments