1111#include <logging/log.h>
1212LOG_MODULE_DECLARE (CCS811 );
1313
14+ #define IRQ_PIN DT_INST_0_AMS_CCS811_IRQ_GPIOS_PIN
15+
1416int ccs811_attr_set (struct device * dev ,
1517 enum sensor_channel chan ,
1618 enum sensor_attribute attr ,
@@ -41,40 +43,57 @@ int ccs811_attr_set(struct device *dev,
4143 return rc ;
4244}
4345
44- static void gpio_callback (struct device * dev ,
45- struct gpio_callback * cb ,
46- u32_t pins )
46+ static inline void setup_irq (struct device * dev ,
47+ bool enable )
4748{
48- struct ccs811_data * drv_data =
49- CONTAINER_OF (cb , struct ccs811_data , gpio_cb );
49+ struct ccs811_data * data = dev -> driver_data ;
50+ unsigned int flags = enable
51+ ? GPIO_INT_LEVEL_ACTIVE
52+ : GPIO_INT_DISABLE ;
5053
51- ARG_UNUSED (pins );
54+ gpio_pin_interrupt_configure (data -> irq_gpio , IRQ_PIN , flags );
55+ }
56+
57+ static inline void handle_irq (struct device * dev )
58+ {
59+ struct ccs811_data * data = dev -> driver_data ;
5260
53- gpio_pin_disable_callback (dev , DT_INST_0_AMS_CCS811_IRQ_GPIOS_PIN );
61+ setup_irq (dev , false );
5462
5563#if defined(CONFIG_CCS811_TRIGGER_OWN_THREAD )
56- k_sem_give (& drv_data -> gpio_sem );
64+ k_sem_give (& data -> gpio_sem );
5765#elif defined(CONFIG_CCS811_TRIGGER_GLOBAL_THREAD )
58- k_work_submit (& drv_data -> work );
59- #else
60- #error Unhandled trigger configuration
66+ k_work_submit (& data -> work );
6167#endif
6268}
6369
64- static void thread_cb ( void * arg )
70+ static void process_irq ( struct device * dev )
6571{
66- struct device * dev = arg ;
67- struct ccs811_data * drv_data = dev -> driver_data ;
72+ struct ccs811_data * data = dev -> driver_data ;
6873
69- if (drv_data -> handler != NULL ) {
70- drv_data -> handler (dev , & drv_data -> trigger );
74+ if (data -> handler != NULL ) {
75+ data -> handler (dev , & data -> trigger );
7176 }
7277
73- gpio_pin_enable_callback (drv_data -> int_gpio , DT_INST_0_AMS_CCS811_IRQ_GPIOS_PIN );
78+ if (data -> handler != NULL ) {
79+ setup_irq (dev , true);
80+ }
81+ }
82+
83+ static void gpio_callback (struct device * dev ,
84+ struct gpio_callback * cb ,
85+ u32_t pins )
86+ {
87+ struct ccs811_data * data =
88+ CONTAINER_OF (cb , struct ccs811_data , gpio_cb );
89+
90+ ARG_UNUSED (pins );
91+
92+ handle_irq (data -> dev );
7493}
7594
7695#ifdef CONFIG_CCS811_TRIGGER_OWN_THREAD
77- static void datardy_thread (int dev_ptr , int unused )
96+ static void irq_thread (int dev_ptr , int unused )
7897{
7998 struct device * dev = INT_TO_POINTER (dev_ptr );
8099 struct ccs811_data * drv_data = dev -> driver_data ;
@@ -83,16 +102,15 @@ static void datardy_thread(int dev_ptr, int unused)
83102
84103 while (1 ) {
85104 k_sem_take (& drv_data -> gpio_sem , K_FOREVER );
86- thread_cb (dev );
105+ process_irq (dev );
87106 }
88107}
89108#elif defined(CONFIG_CCS811_TRIGGER_GLOBAL_THREAD )
90109static void work_cb (struct k_work * work )
91110{
92- struct ccs811_data * drv_data =
93- CONTAINER_OF (work , struct ccs811_data , work );
111+ struct ccs811_data * data = CONTAINER_OF (work , struct ccs811_data , work );
94112
95- thread_cb ( drv_data -> dev );
113+ process_irq ( data -> dev );
96114}
97115#else
98116#error Unhandled trigger configuration
@@ -107,7 +125,13 @@ int ccs811_trigger_set(struct device *dev,
107125 int rc ;
108126
109127 LOG_DBG ("CCS811 trigger set" );
110- gpio_pin_disable_callback (drv_data -> int_gpio , DT_INST_0_AMS_CCS811_IRQ_GPIOS_PIN );
128+ setup_irq (dev , false);
129+
130+ drv_data -> handler = handler ;
131+ if (handler == NULL ) {
132+ return 0 ;
133+ }
134+
111135 if (trig -> type == SENSOR_TRIG_DATA_READY ) {
112136 rc = ccs811_mutate_meas_mode (dev , CCS811_MODE_DATARDY ,
113137 CCS811_MODE_THRESH );
@@ -128,11 +152,14 @@ int ccs811_trigger_set(struct device *dev,
128152 }
129153
130154 if (rc == 0 ) {
131- drv_data -> handler = handler ;
132155 drv_data -> trigger = * trig ;
133- gpio_pin_enable_callback (drv_data -> int_gpio ,
134- DT_INST_0_AMS_CCS811_IRQ_GPIOS_PIN );
156+ setup_irq (dev , true);
157+
158+ if (gpio_pin_get (drv_data -> irq_gpio , IRQ_PIN ) > 0 ) {
159+ handle_irq (dev );
160+ }
135161 } else {
162+ drv_data -> handler = NULL ;
136163 (void )ccs811_mutate_meas_mode (dev , 0 , drdy_thresh );
137164 }
138165
@@ -143,18 +170,14 @@ int ccs811_init_interrupt(struct device *dev)
143170{
144171 struct ccs811_data * drv_data = dev -> driver_data ;
145172
146- #ifndef DT_INST_0_AMS_CCS811_IRQ_GPIOS_PIN
147- return - EINVAL ;
148- #endif
149- gpio_pin_configure (drv_data -> int_gpio , DT_INST_0_AMS_CCS811_IRQ_GPIOS_PIN ,
150- GPIO_DIR_IN | GPIO_INT | GPIO_INT_LEVEL |
151- GPIO_INT_ACTIVE_LOW | GPIO_PUD_PULL_UP |
152- GPIO_INT_DEBOUNCE );
173+ drv_data -> dev = dev ;
153174
154- gpio_init_callback ( & drv_data -> gpio_cb , gpio_callback ,
155- BIT ( DT_INST_0_AMS_CCS811_IRQ_GPIOS_PIN ) );
175+ gpio_pin_configure ( drv_data -> irq_gpio , IRQ_PIN ,
176+ GPIO_INPUT | DT_INST_0_AMS_CCS811_IRQ_GPIOS_FLAGS );
156177
157- if (gpio_add_callback (drv_data -> int_gpio , & drv_data -> gpio_cb ) < 0 ) {
178+ gpio_init_callback (& drv_data -> gpio_cb , gpio_callback , BIT (IRQ_PIN ));
179+
180+ if (gpio_add_callback (drv_data -> irq_gpio , & drv_data -> gpio_cb ) < 0 ) {
158181 LOG_DBG ("Failed to set gpio callback!" );
159182 return - EIO ;
160183 }
@@ -164,12 +187,11 @@ int ccs811_init_interrupt(struct device *dev)
164187
165188 k_thread_create (& drv_data -> thread , drv_data -> thread_stack ,
166189 CONFIG_CCS811_THREAD_STACK_SIZE ,
167- (k_thread_entry_t )datardy_thread , dev ,
190+ (k_thread_entry_t )irq_thread , dev ,
168191 0 , NULL , K_PRIO_COOP (CONFIG_CCS811_THREAD_PRIORITY ),
169192 0 , 0 );
170193#elif defined(CONFIG_CCS811_TRIGGER_GLOBAL_THREAD )
171194 drv_data -> work .handler = work_cb ;
172- drv_data -> dev = dev ;
173195#else
174196#error Unhandled trigger configuration
175197#endif
0 commit comments