static void setup_pwms(void) { /* for pin alternate functions, refer to CD00277537.pdf, table 4 */ TIM_TimeBaseInitTypeDef TIM_TimeBase; GPIO_InitTypeDef GPIO_InitStruct; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* configure gpio */ GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_40MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3); /* init timebase. PWM freq equals 10 khz */ TIM_TimeBaseStructInit(&TIM_TimeBase); TIM_TimeBase.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBase.TIM_Prescaler = 8 - 1; /* for 1 Mhz clock */ TIM_TimeBase.TIM_Period = 0x100 - 1; /* 10 khz */ TIM_TimeBase.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &TIM_TimeBase); set_lpwm(100); set_rpwm(100); TIM_Cmd(TIM3, ENABLE); }
void TIM2_IRQHandler(void) { /* 10hz frequency */ /* todo: reduce the scope by capturing variables */ disableInterrupts(); /* forward */ if ((dir != 1) || (speed <= 0)) goto on_done; if (lenc < speed) lpwm += 2; /* I_up */ else if (lenc > speed) lpwm -= 2; if (renc < speed) rpwm += 2; else if (renc > speed) rpwm -= 2; err = clamp(err + lenc - renc, -128, 128); /* reset encoder counters */ lenc = 0; renc = 0; lpwm = clamp(CONFIG_START_POWER_FWD + lpwm - err, 0, 255); rpwm = clamp(CONFIG_START_POWER_FWD + rpwm - err, 0, 255); set_lpwm(lpwm); set_rpwm(rpwm); on_done: TIM_ClearITPendingBit(TIM2, TIM_IT_Update); enableInterrupts(); }
void mcs_stop(void) { disableInterrupts(); set_lpwm(128); set_rpwm(128); enableInterrupts(); }
void pnp_sleep_wk(void *context) { _irqL irqL; _adapter *padapter = (_adapter *)context; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("pnp_sleep_wk ===>\n")); _enter_critical(&pmlmepriv->lock, &irqL ); if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) { indicate_disconnect(padapter); //will clr Linked_state; before this function, we must have chked whether issue dis-assoc_cmd or not free_assoc_resources(padapter); #ifndef CONFIG_POWER_DOWN_MODE disassoc_cmd(padapter); #endif } _exit_critical(&pmlmepriv->lock, &irqL ); RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("pnp_sleep_wk:fwstate:%d\n", pmlmepriv->fw_state)); #ifdef CONFIG_POWER_DOWN_MODE //before enter powerdown mode, we must ensure FW in S4 state. if (padapter->pwrctrlpriv.pwr_mode > PS_MODE_ACTIVE) { padapter->pwrctrlpriv.pwr_mode = PS_MODE_ACTIVE; _enter_pwrlock(&(padapter->pwrctrlpriv.lock)); set_rpwm(padapter, PS_STATE_S4); _exit_pwrlock(&(padapter->pwrctrlpriv.lock)); } while (pwrctrl->cpwm != PS_STATE_S4) { //waiting FW to become ACTIVE. msleep_os(10); } #endif write16(padapter, SDIO_HIMR, 0); pwrctrl->pnp_bstop_trx = _TRUE; padapter->hw_init_completed = _FALSE; NdisMSetInformationComplete(padapter->hndis_adapter, NDIS_STATUS_SUCCESS); RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("pnp_sleep_wk <===\n")); }