Bootloaderis
Kaip ir normalios (x86) architektūros kompiuteriuose, rankiniams irgi reikalingas bootloaderis. Dažniausiai pačiame procesoriuje yra suhardkodinta tam tikra įkrovimo seka:
- įkrauti iš SD kortelės
- įkrauti iš flash atminties
- įkrauti iš dar kažkur
Procesoriukas kiekvienoje iš atminties saugyklų ieško magiško numerio (priklauso nuo gamintojo). Radęs checksumą vykdo programą, kuri mūsų atveju ir yra bootloaderis. Neradęs ima tikrinti kitą iš sąrašo. Žinoma, konkreti seka ir veiksmai skiriasi nuo kiekvieno procesoriuko gamintojo, manojo galima rasti čia: http://linux-sunxi.org/Boot.
Seniau bootloaderis užkraudavo įrenginio konfigūracija ir paleisdavo linuxą, tačiau dabar linkstama prie to, kad jis tiesiog paleistų linuxą. Lentos konfigūracija įrašoma į tokį “device-tree”, kuris automatiškai įkeliamas kraunant linuxo kernelį.
Dažniausiai sutinkamas bootloaderis - uBoot. Neperseniausiai jis tapo atviro kodo, dėl to ir aš supratau kaip jis veikia ir netgi pats susikompiliavau.
Yra trys uBoot konfigūravimo būdai:
- senovinis - piešopensourcinė versija, naudojami script.bin ir flex failai
- sudėtingas - atviro kodo versija: nebereikia script failo, tačiau flex vis dar reikalingas
- geriausias - konfigūruojamas panašiai kaip PC bootloaderis: viename faile nurodoma kur kernelis, o kur device-tree.
Taip pat yra du uBoot versios:
- senoji - modifikuota pačių gamintojų, nelabai atviro kodo
- normalioji - atviro kodo, atidaryta po to, kai gamintojams nusibodo patiems viską daryti
Senąją versiją reikėtų rinktis tik tuo atveju, jeigu naujojo nepalaiko įrenginukas. Tuo atveju prašome pasiskaityti kaip jį konfigūruoti.
Aš savąjį kompiliavau iš normaliosios versijos, naudodamas geriausią konfigūravimo būdą pagal šią instrukciją. Jeigu jus domina kiti būdai, pasiskaitykite čia: http://linux-sunxi.org/Mainline_U-Boot#Compile_U-Boot
1. Kompiliavimo įrankiai (toolchain)
Kadangi kompiliuosime ne ant kompiuteriuko, o ant standartinio PC, reikės kompiliuoti kryžmai (cross compile). Kompiliuojant ARMui grynas gcc netiks (nors jis ir turi arm tinkantį kompiliatorių, tas kompiliatorius ne visiems kompiuteriukams suprantamą kodą kompiliuoja). Man teko parsisiųsti linaro modifikuotą gcc. Aš viską dariau ant arch-linux’o.
Pirma, jums reikės susiinstaliuoti bibliotekas:
1 | pacman -S dtc swig |
Tada parsisiųsti linaro GCC kompiliatorių, bei nusistatyti globalius kintamuosius:
1 | wget -c https://releases.linaro.org/14.09/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz |
Dabar turėtumėte būti pasiruošę kompiliavimui.
2. Kompiliuojame uBoot
Ne taip greitai! Nepamirškime iš pradžių parsisiųsti patį uBoot:
1 | git clone git://git.denx.de/u-boot.git |
Kuri versija naujausia, galite pasitikrinti su git tag.
uBoot turi gražų menuconfig įrankį, visai kaip ir linux kernelis. Failų sistemos struktūra irgi labai panaši.
Konfigūracijos templeitai yra ./configs aplanke, o device-tree: ./arch/arm/dts/.
Daugiau nieko ir nereikia, galime pradėti konfigūraciją:
1 | make distclean |
Kadangi mano lenta yra ne pcDuino3-nano, o pcDuino3b - reikėjo papildomai pakeisti kelis nustatymus - paimti iš pcDuino3 configo templeito. Kai viskas sukonfigūruota galime paleisti kompiliavimą:
1 | make -j4 |
Mums reikalingas failas: ./u-boot-sunxi-with-spl.bin Kompiliavimas baigtas, dabar galime kompiliuoti kernelį arba, jeigu jau jį turime, pereiti prie uBoot įrašymo į SD-kortelę.