/** * Configure the MCI SDCBUS in the MCI_SDCR register. Only two modes available * * \param pMci Pointer to the low level MCI driver. * \param busWidth MCI bus width mode. 00: 1-bit, 10: 4-bit, 11: 8-bit. */ uint32_t MCI_SetBusWidth(Mcid*pMci, uint32_t busWidth) { Hsmci *pMciHw = pMci->pMciHw; uint32_t mciSdcr; uint8_t mciDis; assert(pMci); assert(pMci->pMciHw); if( (busWidth != HSMCI_SDCR_SDCBUS_1) && (busWidth != HSMCI_SDCR_SDCBUS_4) && (busWidth != HSMCI_SDCR_SDCBUS_8) ) { return (uint32_t)-1; } busWidth &= HSMCI_SDCR_SDCBUS_Msk ; PMC_EnablePeripheral(pMci->mciId); mciDis = PMC_IsPeriphEnabled(pMci->mciId); mciSdcr = (pMciHw->HSMCI_SDCR & ~(uint32_t)(HSMCI_SDCR_SDCBUS_Msk)); pMciHw->HSMCI_SDCR = mciSdcr | busWidth; if (mciDis) { PMC_DisablePeripheral(pMci->mciId); } return 0; }
unsigned char AccelInit(void) { PIO_Configure(accIntPins, PIO_LISTSIZE(accIntPins)); if(PMC_IsPeriphEnabled(AT91C_ID_TWI) == 0){ PIO_Configure(twiPins, PIO_LISTSIZE(twiPins)); PMC_EnablePeripheral(AT91C_ID_TWI); TWI_ConfigureMaster(AT91C_BASE_TWI,TWCK,MCK); } usleep(10000); #ifdef STACCEL // ST Accelerometer char setup[4]; setup[0] = (1<<5)|(2<<3)|7; // Normal power, data rate = 400Hz, ZYX axis enabled setup[1] = 0; // Do not add filter stuff setup[2] = (2<<0); // Data ready interrupt on INT 2 pad setup[3] = (0<<4); // do update between reads, and set scale to +/- 2g's WriteAccelData(0x20|(1<<7),setup,4); #else // Freescale Accelerometer //AccelCalibration(); AccelSetScale(2); AccelSetCalibration(); #endif SetPitCallback(AccelCallback,3); return 0; }
void SensorsTestInit() { char pinDirection = 0; int i; PIO_Configure(aDigitalOuts, PIO_LISTSIZE(aDigitalOuts)); PIO_Configure(digitalIns, PIO_LISTSIZE(digitalIns)); PIO_Configure(sensorsPower, PIO_LISTSIZE(sensorsPower)); PMC_EnablePeripheral(AT91C_ID_PIOB); PMC_EnablePeripheral(AT91C_ID_PIOA); SelectAng0(); // select analog port 0 to be mesured instead of BattVoltage SensorPowerOn(); // turn on the Vcc line if(PMC_IsPeriphEnabled(AT91C_ID_TWI) == 0){ PIO_Configure(twiPortPins, PIO_LISTSIZE(twiPortPins)); PMC_EnablePeripheral(AT91C_ID_TWI); TWI_ConfigureMaster(AT91C_BASE_TWI,TWCK,MCK); } // set all pins on pullup chip to output WritePullupData(0x00,&pinDirection,1); WritePullupData(0x01,&pinDirection,1); for(i = 0;i < 8;i++){ if(i>1) AnalogPullup(i,0); // disable Analog pullups for output test DigitalPullup(i,1); // enable all digital pullups } }
/** * Configure the MCI CLKDIV in the MCI_MR register. The max. for MCI clock is * MCK/2 and corresponds to CLKDIV = 0 * \param pMci Pointer to the low level MCI driver. * \param mciSpeed MCI clock speed in Hz, 0 will not change current speed. * \param mck MCK to generate MCI Clock, in Hz * \return The actual speed used, 0 for fail. */ uint32_t MCI_SetSpeed( Mcid* pMci, uint32_t mciSpeed, uint32_t mck ) { Hsmci *pMciHw = pMci->pMciHw; uint32_t mciMr; uint32_t clkdiv; uint8_t mciDis; assert(pMci); assert(pMciHw); PMC_EnablePeripheral(pMci->mciId); mciDis = PMC_IsPeriphEnabled(pMci->mciId); mciMr = pMciHw->HSMCI_MR & (~(uint32_t)HSMCI_MR_CLKDIV_Msk); /* Multimedia Card Interface clock (MCCK or MCI_CK) is Master Clock (MCK) * divided by (2*(CLKDIV+1)) * mciSpeed = MCK / (2*(CLKDIV+1)) */ if (mciSpeed > 0) { clkdiv = (mck / 2 / mciSpeed); /* Speed should not bigger than expired one */ if (mciSpeed < mck/2/clkdiv) { clkdiv ++; } if ( clkdiv > 0 ) { clkdiv -= 1; } assert( (clkdiv & 0xFFFFFF00) == 0 ) ; /* "mciSpeed too small" */ } else { clkdiv = 0 ; } /* Actual MCI speed */ mciSpeed = mck / 2 / (clkdiv + 1); /* Modify MR */ pMciHw->HSMCI_MR = mciMr | clkdiv; if ( mciDis ) { PMC_DisablePeripheral( pMci->mciId ) ; } return (mciSpeed); }
/** * Configure the MCI_CFG to enable the HS mode * \param pMci Pointer to the low level MCI driver. * \param hsEnable 1 to enable, 0 to disable HS mode. */ uint8_t MCI_EnableHsMode(Mcid* pMci, uint8_t hsEnable) { Hsmci *pMciHw = pMci->pMciHw; uint32_t cfgr; uint8_t mciDis; uint8_t rc = 0; assert(pMci); assert(pMci->pMciHw); PMC_EnablePeripheral(pMci->mciId); mciDis = PMC_IsPeriphEnabled(pMci->mciId); cfgr = pMciHw->HSMCI_CFG; if (hsEnable == 1) { cfgr |= HSMCI_CFG_HSMODE; } else { if (hsEnable == 0) { cfgr &= ~(uint32_t)HSMCI_CFG_HSMODE; } else { rc = ((cfgr & HSMCI_CFG_HSMODE) != 0); } } pMciHw->HSMCI_CFG = cfgr; if (mciDis) { PMC_DisablePeripheral(pMci->mciId); } return rc; }
void SensorsInit() { char pinDirection = 0; int i; PIO_Configure(analogs, PIO_LISTSIZE(analogs)); PIO_Configure(digitalIns, PIO_LISTSIZE(digitalIns)); PIO_Configure(sensorsPower, PIO_LISTSIZE(sensorsPower)); PMC_EnablePeripheral(AT91C_ID_PIOB); PMC_EnablePeripheral(AT91C_ID_PIOA); PMC_EnablePeripheral(AT91C_ID_ADC1); ADC_Initialize(AT91C_BASE_ADC1, AT91C_ID_ADC1, AT91C_ADC_TRGEN_DIS, \ 0, AT91C_ADC_SLEEP_NORMAL_MODE, AT91C_ADC_LOWRES_10_BIT, \ MCK, BOARD_ADC_FREQ, 10, 3000); for(i = 0;i < 8;i++) ADC_EnableChannel(AT91C_BASE_ADC1, i); SetPitCallback(SensorsCallback,1); SelectAng0(); // select analog port 0 to be mesured instead of BattVoltage SensorPowerOn(); // turn on the Vcc line if(PMC_IsPeriphEnabled(AT91C_ID_TWI) == 0){ PIO_Configure(twiPortPins, PIO_LISTSIZE(twiPortPins)); PMC_EnablePeripheral(AT91C_ID_TWI); TWI_ConfigureMaster(AT91C_BASE_TWI,TWCK,MCK); } // set all pins on pullup chip to output WritePullupData(0x00,&pinDirection,1); WritePullupData(0x01,&pinDirection,1); for(i = 0;i < 8;i++){ if(i>1) AnalogPullup(i,1); // enable pullups if needed DigitalPullup(i,1); // enable all digital pullups } }
/** * Reset MCI HW interface and disable it. * \param keepSettings Keep old register settings, including * _MR, _SDCR, _DTOR, _CSTOR, _DMA and _CFG. */ void MCI_Reset(Mcid *pMci, uint8_t keepSettings) { Hsmci *pMciHw = pMci->pMciHw; uint8_t mciDis; assert(pMci); assert(pMci->pMciHw); PMC_EnablePeripheral(pMci->mciId); mciDis = PMC_IsPeriphEnabled(pMci->mciId); if (keepSettings) { uint32_t mr, sdcr, dtor, cstor; uint32_t cfg; mr = pMciHw->HSMCI_MR; sdcr = pMciHw->HSMCI_SDCR; dtor = pMciHw->HSMCI_DTOR; cstor = pMciHw->HSMCI_CSTOR; cfg = pMciHw->HSMCI_CFG; MCI_RESET(pMciHw); MCI_Disable(pMciHw); pMciHw->HSMCI_MR = mr; pMciHw->HSMCI_SDCR = sdcr; pMciHw->HSMCI_DTOR = dtor; pMciHw->HSMCI_CSTOR = cstor; pMciHw->HSMCI_CFG = cfg; } else { MCI_RESET(pMciHw); MCI_Disable(pMciHw); } if ( mciDis ) { PMC_DisablePeripheral( pMci->mciId ) ; } }
/** * Enable MCI peripheral access clock */ static uint8_t _PeripheralEnable(uint32_t id) { if (PMC_IsPeriphEnabled(id)) return 0; PMC_EnablePeripheral(id); return 1; }