fix that i2c device of sensor framework cannot set i2c address

This commit is contained in:
Liu_Weichao 2021-12-10 10:23:30 +08:00
parent c9db5635b0
commit ead80da91f
19 changed files with 239 additions and 18 deletions

View File

@ -27,9 +27,14 @@
*/ */
void HumiHs300x(void) void HumiHs300x(void)
{ {
int i = 0;
int32 humidity;
struct SensorQuantity *humi = SensorQuantityFind(SENSOR_QUANTITY_HS300X_HUMIDITY, SENSOR_QUANTITY_HUMI); struct SensorQuantity *humi = SensorQuantityFind(SENSOR_QUANTITY_HS300X_HUMIDITY, SENSOR_QUANTITY_HUMI);
SensorQuantityOpen(humi); SensorQuantityOpen(humi);
int32 humidity = SensorQuantityRead(humi); for (i = 0; i < 100; i ++) {
printf("Humidity : %d.%d %%RH\n", humidity/10, humidity%10); humidity = SensorQuantityRead(humi);
printf("Humidity : %d.%d %%RH\n", humidity/10, humidity%10);
PrivTaskDelay(5000);
}
SensorQuantityClose(humi); SensorQuantityClose(humi);
} }

View File

@ -27,12 +27,20 @@
*/ */
void TempHs300x(void) void TempHs300x(void)
{ {
int i = 0;
int32 temperature;
struct SensorQuantity *temp = SensorQuantityFind(SENSOR_QUANTITY_HS300X_TEMPERATURE, SENSOR_QUANTITY_TEMP); struct SensorQuantity *temp = SensorQuantityFind(SENSOR_QUANTITY_HS300X_TEMPERATURE, SENSOR_QUANTITY_TEMP);
SensorQuantityOpen(temp); SensorQuantityOpen(temp);
int32 temperature = SensorQuantityRead(temp); for (i = 0; i < 100; i ++) {
if (temperature > 0) temperature = SensorQuantityRead(temp);
printf("Temperature : %d.%d ℃\n", temperature/10, temperature%10); if (temperature > 0)
else printf("Temperature : %d.%d ℃\n", temperature/10, temperature%10);
printf("Temperature : %d.%d ℃\n", temperature/10, -temperature%10); else
printf("Temperature : %d.%d ℃\n", temperature/10, -temperature%10);
PrivTaskDelay(5000);
}
SensorQuantityClose(temp); SensorQuantityClose(temp);
} }
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, TempHs300x, TempHs300x, TempHs300x function);

View File

@ -40,6 +40,10 @@ static void Ec200tPowerSet(void)
{ {
int pin_fd; int pin_fd;
pin_fd = PrivOpen(ADAPTER_EC200T_PIN_DRIVER, O_RDWR); pin_fd = PrivOpen(ADAPTER_EC200T_PIN_DRIVER, O_RDWR);
if (pin_fd < 0) {
printf("open %s error\n", ADAPTER_EC200T_PIN_DRIVER);
return;
}
struct PinParam pin_param; struct PinParam pin_param;
pin_param.cmd = GPIO_CONFIG_MODE; pin_param.cmd = GPIO_CONFIG_MODE;

View File

@ -43,6 +43,10 @@ static int SensorDeviceOpen(struct SensorDevice *sdev)
int result = 0; int result = 0;
sdev->fd = PrivOpen(SENSOR_DEVICE_ZG09_DEV, O_RDWR); sdev->fd = PrivOpen(SENSOR_DEVICE_ZG09_DEV, O_RDWR);
if (sdev->fd < 0) {
printf("open %s error\n", SENSOR_DEVICE_ZG09_DEV);
return -1;
}
struct SerialDataCfg cfg; struct SerialDataCfg cfg;
cfg.serial_baud_rate = BAUD_RATE_9600; cfg.serial_baud_rate = BAUD_RATE_9600;

View File

@ -16,6 +16,10 @@ config SENSOR_HS300X
config SENSOR_DEVICE_HS300X_DEV config SENSOR_DEVICE_HS300X_DEV
string "HS300x device name" string "HS300x device name"
default "/dev/i2c1_dev0" default "/dev/i2c1_dev0"
config SENSOR_DEVICE_HS300X_I2C_ADDR
hex "HS300x device i2c address"
default 0x44
endif endif
if ADD_NUTTX_FETURES if ADD_NUTTX_FETURES

View File

@ -32,28 +32,43 @@ static struct SensorProductInfo info =
/** /**
* @description: Open HS300x sensor device * @description: Open HS300x sensor device
* @param sdev - sensor device pointer * @param sdev - sensor device pointer
* @return 1 * @return success : 0 error : -1
*/ */
static int SensorDeviceOpen(struct SensorDevice *sdev) static int SensorDeviceOpen(struct SensorDevice *sdev)
{ {
int result;
uint16_t i2c_dev_addr = SENSOR_DEVICE_HS300X_I2C_ADDR;
sdev->fd = PrivOpen(SENSOR_DEVICE_HS300X_DEV, O_RDWR); sdev->fd = PrivOpen(SENSOR_DEVICE_HS300X_DEV, O_RDWR);
return 0; if (sdev->fd < 0) {
printf("open %s error\n", SENSOR_DEVICE_HS300X_DEV);
return -1;
}
struct PrivIoctlCfg ioctl_cfg;
ioctl_cfg.ioctl_driver_type = I2C_TYPE;
ioctl_cfg.args = &i2c_dev_addr;
result = PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg);
return result;
} }
/** /**
* @description: Read sensor device * @description: Read sensor device
* @param sdev - sensor device pointer * @param sdev - sensor device pointer
* @param len - the length of the read data * @param len - the length of the read data
* @return success: 1 , failure: -1 * @return success: 0 , failure: -1
*/ */
static int SensorDeviceRead(struct SensorDevice *sdev, size_t len) static int SensorDeviceRead(struct SensorDevice *sdev, size_t len)
{ {
//send i2c device start signal and address, need to implemente in OS i2c driver
if (PrivWrite(sdev->fd, NULL, 0) != 1) if (PrivWrite(sdev->fd, NULL, 0) != 1)
return -1; return -1;
PrivTaskDelay(50); PrivTaskDelay(50);
//Read i2c device data from i2c device address
if (PrivRead(sdev->fd, sdev->buffer, len) != 1) if (PrivRead(sdev->fd, sdev->buffer, len) != 1)
return -1; return -1;

View File

@ -58,6 +58,10 @@ static int SensorDeviceOpen(struct SensorDevice *sdev)
PrivMutexCreate(&buff_lock, 0); PrivMutexCreate(&buff_lock, 0);
sdev->fd = open(SENSOR_DEVICE_PS5308_DEV, O_RDWR); sdev->fd = open(SENSOR_DEVICE_PS5308_DEV, O_RDWR);
if (sdev->fd < 0) {
printf("open %s error\n", SENSOR_DEVICE_PS5308_DEV);
return -1;
}
struct SerialDataCfg cfg; struct SerialDataCfg cfg;
cfg.serial_baud_rate = BAUD_RATE_9600; cfg.serial_baud_rate = BAUD_RATE_9600;

View File

@ -16,6 +16,10 @@ config SENSOR_HS300X
config SENSOR_DEVICE_HS300X_DEV config SENSOR_DEVICE_HS300X_DEV
string "HS300x device name" string "HS300x device name"
default "/dev/i2c1_dev0" default "/dev/i2c1_dev0"
config SENSOR_DEVICE_HS300X_I2C_ADDR
hex "HS300x device i2c address"
default 0x44
endif endif
if ADD_NUTTX_FETURES if ADD_NUTTX_FETURES

View File

@ -32,28 +32,42 @@ static struct SensorProductInfo info =
/** /**
* @description: Open HS300x sensor device * @description: Open HS300x sensor device
* @param sdev - sensor device pointer * @param sdev - sensor device pointer
* @return 1 * @return success : 0 error : -1
*/ */
static int SensorDeviceOpen(struct SensorDevice *sdev) static int SensorDeviceOpen(struct SensorDevice *sdev)
{ {
int result;
uint16_t i2c_dev_addr = SENSOR_DEVICE_HS300X_I2C_ADDR;
sdev->fd = PrivOpen(SENSOR_DEVICE_HS300X_DEV, O_RDWR); sdev->fd = PrivOpen(SENSOR_DEVICE_HS300X_DEV, O_RDWR);
if (sdev->fd < 0) {
printf("open %s error\n", SENSOR_DEVICE_HS300X_DEV);
return -1;
}
return 0; struct PrivIoctlCfg ioctl_cfg;
ioctl_cfg.ioctl_driver_type = I2C_TYPE;
ioctl_cfg.args = &i2c_dev_addr;
result = PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg);
return result;
} }
/** /**
* @description: Read sensor device * @description: Read sensor device
* @param sdev - sensor device pointer * @param sdev - sensor device pointer
* @param len - the length of the read data * @param len - the length of the read data
* @return success: 1 , failure: -1 * @return success: 0 , failure: -1
*/ */
static int SensorDeviceRead(struct SensorDevice *sdev, size_t len) static int SensorDeviceRead(struct SensorDevice *sdev, size_t len)
{ {
//send i2c device start signal and address, need to implemente in OS i2c driver
if (PrivWrite(sdev->fd, NULL, 0) != 1) if (PrivWrite(sdev->fd, NULL, 0) != 1)
return -1; return -1;
PrivTaskDelay(50); PrivTaskDelay(50);
//Read i2c device data from i2c device address
if (PrivRead(sdev->fd, sdev->buffer, len) != 1) if (PrivRead(sdev->fd, sdev->buffer, len) != 1)
return -1; return -1;
@ -101,6 +115,7 @@ static int32_t ReadTemperature(struct SensorQuantity *quant)
if (quant->sdev->done->read != NULL) { if (quant->sdev->done->read != NULL) {
if (quant->sdev->status == SENSOR_DEVICE_PASSIVE) { if (quant->sdev->status == SENSOR_DEVICE_PASSIVE) {
quant->sdev->done->read(quant->sdev, 4); quant->sdev->done->read(quant->sdev, 4);
PrivTaskDelay(50);
quant->sdev->done->read(quant->sdev, 4); /* It takes two reads to get the data right */ quant->sdev->done->read(quant->sdev, 4); /* It takes two reads to get the data right */
result = ((quant->sdev->buffer[2] << 8 | quant->sdev->buffer[3]) >> 2) * 165.0 /( (1 << 14) - 1) - 40.0; result = ((quant->sdev->buffer[2] << 8 | quant->sdev->buffer[3]) >> 2) * 165.0 /( (1 << 14) - 1) - 40.0;

View File

@ -59,6 +59,10 @@ static int SensorDeviceOpen(struct SensorDevice *sdev)
PrivMutexCreate(&buff_lock, 0); PrivMutexCreate(&buff_lock, 0);
sdev->fd = PrivOpen(SENSOR_DEVICE_D124_DEV, O_RDWR); sdev->fd = PrivOpen(SENSOR_DEVICE_D124_DEV, O_RDWR);
if (sdev->fd < 0) {
printf("open %s error\n", SENSOR_DEVICE_D124_DEV);
return -1;
}
struct SerialDataCfg cfg; struct SerialDataCfg cfg;
cfg.serial_baud_rate = BAUD_RATE_9600; cfg.serial_baud_rate = BAUD_RATE_9600;

View File

@ -151,6 +151,9 @@ int PrivIoctl(int fd, int cmd, void *args)
case PIN_TYPE: case PIN_TYPE:
ret = PrivPinIoctl(fd, cmd, ioctl_cfg->args); ret = PrivPinIoctl(fd, cmd, ioctl_cfg->args);
break; break;
case I2C_TYPE:
ret = ioctl(fd, cmd, ioctl_cfg->args);
break;
default: default:
break; break;
} }

View File

@ -604,6 +604,41 @@ out:
return ret; return ret;
} }
static uint32 I2cInit(struct I2cDriver *i2c_drv, struct BusConfigureInfo *configure_info)
{
NULL_PARAM_CHECK(i2c_drv);
struct I2cHardwareDevice *i2c_dev = (struct I2cHardwareDevice *)i2c_drv->driver.owner_bus->owner_haldev;
if (configure_info->private_data) {
i2c_dev->i2c_dev_addr = *((uint16 *)configure_info->private_data);
return EOK;
}
KPrintf("I2cInit need set i2c dev addr\n");
return ERROR;
}
static uint32 I2cDrvConfigure(void *drv, struct BusConfigureInfo *configure_info)
{
NULL_PARAM_CHECK(drv);
NULL_PARAM_CHECK(configure_info);
x_err_t ret = EOK;
struct I2cDriver *i2c_drv = (struct I2cDriver *)drv;
switch (configure_info->configure_cmd)
{
case OPE_INT:
ret = I2cInit(i2c_drv, configure_info);
break;
default:
break;
}
return ret;
}
/*manage the i2c device operations*/ /*manage the i2c device operations*/
static const struct I2cDevDone i2c_dev_done = static const struct I2cDevDone i2c_dev_done =
{ {
@ -681,6 +716,8 @@ int Stm32HwI2cInit(void)
#ifdef BSP_USING_I2C1 #ifdef BSP_USING_I2C1
I2cGpioInit(&i2c_bus_param); I2cGpioInit(&i2c_bus_param);
i2c_driver.configure = I2cDrvConfigure;
ret = BoardI2cBusInit(&i2c_bus, &i2c_driver); ret = BoardI2cBusInit(&i2c_bus, &i2c_driver);
if (EOK != ret) { if (EOK != ret) {
KPrintf("board_i2c_Init error ret %u\n", ret); KPrintf("board_i2c_Init error ret %u\n", ret);

View File

@ -512,6 +512,41 @@ out:
return ret; return ret;
} }
static uint32 I2cInit(struct I2cDriver *i2c_drv, struct BusConfigureInfo *configure_info)
{
NULL_PARAM_CHECK(i2c_drv);
struct I2cHardwareDevice *i2c_dev = (struct I2cHardwareDevice *)i2c_drv->driver.owner_bus->owner_haldev;
if (configure_info->private_data) {
i2c_dev->i2c_dev_addr = *((uint16 *)configure_info->private_data);
return EOK;
}
KPrintf("I2cInit need set i2c dev addr\n");
return ERROR;
}
static uint32 I2cDrvConfigure(void *drv, struct BusConfigureInfo *configure_info)
{
NULL_PARAM_CHECK(drv);
NULL_PARAM_CHECK(configure_info);
x_err_t ret = EOK;
struct I2cDriver *i2c_drv = (struct I2cDriver *)drv;
switch (configure_info->configure_cmd)
{
case OPE_INT:
ret = I2cInit(i2c_drv, configure_info);
break;
default:
break;
}
return ret;
}
/*manage the i2c device operations*/ /*manage the i2c device operations*/
static const struct I2cDevDone i2c_dev_done = static const struct I2cDevDone i2c_dev_done =
{ {
@ -589,6 +624,8 @@ int HwI2cInit(void)
#ifdef BSP_USING_I2C1 #ifdef BSP_USING_I2C1
I2cGpioInit(&i2c_bus_param); I2cGpioInit(&i2c_bus_param);
i2c_driver.configure = I2cDrvConfigure;
ret = BoardI2cBusInit(&i2c_bus, &i2c_driver); ret = BoardI2cBusInit(&i2c_bus, &i2c_driver);
if (EOK != ret) { if (EOK != ret) {
KPrintf("board_i2c_Init error ret %u\n", ret); KPrintf("board_i2c_Init error ret %u\n", ret);

View File

@ -500,6 +500,41 @@ out:
return ret; return ret;
} }
static uint32 I2cInit(struct I2cDriver *i2c_drv, struct BusConfigureInfo *configure_info)
{
NULL_PARAM_CHECK(i2c_drv);
struct I2cHardwareDevice *i2c_dev = (struct I2cHardwareDevice *)i2c_drv->driver.owner_bus->owner_haldev;
if (configure_info->private_data) {
i2c_dev->i2c_dev_addr = *((uint16 *)configure_info->private_data);
return EOK;
}
KPrintf("I2cInit need set i2c dev addr\n");
return ERROR;
}
static uint32 I2cDrvConfigure(void *drv, struct BusConfigureInfo *configure_info)
{
NULL_PARAM_CHECK(drv);
NULL_PARAM_CHECK(configure_info);
x_err_t ret = EOK;
struct I2cDriver *i2c_drv = (struct I2cDriver *)drv;
switch (configure_info->configure_cmd)
{
case OPE_INT:
ret = I2cInit(i2c_drv, configure_info);
break;
default:
break;
}
return ret;
}
/*manage the i2c device operations*/ /*manage the i2c device operations*/
static const struct I2cDevDone i2c_dev_done = static const struct I2cDevDone i2c_dev_done =
{ {
@ -577,6 +612,8 @@ int HwI2cInit(void)
#ifdef BSP_USING_I2C1 #ifdef BSP_USING_I2C1
I2cGpioInit(&i2c_bus_param); I2cGpioInit(&i2c_bus_param);
i2c_driver.configure = I2cDrvConfigure;
ret = BoardI2cBusInit(&i2c_bus, &i2c_driver); ret = BoardI2cBusInit(&i2c_bus, &i2c_driver);
if (EOK != ret) { if (EOK != ret) {
KPrintf("board_i2c_Init error ret %u\n", ret); KPrintf("board_i2c_Init error ret %u\n", ret);

View File

@ -600,6 +600,41 @@ out:
return ret; return ret;
} }
static uint32 I2cInit(struct I2cDriver *i2c_drv, struct BusConfigureInfo *configure_info)
{
NULL_PARAM_CHECK(i2c_drv);
struct I2cHardwareDevice *i2c_dev = (struct I2cHardwareDevice *)i2c_drv->driver.owner_bus->owner_haldev;
if (configure_info->private_data) {
i2c_dev->i2c_dev_addr = *((uint16 *)configure_info->private_data);
return EOK;
}
KPrintf("I2cInit need set i2c dev addr\n");
return ERROR;
}
static uint32 I2cDrvConfigure(void *drv, struct BusConfigureInfo *configure_info)
{
NULL_PARAM_CHECK(drv);
NULL_PARAM_CHECK(configure_info);
x_err_t ret = EOK;
struct I2cDriver *i2c_drv = (struct I2cDriver *)drv;
switch (configure_info->configure_cmd)
{
case OPE_INT:
ret = I2cInit(i2c_drv, configure_info);
break;
default:
break;
}
return ret;
}
/*manage the i2c device operations*/ /*manage the i2c device operations*/
static const struct I2cDevDone i2c_dev_done = static const struct I2cDevDone i2c_dev_done =
{ {
@ -677,6 +712,8 @@ int Stm32HwI2cInit(void)
#ifdef BSP_USING_I2C1 #ifdef BSP_USING_I2C1
I2cGpioInit(&i2c_bus_param); I2cGpioInit(&i2c_bus_param);
i2c_driver.configure = I2cDrvConfigure;
ret = BoardI2cBusInit(&i2c_bus, &i2c_driver); ret = BoardI2cBusInit(&i2c_bus, &i2c_driver);
if (EOK != ret) { if (EOK != ret) {
KPrintf("board_i2c_Init error ret %u\n", ret); KPrintf("board_i2c_Init error ret %u\n", ret);

View File

@ -64,6 +64,8 @@ int I2cDriverInit(struct I2cDriver *i2c_driver, const char *driver_name)
i2c_driver->driver.private_data = i2c_driver->private_data; i2c_driver->driver.private_data = i2c_driver->private_data;
i2c_driver->driver.configure = i2c_driver->configure;
ret = I2cDriverRegister(&i2c_driver->driver); ret = I2cDriverRegister(&i2c_driver->driver);
if (EOK != ret) { if (EOK != ret) {
KPrintf("I2cDriverInit DriverRegister error %u\n", ret); KPrintf("I2cDriverInit DriverRegister error %u\n", ret);

View File

@ -37,7 +37,7 @@ static uint32 I2cDeviceWrite(void *dev, struct BusBlockWriteParam *write_param)
struct I2cHardwareDevice *i2c_dev = (struct I2cHardwareDevice *)dev; struct I2cHardwareDevice *i2c_dev = (struct I2cHardwareDevice *)dev;
struct I2cDataStandard i2c_msg; struct I2cDataStandard i2c_msg;
i2c_msg.addr = I2C_SLAVE_ADDR; i2c_msg.addr = i2c_dev->i2c_dev_addr;
i2c_msg.flags = I2C_WR; i2c_msg.flags = I2C_WR;
i2c_msg.buf = NONE; i2c_msg.buf = NONE;
i2c_msg.len = 0; i2c_msg.len = 0;
@ -55,7 +55,7 @@ static uint32 I2cDeviceRead(void *dev, struct BusBlockReadParam *read_param)
struct I2cHardwareDevice *i2c_dev = (struct I2cHardwareDevice *)dev; struct I2cHardwareDevice *i2c_dev = (struct I2cHardwareDevice *)dev;
struct I2cDataStandard i2c_msg; struct I2cDataStandard i2c_msg;
i2c_msg.addr = I2C_SLAVE_ADDR; i2c_msg.addr = i2c_dev->i2c_dev_addr;
i2c_msg.flags = I2C_RD; i2c_msg.flags = I2C_RD;
i2c_msg.buf = read_param->buffer; i2c_msg.buf = read_param->buffer;
i2c_msg.len = read_param->size; i2c_msg.len = read_param->size;

View File

@ -55,6 +55,8 @@ struct I2cDriver
{ {
struct Driver driver; struct Driver driver;
uint32 (*configure) (void *drv, struct BusConfigureInfo *configure_info);
void *private_data; void *private_data;
}; };

View File

@ -27,7 +27,6 @@
extern "C" { extern "C" {
#endif #endif
#define I2C_SLAVE_ADDR 0x44
#define I2C_WR 0x0000 #define I2C_WR 0x0000
#define I2C_RD (1u << 0) #define I2C_RD (1u << 0)
#define I2C_ADDR_10BIT (1u << 2) #define I2C_ADDR_10BIT (1u << 2)
@ -61,7 +60,7 @@ struct I2cHardwareDevice
struct HardwareDev haldev; struct HardwareDev haldev;
const struct I2cDevDone *i2c_dev_done; const struct I2cDevDone *i2c_dev_done;
void *private_data; uint16 i2c_dev_addr;
}; };
/*Register the I2C device*/ /*Register the I2C device*/