mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

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?

UserRevisionLine numberNew 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