/* * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and * its subsidiaries and affiliates (collectly called MKSEMI). * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form, except as embedded into an MKSEMI * integrated circuit in a product or a software update for such product, * must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials * provided with the distribution. * * 3. Neither the name of MKSEMI nor the names of its contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * 4. This software, with or without modification, must only be used with a * MKSEMI integrated circuit. * * 5. Any software provided in binary form under this license must not be * reverse engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "libc_rom.h" #ifndef STD_LIBC #if defined(__ARMCC_VERSION) static const struct LIBC_ROM_T *libc_rom __attribute__((section(".bss.noinit"))); #elif defined(__ICCARM__) __no_init static const struct LIBC_ROM_T *libc_rom; #elif defined(__GNUC__) static const struct LIBC_ROM_T *libc_rom __attribute__((section(".noinit"))); #else #warning "Confirm compiler version" #endif void update_libc_rom_table(void) { // A4 if (*(const volatile uint32_t *)(0x4000000C) == 0x00000020) { libc_rom = (const struct LIBC_ROM_T *)0x0301d624; } else { libc_rom = (const struct LIBC_ROM_T *)0x0301cf30; } } #if !defined(__ICCARM__) void *memcpy(void *s1, const void *s2, size_t n) { return libc_rom->memcpy(s1, s2, n); } void *memmove(void *s1, const void *s2, size_t n) { return libc_rom->memmove(s1, s2, n); } #endif char *strcpy(char *s1, const char *s2) { return libc_rom->strcpy(s1, s2); } char *strncpy(char *s1, const char *s2, size_t n) { return libc_rom->strncpy(s1, s2, n); } char *strcat(char *s1, const char *s2) { return libc_rom->strcat(s1, s2); } char *strncat(char *s1, const char *s2, size_t n) { return libc_rom->strncat(s1, s2, n); } int memcmp(const void *s1, const void *s2, size_t n) { return libc_rom->memcmp(s1, s2, n); } int strcmp(const char *s1, const char *s2) { return libc_rom->strcmp(s1, s2); } int strncmp(const char *s1, const char *s2, size_t n) { return libc_rom->strncmp(s1, s2, n); } int strcasecmp(const char *s1, const char *s2) { return libc_rom->strcasecmp(s1, s2); } int strncasecmp(const char *s1, const char *s2, size_t n) { return libc_rom->strncasecmp(s1, s2, n); } int strcoll(const char *s1, const char *s2) { return libc_rom->strcoll(s1, s2); } size_t strxfrm(char *s1, const char *s2, size_t n) { return libc_rom->strxfrm(s1, s2, n); } void *memchr(const void *s, int c, size_t n) { return libc_rom->memchr(s, c, n); } char *strchr(const char *s, int c) { return libc_rom->strchr(s, c); } size_t strcspn(const char *s1, const char *s2) { return libc_rom->strcspn(s1, s2); } char *strpbrk(const char *s1, const char *s2) { return libc_rom->strpbrk(s1, s2); } char *strrchr(const char *s, int c) { return libc_rom->strrchr(s, c); } size_t strspn(const char *s1, const char *s2) { return libc_rom->strspn(s1, s2); } char *strstr(const char *s1, const char *s2) { return libc_rom->strstr(s1, s2); } char *strtok(char *s1, const char *s2) { return libc_rom->strtok(s1, s2); } #if !defined(__ICCARM__) void *memset(void *s, int c, size_t n) { return libc_rom->memset(s, c, n); } #endif char *strerror(int errnum) { return libc_rom->strerror(errnum); } size_t strlen(const char *s) { return libc_rom->strlen(s); } size_t strlcpy(char *dst, const char *src, size_t len) { return libc_rom->strlcpy(dst, src, len); } size_t strlcat(char *dst, const char *src, size_t len) { return libc_rom->strlcat(dst, src, len); } int sprintf(char *s, const char *format, ...) { va_list ap; int len; va_start(ap, format); len = libc_rom->vsnprintf(s, -(size_t)s, format, ap); va_end(ap); return (len); } int snprintf(char *s, size_t n, const char *format, ...) { va_list ap; int len; va_start(ap, format); len = libc_rom->vsnprintf(s, n, format, ap); va_end(ap); return (len); } int vsprintf(char *s, const char *format, va_list arg) { return libc_rom->vsprintf(s, format, arg); } int vsnprintf(char *s, size_t n, const char *format, va_list arg) { return libc_rom->vsnprintf(s, n, format, arg); } int sscanf(const char *s, const char *format, ...) { va_list args; int i; va_start(args, format); i = libc_rom->vsscanf(s, format, args); va_end(args); return i; } int vsscanf(const char *s, const char *format, va_list arg) { return libc_rom->vsscanf(s, format, arg); } double atof(const char *nptr) { return libc_rom->atof(nptr); } int atoi(const char *nptr) { return libc_rom->atoi(nptr); } long int atol(const char *nptr) { return libc_rom->atol(nptr); } long long atoll(const char *nptr) { return libc_rom->atoll(nptr); } double strtod(const char *nptr, char **endptr) { return libc_rom->strtod(nptr, endptr); } long int strtol(const char *nptr, char **endptr, int base) { return libc_rom->strtol(nptr, endptr, base); } unsigned long int strtoul(const char *nptr, char **endptr, int base) { return libc_rom->strtoul(nptr, endptr, base); } long long strtoll(const char *nptr, char **endptr, int base) { return libc_rom->strtoll(nptr, endptr, base); } unsigned long long strtoull(const char *nptr, char **endptr, int base) { return libc_rom->strtoull(nptr, endptr, base); } int rand(void) { return libc_rom->rand(); } void srand(unsigned int seed) { libc_rom->srand(seed); } void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { return libc_rom->bsearch(key, base, nmemb, size, compar); } void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { libc_rom->qsort(base, nmemb, size, compar); } #if !defined(__ICCARM__) int abs(int j) { return libc_rom->abs(j); } div_t div(int numer, int denom) { return libc_rom->div(numer, denom); } long int labs(long int j) { return libc_rom->labs(j); } ldiv_t ldiv(long int numer, long int denom) { return libc_rom->ldiv(numer, denom); } long long llabs(long long j) { return libc_rom->llabs(j); } lldiv_t lldiv(long long numer, long long denom) { return libc_rom->lldiv(numer, denom); } #endif double acos(double x) { return libc_rom->acos(x); } double asin(double x) { return libc_rom->asin(x); } double atan(double x) { return libc_rom->atan(x); } double atan2(double y, double x) { return libc_rom->atan2(y, x); } double cos(double x) { return libc_rom->cos(x); } double sin(double x) { return libc_rom->sin(x); } double tan(double x) { return libc_rom->tan(x); } double cosh(double x) { return libc_rom->cosh(x); } double sinh(double x) { return libc_rom->sinh(x); } double tanh(double x) { return libc_rom->tanh(x); } double exp(double x) { return libc_rom->exp(x); } double frexp(double value, int *exp) { return libc_rom->frexp(value, exp); } double ldexp(double x, int exp) { return libc_rom->ldexp(x, exp); } double log(double x) { return libc_rom->log(x); } double log10(double x) { return libc_rom->log10(x); } double modf(double value, double *iptr) { return libc_rom->modf(value, iptr); } double pow(double x, double y) { return libc_rom->pow(x, y); } double sqrt(double x) { return libc_rom->sqrt(x); } double ceil(double x) { return libc_rom->ceil(x); } double fabs(double x) { return libc_rom->fabs(x); } double floor(double d) { return libc_rom->floor(d); } double fmod(double x, double y) { return libc_rom->fmod(x, y); } double acosh(double x) { return libc_rom->acosh(x); } double asinh(double x) { return libc_rom->asinh(x); } double atanh(double x) { return libc_rom->atanh(x); } double cbrt(double x) { return libc_rom->cbrt(x); } double erf(double x) { return libc_rom->erf(x); } double erfc(double x) { return libc_rom->erfc(x); } double expm1(double x) { return libc_rom->expm1(x); } double hypot(double x, double y) { return libc_rom->hypot(x, y); } double remainder(double x, double y) { return libc_rom->remainder(x, y); } double rint(double x) { return libc_rom->rint(x); } double scalbln(double x, long int n) { return libc_rom->scalbln(x, n); } float scalblnf(float x, long int n) { return libc_rom->scalblnf(x, n); } long double scalblnl(long double x, long int n) { return libc_rom->scalblnl(x, n); } float fabsf(float x) { return libc_rom->fabsf(x); } float sinf(float x) { return libc_rom->sinf(x); } float cosf(float x) { return libc_rom->cosf(x); } float tanf(float x) { return libc_rom->tanf(x); } float acosf(float x) { return libc_rom->acosf(x); } float asinf(float x) { return libc_rom->asinf(x); } float atanf(float x) { return libc_rom->atanf(x); } float atan2f(float y, float x) { return libc_rom->atan2f(y, x); } float sinhf(float x) { return libc_rom->sinhf(x); } float coshf(float x) { return libc_rom->coshf(x); } float tanhf(float x) { return libc_rom->tanhf(x); } float expf(float x) { return libc_rom->expf(x); } float logf(float x) { return libc_rom->logf(x); } float log10f(float x) { return libc_rom->log10f(x); } float powf(float x, float y) { return libc_rom->powf(x, y); } float sqrtf(float x) { return libc_rom->sqrtf(x); } float ldexpf(float x, int exp) { return libc_rom->ldexpf(x, exp); } float frexpf(float value, int *exp) { return libc_rom->frexpf(value, exp); } float ceilf(float x) { return libc_rom->ceilf(x); } float floorf(float x) { return libc_rom->floorf(x); } float fmodf(float x, float y) { return libc_rom->fmodf(x, y); } float modff(float value, float *iptr) { return libc_rom->modff(value, iptr); } long double acosl(long double x) { return libc_rom->acosl(x); } long double asinl(long double x) { return libc_rom->asinl(x); } long double atanl(long double x) { return libc_rom->atanl(x); } long double atan2l(long double x, long double y) { return libc_rom->atan2l(x, y); } long double ceill(long double x) { return libc_rom->ceill(x); } long double cosl(long double x) { return libc_rom->cosl(x); } long double coshl(long double x) { return libc_rom->coshl(x); } long double expl(long double x) { return libc_rom->expl(x); } long double fabsl(long double x) { return libc_rom->fabsl(x); } long double floorl(long double x) { return libc_rom->floorl(x); } long double fmodl(long double x, long double y) { return libc_rom->fmodl(x, y); } long double frexpl(long double x, int *p) { return libc_rom->frexpl(x, p); } long double ldexpl(long double x, int p) { return libc_rom->ldexpl(x, p); } long double logl(long double x) { return libc_rom->logl(x); } long double log10l(long double x) { return libc_rom->log10l(x); } long double modfl(long double x, long double *p) { return libc_rom->modfl(x, p); } long double powl(long double x, long double y) { return libc_rom->powl(x, y); } long double sinl(long double x) { return libc_rom->sinl(x); } long double sinhl(long double x) { return libc_rom->sinhl(x); } long double sqrtl(long double x) { return libc_rom->sqrtl(x); } long double tanl(long double x) { return libc_rom->tanl(x); } long double tanhl(long double x) { return libc_rom->tanhl(x); } float acoshf(float x) { return libc_rom->acoshf(x); } long double acoshl(long double x) { return libc_rom->acoshl(x); } float asinhf(float x) { return libc_rom->asinhf(x); } long double asinhl(long double x) { return libc_rom->asinhl(x); } float atanhf(float x) { return libc_rom->atanhf(x); } long double atanhl(long double x) { return libc_rom->atanhl(x); } long double copysignl(long double x, long double y) { return libc_rom->copysignl(x, y); } float cbrtf(float x) { return libc_rom->cbrtf(x); } long double cbrtl(long double x) { return libc_rom->cbrtl(x); } float erff(float x) { return libc_rom->erff(x); } long double erfl(long double x) { return libc_rom->erfl(x); } float erfcf(float x) { return libc_rom->erfcf(x); } long double erfcl(long double x) { return libc_rom->erfcl(x); } float expm1f(float x) { return libc_rom->expm1f(x); } long double expm1l(long double x) { return libc_rom->expm1l(x); } float log1pf(float x) { return libc_rom->log1pf(x); } long double log1pl(long double x) { return libc_rom->log1pl(x); } float hypotf(float x, float y) { return libc_rom->hypotf(x, y); } long double hypotl(long double x, long double y) { return libc_rom->hypotl(x, y); } float remainderf(float x, float y) { return libc_rom->remainderf(x, y); } long double remainderl(long double x, long double y) { return libc_rom->remainderl(x, y); } float rintf(float x) { return libc_rom->rintf(x); } long double rintl(long double x) { return libc_rom->rintl(x); } double exp2(double x) { return libc_rom->exp2(x); } float exp2f(float x) { return libc_rom->exp2f(x); } long double exp2l(long double x) { return libc_rom->exp2l(x); } double fdim(double x, double y) { return libc_rom->fdim(x, y); } float fdimf(float x, float y) { return libc_rom->fdimf(x, y); } long double fdiml(long double x, long double y) { return libc_rom->fdiml(x, y); } double fma(double x, double y, double z) { return libc_rom->fma(x, y, z); } float fmaf(float x, float y, float z) { return libc_rom->fmaf(x, y, z); } double fmax(double x, double y) { return libc_rom->fmax(x, y); } float fmaxf(float x, float y) { return libc_rom->fmaxf(x, y); } long double fmaxl(long double x, long double y) { return libc_rom->fmaxl(x, y); } double fmin(double x, double y) { return libc_rom->fmin(x, y); } float fminf(float x, float y) { return libc_rom->fminf(x, y); } long double fminl(long double x, long double y) { return libc_rom->fminl(x, y); } #if !defined(__GNUC__) double log2(double x) { return libc_rom->log2(x); } #endif float log2f(float x) { return libc_rom->log2f(x); } long double log2l(long double x) { return libc_rom->log2l(x); } long lrint(double x) { return libc_rom->lrint(x); } long lrintf(float x) { return libc_rom->lrintf(x); } long long llrint(double x) { return libc_rom->llrint(x); } long long llrintf(float x) { return libc_rom->llrintf(x); } long lround(double x) { return libc_rom->lround(x); } long lroundf(float x) { return libc_rom->lroundf(x); } long long llround(double x) { return libc_rom->llround(x); } long long llroundf(float x) { return libc_rom->llroundf(x); } double nan(const char *tagp) { return libc_rom->nan(tagp); } float nanf(const char *tagp) { return libc_rom->nanf(tagp); } double nearbyint(double x) { return libc_rom->nearbyint(x); } float nearbyintf(float x) { return libc_rom->nearbyintf(x); } long double nearbyintl(long double x) { return libc_rom->nearbyintl(x); } double remquo(double x, double y, int *quo) { return libc_rom->remquo(x, y, quo); } float remquof(float x, float y, int *quo) { return libc_rom->remquof(x, y, quo); } double round(double x) { return libc_rom->round(x); } float roundf(float x) { return libc_rom->roundf(x); } long double roundl(long double x) { return libc_rom->roundl(x); } double tgamma(double x) { return libc_rom->tgamma(x); } float tgammaf(float x) { return libc_rom->tgammaf(x); } long double tgammal(long double x) { return libc_rom->tgammal(x); } double trunc(double x) { return libc_rom->trunc(x); } float truncf(float x) { return libc_rom->truncf(x); } long double truncl(long double x) { return libc_rom->truncl(x); } #else #if defined(__ARMCC_VERSION) static const void *libc_rom __attribute__((section(".bss.noinit"), used)); #endif #endif