156 lines
4.5 KiB
C
156 lines
4.5 KiB
C
/*----------------------------------------------------------------------------
|
|
* Copyright (c) TJD Technologies Co., Ltd. 2020. All rights reserved.
|
|
*
|
|
* Description: hr_port.c
|
|
*
|
|
* Author: liangjianfei
|
|
*
|
|
* Create: 2024-4-26
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#include "common_i2c.h"
|
|
#include "gpio.h"
|
|
#include "hr_port.h"
|
|
#include "sys_config.h"
|
|
#include "common_pm.h"
|
|
#include "tcxo.h"
|
|
#include "cmsis_os.h"
|
|
#include "pinctrl.h"
|
|
|
|
#define I2C_REPEAT_TIME 3
|
|
|
|
#define ENABLE_PRINT_INFO 1
|
|
#if ENABLE_PRINT_INFO
|
|
#define static_print_info(...) sys_hr_log_i(__VA_ARGS__) //一般信息打印宏控制
|
|
#define static_print_warn(...) sys_hr_log_w(__VA_ARGS__) //警告信息打印一般常开
|
|
#define static_print_error(...) sys_hr_log_e(__VA_ARGS__) //错误信息打印一般常开
|
|
#else
|
|
#define static_print_info(...)
|
|
#define static_print_warn(...)
|
|
#define static_print_error(...)
|
|
#endif
|
|
|
|
#ifdef TJD_PCBA_0
|
|
static i2c_bus_t hrsensor_bus = I2C_BUS_0;
|
|
static uint32_t hrsensor_baudrate = 100000;
|
|
static uint8_t hrsensor_hscode = 0;
|
|
static uint8_t hrsensor_addr = 0x44;
|
|
#elif defined(TJD_PCBA_1)
|
|
#define HR3695_I2C_ADDR 0x44
|
|
static i2c_bus_t hrsensor_bus = I2C_BUS_2;
|
|
static uint32_t hrsensor_baudrate = 400000;
|
|
static uint8_t hrsensor_addr = HR3695_I2C_ADDR;
|
|
#else
|
|
static i2c_bus_t hrsensor_bus = I2C_BUS_0;
|
|
static uint32_t hrsensor_baudrate = 100000;
|
|
static uint8_t hrsensor_hscode = 0;
|
|
static uint8_t hrsensor_addr = 0x44;
|
|
#endif
|
|
|
|
|
|
|
|
errcode_t hrsensor_iic_init(void)
|
|
{
|
|
errcode_t ret;
|
|
ret = tjd_driver_common_i2c_get_ops()->open(I2C_MODEL_HRSENSOR_ID, hrsensor_bus, hrsensor_addr, hrsensor_baudrate);
|
|
if (ret != ERRCODE_SUCC && ret != ERRCODE_I2C_ALREADY_INIT) {
|
|
static_print_error("hrsensor_iic_init fail. ret:%x", ret);
|
|
return ret;
|
|
} else {
|
|
static_print_info("hrsensor_iic_init succ. ret:%x", ret);
|
|
}
|
|
|
|
struct power_manager_class_ops *pm_api = tjd_driver_common_pm_get_ops();
|
|
pm_api->set_model_power_status(POWER_MODEL_HRSENSOR_ID, PM_POWER_STATUS_ON);
|
|
|
|
// ret = uapi_gpio_set_dir(S_AGPIO_R2, GPIO_DIRECTION_OUTPUT);
|
|
// if (ret != 0) {
|
|
// static_print_error("uapi_gpio_set_dir FAIL");
|
|
// }
|
|
// ret = uapi_gpio_set_val(S_AGPIO_R2, GPIO_LEVEL_LOW);
|
|
// if (ret != 0) {
|
|
// static_print_error("uapi_gpio_set_val FAIL");
|
|
// }
|
|
|
|
osDelay(30);
|
|
return ret;
|
|
}
|
|
|
|
errcode_t hrsensor_iic_deinit(void)
|
|
{
|
|
errcode_t ret;
|
|
ret = tjd_driver_common_i2c_get_ops()->close(I2C_MODEL_HRSENSOR_ID);
|
|
if (ret != ERRCODE_SUCC) {
|
|
static_print_error("hrsensor_iic_deinit fail. ret:%x", ret);
|
|
return ret;
|
|
} else {
|
|
static_print_info("hrsensor_iic_deinit succ.");
|
|
}
|
|
|
|
struct power_manager_class_ops *pm_api = tjd_driver_common_pm_get_ops();
|
|
pm_api->set_model_power_status(POWER_MODEL_HRSENSOR_ID, PM_POWER_STATUS_OFF);
|
|
osDelay(30);
|
|
|
|
return ret;
|
|
}
|
|
|
|
errcode_t hrsensor_iic_write_reg(uint8_t addr, uint8_t data)
|
|
{
|
|
errcode_t ret;
|
|
uint32_t retry;
|
|
i2c_data_t i2c_data = {0};
|
|
uint8_t sendbuf[] = {addr, data};
|
|
i2c_data.send_buf = sendbuf;
|
|
i2c_data.send_len = 2;
|
|
|
|
for (retry = 0; retry < I2C_REPEAT_TIME; retry++) {
|
|
ret = tjd_driver_common_i2c_get_ops()->write(I2C_MODEL_HRSENSOR_ID, &i2c_data);
|
|
if (ret == ERRCODE_SUCC) {
|
|
break;
|
|
}
|
|
}
|
|
if(ret != ERRCODE_SUCC){
|
|
static_print_info("hrsensor_write_reg fail:%x ", ret);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
errcode_t hrsensor_iic_read_reg(uint8_t addr, uint8_t *recvbuf, uint8_t length)
|
|
{
|
|
errcode_t ret;
|
|
uint32_t retry;
|
|
i2c_data_t i2c_data = {0};
|
|
uint8_t sendbuf[] = {addr};
|
|
i2c_data.receive_buf = recvbuf;
|
|
i2c_data.send_buf = sendbuf;
|
|
i2c_data.receive_len = length;
|
|
i2c_data.send_len = 1;
|
|
|
|
for (retry = 0; retry < I2C_REPEAT_TIME; retry++) {
|
|
ret = tjd_driver_common_i2c_get_ops()->writeread(I2C_MODEL_HRSENSOR_ID, &i2c_data);
|
|
if (ret == ERRCODE_SUCC) {
|
|
break;
|
|
}
|
|
}
|
|
if(ret != ERRCODE_SUCC){
|
|
static_print_info("hrsensor_read_reg fail:%x ", ret);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void hrsensor_delay_us(uint32_t us)
|
|
{
|
|
uapi_tcxo_delay_us(us);
|
|
}
|
|
|
|
void hrsensor_delay_ms(uint32_t ms)
|
|
{
|
|
if(ms>20){
|
|
osDelay(ms);
|
|
}else{
|
|
uapi_tcxo_delay_ms(ms);
|
|
}
|
|
}
|