Open JohnAZoidberg opened 3 years ago
Interesting locations in the memory map:
Start Address | End Address | Description |
---|---|---|
0x00_0200_0000 | 0x00_0200_FFFF | CLINT |
0x00_0C00_0000 | 0x00_0FFF_FFFF | PLIC |
0x00_1840_0000 | 0x00_1840_7FFF | ROM |
0x00_1187_0000 | 0x00_1187_FFFF | HSUART0 |
0x00_1188_0000 | 0x00_1188_FFFF | HSUART1 |
0x00_1243_0000 | 0x00_1243_FFFF | UART2 |
0x00_1244_0000 | 0x00_1243_FFFF | UART3 |
0x00_1191_0000 | 0x00_1191_FFFF | GPIO |
Uboot and OpenSBI use UART3:
chosen {
stdout-path = "/soc/serial@12440000:115200";
};
soc {
uart3: serial@12440000 {
compatible = "snps,dw-apb-uart";
interrupt-parent = <&plic>;
interrupts = <73>;
reg = <0x0 0x12440000 0x0 0x10000>;
reg-io-width = <4>;
reg-shift = <2>;
clocks = <&uartclk>, <&apb2clk>;
clock-names = "baudclk", "apb_pclk";
current-clock = <100000000>;
current-speed = <115200>;
status = "okay";
};
};
That UART (snps,dw-apb-uart
) is documented here: https://www.kernel.org/doc/Documentation/devicetree/bindings/serial/snps-dw-apb-uart.txt
Optional properties:
- snps,uart-16550-compatible : reflects the value of UART_16550_COMPATIBLE
configuration parameter. Define this if your UART does not implement the busy
functionality.
Sounds like it's very similar to the 16550 UART that edk2 has a driver for.
Boot source:
Tutorial for how to flash Uboot (probably same for EDKII): https://wiki.seeedstudio.com/BeagleV-Make-File-System-Compile-uboot-Kernal/#flash-uboot
USB
soc {
USB30: usb@104c0000 {
compatible = "cdns,usb3";
reg = <0x0 0x104c0000 0x0 0x10000>, // memory area for HOST registers
<0x0 0x104d0000 0x0 0x10000>, // memory area for DEVICE registers
<0x0 0x104e0000 0x0 0x10000>; // memory area for OTG/DRD registers
reg-names = "otg", "xhci", "dev";
interrupt-parent = <&plic>;
interrupts = <43>, <44>, <52>;
interrupt-names = "otg",
"host",
"peripheral";
phy-names = "cdns3,usb3-phy", "cnds3,usb2-phy";
status = "okay";
};
};
SPI Flash
https://www.kernel.org/doc/Documentation/devicetree/bindings/mtd/cadence-quadspi.txt
soc {
qspi:qspi@11860000 {
compatible = "cadence,qspi","cdns,qspi-nor";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x0 0x11860000 0x0 0x10000 0x0 0x20000000 0x0 0x20000000 >;
interrupts = <3>;
interrupt-parent = <&plic>;
clocks = <&qspi_clk>;
cdns,fifo-depth = <256>;
cdns,fifo-width = <4>;
cdns,trigger-address = <0x00000000>;
status = "okay";
spi-max-frequency = <250000000>;
nor_flash:nor-flash@0 {
compatible = "spi-flash";
reg=<0>;
spi-max-frequency = <100000000>;
page-size = <256>;
block-size = <16>;
cdns,read-delay = <4>;
cdns,tshsl-ns = <1>;
cdns,tsd2d-ns = <1>;
cdns,tchsh-ns = <1>;
cdns,tslch-ns = <1>;
spi-tx-bus-width = <1>;
spi-rx-bus-width = <1>;
};
};
};
SD Card
https://www.kernel.org/doc/Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt
aliases {
mshc0="/soc/sdio0@10000000";
};
soc {
sdio0:sdio0@10000000{
compatible = "snps,dw-mshc";
reg = <0x0 0x10000000 0x0 0x10000>;
interrupts = <4>;
interrupt-parent = <&plic>;
clocks = <&dwmmc_biuclk>;
clock-names = "biu";
clock-frequency = <100000000>;
max-frequency = <50000000>;
fifo-depth = <32>;
card-detect-delay = <300>;
fifo-watermark-aligned;
data-addr = <0>;
bus-width = <4>;
cap-sd-highspeed;
/*broken-cd;*/
cap-sdio-irq;
cap-mmc-hw-reset;
non-removable;
enable-sdio-wakeup;
keep-power-in-suspend;
/*cap-power-off-card;*/
cap-mmc-highspeed;
/*fixed-emmc-driver-type;*/
post-power-on-delay-ms = <200>;
};
};
Ethernet
https://www.kernel.org/doc/Documentation/devicetree/bindings/net/snps,dwmac.yaml
soc {
gmac:gmac@10020000{
compatible = "snps,dwmac";
reg = <0x0 0x10020000 0x0 0x10000>;
interrupt-parent = <&plic>;
interrupts = <6 7>;
interrupt-names = "macirq","eth_wake_irq";
max-frame-size = <9000>;
phy-mode = "rgmii-txid";
snps,multicast-filter-bins = <256>;
snps,perfect-filter-entries = <128>;
rx-fifo-depth = <32768>;
tx-fifo-depth = <16384>;
clocks = <&gmacclk>;
clock-names = "stmmaceth";
snps,fixed-burst = <1>;
snps,no-pbl-x8 = <1>;
/*snps,force_sf_dma_mode;*/
snps,force_thresh_dma_mode;
snps,axi-config = <&stmmac_axi_setup>;
};
};
How to debug? We're stuck before the serial console is ready, so we need some other way to figure out where we're stuck.
The board has JTAG but I don't know how to use that. There's a thread on the BeagleBoard forum but it seems the discussion is still ongoing. https://forum.beagleboard.org/t/jtag/28954/1
See links in issue description. Haven't figured out how to make it load EDKII instead of U-Boot.
To see how far we're getting, we can just turn on/off the LED. It's GPIO 43 and U-Boot is doing that like this:
#define __iomem // __attribute__((noderef, address_space(2)))
#define MA_OUTW(io, val) (*(volatile UINT32 __iomem *)(io) = (UINT32)(val))
#define MA_INW(io) (*(volatile UINT32 __iomem *)(io))
#define EZGPIO_FULLMUX_BASE_ADDR 0x11910000UL
#define gpio_43_dout_REG_ADDR EZGPIO_FULLMUX_BASE_ADDR + 0x1A8
#define gpio_43_doen_REG_ADDR EZGPIO_FULLMUX_BASE_ADDR + 0x1AC
#define SET_GPIO_43_dout_LOW { \
uint32_t _ezchip_macro_read_value_=MA_INW(gpio_43_dout_REG_ADDR); \
_ezchip_macro_read_value_ &= ~(0xFF); \
_ezchip_macro_read_value_ |= (0x0&0xFF); \
MA_OUTW(gpio_43_dout_REG_ADDR,_ezchip_macro_read_value_); \
}
#define SET_GPIO_43_dout_HIGH { \
uint32_t _ezchip_macro_read_value_=MA_INW(gpio_43_dout_REG_ADDR); \
_ezchip_macro_read_value_ &= ~(0xFF); \
_ezchip_macro_read_value_ |= (0x1&0xFF); \
MA_OUTW(gpio_43_dout_REG_ADDR,_ezchip_macro_read_value_); \
}
#define SET_GPIO_43_doen_LOW { \
uint32_t _ezchip_macro_read_value_=MA_INW(gpio_43_doen_REG_ADDR); \
_ezchip_macro_read_value_ &= ~(0xFF); \
_ezchip_macro_read_value_ |= (0x0&0xFF); \
MA_OUTW(gpio_43_doen_REG_ADDR,_ezchip_macro_read_value_); \
}
SET_GPIO_43_doen_LOW;
SET_GPIO_43_dout_HIGH;
udelay(1000);
SET_GPIO_43_dout_LOW;
udelay(1000);
SET_GPIO_43_dout_HIGH;
See u-boot sources at:
I haven't been able to make that work, though.
@JohnAZoidberg This is really interesting thread and effort. I'm wondering if the status from 15 days ago is up to date, or you have managed to push something forward? Thanks.
@macpijan Nothing yet, don't know how to debug it.
BeagleV Starlight is cancelled, we still might support it, eventually, since we have 2 boards...
We received a board.
Website: https://beagleboard.org/beaglev Documentation: https://github.com/beagleboard/beaglev-starlight Forum: https://forum.beagleboard.org/c/beaglev Datasheet: https://github.com/starfive-tech/beaglev_doc/blob/main/JH7100%20Data%20Sheet%20V01.01.04-EN%20(4-21-2021).pdf U-Boot device tree (also used by opensbi): https://github.com/starfive-tech/sft-riscv-uboot/blob/starfive/arch/riscv/dts/starfive_vic7100_evb.dts Instruction Set:
rv64imafdc
Renode definition:
WIP branch
https://github.com/riscv/riscv-edk2-platforms/tree/riscv-virt-gh-actions/Platform/
Status: No output so far. Not sure if it's executing anything.
Tutorials
I/O
PcdFwStartAddress
,PcdFwEndAddress
PcdHartCount
,PcdBootHartId
,PcdBootableHartNumber
0x02000000
just like on U540)0x0c000000
just like on U540 but generic OpenSBI platform gets it via DT)BeagleBoard/BeagleVStarlight
directory and rename toBeagleVStarlight