diff --git a/.vscode/settings.json b/.vscode/settings.json index e97a25ad..dd8623b2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -54,6 +54,7 @@ "xlocnum": "cpp", "xmemory": "cpp", "xstddef": "cpp", - "xtr1common": "cpp" + "xtr1common": "cpp", + "global_config.h": "c" } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index dc4d5b26..efaaf21f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ project(${PROJ} C CXX ASM) # config self use headers include(./cmake/macros.internal.cmake) header_directories(${SDK_ROOT}/lib) - +header_directories(${SDK_ROOT}/components) #header_directories(src/${PROJ}) #header_directories(kendryte-standalone-demo/${PROJ}) @@ -34,7 +34,6 @@ include_directories(src/micro/tensorflow/tensorflow/lite/micro/tools/make/downlo # build library first add_subdirectory(lib) -# add_subdirectory(components) add_compile_definitions(TF_LITE_USE_GLOBAL_ROUND) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 32763789..10d8de7f 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -8,12 +8,14 @@ FILE(GLOB_RECURSE LIB_SRC "${CMAKE_CURRENT_LIST_DIR}/bsp/*.h" "${CMAKE_CURRENT_LIST_DIR}/drivers/*.h" "${CMAKE_CURRENT_LIST_DIR}/utils/*.h" + "${CMAKE_CURRENT_LIST_DIR}/components/*.h" "${CMAKE_CURRENT_LIST_DIR}/bsp/*.hpp" "${CMAKE_CURRENT_LIST_DIR}/drivers/*.hpp" "${CMAKE_CURRENT_LIST_DIR}/utils/*.hpp" "${CMAKE_CURRENT_LIST_DIR}/bsp/*.c" "${CMAKE_CURRENT_LIST_DIR}/drivers/*.c" "${CMAKE_CURRENT_LIST_DIR}/utils/*.c" + "${CMAKE_CURRENT_LIST_DIR}/components/*.c" "${CMAKE_CURRENT_LIST_DIR}/bsp/*.cpp" "${CMAKE_CURRENT_LIST_DIR}/drivers/*.cpp" "${CMAKE_CURRENT_LIST_DIR}/utils/*.cpp" diff --git a/lib/components/CMakeLists.txt b/lib/components/CMakeLists.txt new file mode 100644 index 00000000..03f4f7fd --- /dev/null +++ b/lib/components/CMakeLists.txt @@ -0,0 +1,30 @@ +#project(components) + +# create driver library +message("CMAKE_CURRENT_LIST_DIR: ${CMAKE_CURRENT_LIST_DIR}") + +FILE(GLOB_RECURSE LIB_SRC + "${CMAKE_CURRENT_LIST_DIR}/*.h" + "${CMAKE_CURRENT_LIST_DIR}/*.hpp" + "${CMAKE_CURRENT_LIST_DIR}/*.cpp" + "${CMAKE_CURRENT_LIST_DIR}/*.c" + "${CMAKE_CURRENT_LIST_DIR}/*.s" + "${CMAKE_CURRENT_LIST_DIR}/*.S" + ) + +message("LIB_SRC: ${LIB_SRC}") + +FILE(GLOB_RECURSE ASSEMBLY_FILES + "${CMAKE_CURRENT_LIST_DIR}/*.s" + "${CMAKE_CURRENT_LIST_DIR}/*.S" + ) + +include_directories(${CMAKE_CURRENT_LIST_DIR}/boards/include ${CMAKE_CURRENT_LIST_DIR}/boards/m5stick/include ${CMAKE_CURRENT_LIST_DIR}/config) + +SET_PROPERTY(SOURCE ${ASSEMBLY_FILES} PROPERTY LANGUAGE C) +SET_SOURCE_FILES_PROPERTIES(${ASSEMBLY_FILES} PROPERTIES COMPILE_FLAGS "-x assembler-with-cpp -D __riscv64") + +ADD_LIBRARY(components + ${LIB_SRC} + ) +SET_TARGET_PROPERTIES(components PROPERTIES LINKER_LANGUAGE C) diff --git a/lib/components/boards/CMakeLists.txt b/lib/components/boards/CMakeLists.txt new file mode 100644 index 00000000..72895b8e --- /dev/null +++ b/lib/components/boards/CMakeLists.txt @@ -0,0 +1,13 @@ +if(CONFIG_BOARD_M5STICK) + + list(APPEND ADD_INCLUDE "m5stick/include") + aux_source_directory("m5stick/src" ADD_SRCS) + list(APPEND ADD_REQUIREMENTS kendryte_sdk) + +endif() + +list(APPEND ADD_INCLUDE "include") +aux_source_directory("src" BOARDS_SRCS) +list(APPEND ADD_SRCS ${BOARDS_SRCS}) + +register_component() diff --git a/lib/components/boards/Kconfig b/lib/components/boards/Kconfig new file mode 100644 index 00000000..fadddcca --- /dev/null +++ b/lib/components/boards/Kconfig @@ -0,0 +1,30 @@ + +menu "Board config" + + choice BOARD + bool "Select board" + default BOARD_MAIX + config BOARD_MAIX + bool "Select board Maix" + + config BOARD_M5STICK + bool "Select board m5stick" + endchoice + + config LCD_DEFAULT_WIDTH + int "LCD default width" + default 320 + + config LCD_DEFAULT_HEIGHT + int "LCD default height" + default 240 + + config LCD_DEFAULT_FREQ + int "LCD default driver clock frequency" + default 15000000 + + config SENSOR_FREQ + int "Sensor clock(xclk) frequency" + default 24000000 +endmenu + diff --git a/lib/components/boards/include/boards.h b/lib/components/boards/include/boards.h new file mode 100644 index 00000000..38f179c4 --- /dev/null +++ b/lib/components/boards/include/boards.h @@ -0,0 +1,21 @@ +#ifndef __BOARDS_H +#define __BOARDS_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "global_config.h" + +// #define CONFIG_LCD_DEFAULT_FREQ 15000000 +// #define CONFIG_LCD_DEFAULT_WIDTH 320 +// #define CONFIG_LCD_DEFAULT_HEIGHT 240 + +extern int boards_init(); + +#ifdef __cplusplus +} +#endif + +#endif //__BOARDS_H + diff --git a/lib/components/boards/m5stick/include/m5stick.h b/lib/components/boards/m5stick/include/m5stick.h new file mode 100644 index 00000000..df225063 --- /dev/null +++ b/lib/components/boards/m5stick/include/m5stick.h @@ -0,0 +1,17 @@ +#ifndef __M5STICK_H +#define __M5STICK_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "stdbool.h" + +extern bool m5stick_init(); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/lib/components/config/global_build_info_time.h b/lib/components/config/global_build_info_time.h new file mode 100644 index 00000000..69bc9c79 --- /dev/null +++ b/lib/components/config/global_build_info_time.h @@ -0,0 +1,13 @@ + +//compile append define start + +#define BUILD_TIME_YEAR 2020 +#define BUILD_TIME_MONTH 1 +#define BUILD_TIME_DAY 12 +#define BUILD_TIME_HOUR 20 +#define BUILD_TIME_MINUTE 49 +#define BUILD_TIME_SECOND 33 +#define BUILD_TIME_WEEK_OF_DAY 6 +#define BUILD_TIME_YEAR_OF_DAY 12 + +//compile append define end diff --git a/lib/components/config/global_build_info_version.h b/lib/components/config/global_build_info_version.h new file mode 100644 index 00000000..b073027a --- /dev/null +++ b/lib/components/config/global_build_info_version.h @@ -0,0 +1,11 @@ + +//compile append define start + +#define BUILD_VERSION_MAJOR 0 +#define BUILD_VERSION_MINOR 5 +#define BUILD_VERSION_DEV 0 +#define BUILD_VERSION_DEV2 12 +#define BUILD_GIT_COMMIT_ID "g284ce83d6" +#define BUILD_GIT_IS_DIRTY 0 + +//compile append define end diff --git a/lib/components/config/global_config.cmake b/lib/components/config/global_config.cmake new file mode 100644 index 00000000..2594eef5 --- /dev/null +++ b/lib/components/config/global_config.cmake @@ -0,0 +1,23 @@ +# Generated by c_cpp_project_framework(https://github.com/Neutree/c_cpp_project_framework) +### DO NOT edit this file!! ### + +set(CONFIG_TOOLCHAIN_PATH "/opt/kendryte-toolchain/bin") +set(CONFIG_TOOLCHAIN_PREFIX "riscv64-unknown-elf-") +set(CONFIG_BOARD_MAIX "y") +set(CONFIG_BOARD_M5STICK "") +set(CONFIG_LCD_DEFAULT_WIDTH "320") +set(CONFIG_LCD_DEFAULT_HEIGHT "240") +set(CONFIG_LCD_DEFAULT_FREQ "15000000") +set(CONFIG_SENSOR_FREQ "24000000") +set(CONFIG_COMPONENT_DRIVERS_ENABLE "") +set(CONFIG_COMPONENT_KENDRYTE_SDK_ENABLE "y") +set(CONFIG_SDK_LOG_LEVEL "5") +set(CONFIG_FREERTOS_ENABLE "y") +set(CONFIG_STATIC_TASK_CLEAN_UP_ENABLE "") +set(CONFIG_FREERTOS_MALLOC_CUSTOM "") +set(CONFIG_FREEROTS_MINIMUM_STACK_SIZE "2048") +set(CONFIG_MIC_ARRAY_ENABLE "") +set(CONFIG_COMPONENT_MICROPYTHON_ENABLE "") +set(CONFIG_COMPONENT_SPIFFS_ENABLE "") +set(CONFIG_COMPONENT_UTILS_ENABLE "") +set(CONFIGS_LIST CONFIG_TOOLCHAIN_PATH;CONFIG_TOOLCHAIN_PREFIX;CONFIG_BOARD_MAIX;CONFIG_BOARD_M5STICK;CONFIG_LCD_DEFAULT_WIDTH;CONFIG_LCD_DEFAULT_HEIGHT;CONFIG_LCD_DEFAULT_FREQ;CONFIG_SENSOR_FREQ;CONFIG_COMPONENT_DRIVERS_ENABLE;CONFIG_COMPONENT_KENDRYTE_SDK_ENABLE;CONFIG_SDK_LOG_LEVEL;CONFIG_FREERTOS_ENABLE;CONFIG_STATIC_TASK_CLEAN_UP_ENABLE;CONFIG_FREERTOS_MALLOC_CUSTOM;CONFIG_FREEROTS_MINIMUM_STACK_SIZE;CONFIG_MIC_ARRAY_ENABLE;CONFIG_COMPONENT_MICROPYTHON_ENABLE;CONFIG_COMPONENT_SPIFFS_ENABLE;CONFIG_COMPONENT_UTILS_ENABLE) diff --git a/lib/components/config/global_config.h b/lib/components/config/global_config.h new file mode 100644 index 00000000..5a6ae250 --- /dev/null +++ b/lib/components/config/global_config.h @@ -0,0 +1,13 @@ +/* Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib) */ +#define CONFIG_TOOLCHAIN_PATH "/opt/kendryte-toolchain/bin" +#define CONFIG_TOOLCHAIN_PREFIX "riscv64-unknown-elf-" +#define CONFIG_BOARD_M5STICK +#define CONFIG_BOARD_MAIX 1 +#define CONFIG_LCD_DEFAULT_WIDTH 320 +#define CONFIG_LCD_DEFAULT_HEIGHT 240 +#define CONFIG_LCD_DEFAULT_FREQ 15000000 +#define CONFIG_SENSOR_FREQ 24000000 +#define CONFIG_COMPONENT_KENDRYTE_SDK_ENABLE 1 +#define CONFIG_SDK_LOG_LEVEL 5 +#define CONFIG_FREERTOS_ENABLE 1 +#define CONFIG_FREEROTS_MINIMUM_STACK_SIZE 2048 diff --git a/lib/components/config/global_config.mk b/lib/components/config/global_config.mk new file mode 100644 index 00000000..d85c90b7 --- /dev/null +++ b/lib/components/config/global_config.mk @@ -0,0 +1,48 @@ +# Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib) + +# +# Toolchain configuration +# +CONFIG_TOOLCHAIN_PATH="/opt/kendryte-toolchain/bin" +CONFIG_TOOLCHAIN_PREFIX="riscv64-unknown-elf-" +# end of Toolchain configuration + +# +# Components configuration +# + +# +# Board config +# +CONFIG_BOARD_MAIX=y +# CONFIG_BOARD_M5STICK is not set +CONFIG_LCD_DEFAULT_WIDTH=320 +CONFIG_LCD_DEFAULT_HEIGHT=240 +CONFIG_LCD_DEFAULT_FREQ=15000000 +CONFIG_SENSOR_FREQ=24000000 +# end of Board config + +# CONFIG_COMPONENT_DRIVERS_ENABLE is not set +CONFIG_COMPONENT_KENDRYTE_SDK_ENABLE=y + +# +# Kendryte SDK configurations +# +CONFIG_SDK_LOG_LEVEL=5 +CONFIG_FREERTOS_ENABLE=y + +# +# FreeRTOS configurations +# +# CONFIG_STATIC_TASK_CLEAN_UP_ENABLE is not set +# CONFIG_FREERTOS_MALLOC_CUSTOM is not set +CONFIG_FREEROTS_MINIMUM_STACK_SIZE=2048 +# end of FreeRTOS configurations + +# CONFIG_MIC_ARRAY_ENABLE is not set +# end of Kendryte SDK configurations + +# CONFIG_COMPONENT_MICROPYTHON_ENABLE is not set +# CONFIG_COMPONENT_SPIFFS_ENABLE is not set +# CONFIG_COMPONENT_UTILS_ENABLE is not set +# end of Components configuration diff --git a/lib/components/drivers/CMakeLists.txt b/lib/components/drivers/CMakeLists.txt new file mode 100644 index 00000000..8538e717 --- /dev/null +++ b/lib/components/drivers/CMakeLists.txt @@ -0,0 +1,34 @@ +if(CONFIG_COMPONENT_DRIVERS_ENABLE) + + list(APPEND ADD_INCLUDE "flash/include" + "joystick/include" + "lcd/include" + "sd_card/include" + ) + aux_source_directory("flash/src" FLASH_SRCS) + aux_source_directory("joystick/src" JOYSTICK_SRCS) + aux_source_directory("lcd/src" LCD_SRCS) + aux_source_directory("sd_card/src" SD_CARD_SRCS) + + if(CONFIG_WS2812_ENABLE) + list(APPEND ADD_INCLUDE "ws2812/include") + aux_source_directory("ws2812/src" WS2812_SRCS) + list(APPEND ADD_SRCS ${WS2812_SRCS}) + endif() + if(CONFIG_HTPA_ENABLE) + list(APPEND ADD_INCLUDE "htpa/include") + aux_source_directory("htpa/src" HTPA_SRCS) + list(APPEND ADD_SRCS ${HTPA_SRCS}) + endif() + + list(APPEND ADD_SRCS ${FLASH_SRCS} + ${JOYSTICK_SRCS} + ${LCD_SRCS} + ${SD_CARD_SRCS} + ) + + list(APPEND ADD_REQUIREMENTS kendryte_sdk) + + register_component() +endif() + diff --git a/lib/components/drivers/Kconfig b/lib/components/drivers/Kconfig new file mode 100644 index 00000000..26be5926 --- /dev/null +++ b/lib/components/drivers/Kconfig @@ -0,0 +1,28 @@ + + +config COMPONENT_DRIVERS_ENABLE + bool "Enbale drivers component" + default n + select COMPONENT_KENDRYTE_SDK_ENABLE + +menu "Drivers configuration" + depends on COMPONENT_DRIVERS_ENABLE + + menu "SD card" + config SPI_SD_CARD_FORCE_HIGH_SPEED + bool "Force SPI SD card high speed mode" + default y + endmenu + + menu "WS2812" + config WS2812_ENABLE + bool "Enbale ws2812 over i2s component" + default n + endmenu + menu "HTPA thermal sensor" + config HTPA_ENABLE + bool "Enbale HTPA thermal sensor" + default n + endmenu +endmenu + diff --git a/lib/components/drivers/flash/include/w25qxx.h b/lib/components/drivers/flash/include/w25qxx.h new file mode 100644 index 00000000..baa8245c --- /dev/null +++ b/lib/components/drivers/flash/include/w25qxx.h @@ -0,0 +1,114 @@ +/* Copyright 2018 Canaan Inc. + * + * Licensed 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 _W25QXX_H +#define _W25QXX_H + +#include + +/* clang-format off */ +#define DATALENGTH 8 + + +#define w25qxx_FLASH_PAGE_SIZE 256 +#define w25qxx_FLASH_SECTOR_SIZE 4096 +#define w25qxx_FLASH_PAGE_NUM_PER_SECTOR 16 +#define w25qxx_FLASH_CHIP_SIZE (16777216 UL) + +#define WRITE_ENABLE 0x06 +#define WRITE_DISABLE 0x04 +#define READ_REG1 0x05 +#define READ_REG2 0x35 +#define READ_REG3 0x15 +#define WRITE_REG1 0x01 +#define WRITE_REG2 0x31 +#define WRITE_REG3 0x11 +#define READ_DATA 0x03 +#define FAST_READ 0x0B +#define FAST_READ_DUAL_OUTPUT 0x3B +#define FAST_READ_QUAL_OUTPUT 0x6B +#define FAST_READ_DUAL_IO 0xBB +#define FAST_READ_QUAL_IO 0xEB +#define DUAL_READ_RESET 0xFFFF +#define QUAL_READ_RESET 0xFF +#define PAGE_PROGRAM 0x02 +#define QUAD_PAGE_PROGRAM 0x32 +#define SECTOR_ERASE 0x20 +#define BLOCK_32K_ERASE 0x52 +#define BLOCK_64K_ERASE 0xD8 +#define CHIP_ERASE 0x60 +#define READ_ID 0x90 +#define ENABLE_QPI 0x38 +#define EXIT_QPI 0xFF +#define ENABLE_RESET 0x66 +#define RESET_DEVICE 0x99 + +#define REG1_BUSY_MASK 0x01 +#define REG2_QUAL_MASK 0x02 + +#define LETOBE(x) ((x >> 24) | ((x & 0x00FF0000) >> 8) | ((x & 0x0000FF00) << 8) | (x << 24)) +/* clang-format on */ + +/** + * @brief w25qxx operating status enumerate + */ +typedef enum _w25qxx_status +{ + W25QXX_OK = 0, + W25QXX_BUSY, + W25QXX_ERROR, +} w25qxx_status_t; + +/** + * @brief w25qxx read operating enumerate + */ +typedef enum _w25qxx_read +{ + W25QXX_STANDARD = 0, + W25QXX_STANDARD_FAST, + W25QXX_DUAL, + W25QXX_DUAL_FAST, + W25QXX_QUAD, + W25QXX_QUAD_FAST, +} w25qxx_read_t; + +w25qxx_status_t w25qxx_init(uint8_t spi_index, uint8_t spi_ss); +w25qxx_status_t w25qxx_is_busy(void); +w25qxx_status_t w25qxx_chip_erase(void); +w25qxx_status_t w25qxx_enable_quad_mode(void); +w25qxx_status_t w25qxx_disable_quad_mode(void); +w25qxx_status_t w25qxx_sector_erase(uint32_t addr); +w25qxx_status_t w25qxx_32k_block_erase(uint32_t addr); +w25qxx_status_t w25qxx_64k_block_erase(uint32_t addr); +w25qxx_status_t w25qxx_read_status_reg1(uint8_t *reg_data); +w25qxx_status_t w25qxx_read_status_reg2(uint8_t *reg_data); +w25qxx_status_t w25qxx_write_status_reg(uint8_t reg1_data, uint8_t reg2_data); +w25qxx_status_t w25qxx_read_id(uint8_t *manuf_id, uint8_t *device_id); +w25qxx_status_t w25qxx_write_data(uint32_t addr, uint8_t *data_buf, uint32_t length); +w25qxx_status_t w25qxx_write_data_direct(uint32_t addr, uint8_t *data_buf, uint32_t length); +w25qxx_status_t w25qxx_read_data(uint32_t addr, uint8_t *data_buf, uint32_t length, w25qxx_read_t mode); +w25qxx_status_t w25qxx_enable_xip_mode(void); +w25qxx_status_t w25qxx_disable_xip_mode(void); +w25qxx_status_t w25qxx_read_id_dma(uint8_t *manuf_id, uint8_t *device_id); +w25qxx_status_t w25qxx_sector_erase_dma(uint32_t addr); +w25qxx_status_t w25qxx_32k_block_erase_dma(uint32_t addr); +w25qxx_status_t w25qxx_init_dma(uint8_t spi_index, uint8_t spi_ss); +w25qxx_status_t w25qxx_write_data_dma(uint32_t addr, uint8_t *data_buf, uint32_t length); +w25qxx_status_t w25qxx_write_data_direct_dma(uint32_t addr, uint8_t *data_buf, uint32_t length); +w25qxx_status_t w25qxx_read_data_dma(uint32_t addr, uint8_t *data_buf, uint32_t length, w25qxx_read_t mode); +w25qxx_status_t w25qxx_is_busy_dma(void); +w25qxx_status_t w25qxx_enable_quad_mode_dma(void); + +#endif + diff --git a/lib/components/drivers/htpa/include/htpa.h b/lib/components/drivers/htpa/include/htpa.h new file mode 100644 index 00000000..800a8a49 --- /dev/null +++ b/lib/components/drivers/htpa/include/htpa.h @@ -0,0 +1,116 @@ +#ifndef _HTPA_H +#define _HTPA_H + +#include "stdint.h" +#include "sipeed_i2c.h" + + +#include "htpa_32x32d.h" + +#define HTPA_WIDTH HTPA_32X32D_WIDTH +#define HTPA_HEIGHT HTPA_32X32D_HEIGHT +#define HTPA_ADDR HTPA_32X32D_ADDR +#define HTPA_ADDR_EEPROM HTPA_32X32D_ADDR_EEPROM +#define HTPA_EEPROM_I2C_FREQ 400000 + +#define HTPA_CMD_ADDR_CONF 0x01 +#define HTPA_CMD_ADDR_STATUS 0x02 +#define HTPA_CMD_ADDR_TRIM1 0x03 +#define HTPA_CMD_ADDR_TRIM2 0x04 +#define HTPA_CMD_ADDR_TRIM3 0x05 +#define HTPA_CMD_ADDR_TRIM4 0x06 +#define HTPA_CMD_ADDR_TRIM5 0x07 +#define HTPA_CMD_ADDR_TRIM6 0x08 +#define HTPA_CMD_ADDR_TRIM7 0x09 +#define HTPA_CMD_ADDR_DATA1 0x0A +#define HTPA_CMD_ADDR_DATA2 0x0B + +#define HTPA_TABLE_NUMBER 118 +#define HTPA_PCSCALEVAL 100000000 // 10^8 +#define HTPA_NROF_TA_ELEMENTS 7 +#define HTPA_NROF_AD_ELEMENTS 1595 //130 possible due to Program memory, higher values possible if NROFTAELEMENTS is decreased +#define HTPA_TAEQUIDISTANCE 100 //dK +#define HTPA_ADEQUIDISTANCE 64 //dig +#define HTPA_ADEXPBITS 6 //2^HTPA_ADEXPBITS=HTPA_ADEQUIDISTANCE +#define HTPA_TABLEOFFSET 640 + +extern const unsigned int table_temp[HTPA_NROF_AD_ELEMENTS][HTPA_NROF_TA_ELEMENTS]; +extern const unsigned int table_x_ta_temps[HTPA_NROF_TA_ELEMENTS]; +extern const unsigned int table_y_ad_values[HTPA_NROF_AD_ELEMENTS]; + +typedef struct{ + float pix_c_min; + float pix_c_max; + uint8_t grad_scale; + uint16_t table_number; + uint8_t epsilon; + uint8_t calib_mbit; + uint8_t calib_bias; + uint8_t calib_clk; + uint8_t calib_bpa; + uint8_t calib_pu; + uint8_t array_type; + uint16_t vdd_th1; + uint16_t vdd_th2; + float ptat_grad; + float ptat_off; + uint16_t ptat_th1; + uint16_t ptat_th2; + uint8_t vdd_sc_grad; + uint8_t vdd_sc_off; + int8_t global_off; + uint16_t global_gain; + uint32_t device_id; + uint8_t nr_of_def_pix; + + uint32_t vdd_sc_grad_div; + uint32_t vdd_sc_off_div; + uint32_t grad_scale_div; + + // uint8_t dead_pix_mask[12]; + // uint16_t dead_pix_addr[24]; + int16_t vdd_comp_grad[256]; + int16_t vdd_comp_off[256]; + int16_t th_grad[1024]; + int16_t th_off[1024]; + uint16_t p[1024]; +}htpa_eeprom_param_t; + +typedef struct{ + i2c_device_number_t i2c_num; + uint8_t scl_pin; + uint8_t sda_pin; + uint32_t i2c_freq; + uint16_t width; + uint16_t height; + uint32_t mclk; + float ta; + float ptat_mean; + float vdd_mean; + uint8_t adc_resolution; + uint16_t elec_off[258]; // 256 + int32_t v[1024]; + uint8_t temp[258]; + uint8_t temp2[258]; + float pix_c[1024]; + uint16_t ptats[8]; + uint16_t vdd[8]; + + htpa_eeprom_param_t eeprom; + + bool is_init; + bool is_get_elec_off; +}htpa_t; + + + + +int htpa_init(htpa_t* obj, i2c_device_number_t i2c_num, uint8_t scl_pin, uint8_t sda_pin, uint32_t i2c_freq); +void htpa_destroy(htpa_t* obj); +int htpa_snapshot(htpa_t* obj, int32_t** pixels); + +int htpa_read_reg(htpa_t* obj, uint8_t addr); +int htpa_write_reg(htpa_t* obj, uint8_t addr, uint8_t data); + +int htpa_get_eeprom_param(htpa_t* obj); +#endif diff --git a/lib/components/drivers/htpa/include/htpa_32x32d.h b/lib/components/drivers/htpa/include/htpa_32x32d.h new file mode 100644 index 00000000..ef01a9d6 --- /dev/null +++ b/lib/components/drivers/htpa/include/htpa_32x32d.h @@ -0,0 +1,11 @@ +#ifndef _HTPA_32X32D_H +#define _HTPA_32X32D_H + + +#define HTPA_32X32D_WIDTH 32 +#define HTPA_32X32D_HEIGHT 32 +#define HTPA_32X32D_ADDR 0x1A +#define HTPA_32X32D_ADDR_EEPROM 0x50 + + +#endif diff --git a/lib/components/drivers/joystick/include/ps2.h b/lib/components/drivers/joystick/include/ps2.h new file mode 100644 index 00000000..b6dd4928 --- /dev/null +++ b/lib/components/drivers/joystick/include/ps2.h @@ -0,0 +1,85 @@ +#ifndef __PS2_H +#define __PS2_H + +#include +#include + +/* clang-format off */ +#define CTRL_CLK 10 +#define CTRL_CLK_HIGH 10 +#define CTRL_BYTE_DELAY 5 + +//These are our button constants +#define PSB_SELECT 0x0001 +#define PSB_L3 0x0002 +#define PSB_R3 0x0004 +#define PSB_START 0x0008 +#define PSB_PAD_UP 0x0010 +#define PSB_PAD_RIGHT 0x0020 +#define PSB_PAD_DOWN 0x0040 +#define PSB_PAD_LEFT 0x0080 +#define PSB_L2 0x0100 +#define PSB_R2 0x0200 +#define PSB_L1 0x0400 +#define PSB_R1 0x0800 +#define PSB_GREEN 0x1000 +#define PSB_RED 0x2000 +#define PSB_BLUE 0x4000 +#define PSB_PINK 0x8000 +#define PSB_TRIANGLE 0x1000 +#define PSB_CIRCLE 0x2000 +#define PSB_CROSS 0x4000 +#define PSB_SQUARE 0x8000 + +//Guitar button constants +#define UP_STRUM 0x0010 +#define DOWN_STRUM 0x0040 +#define STAR_POWER 0x0100 +#define GREEN_FRET 0x0200 +#define YELLOW_FRET 0x1000 +#define RED_FRET 0x2000 +#define BLUE_FRET 0x4000 +#define ORANGE_FRET 0x8000 +#define WHAMMY_BAR 8 + +//These are stick values +#define PSS_RX 5 +#define PSS_RY 6 +#define PSS_LX 7 +#define PSS_LY 8 + +//These are analog buttons +#define PSAB_PAD_RIGHT 9 +#define PSAB_PAD_UP 11 +#define PSAB_PAD_DOWN 12 +#define PSAB_PAD_LEFT 10 +#define PSAB_L2 19 +#define PSAB_R2 20 +#define PSAB_L1 17 +#define PSAB_R1 18 +#define PSAB_GREEN 13 +#define PSAB_RED 14 +#define PSAB_BLUE 15 +#define PSAB_PINK 16 +#define PSAB_TRIANGLE 13 +#define PSAB_CIRCLE 14 +#define PSAB_CROSS 15 +#define PSAB_SQUARE 16 + +#define SET(x, y) (x |= (1 << y)) +#define CLR(x, y) (x &= (~(1 << y))) +#define CHK(x, y) (x & (1 << y)) +#define TOG(x, y) (x ^= (1 << y)) + +/* clang-format on */ +uint8_t PS2X_Button(uint16_t button); +uint8_t PS2X_Analog(uint8_t button); +void PS2X_confg_io(uint8_t cs, uint8_t clk, uint8_t mosi, uint8_t miso); +uint8_t PS2X_read_gamepad(uint8_t motor1, uint8_t motor2); +uint8_t PS2X_config_gamepad(uint8_t pressures, uint8_t rumble); +uint8_t PS2X_readType(void); +void PS2X_enableRumble(void); +void PS2X_enableRumble(void); +void PS2X_reconfig_gamepad(void); + +#endif diff --git a/lib/components/drivers/lcd/include/font.h b/lib/components/drivers/lcd/include/font.h new file mode 100644 index 00000000..7b30fcb9 --- /dev/null +++ b/lib/components/drivers/lcd/include/font.h @@ -0,0 +1,7 @@ +#ifndef _FONT_H_ +#define _FONT_H_ + +#include + +extern uint8_t const ascii0816[]; +#endif diff --git a/lib/components/drivers/lcd/include/lcd.h b/lib/components/drivers/lcd/include/lcd.h new file mode 100644 index 00000000..493fe1ba --- /dev/null +++ b/lib/components/drivers/lcd/include/lcd.h @@ -0,0 +1,107 @@ +/* Copyright 2018 Canaan Inc. + * + * Licensed 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 _LCD_H_ +#define _LCD_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include +#include "st7789.h" + +#define LCD_SWAP_COLOR_BYTES 1 + +/* clang-format off */ +#define BLACK 0x0000 +#define NAVY 0x0F00 +#define DARKGREEN 0xE003 +#define DARKCYAN 0xEF03 +#define MAROON 0x0078 +#define PURPLE 0x0F78 +#define OLIVE 0xE07B +#define LIGHTGREY 0x18C6 +#define DARKGREY 0xEF7B +#define BLUE 0x1F00 +#define GREEN 0xE007 +#define CYAN 0xFF07 +#define RED 0x00F8 +#define MAGENTA 0x1FF8 +#define YELLOW 0xE0FF +#define WHITE 0xFFFF +#define ORANGE 0x20FD +#define GREENYELLOW 0xE5AF +#define PINK 0x1FF8 +#define USER_COLOR 0x55AA +/* clang-format on */ + +typedef enum _lcd_dir +{ + DIR_XY_RLUD = 0x00, + DIR_YX_RLUD = 0x20, + DIR_XY_LRUD = 0x40, + DIR_YX_LRUD = 0x60, + DIR_XY_RLDU = 0x80, + DIR_YX_RLDU = 0xA0, + DIR_XY_LRDU = 0xC0, + DIR_YX_LRDU = 0xE0, + DIR_XY_MASK = 0x20, + DIR_MASK = 0xE0, +} lcd_dir_t; + +typedef struct _lcd_ctl +{ + uint8_t mode; + uint8_t dir; + uint16_t width; + uint16_t height; + uint16_t start_offset_w0; + uint16_t start_offset_h0; + uint16_t start_offset_w1; + uint16_t start_offset_h1; + uint16_t start_offset_w; + uint16_t start_offset_h; +} lcd_ctl_t; + +extern void lcd_polling_enable(void); +extern void lcd_interrupt_enable(void); +extern int lcd_init(uint32_t freq, bool oct, uint16_t offset_w, uint16_t offset_h, uint16_t offset_w1, uint16_t offset_h1, bool invert_color, uint16_t width, uint16_t height); +extern void lcd_destroy(); +extern void lcd_clear(uint16_t color); +extern void lcd_set_freq(uint32_t freq); +extern uint32_t lcd_get_freq(); +extern void lcd_set_direction(lcd_dir_t dir); +extern void lcd_set_area(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); +extern void lcd_draw_point(uint16_t x, uint16_t y, uint16_t color); +extern void lcd_draw_string(uint16_t x, uint16_t y, char *str, uint16_t color); +extern void lcd_draw_picture(uint16_t x1, uint16_t y1, uint16_t width, uint16_t height, uint32_t *ptr); +extern void lcd_draw_pic_roi(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t rx, uint16_t ry, uint16_t rw, uint16_t rh, uint32_t *ptr); +extern void lcd_draw_pic_gray(uint16_t x1, uint16_t y1, uint16_t width, uint16_t height, uint8_t *ptr); +extern void lcd_draw_pic_grayroi(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t rx, uint16_t ry, uint16_t rw, uint16_t rh, uint8_t *ptr); +extern void lcd_fill_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color); +extern void lcd_draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t width, uint16_t color); +extern void lcd_ram_draw_string(char *str, uint32_t *ptr, uint16_t font_color, uint16_t bg_color); +extern void lcd_ram_cpyimg(char* lcd, int lcdw, char* img, int imgw, int imgh, int x, int y); +extern void lcd_set_offset(uint16_t offset_w, uint16_t offset_h); + +extern uint16_t lcd_get_width(); +extern uint16_t lcd_get_height(); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/lib/components/drivers/lcd/include/st7789.h b/lib/components/drivers/lcd/include/st7789.h new file mode 100644 index 00000000..c8bbd937 --- /dev/null +++ b/lib/components/drivers/lcd/include/st7789.h @@ -0,0 +1,104 @@ +#ifndef _ST7789_H_ +#define _ST7789_H_ + +#include +#include "gpiohs.h" +#include "fpioa.h" +#include "spi.h" + +/* clang-format off */ +#define NO_OPERATION 0x00 +#define SOFTWARE_RESET 0x01 +// #define READ_ID 0x04 +#define READ_STATUS 0x09 +#define READ_POWER_MODE 0x0A +#define READ_MADCTL 0x0B +#define READ_PIXEL_FORMAT 0x0C +#define READ_IMAGE_FORMAT 0x0D +#define READ_SIGNAL_MODE 0x0E +#define READ_SELT_DIAG_RESULT 0x0F +#define SLEEP_ON 0x10 +#define SLEEP_OFF 0x11 +#define PARTIAL_DISPALY_ON 0x12 +#define NORMAL_DISPALY_ON 0x13 +#define INVERSION_DISPALY_OFF 0x20 +#define INVERSION_DISPALY_ON 0x21 +#define GAMMA_SET 0x26 +#define DISPALY_OFF 0x28 +#define DISPALY_ON 0x29 +#define HORIZONTAL_ADDRESS_SET 0x2A +#define VERTICAL_ADDRESS_SET 0x2B +#define MEMORY_WRITE 0x2C +#define COLOR_SET 0x2D +#define MEMORY_READ 0x2E +#define PARTIAL_AREA 0x30 +#define VERTICAL_SCROL_DEFINE 0x33 +#define TEAR_EFFECT_LINE_OFF 0x34 +#define TEAR_EFFECT_LINE_ON 0x35 +#define MEMORY_ACCESS_CTL 0x36 +#define VERTICAL_SCROL_S_ADD 0x37 +#define IDLE_MODE_OFF 0x38 +#define IDLE_MODE_ON 0x39 +#define PIXEL_FORMAT_SET 0x3A +#define WRITE_MEMORY_CONTINUE 0x3C +#define READ_MEMORY_CONTINUE 0x3E +#define SET_TEAR_SCANLINE 0x44 +#define GET_SCANLINE 0x45 +#define WRITE_BRIGHTNESS 0x51 +#define READ_BRIGHTNESS 0x52 +#define WRITE_CTRL_DISPALY 0x53 +#define READ_CTRL_DISPALY 0x54 +#define WRITE_BRIGHTNESS_CTL 0x55 +#define READ_BRIGHTNESS_CTL 0x56 +#define WRITE_MIN_BRIGHTNESS 0x5E +#define READ_MIN_BRIGHTNESS 0x5F +#define READ_ID1 0xDA +#define READ_ID2 0xDB +#define READ_ID3 0xDC +#define RGB_IF_SIGNAL_CTL 0xB0 +#define NORMAL_FRAME_CTL 0xB1 +#define IDLE_FRAME_CTL 0xB2 +#define PARTIAL_FRAME_CTL 0xB3 +#define INVERSION_CTL 0xB4 +#define BLANK_PORCH_CTL 0xB5 +#define DISPALY_FUNCTION_CTL 0xB6 +#define ENTRY_MODE_SET 0xB7 +#define BACKLIGHT_CTL1 0xB8 +#define BACKLIGHT_CTL2 0xB9 +#define BACKLIGHT_CTL3 0xBA +#define BACKLIGHT_CTL4 0xBB +#define BACKLIGHT_CTL5 0xBC +#define BACKLIGHT_CTL7 0xBE +#define BACKLIGHT_CTL8 0xBF +#define POWER_CTL1 0xC0 +#define POWER_CTL2 0xC1 +#define VCOM_CTL1 0xC5 +#define VCOM_CTL2 0xC7 +#define NV_MEMORY_WRITE 0xD0 +#define NV_MEMORY_PROTECT_KEY 0xD1 +#define NV_MEMORY_STATUS_READ 0xD2 +#define READ_ID4 0xD3 +#define POSITIVE_GAMMA_CORRECT 0xE0 +#define NEGATIVE_GAMMA_CORRECT 0xE1 +#define DIGITAL_GAMMA_CTL1 0xE2 +#define DIGITAL_GAMMA_CTL2 0xE3 +#define INTERFACE_CTL 0xF6 + +#define DCX_GPIONUM (31) +#define RST_GPIONUM (30) + +#define SPI_CHANNEL 0 +#define SPI_DMA_CH DMAC_CHANNEL1 +#define LCD_SPI_SLAVE_SELECT 3 +/* clang-format on */ + +void tft_hard_init(uint32_t freq, bool oct); +void tft_set_clk_freq(uint32_t freq); +void tft_write_command(uint8_t cmd); +void tft_write_byte(uint8_t *data_buf, uint32_t length); +void tft_write_half(uint16_t *data_buf, uint32_t length); +void tft_write_word(uint32_t *data_buf, uint32_t length); +void tft_fill_data(uint32_t *data_buf, uint32_t length); +void tft_set_datawidth(uint8_t width); + +#endif diff --git a/lib/components/drivers/sd_card/include/sdcard.h b/lib/components/drivers/sd_card/include/sdcard.h new file mode 100644 index 00000000..f13df7f2 --- /dev/null +++ b/lib/components/drivers/sd_card/include/sdcard.h @@ -0,0 +1,98 @@ +#ifndef _SDCARD_H +#define _SDCARD_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "stdint.h" + +/** + * @brief Card Specific Data: CSD Register + */ + +#define SD_CS_PIN 29 +#define SD_SPI_DEVICE SPI_DEVICE_1 +#define SD_DMA_CH DMAC_CHANNEL0 +#define SD_SS SPI_CHIP_SELECT_1 +typedef struct { + uint8_t CSDStruct; /*!< CSD structure */ + uint8_t SysSpecVersion; /*!< System specification version */ + uint8_t Reserved1; /*!< Reserved */ + uint8_t TAAC; /*!< Data read access-time 1 */ + uint8_t NSAC; /*!< Data read access-time 2 in CLK cycles */ + uint8_t MaxBusClkFrec; /*!< Max. bus clock frequency */ + uint16_t CardComdClasses; /*!< Card command classes */ + uint8_t RdBlockLen; /*!< Max. read data block length */ + uint8_t PartBlockRead; /*!< Partial blocks for read allowed */ + uint8_t WrBlockMisalign; /*!< Write block misalignment */ + uint8_t RdBlockMisalign; /*!< Read block misalignment */ + uint8_t DSRImpl; /*!< DSR implemented */ + uint8_t Reserved2; /*!< Reserved */ + uint32_t DeviceSize; /*!< Device Size */ + uint8_t MaxRdCurrentVDDMin; /*!< Max. read current @ VDD min */ + uint8_t MaxRdCurrentVDDMax; /*!< Max. read current @ VDD max */ + uint8_t MaxWrCurrentVDDMin; /*!< Max. write current @ VDD min */ + uint8_t MaxWrCurrentVDDMax; /*!< Max. write current @ VDD max */ + uint8_t DeviceSizeMul; /*!< Device size multiplier */ + uint8_t EraseGrSize; /*!< Erase group size */ + uint8_t EraseGrMul; /*!< Erase group size multiplier */ + uint8_t WrProtectGrSize; /*!< Write protect group size */ + uint8_t WrProtectGrEnable; /*!< Write protect group enable */ + uint8_t ManDeflECC; /*!< Manufacturer default ECC */ + uint8_t WrSpeedFact; /*!< Write speed factor */ + uint8_t MaxWrBlockLen; /*!< Max. write data block length */ + uint8_t WriteBlockPaPartial; /*!< Partial blocks for write allowed */ + uint8_t Reserved3; /*!< Reserded */ + uint8_t ContentProtectAppli; /*!< Content protection application */ + uint8_t FileFormatGrouop; /*!< File format group */ + uint8_t CopyFlag; /*!< Copy flag (OTP) */ + uint8_t PermWrProtect; /*!< Permanent write protection */ + uint8_t TempWrProtect; /*!< Temporary write protection */ + uint8_t FileFormat; /*!< File Format */ + uint8_t ECC; /*!< ECC code */ + uint8_t CSD_CRC; /*!< CSD CRC */ + uint8_t Reserved4; /*!< always 1*/ + uint8_t CSizeMlut; /*!< */ +} SD_CSD; + +/** + * @brief Card Identification Data: CID Register + */ +typedef struct { + uint8_t ManufacturerID; /*!< ManufacturerID */ + uint16_t OEM_AppliID; /*!< OEM/Application ID */ + uint32_t ProdName1; /*!< Product Name part1 */ + uint8_t ProdName2; /*!< Product Name part2*/ + uint8_t ProdRev; /*!< Product Revision */ + uint32_t ProdSN; /*!< Product Serial Number */ + uint8_t Reserved1; /*!< Reserved1 */ + uint16_t ManufactDate; /*!< Manufacturing Date */ + uint8_t CID_CRC; /*!< CID CRC */ + uint8_t Reserved2; /*!< always 1 */ +} SD_CID; + +/** + * @brief SD Card information + */ +typedef struct { + SD_CSD SD_csd; + SD_CID SD_cid; + uint64_t CardCapacity; /*!< Card Capacity */ + uint32_t CardBlockSize; /*!< Card Block Size */ + uint8_t active; +} SD_CardInfo; + +extern SD_CardInfo cardinfo; + +uint8_t sd_init(void); +uint8_t sd_read_sector(uint8_t *data_buff, uint32_t sector, uint32_t count); +uint8_t sd_write_sector(uint8_t *data_buff, uint32_t sector, uint32_t count); +uint8_t sd_read_sector_dma(uint8_t *data_buff, uint32_t sector, uint32_t count); +uint8_t sd_write_sector_dma(uint8_t *data_buff, uint32_t sector, uint32_t count); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/components/drivers/ws2812/include/ws2812.h b/lib/components/drivers/ws2812/include/ws2812.h new file mode 100644 index 00000000..ec275c97 --- /dev/null +++ b/lib/components/drivers/ws2812/include/ws2812.h @@ -0,0 +1,32 @@ +#ifndef _WS2812_H +#define _WS2812_H + +#include +#include + +#include "i2s.h" + +typedef struct _WS2812_DATA { + uint32_t blue : 8; + uint32_t red : 8; + uint32_t green : 8; + uint32_t reserved : 8; +} __attribute__((packed, aligned(4))) ws2812_data; + +typedef struct _WS2812_INFO { + size_t ws_num; + ws2812_data *ws_buf; +} ws2812_info; + +ws2812_info *ws2812_init_buf(uint32_t num); +bool ws2812_release_buf(ws2812_info *ws); +bool ws2812_clear(ws2812_info *ws); + +void ws2812_i2s_enable_channel(i2s_device_number_t i2s_num, i2s_channel_num_t channel); + +bool ws2812_set_data(ws2812_info *ws, uint32_t num, uint8_t r, uint8_t g, uint8_t b); + +void ws2812_init_i2s(uint8_t pin, i2s_device_number_t i2s_num, i2s_channel_num_t channel); +bool ws2812_send_data_i2s(i2s_device_number_t i2s_num, dmac_channel_number_t dmac_num, ws2812_info *ws); + +#endif \ No newline at end of file diff --git a/lib/components/kendryte_sdk/.gitignore b/lib/components/kendryte_sdk/.gitignore new file mode 100644 index 00000000..f5a5a0e0 --- /dev/null +++ b/lib/components/kendryte_sdk/.gitignore @@ -0,0 +1 @@ +!libs/*.a diff --git a/lib/components/kendryte_sdk/Kconfig b/lib/components/kendryte_sdk/Kconfig new file mode 100644 index 00000000..ad22cf5d --- /dev/null +++ b/lib/components/kendryte_sdk/Kconfig @@ -0,0 +1,36 @@ + + +config COMPONENT_KENDRYTE_SDK_ENABLE + bool "Enable kendryte sdk component" + default y +menu "Kendryte SDK configurations" + depends on COMPONENT_KENDRYTE_SDK_ENABLE + config SDK_LOG_LEVEL + int "log level, 5:LOG_VERBOSE, 4:LOG_DEBUG, 3:LOG_INFO, 2:LOG_WARN, 1:LOG_ERROR, 0:LOG_NONE" + range 0 5 + default 5 + config FREERTOS_ENABLE + bool "Enable FreeRTOS" + default y + menu "FreeRTOS configurations" + depends on FREERTOS_ENABLE + config STATIC_TASK_CLEAN_UP_ENABLE + bool "static task clean up callback" + default n + config FREERTOS_MALLOC_CUSTOM + bool "Use custom malloc method(heap_4.c) instead of libc's(stdlib.h)" + default n + config FREERTOS_HEAP_TOTAL_SIZE + depends on FREERTOS_MALLOC_CUSTOM + int "FreeRTOS heap total size" + default 524288 + config FREEROTS_MINIMUM_STACK_SIZE + int "FreeRTOS minimum stack size" + default 2048 + endmenu + config MIC_ARRAY_ENABLE + bool " Enable mic array module" + default n +endmenu + + diff --git a/lib/components/kendryte_sdk/include/lib_mic.h b/lib/components/kendryte_sdk/include/lib_mic.h new file mode 100644 index 00000000..187ca009 --- /dev/null +++ b/lib/components/kendryte_sdk/include/lib_mic.h @@ -0,0 +1,23 @@ +#ifndef __LIB_MIC_H +#define __LIB_MIC_H + +#pragma once +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +typedef void (*mic_array_calc_done)(void); + +int lib_mic_init(uint8_t dma_ch, mic_array_calc_done cb, uint8_t *thermal_map_data); +int lib_mic_deinit(void); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#endif diff --git a/lib/components/kendryte_sdk/include/sipeed_conf.h b/lib/components/kendryte_sdk/include/sipeed_conf.h new file mode 100644 index 00000000..0a8cb736 --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_conf.h @@ -0,0 +1,6 @@ +#ifndef __SIPEED_CONF_H +#define __SIPEED_CONF_H + +#define K210_DMA_CH_KPU 5 + +#endif \ No newline at end of file diff --git a/lib/components/kendryte_sdk/include/sipeed_conv.h b/lib/components/kendryte_sdk/include/sipeed_conv.h new file mode 100644 index 00000000..bd8360ee --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_conv.h @@ -0,0 +1,21 @@ +#ifndef _SIPEED_CONV_H +#define _SIPEED_CONV_H + +#include +#include +#include +#include +#include "dvp.h" +#include "fpioa.h" +#include "plic.h" +#include "sysctl.h" +#include "uarths.h" +#include "utils.h" +#include "kpu.h" +#include "sipeed_kpu.h" +void layer_conv_init(kpu_task_t* task, uint16_t w, uint16_t h, uint8_t ch_in, uint8_t ch_out, float* conv_data); +void layer_conv_run(kpu_task_t* task, uint8_t* img_src, uint8_t* img_dst, plic_irq_callback_t callback); +void sipeed_conv_init(kpu_task_t* task, uint16_t w, uint16_t h, uint8_t ch_in, uint8_t ch_out, float* conv_data); +void sipeed_conv_run(kpu_task_t* task, uint8_t* img_src, uint8_t* img_dst, plic_irq_callback_t callback); + +#endif diff --git a/lib/components/kendryte_sdk/include/sipeed_gpio.h b/lib/components/kendryte_sdk/include/sipeed_gpio.h new file mode 100644 index 00000000..55d06595 --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_gpio.h @@ -0,0 +1,4 @@ +#ifndef _SIPEEED_GPIO_H +#define _SIPEED_GPIO_H +void test_gpio(void); +#endif /* _SIPEED_GPIO_H */ diff --git a/lib/components/kendryte_sdk/include/sipeed_i2c.h b/lib/components/kendryte_sdk/include/sipeed_i2c.h new file mode 100644 index 00000000..95381551 --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_i2c.h @@ -0,0 +1,16 @@ +#ifndef __MAIX_I2C_H__ +#define __MAIX_I2C_H__ + +#include "i2c.h" + +#define I2C_CON_SPEED_STANDARD 1 // <=100Kbit/s +#define I2C_CON_SPEED_FAST 2 // <=400Kbit/s or <=1000Kbit/s +#define I2C_CON_SPEED_HIGH 3 // <=3.4Mbit/s + +void maix_i2c_init(i2c_device_number_t i2c_num, uint32_t address_width, + uint32_t i2c_clk); +int maix_i2c_send_data(i2c_device_number_t i2c_num, uint32_t slave_address, const uint8_t *send_buf, size_t send_buf_len, uint16_t timeout_ms); +int maix_i2c_recv_data(i2c_device_number_t i2c_num, uint32_t slave_address, const uint8_t *send_buf, size_t send_buf_len, uint8_t *receive_buf, + size_t receive_buf_len, uint16_t timeout_ms); +void maix_i2c_deinit(i2c_device_number_t i2c_num); +#endif //__MAIX_I2C_H__ diff --git a/lib/components/kendryte_sdk/include/sipeed_kpu.h b/lib/components/kendryte_sdk/include/sipeed_kpu.h new file mode 100644 index 00000000..f407a9fb --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_kpu.h @@ -0,0 +1,60 @@ +#ifndef __SIPEED_KPU_H +#define __SIPEED_KPU_H + +#include "kpu.h" + +typedef enum{ + SIPEED_KPU_ERR_NONE = 0, + SIPEED_KPU_ERR_PARAM, + SIPEED_KPU_ERR_KMODEL_VERSION, + SIPEED_KPU_ERR_KMODEL_FORMAT, + SIPEED_KPU_ERR_DECRYPT, + SIPEED_KPU_ERR_READ_FILE, + SIPEED_KPU_ERR_NO_MEM, + SIPEED_KPU_ERR_GET_CONV_LAYER, + SIPEED_KPU_ERR_RUN_MODEL, + SIPEED_KPU_ERR_MODELS_FULL, + SIPEED_KPU_ERR_PERMITION, + SIPEED_KPU_ERR_UNKNOWN, +} sipeed_kpu_err_t; + + + +sipeed_kpu_err_t sipeed_kpu_model_load(void** ctx, uint32_t flash_addr, const char* filename, uint32_t* size); +sipeed_kpu_err_t sipeed_kpu_model_run(void* ctx, const uint8_t *src, dmac_channel_number_t dma_ch, kpu_done_callback_t done_callback, void *userdata); +sipeed_kpu_err_t sipeed_kpu_model_get_input_shape(void* ctx, uint16_t* w, uint16_t* h, uint16_t* ch); +sipeed_kpu_err_t sipeed_kpu_model_get_output_shape(void* ctx, uint16_t* w, uint16_t* h, uint16_t* ch); +sipeed_kpu_err_t sipeed_kpu_get_output(void* ctx, uint32_t index, uint8_t **data, size_t *size); +sipeed_kpu_err_t sipeed_kpu_model_destroy(void** ctx); +sipeed_kpu_err_t sipeed_kpu_model_print_layer_info(void* ctx); +sipeed_kpu_err_t sipeed_kpu_model_get_layer_type(void* ctx, uint32_t index, kpu_model_layer_type_t* type); +sipeed_kpu_err_t sipeed_kpu_model_set_output(void* ctx, uint32_t index, uint32_t layers_length); +kpu_layer_argument_t* sipeed_kpu_model_get_conv_layer(void* ctx, uint32_t index); +int sipeed_kpu_model_get_layer_num(void* ctx); +int sipeed_kpu_model_get_layer_size(void* ctx, uint32_t index); +char sipeed_kpu_model_getdtype_from_type(kpu_model_layer_type_t type); +char* sipeed_kpu_model_getname_from_type(kpu_model_layer_type_t type); + +void sipeed_kpu_face_encode(float* feature, int8_t* compress_feature, uint32_t len); +float sipeed_kpu_face_compare(int8_t* feature0, int8_t* feature1, uint32_t len); + + +/** + * @brief Kpu run for AI( V1 API) + * + * @param[in] task Kpu handler + * @param[in] dma_ch DMA for kpu + * @param[in] src The picture data + * @param[in] dest The result of kpu + * @param[in] callback The callback of kpu + * + * @return result + * - 0 Success + * - Other Fail.Kpu is busy. + */ +int kpu_run(kpu_task_t* task, dmac_channel_number_t dma_ch, const void *src, void* dest, plic_irq_callback_t callback); + + +#endif + + diff --git a/lib/components/kendryte_sdk/include/sipeed_sk9822.h b/lib/components/kendryte_sdk/include/sipeed_sk9822.h new file mode 100644 index 00000000..9e6b2661 --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_sk9822.h @@ -0,0 +1,26 @@ +#ifndef __SK9822_H +#define __SK9822_H + +#include +#include "fpioa.h" +#include "gpiohs.h" +#include +#include +#include "sysctl.h" +#include "fpioa.h" +#include "sleep.h" +#include "uarths.h" +#include "sysctl.h" +#include "timer.h" +#include "plic.h" + +#define SK9822_DAT_GPIONUM 27 +#define SK9822_CLK_GPIONUM 28 + +void sipeed_init_mic_array_led(void); +// void sipeed_calc_voice_strength(uint8_t voice_data[]); +void sk9822_start_frame(void); +void sk9822_stop_frame(void); +void sk9822_send_data(uint32_t data); + +#endif diff --git a/lib/components/kendryte_sdk/include/sipeed_spi.h b/lib/components/kendryte_sdk/include/sipeed_spi.h new file mode 100644 index 00000000..102cc46d --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_spi.h @@ -0,0 +1,110 @@ +#ifndef _SIPEEED_SPI_H +#define _SIPEEED_SPI_H + +#include +#include "sipeed_type.h" + +#define sipeed_spi_device_num_t spi_device_num_t +#define sipeed_spi_work_mode_t spi_work_mode_t +#define sipeed_spi_frame_format_t spi_work_mode_t +#define sipeed_dmac_channel_number_t dmac_channel_number_t +#define sipeed_spi_chip_select_t spi_chip_select_t +#define sipeed_spi_instruction_address_trans_mode_t spi_instruction_address_trans_mode_t +#define sipeed_spi_transfer_width_t spi_transfer_width_t + +void sipeed_spi_init(sipeed_spi_device_num_t spi_num, + sipeed_spi_device_num_t work_mode, + sipeed_spi_device_num_t frame_format, + sipeed_size_t data_bit_length, + sipeed_uint32_t endian); +void sipeed_spi_init_non_standard(sipeed_spi_device_num_t spi_num, + sipeed_uint32_t instruction_length, + sipeed_uint32_t address_length, + sipeed_uint32_t wait_cycles, + sipeed_spi_instruction_address_trans_mode_t instruction_address_trans_mode); + +void sipeed_spi_send_data_standard(sipeed_spi_device_num_t spi_num, + sipeed_spi_chip_select_t chip_select, + const sipeed_uint8_t *cmd_buff, + sipeed_size_t cmd_len, + const sipeed_uint8_t *tx_buff, + sipeed_size_t tx_len); + +void sipeed_spi_receive_data_standard(sipeed_spi_device_num_t spi_num, + sipeed_spi_chip_select_t chip_select, + const sipeed_uint8_t *cmd_buff, + sipeed_size_t cmd_len, + sipeed_uint8_t *rx_buff, + sipeed_size_t rx_len); + +void sipeed_spi_receive_data_multiple(sipeed_spi_device_num_t spi_num, + sipeed_spi_chip_select_t chip_select, + const sipeed_uint32_t *cmd_buff, + sipeed_size_t cmd_len, + sipeed_uint8_t *rx_buff, + sipeed_size_t rx_len); + +void sipeed_spi_send_data_multiple(sipeed_spi_device_num_t spi_num, + sipeed_spi_chip_select_t chip_select, + const sipeed_uint32_t *cmd_buff, + sipeed_size_t cmd_len, + const sipeed_uint8_t *tx_buff, + sipeed_size_t tx_len); + +void sipeed_spi_send_data_standard_dma(sipeed_dmac_channel_number_t channel_num, + sipeed_spi_device_num_t spi_num, + sipeed_spi_chip_select_t chip_select, + const sipeed_uint8_t *cmd_buff, + sipeed_size_t cmd_len, + const sipeed_uint8_t *tx_buff, + sipeed_size_t tx_len); + + + +void sipeed_spi_receive_data_standard_dma(sipeed_dmac_channel_number_t dma_send_channel_num, + sipeed_dmac_channel_number_t dma_receive_channel_num, + sipeed_spi_device_num_t spi_num, + sipeed_spi_chip_select_t chip_select, + const sipeed_uint8_t *cmd_buff, + sipeed_size_t cmd_len, + sipeed_uint8_t *rx_buff, + sipeed_size_t rx_len); + +void sipeed_spi_send_data_multiple_dma(sipeed_dmac_channel_number_t channel_num, + sipeed_spi_device_num_t spi_num, + sipeed_spi_chip_select_t chip_select, + const sipeed_uint32_t *cmd_buff, + sipeed_size_t cmd_len, + const sipeed_uint8_t *tx_buff, + sipeed_size_t tx_len); + +void sipeed_spi_receive_data_multiple_dma(sipeed_dmac_channel_number_t dma_send_channel_num, + sipeed_dmac_channel_number_t dma_receive_channel_num, + sipeed_spi_device_num_t spi_num, + sipeed_spi_chip_select_t chip_select, + const sipeed_uint32_t *cmd_buff, + sipeed_size_t cmd_len, + sipeed_uint8_t *rx_buff, + sipeed_size_t rx_len); + +void sipeed_spi_fill_data_dma(sipeed_dmac_channel_number_t channel_num, + sipeed_spi_device_num_t spi_num, + sipeed_spi_chip_select_t chip_select, + const sipeed_uint32_t *tx_buff, + sipeed_size_t tx_len); + +void sipeed_spi_send_data_normal_dma(sipeed_dmac_channel_number_t channel_num, + sipeed_spi_device_num_t spi_num, + sipeed_spi_chip_select_t chip_select, + const void *tx_buff, + sipeed_size_t tx_len, + sipeed_spi_transfer_width_t spi_transfer_width); + +sipeed_uint32_t sipeed_spi_set_clk_rate(sipeed_spi_device_num_t spi_num, sipeed_uint32_t spi_clk); + +void sipeed_spi_transfer_data_standard(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint8_t *tx_buff,uint8_t *rx_buff, size_t tx_len, size_t rx_len); +void sipeed_spi_deinit(spi_device_num_t spi_num); + + + +#endif /* _SIPEEED_SPI_H */ diff --git a/lib/components/kendryte_sdk/include/sipeed_sys.h b/lib/components/kendryte_sdk/include/sipeed_sys.h new file mode 100644 index 00000000..fe316edf --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_sys.h @@ -0,0 +1,6 @@ +#ifndef __SIPEED_SYS_H +#define __SIPEED_SYS_H + +void sipeed_sys_reset(); + +#endif diff --git a/lib/components/kendryte_sdk/include/sipeed_type.h b/lib/components/kendryte_sdk/include/sipeed_type.h new file mode 100644 index 00000000..b9171b32 --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_type.h @@ -0,0 +1,8 @@ +#ifndef _SIPEEED_TYPE_H +#define _SIPEEED_TYPE_H + +#define sipeed_size_t size_t +#define sipeed_uint32_t uint32_t +#define sipeed_uint8_t uint8_t + +#endif /* _SIPEEED_TYPE_H */ \ No newline at end of file diff --git a/lib/components/kendryte_sdk/include/sipeed_uid.h b/lib/components/kendryte_sdk/include/sipeed_uid.h new file mode 100644 index 00000000..3635aaa0 --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_uid.h @@ -0,0 +1,13 @@ +#ifndef __SIPEED_UID_H +#define __SIPEED_UID_H + +#include "stdint.h" +#include "stdbool.h" + +/** + * get chip uid (32 bytes) + * @param uid uid return value, a 32 bytes uint8_t array + */ +bool sipeed_uid_get(uint8_t* uid); + +#endif diff --git a/lib/components/kendryte_sdk/include/sipeed_yolo2.h b/lib/components/kendryte_sdk/include/sipeed_yolo2.h new file mode 100644 index 00000000..a9454286 --- /dev/null +++ b/lib/components/kendryte_sdk/include/sipeed_yolo2.h @@ -0,0 +1,57 @@ +#ifndef __SIPEED_YOLO2_H +#define __SIPEED_YOLO2_H + +#include + +#include "kpu.h" + +typedef struct +{ + uint32_t obj_number; + struct + { + uint32_t x1; + uint32_t y1; + uint32_t x2; + uint32_t y2; + uint32_t classid; + float prob; + } obj[10]; +} __attribute__((aligned(8))) obj_info_t; + +typedef struct +{ + float threshold; + float nms_value; + uint32_t coords; + uint32_t anchor_number; + float *anchor; + uint32_t image_width; + uint32_t image_height; + uint32_t classes; + uint32_t net_width; + uint32_t net_height; + uint32_t layer_width; + uint32_t layer_height; + uint32_t boxes_number; + uint32_t output_number; + float scale; + float bias; + void *boxes; + //uint8_t *input; + float *output; + float *probs_buf; + float **probs; + float *activate; + float *softmax; +} __attribute__((aligned(8))) region_layer_t; + +typedef void (*callback_draw_box)(uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2, uint32_t class, float prob);; + +int region_layer_init(region_layer_t *rl, void* ctx); +void region_layer_deinit(region_layer_t *rl); +void region_layer_run(region_layer_t *rl, obj_info_t *obj_info); +void region_layer_draw_boxes(region_layer_t *rl, callback_draw_box callback); + + +#endif diff --git a/lib/drivers/include/fpioa.h b/lib/drivers/include/fpioa.h index c602ae99..e118221d 100644 --- a/lib/drivers/include/fpioa.h +++ b/lib/drivers/include/fpioa.h @@ -909,7 +909,7 @@ int fpioa_set_function_raw(int number, fpioa_function_t function); * - 0 Success * - Other Fail */ -int fpioa_set_function(int number, fpioa_function_t function); +extern int fpioa_set_function(int number, fpioa_function_t function); /** * @brief Set tie enable to function diff --git a/src/micro/tensorflow/tensorflow/lite/micro/examples/hello_world/main.cc b/src/micro/tensorflow/tensorflow/lite/micro/examples/hello_world/main.cc index bdf7942a..cdca53ec 100644 --- a/src/micro/tensorflow/tensorflow/lite/micro/examples/hello_world/main.cc +++ b/src/micro/tensorflow/tensorflow/lite/micro/examples/hello_world/main.cc @@ -15,11 +15,33 @@ limitations under the License. #include "tensorflow/lite/micro/examples/hello_world/main_functions.h" +#include "m5stick.h" +#include "lcd.h" +#include "fpioa.h" +#include "global_config.h" + +void setup_lcd(uint16_t fillColor, lcd_dir_t lcdDirection) +{ + fpioa_set_function(21, static_cast<_fpioa_function>(FUNC_GPIOHS0 + RST_GPIONUM)); + fpioa_set_function(20, static_cast<_fpioa_function>(FUNC_GPIOHS0 + DCX_GPIONUM)); + fpioa_set_function(22, static_cast<_fpioa_function>(FUNC_SPI0_SS0 + LCD_SPI_SLAVE_SELECT)); + fpioa_set_function(19, FUNC_SPI0_SCLK); + fpioa_set_function(18, FUNC_SPI0_D0); + + lcd_init(CONFIG_LCD_DEFAULT_FREQ, false, 52, 40, 40, 52, true, CONFIG_LCD_DEFAULT_WIDTH, CONFIG_LCD_DEFAULT_HEIGHT); + lcd_set_direction(lcdDirection); + lcd_clear(fillColor); +} + // This is the default main used on systems that have the standard C entry // point. Other devices (for example FreeRTOS or ESP32) that have different // requirements for entry code (like an app_main function) should specialize // this main.cc file in a target-specific subfolder. int main(int argc, char* argv[]) { + m5stick_init(); + + setup_lcd(BLACK, DIR_YX_LRUD); + setup(); while (true) { loop(); diff --git a/src/micro/tensorflow/tensorflow/lite/micro/examples/hello_world/output_handler.cc b/src/micro/tensorflow/tensorflow/lite/micro/examples/hello_world/output_handler.cc index 466653c6..dbeb3b6d 100644 --- a/src/micro/tensorflow/tensorflow/lite/micro/examples/hello_world/output_handler.cc +++ b/src/micro/tensorflow/tensorflow/lite/micro/examples/hello_world/output_handler.cc @@ -14,9 +14,63 @@ limitations under the License. ==============================================================================*/ #include "tensorflow/lite/micro/examples/hello_world/output_handler.h" +#include "tensorflow/lite/micro/examples/hello_world/constants.h" + +#include "lcd.h" + +// The colors we'll draw +const uint16_t background_color = BLACK; // Red +const uint16_t foreground_color = RED; // Red + +// The size of the dot we'll draw +const int dot_radius = 3; +// Track whether the function has run at least once +bool initialized = false; +// Size of the drawable area +int width; +int height; +// Midpoint of the y axis +int midpoint; +// Pixels per unit of x_value +int x_increment; void HandleOutput(tflite::ErrorReporter* error_reporter, float x_value, float y_value) { + // Do this only once + if (!initialized) { + // Calculate the drawable area to avoid drawing off the edges + width = (int)lcd_get_width() - (dot_radius * 2); + height = (int)lcd_get_height() - (dot_radius * 2); + // Calculate the y axis midpoint + midpoint = height / 2; + // Calculate fractional pixels per unit of x_value + x_increment = static_cast(width) / kXrange; + initialized = true; + } + // Log the current X and Y values error_reporter->Report("x_value: %f, y_value: %f\n", x_value, y_value); + + // Clear the previous drawing + lcd_clear(background_color); + + // Calculate x position, ensuring the dot is not partially offscreen, + // which causes artifacts and crashes + int x_pos = dot_radius + static_cast(x_value * x_increment); + + // Calculate y position, ensuring the dot is not partially offscreen + int y_pos; + if (y_value >= 0) { + // Since the display's y runs from the top down, invert y_value + y_pos = dot_radius + static_cast(midpoint * (1.f - y_value)); + } else { + // For any negative y_value, start drawing from the midpoint + y_pos = + dot_radius + midpoint + static_cast(midpoint * (0.f - y_value)); + } + + // Draw the dot + lcd_fill_rectangle(x_pos - dot_radius, y_pos - dot_radius, + x_pos + dot_radius, y_pos + dot_radius, + foreground_color); }