初始提交

This commit is contained in:
2024-09-28 14:24:04 +08:00
commit c756587541
5564 changed files with 2413077 additions and 0 deletions

422
driver/extern/htm/src/iot_htm_ext.c vendored Normal file
View File

@@ -0,0 +1,422 @@
/****************************************************************************
*
* Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
*
* This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
* be copied by any method or incorporated into another program without
* the express written consent of Aerospace C.Power. This Information or any portion
* thereof remains the property of Aerospace C.Power. The Information contained herein
* is believed to be accurate and Aerospace C.Power assumes no responsibility or
* liability for its use in any way and conveys no license or title under
* any patent or copyright and makes no representation or warranty that this
* Information is free from patent or copyright infringement.
*
* ****************************************************************************/
/* os_ship header files */
#include "os_utils_api.h"
/* iot common header files */
#include "iot_config_api.h"
#include "iot_utils_api.h"
#include "iot_i2c_api.h"
#include "iot_gpio_api.h"
#include "iot_io_api.h"
#include "iot_errno_api.h"
#include "iot_config.h"
#include "iot_board_api.h"
#if IOT_HTM_EXT_ENABLE
/* humidity and temperature sensor iic config */
#define IOT_HTM_IIC_PHY_ADDR 0x40 /* shift (0x40 << 1) in driver */
#define IOT_HTM_IIC_DEF_PORT 0 /* Port#0 */
#define IOT_HTM_IIC_DEF_SPEED 100 /* 100K */
#define IOT_HTM_IIC_DEF_NACK_NUM 1 /* N-ACK number */
/* humidity and temperature sensor command definition */
#define IOT_HTM_TRIG_TEM_MEASUR_HOLD_CMD 0xE3
#define IOT_HTM_TRIG_HUM_MEASUR_HOLD_CMD 0xE5
#define IOT_HTM_TRIG_TEM_MEASUR_SLAVE_CMD 0xF3
#define IOT_HTM_TRIG_HUM_MEASUR_SLAVE_CMD 0xF5
#define IOT_HTM_WRITE_USER_REG_CMD 0xE6
#define IOT_HTM_READ_USER_REG_CMD 0xE7
#define IOT_HTM_SOFT_RESET_CMD 0xFE
/* delay unit 1ms */
#define IOT_HTM_MEASUR_TEMP_DELAY 50
#define IOT_HTM_MEASUR_HUM_DELAY 20
#define IOT_HTM_WRITE_REG_DELAY 10
#define IOT_HTM_CLEAN_STATUS_BIT 0xfc
static uint32_t iot_htm_ext_write_regs(uint8_t cmd, uint8_t delay)
{
uint8_t reason = 0;
if(ERR_OK != iot_i2c_write(IOT_HTM_IIC_DEF_PORT, IOT_HTM_IIC_PHY_ADDR,
(char *)&cmd, 1)) {
reason = 1;
goto out;
}
os_delay(delay);
out:
if (reason) {
iot_printf("%s drop reason %lu\n", __FUNCTION__, reason);
return ERR_FAIL;
}
return ERR_OK;
}
static uint32_t iot_htm_ext_read_regs(uint8_t *data, uint8_t cnt)
{
uint8_t reason = 0;
if(ERR_OK != iot_i2c_read(IOT_HTM_IIC_DEF_PORT, IOT_HTM_IIC_PHY_ADDR,
(char *)data, cnt)) {
reason = 1;
goto out;
}
os_delay(IOT_HTM_WRITE_REG_DELAY);
out:
if (reason) {
iot_printf("%s drop reason %lu\n", __FUNCTION__, reason);
return ERR_FAIL;
}
return ERR_OK;
}
/* calc temperature value */
static uint32_t iot_htm_ext_calc_temp(uint8_t *data)
{
uint32_t temp;
/* the last two bits are status bit */
data[1] &= IOT_HTM_CLEAN_STATUS_BIT;
/* convert data sequence */
iot_data_reverse(data, 2);
temp = (uint32_t)(data[0] | (data[1] << 8));
temp = (-46.85 + 175.72 * temp / 65536) * 10;
return temp;
}
/* calc humidity value */
static uint32_t iot_htm_ext_calc_hum(uint8_t *data)
{
uint32_t hum;
/* the last two bits are status bit */
data[1] &= IOT_HTM_CLEAN_STATUS_BIT;
/* convert data sequence */
iot_data_reverse(data, 2);
hum = (uint32_t)(data[0] | (data[1] << 8));
hum = (-6 + 125.0 * hum / 65536) * 10;
return hum;
}
uint32_t iot_htm_ext_get_temp(int32_t *temp)
{
uint32_t ret = ERR_OK, reason;
uint8_t value[2];
/* trigger measure temperature */
if (ERR_OK != iot_htm_ext_write_regs(IOT_HTM_TRIG_TEM_MEASUR_SLAVE_CMD,
IOT_HTM_MEASUR_TEMP_DELAY)){
reason = 1;
ret = ERR_FAIL;
goto drop;
}
/* get temperature binary code, occupy 2 bytes */
if (ERR_OK != iot_htm_ext_read_regs(value, sizeof(value))) {
reason = 2;
ret = ERR_FAIL;
goto drop;
}
/* calc temperature value */
*temp = (int32_t)iot_htm_ext_calc_temp(value);
goto out;
drop:
iot_printf("%s drop reason %lu\n", __FUNCTION__, reason);
out:
return ret;
}
uint32_t iot_htm_ext_get_hum(int32_t *hum)
{
uint32_t ret = ERR_OK, reason;
uint8_t value[2];
/* trigger measure humidity */
if (ERR_OK != iot_htm_ext_write_regs(IOT_HTM_TRIG_HUM_MEASUR_SLAVE_CMD,
IOT_HTM_MEASUR_HUM_DELAY)) {
reason = 1;
ret = ERR_FAIL;
goto drop;
}
/* get humidity binary code, occupy 2 bytes */
if (ERR_OK != iot_htm_ext_read_regs(value, sizeof(value))) {
reason = 2;
ret = ERR_FAIL;
goto drop;
}
/* calc humidity value */
*hum = (int32_t)iot_htm_ext_calc_hum(value);
goto out;
drop:
iot_printf("%s drop reason %lu\n", __FUNCTION__, reason);
out:
return ret;
}
uint32_t iot_htm_ext_init(void)
{
/* i2c configuration, i2c has been inited during m41t0 chip init, repeated
* initialization makes sure the iic is inited successfully
*/
iot_i2c_module_cfg_t iic_cfg = { 0 };
iic_cfg.baud = IOT_HTM_IIC_DEF_SPEED;
iic_cfg.gpio.scl = iot_board_get_gpio(GPIO_HTM_I2C_SCL);
iic_cfg.gpio.sda = iot_board_get_gpio(GPIO_HTM_I2C_SDA);
iic_cfg.nack_wait_num = IOT_HTM_IIC_DEF_NACK_NUM;
iic_cfg.port = IOT_HTM_IIC_DEF_PORT;
if ((iic_cfg.gpio.scl == GPIO_NO_VALID) ||
(iic_cfg.gpio.scl == GPIO_NO_VALID)) {
return ERR_FAIL;
}
iot_gpio_open_as_output(iic_cfg.gpio.scl);
iot_gpio_open_as_output(iic_cfg.gpio.sda);
iot_i2c_module_init(&iic_cfg);
iot_printf("%s success\n", __FUNCTION__);
return ERR_OK;
}
void iot_htm_ext_deinit(void)
{
}
#elif IOT_HTM_EXT_CHT8310_ENABLE // end of #if IOT_HTM_EXT_ENABLE
/* humidity and temperature sensor iic config */
#define IOT_HTM_IIC_PHY_ADDR 0x40 /* shift (0x40 << 1) in driver */
#define IOT_HTM_IIC_DEF_PORT 1 /* Port#1 */
#define IOT_HTM_IIC_DEF_SPEED 400 /* 400K */
#define IOT_HTM_IIC_DEF_NACK_NUM 10 /* N-ACK number */
/* humidity and temperature sensor command definition */
#define IOT_HTM_TRIG_TEM_MEASUR_SLAVE_CMD 0x00
#define IOT_HTM_TRIG_HUM_MEASUR_SLAVE_CMD 0x01
#define IOT_HTM_MANUFACTURE_REGISTER 0xFE
#define IOT_HTM_MANUFACTURE_ID 0x5959
/* delay unit 1ms */
#define IOT_HTM_MEASUR_TEMP_DELAY 15
#define IOT_HTM_MEASUR_HUM_DELAY 15
static uint32_t iot_htm_ext_write_regs(uint8_t cmd, uint8_t delay)
{
uint8_t reason = 0;
if(ERR_OK != iot_i2c_write(IOT_HTM_IIC_DEF_PORT, IOT_HTM_IIC_PHY_ADDR,
(char *)&cmd, 1)) {
reason = 1;
goto out;
}
os_delay(delay);
out:
if (reason) {
iot_printf("%s drop reason %lu\n", __FUNCTION__, reason);
return ERR_FAIL;
}
return ERR_OK;
}
static uint32_t iot_htm_ext_read_regs(uint8_t *data, uint8_t cnt)
{
uint8_t reason = 0;
if(ERR_OK != iot_i2c_read(IOT_HTM_IIC_DEF_PORT, IOT_HTM_IIC_PHY_ADDR,
(char *)data, cnt)) {
reason = 1;
goto out;
}
out:
if (reason) {
iot_printf("%s drop reason %lu\n", __FUNCTION__, reason);
return ERR_FAIL;
}
return ERR_OK;
}
/* calc temperature value */
static int32_t iot_htm_ext_calc_temp(uint8_t *data)
{
int32_t temp;
temp = data[0];
if (data[1] >= 0x80) {
temp++;
}
return temp;
}
/* calc humidity value */
static int32_t iot_htm_ext_calc_hum(uint8_t *data)
{
int32_t hum;
/* convert data sequence */
hum = (int32_t)((data[0]<<8) | data[1]);
hum = (100.0 * hum + 16384) / 32768;
return hum;
}
uint32_t iot_htm_ext_get_temp(int32_t *temp)
{
uint32_t ret = ERR_OK, reason;
uint8_t value[2];
/* trigger measure temperature */
if (ERR_OK != iot_htm_ext_write_regs(IOT_HTM_TRIG_TEM_MEASUR_SLAVE_CMD,
IOT_HTM_MEASUR_TEMP_DELAY)){
reason = 1;
ret = ERR_FAIL;
goto drop;
}
/* get temperature binary code, occupy 2 bytes */
if (ERR_OK != iot_htm_ext_read_regs(value, sizeof(value))) {
reason = 2;
ret = ERR_FAIL;
goto drop;
}
iot_printf("temperature raw value = 0x%02X 0x%02X\n", value[0], value[1]);
/* calc temperature value */
*temp = (int32_t)iot_htm_ext_calc_temp(value);
goto out;
drop:
iot_printf("%s drop reason %lu\n", __FUNCTION__, reason);
out:
return ret;
}
uint32_t iot_htm_ext_get_hum(int32_t *hum)
{
uint32_t ret = ERR_OK, reason;
uint8_t value[2];
/* trigger measure humidity */
if (ERR_OK != iot_htm_ext_write_regs(IOT_HTM_TRIG_HUM_MEASUR_SLAVE_CMD,
IOT_HTM_MEASUR_HUM_DELAY)) {
reason = 1;
ret = ERR_FAIL;
goto drop;
}
/* get humidity binary code, occupy 2 bytes */
if (ERR_OK != iot_htm_ext_read_regs(value, sizeof(value))) {
reason = 2;
ret = ERR_FAIL;
goto drop;
}
/* calc humidity value */
iot_printf("humidity raw value = 0x%02X 0x%02X\n", value[0], value[1]);
if (value[0] & 0x80) {
*hum = 100;
} else {
*hum = (int32_t)iot_htm_ext_calc_hum(value);
}
goto out;
drop:
iot_printf("%s drop reason %lu\n", __FUNCTION__, reason);
out:
return ret;
}
uint32_t iot_htm_ext_get_manufacture_id(uint16_t *p_id)
{
uint32_t ret = ERR_OK, reason;
uint8_t value[2];
if (ERR_OK != iot_htm_ext_write_regs(IOT_HTM_MANUFACTURE_REGISTER, 0)) {
reason = 1;
ret = ERR_FAIL;
goto drop;
}
/* get humidity binary code, occupy 2 bytes */
if (ERR_OK != iot_htm_ext_read_regs(value, sizeof(value))) {
reason = 2;
ret = ERR_FAIL;
goto drop;
}
/* calc humidity value */
*p_id = (value[0] << 8) | value[1];
iot_printf("manufacture id:0x%02X%02X\n", value[0], value[1]);
goto out;
drop:
iot_printf("%s drop reason %lu\n", __FUNCTION__, reason);
out:
return ret;
}
uint32_t iot_htm_ext_init(void)
{
iot_i2c_module_cfg_t iic_cfg = { 0 };
uint16_t manufacture_id = 0;
iic_cfg.baud = IOT_HTM_IIC_DEF_SPEED;
iic_cfg.gpio.scl = iot_board_get_gpio(GPIO_HTM_I2C_SCL);
iic_cfg.gpio.sda = iot_board_get_gpio(GPIO_HTM_I2C_SDA);
iic_cfg.nack_wait_num = IOT_HTM_IIC_DEF_NACK_NUM;
iic_cfg.port = IOT_HTM_IIC_DEF_PORT;
if ((iic_cfg.gpio.scl == GPIO_NO_VALID) ||
(iic_cfg.gpio.scl == GPIO_NO_VALID)) {
return ERR_FAIL;
}
iot_gpio_open_as_output(iic_cfg.gpio.scl);
iot_gpio_open_as_output(iic_cfg.gpio.sda);
if (ERR_OK != iot_i2c_module_init(&iic_cfg)) {
iot_printf("%s failed, i2c can not open!\n", __FUNCTION__);
return ERR_FAIL;
}
if ((ERR_OK != iot_htm_ext_get_manufacture_id(&manufacture_id)) ||
(IOT_HTM_MANUFACTURE_ID != manufacture_id)) {
iot_printf("%s failed, check manufacture id fail!\n", __FUNCTION__);
return ERR_FAIL;
}
iot_printf("%s success\n", __FUNCTION__);
return ERR_OK;
}
void iot_htm_ext_deinit(void)
{
}
#else // end of #elif IOT_HTM_EXT_CHT8310_ENABLE
uint32_t iot_htm_ext_get_temp(int32_t *temp)
{
(void)temp;
return ERR_NOSUPP;
}
uint32_t iot_htm_ext_get_hum(int32_t *hum)
{
(void)hum;
return ERR_NOSUPP;
}
uint32_t iot_htm_ext_init(void)
{
return ERR_NOSUPP;
}
void iot_htm_ext_deinit(void)
{
}
#endif