/*! \file gpio.h
 *  \author tkl
 *  \date Feb 13, 2012
 *  \brief Header file of the architecture independent gpio driver.
 */
#ifndef GPIO_H_
#define GPIO_H_

//! \brief Function pointer to the open function.
typedef int (*gpio_fp_open_t)(const void*);

//! \brief Function pointer to the close function.
typedef int (*gpio_fp_close_t)(const void*);

//! \brief Function pointer to the read function.
typedef char (*gpio_fp_read_t)(const void*);

//! \brief Function pointer to the write function.
typedef void (*gpio_fp_write_t)(const void*, char);

//! \brief Function pointer to the toggle function.
typedef void (*gpio_fp_toggle_t)(const void*);

//! \brief Function pointer to the set_callback function.
typedef int (*gpio_fp_set_cb_t)(const void*, const void*, const void*);

//! \brief Contains the function pointer to access the gpio driver.
struct gpio_fp {
	const gpio_fp_open_t	open;	//!< Function pointer to the open function.
	const gpio_fp_close_t	close;	//!< Function pointer to the close function.
	const gpio_fp_read_t	read;	//!< Function pointer to the read function.
	const gpio_fp_write_t	write;	//!< Function pointer to the write function.
	const gpio_fp_toggle_t	toggle;	//!< Function pointer to the toggle function.
	const gpio_fp_set_cb_t	set_cb;	//!< Function pointer to the set_callback function.
};

//! \brief Contains the architecture depended device and the access functions to the gpio driver.
struct gpio {
	const void				*arch_dep_device;	//!< Architecture depended gpio device (i.e. stm32f10x_gpio_t).
	const struct gpio_fp	*fp;				//!< Function pointer for the gpio driver access.
};

/*! \brief Open a gpio pin.
 *  \param device The gpio to open.
 *  \retval -1 in error case.
 */
int gpio_open(const struct gpio *device);

/*! \brief Close a gpio pin
 *  \param device The gpio to close.
 *  \retval -1 in error case.
 */
int gpio_close(const struct gpio *device);

/*! \brief read from a gpio pin
 *  \param device The gpio to read from
 *  \return Read out value.
 */
char gpio_read(const struct gpio *device);

/*! \brief write to a gpio pin
 *  \param device The gpio to write to.
 *  \param byte The value to write.
 */
void gpio_write(const struct gpio *device, char byte);

//! \brief toggle a gpio pin
//! \param device the gpio to toggle.
void gpio_toggle(const struct gpio *device);

//! \brief set the callback for a gpio pin external interrupt
//! \param device The gpio to set a callback for.
//! \param callback The function pointer to be called back.
//! \param param The parameter for the call back.
int gpio_set_exti_callback(const struct gpio *device, const void *callback,
		const void *param);

#endif /* GPIO_H_ */