bool IsMicInLink(void) { #ifdef FUNC_MIC_DET_EN static uint8_t MicLinkState = 0; #define MICIN_JETTER_TIMES 10 //连接检测消抖时间:10次,100ms //设为输入,打开上拉 GpioClrRegOneBit(MICIN_DETECT_PORT_OE, MICIN_DETECT_BIT); GpioClrRegOneBit(MICIN_DETECT_PORT_PU, MICIN_DETECT_BIT); GpioClrRegOneBit(MICIN_DETECT_PORT_PD, MICIN_DETECT_BIT); GpioSetRegBits(MICIN_DETECT_PORT_IE, MICIN_DETECT_BIT); if(GpioGetReg(MICIN_DETECT_PORT_IN) & MICIN_DETECT_BIT) { MicLinkState = 0; //断开状态不做消抖处理 } else { if(MicLinkState < MICIN_JETTER_TIMES) //连接状态做消抖处理 { MicLinkState++; } } gSys.MicEnable = (MicLinkState >= MICIN_JETTER_TIMES); return gSys.MicEnable; #else gSys.MicEnable = TRUE; return TRUE; #endif }
bool IsLineInLink(void) { static uint8_t LineInLinkState = 0; #ifdef LINEIN_DETECT_BIT_MASK #define LINEIN_JETTER_TIMES 10 //连接检测消抖时间:10次,100ms //设为输入,带上拉 GpioClrRegBits(LINEIN_DETECT_PORT_OE, LINEIN_DETECT_BIT_MASK); GpioClrRegBits(LINEIN_DETECT_PORT_PU, LINEIN_DETECT_BIT_MASK); GpioClrRegBits(LINEIN_DETECT_PORT_PD, LINEIN_DETECT_BIT_MASK); GpioSetRegBits(LINEIN_DETECT_PORT_IE, LINEIN_DETECT_BIT_MASK); if(GpioGetReg(LINEIN_DETECT_PORT_IN) & LINEIN_DETECT_BIT_MASK) { LineInLinkState = 0; //断开状态不做消抖处理 } else { if(LineInLinkState < LINEIN_JETTER_TIMES) //连接状态做消抖处理 { LineInLinkState++; } } return (LineInLinkState >= LINEIN_JETTER_TIMES); #else return TRUE; #endif }
uint8_t GetSDA(void* I2cMasterHandle) { I2C_HANDLE I2cHandle = (I2C_HANDLE)I2cMasterHandle; uint32_t Val = GpioGetReg(I2cHandle->SdaPortIndex); if(Val & I2cHandle->SdaMask) { return 1; } else { return 0; } }
// Coding key signal-A interrupt. __attribute__((section(".driver.isr"))) void GpioInterrupt(void) { if(GpioIntFlagGet(CODING_KEY_A_PORT_INT) == CODING_KEY_A_BIT) { GpioIntClr(CODING_KEY_A_PORT_INT, CODING_KEY_A_BIT); if((GpioGetReg(CODING_KEY_A_PORT_IN) & CODING_KEY_A_BIT) || (ClockWiseCnt != 0) || (CounterClockWiseCnt != 0)) { return; } if(GpioGetReg(CODING_KEY_B_PORT_IN) & CODING_KEY_B_BIT) { //clockwise rotation ClockWiseCnt++; } else { //counterclockwise rotation CounterClockWiseCnt++; } } }
bool platform_gpio_input_get( const platform_gpio_t* gpio ) { bool result = false; uint32_t regValue; uint32_t mask = (uint32_t)1 << gpio->pin; platform_mcu_powersave_disable(); require_quiet( gpio != NULL, exit); regValue = GpioGetReg( GPIO_A_IN + gpio->port ); result = ((regValue&mask) == 0 )? false : true; exit: platform_mcu_powersave_enable(); return result; }
OSStatus platform_gpio_output_trigger( const platform_gpio_t* gpio ) { OSStatus err = kNoErr; uint32_t regValue; uint32_t mask = (uint32_t)1 << gpio->pin; platform_mcu_powersave_disable(); require_action_quiet( gpio != NULL, exit, err = kParamErr); regValue = GpioGetReg( GPIO_A_OUT + gpio->port ); (regValue&mask)? platform_gpio_output_low( gpio ) : platform_gpio_output_high( gpio ); exit: platform_mcu_powersave_enable(); return err; }
bool IsCardLink(void) { #ifdef FUNC_CARD_EN bool TempFlag; LockSdClk(); GpioSdIoConfig(RESTORE_TO_GENERAL_IO); GpioClrRegBits(CARD_DETECT_PORT_PU, CARD_DETECT_BIT_MASK); GpioClrRegBits(CARD_DETECT_PORT_PD, CARD_DETECT_BIT_MASK); GpioClrRegBits(CARD_DETECT_PORT_OE, CARD_DETECT_BIT_MASK); GpioSetRegBits(CARD_DETECT_PORT_IE, CARD_DETECT_BIT_MASK); CardDetectDelay(); // ??? Disable和设置为IE 后,可能需要时延 if(GpioGetReg(CARD_DETECT_PORT_IN) & CARD_DETECT_BIT_MASK) { TempFlag = FALSE; } else { TempFlag = TRUE; } if(TempFlag) { GpioSdIoConfig(SD_PORT_NUM); } UnLockSdClk(); return TempFlag; #else return FALSE; #endif }
static BOOL USER_FUNC lum_studyWaveData(ORIGIN_WAVE_DATA* pWaveInfo) { U32 lastGpioStatus = 0; U32 curGpioStatus; BOOL afterFirstWave = FALSE; BOOL startSave = FALSE; U32 protectCount = 0; BOOL ret = FALSE; lum_setSdo2InteruptStatus(FALSE); //中断服务程序内部不能禁止中断,故放此处 lum_disableAllIrq(); while(protectCount < 100000) //1S { curGpioStatus = (GpioGetReg(GPIO_C_IN)&0x04); if(!afterFirstWave) { if(curGpioStatus != lastGpioStatus) { lastGpioStatus = curGpioStatus; pWaveInfo->waveData[0] = 0; } else { pWaveInfo->waveData[0]++; } if(pWaveInfo->waveData[0] >= MIN_WAVE_GAP_TIME) // > 3ms { afterFirstWave = TRUE; pWaveInfo->waveData[0] = 0; pWaveInfo->firstHighlevel = (curGpioStatus == 0)?0:1; } } else { if(curGpioStatus != lastGpioStatus) { lastGpioStatus = curGpioStatus; if(!startSave) { startSave = TRUE; } else { pWaveInfo->waveData[pWaveInfo->waveCount]++; pWaveInfo->waveCount++; if(pWaveInfo->waveCount >= MAX_WAVE_DATA_COUNT) { break; } } } else { if(startSave) { //g_timing = 0; pWaveInfo->waveData[pWaveInfo->waveCount]++; __nop(); __nop(); __nop(); } if(pWaveInfo->waveData[pWaveInfo->waveCount] >= MIN_WAVE_GAP_TIME) // > 3ms { //pWaveInfo->waveCount++; if(pWaveInfo->waveCount > 20) { ret = TRUE; } break; } } } lum_delay15us(1); protectCount++; } #ifdef LUM_STUDY_WAVE_TIME_DEBUG if(ret) { while(1) { curGpioStatus = (GpioGetReg(GPIO_C_IN)&0x04); if(curGpioStatus != lastGpioStatus) { lum_studyTest(pWaveInfo); break; } } } #endif lum_enableAllIrq(); return ret; }
static void USER_FUNC lum_searchFreqCallback(void) { U8 rssiData = 0; U32 readCount = 0; U32 beginTime = 0; U32 curTime = 0; U32 totalRssi = 0; U32 waitTime = MIN_SEARCH_FREQ_WAIT_TIME; static U8 g_bLastFound = 0; if(g_searchFreqData.foundIrq) { lum_setSdo2InteruptStatus(FALSE); beginTime = hfsys_get_time(); while(1) { if((GpioGetReg(GPIO_C_IN)&0x04) != 0) { rssiData = lum_spiReadData(REG_RSSIVALUE); if(waitTime != MAX_SEARCH_FREQ_WAIT_TIME) { waitTime = MAX_SEARCH_FREQ_WAIT_TIME; } if(rssiData != 0x80) { readCount++; totalRssi += rssiData; if(readCount >= MAX_READ_RSSI_COUNT) { totalRssi /= readCount; if(totalRssi > g_searchFreqData.maxRssi) { if(g_bLastFound != 0) { g_searchFreqData.maxRssi = totalRssi; g_searchFreqData.bestFreq = g_searchFreqData.curFreq; } else { totalRssi = 0; g_bLastFound = 1; } } curTime = hfsys_get_time(); break; } } } else { curTime = hfsys_get_time(); if(curTime < beginTime) { beginTime = 0; } if((curTime - beginTime) > waitTime) { totalRssi = 0; g_bLastFound = 0; break; } } } } //lumi_debug("curFreq=%ld RSSI=%d bSdo2High=%d readCount=%d timegap=%d\n", g_searchFreqData.curFreq, totalRssi, g_searchFreqData.foundIrq, readCount, (curTime - beginTime)); if(g_searchFreqData.curFreq < MAX_SEARCH_FREQUENT) { //search next frequent if(g_searchFreqData.foundIrq) { g_searchFreqData.curFreq += MIN_SEARCH_FREQ_GAP; } else { g_searchFreqData.curFreq += MAX_SEARCH_FREQ_GAP; } if(readCount == 0) { g_searchFreqData.foundIrq = 0; } lum_searchNextFreq(); } else if(g_searchFreqData.maxRssi < MIN_SEARCH_FREQ_RSSI) { curTime = hfsys_get_time(); if(curTime < MAX_STUDY_TIME_WAIT || (curTime - g_searchFreqData.timeout) < MAX_STUDY_TIME_WAIT) { //search again U32 lastTime; lastTime = g_searchFreqData.timeout; memset(&g_searchFreqData, 0, sizeof(SEARCH_FREQ_INFO)); g_searchFreqData.chipStatus = SX1208_SEARCHING; g_searchFreqData.curFreq = MIN_SEARCH_FREQUENT; g_searchFreqData.timeout = lastTime; lum_searchNextFreq(); } else { //Search Faild; lum_setSdo2InteruptStatus(FALSE); g_searchFreqData.chipStatus = SX1208_IDLE; lum_setRfMode(RF_SLEEP); lum_sendReplyStudyMessage(); lumi_debug("search frequent timeout time1=%ld time2=%ld\n", g_searchFreqData.timeout, curTime); } } else { //search success lum_setSdo2InteruptStatus(FALSE); lum_enterStudyMode(g_searchFreqData.bestFreq); } }