Stap 2: Zynq-Boot
Zynq-Boot downloaden
Ten eerste, laten we de code voor zynq-schoen, waarin wat wij moet instellen van een Zedboard aan laars Android downloaden
git clone git://github.com/cambridgehackers/zynq-boot
Wat een opstartlader moet doen om op te starten Linux
Een opstartlader moet slechts een paar dingen doen voordat het ARM-Linux kan booten.
- Configureren van de DRAM-controller
- Laden van de zImage en elke afbeelding van de initiële ramdisk naar DRAM
- De waarde van het type machine in r2 laden
- Ga naar de zImage
Door de verpakking de zImage en de initiële ramdisk afbeelding in een boot.bin bestand, zorgt Xilinx van fsbl voor de eerste twee van deze. Dus alles wat we moeten doen is de laatste 2.
Behalve de Xilinx lijkt kernel te vereisen sommige andere configuratie registers worden geïnitialiseerd. Na verloop van tijd, worden misschien deze configuratie wil verplaatst naar de kernel om dit proces te vereenvoudigen.
Hoe Zynq-Boot bereidt de weg voor Linux
Als we een kijkje nemen op de inhoud van de Zynq-Boot, is een van de bestanden van belang clearreg. S. dit bestand wordt gecompileerd en zImage gekoppeld zodat deze code het ingangspunt is.
Het begint met wat code te springen uit het verleden een gegevenstabel:
.arm .data .global clearreg clearreg: adr r4, data_table b 3f
Het bevat dan de gegevenstabel zelf. Elk item is twee 32-bit woorden: een configuratiewaarde te schrijven en een adres waar u wilt schrijven. Deze registers kunnen worden geconfigureerd door de Xilinx FSBL of door de Linuxkernel, maakt deze stap eenvoudiger.
data_table: .word SLCR_UNLOCK_MAGIC, XPSS_SYS_CTRL_BASEADDR+0x8//slcr_unlock /* remap DDR to zero, FILTERSTART */ .word 0, XPSS_SCU_BASEADDR + 0x40 //filter_start /* Device config APB, unlock the PCAP */ .word 0x757BDF0D, XPSS_DEV_CFG_APB_BASEADDR + 0x34 //unlock .word 0xFFFFFFFF, XPSS_DEV_CFG_APB_BASEADDR + 0x28 //rom_shadow /* OCM_CFG, Mask out the ROM, map ram into upper addresses */ .word 0x1F, XPSS_SYS_CTRL_BASEADDR + 0x910 //ocm_cfg /* FPGA_RST_CTRL, clear resets on AXI fabric ports */ .word 0x0, XPSS_SYS_CTRL_BASEADDR + 0x240 //fpga_rst_ctrl /* TZ_DDR_RAM, Set DDR trust zone non-secure */ .word 0xFFFFFFFF, XPSS_SYS_CTRL_BASEADDR + 0x430 //trust_zone /* Set urgent bits with register */ .word 0x0, XPSS_SYS_CTRL_BASEADDR + 0x61c //ddr_urgent_sel /* Urgent write, ports 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 // end of table
Nadat de gegevens is tabel het machinetype:
machine_type: .word 0xd32 // XILINX_EP107 (Zynq) = 3378.
Dan is er de code die de processor volgens de gegevenstabel configureert:
2: str r0, [r1] 3: ldmia r4!, {r0,r1} cmp r1, #0 bne 2b
Tot slot is er de code die het machinetype XILINX_EP107 ladingen en blijft het ingangspunt zImage:
ldr r1, machine_type mov r2,#0x1000000 // set address of devicetree data // fall through (to start of zImage)
Na dat laarzen Linux zoals gebruikelijk.