Skip to content

Commit 9b02468

Browse files
committed
drivers: sensor: STCC4 Add Driver
This adds support for Sensirion's STCC4 co2 sensor. Signed-off-by: Jan Faeh <jan.faeh@sensirion.com>
1 parent 0589958 commit 9b02468

File tree

15 files changed

+1743
-0
lines changed

15 files changed

+1743
-0
lines changed

drivers/sensor/sensirion/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
# zephyr-keep-sorted-start
5+
add_subdirectory(sensirion_core)
56
add_subdirectory_ifdef(CONFIG_SCD4X scd4x)
67
add_subdirectory_ifdef(CONFIG_SGP40 sgp40)
78
add_subdirectory_ifdef(CONFIG_SHT3XD sht3xd)
89
add_subdirectory_ifdef(CONFIG_SHT4X sht4x)
910
add_subdirectory_ifdef(CONFIG_SHTCX shtcx)
11+
add_subdirectory_ifdef(CONFIG_STCC4 stcc4)
1012
add_subdirectory_ifdef(CONFIG_STS4X sts4x)
1113
# zephyr-keep-sorted-stop

drivers/sensor/sensirion/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ source "drivers/sensor/sensirion/sgp40/Kconfig"
77
source "drivers/sensor/sensirion/sht3xd/Kconfig"
88
source "drivers/sensor/sensirion/sht4x/Kconfig"
99
source "drivers/sensor/sensirion/shtcx/Kconfig"
10+
source "drivers/sensor/sensirion/stcc4/Kconfig"
1011
source "drivers/sensor/sensirion/sts4x/Kconfig"
1112
# zephyr-keep-sorted-stop
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# ST Microelectronics stmemsc hal i/f
2+
#
3+
# Copyright (c) 2021 STMicroelectronics
4+
#
5+
# SPDX-License-Identifier: Apache-2.0
6+
#
7+
zephyr_library()
8+
9+
zephyr_library_sources(sensirion_common.c)
10+
zephyr_library_sources(sensirion_i2c.c)
11+
zephyr_library_sources(crc_tables.c)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright (c) 2025 Sensirion
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <stdint.h>
8+
9+
uint8_t crc8_poly31_table[256] = {
10+
0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97, 0xB9, 0x88, 0xDB, 0xEA, 0x7D, 0x4C, 0x1F,
11+
0x2E, 0x43, 0x72, 0x21, 0x10, 0x87, 0xB6, 0xE5, 0xD4, 0xFA, 0xCB, 0x98, 0xA9, 0x3E, 0x0F,
12+
0x5C, 0x6D, 0x86, 0xB7, 0xE4, 0xD5, 0x42, 0x73, 0x20, 0x11, 0x3F, 0x0E, 0x5D, 0x6C, 0xFB,
13+
0xCA, 0x99, 0xA8, 0xC5, 0xF4, 0xA7, 0x96, 0x01, 0x30, 0x63, 0x52, 0x7C, 0x4D, 0x1E, 0x2F,
14+
0xB8, 0x89, 0xDA, 0xEB, 0x3D, 0x0C, 0x5F, 0x6E, 0xF9, 0xC8, 0x9B, 0xAA, 0x84, 0xB5, 0xE6,
15+
0xD7, 0x40, 0x71, 0x22, 0x13, 0x7E, 0x4F, 0x1C, 0x2D, 0xBA, 0x8B, 0xD8, 0xE9, 0xC7, 0xF6,
16+
0xA5, 0x94, 0x03, 0x32, 0x61, 0x50, 0xBB, 0x8A, 0xD9, 0xE8, 0x7F, 0x4E, 0x1D, 0x2C, 0x02,
17+
0x33, 0x60, 0x51, 0xC6, 0xF7, 0xA4, 0x95, 0xF8, 0xC9, 0x9A, 0xAB, 0x3C, 0x0D, 0x5E, 0x6F,
18+
0x41, 0x70, 0x23, 0x12, 0x85, 0xB4, 0xE7, 0xD6, 0x7A, 0x4B, 0x18, 0x29, 0xBE, 0x8F, 0xDC,
19+
0xED, 0xC3, 0xF2, 0xA1, 0x90, 0x07, 0x36, 0x65, 0x54, 0x39, 0x08, 0x5B, 0x6A, 0xFD, 0xCC,
20+
0x9F, 0xAE, 0x80, 0xB1, 0xE2, 0xD3, 0x44, 0x75, 0x26, 0x17, 0xFC, 0xCD, 0x9E, 0xAF, 0x38,
21+
0x09, 0x5A, 0x6B, 0x45, 0x74, 0x27, 0x16, 0x81, 0xB0, 0xE3, 0xD2, 0xBF, 0x8E, 0xDD, 0xEC,
22+
0x7B, 0x4A, 0x19, 0x28, 0x06, 0x37, 0x64, 0x55, 0xC2, 0xF3, 0xA0, 0x91, 0x47, 0x76, 0x25,
23+
0x14, 0x83, 0xB2, 0xE1, 0xD0, 0xFE, 0xCF, 0x9C, 0xAD, 0x3A, 0x0B, 0x58, 0x69, 0x04, 0x35,
24+
0x66, 0x57, 0xC0, 0xF1, 0xA2, 0x93, 0xBD, 0x8C, 0xDF, 0xEE, 0x79, 0x48, 0x1B, 0x2A, 0xC1,
25+
0xF0, 0xA3, 0x92, 0x05, 0x34, 0x67, 0x56, 0x78, 0x49, 0x1A, 0x2B, 0xBC, 0x8D, 0xDE, 0xEF,
26+
0x82, 0xB3, 0xE0, 0xD1, 0x46, 0x77, 0x24, 0x15, 0x3B, 0x0A, 0x59, 0x68, 0xFF, 0xCE, 0x9D,
27+
0xAC};
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
* Copyright (c) 2025 Sensirion
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include "sensirion_common.h"
8+
9+
uint16_t sensirion_common_bytes_to_uint16_t(const uint8_t *bytes)
10+
{
11+
return (uint16_t)bytes[0] << 8 | (uint16_t)bytes[1];
12+
}
13+
14+
uint32_t sensirion_common_bytes_to_uint32_t(const uint8_t *bytes)
15+
{
16+
return (uint32_t)bytes[0] << 24 | (uint32_t)bytes[1] << 16 | (uint32_t)bytes[2] << 8 |
17+
(uint32_t)bytes[3];
18+
}
19+
20+
int16_t sensirion_common_bytes_to_int16_t(const uint8_t *bytes)
21+
{
22+
return (int16_t)sensirion_common_bytes_to_uint16_t(bytes);
23+
}
24+
25+
int32_t sensirion_common_bytes_to_int32_t(const uint8_t *bytes)
26+
{
27+
return (int32_t)sensirion_common_bytes_to_uint32_t(bytes);
28+
}
29+
30+
float sensirion_common_bytes_to_float(const uint8_t *bytes)
31+
{
32+
union {
33+
uint32_t u32_value;
34+
float float32;
35+
} tmp;
36+
37+
tmp.u32_value = sensirion_common_bytes_to_uint32_t(bytes);
38+
return tmp.float32;
39+
}
40+
41+
void sensirion_common_uint32_t_to_bytes(const uint32_t value, uint8_t *bytes)
42+
{
43+
bytes[0] = (uint8_t)(value >> 24);
44+
bytes[1] = (uint8_t)(value >> 16);
45+
bytes[2] = (uint8_t)(value >> 8);
46+
bytes[3] = (uint8_t)(value);
47+
}
48+
49+
void sensirion_common_uint16_t_to_bytes(const uint16_t value, uint8_t *bytes)
50+
{
51+
bytes[0] = (uint8_t)(value >> 8);
52+
bytes[1] = (uint8_t)value;
53+
}
54+
55+
void sensirion_common_int32_t_to_bytes(const int32_t value, uint8_t *bytes)
56+
{
57+
bytes[0] = (uint8_t)(value >> 24);
58+
bytes[1] = (uint8_t)(value >> 16);
59+
bytes[2] = (uint8_t)(value >> 8);
60+
bytes[3] = (uint8_t)value;
61+
}
62+
63+
void sensirion_common_int16_t_to_bytes(const int16_t value, uint8_t *bytes)
64+
{
65+
bytes[0] = (uint8_t)(value >> 8);
66+
bytes[1] = (uint8_t)value;
67+
}
68+
69+
void sensirion_common_float_to_bytes(const float value, uint8_t *bytes)
70+
{
71+
union {
72+
uint32_t u32_value;
73+
float float32;
74+
} tmp;
75+
tmp.float32 = value;
76+
sensirion_common_uint32_t_to_bytes(tmp.u32_value, bytes);
77+
}
78+
79+
void sensirion_common_copy_bytes(const uint8_t *source, uint8_t *destination, uint16_t data_length)
80+
{
81+
uint16_t i;
82+
83+
for (i = 0; i < data_length; i++) {
84+
destination[i] = source[i];
85+
}
86+
}
87+
88+
void sensirion_common_to_integer(const uint8_t *source, uint8_t *destination, INT_TYPE int_type,
89+
uint8_t data_length)
90+
{
91+
if (data_length > int_type) {
92+
data_length = 0;
93+
}
94+
95+
uint8_t offset = int_type - data_length;
96+
97+
for (uint8_t i = 0; i < offset; i++) {
98+
destination[int_type - i - 1] = 0;
99+
}
100+
101+
for (uint8_t i = 1; i <= data_length; i++) {
102+
destination[int_type - offset - i] = source[i - 1];
103+
}
104+
}
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
/*
2+
* Copyright (c) 2025 Sensirion
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef SENSIRION_COMMON_H
8+
#define SENSIRION_COMMON_H
9+
10+
#ifdef __cplusplus
11+
extern "C" {
12+
#endif
13+
14+
#include <stdint.h>
15+
16+
#define NO_ERROR 0
17+
#define NOT_IMPLEMENTED_ERROR ENOSYS
18+
19+
#define SENSIRION_COMMAND_SIZE 2
20+
#define SENSIRION_WORD_SIZE 2
21+
#define SENSIRION_NUM_WORDS(x) (sizeof(x) / SENSIRION_WORD_SIZE)
22+
#define SENSIRION_MAX_BUFFER_WORDS 32
23+
24+
/**
25+
* Enum to describe the type of an integer
26+
*/
27+
typedef enum {
28+
BYTE = 1,
29+
SHORT = 2,
30+
INTEGER = 4,
31+
LONG_INTEGER = 8
32+
} INT_TYPE;
33+
34+
/**
35+
* sensirion_common_bytes_to_int16_t() - Convert an array of bytes to an int16_t
36+
*
37+
* Convert an array of bytes received from the sensor in big-endian/MSB-first
38+
* format to an int16_t value in the correct system-endianness.
39+
*
40+
* @param bytes An array of at least two bytes (MSB first)
41+
* @return The byte array represented as int16_t
42+
*/
43+
int16_t sensirion_common_bytes_to_int16_t(const uint8_t *bytes);
44+
45+
/**
46+
* sensirion_common_bytes_to_int32_t() - Convert an array of bytes to an int32_t
47+
*
48+
* Convert an array of bytes received from the sensor in big-endian/MSB-first
49+
* format to an int32_t value in the correct system-endianness.
50+
*
51+
* @param bytes An array of at least four bytes (MSB first)
52+
* @return The byte array represented as int32_t
53+
*/
54+
int32_t sensirion_common_bytes_to_int32_t(const uint8_t *bytes);
55+
56+
/**
57+
* sensirion_common_bytes_to_uint16_t() - Convert an array of bytes to an
58+
* uint16_t
59+
*
60+
* Convert an array of bytes received from the sensor in big-endian/MSB-first
61+
* format to an uint16_t value in the correct system-endianness.
62+
*
63+
* @param bytes An array of at least two bytes (MSB first)
64+
* @return The byte array represented as uint16_t
65+
*/
66+
uint16_t sensirion_common_bytes_to_uint16_t(const uint8_t *bytes);
67+
68+
/**
69+
* sensirion_common_bytes_to_uint32_t() - Convert an array of bytes to an
70+
* uint32_t
71+
*
72+
* Convert an array of bytes received from the sensor in big-endian/MSB-first
73+
* format to an uint32_t value in the correct system-endianness.
74+
*
75+
* @param bytes An array of at least four bytes (MSB first)
76+
* @return The byte array represented as uint32_t
77+
*/
78+
uint32_t sensirion_common_bytes_to_uint32_t(const uint8_t *bytes);
79+
80+
/**
81+
* sensirion_common_bytes_to_float() - Convert an array of bytes to a float
82+
*
83+
* Convert an array of bytes received from the sensor in big-endian/MSB-first
84+
* format to an float value in the correct system-endianness.
85+
*
86+
* @param bytes An array of at least four bytes (MSB first)
87+
* @return The byte array represented as float
88+
*/
89+
float sensirion_common_bytes_to_float(const uint8_t *bytes);
90+
91+
/**
92+
* sensirion_common_uint32_t_to_bytes() - Convert an uint32_t to an array of
93+
* bytes
94+
*
95+
* Convert an uint32_t value in system-endianness to big-endian/MBS-first
96+
* format to send to the sensor.
97+
*
98+
* @param value Value to convert
99+
* @param bytes An array of at least four bytes
100+
*/
101+
void sensirion_common_uint32_t_to_bytes(const uint32_t value, uint8_t *bytes);
102+
103+
/**
104+
* sensirion_common_uint16_t_to_bytes() - Convert an uint16_t to an array of
105+
* bytes
106+
*
107+
* Convert an uint16_t value in system-endianness to big-endian/MBS-first
108+
* format to send to the sensor.
109+
*
110+
* @param value Value to convert
111+
* @param bytes An array of at least two bytes
112+
*/
113+
void sensirion_common_uint16_t_to_bytes(const uint16_t value, uint8_t *bytes);
114+
115+
/**
116+
* sensirion_common_int32_t_to_bytes() - Convert an int32_t to an array of bytes
117+
*
118+
* Convert an int32_t value in system-endianness to big-endian/MBS-first
119+
* format to send to the sensor.
120+
*
121+
* @param value Value to convert
122+
* @param bytes An array of at least four bytes
123+
*/
124+
void sensirion_common_int32_t_to_bytes(const int32_t value, uint8_t *bytes);
125+
126+
/**
127+
* sensirion_common_int16_t_to_bytes() - Convert an int16_t to an array of bytes
128+
*
129+
* Convert an int16_t value in system-endianness to big-endian/MBS-first
130+
* format to send to the sensor.
131+
*
132+
* @param value Value to convert
133+
* @param bytes An array of at least two bytes
134+
*/
135+
void sensirion_common_int16_t_to_bytes(const int16_t value, uint8_t *bytes);
136+
137+
/**
138+
* sensirion_common_float_to_bytes() - Convert an float to an array of bytes
139+
*
140+
* Convert an float value in system-endianness to big-endian/MBS-first
141+
* format to send to the sensor.
142+
*
143+
* @param value Value to convert
144+
* @param bytes An array of at least four bytes
145+
*/
146+
void sensirion_common_float_to_bytes(const float value, uint8_t *bytes);
147+
148+
/**
149+
* sensirion_common_copy_bytes() - Copy bytes from one array to the other.
150+
*
151+
* @param source Array of bytes to be copied.
152+
* @param destination Array of bytes to be copied to.
153+
* @param data_length Number of bytes to copy.
154+
*/
155+
void sensirion_common_copy_bytes(const uint8_t *source, uint8_t *destination, uint16_t data_length);
156+
157+
/**
158+
* sensirion_common_to_integer() - Copy bytes from byte array to integer.
159+
*
160+
* @param source Array of bytes to be copied.
161+
* @param int_value Pointer to integer of bytes to be copied to.
162+
* @param int_type Type (size) of the integer to be copied.
163+
* @param data_length Number of bytes to copy.
164+
*/
165+
void sensirion_common_to_integer(const uint8_t *source, uint8_t *destination, INT_TYPE int_type,
166+
uint8_t data_length);
167+
168+
#ifdef __cplusplus
169+
}
170+
#endif
171+
172+
#endif /* SENSIRION_COMMON_H */

0 commit comments

Comments
 (0)