Π
Π Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡΡ SD-ΠΊΠ°ΡΡΠ°, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½Π½Π°Ρ ΠΏΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ SPI, Π° ΡΠ°ΠΊΠΆΠ΅ UART. Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ BootROM Π±ΡΠ΄Π΅Ρ Π·Π°ΠΌΠ΅Π½ΡΠ½ Ρ xip
Π½Π° sdboot
ΠΈ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠ°Π΄ΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ (Π½Π° SD-ΠΊΠ°ΡΡΠ΅).
ΠΠΎΠΏΠΈΠ»ΠΈΠ²Π°Π½ΠΈΠ΅ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ
ΠΡΠ°ΠΊ, Π·Π°Π΄Π°ΡΠ°: Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° Β«Π±ΠΎΠ»ΡΡΠΎΠ΅Β» ΡΠ΄ΡΠΎ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ UART (ΠΎΡ Raspberry) ΠΈ SD-Π°Π΄Π°ΠΏΡΠ΅Ρ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π°ΡΡ Π½Π΅ΠΊΠ°Ρ ΠΏΠ»Π°ΡΠΊΠ° ΠΎΡ Catalex Ρ ΡΠ΅ΡΡΡΡ ΠΏΠΈΠ½Π°ΠΌΠΈ: GND, VCC, MISO, MOSI, SCK, CS).
Π ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, Π²ΡΡ Π±ΡΠ»ΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ. ΠΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΎΡΠΎΠ·Π½Π°ΡΡ, ΠΌΠ΅Π½Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ±ΡΠΎΡΠ°Π»ΠΎ ΠΈΠ· ΡΡΠΎΡΠΎΠ½Ρ Π² ΡΡΠΎΡΠΎΠ½Ρ: ΠΏΠΎΡΠ»Π΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠ°Π·Π° Ρ ΡΠ΅ΡΠΈΠ», ΡΡΠΎ ΡΠ½ΠΎΠ²Π° Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄ΠΌΠ΅ΡΠ°ΡΡ Π² System
ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ HasPeripheryUART
(ΠΈ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ), ΡΠΎ ΠΆΠ΅ Π΄Π»Ρ SD-ΠΊΠ°ΡΡΡ β ΠΈ Π²ΡΡ Π±ΡΠ΄Π΅Ρ Π³ΠΎΡΠΎΠ²ΠΎ. ΠΠΎΡΠΎΠΌ Ρ ΡΠ΅ΡΠΈΠ» ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, Π° ΠΊΠ°ΠΊ ΠΆΠ΅ ΠΎΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² Β«ΡΠ΅ΡΡΡΠ·Π½ΠΎΠΌΒ» Π΄ΠΈΠ·Π°ΠΉΠ½Π΅. Π’Π°ΠΊ, ΡΡΠΎ Ρ Π½Π°Ρ ΡΡΡ ΠΈΠ· ΡΠ΅ΡΡΡΠ·Π½ΠΎΠ³ΠΎ? Arty, Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π½Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ β ΠΎΡΡΠ°ΡΡΡΡ ΠΌΠΎΠ½ΡΡΡ unleahshed.DevKitConfigs
. Π Π²Π΄ΡΡΠ³ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΎΡΡ, ΡΡΠΎ ΡΠ°ΠΌ ΠΏΠΎΠ²ΡΡΠ΄Ρ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΎΠ²Π΅ΡΠ»Π΅ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠΎ ΠΊΠ»ΡΡΠ°ΠΌ. Π― Π΄ΠΎΠ³Π°Π΄ΡΠ²Π°ΡΡΡ, ΡΡΠΎ ΡΡΠΎ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΠΎΡΠ΅Π½Ρ Π³ΠΈΠ±ΠΊΠΎ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΠΌΠΎ, Π½ΠΎ ΠΌΠ½Π΅ Π±Ρ Ρ
ΠΎΡΡ ΡΡΠΎ-ΡΠΎ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° Π·Π°ΠΏΡΡΡΠΈΡΡβ¦ Π Ρ Π²Π°Ρ Π½Π΅Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅, ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΏΡΠΎΡΠ΅-ΠΏΠΎΠΊΠΎΡΡΡΠ»ΡΠ½Π΅Π΅?.. Π’ΡΡ-ΡΠΎ Ρ ΠΈ Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° vera.iofpga.FPGAChip
Π΄Π»Ρ ΠΠΠΠ‘ Microsemi ΠΈ ΡΡΡ ΠΆΠ΅ ΡΠ°ΡΡΠ°ΡΠΈΠ» Π½Π° ΡΠΈΡΠ°ΡΡ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ, Π±Π»Π°Π³ΠΎ ΡΡΡ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Π²ΡΡ Β«ΡΠ°Π·Π²ΠΎΠ΄ΠΊΠ° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΠΏΠ»Π°ΡΡΒ» Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅.
ΠΠΊΠ°Π·Π°Π»ΠΎΡΡ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² System.scala
ΡΡΡΠΎΡΠΊΠΈ
class System(implicit p: Parameters) extends RocketSubsystem
...
with HasPeripherySPI
with HasPeripheryUART
...
{
val tlclock = new FixedClockResource("tlclk", p(DevKitFPGAFrequencyKey))
...
}
class SystemModule[+L <: System](_outer: L)
extends RocketSubsystemModuleImp(_outer)
...
with HasPeripheryUARTModuleImp
with HasPeripheryGPIOModuleImp
...
Π‘ΡΡΠΎΡΠΊΠ° Π² ΡΠ΅Π»Π΅ ΠΊΠ»Π°ΡΡΠ° System
Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΡΡΠΎΡΠ΅, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΡΠ° ΡΠ°ΡΡΡ Π½Π°ΡΠ΅Π³ΠΎ SoC, Π² dts-ΡΠ°ΠΉΠ». ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, DTS/DTB β ΡΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΡΠ°ΡΠΈΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΎΠ³ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ plug-and-play Π΄Π»Ρ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΡ
ΡΡΡΡΠΎΠΉΡΡΠ²: Π΄Π΅ΡΠ΅Π²ΠΎ dts-ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ Π² Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ dtb-ΡΠ°ΠΉΠ» ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠΎΠΌ ΡΠ΄ΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΎ ΠΌΠΎΠ³Π»ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΡΡΡ. Π§ΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, Π±Π΅Π· ΡΡΡΠΎΡΠΊΠΈ Ρ tlclock
Π²ΡΡ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΡΠΈΠ½ΡΠ΅Π·ΠΈΡΡΠ΅ΡΡΡ, Π½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ BootROM (Π½Π°ΠΏΠΎΠΌΠ½Ρ, ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΆΠ΅ sdboot
) Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ β Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΎΠ½ ΠΏΠ°ΡΡΠΈΡ dts-ΡΠ°ΠΉΠ» ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ Ρ
Π΅Π΄Π΅Ρ Ρ ΠΌΠ°ΠΊΡΠΎΡΠΎΠΌ TL_CLK
, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΎΠ½ ΡΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Π΄Π΅Π»ΠΈΡΠ΅Π»ΠΈ ΡΠ°ΡΡΠΎΡΡ Π΄Π»Ρ Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ².
Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΡ Β«ΡΠ°Π·Π²ΠΎΠ΄ΠΊΡΒ»:
Platform.scala:
class PlatformIO(implicit val p: Parameters) extends Bundle {
...
// UART
io.uart_tx := sys.uart(0).txd
sys.uart(0).rxd := RegNext(RegNext(io.uart_rx))
// SD card
io.sd_cs := sys.spi(0).cs(0)
io.sd_sck := sys.spi(0).sck
io.sd_mosi := sys.spi(0).dq(0).o
sys.spi(0).dq(0).i := false.B
sys.spi(0).dq(1).i := RegNext(RegNext(io.sd_miso))
sys.spi(0).dq(2).i := false.B
sys.spi(0).dq(3).i := false.B
}
Π¦Π΅ΠΏΠΎΡΠΊΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ², ΡΠ΅ΡΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π‘ΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΡΠΈΡΠ°ΡΡ ΠΎΡ dq
? ΠΡΠ²Π΅ΡΠ° Ρ ΠΏΠΎΠΊΠ° ΡΠ°ΠΊ ΠΈ Π½Π΅ Π½Π°ΡΡΠ», Π½ΠΎ, ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠ΄ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
Π€ΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ, Ρ ΠΏΡΠΎΡΡΠΎ Π½Π°Π·Π½Π°ΡΠΈΠ» Π²ΡΠ²ΠΎΠ΄Ρ Π΄ΠΈΠ·Π°ΠΉΠ½Π° Π½Π° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠ°ΠΊΡΡ Π½Π° ΠΊΠΎΠ»ΠΎΠ΄ΠΊΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²ΠΈΠ» Π΄ΠΆΠ°ΠΌΠΏΠ΅Ρ Π²ΡΠ±ΠΎΡΠ° Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΡ Π² 3.3V.
SD-Π°Π΄Π°ΠΏΡΠ΅Ρ
ΠΠΈΠ΄ ΡΠ²Π΅ΡΡ Ρ:
ΠΠΈΠ΄ ΡΠ½ΠΈΠ·Ρ:
ΠΡΠ»Π°Π΄ΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ: ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎΠ± ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΈ ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡ .
Minicom
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π½Π°ΠΌ Π±ΡΠ΄Π΅Ρ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠΈΡΠ°ΡΡ ΡΠΎ, ΡΡΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ ΠΈ ΡΠ΄ΡΠΎ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π° Linux (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ β Π½Π° ΡΠΎΠΌ, ΡΡΠΎ Π½Π° RaspberryPi) Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Minicom. ΠΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡΡ Π»ΡΠ±Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½Ρ ΠΏΠΎΡΡΠΎΠΌ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΈΠΌΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΏΠΎΡΡΠ° Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΊΠ°ΠΊ -D /dev/ttyS0
β ΠΏΠΎΡΠ»Π΅ ΠΎΠΏΡΠΈΠΈ -D
. ΠΡ ΠΈ Π³Π»Π°Π²Π½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ: Π΄Π»Ρ Π²ΡΡ
ΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Ctrl-A, X
. Π£ ΠΌΠ΅Π½Ρ ΠΏΡΠ°Π²Π΄Π° Π±ΡΠ» ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π»Π° β ΡΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· ΡΠΎΡΠ΅Π΄Π½Π΅Π³ΠΎ ΡΠ΅Π°Π½ΡΠ° SSH ΠΏΡΠΎΡΡΠΎ ΡΠΊΠ°Π·Π°ΡΡ killall -KILL minicom
.
ΠΡΡΡ ΠΈ Π΅ΡΡ ΠΎΠ΄Π½Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ. ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π½Π° RaspberryPi Π΅ΡΡΡ Π΄Π²Π° UART, ΠΈ ΠΎΠ±Π° ΠΏΠΎΡΡΠ° ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠΆΠ΅ Π΄Π»Ρ ΡΠ΅Π³ΠΎ-ΡΠΎ ΠΏΡΠΈΡΠΏΠΎΡΠΎΠ±Π»Π΅Π½Ρ: ΠΎΠ΄ΠΈΠ½ Π΄Π»Ρ Bluetooth, ΡΠ΅ΡΠ΅Π· Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΡΠ΄ΡΠ°. Π ΡΡΠ°ΡΡΡΡ, ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π½Π°ΡΡΡΠΎΠΈΡΡ
ΠΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ
ΠΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅, Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π³ΠΈΠΏΠΎΡΠ΅Π·Ρ ΠΌΠ½Π΅ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΠ»ΠΎΡΡ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ (ΠΈΠ·Π²ΠΈΠ½ΠΈΡΠ΅) Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Ρ Ρ
ΠΎΡΡΠ°. ΠΠΎΠΆΠ΅Ρ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΡΡΠΌΠΎ ΠΈΠ· GDB, Π½ΠΎ Ρ Π² ΠΈΡΠΎΠ³Π΅ ΠΏΠΎΡΡΠ» ΠΏΠΎ ΠΏΡΠΎΡΡΠΎΠΌΡ ΠΏΡΡΠΈ: ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π» Π½Π° Raspberry Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠΉ ΡΠ°ΠΉΠ», ΠΏΡΠΎΠ±ΡΠΎΡΠΈΠ» ΡΠ΅ΡΠ΅Π· SSH ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΡΡ 4444 (telnet ΠΎΡ OpenOCD) ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ load_image
. ΠΠΎΠ³Π΄Π° Π²Ρ Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΠ΅, ΠΊΠ°ΠΆΠ΅ΡΡΡ ΡΡΠΎ Π²ΡΡ Π·Π°Π²ΠΈΡΠ»ΠΎ, Π½ΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Β«ΠΎΠ½ΠΎ Π½Π΅ ΡΠΏΠΈΡ, ΠΎΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΌΠΎΡΠ³Π°Π΅ΡΒ»: ΠΎΠ½ΠΎ Π³ΡΡΠ·ΠΈΡ ΡΠ°ΠΉΠ», ΠΏΡΠΎΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΡΡΠΎ ΡΠΎ ΡΠΊΠΎΡΠΎΡΡΡ ΠΏΠ°ΡΡ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ breakpoint-ΠΎΠ²
ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΎΠ± ΡΡΠΎΠΌ Π½Π΅ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΠ»ΠΎΡΡ Π·Π°Π΄ΡΠΌΡΠ²Π°ΡΡΡΡ ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅ ΠΎΠ±ΡΡΠ½ΡΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π½ΠΎ ΡΠΎΡΠΊΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²Π° Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΡΠ°Π²ΡΡΡΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎ. ΠΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° breakpoint-Π° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°Π½ΠΈΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π² Π½ΡΠΆΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ ΠΏΡΡΠΌΠΎ Π² ΠΌΠ°ΡΠΈΠ½Π½ΡΠΉ ΠΊΠΎΠ΄. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊ Ρ ΠΌΠ΅Π½Ρ Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π»Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° b
Π² GDB. ΠΠΎΡ, ΡΡΠΎ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ:
- Π½Π΅Π»ΡΠ·Ρ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΎΡΠΊΡ Π²Π½ΡΡΡΠΈ BootROM, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ROM
- ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΎΡΠΊΡ ΠΎΡΡΠ°Π½ΠΎΠ²Π° Π½Π° ΠΊΠΎΠ΄, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠΉ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²ΠΊΡ Ρ SD-ΠΊΠ°ΡΡΡ, ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π·Π°Π³ΡΡΠΆΠ΅Π½. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ΅ΠΌ ΠΊΡΡΠΎΡΠ΅ΠΊ ΠΊΠΎΠ΄Π°, Π° Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ΅Ρ Π½Π°Ρ breakpoint
Π£Π²Π΅ΡΠ΅Π½, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²Π½ΠΎ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²Π°, Π½ΠΎ ΠΈΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ.
ΠΡΡΡΡΠ°Ρ ΠΏΠΎΠ΄ΠΌΠ΅Π½Π° BootROM
ΠΠ° Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π½Π΅ΡΠ΅Π΄ΠΊΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΡ BootROM ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π΅ΡΡ ΡΠ°Π·ΠΎΠΊ. ΠΠΎ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°: BootROM ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ Π΄ΠΈΠ·Π°ΠΉΠ½Π°, Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ Π² ΠΠΠΠ‘, Π° Π΅Π³ΠΎ ΡΠΈΠ½ΡΠ΅Π· β Π΄Π΅Π»ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΌΠΈΠ½ΡΡ (ΠΈ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΡΡΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π° BootROM ΠΈΠ· C ΠΈ Assembler…). Π ΡΡΠ°ΡΡΡΡ, Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π²ΡΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΡΡΡΠ΅Π΅: ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΡΠ°ΠΊΠ°Ρ:
- ΠΏΠ΅ΡΠ΅Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ bootrom.mif (Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ» Π½Π° MIF Π²ΠΌΠ΅ΡΡΠΎ HEX, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ HEX Ρ ΠΌΠ΅Π½Ρ Π²Π΅ΡΠ½ΠΎ Π±ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π° MIF β ΡΠΎΠ΄Π½ΠΎΠΉ ΠΠ»ΡΡΠ΅ΡΠΎΠ²ΡΠΊΠΈΠΉ ΡΠΎΡΠΌΠ°Ρ)
- Π² Quartus ΡΠΊΠ°Π·Π°ΡΡ
Processing -> Update Memory Initialization File
- Π½Π° ΠΏΡΠ½ΠΊΡΠ΅ Assembler (Π² Π»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ Tasks) ΡΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠ²Π°ΡΡ Start again
ΠΠ° Π²ΡΡ ΠΏΡΠΎ Π²ΡΡ β ΠΏΠ°ΡΠ° Π΄Π΅ΡΡΡΠΊΠΎΠ² ΡΠ΅ΠΊΡΠ½Π΄.
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° SD-ΠΊΠ°ΡΡΡ
Π’ΡΡ Π²ΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ, Π½ΠΎ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΠ°ΡΡΠΈΡΡ ΡΠ΅ΡΠΏΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΎΠΊΠΎΠ»ΠΎ 14Gb ΠΌΠ΅ΡΡΠ° Π½Π° Π΄ΠΈΡΠΊΠ΅:
git clone https://github.com/sifive/freedom-u-sdk
git submodule update --recursive --init
make
ΠΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π½ΡΠΆΠ½ΠΎ Π²ΡΡΠ°Π²ΠΈΡΡ ΡΠΈΡΡΡΡ, Π° ΡΠΎΡΠ½Π΅Π΅, Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ, SD-ΠΊΠ°ΡΡΡ, ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ
sudo make DISK=/dev/sdX format-boot-loader
β¦ Π³Π΄Π΅ sdX
β ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ, Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΠΎΠ΅ ΠΊΠ°ΡΡΠ΅. ΠΠΠΠΠΠΠΠ: Π΄Π°Π½Π½ΡΠ΅ Π½Π° ΠΊΠ°ΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ΄Π°Π»Π΅Π½Ρ, ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠ°Π½Ρ ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅! ΠΡΡΠ΄ Π»ΠΈ ΡΡΠΎΠΈΡ Π΄Π΅Π»Π°ΡΡ Π²ΡΡ ΡΠ±ΠΎΡΠΊΡ ΠΈΠ·-ΠΏΠΎΠ΄ sudo
, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠΎΠ³Π΄Π° Π²ΡΠ΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡΡ ΡΠ±ΠΎΡΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΡ root
, ΠΈ ΡΠ±ΠΎΡΠΊΡ ΠΏΡΠΈΠ΄ΡΡΡΡ Π΄Π΅Π»Π°ΡΡ ΠΈΠ·-ΠΏΠΎΠ΄ sudo
ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ.
Π ΠΈΡΠΎΠ³Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊΠ°ΡΡΠΎΡΠΊΠ°, ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½Π°Ρ Π² GPT Ρ ΡΠ΅ΡΡΡΡΠΌΡ ΡΠ°Π·Π΄Π΅Π»Π°ΠΌΠΈ, Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
FAT Ρ uEnv.txt
ΠΈ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ FIT (ΠΎΠ½ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°Π·ΠΎΠ², ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΎ ΡΠ²ΠΎΠΈΠΌ Π°Π΄ΡΠ΅ΡΠΎΠΌ Π·Π°Π³ΡΡΠ·ΠΊΠΈ), Π΄ΡΡΠ³ΠΎΠΉ ΡΠ°Π·Π΄Π΅Π» β ΡΠΈΡΡΡΠΉ, Π΅Π³ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΠΎΡΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°ΡΡ Π² Ext4 Π΄Π»Ρ ΠΠΈΠ½ΡΠΊΡΠ°. ΠΡΡ Π΄Π²Π° ΡΠ°Π·Π΄Π΅Π»Π° β Π·Π°Π³Π°Π΄ΠΎΡΠ½ΡΠ΅: Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΆΠΈΠ²ΡΡ U-Boot (Π΅Π³ΠΎ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, Π·Π°ΡΠΈΡΠΎ Π² BootROM), Π½Π° Π΄ΡΡΠ³ΠΎΠΌ, ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΠΆΠΈΠ²ΡΡ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ Ρ ΠΈΡ
ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ.
Π£ΡΠΎΠ²Π΅Π½Ρ ΠΏΠ΅ΡΠ²ΡΠΉ, BootROM
ΠΠ°ΡΠΎΠ΄Π½Π°Ρ ΠΌΡΠ΄ΡΠΎΡΡΡ Π³Π»Π°ΡΠΈΡ: Β«ΠΡΠ»ΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π±ΡΠ²Π°ΡΡ ΠΏΠ»ΡΡΠΊΠΈ Ρ Π±ΡΠ±Π½ΠΎΠΌ, ΡΠΎ Π² ΡΠ»Π΅ΠΊΡΡΠΎΠ½ΠΈΠΊΠ΅ β Π΅ΡΡ ΠΈ Ρ ΠΎΠ³Π½Π΅ΡΡΡΠΈΡΠ΅Π»Π΅ΠΌΒ». Π Π΅ΡΡ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Ρ ΡΡΡΡ Π½Π΅ ΡΠΏΠ°Π»ΠΈΠ» ΠΏΠ»Π°ΡΡ, ΡΠ΅ΡΠΈΠ², ΡΡΠΎ Β«ΠΡ GND β ΡΡΠΎ ΠΆΠ΅ ΡΠΎΡ ΠΆΠ΅ Π½ΠΈΠ·ΠΊΠΈΠΉ ΡΡΠΎΠ²Π΅Π½ΡΒ» (Π²ΠΈΠ΄ΠΈΠΌΠΎ, ΡΠ΅Π·ΠΈΡΡΠΎΡ Π²ΡΡ-ΡΠ°ΠΊΠΈ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°Π» Π±Ρ…) Π Π΅ΡΡ ΡΠΊΠΎΡΠ΅Π΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΡΠΊΠΈ ΡΠ°ΡΡΡΡ Π½Π΅ ΠΎΡΡΡΠ΄Π°, ΡΠΎ ΡΠ»Π΅ΠΊΡΡΠΎΠ½ΠΈΠΊΠ° Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°ΡΡ ΠΏΡΠΈΠ½ΠΎΡΠΈΡΡ ΡΡΡΠΏΡΠΈΠ·Ρ: ΠΏΡΠΈΠΏΠ°ΠΈΠ²Π°Ρ ΡΠ°Π·ΡΡΠΌ Π½Π° ΠΏΠ»Π°ΡΡ, Ρ ΡΠ°ΠΊ ΠΈ Π½Π΅ ΡΡΠΌΠ΅Π» Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΠΏΠ°ΡΡΡ ΠΊΠΎΠ½ΡΠ°ΠΊΡΡ β Π½Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ, ΠΊΠ°ΠΊ ΠΏΡΠΈΠΏΠΎΠΉ ΠΏΡΡΠΌΠΎ ΡΠ°ΠΌ ΡΠ°ΡΡΠ΅ΠΊΠ°Π΅ΡΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ»ΡΠ½ΠΈΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠΈ, Ρ ΠΌΠ΅Π½Ρ ΠΆΠ΅ ΠΎΠ½ Β«Π½Π°ΡΠ»ΡΠΏΡΠ²Π°Π»ΡΡΒ» ΠΊΠ°ΠΊ ΠΏΠΎΠΏΠ°Π»ΠΎ. ΠΡ, ΠΌΠΎΠΆΠ΅Ρ, ΠΏΡΠΈΠΏΠΎΠΉ Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΠ» Π΄Π»Ρ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΠΏΠ°ΡΠ»ΡΠ½ΠΈΠΊΠ°, ΠΌΠΎΠΆΠ΅Ρ, Π΅ΡΡ ΡΡΠΎβ¦ Π ΠΎΠ±ΡΠ΅ΠΌ, ΡΠ²ΠΈΠ΄Π΅Π², ΡΡΠΎ Π΄Π΅ΡΡΡΠΎΠΊ ΠΊΠΎΠ½ΡΠ°ΠΊΡΠΎΠ² Ρ ΠΌΠ΅Π½Ρ ΡΠΆΠ΅ Π΅ΡΡΡ, Ρ ΠΏΠ»ΡΠ½ΡΠ», ΠΈ Π½Π°ΡΠ°Π» ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ. Π ΡΡΡ Π½Π°ΡΠ°Π»ΠΎΡΡ Π·Π°Π³Π°Π΄ΠΎΡΠ½ΠΎΠ΅: ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ» RX/TX ΠΎΡ UART-Π°, Π·Π°Π³ΡΡΠΆΠ°Ρ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ β ΠΎΠ½ΠΎ ΠΏΠΈΡΠ΅Ρ
INIT
CMD0
ERROR
ΠΡ, Π²ΡΡ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ β ΠΌΠΎΠ΄ΡΠ»Ρ SD-ΠΊΠ°ΡΡΡ Ρ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ». ΠΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠΈΡΡΠ°ΡΠΈΡ, Π³ΡΡΠ·ΠΈΠΌ ΠΏΡΠΎΡΠΈΠ²ΠΊΡβ¦ Π ΡΠΈΡΠΈΠ½Π°β¦ Π§Π΅Π³ΠΎ Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄ΡΠΌΠ°Π», Π° Π»Π°ΡΡΠΈΠΊ-ΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΊΡΡΠ²Π°Π»ΡΡ: ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΡΠ²ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠ΄ΡΠ»Ρ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π½Π° VCC. Π ΠΌΠΎΡΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π» 5V Π΄Π»Ρ ΠΏΠΈΡΠ°Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ Ρ, Π½Π΅Π΄ΠΎΠ»Π³ΠΎ Π΄ΡΠΌΠ°Ρ, Π²ΠΎΡΠΊΠ½ΡΠ» ΠΏΡΠΎΠ²ΠΎΠ΄, ΡΡΠ½ΡΠ²ΡΠΈΠΉΡΡ ΠΎΡ ΠΌΠΎΠ΄ΡΠ»Ρ, Π½Π° ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡΡ ΡΡΠΎΡΠΎΠ½Ρ ΠΏΠ»Π°ΡΡ. Π ΠΈΡΠΎΠ³Π΅ ΠΊΡΠΈΠ²ΠΎ ΠΏΡΠΎΠΏΠ°ΡΠ½Π½ΡΠΉ ΡΠ°Π·ΡΡΠΌ ΠΏΠ΅ΡΠ΅ΠΊΠΎΡΠΈΠ»ΡΡ, ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΠ΅ΡΡΠ»ΡΡ ΠΊΠΎΠ½ΡΠ°ΠΊΡ UART. facepalm.jpg Π ΠΎΠ±ΡΠ΅ΠΌ, Β«Π΄ΡΡΠ½Π°Ρ Π³ΠΎΠ»ΠΎΠ²Π° Π½ΠΎΠ³Π°ΠΌ ΠΏΠΎΠΊΠΎΡ Π½Π΅ Π΄Π°ΡΡΒ», Π° ΠΊΡΠΈΠ²ΡΠ΅ ΡΡΠΊΠΈ β Π³ΠΎΠ»ΠΎΠ²Π΅…
Π ΠΈΡΠΎΠ³Π΅ Ρ ΡΠ²ΠΈΠ΄ΠΈΠ» Π² Minicom Π΄ΠΎΠ»Π³ΠΎΠΆΠ΄Π°Π½Π½ΠΎΠ΅
INIT
CMD0
CMD8
ACMD41
CMD58
CMD16
CMD18
LOADING /
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΎΠ½ΠΎ ΡΠ΅Π²Π΅Π»ΠΈΡΡΡ ΠΊΡΡΡΠΈΡΡΡ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ. ΠΡΡΠΌΠΎ Π²ΡΠΏΠΎΠΌΠΈΠ½Π°ΡΡΡΡ ΡΠΊΠΎΠ»ΡΠ½ΡΠ΅ Π³ΠΎΠ΄Ρ ΠΈ Π½Π΅ΡΠΏΠ΅ΡΠ½Π°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° MinuetOS Ρ Π΄ΠΈΡΠΊΠ΅ΡΡ. Π Π°Π·Π²Π΅ ΡΡΠΎ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ΄ Π½Π΅ ΡΠΊΡΠ΅ΠΆΠ΅ΡΠ΅Ρ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ BOOT Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½ΠΈΡΠ΅Π³ΠΎ. ΠΠ½Π°ΡΠΈΡ, ΡΠ°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΡΠ΅ΡΠ΅Π· OpenOCD Π½Π° Raspberry, ΠΊ Π½Π΅ΠΌΡ GDB Π½Π° Ρ ΠΎΡΡΠ΅, ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ ΠΆΠ΅ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅.
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ GDB ΡΡΡ ΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎ, ΡΡΠΎ $pc
(program counter, Π°Π΄ΡΠ΅Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ) ΡΠ»Π΅ΡΠ°Π΅Ρ Π² 0x0
β Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΠ»Π΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΠΎΡΡΠΎΠΌΡ, ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ΄Π°ΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ BOOT
Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ». ΠΡΠΎ Π΅Π³ΠΎ Π½Π΅Π½Π°Π΄ΠΎΠ»Π³ΠΎ Π·Π°Π΄Π΅ΡΠΆΠΈΡ…
diff --git a/bootrom/sdboot/sd.c b/bootrom/sdboot/sd.c
index c6b5ede..bca1b7f 100644
--- a/bootrom/sdboot/sd.c
+++ b/bootrom/sdboot/sd.c
@@ -224,6 +224,8 @@ int main(void)
kputs("BOOT");
+ while(*(volatile char *)0x10000){}
+
__asm__ __volatile__ ("fence.i" : : : "memory");
return 0;
}
Π’Π°ΠΊΠΎΠΉ Ρ
ΠΈΡΡΡΠΉ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Β«Π΄Π»Ρ Π½Π°Π΄ΡΠΆΠ½ΠΎΡΡΠΈΒ»: Ρ Π³Π΄Π΅-ΡΠΎ ΡΠ»ΡΡΠ°Π», ΡΡΠΎ, Π²ΡΠΎΠ΄Π΅ Π±Ρ, Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ» β ΡΡΠΎ Undefined Behavior, Π° ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΡΠ΄ Π»ΠΈ Π΄ΠΎΠ³Π°Π΄Π°Π΅ΡΡΡ (ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Ρ, ΡΡΠΎ ΠΏΠΎ 0x10000
Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ BootROM).
ΠΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ, Π° ΡΡΠΎ Π΅ΡΡ ΠΎΠΆΠΈΠ΄Π°ΡΡ β ΡΡΡΠΎΠ²ΡΠΉ embedded, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΆ ΡΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ. ΠΠΎ Π²Π΅Π΄Ρ Π²
(gdb) file builds/zeowaa-e115/sdboot.elf
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from builds/zeowaa-e115/sdboot.elf...done.
Π’ΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ½ΠΎ Π³ΡΡΠ·ΠΈΡΡ Π½Π΅ MIF-ΡΠ°ΠΉΠ» ΠΈ Π½Π΅ bin, Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΡ Π²Π΅ΡΡΠΈΡ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ ELF.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΡΠ½Π½ΠΎΠΉ ΠΏΠΎΠΏΡΡΠΊΠΈ ΡΠ³Π°Π΄Π°ΡΡ Π°Π΄ΡΠ΅Ρ, Π³Π΄Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡΡ (ΡΡΠΎ Π΅ΡΡ ΠΎΠ΄Π½Π° ΠΏΡΠΈΡΠΈΠ½Π°, ΠΏΠΎΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ» Π΄ΠΎΠ³Π°Π΄Π°ΡΡΡΡ, ΡΡΠΎ ΡΠΈΠΊΠ» β Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ). ΠΠΎΠΌΠ°Π½Π΄Π°
set variable $pc=0xADDR
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠ° Π½Π° Ρ ΠΎΠ΄Ρ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ β Π°Π΄ΡΠ΅Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ). Π‘ Π΅Ρ ΠΆΠ΅ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΡ (ΠΈ memory-mapped ΡΠ΅Π³ΠΈΡΡΡΡ).
Π ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅ Ρ ΠΏΡΠΈΡΡΠ» ΠΊ Π²ΡΠ²ΠΎΠ΄Ρ (Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌΡ), ΡΡΠΎ Ρ Π½Π°Ρ Β«ΠΎΠ±ΡΠ°Π· sd-ΠΊΠ°ΡΡΡ Π½Π΅ ΡΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡΒ», ΠΈ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡΡ Π½ΡΠΆΠ½ΠΎ Π½Π΅ Π½Π° ΡΠ°ΠΌΠΎΠ΅ Π½Π°ΡΠ°Π»ΠΎ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
, Π° Π½Π° 0x89800
Π±Π°ΠΉΡΠΎΠ² Π΄Π°Π»ΡΡΠ΅:
diff --git a/bootrom/sdboot/head.S b/bootrom/sdboot/head.S
index 14fa740..2a6c944 100644
--- a/bootrom/sdboot/head.S
+++ b/bootrom/sdboot/head.S
@@ -13,7 +13,7 @@ _prog_start:
smp_resume(s1, s2)
csrr a0, mhartid
la a1, dtb
- li s1, PAYLOAD_DEST
+ li s1, (PAYLOAD_DEST + 0x89800)
jr s1
.section .rodata
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π° ΡΡΠΎΠΌ ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΠ°Π·Π°Π»ΠΎΡΡ ΡΠΎ, ΡΡΠΎ Π½Π΅ ΠΈΠΌΠ΅Ρ ΠΏΠΎΠ΄ ΡΡΠΊΠΎΠΉ Π½Π΅Π½ΡΠΆΠ½ΠΎΠΉ ΠΊΠ°ΡΡΡ Π½Π° 4Gb, Ρ Π²Π·ΡΠ» Π½Π° 2Gb ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΡΡΠΊΠ° Π·Π°ΠΌΠ΅Π½ΠΈΠ» Π² Makefile DEMO_END=11718750
Π½Π° DEMO_END=3078900
(Π½Π΅ ΠΈΡΠΈΡΠ΅ ΡΠΌΡΡΠ» Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ β Π΅Π³ΠΎ Π½Π΅Ρ, ΠΏΡΠΎΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ±ΡΠ°Π· ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π½Π° ΠΊΠ°ΡΡΠΎΡΠΊΡ).
Π£ΡΠΎΠ²Π΅Π½Ρ Π²ΡΠΎΡΠΎΠΉ, U-Boot
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Π²ΡΡ Π΅ΡΡ Β«ΠΏΠ°Π΄Π°Π΅ΠΌΒ», Π½ΠΎ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌΡΡ ΡΠΆΠ΅ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ 0x0000000080089a84
. Π’ΡΡ Ρ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½ ΠΏΡΠΈΠ·Π½Π°ΡΡΡΡ: Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ΄ΡΡ Π½Π΅ Β«ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ°ΠΌΠΈΒ», Π° ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΠΈΡΠ΅ΡΡΡ ΡΠΆΠ΅ Β«ΠΎΠΏΠΎΡΠ»ΡΒ», ΠΏΠΎΡΡΠΎΠΌΡ Π·Π΄Π΅ΡΡ Ρ ΡΠΆΠ΅ ΡΡΠΏΠ΅Π» ΠΏΠΎΠ΄Π»ΠΎΠΆΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ dtb-ΡΠ°ΠΉΠ» ΠΎΡ Π½Π°ΡΠ΅Π³ΠΎ SoC, ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΡ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
HiFive_U-Boot
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ CONFIG_SYS_TEXT_BASE=0x80089800
(Π²ΠΌΠ΅ΡΡΠΎ 0x08000000
), ΡΡΠΎΠ±Ρ Π°Π΄ΡΠ΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π» Ρ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌ. ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΆΠ΅ ΠΊΠ°ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ Π΄ΡΡΠ³ΠΎΠΉ ΠΎΠ±ΡΠ°Π·:
(gdb) file ../freedom-u-sdk/work/HiFive_U-Boot/u-boot
(gdb) tui en
Π Π²ΠΈΠ΄ΠΈΠΌ:
β304 /* β
β305 * trap entry β
β306 */ β
β307 trap_entry: β
β308 addi sp, sp, -32*REGBYTES β
>β309 SREG x1, 1*REGBYTES(sp) β
β310 SREG x2, 2*REGBYTES(sp) β
β311 SREG x3, 3*REGBYTES(sp) β
ΠΡΠΈΡΡΠΌ ΠΌΡ ΠΏΡΡΠ³Π°Π΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΠΎΡΠΊΠ°ΠΌΠΈ 308 ΠΈ 309. Π Π½Π΅ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠΈΡΡΠ²Π°Ρ, ΡΡΠΎ Π² $sp
Π»Π΅ΠΆΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 0xfffffffe31cdc0a0
. Π£Π²Ρ, ΠΎΠ½ΠΎ Π΅ΡΡ ΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Β«ΡΠ±Π΅Π³Π°Π΅ΡΒ» ΠΈΠ·-Π·Π° ΡΡΡΠΎΡΠΊΠΈ 307. ΠΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΎΡΠΊΡ ΠΎΡΡΠ°Π½ΠΎΠ²Π° Π½Π° trap_entry
, Π° ΠΏΠΎΡΠΎΠΌ ΡΠ½ΠΎΠ²Π° ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° 0x80089800
(ΡΠΎΡΠΊΡ Π²Ρ
ΠΎΠ΄Π° U-Boot), ΠΈ Π±ΡΠ΄Π΅ΠΌ Π½Π°Π΄Π΅ΡΡΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΎ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΎΠΌβ¦ ΠΠΎΡ
ΠΎΠΆΠ΅, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ:
(gdb) b trap_entry
Breakpoint 1 at 0x80089a80: file /hdd/trosinenko/fpga/freedom-u-sdk/HiFive_U-Boot/arch/riscv/cpu/HiFive/start.S, line 308.
(gdb) set variable $pc=0x80089800
(gdb) c
Continuing.
Breakpoint 1, trap_entry () at /hdd/trosinenko/fpga/freedom-u-sdk/HiFive_U-Boot/arch/riscv/cpu/HiFive/start.S:308
(gdb) p/x $sp
$4 = 0x81cf950
Π’Π°ΠΊ ΡΠ΅Π±Π΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΡΠ΅ΠΊΠ°, ΠΏΡΡΠΌΠΎ ΡΠΊΠ°ΠΆΠ΅ΠΌ: ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΌΠΈΠΌΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²ΠΊΠΈ (Π΅ΡΠ»ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Ρ Π½Π°Ρ Π΅ΡΡ Π½Π΅Ρ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ Π°Π΄ΡΠ΅ΡΠΎΠ², Π½ΠΎ Π±ΡΠ΄Π΅ΠΌ Π½Π°Π΄Π΅ΡΡΡΡΡ Π½Π° ΠΏΡΠΎΡΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ).
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° 0x881cf950
. Π ΠΈΡΠΎΠ³Π΅ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ handle_trap
Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΡ
ΠΎΠ΄ΠΈΠΌ Π² _exit_trap
Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ epc=2148315240
(Π² Π΄Π΅ΡΡΡΠΈΡΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅):
(gdb) x/10i 2148315240
0x800cb068 <strnlen+12>: lbu a4,0(a5)
0x800cb06c <strnlen+16>: bnez a4,0x800cb078 <strnlen+28>
0x800cb070 <strnlen+20>: sub a0,a5,a0
0x800cb074 <strnlen+24>: ret
0x800cb078 <strnlen+28>: addi a5,a5,1
0x800cb07c <strnlen+32>: j 0x800cb064 <strnlen+8>
0x800cb080 <strdup>: addi sp,sp,-32
0x800cb084 <strdup+4>: sd s0,16(sp)
0x800cb088 <strdup+8>: sd ra,24(sp)
0x800cb08c <strdup+12>: li s0,0
Π‘ΡΠ°Π²ΠΈΠΌ breakpoint Π½Π° strnlen
, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ:
(gdb) bt
#0 strnlen (s=s@entry=0x10060000 "", count=18446744073709551615) at lib/string.c:283
#1 0x00000000800cc14c in string (buf=buf@entry=0x881cbd4c "", end=end@entry=0x881cc15c "", s=0x10060000 "", field_width=<optimized out>, precision=<optimized out>, flags=<optimized out>) at lib/vsprintf.c:265
#2 0x00000000800cc63c in vsnprintf_internal (buf=buf@entry=0x881cbd38 "exception code: 5 , ", size=size@entry=1060, fmt=0x800d446e "s , epc %08x , ra %08lxn", fmt@entry=0x800d4458 "exception code: %d , %s , epc %08x , ra %08lxn", args=0x881cc1a0,
args@entry=0x881cc188) at lib/vsprintf.c:619
#3 0x00000000800cca54 in vsnprintf (buf=buf@entry=0x881cbd38 "exception code: 5 , ", size=size@entry=1060, fmt=fmt@entry=0x800d4458 "exception code: %d , %s , epc %08x , ra %08lxn", args=args@entry=0x881cc188) at lib/vsprintf.c:710
#4 0x00000000800cca68 in vscnprintf (buf=buf@entry=0x881cbd38 "exception code: 5 , ", size=size@entry=1060, fmt=fmt@entry=0x800d4458 "exception code: %d , %s , epc %08x , ra %08lxn", args=args@entry=0x881cc188) at lib/vsprintf.c:717
#5 0x00000000800ccb50 in printf (fmt=fmt@entry=0x800d4458 "exception code: %d , %s , epc %08x , ra %08lxn") at lib/vsprintf.c:792
#6 0x000000008008a9f0 in _exit_trap (regs=<optimized out>, epc=2148315240, code=<optimized out>) at arch/riscv/lib/interrupts.c:92
#7 handle_trap (mcause=<optimized out>, epc=<optimized out>, regs=<optimized out>) at arch/riscv/lib/interrupts.c:55
#8 0x0000000080089b10 in trap_entry () at /hdd/trosinenko/fpga/freedom-u-sdk/HiFive_U-Boot/arch/riscv/cpu/HiFive/start.S:343
Backtrace stopped: frame did not save the PC
ΠΠΎΡ
ΠΎΠΆΠ΅, _exit_trap
Ρ
ΠΎΡΠ΅Ρ Π²ΡΠ΄Π°ΡΡ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π΄ΡΠ΅Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π½ΠΎ Ρ Π½Π΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ. Π’Π°ΠΊ, ΡΡΠΎ-ΡΠΎ Ρ Π½Π°Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ ΠΎΠΏΡΡΡ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ. set directories ../freedom-u-sdk/HiFive_U-Boot/
Π! Π’Π΅ΠΏΠ΅ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ!
Π§ΡΠΎ ΠΆΠ΅, Π·Π°ΠΏΡΡΡΠΈΠΌ Π΅ΡΡ ΡΠ°Π·, ΠΈ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎ ΡΡΠ΅ΠΊ-ΡΡΠ΅ΠΉΡΡ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π²ΡΠ·Π²Π°Π²ΡΠ΅ΠΉ ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠΈΠ±ΠΊΡ (mcause == 5
). ΠΡΠ»ΠΈ Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Load access fault
. ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡ, Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΠΎΡ Π·Π΄Π΅ΡΡ
arch/riscv/cpu/HiFive/start.S:
call_board_init_f:
li t0, -16
li t1, CONFIG_SYS_INIT_SP_ADDR
and sp, t1, t0 /* force 16 byte alignment */
#ifdef CONFIG_DEBUG_UART
jal debug_uart_init
#endif
call_board_init_f_0:
mv a0, sp
jal board_init_f_alloc_reserve
mv sp, a0
jal board_init_f_init_reserve
mv a0, zero /* a0 <-- boot_flags = 0 */
la t5, board_init_f
jr t5 /* jump to board_init_f() */
$sp
ΠΈΠΌΠ΅Π΅Ρ ΡΠΎ ΡΠ°ΠΌΠΎΠ΅ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΈ Π²Π½ΡΡΡΠΈ board_init_f_init_reserve
Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠΎΡ
ΠΎΠΆΠ΅, Π²ΠΎΡ ΠΈ Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΠΊ: ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Ρ Π½Π΅Π΄Π²ΡΡΠΌΡΡΠ»Π΅Π½Π½ΡΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ CONFIG_SYS_INIT_SP_ADDR
. ΠΠ½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π² ΡΠ°ΠΉΠ»Π΅ HiFive_U-Boot/include/configs/HiFive-U540.h
. Π ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ΄ΡΠΌΠ°Π», Π° ΠΌΠΎΠΆΠ΅Ρ, Π½Ρ Π΅Π³ΠΎ, Π΄ΠΎΠΏΠΈΠ»ΠΈΠ²Π°ΡΡ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ ΠΏΠΎΠ΄ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ β ΠΌΠΎΠΆΠ΅Ρ, Π»Π΅Π³ΡΠ΅ ΡΡΡΡ ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ? ΠΠΎ ΠΏΠΎΡΠΎΠΌ Ρ ΡΠ²ΠΈΠ΄Π΅Π», ΡΡΠΎ ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΡ
ΠΎΠΆΠ΅ Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡ ΠΎΡ Π½Π΅ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° Π·Π°-#if 0
-Π΅Π½Π½ΡΡ
Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΏΠΎΠ΄ Π΄ΡΡΠ³ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ:
diff --git a/include/configs/HiFive-U540.h b/include/configs/HiFive-U540.h
index ca89383..245542c 100644
--- a/include/configs/HiFive-U540.h
+++ b/include/configs/HiFive-U540.h
@@ -65,12 +65,9 @@
#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_0
#endif
#if 1
-/*#define CONFIG_NR_DRAM_BANKS 1*/
+#define CONFIG_NR_DRAM_BANKS 1
#define PHYS_SDRAM_0 0x80000000 /* SDRAM Bank #1 */
-#define PHYS_SDRAM_1
- (PHYS_SDRAM_0 + PHYS_SDRAM_0_SIZE) /* SDRAM Bank #2 */
-#define PHYS_SDRAM_0_SIZE 0x80000000 /* 2 GB */
-#define PHYS_SDRAM_1_SIZE 0x10000000 /* 256 MB */
+#define PHYS_SDRAM_0_SIZE 0x40000000 /* 1 GB */
#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_0
#endif
/*
@@ -81,7 +78,7 @@
#define CONSOLE_ARG "console=ttyS0,115200 "
/* Init Stack Pointer */
-#define CONFIG_SYS_INIT_SP_ADDR (0x08000000 + 0x001D0000 -
+#define CONFIG_SYS_INIT_SP_ADDR (0x80000000 + 0x001D0000 -
GENERATED_GBL_DATA_SIZE)
#define CONFIG_SYS_LOAD_ADDR 0xa0000000 /* partway up SDRAM */
Π ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΡΡΡΠ»Π΅ΠΉ
ΠΡ, ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π²ΠΎΡ ΡΡΠΎΠ»Π΅ΡΠΊΠΎ
trosinenko@trosinenko-pc:/hdd/trosinenko/fpga/freedom-u-sdk/HiFive_U-Boot$ git show --name-status
commit 39cd67d59c16ac87b46b51ac1fb58f16f1eb1048 (HEAD -> zeowaa-1gb)
Author: Anatoly Trosinenko <[email protected]>
Date: Tue Jul 2 17:13:16 2019 +0300
Initial support for Zeowaa A-E115FB board
M arch/riscv/Kconfig
A arch/riscv/cpu/zeowaa-1gb/Makefile
A arch/riscv/cpu/zeowaa-1gb/cpu.c
A arch/riscv/cpu/zeowaa-1gb/start.S
A arch/riscv/cpu/zeowaa-1gb/timer.c
A arch/riscv/cpu/zeowaa-1gb/u-boot.lds
M arch/riscv/dts/Makefile
A arch/riscv/dts/zeowaa-1gb.dts
A board/Zeowaa/zeowaa-1gb/Kconfig
A board/Zeowaa/zeowaa-1gb/MAINTAINERS
A board/Zeowaa/zeowaa-1gb/Makefile
A board/Zeowaa/zeowaa-1gb/Zeowaa-A-E115FB.c
A configs/zeowaa-1gb_defconfig
A include/configs/zeowaa-1gb.h
ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²
ΠΠ°ΠΊ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, Π½Π° ΡΡΠΎΠΉ SiFive-ΠΎΠ²ΡΠΊΠΎΠΉ ΠΏΠ»Π°ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΡΡΡΠΎΠΉΡΡΠ² ΠΈΠΌΠ΅ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ°. Π Π΅ΡΡ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ U-Boot ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΡΡΡ ΡΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡΠΌ ΠΏΠΎ ΡΠ΄ΡΡ Linux ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Kconfig β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠ²Π°ΡΡ make menuconfig
, ΠΈ ΠΏΠ΅ΡΠ΅Π΄ Π²Π°ΠΌΠΈ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Ρ ΠΏΠΎΠΊΠ°Π·ΠΎΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΏΠΎ ?
ΠΈ Ρ.Π΄. Π ΠΎΠ±ΡΠ΅ΠΌ, ΡΠ»Π΅ΠΏΠΈΠ² ΠΈΠ· ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΉ Π΄Π²ΡΡ
ΠΏΠ»Π°Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠ΅ΠΉ, Π²ΡΠΊΠΈΠ½ΡΠ² ΠΎΡΡΡΠ΄Π° Π²ΡΡΠΊΠΈΠ΅ ΠΏΠ°ΡΠΎΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ PLL (Π²ΠΈΠ΄ΠΈΠΌΠΎ, ΡΡΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ Ρ
ΠΎΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° ΠΏΠΎ PCIe, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΡΠΎΡΠ½ΠΎ), Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ ΠΏΠΎΠ³ΠΎΠ΄Π΅ Π½Π° ΠΠ°ΡΡΠ΅ Π²ΡΠ΄Π°Π²Π°Π»Π° ΠΌΠ½Π΅ ΠΏΠΎ UART ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ
Π΅ΡΠ° ΠΊΠΎΠΌΠΌΠΈΡΠ° ΠΎΠ½Π° ΡΠΎΠ±ΡΠ°Π½Π°, ΠΈ ΠΎ ΡΠΎΠΌ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΌΠ΅Π½Ρ DRAM (Π½ΠΎ ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Ρ ΡΠ°ΠΌ ΠΆΠ΅ Π² Ρ
Π΅Π΄Π΅ΡΠ΅ ΠΈ ΠΏΡΠΎΠΏΠΈΡΠ°Π»).
ΠΠ°Π»Ρ ΡΠΎΠ»ΡΠΊΠΎ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΏΠ»Π°ΡΠ° ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²Π°Π»Π° ΠΎΡΠ²Π΅ΡΠ°ΡΡ ΠΏΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΌΡ JTAG, Π° Π·Π°Π³ΡΡΠ·ΠΊΠ° Ρ SD-ΠΊΠ°ΡΡΡ β Π΄Π΅Π»ΠΎ, ΡΠ²Ρ, Π² ΠΌΠΎΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½Π΅ Π±ΡΡΡΡΠΎΠ΅. Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΈΠ½ΠΎΠ³Π΄Π° BootROM Π²ΡΠ΄Π°Π²Π°Π» ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎ ERROR
, Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π·Π°Π³ΡΡΠ·ΠΈΡΡΡΡ, ΠΈ ΡΡΡ ΠΆΠ΅ Π²ΡΡΠΊΠ°ΠΊΠΈΠ²Π°Π» U-Boot. Π’ΡΡ-ΡΠΎ Π΄ΠΎ ΠΌΠ΅Π½Ρ ΠΈ Π΄ΠΎΡΠ»ΠΎ: Π²ΠΈΠ΄ΠΈΠΌΠΎ, ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ bitstream Π² ΠΠΠΠ‘ ΠΏΠ°ΠΌΡΡΡ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ°Π΅ΡΡΡ, Π½Π΅ ΡΡΠΏΠ΅Π²Π°Π΅Ρ Β«ΡΠ°ΡΡΡΠ΅Π½ΠΈΡΠΎΠ²Π°ΡΡΡΡΒ» ΠΈ Ρ.Π΄. ΠΠΎΡΠΎΡΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ LOADING /
ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠΎΠΌ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠ²Π°ΡΡ set variable $pc=0x80089800
, ΠΌΠΈΠ½ΡΡ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΡΡΡ Π΄ΠΎΠ»Π³ΡΡ Π·Π°Π³ΡΡΠ·ΠΊΡ (ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π² ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΡΠΎ ΠΎΠ½ΠΎ Π² ΠΏΡΠΎΡΠ»ΡΠΉ ΡΠ°Π· ΡΠ»ΠΎΠΌΠ°Π»ΠΎΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ°Π½ΠΎ, ΠΈ Π½Π΅ ΡΡΠΏΠ΅Π»ΠΎ ΠΏΠΎΠ²Π΅ΡΡ
ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΡΠΎ-ΡΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ).
ΠΡΡΠ°ΡΠΈ, Π° ΡΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π½Π°ΠΏΡΠΎΡΡ Π²ΠΈΡΠ½Π΅Ρ, ΠΈ ΠΊ Π½Π΅ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ JTAG-ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ
Error: unable to halt hart 0
Error: dmcontrol=0x80000001
Error: dmstatus =0x00030c82
Π’Π°ΠΊ, ΠΏΠΎΡΡΠΎΠΉΡΠ΅! Π― ΡΡΠΎ ΡΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»! Π§ΡΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ Π΄Π΅Π΄Π»ΠΎΠΊΠ΅ TileLink, Π° Π°Π²ΡΠΎΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΠΏΠ°ΠΌΡΡΠΈ Ρ ΠΊΠ°ΠΊ-ΡΠΎ Π½Π΅ Π΄ΠΎΠ²Π΅ΡΡΡ β ΡΠ°ΠΌ ΠΆΠ΅ ΠΏΠΈΡΠ°Π»β¦ ΠΠ½Π΅Π·Π°ΠΏΠ½ΠΎ, ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΆΠ΅ ΡΠ΄Π°ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΡΠ±ΠΎΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° Ρ ΡΠ²ΠΈΠ΄Π΅Π»:
INIT
CMD0
CMD8
ACMD41
CMD58
CMD16
CMD18
LOADING
BOOT
U-Boot 2018.09-g39cd67d-dirty (Jul 03 2019 - 13:50:33 +0300)
DRAM: 1 GiB
MMC:
BEFORE LOAD ENVBEFORE FDTCONTROLADDRBEFORE LOADADDRIn: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 3
ΠΠ° ΡΡΡ ΡΡΡΠ°Π½Π½ΡΡ ΡΡΡΠΎΡΠΊΡ ΠΏΠ΅ΡΠ΅Π΄ In: serial
Π½Π΅ ΠΎΠ±ΡΠ°ΡΠ°ΠΉΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ β ΡΡΠΎ Ρ ΠΏΡΡΠ°Π»ΡΡ Π½Π° Π²ΠΈΡΠ½ΡΡΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ΅ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π»ΠΈ ΠΎΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ environment. Π§ΡΠΎ Π·Π½Π°ΡΠΈΡ, Β«Π£ΠΆΠ΅ Π΄Π΅ΡΡΡΡ ΠΌΠΈΠ½ΡΡ ΡΠ°ΠΊ Π²ΠΈΡΠΈΡΒ»? ΠΠ½ΠΎ Ρ
ΠΎΡΡ Π±Ρ ΡΡΠΌΠ΅Π»ΠΎ ΡΠ΅Π»ΠΎΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ Π·Π°Π³ΡΡΠ·ΠΎΡΠ½ΠΎΠΌΡ ΠΌΠ΅Π½Ρ! ΠΠ΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΎΡΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅: Ρ
ΠΎΡΡ U-Boot ΠΈ Π³ΡΡΠ·ΠΈΡΡΡ Π² ΡΠΈΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΡΡ
2^24 Π±Π°ΠΉΡ Ρ SD-ΠΊΠ°ΡΡΡ, Π·Π°ΠΏΡΡΡΠΈΠ²ΡΠΈΡΡ, ΠΎΠ½ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠ΅Π±Ρ ΠΊΡΠ΄Π° ΠΏΠΎΠ΄Π°Π»ΡΡΠ΅ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ, ΡΠΎ Π»ΠΈ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΌ Ρ
Π΅Π΄Π΅ΡΠ΅, ΡΠΎ Π»ΠΈ ΠΏΡΠΎΡΡΠΎ Π² ΡΡΠ°ΡΡΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ ΡΠ΅Π»ΠΎΠΊΠ°ΡΠΈΡ ELF-ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠ΄Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. Π’Π°ΠΊ Π²ΠΎΡ: ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΡΡΠΎΡ ΡΡΠΎΠ²Π΅Π½Ρ ΠΏΡΠΎΡΠ»ΠΈ ΠΈ Π±ΠΎΠ½ΡΡΠΎΠΌ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ, Π½Π΅ Π²ΠΈΡΠ½ΡΡΠΈΠΉ Π½Π°ΠΌΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ.
ΠΡΠ°ΠΊ, ΠΏΠΎΡΠ΅ΠΌΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ°ΠΉΠΌΠ΅Ρ? ΠΠΎΡ ΠΎΠΆΠ΅, ΡΠ°ΡΡ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ ΠΏΠΎΡΠ΅ΠΌΡ-ΡΠΎ Π½Π΅ ΠΈΠ΄ΡΡ…
(gdb) x/x 0x0200bff8
0x200bff8: 0x00000000
Π ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΡΡΡΠ΅Π»ΠΊΠΈ Π²ΡΡΡΠ½ΡΡ ΠΏΠΎΠΊΡΡΡΠΈΡΡ?
(gdb) set variable *0x0200bff8=310000000
(gdb) c
Π’ΠΎΠ³Π΄Π°:
Hit any key to stop autoboot: 0
MMC_SPI: 0 at 0:1 hz 20000000 mode 0
ΠΡΠ²ΠΎΠ΄: ΡΠ°ΡΡ Π½Π΅ ΠΈΠ΄ΡΡ. ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, ΠΈΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π²Π²ΠΎΠ΄ Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ:
HiFive_U-Boot/cmd/bootmenu.c:
static void bootmenu_loop(struct bootmenu_data *menu,
enum bootmenu_key *key, int *esc)
{
int c;
while (!tstc()) {
WATCHDOG_RESET();
mdelay(10);
}
c = getc();
switch (*esc) {
case 0:
/* First char of ANSI escape sequence 'e' */
if (c == 'e') {
*esc = 1;
*key = KEY_NONE;
}
break;
case 1:
/* Second char of ANSI '[' */
if (c == '[') {
...
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ ΠΌΠ°Π»ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΡΠ΄ΡΠΈΠ»: Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π² ΠΊΠΎΠ½ΡΠΈΠ³ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΊΠ»ΡΡ:
case DTSTimebase => BigInt(0)
β¦ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΡΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ Β«Π΅ΡΠ»ΠΈ Π½Π΅ Π·Π½Π°Π΅ΡΠ΅ β ΠΎΡΡΠ°Π²ΡΡΠ΅ 0Β». Π Π²Π΅Π΄Ρ WithNBigCores
ΠΊΠ°ΠΊ ΡΠ°Π· ΠΏΡΠΎΡΡΠ°Π²Π»ΡΠ»ΠΎ Π΅Π³ΠΎ Π² 1MHz (ΠΊΠ°ΠΊ, ΠΊΡΡΠ°ΡΠΈ, ΠΈ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΊΠΎΠ½ΡΠΈΠ³Π΅ U-Boot). ΠΠΎ Ρ ΠΆΠ΅, Π±Π»ΠΈΠ½, Π°ΠΊΠΊΡΡΠ°ΡΠ½ΡΠΉ ΠΈ Π΄ΠΎΡΠΎΡΠ½ΡΠΉ: ΡΠ°ΠΌ Ρ Π½Π΅ Π·Π½Π°Ρ, ΡΡΡ 25MHz! Π ΠΈΡΠΎΠ³Π΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π£Π±ΡΠ°Π» ΡΠ²ΠΎΠΈ Β«ΡΠ»ΡΡΡΠ΅Π½ΠΈΡΒ» ΠΈ…
Hit any key to stop autoboot: 0
MMC_SPI: 0 at 0:1 hz 20000000 mode 0
## Unknown partition table type 0
libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND
** No partition table - mmc 0 **
## Info: input data size = 34 = 0x22
Running uEnv.txt boot2...
## Error: "boot2" not defined
HiFive-Unleashed #
ΠΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ Π²Π²ΠΎΠ΄ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ! ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΊΠΎΠ²ΡΡΡΠ²ΡΠΈΡΡ, ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π΄ΠΎΠ³Π°Π΄Π°ΡΡΡΡ Π²Π²Π΅ΡΡΠΈ mmc_spi 1 10000000 0; mmc part
, ΡΠΌΠ΅Π½ΡΡΠΈΠ² ΡΠ°ΡΡΠΎΡΡ SPI Ρ 20MHz Π΄ΠΎ 10MHz. ΠΠΎΡΠ΅ΠΌΡ? ΠΡ, Π² ΠΊΠΎΠ½ΡΠΈΠ³Π΅ Π±ΡΠ»Π° Π½Π°ΠΏΠΈΡΠ°Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΠΎΡΠ° 20MHz, ΠΎΠ½Π° ΠΆΠ΅ ΡΠ°ΠΌ ΠΈ ΡΠ΅ΠΉΡΠ°Ρ Π½Π°ΠΏΠΈΡΠ°Π½Π°. ΠΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠ½ΡΠ», ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ Π·Π΄Π΅ΡΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊ: ΠΊΠΎΠ΄ Π΄Π΅Π»ΠΈΡ ΡΠ°ΡΡΠΎΡΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° (Ρ ΠΌΠ΅Π½Ρ β Π²Π΅Π·Π΄Π΅ 25MHz) Π½Π° ΡΠ΅Π»Π΅Π²ΡΡ, ΠΈ Π²ΡΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠ΅Π΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠ΅Π³ΠΈΡΡΡ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π΄Π»Ρ 115200Hz UART-Π° Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ, ΡΠΎ Π΅ΡΠ»ΠΈ Π½Π°ΡΠ΅Π»ΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡ 25000000 Π½Π° 20000000 ΠΏΠΎΠ»ΡΡΠΈΡΡΡ 1, Ρ.Π΅. ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π½Π° 25MHz. ΠΠΎΠΆΠ΅Ρ, ΡΡΠΎ ΠΈ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π²ΡΡΡΠ°Π²Π»ΡΡΡ, Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΊΠΎΠΌΡ-Π½ΠΈΠ±ΡΠ΄Ρ Π½ΡΠΆΠ½ΠΎ (Π½ΠΎ ΡΡΠΎ Π½Π΅ ΡΠΎΡΠ½ΠΎ)β¦ Π ΠΎΠ±ΡΠ΅ΠΌ, Π»Π΅Π³ΡΠ΅ ΠΏΡΠΎΡΡΠ°Π²ΠΈΡΡ ΠΈ ΠΏΠΎΠΉΡΠΈ Π΄Π°Π»ΡΡΠ΅ β Π΄Π°Π»Π΅ΠΊΠΎ ΠΈ, ΡΠ²Ρ, Π½Π°Π΄ΠΎΠ»Π³ΠΎ. 25MHz β ΡΡΠΎ Π²Π°ΠΌ Π½Π΅ Core i9.
ΠΡΠ²ΠΎΠ΄ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
HiFive-Unleashed # env edit mmcsetup
edit: mmc_spi 1 10000000 0; mmc part
HiFive-Unleashed # boot
MMC_SPI: 1 at 0:1 hz 10000000 mode 0
Partition Map for MMC device 0 -- Partition Type: EFI
Part Start LBA End LBA Name
Attributes
Type GUID
Partition GUID
1 0x00000800 0x0000ffde "Vfat Boot"
attrs: 0x0000000000000000
type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
type: data
guid: 76bd71fd-1694-4ff3-8197-bfa81699c2fb
2 0x00040800 0x002efaf4 "root"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
type: linux
guid: 9f3adcc5-440c-4772-b7b7-283124f38bf3
3 0x0000044c 0x000007e4 "uboot"
attrs: 0x0000000000000000
type: 5b193300-fc78-40cd-8002-e86c45580b47
guid: bb349257-0694-4e0f-9932-c801b4d76fa3
4 0x00000400 0x0000044b "uboot-env"
attrs: 0x0000000000000000
type: a09354ac-cd63-11e8-9aff-70b3d592f0fa
guid: 4db442d0-2109-435f-b858-be69629e7dbf
libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND
2376 bytes read in 0 ms
Running uEnv.txt boot2...
15332118 bytes read in 0 ms
## Loading kernel from FIT Image at 90000000 ...
Using 'config-1' configuration
Trying 'bbl' kernel subimage
Description: BBL/SBI/riscv-pk
Type: Kernel Image
Compression: uncompressed
Data Start: 0x900000d4
Data Size: 74266 Bytes = 72.5 KiB
Architecture: RISC-V
OS: Linux
Load Address: 0x80000000
Entry Point: 0x80000000
Hash algo: sha256
Hash value: 28972571467c4ad0cf08a81d9cf92b9dffc5a7cb2e0cd12fdbb3216cf1f19cbd
Verifying Hash Integrity ... sha256+ OK
## Loading fdt from FIT Image at 90000000 ...
Using 'config-1' configuration
Trying 'fdt' fdt subimage
Description: unavailable
Type: Flat Device Tree
Compression: uncompressed
Data Start: 0x90e9d31c
Data Size: 6911 Bytes = 6.7 KiB
Architecture: RISC-V
Load Address: 0x81f00000
Hash algo: sha256
Hash value: 10b0244a5a9205357772ea1c4e135a4f882409262176d8c7191238cff65bb3a8
Verifying Hash Integrity ... sha256+ OK
Loading fdt from 0x90e9d31c to 0x81f00000
Booting using the fdt blob at 0x81f00000
## Loading loadables from FIT Image at 90000000 ...
Trying 'kernel' loadables subimage
Description: Linux kernel
Type: Kernel Image
Compression: uncompressed
Data Start: 0x900123e8
Data Size: 10781356 Bytes = 10.3 MiB
Architecture: RISC-V
OS: Linux
Load Address: 0x80200000
Entry Point: unavailable
Hash algo: sha256
Hash value: 72a9847164f4efb2ac9bae736f86efe7e3772ab1f01ae275e427e2a5389c84f0
Verifying Hash Integrity ... sha256+ OK
Loading loadables from 0x900123e8 to 0x80200000
## Loading loadables from FIT Image at 90000000 ...
Trying 'ramdisk' loadables subimage
Description: buildroot initramfs
Type: RAMDisk Image
Compression: gzip compressed
Data Start: 0x90a5a780
Data Size: 4467411 Bytes = 4.3 MiB
Architecture: RISC-V
OS: Linux
Load Address: 0x82000000
Entry Point: unavailable
Hash algo: sha256
Hash value: 883dfd33ca047e3ac10d5667ffdef7b8005cac58b95055c2c2beda44bec49bd0
Verifying Hash Integrity ... sha256+ OK
Loading loadables from 0x90a5a780 to 0x82000000
ΠΠΊΠ΅ΠΉ, ΠΌΡ ΠΏΡΠΎΡΠ»ΠΈ Π½Π° Π½ΠΎΠ²ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ, Π½ΠΎ ΠΎΠ½ΠΎ Π²ΡΡ Π΅ΡΡ Π·Π°Π²ΠΈΡΠ°Π΅Ρ. Π ΠΈΠ½ΠΎΠ³Π΄Π° Π΅ΡΡ ΠΈ ΡΡΠΏΠ»Π΅Ρ ΡΠΊΡΠ΅ΠΏΡΠ΅Π½Π°ΠΌΠΈ. Π£Π²ΠΈΠ΄Π΅ΡΡ mcause ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°ΡΠ»ΠΈΠ² ΠΊΠΎΠ΄ ΠΏΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ $pc
ΠΈ ΠΏΠΎΡΠ»Π΅ si
ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π½Π° trap_entry
. Π‘Π°ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΈΠ· U-Boot ΡΠΌΠ΅Π΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ mcause = 0..4, ΠΏΠΎΡΡΠΎΠΌΡ Π³ΠΎΡΠΎΠ²ΡΡΠ΅ΡΡ Π·Π°ΡΠΈΠΊΠ»ΠΈΡΡΡΡ Π½Π° Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠ΅. Π’ΡΡ Ρ ΠΏΠΎΠ»Π΅Π· Π² ΠΊΠΎΠ½ΡΠΈΠ³, ΡΡΠ°Π» ΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ ΠΆΠ΅ Ρ ΠΌΠ΅Π½ΡΠ», ΠΈ Π²ΡΠΏΠΎΠΌΠ½ΠΈΠ»: ΡΠ°ΠΌ ΠΆΠ΅ Π² conf/rvboot-fit.txt
Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ:
fitfile=image.fit
# below much match what's in FIT (ugha)
Π§ΡΠΎ ΠΆΠ΅, ΠΏΡΠΈΠ²Π΅Π΄ΡΠΌ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅, Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ ΡΠ΄ΡΠ° ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°ΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΅ΡΡΡ ΠΏΠΎΠ΄ΠΎΠ·ΡΠ΅Π½ΠΈΡ, ΡΡΠΎ SIF0
β ΡΡΠΎ Π²ΡΠ²ΠΎΠ΄ ΠΊΡΠ΄Π°-ΡΠΎ ΠΏΠΎ PCIe:
-bootargs=console=ttySIF0,921600 debug
+bootargs=console=ttyS0,125200 debug
Π Π΄ΠΎ ΠΊΡΡΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌ Ρ Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ SHA-256 Π½Π° MD5: ΠΊΡΠΈΠΏΡΠΎΡΡΠΎΠΉΠΊΠΎΡΡΠΈ ΠΌΠ½Π΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ (ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅, ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅), ΡΡΠΈΡΠ°Π΅ΡΡΡ ΠΎΠ½ΠΎ ΠΆΡΡΠΊΠΎ Π΄ΠΎΠ»Π³ΠΎ, Π° Π΄Π»Ρ ΠΎΡΠ»ΠΎΠ²Π° ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΠΈ MD5 β Π·Π° Π³Π»Π°Π·Π°. Π§ΡΠΎ ΠΆΠ΅ Π² ΠΈΡΠΎΠ³Π΅? ΠΡΠΎΡ ΠΎΠ΄ΠΈΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΠΌΡ ΡΡΠ°Π»ΠΈ Π·Π°ΠΌΠ΅ΡΠ½ΠΎ Π±ΡΡΡΡΠ΅Π΅ (Π·Π° ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Ρ Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ), ΠΈ ΠΎΡΠΊΡΡΠ»ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
...
Verifying Hash Integrity ... md5+ OK
Loading loadables from 0x90a5a758 to 0x82000000
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
chosen {
linux,initrd-end = <0x00000000 0x83000000>;
linux,initrd-start = <0x00000000 0x82000000>;
riscv,kernel-end = <0x00000000 0x80a00000>;
riscv,kernel-start = <0x00000000 0x80200000>;
bootargs = "debug console=tty0 console=ttyS0,125200 root=/dev/mmcblk0p2 rootwait";
};
libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND
chosen {
linux,initrd-end = <0x00000000 0x83000000>;
linux,initrd-start = <0x00000000 0x82000000>;
riscv,kernel-end = <0x00000000 0x80a00000>;
riscv,kernel-start = <0x00000000 0x80200000>;
bootargs = "debug console=tty0 console=ttyS0,125200 root=/dev/mmcblk0p2 rootwait";
};
Loading Kernel Image ... OK
Booting kernel in
3
ΠΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡ Π½Π΅ ΡΠΈΠΊΠ°ΡΡ…
(gdb) x/x 0x0200bff8
0x200bff8: 0x00000000
Π£ΠΏΡ, ΠΏΠΎΡ ΠΎΠΆΠ΅, ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Ρ ΠΎΠ΄Π° ΡΠ°ΡΠΎΠ² ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ ΠΏΠ»Π°ΡΠ΅Π±ΠΎ, Ρ ΠΎΡΡ ΠΌΠ½Π΅ ΡΠΎΠ³Π΄Π° ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ. ΠΠ΅Ρ, ΠΏΠΎΡΠΈΠ½ΠΈΡΡ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ Π½Π°Π΄ΠΎ, Π½ΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠΊΡΡΡΠΈΠΌ ΡΡΡΠ΅Π»ΠΊΠΈ Π²ΡΡΡΠ½ΡΡ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ:
0x00000000bff6dbb0 in ?? ()
(gdb) set variable *0x0200bff8=1000000
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x00000000bff6dbb0 in ?? ()
(gdb) set variable *0x0200bff8=2000000
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x00000000bff6dbb0 in ?? ()
(gdb) set variable *0x0200bff8=3000000
(gdb) c
Continuing.
Π’Π΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ…
Loading Kernel Image ... OK
Booting kernel in
3
2
1
0
## Starting application at 0x80000000 ...
ΠΠ΅Ρ ΡΠΆ, ΠΏΠΎΠΉΠ΄Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΎΠ΄ ΡΠ°ΡΠΎΠ² β Π° ΡΠΎ, ΠΌΠΎΠΆΠ΅Ρ, ΠΎΠ½ ΡΠ°ΠΌ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ²Π°ΡΡ Π²Π·Π΄ΡΠΌΠ°Π΅Ρ!
Π Π°Π΄ΡΠ΅Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΡΠ΄Π°-ΡΠΎ Π²
0000000080001c20 <poweroff>:
80001c20: 1141 addi sp,sp,-16
80001c22: e022 sd s0,0(sp)
80001c24: 842a mv s0,a0
80001c26: 00005517 auipc a0,0x5
80001c2a: 0ca50513 addi a0,a0,202 # 80006cf0 <softfloat_countLeadingZeros8+0x558>
80001c2e: e406 sd ra,8(sp)
80001c30: f7fff0ef jal ra,80001bae <printm>
80001c34: 8522 mv a0,s0
80001c36: 267000ef jal ra,8000269c <finisher_exit>
80001c3a: 00010797 auipc a5,0x10
80001c3e: 41e78793 addi a5,a5,1054 # 80012058 <htif>
80001c42: 639c ld a5,0(a5)
80001c44: c399 beqz a5,80001c4a <poweroff+0x2a>
80001c46: 72c000ef jal ra,80002372 <htif_poweroff>
80001c4a: 45a1 li a1,8
80001c4c: 4501 li a0,0
80001c4e: dc7ff0ef jal ra,80001a14 <send_ipi_many>
80001c52: 10500073 wfi
80001c56: bff5 j 80001c52 <poweroff+0x32>
Π²Π½ΡΡΡΠΈ Π·Π°Π³ΡΡΠ·ΠΈΠ²ΡΠ΅Π³ΠΎΡΡ Berkeley Boot Loader. ΠΠΈΡΠ½ΠΎ ΠΌΠ΅Π½Ρ Π² ΡΡΠΎΠΌ ΡΠΌΡΡΠ°Π΅Ρ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ htif
β host interface, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π΄Π»Ρ tethered-Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΄ΡΠ° (ΡΠΎ Π΅ΡΡΡ Π² ΠΊΠΎΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Ρ
ΠΎΡΡΠΎΠ²ΡΠΌ ARM), Ρ-ΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π» standalone. ΠΠΏΡΠΎΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ Π½Π°ΠΉΡΠΈ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠ°Ρ
, ΡΠΎ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π½Π΅ Π²ΡΡ ΡΠ°ΠΊ ΠΏΠ»ΠΎΡ
ΠΎ:
void poweroff(uint16_t code)
{
printm("Power offrn");
finisher_exit(code);
if (htif) {
htif_poweroff();
} else {
send_ipi_many(0, IPI_HALT);
while (1) { asm volatile ("wfin"); }
}
}
ΠΠ²Π΅ΡΡ: Π·Π°ΠΏΡΡΡΠΈ ΡΠ°ΡΡ
ΠΠΎΠΈΡΠΊ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ² Π² CLINT Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π½Π°Ρ ΠΊ
val io = IO(new Bundle {
val rtcTick = Bool(INPUT)
})
val time = RegInit(UInt(0, width = timeWidth))
when (io.rtcTick) { time := time + UInt(1) }
ΠΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² RTC, Π»ΠΈΠ±ΠΎ Π² Π·Π°Π³Π°Π΄ΠΎΡΠ½ΠΎΠΌ MockAON, ΠΏΡΠΎ ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΠ°ΡΡΡΠ΄ΠΈΠ»: Β«Π’Π°ΠΊ, ΡΡΠΎ ΡΡΠΎ Ρ Π½Π°Ρ ΡΡΡ? ΠΠ΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ? ΠΡΠΊΠ»ΡΡΠ°Π΅ΠΌ!Β» ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΠ½Π΅ Π΄ΠΎ ΡΠΈΡ
ΠΏΠΎΡ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΡΡΠΎ Π·Π° ΡΠ°ΠΊΡΠΎΠ²Π°Ρ ΠΌΠ°Π³ΠΈΡ ΡΠ°ΠΌ ΡΠ²ΠΎΡΠΈΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠ΅Π°Π»ΠΈΠ·ΡΡ ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π² System.scala
:
val rtcDivider = RegInit(0.asUInt(16.W)) // Π½Π° Π²ΡΡΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΡ Π΄ΠΎ 16ΠΠΡ, Ρ ΠΎΠΏΡΠΈΠΌΠΈΡΡ :)
val mhzInt = p(DevKitFPGAFrequencyKey).toInt
// ΠΡΠ΅ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ°ΡΡΠΎΡΠ° ΡΠ°Π²Π½Π° ΡΠ΅Π»ΠΎΠΌΡ ΡΠΈΡΠ»Ρ ΠΌΠ΅Π³Π°Π³Π΅ΡΡ
rtcDivider := Mux(rtcDivider === (mhzInt - 1).U, 0.U, rtcDivider + 1.U)
outer.clintOpt.foreach { clint =>
clint.module.io.rtcTick := rtcDivider === 0.U
}
ΠΡΠΎΠ±ΠΈΡΠ°ΡΡΡ ΠΊ Linux kernel
Π’ΡΡ ΠΏΠΎΠ²Π΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΆΠ΅ ΠΈ Π±Π΅Π· ΡΠΎΠ³ΠΎ Π·Π°ΡΡΠ½ΡΠ»ΠΎΡΡ ΠΈ ΡΡΠ°Π»ΠΎ ΠΌΠ°Π»ΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠΏΠΈΡΡ ΠΏΠΎ Π²Π΅ΡΡ Π°ΠΌ:
BBL ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π» Π½Π°Π»ΠΈΡΠΈΠ΅ FDT ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ 0xF0000000
, Π° Ρ Π²Π΅Π΄Ρ ΡΠΆΠ΅ ΠΈΡΠΏΡΠ°Π²Π»ΡΠ»! ΠΡ ΡΡΠΎ ΠΆΠ΅, ΠΏΠΎΠΈΡΠ΅ΠΌ Π΅ΡΡβ¦ ΠΠ°ΡΡΠ» Π² HiFive_U-Boot/arch/riscv/lib/boot.c, Π·Π°ΠΌΠ΅Π½ΠΈΠ» Π½Π° 0x81F00000
, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ U-Boot.
ΠΠΎΡΠΎΠΌ BBL ΠΆΠ°Π»ΠΎΠ²Π°Π»ΡΡ, ΡΡΠΎ Π½Π΅Ρ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΎΠΉ ΠΏΡΡΡ Π»Π΅ΠΆΠ°Π» Π² ΡΡΠ½ΠΊΡΠΈΡ mem_prop
, ΡΡΠΎ Π² riscv-pk/machine/fdt.c: ΠΎΡΡΡΠ΄Π° Ρ ΡΠ·Π½Π°Π», ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΠΈΡΡ ΡΠ·Π΅Π» fdt ram ΠΊΠ°ΠΊ device_type = "memory"
β ΠΏΠΎΡΠΎΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΡ, Π½ΠΎ ΠΏΠΎΠΊΠ° ΠΏΡΠΎΡΡΠΎ Π²ΠΏΠΈΡΡ ΡΡΠΊΠ°ΠΌΠΈ β Π²ΡΡ ΡΠ°Π²Π½ΠΎ Ρ ΡΡΠΎΡ ΡΠ°ΠΉΠ» Π²ΡΡΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠ».
Π’Π΅ΠΏΠ΅ΡΡ Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ (ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² ΠΎΡΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΠΌΠΈ ΠΊΠ°ΡΠ΅ΡΠΊΠΈ):
This is bbl's dummy_payload. To boot a real kernel, reconfigure bbl
with the flag --with-payload=PATH, then rebuild bbl. Alternatively,
bbl can be used in firmware-only mode by adding device-tree nodes
for an external payload and use QEMU's -bios and -kernel options.
ΠΡΠΎΠ΄Π΅, ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠΈΠΈ riscv,kernel-start
ΠΈ riscv,kernel-end
Π² DTB, Π½ΠΎ ΠΏΠ°ΡΡΡΡΡΡ Π½ΡΠ»ΠΈ. ΠΡΠ»Π°Π΄ΠΊΠ° query_chosen
ΠΏΠΎΠΊΠ°Π·Π°Π»Π°, ΡΡΠΎ BBL ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠ°ΡΡΠΈΡΡ 32-Π±ΠΈΡΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ, Π° Π΅ΠΌΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΡΡΡ ΠΏΠ°ΡΠ° <0x0 0xADDR>
, ΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΠΌΠ»Π°Π΄ΡΠΈΠ΅ ΡΠ°Π·ΡΡΠ΄Ρ. ΠΠΎΠΏΠΈΡΠ°Π» Π² ΡΠ΅ΠΊΡΠΈΡ chosen
chosen {
#address-cells = <1>;
#size-cells = <0>;
...
}
ΠΈ ΠΏΠΎΠΏΡΠ°Π²ΠΈΠ» Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ: Π½Π΅ Π΄ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ 0x0
ΠΏΠ΅ΡΠ²ΡΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ.
ΠΡΠΈ 100500 ΠΏΡΠΎΡΡΡΡ ΡΠ°Π³ΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π»Π΅Π³ΠΊΠΎ ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΠ°ΠΊ ΠΏΠ°Π΄Π°Π΅Ρ ΠΏΠΈΠ½Π³Π²ΠΈΠ½:
Π‘ΠΊΡΡΡΡΠΉ ΡΠ΅ΠΊΡΡ
Verifying Hash Integrity ... md5+ OK
Loading loadables from 0x90a5a758 to 0x82000000
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
chosen {
linux,initrd-end = <0x83000000>;
linux,initrd-start = <0x82000000>;
riscv,kernel-end = <0x80a00000>;
riscv,kernel-start = <0x80200000>;
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
bootargs = "debug console=tty0 console=ttyS0,125200 root=/dev/mmcblk0p2 rootwait";
stdout-path = "uart0:38400n8";
};
libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND
chosen {
linux,initrd-end = <0x83000000>;
linux,initrd-start = <0x82000000>;
riscv,kernel-end = <0x80a00000>;
riscv,kernel-start = <0x80200000>;
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
bootargs = "debug console=tty0 console=ttyS0,125200 root=/dev/mmcblk0p2 rootwait";
stdout-path = "uart0:38400n8";
};
Loading Kernel Image ... OK
Booting kernel in
3
2
1
0
## Starting application at 0x80000000 ...
bbl loader
SIFIVE, INC.
5555555555555555555555555
5555 5555
5555 5555
5555 5555
5555 5555555555555555555555
5555 555555555555555555555555
5555 5555
5555 5555
5555 5555
5555555555555555555555555555 55555
55555 555555555 55555
55555 55555 55555
55555 5 55555
55555 55555
55555 55555
55555 55555
55555 55555
55555 55555
555555555
55555
5
SiFive RISC-V Core IP
[ 0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[ 0.000000] Linux version 4.19.0-sifive-1+ (trosinenko@trosinenko-pc) (gcc version 8.3.0 (Buildroot 2019.02-07449-g4eddd28f99)) #1 SMP Wed Jul 3 21:29:21 MSK 2019
[ 0.000000] bootconsole [early0] enabled
[ 0.000000] Initial ramdisk at: 0x(____ptrval____) (16777216 bytes)
[ 0.000000] Zone ranges:
[ 0.000000] DMA32 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Normal [mem 0x00000000c0000000-0x00000bffffffffff]
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x00000000bfffffff]
[ 0.000000] On node 0 totalpages: 261632
[ 0.000000] DMA32 zone: 3577 pages used for memmap
[ 0.000000] DMA32 zone: 0 pages reserved
[ 0.000000] DMA32 zone: 261632 pages, LIFO batch:63
[ 0.000000] software IO TLB: mapped [mem 0xbb1fc000-0xbf1fc000] (64MB)
(ΡΠΌΠ±Π»Π΅ΠΌΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡ BBL, Π° ΡΠΎ ΡΡΠΎ Ρ ΠΌΠ΅ΡΠΊΠ°ΠΌΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ β ΡΠ΄ΡΠΎ).
Π ΡΡΠ°ΡΡΡΡ, Π½Π΅ Π·Π½Π°Ρ, ΠΊΠ°ΠΊ Π²Π΅Π·Π΄Π΅, Π½ΠΎ Π½Π° RocketChip ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° ΠΏΠΎ JTAG ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΎΠ²ΠΈΡΡ trap-Ρ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ β ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠΎΠ²Π½ΠΎ Π² ΡΡΠΎΠΉ ΡΠΎΡΠΊΠ΅.
Program received signal SIGTRAP, Trace/breakpoint trap.
0xffffffe0000024ca in ?? ()
(gdb) bt
#0 0xffffffe0000024ca in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) file work/linux/vmlinux
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from work/linux/vmlinux...done.
(gdb) bt
#0 0xffffffe0000024ca in setup_smp () at /hdd/trosinenko/fpga/freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:75
#1 0x0000000000000000 in ?? ()
Backtrace stopped: frame did not save the PC
freedom-u-sdk/linux/arch/riscv/kernel/smpboot.c:
void __init setup_smp(void)
{
struct device_node *dn = NULL;
int hart;
bool found_boot_cpu = false;
int cpuid = 1;
while ((dn = of_find_node_by_type(dn, "cpu"))) {
hart = riscv_of_processor_hartid(dn);
if (hart < 0)
continue;
if (hart == cpuid_to_hartid_map(0)) {
BUG_ON(found_boot_cpu);
found_boot_cpu = 1;
continue;
}
cpuid_to_hartid_map(cpuid) = hart;
set_cpu_possible(cpuid, true);
set_cpu_present(cpuid, true);
cpuid++;
}
BUG_ON(!found_boot_cpu); // < ΠΠ« ΠΠΠ₯ΠΠΠΠ’ΠΠ‘Π¬ ΠΠΠΠ‘Π¬
}
ΠΠ°ΠΊ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΎΡΡ Π² ΡΡΠ°ΡΠΎΠΌ Π°Π½Π΅ΠΊΠ΄ΠΎΡΠ΅, CPU not found, running software emulation. ΠΡ ΠΈΠ»ΠΈ Π½Π΅ running. ΠΠ°Π±Π»ΡΠ΄ΠΈΠ»ΠΈΡΡ Π² Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠ΄ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°.
/* The lucky hart to first increment this variable will boot the other cores */
atomic_t hart_lottery;
unsigned long boot_cpu_hartid;
Π₯ΠΎΡΠΎΡΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π² linux/arch/riscv/kernel/setup.c β ΡΡΠ°ΠΊΠ°Ρ ΠΏΠΎΠΊΡΠ°ΡΠΊΠ° Π·Π°Π±ΠΎΡΠ° ΠΏΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ Π’ΠΎΠΌΠ° Π‘ΠΎΠΉΠ΅ΡΠ°. Π ΠΎΠ±ΡΠ΅ΠΌ, ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Π΅ΠΉ ΠΏΠΎΡΠ΅ΠΌΡ-ΡΠΎ Π½Π΅ Π½Π°ΡΠ»ΠΎΡΡ, ΠΏΡΠΈΠ· ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΡΠ°ΠΆ…
ΠΠ° ΡΡΠΎΠΌ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡ ΠΈ Π±Π΅Π· ΡΠΎΠ³ΠΎ Π·Π°ΡΡΠ½ΡΠ²ΡΡΡΡΡ ΡΡΠ°ΡΡΡ.
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ. Π Π½ΡΠΌ Π±ΡΠ΄Π΅Ρ Π±ΠΎΠΉ Ρ Ρ ΠΈΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠΏΠ΅Π²Π°Π΅Ρ ΡΠΏΡΡΡΠ°ΡΡΡΡ, Π΅ΡΠ»ΠΈ ΠΊ Π½Π΅ΠΉ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΠΎΠ΄ΠΊΡΠ°Π΄ΡΠ²Π°ΡΡΡΡ singlestep-ΠΎΠΌ.
Π’Π΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠΊΡΠΈΠ½ΠΊΠ°ΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ (Π²Π½Π΅ΡΠ½ΡΡ ΡΡΡΠ»ΠΊΠ°):
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com