mirror of
https://github.com/0xFEEDC0DE64/arduino-esp32.git
synced 2025-07-30 02:37:14 +02:00
Esp32 s3 support (#6341)
Co-authored-by: Jason2866 <24528715+Jason2866@users.noreply.github.com> Co-authored-by: Unexpected Maker <seon@unexpectedmaker.com> Co-authored-by: Rodrigo Garcia <rodrigo.garcia@espressif.com> Co-authored-by: Tomáš Pilný <34927466+PilnyTomas@users.noreply.github.com> Co-authored-by: Pedro Minatel <pedro.minatel@espressif.com> Co-authored-by: Ivan Grokhotkov <ivan@espressif.com> Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> Co-authored-by: Limor "Ladyada" Fried <limor@ladyada.net>
This commit is contained in:
@ -0,0 +1,171 @@
|
||||
|
||||
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// 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 _dspi_dotprod_H_
|
||||
#define _dspi_dotprod_H_
|
||||
|
||||
#include "esp_log.h"
|
||||
#include "dsp_err.h"
|
||||
#include "dsp_types.h"
|
||||
#include "dspi_dotprod_platform.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/**@{*/
|
||||
/**
|
||||
* @brief dot product of two images
|
||||
* Dot product calculation for two floating point images: *out_value += image[i*...] * src2[i*...]); i= [0..count_x*count_y)
|
||||
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
||||
* The extension (_ae32) is optimized for ESP32 chip.
|
||||
*
|
||||
* @param[in] in_image descriptor of the image
|
||||
* @param[in] filter descriptor of the filter
|
||||
* @param[out] out_value pointer to the output value
|
||||
* @param[in] count_x amount of samples by X axis (count_x*step_X <= widdth)
|
||||
* @param[in] count_y amount of samples by Y axis (count_y*step_Y <= height)
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
* - One of the error codes from DSP library
|
||||
*/
|
||||
esp_err_t dspi_dotprod_f32_ansi(image2d_t* in_image, image2d_t* filter, float *out_value, int count_x, int count_y);
|
||||
/**@}*/
|
||||
|
||||
/**@{*/
|
||||
/**
|
||||
* @brief dot product of two images
|
||||
* Dot product calculation for two floating point images: *out_value += image[i*...] * src2[i*...]); i= [0..count_x*count_y)
|
||||
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
||||
* The extension (_ae32) is optimized for ESP32 chip.
|
||||
*
|
||||
* @param[in] in_image descriptor of the image
|
||||
* @param[in] filter descriptor of the filter
|
||||
* @param[out] out_value pointer to the output value
|
||||
* @param[in] count_x amount of samples by X axis (count_x*step_X <= widdth)
|
||||
* @param[in] count_y amount of samples by Y axis (count_y*step_Y <= height)
|
||||
* @param[in] shift - result shift to right, by default must be 15 for int16_t or 7 for int8_t
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
* - One of the error codes from DSP library
|
||||
*/
|
||||
esp_err_t dspi_dotprod_s16_ansi(image2d_t* in_image, image2d_t* filter, int16_t *out_value, int count_x, int count_y, int shift);
|
||||
esp_err_t dspi_dotprod_u16_ansi(image2d_t* in_image, image2d_t* filter, uint16_t *out_value, int count_x, int count_y, int shift);
|
||||
esp_err_t dspi_dotprod_s8_ansi(image2d_t* in_image, image2d_t* filter, int8_t *out_value, int count_x, int count_y, int shift);
|
||||
esp_err_t dspi_dotprod_u8_ansi(image2d_t* in_image, image2d_t* filter, uint8_t *out_value, int count_x, int count_y, int shift);
|
||||
|
||||
esp_err_t dspi_dotprod_s16_aes3(image2d_t* in_image, image2d_t* filter, int16_t *out_value, int count_x, int count_y, int shift);
|
||||
esp_err_t dspi_dotprod_u16_aes3(image2d_t* in_image, image2d_t* filter, uint16_t *out_value, int count_x, int count_y, int shift);
|
||||
esp_err_t dspi_dotprod_s8_aes3(image2d_t* in_image, image2d_t* filter, int8_t *out_value, int count_x, int count_y, int shift);
|
||||
esp_err_t dspi_dotprod_u8_aes3(image2d_t* in_image, image2d_t* filter, uint8_t *out_value, int count_x, int count_y, int shift);
|
||||
|
||||
|
||||
/**@}*/
|
||||
|
||||
/**@{*/
|
||||
/**
|
||||
* @brief dot product of two images with input offset
|
||||
* Dot product calculation for two floating point images: *out_value += (image[i*...] + offset) * src2[i*...]); i= [0..count_x*count_y)
|
||||
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
||||
* The extension (_ae32) is optimized for ESP32 chip.
|
||||
*
|
||||
* @param[in] in_image descriptor of the image
|
||||
* @param[in] filter descriptor of the filter
|
||||
* @param[out] out_value pointer to the output value
|
||||
* @param[in] count_x amount of samples by X axis (count_x*step_X <= widdth)
|
||||
* @param[in] count_y amount of samples by Y axis (count_y*step_Y <= height)
|
||||
* @param[in] offset - input offset value.
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
* - One of the error codes from DSP library
|
||||
*/
|
||||
esp_err_t dspi_dotprod_off_f32_ansi(image2d_t* in_image, image2d_t* filter, float *out_value, int count_x, int count_y, float offset);
|
||||
/**@}*/
|
||||
|
||||
/**@{*/
|
||||
/**
|
||||
* @brief dot product of two images with input offset
|
||||
* Dot product calculation for two floating point images: *out_value += (image[i*...] + offset) * src2[i*...]); i= [0..count_x*count_y)
|
||||
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
||||
* The extension (_ae32) is optimized for ESP32 chip.
|
||||
*
|
||||
* @param[in] in_image descriptor of the image
|
||||
* @param[in] filter descriptor of the filter
|
||||
* @param[out] out_value pointer to the output value
|
||||
* @param[in] count_x amount of samples by X axis (count_x*step_X <= widdth)
|
||||
* @param[in] count_y amount of samples by Y axis (count_y*step_Y <= height)
|
||||
* @param[in] shift - result shift to right, by default must be 15 for int16_t or 7 for int8_t
|
||||
* @param[in] offset - input offset value.
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
* - One of the error codes from DSP library
|
||||
*/
|
||||
esp_err_t dspi_dotprod_off_s16_ansi(image2d_t* in_image, image2d_t* filter, int16_t *out_value, int count_x, int count_y, int shift, int16_t offset);
|
||||
esp_err_t dspi_dotprod_off_u16_ansi(image2d_t* in_image, image2d_t* filter, uint16_t *out_value, int count_x, int count_y, int shift, uint16_t offset);
|
||||
esp_err_t dspi_dotprod_off_s8_ansi(image2d_t* in_image, image2d_t* filter, int8_t *out_value, int count_x, int count_y, int shift, int8_t offset);
|
||||
esp_err_t dspi_dotprod_off_u8_ansi(image2d_t* in_image, image2d_t* filter, uint8_t *out_value, int count_x, int count_y, int shift, uint8_t offset);
|
||||
|
||||
esp_err_t dspi_dotprod_off_s16_aes3(image2d_t* in_image, image2d_t* filter, int16_t *out_value, int count_x, int count_y, int shift, int16_t offset);
|
||||
esp_err_t dspi_dotprod_off_u16_aes3(image2d_t* in_image, image2d_t* filter, uint16_t *out_value, int count_x, int count_y, int shift, uint16_t offset);
|
||||
esp_err_t dspi_dotprod_off_s8_aes3(image2d_t* in_image, image2d_t* filter, int8_t *out_value, int count_x, int count_y, int shift, int8_t offset);
|
||||
esp_err_t dspi_dotprod_off_u8_aes3(image2d_t* in_image, image2d_t* filter, uint8_t *out_value, int count_x, int count_y, int shift, uint8_t offset);
|
||||
/**@}*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_DSP_OPTIMIZED
|
||||
#define dspi_dotprod_f32 dspi_dotprod_f32_ansi
|
||||
#define dspi_dotprod_off_f32 dspi_dotprod_off_f32_ansi
|
||||
#if (dspi_dotprod_aes3_enabled == 1)
|
||||
#define dspi_dotprod_s16 dspi_dotprod_s16_aes3
|
||||
#define dspi_dotprod_u16 dspi_dotprod_u16_aes3
|
||||
#define dspi_dotprod_s8 dspi_dotprod_s8_aes3
|
||||
#define dspi_dotprod_u8 dspi_dotprod_u8_aes3
|
||||
#define dspi_dotprod_off_s16 dspi_dotprod_off_s16_aes3
|
||||
#define dspi_dotprod_off_s8 dspi_dotprod_off_s8_aes3
|
||||
#define dspi_dotprod_off_u16 dspi_dotprod_off_u16_aes3
|
||||
#define dspi_dotprod_off_u8 dspi_dotprod_off_u8_aes3
|
||||
#else
|
||||
#define dspi_dotprod_s16 dspi_dotprod_s16_ansi
|
||||
#define dspi_dotprod_s8 dspi_dotprod_s8_ansi
|
||||
#define dspi_dotprod_u16 dspi_dotprod_u16_ansi
|
||||
#define dspi_dotprod_u8 dspi_dotprod_u8_ansi
|
||||
#define dspi_dotprod_off_s16 dspi_dotprod_off_s16_ansi
|
||||
#define dspi_dotprod_off_s8 dspi_dotprod_off_s8_ansi
|
||||
#define dspi_dotprod_off_u16 dspi_dotprod_off_u16_ansi
|
||||
#define dspi_dotprod_off_u8 dspi_dotprod_off_u8_ansi
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_DSP_ANSI
|
||||
#define dspi_dotprod_f32 dspi_dotprod_f32_ansi
|
||||
#define dspi_dotprod_off_f32 dspi_dotprod_off_f32_ansi
|
||||
#define dspi_dotprod_s16 dspi_dotprod_s16_ansi
|
||||
#define dspi_dotprod_s8 dspi_dotprod_s8_ansi
|
||||
#define dspi_dotprod_off_s16 dspi_dotprod_off_s16_ansi
|
||||
#define dspi_dotprod_off_s8 dspi_dotprod_off_s8_ansi
|
||||
#define dspi_dotprod_u16 dspi_dotprod_u16_ansi
|
||||
#define dspi_dotprod_u8 dspi_dotprod_u8_ansi
|
||||
#define dspi_dotprod_off_u16 dspi_dotprod_off_u16_ansi
|
||||
#define dspi_dotprod_off_u8 dspi_dotprod_off_u8_ansi
|
||||
#endif
|
||||
|
||||
|
||||
#endif // _dspi_dotprod_H_
|
@ -0,0 +1,16 @@
|
||||
#ifndef _dspi_dotprod_platform_H_
|
||||
#define _dspi_dotprod_platform_H_
|
||||
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#include <xtensa/config/core-isa.h>
|
||||
#include <xtensa/config/core-matmap.h>
|
||||
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32S3
|
||||
#define dspi_dotprod_aes3_enabled 1
|
||||
#endif
|
||||
#endif // __XTENSA__
|
||||
|
||||
#endif // _dspi_dotprod_platform_H_
|
@ -0,0 +1,120 @@
|
||||
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// 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 _DSPI_DOTPROD_H_
|
||||
#define _DSPI_DOTPROD_H_
|
||||
|
||||
#include "esp_log.h"
|
||||
#include "dsp_err.h"
|
||||
|
||||
#include "dsps_dotprod_platform.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
// These functions calculates dotproduct of two vectors.
|
||||
|
||||
/**@{*/
|
||||
/**
|
||||
* @brief dot product of two 16 bit vectors
|
||||
* Dot product calculation for two signed 16 bit arrays: *dest += (src1[i] * src2[i]) >> (15-shift); i= [0..N)
|
||||
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
||||
* The extension (_ae32) is optimized for ESP32 chip.
|
||||
*
|
||||
* @param[in] src1 source array 1
|
||||
* @param[in] src2 source array 2
|
||||
* @param dest destination pointer
|
||||
* @param[in] len length of input arrays
|
||||
* @param[in] shift shift of the result.
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
* - One of the error codes from DSP library
|
||||
*/
|
||||
esp_err_t dsps_dotprod_s16_ansi(const int16_t *src1, const int16_t *src2, int16_t *dest, int len, int8_t shift);
|
||||
esp_err_t dsps_dotprod_s16_ae32(const int16_t *src1, const int16_t *src2, int16_t *dest, int len, int8_t shift);
|
||||
/**@}*/
|
||||
|
||||
|
||||
/**@{*/
|
||||
/**
|
||||
* @brief dot product of two float vectors
|
||||
* Dot product calculation for two floating point arrays: *dest += (src1[i] * src2[i]); i= [0..N)
|
||||
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
||||
* The extension (_ae32) is optimized for ESP32 chip.
|
||||
*
|
||||
* @param[in] src1 source array 1
|
||||
* @param[in] src2 source array 2
|
||||
* @param dest destination pointer
|
||||
* @param[in] len length of input arrays
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
* - One of the error codes from DSP library
|
||||
*/
|
||||
esp_err_t dsps_dotprod_f32_ansi(const float *src1, const float *src2, float *dest, int len);
|
||||
esp_err_t dsps_dotprod_f32_ae32(const float *src1, const float *src2, float *dest, int len);
|
||||
esp_err_t dsps_dotprod_f32_aes3(const float *src1, const float *src2, float *dest, int len);
|
||||
/**@}*/
|
||||
|
||||
/**@{*/
|
||||
/**
|
||||
* @brief dot product of two float vectors with step
|
||||
* Dot product calculation for two floating point arrays: *dest += (src1[i*step1] * src2[i*step2]); i= [0..N)
|
||||
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
||||
* The extension (_ae32) is optimized for ESP32 chip.
|
||||
*
|
||||
* @param[in] src1 source array 1
|
||||
* @param[in] src2 source array 2
|
||||
* @param dest destination pointer
|
||||
* @param[in] len length of input arrays
|
||||
* @param[in] step1 step over elements in first array
|
||||
* @param[in] step2 step over elements in second array
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
* - One of the error codes from DSP library
|
||||
*/
|
||||
esp_err_t dsps_dotprode_f32_ansi(const float *src1, const float *src2, float *dest, int len, int step1, int step2);
|
||||
esp_err_t dsps_dotprode_f32_ae32(const float *src1, const float *src2, float *dest, int len, int step1, int step2);
|
||||
/**@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CONFIG_DSP_OPTIMIZED
|
||||
|
||||
#if (dsps_dotprod_s16_ae32_enabled == 1)
|
||||
#define dsps_dotprod_s16 dsps_dotprod_s16_ae32
|
||||
#else
|
||||
#define dsps_dotprod_s16 dsps_dotprod_s16_ansi
|
||||
#endif // dsps_dotprod_s16_ae32_enabled
|
||||
|
||||
#if (dsps_dotprod_f32_aes3_enabled == 1)
|
||||
#define dsps_dotprod_f32 dsps_dotprod_f32_aes3
|
||||
#define dsps_dotprode_f32 dsps_dotprode_f32_ae32
|
||||
#elif (dotprod_f32_ae32_enabled == 1)
|
||||
#define dsps_dotprod_f32 dsps_dotprod_f32_ae32
|
||||
#define dsps_dotprode_f32 dsps_dotprode_f32_ae32
|
||||
#else
|
||||
#define dsps_dotprod_f32 dsps_dotprod_f32_ansi
|
||||
#define dsps_dotprode_f32 dsps_dotprode_f32_ansi
|
||||
#endif // dsps_dotprod_f32_ae32_enabled
|
||||
|
||||
#else // CONFIG_DSP_OPTIMIZED
|
||||
#define dsps_dotprod_s16 dsps_dotprod_s16_ansi
|
||||
#define dsps_dotprod_f32 dsps_dotprod_f32_ansi
|
||||
#define dsps_dotprode_f32 dsps_dotprode_f32_ansi
|
||||
#endif // CONFIG_DSP_OPTIMIZED
|
||||
|
||||
#endif // _DSPI_DOTPROD_H_
|
@ -0,0 +1,32 @@
|
||||
#ifndef _dsps_dotprod_platform_H_
|
||||
#define _dsps_dotprod_platform_H_
|
||||
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#ifdef __XTENSA__
|
||||
#include <xtensa/config/core-isa.h>
|
||||
#include <xtensa/config/core-matmap.h>
|
||||
|
||||
|
||||
#if ((XCHAL_HAVE_FP == 1) && (XCHAL_HAVE_LOOPS == 1))
|
||||
|
||||
#define dotprod_f32_ae32_enabled 1
|
||||
#define dotprode_f32_ae32_enabled 1
|
||||
|
||||
#endif //
|
||||
|
||||
#if ((XCHAL_HAVE_LOOPS == 1) && (XCHAL_HAVE_MAC16 == 1))
|
||||
|
||||
#define dsps_dotprod_s16_ae32_enabled 1
|
||||
|
||||
#endif //
|
||||
#endif // __XTENSA__
|
||||
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32S3
|
||||
#define dsps_dotprod_s16_aes3_enabled 1
|
||||
#define dsps_dotprod_f32_aes3_enabled 1
|
||||
#endif
|
||||
|
||||
|
||||
#endif // _dsps_dotprod_platform_H_
|
Reference in New Issue
Block a user