เบชเปˆเบงเบ™เบ—เบต 3: เป€เบเบทเบญเบšเบˆเบฐเป‚เบซเบฅเบ” Linux เบˆเบฒเบ SD card เบเบฑเบš RocketChip

เบชเปˆเบงเบ™เบ—เบต 3: เป€เบเบทเบญเบšเบˆเบฐเป‚เบซเบฅเบ” Linux เบˆเบฒเบ SD card เบเบฑเบš RocketChip ะ’ เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ เบ•เบปเบงเบ„เบงเบšเบ„เบธเบกเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบซเบผเบฒเบเบซเบผเบทเบซเบ™เป‰เบญเบเป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”, เบซเบผเบทเปเบ—เบ™เบ—เบตเปˆเบˆเบฐ, เปเบœเปˆเบ™เบซเปเปˆเป€เบ—เบดเบ‡ IP Core เบˆเบฒเบ Quartus, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบญเบฐเปเบ”เบšเป€เบ•เบตเบชเปเบฒเบฅเบฑเบš TileLink. เปƒเบ™เบกเบทเป‰เบ™เบตเป‰, เปƒเบ™เบžเบฒเบ "เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบชเบปเปˆเบ‡ RocketChip เป„เบ›เบซเบฒเบเบฐเบ”เบฒเบ™เบˆเบตเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบžเบฝเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเบเบฑเบš Cyclone" เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™ console เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบ. เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒเบ”เบปเบ™เบเบงเปˆเบฒเบ™เบตเป‰: เบ‚เป‰เบญเบเบ„เบดเบ”เบขเบนเปˆเปเบฅเป‰เบงเบงเปˆเบฒเบ‚เป‰เบญเบเบˆเบฐเป€เบ›เบตเบ”เบ•เบปเบง Linux เปเบฅเบฐเบเป‰เบฒเบงเบ•เปเปˆเป„เบ›, เปเบ•เปˆเบ™เบฑเป‰เบ™เบšเปเปˆเปเบกเปˆเบ™เบเปเบฅเบฐเบ™เบต. เปƒเบ™เบชเปˆเบงเบ™เบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง U-Boot, BBL, เปเบฅเบฐเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบ—เบตเปˆเบซเบ™เป‰เบฒเบขเป‰เบฒเบ™เบเบปเบงเบ‚เบญเบ‡ Linux kernel เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เปเบ•เปˆเบกเบต console - U-Boot, เปเบฅเบฐเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบเป‰เบฒเบงเบซเบ™เป‰เบฒ, เบกเบตเบซเบผเบฒเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบ„เบฒเบ”เบซเบงเบฑเบ‡เบˆเบฒเบ console เป€เบ•เบฑเบกเบฎเบนเบšเปเบšเบš.

เบฎเบฒเบ”เปเบงเบˆเบฐเบ›เบฐเบเบญเบšเบกเบต SD card เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบœเปˆเบฒเบ™เบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆ SPI, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš UART. เปƒเบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบŠเบญเบšเปเบง, BootROM เบˆเบฐเบ–เบทเบเปเบ—เบ™เบ—เบตเปˆเบ”เป‰เบงเบ xip เบชเบธเบ” sdboot เปเบฅเบฐ, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เป‚เบซเบผเบ”เบ•เปเปˆเป„เบ›เบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก (เปƒเบ™ SD card).

เบชเปเบฒเป€เบฅเบฑเบ”เบฎเบนเบšเบฎเบฒเบ”เปเบง

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบงเบฝเบเบ‡เบฒเบ™: เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบซเบผเบฑเบ "เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ" เปเบฅเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ UART (เบˆเบฒเบ Raspberry) เปเบฅเบฐเบญเบฐเปเบ”เบšเป€เบ•เบต SD (เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปƒเบŠเป‰เบšเบฑเบ”เบˆเบฒเบ Catalex เบ—เบตเปˆเบกเบตเบซเบปเบ pins: GND, VCC, MISO, MOSI, SCK, CS) .

เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ. เปเบ•เปˆเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบฎเบฑเบšเบฎเบนเป‰เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ–เบทเบเบ–เบดเป‰เบกเป€เบฅเบฑเบเบ™เป‰เบญเบเบˆเบฒเบเบ‚เป‰เบฒเบ‡เบซเบ™เบถเปˆเบ‡: เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบงเบฅเบฒเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เบฐเบชเบปเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™. System เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™: HasPeripheryUART (เปเบฅเบฐเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเป€เบซเบกเบฒเบฐเบชเบปเบก), เบ”เบฝเบงเบเบฑเบ™เบชเปเบฒเบฅเบฑเบš SD card - เปเบฅเบฐเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบˆเบฐเบเบฝเบกเบžเป‰เบญเบก. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบกเบฑเบ™เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบเบฒเบ™เบญเบญเบเปเบšเบš "เบขเปˆเบฒเบ‡เบฎเบธเบ™เปเบฎเบ‡". เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบชเบดเปˆเบ‡เบ—เบตเปˆเบฎเป‰เบฒเบเปเบฎเบ‡เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰? Arty, เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™, เบšเปเปˆเป€เบซเบกเบฒเบฐ - monster เบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆ unleahshed.DevKitConfigs. เปเบฅเบฐ เบ—เบฑเบ™ เบ—เบต เบ—เบฑเบ™ เปƒเบ” เบกเบฑเบ™ เป„เบ”เป‰ เบซเบฑเบ™ เบญเบญเบ เบงเปˆเบฒ เบกเบต เบšเบฒเบ‡ overlays เบขเบนเปˆ เบ—เบปเปˆเบง เบ—เบธเบ เปเบซเปˆเบ‡ , เป€เบŠเบดเปˆเบ‡ เป„เบ”เป‰ เบ–เบทเบ เป€เบžเบตเปˆเบก เบ‚เบถเป‰เบ™ เป‚เบ”เบ เบœเปˆเบฒเบ™ เบžเบฒ เบฅเบฒ เบกเบด เป€เบ•เบต เป‚เบ”เบ เบเบฐ เปเบˆ . เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป€เบ”เบปเบฒโ€‹เบงเปˆเบฒโ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบญเบฒเบ”โ€‹เบˆเบฐโ€‹เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เป„เบ”เป‰โ€‹เบซเบผเบฒเบโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒ, เปเบ•เปˆโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบขเปˆเบฒเบ‡โ€‹เบซเบ™เป‰เบญเบโ€‹เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบเบฒเบ™โ€‹เบšเบฒเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เบ—เปเบฒโ€‹เบญเบดเบ” ... เป€เบˆเบปเป‰เบฒโ€‹เบกเบตโ€‹เบชเบดเปˆเบ‡โ€‹เบ”เบฝเบงโ€‹เบเบฑเบ™โ€‹เบšเปเปˆโ€‹, เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบโ€‹เปเบฅเบฐโ€‹เบซเบ™เป‰เบฒโ€‹เบฅเปเบฒโ€‹เบ„เบฒเบ™โ€‹เบซเบผเบฒเบโ€‹? ... เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เป‰เบญเบเป€เบ‚เบปเป‰เบฒเบกเบฒ vera.iofpga.FPGAChip เบชเปเบฒเบฅเบฑเบš Microsemi FPGAs เปเบฅเบฐเบ—เบฑเบ™เบ—เบตเบ—เบฑเบ™เปƒเบ”เบกเบฑเบ™เปเบเบเบญเบญเบเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเป€เบงเบปเป‰เบฒเปเบฅเบฐเบžเบฐเบเบฒเบเบฒเบกเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบญเบ‡เป‚เบ”เบเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบš, เป‚เบŠเบเบ”เบตเบ—เบตเปˆเบกเบต "เบฎเบนเบšเปเบšเบš motherboard" เบ—เบฑเบ‡เบซเบกเบปเบ”เบซเบผเบฒเบเบซเบผเบทเบซเบ™เป‰เบญเบเบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒเบ”เบฝเบง.

เบกเบฑเบ™เป„เบ”เป‰เบซเบฑเบ™เบญเบญเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบก 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 binary เปเบฅเบฐเป‚เบญเบ™เป‚เบ”เบ bootloader เบเบฑเบš kernel เป€เบžเบทเปˆเบญเปƒเบซเป‰เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡. เบฎเบฒเบ”เปเบง. เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบชเบฒเบเบเบฑเบš tlclock เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบชเบฑเบ‡เป€เบ„เบฒเบฐเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™, เปเบ•เปˆเบเบฒเบ™เบฅเบงเบšเบฅเบงเบก BootROM (เปƒเบซเป‰เบ‚เป‰เบญเบเป€เบ•เบทเบญเบ™เป€เบˆเบปเป‰เบฒ, เบ”เบฝเบงเบ™เบตเป‰เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เปเบฅเป‰เบง sdboot) เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ - เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบกเบฑเบ™ parses เป„เบŸเบฅเปŒ dts เปเบฅเบฐเบชเป‰เบฒเบ‡ header เบเบฑเบš macro. 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
}

เบ•เปˆเบญเบ‡เป‚เบชเป‰เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™, เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบŠเบทเปˆเบชเบฑเบ”, เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเบžเบฝเบ‡เปเบ•เปˆเป‚เบ”เบเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบเบฑเบšเบšเบฒเบ‡เบšเปˆเบญเบ™เบญเบทเปˆเบ™เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš. เบชเปˆเบงเบ™เบซเบผเบฒเบเบญเบฒเบ”เบˆเบฐ, เบžเบงเบเป€เบ‚เบปเบฒเบ„เบงเบ™เบˆเบฐเบ›เบปเบเบ›เป‰เบญเบ‡ เบเบฒเบ™เปเบœเปˆเบเบฐเบˆเบฒเบ. เบšเบฒเบ‡เบ—เบตเปƒเบ™ เบšเบฒเบ‡ เบ•เบฑเบ™เบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เปเบฅเป‰เบง, เปเบ•เปˆเบ—เปเบฒเบญเบดเบ”เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ "เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ—เบตเปˆเบกเบตเบ„เบธเบ™เบ™เบฐเบžเบฒเบšเบชเบนเบ‡." เบ„เปเบฒเบ–เบฒเบกเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบเปเบกเปˆเบ™เบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡ MISO เปเบฅเบฐ MOSI เบˆเบทเปˆเบ‡เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ dq? เบ‚เป‰เบญเบเบเบฑเบ‡เบšเปเปˆเบžเบปเบšเบ„เปเบฒเบ•เบญเบšเป€เบ—เบทเปˆเบญ, เปเบ•เปˆเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆเบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง.

เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเป„เบ”เป‰เบกเบญเบšเบซเบกเบฒเบ pins เบเบฒเบ™เบญเบญเบเปเบšเบšเปƒเบซเป‰เบเบฑเบšเบ•เบดเบ”เบ•เปเปˆเบžเบปเบงเบžเบฑเบ™เบŸเบฃเบตเบขเบนเปˆเปƒเบ™เบ•เบฑเบ™เปเบฅเบฐเบเป‰เบฒเบ jumper เบเบฒเบ™เบ„เบฑเบ”เป€เบฅเบทเบญเบเปเบฎเบ‡เบ”เบฑเบ™เป€เบ›เบฑเบ™ 3.3V.

เบญเบฐเปเบ”เบฑเบšเป€เบ•เบต SD

เป€เบšเบดเปˆเบ‡เบˆเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡:

เบชเปˆเบงเบ™เบ—เบต 3: เป€เบเบทเบญเบšเบˆเบฐเป‚เบซเบฅเบ” Linux เบˆเบฒเบ SD card เบเบฑเบš RocketChip

เบกเบธเบกเป€เบšเบดเปˆเบ‡เบฅเบธเปˆเบก:

เบชเปˆเบงเบ™เบ—เบต 3: เป€เบเบทเบญเบšเบˆเบฐเป‚เบซเบฅเบ” Linux เบˆเบฒเบ SD card เบเบฑเบš RocketChip

Software Debugging: เป€เบ„เบทเปˆเบญเบ‡เบกเบท

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบกเบทเปเบเป‰เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™.

เบกเบดเบ™เบดเบ„เบญเบก

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบญเปˆเบฒเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆ bootloader เปเบฅเบฐ kernel output. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เปƒเบ™ Linux (เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบขเบนเปˆเปƒเบ™ RaspberryPi), เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ„เบ‡เบเบฒเบ™ Minicom. เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เป‚เบ„เบ‡เบเบฒเบ™เปƒเบ”เบเปเปˆเบ•เบฒเบกเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบžเบญเบ” serial เบˆเบฐเป€เบฎเบฑเบ”.

เบเบฐเบฅเบธเบ™เบฒเบฎเบฑเบšเบŠเบฒเบšเบงเปˆเบฒเป€เบกเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบŠเบทเปˆเบญเบธเบ›เบฐเบเบญเบ™เบžเบญเบ”เบ•เป‰เบญเบ‡เบ–เบทเบเบฅเบฐเบšเบธเป€เบ›เบฑเบ™ -D /dev/ttyS0 - เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ—เบฒเบ‡โ€‹เป€เบฅเบทเบญเบโ€‹ -D. เบ”เบต, เบ‚เปเป‰เบกเบนเบ™เบ•เบปเป‰เบ™เบ•เป: เบเบฒเบ™เบญเบญเบ, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Ctrl-A, X. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเบกเบตเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบœเบปเบ™ - เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบงเบปเป‰เบฒเบ‡เปˆเบฒเบเป†เบˆเบฒเบเบเบญเบ‡เบ›เบฐเบŠเบธเบก SSH เบ—เบตเปˆเปƒเบเป‰เบ„เบฝเบ‡ killall -KILL minicom.

เบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบญเบตเบเบญเบฑเบ™เปœเบถเปˆเบ‡. เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, RaspberryPi เบกเบตเบชเบญเบ‡ UART, เปเบฅเบฐเบžเบญเบ”เบ—เบฑเบ‡เบชเบญเบ‡เบชเบฒเบกเบฒเบ”เบ”เบฑเบ”เปเบ›เบ‡เป„เบ”เป‰เปเบฅเป‰เบงเบชเปเบฒเบฅเบฑเบšเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡: เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบš Bluetooth, เบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡ kernel console. เป‚เบŠเบเบ”เบต, เบžเบถเบ”เบ•เบดเบเปเบฒเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบฅเบปเบšเบฅเป‰เบฒเบ‡ เบญเบตเบ‡เบ•เบฒเบกเบ„เบนเปˆเบกเบทเบ™เบตเป‰.

เบ‚เบฝเบ™เบ„เบทเบ™เบ„เบงเบฒเบกเบˆเปเบฒ

เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ debugging, เป€เบžเบทเปˆเบญเบ—เบปเบ”เบชเบญเบšเบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบเปเปˆเบ•เป‰เบญเบ‡ เป‚เบซเบผเบ” bootloader (เบ‚เปเบญเบฐเป„เบž) เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ RAM เป‚เบ”เบเบเบปเบ‡เบˆเบฒเบเป€เบˆเบปเป‰เบฒเบžเบฒเบš. เบšเบฒเบ‡เบ—เบตเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบเบปเบ‡เบˆเบฒเบ GDB, เปเบ•เปˆเปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบ‚เป‰เบญเบเป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ‡เปˆเบฒเบเป†: เบ‚เป‰เบญเบเป„เบ”เป‰เบ„เบฑเบ”เบฅเบญเบเป„เบŸเบฅเปŒเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป„เบ› Raspberry, เบเบฑเบ‡เป„เบ”เป‰เบชเบปเปˆเบ‡เบ•เปเปˆเบžเบญเบ” 4444 เบœเปˆเบฒเบ™ SSH (telnet เบˆเบฒเบ OpenOCD) เปเบฅเบฐเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡. load_image. เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบกเบฑเบ™, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ–เบทเบเปเบŠเปˆเปเบ‚เบ‡, เปเบ•เปˆเปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡ "เบกเบฑเบ™เบšเปเปˆเบ™เบญเบ™, เบกเบฑเบ™เบเบฐเบžเบดเบšเบŠเป‰เบฒเป†": เบกเบฑเบ™เบ”เบฒเบงเป‚เบซเบฅเบ”เป„เบŸเบฅเปŒ, เบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เบกเบฑเบ™เบ”เป‰เบงเบเบ„เบงเบฒเบกเป„เบงเบชเบญเบ‡เบชเบฒเบกเบเบดเป‚เบฅเป„เบšเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต.

เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ breakpoints

เบซเบผเบฒเบเบ„เบปเบ™เบญเบฒเบ”เบˆเบฐเบšเปเปˆเป„เบ”เป‰เบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ debugging เป‚เบ›เบฅเปเบเบฅเบกเบ›เบปเบเบเบฐเบ•เบด, เปเบ•เปˆ breakpoints เบšเปเปˆเป„เบ”เป‰เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบฎเบฒเบ”เปเบงเบชเบฐเป€เบซเบกเบต. เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบˆเบธเบ”เปเบšเปˆเบ‡เบชเปˆเบงเบ™เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบŠเบปเปˆเบงเบ„เบฒเบงเบเบฒเบ™เบ‚เบฝเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบžเบดเป€เบชเบ”เปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก เป‚เบ”เบเบเบปเบ‡เป€เบ‚เบปเป‰เบฒเปƒเบ™เบฅเบฐเบซเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบ„เปเบฒเบชเบฑเปˆเบ‡เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบฎเบฑเบ”เบงเบฝเบ b เปƒเบ™ GDB. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบชเปˆเบˆเบธเบ”เบžเบฒเบเปƒเบ™ BootROM เป€เบžเบฒเบฐเบงเปˆเบฒ ROM
  • เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบˆเบธเบ”เบขเบธเบ”เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเป‚เบซเบฅเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ RAM เบˆเบฒเบ SD card, เปเบ•เปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเปเบ–เป‰เบฒเบˆเบปเบ™เบเปˆเบงเบฒเบกเบฑเบ™เบˆเบฐเบ–เบทเบเป‚เบซเบฅเบ”. เบ–เป‰เบฒโ€‹เบšเปเปˆโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ™เบฑเป‰เบ™, เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เบ‚เบฝเบ™โ€‹เบฅเบฐโ€‹เบซเบฑเบ”โ€‹เปƒเบ”โ€‹เปœเบถเปˆเบ‡โ€‹เบ„เบทเบ™โ€‹เปƒเปเปˆ, เปเบ•เปˆโ€‹เบ•เบปเบงโ€‹เป‚เบซเบผเบ”โ€‹เบˆเบฐโ€‹เบ‚เบฝเบ™โ€‹เบˆเบธเบ”โ€‹เบขเบธเบ”โ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบ„เบทเบ™โ€‹เปƒเปเปˆ.

เบ‚เป‰เบญเบเปเบ™เปˆเปƒเบˆเบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เปƒเบŠเป‰เบˆเบธเบ”เปเบšเปˆเบ‡เบฎเบฒเบ”เปเบงเป„เบ”เป‰เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™, เปเบ•เปˆเบงเปˆเบฒเบกเบตเบˆเปเบฒเบ™เบงเบ™เบˆเปเบฒเบเบฑเบ”.

เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™ BootROM เบ”เปˆเบงเบ™

เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบ‚เบญเบ‡เบเบฒเบ™เบ”เบตเบšเบฑเบ, เบกเบฑเบเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบ›เบฒเบ–เบฐเบซเบ™เบฒเบ—เบตเปˆเบˆเบฐเปเบเป‰เป„เบ‚ BootROM เปเบฅเบฐเบžเบฐเบเบฒเบเบฒเบกเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. เปเบ•เปˆเบกเบตเบšเบฑเบ™เบซเบฒ: BootROM เปเบกเปˆเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบญเบญเบเปเบšเบšเบ—เบตเปˆเป‚เบซเบฅเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ FPGA, เปเบฅเบฐเบเบฒเบ™เบชเบฑเบ‡เป€เบ„เบฒเบฐเบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ‚เบญเบ‡เบชเบญเบ‡เบชเบฒเบกเบ™เบฒเบ—เบต (เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเป€เบเบทเบญเบšเบ—เบฑเบ™เบ—เบตเบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบš BootROM เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบˆเบฒเบ C เปเบฅเบฐ Assembler ... ). เป‚เบŠเบเบ”เบต, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡ เป„เบงเบซเบผเบฒเบ: เบฅเปเบฒโ€‹เบ”เบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เปเบกเปˆเบ™โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹:

  • เบชเป‰เบฒเบ‡ bootrom.mif เบ„เบทเบ™เปƒเปเปˆ (เบ‚เป‰เบญเบเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ MIF เปเบ—เบ™ HEX, เป€เบžเบฒเบฐเบงเปˆเบฒเบ‚เป‰เบญเบเบกเบตเบšเบฑเบ™เบซเบฒเบเบฑเบš HEX เบชเบฐเป€เปเบต, เปเบฅเบฐ MIF เปเบกเปˆเบ™เบฎเบนเบšเปเบšเบšเป€เบ”เบตเบกเบ‚เบญเบ‡ Alter)
  • เปƒเบ™ Quartus เป€เบงเบปเป‰เบฒ Processing -> Update Memory Initialization File
  • เปƒเบ™เบฅเบฒเบเบเบฒเบ™ Assembler (เปƒเบ™เบ–เบฑเบ™เบŠเป‰เบฒเบเบ‚เบญเบ‡ Tasks) เบ„เปเบฒเบชเบฑเปˆเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡ - เบชเบญเบ‡เบชเบฒเบกเบชเบดเบšเบงเบดเบ™เบฒเบ—เบต.

เบเบณเบฅเบฑเบ‡เบเบฐเบเบฝเบก SD card

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ, เปเบ•เปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเบ„เบงเบฒเบกเบญเบปเบ”เบ—เบปเบ™เปเบฅเบฐเบกเบตเบžเบทเป‰เบ™เบ—เบตเปˆเบ”เบดเบ”เบ›เบฐเบกเบฒเบ™ 14Gb:

git clone https://github.com/sifive/freedom-u-sdk
git submodule update --recursive --init
make

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบชเปˆเปเบœเปˆเบ™เบ—เบตเปˆเบชเบฐเบญเบฒเบ”, เบซเบผเบทเปเบ—เบ™เบ—เบตเปˆเบˆเบฐ, เบญเบฑเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, SD card, เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™

sudo make DISK=/dev/sdX format-boot-loader

โ€ฆ เบขเบนเปˆเปƒเบช sdX โ€” เบญเบธโ€‹เบ›เบฐโ€‹เบเบญเบ™โ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เปƒเบซเป‰โ€‹เบšเบฑเบ”โ€‹. เบฅเบฐเบงเบฑเบ‡: เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบšเบฑเบ”เบˆเบฐเบ–เบทเบเบฅเบถเบš, เบ‚เบฝเบ™เบ—เบฑเบš เปเบฅเบฐเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›! เบกเบฑเบ™เบšเปเปˆเบ„เบธเป‰เบกเบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เบฐเบเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฒเบเบžเบฒเบเปƒเบ•เป‰ sudoเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเบดเปˆเบ‡เบเปเปˆเบชเป‰เบฒเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบ‚เบถเป‰เบ™เบเบฑเบš root, เปเบฅเบฐเบชเบฐเบžเบฒเปเบซเปˆเบ‡เบˆเบฐเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบˆเบฒเบเบžเบฒเบเปƒเบ•เป‰ sudo เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡.

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เบšเบฑเบ”เบซเบกเบฒเบเปƒเบ™ GPT เบกเบตเบชเบตเปˆเบžเบฒเบ—เบดเบŠเบฑเบ™, เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ™เบฑเป‰เบ™เบกเบต FAT เบเบฑเบš uEnv.txt เปเบฅเบฐเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบšเบนเบ”เป„เบ”เป‰เปƒเบ™เบฎเบนเบšเปเบšเบš FIT (เบกเบฑเบ™เบกเบตเบฎเบนเบšเบžเบฒเบšเบเปˆเบญเบเบซเบผเบฒเบ, เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบกเบตเบ—เบตเปˆเบขเบนเปˆเบ”เบฒเบงเป‚เบซเบฅเบ”เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡), เบชเปˆเบงเบ™เปเบšเปˆเบ‡เบญเบทเปˆเบ™เปเบกเปˆเบ™เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเบ–เบทเบเบˆเบฑเบ”เบฎเบนเบšเปเบšเบšเปƒเบ™ Ext4 เบชเปเบฒเบฅเบฑเบš Linux. เบชเบญเบ‡โ€‹เบžเบฒเบโ€‹เบชเปˆเบงเบ™โ€‹เป€เบžเบตเปˆเบกโ€‹เป€เบ•เบตเบก - เบฅเบถเบเบฅเบฑเบš: U-Boot เบ”เปเบฒเบฅเบปเบ‡เบŠเบตเบงเบดเบ”เบขเบนเปˆเปƒเบ™เบซเบ™เบถเปˆเบ‡ (เบเบฒเบ™เบŠเบปเบ”เป€เบŠเบตเบเบ‚เบญเบ‡เบกเบฑเบ™, เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบ‚เบปเป‰เบฒเปƒเบˆ, เปเบกเปˆเบ™ hardcoded เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ BootROM), เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ, เบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ‚เบญเบ‡เบกเบฑเบ™เบกเบตเบŠเบตเบงเบดเบ”เบขเบนเปˆ, เปเบ•เปˆเบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบกเบฑเบ™เป€เบ—เบทเปˆเบญ.

เบฅเบฐเบ”เบฑเบšเบซเบ™เบถเปˆเบ‡, BootROM

เบ›เบฑเบ™เบเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบ—เบตเปˆเบ™เบดเบเบปเบกเบเปˆเบฒเบงเบงเปˆเบฒ: "เบ–เป‰เบฒเบขเบนเปˆเปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบกเบตเบเบฒเบ™เป€เบ•เบฑเป‰เบ™เบฅเปเบฒเบเบฑเบš tambourine, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบ™เป€เบญเป€เบฅเบฑเบเป‚เบ•เบฃเบ™เบดเบเบเปเปˆเบกเบตเบเบฒเบ™เป€เบ•เบฑเป‰เบ™เบฅเปเบฒเบ”เป‰เบงเบเป€เบ„เบทเปˆเบญเบ‡เบ”เบฑเบšเป€เบžเบตเบ‡." เบกเบฑเบ™เบšเปเปˆเบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเป€เบเบทเบญเบšเป€เบœเบปเบฒเบเบฐเบ”เบฒเบ™, เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒ "เบ”เบต, GND เปเบกเปˆเบ™เบฅเบฐเบ”เบฑเบšเบ•เปเปˆเบฒเบ”เบฝเบงเบเบฑเบ™." (เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™, เบ•เบปเบงเบ•เป‰เบฒเบ™เบ—เบฒเบ™เบˆเบฐเบšเปเปˆเป€เบˆเบฑเบšเบ›เบงเบ”เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ” ... ) เบกเบฑเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ–เป‰เบฒเบกเบทเบšเปเปˆเป€เบ•เบตเบšเปƒเบซเบเปˆเบˆเบฒเบเบšเปˆเบญเบ™เบ™เบฑเป‰เบ™, เป€เบญเป€เบฅเบฑเบเป‚เบ•เบฃเบ™เบดเบเบšเปเปˆเป€เบ„เบตเบเบขเบธเบ”เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเปเบ›เบเปƒเบˆ: เป€เบกเบทเปˆเบญ solder connector เปƒเบชเปˆเบเบฐเบ”เบฒเบ™, เบ‚เป‰เบญเบเบเบฑเบ‡เบšเปเปˆเบชเบฒเบกเบฒเบ” solder เบ•เบดเบ”เบ•เปเปˆเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡ - เบงเบดเบ”เบตเป‚เบญเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™ solder เป‚เบ”เบเบเบปเบ‡. เปƒเบ™เป„เบฅเบเบฐเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”, เบžเบฝเบ‡เปเบ•เปˆเบ™เปเบฒเปƒเบŠเป‰เบ—เบฒเบ”เป€เบซเบผเบฑเบ soldering, เบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ, เบฅเบฒเบง "slapped" เบขเบนเปˆเบชเบธเปˆเบก. เบ”เบต, เบšเบฒเบ‡เบ—เบต solder เบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบญเบธเบ™เบซเบฐเบžเบนเบกเบ‚เบญเบ‡เบ—เบฒเบ”เป€เบซเบผเบฑเบ soldering, เบšเบฒเบ‡เบ—เบตเบญเบฒเบ”เบกเบตเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบญเบทเปˆเบ™ ... เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบซเบฑเบ™เบงเปˆเบฒเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบกเบตเบญเบฒเบเปเบเบฑเบชเบ•เบดเบ”เบ•เปเปˆเบเบฑเบ™เปเบฅเป‰เบง, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ›เบฐเบ–เบดเป‰เบกเปเบฅเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ debugging. เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ เบ„เบงเบฒเบกเบฅเบถเบเบฅเบฑเบš: เบ‚เป‰เบญเบเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ RX/TX เบˆเบฒเบ UART, เบ‚เป‰เบญเบเป‚เบซเบฅเบ”เป€เบŸเบตเบกเปเบง - เบกเบฑเบ™เบšเบญเบเบงเปˆเบฒ

INIT
CMD0
ERROR

เบ”เบต, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบกเบตเป€เบซเบ”เบœเบปเบ™ - เบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบกเบ”เบนเบ™ SD card. เบžเบงเบเป€เบฎเบปเบฒเปเบเป‰เป„เบ‚เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™, เป‚เบซเบฅเบ”เป€เบŸเบตเบกเปเบง ... เปเบฅเบฐเบ‡เบฝเบš ... เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เบ›เปˆเบฝเบ™เปƒเบˆ, เปเบ•เปˆเบเปˆเบญเบ‡เบ™เป‰เบญเบเบžเบฝเบ‡เปเบ•เปˆเป€เบ›เบตเบ”: เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ pins เป‚เบกเบ”เบนเบ™เบ•เป‰เบญเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš VCC. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ‚เป‰เบญเบ, เป‚เบกเบ”เบนเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ 5V เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ„เบดเบ”เบชเบญเบ‡เบ„เบฑเป‰เบ‡, เบ‚เป‰เบญเบเป„เบ”เป‰เบชเบฝเบšเบชเบฒเบเบ—เบตเปˆเบกเบฒเบˆเบฒเบเป‚เบกเบ”เบนเบ™เป„เบ›เบซเบฒเบ”เป‰เบฒเบ™เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบกเบ‚เบญเบ‡เบเบฐเบ”เบฒเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ soldered crookedly เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™ skewed, เปเบฅเบฐ เบเบฒเบ™เบ•เบดเบ”เบ•เปเปˆ UART เปเบกเปˆเบ™เบชเบนเบ™เป€เบชเบเบžเบฝเบ‡เปเบ•เปˆ. facepalm.jpg เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, "เบซเบปเบงเบ—เบตเปˆเบšเปเปˆเบ”เบตเป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เบฒเบšเปเปˆเบžเบฑเบเบœเปˆเบญเบ™," เปเบฅเบฐเบกเบทเบ‡เปเบšเปเปˆเบžเบฑเบเบœเปˆเบญเบ™เปƒเบซเป‰เบซเบปเบง ...

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบซเบฑเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบฅเปเบ„เบญเบเบกเบฒเบ”เบปเบ™เบ™เบฒเบ™

INIT
CMD0
CMD8
ACMD41
CMD58
CMD16
CMD18
LOADING /

เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบกเบฑเบ™เบเป‰เบฒเบเปเบฅเบฐเบ•เบปเบงเบŠเบตเป‰เบงเบฑเบ”เบเบฒเบ™เป‚เบซเบผเบ”เป„เบ”เป‰เบซเบกเบธเบ™. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเบทเปˆโ€‹เบˆเปเบฒโ€‹เบงเบฑเบ™โ€‹เบฎเบฝเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ—เบฑเบ™โ€‹เบ—เบตโ€‹เบ—เบฑเบ™โ€‹เปƒเบ”โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เป‚เบซเบผเบ”โ€‹เบ‚เบญเบ‡ MinuetOS leisurely เบˆเบฒเบ floppy diskโ€‹. เป€เบงเบฑเป‰เบ™เป€เบชเบเปเบ•เปˆเบงเปˆเบฒเป„เบ”เบšเปเปˆ grind.

เบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เบงเปˆเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบ‚เปเป‰เบ„เบงเบฒเบก BOOT เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบกเบฑเบ™เป€เบ–เบดเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบœเปˆเบฒเบ™ OpenOCD เบเบฑเบš Raspberry, เบเบฑเบš GDB เปƒเบ™เป€เบˆเบปเป‰เบฒเบžเบฒเบš, เปเบฅเบฐเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบกเบฑเบ™เปเบกเปˆเบ™เบซเบเบฑเบ‡.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเปƒเบŠเป‰ GDB เบ—เบฑเบ™เบ—เบตเป„เบ”เป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒ $pc (เป‚เบ„เบ‡เบเบฒเบ™เบ•เป‰เบฒเบ™, เบ—เบตเปˆเบขเบนเปˆเบ‚เบญเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™) เบšเบดเบ™เป„เบ› 0x0 - เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบซเบผเบฒเบ. เป€เบžเบฒเบฐเบชเบฐเบ™เบฑเป‰เบ™, เบ—เบฑเบ™เบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบเบ‚เปเป‰เบ„เบงเบฒเบกเบญเบญเบ BOOT เปƒเบซเป‰เป€เบžเบตเปˆเบก loop เบ—เบตเปˆเบšเปเปˆเบกเบตเบ‚เบญเบšเป€เบ‚เบ”. เบญเบฑเบ™เบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฒเบงเบŠเบฑเบเบŠเป‰เบฒเป„เบ›เป„เบฅเบเบฐเปœเบถเปˆเบ‡...

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;
 }

เบฅเบฐเบซเบฑเบ” tricky เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰ "เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบท": เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบเบดเบ™เบšเบฒเบ‡เบšเปˆเบญเบ™เบงเปˆเบฒ loop เบ—เบตเปˆเบšเปเปˆเบกเบตเบ—เบตเปˆเบชเบดเป‰เบ™เบชเบธเบ”เปเบกเปˆเบ™เบžเบถเบ”เบ•เบดเบเปเบฒเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”, เปเบ•เปˆ compiler เบšเปเปˆเบซเบ™เป‰เบฒเบˆเบฐเป€เบ”เบปเบฒ (เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบ•เบทเบญเบ™เบ—เปˆเบฒเบ™เบงเปˆเบฒเบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™. 0x10000 เบ•เบฑเป‰เบ‡เบขเบนเปˆ BootROM).

เบชเปˆเบงเบ™เบ—เบต 3: เป€เบเบทเบญเบšเบˆเบฐเป‚เบซเบฅเบ” Linux เบˆเบฒเบ SD card เบเบฑเบš RocketChip

เบกเบฑเบ™เบˆเบฐเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ, เบกเบตเบซเบเบฑเบ‡เบญเบตเบเปเบ”เปˆเบ—เบตเปˆเบˆเบฐเบ„เบฒเบ”เบซเบงเบฑเบ‡ - harsh embedded, เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เปƒเบ”? เปเบ•เปˆเปƒเบ™ เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบฑเป‰เบ™ เบœเบนเป‰เบ‚เบฝเบ™เบเปเบฒเบฅเบฑเบ‡เบ”เบตเบšเบฑเบเบฅเบฐเบซเบฑเบ” C... Kreks-fex-pex:

(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.

เบชเปˆเบงเบ™เบ—เบต 3: เป€เบเบทเบญเบšเบˆเบฐเป‚เบซเบฅเบ” Linux เบˆเบฒเบ SD card เบเบฑเบš RocketChip

เบ—เปˆเบฒเบ™โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบ”เบฒเบงโ€‹เบ™โ€‹เปŒโ€‹เป‚เบซเบฅเบ”โ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เป„เบŸเบฅโ€‹เปŒ MIF เบซเบผเบท binโ€‹, เปเบ•เปˆโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบ•เบปเป‰เบ™โ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เปƒเบ™โ€‹เบฎเบนเบšโ€‹เปเบšเบš ELFโ€‹.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ”เบปเบฒเป„เบ”เป‰เบ”เป‰เบงเบเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบก nth เบ—เบตเปˆเบขเบนเปˆ เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบˆเบฐเบชเบทเบšเบ•เปเปˆ (เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบญเบทเปˆเบ™เบ—เบตเปˆ compiler เบšเปเปˆเบ„เบงเบ™เบ„เบฒเบ”เป€เบ”เบปเบฒเบงเปˆเบฒ loop เปเบกเปˆเบ™เบšเปเปˆเบกเบตเบ‚เบญเบšเป€เบ‚เบ”). เบ—เบตเบกเบ‡เบฒเบ™

set variable $pc=0xADDR

เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบกเบนเบ™เบ„เปˆเบฒเบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปƒเบ™เบเบฒเบ™เบšเบดเบ™ (เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ—เบตเปˆเบขเบนเปˆเบ‚เบญเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™). เบ”เป‰เบงเบเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบกเบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบ„เปˆเบฒเบ—เบตเปˆเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ (เปเบฅเบฐเบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเป€เบฎเบฑเบ”เปเบœเบ™เบ—เบตเปˆเบ”เป‰เบงเบเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ).

เปƒเบ™โ€‹เบ—เบตเปˆโ€‹เบชเบธเบ”, เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เบชเบฐโ€‹เบซเบผเบธเบšโ€‹เป„เบ”เป‰ (เบšเปเปˆโ€‹เปเบ™เปˆโ€‹เปƒเบˆเบงเปˆโ€‹เบฒโ€‹เบญเบฑเบ™โ€‹เปƒเบ”โ€‹เบ–เบทเบโ€‹เบ•เป‰เบญเบ‡โ€‹) เบงเปˆเบฒโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบกเบต "เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹เบšเบฑเบ” SD เบ‚เบญเบ‡โ€‹เบฅเบฐโ€‹เบšเบปเบšโ€‹เบ—เบตเปˆโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹"โ€‹, เปเบฅเบฐโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เป„เบ›โ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹เบ‚เบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เบ”เบฒเบงโ€‹เป‚เบซเบผเบ”โ€‹เป„เบ”เป‰โ€‹, เปเบ•เปˆโ€‹เบงเปˆเบฒโ€‹. 0x89800 bytes เป€เบžเบตเปˆเบกเป€เบ•เบตเบก:

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

เบ•เบปเบงเบŠเบตเป‰ stack เปเบกเปˆเบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบงเบปเป‰เบฒเบเบปเบ‡เป„เบ›เบเบปเบ‡เบกเบฒ: เบกเบฑเบ™เบŠเบตเป‰เบœเปˆเบฒเบ™ RAM เบ—เบฑเบ‡เบซเบกเบปเบ” (เป€เบงเบฑเป‰เบ™เป€เบชเบเปเบ•เปˆ, เปเบ™เปˆเบ™เบญเบ™, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบกเบตเบเบฒเบ™เปเบ›เบ—เบตเปˆเบขเบนเปˆ, เปเบ•เปˆเปƒเบซเป‰เบ„เบงเบฒเบกเบซเบงเบฑเบ‡เบชเปเบฒเบฅเบฑเบšเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ).

เบฅเบญเบ‡เบ›เปˆเบฝเบ™เบ•เบปเบงเบŠเบตเป‰เบ”เป‰เบงเบ 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

เบ•เบฑเป‰เบ‡เบˆเบธเบ”เบขเบธเบ”เป€เบ›เบฑเบ™ 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 เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เปƒเบซเป‰โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบ‚เปเป‰โ€‹เบเบปเบโ€‹เป€เบงเบฑเป‰เบ™โ€‹เบ—เบตเปˆโ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹, เปเบ•เปˆเบฅเบฒเบงเป€เบฎเบฑเบ”เบšเปเปˆเป„เบ”เป‰. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, somehow เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบชเบฐเปเบ”เบ‡เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. set directories ../freedom-u-sdk/HiFive_U-Boot/ เบเปˆเบฝเบงเบเบฑเบš! เบ•เบญเบ™เบ™เบตเป‰เบชเบฐเปเบ”เบ‡เปเบฅเป‰เบง!

เปเบฅเป‰เบง, เปƒเบซเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบกเบฑเบ™เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เปเบฅเบฐเป€เบšเบดเปˆเบ‡เบˆเบฒเบ stack เบ•เบดเบ”เบ•เบฒเบกเบชเบฒเป€เบซเบ”เบ‚เบญเบ‡เบšเบฑเบ™เบซเบฒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ” (mcause == 5). เบ–เป‰เบฒเบ‚เป‰เบญเบเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ–เบทเบเบ•เป‰เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เบฝเบ™ เบ—เบตเปˆเบ™เบตเป‰ เปƒเบ™เบซเบ™เป‰เบฒ 37, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ 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. เปƒเบ™เบšเบฒเบ‡เบˆเบธเบ”เบ‚เป‰เบญเบเบเปเปˆเบ„เบดเบ”เบงเปˆเบฒ, เบšเบฒเบ‡เบ—เบต, เบ”เบต, เบ‚เป‰เบญเบเบ„เบงเบ™เป€เบžเบตเปˆเบก boot loader เบชเปเบฒเบฅเบฑเบšเป‚เบ›เป€เบŠเบ”เป€เบŠเบต - เบšเบฒเบ‡เบ—เบตเบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เปเบเป‰เป„เบ‚เป‚เบ›เป€เบŠเบ”เป€เบŠเบตเป€เบฅเบฑเบเบ™เป‰เบญเบ? เปเบ•เปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบกเบฑเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบšเบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ”เบˆเบฒเบเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบชเปเบฒเป€เบฅเบฑเบ”เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™#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 */

เปƒเบ™เบšเบฒเบ‡เบˆเบธเบ”เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ crutches เป„เบ”เป‰ fasteners เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบŠเบต เป„เบ”เป‰เบšเบฑเบ™เบฅเบธเบˆเบธเบ”เบชเปเบฒเบ„เบฑเบ™. เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเป€เบฅเบฑเบเบ™เป‰เบญเบ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบกเบฒเป€เบ–เบดเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบ—เปˆเบฒเป€เบฎเบทเบญเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฐเบ”เบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ„เบฑเบ”เบฅเบญเบเปเบฅเบฐเบ›เบฑเบšเป„เบŸเบฅเปŒเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เป€เบžเบทเปˆเบญเปƒเบซเป‰เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เบ”เบต, เบ›เบฐเบกเบฒเบ™, เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ

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 เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ”เบเปƒเบŠเป‰เบเบปเบ™เป„เบ Kconfig, เบ—เบตเปˆเบ„เบธเป‰เบ™เป€เบ„เบตเบเบˆเบฒเบ Linux kernel - เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบฑเปˆเบ‡เป„เบ”เป‰. make menuconfig, เปเบฅเบฐเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบชเบฐเบ”เบงเบเบˆเบฐเบ›เบฒเบเบปเบ”เบขเบนเปˆเบ—เบฒเบ‡เบซเบ™เป‰เบฒเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป‚เบ”เบ ? เปเบฅเบฐเบญเบทเปˆเบ™เป† เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เบกเบตเบเบฒเบ™เบฅเบงเบกเป€เบญเบปเบฒเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡เบชเบฒเบกเบˆเบฒเบเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡เบชเบญเบ‡เบเบฐเบ”เบฒเบ™, เบ–เบดเป‰เบกเบ—เบธเบเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ PLL reconfigurations เบ—เบตเปˆเบซเบ™เป‰เบฒเบเบฝเบ”เบˆเบฒเบเบšเปˆเบญเบ™เบ™เบฑเป‰เบ™ (เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™, เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบˆเบฒเบเบ„เบญเบกเบžเบดเบงเป€เบ•เบตเป‚เบฎเบ”เบœเปˆเบฒเบ™ PCIe, เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเปเบ™เปˆเบ™เบญเบ™) , เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบฎเบฑเบšเป€เบŸเบตเบกเปเบงเบšเบฒเบ‡เบขเปˆเบฒเบ‡, เป€เบŠเบดเปˆเบ‡, เปƒเบ™เบชเบฐเบžเบฒเบšเบญเบฒเบเบฒเบ”เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเป€เบ—เบดเบ‡เบ”เบฒเบงเบญเบฑเบ‡เบ„เบฒเบ™เป„เบ”เป‰เปƒเบซเป‰เบ‚เปเป‰เบ„เบงเบฒเบกเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบœเปˆเบฒเบ™ UART เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ—เบตเปˆเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒ hash เบกเบฑเบ™เบ–เบทเบเบฅเบงเบšเบฅเบงเบกเบˆเบฒเบ, เปเบฅเบฐเบเปˆเบฝเบงเบเบฑเบšเบˆเปเบฒเบ™เบงเบ™ DRAM เบ—เบตเปˆเบ‚เป‰เบญเบเบกเบต (เปเบ•เปˆเบ‚เป‰เบญเบเป€เบญเบ‡เบ‚เบฝเบ™เบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เบขเบนเปˆเปƒเบ™เบซเบปเบง).

เบ„เบงเบฒเบกเบชเบปเบ‡เบชเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบงเปˆเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ„เบฐเบ™เบฐเบเปเบฒเบกเบฐเบเบฒเบ™เบ›เบปเบเบเบฐเบ•เบดเบขเบธเบ”เป€เบŠเบปเบฒเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบœเปˆเบฒเบ™เป‚เบ›เป€เบŠเบ”เป€เบŠเบต JTAG, เปเบฅเบฐเบเบฒเบ™เป‚เบซเบผเบ”เบˆเบฒเบ SD card เปเบกเปˆเบ™, เบญเบฐเบ™เบดเบˆเบฒ, เบšเปเปˆเป„เบงเปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบ‚เป‰เบญเบ. เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบšเบฒเบ‡เบ„เบฑเป‰เบ‡ BootROM เปƒเบซเป‰เบ‚เปเป‰เบ„เบงเบฒเบกเบงเปˆเบฒ ERROR, เบฅเบปเป‰เบกเป€เบซเบฅเบงเปƒเบ™เบเบฒเบ™เบšเบนเบ”, เปเบฅเบฐ U-Boot เบ›เบฒเบเบปเบ”เบ‚เบถเป‰เบ™เบ—เบฑเบ™เบ—เบต. เบกเบฑเบ™เปเบกเปˆเบ™เบ•เบญเบ™เบ™เบฑเป‰เบ™เบ—เบตเปˆเบกเบฑเบ™เบฎเบธเปˆเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบ‚เป‰เบญเบ: เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™, เบซเบผเบฑเบ‡เบˆเบฒเบ rebooting bitstream เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ FPGA, เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบฅเบถเบš, เบกเบฑเบ™เบšเปเปˆเบกเบตเป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐ "untrain", เปเบฅเบฐเบญเบทเปˆเบ™เป†. เปƒเบ™เบชเบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบžเบฝเบ‡เปเบ•เปˆเป€เบกเบทเปˆเบญเบ‚เปเป‰เบ„เบงเบฒเบกเบ›เบฒเบเบปเบ” LOADING / เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เบเบฑเบš debugger เปเบฅเบฐโ€‹เบ„เปเบฒโ€‹เบชเบฑเปˆเบ‡โ€‹ set variable $pc=0x80089800, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เบ‚เป‰เบฒเบกเบเบฒเบ™เป‚เบซเบผเบ”เบเบฒเบงเบ™เบตเป‰ (เปเบ™เปˆเบ™เบญเบ™, เบ•เบฒเบกเบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™เบงเปˆเบฒเบ„เบฑเป‰เบ‡เบชเบธเบ”เบ—เป‰เบฒเบเบกเบฑเบ™เปเบ•เบเบ•เบปเป‰เบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบกเบฑเบ™เบšเปเปˆเบกเบตเป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเป‚เบซเบฅเบ”เบญเบฑเบ™เปƒเบ”เบขเบนเปˆเป€เบ—เบดเบ‡เบฅเบฐเบซเบฑเบ”เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš).

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ›เบปเบเบเบฐเบ•เบดเบ—เบตเปˆเป‚เบ›เป€เบŠเบ”เป€เบŠเบต freezes เบซเบกเบปเบ”เปเบฅเบฐ JTAG debugger เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบกเบฑเบ™เบ”เป‰เบงเบเบ‚เปเป‰เบ„เบงเบฒเบก?

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 เบขเปˆเบฒเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆ - เบ‚เป‰เบญเบเป„เบ”เป‰เบžเบฐเบเบฒเบเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบเปˆเบฝเบงเบเบฑเบšเป‚เบฎเบ‡เบ‡เบฒเบ™เบœเบฐเบฅเบดเบ”เบซเป‰เบญเบเบงเปˆเบฒเบกเบฑเบ™เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เบเบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบซเบผเบทเบšเปเปˆ. เป€เบˆเบปเป‰เบฒเบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเปเบ™เบงเปƒเบ”, "เบกเบฑเบ™เบ–เบทเบเบซเป‰เบญเบเปเบšเบšเบ™เบตเป‰เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบชเบดเบšเบ™เบฒเบ—เบต"? เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบกเบฑเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบฒเบ™เบเบปเบเบเป‰เบฒเบเปเบฅเบฐเป„เบ›เบ—เบตเปˆเป€เบกเบ™เบน boot! เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ: เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ U-Boot เบˆเบฐเบ–เบทเบเป‚เบซเบฅเบ”เบขเบนเปˆเปƒเบ™ 2^24 bytes เบ—เปเบฒเบญเบดเบ”เบˆเบฒเบ SD card, เป€เบกเบทเปˆเบญเบกเบฑเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบกเบฑเบ™เบˆเบฐเบ„เบฑเบ”เบฅเบญเบเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เป„เบ›เบซเบฒเบ—เบตเปˆเบขเบนเปˆเบซเปˆเบฒเบ‡เป„เบ, เบšเปเปˆเบงเปˆเบฒเบˆเบฐเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™เบชเปˆเบงเบ™เบซเบปเบงเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบซเบผเบทเบžเบฝเบ‡เปเบ•เปˆเป„เบ›เบซเบฒเบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบชเบนเบ‡เบเบงเปˆเบฒเบ‚เบญเบ‡ RAM. , เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบปเบเบเป‰เบฒเบ ELF -characters, เปเบฅเบฐเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป‚เบญเบ™เบกเบต. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™: เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™เบฅเบฐเบ”เบฑเบšเบ™เบตเป‰เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเป€เบ‡เบดเบ™เป‚เบšเบ™เบฑเบ”เบ—เบตเปˆเป‚เบฎเบ‡เบ‡เบฒเบ™เบœเบฐเบฅเบดเบ”เบšเปเปˆเบ•เบดเบ”เปเบซเบ™เป‰เบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™.

เบชเบฐเบ™เบฑเป‰เบ™ เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒเบˆเบถเปˆเบ‡เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ? เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป‚เบกเบ‡เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเป‰เบญเบ™เป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡...

(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 config). เปเบ•เปˆ damn, เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบฅเบฐโ€‹เบญเบฝเบ”โ€‹เปเบฅเบฐโ€‹เบฅเบฐโ€‹เบกเบฑเบ”โ€‹เบฅเบฐโ€‹เบงเบฑเบ‡: เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบšเปเปˆโ€‹เบฎเบนเป‰โ€‹เบงเปˆเบฒโ€‹เบกเบต, เบ™เบตเป‰โ€‹เปเบกเปˆเบ™ 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 #

เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เปƒเบชเปˆเบ„เปเบฒเบชเบฑเปˆเบ‡เป„เบ”เป‰! เบ•เบปเบงเบขเปˆเบฒเบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบ poking เบ›เบฐเบกเบฒเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบ, เบชเบธเบ”เบ—เป‰เบฒเบเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ”เบปเบฒเบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒ mmc_spi 1 10000000 0; mmc part, เบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบ„เบงเบฒเบกเบ–เบตเปˆ SPI เบˆเบฒเบ 20MHz เบซเบฒ 10MHz. เป€เบ›เบฑเบ™เบซเบเบฑเบ‡? เบ”เบต, เบ„เบงเบฒเบกเบ–เบตเปˆเบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡ 20MHz เบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™ config, เปเบฅเบฐเบกเบฑเบ™เบเบฑเบ‡เบ–เบทเบเบ‚เบฝเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เปเบ•เปˆ, เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบ‚เบปเป‰เบฒเปƒเบˆ, เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš, เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เป€เบฎเบฑเบ”เบงเบฝเบเปเบšเบšเบ™เบตเป‰: เบฅเบฐเบซเบฑเบ”เปเบšเปˆเบ‡เบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบฎเบฒเบ”เปเบง (เบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบกเปˆเบ™ 25MHz เบขเบนเปˆเบ—เบปเปˆเบงเบ—เบธเบเปเบซเปˆเบ‡) เป‚เบ”เบเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ, เปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบกเบนเบ™เบ„เปˆเบฒเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป€เบ›เบฑเบ™เบ•เบปเบงเบซเบฒเบ™เปƒเบ™เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™. เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™. เบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เบงเปˆเบฒเบ–เป‰เบฒเบชเปเบฒเบฅเบฑเบš 115200Hz UART เบกเบตเบ›เบฐเบกเบฒเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปเบšเปˆเบ‡ 25000000 เบเบฑเบš 20000000 เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบš 1, i.e. เบกเบฑเบ™เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเบ—เบตเปˆ 25MHz. เบšเบฒเบ‡เบ—เบตเบ™เบตเป‰เปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ›เบปเบเบเบฐเบ•เบด, เปเบ•เปˆเบ–เป‰เบฒเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”, เบกเบฑเบ™เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบœเบนเป‰เปƒเบ”เบœเบนเป‰เบซเบ™เบถเปˆเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบกเบฑเบ™ (เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเปเบ™เปˆเบ™เบญเบ™) ... เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบกเบฑเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบงเบฒเบ‡เบกเบฑเบ™เบฅเบปเบ‡เปเบฅเบฐเบเป‰เบฒเบงเบ•เปเปˆเป„เบ› - เป„เบเปเบฅเบฐเบญเบฐเบ™เบดเบˆเบฒ, เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™. 25MHz เบšเปเปˆเปเบกเปˆเบ™ Core i9.

เบœเบปเบ™เบœเบฐเบฅเบดเบ” Console

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

เบ•เบปเบเบฅเบปเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบกเบฒเบฎเบญเบ”เบฅเบฐเบ”เบฑเบšเบ•เปเปˆเป„เบ›เปเบฅเป‰เบง, เปเบ•เปˆเบกเบฑเบ™เบเบฑเบ‡เบ„เบปเบ‡เบ„เป‰เบฒเบ‡เบขเบนเปˆ. เปเบฅเบฐเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบกเบฑเบ™เบเปเปˆ sprinkles เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡ mcause เป‚เบ”เบเบเบฒเบ™เบ™เบญเบ™เบฅเปเบ–เป‰เบฒเบฅเบฐเบซเบฑเบ”เบขเบนเปˆเปƒเบ™เบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰ $pc เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบ si เบขเบนเปˆ trap_entry. เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™ U-Boot เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบญเบญเบเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบš mcause = 0..4, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฝเบกเบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบขเบนเปˆเปƒเบ™ boot เบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ config, เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡, เปเบฅเบฐเบˆเบทเปˆ: เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™ conf/rvboot-fit.txt เบ‚เบฝเบ™:

fitfile=image.fit
# below much match what's in FIT (ugha)

เปเบฅเป‰เบง, เปƒเบซเป‰เป€เบญเบปเบฒเป„เบŸเบฅเปŒเบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบก, เปเบ—เบ™เบ—เบตเปˆเป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ kernel เบ”เป‰เบงเบเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบตเบ„เบงเบฒเบกเบชเบปเบ‡เปƒเบชเบงเปˆเบฒ. SIF0 - เบ™เบตเป‰เปเบกเปˆเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบšเบฒเบ‡เบšเปˆเบญเบ™เบœเปˆเบฒเบ™ PCIe:

-bootargs=console=ttySIF0,921600 debug
+bootargs=console=ttyS0,125200 debug

เปเบฅเบฐเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ›เปˆเบฝเบ™เบฅเบฐเบšเบปเบš hashing algorithm เบˆเบฒเบ SHA-256 เป€เบ›เบฑเบ™ MD5: เบ‚เป‰เบญเบเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบงเบฒเบกเป€เบ‚เบฑเป‰เบกเบ‚เบปเป‰เบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบฅเบฑเบš (เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปเบกเปˆเบ™เบเบฒเบ™เปเบเป‰เบšเบฑเบ™เบซเบฒ), เบกเบฑเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒเบ”เบปเบ™เบซเบผเบฒเบ, เปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ„เบงเบฒเบกเบŠเบทเปˆเบชเบฑเบ”เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป‚เบซเบฅเบ”, MD5 เปเบกเปˆเบ™เบ‡เปˆเบฒเบเป€เบเบตเบ™เป„เบ›. เบœเบปเบ™เบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบซเบเบฑเบ‡? เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบ”เบฑเบšโ€‹เบ—เบตเปˆโ€‹เบœเปˆเบฒเบ™โ€‹เบกเบฒโ€‹เป„เบงโ€‹เบ‚เบถเป‰เบ™โ€‹เบขเปˆเบฒเบ‡โ€‹เบงเปˆเบญเบ‡โ€‹เป„เบง (เป€เบ™เบทเปˆเบญเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™ hashing เบ‡เปˆเบฒเบโ€‹เบ‚เบถเป‰เบ™โ€‹)โ€‹, เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹เป€เบ›เบตเบ”โ€‹:

...
   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

เบญเบธเบ, เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบเบฒเบ™เปเบเป‰เป„เบ‚เป‚เบกเบ‡เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™ placebo, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ‚เป‰เบญเบเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบกเบฑเบ™เบŠเปˆเบงเบเป„เบ”เป‰. เบšเปเปˆ, เปเบ™เปˆเบ™เบญเบ™, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปเบเป‰เป„เบ‚, เปเบ•เปˆเบ—เปเบฒเบญเบดเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบซเบฑเบ™เบฅเบนเบเบชเบญเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เปเบฅเบฐเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™:

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 โ€” เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบตเปˆเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง kernel tethered (เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เปƒเบ™เบเบฒเบ™เบฎเปˆเบงเบกเบกเบทเบเบฑเบš host 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"); }
  }
}

Quest: เป€เบฅเบตเปˆเบกเป‚เบกเบ‡

เบเบฒเบ™เบŠเบญเบเบซเบฒเบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปƒเบ™ 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 เบ—เบตเปˆเบฅเบถเบเบฅเบฑเบš, เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™: "เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบซเบเบฑเบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰? เบšเปเปˆเบˆเบฐเปเบˆเป‰เบ‡? เปƒเบซเป‰เบ›เบดเบ”เบกเบฑเบ™!" เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เบšเปเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เป‚เบกเบ‡ magic เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡เป€เบซเบ”เบœเบปเบ™เบ™เบตเป‰เปƒเบ™. 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

เบ—เบตเปˆเบ™เบตเป‰เป€เบฅเบทเปˆเบญเบ‡เป„เบ”เป‰เบ–เบทเบเบฅเบฒเบเปเบฅเป‰เบงเปเบฅเบฐเป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™ monotonous เป€เบฅเบฑเบเบ™เป‰เบญเบ, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบกเบฑเบ™เบˆเบฒเบเป€เบ—เบดเบ‡เบซเบฒเบฅเบธเปˆเบกเบชเบธเบ”:

BBL เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบกเบต FDT เบขเบนเปˆ 0xF0000000, เปเบ•เปˆเบ‚เป‰เบญเบเป„เบ”เป‰เปเบเป‰เป„เบ‚เบกเบฑเบ™เปเบฅเป‰เบง! เปเบฅเป‰เบง, เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡ ... เบžเบปเบšเบกเบฑเบ™เบขเบนเปˆเปƒเบ™ HiFive_U-Boot/arch/riscv/lib/boot.c, เปเบ—เบ™เบ—เบตเปˆเบ”เป‰เบงเบ 0x81F00000, เบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบšเบนเบ” U-Boot.

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, BBL เบˆเบปเปˆเบกเบงเปˆเบฒเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒ. เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ‚เบญเบ‡เบ‚เป‰เบญเบเบขเบนเปˆเปƒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆ mem_prop, เบชเบดเปˆเบ‡เบ—เบตเปˆเบขเบนเปˆเปƒเบ™ riscv-pk/machine/fdt.c: เบˆเบฒเบเบšเปˆเบญเบ™เบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบกเบฒเบ fdt ram node เป€เบ›เบฑเบ™ 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-bit, เปเบ•เปˆเบกเบฑเบ™เบกเบฒเปƒเบ™เบ—เบปเปˆเบงเบ„เบนเปˆ <0x0 0xADDR>, เปเบฅเบฐเบ„เปˆเบฒเบ—เปเบฒเบญเบดเบ”เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™ bits เบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”. เป€เบžเบตเปˆเบกเปƒเบชเปˆเบžเบฒเบเบชเปˆเบงเบ™ chosen

chosen {
      #address-cells = <1>;
      #size-cells = <0>;
      ...
}

เปเบฅเบฐเปเบเป‰เป„เบ‚เบเบฒเบ™เบชเป‰เบฒเบ‡เบ„เบธเบ™เบ„เปˆเบฒ: เบšเปเปˆเป€เบžเบตเปˆเบก 0x0 เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เปเบฒเบญเบดเบ”.

100500 เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบ—เบตเปˆโ€‹เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบโ€‹เป€เบซเบผเบปเปˆเบฒโ€‹เบ™เบตเป‰โ€‹เบˆเบฐโ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบกเบฑเบ™โ€‹เบ‡เปˆเบฒเบโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบšเบดเปˆเบ‡ penguin เบซเบผเบธเบ”โ€‹เบฅเบปเบ‡โ€‹:

เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰

   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, เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ debugger เบœเปˆเบฒเบ™ JTAG, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบšเบเบฑเบšเบ”เบฑเบเบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡ - debugger เบˆเบฐเบขเบธเบ”เบขเบนเปˆเปƒเบ™เบˆเบธเบ”เบ™เบตเป‰.

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, เปเบฅเปˆเบ™เบเบฒเบ™เบˆเบณเบฅเบญเบ‡เบŠเบญเบšเปเบง. เบ”เบต, เบซเบผเบทเบšเปเปˆเปเบฅเปˆเบ™. เบชเบนเบ™เป€เบชเบเปƒเบ™เปเบเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ”เบฝเบง.

/* 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 - เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เปเบ•เป‰เบกเบฎเบนเบšเบ‚เบญเบ‡เบฎเบปเป‰เบงเป‚เบ”เบเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ Tom Sawyer. เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบ”เป‰เบงเบเป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเบกเบตเบœเบนเป‰เบŠเบฐเบ™เบฐเปƒเบ™เบกเบทเป‰เบ™เบตเป‰, เบฅเบฒเบ‡เบงเบฑเบ™เบˆเบฐเบ–เบทเบเป‚เบญเบ™เป„เบ›เบซเบฒเบเบฒเบ™เบˆเบฑเบšเบชเบฐเบซเบฅเบฒเบเบ„เบฑเป‰เบ‡เบ•เปเปˆเป„เบ› ...

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เบชเบดเป‰เบ™เบชเบธเบ”เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบเบฒเบงเปเบฅเป‰เบง.

เบ•เบดเบ”โ€‹เบ•เบฒเบกโ€‹เบ•เบญเบ™โ€‹เบ•เปเปˆโ€‹เป„เบ›. เบˆเบฐโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบ•เปเปˆโ€‹เบชเบนเป‰โ€‹เบเบฑเบšโ€‹เปเบกเบ‡โ€‹เป„เบกเป‰ cunning เบ—เบตเปˆโ€‹เบ„เบธเป‰เบกโ€‹เบ„เบญเบ‡โ€‹เป€เบžเบทเปˆเบญโ€‹เบŠเปˆเบญเบ™โ€‹เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบ—เปˆเบฒเบ™โ€‹เบ„เปˆเบญเบเป† creep เป€เบ–เบดเบ‡โ€‹เบกเบฑเบ™โ€‹เบ”เป‰เบงเบ singlestep.

เบ‚เปเป‰เบ„เบงเบฒเบกเบ”เบฒเบงเป‚เบซเบผเบ” screencast (เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบžเบฒเบเบ™เบญเบ):
เบชเปˆเบงเบ™เบ—เบต 3: เป€เบเบทเบญเบšเบˆเบฐเป‚เบซเบฅเบ” Linux เบˆเบฒเบ SD card เบเบฑเบš RocketChip

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™