GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
if TARGET_EMSDP
|
||||
|
||||
config SYS_BOARD
|
||||
default "emsdp"
|
||||
|
||||
config SYS_VENDOR
|
||||
default "synopsys"
|
||||
|
||||
config SYS_CONFIG_NAME
|
||||
default "emsdp"
|
||||
|
||||
endif
|
||||
@@ -0,0 +1,6 @@
|
||||
EM DEVELOPMENT KIT BOARD
|
||||
M: Alexey Brodkin <abrodkin@synopsys.com>
|
||||
S: Maintained
|
||||
F: arch/arc/dts/emsdp.dts
|
||||
F: board/synopsys/emsdp/
|
||||
F: configs/emsdp_defconfig
|
||||
@@ -0,0 +1,7 @@
|
||||
#
|
||||
# Copyright (C) 2018 Synopsys, Inc. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y += emsdp.o
|
||||
@@ -0,0 +1,83 @@
|
||||
================================================================================
|
||||
Useful notes on bulding and using of U-Boot on
|
||||
ARC EM Software Development Platform (AKA EMSDP)
|
||||
================================================================================
|
||||
|
||||
BOARD OVERVIEW
|
||||
|
||||
The DesignWare ARC EM Software Development Platform is FPGA-bases platform
|
||||
for rapid software development on the ARC EM family of processors.
|
||||
|
||||
Since this board is based on FPGA it's possible to load and use different
|
||||
versions of ARC EM CPUs. U-Boot is built to be run on the simplest
|
||||
possible configuration which means the same one binary will work on more
|
||||
advanced configurations as well.
|
||||
|
||||
The board has the following features useful for U-Boot:
|
||||
* On-board 2-channel FTDI TTL-to-USB converter
|
||||
- The first channel is used for serial debug port (which makes it possible
|
||||
to use a serial connection on pretty much any host machine be it
|
||||
Windows, Linux or Mac).
|
||||
On Linux machine typucally FTDI serial port would be /dev/ttyUSB0.
|
||||
There's no HW flow-control and baud-rate is 115200.
|
||||
|
||||
- The second channel is used for built-in Digilent USB JTAG probe.
|
||||
That means no extra hardware is required to access ARC core from a
|
||||
debugger on development host. Both proprietary MetaWare debugger and
|
||||
open source OpenOCD + GDB client are supported.
|
||||
|
||||
- Also with help of this FTDI chip it is possible to reset entire
|
||||
board with help of a special `rff-ftdi-reset` utility, see:
|
||||
https://github.com/foss-for-synopsys-dwc-arc-processors/rff-ftdi-reset
|
||||
|
||||
* Micro SD-card slot
|
||||
- U-Boot expects to see the very first partition on the card formatted as
|
||||
FAT file-system and uses it for keeping its environment in `uboot.env`
|
||||
file. Note uboot.env is not just a text file but it is auto-generated
|
||||
file created by U-Boot on invocation of `saveenv` command.
|
||||
It contains a checksum which makes this saved environment invalid in
|
||||
case of maual modification.
|
||||
|
||||
- There might be more useful files on that first FAT partition like
|
||||
user applications, data files etc.
|
||||
|
||||
* 256 KiB of "ROM"
|
||||
- This so-called "ROM" is a part of FPGA image and even though it
|
||||
might be unlocked for writes its initial content will be restored
|
||||
on the next power-on.
|
||||
|
||||
|
||||
BUILDING U-BOOT
|
||||
|
||||
1. Configure U-Boot:
|
||||
------------------------->8----------------------
|
||||
make emsdp_defconfig
|
||||
------------------------->8----------------------
|
||||
|
||||
2. To build Elf file (for example to be used with host debugger via JTAG
|
||||
connection to the target board):
|
||||
------------------------->8----------------------
|
||||
make mdbtrick
|
||||
------------------------->8----------------------
|
||||
|
||||
This will produce `u-boot` Elf file.
|
||||
|
||||
3. To build binary image to be put in "ROM":
|
||||
------------------------->8----------------------
|
||||
make u-boot.bin
|
||||
------------------------->8----------------------
|
||||
|
||||
|
||||
EXECUTING U-BOOT
|
||||
|
||||
1. The EMSDP board is supposed to auto-start U-Boot image stored in ROM on
|
||||
power-on. For that make sure VCCIO DIP-switches are all in "off" state.
|
||||
|
||||
2. Though it is possible to load U-Boot as a simple Elf file via JTAG right
|
||||
in "ROM" and start it from the debugger. One important note here we first
|
||||
need to enable writes into "ROM" by writing 1 to 0xf0001000.
|
||||
|
||||
2.1. In case of proprietary MetaWare debugger run:
|
||||
------------------------->8----------------------
|
||||
mdb -digilent -OK -preloadexec="eval *(int*)0xf0001000=0" u-boot
|
||||
------------------------->8----------------------
|
||||
@@ -0,0 +1,2 @@
|
||||
PLATFORM_CPPFLAGS += -mlittle-endian -mnorm -mswap -mmpy-option=3 \
|
||||
-mbarrel-shifter -mfpu=fpuda_all -mcode-density
|
||||
@@ -0,0 +1,153 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright (C) 2018 Synopsys, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dwmmc.h>
|
||||
#include <malloc.h>
|
||||
|
||||
#include <asm/arcregs.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#define ARC_PERIPHERAL_BASE 0xF0000000
|
||||
|
||||
#define CGU_ARC_FMEAS_ARC (void *)(ARC_PERIPHERAL_BASE + 0x84)
|
||||
#define CGU_ARC_FMEAS_ARC_START BIT(31)
|
||||
#define CGU_ARC_FMEAS_ARC_DONE BIT(30)
|
||||
#define CGU_ARC_FMEAS_ARC_CNT_MASK GENMASK(14, 0)
|
||||
#define CGU_ARC_FMEAS_ARC_RCNT_OFFSET 0
|
||||
#define CGU_ARC_FMEAS_ARC_FCNT_OFFSET 15
|
||||
|
||||
#define SDIO_BASE (void *)(ARC_PERIPHERAL_BASE + 0x10000)
|
||||
|
||||
int mach_cpu_init(void)
|
||||
{
|
||||
int rcnt, fcnt;
|
||||
u32 data;
|
||||
|
||||
/* Start frequency measurement */
|
||||
writel(CGU_ARC_FMEAS_ARC_START, CGU_ARC_FMEAS_ARC);
|
||||
|
||||
/* Poll DONE bit */
|
||||
do {
|
||||
data = readl(CGU_ARC_FMEAS_ARC);
|
||||
} while (!(data & CGU_ARC_FMEAS_ARC_DONE));
|
||||
|
||||
/* Amount of reference 100 MHz clocks */
|
||||
rcnt = ((data >> CGU_ARC_FMEAS_ARC_RCNT_OFFSET) &
|
||||
CGU_ARC_FMEAS_ARC_CNT_MASK);
|
||||
|
||||
/* Amount of CPU clocks */
|
||||
fcnt = ((data >> CGU_ARC_FMEAS_ARC_FCNT_OFFSET) &
|
||||
CGU_ARC_FMEAS_ARC_CNT_MASK);
|
||||
|
||||
gd->cpu_clk = ((100 * fcnt) / rcnt) * 1000000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int board_early_init_r(void)
|
||||
{
|
||||
#define EMSDP_PSRAM_BASE 0xf2001000
|
||||
#define PSRAM_FLASH_CONFIG_REG_0 (void *)(EMSDP_PSRAM_BASE + 0x10)
|
||||
#define PSRAM_FLASH_CONFIG_REG_1 (void *)(EMSDP_PSRAM_BASE + 0x14)
|
||||
#define CRE_ENABLE BIT(31)
|
||||
#define CRE_DRIVE_CMD BIT(6)
|
||||
|
||||
#define PSRAM_RCR_DPD BIT(1)
|
||||
#define PSRAM_RCR_PAGE_MODE BIT(7)
|
||||
|
||||
/*
|
||||
* PSRAM_FLASH_CONFIG_REG_x[30:15] to the address lines[16:1] of flash,
|
||||
* thus "<< 1".
|
||||
*/
|
||||
#define PSRAM_RCR_SETUP ((PSRAM_RCR_DPD | PSRAM_RCR_PAGE_MODE) << 1)
|
||||
|
||||
// Switch PSRAM controller to command mode
|
||||
writel(CRE_ENABLE | CRE_DRIVE_CMD, PSRAM_FLASH_CONFIG_REG_0);
|
||||
// Program Refresh Configuration Register (RCR) for BANK0
|
||||
writew(0, (void *)(0x10000000 + PSRAM_RCR_SETUP));
|
||||
// Switch PSRAM controller back to memory mode
|
||||
writel(0, PSRAM_FLASH_CONFIG_REG_0);
|
||||
|
||||
|
||||
// Switch PSRAM controller to command mode
|
||||
writel(CRE_ENABLE | CRE_DRIVE_CMD, PSRAM_FLASH_CONFIG_REG_1);
|
||||
// Program Refresh Configuration Register (RCR) for BANK1
|
||||
writew(0, (void *)(0x10800000 + PSRAM_RCR_SETUP));
|
||||
// Switch PSRAM controller back to memory mode
|
||||
writel(0, PSRAM_FLASH_CONFIG_REG_1);
|
||||
|
||||
printf("PSRAM initialized.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define CREG_BASE 0xF0001000
|
||||
#define CREG_BOOT (void *)(CREG_BASE + 0x0FF0)
|
||||
#define CREG_IP_SW_RESET (void *)(CREG_BASE + 0x0FF0)
|
||||
#define CREG_IP_VERSION (void *)(CREG_BASE + 0x0FF8)
|
||||
|
||||
/* Bits in CREG_BOOT register */
|
||||
#define CREG_BOOT_WP_BIT BIT(8)
|
||||
|
||||
void reset_cpu(ulong addr)
|
||||
{
|
||||
writel(1, CREG_IP_SW_RESET);
|
||||
while (1)
|
||||
; /* loop forever till reset */
|
||||
}
|
||||
|
||||
static int do_emsdp_rom(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
||||
{
|
||||
u32 creg_boot = readl(CREG_BOOT);
|
||||
|
||||
if (!strcmp(argv[1], "unlock"))
|
||||
creg_boot &= ~CREG_BOOT_WP_BIT;
|
||||
else if (!strcmp(argv[1], "lock"))
|
||||
creg_boot |= CREG_BOOT_WP_BIT;
|
||||
else
|
||||
return CMD_RET_USAGE;
|
||||
|
||||
writel(creg_boot, CREG_BOOT);
|
||||
|
||||
return CMD_RET_SUCCESS;
|
||||
}
|
||||
|
||||
cmd_tbl_t cmd_emsdp[] = {
|
||||
U_BOOT_CMD_MKENT(rom, 2, 0, do_emsdp_rom, "", ""),
|
||||
};
|
||||
|
||||
static int do_emsdp(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
||||
{
|
||||
cmd_tbl_t *c;
|
||||
|
||||
c = find_cmd_tbl(argv[1], cmd_emsdp, ARRAY_SIZE(cmd_emsdp));
|
||||
|
||||
/* Strip off leading 'emsdp' command */
|
||||
argc--;
|
||||
argv++;
|
||||
|
||||
if (c == NULL || argc > c->maxargs)
|
||||
return CMD_RET_USAGE;
|
||||
|
||||
return c->cmd(cmdtp, flag, argc, argv);
|
||||
}
|
||||
|
||||
U_BOOT_CMD(
|
||||
emsdp, CONFIG_SYS_MAXARGS, 0, do_emsdp,
|
||||
"Synopsys EMSDP specific commands",
|
||||
"rom unlock - Unlock non-volatile memory for writing\n"
|
||||
"emsdp rom lock - Lock non-volatile memory to prevent writing\n"
|
||||
);
|
||||
|
||||
int checkboard(void)
|
||||
{
|
||||
int version = readl(CREG_IP_VERSION);
|
||||
|
||||
printf("Board: ARC EM Software Development Platform v%d.%d\n",
|
||||
(version >> 16) & 0xff, version & 0xff);
|
||||
return 0;
|
||||
};
|
||||
Reference in New Issue
Block a user