Gawo 3: Pafupifupi kutsitsa Linux kuchokera ku SD khadi kupita ku RocketChip

Gawo 3: Pafupifupi kutsitsa Linux kuchokera ku SD khadi kupita ku RocketChip В gawo lapitalo chowongolera kukumbukira chocheperako chinakhazikitsidwa, kapena m'malo mwake, chomangira pa IP Core kuchokera ku Quartus, chomwe ndi adapter ya TileLink. Lero, mu gawo "Tikutumiza RocketChip ku bolodi lodziwika bwino la China lomwe lili ndi Cyclone" mudzawona cholumikizira chogwira ntchito. Njirayi idatenga nthawi yayitali: ndinali kuganiza kale kuti ndiyambitsa Linux mwachangu ndikupita patsogolo, koma sizinali choncho. Mu gawo ili, ndikufuna kuyang'ana njira yotsegulira U-Boot, BBL, komanso kuyesa kwamantha kwa Linux kernel kuti ayambe. Koma pali cholumikizira - U-Boot, ndipo chatsogola kwambiri, chokhala ndi zambiri zomwe mungayembekezere kuchokera pakompyuta yodzaza.

Zipangizozi zidzaphatikizapo khadi la SD lolumikizidwa kudzera pa mawonekedwe a SPI, komanso UART. Mu gawo la mapulogalamu, BootROM idzasinthidwa ndi xip pa sdboot ndipo, kwenikweni, magawo otsatirawa awonjezedwa (pa SD khadi).

Kumaliza hardware

Chifukwa chake, ntchitoyo: muyenera kusinthana ndi pachimake "chachikulu" ndikulumikiza UART (kuchokera ku Raspberry) ndi adaputala ya SD (tinagwiritsa ntchito khadi lochokera ku Catalex yokhala ndi zikhomo zisanu ndi chimodzi: GND, VCC, MISO, MOSI, SCK, CS) .

Kwenikweni, zonse zinali zosavuta. Koma ndisanazindikire izi, ndinaponyedwa pang'ono mbali ndi mbali: pambuyo pa nthawi yapitayi, ndinaganiza kuti ndikungofunika kusakaniza. System chinachake chonga HasPeripheryUART (ndikukhazikitsa molingana), zomwezo pa khadi la SD - ndipo zonse zikhala zokonzeka. Kenaka ndinaganiza zowona momwe adagwiritsidwira ntchito mu "serious" design. Ndiye, chovuta ndi chiyani pa izi? Arty, mwachiwonekere, sichikwanira - chilombocho chimakhalabe unleahshed.DevKitConfigs. Ndipo mwadzidzidzi zinapezeka kuti pali zopindika paliponse, zomwe zidawonjezedwa kudzera mu magawo ndi makiyi. Ndikuganiza kuti izi ndizosinthika komanso zosinthika, koma ndikufuna kuyambitsa china chake choyamba ... Kodi mulibe zomwezo, zosavuta komanso zokwiyitsa kwambiri? .. Apa ndipomwe ndinafika vera.iofpga.FPGAChip kwa Microsemi FPGAs ndipo nthawi yomweyo adazipatula kuti azigwira mawu ndikuyesera kupanga momwe ndingagwiritsire ntchito mofananiza, mwamwayi pali "mawonekedwe onse a boardboard" mu fayilo imodzi.

Zinapezeka kuti mumangofunika kuwonjezera System.scala mizere

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

Mzere mu thupi la kalasi System imawonjezera zambiri za kuchuluka komwe gawo ili la SoC limagwira ntchito pa fayilo ya dts. Momwe ndikumvera, DTS/DTB ndi njira yofananira yaukadaulo ya pulagi-ndi-sewero la zida zophatikizika: mtengo wofotokozera wa dts umapangidwa kukhala fayilo ya binary dtb ndikusamutsidwa ndi bootloader kupita ku kernel kuti athe kukonza zolondola. hardware. Chochititsa chidwi, popanda mzere ndi tlclock chilichonse chimapanga bwino, koma kupanga BootROM (ndiroleni ndikukumbutseni, izi zikhala kale sdboot) sichingagwire ntchito - panthawi yophatikizira imagawa fayilo ya dts ndikupanga mutu wokhala ndi macro TL_CLK, chifukwa chomwe adzatha kukonza mafupipafupi ogawa mafupipafupi a mawonekedwe akunja.

Muyeneranso kukonza pang'ono "wiring":

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
}

Maunyolo olembetsa, kunena zoona, adawonjezedwa mwachifaniziro ndi malo ena mu code yoyambirira. Mwachidziwikire, ayenera kuteteza motsutsana kusakhazikika. Mwina mu ena midadada ili kale ndi chitetezo chawo, koma choyamba ndikufuna kuyiyambitsa "pamlingo wapamwamba kwambiri." Funso losangalatsa kwambiri kwa ine ndilakuti chifukwa chiyani MISO ndi MOSI amangokhalira kukangana dq? Sindinapeze yankho pano, koma zikuwoneka kuti ma code ena onse amadalira kulumikizana koteroko.

Mwakuthupi, ndidangopereka zikhomo zapangidwe kwa olumikizana aulere pa block ndikusuntha chodumphira chosankha voteji kupita ku 3.3V.

Adapter ya SD

Onani kuchokera pamwamba:

Gawo 3: Pafupifupi kutsitsa Linux kuchokera ku SD khadi kupita ku RocketChip

Onani pansi:

Gawo 3: Pafupifupi kutsitsa Linux kuchokera ku SD khadi kupita ku RocketChip

Software Debugging: Zida

Choyamba, tiyeni tiyankhule za zida zomwe zilipo komanso zolephera zake.

Minicom

Choyamba, tifunika kuwerenga zomwe bootloader ndi kernel. Kuti tichite izi pa Linux (pamenepa, pa RaspberryPi), tifunika pulogalamu ya Minicom. Nthawi zambiri, pulogalamu iliyonse yomwe imagwira ntchito ndi serial port idzachita.

Chonde dziwani kuti poyambira, dzina la chipangizo cha doko liyenera kufotokozedwa ngati -D /dev/ttyS0 - pambuyo pa chisankho -D. Chabwino, chidziwitso chachikulu: kuchoka, gwiritsani ntchito Ctrl-A, X. Ndidali ndi mlandu pomwe kuphatikiza uku sikunagwire ntchito - ndiye mutha kungonena kuchokera kugawo loyandikana nalo la SSH killall -KILL minicom.

Pali chinthu chinanso. Mwachindunji, RaspberryPi ili ndi ma UART awiri, ndipo madoko onsewa amatha kusinthidwa kukhala chinachake: chimodzi cha Bluetooth, chinacho mwachisawawa chimatulutsa kernel console. Mwamwayi, khalidweli likhoza kunyalanyazidwa malinga ndi bukuli.

Lembaninso kukumbukira

Pochotsa zolakwika, kuyesa lingaliro, nthawi zina ndimayenera kutero tsegulani bootloader (pepani) mu RAM mwachindunji kuchokera kwa wolandirayo. Mwina izi zitha kuchitika mwachindunji kuchokera ku GDB, koma pamapeto pake ndidatsata njira yosavuta: ndidakopera fayilo yofunikira ku Raspberry, ndikutumizanso doko 4444 kudzera pa SSH (telnet kuchokera ku OpenOCD) ndikugwiritsa ntchito lamuloli. load_image. Mukachita izi, zikuwoneka ngati zonse zazizira, koma kwenikweni "sikugona, kumangophethira pang'onopang'ono": Imatsitsa fayilo, imangochita pa liwiro la ma kilobytes angapo pamphindikati.

Features khazikitsa breakpoints

Anthu ambiri mwina sanaganizepo za izi pokonza mapulogalamu okhazikika, koma zosokoneza sizimakhazikitsidwa nthawi zonse. Nthawi zina kukhazikitsa nthawi yopuma kumaphatikizapo kulemba kwakanthawi malangizo apadera pamalo oyenera mwachindunji mu makina code. Mwachitsanzo, umu ndi momwe lamulo langa lokhazikika limagwirira ntchito b mu GDB. Izi ndi izi:

  • simungathe kuyika dontho mkati mwa BootROM chifukwa ROM
  • Mutha kukhazikitsa malo opumira pamakina omwe ali mu RAM kuchokera pa SD khadi, koma muyenera kudikirira mpaka itakwezedwa. Kupanda kutero, sitidzalembanso kachidindo, koma chojambuliracho chidzalembanso malo athu opumira.

Ndikukhulupirira kuti mutha kufunsa mwachindunji kugwiritsa ntchito ma breakpoints a Hardware, koma pali ochepa ochepa.

Kusintha mwachangu kwa BootROM

Pa gawo loyambirira la kukonza zolakwika, nthawi zambiri pamakhala chikhumbo chokonza BootROM ndikuyesanso. Koma pali vuto: BootROM ndi gawo la mapangidwe omwe adalowetsedwa mu FPGA, ndipo kaphatikizidwe kake ndi nkhani ya mphindi zochepa (ndipo izi zili pambuyo pophatikiza pafupifupi chithunzi cha BootROM kuchokera ku C ndi Assembler ...). Mwamwayi, kwenikweni zonse mofulumira kwambiri: mndandanda wa zochita uli motere:

  • regenerate bootrom.mif (Ndinasinthira ku MIF m'malo mwa HEX, chifukwa nthawi zonse ndinali ndi mavuto ndi HEX, ndipo MIF ndi mtundu wa Alter)
  • mu Quartus akuti Processing -> Update Memory Initialization File
  • pa chinthu cha Assembler (m'gawo lakumanzere la Ntchito) lamula Yambaninso

Chilichonse pa chilichonse - masekondi makumi angapo.

Kukonzekera SD khadi

Chilichonse pano ndi chophweka, koma muyenera kukhala oleza mtima ndikukhala ndi 14Gb ya disk space:

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

Pambuyo pake muyenera kuyika choyera, kapena kani, chomwe chilibe chilichonse chofunikira, khadi ya SD, ndikuchita.

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

… Kuti sdX - chipangizo choperekedwa ku khadi. CHENJEZO: zomwe zili pakhadi zidzachotsedwa, kulembedwanso komanso zambiri! Sikoyenera kuchita msonkhano wonse kuchokera pansi sudochifukwa ndiye zinthu zonse zomanga zidzakhala za root, ndipo msonkhanowo uyenera kuchitidwa pansi sudo mosalekeza.

Zotsatira zake ndi khadi yolembedwa mu GPT yokhala ndi magawo anayi, amodzi omwe ali ndi FAT uEnv.txt ndi chithunzi chojambulidwa mumtundu wa FIT (chili ndi zithunzi zazing'ono zingapo, chilichonse chili ndi adilesi yake yotsitsa), gawo lina lilibe kanthu, likuyenera kusinthidwa mu Ext4 ya Linux. Zigawo zina ziwiri - zachinsinsi: U-Boot amakhala pa imodzi (kuchotsera kwake, monga momwe ndikumvera, ndi hardcoded mu BootROM), kumbali inayo, zikuwoneka, kusintha kwake kwa chilengedwe kumakhala, koma sindikuzigwiritsa ntchito.

Gawo loyamba, BootROM

Nzeru zodziwika bwino zimati: “Ngati m’maprogramu mukuvina ndi maseche, ndiye kuti pa zamagetsi palinso kuvina ndi chozimitsira moto.” Sizokhudzanso kuti nditangotsala pang'ono kuwotcha bolodi, ndikusankha kuti "Chabwino, GND ndiyotsika yomweyo." (Mwachiwonekere, wotsutsa sangapweteke pambuyo pake ...) Ndizowonjezereka kuti ngati manja anu sakukula kuchokera pamenepo, ndiye kuti zamagetsi sizimasiya kubweretsa zodabwitsa: pamene soldering cholumikizira pa bolodi, sindinathebe kugulitsa zolumikizana bwino - kanema ikuwonetsa momwe solder imafalikira. pa kulumikizana konse, ingoyikani chitsulo chosungunulira, Kwa ine, "anandimenya" mwachisawawa. Chabwino, mwinamwake solder sinali yoyenera kutentha kwa chitsulo chosungunula, mwinamwake chinthu china ... Kawirikawiri, nditaona kuti ndinali ndi mauthenga khumi ndi awiri, ndinasiya ndikuyamba kusokoneza. Ndiyeno izo zinayamba zachinsinsi: Ndinalumikiza RX/TX kuchokera ku UART, ndimakweza firmware - imati

INIT
CMD0
ERROR

Chabwino, zonse ndi zomveka - sindinalumikize gawo la khadi la SD. Timakonza mkhalidwewo, kunyamula firmware ... Ndipo chete ... Chifukwa chiyani sindinasinthe malingaliro anga, koma kabokosi kakang'ono kamene kanatsegulidwa: imodzi mwa zikhomo za modules iyenera kulumikizidwa ku VCC. Kwa ine, gawoli linathandizira 5V kuti likhale ndi magetsi, kotero popanda kuganiza kawiri, ndinalumikiza waya wotuluka kuchokera ku module kupita kumbali ina ya bolodi. Zotsatira zake, cholumikizira chokhotakhota chidakhala chokhotakhota, ndipo Kulumikizana kwa UART kunangotayika. nkhopepalm.jpg Nthawi zambiri, "mutu woyipa supereka mpumulo ku miyendo," ndipo manja opotoka sapereka mpumulo kumutu ...

Zotsatira zake, ndidawona zomwe ndikuziyembekezera kwa nthawi yayitali

INIT
CMD0
CMD8
ACMD41
CMD58
CMD16
CMD18
LOADING /

Komanso, imasuntha ndipo chizindikiro chotsitsa chimazungulira. Nthawi yomweyo ndimakumbukira masiku anga akusukulu komanso kutsitsa kwa MinuetOS kuchokera pa floppy disk. Pokhapokha ngati galimotoyo sikupera.

Vuto ndiloti pambuyo pa uthenga wa BOOT palibe chomwe chimachitika. Izi zikutanthauza kuti ndi nthawi yolumikizana kudzera pa OpenOCD kupita ku Rasipiberi, kupita ku GDB pa wolandirayo, ndikuwona chomwe chiri.

Choyamba, kulumikizana ndi GDB nthawi yomweyo kunawonetsa izi $pc (program counter, adilesi ya malangizo apano) iwulukira ku 0x0 - izi mwina zimachitika pambuyo zolakwika zingapo. Choncho, mwamsanga uthenga utatha BOOT Tiyeni tiwonjezere lupu wopandamalire. Izi zidzamuchedwetsa kwakanthawi ...

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

Nambala yachinyengo yotereyi imagwiritsidwa ntchito "podalirika": Ndinamva kwinakwake kuti kuzungulira kosatha ndi khalidwe losadziwika, koma wojambulayo sangaganize (ndikukumbutsani kuti malinga ndi 0x10000 ili BootROM).

Gawo 3: Pafupifupi kutsitsa Linux kuchokera ku SD khadi kupita ku RocketChip

Zikuwoneka, ndi chiyani chinanso chomwe mungayembekezere - zophatikizidwa mwankhanza, ndi ma code amtundu wanji omwe alipo? Koma mu nkhani imeneyo mlembiyo anali kukonza cholakwika C code... 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.

Gawo 3: Pafupifupi kutsitsa Linux kuchokera ku SD khadi kupita ku RocketChip

Mukungoyenera kutsitsa osati fayilo ya MIF kapena bin, koma mtundu wa ELF.

Tsopano mutha kulingalira ndi kuyesa kwa nth adilesi yomwe kuphaku kupitirire (ichi ndi chifukwa china chomwe wopanga samayenera kuganiza kuti kuzunguliraku kuli kosatha). Gulu

set variable $pc=0xADDR

amakulolani kuti musinthe mtengo wa registry pa ntchentche (panthawiyi, adilesi ya malangizo apano). Ndi chithandizo chake, mutha kusintha zomwe zidalembedwa pamtima (ndi zolembera zokumbukira kukumbukira).

Pamapeto pake, ndidafika pomaliza (sindikudziwa kuti cholondola) tili ndi "chithunzi cha khadi la SD cha machitidwe olakwika", ndipo sitiyenera kupita koyambirira kwa zomwe zidatsitsidwa, koma 0x89800 mabayiti owonjezera:

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

Mwinanso izi zidakhudzidwanso chifukwa chosowa khadi losafunika la 4Gb pafupi, ndidatenga 2Gb ndikuyika m'malo mwa Makefile mwachisawawa. DEMO_END=11718750 pa DEMO_END=3078900 (musayang'ane tanthauzo mu tanthauzo linalake - palibe, ndizoti tsopano chithunzicho chayikidwa pa khadi).

Level XNUMX, U-Boot

Tsopano ife tikadali "kugwa", koma ife tiri kale pamalo oyenera 0x0000000080089a84. Apa ndiyenera kuvomereza: m'malo mwake, chiwonetserochi sichimapita "ndi zoyimitsa zonse", koma zidalembedwa pang'ono "pambuyo", ndiye apa ndatha kale kuyika fayilo yolondola ya dtb kuchokera ku SoC yathu, konzani pazokonda. HiFive_U-Boot kusintha CONFIG_SYS_TEXT_BASE=0x80089800 (m'malo 0x08000000) kuti adilesi yotsitsa ifanane ndi yeniyeni. Tsopano tikutsegula mapu a mulingo wotsatira, chithunzi china:

(gdb) file ../freedom-u-sdk/work/HiFive_U-Boot/u-boot
(gdb) tui en

Ndipo tikuwona:

   │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)                      │

Komanso, timalumpha pakati pa mizere 308 ndi 309. Ndipo sizodabwitsa, chifukwa mu $sp bodza tanthauzo 0xfffffffe31cdc0a0. Tsoka, nthawi zonse "imathawa" chifukwa cha mzere 307. Choncho, tiyeni tiyesetse kukhazikitsa trap_entry, ndiyeno kubwerera ku 0x80089800 (Polowera U-Boot), ndipo tiyeni tiyembekezere kuti sizifuna kuti zolembera zikhazikitsidwe bwino musanadumphe... Zikuwoneka ngati zikugwira ntchito:

(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

Cholozera cha stack ndi chotere, kunena zoona: chimalozera kudutsa RAM yonse (pokhapokha, ndithudi, tilibe kumasulira kwa maadiresi, koma tiyeni tiyembekezere njira yosavuta).

Tiyeni tiyese kusintha pointer ndi 0x881cf950. Zotsatira zake, timafika potsimikiza kuti handle_trap kuitana ndi kuitana, ndipo nthawi yomweyo ife timalowamo _exit_trap ndi mtsutso epc=2148315240 (mu decimal):

(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

Khazikitsani breakpoint to strnlen, tikupitiriza ndikuwona:

(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

Zikuwoneka ngati, _exit_trap akufuna kupereka zidziwitso zochotsa zolakwika zomwe zidachitika, koma sangathe. Kotero, mwanjira ina magwero athu sawonetsedwanso. set directories ../freedom-u-sdk/HiFive_U-Boot/ ZA! Tsopano zawonetsedwa!

Chabwino, tiyeni tiyiyambitsenso, ndikuwona kuchokera pamndandanda womwe udayambitsa vuto loyambirira lomwe lidayambitsa cholakwika choyamba (mcause == 5). Ngati ndinamvetsetsa bwino zomwe zalembedwa apa patsamba 37, ndiye kuti kupatula izi zikutanthauza Load access fault. Chifukwa chikuwoneka kuti apa

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 ali ndi tanthauzo lolakwika lomwelo, ndi mkati board_init_f_init_reserve cholakwika chikuchitika. Zikuwoneka ngati uyu ndiye wolakwa: wosinthika wokhala ndi dzina lodziwika bwino CONFIG_SYS_INIT_SP_ADDR. Imafotokozedwa mu fayilo HiFive_U-Boot/include/configs/HiFive-U540.h. Panthawi ina ndinaganiza, mwina, chabwino, ndiyenera kuwonjezera bootloader ya purosesa - mwinamwake zingakhale zosavuta kukonza purosesa pang'ono? Koma kenako ndinaona kuti chinali ngati chinthu chosamalizidwa bwino#if 0-zosintha zina zakusintha kwa kukumbukira kosiyana, ndipo mutha kuyesa kuchita izi:

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 */

Nthawi zina chiwerengero cha ndodo zomangira zamakono wafika povuta kwambiri. Nditalimbana pang'ono, ndinafika pakufunika kopanga doko loyenera la bolodi langa. Kuti tichite izi, tifunika kukopera ndikusintha mafayilo angapo kuti agwirizane ndi kasinthidwe kwathu.

Chabwino, pafupifupi, apa pali tebulo laling'ono

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

Zambiri zitha kupezeka mu nkhokwe.

Monga momwe zinakhalira, pa bolodi la SiFive iyi zolembera za zida zina zimakhala ndi ma adilesi osiyanasiyana. Zinapezekanso kuti U-Boot imakonzedwa pogwiritsa ntchito makina a Kconfig, omwe amadziwika kale ku Linux kernel - mwachitsanzo, mutha kulamula. make menuconfig, ndipo mawonekedwe osavuta amawu adzawonekera patsogolo panu akuwonetsa mafotokozedwe a magawo ndi ? ndi zina. Nthawi zambiri, kufotokozera limodzi lachitatu kuchokera ku mafotokozedwe a matabwa awiri, kutaya mitundu yonse ya kukonzanso kwa PLL kuchokera kumeneko (mwachiwonekere, izi zimagwirizanitsidwa ndi kulamulira kochokera ku kompyuta yanu kudzera pa PCIe, koma izi sizowona) , Ndinalandira firmware, yomwe, nyengo yabwino pa Mars inandipatsa uthenga kudzera pa UART ponena za hashi yomwe idapangidwa kuchokera, komanso kuchuluka kwa DRAM yomwe ndili nayo (koma ine ndekha ndinalemba izi pamutu).

Chisoni chokha ndichakuti zitatha izi bolodi nthawi zambiri idasiya kuyankha kudzera pa purosesa JTAG, ndikutsitsa kuchokera pa khadi la SD, kalanga, osati mwachangu pakukonza kwanga. Kumbali ina, nthawi zina BootROM imapereka uthenga womwe ERROR, idalephera kuyambitsa, ndipo U-Boot idatulukira nthawi yomweyo. Apa ndipamene zidanditulukira: mwachiwonekere, nditayambiranso pang'onopang'ono mu FPGA, kukumbukira sikumachotsedwa, ilibe nthawi "yopumula", ndi zina zotero. Mwachidule, mutha kungowona uthenga ukawoneka LOADING / gwirizanitsani ndi debugger ndi lamulo set variable $pc=0x80089800, potero ndikudutsa kutsitsa kwautali uku (zowona, poganiza kuti nthawi yomaliza idasweka msanga kotero kuti inalibe nthawi yokweza chilichonse pamwamba pa code yoyambirira).

Mwa njira, kodi ndizabwinobwino kuti purosesa imaundana kwathunthu ndipo JTAG debugger sangathe kulumikizana nayo ndi mauthenga?

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

Choncho, dikirani! Ndaziwona kale izi! Chinachake chofanana chimachitika pamene TileLink yatsekedwa, ndipo mwanjira ina sindimakhulupirira mlembi wa woyang'anira kukumbukira - ndinalemba ndekha ... Mwadzidzidzi, pambuyo pa kukonzanso koyamba kopambana kwa purosesa pambuyo pokonza wolamulira, ndinawona:

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

Ku mzere wachilendo uwu kale In: serial osalabadira - ndimayesa kumvetsetsa pa purosesa yopachikika ngati imagwira ntchito moyenera ndi chilengedwe. Kodi mukutanthauza chiyani, “Yakhala ikulendewera chonchi kwa mphindi khumi”? Osachepera idakwanitsa kusamuka ndikupita kumenyu yoyambira! Kupatuka pang'ono: ngakhale U-Boot imakwezedwa mu 2 ^ 24 byte yoyamba kuchokera ku SD khadi, ikayamba, imadzikopera yokha ku adilesi yakutali, mwina yolembedwa pamutu wosinthira, kapena kungotengera ma adilesi apamwamba a RAM. , ndikuchita ELF kusamuka -characters, ndi kusamutsa ulamuliro kumeneko. Chifukwa chake: zikuwoneka kuti tadutsa mulingo uwu ndikulandila bonasi yomwe purosesa sinapachike mwamphamvu pambuyo pake.

Nanga bwanji chowerengera sichikugwira ntchito? Zikuwoneka ngati wotchi sikugwira ntchito pazifukwa zina ...

(gdb) x/x 0x0200bff8
0x200bff8:      0x00000000

Bwanji ngati mutembenuza mivi pamanja?

(gdb) set variable *0x0200bff8=310000000
(gdb) c

Ndiye:

Hit any key to stop autoboot:  0
MMC_SPI: 0 at 0:1 hz 20000000 mode 0

Kutsiliza: koloko sikuyenda. Ichi mwina ndichifukwa chake kulowetsa kiyibodi sikugwira ntchito:

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 == '[') {
...

Vuto lidakhala kuti ndinali wochenjera kwambiri: Ndinawonjezera kiyi pa processor config:

  case DTSTimebase => BigInt(0)

... kutengera kuti ndemangayo idati "ngati simukudziwa, siyani 0." Ndipo pambuyo pa zonse WithNBigCores Ndangoyiyika ku 1MHz (monga, mwa njira, idawonetsedwa mu U-Boot config). Komatu, ndine waukhondo komanso wosamala: sindikudziwa pamenepo, ndi 25MHz! Pamapeto pake, palibe chimene chimagwira ntchito. Ndinachotsa "zosintha" zanga ndipo ...

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 #

Mutha kuyikanso malamulo! Mwachitsanzo, mutayang'ana pang'ono, mutha kuganiza kuti mulowe mmc_spi 1 10000000 0; mmc part, kuchepetsa mafupipafupi a SPI kuchokera ku 20MHz mpaka 10MHz. Chifukwa chiyani? Chabwino, mafupipafupi a 20MHz adalembedwa mu config, ndipo amalembedwabe pamenepo. Koma, monga momwe ndikumvera, zolumikizira, osachepera apa, zimagwira ntchito motere: code imagawaniza ma frequency a hardware unit (yanga ndi 25MHz kulikonse) ndi chandamale, ndikuyika mtengo wake ngati wogawa muzowongolera zofananira. kulembetsa. Vuto ndiloti ngati pa 115200Hz UART pali pafupifupi zomwe zikufunika, ndiye kuti mutagawa 25000000 ndi 20000000 mudzapeza 1, i.e. idzagwira ntchito pa 25MHz. Mwinamwake izi ndi zachilendo, koma ngati zoletsedwa zimayikidwa, zikutanthauza kuti wina akufunikira (koma izi siziri zotsimikizika) ... Kawirikawiri, zimakhala zosavuta kuziyika pansi ndikusunthira - kutali ndi, tsoka, kwa nthawi yaitali. 25MHz si Core i9.

Kutulutsa kwa 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

Chabwino, tafika pamlingo wina, koma kukuzizirabe. Ndipo nthawi zina amawazanso zosiyana. Mutha kuwona mcause podikirira ma code pa adilesi yotchulidwa $pc ndipo pambuyo pake si kukhala pa trap_entry. Chogwirizira cha U-Boot chokha chikhoza kungotulutsa mcause = 0..4, kotero konzekerani kukakamira mu boot yolakwika. Kenako ndidalowa mu config, ndikuyamba kuyang'ana zomwe ndikusintha, ndikukumbukira: m'menemo conf/rvboot-fit.txt analemba:

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

Chabwino, tiyeni tibweretse mafayilo onse kuti atsatire, m'malo mwa kernel command line ndi chinthu chonga ichi, popeza pali kukayikira kuti SIF0 - izi ndizotulutsa kwinakwake kudzera pa PCIe:

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

Ndipo tiyeni tisinthe ma hashing algorithm kuchokera ku SHA-256 kupita ku MD5: Sindifuna mphamvu ya cryptographic (makamaka ndikachotsa zolakwika), zimatenga nthawi yayitali kwambiri, komanso kuti mupeze zolakwika pakutsitsa, MD5 ndiyosavuta. Mapeto ake ndi chiyani? Tidayamba kumaliza gawo lakale mwachangu (chifukwa cha hashing yosavuta), ndipo yotsatira idatsegulidwa:

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

Koma nthawi sikuyenda ...

(gdb) x/x 0x0200bff8
0x200bff8:      0x00000000

O, zikuwoneka ngati kukonza wotchiyo kudakhala placebo, ngakhale zidawoneka kwa ine panthawiyo kuti zidathandiza. Ayi, ikuyenera kukonzedwa, koma tiyeni titembenuze mivi pamanja ndikuwona zomwe zikuchitika:

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.

Pakadali pano…

   Loading Kernel Image ... OK
Booting kernel in
3
2
1
0
## Starting application at 0x80000000 ...

Ayi, ndisintha wotchiyo - apo ayi mwina angasankhe kuwongolera chowerengera pamenepo!

Pakadali pano, adilesi yamalangizo apano ikulozera kwinakwake

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>

mkati mwa Berkeley Boot Loader yodzaza. Ineyo pandekha, chomwe chimandisokoneza pankhaniyi ndikutchulidwa htif - mawonekedwe opangira omwe amagwiritsidwa ntchito poyambitsa kernel (ndiko kuti, mogwirizana ndi gulu la ARM), ndinaganiza zodziyimira. Komabe, ngati mutapeza ntchitoyi mu code source, mukhoza kuona kuti si zonse zomwe ziri zoipa kwambiri:

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

Funso: yambani koloko

Kusaka zolembera ku CLINT kumatifikitsa

    val io = IO(new Bundle {
      val rtcTick = Bool(INPUT)
    })

    val time = RegInit(UInt(0, width = timeWidth))
    when (io.rtcTick) { time := time + UInt(1) }

Zomwe zimalumikizana ndi RTC, kapena MockAON yodabwitsa, yomwe ndimaganiza poyamba: "Ndiye, tili ndi chiyani pano? Zosamveka? Tizimitse!" Popeza sindikumvetsabe kuti ndi matsenga amtundu wanji omwe akuchitika pamenepo, ndiye ndingowonjezeranso malingalirowa 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
  }

Tikupita ku Linux kernel

Apa nkhaniyi idakokera kale ndipo yakhala yosasangalatsa, kotero ndifotokoza kuyambira pamwamba mpaka pansi:

BBL idaganiza kukhalapo kwa FDT ku 0xF0000000, koma ndakonza kale! Chabwino, tiyeni tiyang'anenso ... Ndinazipeza izo mkati HiFive_U-Boot/arch/riscv/lib/boot.c, m'malo ndi 0x81F00000, yotchulidwa mu U-Boot boot kasinthidwe.

Kenako BBL inadandaula kuti panalibe kukumbukira. Njira yanga inali mu ntchito mem_prop, chiyani mu riscv-pk/machine/fdt.c: kuchokera pamenepo ndaphunzira kuti muyenera kulemba fdt ram node ngati device_type = "memory" - ndiye, mwina, jenereta ya purosesa iyenera kukonzedwa, koma pakadali pano ndingoyilemba pamanja - mulimonse, ndidasamutsa fayiloyi pamanja.

Tsopano ndalandira uthengawo (woperekedwa mwa mawonekedwe, ndi zobwezera zonyamula):

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.

Zikuwoneka kuti zosankhazo zikuwonetsedwa ngati zikufunika riscv,kernel-start и riscv,kernel-end mu DTB, koma zero amagawidwa. Kuthetsa vuto query_chosen adawonetsa kuti BBL ikuyesera kuyika adilesi ya 32-bit, koma imabwera ndi awiri <0x0 0xADDR>, ndipo mtengo woyamba ukuwoneka ngati wocheperako. Awonjezedwa ku gawo chosen

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

ndikuwongolera m'badwo wamakhalidwe: osawonjezera 0x0 chinthu choyamba.

Njira zosavuta izi 100500 zipangitsa kukhala kosavuta kuwonera nsonga ikugwa:

Mawu obisika

   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)

(chizindikirocho chikuwonetsedwa ndi BBL, ndipo chomwe chili ndi masitampu anthawi chimawonetsedwa ndi kernel).

Mwamwayi, sindikudziwa momwe zilili paliponse, koma pa RocketChip, mukamagwirizanitsa debugger kudzera pa JTAG, mukhoza kugwira misampha m'bokosi - wotsutsayo adzayima ndendende panthawiyi.

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); // < ВЫ НАХОДИТЕСЬ ЗДЕСЬ
}

Monga nthabwala wakale adati, CPU sichinapezeke, kuyendetsa pulogalamu yotsanzira. Chabwino, kapena ayi. Yatayika mu purosesa imodzi pachimake.

/* The lucky hart to first increment this variable will boot the other cores */
atomic_t hart_lottery;
unsigned long boot_cpu_hartid;

Ndemanga yabwino linux/arch/riscv/kernel/setup.c - mtundu wa kujambula kwa mpanda pogwiritsa ntchito njira ya Tom Sawyer. Nthawi zambiri, pazifukwa zina panalibe opambana lero, mphotho imasamutsidwa ku kukoka kotsatira ...

Apa ndikupempha kuthetsa nkhani yayitali kale.

Zipitilizidwa. Padzakhala ndewu ndi cholakwika cholakwika kuti amakwanitsa kubisala ngati inu pang'onopang'ono kukwawira pa izo ndi singlestep.

Kutsitsa mawu screencast (ulalo wakunja):
Gawo 3: Pafupifupi kutsitsa Linux kuchokera ku SD khadi kupita ku RocketChip

Source: www.habr.com

Kuwonjezera ndemanga