|
/**
|
* @file drv_pin.c
|
* @author your name (you@domain.com)
|
* @brief
|
* @version 0.1
|
* @date 2023-04-05
|
*
|
* @copyright Copyright (c) 2023
|
*
|
*/
|
#include <string.h>
|
#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 -------------------------------- */
|