add preliminary clock code that's expected to be set up by fw, gut old arm loader...
[rpi-open-firmware.git] / romstage.c
index c98dee9..fd88544 100644 (file)
@@ -1,5 +1,5 @@
 /*=============================================================================\r
-Copyright (C) 2016 Kristina Brooks\r
+Copyright (C) 2016-2017 Authors of rpi-open-firmware\r
 All rights reserved.\r
 \r
 This program is free software; you can redistribute it and/or\r
@@ -17,45 +17,59 @@ VideoCoreIV first stage bootloader.
 \r
 =============================================================================*/\r
 \r
-#include <common.h>\r
+#include <lib/runtime.h>\r
 #include <hardware.h>\r
 \r
 uint32_t g_CPUID;\r
 \r
-void uart_putc(unsigned int ch)\r
-{\r
-       while(1) {\r
-               if (mmio_read32(AUX_MU_LSR_REG) & 0x20)\r
-                       break;\r
-       }\r
-       mmio_write32(AUX_MU_IO_REG, ch);\r
+#define UART_DR     (UART_BASE+0x00)\r
+#define UART_RSRECR (UART_BASE+0x04)\r
+#define UART_FR     (UART_BASE+0x18)\r
+#define UART_ILPR   (UART_BASE+0x20)\r
+#define UART_IBRD   (UART_BASE+0x24)\r
+#define UART_FBRD   (UART_BASE+0x28)\r
+#define UART_LCRH   (UART_BASE+0x2C)\r
+#define UART_CR     (UART_BASE+0x30)\r
+#define UART_IFLS   (UART_BASE+0x34)\r
+#define UART_IMSC   (UART_BASE+0x38)\r
+#define UART_RIS    (UART_BASE+0x3C)\r
+#define UART_MIS    (UART_BASE+0x40)\r
+#define UART_ICR    (UART_BASE+0x44)\r
+#define UART_DMACR  (UART_BASE+0x48)\r
+#define UART_ITCR   (UART_BASE+0x80)\r
+#define UART_ITIP   (UART_BASE+0x84)\r
+#define UART_ITOP   (UART_BASE+0x88)\r
+#define UART_TDR    (UART_BASE+0x8C)\r
+\r
+void uart_putc(unsigned int ch) {\r
+       while(UART_MSR & 0x20);\r
+       UART_RBRTHRDLL = ch;\r
 }\r
 \r
 void uart_init(void) {\r
        unsigned int ra = GP_FSEL1;\r
        ra &= ~(7 << 12);\r
-       ra |= 2 << 12;\r
+       ra |= 4 << 12;\r
+       ra &= ~(7 << 15);\r
+       ra |= 4 << 15;\r
        GP_FSEL1 = ra;\r
 \r
-       GP_PUD = 0;\r
+       mmio_write32(UART_CR, 0);\r
 \r
+       GP_PUD = 0;\r
        udelay(150);\r
        GP_PUDCLK0 = (1 << 14) | (1 << 15);\r
        udelay(150);\r
        GP_PUDCLK0 = 0;\r
 \r
-       mmio_write32(AUX_ENABLES, 1);\r
-       mmio_write32(AUX_MU_IER_REG, 0);\r
-       mmio_write32(AUX_MU_CNTL_REG, 0);\r
-       mmio_write32(AUX_MU_LCR_REG, 3);\r
-       mmio_write32(AUX_MU_MCR_REG, 0);\r
-       mmio_write32(AUX_MU_IER_REG, 0);\r
-       mmio_write32(AUX_MU_IIR_REG, 0xC6);\r
-\r
-       mmio_write32(AUX_MU_BAUD_REG, 270);\r
+       CM_UARTDIV = CM_PASSWORD | 0x6666;\r
+       CM_UARTCTL = CM_PASSWORD | CM_SRC_OSC | CM_UARTCTL_FRAC_SET | CM_UARTCTL_ENAB_SET;\r
 \r
-       mmio_write32(AUX_MU_LCR_REG, 3);\r
-       mmio_write32(AUX_MU_CNTL_REG, 3);\r
+       mmio_write32(UART_ICR, 0x7FF);\r
+       mmio_write32(UART_IBRD, 1);\r
+       mmio_write32(UART_FBRD, 40);\r
+       mmio_write32(UART_LCRH, 0x70);\r
+       mmio_write32(UART_CR, 0x301);\r
 }\r
 \r
 void led_init(void) {\r
@@ -96,7 +110,7 @@ void switch_vpu_to_pllc() {
 \r
        A2W_PLLC_FRAC = A2W_PASSWORD | 87380;\r
        A2W_PLLC_CTRL = A2W_PASSWORD | 52 | 0x1000;\r
-       \r
+\r
        A2W_PLLC_ANA3 = A2W_PASSWORD | 0x100;\r
        A2W_PLLC_ANA2 = A2W_PASSWORD | 0x0;\r
        A2W_PLLC_ANA1 = A2W_PASSWORD | 0x144000;\r
@@ -106,8 +120,8 @@ void switch_vpu_to_pllc() {
 \r
        /* hold all */\r
        CM_PLLC = CM_PASSWORD | CM_PLLC_DIGRST_SET |\r
-               CM_PLLC_HOLDPER_SET | CM_PLLC_HOLDCORE2_SET |\r
-               CM_PLLC_HOLDCORE1_SET | CM_PLLC_HOLDCORE0_SET;\r
+                 CM_PLLC_HOLDPER_SET | CM_PLLC_HOLDCORE2_SET |\r
+                 CM_PLLC_HOLDCORE1_SET | CM_PLLC_HOLDCORE0_SET;\r
 \r
        A2W_PLLC_DIG3 = A2W_PASSWORD | 0x0;\r
        A2W_PLLC_DIG2 = A2W_PASSWORD | 0x400000;\r
@@ -124,16 +138,16 @@ void switch_vpu_to_pllc() {
        A2W_PLLC_CORE0 = A2W_PASSWORD | 2;\r
 \r
        CM_PLLC = CM_PASSWORD | CM_PLLC_DIGRST_SET |\r
-               CM_PLLC_HOLDPER_SET | CM_PLLC_HOLDCORE2_SET |\r
-               CM_PLLC_HOLDCORE1_SET | CM_PLLC_HOLDCORE0_SET | CM_PLLC_LOADCORE0_SET;\r
+                 CM_PLLC_HOLDPER_SET | CM_PLLC_HOLDCORE2_SET |\r
+                 CM_PLLC_HOLDCORE1_SET | CM_PLLC_HOLDCORE0_SET | CM_PLLC_LOADCORE0_SET;\r
 \r
        CM_PLLC = CM_PASSWORD | CM_PLLC_DIGRST_SET |\r
-               CM_PLLC_HOLDPER_SET | CM_PLLC_HOLDCORE2_SET |\r
-               CM_PLLC_HOLDCORE1_SET | CM_PLLC_HOLDCORE0_SET;\r
+                 CM_PLLC_HOLDPER_SET | CM_PLLC_HOLDCORE2_SET |\r
+                 CM_PLLC_HOLDCORE1_SET | CM_PLLC_HOLDCORE0_SET;\r
 \r
        CM_PLLC = CM_PASSWORD | CM_PLLC_DIGRST_SET |\r
-               CM_PLLC_HOLDPER_SET | CM_PLLC_HOLDCORE2_SET |\r
-               CM_PLLC_HOLDCORE1_SET;\r
+                 CM_PLLC_HOLDPER_SET | CM_PLLC_HOLDCORE2_SET |\r
+                 CM_PLLC_HOLDCORE1_SET;\r
 \r
        CM_VPUCTL = CM_PASSWORD | CM_VPUCTL_FRAC_SET | CM_SRC_OSC | CM_VPUCTL_GATE_SET;\r
        CM_VPUDIV = CM_PASSWORD | (4 << 12);\r
@@ -147,6 +161,7 @@ void switch_vpu_to_pllc() {
 extern void sdram_init();\r
 extern void arm_init();\r
 extern void monitor_start();\r
+extern void PEStartPlatform();\r
 \r
 void print_crap() {\r
        printf("TB_BOOT_OPT = 0x%X\n", TB_BOOT_OPT);\r
@@ -159,16 +174,16 @@ int _main(unsigned int cpuid, unsigned int load_address) {
        uart_init();\r
 \r
        printf(\r
-               "=========================================================\n"\r
-               "::\n"\r
-               ":: kFW for bcm2708, Copyright 2016, Kristina Brooks. \n"\r
-               "::\n"\r
-               ":: BUILDATE  : %s %s \n"\r
-               ":: BUILDSTYLE: %s \n"\r
-               "::\n"\r
-               "=========================================================\n",\r
-               __DATE__, __TIME__,\r
-               "OPENSOURCE"\r
+           "==================================================================\n"\r
+           "::\n"\r
+           ":: kFW for bcm270x, Copyright 2016-2017 rpi-open-firmware authors \n"\r
+           "::\n"\r
+           ":: BUILDATE  : %s %s \n"\r
+           ":: BUILDSTYLE: %s \n"\r
+           "::\n"\r
+           "==================================================================\n",\r
+           __DATE__, __TIME__,\r
+           "OPENSOURCE"\r
        );\r
 \r
        printf("CPUID    = 0x%X\n", cpuid);\r
@@ -177,13 +192,14 @@ int _main(unsigned int cpuid, unsigned int load_address) {
        print_crap();\r
 \r
        g_CPUID = cpuid;\r
-       \r
+\r
+       __cxx_init();\r
+\r
        /* bring up SDRAM */\r
        sdram_init();\r
        printf("SDRAM initialization completed successfully!\n");\r
 \r
-       /* bring up ARM */\r
-       arm_init();\r
+       PEStartPlatform();\r
 \r
        /* start vpu monitor */\r
        monitor_start();\r
This page took 0.033376 seconds and 4 git commands to generate.