示例#1
0
int stm32_gpio_set_pin_mode(int pin, gpio_pin_mode_t mode)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    STM32_GPIO_PERIPH_ENABLE(GPIO_PERIPH(pin));

    GPIO_InitStructure.GPIO_Pin = GPIO_BIT(pin); 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    /* XXX: not all pins are actually available */
    switch (mode)
    {
    case GPIO_PM_INPUT:
        STM32_GPIO_PIN_TYPE_IN(GPIO_InitStructure);
        GPIO_Init(GPIO_PORT(pin), &GPIO_InitStructure);
        break;
    case GPIO_PM_OUTPUT:
        STM32_GPIO_PIN_TYPE_OUT(GPIO_InitStructure);
        GPIO_Init(GPIO_PORT(pin), &GPIO_InitStructure);
        break;
    case GPIO_PM_INPUT_PULLUP:
        STM32_GPIO_PIN_TYPE_IN_PU(GPIO_InitStructure);
        GPIO_Init(GPIO_PORT(pin), &GPIO_InitStructure);
        break;
    case GPIO_PM_INPUT_PULLDOWN:
        STM32_GPIO_PIN_TYPE_IN_PD(GPIO_InitStructure);
        GPIO_Init(GPIO_PORT(pin), &GPIO_InitStructure);
        break;
    default:
        tp_err("Pinmode %d is not supported yet\n", mode);
        return -1;
    }
    return 0;
}
示例#2
0
void stm32_gpio_enable_pin(GPIO_DRV* gpio, PIN pin, STM32_GPIO_MODE mode, bool pullup)
{
    if (gpio->used_pins[GPIO_PORT(pin)]++ == 0)
        GPIO_POWER_PORT |= 1 << GPIO_POWER_PINS[GPIO_PORT(pin)];
    GPIO_CR_SET(pin, mode);
    GPIO_ODR_SET(pin, pullup);
}
示例#3
0
void gpio_set_pin(PIN pin, bool set)
{
	if (set)
        GPIO[GPIO_PORT(pin)]->BSRR = 1 << GPIO_PIN(pin);
	else
        GPIO[GPIO_PORT(pin)]->BRR = 1 << GPIO_PIN(pin);
}
示例#4
0
void stm32_gpio_digital_write(int pin, int value)
{
    if (value)
        GPIO_SetBits(GPIO_PORT(pin), GPIO_BIT(pin));
    else
        GPIO_ResetBits(GPIO_PORT(pin), GPIO_BIT(pin));
}
示例#5
0
void gpio_enable_pin(unsigned int pin, GPIO_MODE mode)
{
    unsigned int param = 0;
#ifdef LPC11Uxx
    if (GPIO_PORT(pin) == 0)
    {
        if ((1 << pin) & GPIO_I2C_MASK)
            param = IOCON_PIO_I2CMODE_GPIO;
        else if ((1 << pin) & GPIO_AD_MASK)
            param = IOCON_PIO_ADMODE;
        if ((1 << pin) & GPIO_MODE1_MASK)
            param |= (1 << 0);
    }
    switch (mode)
    {
    case GPIO_MODE_IN_PULLUP:
        param |= IOCON_PIO_MODE_PULL_UP | IOCON_PIO_HYS;
        break;
    case GPIO_MODE_IN_PULLDOWN:
        param |= IOCON_PIO_MODE_PULL_DOWN | IOCON_PIO_HYS;
        break;
    case GPIO_MODE_IN_FLOAT:
        param |= IOCON_PIO_HYS;
        break;
    default:
        break;
    }
#else //LPC18xx

    if (GPIO_PORT(pin) >= 5)
        param = (4 << 0);

    switch (mode)
    {
    case GPIO_MODE_IN_PULLUP:
        param |= SCU_SFS_EZI | SCU_SFS_ZIF;
        break;
    case GPIO_MODE_IN_PULLDOWN:
        param |= SCU_SFS_EPUN | SCU_SFS_EPD | SCU_SFS_EZI | SCU_SFS_ZIF;
        break;
    case GPIO_MODE_IN_FLOAT:
        param |= SCU_SFS_EPUN | SCU_SFS_EZI | SCU_SFS_ZIF;
        break;
    default:
        break;
    }
#endif //LPC11Uxx

    pin_enable(PIN_RAW(pin), param, 0);
    if (mode == GPIO_MODE_OUT)
        LPC_GPIO->DIR[GPIO_PORT(pin)] |= 1 << GPIO_PIN(pin);
    else
        LPC_GPIO->DIR[GPIO_PORT(pin)] &= ~(1 << GPIO_PIN(pin));
}
示例#6
0
void stm32_gpio_enable_pin(GPIO_DRV* gpio, PIN pin, unsigned int mode, AF af)
{
#if defined(STM32L0)
    if (GPIO_PORT(pin) >= GPIO_COUNT || (gpio->used_pins[GPIO_PORT(pin)]++ == 0))
        RCC->IOPENR |= 1 << GPIO_PORT(pin);
#else
    if (gpio->used_pins[GPIO_PORT(pin)]++ == 0)
        GPIO_POWER_PORT |= 1 << GPIO_POWER_PINS[GPIO_PORT(pin)];
#endif
    GPIO_SET_MODE(pin, (mode >> 0) & 3);
    GPIO_SET_OT(pin, (mode >> 2) & 1);
    GPIO_SET_SPEED(pin, (mode >> 3) & 3);
    GPIO_SET_PUPD(pin, (mode >> 5) & 3);
    GPIO_AFR_SET(pin, af);
}
示例#7
0
int
hal_gpio_init_out(int pin, int val)
{
    gpio_pin_config_t gconfig;
    port_pin_config_t pconfig;

    gconfig.pinDirection = kGPIO_DigitalOutput;
    pconfig.mux = kPORT_MuxAsGpio;

    CLOCK_EnableClock(s_portClocks[GPIO_PORT(pin)]);
    PORT_SetPinConfig(s_portBases[GPIO_PORT(pin)], GPIO_INDEX(pin), &pconfig);
    GPIO_PinInit(s_gpioBases[GPIO_PORT(pin)], GPIO_INDEX(pin), &gconfig);

    return 0;
}
示例#8
0
文件: gpio.c 项目: a-rubini/bathos
/* The following functions don't check the gpio value, for speed */
u32 __gpio_get(int gpio)
{
	int port = GPIO_PORT(gpio);
	int bit = GPIO_BIT(gpio);

	return readl(__GPIO_DAT(port)) & (1 << bit);
}
示例#9
0
文件: gpio.c 项目: a-rubini/bathos
void __gpio_set(int gpio, u32 value)
{
	int port = GPIO_PORT(gpio);
	int bit = GPIO_BIT(gpio);

	writel(value, __GPIO_BASE(port) + (0x4 << bit));
}
示例#10
0
void pinRemap(uint8_t pin, uint8_t GPIO_AF)
{
    GPIO_TypeDef * GPIOx = GPIO_PORT(pin);
    uint8_t pin2 = (pin & 0x7) * 4;
    pin = (pin & 0x0F) >> 3;
    GPIOx->AFR[pin] = (GPIOx->AFR[pin] & ~((uint32_t)0xF << pin2)) | ((uint32_t)GPIO_AF << pin2);
}
示例#11
0
文件: Gpio.c 项目: B-Rich/edk2
EFI_STATUS
Get (
  IN  EMBEDDED_GPIO     *This,
  IN  EMBEDDED_GPIO_PIN Gpio,
  OUT UINTN               *Value
  )
{
  UINTN  Port;
  UINTN  Pin;
  UINT32 DataInRegister;

  if (Value == NULL)
  {
    return EFI_UNSUPPORTED;
  }

  Port    = GPIO_PORT(Gpio);
  Pin     = GPIO_PIN(Gpio);

  DataInRegister = GpioBase(Port) + GPIO_DATAIN;

  if (MmioRead32 (DataInRegister) & GPIO_DATAIN_MASK(Pin)) {
    *Value = 1;
  } else {
    *Value = 0;
  }

  return EFI_SUCCESS;
}
示例#12
0
int
hal_gpio_toggle(int pin)
{
    GPIO_TogglePinsOutput(s_gpioBases[GPIO_PORT(pin)], 1 << GPIO_INDEX(pin));

    return 0;
}
示例#13
0
int
hal_gpio_init_in(int pin, hal_gpio_pull_t pull)
{
    gpio_pin_config_t gconfig;
    port_pin_config_t pconfig;

    gconfig.pinDirection = kGPIO_DigitalInput;
    pconfig.pullSelect = hal_to_fsl_pull(pull);
    pconfig.mux = kPORT_MuxAsGpio;

    CLOCK_EnableClock(s_portClocks[GPIO_PORT(pin)]);
    PORT_SetPinConfig(s_portBases[GPIO_PORT(pin)], GPIO_INDEX(pin), &pconfig);
    GPIO_PinInit(s_gpioBases[GPIO_PORT(pin)], GPIO_INDEX(pin), &gconfig);

    return 0;
}
示例#14
0
int gpio_get_value(unsigned gpio)
{
	unsigned l = readl(GPIO_FULLPORT(gpio));

	if (GPIO_PORT(gpio) == 0) /* PORT A */
		return (l >> GPIO_BIT(gpio)) & 0x1;
	return (l >> GPIO_BIT(gpio)) & 0x3;
}
示例#15
0
void pinToggle(u8 pin)
{
    GPIO_TypeDef * GPIOx = GPIO_PORT(pin);
    uint16_t mask = (1 << (pin & 0xF));
    if (GPIOx->ODR & mask)
        GPIOx->BSRRH = mask;
    else
        GPIOx->BSRRL = mask;
}
示例#16
0
void gpio_enable_pin(PIN pin, unsigned int mode, AF af)
{
    RCC->IOPENR |= 1 << GPIO_PORT(pin);
    GPIO_SET_MODE(pin, (mode >> 0) & 3);
    GPIO_SET_OT(pin, (mode >> 2) & 1);
    GPIO_SET_SPEED(pin, (mode >> 3) & 3);
    GPIO_SET_PUPD(pin, (mode >> 5) & 3);
    GPIO_AFR_SET(pin, af);
}
示例#17
0
void stm32_gpio_enable_exti(GPIO_DRV* gpio, PIN pin, unsigned int flags)
{
#if defined(STM32F1)
    AFIO->EXTICR[GPIO_PIN(pin) / 4] &= ~(0xful << (uint32_t)(GPIO_PIN(pin) & 3ul));
    AFIO->EXTICR[GPIO_PIN(pin) / 4] |= ((uint32_t)GPIO_PORT(pin) << (uint32_t)(GPIO_PIN(pin) & 3ul));
#else
    SYSCFG->EXTICR[GPIO_PIN(pin) / 4] &= ~(0xful << (uint32_t)(GPIO_PIN(pin) & 3ul));
    SYSCFG->EXTICR[GPIO_PIN(pin) / 4] |= ((uint32_t)GPIO_PORT(pin) << (uint32_t)(GPIO_PIN(pin) & 3ul));
#endif
    EXTI->RTSR &= ~(1ul << GPIO_PIN(pin));
    EXTI->FTSR &= ~(1ul << GPIO_PIN(pin));
    if (flags & EXTI_FLAGS_RISING)
        EXTI->RTSR |= 1ul << GPIO_PIN(pin);
    if (flags & EXTI_FLAGS_FALLING)
        EXTI->FTSR |= 1ul << GPIO_PIN(pin);
    EXTI->IMR |= 1ul << GPIO_PIN(pin);
    EXTI->EMR |= 1ul << GPIO_PIN(pin);
}
/**
 * gpio read 
 *  
 * Reads the specified pin. 
 *  
 * @param pin Pin number to read
 * 
 * @return int 0: low, 1: high
 */
int gpio_read(int pin)
{
    int port;
    uint32_t mcu_pin_mask;

    port = GPIO_PORT(pin);
    mcu_pin_mask = GPIO_MASK(pin);
    return HAL_GPIO_ReadPin(portmap[port], mcu_pin_mask);
}
/**
 * gpio clear
 *  
 * Sets specified pin to 0 (low). 
 * 
 * @param pin 
 */
void gpio_clear(int pin)
{
    int port;
    uint32_t mcu_pin_mask;

    port = GPIO_PORT(pin);
    mcu_pin_mask = GPIO_MASK(pin);
    HAL_GPIO_WritePin(portmap[port], mcu_pin_mask, GPIO_PIN_RESET);
}
示例#20
0
/**
 * gpio read
 *
 * Reads the specified pin.
 *
 * @param pin Pin number to read
 *
 * @return int 0: low, 1: high
 */
int
gpio_read(int pin)
{
    int port;
    uint32_t mcu_pin_mask;

    port = GPIO_PORT(pin);
    mcu_pin_mask = GPIO_MASK(pin);
    return GPIO_ReadInputDataBit(portmap[port], mcu_pin_mask);
}
示例#21
0
/**
 * gpio write
 *
 * Write a value (either high or low) to the specified pin.
 *
 * @param pin Pin to set
 * @param val Value to set pin (0:low 1:high)
 */
void
gpio_write(int pin, int val)
{
    int port;
    uint32_t mcu_pin_mask;

    port = GPIO_PORT(pin);
    mcu_pin_mask = GPIO_MASK(pin);
    GPIO_WriteBit(portmap[port], mcu_pin_mask, val);
}
示例#22
0
void ldr_init(void)
{
  //set AD4 to output and low
  IOCON_SETRPIN(ADC_PORT, ADC_4, IOCON_R_PIO | IOCON_NOPULL | IOCON_DIGITAL);
  GPIO_CLRPIN(ADC_PORT, ADC_4);
  GPIO_PORT(ADC_PORT)->DIR |= (1<<ADC_4);

  //set AD5 to analog
  IOCON_SETPIN(ADC_PORT, ADC_5, IOCON_ADC | IOCON_NOPULL | IOCON_ANALOG);

  return;
}
示例#23
0
文件: gpio.c 项目: mvanga/clay-os
int gpio_get(int gpio)
{
	int port = GPIO_PORT(gpio);
	int bit = GPIO_BIT(gpio);
	if (port < 0 || port > 3)
		return -1;
	if (bit < 0 || bit > 11)
		return -1;

	volatile u32 *reg;
	reg = (volatile u32 *)(GPIO_BASE + PORT_BASE*port + GPIO_DATA);
	return ((*reg & (1<<bit)) ? 1 : 0);
}
示例#24
0
void stm32_gpio_disable_pin(GPIO_DRV* gpio, PIN pin)
{
#if defined(STM32F1)
    GPIO_CR_SET(pin, GPIO_MODE_IN_FLOAT);
#else
    GPIO_SET_MODE(pin, STM32_GPIO_MODE_INPUT >> 0);
#if defined(STM32L0)
    GPIO_SET_SPEED(pin, GPIO_SPEED_VERY_LOW >> 3);
#else
    GPIO_SET_SPEED(pin, GPIO_SPEED_LOW >> 3);
#endif
    GPIO_SET_PUPD(pin,  GPIO_PUPD_NO_PULLUP >> 5);
    GPIO_AFR_SET(pin, AF0);
#endif
#if defined(STM32L0)
    if (GPIO_PORT(pin) >= GPIO_COUNT || (--gpio->used_pins[GPIO_PORT(pin)] == 0))
        RCC->IOPENR &= ~(1 << GPIO_PORT(pin));
#else
    if (--gpio->used_pins[GPIO_PORT(pin)] == 0)
        GPIO_POWER_PORT &= ~(1 << GPIO_POWER_PINS[GPIO_PORT(pin)]);
#endif
}
示例#25
0
文件: gpio.c 项目: mvanga/clay-os
void gpio_set(int gpio, int value)
{
	int port = GPIO_PORT(gpio);
	int bit = GPIO_BIT(gpio);
	volatile u32 *reg;
	if (port < 0 || port > 3)
		return;
	if (bit < 0 || bit > 11)
		return;
	reg = (volatile u32 *)(GPIO_BASE + PORT_BASE*port + GPIO_DATA);
	if (value)
		*reg &= ~(1 << bit);
	else
		*reg |= (1 << bit);
}
示例#26
0
void pinMode(u8 pin, PinMode_Type mode)
{
    GPIO_TypeDef * GPIOx = GPIO_PORT(pin);
    u8 pin2 = (pin & 0x0F) * 2;
    u32 mask = ~(0x03 << pin2);
    pin &= 0x0F;

    GPIOx->MODER	= (GPIOx->MODER   & mask) | ((mode & 0x3) << pin2);
    mode >>= 2;
    GPIOx->PUPDR	= (GPIOx->PUPDR   & mask) | ((mode & 0x3) << pin2);
    mode >>= 2;
    GPIOx->OSPEEDR	= (GPIOx->OSPEEDR & mask) | ((mode & 0x3) << pin2);
    mode >>= 2;
    GPIOx->OTYPER	= (GPIOx->OTYPER  & ~(1 << pin)) | ((mode & 0x1)  << pin);
}
示例#27
0
void _stm32_gpio_set_pin_function(int pin, int od, stm32_gpio_af_t af)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    if (af)
        STM32_GPIO_AF_CONFIG(pin, af);

    GPIO_InitStructure.GPIO_Pin = GPIO_BIT(pin);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    if (od)
	STM32_GPIO_PIN_TYPE_AF_OD(GPIO_InitStructure);
    else
	STM32_GPIO_PIN_TYPE_AF(GPIO_InitStructure);
    GPIO_Init(GPIO_PORT(pin), &GPIO_InitStructure);
}
示例#28
0
文件: gpio.c 项目: mvanga/clay-os
void gpio_dir(int gpio, int dir)
{
	int port = GPIO_PORT(gpio);
	int bit = GPIO_BIT(gpio);
	if (port < 0 || port > 3)
		return;
	if (bit < 0 || bit > 11)
		return;

	volatile u32 *reg;
	reg = (volatile u32 *)(GPIO_BASE + PORT_BASE*port + GPIO_DIR);
	if (dir)
		*reg |= (1 << bit);
	else
		*reg &= ~(1 << bit);
}
示例#29
0
void pinMode(uint8_t pin, PinMode_Type mode)
{
    __IO uint32_t * crx;
    uint32_t mask;
    uint8_t pin2;
    GPIO_TypeDef * port = GPIO_PORT(pin);

    crx = (pin & 0x08) ? &(port->CRH) : &(port->CRL);
    pin2 = (pin & 0x07) << 2;
    mask = ~(0x0F << pin2);
    *crx = (*crx & mask) | ((mode & 0x0F) << pin2);
    if (mode == GPIO_Mode_IPD)
        port->BRR  = (1 << pin);
    else if (mode == GPIO_Mode_IPU)
        port->BSRR = (1 << pin);
}
示例#30
0
文件: gpio.c 项目: LXiong/openwrt-rtk
/*
@func int32 | _rtl865x_getGpioDataBit | Get the bit value of a specified GPIO ID.
@parm uint32 | gpioId | GPIO ID
@parm uint32* | data | Pointer to store return value
@rvalue SUCCESS | success.
@rvalue FAILED | failed. Parameter error.
@comm
*/
int32 _rtl865x_getGpioDataBit( uint32 gpioId, uint32* pData )
{
	uint32 port = GPIO_PORT( gpioId );
	uint32 pin = GPIO_PIN( gpioId );

	if ( port >= GPIO_PORT_MAX ) return FAILED;
	if ( pin >= 8 ) return FAILED;
	if ( pData == NULL ) return FAILED;

	*pData = _getGpio( GPIO_FUNC_DATA, port, pin );
#if _GPIO_DEBUG_ >= 3
	rtlglue_printf("[%s():%d] (port=%d,pin=%d)=%d\n", __FUNCTION__, __LINE__, port, pin, *pData );
#endif

	return SUCCESS;
}