Added func for simple periph clock toggling without the horrible if jungle
This commit is contained in:
@@ -57,7 +57,7 @@ static error_t DI_loadIni(Unit *unit, const char *key, const char *value)
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
if (streq(key, "port")) {
|
||||
suc = parse_port(value, &priv->port_name);
|
||||
suc = parse_port_name(value, &priv->port_name);
|
||||
}
|
||||
else if (streq(key, "pins")) {
|
||||
priv->pins = parse_pinmask(value, &suc);
|
||||
@@ -85,13 +85,13 @@ static void DI_writeIni(Unit *unit, IniWriter *iw)
|
||||
iw_entry(iw, "port", "%c", priv->port_name);
|
||||
|
||||
iw_comment(iw, "Pins (comma separated, supports ranges)");
|
||||
iw_entry(iw, "pins", "%s", str_pinmask(priv->pins, unit_tmp512));
|
||||
iw_entry(iw, "pins", "%s", pinmask2str(priv->pins, unit_tmp512));
|
||||
|
||||
iw_comment(iw, "Pins with pull-up");
|
||||
iw_entry(iw, "pull-up", "%s", str_pinmask(priv->pullup, unit_tmp512));
|
||||
iw_entry(iw, "pull-up", "%s", pinmask2str(priv->pullup, unit_tmp512));
|
||||
|
||||
iw_comment(iw, "Pins with pull-down");
|
||||
iw_entry(iw, "pull-down", "%s", str_pinmask(priv->pulldown, unit_tmp512));
|
||||
iw_entry(iw, "pull-down", "%s", pinmask2str(priv->pulldown, unit_tmp512));
|
||||
|
||||
#if PLAT_NO_FLOATING_INPUTS
|
||||
iw_comment(iw, "NOTE: Pins use pull-up by default.\r\n");
|
||||
@@ -125,7 +125,7 @@ static error_t DI_init(Unit *unit)
|
||||
priv->pullup &= priv->pins;
|
||||
|
||||
// --- Parse config ---
|
||||
priv->port = port2periph(priv->port_name, &suc);
|
||||
priv->port = hw_port2periph(priv->port_name, &suc);
|
||||
if (!suc) return E_BAD_CONFIG;
|
||||
|
||||
// Claim all needed pins
|
||||
@@ -134,7 +134,7 @@ static error_t DI_init(Unit *unit)
|
||||
uint16_t mask = 1;
|
||||
for (int i = 0; i < 16; i++, mask <<= 1) {
|
||||
if (priv->pins & mask) {
|
||||
uint32_t ll_pin = pin2ll((uint8_t) i, &suc);
|
||||
uint32_t ll_pin = hw_pin2ll((uint8_t) i, &suc);
|
||||
|
||||
// --- Init hardware ---
|
||||
LL_GPIO_SetPinMode(priv->port, ll_pin, LL_GPIO_MODE_INPUT);
|
||||
@@ -176,7 +176,7 @@ error_t UU_DI_Read(Unit *unit, uint16_t *packed)
|
||||
{
|
||||
CHECK_TYPE(unit, &UNIT_DIN);
|
||||
struct priv *priv = unit->data;
|
||||
*packed = port_pack((uint16_t) priv->port->IDR, priv->pins);
|
||||
*packed = pinmask_pack((uint16_t) priv->port->IDR, priv->pins);
|
||||
return E_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ static error_t DO_loadIni(Unit *unit, const char *key, const char *value)
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
if (streq(key, "port")) {
|
||||
suc = parse_port(value, &priv->port_name);
|
||||
suc = parse_port_name(value, &priv->port_name);
|
||||
}
|
||||
else if (streq(key, "pins")) {
|
||||
priv->pins = parse_pinmask(value, &suc);
|
||||
@@ -82,13 +82,13 @@ static void DO_writeIni(Unit *unit, IniWriter *iw)
|
||||
iw_entry(iw, "port", "%c", priv->port_name);
|
||||
|
||||
iw_comment(iw, "Pins (comma separated, supports ranges)");
|
||||
iw_entry(iw, "pins", "%s", str_pinmask(priv->pins, unit_tmp512));
|
||||
iw_entry(iw, "pins", "%s", pinmask2str(priv->pins, unit_tmp512));
|
||||
|
||||
iw_comment(iw, "Initially high pins");
|
||||
iw_entry(iw, "initial", "%s", str_pinmask(priv->initial, unit_tmp512));
|
||||
iw_entry(iw, "initial", "%s", pinmask2str(priv->initial, unit_tmp512));
|
||||
|
||||
iw_comment(iw, "Open-drain pins");
|
||||
iw_entry(iw, "open-drain", "%s", str_pinmask(priv->open_drain, unit_tmp512));
|
||||
iw_entry(iw, "open-drain", "%s", pinmask2str(priv->open_drain, unit_tmp512));
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
@@ -118,7 +118,7 @@ static error_t DO_init(Unit *unit)
|
||||
priv->open_drain &= priv->pins;
|
||||
|
||||
// --- Parse config ---
|
||||
priv->port = port2periph(priv->port_name, &suc);
|
||||
priv->port = hw_port2periph(priv->port_name, &suc);
|
||||
if (!suc) return E_BAD_CONFIG;
|
||||
|
||||
// Claim all needed pins
|
||||
@@ -126,7 +126,7 @@ static error_t DO_init(Unit *unit)
|
||||
|
||||
for (int i = 0; i < 16; i++) {
|
||||
if (priv->pins & (1 << i)) {
|
||||
uint32_t ll_pin = pin2ll((uint8_t) i, &suc);
|
||||
uint32_t ll_pin = hw_pin2ll((uint8_t) i, &suc);
|
||||
|
||||
// --- Init hardware ---
|
||||
LL_GPIO_SetPinMode(priv->port, ll_pin, LL_GPIO_MODE_OUTPUT);
|
||||
@@ -163,7 +163,7 @@ error_t UU_DO_Write(Unit *unit, uint16_t packed)
|
||||
|
||||
struct priv *priv = unit->data;
|
||||
uint16_t mask = priv->pins;
|
||||
uint16_t spread = port_spread(packed, mask);
|
||||
uint16_t spread = pinmask_spread(packed, mask);
|
||||
|
||||
uint16_t set = spread;
|
||||
uint16_t reset = ((~spread) & mask);
|
||||
@@ -177,7 +177,7 @@ error_t UU_DO_Set(Unit *unit, uint16_t packed)
|
||||
|
||||
struct priv *priv = unit->data;
|
||||
uint16_t mask = priv->pins;
|
||||
uint16_t spread = port_spread(packed, mask);
|
||||
uint16_t spread = pinmask_spread(packed, mask);
|
||||
|
||||
priv->port->BSRR = spread;
|
||||
return E_SUCCESS;
|
||||
@@ -189,7 +189,7 @@ error_t UU_DO_Clear(Unit *unit, uint16_t packed)
|
||||
|
||||
struct priv *priv = unit->data;
|
||||
uint16_t mask = priv->pins;
|
||||
uint16_t spread = port_spread(packed, mask);
|
||||
uint16_t spread = pinmask_spread(packed, mask);
|
||||
|
||||
priv->port->BSRR = (spread<<16);
|
||||
return E_SUCCESS;
|
||||
@@ -201,7 +201,7 @@ error_t UU_DO_Toggle(Unit *unit, uint16_t packed)
|
||||
|
||||
struct priv *priv = unit->data;
|
||||
uint16_t mask = priv->pins;
|
||||
uint16_t spread = port_spread(packed, mask);
|
||||
uint16_t spread = pinmask_spread(packed, mask);
|
||||
|
||||
uint16_t flipped = (uint16_t) (~priv->port->ODR) & mask;
|
||||
uint16_t set = flipped & spread;
|
||||
@@ -215,7 +215,7 @@ error_t UU_DO_GetPinCount(Unit *unit, uint8_t *count)
|
||||
CHECK_TYPE(unit, &UNIT_DOUT);
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
uint32_t packed = port_pack(0xFFFF, priv->pins);
|
||||
uint32_t packed = pinmask_pack(0xFFFF, priv->pins);
|
||||
*count = (uint8_t)(32 - __CLZ(packed));
|
||||
return E_SUCCESS;
|
||||
}
|
||||
|
||||
+4
-12
@@ -235,14 +235,10 @@ static error_t UI2C_init(Unit *unit)
|
||||
TRY(rsc_claim_pin(unit, portname, pin_sda));
|
||||
TRY(rsc_claim_pin(unit, portname, pin_scl));
|
||||
|
||||
configure_gpio_alternate(portname, pin_sda, af_i2c);
|
||||
configure_gpio_alternate(portname, pin_scl, af_i2c);
|
||||
hw_configure_gpio_af(portname, pin_sda, af_i2c);
|
||||
hw_configure_gpio_af(portname, pin_scl, af_i2c);
|
||||
|
||||
if (priv->periph_num == 1) {
|
||||
__HAL_RCC_I2C1_CLK_ENABLE();
|
||||
} else {
|
||||
__HAL_RCC_I2C2_CLK_ENABLE();
|
||||
}
|
||||
hw_periph_clock_enable(priv->periph);
|
||||
|
||||
/* Disable the selected I2Cx Peripheral */
|
||||
LL_I2C_Disable(priv->periph);
|
||||
@@ -270,11 +266,7 @@ static void UI2C_deInit(Unit *unit)
|
||||
assert_param(priv->periph);
|
||||
LL_I2C_DeInit(priv->periph);
|
||||
|
||||
if (priv->periph_num == 1) {
|
||||
__HAL_RCC_I2C1_CLK_DISABLE();
|
||||
} else {
|
||||
__HAL_RCC_I2C2_CLK_DISABLE();
|
||||
}
|
||||
hw_periph_clock_disable(priv->periph);
|
||||
}
|
||||
|
||||
// Release all resources
|
||||
|
||||
@@ -97,9 +97,9 @@ static error_t Npx_init(Unit *unit)
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
// --- Parse config ---
|
||||
priv->ll_pin = pin2ll(priv->pin_number, &suc);
|
||||
priv->port = port2periph(priv->port_name, &suc);
|
||||
Resource rsc = pin2resource(priv->port_name, priv->pin_number, &suc);
|
||||
priv->ll_pin = hw_pin2ll(priv->pin_number, &suc);
|
||||
priv->port = hw_port2periph(priv->port_name, &suc);
|
||||
Resource rsc = hw_pin2resource(priv->port_name, priv->pin_number, &suc);
|
||||
if (!suc) return E_BAD_CONFIG;
|
||||
|
||||
// --- Claim resources ---
|
||||
|
||||
+11
-19
@@ -101,7 +101,7 @@ static error_t USPI_loadIni(Unit *unit, const char *key, const char *value)
|
||||
priv->lsb_first = (bool)str_parse_2(value, "MSB", 0, "LSB", 1, &suc);
|
||||
}
|
||||
else if (streq(key, "port")) {
|
||||
suc = parse_port(value, &priv->ssn_port_name);
|
||||
suc = parse_port_name(value, &priv->ssn_port_name);
|
||||
}
|
||||
else if (streq(key, "pins")) {
|
||||
priv->ssn_pins = parse_pinmask(value, &suc);
|
||||
@@ -161,7 +161,7 @@ static void USPI_writeIni(Unit *unit, IniWriter *iw)
|
||||
iw_entry(iw, "port", "%c", priv->ssn_port_name);
|
||||
|
||||
iw_comment(iw, "SS pins (comma separated, supports ranges)");
|
||||
iw_entry(iw, "pins", "%s", str_pinmask(priv->ssn_pins, unit_tmp512));
|
||||
iw_entry(iw, "pins", "%s", pinmask2str(priv->ssn_pins, unit_tmp512));
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
@@ -291,25 +291,21 @@ static error_t USPI_init(Unit *unit)
|
||||
TRY(rsc_claim_pin(unit, spi_portname, pin_miso));
|
||||
TRY(rsc_claim_pin(unit, spi_portname, pin_sck));
|
||||
|
||||
configure_gpio_alternate(spi_portname, pin_mosi, af_spi);
|
||||
configure_gpio_alternate(spi_portname, pin_miso, af_spi);
|
||||
configure_gpio_alternate(spi_portname, pin_sck, af_spi);
|
||||
hw_configure_gpio_af(spi_portname, pin_mosi, af_spi);
|
||||
hw_configure_gpio_af(spi_portname, pin_miso, af_spi);
|
||||
hw_configure_gpio_af(spi_portname, pin_sck, af_spi);
|
||||
|
||||
// configure SSN GPIOs
|
||||
{
|
||||
// Claim all needed pins
|
||||
TRY(rsc_claim_gpios(unit, priv->ssn_port_name, priv->ssn_pins));
|
||||
TRY(configure_sparse_pins(priv->ssn_port_name, priv->ssn_pins, &priv->ssn_port,
|
||||
LL_GPIO_MODE_OUTPUT, LL_GPIO_OUTPUT_PUSHPULL));
|
||||
TRY(hw_configure_sparse_pins(priv->ssn_port_name, priv->ssn_pins, &priv->ssn_port,
|
||||
LL_GPIO_MODE_OUTPUT, LL_GPIO_OUTPUT_PUSHPULL));
|
||||
// Set the initial state - all high
|
||||
priv->ssn_port->BSRR = priv->ssn_pins;
|
||||
}
|
||||
|
||||
if (priv->periph_num == 1) {
|
||||
__HAL_RCC_SPI1_CLK_ENABLE();
|
||||
} else {
|
||||
__HAL_RCC_SPI2_CLK_ENABLE();
|
||||
}
|
||||
hw_periph_clock_enable(priv->periph);
|
||||
|
||||
// Configure SPI - must be configured under reset
|
||||
LL_SPI_Disable(priv->periph);
|
||||
@@ -347,11 +343,7 @@ static void USPI_deInit(Unit *unit)
|
||||
assert_param(priv->periph);
|
||||
LL_SPI_DeInit(priv->periph);
|
||||
|
||||
if (priv->periph_num == 1) {
|
||||
__HAL_RCC_SPI1_CLK_DISABLE();
|
||||
} else {
|
||||
__HAL_RCC_SPI2_CLK_DISABLE();
|
||||
}
|
||||
hw_periph_clock_disable(priv->periph);
|
||||
}
|
||||
|
||||
// Release all resources
|
||||
@@ -430,7 +422,7 @@ error_t UU_SPI_Multicast(Unit *unit, uint16_t slaves,
|
||||
const uint8_t *request, uint32_t req_len)
|
||||
{
|
||||
struct priv *priv= unit->data;
|
||||
uint16_t mask = port_spread(slaves, priv->ssn_pins);
|
||||
uint16_t mask = pinmask_spread(slaves, priv->ssn_pins);
|
||||
priv->ssn_port->BRR = mask;
|
||||
{
|
||||
TRY(xfer_do(priv, request, NULL, req_len, 0, 0));
|
||||
@@ -446,7 +438,7 @@ error_t UU_SPI_Write(Unit *unit, uint8_t slave_num,
|
||||
{
|
||||
struct priv *priv= unit->data;
|
||||
|
||||
uint16_t mask = port_spread((uint16_t) (1 << slave_num), priv->ssn_pins);
|
||||
uint16_t mask = pinmask_spread((uint16_t) (1 << slave_num), priv->ssn_pins);
|
||||
priv->ssn_port->BRR = mask;
|
||||
{
|
||||
TRY(xfer_do(priv, request, response, req_len, resp_len, resp_skip));
|
||||
|
||||
@@ -459,7 +459,7 @@ static error_t UUSART_ConfigurePins(Unit *unit)
|
||||
if (pins_wanted[i]) {
|
||||
if (mappings[i].port == 0) return E_BAD_CONFIG;
|
||||
TRY(rsc_claim_pin(unit, mappings[i].port, mappings[i].pin));
|
||||
configure_gpio_alternate(mappings[i].port, mappings[i].pin, mappings[i].af);
|
||||
hw_configure_gpio_af(mappings[i].port, mappings[i].pin, mappings[i].af);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -488,25 +488,7 @@ static error_t UUSART_init(Unit *unit)
|
||||
// --- Configure the peripheral ---
|
||||
|
||||
// Enable clock for the peripheral used
|
||||
if (priv->periph_num == 1) {
|
||||
__HAL_RCC_USART1_CLK_ENABLE();
|
||||
}
|
||||
else if (priv->periph_num == 2) {
|
||||
__HAL_RCC_USART2_CLK_ENABLE();
|
||||
}
|
||||
else if (priv->periph_num == 3) {
|
||||
__HAL_RCC_USART3_CLK_ENABLE();
|
||||
}
|
||||
#ifdef USART4
|
||||
else if (priv->periph_num == 4) {
|
||||
__HAL_RCC_USART4_CLK_ENABLE();
|
||||
}
|
||||
#endif
|
||||
#ifdef USART5
|
||||
else if (priv->periph_num == 5) {
|
||||
__HAL_RCC_USART5_CLK_ENABLE();
|
||||
}
|
||||
#endif
|
||||
hw_periph_clock_enable(priv->periph);
|
||||
|
||||
LL_USART_Disable(priv->periph);
|
||||
{
|
||||
@@ -592,25 +574,7 @@ static void UUSART_deInit(Unit *unit)
|
||||
LL_USART_DeInit(priv->periph);
|
||||
|
||||
// Disable clock
|
||||
if (priv->periph_num == 1) {
|
||||
__HAL_RCC_USART1_CLK_DISABLE();
|
||||
}
|
||||
else if (priv->periph_num == 2) {
|
||||
__HAL_RCC_USART2_CLK_DISABLE();
|
||||
}
|
||||
else if (priv->periph_num == 3) {
|
||||
__HAL_RCC_USART3_CLK_DISABLE();
|
||||
}
|
||||
#ifdef USART4
|
||||
else if (priv->periph_num == 4) {
|
||||
__HAL_RCC_USART4_CLK_DISABLE();
|
||||
}
|
||||
#endif
|
||||
#ifdef USART5
|
||||
else if (priv->periph_num == 5) {
|
||||
__HAL_RCC_USART5_CLK_DISABLE();
|
||||
}
|
||||
#endif
|
||||
hw_periph_clock_disable(priv->periph);
|
||||
}
|
||||
|
||||
// Release all resources
|
||||
|
||||
Reference in New Issue
Block a user