void set_gpio_oe(int gpio, int value) { int bank=0,offset=0; u32 tmp=0; gpio_t *gpio_base; if ( gpio > 191 || gpio < 0) return; bank = gpio/32 + 1; offset=gpio%32; gpio_base = get_gpio_base(bank); /** see TRM p3615, set bit to enable input **/ // printf("try to set gpio %d to input\n", gpio); tmp=__raw_readl((u32)&gpio_base->oe); // printf("oe read: %04x\n", tmp); if (value) { tmp = tmp | (1<<offset); /** set bit **/ } else { tmp = tmp & (~(1 << offset)); /** clear bit **/ } __raw_writel(tmp,(u32)&gpio_base->oe); // tmp=__raw_readl((u32)&gpio_base->oe); // printf("oe read back: %04x\n", tmp); }
int get_gpio_datain(int gpio) { int bank=0,offset=0; u32 tmp=0; gpio_t* gpio_base; if (gpio > 191 || gpio < 0) return -1; bank = gpio/32 + 1; offset = gpio%32; gpio_base = get_gpio_base(bank); /** check if the gpio is in input mode **/ tmp=__raw_readl((u32)&gpio_base->oe); /** test code for output **/ // printf("get_gpio_datain, gpio: %d, bank: %d, offset: %d, oe: 0x%04x\n", gpio, bank, offset, tmp); if ((tmp & ( 1 << offset) ) == 0) /* oe bit not set */ { return -2; } /** read standard datain register **/ tmp=__raw_readl((u32)&gpio_base->datain); return (tmp & ( 1 << offset)) ? 1 : 0; }
int cmd_gpio_high(int argc, char *argv[]) { unsigned long gpio; if(argc > 2) printf("sorry, too many parameters!"); if(!gpio_base_inited) get_gpio_base(); get_rsa(&gpio, argv[1]); printf("gpio is %d\n", gpio); if(gpio >= 16) { gpio = gpio - 16; GPIO_HI_BIT(gpio, GPIO_BASE_ADDR | GPIOH_OUT_VAL); GPIO_HI_BIT(gpio, GPIO_BASE_ADDR | GPIOH_OUT_EN); GPIO_LO_BIT(gpio, GPIO_BASE_ADDR | GPIOH_IN_EN); GPIO_LO_BIT(gpio, GPIO_BASE_ADDR | GPIOH_OUT_AUX1_SEL); GPIO_LO_BIT(gpio, GPIO_BASE_ADDR | GPIOH_OUT_AUX2_SEL); GPIO_LO_BIT(gpio, GPIO_BASE_ADDR | GPIOH_IN_AUX1_SEL); GPIO_HI_BIT(gpio, GPIO_BASE_ADDR | GPIOH_PU_EN); } else { GPIO_HI_BIT(gpio, GPIO_BASE_ADDR | GPIOL_OUT_VAL); GPIO_HI_BIT(gpio, GPIO_BASE_ADDR | GPIOL_OUT_EN); GPIO_LO_BIT(gpio, GPIO_BASE_ADDR | GPIOL_IN_EN); GPIO_LO_BIT(gpio, GPIO_BASE_ADDR | GPIOL_OUT_AUX1_SEL); GPIO_LO_BIT(gpio, GPIO_BASE_ADDR | GPIOL_OUT_AUX2_SEL); GPIO_LO_BIT(gpio, GPIO_BASE_ADDR | GPIOL_IN_AUX1_SEL); GPIO_HI_BIT(gpio, GPIO_BASE_ADDR | GPIOL_PU_EN); } return 0; }
int get_gpio(uint32_t gpio_def) { volatile uint32_t *gpio_port = get_gpio_base(gpio_def); uint32_t bitmask = 1 << (gpio_def & 0x1f); uint32_t status; if (gpio_port) { status = gpio_port[GPIO_DATAIN/4]; return (status & bitmask) ? 1 : 0; } return -1; }
int get_gpio(int gpio_num) { static const int gpio_reg_offsets[] = {0xc, 0x38, 0x48}; u16 gpio_base = get_gpio_base(); int index, bit; if (gpio_num > MAX_GPIO_NUMBER) return 0; /* Just ignore wrong gpio numbers. */ index = gpio_num / 32; bit = gpio_num % 32; return (inl(gpio_base + gpio_reg_offsets[index]) >> bit) & 1; }
void setup_pch_gpios(const struct pch_gpio_map *gpio) { u16 gpiobase = get_gpio_base(); /* GPIO Set 1 */ if (gpio->set1.level) outl(*((u32*)gpio->set1.level), gpiobase + GP_LVL); if (gpio->set1.mode) outl(*((u32*)gpio->set1.mode), gpiobase + GPIO_USE_SEL); if (gpio->set1.direction) outl(*((u32*)gpio->set1.direction), gpiobase + GP_IO_SEL); if (gpio->set1.reset) outl(*((u32*)gpio->set1.reset), gpiobase + GP_RST_SEL1); if (gpio->set1.invert) outl(*((u32*)gpio->set1.invert), gpiobase + GPI_INV); if (gpio->set1.blink) outl(*((u32*)gpio->set1.blink), gpiobase + GPO_BLINK); /* GPIO Set 2 */ if (gpio->set2.level) outl(*((u32*)gpio->set2.level), gpiobase + GP_LVL2); if (gpio->set2.mode) outl(*((u32*)gpio->set2.mode), gpiobase + GPIO_USE_SEL2); if (gpio->set2.direction) outl(*((u32*)gpio->set2.direction), gpiobase + GP_IO_SEL2); if (gpio->set2.reset) outl(*((u32*)gpio->set2.reset), gpiobase + GP_RST_SEL2); /* GPIO Set 3 */ if (gpio->set3.level) outl(*((u32*)gpio->set3.level), gpiobase + GP_LVL3); if (gpio->set3.mode) outl(*((u32*)gpio->set3.mode), gpiobase + GPIO_USE_SEL3); if (gpio->set3.direction) outl(*((u32*)gpio->set3.direction), gpiobase + GP_IO_SEL3); if (gpio->set3.reset) outl(*((u32*)gpio->set3.reset), gpiobase + GP_RST_SEL3); }
void clr_gpio(uint32_t gpio_def) { volatile uint32_t *gpio_port = get_gpio_base(gpio_def); uint32_t bitmask = 1 << (gpio_def & 0x1f); if (gpio_port) gpio_port[GPIO_CLEARDATAOUT/4] = bitmask; }