185 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			185 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * Licensed to the Apache Software Foundation (ASF) under one | ||
|  |  * or more contributor license agreements.  See the NOTICE file | ||
|  |  * distributed with this work for additional information | ||
|  |  * regarding copyright ownership.  The ASF licenses this file | ||
|  |  * to you under the Apache License, Version 2.0 (the | ||
|  |  * "License"); you may not use this file except in compliance | ||
|  |  * with the License.  You may obtain a copy of the License at | ||
|  |  * | ||
|  |  *  http://www.apache.org/licenses/LICENSE-2.0
 | ||
|  |  * | ||
|  |  * Unless required by applicable law or agreed to in writing, | ||
|  |  * software distributed under the License is distributed on an | ||
|  |  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
|  |  * KIND, either express or implied.  See the License for the | ||
|  |  * specific language governing permissions and limitations | ||
|  |  * under the License. | ||
|  |  */ | ||
|  | 
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @addtogroup HAL | ||
|  |  * @{ | ||
|  |  *   @defgroup HALGpio HAL GPIO | ||
|  |  *   @{ | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifndef H_HAL_GPIO_
 | ||
|  | #define H_HAL_GPIO_
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * The "mode" of the gpio. The gpio is either an input, output, or it is | ||
|  |  * "not connected" (the pin specified is not functioning as a gpio) | ||
|  |  */ | ||
|  | enum hal_gpio_mode_e { | ||
|  |     /** Not connected */ | ||
|  |     HAL_GPIO_MODE_NC = -1, | ||
|  |     /** Input */ | ||
|  |     HAL_GPIO_MODE_IN = 0, | ||
|  |     /** Output */ | ||
|  |     HAL_GPIO_MODE_OUT = 1 | ||
|  | }; | ||
|  | typedef enum hal_gpio_mode_e hal_gpio_mode_t; | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * The "pull" of the gpio. This is either an input or an output. | ||
|  |  */ | ||
|  | enum hal_gpio_pull { | ||
|  |     /** Pull-up/down not enabled */ | ||
|  |     HAL_GPIO_PULL_NONE = 0, | ||
|  |     /** Pull-up enabled */ | ||
|  |     HAL_GPIO_PULL_UP = 1, | ||
|  |     /** Pull-down enabled */ | ||
|  |     HAL_GPIO_PULL_DOWN = 2 | ||
|  | }; | ||
|  | typedef enum hal_gpio_pull hal_gpio_pull_t; | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * IRQ trigger type. | ||
|  |  */ | ||
|  | enum hal_gpio_irq_trigger { | ||
|  |     HAL_GPIO_TRIG_NONE = 0, | ||
|  |     /** IRQ occurs on rising edge */ | ||
|  |     HAL_GPIO_TRIG_RISING = 1, | ||
|  |     /** IRQ occurs on falling edge */ | ||
|  |     HAL_GPIO_TRIG_FALLING = 2, | ||
|  |     /** IRQ occurs on either edge */ | ||
|  |     HAL_GPIO_TRIG_BOTH = 3, | ||
|  |     /** IRQ occurs when line is low */ | ||
|  |     HAL_GPIO_TRIG_LOW = 4, | ||
|  |     /** IRQ occurs when line is high */ | ||
|  |     HAL_GPIO_TRIG_HIGH = 5 | ||
|  | }; | ||
|  | typedef enum hal_gpio_irq_trigger hal_gpio_irq_trig_t; | ||
|  | 
 | ||
|  | /* Function proto for GPIO irq handler functions */ | ||
|  | typedef void (*hal_gpio_irq_handler_t)(void *arg); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Initializes the specified pin as an input | ||
|  |  * | ||
|  |  * @param pin   Pin number to set as input | ||
|  |  * @param pull  pull type | ||
|  |  * | ||
|  |  * @return int  0: no error; -1 otherwise. | ||
|  |  */ | ||
|  | int hal_gpio_init_in(int pin, hal_gpio_pull_t pull); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Initialize the specified pin as an output, setting the pin to the specified | ||
|  |  * value. | ||
|  |  * | ||
|  |  * @param pin Pin number to set as output | ||
|  |  * @param val Value to set pin | ||
|  |  * | ||
|  |  * @return int  0: no error; -1 otherwise. | ||
|  |  */ | ||
|  | int hal_gpio_init_out(int pin, int val); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Deinitialize the specified pin to revert the previous initialization | ||
|  |  * | ||
|  |  * @param pin Pin number to unset | ||
|  |  * | ||
|  |  * @return int  0: no error; -1 otherwise. | ||
|  |  */ | ||
|  | int hal_gpio_deinit(int pin); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Write a value (either high or low) to the specified pin. | ||
|  |  * | ||
|  |  * @param pin Pin to set | ||
|  |  * @param val Value to set pin (0:low 1:high) | ||
|  |  */ | ||
|  | void hal_gpio_write(int pin, int val); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Reads the specified pin. | ||
|  |  * | ||
|  |  * @param pin Pin number to read | ||
|  |  * | ||
|  |  * @return int 0: low, 1: high | ||
|  |  */ | ||
|  | int hal_gpio_read(int pin); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Toggles the specified pin | ||
|  |  * | ||
|  |  * @param pin Pin number to toggle | ||
|  |  * | ||
|  |  * @return current gpio state int 0: low, 1: high | ||
|  |  */ | ||
|  | int hal_gpio_toggle(int pin); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Initialize a given pin to trigger a GPIO IRQ callback. | ||
|  |  * | ||
|  |  * @param pin     The pin to trigger GPIO interrupt on | ||
|  |  * @param handler The handler function to call | ||
|  |  * @param arg     The argument to provide to the IRQ handler | ||
|  |  * @param trig    The trigger mode (e.g. rising, falling) | ||
|  |  * @param pull    The mode of the pin (e.g. pullup, pulldown) | ||
|  |  * | ||
|  |  * @return 0 on success, non-zero error code on failure. | ||
|  |  */ | ||
|  | int hal_gpio_irq_init(int pin, hal_gpio_irq_handler_t handler, void *arg, | ||
|  |                       hal_gpio_irq_trig_t trig, hal_gpio_pull_t pull); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Release a pin from being configured to trigger IRQ on state change. | ||
|  |  * | ||
|  |  * @param pin The pin to release | ||
|  |  */ | ||
|  | void hal_gpio_irq_release(int pin); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Enable IRQs on the passed pin | ||
|  |  * | ||
|  |  * @param pin The pin to enable IRQs on | ||
|  |  */ | ||
|  | void hal_gpio_irq_enable(int pin); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Disable IRQs on the passed pin | ||
|  |  * | ||
|  |  * @param pin The pin to disable IRQs on | ||
|  |  */ | ||
|  | void hal_gpio_irq_disable(int pin); | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif /* H_HAL_GPIO_ */
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *   @} HALGpio | ||
|  |  * @} HAL | ||
|  |  */ |