เจญเจพเจ— 3: เจฒเจ—เจญเจ— เจฒเฉ‹เจก เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ Linux SD เจ•เจพเจฐเจก เจคเฉ‹เจ‚ RocketChip เจคเฉฑเจ•

เจญเจพเจ— 3: เจฒเจ—เจญเจ— เจฒเฉ‹เจก เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ Linux SD เจ•เจพเจฐเจก เจคเฉ‹เจ‚ RocketChip เจคเฉฑเจ• ะ’ เจชเจฟเจ›เจฒเฉ‡ เจญเจพเจ— ะฑั‹ะป ั€ะตะฐะปะธะทะพะฒะฐะฝ ะฑะพะปะตะต-ะผะตะฝะตะต ั€ะฐะฑะพั‚ะฐัŽั‰ะธะน ะบะพะฝั‚ั€ะพะปะปะตั€ ะฟะฐะผัั‚ะธ, ะฐ ั‚ะพั‡ะฝะตะต โ€” ะพะฑั‘ั€ั‚ะบะฐ ะฝะฐะด IP Core ะธะท Quartus, ัะฒะปััŽั‰ะฐััั ะฟะตั€ะตั…ะพะดะฝะธะบะพะผ ะฝะฐ TileLink. ะกะตะณะพะดะฝั ะถะต ะฒ ั€ัƒะฑั€ะธะบะต ยซะŸะพั€ั‚ะธั€ัƒะตะผ RocketChip ะฝะฐ ะผะฐะปะพะธะทะฒะตัั‚ะฝัƒัŽ ะบะธั‚ะฐะนัะบัƒัŽ ะฟะปะฐั‚ัƒ ั ะฆะธะบะปะพะฝะพะผยป ะฒั‹ ัƒะฒะธะดะธั‚ะต ั€ะฐะฑะพั‚ะฐัŽั‰ัƒัŽ ะบะพะฝัะพะปัŒ. ะŸั€ะพั†ะตัั ะฝะตัะบะพะปัŒะบะพ ะทะฐั‚ัะฝัƒะปัั: ั ัƒะถะต ะฑั‹ะปะพ ะดัƒะผะฐะป, ั‡ั‚ะพ ัะตะนั‡ะฐั ะฟะพ-ะฑั‹ัั‚ั€ะพะผัƒ ะทะฐะฟัƒั‰ัƒ Linux, ะธ ะฟะพะนะดั‘ะผ ะดะฐะปัŒัˆะต, ะฝะพ ะฝะต ั‚ัƒั‚ ั‚ะพ ะฑั‹ะปะพ. ะ’ ัั‚ะพะน ั‡ะฐัั‚ะธ ะฟั€ะตะดะปะฐะณะฐัŽ ะฟะพัะผะพั‚ั€ะตั‚ัŒ ะฝะฐ ะฟั€ะพั†ะตัั ะทะฐะฟัƒัะบะฐ U-Boot, BBL, ะธ ั€ะพะฑะบะธะต ะฟะพะฟั‹ั‚ะบะธ Linux kernel ะธะฝะธั†ะธะฐะปะธะทะธั€ะพะฒะฐั‚ัŒัั. ะะพ ะบะพะฝัะพะปัŒ ะตัั‚ัŒ โ€” U-Boot-ะพะฒัะบะฐั, ะธ ะดะพะฒะพะปัŒะฝะพ-ั‚ะฐะบะธ ะฟั€ะพะดะฒะธะฝัƒั‚ะฐั, ะธะผะตัŽั‰ะฐั ะผะฝะพะณะพะต ะธะท ั‚ะพะณะพ, ั‡ั‚ะพ ะฒั‹ ะพะถะธะดะฐะตั‚ะต ะพั‚ ะฟะพะปะฝะพั†ะตะฝะฝะพะน ะบะพะฝัะพะปะธ.

เจนเจพเจฐเจกเจตเฉ‡เจ…เจฐ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• SD เจ•เจพเจฐเจก เจธเจผเจพเจฎเจฒ เจนเฉ‹เจตเฉ‡เจ—เจพ เจœเฉ‹ SPI เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฆเฉเจ†เจฐเจพ เจœเฉเฉœเจฟเจ† เจนเฉ‹เจ‡เจ† เจนเฉˆ, เจจเจพเจฒ เจนเฉ€ เจ‡เฉฑเจ• UART. เจธเจพเจซเจŸเจตเฉ‡เจ…เจฐ เจนเจฟเฉฑเจธเฉ‡ เจตเจฟเฉฑเจš, BootROM เจจเจพเจฒ เจคเจฌเจฆเฉ€เจฒ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ xip 'เจคเฉ‡ sdboot เจ…เจคเฉ‡, เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจฒเฉ‹เจกเจฟเฉฐเจ— เจชเฉœเจพเจ… เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจ (SD เจ•เจพเจฐเจก 'เจคเฉ‡)เฅค

เจนเจพเจฐเจกเจตเฉ‡เจ…เจฐ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจเจพ

เจ‡เจธ เจฒเจˆ, เจ•เฉฐเจฎ: เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• "เจตเฉฑเจกเฉ‡" เจ•เฉ‹เจฐ 'เจคเฉ‡ เจœเจพเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เฉฑเจ• UART (เจฐเจธเจฌเฉ‡เจฐเฉ€ เจคเฉ‹เจ‚) เจ…เจคเฉ‡ เจ‡เฉฑเจ• SD เจ…เจกเจพเจชเจŸเจฐ (เจ…เจธเฉ€เจ‚ เจ•เฉˆเจŸเฉ‡เจฒเฉˆเจ•เจธ เจคเฉ‹เจ‚ เจ›เฉ‡ เจชเจฟเฉฐเจจเจพเจ‚ เจจเจพเจฒ เจ‡เฉฑเจ• เจ•เจพเจฐเจก เจตเจฐเจคเจฟเจ† เจนเฉˆ: GND, VCC, MISO, MOSI, SCK, CS) .

เจ…เจธเฉ‚เจฒ เจตเจฟเฉฑเจš, เจธเจญ เจ•เฉเจ เจ•เจพเจซเจผเฉ€ เจธเจงเจพเจฐเจจ เจธเฉ€. เจชเจฐ เจ‡เจธ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ•เจฟ เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เจน เจ…เจนเจฟเจธเจพเจธ เจนเฉ‹ เจœเจพเจตเฉ‡, เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเจพเจธเฉ‡ เจคเฉ‹เจ‚ เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡ เจธเฉเฉฑเจŸ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจธเฉ€: เจชเจฟเจ›เจฒเฉ€ เจตเจพเจฐ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจ‚ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจ•เจฟ เจฆเฉเจฌเจพเจฐเจพ เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เจธ เจตเจฟเฉฑเจš เจฎเจฟเจฒเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ. System เจ•เฉเจ เจ…เจœเจฟเจนเจพ HasPeripheryUART (เจ…เจคเฉ‡ เจ‰เจธ เจ…เจจเฉเจธเจพเจฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ), SD เจ•เจพเจฐเจก เจฒเจˆ เจ‰เจนเฉ€ - เจ…เจคเฉ‡ เจธเจญ เจ•เฉเจ เจคเจฟเจ†เจฐ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพเฅค เจซเจฟเจฐ เจฎเฉˆเจ‚ เจ‡เจน เจฆเฉ‡เจ–เจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจ•เจฟ เจ‡เจธเจจเฉ‚เฉฐ "เจ—เฉฐเจญเฉ€เจฐ" เจกเจฟเจœเจผเจพเจˆเจจ เจตเจฟเฉฑเจš เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค เจ‡เจธ เจฒเจˆ, เจ‡เจธ เจฌเจพเจฐเฉ‡ เจ—เฉฐเจญเฉ€เจฐ เจ•เฉ€ เจนเฉˆ? เจ†เจฐเจŸเฉ€, เจœเจผเจพเจนเจฐ เจคเฉŒเจฐ 'เจคเฉ‡, เจซเจฟเฉฑเจŸ เจจเจนเฉ€เจ‚ เจฌเฉˆเจ เจฆเฉ€ - เจฐเจพเจ–เจธเจผ เจฐเจนเจฟเฉฐเจฆเจพ เจนเฉˆ unleahshed.DevKitConfigs. เจ…เจคเฉ‡ เจ…เจšเจพเจจเจ• เจ‡เจน เจชเจคเจพ เจšเจฒเจฟเจ† เจ•เจฟ เจนเจฐ เจœเจ—เฉเจนเจพ เจ•เฉเจ เจ“เจตเจฐเจฒเฉ‡เจ… เจธเจจ, เจœเฉ‹ เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ เจฆเฉเจ†เจฐเจพ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจธเฉ€. เจฎเฉ‡เจฐเจพ เจ…เจจเฉเจฎเจพเจจ เจนเฉˆ เจ•เจฟ เจ‡เจน เจธเจผเจพเจ‡เจฆ เจฌเจนเฉเจค เจฒเจšเจ•เจฆเจพเจฐ เจ…เจคเฉ‡ เจธเฉฐเจฐเจšเจจเจพเจฏเฉ‹เจ— เจนเฉˆ, เจชเจฐ เจฎเฉˆเจ‚ เจ˜เฉฑเจŸเฉ‹ เจ˜เฉฑเจŸ เจชเจนเจฟเจฒเจพเจ‚ เจ•เฉเจ เจšเจฒเจพเจ‰เจฃเจพ เจšเจพเจนเจพเจ‚เจ—เจพ ... เจ•เฉ€ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‰เจนเฉ€ เจšเฉ€เจœเจผ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจธเจฟเจฐเจซ เจธเจฐเจฒ เจ…เจคเฉ‡ เจตเจงเฉ‡เจฐเฉ‡ เจคเฉฐเจ— เจ•เจฐเจจ เจตเจพเจฒเฉ€? .. เจ‡เจน เจ‰เจฆเฉ‹เจ‚ เจนเฉ‹เจ‡เจ† เจœเจฆเฉ‹เจ‚ เจฎเฉˆเจ‚ เจชเจพเจฐ เจ†เจ‡เจ† vera.iofpga.FPGAChip เจฎเจพเจˆเจ•เฉเจฐเฉ‹เจธเฉ‡เจฎเฉ€ FPGAs เจฒเจˆ เจ…เจคเฉ‡ เจคเฉเจฐเฉฐเจค เจ‡เจธ เจจเฉ‚เฉฐ เจนเจตเจพเจฒเจฟเจ†เจ‚ เจฒเจˆ เจตเฉฑเจ– เจ•เจฐ เจฒเจฟเจ† เจ…เจคเฉ‡ เจธเจฎเจพเจจเจคเจพ เจฆเฉเจ†เจฐเจพ เจฎเฉ‡เจฐเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เฉ€เจคเฉ€, เจ–เฉเจธเจผเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจ˜เฉฑเจŸ เจœเจพเจ‚ เจ˜เฉฑเจŸ เจชเฉ‚เจฐเจพ โ€œเจฎเจฆเจฐเจฌเฉ‹เจฐเจก เจฒเฉ‡เจ†เจ‰เจŸโ€ เจนเฉˆเฅค

เจ‡เจน เจชเจคเจพ เจšเจฒเจฟเจ† เจ•เจฟ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ 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 เจเจฎเจฌเฉˆเจกเจก เจกเจฟเจตเจพเจˆเจธเจพเจ‚ เจฒเจˆ เจชเจฒเฉฑเจ—-เจเจ‚เจก-เจชเจฒเฉ‡ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจฆเจพ เจ‡เฉฑเจ• เจธเจฅเจฟเจฐ เจเจจเจพเจฒเจพเจ— เจนเฉˆ: 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
}

เจฐเจœเจฟเจธเจŸเจฐ เจšเฉ‡เจจ, เจ‡เจฎเจพเจจเจฆเจพเจฐ เจนเฉ‹เจฃ เจฒเจˆ, เจ…เจธเจฒ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ•เฉเจ เจนเฉ‹เจฐ เจธเจฅเจพเจจเจพเจ‚ เจจเจพเจฒ เจธเจฎเจพเจจเจคเจพ เจฆเฉเจ†เจฐเจพ เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจธเฉ€เฅค เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจธเฉฐเจญเจพเจตเจจเจพ เจนเฉˆ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจšเจพเจ‰เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจฎเฉˆเจŸเจพเจธเจŸเฉ‡เจฌเจฟเจฒเจŸเฉ€. เจธเจผเจพเจ‡เจฆ เจตเจฟเฉฑเจš เจ•เฉเฉฑเจ เจฌเจฒเจพเจ•เจพเจ‚ เจฆเฉ€ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ†เจชเจฃเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจนเฉˆ, เจชเจฐ เจชเจนเจฟเจฒเจพเจ‚ เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ "เจ‰เฉฑเจš-เจ—เฉเจฃเจตเฉฑเจคเจพ เจฆเฉ‡ เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจฒเจพเจ‚เจš เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚เฅค" เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจฆเจฟเจฒเจšเจธเจช เจธเจตเจพเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ MISO เจ…เจคเฉ‡ MOSI เจตเฉฑเจ–-เจตเฉฑเจ– เจ•เจฟเจ‰เจ‚ เจนเจจ dq? เจฎเฉˆเจจเฉ‚เฉฐ เจ…เจœเฉ‡ เจคเฉฑเจ• เจœเจตเจพเจฌ เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเจฟเจ† เจนเฉˆ, เจชเจฐ เจ…เจœเจฟเจนเจพ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจฌเจพเจ•เฉ€ เจ•เฉ‹เจก เจธเจฟเจฐเจซ เจ…เจœเจฟเจนเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ.

เจญเฉŒเจคเจฟเจ• เจคเฉŒเจฐ 'เจคเฉ‡, เจฎเฉˆเจ‚ เจฌเจฒเจพเจ• 'เจคเฉ‡ เจฎเฉเจซเจค เจธเฉฐเจชเจฐเจ•เจพเจ‚ เจฒเจˆ เจกเจฟเจœเจผเจพเจˆเจจ เจชเจฟเฉฐเจจ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเฉ‡ เจ…เจคเฉ‡ เจตเฉ‹เจฒเจŸเฉ‡เจœ เจšเฉ‹เจฃ เจœเฉฐเจชเจฐ เจจเฉ‚เฉฐ 3.3V 'เจคเฉ‡ เจญเฉ‡เจœ เจฆเจฟเฉฑเจคเจพเฅค

SD เจ…เจกเจพเจชเจŸเจฐ

เจ‰เฉฑเจชเจฐเฉ‹เจ‚ เจตเฉ‡เจ–เฉ‹:

เจญเจพเจ— 3: เจฒเจ—เจญเจ— เจฒเฉ‹เจก เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ Linux SD เจ•เจพเจฐเจก เจคเฉ‹เจ‚ RocketChip เจคเฉฑเจ•

เจนเฉ‡เจ เจฒเจพ เจฆเฉเจฐเจฟเจธเจผ:

เจญเจพเจ— 3: เจฒเจ—เจญเจ— เจฒเฉ‹เจก เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ Linux SD เจ•เจพเจฐเจก เจคเฉ‹เจ‚ RocketChip เจคเฉฑเจ•

เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจกเฉ€เจฌเฉฑเจ—เจฟเฉฐเจ—: เจŸเฉ‚เจฒ

เจชเจนเจฟเจฒเจพเจ‚, เจ†เจ“ เจ‰เจชเจฒเจฌเจง เจกเฉ€เจฌเจ—เจฟเฉฐเจ— เจŸเฉ‚เจฒเจธ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจธเฉ€เจฎเจพเจตเจพเจ‚ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเฉ€เจเฅค

เจฎเจฟเจจเฉ€เจ•เจพเจฎ

ะ’ะพ-ะฟะตั€ะฒั‹ั…, ะฝะฐะผ ะฑัƒะดะตั‚ ะฝัƒะถะฝะพ ะบะฐะบ-ั‚ะพ ั‡ะธั‚ะฐั‚ัŒ ั‚ะพ, ั‡ั‚ะพ ะฒั‹ะฒะพะดะธั‚ ะทะฐะณั€ัƒะทั‡ะธะบ ะธ ัะดั€ะพ. ะ”ะปั ัั‚ะพะณะพ ะฝะฐ Linux (ะฒ ะดะฐะฝะฝะพะผ ัะปัƒั‡ะฐะต โ€” ะฝะฐ ั‚ะพะผ, ั‡ั‚ะพ ะฝะฐ RaspberryPi) ะฝะฐะผ ะฟะพั‚ั€ะตะฑัƒะตั‚ัั ะฟั€ะพะณั€ะฐะผะผะฐ Minicom. ะ’ะพะพะฑั‰ะต ะณะพะฒะพั€ั, ะฟะพะดะพะนะดั‘ั‚ ะปัŽะฑะฐั ะฟั€ะพะณั€ะฐะผะผะฐ ะดะปั ั€ะฐะฑะพั‚ั‹ ั ะฟะพัะปะตะดะพะฒะฐั‚ะตะปัŒะฝั‹ ะฟะพั€ั‚ะพะผ.

เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจงเจฟเจ†เจจ เจฆเจฟเจ“ เจ•เจฟ เจœเจฆเฉ‹เจ‚ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจชเฉ‹เจฐเจŸ เจกเจฟเจตเจพเจˆเจธ เจฆเจพ เจจเจพเจฎ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเฉฑเจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ -D /dev/ttyS0 - เจตเจฟเจ•เจฒเจช เจฆเฉ‡ เจฌเจพเจ…เจฆ -D. เจ–เฉˆเจฐ, เจฎเฉเฉฑเจ– เจœเจพเจฃเจ•เจพเจฐเฉ€: เจฌเจพเจนเจฐ เจจเจฟเจ•เจฒเจฃ เจฒเจˆ, เจตเจฐเจคเฉ‹เจ‚ Ctrl-A, X. เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ•เฉ‡เจธ เจธเฉ€ เจœเจฆเฉ‹เจ‚ เจ‡เจน เจธเฉเจฎเฉ‡เจฒ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจธเฉ€ - เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจฌเจธ เจ‡เฉฑเจ• เจ—เฉเจ†เจ‚เจขเฉ€ SSH เจธเฉˆเจธเจผเจจ เจคเฉ‹เจ‚ เจ•เจนเจฟ เจธเจ•เจฆเฉ‡ เจนเฉ‹ killall -KILL minicom.

เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจนเฉˆ. เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡, RaspberryPi เจฆเฉ‡ เจฆเฉ‹ UARTs เจนเจจ, เจ…เจคเฉ‡ เจฆเฉ‹เจตเฉ‡เจ‚ เจชเฉ‹เจฐเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ•เจฟเจธเฉ‡ เจšเฉ€เจœเจผ เจฒเจˆ เจ…เจจเฉเจ•เฉ‚เจฒเจฟเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ: เจ‡เฉฑเจ• เจฌเจฒเฉ‚เจŸเฉเฉฑเจฅ เจฒเจˆ, เจฆเฉ‚เจœเจพ เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ•เจฐเจจเจฒ เจ•เฉฐเจธเฉ‹เจฒ เจจเฉ‚เฉฐ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ–เฉเจธเจผเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจ‡เจธ เจตเจฟเจตเจนเจพเจฐ เจจเฉ‚เฉฐ เจ“เจตเจฐเจฐเจพเจˆเจก เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจ‡เจธ เจฎเฉˆเจจเฉ‚เจ…เจฒ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ.

เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจฎเฉเฉœ เจฒเจฟเจ–เจฃเจพ

เจกเฉ€เจฌเฉฑเจ—เจฟเฉฐเจ— เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจ‡เฉฑเจ• เจ…เจจเฉเจฎเจพเจจ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ, เจฎเฉˆเจจเฉ‚เฉฐ เจ•เจˆ เจตเจพเจฐ เจ•เจฐเจจเจพ เจชเฉˆเจ‚เจฆเจพ เจธเฉ€ เจฌเฉ‚เจŸเจฒเฉ‹เจกเจฐ เจฒเฉ‹เจก เจ•เจฐเฉ‹ (เจ…เจซเจธเฉ‹เจธ) เจนเฉ‹เจธเจŸ เจคเฉ‹เจ‚ เจธเจฟเฉฑเจงเจพ RAM เจตเจฟเฉฑเจš. เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจธเจฟเฉฑเจงเฉ‡ GDB เจคเฉ‹เจ‚ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจฎเจพเจฐเจ— เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เฉ€เจคเฉ€: เจฎเฉˆเจ‚ เจฐเจพเจธเจฌเฉ‡เจฐเฉ€ เจตเจฟเฉฑเจš เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจซเจพเจˆเจฒ เจฆเฉ€ เจจเจ•เจฒ เจ•เฉ€เจคเฉ€, SSH (เจ“เจชเจจเจ“เจธเฉ€เจกเฉ€ เจคเฉ‹เจ‚ เจŸเฉ‡เจฒเจจเฉˆเฉฑเจŸ) เจฆเฉเจ†เจฐเจพ เจชเฉ‹เจฐเจŸ 4444 เจจเฉ‚เฉฐ เจตเฉ€ เจ…เฉฑเจ—เฉ‡ เจญเฉ‡เจœเจฟเจ† เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€เฅค load_image. เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจ‡เจน เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจ…เจœเจฟเจนเจพ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจธเจญ เจ•เฉเจ เจœเฉฐเจฎ เจ—เจฟเจ† เจนเฉˆ, เจชเจฐ เจ…เจธเจฒ เจตเจฟเฉฑเจš "เจ‡เจน เจจเฉ€เจ‚เจฆ เจจเจนเฉ€เจ‚ เจ†เจ‰เจ‚เจฆเฉ€, เจ‡เจน เจนเฉŒเจฒเฉ€ เจนเฉŒเจฒเฉ€ เจเจชเจ•เจฆเฉ€ เจนเฉˆ": เจ‡เจน เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจฆเจพ เจนเฉˆ, เจ‡เจน เจธเจฟเจฐเจซ เจ•เฉเจ เจ•เจฟเจฒเฉ‹เจฌเจพเจˆเจŸ เจชเฉเจฐเจคเฉ€ เจธเจ•เจฟเฉฐเจŸ เจฆเฉ€ เจ—เจคเฉ€ เจจเจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจฌเจฐเฉ‡เจ•เจชเฉเจ†เจ‡เฉฐเจŸ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚

เจจเจฟเจฏเจฎเจค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจกเฉ€เจฌเฉฑเจ— เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฒเฉ‹เจ•เจพเจ‚ เจจเฉ‚เฉฐ เจธเจผเจพเจ‡เจฆ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจธเฉ‹เจšเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจฌเจฐเฉ‡เจ•เจชเฉเจ†เจ‡เฉฐเจŸ เจนเจฎเฉ‡เจธเจผเจพ เจนเจพเจฐเจกเจตเฉ‡เจ…เจฐ เจตเจฟเฉฑเจš เจธเฉˆเฉฑเจŸ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจ•เจˆ เจตเจพเจฐ เจฌเฉเจฐเฉ‡เจ•เจชเฉเจ†เจ‡เฉฐเจŸ เจธเฉˆเจŸ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจ…เจธเจฅเจพเจˆ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจนเฉ€ เจœเจ—เฉเจนเจพ 'เจคเฉ‡ เจตเจฟเจธเจผเฉ‡เจธเจผ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃเจพ เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจธเจฟเฉฑเจงเฉ‡ เจฎเจธเจผเฉ€เจจ เจ•เฉ‹เจก เจตเจฟเฉฑเจš. เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฎเฉ‡เจฐเฉ€ เจธเจŸเฉˆเจ‚เจกเจฐเจก เจ•เจฎเจพเจ‚เจก เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ€ เจนเฉˆ b GDB เจตเจฟเฉฑเจšเฅค เจ‡เฉฑเจฅเฉ‡ เจ•เฉ€ เจนเฉˆ:

  • เจคเฉเจธเฉ€เจ‚ BootROM เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ‡เฉฑเจ• เจฌเจฟเฉฐเจฆเฉ€ เจจเจนเฉ€เจ‚ เจฒเจ—เจพ เจธเจ•เจฆเฉ‡ เจ•เจฟเจ‰เจ‚เจ•เจฟ ROM
  • เจคเฉเจธเฉ€เจ‚ SD เจ•เจพเจฐเจก เจคเฉ‹เจ‚ RAM เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจ•เฉ‹เจก 'เจคเฉ‡ เจ‡เฉฑเจ• เจฌเฉเจฐเฉ‡เจ•เจชเฉเจ†เจ‡เฉฐเจŸ เจธเฉˆเจŸ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจชเจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธ เจฆเฉ‡ เจฒเฉ‹เจก เจนเฉ‹เจฃ เจคเฉฑเจ• เจ‰เจกเฉ€เจ• เจ•เจฐเจจเฉ€ เจชเจตเฉ‡เจ—เฉ€เฅค เจจเจนเฉ€เจ‚ เจคเจพเจ‚, เจ…เจธเฉ€เจ‚ เจ•เฉ‹เจก เจฆเฉ‡ เจŸเฉเจ•เฉœเฉ‡ เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจจเจนเฉ€เจ‚ เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡, เจชเจฐ เจฒเฉ‹เจกเจฐ เจธเจพเจกเฉ‡ เจฌเฉเจฐเฉ‡เจ•เจชเฉเจ†เจ‡เฉฐเจŸ เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ– เจฆเฉ‡เจตเฉ‡เจ—เจพ

เจฎเฉˆเจจเฉ‚เฉฐ เจฏเจ•เฉ€เจจ เจนเฉˆ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจนเจพเจฐเจกเจตเฉ‡เจ…เจฐ เจฌเฉเจฐเฉ‡เจ•เจชเฉเจ†เจ‡เฉฐเจŸเจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ เจ•เจนเจฟ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจชเจฐ เจซเจฟเจฐ เจตเฉ€ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจธเฉ€เจฎเจค เจนเฉˆเฅค

เจคเฉ‡เจœเจผ BootROM เจคเจฌเจฆเฉ€เจฒเฉ€

เจกเฉ€เจฌเฉฑเจ—เจฟเฉฐเจ— เจฆเฉ‡ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจชเฉœเจพเจ… 'เจคเฉ‡, เจ…เจ•เจธเจฐ เจฌเฉ‚เจŸเจฐเฉ‹เจฎ เจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐเจจ เจ…เจคเฉ‡ เจฆเฉเจฌเจพเจฐเจพ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจ เจฆเฉ€ เจ‡เฉฑเจ›เจพ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจชเจฐ เจ‡เฉฑเจ• เจธเจฎเฉฑเจธเจฟเจ† เจนเฉˆ: BootROM FPGA เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจ—เจ เจกเจฟเจœเจผเจพเจˆเจจ เจฆเจพ เจนเจฟเฉฑเจธเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจธเจฆเจพ เจธเฉฐเจธเจฒเฉ‡เจธเจผเจฃ เจ•เฉเจ เจฎเจฟเฉฐเจŸเจพเจ‚ เจฆเจพ เจฎเจพเจฎเจฒเจพ เจนเฉˆ (เจ…เจคเฉ‡ เจ‡เจน C เจ…เจคเฉ‡ เจ…เจธเฉˆเจ‚เจฌเจฒเจฐ เจคเฉ‹เจ‚ BootROM เจšเจฟเฉฑเจคเจฐ เจฆเฉ‡ เจฒเจ—เจญเจ— เจคเฉเจฐเฉฐเจค เจธเฉฐเจ•เจฒเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจนเฉˆ...)เฅค เจ–เฉเจธเจผเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจ…เจธเจฒ เจตเจฟเฉฑเจš เจธเจญ เจ•เฉเจ เจฌเจนเฉเจค เจคเฉ‡เจœเจผ: เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจฆเจพ เจ•เฉเจฐเจฎ เจ‡เจธ เจชเฉเจฐเจ•เจพเจฐ เจนเฉˆ:

  • regenerate bootrom.mif (เจฎเฉˆเจ‚ HEX เจฆเฉ€ เจฌเจœเจพเจ MIF 'เจคเฉ‡ เจธเจตเจฟเจš เจ•เฉ€เจคเจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฎเฉˆเจจเฉ‚เฉฐ เจนเจฎเฉ‡เจธเจผเจพ HEX เจจเจพเจฒ เจ•เฉเจ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจธเจจ, เจ…เจคเฉ‡ MIF Alter เจฆเจพ เจฎเฉ‚เจฒ เจซเจพเจฐเจฎเฉˆเจŸ เจนเฉˆ)
  • Quartus เจตเจฟเฉฑเจš เจ•เจนเจฟเฉฐเจฆเฉ‡ เจนเจจ Processing -> Update Memory Initialization File
  • เจ…เจธเฉˆเจ‚เจฌเจฒเจฐ เจ†เจˆเจŸเจฎ 'เจคเฉ‡ (เจŸเจพเจธเจ• เจฆเฉ‡ เจ–เฉฑเจฌเฉ‡ เจ•เจพเจฒเจฎ เจตเจฟเฉฑเจš) เจ•เจฎเจพเจ‚เจก เจฆเฉเจฌเจพเจฐเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ‹

เจนเจฐ เจšเฉ€เจœเจผ เจฌเจพเจฐเฉ‡ เจธเจญ เจ•เฉเจ - เจธเจ•เจฟเฉฐเจŸ เจฆเฉ‡ เจ‡เฉฑเจ• เจœเฉ‹เฉœเฉ‡ เจจเฉ‚เฉฐ.

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 เจตเจฟเฉฑเจš เจซเจพเจฐเจฎเฉˆเจŸ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจฆเฉ‹ เจนเฉ‹เจฐ เจญเจพเจ— - เจฐเจนเฉฑเจธเจฎเจˆ: เจฏเฉ‚-เจฌเฉ‚เจŸ เจ‡เฉฑเจ• 'เจคเฉ‡ เจฐเจนเจฟเฉฐเจฆเจพ เจนเฉˆ (เจ‡เจธเจฆเจพ เจ†เจซเจธเฉˆเฉฑเจŸ, เจœเจฟเฉฑเจฅเฉ‹เจ‚ เจคเฉฑเจ• เจฎเฉˆเจ‚ เจธเจฎเจเจฆเจพ เจนเจพเจ‚, เจฌเฉ‚เจŸเจฐเฉ‹เจฎ เจตเจฟเฉฑเจš เจนเจพเจฐเจกเจ•เฉ‹เจก เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ), เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡, เจ…เจœเจฟเจนเจพ เจฒเจ—เจฆเจพ เจนเฉˆ, เจ‡เจธเจฆเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฐเจนเจฟเฉฐเจฆเฉ‡ เจนเจจ, เจชเจฐ เจฎเฉˆเจ‚ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเจพเจ‚เฅค

เจชเจนเจฟเจฒเจพ เจชเฉฑเจงเจฐ, BootROM

เจชเฉเจฐเจธเจฟเฉฑเจง เจธเจฟเจ†เจฃเจช เจ•เจนเจฟเฉฐเจฆเฉ€ เจนเฉˆ: "เจœเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจŸเฉˆเจ‚เจฌเฉ‹เจฐเฉ€เจจ เจจเจพเจฒ เจจเฉฑเจšเจฃเจพ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจฒเฉˆเจ•เจŸเฉเจฐเฉ‹เจจเจฟเจ•เจธ เจตเจฟเฉฑเจš เจ…เฉฑเจ— เจฌเฉเจเจพเจ‰เจฃ เจตเจพเจฒเฉ‡ เจจเจพเจฒ เจจเฉฑเจšเจฃเจพ เจตเฉ€ เจนเฉˆ." เจ‡เจน เจ‡เจธ เจคเฉฑเจฅ เจฌเจพเจฐเฉ‡ เจตเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ•เจฟ เจ‡เฉฑเจ• เจตเจพเจฐ เจฎเฉˆเจ‚ เจฌเฉ‹เจฐเจก เจจเฉ‚เฉฐ เจฒเจ—เจญเจ— เจธเจพเฉœ เจฆเจฟเฉฑเจคเจพ, เจ‡เจน เจซเฉˆเจธเจฒเจพ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เจฟ "เจ เฉ€เจ• เจนเฉˆ, GND เจ‰เจนเฉ€ เจจเฉ€เจตเจพเจ‚ เจชเฉฑเจงเจฐ เจนเฉˆเฅค" (เจœเจผเจพเจนเจฐ เจนเฉˆ, เจ‡เฉฑเจ• เจฐเฉ‹เจงเจ• เจธเจญ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฆเฉเจ–เฉ€ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ ...) เจ‡เจน เจ‡เจธ เจคเฉฑเจฅ เจฌเจพเจฐเฉ‡ เจตเจงเฉ‡เจฐเฉ‡ เจนเฉˆ เจ•เจฟ เจœเฉ‡เจ•เจฐ เจนเฉฑเจฅ เจ‰เฉฑเจฅเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจตเจงเจฆเฉ‡, เจคเจพเจ‚ เจ‡เจฒเฉˆเจ•เจŸเฉเจฐเฉ‹เจจเจฟเจ•เจธ เจ•เจฆเฉ‡ เจตเฉ€ เจนเฉˆเจฐเจพเจจเฉ€ เจฒเจฟเจ†เจ‰เจฃเจพ เจฌเฉฐเจฆ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ: เจœเจฆเฉ‹เจ‚ เจ•เจจเฉˆเจ•เจŸเจฐ เจจเฉ‚เฉฐ เจฌเฉ‹เจฐเจก 'เจคเฉ‡ เจธเฉ‹เจฒเจกเจฐ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจฎเฉˆเจ‚ เจ…เจœเฉ‡ เจตเฉ€ เจธเฉฐเจชเจฐเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจธเจนเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจธเฉ‹เจฒเจกเจฐ เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฟเจ† - เจตเฉ€เจกเฉ€เจ“ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจธเฉ‹เจฒเจกเจฐ เจธเจฟเฉฑเจงเฉ‡ เจ•เจฟเจตเฉ‡เจ‚ เจซเฉˆเจฒเจฆเจพ เจนเฉˆ เจชเฉ‚เจฐเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจ‰เฉฑเจคเฉ‡, เจฌเจธ เจ‡เฉฑเจ• เจธเฉ‹เจฒเจกเจฐเจฟเฉฐเจ— เจ†เจ‡เจฐเจจ เจฒเจ—เจพเจ“, เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ, เจ‰เจธเจจเฉ‡ เจฌเฉ‡เจคเจฐเจคเฉ€เจฌเฉ‡ "เจฅเฉฑเจชเฉœ" เจฎเจพเจฐเจฟเจ†เฅค เจ–เฉˆเจฐ, เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจ•เจฟ เจธเฉ‹เจฒเจกเจฐ เจธเฉ‹เจฒเจกเจฐเจฟเฉฐเจ— เจ†เจ‡เจฐเจจ เจฆเฉ‡ เจคเจพเจชเจฎเจพเจจ เจฒเจˆ เจขเฉเจ•เจตเจพเจ‚ เจจเจนเฉ€เจ‚ เจธเฉ€, เจธเจผเจพเจ‡เจฆ เจ•เฉเจ เจนเฉ‹เจฐ... เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจœเจฆเฉ‹เจ‚ เจฎเฉˆเจ‚ เจฆเฉ‡เจ–เจฟเจ† เจ•เจฟ เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‡เฉฑเจ• เจฆเจฐเจœเจจ เจธเฉฐเจชเจฐเจ• เจนเจจ, เจฎเฉˆเจ‚ เจนเจพเจฐ เจฎเฉฐเจจ เจฒเจˆ เจ…เจคเฉ‡ เจกเฉ€เจฌเฉฑเจ— เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฆเจฟเฉฑเจคเจพเฅค เจ…เจคเฉ‡ เจซเจฟเจฐ เจ‡เจน เจธเจผเฉเจฐเฉ‚ เจนเฉ‹เจ‡เจ† เจฐเจนเฉฑเจธเจฎเจˆ: เจฎเฉˆเจ‚ UART เจคเฉ‹เจ‚ RX/TX เจ•เจจเฉˆเจ•เจŸ เจ•เฉ€เจคเจพ, เจฎเฉˆเจ‚ เจซเจฐเจฎเจตเฉ‡เจ…เจฐ เจฒเฉ‹เจก เจ•เจฐเจฆเจพ เจนเจพเจ‚ - เจ‡เจน เจ•เจนเจฟเฉฐเจฆเจพ เจนเฉˆ

INIT
CMD0
ERROR

เจ–เฉˆเจฐ, เจธเจญ เจ•เฉเจ เจคเจฐเจ•เจชเฉ‚เจฐเจจ เจนเฉˆ - เจฎเฉˆเจ‚ SD เจ•เจพเจฐเจก เจฎเฉ‹เจกเฉ€เจŠเจฒ เจจเฉ‚เฉฐ เจ•เจจเฉˆเจ•เจŸ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ. เจ…เจธเฉ€เจ‚ เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจซเจฐเจฎเจตเฉ‡เจ…เจฐ เจฒเฉ‹เจก เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚... เจ…เจคเฉ‡ เจšเฉเฉฑเจช... เจฎเฉˆเจ‚ เจ†เจชเจฃเจพ เจฎเจจ เจ•เจฟเจ‰เจ‚ เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเจฟเจ†, เจชเจฐ เจฌเจพเจ•เจธ เจนเฉเจฃเฉ‡ เจ–เฉเฉฑเจฒเฉเจนเจฟเจ† เจนเฉˆ: เจ‡เฉฑเจ• เจฎเฉ‹เจกเฉ€เจŠเจฒ เจชเจฟเฉฐเจจ เจจเฉ‚เฉฐ VCC เจจเจพเจฒ เจ•เจจเฉˆเจ•เจŸ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจธเฉ€เฅค เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจฎเฉ‹เจกเฉ€เจŠเจฒ เจจเฉ‡ เจชเจพเจตเจฐ เจธเจชเจฒเจพเจˆ เจฒเจˆ 5V เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เฉ€เจคเจพ, เจ‡เจธเจฒเจˆ เจฌเจฟเจจเจพเจ‚ เจฆเฉ‹ เจตเจพเจฐ เจธเฉ‹เจšเฉ‡, เจฎเฉˆเจ‚ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจคเฉ‹เจ‚ เจฌเฉ‹เจฐเจก เจฆเฉ‡ เจ‰เจฒเจŸ เจชเจพเจธเฉ‡ เจตเฉฑเจฒ เจ†เจ‰เจฃ เจตเจพเจฒเฉ€ เจคเจพเจฐ เจจเฉ‚เฉฐ เจชเจฒเฉฑเจ— เจ•เฉ€เจคเจพเฅค เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจŸเฉ‡เจขเฉ‡ เจขเฉฐเจ— เจจเจพเจฒ เจธเฉ‹เจฒเจก เจ•เฉ€เจคเจพ เจ•เฉเจจเฉˆเจ•เจŸเจฐ เจคเจฟเฉฑเจ–เจพ เจนเฉ‹ เจ—เจฟเจ†, เจ…เจคเฉ‡ UART เจธเฉฐเจชเจฐเจ• เจฌเจธ เจ—เฉเฉฐเจฎ เจนเฉ‹ เจ—เจฟเจ† เจธเฉ€เฅค facepalm.jpg เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, "เจฌเฉเจฐเจพ เจธเจฟเจฐ เจฒเฉฑเจคเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจฐเจพเจฎ เจจเจนเฉ€เจ‚ เจฆเจฟเฉฐเจฆเจพ," เจ…เจคเฉ‡ เจŸเฉ‡เจขเฉ‡ เจนเฉฑเจฅ เจธเจฟเจฐ เจจเฉ‚เฉฐ เจ†เจฐเจพเจฎ เจจเจนเฉ€เจ‚ เจฆเจฟเฉฐเจฆเฉ‡ ...

เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจฎเฉˆเจ‚ เจฒเฉฐเจฌเฉ‡ เจธเจฎเฉ‡เจ‚ เจคเฉ‹เจ‚ เจ‰เจกเฉ€เจ•เจฟเจ† เจฆเฉ‡เจ–เจฟเจ†

INIT
CMD0
CMD8
ACMD41
CMD58
CMD16
CMD18
LOADING /

เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ‡เจน เจนเจฟเจฒเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฒเฉ‹เจกเจฟเฉฐเจ— เจ‡เฉฐเจกเฉ€เจ•เฉ‡เจŸเจฐ เจธเจชเจฟเจจ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจฎเฉˆเจจเฉ‚เฉฐ เจคเฉเจฐเฉฐเจค เจฎเฉ‡เจฐเฉ‡ เจธเจ•เฉ‚เจฒ เจฆเฉ‡ เจฆเจฟเจจ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจซเจฒเจพเจชเฉ€ เจกเจฟเจธเจ• เจคเฉ‹เจ‚ MinuetOS เจฆเฉ€ เจ†เจฐเจพเจฎ เจจเจพเจฒ เจฒเฉ‹เจกเจฟเฉฐเจ— เจฏเจพเจฆ เจนเฉˆเฅค เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจกเจฐเจพเจˆเจต เจชเฉ€เจธ เจจเจนเฉ€เจ‚ เจœเจพเจ‚เจฆเฉ€เฅค

เจธเจฎเฉฑเจธเจฟเจ† เจ‡เจน เจนเฉˆ เจ•เจฟ BOOT เจธเฉฐเจฆเฉ‡เจธเจผ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพเฅค เจ‡เจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ“เจชเจจเจ“เจธเฉ€เจกเฉ€ เจฆเฉเจ†เจฐเจพ เจฐเจพเจธเจฌเฉ‡เจฐเฉ€ เจคเฉ‹เจ‚, เจนเฉ‹เจธเจŸ 'เจคเฉ‡ GDB เจจเจพเจฒ เจœเฉเฉœเจจ เจฆเจพ เจธเจฎเจพเจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจฆเฉ‡เจ–เฉ‹ เจ•เจฟ เจ‡เจน เจ•เฉ€ เจนเฉˆเฅค

เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, GDB เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เจจเฉˆเจ•เจŸ เจ•เจฐเจจเจพ เจคเฉเจฐเฉฐเจค เจฆเจฟเจ–เจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ $pc (เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจพเจŠเจ‚เจŸเจฐ, เจฎเฉŒเจœเฉ‚เจฆเจพ เจนเจฆเจพเจ‡เจค เจฆเจพ เจชเจคเจพ) เจฒเจˆ เจ‰เฉฑเจกเจฆเจพ เจนเฉˆ 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;
 }

เจ…เจœเจฟเจนเฉ‡ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจ•เฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ "เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ—เจคเจพ เจฒเจˆ" เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ: เจฎเฉˆเจ‚ เจ•เจฟเจคเฉ‡ เจธเฉเจฃเจฟเจ† เจนเฉˆ เจ•เจฟ เจ‡เฉฑเจ• เจฌเฉ‡เจ…เฉฐเจค เจฒเฉ‚เจช เจ‡เฉฑเจ• เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจตเจฟเจตเจนเจพเจฐ เจนเฉˆ, เจชเจฐ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจฆเจพ เจ…เจจเฉเจฎเจพเจจ เจฒเจ—เจพเจ‰เจฃ เจฆเฉ€ เจธเฉฐเจญเจพเจตเจจเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ (เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจ‚เจฆเจพ เจนเจพเจ‚ เจ•เจฟ 0x10000 เจธเจฅเจฟเจค BootROM).

เจญเจพเจ— 3: เจฒเจ—เจญเจ— เจฒเฉ‹เจก เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ Linux SD เจ•เจพเจฐเจก เจคเฉ‹เจ‚ RocketChip เจคเฉฑเจ•

เจ‡เจน เจœเจพเจชเจฆเจพ เจนเฉˆ, เจนเฉ‹เจฐ เจ•เฉ€ เจ‰เจฎเฉ€เจฆ เจ•เจฐเจจเฉ€ เจนเฉˆ - เจ•เจ เฉ‹เจฐ เจเจฎเจฌเฉ‡เจก, เจ•เจฟเจธ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจนเจจ? เจชเจฐ เจตเจฟเฉฑเจš เจ‰เจน เจฒเฉ‡เจ– เจฒเฉ‡เจ–เจ• เจธเฉ€ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจกเฉ€เจฌเฉฑเจ— เจ•เจฐ เจฐเจฟเจนเจพ เจธเฉ€... 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 เจ•เจพเจฐเจก เจคเฉ‹เจ‚ RocketChip เจคเฉฑเจ•

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ MIF เจซเจผเจพเจˆเจฒ เจœเจพเจ‚ เจฌเจฟเจจ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚, เจธเจ—เฉ‹เจ‚ ELF เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจ…เจธเจฒ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค

เจนเฉเจฃ เจคเฉเจธเฉ€เจ‚ nเจตเฉ€เจ‚ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจจเจพเจฒ เจชเจคเจพ เจฒเจ—เจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเจฟเฉฑเจฅเฉ‡ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจœเจพเจฐเฉ€ เจฐเจนเฉ‡เจ—เจพ (เจ‡เจน เจ‡เจ• เจนเฉ‹เจฐ เจ•เจพเจฐเจจ เจนเฉˆ เจ•เจฟ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจจเฉ‚เฉฐ เจ‡เจน เจ…เจจเฉเจฎเจพเจจ เจจเจนเฉ€เจ‚ เจฒเจ—เจพเจ‰เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจธเฉ€ เจ•เจฟ เจฒเฉ‚เจช เจ…เจจเฉฐเจค เจนเฉˆ)เฅค เจŸเฉ€เจฎ

set variable $pc=0xADDR

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจซเจฒเจพเจˆ 'เจคเฉ‡ เจฐเจœเจฟเจธเจŸเจฐ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ (เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจฎเฉŒเจœเฉ‚เจฆเจพ เจนเจฆเจพเจ‡เจค เจฆเจพ เจชเจคเจพ)เฅค เจ‡เจธเจฆเฉ€ เจฎเจฆเจฆ เจจเจพเจฒ, เจคเฉเจธเฉ€เจ‚ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ (เจ…เจคเฉ‡ เจฎเฉˆเจฎเฉ‹เจฐเฉ€-เจฎเฉˆเจชเจก เจฐเจœเจฟเจธเจŸเจฐเจพเจ‚) เจตเจฟเฉฑเจš เจฒเจฟเจ–เฉ‡ เจฎเฉเฉฑเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฆเจฒ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจ†เจ–เจฐเจ•เจพเจฐ, เจฎเฉˆเจ‚ เจ‡เจธ เจธเจฟเฉฑเจŸเฉ‡ 'เจคเฉ‡ เจชเจนเฉเฉฐเจšเจฟเจ† (เจชเฉฑเจ•เจพ เจจเจนเฉ€เจ‚ เจ•เจฟ เจ•เจฟเจนเฉœเจพ เจธเจนเฉ€ เจนเฉˆ) เจ•เจฟ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ "เจ—เจฒเจค เจธเจฟเจธเจŸเจฎ เจฆเจพ เจ‡เฉฑเจ• 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 เจฒเจฟเจ† เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฌเฉ‡เจคเจฐเจคเฉ€เจฌเฉ‡ เจฎเฉ‡เจ•เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจฆเจฟเฉฑเจคเจพเฅค DEMO_END=11718750 'เจคเฉ‡ DEMO_END=3078900 (เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจ…เจฐเจฅ เจตเจฟเฉฑเจš เจ…เจฐเจฅ เจจเจพ เจฒเฉฑเจญเฉ‹ - เจ‡เฉฑเจฅเฉ‡ เจ•เฉ‹เจˆ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจฌเฉฑเจธ เจ‡เจน เจนเฉˆ เจ•เจฟ เจนเฉเจฃ เจšเจฟเฉฑเจคเจฐ เจ•เจพเจฐเจก 'เจคเฉ‡ เจฐเฉฑเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆ)เฅค

เจชเฉฑเจงเจฐ เจฆเฉ‹, เจฏเฉ‚-เจฌเฉ‚เจŸ

เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจ…เจœเฉ‡ เจตเฉ€ "เจกเจฟเฉฑเจ— เจฐเจนเฉ‡ เจนเจพเจ‚", เจชเจฐ เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเจนเฉ€ เจœเจ—เฉเจนเจพ 'เจคเฉ‡ เจนเจพเจ‚ 0x0000000080089a84. เจ‡เฉฑเจฅเฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเจจเจพ เจชเจเจ—เจพ: เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจชเฉ‡เจธเจผเจ•เจพเจฐเฉ€ "เจธเจพเจฐเฉ‡ เจธเจŸเจพเจชเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ" เจจเจนเฉ€เจ‚ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจชเจฐ เจ…เฉฐเจธเจผเจ• เจคเฉŒเจฐ 'เจคเฉ‡ "เจฌเจพเจ…เจฆ" เจฒเจฟเจ–เฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจ‡เฉฑเจฅเฉ‡ เจฎเฉˆเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเจพเจกเฉ‡ SoC เจคเฉ‹เจ‚ เจธเจนเฉ€ dtb เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจธเฉฐเจฎเจฟเจฒเจฟเจค เจ•เจฐเจจ เจตเจฟเฉฑเจš เจชเฉเจฐเจฌเฉฐเจงเจฟเจค เจ•เฉ€เจคเจพ เจนเฉˆ, เจ‡เจธเจจเฉ‚เฉฐ เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจตเจฟเฉฑเจš เจ เฉ€เจ• เจ•เจฐเฉ‹ 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 (เจฏเฉ‚-เจฌเฉ‚เจŸ เจฆเจพ เจเจ‚เจŸเจฐเฉ€ เจชเฉเจ†เจ‡เฉฐเจŸ), เจ…เจคเฉ‡ เจ†เจ“ เจ‰เจฎเฉ€เจฆ เจ•เจฐเฉ€เจ เจ•เจฟ เจ‡เจธ เจจเฉ‚เฉฐ เจœเฉฐเจช เจ•เจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจฐเจœเจฟเจธเจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเจนเฉ€ เจขเฉฐเจ— เจจเจพเจฒ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ... เจฒเฉฑเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ:

(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

เจธเจŸเฉˆเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจ‡เฉฐเจจเจพ เจนเฉˆ, เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡: เจ‡เจน 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 เจ†เจˆ เจนเฉ‹เจˆ เจ…เจชเจตเจพเจฆ เจฌเจพเจฐเฉ‡ เจกเฉ€เจฌเจ—เจฟเฉฐเจ— เจœเจพเจฃเจ•เจพเจฐเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจ‰เจน เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเจพ. เจ‡เจธ เจฒเจˆ, เจ•เจฟเจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจธเจพเจกเฉ‡ เจธเจฐเฉ‹เจค เจฆเฉเจฌเจพเจฐเจพ เจจเจนเฉ€เจ‚ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ. set directories ../freedom-u-sdk/HiFive_U-Boot/ เจฌเจพเจฐเฉ‡! เจนเฉเจฃ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค!

เจ–เฉˆเจฐ, เจšเจฒเฉ‹ เจ‡เจธเจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจธเจŸเฉˆเจ• เจŸเฉเจฐเฉ‡เจธ เจคเฉ‹เจ‚ เจ…เจธเจฒเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจฆเฉ‡ เจ•เจพเจฐเจจ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ เจœเจฟเจธ เจจเจพเจฒ เจชเจนเจฟเจฒเฉ€ เจ—เจฒเจคเฉ€ เจนเฉ‹เจˆ เจธเฉ€ (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. เจ•เจฟเจธเฉ‡ เจธเจฎเฉ‡เจ‚ เจฎเฉˆเจ‚ เจ‡เจน เจตเฉ€ เจธเฉ‹เจšเจฟเจ† เจธเฉ€, เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ, เจ เฉ€เจ• เจนเฉˆ, เจฎเฉˆเจจเฉ‚เฉฐ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจฒเจˆ เจ‡เฉฑเจ• เจฌเฉ‚เจŸ เจฒเฉ‹เจกเจฐ เจœเฉ‹เฉœเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ - เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจ•เจฟ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจจเฉ‚เฉฐ เจฅเฉ‹เฉœเจพ เจœเจฟเจนเจพ เจ เฉ€เจ• เจ•เจฐเจจเจพ เจธเฉŒเจ–เจพ เจนเฉ‹ เจœเจพเจตเฉ‡? เจชเจฐ เจซเจฟเจฐ เจฎเฉˆเจ‚ เจฆเฉ‡เจ–เจฟเจ† เจ•เจฟ เจ‡เจน เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจฎเฉเจ•เฉฐเจฎเจฒ เจจเจพ เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจ•เจฒเจพเจคเจฎเจ• เจšเฉ€เจœเจผ เจตเจฐเจ—เจพ เจธเฉ€#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 <anatoly.trosinenko@gmail.com>
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, เจฌเฉ‚เจŸ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจ…เจธเจซเจฒ, เจ…เจคเฉ‡ เจฏเฉ‚-เจฌเฉ‚เจŸ เจคเฉเจฐเฉฐเจค เจชเฉŒเจช เจ…เฉฑเจช เจนเฉ‹ เจ—เจฟเจ†เฅค เจ‡เจน เจ‰เจฆเฉ‹เจ‚ เจธเฉ€ เจœเจฆเฉ‹เจ‚ เจ‡เจน เจฎเฉ‡เจฐเฉ‡ 'เจคเฉ‡ เจ† เจ—เจฟเจ†: เจœเจผเจพเจนเจฐ เจคเฉŒเจฐ 'เจคเฉ‡, FPGA เจตเจฟเฉฑเจš เจฌเจฟเฉฑเจŸเจธเจŸเฉเจฐเฉ€เจฎ เจจเฉ‚เฉฐ เจฐเฉ€เจฌเฉ‚เจŸ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจฎเจฟเจŸเจฆเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เจธ เจ•เฉ‹เจฒ "เจ…เจจเจŸเฉเจฐเฉ‡เจจ" เจ•เจฐเจจ เจฆเจพ เจธเจฎเจพเจ‚ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ†เจฆเจฟ. เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš, เจคเฉเจธเฉ€เจ‚ เจธเจฟเจฐเจซเจผ เจ‰เจฆเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเจฆเฉ‹เจ‚ เจ•เฉ‹เจˆ เจธเฉเจจเฉ‡เจนเจพ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ LOADING / เจกเฉ€เจฌเฉฑเจ—เจฐ เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจจเจพเจฒ เจœเฉเฉœเฉ‹ set variable $pc=0x80089800, เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ‡เจธ เจฒเฉฐเจฌเฉ‡ เจฒเฉ‹เจกเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจฌเจพเจˆเจชเจพเจธ เจ•เจฐเจจเจพ (เจฌเฉ‡เจธเจผเจ•, เจ‡เจธ เจงเจพเจฐเจจเจพ 'เจคเฉ‡ เจ•เจฟ เจชเจฟเจ›เจฒเฉ€ เจตเจพเจฐ เจ‡เจน เจฌเจนเฉเจค เจœเจฒเจฆเฉ€ เจŸเฉเฉฑเจŸ เจ—เจฟเจ† เจธเฉ€ เจ•เจฟ เจ‡เจธ เจ•เฉ‹เจฒ เจ…เจธเจฒ เจ•เฉ‹เจก เจฆเฉ‡ เจธเจฟเจ–เจฐ 'เจคเฉ‡ เจ•เฉเจ เจตเฉ€ เจฒเฉ‹เจก เจ•เจฐเจจ เจฆเจพ เจธเจฎเจพเจ‚ เจจเจนเฉ€เจ‚ เจธเฉ€)เฅค

เจตเฉˆเจธเฉ‡, เจ•เฉ€ เจ‡เจน เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจงเจพเจฐเจฃ เจนเฉˆ เจ•เจฟ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจซเฉเจฐเฉ€เจœเจผ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ JTAG เจกเฉ€เจฌเจ—เจฐ เจธเฉเจจเฉ‡เจนเจฟเจ†เจ‚ เจจเจพเจฒ เจ‡เจธ เจจเจพเจฒ เจœเฉเฉœ เจจเจนเฉ€เจ‚ เจธเจ•เจฆเจพ เจนเฉˆ?

Error: unable to halt hart 0
Error:   dmcontrol=0x80000001
Error:   dmstatus =0x00030c82

เจ‡เจธ เจฒเจˆ, เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹! เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจฆเฉ‡เจ–เจฟเจ† เจนเฉˆ! เจ•เฉเจ เจ…เจœเจฟเจนเจพ เจนเฉ€ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจŸเจพเจ‡เจฒเจฟเฉฐเจ• เจกเฉˆเฉฑเจกเจฒเจพเจ• เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจ•เจฟเจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจ•เฉฐเจŸเจฐเฉ‹เจฒเจฐ เจฆเฉ‡ เจฒเฉ‡เจ–เจ• 'เจคเฉ‡ เจญเจฐเฉ‹เจธเจพ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ - เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจฒเจฟเจ–เจฟเจ†... เจ…เจšเจพเจจเจ•, เจ•เฉฐเจŸเจฐเฉ‹เจฒเจฐ เจจเฉ‚เฉฐ เจธเฉฐเจชเจพเจฆเจฟเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจฆเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจธเจซเจฒ เจชเฉเจจเจฐ เจจเจฟเจฐเจฎเจพเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจ‚ เจฆเฉ‡เจ–เจฟเจ†:

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 เจงเจฟเจ†เจจ เจจเจพ เจฆเจฟเจ“ - เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจนเฉˆเจ‚เจ—เจฟเฉฐเจ— เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ 'เจคเฉ‡ เจ‡เจน เจธเจฎเจเจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจธเฉ€ เจ•เจฟ เจ•เฉ€ เจ‡เจน เจตเจพเจคเจพเจตเจฐเจฃ เจจเจพเจฒ เจธเจนเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจคเฉเจนเจพเจกเจพ เจ•เฉ€ เจฎเจคเจฒเจฌ เจนเฉˆ, "เจ‡เจน เจฆเจธ เจฎเจฟเฉฐเจŸเจพเจ‚ เจคเฉ‹เจ‚ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฒเจŸเจ• เจฐเจฟเจนเจพ เจนเฉˆ"? เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ‡เจธ เจจเฉ‚เฉฐ เจฎเฉเฉœ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจฌเฉ‚เจŸ เจฎเฉ€เจจเฉ‚ 'เจคเฉ‡ เจœเจพเจฃ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจง เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ! เจ‡เฉฑเจ• เจ›เฉ‹เจŸเจพ เจœเจฟเจนเจพ เจตเจฟเจ—เจพเฉœ: เจนเจพเจฒเจพเจ‚เจ•เจฟ เจฏเฉ‚-เจฌเฉ‚เจŸ SD เจ•เจพเจฐเจก เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเฉ‡ 2^24 เจฌเจพเจˆเจŸเจพเจ‚ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจœเจฆเฉ‹เจ‚ เจ‡เจน เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ‡เจน เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฆเฉ‚เจฐ เจฆเฉ‡ เจชเจคเฉ‡ 'เจคเฉ‡ เจ•เจพเจชเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจพเจ‚ เจคเจพเจ‚ เจธเฉฐเจฐเจšเจจเจพ เจธเจฟเจฐเจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจœเจพเจ‚ เจธเจฟเจฐเจซเจผ RAM เจฆเฉ‡ เจ‰เฉฑเจšเฉ‡ เจชเจคเจฟเจ†เจ‚ 'เจคเฉ‡เฅค , เจ…เจคเฉ‡ 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 'เจคเฉ‡ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเจพ เจนเฉˆ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ, เจ‡เจธ เจจเฉ‚เฉฐ เจฏเฉ‚-เจฌเฉ‚เจŸ เจธเฉฐเจฐเจšเจจเจพ เจตเจฟเฉฑเจš เจฆเจฐเจธเจพเจ‡เจ† เจ—เจฟเจ† เจธเฉ€)เฅค เจชเจฐ เจฒเจพเจนเจจเจค, เจฎเฉˆเจ‚ เจธเจพเจซเจผ-เจธเฉเจฅเจฐเจพ เจ…เจคเฉ‡ เจธเฉเจšเฉ‡เจค เจนเจพเจ‚: เจฎเฉˆเจจเฉ‚เฉฐ เจ‰เฉฑเจฅเฉ‡ เจจเจนเฉ€เจ‚ เจชเจคเจพ, เจ‡เฉฑเจฅเฉ‡ เจ‡เจน 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 เจ‡เฉฑเจ• เจ•เฉ‹เจฐ 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>

เจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจฌเจฐเจ•เจฒเฉ‡ เจฌเฉ‚เจŸ เจฒเฉ‹เจกเจฐ เจฆเฉ‡ เจ…เฉฐเจฆเจฐเฅค เจตเจฟเจ…เจ•เจคเฉ€เจ—เจค เจคเฉŒเจฐ 'เจคเฉ‡, เจœเฉ‹ เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจ‰เจฒเจเจฃ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจฆเจพ เจนเฉˆ เจ‰เจน เจนเฉˆ เจœเจผเจฟเจ•เจฐ htif โ€” เจนเฉ‹เจธเจŸ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจ•เจฐเจจเจฒ เจฆเฉ‡ เจŸเฉ€เจฅเจฐเจก เจฒเจพเจ‚เจš เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ (เจœเฉ‹ เจ•เจฟ เจนเฉ‹เจธเจŸ เจเจ†เจฐเจเจฎ เจฆเฉ‡ เจธเจนเจฟเจฏเฉ‹เจ— เจจเจพเจฒ), เจฎเฉˆเจ‚ เจธเจŸเฉˆเจ‚เจกเจ…เจฒเฉ‹เจจ เจฎเฉฐเจจเจฟเจ† เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ‡เจน เจซเฉฐเจ•เจธเจผเจจ เจฎเจฟเจฒเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจนเจฐ เจšเฉ€เจœเจผ เจ‡เฉฐเจจเฉ€ เจฎเจพเฉœเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ:

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 เจ•เจฐเจจเจฒ

เจ‡เฉฑเจฅเฉ‡ เจ•เจนเจพเจฃเฉ€ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ–เจฟเฉฑเจšเฉ€ เจœเจพ เจšเฉเฉฑเจ•เฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจฅเฉ‹เฉœเฉ€ เจ‡เจ•เจธเจพเจฐ เจนเฉ‹ เจ—เจˆ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ‰เฉฑเจชเจฐ เจคเฉ‹เจ‚ เจนเฉ‡เจ เจพเจ‚ เจตเจฐเจฃเจจ เจ•เจฐเจพเจ‚เจ—เจพ:

BBL เจจเฉ‡ FDT เจฆเฉ€ เจฎเฉŒเจœเฉ‚เจฆเจ—เฉ€ เจฎเฉฐเจจเฉ€ 0xF0000000, เจชเจฐ เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ เฉ€เจ• เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจนเฉˆ! เจ–เฉˆเจฐ, เจšเจฒเฉ‹ เจฆเฉเจฌเจพเจฐเจพ เจฆเฉ‡เจ–เฉ€เจ... เจ‡เจธ เจตเจฟเฉฑเจš เจฎเจฟเจฒเจฟเจ† HiFive_U-Boot/arch/riscv/lib/boot.c, เจฆเฉเจ†เจฐเจพ เจฌเจฆเจฒเจฟเจ† เจ—เจฟเจ† 0x81F00000, เจฏเฉ‚-เจฌเฉ‚เจŸ เจฌเฉ‚เจŸ เจธเฉฐเจฐเจšเจจเจพ เจตเจฟเฉฑเจš เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค

เจซเจฟเจฐ เจฌเฉ€เจฌเฉ€เจเจฒ เจจเฉ‡ เจธเจผเจฟเจ•เจพเจ‡เจค เจ•เฉ€เจคเฉ€ เจ•เจฟ เจฏเจพเจฆเจฆเจพเจธเจผเจค เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจฎเฉ‡เจฐเจพ เจฎเจพเจฐเจ— เจซเฉฐเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจชเจฟเจ† 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-เจฌเจฟเฉฑเจŸ เจเจกเจฐเฉˆเฉฑเจธ เจจเฉ‚เฉฐ เจชเจพเจฐเจธ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ, เจชเจฐ เจ‡เจน เจ‡เฉฑเจ• เจœเฉ‹เฉœเจพ เจตเจฟเฉฑเจš เจ†เจ‰เจ‚เจฆเจพ เจนเฉˆ <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 เจฐเจพเจนเฉ€เจ‚ เจ‡เฉฑเจ• เจกเฉ€เจฌเจ—เจฐ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจฌเจพเจ•เจธ เจฆเฉ‡ เจฌเจพเจนเจฐ เจœเจพเจฒ เจซเฉœ เจธเจ•เจฆเฉ‡ เจนเฉ‹ - เจกเฉ€เจฌเจ—เจฐ เจ‡เจธ เจธเจฎเฉ‡เจ‚ เจฌเจฟเจฒเจ•เฉเจฒ เจฌเฉฐเจฆ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพเฅค

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

เจ†เจœเจผเจพเจฆเฉ€-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 - เจŸเฉŒเจฎ เจธเฉŒเจ…เจฐ เจตเจฟเจงเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจตเจพเฉœ เจฆเฉ€ เจ‡เฉฑเจ• เจ•เจฟเจธเจฎ เจฆเฉ€ เจชเฉ‡เจ‚เจŸเจฟเฉฐเจ—. เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ…เฉฑเจœ เจ•เจฟเจธเฉ‡ เจ•เจพเจฐเจจ เจ•เจฐเจ•เฉ‡ เจ•เฉ‹เจˆ เจตเจฟเจœเฉ‡เจคเจพ เจจเจนเฉ€เจ‚ เจธเจจ, เจ‡เจจเจพเจฎ เจ…เจ—เจฒเฉ‡ เจกเจฐเจพเจ… เจตเจฟเฉฑเจš เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ...

เจ‡เฉฑเจฅเฉ‡ เจฎเฉˆเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจฒเฉฐเจฌเฉ‡ เจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐเจจ เจฆเจพ เจชเฉเจฐเจธเจคเจพเจต เจ•เจฐเจฆเจพ เจนเจพเจ‚.

เจจเฉ‚เฉฐ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เจฟเจ† เจœเจพเจตเฉ‡เจ—เจพ. เจ‡เฉฑเจ• เจšเจฒเจพเจ• เจฌเฉฑเจ— เจจเจพเจฒ เจฒเฉœเจพเจˆ เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจœเฉ‹ เจ›เฉเจชเจพเจ‰เจฃ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจง เจ•เจฐเจฆเจพ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจนเฉŒเจฒเฉ€-เจนเฉŒเจฒเฉ€ เจธเจฟเฉฐเจ—เจฒ เจธเจŸเฉˆเจช เจจเจพเจฒ เจ‡เจธ 'เจคเฉ‡ เจšเฉœเฉเจน เจœเจพเจ‚เจฆเฉ‡ เจนเฉ‹เฅค

เจŸเฉˆเจ•เจธเจŸ เจกเจพเจŠเจจเจฒเฉ‹เจก เจธเจ•เฉเจฐเฉ€เจจเจ•เจพเจธเจŸ (เจฌเจพเจนเจฐเฉ€ เจฒเจฟเฉฐเจ•):
เจญเจพเจ— 3: เจฒเจ—เจญเจ— เจฒเฉ‹เจก เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ Linux SD เจ•เจพเจฐเจก เจคเฉ‹เจ‚ RocketChip เจคเฉฑเจ•

เจธเจฐเฉ‹เจค: www.habr.com

DDoS เจธเฉเจฐเฉฑเจ–เจฟเจ†, VPS VDS เจธเจฐเจตเจฐเจพเจ‚ เจตเจพเจฒเฉ€เจ†เจ‚ เจธเจพเจˆเจŸเจพเจ‚ เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจ–เจฐเฉ€เจฆเฉ‹ ๐Ÿ”ฅ DDoS เจธเฉเจฐเฉฑเจ–เจฟเจ†, VPS VDS เจธเจฐเจตเจฐเจพเจ‚ เจจเจพเจฒ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจ–เจฐเฉ€เจฆเฉ‹ | ProHoster