Hur man starta upp Linux på en Zedboard utan U-Boot (2 / 6 steg)
Steg 2: Zynq-Boot
Ladda ner Zynq-Boot
Första, låt oss hämta koden för zynq-boot, som innehåller vad vi måste ställa in en Zedboard att starta Android
git klon git://github.com/cambridgehackers/zynq-boot
Vad en starthanterare måste göra att starta upp Linux
En starthanterare måste göra några saker innan det kan starta ARM Linux.
- Konfigurera DRAM-styrenhet
- Ladda zImage och någon initial ramdisk-avbildningen i DRAM
- Ladda maskin TYPVÄRDE i r2
- Hoppa till zImage
Genom att förpacka zImage och initial ramdisk-avbildningen till en boot.bin fil, hand Xilinx's fsbl tar om de första två av dessa. Så allt vi behöver göra är 2 sista.
Utom Xilinx tycks kernel kräva vissa andra konfigurationen register som ska initieras. Över tiden, kanske flyttas denna konfiguration wil till kärnan att förenkla denna process.
Hur Zynq-Boot bereder vägen för Linux
Om vi tar en titt på innehållet i Zynq-Boot, är en av filerna av intresse clearreg. S. denna fil kompileras och kopplade med zImage så att denna kod är startpunkten.
Det börjar med lite kod att hoppa förbi en datatabell:
.arm .data
.global clearreg
clearreg:
ADR r4, data_table
b 3f
Då innehåller den datatabellen själv. Varje post är två 32-bitars ord: ett konfigurationsvärde att skriva och en adress som du vill skriva den. Dessa register kan konfigureras av Xilinx FSBL eller av Linux-kärnan, vilket gör detta steg lättare.
data_table:
.Word SLCR_UNLOCK_MAGIC, XPSS_SYS_CTRL_BASEADDR + 0x8 / / slcr_unlock
/ * mappa om DDR till noll, FILTERSTART * /
.Word 0, XPSS_SCU_BASEADDR + 0x40 //filter_start
/ * Enheten config APB, låsa upp PCAP * /
.Word 0x757BDF0D, XPSS_DEV_CFG_APB_BASEADDR + 0x34 //unlock
.Word 0xFFFFFFFF, XPSS_DEV_CFG_APB_BASEADDR + 0x28 //rom_shadow
/ * OCM_CFG, maskera ut ROM, mappa ram i övre adresser * /
.Word 0x1F, XPSS_SYS_CTRL_BASEADDR + 0x910 //ocm_cfg
/ * FPGA_RST_CTRL, tydlig återställs på AXI tyg portar * /
.Word 0x0, XPSS_SYS_CTRL_BASEADDR + 0x240 //fpga_rst_ctrl
/ * TZ_DDR_RAM, ange DDR förtroende zon osäker * /
.Word 0xFFFFFFFF, XPSS_SYS_CTRL_BASEADDR + 0x430 //trust_zone
/ * Anger brådskande bitar med register * /
.Word 0x0, XPSS_SYS_CTRL_BASEADDR + 0x61c //ddr_urgent_sel
/ * Brådskande skriva, hamnar S2/S3 * /
.Word 0xC, XPSS_SYS_CTRL_BASEADDR + 0x600 //ddr_urgent
.Word SLCR_LOCK_MAGIC, XPSS_SYS_CTRL_BASEADDR + 0x4 //slcr_lock
.Word 0, 0 / / slutet av tabellen
Efter data är tabellen maskintypen:
machine_type:
.Word 0xd32 / / XILINX_EP107 (Zynq) = 3378.
Är det koden som konfigurerar processorn enligt tabellen:
2: str r0, [r1]
3: ldmia r4!, {r0, r1}
CMP r1, #0
BNE 2b
Slutligen finns den kod som laddar XILINX_EP107 maskintyp och fortsätter att startpunkten som zImage:
LDR r1, machine_type
MOV r2, #0x1000000 / / ange adressen till devicetree data
falla igenom (för att starta av zImage)
Efter det startar Linux som vanligt.