Added Sensors.

Signed-off-by: Yilin Sun <imi415@imi.moe>
This commit is contained in:
Yilin Sun 2023-12-07 20:50:23 +08:00
parent ddb367b97a
commit 29c3173150
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
11 changed files with 93 additions and 132 deletions

3
.gitmodules vendored
View File

@ -4,3 +4,6 @@
[submodule "lib/sensors"]
path = lib/sensors
url = git@git.minori.work:Embedded_Projects/imsensors.git
[submodule "lib/lcd"]
path = lib/lcd
url = https://git.minori.work/Embedded_Drivers/epd-spi.git

View File

@ -52,7 +52,6 @@ set(TARGET_SOURCES
"board/peripherals.c"
"board/pin_mux.c"
"src/main.c"
"src/pah8001_impl.c"
"src/sensors_impl.c"
"src/util_systick.c"
)
@ -82,9 +81,10 @@ set(TARGET_C_INCLUDES
# Shared libraries linked with application
set(TARGET_LIBS
"imsensors"
"m"
"power_cm4_hardabi"
"pah8001"
"c"
"m"
"nosys"
)
# Shared library and linker script search paths
@ -92,14 +92,11 @@ set(TARGET_LIB_DIRECTORIES
"SDK/devices/LPC54102/gcc"
)
# Device specific settings, goes to CFLAGS and LDFLAGS
set(TARGET_CFLAGS_HARDWARE "-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16")
# Conditional flags
# DEBUG
set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -O0 -g")
set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -O0 -g")
set(CMAKE_ASM_FLAGS_DEBUG "-DDEBUG -O0 -g")
set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -Og -g")
set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -Og -g")
set(CMAKE_ASM_FLAGS_DEBUG "-DDEBUG -Og -g")
# RELEASE
set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2 -flto")
@ -108,16 +105,16 @@ set(CMAKE_ASM_FLAGS_RELEASE "-DNDEBUG -O2 -flto")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-flto")
# Final compiler flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_CFLAGS_HARDWARE} -Wall -fno-common -fno-builtin -ffreestanding -fdata-sections -ffunction-sections")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TARGET_CFLAGS_HARDWARE} -Wall -fno-common -fno-builtin -ffreestanding -fdata-sections -ffunction-sections")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CMAKE_C_FLAGS} -x assembler-with-cpp")
set(CMAKE_EXE_LINKER_FLAGS "-specs=nano.specs -specs=nosys.specs -lnosys -Wl,--gc-sections -Wl,--print-memory-usage -Wl,--no-warn-rwx-segments")
add_subdirectory(lib/pixart_pah8001ei)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fno-common -fno-builtin -ffreestanding -fdata-sections -ffunction-sections")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fno-common -fno-builtin -ffreestanding -fdata-sections -ffunction-sections")
set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
set(IMSENSORS_FLOAT_SUPPORT YES)
add_subdirectory(lib/sensors)
add_subdirectory(lib/lcd)
# Shared sources, includes and definitions
add_compile_definitions(${TARGET_C_DEFINES})
include_directories(${TARGET_C_INCLUDES})
@ -128,18 +125,27 @@ link_libraries(${TARGET_LIBS})
# Create ELF
add_executable("${CMAKE_PROJECT_NAME}_FLASH.elf" ${TARGET_SOURCES})
target_compile_definitions("${CMAKE_PROJECT_NAME}_FLASH.elf"
PRIVATE ${TARGET_C_DEFINES_XIP}
)
target_link_options("${CMAKE_PROJECT_NAME}_FLASH.elf"
PRIVATE "-T${TARGET_LDSCRIPT_FLASH}"
PRIVATE "-Wl,--Map=${CMAKE_PROJECT_NAME}_FLASH.map"
)
set_property(TARGET "${CMAKE_PROJECT_NAME}_FLASH.elf" APPEND
PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_PROJECT_NAME}_FLASH.map"
)
add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_FLASH.hex"
COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_FLASH.elf" "${CMAKE_PROJECT_NAME}_FLASH.hex"
DEPENDS "${CMAKE_PROJECT_NAME}_FLASH.elf"
)
set_property(TARGET "${CMAKE_PROJECT_NAME}_FLASH.elf" APPEND
PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_PROJECT_NAME}_FLASH.map"
)
add_custom_target("${CMAKE_PROJECT_NAME}_FLASH_HEX" DEPENDS "${CMAKE_PROJECT_NAME}_FLASH.hex")
if(DEFINED TARGET_TOOLCHAIN_SIZE)
add_custom_command(TARGET "${CMAKE_PROJECT_NAME}_FLASH.elf" POST_BUILD
COMMAND ${TARGET_TOOLCHAIN_SIZE} "${CMAKE_PROJECT_NAME}_FLASH.elf"
)
endif()
# Create ELF
add_executable("${CMAKE_PROJECT_NAME}_RAM.elf" ${TARGET_SOURCES})
@ -147,7 +153,7 @@ target_link_options("${CMAKE_PROJECT_NAME}_RAM.elf"
PRIVATE "-T${TARGET_LDSCRIPT_RAM}"
PRIVATE "-Wl,--Map=${CMAKE_PROJECT_NAME}_RAM.map"
)
set_property(TARGET "${CMAKE_PROJECT_NAME}_FLASH.elf" APPEND
set_property(TARGET "${CMAKE_PROJECT_NAME}_RAM.elf" APPEND
PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_PROJECT_NAME}_RAM.map"
)
add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_RAM.hex"
@ -155,3 +161,9 @@ add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_RAM.hex"
DEPENDS "${CMAKE_PROJECT_NAME}_RAM.elf"
)
add_custom_target("${CMAKE_PROJECT_NAME}_RAM_HEX" DEPENDS "${CMAKE_PROJECT_NAME}_RAM.hex")
if(DEFINED TARGET_TOOLCHAIN_SIZE)
add_custom_command(TARGET "${CMAKE_PROJECT_NAME}_RAM.elf" POST_BUILD
COMMAND ${TARGET_TOOLCHAIN_SIZE} "${CMAKE_PROJECT_NAME}_RAM.elf"
)
endif()

2
SDK

@ -1 +1 @@
Subproject commit 5540a4c296a16ba1fd7bbe78dec73165903fc94d
Subproject commit ada43e86a127cf8ad552012e98a4eeb63d717606

View File

@ -1,10 +1,17 @@
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
# Make CMake happy about those compilers
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
# Poor old Windows...
if(WIN32)
set(CMAKE_SYSTEM_NAME "Generic")
endif()
endif()
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
# Optionally set size binary name, for elf section size reporting.
set(TARGET_TOOLCHAIN_SIZE arm-none-eabi-size)
set(CMAKE_C_FLAGS_INIT "-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16")
set(CMAKE_CXX_FLAGS_INIT "-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16")
set(CMAKE_EXE_LINKER_FLAGS_INIT "-specs=nano.specs -specs=nosys.specs -Wl,--print-memory-usage -Wl,--no-warn-rwx-segments")
# Make CMake happy about those compilers
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")

1
lib/lcd Submodule

@ -0,0 +1 @@
Subproject commit 7d0de59c3bba1766cc7d2417e5ae11d5a0f82372

View File

@ -1,14 +0,0 @@
cmake_minimum_required(VERSION 3.10)
project(pah8001)
set(PAH8001_SOURCES
"src/pixart_pah8001ei.c"
)
set(PAH8001_INCLUDES
"include"
)
add_library(${PROJECT_NAME} ${PAH8001_SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC ${PAH8001_INCLUDES})

View File

@ -1,29 +0,0 @@
#ifndef PIXART_PAH8001EI_H
#define PIXART_PAH8001EI_H
#include <stddef.h>
#include <stdint.h>
typedef enum {
PAH_RET_OK,
PAH_RET_FAIL,
} pah_ret_t;
typedef pah_ret_t (*pah_ops_init_t)(void *pdev);
typedef pah_ret_t (*pah_ops_read_t)(void *pdev, uint8_t reg, uint8_t *value, uint16_t len);
typedef pah_ret_t (*pah_ops_write_t)(void *pdev, uint8_t reg, uint8_t *value, uint16_t len);
typedef struct {
pah_ops_init_t init;
pah_ops_read_t read;
pah_ops_write_t write;
} pah_ops_t;
typedef struct {
pah_ops_t ops;
void *pdev;
} pah_t;
pah_ret_t pah8001_init(pah_t *pah);
#endif

View File

@ -1,27 +0,0 @@
#include "pixart_pah8001ei.h"
#define PAH8001_R_CONFIG 0x06
#define PAH8001_R_CONFIG_RESET_Pos 7
#define PAH8001_R_CONFIG_RESET_Msk (1U << PAH8001_R_CONFIG_RESET_Pos)
#define PAH8001_R_CONFIG_POWERDOWN_Pos 3
#define PAH8001_R_CONFIG_POWERDOWN_Msk (1U << PAH8001_R_CONFIG_POWERDOWN_Pos)
#define PAH8001_ERROR_CHECK(x) \
if (x != PAH_RET_OK) return PAH_RET_FAIL
static pah_ret_t pah8001_reset(pah_t *pah) {
uint8_t wdata = PAH8001_R_CONFIG_RESET_Msk | 2U;
PAH8001_ERROR_CHECK(pah->ops.write(pah->pdev, PAH8001_R_CONFIG, &wdata, 0x01));
wdata = PAH8001_R_CONFIG_POWERDOWN_Msk | 2U;
PAH8001_ERROR_CHECK(pah->ops.write(pah->pdev, PAH8001_R_CONFIG, &wdata, 0x01));
return PAH_RET_OK;
}
pah_ret_t pah8001_init(pah_t *pah) {
PAH8001_ERROR_CHECK(pah->ops.init(pah->pdev));
PAH8001_ERROR_CHECK(pah8001_reset(pah));
return PAH_RET_OK;
}

@ -1 +1 @@
Subproject commit 6ee72440c713226cbcff2e9e148c8f61ea04b3e4
Subproject commit 954c38ac5a47033762f3ea7d5e1eef86d4265ee8

View File

@ -6,35 +6,27 @@
/* Debug console */
#include "fsl_debug_console.h"
/* PPG */
#include "pixart_pah8001ei.h"
/* Utils */
#include "util_systick.h"
/* Sensors */
#include "imsensors/dht/dht_bme280.h"
#include "imsensors/ppg/ppg_pah8001.h"
pah_ret_t pah8001_impl_init(void *pdev);
pah_ret_t pah8001_impl_write(void *pdev, uint8_t reg, uint8_t *value, uint16_t len);
pah_ret_t pah8001_impl_read(void *pdev, uint8_t reg, uint8_t *value, uint16_t len);
ims_ret_t sensors_impl_i2c_xfer(void *pdev, uint16_t addr, ims_i2c_xfer_desc_t *xfer);
ims_ret_t sensors_impl_i2c_xfer(void *pdev, ims_i2c_xfer_desc_t *xfer);
ims_ret_t sensors_impl_delay(void *pdev, uint32_t msec);
pah_t s_pah = {
.ops =
ims_pah8001_t s_pah = {
.pdev = (void *)0x33,
.cb =
{
.init = pah8001_impl_init,
.write = pah8001_impl_write,
.read = pah8001_impl_read,
.i2c_xfer = sensors_impl_i2c_xfer,
.delay = sensors_impl_delay,
},
.pdev = NULL,
};
ims_bme280_t s_bme = {
.user_data = NULL,
.i2c_addr = 0x77,
.pdev = (void *)0x77,
.cb =
{
.i2c_xfer = sensors_impl_i2c_xfer,
@ -43,12 +35,12 @@ ims_bme280_t s_bme = {
};
ims_bme280_t s_bmp = {
.user_data = NULL,
.i2c_addr = 0x76,
.cb = {
.i2c_xfer = sensors_impl_i2c_xfer,
.delay = sensors_impl_delay,
},
.pdev = (void *)0x76,
.cb =
{
.i2c_xfer = sensors_impl_i2c_xfer,
.delay = sensors_impl_delay,
},
};
int main(void) {
@ -62,7 +54,9 @@ int main(void) {
PRINTF("Hello world!!\r\n");
pah8001_init(&s_pah);
ims_pah8001_init(&s_pah);
ims_pah8001_power(&s_pah, true);
ims_bme280_init(&s_bme);
ims_bme280_init(&s_bmp);
@ -70,19 +64,31 @@ int main(void) {
ims_bme280_config_t dht_cfg;
ims_bme280_preset_config(&dht_cfg, IMS_BME280_PRESET_WEATHER);
ims_bme280_apply_config(&s_bme, &dht_cfg);
ims_bme280_apply_config(&s_bmp, &dht_cfg);
ims_bme280_result_float_t r_bme_float;
ims_bme280_result_float_t r_bmp_float;
ims_bme280_config(&s_bme, &dht_cfg);
ims_bme280_config(&s_bmp, &dht_cfg);
ims_bme280_result_t r_bme_float;
ims_bme280_result_t r_bmp_float;
bool ppg_touched;
uint8_t hr_alg;
for (;;) {
ims_bme280_measure_float(&s_bme, &r_bme_float);
ims_bme280_measure_float(&s_bmp, &r_bmp_float);
ims_bme280_read_forced(&s_bme, &r_bme_float);
ims_bme280_read_forced(&s_bmp, &r_bmp_float);
PRINTF("BME T: %3.2f, H:%3.02f, P: %5.02f\r\n", r_bme_float.temperature, r_bme_float.humidity, r_bme_float.pressure);
PRINTF("BMP T: %3.2f, H:%3.02f, P: %5.02f\r\n", r_bmp_float.temperature, r_bmp_float.humidity, r_bmp_float.pressure);
ims_pah8001_touched(&s_pah, &ppg_touched);
util_systick_delay(500);
if(ppg_touched) {
ims_pah8001_read_alg_hr(&s_pah, IMS_PPG_ALG_A, &hr_alg);
PRINTF("PPG: Touched, ALG_A: %d, ", hr_alg);
ims_pah8001_read_alg_hr(&s_pah, IMS_PPG_ALG_C, &hr_alg);
PRINTF("ALG_C: %d\r\n", hr_alg);
}
PRINTF("BME: %03.02f %03.02f %05.02f\r\n", r_bme_float.temperature, r_bme_float.humidity, r_bme_float.pressure);
PRINTF("BMP: %03.02f --.-- %05.02f\r\n", r_bmp_float.temperature, r_bmp_float.pressure);
util_systick_delay(100);
GPIO_PortToggle(BOARD_INITPINS_LED_R_GPIO, BOARD_INITPINS_LED_R_PORT, BOARD_INITPINS_LED_R_GPIO_PIN_MASK);
}
}

View File

@ -1,4 +1,4 @@
#include "imsensors/sensors_common.h"
#include "imsensors/common/sensors_common.h"
/* SDK drivers */
#include "fsl_i2c.h"
@ -7,7 +7,9 @@
/* Utils */
#include "util_systick.h"
ims_ret_t sensors_impl_i2c_xfer(void *pdev, uint16_t addr, ims_i2c_xfer_desc_t *xfer) {
ims_ret_t sensors_impl_i2c_xfer(void *pdev, ims_i2c_xfer_desc_t *xfer) {
uint16_t addr = ((uint32_t)pdev & 0xFFU);
if (xfer->tx_size > 0) {
if (I2C_MasterStart(I2C0, addr, kI2C_Write) != kStatus_Success) {
goto xfer_fail;