18 static char dev_name[MAX_DEVNAMELRN];
20 typedef int BME280_S32_t;
21 typedef unsigned int BME280_U32_t;
23 static unsigned short dig_T1;
24 static signed short dig_T2;
25 static signed short dig_T3;
26 static unsigned short dig_P1;
27 static signed short dig_P2;
28 static signed short dig_P3;
29 static signed short dig_P4;
30 static signed short dig_P5;
31 static signed short dig_P6;
32 static signed short dig_P7;
33 static signed short dig_P8;
34 static signed short dig_P9;
35 static unsigned char dig_H1;
36 static signed short dig_H2;
37 static unsigned char dig_H3;
38 static signed short dig_H4;
39 static signed short dig_H5;
40 static signed char dig_H6;
45 BME280_S32_t BME280_compensate_T_int32(BME280_S32_t adc_T)
47 BME280_S32_t var1, var2, T;
48 var1 = ((((adc_T>>3) - ((BME280_S32_t)dig_T1<<1))) * ((BME280_S32_t)dig_T2)) >> 11;
49 var2 = (((((adc_T>>4) - ((BME280_S32_t)dig_T1)) * ((adc_T>>4) - ((BME280_S32_t)dig_T1))) >> 12) *
50 ((BME280_S32_t)dig_T3)) >> 14;
52 T = (t_fine * 5 + 128) >> 8;
57 BME280_U32_t BME280_compensate_P_int32(BME280_S32_t adc_P)
59 BME280_S32_t var1, var2;
61 var1 = (((BME280_S32_t)t_fine)>>1) - (BME280_S32_t)64000;
62 var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((BME280_S32_t)dig_P6);
63 var2 = var2 + ((var1*((BME280_S32_t)dig_P5))<<1);
64 var2 = (var2>>2)+(((BME280_S32_t)dig_P4)<<16);
65 var1 = (((dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((BME280_S32_t)dig_P2) * var1)>>1))>>18;
66 var1 =((((32768+var1))*((BME280_S32_t)dig_P1))>>15);
71 p = (((BME280_U32_t)(((BME280_S32_t)1048576)-adc_P)-(var2>>12)))*3125;
74 p = (p << 1) / ((BME280_U32_t)var1);
78 p = (p / (BME280_U32_t)var1) * 2;
80 var1 = (((BME280_S32_t)dig_P9) * ((BME280_S32_t)(((p>>3) * (p>>3))>>13)))>>12;
81 var2 = (((BME280_S32_t)(p>>2)) * ((BME280_S32_t)dig_P8))>>13;
82 p = (BME280_U32_t)((BME280_S32_t)p + ((var1 + var2 + dig_P7) >> 4));
88 BME280_U32_t bme280_compensate_H_int32(BME280_S32_t adc_H)
90 BME280_S32_t v_x1_u32r;
91 v_x1_u32r = (t_fine - ((BME280_S32_t)76800));
92 v_x1_u32r = (((((adc_H << 14) - (((BME280_S32_t)dig_H4) << 20) - (((BME280_S32_t)dig_H5) * v_x1_u32r)) +
93 ((BME280_S32_t)16384)) >> 15) * (((((((v_x1_u32r * ((BME280_S32_t)dig_H6)) >> 10) * (((v_x1_u32r *
94 ((BME280_S32_t)dig_H3)) >> 11) + ((BME280_S32_t)32768))) >> 10) + ((BME280_S32_t)2097152)) *
95 ((BME280_S32_t)dig_H2) + 8192) >> 14));
96 v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((BME280_S32_t)dig_H1)) >> 4));
97 v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r);
98 v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r);
99 return (BME280_U32_t)(v_x1_u32r>>12);
102 #define DEV_ADDR 0x76 104 static void init_bme280(
void)
106 unsigned char osrs_t = 1;
107 unsigned char osrs_p = 1;
108 unsigned char osrs_h = 1;
109 unsigned char mode = 3;
110 unsigned char t_sb = 5;
111 unsigned char filter = 0;
112 unsigned char spi3w_en = 0;
114 unsigned char ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode;
115 unsigned char config_reg = (t_sb << 5) | (filter << 2) | spi3w_en;
116 unsigned char ctrl_hum_reg = osrs_h;
130 static void calib_bme280(
void)
132 unsigned char reg[32];
149 KXDUMP(0x01, reg, 32);
151 dig_T1 = (((
unsigned short)reg[1])<<8) + reg[0];
152 DKPRINTF(0x01,
"T1 : %d\n", dig_T1);
153 dig_T2 = (((
signed short)reg[3])<<8) + reg[2];
154 DKPRINTF(0x01,
"T2 : %d\n", dig_T2);
155 dig_T3 = (((
signed short)reg[5])<<8) + reg[4];
156 DKPRINTF(0x01,
"T3 : %d\n", dig_T3);
158 dig_P1 = (((
unsigned short)reg[7])<<8) + reg[6];
159 dig_P2 = ((
signed short)reg[9]<<8) + reg[8];
160 dig_P3 = (((
signed short)reg[11])<<8) + reg[10];
161 dig_P4 = (((
signed short)reg[13])<<8) + reg[12];
162 dig_P5 = (((
signed short)reg[15])<<8) + reg[14];
163 dig_P6 = (((
signed short)reg[17])<<8) + reg[16];
164 dig_P7 = (((
signed short)reg[19])<<8) + reg[18];
165 dig_P8 = (((
signed short)reg[21])<<8) + reg[20];
166 dig_P9 = (((
signed short)reg[23])<<8) + reg[22];
168 dig_H2 = (((
signed short)reg[26])<<8) + reg[25];
170 dig_H4 = (((
signed short)reg[28])<<4) + (0x0F & reg[29]);
171 dig_H5 = (((
signed short)reg[30])<<4) + ((reg[29]>>4) & 0x0F);
175 static int bme280_register(
struct st_device *dev,
char *param)
181 SYSERR_PRINT(
"Cannot open device \"%s\"\n", dev_name);
193 unsigned int hum_raw;
194 unsigned int temp_raw;
195 unsigned int pres_raw;
197 static void get_raw_data(
void)
199 unsigned char reg[8];
211 pres_raw = (((
unsigned int)reg[0]) << 12) | (((
unsigned int)reg[1]) << 4) | (((
unsigned int)reg[2]) >> 4);
212 temp_raw = (((
unsigned int)reg[3]) << 12) | (((
unsigned int)reg[4]) << 4) | (((
unsigned int)reg[5]) >> 4);
213 hum_raw = (((
unsigned int)reg[6]) << 8) | reg[7];
215 DKFPRINTF(0x01,
"PRES_RAW : %d(%x)\n", pres_raw, pres_raw);
216 DKFPRINTF(0x01,
"TEMP_RAW : %d(%x)\n", temp_raw, temp_raw);
217 DKFPRINTF(0x01,
"HUM_RAW : %d(%x)\n", hum_raw, hum_raw);
220 static int bme280_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
226 int rtn = BME280_compensate_T_int32(temp_raw);
227 DKPRINTF(0x01,
"ENVSNSR_GET_TEMP %d\n", rtn);
234 unsigned int rtn = bme280_compensate_H_int32(hum_raw);
235 DKPRINTF(0x01,
"ENVSNSR_GET_HUM %d\n", rtn);
242 unsigned int rtn = BME280_compensate_P_int32(pres_raw);
243 DKPRINTF(0x01,
"ENVSNSR_GET_PRESS %d\n", rtn);
251 thp[0] = BME280_compensate_T_int32(temp_raw);
252 thp[1] = bme280_compensate_H_int32(hum_raw);
253 thp[2] = BME280_compensate_P_int32(pres_raw);
254 DKPRINTF(0x01,
"ENVSNSR_GET_THP T:%d H:%d P:%d\n", thp[0], thp[1], thp[2]);
259 SYSERR_PRINT(
"Unknown ioctl(%08X)\n", com);
268 .explan =
"BME280 Temp. sensor",
269 .register_dev = bme280_register,
270 .ioctl = bme280_ioctl,
unsigned char uchar
GadgetSeedの文字(列)は unsigned char 型となる
#define IOCMD_I2C_MEMADDRSIZE
Memory Address Size 8bit or 16bit etc
#define IOCMD_ENVSNSR_GET_HUM
湿度を取得する(%)
struct st_device * open_device(char *name)
デバイスをオープンする
int read_device(struct st_device *dev, void *buf, unsigned int count)
デバイスよりデータを読み出す
int seek_device(struct st_device *dev, int offset, int whence)
デバイスのアクセスポイントを設定する
#define DEF_DEV_NAME_ENVSNSR
標準環境センサデバイス名
#define I2C_MEM_ADDR_SIZE_8BIT
I2Cスレーブデバイスメモリアドレスサイズは8ビット
int unlock_device(struct st_device *dev)
デバイスをアンロックする
#define IOCMD_ENVSNSR_GET_THP
TEMP & HUM & PRES
int putc_device(struct st_device *dev, unsigned char data)
デバイスにデータを1バイト書き込む
#define IOCMD_I2C_SLAVE_ADDR7
Set Save 7bit Address
環境センサ(温度、湿度、気圧等)ドライバ ioctl 用マクロ定義
#define IOCMD_ENVSNSR_GET_PRESS
気圧を取得する(hPa)
uchar * strncopy(uchar *dest, const uchar *src, unsigned int n)
文字列コピー
#define IOCMD_ENVSNSR_GET_TEMP
温度を取得する(℃)
int close_device(struct st_device *dev)
デバイスをクローズする
int ioctl_device(struct st_device *dev, unsigned int com, unsigned int arg, void *param)
デバイスを制御する
char name[MAX_DEVNAMELRN]
デバイス名文字列
int lock_device(struct st_device *dev, unsigned int timeout)
デバイスをロックする