Menyiapkan Linux pada papan pengembangan seperti SocKit dengan ARM Cortex A9 dual-core bukanlah ilmu roket. Pabrikan papan mendukung gambar yang siap digunakan, sesuai untuk dipasang pada kartu SD atau media lain. Tetapi bagaimana jika Anda ingin menyentuh bare metal, mendekati kecepatan memecahkan kode yang tidak dikendalikan oleh inti OS? Yah, itu mungkin, tetapi tidak begitu mudah dan jelas. Dalam esai singkat ini, saya akan memberi Anda petunjuk langkah demi langkah, cara membuat dan menjalankan aplikasi bare-metal pertama Anda di Cyclone V SoC, yang menggunakan inti ARM Cortex A9 dari subsistem HPS dari SoC.
Anda harus memiliki papan pengembangan dengan Intel (Altera) Cyclone V SoC. Saya menggunakan papan SoCKit:

Saya telah melakukan semua hal yang dijelaskan dalam artikel ini di Debian Jessie. Anda dapat menggunakan sistem Linux atau Windows lainnya dengan perubahan yang sesuai.
Dan Anda membutuhkan IDE DS-5. Dan, sayangnya, edisi gratis tidak memungkinkan Anda untuk menyusun kode bare-metal. Anda memerlukan versi lengkap.
1. Persiapan
Meskipun Anda memiliki versi lengkap DS-5, Anda perlu menginstal DS-5 Altera Edition gratis. Kedua versi harus diinstal dalam mode
sudo , di direktori yang berbeda, misalnya:
/ home / user / intelFPGA untuk DS-5 Altera Edition, dan
/ home / user / DS-5 untuk versi lengkap DS-5. Anda harus memasukkan jalur dengan tangan selama proses instalasi.
2. Menjalankan IDE
2.1. Pertama, jalankan script
/home/user/intelFPGA/16.1/embedded/embedded_command_shell.sh , lalu ubah direktori ke
/ home / user / DS-5 / bin dan jalankan IDE:
$ ./eclipse &
Script mengatur variabel lingkungan. Untuk mengatur variabel saat sistem dimulai, Anda harus menambahkan baris berikut ke file
/home/user/.profile :
QUARTUS_ROOTDIR=/home/user/intelFPGA/16.1/qprogrammer export PATH=$PATH:/usr/local/gcc-arm-none-eabi-5_4-2016q3/bin/:/home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/bin/
Jika perlu, tambahkan baris yang sama untuk variabel yang diperlukan lainnya, seperti QSYS_ROOTDIR.
Anda juga perlu menginstal dan menjalankan Quartus Prime. Mari kita pertimbangkan, bahwa direktori instalasi Quartus adalah
/home/user/intelFPGA/16.1/quartus/ .
Jalankan Quartus Prime, yang terletak di
/home/user/intelFPGA/16.1/quartus/bin/quartus , dan itu adalah utilitas programmer JTAG, yang terletak di
/home/user/intelFPGA/16.1/qprogrammer/bin/quartus_pgmw .
3. Menghubungkan SoCkit
3.1. Hubungkan papan SoCkit ke komputer. Hubungkan kabel microUSB ke port board, bernama "USB Blaster (JTAG)" dan "USB ke UART."
3.2. Nyalakan papan dan masukkan:
$ ls /dev/bus/usb/001 001 002 003
Nomor terakhir (003) adalah antarmuka JTAG. Tetapkan izin untuk menulis:
$ sudo chmod 666 /dev/bus/usb/001/003
Anda harus melakukannya setiap kali Anda menyalakan papan tulis.
3.3. Pengaturan terminal TTY
Anda dapat menggunakan perintah ini:
screen /dev/ttyUSB0 115200
4. Membangun preloader (u-boot-spl)
4.1. Unduh file
sockit_ghrd_16.0.tar.gz dan bongkar. Misalnya, bongkar ke
/ home / user / ghrd-16 / sockit_ghrd .
4.2. Jalankan Quartus Prime dan buka file
/home/user/ghrd-16/sockit_ghrd/soc_system.qpf.4.3. Jalankan Qsys (Alat / Qsys). Buka
file /home/user/ghrd-16/sockit_ghrd/soc_system.qsys. Lakukan
Hasilkan / Hasilkan HDL dan keluar dari Qsys.
4.4. Jalankan Assembler di Quartus Prime.
4.5. Jalankan bsp-editor:
/home/user/intelFPGA/16.1/embedded/host_tools/altera/preloadergen/bsp-editor . Buat proyek baru: File / New HPS BSP. Di bidang "
Direktori pengaturan preloader " tulis "
/ home / user / ghrd-16 / sockit_ghrd / hps_isw_handoff / soc_system_hps_0. "
4.6. Siapkan Preloader. Buka tab Advanced. Matikan
Watchdog_enable . Jika Anda ingin melihat pesan debug melalui JTAG, Anda dapat mengaktifkan
Semihosting . Setelah ini tekan
Hasilkan dan berhenti.
4.7. Dimungkinkan untuk mengubah pesan startup. Sebagai contoh, dalam perangkat lunak file / spl_bsp / uboot-socfpga / board / altera / socfpga / socfpga_cyclone5.c ubah string "
BOARD: Altera SOCFPGA Cyclone V Board " pada yang lain:
int checkboard(void) { #ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET puts("BOARD : Altera VTDEV5XS1 Virtual Board\n"); #else
4.8. Variabel lingkungan SOCEDS_DEST_ROOT harus disetel ke
/home/user/intelFPGA/16.1/embedded :
export SOCEDS_DEST_ROOT=/home/user/intelFPGA/16.1/embedded
Sekarang, masuklah ke direktori
/home/user/ghrd-16/sockit_ghrd/software/spl_bsp
dan lakukan. Make dapat gagal dengan kesalahan "make: mkpimage: Command not found", tetapi ia harus membuat file
u-boot-spl di path
/ home / user / ghrd-16 / sockit_ghrd / software / spl_bsp / uboot-socfpga / spl / u-boot-spl .
4.9. Menguji preloader
4.9.1. Anda tidak memerlukan gambar FPGA (yang memiliki ekstensi ".sof") untuk menjalankan preloader. Jalankan DS-5, dan buka "Run / Debug configuration".
4.9.2. Di bidang
Koneksi harus diatur opsi
CV SoCKit 1-1 . Jika tidak, tekan tombol "Browse" dan atur opsi ini. Jika kesalahan muncul, lakukan 3.1-3.2.
4.9.3. Atur file
u-boot-spl pada tab Files, di bidang “Application on host to download”: / home / user / ghrd-16 / sockit_ghrd / software / spl_bsp / uboot-socfpga / spl / u-boot-spl . Atur bendera "Muat simbol". Kosongkan bidang "File".
4.9.4. Nonaktifkan peluncuran skrip debugging pada tab Debugging.
4.9.5. Jalankan utilitas terminal (misalnya,
layar ) dan tekan tombol "Debug". Preloader dimuat ke dalam memori dan debugger siap diluncurkan. Tekan tombol "Lanjutkan" (atau F8) dan lihat pesannya:
U-Boot SPL 2013.01.01 (Jun 24 2017 - 19:49:33) ARM preloader build by 32-bit.me CLOCK: EOSC1 clock 25000 KHz CLOCK: EOSC2 clock 25000 KHz CLOCK: F2S_SDR_REF clock 0 KHz CLOCK: F2S_PER_REF clock 0 KHz CLOCK: MPU clock 925 MHz CLOCK: DDR clock 400 MHz CLOCK: UART clock 100000 KHz CLOCK: MMC clock 50000 KHz CLOCK: QSPI clock 370000 KHz RESET: COLD SDRAM: Initializing MMR registers SDRAM: Calibrating PHY SEQ.C: Preparing to start memory calibration SEQ.C: CALIBRATION PASSED SDRAM: 1024 MiB ALTERA DWMMC: 0 Card did not respond to voltage select! spl: mmc init failed: err - -17
Ini berarti preloader mulai berhasil.
4.9.6. Setelah sesi debugging, tekan tombol "Putus Dari Target" dan "Hapus Koneksi".
5. Tulis Hello World untuk mode bare-metal.
5.1. Unduh proyek ArrowSocKit_BareMetal_GNU.zip. Atur variabel lingkungan seperti pada 2.1., Jalankan DS-5, impor proyek dari arsip (
File / Impor / Proyek yang Ada ke dalam Workspace ,
Pilih file arsip ). Proyek yang belum dibongkar muncul di direktori / home / user / DS-5-Workspace / BareMetalBoot-GNU.
5.2. Anda dapat mencoba membangun proyek dengan
make
, tetapi belum dapat dibangun. Untuk membangun proyek, lakukan hal berikut.
5.3. Salin direktori
/home/user/intelFPGA/16.1/embedded/ip/altera/hps/altera_hps/hwlib ke
/ home / user / DS-5-Workspace / . Berikut adalah folder
src dan
sertakan , dan masing-masing ada direktori
soc_cv_av dan
soc_a10 . Anda dapat menghapus direktori bernama
soc_a10 . Kemudian salin file libcs3.a, libcs3arm.a, libcs3unhosted.a dari /home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/arm-altera-eabi/lib
. ke direktori proyek (/ home / user / DS-5-Workspace / BareMetalBoot-GNU). Salin file arm-names.inc dari /home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/arm-altera-eabi/lib/cortex-a9/ ke
/ home / user / DS- 5-Workspace / BareMetalBoot-GNU / .
5.4. Dalam perubahan Makefile "CROSS_COMPILE: = arm-none-eabi-" menjadi "CROSS_COMPILE: = arm-altera-eabi-". Juga ubah jalur ke
hlib
: HWLIBS_ROOT: = / home / user / DS-5-Workspace / hwlib
5.5. Sekarang jalankan
make
. dan baca semua pesan kesalahan. Jika
make
tidak dapat menemukan simbol, Anda harus menemukannya di direktori hwlib / src / soc_cv_av dan hwlib / include / soc_cv_av, dan buat salinannya di hwlib / src dan hwlib / sertakan dengan sesuai. Setelah Anda menemukan semua fules, buat gagal dengan kesalahan "mkimage: not found", tetapi itu tidak penting, karena kita hanya perlu file
test.axf .
5.6. Menjalankan aplikasi
5.6.1. Untuk menjalankan aplikasi, perlu memuat gambar FPGA (file .sof), yang dihasilkan saat kami membuat preloader. Jalankan programmer seperti yang kami lakukan pada 2.1. Harus ada tulisan "CV SoCKit [1-1]" di sebelah kanan "Hardware Setup". Jika tidak ada, Anda harus mengatur izin menulis untuk port JTAG (lihat di atas) dan klik tombol Pengaturan Perangkat Keras.
5.6.2. Klik "Deteksi Otomatis" dan pilih opsi arbitrer dari daftar. Anda melihat konfigurasi dua perangkat: satu adalah apa yang Anda pilih (misalnya, 5CSEBA6) dan yang kedua adalah SOCVHPS. Hapus perangkat pertama: pilih dan tekan Delete. Tekan "Tambah File" dan buka file gambar (/home/user/ghrd-16/sockit_ghrd/output_files/soc_system.sof). Perangkat baru muncul di sebelah kanan SOCVHPS. Pindahkan dengan mouse ke tempat pertama dalam rantai. Setelah ini, tekan Mulai dan unggah gambar.
5.6.3. Di DS-5 buka "Konfigurasi Debug" pada tab "File". Atur file
u-boot-spl pada baris "Application on host to download". Hapus tanda pada "Load Symbols". Atur file "test.axf" di baris "Files". Pada tab Debugger periksa "Jalankan skrip debugger inisialisasi target" dan setel file skrip "debug-unhosted.ds", yang terletak di direktori proyek th. Dalam file edit path ke preloader:
# Load the SPL preloader into memory.
#
loadfile "/home/user/ghrd-16/sockit_ghrd/software/spl_bsp/uboot-socfpga/spl/u-boot-spl" 0x0
Jalankan
layar terminal TTY dan tekan Debug. Kemudian preloader akan mulai, aplikasi akan diunggah, dan debugger akan ditetapkan pada titik awal program. Tekan tombol "Lanjutkan". Di jendela terminal Anda akan melihat output preloader, seperti yang ditunjukkan di atas, lalu yang berikut:
Disabled interrupts because preloader enabled ECC interrupts. Global Timer value at startup = 0x000000005A10B609 CPU frequency is 925000000 hertz. DDR frequency is 400000000 hertz. MPU peripheral frequency is 231250000 hertz. MB ZERO remapped to SDRAM. L3 interconnect remapped as inaccessible and SDRAM. Interrupt controller system API initialized. MMU initialized and enabled. L1 and L2 cache system initialized and enabled. GIC interrupts enabled. PIT started. PIT interrupt registered and enabled. GPIOs initialized. UART0 initialized. L3 interconnect remapped as accessible and SDRAM. Bridges initialized. Boot completed. Boot milestones: New buffer !ESTONE : GT TICKCOUNT : INCREMENTAL : CUMULATIVE initial GT : 0x000000005A10B609 : 0.000us : 0.000us frequency capture : 0x000000005A119D58 : 256.065us : 256.065us initial remapping : 0x000000005A11C936 : 48.562us : 304.627us interrupt sys init : 0x000000005A139FED : 521.094us : 825.721us mmu init : 0x000000005A62D774 : 22449.985us : 23275.706us cache init : 0x000000005A65CF96 : 841.488us : 24117.194us interrupts enabled : 0x000000005A65D0D7 : 1.388us : 24118.582us pit start : 0x000000005A65DD2E : 13.661us : 24132.242us pit enabled : 0x000000005A65DF67 : 2.461us : 24134.703us gpio init : 0x000000005A65FC12 : 31.736us : 24166.439us uart0 init : 0x000000005A66084D : 13.539us : 24179.978us fpga config : 0x0000000000000000 : 79769704095969360.000us : 79769704095993552.000us last remapping : 0x000000005A660981 : 6558428.303us : 24181.310us bridge init : 0x000000005A6611B6 : 9.085us : 24190.396us complete : 0x000000005A661222 : 0.467us : 24190.863us Hello world, 32bit-me!
Selamat! Anda baru saja menjalankan aplikasi bare-metal pertama Anda pada inti Cortex-A9.