@@ -100,49 +100,36 @@ constexpr int sum_ngpios = sum_of_list(
100100 * GPIO callback implementation 
101101 */  
102102
103- struct  arduino_callback  {
104-   voidFuncPtr handler;
105-   bool  enabled;
106- };
107- 
108103struct  gpio_port_callback  {
109104  struct  gpio_callback  callback;
110-   struct  arduino_callback  handlers[max_ngpios];
111-   gpio_port_pins_t  pins;
112-   const  struct  device  *dev;
113- } port_callback[ARRAY_SIZE(gpios)] = {0 };
105+   voidFuncPtr handlers[max_ngpios];
106+ } port_callback[ARRAY_SIZE(gpios)] = { 0  };
114107
115108struct  gpio_port_callback  *find_gpio_port_callback (const  struct  device  *dev)
116109{
117-   for  (size_t  i = 0 ; i < ARRAY_SIZE (port_callback); i++) {
118-     if  (port_callback[i].dev  == dev) {
119-       return  &port_callback[i];
120-     }
121-     if  (port_callback[i].dev  == nullptr ) {
122-       port_callback[i].dev  = dev;
110+   for  (size_t  i = 0 ; i < ARRAY_SIZE (gpios); i++) {
111+     if  (dev == gpios[i]) {
123112      return  &port_callback[i];
124113    }
125114  }
126115
127116  return  nullptr ;
128117}
129118
130- void  setInterruptHandler (pin_size_t  pinNumber, voidFuncPtr func)
131- {
119+ void  set_interrupt_handler (pin_size_t  pinNumber, voidFuncPtr func) {
132120  struct  gpio_port_callback  *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
133121
134122  if  (pcb) {
135-     pcb->handlers [local_gpio_pin (pinNumber)]. handler  = func;
123+     pcb->handlers [local_gpio_pin (pinNumber)] = func;
136124  }
137125}
138126
139- void  handleGpioCallback (const  struct  device  *port, struct  gpio_callback  *cb, uint32_t  pins)
140- {
141-   struct  gpio_port_callback  *pcb = (struct  gpio_port_callback  *)cb;
127+ void  handle_gpio_callback (const  struct  device  *port, struct  gpio_callback  *cb, uint32_t  pins) {
128+   struct  gpio_port_callback  *pcb = CONTAINER_OF (cb, struct  gpio_port_callback , callback);
142129
143130  for  (uint32_t  i = 0 ; i < max_ngpios; i++) {
144-     if  (pins & BIT (i) && pcb->handlers [i]. enabled ) {
145-       pcb->handlers [i]. handler ();
131+     if  (pins & BIT (i) && pcb->handlers [i]) {
132+       pcb->handlers [i]();
146133    }
147134  }
148135}
@@ -257,8 +244,7 @@ void tone_expiry_cb(struct k_timer *timer) {
257244  }
258245}
259246
260- void  tone (pin_size_t  pinNumber, unsigned  int  frequency,
261-           unsigned  long  duration) {
247+ void  tone (pin_size_t  pinNumber, unsigned  int  frequency, unsigned  long  duration) {
262248  struct  k_timer  *timer = &arduino_pin_timers[pinNumber].timer ;
263249  k_timeout_t  timeout;
264250  uint32_t  count;
@@ -418,19 +404,22 @@ void attachInterrupt(pin_size_t pinNumber, voidFuncPtr callback, PinStatus pinSt
418404  pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
419405  __ASSERT (pcb != nullptr , " gpio_port_callback not found"  );
420406
421-   pcb->pins  |= BIT (local_gpio_pin (pinNumber));
422-   setInterruptHandler (pinNumber, callback);
423-   enableInterrupt (pinNumber);
407+   set_interrupt_handler (pinNumber, callback);
424408
409+   if  (pcb->callback .handler  == NULL ) {
410+     gpio_init_callback (&pcb->callback , handle_gpio_callback, 0 );
411+     gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
412+   }
413+ 
414+   enableInterrupt (pinNumber);
425415  gpio_pin_interrupt_configure (local_gpio_port (pinNumber), local_gpio_pin (pinNumber), intmode);
426-   gpio_init_callback (&pcb->callback , handleGpioCallback, pcb->pins );
427-   gpio_add_callback (local_gpio_port (pinNumber), &pcb->callback );
428416}
429417
430418void  detachInterrupt (pin_size_t  pinNumber)
431419{
432-   setInterruptHandler ( pinNumber,  nullptr );
420+   gpio_pin_interrupt_configure ( local_gpio_port ( pinNumber),  local_gpio_pin (pinNumber),  0 );
433421  disableInterrupt (pinNumber);
422+   set_interrupt_handler (pinNumber, nullptr );
434423}
435424
436425#ifndef  CONFIG_MINIMAL_LIBC_RAND
@@ -492,15 +481,15 @@ void enableInterrupt(pin_size_t pinNumber) {
492481  struct  gpio_port_callback  *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
493482
494483  if  (pcb) {
495-     pcb->handlers [ local_gpio_pin (pinNumber)]. enabled  =  true ;
484+     pcb->callback . pin_mask  |=  BIT ( local_gpio_pin (pinNumber)) ;
496485  }
497486}
498487
499488void  disableInterrupt (pin_size_t  pinNumber) {
500489  struct  gpio_port_callback  *pcb = find_gpio_port_callback (local_gpio_port (pinNumber));
501490
502491  if  (pcb) {
503-     pcb->handlers [ local_gpio_pin (pinNumber)]. enabled  =  false ;
492+     pcb->callback . pin_mask  &=  ~BIT (local_gpio_pin(pinNumber)) ;
504493  }
505494}
506495
0 commit comments