diff --git a/targets/TARGET_RDA/TARGET_UNO_91H/lib/LICENSE-permissive-binary-license-1.0.txt b/targets/TARGET_RDA/TARGET_UNO_91H/lib/LICENSE-permissive-binary-license-1.0.txt deleted file mode 100644 index 2d906989d58..00000000000 --- a/targets/TARGET_RDA/TARGET_UNO_91H/lib/LICENSE-permissive-binary-license-1.0.txt +++ /dev/null @@ -1,49 +0,0 @@ -Permissive Binary License - -Version 1.0, September 2018 - -Redistribution. Redistribution and use in binary form, without -modification, are permitted provided that the following conditions are -met: - -1) Redistributions must reproduce the above copyright notice and the - following disclaimer in the documentation and/or other materials - provided with the distribution. - -2) Unless to the extent explicitly permitted by law, no reverse - engineering, decompilation, or disassembly of this software is - permitted. - -3) Redistribution as part of a software development kit must include the - accompanying file named �DEPENDENCIES� and any dependencies listed in - that file. - -4) Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -Limited patent license. The copyright holders (and contributors) grant a -worldwide, non-exclusive, no-charge, royalty-free patent license to -make, have made, use, offer to sell, sell, import, and otherwise -transfer this software, where such license applies only to those patent -claims licensable by the copyright holders (and contributors) that are -necessarily infringed by this software. This patent license shall not -apply to any combinations that include this software. No hardware is -licensed hereunder. - -If you institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the software -itself infringes your patent(s), then your rights granted under this -license shall terminate as of the date such litigation is filed. - -DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS "AS IS." ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDERS 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. \ No newline at end of file diff --git a/targets/TARGET_RDA/TARGET_UNO_91H/lib/README.md b/targets/TARGET_RDA/TARGET_UNO_91H/lib/README.md deleted file mode 100644 index beec4098036..00000000000 --- a/targets/TARGET_RDA/TARGET_UNO_91H/lib/README.md +++ /dev/null @@ -1,7 +0,0 @@ -This directory tree contains binaries build from RDA SDK modified for Mbed OS and released under Permissive Binary License. - -libhal files in the subfolders are generated with toolchains: - -Arm Compiler 5 - version 5.06u1 -GNU Arm Embedded - version 6.3.1 -IAR EWARM - version 7.80.2 \ No newline at end of file diff --git a/targets/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_ARM_STD/libhal.ar b/targets/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_ARM_STD/libhal.ar deleted file mode 100644 index ec1a7e25a98..00000000000 Binary files a/targets/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_ARM_STD/libhal.ar and /dev/null differ diff --git a/targets/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_GCC_ARM/libhal.a b/targets/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_GCC_ARM/libhal.a deleted file mode 100644 index 4a3a8b749a1..00000000000 Binary files a/targets/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_GCC_ARM/libhal.a and /dev/null differ diff --git a/targets/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_IAR/libhal.a b/targets/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_IAR/libhal.a deleted file mode 100644 index 3882386a10d..00000000000 Binary files a/targets/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_IAR/libhal.a and /dev/null differ diff --git a/targets/TARGET_RDA/TARGET_UNO_91H/rda_ccfg_api.c b/targets/TARGET_RDA/TARGET_UNO_91H/rda_ccfg_api.c new file mode 100644 index 00000000000..30525e41ec6 --- /dev/null +++ b/targets/TARGET_RDA/TARGET_UNO_91H/rda_ccfg_api.c @@ -0,0 +1,411 @@ +/* + * Copyright (c) 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#include "rda_ccfg_api.h" +#include "RDA5991H.h" + +#define CLK_FREQ_40M (0x00U) +#define CLK_FREQ_80M (0x01U) +#define CLK_FREQ_160M (0x02U) +#define ADDR2REG(addr) (*((volatile unsigned int *)(addr))) + +#define RF_SPI_REG ADDR2REG(0x4001301CUL) +#define TRAP_CTRL_REG ADDR2REG(0x40011000UL) +#define TRAP0_SRC_REG ADDR2REG(0x40011004UL) +#define TRAP0_DST_REG ADDR2REG(0x40011024UL) +#define TRAP1_SRC_REG ADDR2REG(0x40011008UL) +#define TRAP1_DST_REG ADDR2REG(0x40011028UL) +#define SPIF_CFG_REG ADDR2REG(0x17FFF014UL) + +#define SYS_CPU_CLK CLK_FREQ_160M +#define AHB_BUS_CLK CLK_FREQ_80M + +extern void core_util_critical_section_enter(void); +extern void core_util_critical_section_exit(void); + +static int ChipHwVersion = 0; + +static inline void wr_rf_usb_reg(unsigned char a, unsigned short d, int isusb) +{ + core_util_critical_section_enter(); + while(RF_SPI_REG & (0x01UL << 31)); + while(RF_SPI_REG & (0x01UL << 31)); + RF_SPI_REG = (unsigned int)d | ((unsigned int)a << 16) | (0x01UL << 25) | ((isusb) ? (0x01UL << 27) : 0x00UL); + core_util_critical_section_exit(); +} + +static inline void rd_rf_usb_reg(unsigned char a, unsigned short *d, int isusb) +{ + core_util_critical_section_enter(); + while(RF_SPI_REG & (0x01UL << 31)); + while(RF_SPI_REG & (0x01UL << 31)); + RF_SPI_REG = ((unsigned int)a << 16) | (0x01UL << 24) | (0x01UL << 25) | ((isusb) ? (0x01UL << 27) : 0x00UL); + __asm volatile ("nop"); + while(RF_SPI_REG & (0x01UL << 31)); + while(RF_SPI_REG & (0x01UL << 31)); + *d = (unsigned short)(RF_SPI_REG & 0xFFFFUL); + core_util_critical_section_exit(); +} + +/* Power down the debug-usage I2C */ +static inline void rda_ccfg_pdi2c(void) +{ + unsigned int val = RDA_PINCFG->MUX2; + if(0x00UL == (val & 0x3FUL)) { + RDA_PINCFG->MUX2 = val | 0x09UL; + } + wr_rf_usb_reg(0xA1, 0x0000, 0); +} + +/* Config CPU & Bus clock */ +static inline void rda_ccfg_ck(void) +{ + unsigned short val = 0U, cfg = 0U; + + cfg = (RDA_SCU->CORECFG >> 11) & 0x07U; + rd_rf_usb_reg(0xA4, &val, 0); +#if ((SYS_CPU_CLK == CLK_FREQ_160M) && (AHB_BUS_CLK == CLK_FREQ_80M)) + /* HCLK inv */ + if(((CLK_FREQ_40M << 1) | CLK_FREQ_40M) == cfg) { + val |= (0x01U << 12); + } +#endif /* CLK_FREQ_160M && CLK_FREQ_80M */ + /* Config CPU & BUS clock */ + cfg ^= (((SYS_CPU_CLK << 1) | AHB_BUS_CLK) & 0x07U); + val &= ~(0x07U << 9); /* bit[11:10] = 2'b00:40M, 2'b01:80M, 2'b1x:160M */ + val |= (cfg << 9); /* bit[9] = 1'b0:40M, 1'b1:80M */ + val &= ~(0x01U); /* i2c_wakeup_en */ + wr_rf_usb_reg(0xA4, val, 0); +} + +/* Config SPI flash clock */ +static inline void rda_ccfg_spifck(void) +{ + unsigned int val; + __DSB(); + val = SPIF_CFG_REG & ~(0x00FFUL << 8); + SPIF_CFG_REG = val | (0x0004UL << 8); // divider + __DSB(); +} + +/* Handle abort booting */ +static inline int rda_ccfg_abort_hdlr(void) +{ + int ret = 0; + unsigned short val = 0U; + rd_rf_usb_reg(0xA1, &val, 0); + ret = (int)((val >> 2) & 0x01U); + if(ret) { + unsigned short val2 = 0U; + rd_rf_usb_reg(0xB2, &val2, 0); + wr_rf_usb_reg(0xB2, (val2 | (0x01U << 11)), 0); + RDA_GPIO->PCCTRL |= (0x01UL << 31); // set abort flag + for(val = 0; val < 0x00FFU; val++) { // delay + ; + } + wr_rf_usb_reg(0xB2, (val2 & ~(0x01U << 11)), 0); + } + return ret; +} + +/* Power up the always-on timer */ +void rda_ccfg_aontmr(void) +{ + unsigned short val = 0U; + rd_rf_usb_reg(0xA3, &val, 0); + if (0x00U == (val & (0x01U << 12))) { + wr_rf_usb_reg(0xA3, (val | (0x01U << 12)), 0); + } +} + +/* Config clock source of always-on timer */ +void rda_ccfg_aontmr_cksrc(int cksrc) +{ + unsigned short val; + if(0 == cksrc) { // use lpo 32K clk, hw default + wr_rf_usb_reg(0xDD, 0x5100U, 0); + rd_rf_usb_reg(0xD8, &val, 0); + wr_rf_usb_reg(0xD8, (val & ~(0x03U << 14)), 0); + rd_rf_usb_reg(0xA8, &val, 0); + val |= ((0x01U << 10) | (0x01U << 14)); + wr_rf_usb_reg(0xA8, (val & ~(0x01U << 12)), 0); + } else { // use 6m5xtal 32K clk, more accurate + int idx; + wr_rf_usb_reg(0xDD, 0x8100U, 0); + rd_rf_usb_reg(0xD8, &val, 0); + wr_rf_usb_reg(0xD8, (val | (0x01U << 15)), 0); + for(idx = 0; idx < 5; idx++) { // for dealy + rd_rf_usb_reg(0x00, &val, 0); + } + wr_rf_usb_reg(0xDD, 0x9100U, 0); + rd_rf_usb_reg(0xD8, &val, 0); + wr_rf_usb_reg(0xD8, (val | (0x01U << 15) | (0x01U << 14)), 0); + rd_rf_usb_reg(0xA8, &val, 0); + val &= ~((0x01U << 10) | (0x01U << 14)); + wr_rf_usb_reg(0xA8, (val | (0x01U << 12)), 0); + } +} + +/* Config GPIO6 to dig core */ +void rda_ccfg_gp6(unsigned short cfg) +{ + unsigned short val = 0U; + rd_rf_usb_reg(0xCD, &val, 0); + val &= ~(0x01U << 11); + wr_rf_usb_reg(0xCD, (val | ((cfg & 0x01U) << 11)), 0); +} + +/* Config GPIO7 to dig core */ +void rda_ccfg_gp7(unsigned short cfg) +{ + unsigned short val = 0U; + rd_rf_usb_reg(0xB0, &val, 0); + val &= ~(0x01U << 14); + wr_rf_usb_reg(0xB0, (val | ((cfg & 0x01U) << 14)), 0); +} + +/* Config GPIO6/7/8/9 to pmu intf or dig core */ +void rda_ccfg_gp(unsigned char gp, unsigned short cfg) +{ + unsigned short val = 0U; + unsigned char reg = 0xCDU; + const int ofs_lst[4] = {11, 14, 10, 9}; + if((6 > gp) || (9 < gp)) { + return; + } + if(7 == gp) { + reg = 0xB0U; + } + rd_rf_usb_reg(reg, &val, 0); + val &= ~(0x01U << ofs_lst[gp - 6]); + wr_rf_usb_reg(reg, (val | ((cfg & 0x01U) << ofs_lst[gp - 6])), 0); +} + +/* Set some core config when booting */ +int rda_ccfg_boot(void) +{ + int ret = 1; + int abort_flag = rda_ccfg_abort_hdlr(); + if(!abort_flag) { + rda_ccfg_pdi2c(); + } + /*close usb polling*/ + RDA_GPIO->CTRL &= ~(0x01UL << 12); + rda_ccfg_ck(); + /* Set flash clock */ + rda_ccfg_spifck(); + /* Set aon timer clock source */ + rda_ccfg_aontmr_cksrc(1); + return ret; +} + +/* Reset CPU & Bus clock config */ +void rda_ccfg_ckrst(void) +{ + unsigned short val = 0U; + + rd_rf_usb_reg(0xA4, &val, 0); + /* HCLK inv */ + val &= ~(0x01U << 12); + /* Config CPU clock */ + val &= ~(0x03U << 10); + val |= (0x00U << 10); /* 2'b00:40M, 2'b01:80M, 2'b1x:160M */ + /* Config BUS clock */ + val &= ~(0x01U << 9); + val |= (0x00U << 9); /* 1'b0:40M, 1'b1:80M */ + wr_rf_usb_reg(0xA4, val, 0); +} + +/* Reset peripheral module */ +void rda_ccfg_perrst(void) +{ + unsigned int idx = 0x0FUL; + RDA_SCU->RESETCTRL &= ~(0x01UL << 11); // soft_resetn_bb + for (; idx>0; idx--); + RDA_SCU->RESETCTRL |= (0x01UL << 11); +} + +/* Init ADC module */ +void rda_ccfg_adc_init(void) +{ + unsigned short val = 0U; + rd_rf_usb_reg(0xA3, &val, 0); /* adc en */ + wr_rf_usb_reg(0xA3, (val | (0x01U << 3)), 0); + rd_rf_usb_reg(0xD8, &val, 0); /* clk 6p5m en */ + wr_rf_usb_reg(0xD8, (val | (0x01U << 15)), 0); + rd_rf_usb_reg(0xB7, &val, 0); /* clk 26m en */ + wr_rf_usb_reg(0xB7, (val | (0x01U << 14)), 0); +} + +/* Config GPIO6/7/8 pdn or pup for ADC usage */ +void rda_ccfg_adc_gp(unsigned char gp, unsigned short cfg) +{ + unsigned short val = 0U; + const int ofs_lst[3] = {8, 9, 7}; + if((6 > gp) || (8 < gp)) { + return; + } + rd_rf_usb_reg(0xB2, &val, 0); + val &= ~(0x01U << ofs_lst[gp - 6]); + wr_rf_usb_reg(0xB2, (val | ((cfg & 0x01U) << ofs_lst[gp - 6])), 0); +} + +/* Config GPADC oenb, use be config to 1 in either Normal mode or GPADC mode */ +void rda_ccfg_adc_oenb(unsigned char ch, unsigned short cfg) +{ + unsigned short val = 0U; + unsigned char offset = 0U; + int ver = rda_ccfg_hwver(); + + if ((ch > 1) || (cfg > 1)) + return; + + if (0 == ch) { + offset = 2; + } else { + if (ver <= 2) + offset = 3; + else if (ver >= 4) + offset = 1; + } + + rd_rf_usb_reg(0xB0, &val, 0); + val &= ~(0x01U << offset); + val |= (cfg << offset); + wr_rf_usb_reg(0xB0, val, 0); +} + +/* Read ADC value */ +unsigned short rda_ccfg_adc_read(unsigned char ch) +{ + unsigned short val = 0U; + rd_rf_usb_reg(0xB7, &val, 0); /* set vref */ + val &= ~((0x03U) << 12); /* verf 1.7V */ + if(!((2U == ch) && (rda_ccfg_hwver() <= 4))) { + val |= ((0x02U) << 12); /* verf 2.0V */ + } + wr_rf_usb_reg(0xB7, val, 0); + + rd_rf_usb_reg(0xB6, &val, 0); /* channel select */ + val &= ~((0x03U) << 12); + wr_rf_usb_reg(0xB6, (val | ((ch & 0x03U) << 12)), 0); + + rd_rf_usb_reg(0xB6, &val, 0); /* set read en */ + wr_rf_usb_reg(0xB6, (val | (0x01U << 2)), 0); + for(val = 0; val < 0x0FFU; val++) { // delay + ; + } + rd_rf_usb_reg(0xB6, &val, 0); /* clr read en */ + wr_rf_usb_reg(0xB6, (val & ~(0x01U << 2)), 0); + + do { + rd_rf_usb_reg(0xB7, &val, 0); /* finish loop flag */ + } while(0x00U == (val & (0x01U << 10))); + return (val & 0x03FFU); +} + +/* Free ADC module */ +void rda_ccfg_adc_free(void) +{ + unsigned short val = 0U; + rd_rf_usb_reg(0xA3, &val, 0); /* adc disable */ + wr_rf_usb_reg(0xA3, (val & ~(0x01U << 3)), 0); + rd_rf_usb_reg(0xB7, &val, 0); /* clk 26m disable */ + wr_rf_usb_reg(0xB7, (val & ~(0x01U << 14)), 0); +} + +/* Get abort flag */ +int rda_ccfg_abort_flag(void) +{ + int ret = 0; + if(0x00UL != (RDA_GPIO->PCCTRL & (0x01UL << 31))) { + ret = 1; + } + return ret; +} + +/* Set wdt en */ +void rda_ccfg_wdt_en(void) +{ + unsigned short val = 0U; + rd_rf_usb_reg(0xC8, &val, 0); + wr_rf_usb_reg(0xC8, (val | (0x01U << 13)), 0); +} + +unsigned short rf_reg_read(unsigned short addr) +{ + unsigned short val = 0U; + if(addr <= 0x1FF) { + if((((addr & 0xFFU) >= 0xA0) && ((addr & 0xFFU) <= 0xDF)) || + (addr == 0x30U) || (addr == 0x34U) || (addr == 0x35U)) { /* PMU & RF_30H/34H/35H */ + rd_rf_usb_reg((unsigned char)(addr & 0xFFU), &val, 0); + } else { /* RF */ + char isrun = 0; + rd_rf_usb_reg(0x30U, &val, 0); + isrun = (val & 0x01U) ? 1 : 0; + if(isrun) { + wr_rf_usb_reg(0x02U, (0x5000U | addr), 0); + rd_rf_usb_reg(0x34U, &val, 0); + } else { + if(addr & (0x01U << 8)) { + wr_rf_usb_reg(0x3FU, 1, 0); + } + rd_rf_usb_reg((unsigned char)(addr & 0xFFU), &val, 0); + if(addr & (0x01U << 8)) { + wr_rf_usb_reg(0x3FU, 0, 0); + } + } + } + } + return val; +} + +void rf_reg_write(unsigned short addr, unsigned short val) +{ + if(addr <= 0x1FF) { + if((((addr & 0xFFU) >= 0xA0) && ((addr & 0xFFU) <= 0xDF)) || + (addr == 0x30U) || (addr == 0x34U) || (addr == 0x35U)) { /* PMU & RF_30H/34H/35H */ + wr_rf_usb_reg((unsigned char)(addr & 0xFFU), val, 0); + } else { /* RF */ + char isrun = 0; + rd_rf_usb_reg(0x30U, &val, 0); + isrun = (val & 0x01U) ? 1 : 0; + if(isrun) { + wr_rf_usb_reg(0x32U, val, 0); + wr_rf_usb_reg(0x02U, (0x4000U | addr), 0); + } else { + if(addr & (0x01U << 8)) { + wr_rf_usb_reg(0x3FU, 1, 0); + } + wr_rf_usb_reg((unsigned char)(addr & 0xFFU), val, 0); + if(addr & (0x01U << 8)) { + wr_rf_usb_reg(0x3FU, 0, 0); + } + } + } + } +} + +/* Get chip hw version */ +int rda_ccfg_hwver(void) +{ + if(0 == ChipHwVersion) { + ChipHwVersion = (int)((RDA_GPIO->REVID >> 16) & 0xFFUL) + 1; + } + return ChipHwVersion; +} +