From e0e3a637e92dbe3c7700cc541410ff19b3b0c80c Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Wed, 21 Apr 2021 12:44:30 +0800 Subject: [PATCH] update iotd hal functions --- iotd/hal/sht20.c | 496 +++++++++++++++++++++++++++--------------------------- 1 files changed, 249 insertions(+), 247 deletions(-) diff --git a/iotd/hal/sht20.c b/iotd/hal/sht20.c index d881b43..fed3000 100644 --- a/iotd/hal/sht20.c +++ b/iotd/hal/sht20.c @@ -68,57 +68,58 @@ int sht2x_softreset(int fd) { - uint8_t buf[4]; + uint8_t buf[4]; - if( fd<0 ) - { - log_err("Invalid input arguments\n"); - return -1; - } + if( fd<0 ) + { + log_err("Invalid input arguments\n"); + return -1; + } - /* software reset SHT2x */ - memset(buf, 0, sizeof(buf)); + /* software reset SHT2x */ + memset(buf, 0, sizeof(buf)); - buf[0] = SOFTRESET; - write(fd, buf, 1); + buf[0] = SOFTRESET; + write(fd, buf, 1); - msleep(50); + msleep(50); - return 0; + return 0; } int sht2x_init(void) { - - if( (s_sht2x_fd=open("/dev/i2c-1", O_RDWR)) < 0) - { - log_fatal("i2c device open failed: %s\n", strerror(errno)); + + if( (s_sht2x_fd=open("/dev/i2c-1", O_RDWR)) < 0) + { + log_fatal("i2c device open failed: %s\n", strerror(errno)); return -1; - } - - /* set I2C mode and SHT2x slave address */ - ioctl(s_sht2x_fd, I2C_TENBIT, 0); /* Not 10-bit but 7-bit mode */ - ioctl(s_sht2x_fd, I2C_SLAVE, 0x40); /* set SHT2x slava address 0x40*/ + } - if( sht2x_softreset(s_sht2x_fd) < 0 ) - { - log_err("SHT2x softreset failure\n"); + /* set I2C mode and SHT2x slave address */ + ioctl(s_sht2x_fd, I2C_TENBIT, 0); /* Not 10-bit but 7-bit mode */ + ioctl(s_sht2x_fd, I2C_SLAVE, 0x40); /* set SHT2x slava address 0x40*/ + + if( sht2x_softreset(s_sht2x_fd) < 0 ) + { + log_err("SHT2x softreset failure\n"); sht2x_term(); - return -2; - } + return -2; + } - return s_sht2x_fd; + log_dbg("SHT2X initialise ok, s_sht2x_fd=%d\n", s_sht2x_fd); + return s_sht2x_fd; } int sht2x_get_temp_humidity(float *temp, float *rh) { - uint8_t buf[4]; + uint8_t buf[4]; - if( !temp || !rh ) - { - log_err("Invalid input arguments\n"); - return -1; - } + if( !temp || !rh ) + { + log_err("Invalid input arguments\n"); + return -1; + } if( s_sht2x_fd < 0 ) { @@ -129,42 +130,42 @@ } } - /* send trigger temperature measure command and read the data */ - memset(buf, 0, sizeof(buf)); - buf[0]=TRIGGER_TEMPERATURE_NO_HOLD; - write(s_sht2x_fd, buf, 1); + /* send trigger temperature measure command and read the data */ + memset(buf, 0, sizeof(buf)); + buf[0]=TRIGGER_TEMPERATURE_NO_HOLD; + write(s_sht2x_fd, buf, 1); - msleep(85); /* datasheet: typ=66, max=85 */ + msleep(85); /* datasheet: typ=66, max=85 */ - memset(buf, 0, sizeof(buf)); - read(s_sht2x_fd, buf, 3); - //dump_buf("Temperature sample data: ", buf, 3); - *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85; - - /* send trigger humidity measure command and read the data */ - memset(buf, 0, sizeof(buf)); - buf[0] = TRIGGER_HUMIDITY_NO_HOLD; - write(s_sht2x_fd, buf, 1); + memset(buf, 0, sizeof(buf)); + read(s_sht2x_fd, buf, 3); + //dump_buf("Temperature sample data: ", buf, 3); + *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85; - msleep(29); /* datasheet: typ=22, max=29 */ - memset(buf, 0, sizeof(buf)); + /* send trigger humidity measure command and read the data */ + memset(buf, 0, sizeof(buf)); + buf[0] = TRIGGER_HUMIDITY_NO_HOLD; + write(s_sht2x_fd, buf, 1); - read(s_sht2x_fd, buf, 3); - //dump_buf("Relative humidity sample data: ", buf, 3); - *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6; + msleep(29); /* datasheet: typ=22, max=29 */ + memset(buf, 0, sizeof(buf)); - return 0; + read(s_sht2x_fd, buf, 3); + //dump_buf("Relative humidity sample data: ", buf, 3); + *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6; + + return 0; } int sht2x_get_serialnumber(uint8_t *serialnumber, int size) { - uint8_t buf[4]; + uint8_t buf[4]; - if( !serialnumber || size!=8 ) - { - log_err("Invalid input arguments\n"); - return -1; - } + if( !serialnumber || size!=8 ) + { + log_err("Invalid input arguments\n"); + return -1; + } if( s_sht2x_fd < 0 ) { @@ -175,37 +176,37 @@ } } - /* Read SerialNumber from Location 1 */ - memset(buf, 0, sizeof(buf)); - buf[0] = 0xfa; /* command for readout on-chip memory */ - buf[1] = 0x0f; /* on-chip memory address */ - write(s_sht2x_fd, buf, 2); + /* Read SerialNumber from Location 1 */ + memset(buf, 0, sizeof(buf)); + buf[0] = 0xfa; /* command for readout on-chip memory */ + buf[1] = 0x0f; /* on-chip memory address */ + write(s_sht2x_fd, buf, 2); - memset(buf, 0, sizeof(buf)); - read(s_sht2x_fd, buf, 4); + memset(buf, 0, sizeof(buf)); + read(s_sht2x_fd, buf, 4); - serialnumber[5]=buf[0]; /* Read SNB_3 */ - serialnumber[4]=buf[1]; /* Read SNB_2 */ - serialnumber[3]=buf[2]; /* Read SNB_1 */ - serialnumber[2]=buf[3]; /* Read SNB_0 */ - - /* Read SerialNumber from Location 2 */ - memset(buf, 0, sizeof(buf) ); - buf[0]=0xfc; /* command for readout on-chip memory */ - buf[1]=0xc9; /* on-chip memory address */ - write(s_sht2x_fd, buf, 2); + serialnumber[5]=buf[0]; /* Read SNB_3 */ + serialnumber[4]=buf[1]; /* Read SNB_2 */ + serialnumber[3]=buf[2]; /* Read SNB_1 */ + serialnumber[2]=buf[3]; /* Read SNB_0 */ - memset(buf, 0, sizeof(buf) ); - read(s_sht2x_fd, buf, 4); + /* Read SerialNumber from Location 2 */ + memset(buf, 0, sizeof(buf) ); + buf[0]=0xfc; /* command for readout on-chip memory */ + buf[1]=0xc9; /* on-chip memory address */ + write(s_sht2x_fd, buf, 2); - serialnumber[1]=buf[0]; /* Read SNC_1 */ - serialnumber[0]=buf[1]; /* Read SNC_0 */ - serialnumber[7]=buf[2]; /* Read SNA_1 */ - serialnumber[6]=buf[3]; /* Read SNA_0 */ + memset(buf, 0, sizeof(buf) ); + read(s_sht2x_fd, buf, 4); - //dump_buf("SHT2x Serial number: ", serialnumber, 8); + serialnumber[1]=buf[0]; /* Read SNC_1 */ + serialnumber[0]=buf[1]; /* Read SNC_0 */ + serialnumber[7]=buf[2]; /* Read SNA_1 */ + serialnumber[6]=buf[3]; /* Read SNA_0 */ - return 0; + //dump_buf("SHT2x Serial number: ", serialnumber, 8); + + return 0; } #elif (defined I2C_API_IOCTL) /* Use I2C userspace driver read/write API */ @@ -213,67 +214,68 @@ int sht2x_softreset(int fd) { struct i2c_msg msg; - struct i2c_rdwr_ioctl_data sht2x_data; - uint8_t buf[2]; + struct i2c_rdwr_ioctl_data sht2x_data; + uint8_t buf[2]; - if( fd<0 ) - { - log_err("Invalid input arguments\n"); - return -1; - } + if( fd<0 ) + { + log_err("Invalid input arguments\n"); + return -1; + } - msg.addr= 0x40; - msg.flags=0; //write - msg.len= 1; - msg.buf= buf; - msg.buf[0]=SOFTRESET; + msg.addr= 0x40; + msg.flags=0; //write + msg.len= 1; + msg.buf= buf; + msg.buf[0]=SOFTRESET; - sht2x_data.nmsgs= 1; - sht2x_data.msgs= &msg; + sht2x_data.nmsgs= 1; + sht2x_data.msgs= &msg; - if( ioctl(fd, I2C_RDWR, &sht2x_data) < 0 ) - { - log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); + if( ioctl(fd, I2C_RDWR, &sht2x_data) < 0 ) + { + log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); sht2x_term(); - return -2; - } + return -2; + } - msleep(50); + msleep(50); - return 0; + return 0; } int sht2x_init(void) { - if( (s_sht2x_fd=open("/dev/i2c-1", O_RDWR)) < 0) - { + if( (s_sht2x_fd=open("/dev/i2c-1", O_RDWR)) < 0) + { log_err("i2c device open failed: %s\n", strerror(errno)); return -1; - } + } - if( sht2x_softreset(s_sht2x_fd) < 0 ) - { - log_err("SHT2x softreset failure\n"); + if( sht2x_softreset(s_sht2x_fd) < 0 ) + { + log_err("SHT2x softreset failure\n"); sht2x_term(); - return -2; - } + return -2; + } + log_dbg("SHT2X initialise ok, s_sht2x_fd=%d\n", s_sht2x_fd); return 0; } int sht2x_get_serialnumber(uint8_t *serialnumber, int size) { struct i2c_msg msgs[2]; - struct i2c_rdwr_ioctl_data sht2x_data; - uint8_t sbuf[2]; - uint8_t rbuf[4]; + struct i2c_rdwr_ioctl_data sht2x_data; + uint8_t sbuf[2]; + uint8_t rbuf[4]; - if( !serialnumber || size!=8 ) - { - log_err("Invalid input arguments\n"); - return -1; - } + if( !serialnumber || size!=8 ) + { + log_err("Invalid input arguments\n"); + return -1; + } if( s_sht2x_fd < 0 ) { @@ -284,86 +286,86 @@ } } - /*+------------------------------------------+ - *| Read SerialNumber from Location 1 | - *+------------------------------------------+*/ + /*+------------------------------------------+ + *| Read SerialNumber from Location 1 | + *+------------------------------------------+*/ - msgs[0].addr= 0x40; - msgs[0].flags=0; //write - msgs[0].len= 2; - msgs[0].buf= sbuf; - msgs[0].buf[0]=0xfa; /* command for readout on-chip memory */ - msgs[0].buf[1]=0x0f; /* on-chip memory address */ - - msgs[1].addr=0x40; - msgs[1].flags=I2C_M_RD; //write - msgs[1].len= 4; - msgs[1].buf= rbuf; + msgs[0].addr= 0x40; + msgs[0].flags=0; //write + msgs[0].len= 2; + msgs[0].buf= sbuf; + msgs[0].buf[0]=0xfa; /* command for readout on-chip memory */ + msgs[0].buf[1]=0x0f; /* on-chip memory address */ - sht2x_data.nmsgs= 2; - sht2x_data.msgs= msgs; + msgs[1].addr=0x40; + msgs[1].flags=I2C_M_RD; //write + msgs[1].len= 4; + msgs[1].buf= rbuf; - if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) - { - log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); + sht2x_data.nmsgs= 2; + sht2x_data.msgs= msgs; + + if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) + { + log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); sht2x_term(); - return -2; - } - - serialnumber[5]=rbuf[0]; /* Read SNB_3 */ + return -2; + } + + serialnumber[5]=rbuf[0]; /* Read SNB_3 */ serialnumber[4]=rbuf[1]; /* Read SNB_2 */ serialnumber[3]=rbuf[2]; /* Read SNB_1 */ serialnumber[2]=rbuf[3]; /* Read SNB_0 */ - /*+------------------------------------------+ - *| Read SerialNumber from Location 2 | - *+------------------------------------------+*/ - - msgs[0].addr= 0x40; - msgs[0].flags=0; //write - msgs[0].len= 2; - msgs[0].buf= sbuf; - msgs[0].buf[0]=0xfc; /* command for readout on-chip memory */ - msgs[0].buf[1]=0xc9; /* on-chip memory address */ - - msgs[1].addr=0x40; - msgs[1].flags=I2C_M_RD; //write - msgs[1].len= 4; - msgs[1].buf= rbuf; + /*+------------------------------------------+ + *| Read SerialNumber from Location 2 | + *+------------------------------------------+*/ - sht2x_data.nmsgs= 2; - sht2x_data.msgs= msgs; + msgs[0].addr= 0x40; + msgs[0].flags=0; //write + msgs[0].len= 2; + msgs[0].buf= sbuf; + msgs[0].buf[0]=0xfc; /* command for readout on-chip memory */ + msgs[0].buf[1]=0xc9; /* on-chip memory address */ - if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) - { - log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); + msgs[1].addr=0x40; + msgs[1].flags=I2C_M_RD; //write + msgs[1].len= 4; + msgs[1].buf= rbuf; + + sht2x_data.nmsgs= 2; + sht2x_data.msgs= msgs; + + if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) + { + log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); sht2x_term(); - return -2; - } - - serialnumber[1]=rbuf[0]; /* Read SNC_1 */ - serialnumber[0]=rbuf[1]; /* Read SNC_0 */ - serialnumber[7]=rbuf[2]; /* Read SNA_1 */ - serialnumber[6]=rbuf[3]; /* Read SNA_0 */ + return -2; + } - //dump_buf("SHT2x Serial number: ", serialnumber, 8); + serialnumber[1]=rbuf[0]; /* Read SNC_1 */ + serialnumber[0]=rbuf[1]; /* Read SNC_0 */ + serialnumber[7]=rbuf[2]; /* Read SNA_1 */ + serialnumber[6]=rbuf[3]; /* Read SNA_0 */ - return 0; + //dump_buf("SHT2x Serial number: ", serialnumber, 8); + + return 0; } int sht2x_get_temp_humidity(float *temp, float *rh) { struct i2c_msg msg; - struct i2c_rdwr_ioctl_data sht2x_data; - uint8_t buf[4]; + struct i2c_rdwr_ioctl_data sht2x_data; + uint8_t buf[4]; - if( !temp || !rh ) - { - log_err("Invalid input arguments\n"); - return -1; - } + if( !temp || !rh ) + { + log_err("Invalid input arguments\n"); + return -1; + } if( s_sht2x_fd < 0 ) { @@ -373,91 +375,91 @@ return -2; } } - - /*+------------------------------------------+ - *| measure and get temperature | - *+------------------------------------------+*/ - msg.addr= 0x40; - msg.flags=0; //write - msg.len= 1; - msg.buf= buf; - msg.buf[0]=TRIGGER_TEMPERATURE_NO_HOLD; /* trigger temperature without hold I2C bus */ + /*+------------------------------------------+ + *| measure and get temperature | + *+------------------------------------------+*/ - sht2x_data.nmsgs= 1; - sht2x_data.msgs= &msg; + msg.addr= 0x40; + msg.flags=0; //write + msg.len= 1; + msg.buf= buf; + msg.buf[0]=TRIGGER_TEMPERATURE_NO_HOLD; /* trigger temperature without hold I2C bus */ - if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) - { - log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); + sht2x_data.nmsgs= 1; + sht2x_data.msgs= &msg; + + if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) + { + log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); sht2x_term(); - return -2; - } + return -2; + } - msleep(85); - - memset(buf, 0, sizeof(buf)); - msg.addr=0x40; - msg.flags=I2C_M_RD; //write - msg.len= 3; - msg.buf= buf; + msleep(85); - sht2x_data.nmsgs= 1; - sht2x_data.msgs= &msg; + memset(buf, 0, sizeof(buf)); + msg.addr=0x40; + msg.flags=I2C_M_RD; //write + msg.len= 3; + msg.buf= buf; - if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) - { - log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); + sht2x_data.nmsgs= 1; + sht2x_data.msgs= &msg; + + if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) + { + log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); sht2x_term(); - return -2; - } - - //dump_buf("Temperature sample data: ", buf, 3); - *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85; + return -2; + } - - /*+------------------------------------------+ - *| measure and get relative humidity | - *+------------------------------------------+*/ + //dump_buf("Temperature sample data: ", buf, 3); + *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85; - msg.addr= 0x40; - msg.flags=0; //write - msg.len= 1; - msg.buf= buf; - msg.buf[0]=TRIGGER_HUMIDITY_NO_HOLD; /* trigger humidity without hold I2C bus */ - sht2x_data.nmsgs= 1; - sht2x_data.msgs= &msg; + /*+------------------------------------------+ + *| measure and get relative humidity | + *+------------------------------------------+*/ - if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) - { - log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); + msg.addr= 0x40; + msg.flags=0; //write + msg.len= 1; + msg.buf= buf; + msg.buf[0]=TRIGGER_HUMIDITY_NO_HOLD; /* trigger humidity without hold I2C bus */ + + sht2x_data.nmsgs= 1; + sht2x_data.msgs= &msg; + + if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) + { + log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); sht2x_term(); - return -2; - } + return -2; + } - msleep(29); - - memset(buf, 0, sizeof(buf)); - msg.addr=0x40; - msg.flags=I2C_M_RD; //write - msg.len= 3; - msg.buf= buf; + msleep(29); - sht2x_data.nmsgs= 1; - sht2x_data.msgs= &msg; + memset(buf, 0, sizeof(buf)); + msg.addr=0x40; + msg.flags=I2C_M_RD; //write + msg.len= 3; + msg.buf= buf; - if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) - { - log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); + sht2x_data.nmsgs= 1; + sht2x_data.msgs= &msg; + + if( ioctl(s_sht2x_fd, I2C_RDWR, &sht2x_data) < 0 ) + { + log_err("sht2x I2C_RDWR ioctl failure: %s\n", strerror(errno)); sht2x_term(); - return -2; - } + return -2; + } - //dump_buf("Relative humidity sample data: ", buf, 3); - *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6; - - return 0; + //dump_buf("Relative humidity sample data: ", buf, 3); + *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6; + + return 0; } #endif -- Gitblit v1.9.1