Add gpio_get_out_level() accessor, and correct SIO GPIO_OUT struct ty… (#247)

* Add gpio_get_out_level() accessor, and correct SIO GPIO_OUT struct type from WO to RW

* Clean up ambiguous-looking parentheses
This commit is contained in:
Luke Wren 2021-03-22 17:54:33 +00:00 committed by GitHub
parent cdf1a956eb
commit 98574564b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 2 deletions

View File

@ -17,7 +17,7 @@ typedef struct {
io_ro_32 gpio_hi_in;
uint32_t _pad;
io_wo_32 gpio_out;
io_rw_32 gpio_out;
io_wo_32 gpio_set;
io_wo_32 gpio_clr;
io_wo_32 gpio_togl;
@ -27,7 +27,7 @@ typedef struct {
io_wo_32 gpio_oe_clr;
io_wo_32 gpio_oe_togl;
io_wo_32 gpio_hi_out;
io_rw_32 gpio_hi_out;
io_wo_32 gpio_hi_set;
io_wo_32 gpio_hi_clr;
io_wo_32 gpio_hi_togl;

View File

@ -415,6 +415,26 @@ static inline void gpio_put(uint gpio, bool value) {
gpio_clr_mask(mask);
}
/*! \brief Determine whether a GPIO is currently driven high or low
* \ingroup hardware_gpio
*
* This function returns the high/low output level most recently assigned to a
* GPIO via gpio_put() or similar. This is the value that is presented outward
* to the IO muxing, *not* the input level back from the pad (which can be
* read using gpio_get()).
*
* To avoid races, this function must not be used for read-modify-write
* sequences when driving GPIOs -- instead functions like gpio_put() should be
* used to atomically update GPIOs. This accessor is intended for debug use
* only.
*
* \param gpio GPIO number
* \return true if the GPIO output level is high, false if low.
*/
static inline bool gpio_get_out_level(uint gpio) {
return !!(sio_hw->gpio_out & (1u << gpio));
}
// ----------------------------------------------------------------------------
// Direction
// ----------------------------------------------------------------------------