//! \file stm32f4_gpio.h
//! \author tkl
//! \date Mai 8, 2012
//! \brief Header file of the stm32f4xx architecture dependent gpio driver.
#ifndef STM32F4_GPIO_H_
#define STM32F4_GPIO_H_

//! callback for the external interrupt
typedef void* (*gpio_ext_it_cb_t)(void*);

//! \brief stm32f4 gpio device
struct stm32f4_gpio {
	GPIO_TypeDef *port;				//!< Gpio port
	const GPIO_InitTypeDef *pin;	//!< Gpio pin
	const EXTI_InitTypeDef *exti;	//!< Gpio exit it (could be NULL)
	const NVIC_InitTypeDef *nvic;	//!< Gpio nvic (could be NULL)
	gpio_ext_it_cb_t ext_it_cb;		//!< Gpio ext it callback (could be NULL)
	void *param;					//!< Parameter for the callback
};

//! \brief Open a gpio.
//! \param gpio The gpio to open. Must be of type stm32f4_gpio_t.
//! \retval -1 in error case.
int stm32f4_gpio_open(const void *gpio);

//! \brief Close a gpio.
//! \param gpio The gpio to close. Must be of type stm32f4_gpio_t.
//! \retval -1 in error case.
int stm32f4_gpio_close(const void *gpio);

//! \brief Read a gpio.
//! \param gpio The gpio to read. Must be of type stm32f4_gpio_t.
//! \return read out value.
char stm32f4_gpio_read(const void *gpio);

//! \brief Write to a gpio.
//! \param gpio The gpio to write. Must be of type stm32f4_gpio_t.
//! \param byte The data to write.
void stm32f4_gpio_write(const void *gpio, char byte);

//! \brief Toggle a gpio.
//! \param gpio The gpio to read. Must be of type stm32f4_gpio_t.
void stm32f4_gpio_toggle(const void *gpio);

//! \brief Set the callback for a gpio pin external interrupt.
//! \param gpio The gpio to set call back for. Must be of type stm32f4_gpio_t.
//! \param callback The function pointer to call back.
//! \param param The parameter for the call back.
//! \retval -1 in error case.
int stm32f4_gpio_set_exti_callback(const void *gpio, const void *callback,
		const void *param);

static const struct gpio_fp gpio_fp = {
		stm32f4_gpio_open,
		stm32f4_gpio_close,
		stm32f4_gpio_read,
		stm32f4_gpio_write,
		stm32f4_gpio_toggle,
		stm32f4_gpio_set_exti_callback
};

#endif /* STM32F4_GPIO_H_ */