/*static*/ void GpioPlateformImplementation::internalPinSetupOutput( const int pin ) { const int pinNum = SUNXI_GPD( pin ); const unsigned int val = 1; // 0 = input , 1 = output unsigned int cfg; unsigned int bank = GPIO_BANK( pinNum ); unsigned int index = GPIO_CFG_INDEX( pinNum ); unsigned int offset = GPIO_CFG_OFFSET( pinNum ); if( s_sunxi_pio_base == 0) return ; struct sunxi_gpio *pio = &((struct sunxi_gpio_reg *) s_sunxi_pio_base )->gpio_bank[bank]; cfg = *(&pio->cfg[0] + index); cfg &= ~(0xf << offset); cfg |= val << offset; *(&pio->cfg[0] + index) = cfg; return ; }
int sunxi_gpio_set_cfgpin(u32 pin, u32 val) { u32 bank = GPIO_BANK(pin); u32 index = GPIO_CFG_INDEX(pin); u32 offset = GPIO_CFG_OFFSET(pin); struct sunxi_gpio *pio = BANK_TO_GPIO(bank); clrsetbits_le32(&pio->cfg[0] + index, 0xf << offset, val << offset); return 0; }
int sunxi_gpio_get_cfgpin(u32 pin) { u32 cfg; u32 bank = GPIO_BANK(pin); u32 index = GPIO_CFG_INDEX(pin); u32 offset = GPIO_CFG_OFFSET(pin); struct sunxi_gpio *pio = BANK_TO_GPIO(bank); cfg = readl(&pio->cfg[0] + index); cfg >>= offset; return cfg & 0xf; }
int sunxi_gpio_get_cfgpin(unsigned int pin) { unsigned int cfg; unsigned int bank = GPIO_BANK(pin); unsigned int index = GPIO_CFG_INDEX(pin); unsigned int offset = GPIO_CFG_OFFSET(pin); if (SUNXI_PIO_BASE == 0) { return -1; } struct sunxi_gpio *pio = &((struct sunxi_gpio_reg *) SUNXI_PIO_BASE)->gpio_bank[bank]; cfg = *(&pio->cfg[0] + index); cfg >>= offset; return (cfg & 0xf); }
int sunxi_gpio_get_cfgpin(u32 pin) { u32 cfg; u32 bank = GPIO_BANK(pin); u32 index = GPIO_CFG_INDEX(pin); u32 offset = GPIO_CFG_OFFSET(pin); struct sunxi_gpio *pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank]; cfg = readl(&pio->cfg[0] + index); cfg >>= offset; return (cfg & 0xf); }
int sunxi_gpio_set_cfgpin(unsigned int pin, unsigned int val) { unsigned int cfg; unsigned int bank = GPIO_BANK(pin); unsigned int index = GPIO_CFG_INDEX(pin); unsigned int offset = GPIO_CFG_OFFSET(pin); if(SUNXI_PIO_BASE == 0) { return -1; } struct sunxi_gpio *pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank]; cfg = *(&pio->cfg[0] + index); cfg &= ~(0xf << offset); cfg |= val << offset; *(&pio->cfg[0] + index) = cfg; return 0; }
int sunxi_gpio_set_cfgpin(u32 pin, u32 val) { u32 cfg; u32 bank = GPIO_BANK(pin); u32 index = GPIO_CFG_INDEX(pin); u32 offset = GPIO_CFG_OFFSET(pin); struct sunxi_gpio *pio = &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank]; cfg = readl(&pio->cfg[0] + index); cfg &= ~(0xf << offset); cfg |= val << offset; writel(cfg, &pio->cfg[0] + index); return 0; }