GPIO control: #define GPIO_BASE 0xB0010000 #define IRQ_GPIO3 25 #define IRQ_GPIO2 26 #define IRQ_GPIO1 27 #define IRQ_GPIO0 28 #define GPIO_IRQ_LOLEVEL 0 #define GPIO_IRQ_HILEVEL 1 #define GPIO_IRQ_FALLEDG 2 #define GPIO_IRQ_RAISEDG 3 // GP ... Registers: one set for each port of 32 pins; total 128 pins means 4 groups. Total size: 4 * 0x30 == 0xc0. #define GPIO_GPDR(n) (GPIO_BASE + (0x00 + (n)*0x30)) // D: data #define GPIO_GPDIR(n) (GPIO_BASE + (0x04 + (n)*0x30)) // DI: data in: 0 is input; 1 is output. Disable interrupts on the pin before touching this. #define GPIO_GPODR(n) (GPIO_BASE + (0x08 + (n)*0x30)) // OD: #define GPIO_GPPUR(n) (GPIO_BASE + (0x0c + (n)*0x30)) // PU: pull-up (1 is enable) #define GPIO_GPALR(n) (GPIO_BASE + (0x10 + (n)*0x30)) // AL: alternate lower: per 2 bit; 00 means use as gpio; other values mean use as alternate function #define GPIO_GPAUR(n) (GPIO_BASE + (0x14 + (n)*0x30)) // AU: alternate upper: same thing, needs 2 registers because it's 2 bits per pin. #define GPIO_GPIDLR(n) (GPIO_BASE + (0x18 + (n)*0x30)) // IDL: interrupt detect lower: per 2 bit (GPIO_IRQ_*) #define GPIO_GPIDUR(n) (GPIO_BASE + (0x1c + (n)*0x30)) // IDU: interrupt detect upper: same thing, upper 16 bit #define GPIO_GPIER(n) (GPIO_BASE + (0x20 + (n)*0x30)) // IE: interrupt enable (0 is disable) #define GPIO_GPIMR(n) (GPIO_BASE + (0x24 + (n)*0x30)) // IM: #define GPIO_GPFR(n) (GPIO_BASE + (0x28 + (n)*0x30)) // F: flag: set on interrupt; cleared by user. #define IRQ_GPIO_0 48 #define NUM_GPIO 128 // Pins for alternate functions: #define __gpio_as_ssi() \ do { \ REG_GPIO_GPALR(2) &= 0xFC00FFFF; \ REG_GPIO_GPALR(2) |= 0x01550000; \ } while (0) #define __gpio_as_uart3() \ do { \ REG_GPIO_GPAUR(0) &= 0xFFFF0000; \ REG_GPIO_GPAUR(0) |= 0x00005555; \ } while (0) #define __gpio_as_uart2() \ do { \ REG_GPIO_GPALR(3) &= 0x3FFFFFFF; \ REG_GPIO_GPALR(3) |= 0x40000000; \ REG_GPIO_GPAUR(3) &= 0xF3FFFFFF; \ REG_GPIO_GPAUR(3) |= 0x04000000; \ } while (0) #define __gpio_as_uart1() \ do { \ REG_GPIO_GPAUR(0) &= 0xFFF0FFFF; \ REG_GPIO_GPAUR(0) |= 0x00050000; \ } while (0) #define __gpio_as_uart0() \ do { \ REG_GPIO_GPAUR(3) &= 0x0FFFFFFF; \ REG_GPIO_GPAUR(3) |= 0x50000000; \ } while (0) #define __gpio_as_scc0() \ do { \ REG_GPIO_GPALR(2) &= 0xFFFFFFCC; \ REG_GPIO_GPALR(2) |= 0x00000011; \ } while (0) #define __gpio_as_scc1() \ do { \ REG_GPIO_GPALR(2) &= 0xFFFFFF33; \ REG_GPIO_GPALR(2) |= 0x00000044; \ } while (0) #define __gpio_as_scc() \ do { \ __gpio_as_scc0(); \ __gpio_as_scc1(); \ } while (0) #define __gpio_as_dma() \ do { \ REG_GPIO_GPALR(0) &= 0x00FFFFFF; \ REG_GPIO_GPALR(0) |= 0x55000000; \ REG_GPIO_GPAUR(0) &= 0xFF0FFFFF; \ REG_GPIO_GPAUR(0) |= 0x00500000; \ } while (0) #define __gpio_as_msc() \ do { \ REG_GPIO_GPALR(1) &= 0xFFFF000F; \ REG_GPIO_GPALR(1) |= 0x00005550; \ } while (0) #define __gpio_as_pcmcia() \ do { \ REG_GPIO_GPAUR(2) &= 0xF000FFFF; \ REG_GPIO_GPAUR(2) |= 0x05550000; \ } while (0) #define __gpio_as_emc(csmask) \ do { \ REG_GPIO_GPALR(2) &= 0x3FFFFFFF; \ REG_GPIO_GPALR(2) |= 0x40000000; \ REG_GPIO_GPAUR(2) &= 0xFFFF0000; \ REG_GPIO_GPAUR(2) |= 0x00005555; \ } while (0) #define __gpio_as_lcd_slave() \ do { \ REG_GPIO_GPALR(1) &= 0x0000FFFF; \ REG_GPIO_GPALR(1) |= 0x55550000; \ REG_GPIO_GPAUR(1) &= 0x00000000; \ REG_GPIO_GPAUR(1) |= 0x55555555; \ } while (0) #define __gpio_as_lcd_master() \ do { \ REG_GPIO_GPALR(1) &= 0x0000FFFF; \ REG_GPIO_GPALR(1) |= 0x55550000; \ REG_GPIO_GPAUR(1) &= 0x00000000; \ REG_GPIO_GPAUR(1) |= 0x556A5555; \ } while (0) #define __gpio_as_usb() \ do { \ REG_GPIO_GPAUR(0) &= 0x00FFFFFF; \ REG_GPIO_GPAUR(0) |= 0x55000000; \ } while (0) #define __gpio_as_ac97() \ do { \ REG_GPIO_GPALR(2) &= 0xC3FF03FF; \ REG_GPIO_GPALR(2) |= 0x24005400; \ } while (0) #define __gpio_as_i2s_slave() \ do { \ REG_GPIO_GPALR(2) &= 0xC3FF0CFF; \ REG_GPIO_GPALR(2) |= 0x14005100; \ } while (0) #define __gpio_as_i2s_master() \ do { \ REG_GPIO_GPALR(2) &= 0xC3FF0CFF; \ REG_GPIO_GPALR(2) |= 0x28005100; \ } while (0) #define __gpio_as_eth() \ do { \ REG_GPIO_GPAUR(3) &= 0xFC000000; \ REG_GPIO_GPAUR(3) |= 0x01555555; \ } while (0) #define __gpio_as_pwm() \ do { \ REG_GPIO_GPAUR(2) &= 0x0FFFFFFF; \ REG_GPIO_GPAUR(2) |= 0x50000000; \ } while (0) #define __gpio_as_ps2() \ do { \ REG_GPIO_GPALR(1) &= 0xFFFFFFF0; \ REG_GPIO_GPALR(1) |= 0x00000005; \ } while (0) #define __gpio_as_uprt() \ do { \ REG_GPIO_GPALR(1) &= 0x0000000F; \ REG_GPIO_GPALR(1) |= 0x55555550; \ REG_GPIO_GPALR(3) &= 0xC0000000; \ REG_GPIO_GPALR(3) |= 0x15555555; \ } while (0) #define __gpio_as_cim() \ do { \ REG_GPIO_GPALR(0) &= 0xFF000000; \ REG_GPIO_GPALR(0) |= 0x00555555; \ } while (0) // Pins on the trendtac: 0 keyboard 1 keyboard 2 keyboard 3 keyboard 4 keyboard 5 keyboard 6 keyboard 7 keyboard 8 keyboard interrupt 9 10 11 12 13 touchpad right button 14 15 16 touchpad left button 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 keyboard 97 keyboard 98 keyboard 99 keyboard 100 keyboard 101 keyboard 102 keyboard 103 keyboard 104 keyboard 105 keyboard 106 keyboard 107 keyboard 108 keyboard 109 keyboard 110 keyboard 111 keyboard 112 113 114 115 116 117 118 119 120 121 122 123 124 125 keyboard 126 127