/** * @file drv_pin.c * @author your name (you@domain.com) * @brief * @version 0.1 * @date 2023-04-05 * * @copyright Copyright (c) 2023 * */ #include #include "ems_pin.h" #include "ems_assert.h" #include "ems_def.h" #include "ems_export.h" #include "stm32l4xx_hal.h" #ifdef __cplusplus extern "C" { #endif EMS_TAG("Driver_PIN") /* public typedef ----------------------------------------------------------- */ typedef struct ems_pin_data { ems_pin_t *device; const char *name; GPIO_TypeDef *gpio_x; uint16_t pin; GPIO_PinState Init_level; } ems_pin_data_t; /* private function prototype ----------------------------------------------- */ static void _init(ems_pin_t *const me); static void _set_mode(ems_pin_t *const me, uint8_t mode); static bool _get_status(ems_pin_t *const me); static void _set_status(ems_pin_t *const me, bool status); /* private variables -------------------------------------------------------- */ static ems_pin_t ems_l_pin[14] = {0}; static const ems_pin_ops_t pin_driver_ops = { .init = _init, .set_mode = _set_mode, .get_status = _get_status, .set_status = _set_status, }; const static ems_pin_data_t ems_pin_driver_data[] = { {&ems_l_pin[0], "CAN_DET", GPIOC, GPIO_PIN_15, GPIO_PIN_RESET}, {&ems_l_pin[1], "EXT_END", GPIOA, GPIO_PIN_0, GPIO_PIN_RESET}, {&ems_l_pin[2], "RET_END", GPIOA, GPIO_PIN_1, GPIO_PIN_RESET}, {&ems_l_pin[3], "SENSOR_EN", GPIOA, GPIO_PIN_4, GPIO_PIN_RESET}, {&ems_l_pin[4], "ALARM", GPIOA, GPIO_PIN_5, GPIO_PIN_RESET}, {&ems_l_pin[5], "INCSIMA", GPIOA, GPIO_PIN_6, GPIO_PIN_RESET}, {&ems_l_pin[6], "INCSIMB", GPIOA, GPIO_PIN_7, GPIO_PIN_RESET}, {&ems_l_pin[7], "POWER_MCU2", GPIOB, GPIO_PIN_2, GPIO_PIN_RESET}, {&ems_l_pin[8], "EXT_IN", GPIOB, GPIO_PIN_10, GPIO_PIN_RESET}, {&ems_l_pin[9], "RET_IN", GPIOB, GPIO_PIN_11, GPIO_PIN_RESET}, {&ems_l_pin[10], "CAN_STB", GPIOB, GPIO_PIN_12, GPIO_PIN_RESET}, {&ems_l_pin[11], "DRV_L_EN", GPIOB, GPIO_PIN_3, GPIO_PIN_RESET}, {&ems_l_pin[12], "DIAG_M1", GPIOB, GPIO_PIN_4, GPIO_PIN_RESET}, {&ems_l_pin[13], "DIAG_M2", GPIOB, GPIO_PIN_5, GPIO_PIN_RESET}, }; #define PIN_NUM (sizeof(ems_pin_driver_data) / sizeof(ems_pin_data_t)) /* public functions --------------------------------------------------------- */ static void ems_pin_dirver_init(void) { for (uint32_t i = 0; i < PIN_NUM; i++) { /* Enable the clock. */ if (ems_pin_driver_data[i].gpio_x == GPIOA) { __HAL_RCC_GPIOA_CLK_ENABLE(); } else if (ems_pin_driver_data[i].gpio_x == GPIOB) { __HAL_RCC_GPIOB_CLK_ENABLE(); } else if (ems_pin_driver_data[i].gpio_x == GPIOC) { __HAL_RCC_GPIOC_CLK_ENABLE(); } else { ; } /* Device registering. */ ems_pin_register(ems_pin_driver_data[i].device, ems_pin_driver_data[i].name, &pin_driver_ops, &ems_pin_driver_data[i]); } } INIT_IO_DRIVER_EXPORT(ems_pin_dirver_init); /* private functions -------------------------------------------------------- */ /** * @brief The PIN driver initialization function. * @param me PIN device handle. * @retval None. */ static void _init(ems_pin_t *const me) { ems_pin_data_t *driver_data = (ems_pin_data_t *)me->super.attr.user_data; /* Configure GPIO pin. */ GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = driver_data->pin; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(driver_data->gpio_x, &GPIO_InitStruct); HAL_GPIO_WritePin(driver_data->gpio_x, driver_data->pin, GPIO_PIN_RESET); } /** * @brief The PIN driver set_mode function. * @param me PIN device handle. * @retval None. */ static void _set_mode(ems_pin_t *const me, uint8_t mode) { ems_assert(me != NULL); ems_assert(mode < PIN_MODE_MAX); ems_pin_data_t *driver_data = (ems_pin_data_t *)me->super.attr.user_data; /* Configure GPIO pin. */ GPIO_InitTypeDef GPIO_InitStruct = {0}; if (mode == PIN_MODE_INPUT) { GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; } else if (mode == PIN_MODE_INPUT_PULLUP) { GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; } else if (mode == PIN_MODE_INPUT_PULLDOWN) { GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; } else if (mode == PIN_MODE_OUTPUT_PP) { GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; } else if (mode == PIN_MODE_OUTPUT_OD) { GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; } GPIO_InitStruct.Pin = driver_data->pin; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(driver_data->gpio_x, &GPIO_InitStruct); } /** * @brief The PIN driver set_mode function. * @param me PIN device handle. * @retval GPIO status. */ static bool _get_status(ems_pin_t *const me) { ems_assert(me != NULL); ems_assert(mode < PIN_MODE_MAX); ems_pin_data_t *driver_data = (ems_pin_data_t *)me->super.attr.user_data; GPIO_PinState status = HAL_GPIO_ReadPin(driver_data->gpio_x, driver_data->pin); return (status == GPIO_PIN_SET) ? true : false; } /** * @brief The PIN driver set_status function. * @param me PIN device handle. * @param status GPIO status. * @retval None. */ static void _set_status(ems_pin_t *const me, bool status) { ems_assert(me != NULL); ems_assert(mode < PIN_MODE_MAX); ems_pin_data_t *driver_data = (ems_pin_data_t *)me->super.attr.user_data; HAL_GPIO_WritePin(driver_data->gpio_x, driver_data->pin, status ? GPIO_PIN_SET : GPIO_PIN_RESET); } #ifdef __cplusplus } #endif /* ----------------------------- end of file -------------------------------- */