static void __pl011_uart5_prepare(void) { NX_UART_CH_INIT(5); NX_GPIO_SetPadFunction (PAD_GET_GROUP(PAD_GPIO_B), 30, NX_GPIO_PADFUNC_3); // RX NX_GPIO_SetPadFunction (PAD_GET_GROUP(PAD_GPIO_B), 31, NX_GPIO_PADFUNC_3); // TX NX_GPIO_SetOutputEnable(PAD_GET_GROUP(PAD_GPIO_B), 30, CFALSE); NX_GPIO_SetOutputEnable(PAD_GET_GROUP(PAD_GPIO_B), 31, CTRUE); }
static void __pl011_uart1_prepare(void) { NX_UART_CH_INIT(1); NX_GPIO_SetPadFunction (PAD_GET_GROUP(PAD_GPIO_D), 15, NX_GPIO_PADFUNC_1); // RX NX_GPIO_SetPadFunction (PAD_GET_GROUP(PAD_GPIO_D), 19, NX_GPIO_PADFUNC_1); // TX NX_GPIO_SetOutputEnable(PAD_GET_GROUP(PAD_GPIO_D), 15, CFALSE); NX_GPIO_SetOutputEnable(PAD_GET_GROUP(PAD_GPIO_D), 19, CTRUE); }
static void uart_device_init(int hwport) { switch(hwport) { case 0: UART_CHARNNEL_INIT(0);break; case 1: UART_CHARNNEL_INIT(1);break; case 2: UART_CHARNNEL_INIT(2);break; case 3: UART_CHARNNEL_INIT(3);break; case 4: UART_CHARNNEL_INIT(4);break; case 5: UART_CHARNNEL_INIT(5);break; } NX_GPIO_SetPadFunction (PAD_GET_GROUP(uart_port[hwport][0]), uart_port[hwport][1], uart_port[hwport][4] ); // RX NX_GPIO_SetPadFunction (PAD_GET_GROUP(uart_port[hwport][2]), uart_port[hwport][3], uart_port[hwport][4] ); // TX NX_GPIO_SetOutputEnable(PAD_GET_GROUP(uart_port[hwport][0]), uart_port[hwport][1], CFALSE); NX_GPIO_SetOutputEnable(PAD_GET_GROUP(uart_port[hwport][2]), uart_port[hwport][3], CTRUE); }
static void io_init(void) { /* GPIO_C4设置为input */ NX_GPIO_SetOutputEnable(PAD_GPIO_C, 4, CFALSE); NX_GPIO_SetInterruptMode(PAD_GPIO_C, 4, NX_GPIO_INTMODE_HIGHLEVEL); NX_GPIO_SetInterruptEnable(PAD_GPIO_C, 4, CTRUE); return; }
static void bd_gpio_init(void) { int index, bit; int mode, func, out, lv, plup, stren; U32 gpio; const U32 pads[NUMBER_OF_GPIO_MODULE][32] = { { /* GPIO_A */ PAD_GPIOA0 , PAD_GPIOA1 , PAD_GPIOA2 , PAD_GPIOA3 , PAD_GPIOA4 , PAD_GPIOA5 , PAD_GPIOA6 , PAD_GPIOA7 , PAD_GPIOA8 , PAD_GPIOA9 , PAD_GPIOA10, PAD_GPIOA11, PAD_GPIOA12, PAD_GPIOA13, PAD_GPIOA14, PAD_GPIOA15, PAD_GPIOA16, PAD_GPIOA17, PAD_GPIOA18, PAD_GPIOA19, PAD_GPIOA20, PAD_GPIOA21, PAD_GPIOA22, PAD_GPIOA23, PAD_GPIOA24, PAD_GPIOA25, PAD_GPIOA26, PAD_GPIOA27, PAD_GPIOA28, PAD_GPIOA29, PAD_GPIOA30, PAD_GPIOA31 }, { /* GPIO_B */ PAD_GPIOB0 , PAD_GPIOB1 , PAD_GPIOB2 , PAD_GPIOB3 , PAD_GPIOB4 , PAD_GPIOB5 , PAD_GPIOB6 , PAD_GPIOB7 , PAD_GPIOB8 , PAD_GPIOB9 , PAD_GPIOB10, PAD_GPIOB11, PAD_GPIOB12, PAD_GPIOB13, PAD_GPIOB14, PAD_GPIOB15, PAD_GPIOB16, PAD_GPIOB17, PAD_GPIOB18, PAD_GPIOB19, PAD_GPIOB20, PAD_GPIOB21, PAD_GPIOB22, PAD_GPIOB23, PAD_GPIOB24, PAD_GPIOB25, PAD_GPIOB26, PAD_GPIOB27, PAD_GPIOB28, PAD_GPIOB29, PAD_GPIOB30, PAD_GPIOB31 }, { /* GPIO_C */ PAD_GPIOC0 , PAD_GPIOC1 , PAD_GPIOC2 , PAD_GPIOC3 , PAD_GPIOC4 , PAD_GPIOC5 , PAD_GPIOC6 , PAD_GPIOC7 , PAD_GPIOC8 , PAD_GPIOC9 , PAD_GPIOC10, PAD_GPIOC11, PAD_GPIOC12, PAD_GPIOC13, PAD_GPIOC14, PAD_GPIOC15, PAD_GPIOC16, PAD_GPIOC17, PAD_GPIOC18, PAD_GPIOC19, PAD_GPIOC20, PAD_GPIOC21, PAD_GPIOC22, PAD_GPIOC23, PAD_GPIOC24, PAD_GPIOC25, PAD_GPIOC26, PAD_GPIOC27, PAD_GPIOC28, PAD_GPIOC29, PAD_GPIOC30, PAD_GPIOC31 }, { /* GPIO_D */ PAD_GPIOD0 , PAD_GPIOD1 , PAD_GPIOD2 , PAD_GPIOD3 , PAD_GPIOD4 , PAD_GPIOD5 , PAD_GPIOD6 , PAD_GPIOD7 , PAD_GPIOD8 , PAD_GPIOD9 , PAD_GPIOD10, PAD_GPIOD11, PAD_GPIOD12, PAD_GPIOD13, PAD_GPIOD14, PAD_GPIOD15, PAD_GPIOD16, PAD_GPIOD17, PAD_GPIOD18, PAD_GPIOD19, PAD_GPIOD20, PAD_GPIOD21, PAD_GPIOD22, PAD_GPIOD23, PAD_GPIOD24, PAD_GPIOD25, PAD_GPIOD26, PAD_GPIOD27, PAD_GPIOD28, PAD_GPIOD29, PAD_GPIOD30, PAD_GPIOD31 }, { /* GPIO_E */ PAD_GPIOE0 , PAD_GPIOE1 , PAD_GPIOE2 , PAD_GPIOE3 , PAD_GPIOE4 , PAD_GPIOE5 , PAD_GPIOE6 , PAD_GPIOE7 , PAD_GPIOE8 , PAD_GPIOE9 , PAD_GPIOE10, PAD_GPIOE11, PAD_GPIOE12, PAD_GPIOE13, PAD_GPIOE14, PAD_GPIOE15, PAD_GPIOE16, PAD_GPIOE17, PAD_GPIOE18, PAD_GPIOE19, PAD_GPIOE20, PAD_GPIOE21, PAD_GPIOE22, PAD_GPIOE23, PAD_GPIOE24, PAD_GPIOE25, PAD_GPIOE26, PAD_GPIOE27, PAD_GPIOE28, PAD_GPIOE29, PAD_GPIOE30, PAD_GPIOE31 }, }; /* GPIO pad function */ for (index = 0; NUMBER_OF_GPIO_MODULE > index; index++) { NX_GPIO_ClearInterruptPendingAll(index); for (bit = 0; 32 > bit; bit++) { gpio = pads[index][bit]; func = PAD_GET_FUNC(gpio); mode = PAD_GET_MODE(gpio); lv = PAD_GET_LEVEL(gpio); stren = PAD_GET_STRENGTH(gpio); plup = PAD_GET_PULLUP(gpio); /* get pad alternate function (0,1,2,4) */ switch (func) { case PAD_GET_FUNC(PAD_FUNC_ALT0): func = NX_GPIO_PADFUNC_0; break; case PAD_GET_FUNC(PAD_FUNC_ALT1): func = NX_GPIO_PADFUNC_1; break; case PAD_GET_FUNC(PAD_FUNC_ALT2): func = NX_GPIO_PADFUNC_2; break; case PAD_GET_FUNC(PAD_FUNC_ALT3): func = NX_GPIO_PADFUNC_3; break; default: printf("ERROR, unknown alt func (%d.%02d=%d)\n", index, bit, func); continue; } switch (mode) { case PAD_GET_MODE(PAD_MODE_ALT): out = 0; case PAD_GET_MODE(PAD_MODE_IN ): out = 0; case PAD_GET_MODE(PAD_MODE_INT): out = 0; break; case PAD_GET_MODE(PAD_MODE_OUT): out = 1; break; default: printf("ERROR, unknown io mode (%d.%02d=%d)\n", index, bit, mode); continue; } NX_GPIO_SetPadFunction(index, bit, func); NX_GPIO_SetOutputEnable(index, bit, (out ? CTRUE : CFALSE)); NX_GPIO_SetOutputValue(index, bit, (lv ? CTRUE : CFALSE)); NX_GPIO_SetInterruptMode(index, bit, (lv)); NX_GPIO_SetPullMode(index, bit, plup); set_gpio_strenth(index, bit, stren); /* pad strength */ } NX_GPIO_SetDRV0_DISABLE_DEFAULT(index, 0xFFFFFFFF); NX_GPIO_SetDRV1_DISABLE_DEFAULT(index, 0xFFFFFFFF); } }
int ehci_hcd_init(int index, enum usb_init_type init, struct ehci_hccr **hccr, struct ehci_hcor **hcor) { //reset //1. ohci writel(readl(0xc0011014) & ~(1<<18), 0xc0011014); //2. auxwell writel(readl(0xc0011014) & ~(1<<19), 0xc0011014); //3. ahb writel(readl(0xc0011014) & ~(1<<17), 0xc0011014); //4. hsic utmi writel(readl(0xc0011014) & ~(1<<22), 0xc0011014); //5. ehci utmi writel(readl(0xc0011014) & ~(1<<21), 0xc0011014); //6. free writel(readl(0xc0011014) & ~(1<<20), 0xc0011014); //7. hsic por writel(readl(0xc0011028) | (3<<18), 0xc0011028); //8. echi por writel(readl(0xc0011020) | (3<<7 ), 0xc0011020); //9. resetcon writel(readl(0xc0012004) & ~(1<<24), 0xc0012004); // reset on #if defined( CONFIG_USB_HSIC_MODE ) // GPIO Reset NX_GPIO_SetPadFunction( 4, 22, 0 ); NX_GPIO_SetOutputEnable( 4, 22, CTRUE ); #if defined( CONFIG_MACH_S5P4418 ) NX_GPIO_SetPullSelect( 4, 22, CTRUE ); NX_GPIO_SetPullEnable( 4, 22, CFALSE ); #else NX_GPIO_SetPullEnable( 4, 22, NX_GPIO_PULL_UP ); #endif NX_GPIO_SetOutputValue( 4, 22, CTRUE ); udelay( 100 ); NX_GPIO_SetOutputValue( 4, 22, CFALSE ); udelay( 100 ); NX_GPIO_SetOutputValue( 4, 22, CTRUE ); #endif // Release common reset of host controller writel(readl(0xc0012004) | (1<<24), 0xc0012004); // reset off NX_CONSOLE_Printf( "\nRSTCON[24](0xc0012004) set 1'b1 0x%08x\n", readl( 0xc0012004 ) ); #if defined( CONFIG_USB_HSIC_MODE ) // HSIC 12M rerference Clock setting writel( 0x02, 0xc006b000 ); writel( 0x0C, 0xc006b004 ); // 8 : ok, c : no writel( 0x10, 0xc006b00c ); writel( 0x30, 0xc006b00c ); writel( 0x06, 0xc006b000 ); // HSIC 480M clock setting writel(readl(0xc0011014) & ~(3<<23), 0xc0011014); writel(readl(0xc0011014) | (2<<23), 0xc0011014); // 2. HSIC Enable in PORT1 of LINK writel(readl(0xc0011014) & ~(7<<14), 0xc0011014); writel(readl(0xc0011014) | (2<<14), 0xc0011014); #endif // Program AHB Burst type writel(readl(0xc001101c) & ~(7<<25), 0xc001101c); writel(readl(0xc001101c) | (7<<25), 0xc001101c); NX_CONSOLE_Printf( "TIEOFFREG7[27:25](0xc001101c) set 3'b111 0x%08x\n", readl( 0xc001101c ) ); // Select word interface and enable word interface selection in link writel(readl(0xc0011014) & ~(3<<25), 0xc0011014); writel(readl(0xc0011014) | (3<<25), 0xc0011014); // 2'b01 8bit, 2'b11 16bit word NX_CONSOLE_Printf( "TIEOFFREG5[26:25](0xc0011014) set 2'b11 0x%08x\n", readl( 0xc0011014 ) ); // Select word interface and enable word interface selection in link in EHCI PHY writel(readl(0xc0011024) & ~(3<<8), 0xc0011024); writel(readl(0xc0011024) | (3<<8), 0xc0011024); // 2'b01 8bit, 2'b11 16bit word NX_CONSOLE_Printf( "TIEOFFREG9[10:9](0xc0011024) set 2'b11 0x%08x\n", readl( 0xc0011024 ) ); // POR of EHCI PHY writel(readl(0xc0011020) & ~(3<<7), 0xc0011020); writel(readl(0xc0011020) | (1<<7), 0xc0011020); NX_CONSOLE_Printf( "TIEOFFREG8[8:7](0xc0011020) set 2'b01 0x%08x\n", readl( 0xc0011020 ) ); // Wait clock of PHY - about 40 micro seconds udelay(40); // 40us delay need. #if defined( CONFIG_USB_HSIC_MODE ) NX_CONSOLE_Printf( "\n HSIC PHY Init!!!\n" ); udelay(10); // 10us delay need. // word interface in HSIC PHY writel(readl(0xc001102c) & ~(3<<12), 0xc001102c); writel(readl(0xc001102c) | (3<<12), 0xc001102c); // 2'b01 8bit, 2'b11 16bit word // NX_CONSOLE_Printf( "TIEOFFREG9[10:9](0xc001102c) set 2'b11 0x%08x\n", readl( 0xc001102c ) ); // POR of HSIC PHY writel(readl(0xc0011028) & ~(3<<18), 0xc0011028); writel(readl(0xc0011028) | (1<<18), 0xc0011028); // NX_CONSOLE_Printf( "TIEOFFREG8[19:18](0xc0011028) set 2'b01 0x%08x\n", readl( 0xc0011028 ) ); // 5. Wait clock of PHY - about 40 micro seconds //udelay(40); // 40us delay need. udelay(400); // 40us delay need. #endif // Release phy free clock reset writel(readl(0xc0011014) | (1<<20), 0xc0011014); udelay(2); #if defined( CONFIG_USB_EHCI_MODE ) // Release ehci utmi reset writel(readl(0xc0011014) | (1<<21), 0xc0011014); udelay(2); NX_CONSOLE_Printf( "TIEOFFREG5[21:20](0xc0011014) set 2'b11 0x%08x\n", readl( 0xc0011014 ) ); #endif #if defined( CONFIG_USB_HSIC_MODE ) // Release hsic utmi reset writel(readl(0xc0011014) | (1<<22), 0xc0011014); udelay(2); #endif //Release ahb reset of EHCI writel(readl(0xc0011014) | (1<<17), 0xc0011014); //Release ahb reset of OHCI writel(readl(0xc0011014) | (1<<18), 0xc0011014); //Release auxwell reset of EHCI, OHCI writel(readl(0xc0011014) | (1<<19), 0xc0011014); // set Base Address NX_USB20HOST_SetBaseAddress( 0, (void*)NX_USB20HOST_GetPhysicalAddress(0) ); *hccr = ( struct ehci_hccr * )( NX_USB20HOST_GetBaseAddress(0) ); *hcor = ( struct ehci_hcor * )( NX_USB20HOST_GetBaseAddress(0) + 0x10 ); // NX_CONSOLE_Printf( "Set EHCI Base Address : hccr( 0x%08x ), hcor( 0x%08x )\n" , *hccr, *hcor ); return 0; }
/*------------------------------------------------------------------------------ * set nexell soc pad func. */ static void init_gpio_pad(void) { int io_grp, io_bit; U32 io_mod, outval, detect, pullup, strength; const U32 io_pad[NUMBER_OF_GPIO_MODULE][32] = { /* GPIO group A */ { PAD_GPIOA0, PAD_GPIOA1, PAD_GPIOA2, PAD_GPIOA3, PAD_GPIOA4, PAD_GPIOA5, PAD_GPIOA6, PAD_GPIOA7, PAD_GPIOA8, PAD_GPIOA9, PAD_GPIOA10, PAD_GPIOA11, PAD_GPIOA12, PAD_GPIOA13, PAD_GPIOA14, PAD_GPIOA15, PAD_GPIOA16, PAD_GPIOA17, PAD_GPIOA18, PAD_GPIOA19, PAD_GPIOA20, PAD_GPIOA21, PAD_GPIOA22, PAD_GPIOA23, PAD_GPIOA24, PAD_GPIOA25, PAD_GPIOA26, PAD_GPIOA27, PAD_GPIOA28, PAD_GPIOA29, PAD_GPIOA30, PAD_GPIOA31 }, /* GPIO group B */ { PAD_GPIOB0, PAD_GPIOB1 , PAD_GPIOB2 , PAD_GPIOB3, PAD_GPIOB4, PAD_GPIOB5, PAD_GPIOB6, PAD_GPIOB7, PAD_GPIOB8, PAD_GPIOB9, PAD_GPIOB10, PAD_GPIOB11, PAD_GPIOB12, PAD_GPIOB13, PAD_GPIOB14, PAD_GPIOB15, PAD_GPIOB16, PAD_GPIOB17, PAD_GPIOB18, PAD_GPIOB19, PAD_GPIOB20, PAD_GPIOB21, PAD_GPIOB22, PAD_GPIOB23, PAD_GPIOB24, PAD_GPIOB25, PAD_GPIOB26, PAD_GPIOB27, PAD_GPIOB28, PAD_GPIOB29, PAD_GPIOB30, PAD_GPIOB31 }, /* GPIO group C */ { PAD_GPIOC0, PAD_GPIOC1, PAD_GPIOC2, PAD_GPIOC3, PAD_GPIOC4, PAD_GPIOC5, PAD_GPIOC6, PAD_GPIOC7, PAD_GPIOC8, PAD_GPIOC9, PAD_GPIOC10, PAD_GPIOC11, PAD_GPIOC12, PAD_GPIOC13, PAD_GPIOC14, PAD_GPIOC15, PAD_GPIOC16, PAD_GPIOC17, PAD_GPIOC18, PAD_GPIOC19, PAD_GPIOC20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; /* GPIO pad function */ for (io_grp = 0; NUMBER_OF_GPIO_MODULE > io_grp; io_grp++) { for (io_bit = 0; 32 > io_bit; io_bit++) { if (! io_pad[io_grp][io_bit]) continue; io_mod = PAD_GET_PADMODE(io_pad[io_grp][io_bit]); switch(io_mod) { case PAD_MODE_IN: NX_GPIO_SetPadFunction (io_grp, io_bit, NX_GPIO_PADFUNC_GPIO); NX_GPIO_SetOutputEnable(io_grp, io_bit, CFALSE); break; case PAD_MODE_OUT: NX_GPIO_SetPadFunction (io_grp, io_bit, NX_GPIO_PADFUNC_GPIO); NX_GPIO_SetOutputEnable(io_grp, io_bit, CTRUE); break; case PAD_MODE_ALT1: NX_GPIO_SetPadFunction (io_grp, io_bit, NX_GPIO_PADFUNC_1); NX_GPIO_SetOutputEnable(io_grp, io_bit, CFALSE); break; case PAD_MODE_ALT2: NX_GPIO_SetPadFunction (io_grp, io_bit, NX_GPIO_PADFUNC_2); NX_GPIO_SetOutputEnable(io_grp, io_bit, CFALSE); break; case PAD_MODE_ALT3: NX_GPIO_SetPadFunction (io_grp, io_bit, NX_GPIO_PADFUNC_3); NX_GPIO_SetOutputEnable(io_grp, io_bit, CFALSE); break; case PAD_MODE_INT: detect = PAD_GET_DECTMODE(io_pad[io_grp][io_bit]); NX_GPIO_SetPadFunction(io_grp, io_bit, NX_GPIO_PADFUNC_GPIO); NX_GPIO_SetOutputEnable(io_grp, io_bit, CFALSE); NX_GPIO_SetInterruptMode(io_grp, io_bit, detect); break; case PAD_MODE_SKIP: case PAD_NOTEXIST: default: continue; } outval = PAD_GET_OUTLEVEL(io_pad[io_grp][io_bit]); pullup = PAD_GET_PULLUP(io_pad[io_grp][io_bit]); strength = PAD_GET_STRENGTH(io_pad[io_grp][io_bit]); NX_GPIO_SetOutputValue (io_grp, io_bit, (outval ? CTRUE : CFALSE)); NX_GPIO_SetPullUpEnable(io_grp, io_bit, (pullup ? CTRUE : CFALSE)); NX_CLKPWR_SetGPIOPadStrength(io_grp, io_bit, strength); } } }