int board_ehci_hcd_init(int port) { imx_iomux_v3_setup_multiple_pads(usb_pads, ARRAY_SIZE(usb_pads)); /* Reset USB hub */ gpio_direction_output(GPIO_NUMBER(7, 12), 0); mdelay(2); gpio_set_value(GPIO_NUMBER(7, 12), 1); return 0; }
/*=========================================================================== FUNCTION GPIO_RESTORE_GPIOS_AFTER_SLEEP DESCRIPTION GPIOs are returned to their original configuration. DEPENDENCIES None. RETURN VALUE None ===========================================================================*/ void gpio_restore_gpios_after_sleep( void ) { int io; uint32 gpio_number; /* Restore GPIO_OE_* and GPIO_OUT_* registers to their "awake" value which is in the bio_gpio_image shadow values. */ for(io=0; io<4; io++) { if(bio_gpio[io].tsen_addr) { outpdw(bio_gpio[io].out_addr, (bio_gpio_image[io].out_buf)); outpdw(bio_gpio[io].tsen_addr, (bio_gpio_image[io].ts_buf)); } } /* Restore GPIOs to their "awake" function using gpio_configs as the shadow value. */ for(io=0; gpio_sleep_changes[io] != GPIO_GENERIC_DEFAULT; io++) { gpio_number = GPIO_NUMBER(gpio_sleep_changes[io]); gpio_tlmm_config( gpio_configs[gpio_number] ); } }
/*=========================================================================== FUNCTION GPIO_TRISTATE DESCRIPTION This function enables/ disables tri-state on specified GPIO. Writing a value 0 (GPIO_TRISTATE_DISABLE) disables the tristate and writing a value 1 (GPIO_TRISTATE_ENABLE) enables tristate. DEPENDENCIES None. RETURN VALUE None ===========================================================================*/ void gpio_tristate( GPIO_SignalType gpio_signal, GPIO_TristateType gpio_tristate_value) { uint32 gpio_oe_register; uint32 gpio_mask; uint8 gpio_number; gpio_number = GPIO_NUMBER(gpio_signal); if (gpio_number >= GPIO_NUM_GPIOS) { #ifndef BUILD_BOOT_CHAIN ERR_FATAL("Invalid GPIO number 0x%x",gpio_number, 0, 0); #endif return; } gpio_oe_register = GPIO_GROUP(gpio_signal); gpio_mask = 1 <<(gpio_number-GPIO_GROUP_START[gpio_oe_register]); if (gpio_tristate_value == GPIO_TRISTATE_DISABLE) { BIO_TRISTATE(gpio_oe_register,gpio_mask,gpio_mask); } else { BIO_TRISTATE(gpio_oe_register,gpio_mask,0); } }
/*=========================================================================== FUNCTION GPIO_IN DESCRIPTION Reads the the corresponding GPIO register given a GPIO signal type and extracts the value for that particular GPIO. This function calculates the GPIO register and the mask value required to return the GPIO value. DEPENDENCIES None. RETURN VALUE GPIO value at the given GPIO number ===========================================================================*/ GPIO_ValueType gpio_in( GPIO_SignalType gpio_signal ) { uint32 gpio_in_register; uint32 gpio_mask; uint32 gpio_value; uint8 gpio_number; gpio_number = GPIO_NUMBER(gpio_signal); if (gpio_number >= GPIO_NUM_GPIOS) { #ifndef BUILD_BOOT_CHAIN ERR_FATAL("Invalid GPIO number 0x%x",gpio_number, 0, 0); #endif return; } gpio_in_register = GPIO_GROUP(gpio_signal); gpio_mask = 1 <<(gpio_number-GPIO_GROUP_START[gpio_in_register]); gpio_value = inpdw(bio_gpio[gpio_in_register].in_addr) & gpio_mask; if (gpio_value == 0) { return GPIO_LOW_VALUE; } else { return GPIO_HIGH_VALUE; } }
/*=========================================================================== FUNCTION GPIO_OUT DESCRIPTION Outputs the given value to the corresponding GPIO register given a GPIO signal type. This function calculates the GPIO register and the mask value. DEPENDENCIES None. RETURN VALUE None ===========================================================================*/ void gpio_out( GPIO_SignalType gpio_signal, GPIO_ValueType gpio_value ) { uint32 gpio_out_register; uint32 gpio_mask; uint8 gpio_number; gpio_number = GPIO_NUMBER(gpio_signal); if (gpio_number >= GPIO_NUM_GPIOS) { #ifndef BUILD_BOOT_CHAIN ERR_FATAL("Invalid GPIO number 0x%x",gpio_number, 0, 0); #endif return; } gpio_out_register = GPIO_GROUP(gpio_signal); gpio_mask = 1 << (gpio_number - GPIO_GROUP_START[gpio_out_register]); if (gpio_value == GPIO_LOW_VALUE) { BIO_OUT(gpio_out_register, gpio_mask, 0); } else { BIO_OUT(gpio_out_register, gpio_mask, gpio_mask); } }
/*=========================================================================== FUNCTION GPIO_TLMM_CONFIG DESCRIPTION Configures the GPIO TLMM as per the signal value used for the given GPIO. DEPENDENCIES None. RETURN VALUE None ===========================================================================*/ void gpio_tlmm_config(GPIO_SignalType gpio_signal) { GPIO_PolarityType gpio_polarity; uint32 gpio_oe_register; uint32 gpio_mask; uint8 gpio_number; gpio_number = GPIO_NUMBER(gpio_signal); if (gpio_number >= GPIO_NUM_GPIOS) { #ifndef BUILD_BOOT_CHAIN ERR_FATAL("Invalid GPIO number 0x%x",gpio_number, 0, 0); #endif return; } gpio_polarity = GPIO_POLARITY(gpio_signal); gpio_oe_register = GPIO_GROUP(gpio_signal); gpio_mask = 1 <<(gpio_number-GPIO_GROUP_START[gpio_oe_register]); INTLOCK(); if (gpio_oe_register < 2) { HWIO_OUT(GPIO_PAGE,gpio_number); HWIO_OUT(GPIO_CFG,(GPIO_SIGNAL(gpio_signal)<<2) | GPIO_PULL(gpio_signal)); } else { HWIO_OUT(GPIO2_PAGE,gpio_number); HWIO_OUT(GPIO2_CFG,(GPIO_SIGNAL(gpio_signal)<<2) | GPIO_PULL(gpio_signal)); } INTFREE(); if ( gpio_polarity == GPIO_OUTPUT ) { BIO_TRISTATE(gpio_oe_register, gpio_mask, gpio_mask); } else { BIO_TRISTATE(gpio_oe_register, gpio_mask, 0); } gpio_configs[gpio_number] = gpio_signal; }
/*=========================================================================== FUNCTION GPIO_CONFIG_GPIOS_FOR_SLEEP DESCRIPTION GPIOs are reconfigured to their low power settings in preparation for turning off TCXO and putting the phone in low power mode. DEPENDENCIES None. RETURN VALUE None ===========================================================================*/ void gpio_config_gpios_for_sleep( void ) { int io; GPIO_SignalType gpio_old_signal; uint32 gpio_number; /* Reconfigure the GPIO_CFG of select GPIOs */ for(io=0; gpio_sleep_changes[io] != GPIO_GENERIC_DEFAULT; io++) { gpio_number = GPIO_NUMBER(gpio_sleep_changes[io]); gpio_old_signal = gpio_configs[gpio_number]; gpio_tlmm_config(gpio_sleep_changes[io]); /* set gpio_configs[] to reflect the old purpose for restore after sleep. */ gpio_configs[gpio_number] = gpio_old_signal; } for(io=0; io<GPIO_OE_REG_NUM; io++) { if(bio_gpio[io].tsen_addr) { /* Reconfigure the GPIO_OE_* and GPIO_OUT_* registers. Shadow values of these registers are not changed so that the "awake" value may be restored after sleep. */ /* Change GPIO_OE_* without updating shadow values */ outpdw(bio_gpio[io].tsen_addr, (bio_gpio_image[io].ts_buf & (~gpio_sleep_oe[io].mask)) | ( gpio_sleep_oe[io].mask & gpio_sleep_oe[io].out)); /* Change GPIO_OUT_* without updating shadow values */ outpdw(bio_gpio[io].out_addr, (bio_gpio_image[io].out_buf & (~gpio_sleep_out[io].mask)) | (gpio_sleep_out[io].mask & gpio_sleep_out[io].out)); } } }
int checkboard(void) { puts("Board: MX6Q-Sabre Lite\n"); return 0; } struct button_key { char const *name; unsigned gpnum; char ident; }; static struct button_key const buttons[] = { {"back", GPIO_NUMBER(2, 2), 'B'}, {"home", GPIO_NUMBER(2, 4), 'H'}, {"menu", GPIO_NUMBER(2, 1), 'M'}, {"search", GPIO_NUMBER(2, 3), 'S'}, {"volup", GPIO_NUMBER(7, 13), 'V'}, {"voldown", GPIO_NUMBER(4, 5), 'v'}, }; /* * generate a null-terminated string containing the buttons pressed * returns number of keys pressed */ static int read_keys(char *buf) { int i, numpressed = 0; for (i = 0; i < ARRAY_SIZE(buttons); i++) {