// // Utilities for parsing pins from settings to LL and resources // // Created by MightyPork on 2017/12/08. // #ifndef GEX_PIN_UTILS_H #define GEX_PIN_UTILS_H #include "platform.h" #include "resources.h" /** * Convert pin number to LL driver bitfield for working with the pin. * * @param pin_number - number 0..15 * @param suc - set to false on failure, left unchanged on success. * @return LL_GPIO_PIN_x */ uint32_t pin2ll(uint8_t pin_number, bool *suc); /** * Convert pin name and number to a resource enum * * @param port_name - char 'A'..'Z' * @param pin_number - number 0..15 * @param suc - set to false on failure, left unchanged on success * @return the resource, or R_NONE */ Resource pin2resource(char port_name, uint8_t pin_number, bool *suc); /** * Convert port name to peripheral instance * * @param port_name - char 'A'..'Z' * @param suc - set to false on failure, left unchanged on success. * @return instance */ GPIO_TypeDef *port2periph(char port_name, bool *suc); /** Parse a pin name PA0 or A0 to port name and pin number */ bool parse_pin(const char *str, char *targetName, uint8_t *targetNumber); /** Parse a port name */ bool parse_port(const char *value, char *targetName); /** Parse a list of pin numbers with ranges and commans/semicolons to a bitmask */ uint16_t parse_pinmask(const char *value, bool *suc); /** Convert a pin bitmask to the ASCII format understood by str_parse_pinmask() */ char * str_pinmask(uint16_t pins, char *buffer); /** * Spread packed port pins using a mask * * @param packed - packed bits, right-aligned (eg. 0b1111) * @param mask - positions of the bits (eg. 0x8803) * @return - bits spread to their positions (always counting from right) */ uint16_t port_spread(uint16_t packed, uint16_t mask); /** * Pack spread port pins using a mask * * @param spread - bits in a port register (eg. 0xFF02) * @param mask - mask of the bits we want to pack (eg. 0x8803) * @return - packed bits, right aligned (eg. 0b1110) */ uint16_t port_pack(uint16_t spread, uint16_t mask); /** * Set all GPIO resources held by unit to analog * * @param unit - holding unit */ void deinit_unit_pins(Unit *unit); error_t configure_gpio_alternate(char port_name, uint8_t pin_num, uint32_t af); error_t configure_sparse_pins(char port_name, uint16_t mask, GPIO_TypeDef **port_dest, uint32_t mode, uint32_t otype); #endif //GEX_PIN_UTILS_H