Exemplo n.º 1
0
Arquivo: platform.c Projeto: singoc/lk
void platform_early_init(void)
{
    ps7_init();

    /* zynq manual says this is mandatory */
    *REG32(SLCR_BASE + 0xa1c) = 0x020202;

    /* early initialize the uart so we can printf */
    uart_init_early();

    /* initialize the interrupt controller */
    arm_gic_init();

    /* initialize the timer block */
    arm_cortex_a9_timer_init(CPUPRIV_BASE, zynq_get_arm_timer_freq());

    /* add the main memory arena */
#if !ZYNQ_CODE_IN_SDRAM && SDRAM_SIZE != 0
    /* In the case of running from SRAM, and we are using SDRAM,
     * there is a discontinuity between the end of SRAM (256K) and the start of SDRAM (1MB),
     * so intentionally bump the boot-time allocator to start in the base of SDRAM.
     */
    extern uintptr_t boot_alloc_start;
    extern uintptr_t boot_alloc_end;

    boot_alloc_start = KERNEL_BASE + MB;
    boot_alloc_end = KERNEL_BASE + MB;
#endif

#if SDRAM_SIZE != 0
    pmm_add_arena(&sdram_arena);
#endif
    pmm_add_arena(&sram_arena);
}
Exemplo n.º 2
0
int main(int argc, char* agrv[]) {
	//initialize DDR and MMIO
	ps7_init();

	//Switch pin 7 to output
	GPIO->DIRECTION_0 = GPIO->DIRECTION_0 | (1 << 7);

	//Set pin 7 to on
	GPIO->MASK_DATA_LSW_0 = ((~(1<<7)) << 16) | (1 << 7);

	//disable stdout buffering
	setvbuf(stdout, 0, _IONBF, 0);

	UartInitialize(UART1, 115200);
	printf("Initialized\n");

	unsigned int id = CPUGetCoreNumber();
	printf("Running on CPU %X\n", id);

	GICInit();
	printf("GIC Initialized\n");

	GICUnmaskInterrupt(29);
	GICConnectInterrupt(29, TimerHandler);

	PrivateTimerStop(PRIVATE_TIMER);
	PrivateTimerSetPrescaler(PRIVATE_TIMER, 255);
	PrivateTimerLoad(PRIVATE_TIMER, 1302083);
	PrivateTimerEnableAutoReload(PRIVATE_TIMER, 1302083);
	PrivateTimerEnableInterrupt(PRIVATE_TIMER);
	PrivateTimerClearExpiration(PRIVATE_TIMER);
	PrivateTimerStart(PRIVATE_TIMER);

	//enable interrupts
	CPUEnableInterrupts();
	//CPUEnableFastInterrupts();

	//uint32_t foo = 0;

	while(1)
	{
		/*if(PrivateTimerIsExpired(PRIVATE_TIMER))
		{
			foo++;
			PrivateTimerClearExpiration(PRIVATE_TIMER);
		}

		if(foo % 10000 == 0)
			printf("A");*/
			
		//uint8_t foo = UartReceiveByte(UART1);
		//UartSendByte(UART1, foo);
	}

	//int* foo = malloc(0x20);
	return 0;
}
Exemplo n.º 3
0
void board_init_f(ulong dummy)
{
	ps7_init();

	arch_cpu_init();
	/*
	 * The debug UART can be used from this point:
	 * debug_uart_init();
	 * printch('x');
	 */
}
Exemplo n.º 4
0
void board_init_f(ulong dummy)
{
	ps7_init();

	/* Clear the BSS. */
	memset(__bss_start, 0, __bss_end - __bss_start);

	preloader_console_init();
	arch_cpu_init();
	board_init_r(NULL, 0);
}
Exemplo n.º 5
0
void board_init_f(ulong dummy)
{
	ps7_init();

	arch_cpu_init();

#ifdef CONFIG_DEBUG_UART
	/* Uart debug for sure */
	debug_uart_init();
	puts("Debug uart enabled\n"); /* or printch() */
#endif
}
Exemplo n.º 6
0
void board_init_f(ulong dummy)
{
	ps7_init();

	/* Clear the BSS. */
	memset(__bss_start, 0, __bss_end - __bss_start);

	/* Set global data pointer. */
	gd = &gdata;

	preloader_console_init();
	arch_cpu_init();
	board_init_r(NULL, 0);
}
Exemplo n.º 7
0
void
init_platform()
{
    /*
     * If you want to run this example outside of SDK,
     * uncomment the following line and also #include "ps7_init.h" at the top.
     * Make sure that the ps7_init.c and ps7_init.h files are included
     * along with this example source files for compilation.
     */
	#if( INCLUDE_PS7_INIT != 0 )
	{
		ps7_init();
	}
	#endif
    enable_caches();
    init_uart();
}
Exemplo n.º 8
0
void platform_early_init(void)
{
#if 0
    ps7_init();
#else
    /* Unlock the registers and leave them that way */
    zynq_slcr_unlock();
    zynq_mio_init();
    zynq_pll_init();
    zynq_clk_init();
#if ZYNQ_SDRAM_INIT
    zynq_ddr_init();
#endif
#endif

    /* Enable all level shifters */
    SLCR_REG(LVL_SHFTR_EN) = 0xF;
    /* FPGA SW reset (not documented, but mandatory) */
    SLCR_REG(FPGA_RST_CTRL) = 0x0;

    /* zynq manual says this is mandatory for cache init */
    *REG32(SLCR_BASE + 0xa1c) = 0x020202;

    /* early initialize the uart so we can printf */
    uart_init_early();

    /* initialize the interrupt controller */
    arm_gic_init();
    zynq_gpio_init();

    /* initialize the timer block */
    arm_cortex_a9_timer_init(CPUPRIV_BASE, zynq_get_arm_timer_freq());

    /* bump the 2nd cpu into our code space and remap the top SRAM block */
    if (KERNEL_LOAD_OFFSET != 0) {
        /* construct a trampoline to get the 2nd cpu up to the trap routine */

        /* figure out the offset of the trampoline routine in physical space from address 0 */
        extern void platform_reset(void);
        addr_t tramp = (addr_t)&platform_reset;
        tramp -= KERNEL_BASE;
        tramp += MEMBASE;

        /* stuff in a ldr pc, [nextaddrress], and a target address */
        uint32_t *ptr = (uint32_t *)KERNEL_BASE;

        ptr[0] = 0xe51ff004; // ldr pc, [pc, #-4]
        ptr[1] = tramp;
        arch_clean_invalidate_cache_range((addr_t)ptr, 8);
    }

    /* reset the 2nd cpu, letting it go through its reset vector (at 0x0 physical) */
    SLCR_REG(A9_CPU_RST_CTRL) |= (1<<1); // reset cpu 1
    spin(10);
    SLCR_REG(A9_CPU_RST_CTRL) &= ~(1<<1); // unreset cpu 1

    /* wait for the 2nd cpu to reset, go through the usual reset vector, and get trapped by our code */
    /* see platform/zynq/reset.S */
    extern volatile int __cpu_trapped;
    uint count = 100000;
    while (--count) {
        arch_clean_invalidate_cache_range((addr_t)&__cpu_trapped, sizeof(__cpu_trapped));
        if (__cpu_trapped != 0)
            break;
    }
    if (count == 0) {
        panic("ZYNQ: failed to trap 2nd cpu\n");
    }

    /* bounce the 4th sram region down to lower address */
    SLCR_REG(OCM_CFG) &= ~0xf; /* all banks at low address */

    /* add the main memory arena */
#if !ZYNQ_CODE_IN_SDRAM && SDRAM_SIZE != 0
    /* In the case of running from SRAM, and we are using SDRAM,
     * there is a discontinuity between the end of SRAM (256K) and the start of SDRAM (1MB),
     * so intentionally bump the boot-time allocator to start in the base of SDRAM.
     */
    extern uintptr_t boot_alloc_start;
    extern uintptr_t boot_alloc_end;

    boot_alloc_start = KERNEL_BASE + MB;
    boot_alloc_end = KERNEL_BASE + MB;
#endif

#if SDRAM_SIZE != 0
    pmm_add_arena(&sdram_arena);
#endif
    pmm_add_arena(&sram_arena);
}