Пример #1
0
int arch_bootm(BT_u32 coreID, void *start_addr, void *fdt_addr) {

    BT_u32 machine_id = 0;
    BT_ENV_VARIABLE *machid = BT_ShellGetEnv("machid");
    if(!machid) {
        printf("Warning : machine_id was not defined, set ${machid}:\n"
               "e.g     : setenv machid 0xabad1dea\n");
    } else {
        machine_id = strtoul(machid->o.string->s, NULL, 16);
    }

    BT_DCacheFlush();
    BT_ICacheInvalidate();

    BT_DCacheDisable();

    if(coreID == BT_GetCoreID()) {
        BT_StopSystemTimer();
        BT_DisableInterrupts();

        jump_regs jumpr = (jump_regs) start_addr;
        jumpr(0, machine_id, (BT_u32) fdt_addr, 0);

        return -1;	// Is this such a good idea? Could be in an indefined state.

    } else {
        BT_BootCore(coreID, start_addr, 0, machine_id, (bt_register_t) fdt_addr, 0);		// Use the platform BootCore to run the boot_core function.
    }

    return 0;
}
Пример #2
0
static BT_ERROR zynq_boot_core(BT_u32 ulCoreID, void *p) {
	volatile BT_u32 *core2 = (BT_u32 *) 0xFFFFFFF0;
	*core2 = (BT_u32) p;
	BT_DCacheFlush();

	__asm volatile("sev");

	return BT_ERR_NONE;
}
Пример #3
0
static int bt_boot(int argc, char **argv) {

	if(argc != 2 && argc != 4) {
		bt_printf("Usage: %s {--core [coreID]} [start-address]\n", argv[0]);
		return -1;
	}

	BT_u32 coreID = 0;
	BT_u32 addr;

	if(argc == 4) {
		if(strcmp(argv[1], "--core")) {
			bt_printf("Invalid argument %s\n", argv[1]);
			return -1;
		}
		coreID = strtol(argv[2], NULL, 10);
		addr = strtol(argv[3], NULL, 16);
	} else {
		addr = strtol(argv[1], NULL, 16);
	}
	void *p = (void *) addr;

	BT_DCacheFlush();
	BT_ICacheInvalidate();

	BT_DCacheDisable();

	if(!coreID) {
		BT_StopSystemTimer();
		BT_DisableInterrupts();

		jump jmp = p;
		jmp();

		while(1) {
			__asm__ ("");
		}

	} else {
		// Must use MACH core boot interface.
		BT_BootCore(coreID, p);
	}

	return 0;
}
Пример #4
0
static int bt_boot_jtag(int argc, char **argv) {

	if(argc != 3) {
		bt_printf("Usage: %s --core [coreID]\n", argv[0]);
		return -1;
	}

	BT_u32 coreID = 0;

	if(strcmp(argv[1], "--core")) {
		bt_printf("Invalid argument %s\n", argv[1]);
		return -1;
	}

	coreID = strtoul(argv[2], NULL, 10);

	void *p = (void *) wait_jtag;

	BT_DCacheFlush();
	BT_ICacheInvalidate();

	if(!coreID) {
		BT_StopSystemTimer();
		BT_DisableInterrupts();

		jump jmp = p;
		jmp();

		while(1) {
			__asm__ ("");
		}

	} else {
		// Must use MACH core boot interface.
		BT_BootCore(coreID, p);
	}

	return 0;
}
Пример #5
0
static int bt_load_fpga(BT_HANDLE hShell, int argc, char **argv) {

	BT_HANDLE hStdout = BT_ShellGetStdout(hShell);
	BT_ERROR Error;

	if(argc != 4 && argc != 5) {
		bt_fprintf(hStdout, "Usage: %s [buffer_address] [fpga_device] [bitstream] [length]\n", argv[0]);
		return -1;
	}

	BT_u32 length = 0;
	BT_u32 addr = strtoul(argv[1], NULL, 16);
	void *p = (void *) addr;

	if(argv[3][0] == '-' && argc == 5) {
		// Image loaded and length provided.
		length = strtoul(argv[4], NULL, 10);
		goto flush;
	}

	BT_HANDLE hFile = BT_Open(argv[3], BT_GetModeFlags("rb"), &Error);
	if(!hFile) {
		bt_fprintf(hStdout, "Could not open bitstream at %s\n", argv[3]);
		return -1;
	}

	BT_HANDLE hInode = BT_GetInode(argv[3], &Error);
	if(!hInode) {
		bt_fprintf(hStdout, "Could not stat bitstream at %s\n", argv[3]);
		BT_CloseHandle(hFile);
		return -1;
	}

	BT_INODE oInode;
	BT_ReadInode(hInode, &oInode);


	BT_kPrint("Loading %s at %08X (%llu bytes)", argv[3], addr, oInode.ullFileSize);

	BT_Read(hFile, 0, oInode.ullFileSize, p, &Error);

	BT_kPrint("Load successful");

	if(hFile) {
		BT_CloseHandle(hFile);
	}

	if(hInode) {
		BT_CloseHandle(hInode);
	}

	length = oInode.ullFileSize;

flush:

	BT_DCacheFlush();

	BT_HANDLE hFPGA = BT_DeviceOpen(argv[2], &Error);
	if(!hFPGA) {
		bt_printf("Failed to open fpga device %s\n", argv[2]);
		return -1;
	}

	BT_Write(hFPGA, 0, length, p, &Error);

	BT_CloseHandle(hFPGA);

	return 0;
}