first add sdk

This commit is contained in:
jialexd 2019-04-02 16:34:25 +08:00
commit f91efd1250
3915 changed files with 1291882 additions and 0 deletions

View file

@ -0,0 +1,197 @@
/** mbed Microcontroller Library
******************************************************************************
* @file analogin_api.c
* @author
* @version V1.0.0
* @date 2016-08-01
* @brief This file provides mbed API for ADC.
******************************************************************************
* @attention
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*
* Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
******************************************************************************
*/
#include "objects.h"
#include "PinNames.h"
#include "analogin_api.h"
#include "pinmap.h"
static ADC_InitTypeDef AdcInitStruct;
extern u32 ConfigDebugErr;
extern u32 ConfigDebuginfo;
typedef enum {
ADC_CH0 = 0,
ADC_CH1 = 1,
ADC_CH2 = 2,
ADC_CH3 = 3,
} ADC_CH;
static const PinMap PinMap_ADC[] = {
{PA_19, ADC_CH1, 0},
{VBAT_MEAS, ADC_CH2, 0},
{PA_20, ADC_CH3, 0},
{NC, NC, 0}
};
/**
* @brief Read 8 bytes data from ADC.
* @param pBuf: 8 bytes buffer for data read.
* @note poll mode will be used in this function.
* @retval None
*/
void ADC_ReceiveBuf_ACUT(u32 *pBuf)
{
u32 isr = ADC_GetISR();
ADC_TypeDef *adc = ADC;
u32 AdcTempDat;
/* Clear ADC Status */
ADC_INTClear();
ADC_INTConfig(BIT_ADC_FIFO_FULL_EN|BIT_ADC_FIFO_RD_REQ_EN, ENABLE);
ADC_Cmd(ENABLE);
/* B CUT ADD patch for reset fail */
AdcTempDat = adc->ANAPAR_AD1;
AdcTempDat |= BIT(0);
adc->ANAPAR_AD1 = AdcTempDat;
while (1) {
isr = ADC_GetISR();
if (isr & (BIT_ADC_FIFO_FULL | BIT_ADC_FIFO_RD_REQ)) {
*pBuf = (u32)ADC_Read();
*(pBuf+1)= (u32)ADC_Read();
ADC_INTClear();
ADC_INTConfig(BIT_ADC_FIFO_FULL_EN|BIT_ADC_FIFO_RD_REQ_EN, DISABLE);
break;
}
}
/* B CUT ADD patch for reset fail */
AdcTempDat = adc->ANAPAR_AD1;
AdcTempDat &= ~BIT(0);
adc->ANAPAR_AD1 = AdcTempDat;
ADC_Cmd(DISABLE);
/* Clear ADC Status */
ADC_INTClear();
}
/**
* @brief Initializes the ADC device, include clock/function/ADC registers.
* @param obj: adc object define in application software.
* @param pin: adc PinName according to pinmux spec.
* @retval none
*/
void analogin_init(analogin_t *obj, PinName pin)
{
uint32_t adc_idx;
ConfigDebugErr &= (~(_DBG_ADC_|_DBG_GDMA_));
ConfigDebugInfo&= (~(_DBG_ADC_|_DBG_GDMA_));
adc_idx = pinmap_peripheral(pin, PinMap_ADC);
DBG_8195A("analogin_init [%x:%x ]\n", pin, adc_idx);
assert_param(adc_idx != NC);
/* Set ADC Device Number */
obj->adc_idx = adc_idx;
/* Load ADC default value */
ADC_InitStruct(&AdcInitStruct);
ADC_AnaparAd[1] = 0x81004;
/* Init ADC now */
/* ADC Interrupt disable, poll mode will be used */
InterruptDis(ADC_IRQ);
/* To release ADC delta sigma clock gating */
PLL2_Set(BIT_SYS_SYSPLL_CK_ADC_EN, ENABLE);
/* Turn on ADC active clock */
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE);
ADC_Init(&AdcInitStruct);
}
/**
* @brief Reads data from the specified adc channel fifo.
* @param obj: adc object define in application software.
* @retval adc channel data(float)
*/
float analogin_read(analogin_t *obj)
{
float value;
uint32_t AnaloginTmp[2] = {0,0};
uint32_t AnaloginDatMsk = 0xFFFF;
uint8_t AnaloginIdx = obj->adc_idx;
uint32_t AnalogDat = 0;
uint32_t AnalogDatFull = 0;
ADC_ReceiveBuf_ACUT(&AnaloginTmp[0]);
AnaloginDatMsk = (u32)(AnaloginDatMsk<<((u32)(16*(AnaloginIdx&0x01))));
AnalogDat = AnaloginTmp[(AnaloginIdx/2)];
AnalogDat = (AnalogDat & AnaloginDatMsk);
AnalogDat = (AnalogDat>>((u32)(16*(AnaloginIdx&0x01))));
AnalogDatFull = 0xCE80;
value = (float)(AnalogDat) / (float)(AnalogDatFull);
return (float)value;
}
/**
* @brief Reads data from the specified adc channel fifo.
* @param obj: adc object define in application software.
* @retval 16bit adc channel data(int)
*/
uint16_t analogin_read_u16(analogin_t *obj)
{
uint32_t AnaloginTmp[2] = {0,0};
uint32_t AnaloginDatMsk = 0xFFFF;
uint8_t AnaloginIdx = obj->adc_idx;
uint32_t AnalogDat = 0;
ADC_ReceiveBuf_ACUT(&AnaloginTmp[0]);
//DBG_8195A("[0]:%08x, %08x\n", AnaloginTmp[0], AnaloginTmp[1] );
AnaloginDatMsk = (u32)(AnaloginDatMsk<<((u32)(16*(AnaloginIdx&0x01))));
AnalogDat = AnaloginTmp[(AnaloginIdx/2)];
AnalogDat = (AnalogDat & AnaloginDatMsk);
AnalogDat = (AnalogDat>>((u32)(16*(AnaloginIdx&0x01))));
return (uint16_t)AnalogDat;
}
/**
* @brief Deinitializes the ADC device, include clock/function/ADC registers.
* @param obj: adc object define in application software.
* @retval none
*/
void analogin_deinit(analogin_t *obj)
{
/* Clear ADC Status */
ADC_INTClear();
/* Disable ADC */
ADC_Cmd(DISABLE);
/* To release ADC delta sigma clock gating */
PLL2_Set(BIT_SYS_SYSPLL_CK_ADC_EN, DISABLE);
/* Turn on ADC active clock */
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, DISABLE);
}
/******************* (C) COPYRIGHT 2016 Realtek Semiconductor *****END OF FILE****/