5
5
*/
6
6
7
7
#include <zephyr/kernel.h>
8
+ #include <zephyr/cache.h>
8
9
#include <zephyr/drivers/gpio.h>
9
10
#include <zephyr/drivers/counter.h>
10
11
#include <zephyr/logging/log.h>
13
14
14
15
LOG_MODULE_REGISTER (idle_counter );
15
16
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
+
16
22
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET (DT_ALIAS (led ), gpios );
17
23
18
24
#define ALARM_CHANNEL_ID (0)
19
25
const struct device * const counter_dev = DEVICE_DT_GET (DT_ALIAS (counter ));
20
26
21
27
static K_SEM_DEFINE (my_sem , 0 , 1 ) ;
22
28
23
- #if defined(CONFIG_CLOCK_CONTROL ) && defined(CONFIG_SOC_NRF54H20_CPUAPP )
24
29
const uint32_t freq [] = {320 , 256 , 128 , 64 };
25
30
31
+ #if defined(CONFIG_GLOBAL_DOMAIN_CLOCK_FREQUENCY_SWITCHING )
26
32
/*
27
33
* Set Global Domain frequency (HSFLL120)
28
34
*/
@@ -45,12 +51,11 @@ void set_global_domain_frequency(uint32_t freq)
45
51
__ASSERT (err == 0 , "Wrong clock control request return code" );
46
52
__ASSERT (res == 0 , "Wrong clock control request response" );
47
53
}
48
- #endif /* CONFIG_CLOCK_CONTROL && CONFIG_SOC_NRF54H20_CPUAPP */
54
+ #endif /* CONFIG_GLOBAL_DOMAIN_CLOCK_FREQUENCY_SWITCHING */
49
55
50
56
void counter_handler (const struct device * counter_dev , uint8_t chan_id , uint32_t ticks ,
51
57
void * user_data )
52
58
{
53
- gpio_pin_set_dt (& led , 1 );
54
59
k_sem_give (& my_sem );
55
60
counter_stop (counter_dev );
56
61
}
@@ -92,6 +97,17 @@ void verify_timer(uint32_t start_time)
92
97
"expected time to elapse is 1s" );
93
98
}
94
99
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
+
95
111
int main (void )
96
112
{
97
113
uint32_t start_time ;
@@ -106,28 +122,45 @@ int main(void)
106
122
/* Wait a bit to solve NRFS request timeout issue. */
107
123
k_msleep (500 );
108
124
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
116
148
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 ++ ) {
119
152
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 */
123
159
verify_timer (start_time );
124
- k_busy_wait (100000 );
125
160
}
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 );
131
164
}
132
165
133
166
return 0 ;
0 commit comments