From 29c31731500c80c6ea09a1f19ab1de56f08ff356 Mon Sep 17 00:00:00 2001 From: Yilin Sun Date: Thu, 7 Dec 2023 20:50:23 +0800 Subject: [PATCH] Added Sensors. Signed-off-by: Yilin Sun --- .gitmodules | 3 + CMakeLists.txt | 50 ++++++++----- SDK | 2 +- arm-none-eabi.cmake | 21 ++++-- lib/lcd | 1 + lib/pixart_pah8001ei/CMakeLists.txt | 14 ---- .../include/pixart_pah8001ei.h | 29 -------- lib/pixart_pah8001ei/src/pixart_pah8001ei.c | 27 ------- lib/sensors | 2 +- src/main.c | 70 ++++++++++--------- src/sensors_impl.c | 6 +- 11 files changed, 93 insertions(+), 132 deletions(-) create mode 160000 lib/lcd delete mode 100644 lib/pixart_pah8001ei/CMakeLists.txt delete mode 100644 lib/pixart_pah8001ei/include/pixart_pah8001ei.h delete mode 100644 lib/pixart_pah8001ei/src/pixart_pah8001ei.c diff --git a/.gitmodules b/.gitmodules index 651cd5e..dfbe97d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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 diff --git a/CMakeLists.txt b/CMakeLists.txt index c9a06b0..028b1ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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() + diff --git a/SDK b/SDK index 5540a4c..ada43e8 160000 --- a/SDK +++ b/SDK @@ -1 +1 @@ -Subproject commit 5540a4c296a16ba1fd7bbe78dec73165903fc94d +Subproject commit ada43e86a127cf8ad552012e98a4eeb63d717606 diff --git a/arm-none-eabi.cmake b/arm-none-eabi.cmake index ab16b40..22be85c 100644 --- a/arm-none-eabi.cmake +++ b/arm-none-eabi.cmake @@ -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() \ No newline at end of file +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") diff --git a/lib/lcd b/lib/lcd new file mode 160000 index 0000000..7d0de59 --- /dev/null +++ b/lib/lcd @@ -0,0 +1 @@ +Subproject commit 7d0de59c3bba1766cc7d2417e5ae11d5a0f82372 diff --git a/lib/pixart_pah8001ei/CMakeLists.txt b/lib/pixart_pah8001ei/CMakeLists.txt deleted file mode 100644 index 601e992..0000000 --- a/lib/pixart_pah8001ei/CMakeLists.txt +++ /dev/null @@ -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}) \ No newline at end of file diff --git a/lib/pixart_pah8001ei/include/pixart_pah8001ei.h b/lib/pixart_pah8001ei/include/pixart_pah8001ei.h deleted file mode 100644 index 171b572..0000000 --- a/lib/pixart_pah8001ei/include/pixart_pah8001ei.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef PIXART_PAH8001EI_H -#define PIXART_PAH8001EI_H - -#include -#include - -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 \ No newline at end of file diff --git a/lib/pixart_pah8001ei/src/pixart_pah8001ei.c b/lib/pixart_pah8001ei/src/pixart_pah8001ei.c deleted file mode 100644 index 9881d14..0000000 --- a/lib/pixart_pah8001ei/src/pixart_pah8001ei.c +++ /dev/null @@ -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; -} \ No newline at end of file diff --git a/lib/sensors b/lib/sensors index 6ee7244..954c38a 160000 --- a/lib/sensors +++ b/lib/sensors @@ -1 +1 @@ -Subproject commit 6ee72440c713226cbcff2e9e148c8f61ea04b3e4 +Subproject commit 954c38ac5a47033762f3ea7d5e1eef86d4265ee8 diff --git a/src/main.c b/src/main.c index 1779aa7..560df48 100644 --- a/src/main.c +++ b/src/main.c @@ -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); } } \ No newline at end of file diff --git a/src/sensors_impl.c b/src/sensors_impl.c index b42c672..4f688be 100644 --- a/src/sensors_impl.c +++ b/src/sensors_impl.c @@ -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;