From 9b7d0a01e42ad2229944b572a98921ebcffca041 Mon Sep 17 00:00:00 2001 From: Pedro Bertoleti Date: Tue, 9 Mar 2021 14:50:02 -0400 Subject: [PATCH] Add BMP180 sensor support. --- .../arm/rp2040/common/include/rp2040_bmp180.h | 84 ++++++++++++++ boards/arm/rp2040/common/src/Make.defs | 4 + boards/arm/rp2040/common/src/rp2040_bmp180.c | 109 ++++++++++++++++++ boards/arm/rp2040/raspberrypi-pico/README.txt | 1 + .../raspberrypi-pico/src/rp2040_bringup.c | 10 ++ 5 files changed, 208 insertions(+) create mode 100644 boards/arm/rp2040/common/include/rp2040_bmp180.h create mode 100644 boards/arm/rp2040/common/src/rp2040_bmp180.c diff --git a/boards/arm/rp2040/common/include/rp2040_bmp180.h b/boards/arm/rp2040/common/include/rp2040_bmp180.h new file mode 100644 index 0000000000..f12a3c8769 --- /dev/null +++ b/boards/arm/rp2040/common/include/rp2040_bmp180.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * boards/arm/rp2040/common/include/rp2040_bmp180.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_RP2040_COMMON_INCLUDE_RP2040_BMP180_H +#define __BOARDS_ARM_RP2040_COMMON_INCLUDE_RP2040_BMP180_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Type Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Inline Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: board_bmp180_initialize + * + * Description: + * Initialize and register the BMP180 Pressure Sensor driver. + * + * Input Parameters: + * devno - The device number, used to build the device path as /dev/pressN + * busno - The I2C bus number + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int board_bmp180_initialize(int busno); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* __BOARDS_ARM_RP2040_COMMON_INCLUDE_RP2040_BMP180_H */ diff --git a/boards/arm/rp2040/common/src/Make.defs b/boards/arm/rp2040/common/src/Make.defs index 3c2587d0f4..db104d6a83 100644 --- a/boards/arm/rp2040/common/src/Make.defs +++ b/boards/arm/rp2040/common/src/Make.defs @@ -34,6 +34,10 @@ ifeq ($(CONFIG_RP2040_SPISD),y) CSRCS += rp2040_spisd.c endif +ifeq ($(CONFIG_SENSORS_BMP180),y) + CSRCS += rp2040_bmp180.c +endif + DEPPATH += --dep-path src VPATH += :src CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)src) diff --git a/boards/arm/rp2040/common/src/rp2040_bmp180.c b/boards/arm/rp2040/common/src/rp2040_bmp180.c new file mode 100644 index 0000000000..8e95a53308 --- /dev/null +++ b/boards/arm/rp2040/common/src/rp2040_bmp180.c @@ -0,0 +1,109 @@ +/**************************************************************************** + * boards/arm/rp2040/common/src/rp2040_bmp180.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include +#include + +#include "rp2040_i2c.h" +#include "rp2040_bmp180.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_bmp180_initialize + * + * Description: + * Initialize and register the BMP180 Pressure Sensor driver. + * + * Input Parameters: + * devno - The device number, used to build the device path as /dev/pressN + * busno - The I2C bus number + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int board_bmp180_initialize(int busno) +{ + struct i2c_master_s *i2c; + char devpath[12]; + int ret; + const int devno = 0; + + sninfo("Initializing BMP180!\n"); + + /* Initialize BMP180 */ + + i2c = rp2040_i2cbus_initialize(busno); + if (i2c) + { + /* Then try to register the barometer sensor in I2C0 */ + + snprintf(devpath, 12, "/dev/press%d", devno); + ret = bmp180_register(devpath, i2c); + if (ret < 0) + { + snerr("ERROR: Error registering BMP180 in I2C%d\n", busno); + } + } + else + { + ret = -ENODEV; + } + + return ret; +} + diff --git a/boards/arm/rp2040/raspberrypi-pico/README.txt b/boards/arm/rp2040/raspberrypi-pico/README.txt index 62fcae3c2e..2dc139d1c5 100644 --- a/boards/arm/rp2040/raspberrypi-pico/README.txt +++ b/boards/arm/rp2040/raspberrypi-pico/README.txt @@ -17,6 +17,7 @@ Currently only the following devices are suppored. - SRAM Boot - If Pico SDK is available, nuttx.uf2 file which can be used in BOOTSEL mode will be created. + - BMP180 sensor at I2C0 (don't forget to define I2C0 GPIOs at "I2C0 GPIO pin assign" in Board Selection menu) Not supported: - All other devices diff --git a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c index 49323124c2..b261c2c619 100644 --- a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c +++ b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c @@ -102,5 +102,15 @@ int rp2040_bringup(void) } #endif +#ifdef CONFIG_SENSORS_BMP180 + /* Try to register BMP180 device in I2C0 */ + + ret = board_bmp180_initialize(0); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize BMP180 driver: %d\n", ret); + } +#endif + return ret; }