init.c
来自「SAMSUNG S3C6410 CPU BSP for winmobile6」· C语言 代码 · 共 481 行 · 第 1/2 页
C
481 行
// 3) configure pull-up resistor(GPnPUD)
// setup GPNDAT[9] as Input port to check Hive-Clean option
s6410IOP->GPNDAT |= (1<<9);
s6410IOP->GPNCON = (s6410IOP->GPNCON & ~(0x3<<18)) | (0<<18);
s6410IOP->GPNPUD = (s6410IOP->GPNPUD & ~(0x3<<18)) | (0<<18);
}
*/
static void InitializeGPIO()
{
volatile S3C6410_GPIO_REG *pGPIOReg = (S3C6410_GPIO_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
OALMSG(TRUE, (L"[OAL] ++InitializeGPIO()\r\n"));
// setup GPNDAT[9] as Input port to check Hive-Clean option
pGPIOReg->GPNDAT |= (1<<9);
pGPIOReg->GPNCON = (pGPIOReg->GPNCON & ~(0x3<<18)) | (0<<18);
pGPIOReg->GPNPUD = (pGPIOReg->GPNPUD & ~(0x3<<18)) | (0<<18);
// TODO: What port need initialization???
OALMSG(TRUE, (L"[OAL] --InitializeGPIO()\r\n"));
}
static void InitializeINFORMSFR(void)
{
volatile S3C6410_SYSCON_REG *pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
OALMSG(TRUE, (L"[OAL] ++InitializeINFORMSFR()\r\n"));
pSysConReg->INFORM0 = 0x64100000;
OALMSG(TRUE, (L"[OAL] --InitializeINFORMSFR()\r\n"));
}
static void InitializeCLKGating(void)
{
volatile S3C6410_SYSCON_REG *pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
OALMSG(TRUE, (L"[OAL] InitializeCLKGating()\r\n"));
// CAUTION !!!
// HCLK_IROM, HCLK_MEM1, HCLK_MEM0, HCLK_MFC Should be Always On for power Mode
// Because we can not expect when Warm Reset will be triggered..
pSysConReg->HCLK_GATE = (0x3<<30) // Reserved
|(0<<29) // USB Host
|(0<<28) // Security Sub-system
|(0<<27) // SDMA1
|(0<<26) // SDMA0, USB Host (EVT0)
|(1<<25) // Internal ROM <--- Always On (for Power Mode)
|(1<<24) // DDR1 <--- Always On
|(0<<23) // DDR0
|(1<<22) // DMC1 <--- Always On (for Power Mode)
|(1<<21) // DMC0, SROM, OneNAND, NFCON, CFCON <--- Always On (for Power Mode)
|(0<<20) // USB OTG
|(0<<19) // HSMMC2
|(0<<18) // HSMMC1
|(0<<17) // HSMMC0
|(0<<16) // MDP Interface
#ifdef ULDR
|(1<<15) // Direct Host Interface (MSM I/F)
#else
|(0<<15) // Direct Host Interface (MSM I/F)
#endif
|(0<<14) // Indirect Host Interface
|(0<<13) // DMA1
|(0<<12) // DMA0
|(0<<11) // Jpeg
|(0<<10) // Cam Interface
|(0<<9) // TV Scaler
|(0<<8) // 2D
|(0<<7) // TV Encoder
|(1<<6) // Reserved
|(0<<5) // Post Processor
|(0<<4) // Rotator
|(1<<3) // Display Controller <--- Always On
|(0<<2) // Trust Interrupt Controller
|(1<<1) // Interrupt Controller <--- Always On
|(1<<0); // MFC <--- Always On (for Power Mode)
pSysConReg->PCLK_GATE = (0x7F<<25) // Reserved
|(0<<24) // Security Key
|(0<<23) // CHIP ID
|(0<<22) // SPI1
|(0<<21) // SPI0
|(0<<20) // HSI Receiver
|(0<<19) // HSI Transmitter
|(1<<18) // GPIO <--- Always On
|(0<<17) // IIC
|(0<<16) // IIS1
|(0<<15) // IIS0
|(0<<14) // AC97 Interface
|(0<<13) // TZPC
|(1<<12) // Touch Screen & ADC <--- Always On
|(0<<11) // Keypad
|(0<<10) // IrDA
|(0<<9) // PCM1
|(0<<8) // PCM0
|(1<<7) // PWM Timer <--- Always On
|(1<<6) // RTC <--- Always On
|(0<<5) // WatchDog Timer
#if (DEBUG_PORT == DEBUG_UART0) // Be Careful to Serial KITL Clock
|(0<<4) // UART3
|(0<<3) // UART2
|(0<<2) // UART1
|(1<<1) // UART0 <--- Always On
#elif (DEBUG_PORT == DEBUG_UART1) // Be Careful to Serial KITL Clock
|(0<<4) // UART3
|(0<<3) // UART2
|(1<<2) // UART1 <--- Always On
|(0<<1) // UART0
#elif (DEBUG_PORT == DEBUG_UART2) // Be Careful to Serial KITL Clock
|(0<<4) // UART3
|(1<<3) // UART2 <--- Always On
|(0<<2) // UART1
|(0<<1) // UART0
#elif (DEBUG_PORT == DEBUG_UART3) // Be Careful to Serial KITL Clock
|(1<<4) // UART3 <--- Always On
|(0<<3) // UART2
|(0<<2) // UART1
|(0<<1) // UART0
#endif
|(0<<0); // MFC
pSysConReg->SCLK_GATE = (0x1<<31) // Reserved
|(0<<30) // USB Host
|(0<<29) // MMC2 48
|(0<<28) // MMC1 48
|(0<<27) // MMC0 48
|(0<<26) // MMC2
|(0<<25) // MMC1
|(0<<24) // MMC0
|(0<<23) // SPI1 48
|(0<<22) // SPI0 48
|(0<<21) // SPI1
|(0<<20) // SPI0
|(0<<19) // DAC 27
|(0<<18) // TV Encoder 27
|(0<<17) // TV Scaler 27
|(0<<16) // TV Scaler
|(0<<15) // Display Controller 27
|(1<<14) // Display Controller <--- Always On
|(0<<13) // Post Processor1 27
|(0<<12) // Post Processor0 27
|(0<<11) // Post Processor1
|(0<<10) // Post Processor0
|(0<<9) // Audio1
|(0<<8) // Audio0
|(0<<7) // Security Block
|(0<<6) // IrDA
|(1<<5) // UART0~3 <--- Always On
|(0<<4) // OneNAND
|(0<<3) // MFC
|(0<<2) // Camera Interface
|(0<<1) // Jpeg
|(1<<0); // Reserved
}
static void InitializeBlockPower(void)
{
volatile S3C6410_SYSCON_REG *pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
OALMSG(TRUE, (L"[OAL] InitializeBlockPower()\r\n"));
pSysConReg->NORMAL_CFG = (1<<31) // Reserved
|(0<<30) // IROM Block Off (Internal 32KB Boot ROM)
|(0x1FFF<<17) // Reserved
|(1<<16) // DOMAIN_ETM On (JTAG not connected when ETM off)
|(1<<15) // DOMAIN_S Off (SDMA0, SDMA1, Security System)
|(1<<14) // DOMAIN_F On (LCD, Post, Rotator)
|(0<<13) // DOMAIN_P Off (TV Scaler, TV Encoder, 2D)
|(0<<12) // DOMAIN_I Off (Cam I/F, Jpeg)
|(0x3<<10) // Reserved
|(0<<9) // DOMAIN_V Off (MFC)
|(0x100); // Reserved
}
static void InitializeCLKSource(void)
{
volatile S3C6410_SYSCON_REG *pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
OALMSG(TRUE, (L"[OAL] InitializeCLKSource()\r\n"));
pSysConReg->CLK_SRC = (pSysConReg->CLK_SRC & ~(0xFFFFFFF0))
|(0<<31) // TV27_SEL -> 27MHz
|(0<<30) // DAC27 -> 27MHz
|(0<<28) // SCALER_SEL -> MOUT_EPLL
|(1<<26) // LCD_SEL -> Dout_MPLL
|(0<<24) // IRDA_SEL -> MOUT_EPLL
|(0<<22) // MMC2_SEL -> MOUT_EPLL
|(0<<20) // MMC1_SEL -> MOUT_EPLL
|(0<<18) // MMC0_SEL -> MOUT_EPLL
|(0<<16) // SPI1_SEL -> MOUT_EPLL
|(0<<14) // SPI0_SEL -> MOUT_EPLL
|(0<<13) // UART_SEL -> MOUT_EPLL
|(0<<10) // AUDIO1_SEL -> MOUT_EPLL
|(0<<7) // AUDIO0_SEL -> MOUT_EPLL
|(0<<5) // UHOST_SEL -> 48MHz
|(0<<4); // MFCCLK_SEL -> HCLKx2 (0:HCLKx2, 1:MoutEPLL)
// TODO: What Clock need dividing???
pSysConReg->CLK_DIV0 = (pSysConReg->CLK_DIV0 & ~(0xf<<28))
| ((2-1)<<28); // MFCCLK = SRC/2
//pSysConReg->CLK_DIV1;
//pSysConReg->CLK_DIV2;
}
#if (CPU_NAME == S3C6410)
//--------------------------------------------------------------------
//48MHz clock source for usb host1.1, IrDA, hsmmc, spi is shared with otg phy clock.
//So, initialization and reset of otg phy shoud be done on initial booting time.
//--------------------------------------------------------------------
static void InitializeOTGCLK(void)
{
volatile S3C6410_SYSCON_REG *pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
volatile OTG_PHY_REG *pOtgPhyReg = (OTG_PHY_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_USBOTG_PHY, FALSE);
pSysConReg->HCLK_GATE |= (1<<20);
pSysConReg->OTHERS |= (1<<16);
pOtgPhyReg->OPHYPWR = 0x0; // OTG block, & Analog bock in PHY2.0 power up, normal operation
pOtgPhyReg->OPHYCLK = 0x20; // Externel clock/oscillator, 48MHz reference clock for PLL
pOtgPhyReg->ORSTCON = 0x1;
Delay(100);
pOtgPhyReg->ORSTCON = 0x0;
Delay(100); //10000
pSysConReg->HCLK_GATE &= ~(1<<20);
}
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?