mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
targets/TARGET_RDA/TARGET_UNO_91H/rda_ccfg_api.c@189:f392fc9709a3, 2019-02-20 (annotated)
- Committer:
- AnnaBridge
- Date:
- Wed Feb 20 22:31:08 2019 +0000
- Revision:
- 189:f392fc9709a3
mbed library release version 165
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 189:f392fc9709a3 | 1 | /* |
AnnaBridge | 189:f392fc9709a3 | 2 | * Copyright (c) 2018, Arm Limited and affiliates. |
AnnaBridge | 189:f392fc9709a3 | 3 | * SPDX-License-Identifier: Apache-2.0 |
AnnaBridge | 189:f392fc9709a3 | 4 | * |
AnnaBridge | 189:f392fc9709a3 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
AnnaBridge | 189:f392fc9709a3 | 6 | * you may not use this file except in compliance with the License. |
AnnaBridge | 189:f392fc9709a3 | 7 | * You may obtain a copy of the License at |
AnnaBridge | 189:f392fc9709a3 | 8 | * |
AnnaBridge | 189:f392fc9709a3 | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
AnnaBridge | 189:f392fc9709a3 | 10 | * |
AnnaBridge | 189:f392fc9709a3 | 11 | * Unless required by applicable law or agreed to in writing, software |
AnnaBridge | 189:f392fc9709a3 | 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
AnnaBridge | 189:f392fc9709a3 | 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
AnnaBridge | 189:f392fc9709a3 | 14 | * See the License for the specific language governing permissions and |
AnnaBridge | 189:f392fc9709a3 | 15 | * limitations under the License. |
AnnaBridge | 189:f392fc9709a3 | 16 | */ |
AnnaBridge | 189:f392fc9709a3 | 17 | |
AnnaBridge | 189:f392fc9709a3 | 18 | #include "rda_ccfg_api.h" |
AnnaBridge | 189:f392fc9709a3 | 19 | #include "RDA5991H.h" |
AnnaBridge | 189:f392fc9709a3 | 20 | |
AnnaBridge | 189:f392fc9709a3 | 21 | #define CLK_FREQ_40M (0x00U) |
AnnaBridge | 189:f392fc9709a3 | 22 | #define CLK_FREQ_80M (0x01U) |
AnnaBridge | 189:f392fc9709a3 | 23 | #define CLK_FREQ_160M (0x02U) |
AnnaBridge | 189:f392fc9709a3 | 24 | #define ADDR2REG(addr) (*((volatile unsigned int *)(addr))) |
AnnaBridge | 189:f392fc9709a3 | 25 | |
AnnaBridge | 189:f392fc9709a3 | 26 | #define RF_SPI_REG ADDR2REG(0x4001301CUL) |
AnnaBridge | 189:f392fc9709a3 | 27 | #define TRAP_CTRL_REG ADDR2REG(0x40011000UL) |
AnnaBridge | 189:f392fc9709a3 | 28 | #define TRAP0_SRC_REG ADDR2REG(0x40011004UL) |
AnnaBridge | 189:f392fc9709a3 | 29 | #define TRAP0_DST_REG ADDR2REG(0x40011024UL) |
AnnaBridge | 189:f392fc9709a3 | 30 | #define TRAP1_SRC_REG ADDR2REG(0x40011008UL) |
AnnaBridge | 189:f392fc9709a3 | 31 | #define TRAP1_DST_REG ADDR2REG(0x40011028UL) |
AnnaBridge | 189:f392fc9709a3 | 32 | #define SPIF_CFG_REG ADDR2REG(0x17FFF014UL) |
AnnaBridge | 189:f392fc9709a3 | 33 | |
AnnaBridge | 189:f392fc9709a3 | 34 | #define SYS_CPU_CLK CLK_FREQ_160M |
AnnaBridge | 189:f392fc9709a3 | 35 | #define AHB_BUS_CLK CLK_FREQ_80M |
AnnaBridge | 189:f392fc9709a3 | 36 | |
AnnaBridge | 189:f392fc9709a3 | 37 | extern void core_util_critical_section_enter(void); |
AnnaBridge | 189:f392fc9709a3 | 38 | extern void core_util_critical_section_exit(void); |
AnnaBridge | 189:f392fc9709a3 | 39 | |
AnnaBridge | 189:f392fc9709a3 | 40 | static int ChipHwVersion = 0; |
AnnaBridge | 189:f392fc9709a3 | 41 | |
AnnaBridge | 189:f392fc9709a3 | 42 | static inline void wr_rf_usb_reg(unsigned char a, unsigned short d, int isusb) |
AnnaBridge | 189:f392fc9709a3 | 43 | { |
AnnaBridge | 189:f392fc9709a3 | 44 | core_util_critical_section_enter(); |
AnnaBridge | 189:f392fc9709a3 | 45 | while(RF_SPI_REG & (0x01UL << 31)); |
AnnaBridge | 189:f392fc9709a3 | 46 | while(RF_SPI_REG & (0x01UL << 31)); |
AnnaBridge | 189:f392fc9709a3 | 47 | RF_SPI_REG = (unsigned int)d | ((unsigned int)a << 16) | (0x01UL << 25) | ((isusb) ? (0x01UL << 27) : 0x00UL); |
AnnaBridge | 189:f392fc9709a3 | 48 | core_util_critical_section_exit(); |
AnnaBridge | 189:f392fc9709a3 | 49 | } |
AnnaBridge | 189:f392fc9709a3 | 50 | |
AnnaBridge | 189:f392fc9709a3 | 51 | static inline void rd_rf_usb_reg(unsigned char a, unsigned short *d, int isusb) |
AnnaBridge | 189:f392fc9709a3 | 52 | { |
AnnaBridge | 189:f392fc9709a3 | 53 | core_util_critical_section_enter(); |
AnnaBridge | 189:f392fc9709a3 | 54 | while(RF_SPI_REG & (0x01UL << 31)); |
AnnaBridge | 189:f392fc9709a3 | 55 | while(RF_SPI_REG & (0x01UL << 31)); |
AnnaBridge | 189:f392fc9709a3 | 56 | RF_SPI_REG = ((unsigned int)a << 16) | (0x01UL << 24) | (0x01UL << 25) | ((isusb) ? (0x01UL << 27) : 0x00UL); |
AnnaBridge | 189:f392fc9709a3 | 57 | __asm volatile ("nop"); |
AnnaBridge | 189:f392fc9709a3 | 58 | while(RF_SPI_REG & (0x01UL << 31)); |
AnnaBridge | 189:f392fc9709a3 | 59 | while(RF_SPI_REG & (0x01UL << 31)); |
AnnaBridge | 189:f392fc9709a3 | 60 | *d = (unsigned short)(RF_SPI_REG & 0xFFFFUL); |
AnnaBridge | 189:f392fc9709a3 | 61 | core_util_critical_section_exit(); |
AnnaBridge | 189:f392fc9709a3 | 62 | } |
AnnaBridge | 189:f392fc9709a3 | 63 | |
AnnaBridge | 189:f392fc9709a3 | 64 | /* Power down the debug-usage I2C */ |
AnnaBridge | 189:f392fc9709a3 | 65 | static inline void rda_ccfg_pdi2c(void) |
AnnaBridge | 189:f392fc9709a3 | 66 | { |
AnnaBridge | 189:f392fc9709a3 | 67 | unsigned int val = RDA_PINCFG->MUX2; |
AnnaBridge | 189:f392fc9709a3 | 68 | if(0x00UL == (val & 0x3FUL)) { |
AnnaBridge | 189:f392fc9709a3 | 69 | RDA_PINCFG->MUX2 = val | 0x09UL; |
AnnaBridge | 189:f392fc9709a3 | 70 | } |
AnnaBridge | 189:f392fc9709a3 | 71 | wr_rf_usb_reg(0xA1, 0x0000, 0); |
AnnaBridge | 189:f392fc9709a3 | 72 | } |
AnnaBridge | 189:f392fc9709a3 | 73 | |
AnnaBridge | 189:f392fc9709a3 | 74 | /* Config CPU & Bus clock */ |
AnnaBridge | 189:f392fc9709a3 | 75 | static inline void rda_ccfg_ck(void) |
AnnaBridge | 189:f392fc9709a3 | 76 | { |
AnnaBridge | 189:f392fc9709a3 | 77 | unsigned short val = 0U, cfg = 0U; |
AnnaBridge | 189:f392fc9709a3 | 78 | |
AnnaBridge | 189:f392fc9709a3 | 79 | cfg = (RDA_SCU->CORECFG >> 11) & 0x07U; |
AnnaBridge | 189:f392fc9709a3 | 80 | rd_rf_usb_reg(0xA4, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 81 | #if ((SYS_CPU_CLK == CLK_FREQ_160M) && (AHB_BUS_CLK == CLK_FREQ_80M)) |
AnnaBridge | 189:f392fc9709a3 | 82 | /* HCLK inv */ |
AnnaBridge | 189:f392fc9709a3 | 83 | if(((CLK_FREQ_40M << 1) | CLK_FREQ_40M) == cfg) { |
AnnaBridge | 189:f392fc9709a3 | 84 | val |= (0x01U << 12); |
AnnaBridge | 189:f392fc9709a3 | 85 | } |
AnnaBridge | 189:f392fc9709a3 | 86 | #endif /* CLK_FREQ_160M && CLK_FREQ_80M */ |
AnnaBridge | 189:f392fc9709a3 | 87 | /* Config CPU & BUS clock */ |
AnnaBridge | 189:f392fc9709a3 | 88 | cfg ^= (((SYS_CPU_CLK << 1) | AHB_BUS_CLK) & 0x07U); |
AnnaBridge | 189:f392fc9709a3 | 89 | val &= ~(0x07U << 9); /* bit[11:10] = 2'b00:40M, 2'b01:80M, 2'b1x:160M */ |
AnnaBridge | 189:f392fc9709a3 | 90 | val |= (cfg << 9); /* bit[9] = 1'b0:40M, 1'b1:80M */ |
AnnaBridge | 189:f392fc9709a3 | 91 | val &= ~(0x01U); /* i2c_wakeup_en */ |
AnnaBridge | 189:f392fc9709a3 | 92 | wr_rf_usb_reg(0xA4, val, 0); |
AnnaBridge | 189:f392fc9709a3 | 93 | } |
AnnaBridge | 189:f392fc9709a3 | 94 | |
AnnaBridge | 189:f392fc9709a3 | 95 | /* Config SPI flash clock */ |
AnnaBridge | 189:f392fc9709a3 | 96 | static inline void rda_ccfg_spifck(void) |
AnnaBridge | 189:f392fc9709a3 | 97 | { |
AnnaBridge | 189:f392fc9709a3 | 98 | unsigned int val; |
AnnaBridge | 189:f392fc9709a3 | 99 | __DSB(); |
AnnaBridge | 189:f392fc9709a3 | 100 | val = SPIF_CFG_REG & ~(0x00FFUL << 8); |
AnnaBridge | 189:f392fc9709a3 | 101 | SPIF_CFG_REG = val | (0x0004UL << 8); // divider |
AnnaBridge | 189:f392fc9709a3 | 102 | __DSB(); |
AnnaBridge | 189:f392fc9709a3 | 103 | } |
AnnaBridge | 189:f392fc9709a3 | 104 | |
AnnaBridge | 189:f392fc9709a3 | 105 | /* Handle abort booting */ |
AnnaBridge | 189:f392fc9709a3 | 106 | static inline int rda_ccfg_abort_hdlr(void) |
AnnaBridge | 189:f392fc9709a3 | 107 | { |
AnnaBridge | 189:f392fc9709a3 | 108 | int ret = 0; |
AnnaBridge | 189:f392fc9709a3 | 109 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 110 | rd_rf_usb_reg(0xA1, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 111 | ret = (int)((val >> 2) & 0x01U); |
AnnaBridge | 189:f392fc9709a3 | 112 | if(ret) { |
AnnaBridge | 189:f392fc9709a3 | 113 | unsigned short val2 = 0U; |
AnnaBridge | 189:f392fc9709a3 | 114 | rd_rf_usb_reg(0xB2, &val2, 0); |
AnnaBridge | 189:f392fc9709a3 | 115 | wr_rf_usb_reg(0xB2, (val2 | (0x01U << 11)), 0); |
AnnaBridge | 189:f392fc9709a3 | 116 | RDA_GPIO->PCCTRL |= (0x01UL << 31); // set abort flag |
AnnaBridge | 189:f392fc9709a3 | 117 | for(val = 0; val < 0x00FFU; val++) { // delay |
AnnaBridge | 189:f392fc9709a3 | 118 | ; |
AnnaBridge | 189:f392fc9709a3 | 119 | } |
AnnaBridge | 189:f392fc9709a3 | 120 | wr_rf_usb_reg(0xB2, (val2 & ~(0x01U << 11)), 0); |
AnnaBridge | 189:f392fc9709a3 | 121 | } |
AnnaBridge | 189:f392fc9709a3 | 122 | return ret; |
AnnaBridge | 189:f392fc9709a3 | 123 | } |
AnnaBridge | 189:f392fc9709a3 | 124 | |
AnnaBridge | 189:f392fc9709a3 | 125 | /* Power up the always-on timer */ |
AnnaBridge | 189:f392fc9709a3 | 126 | void rda_ccfg_aontmr(void) |
AnnaBridge | 189:f392fc9709a3 | 127 | { |
AnnaBridge | 189:f392fc9709a3 | 128 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 129 | rd_rf_usb_reg(0xA3, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 130 | if (0x00U == (val & (0x01U << 12))) { |
AnnaBridge | 189:f392fc9709a3 | 131 | wr_rf_usb_reg(0xA3, (val | (0x01U << 12)), 0); |
AnnaBridge | 189:f392fc9709a3 | 132 | } |
AnnaBridge | 189:f392fc9709a3 | 133 | } |
AnnaBridge | 189:f392fc9709a3 | 134 | |
AnnaBridge | 189:f392fc9709a3 | 135 | /* Config clock source of always-on timer */ |
AnnaBridge | 189:f392fc9709a3 | 136 | void rda_ccfg_aontmr_cksrc(int cksrc) |
AnnaBridge | 189:f392fc9709a3 | 137 | { |
AnnaBridge | 189:f392fc9709a3 | 138 | unsigned short val; |
AnnaBridge | 189:f392fc9709a3 | 139 | if(0 == cksrc) { // use lpo 32K clk, hw default |
AnnaBridge | 189:f392fc9709a3 | 140 | wr_rf_usb_reg(0xDD, 0x5100U, 0); |
AnnaBridge | 189:f392fc9709a3 | 141 | rd_rf_usb_reg(0xD8, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 142 | wr_rf_usb_reg(0xD8, (val & ~(0x03U << 14)), 0); |
AnnaBridge | 189:f392fc9709a3 | 143 | rd_rf_usb_reg(0xA8, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 144 | val |= ((0x01U << 10) | (0x01U << 14)); |
AnnaBridge | 189:f392fc9709a3 | 145 | wr_rf_usb_reg(0xA8, (val & ~(0x01U << 12)), 0); |
AnnaBridge | 189:f392fc9709a3 | 146 | } else { // use 6m5xtal 32K clk, more accurate |
AnnaBridge | 189:f392fc9709a3 | 147 | int idx; |
AnnaBridge | 189:f392fc9709a3 | 148 | wr_rf_usb_reg(0xDD, 0x8100U, 0); |
AnnaBridge | 189:f392fc9709a3 | 149 | rd_rf_usb_reg(0xD8, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 150 | wr_rf_usb_reg(0xD8, (val | (0x01U << 15)), 0); |
AnnaBridge | 189:f392fc9709a3 | 151 | for(idx = 0; idx < 5; idx++) { // for dealy |
AnnaBridge | 189:f392fc9709a3 | 152 | rd_rf_usb_reg(0x00, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 153 | } |
AnnaBridge | 189:f392fc9709a3 | 154 | wr_rf_usb_reg(0xDD, 0x9100U, 0); |
AnnaBridge | 189:f392fc9709a3 | 155 | rd_rf_usb_reg(0xD8, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 156 | wr_rf_usb_reg(0xD8, (val | (0x01U << 15) | (0x01U << 14)), 0); |
AnnaBridge | 189:f392fc9709a3 | 157 | rd_rf_usb_reg(0xA8, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 158 | val &= ~((0x01U << 10) | (0x01U << 14)); |
AnnaBridge | 189:f392fc9709a3 | 159 | wr_rf_usb_reg(0xA8, (val | (0x01U << 12)), 0); |
AnnaBridge | 189:f392fc9709a3 | 160 | } |
AnnaBridge | 189:f392fc9709a3 | 161 | } |
AnnaBridge | 189:f392fc9709a3 | 162 | |
AnnaBridge | 189:f392fc9709a3 | 163 | /* Config GPIO6 to dig core */ |
AnnaBridge | 189:f392fc9709a3 | 164 | void rda_ccfg_gp6(unsigned short cfg) |
AnnaBridge | 189:f392fc9709a3 | 165 | { |
AnnaBridge | 189:f392fc9709a3 | 166 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 167 | rd_rf_usb_reg(0xCD, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 168 | val &= ~(0x01U << 11); |
AnnaBridge | 189:f392fc9709a3 | 169 | wr_rf_usb_reg(0xCD, (val | ((cfg & 0x01U) << 11)), 0); |
AnnaBridge | 189:f392fc9709a3 | 170 | } |
AnnaBridge | 189:f392fc9709a3 | 171 | |
AnnaBridge | 189:f392fc9709a3 | 172 | /* Config GPIO7 to dig core */ |
AnnaBridge | 189:f392fc9709a3 | 173 | void rda_ccfg_gp7(unsigned short cfg) |
AnnaBridge | 189:f392fc9709a3 | 174 | { |
AnnaBridge | 189:f392fc9709a3 | 175 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 176 | rd_rf_usb_reg(0xB0, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 177 | val &= ~(0x01U << 14); |
AnnaBridge | 189:f392fc9709a3 | 178 | wr_rf_usb_reg(0xB0, (val | ((cfg & 0x01U) << 14)), 0); |
AnnaBridge | 189:f392fc9709a3 | 179 | } |
AnnaBridge | 189:f392fc9709a3 | 180 | |
AnnaBridge | 189:f392fc9709a3 | 181 | /* Config GPIO6/7/8/9 to pmu intf or dig core */ |
AnnaBridge | 189:f392fc9709a3 | 182 | void rda_ccfg_gp(unsigned char gp, unsigned short cfg) |
AnnaBridge | 189:f392fc9709a3 | 183 | { |
AnnaBridge | 189:f392fc9709a3 | 184 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 185 | unsigned char reg = 0xCDU; |
AnnaBridge | 189:f392fc9709a3 | 186 | const int ofs_lst[4] = {11, 14, 10, 9}; |
AnnaBridge | 189:f392fc9709a3 | 187 | if((6 > gp) || (9 < gp)) { |
AnnaBridge | 189:f392fc9709a3 | 188 | return; |
AnnaBridge | 189:f392fc9709a3 | 189 | } |
AnnaBridge | 189:f392fc9709a3 | 190 | if(7 == gp) { |
AnnaBridge | 189:f392fc9709a3 | 191 | reg = 0xB0U; |
AnnaBridge | 189:f392fc9709a3 | 192 | } |
AnnaBridge | 189:f392fc9709a3 | 193 | rd_rf_usb_reg(reg, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 194 | val &= ~(0x01U << ofs_lst[gp - 6]); |
AnnaBridge | 189:f392fc9709a3 | 195 | wr_rf_usb_reg(reg, (val | ((cfg & 0x01U) << ofs_lst[gp - 6])), 0); |
AnnaBridge | 189:f392fc9709a3 | 196 | } |
AnnaBridge | 189:f392fc9709a3 | 197 | |
AnnaBridge | 189:f392fc9709a3 | 198 | /* Set some core config when booting */ |
AnnaBridge | 189:f392fc9709a3 | 199 | int rda_ccfg_boot(void) |
AnnaBridge | 189:f392fc9709a3 | 200 | { |
AnnaBridge | 189:f392fc9709a3 | 201 | int ret = 1; |
AnnaBridge | 189:f392fc9709a3 | 202 | int abort_flag = rda_ccfg_abort_hdlr(); |
AnnaBridge | 189:f392fc9709a3 | 203 | if(!abort_flag) { |
AnnaBridge | 189:f392fc9709a3 | 204 | rda_ccfg_pdi2c(); |
AnnaBridge | 189:f392fc9709a3 | 205 | } |
AnnaBridge | 189:f392fc9709a3 | 206 | /*close usb polling*/ |
AnnaBridge | 189:f392fc9709a3 | 207 | RDA_GPIO->CTRL &= ~(0x01UL << 12); |
AnnaBridge | 189:f392fc9709a3 | 208 | rda_ccfg_ck(); |
AnnaBridge | 189:f392fc9709a3 | 209 | /* Set flash clock */ |
AnnaBridge | 189:f392fc9709a3 | 210 | rda_ccfg_spifck(); |
AnnaBridge | 189:f392fc9709a3 | 211 | /* Set aon timer clock source */ |
AnnaBridge | 189:f392fc9709a3 | 212 | rda_ccfg_aontmr_cksrc(1); |
AnnaBridge | 189:f392fc9709a3 | 213 | return ret; |
AnnaBridge | 189:f392fc9709a3 | 214 | } |
AnnaBridge | 189:f392fc9709a3 | 215 | |
AnnaBridge | 189:f392fc9709a3 | 216 | /* Reset CPU & Bus clock config */ |
AnnaBridge | 189:f392fc9709a3 | 217 | void rda_ccfg_ckrst(void) |
AnnaBridge | 189:f392fc9709a3 | 218 | { |
AnnaBridge | 189:f392fc9709a3 | 219 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 220 | |
AnnaBridge | 189:f392fc9709a3 | 221 | rd_rf_usb_reg(0xA4, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 222 | /* HCLK inv */ |
AnnaBridge | 189:f392fc9709a3 | 223 | val &= ~(0x01U << 12); |
AnnaBridge | 189:f392fc9709a3 | 224 | /* Config CPU clock */ |
AnnaBridge | 189:f392fc9709a3 | 225 | val &= ~(0x03U << 10); |
AnnaBridge | 189:f392fc9709a3 | 226 | val |= (0x00U << 10); /* 2'b00:40M, 2'b01:80M, 2'b1x:160M */ |
AnnaBridge | 189:f392fc9709a3 | 227 | /* Config BUS clock */ |
AnnaBridge | 189:f392fc9709a3 | 228 | val &= ~(0x01U << 9); |
AnnaBridge | 189:f392fc9709a3 | 229 | val |= (0x00U << 9); /* 1'b0:40M, 1'b1:80M */ |
AnnaBridge | 189:f392fc9709a3 | 230 | wr_rf_usb_reg(0xA4, val, 0); |
AnnaBridge | 189:f392fc9709a3 | 231 | } |
AnnaBridge | 189:f392fc9709a3 | 232 | |
AnnaBridge | 189:f392fc9709a3 | 233 | /* Reset peripheral module */ |
AnnaBridge | 189:f392fc9709a3 | 234 | void rda_ccfg_perrst(void) |
AnnaBridge | 189:f392fc9709a3 | 235 | { |
AnnaBridge | 189:f392fc9709a3 | 236 | unsigned int idx = 0x0FUL; |
AnnaBridge | 189:f392fc9709a3 | 237 | RDA_SCU->RESETCTRL &= ~(0x01UL << 11); // soft_resetn_bb |
AnnaBridge | 189:f392fc9709a3 | 238 | for (; idx>0; idx--); |
AnnaBridge | 189:f392fc9709a3 | 239 | RDA_SCU->RESETCTRL |= (0x01UL << 11); |
AnnaBridge | 189:f392fc9709a3 | 240 | } |
AnnaBridge | 189:f392fc9709a3 | 241 | |
AnnaBridge | 189:f392fc9709a3 | 242 | /* Init ADC module */ |
AnnaBridge | 189:f392fc9709a3 | 243 | void rda_ccfg_adc_init(void) |
AnnaBridge | 189:f392fc9709a3 | 244 | { |
AnnaBridge | 189:f392fc9709a3 | 245 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 246 | rd_rf_usb_reg(0xA3, &val, 0); /* adc en */ |
AnnaBridge | 189:f392fc9709a3 | 247 | wr_rf_usb_reg(0xA3, (val | (0x01U << 3)), 0); |
AnnaBridge | 189:f392fc9709a3 | 248 | rd_rf_usb_reg(0xD8, &val, 0); /* clk 6p5m en */ |
AnnaBridge | 189:f392fc9709a3 | 249 | wr_rf_usb_reg(0xD8, (val | (0x01U << 15)), 0); |
AnnaBridge | 189:f392fc9709a3 | 250 | rd_rf_usb_reg(0xB7, &val, 0); /* clk 26m en */ |
AnnaBridge | 189:f392fc9709a3 | 251 | wr_rf_usb_reg(0xB7, (val | (0x01U << 14)), 0); |
AnnaBridge | 189:f392fc9709a3 | 252 | } |
AnnaBridge | 189:f392fc9709a3 | 253 | |
AnnaBridge | 189:f392fc9709a3 | 254 | /* Config GPIO6/7/8 pdn or pup for ADC usage */ |
AnnaBridge | 189:f392fc9709a3 | 255 | void rda_ccfg_adc_gp(unsigned char gp, unsigned short cfg) |
AnnaBridge | 189:f392fc9709a3 | 256 | { |
AnnaBridge | 189:f392fc9709a3 | 257 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 258 | const int ofs_lst[3] = {8, 9, 7}; |
AnnaBridge | 189:f392fc9709a3 | 259 | if((6 > gp) || (8 < gp)) { |
AnnaBridge | 189:f392fc9709a3 | 260 | return; |
AnnaBridge | 189:f392fc9709a3 | 261 | } |
AnnaBridge | 189:f392fc9709a3 | 262 | rd_rf_usb_reg(0xB2, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 263 | val &= ~(0x01U << ofs_lst[gp - 6]); |
AnnaBridge | 189:f392fc9709a3 | 264 | wr_rf_usb_reg(0xB2, (val | ((cfg & 0x01U) << ofs_lst[gp - 6])), 0); |
AnnaBridge | 189:f392fc9709a3 | 265 | } |
AnnaBridge | 189:f392fc9709a3 | 266 | |
AnnaBridge | 189:f392fc9709a3 | 267 | /* Config GPADC oenb, use be config to 1 in either Normal mode or GPADC mode */ |
AnnaBridge | 189:f392fc9709a3 | 268 | void rda_ccfg_adc_oenb(unsigned char ch, unsigned short cfg) |
AnnaBridge | 189:f392fc9709a3 | 269 | { |
AnnaBridge | 189:f392fc9709a3 | 270 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 271 | unsigned char offset = 0U; |
AnnaBridge | 189:f392fc9709a3 | 272 | int ver = rda_ccfg_hwver(); |
AnnaBridge | 189:f392fc9709a3 | 273 | |
AnnaBridge | 189:f392fc9709a3 | 274 | if ((ch > 1) || (cfg > 1)) |
AnnaBridge | 189:f392fc9709a3 | 275 | return; |
AnnaBridge | 189:f392fc9709a3 | 276 | |
AnnaBridge | 189:f392fc9709a3 | 277 | if (0 == ch) { |
AnnaBridge | 189:f392fc9709a3 | 278 | offset = 2; |
AnnaBridge | 189:f392fc9709a3 | 279 | } else { |
AnnaBridge | 189:f392fc9709a3 | 280 | if (ver <= 2) |
AnnaBridge | 189:f392fc9709a3 | 281 | offset = 3; |
AnnaBridge | 189:f392fc9709a3 | 282 | else if (ver >= 4) |
AnnaBridge | 189:f392fc9709a3 | 283 | offset = 1; |
AnnaBridge | 189:f392fc9709a3 | 284 | } |
AnnaBridge | 189:f392fc9709a3 | 285 | |
AnnaBridge | 189:f392fc9709a3 | 286 | rd_rf_usb_reg(0xB0, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 287 | val &= ~(0x01U << offset); |
AnnaBridge | 189:f392fc9709a3 | 288 | val |= (cfg << offset); |
AnnaBridge | 189:f392fc9709a3 | 289 | wr_rf_usb_reg(0xB0, val, 0); |
AnnaBridge | 189:f392fc9709a3 | 290 | } |
AnnaBridge | 189:f392fc9709a3 | 291 | |
AnnaBridge | 189:f392fc9709a3 | 292 | /* Read ADC value */ |
AnnaBridge | 189:f392fc9709a3 | 293 | unsigned short rda_ccfg_adc_read(unsigned char ch) |
AnnaBridge | 189:f392fc9709a3 | 294 | { |
AnnaBridge | 189:f392fc9709a3 | 295 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 296 | rd_rf_usb_reg(0xB7, &val, 0); /* set vref */ |
AnnaBridge | 189:f392fc9709a3 | 297 | val &= ~((0x03U) << 12); /* verf 1.7V */ |
AnnaBridge | 189:f392fc9709a3 | 298 | if(!((2U == ch) && (rda_ccfg_hwver() <= 4))) { |
AnnaBridge | 189:f392fc9709a3 | 299 | val |= ((0x02U) << 12); /* verf 2.0V */ |
AnnaBridge | 189:f392fc9709a3 | 300 | } |
AnnaBridge | 189:f392fc9709a3 | 301 | wr_rf_usb_reg(0xB7, val, 0); |
AnnaBridge | 189:f392fc9709a3 | 302 | |
AnnaBridge | 189:f392fc9709a3 | 303 | rd_rf_usb_reg(0xB6, &val, 0); /* channel select */ |
AnnaBridge | 189:f392fc9709a3 | 304 | val &= ~((0x03U) << 12); |
AnnaBridge | 189:f392fc9709a3 | 305 | wr_rf_usb_reg(0xB6, (val | ((ch & 0x03U) << 12)), 0); |
AnnaBridge | 189:f392fc9709a3 | 306 | |
AnnaBridge | 189:f392fc9709a3 | 307 | rd_rf_usb_reg(0xB6, &val, 0); /* set read en */ |
AnnaBridge | 189:f392fc9709a3 | 308 | wr_rf_usb_reg(0xB6, (val | (0x01U << 2)), 0); |
AnnaBridge | 189:f392fc9709a3 | 309 | for(val = 0; val < 0x0FFU; val++) { // delay |
AnnaBridge | 189:f392fc9709a3 | 310 | ; |
AnnaBridge | 189:f392fc9709a3 | 311 | } |
AnnaBridge | 189:f392fc9709a3 | 312 | rd_rf_usb_reg(0xB6, &val, 0); /* clr read en */ |
AnnaBridge | 189:f392fc9709a3 | 313 | wr_rf_usb_reg(0xB6, (val & ~(0x01U << 2)), 0); |
AnnaBridge | 189:f392fc9709a3 | 314 | |
AnnaBridge | 189:f392fc9709a3 | 315 | do { |
AnnaBridge | 189:f392fc9709a3 | 316 | rd_rf_usb_reg(0xB7, &val, 0); /* finish loop flag */ |
AnnaBridge | 189:f392fc9709a3 | 317 | } while(0x00U == (val & (0x01U << 10))); |
AnnaBridge | 189:f392fc9709a3 | 318 | return (val & 0x03FFU); |
AnnaBridge | 189:f392fc9709a3 | 319 | } |
AnnaBridge | 189:f392fc9709a3 | 320 | |
AnnaBridge | 189:f392fc9709a3 | 321 | /* Free ADC module */ |
AnnaBridge | 189:f392fc9709a3 | 322 | void rda_ccfg_adc_free(void) |
AnnaBridge | 189:f392fc9709a3 | 323 | { |
AnnaBridge | 189:f392fc9709a3 | 324 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 325 | rd_rf_usb_reg(0xA3, &val, 0); /* adc disable */ |
AnnaBridge | 189:f392fc9709a3 | 326 | wr_rf_usb_reg(0xA3, (val & ~(0x01U << 3)), 0); |
AnnaBridge | 189:f392fc9709a3 | 327 | rd_rf_usb_reg(0xB7, &val, 0); /* clk 26m disable */ |
AnnaBridge | 189:f392fc9709a3 | 328 | wr_rf_usb_reg(0xB7, (val & ~(0x01U << 14)), 0); |
AnnaBridge | 189:f392fc9709a3 | 329 | } |
AnnaBridge | 189:f392fc9709a3 | 330 | |
AnnaBridge | 189:f392fc9709a3 | 331 | /* Get abort flag */ |
AnnaBridge | 189:f392fc9709a3 | 332 | int rda_ccfg_abort_flag(void) |
AnnaBridge | 189:f392fc9709a3 | 333 | { |
AnnaBridge | 189:f392fc9709a3 | 334 | int ret = 0; |
AnnaBridge | 189:f392fc9709a3 | 335 | if(0x00UL != (RDA_GPIO->PCCTRL & (0x01UL << 31))) { |
AnnaBridge | 189:f392fc9709a3 | 336 | ret = 1; |
AnnaBridge | 189:f392fc9709a3 | 337 | } |
AnnaBridge | 189:f392fc9709a3 | 338 | return ret; |
AnnaBridge | 189:f392fc9709a3 | 339 | } |
AnnaBridge | 189:f392fc9709a3 | 340 | |
AnnaBridge | 189:f392fc9709a3 | 341 | /* Set wdt en */ |
AnnaBridge | 189:f392fc9709a3 | 342 | void rda_ccfg_wdt_en(void) |
AnnaBridge | 189:f392fc9709a3 | 343 | { |
AnnaBridge | 189:f392fc9709a3 | 344 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 345 | rd_rf_usb_reg(0xC8, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 346 | wr_rf_usb_reg(0xC8, (val | (0x01U << 13)), 0); |
AnnaBridge | 189:f392fc9709a3 | 347 | } |
AnnaBridge | 189:f392fc9709a3 | 348 | |
AnnaBridge | 189:f392fc9709a3 | 349 | unsigned short rf_reg_read(unsigned short addr) |
AnnaBridge | 189:f392fc9709a3 | 350 | { |
AnnaBridge | 189:f392fc9709a3 | 351 | unsigned short val = 0U; |
AnnaBridge | 189:f392fc9709a3 | 352 | if(addr <= 0x1FF) { |
AnnaBridge | 189:f392fc9709a3 | 353 | if((((addr & 0xFFU) >= 0xA0) && ((addr & 0xFFU) <= 0xDF)) || |
AnnaBridge | 189:f392fc9709a3 | 354 | (addr == 0x30U) || (addr == 0x34U) || (addr == 0x35U)) { /* PMU & RF_30H/34H/35H */ |
AnnaBridge | 189:f392fc9709a3 | 355 | rd_rf_usb_reg((unsigned char)(addr & 0xFFU), &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 356 | } else { /* RF */ |
AnnaBridge | 189:f392fc9709a3 | 357 | char isrun = 0; |
AnnaBridge | 189:f392fc9709a3 | 358 | rd_rf_usb_reg(0x30U, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 359 | isrun = (val & 0x01U) ? 1 : 0; |
AnnaBridge | 189:f392fc9709a3 | 360 | if(isrun) { |
AnnaBridge | 189:f392fc9709a3 | 361 | wr_rf_usb_reg(0x02U, (0x5000U | addr), 0); |
AnnaBridge | 189:f392fc9709a3 | 362 | rd_rf_usb_reg(0x34U, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 363 | } else { |
AnnaBridge | 189:f392fc9709a3 | 364 | if(addr & (0x01U << 8)) { |
AnnaBridge | 189:f392fc9709a3 | 365 | wr_rf_usb_reg(0x3FU, 1, 0); |
AnnaBridge | 189:f392fc9709a3 | 366 | } |
AnnaBridge | 189:f392fc9709a3 | 367 | rd_rf_usb_reg((unsigned char)(addr & 0xFFU), &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 368 | if(addr & (0x01U << 8)) { |
AnnaBridge | 189:f392fc9709a3 | 369 | wr_rf_usb_reg(0x3FU, 0, 0); |
AnnaBridge | 189:f392fc9709a3 | 370 | } |
AnnaBridge | 189:f392fc9709a3 | 371 | } |
AnnaBridge | 189:f392fc9709a3 | 372 | } |
AnnaBridge | 189:f392fc9709a3 | 373 | } |
AnnaBridge | 189:f392fc9709a3 | 374 | return val; |
AnnaBridge | 189:f392fc9709a3 | 375 | } |
AnnaBridge | 189:f392fc9709a3 | 376 | |
AnnaBridge | 189:f392fc9709a3 | 377 | void rf_reg_write(unsigned short addr, unsigned short val) |
AnnaBridge | 189:f392fc9709a3 | 378 | { |
AnnaBridge | 189:f392fc9709a3 | 379 | if(addr <= 0x1FF) { |
AnnaBridge | 189:f392fc9709a3 | 380 | if((((addr & 0xFFU) >= 0xA0) && ((addr & 0xFFU) <= 0xDF)) || |
AnnaBridge | 189:f392fc9709a3 | 381 | (addr == 0x30U) || (addr == 0x34U) || (addr == 0x35U)) { /* PMU & RF_30H/34H/35H */ |
AnnaBridge | 189:f392fc9709a3 | 382 | wr_rf_usb_reg((unsigned char)(addr & 0xFFU), val, 0); |
AnnaBridge | 189:f392fc9709a3 | 383 | } else { /* RF */ |
AnnaBridge | 189:f392fc9709a3 | 384 | char isrun = 0; |
AnnaBridge | 189:f392fc9709a3 | 385 | rd_rf_usb_reg(0x30U, &val, 0); |
AnnaBridge | 189:f392fc9709a3 | 386 | isrun = (val & 0x01U) ? 1 : 0; |
AnnaBridge | 189:f392fc9709a3 | 387 | if(isrun) { |
AnnaBridge | 189:f392fc9709a3 | 388 | wr_rf_usb_reg(0x32U, val, 0); |
AnnaBridge | 189:f392fc9709a3 | 389 | wr_rf_usb_reg(0x02U, (0x4000U | addr), 0); |
AnnaBridge | 189:f392fc9709a3 | 390 | } else { |
AnnaBridge | 189:f392fc9709a3 | 391 | if(addr & (0x01U << 8)) { |
AnnaBridge | 189:f392fc9709a3 | 392 | wr_rf_usb_reg(0x3FU, 1, 0); |
AnnaBridge | 189:f392fc9709a3 | 393 | } |
AnnaBridge | 189:f392fc9709a3 | 394 | wr_rf_usb_reg((unsigned char)(addr & 0xFFU), val, 0); |
AnnaBridge | 189:f392fc9709a3 | 395 | if(addr & (0x01U << 8)) { |
AnnaBridge | 189:f392fc9709a3 | 396 | wr_rf_usb_reg(0x3FU, 0, 0); |
AnnaBridge | 189:f392fc9709a3 | 397 | } |
AnnaBridge | 189:f392fc9709a3 | 398 | } |
AnnaBridge | 189:f392fc9709a3 | 399 | } |
AnnaBridge | 189:f392fc9709a3 | 400 | } |
AnnaBridge | 189:f392fc9709a3 | 401 | } |
AnnaBridge | 189:f392fc9709a3 | 402 | |
AnnaBridge | 189:f392fc9709a3 | 403 | /* Get chip hw version */ |
AnnaBridge | 189:f392fc9709a3 | 404 | int rda_ccfg_hwver(void) |
AnnaBridge | 189:f392fc9709a3 | 405 | { |
AnnaBridge | 189:f392fc9709a3 | 406 | if(0 == ChipHwVersion) { |
AnnaBridge | 189:f392fc9709a3 | 407 | ChipHwVersion = (int)((RDA_GPIO->REVID >> 16) & 0xFFUL) + 1; |
AnnaBridge | 189:f392fc9709a3 | 408 | } |
AnnaBridge | 189:f392fc9709a3 | 409 | return ChipHwVersion; |
AnnaBridge | 189:f392fc9709a3 | 410 | } |
AnnaBridge | 189:f392fc9709a3 | 411 |