@@ -110,7 +110,12 @@ static inline uint harware_alarm_irq_number(uint alarm_num) {
110
110
return TIMER_IRQ_0 + alarm_num ;
111
111
}
112
112
113
- static void hardware_alarm_irq_handler (void ) {
113
+ /**
114
+ * Modification on the porting to Zephyr:
115
+ * Add parameter argument to enable referencing user data
116
+ * Publish as API.
117
+ */
118
+ void hardware_alarm_irq_handler (void * data ) {
114
119
// Determine which timer this IRQ is for
115
120
uint alarm_num = __get_current_exception () - VTABLE_FIRST_IRQ - TIMER_IRQ_0 ;
116
121
check_hardware_alarm_num_param (alarm_num );
@@ -141,33 +146,27 @@ static void hardware_alarm_irq_handler(void) {
141
146
spin_unlock (lock , save );
142
147
143
148
if (callback ) {
144
- callback (alarm_num );
149
+ callback (alarm_num , data );
145
150
}
146
151
}
147
152
153
+ /**
154
+ * Modification on the porting to Zephyr:
155
+ * Don't add irq handler to interrupt vector in this function.
156
+ */
148
157
void hardware_alarm_set_callback (uint alarm_num , hardware_alarm_callback_t callback ) {
149
158
// todo check current core owner
150
159
// note this should probably be subsumed by irq_set_exclusive_handler anyway, since that
151
160
// should disallow IRQ handlers on both cores
152
161
check_hardware_alarm_num_param (alarm_num );
153
- uint irq_num = harware_alarm_irq_number (alarm_num );
154
162
spin_lock_t * lock = spin_lock_instance (PICO_SPINLOCK_ID_TIMER );
155
163
uint32_t save = spin_lock_blocking (lock );
156
164
if (callback ) {
157
- if (hardware_alarm_irq_handler != irq_get_vtable_handler (irq_num )) {
158
- // note that set_exclusive will silently allow you to set the handler to the same thing
159
- // since it is idempotent, which means we don't need to worry about locking ourselves
160
- irq_set_exclusive_handler (irq_num , hardware_alarm_irq_handler );
161
- irq_set_enabled (irq_num , true);
162
- // Enable interrupt in block and at processor
163
- hw_set_bits (& timer_hw -> inte , 1u << alarm_num );
164
- }
165
+ hw_set_bits (& timer_hw -> inte , 1u << alarm_num );
165
166
alarm_callbacks [alarm_num ] = callback ;
166
167
} else {
167
168
alarm_callbacks [alarm_num ] = NULL ;
168
169
timer_callbacks_pending &= (uint8_t )~(1u << alarm_num );
169
- irq_remove_handler (irq_num , hardware_alarm_irq_handler );
170
- irq_set_enabled (irq_num , false);
171
170
}
172
171
spin_unlock (lock , save );
173
172
}
0 commit comments