@@ -143,49 +143,36 @@ constexpr int max_ngpios = max_in_list(
143143 * GPIO callback implementation 
144144 */  
145145
146- struct  arduino_callback  {
147-   voidFuncPtr handler;
148-   bool  enabled;
149- };
150- 
151146struct  gpio_port_callback  {
152147  struct  gpio_callback  callback;
153-   struct  arduino_callback  handlers[max_ngpios];
154-   gpio_port_pins_t  pins;
155-   const  struct  device  *dev;
156- } port_callback[ARRAY_SIZE(gpios)] = {0 };
148+   voidFuncPtr handlers[max_ngpios];
149+ } port_callback[ARRAY_SIZE(gpios)] = { 0  };
157150
158151struct  gpio_port_callback  *find_gpio_port_callback (const  struct  device  *dev)
159152{
160-   for  (size_t  i = 0 ; i < ARRAY_SIZE (port_callback); i++) {
161-     if  (port_callback[i].dev  == dev) {
162-       return  &port_callback[i];
163-     }
164-     if  (port_callback[i].dev  == nullptr ) {
165-       port_callback[i].dev  = dev;
153+   for  (size_t  i = 0 ; i < ARRAY_SIZE (gpios); i++) {
154+     if  (dev == gpios[i]) {
166155      return  &port_callback[i];
167156    }
168157  }
169158
170159  return  nullptr ;
171160}
172161
173- void  setInterruptHandler (pin_size_t  pinNumber, voidFuncPtr func)
174- {
162+ void  set_interrupt_handler (pin_size_t  pinNumber, voidFuncPtr func) {
175163  struct  gpio_port_callback  *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
176164
177165  if  (pcb) {
178-     pcb->handlers [local_gpio_pin (pinNumber)]. handler  = func;
166+     pcb->handlers [local_gpio_pin (pinNumber)] = func;
179167  }
180168}
181169
182- void  handleGpioCallback (const  struct  device  *port, struct  gpio_callback  *cb, uint32_t  pins)
183- {
184-   struct  gpio_port_callback  *pcb = (struct  gpio_port_callback  *)cb;
170+ void  handle_gpio_callback (const  struct  device  *port, struct  gpio_callback  *cb, uint32_t  pins) {
171+   struct  gpio_port_callback  *pcb = CONTAINER_OF (cb, struct  gpio_port_callback , callback);
185172
186173  for  (uint32_t  i = 0 ; i < max_ngpios; i++) {
187-     if  (pins & BIT (i) && pcb->handlers [i]. enabled ) {
188-       pcb->handlers [i]. handler ();
174+     if  (pins & BIT (i) && pcb->handlers [i]) {
175+       pcb->handlers [i]();
189176    }
190177  }
191178}
@@ -300,8 +287,7 @@ void tone_expiry_cb(struct k_timer *timer) {
300287  }
301288}
302289
303- void  tone (pin_size_t  pinNumber, unsigned  int  frequency,
304-           unsigned  long  duration) {
290+ void  tone (pin_size_t  pinNumber, unsigned  int  frequency, unsigned  long  duration) {
305291  struct  k_timer  *timer = &arduino_pin_timers[pinNumber].timer ;
306292  k_timeout_t  timeout;
307293  uint32_t  count;
@@ -461,19 +447,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
461447  pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
462448  __ASSERT (pcb != nullptr , " gpio_port_callback not found" 
463449
464-   pcb->pins  |= BIT (local_gpio_pin (pinNumber));
465-   setInterruptHandler (pinNumber, callback);
466-   enableInterrupt (pinNumber);
450+   set_interrupt_handler (pinNumber, callback);
467451
452+   if  (pcb->callback .handler  == NULL ) {
453+     gpio_init_callback (&pcb->callback , handle_gpio_callback, 0 );
454+     gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
455+   }
456+ 
457+   enableInterrupt (pinNumber);
468458  gpio_pin_interrupt_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber), intmode);
469-   gpio_init_callback (&pcb->callback , handleGpioCallback, pcb->pins );
470-   gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
471459}
472460
473461void  detachInterrupt (pin_size_t  pinNumber)
474462{
475-   setInterruptHandler ( pinNumber,  nullptr );
463+   gpio_pin_interrupt_configure ( local_gpio_port ( pinNumber),  local_gpio_pin (pinNumber),  0 );
476464  disableInterrupt (pinNumber);
465+   set_interrupt_handler (pinNumber, nullptr );
477466}
478467
479468#ifndef  CONFIG_MINIMAL_LIBC_RAND
@@ -535,15 +524,15 @@ void enableInterrupt(pin_size_t pinNumber) {
535524  struct  gpio_port_callback  *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
536525
537526  if  (pcb) {
538-     pcb->handlers [ local_gpio_pin (pinNumber)]. enabled  =  true ;
527+     pcb->callback . pin_mask  |=  BIT ( local_gpio_pin (pinNumber)) ;
539528  }
540529}
541530
542531void  disableInterrupt (pin_size_t  pinNumber) {
543532  struct  gpio_port_callback  *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
544533
545534  if  (pcb) {
546-     pcb->handlers [ local_gpio_pin (pinNumber)]. enabled  =  false ;
535+     pcb->callback . pin_mask  &=  ~BIT (local_gpio_pin(pinNumber)) ;
547536  }
548537}
549538
0 commit comments