STM32MP1: U-Boot, Buildroot, Arch Linux dan sedikit Debian

Halo, Habr!

Beberapa waktu lalu, STMicroelectronics meluncurkan prosesor seri STM32MP1 yang menarik. Ketika saya akhirnya mendapatkan papan debug yang didasarkan pada prosesor ini, saya terkejut menemukan bahwa itu tidak memiliki build berdasarkan distribusi populer (Debian, Arch Linux, dll.). Yang tersisa hanyalah mencoba mengadaptasi beberapa kit distribusi untuk papan ini sendiri. Berdasarkan hasil ini, artikel ini muncul.



Apa saja karakteristiknya?


Artikel ini tidak akan lengkap tanpa setidaknya gambaran umum singkat tentang karakteristik prosesor seri STM32MP1. Ada tiga keluarga prosesor dalam seri STM32MP1: STM32MP151, STM32MP153, dan STM32MP157. Karakteristik utama mereka diberikan dalam tabel.



Seperti yang dapat Anda lihat dari tabel, perbedaan antara keluarga adalah bahwa STM32MP151 memiliki satu inti Cortex-A7, sementara STM32MP153 dan STM32MP157 memiliki dua inti seperti itu, dan STM32MP157 juga memiliki dukungan GPU 3D. Namun secara umum, karakteristik prosesor ini pada tahun 2020 tidak membuat kesan, mereka agak sederhana. Mengapa saya masih memperhatikan mereka?

Kenapa STM32MP1?


Memang, pertanyaan yang sepenuhnya logis mungkin muncul: apakah ada Raspberry Pi, ada Banana Pi, ada Orange Pi, dan akhirnya - mengapa kita membutuhkan STM32MP1 lainnya? Selain itu, semua papan ini biasanya memiliki kinerja yang jauh lebih tinggi daripada objek penelitian kami. Jawabannya sederhana - saat Anda melakukan kerajinan apa pun untuk digunakan di rumah, itu adalah, Anda perlu mengambil raspberry dan itu akan benar. Tetapi jika kita berbicara tentang produk yang diproduksi secara massal untuk aplikasi industri - di sini hal-hal lain mulai memainkan peran yang menentukan, berkat yang STM32MP1 adalah pemenangnya:

  • Kisaran suhu operasi. Untuk STM32MP1, itu dimulai pada minus 40 derajat, sedangkan untuk banyak prosesor komputer papan tunggal lainnya itu baik jika itu minus 20.
  • . STMicroelectronics , .
  • . DigiKey Mouser STM32MP1, .

Tentu saja, ST32MP1 bukan satu-satunya prosesor di pasar untuk aplikasi industri. Ada NXP dan TI. Adapun TI, saya memiliki proyek modul yang agak rumit berdasarkan itu, dan ada sedimen dari sejumlah fitur perangkat keras yang tidak tercakup dalam dokumentasi, tetapi jika tidak dihormati, prosesor dapat sepenuhnya gagal, dan tidak segera, tetapi seiring waktu dan pada saat yang paling tidak tepat. Selain itu, itu adalah prosesor single-core, dan dengan peningkatan jumlah tugas yang diberikan kepadanya, masalah kinerja semakin sering muncul. Pada saat yang sama, saya berurusan dengan mikrokontroler STMicroelectronics, dan mereka terbukti cukup baik, jadi saya memutuskan untuk mencoba memilih yang baru ini.

Papan debug


Untuk percobaan, saya membeli papan debug STM32MP157A-DK1. Papan ini agak sederhana dalam hal peralatan: tidak memiliki layar LCD seperti STM32MP157C-DK2 atau perangkat yang kaya seperti STM32MP157A-EV1. Namun, ada slot kartu microSD, konsol USB-UART, beberapa port USB dan Ethernet. Untuk awal pertama, lebih dari cukup. Dan untuk mencairkan cerita kering dengan gambar, saya melampirkan foto papan debug ini.



Apa itu dari perangkat lunak siap pakai?


Di STMicroelectronics, semuanya biasanya cukup baik dalam hal perangkat keras, tetapi buruk dalam hal perangkat lunak. Semua modifikasi dari Atollic True Studio, CubeMX, CubeIDE ini, yang semakin buggy dengan setiap rilis baru, membangkitkan beberapa kesedihan. Situasinya sedikit lebih baik dengan dukungan STM32MP1. STMicroelectronics hanya menawarkan perakitan OpenSTLinux tertentu. Majelis ini adalah distribusi yang dibangun menggunakan Proyek Yocto. Tentu saja, semua ini bisa ada dalam bentuk ini, tetapi bagi saya kelemahan utama adalah kurangnya akses ke repositori distribusi terkenal. Ini berarti bahwa Anda tidak akan dapat menggunakan utilitas apa pun dari repositori distribusi populer di papan Anda hanya dengan menjalankan perintah seperti apt-get install. Seringkali ini tidak diperlukan untuk solusi tertanam, tetapi situasi mungkin,ketika kesempatan seperti itu pasti tidak akan berlebihan.

Apa yang kita lakukan?


Jadi, tugasnya jelas - kita perlu menjalankan beberapa distribusi populer di papan debug kita. Pilihan saya jatuh pada Arch Linux. Ini bukan distribusi yang paling mudah, tetapi ini disesuaikan dengan baik untuk perangkat ARM: ada rakitan siap pakai dan situs resmi yang didedikasikan untuk ini.

Hal pertama yang saya coba untuk memecahkan masalah dengan snap - saya baru saja menyelinap inti siap bootloader dari distribusi Arch Linux, berkumpul di bawah armv7. Ini kadang-kadang bekerja di papan lain, tetapi ada kegagalan menunggu saya: meskipun fakta bahwa kernel dirakit untuk arsitektur yang benar, itu tidak dimulai. Nah, maka Anda perlu merakit kernel Anda dan pada saat yang sama loader Anda. Rencana tindakan saya adalah ini:

  1. Bangun bootloader U-Boot.
  2. Bangun kernel Linux.
  3. Kami menandai kartu microSD.
  4. Kami menulis bootloader, kernel dan sistem file root ke kartu microSD.
  5. Keuntungan

Persiapan perakitan


Untuk mengimplementasikan rencana ini, kita memerlukan komputer dengan Linux dan pembaca kartu untuk merekam pada kartu microSD. Saya menggunakan laptop dengan Debian 10, tetapi secara umum ini tidak penting, nama-nama utilitas mungkin hanya sedikit berbeda. Jadi, kami menempatkan utilitas yang diperlukan. Saya segera mencatat bahwa sekarang dan selanjutnya semua perintah harus dijalankan sebagai root atau melalui sudo.

apt-get install git
apt-get install make
apt-get install gcc
apt-get install gcc-arm-linux-gnueabihf
apt-get install bison
apt-get install flex
apt-get install g++
apt-get install rsync
apt-get install libncurses-dev

Dalam persiapan untuk perakitan, kami membuat tiga direktori di direktori kerja: u-boot (untuk bootloader), buildroot (untuk sistem build) dan archlinux (untuk distribusi):

mkdir u-boot
mkdir buildroot
mkdir archlinux

Kami akan membutuhkan direktori ini lebih lanjut. Saya akan merujuk nama-nama ini nanti dalam teks artikel.

Rakitan U-boot


Banyak artikel telah ditulis tentang U-Boot, dan sebagai bagian dari ini, saya tidak akan menjelaskan dengan mendalam apa itu, untuk apa, dan bagaimana cara kerjanya. Saya hanya bisa mengatakan bahwa ini adalah bootloader yang menyediakan startup Linux pada perangkat ARM. Kode sumber untuk bootloader U-Boot tersedia di GitHub.

Untuk membangun U-Boot, pertama-tama kita mengkloning repositori U-Boot ke direktori u-boot yang kita buat sebelumnya:

git clone https://github.com/u-boot/u-boot

Untuk berhasil membangun U-Boot, kita memerlukan file tree perangkat dan file konfigurasi U-Boot.

File tree perangkat adalah file yang tergantung pada perangkat. File ini menjelaskan konfigurasi prosesor untuk papan tertentu. Jika Anda membuat perangkat keras berdasarkan prosesor ARM dan berencana menjalankan Linux di atasnya, maka Anda perlu mengembangkan file hierarki perangkat Anda untuk itu (atau mengadaptasi beberapa yang sudah jadi). Namun, banyak papan debug sudah memiliki file yang sudah jadi: pengembang U-Boot yang peduli memasukkannya ke dalam repositori mereka. Jadi, lihatlah direktori u-boot / arch / arm / dts. Seharusnya berisi file stm32mp157a-dk1.dtb - ini adalah file tree perangkat untuk papan debug kami.

Dalam file konfigurasi U-Boot, pengaturan bootloader dasar ditulis.

Mengkonfigurasi U-Boot dari awal adalah proses yang agak panjang dan melelahkan, karena ada begitu banyak pengaturan. Untuk tujuan ini, ada baik konsol konfigurasi maupun grafis. Namun, di sini kami beruntung: di direktori u-boot / configs ada file stm32mp15_basic_defconfig . Ini adalah file konfigurasi dasar U-Boot untuk papan debug STM32MP15. Kami membuka file ini dan melihat bahwa bagi kami untuk memulainya dengan cepat sudah cukup untuk mengubah hanya satu baris: sebagai gantinya

CONFIG_DEFAULT_DEVICE_TREE=”stm32mp157c-ev1”

menulis

CONFIG_DEFAULT_DEVICE_TREE=”stm32mp157a-dk1”

Dengan baris ini, kami memberi tahu bootloader bahwa kami perlu menggunakan file bagan perangkat untuk board kami.

Sekarang Anda siap untuk membangun U-Boot. Kami menggunakan konfigurasi kami:

make CROSS_COMPILE=arm-linux-gnueabihf- stm32mp15_basic_defconfig

Dan jalankan perakitan:

make CROSS_COMPILE=arm-linux-gnueabihf-

Jika semuanya berjalan lancar, maka di direktori u-boot kita harus memiliki banyak file. Dari jumlah tersebut, ada dua yang menarik bagi kami: u-boot-spl.stm32 dan u-boot.img .

File pertama adalah yang disebut First Stage Boot Loader (FSBL). Itu terletak di depan U-Boot, mulai pertama dan menginisialisasi memori DDR3, yang diperlukan untuk memulai U-Boot. Di papan lain, FSBL sering digabungkan dengan U-Boot menjadi satu gambar, tetapi di sini Anda harus menulis setiap gambar ke USB flash drive secara terpisah.

Itu saja dengan U-Boot untuk saat ini, simpan file yang ditunjuk dan lanjutkan langsung ke perakitan kernel Linux.

Rakitan kernel Linux


Saya akan menggunakan Buildroot untuk membangun kernel Linux. Tentu saja, untuk tujuan ini, Anda dapat menggunakan Yocto yang sama populernya, atau bahkan mencoba membangun kernel dari sumber dari kernel.org. Namun, saya memiliki beberapa pengalaman bekerja dengan Buildroot, jadi saya memutuskannya. Selain itu, Buildroot juga membangun sistem file root (rootfs) dan bahkan loader U-Boot.

Sekarang, dengan cara apa pun yang tersedia, unduh arsip dari Buildroot dari situs web resmi , buka kemasannya ke direktori buildroot dan buka.

Seperti dalam kasus U-Boot, hal pertama yang perlu Anda perhatikan adalah file konfigurasi untuk perangkat keras kami.

Kami pergi ke direktori buildroot / configs dan melihat bahwa pengembang telah menambahkan file konfigurasi untuk papan kami: ada filestm32mp157a_dk1_defconfig (berlaku untuk buildroot-2020.05 build, dalam versi sebelumnya dari file ini belum ada).

Saya mencoba membangun kernel 5.4.26 menggunakan file konfigurasi ini, dan umumnya berhasil dimulai di board saya. Namun, untuk beberapa alasan, file tree perangkat Linux dalam majelis ini ternyata terpotong: secara default bahkan tidak ada dukungan untuk port USB. Semoga saja seiring waktu bug ini diperbaiki, tetapi apa yang harus dilakukan sekarang?

Saya membuka masalah ini di Google dan menemukan repositori STMicroelectronics, di mana saya menemukan Linux 4.19 sumber dengan tambalan untuk produk mereka. Termasuk, file DTB yang benar juga ada di sana. Tetap memberi tahu Buildroot untuk menggunakan repositori ini ketika membangun kernel. Untuk melakukan ini, salin file stm32mp157a_dk1_defconfig dan ganti namanya menjadi stm32mp157a_dk1_new_defconfig . Buka dan buat perubahan berikut:

Sebagai gantinya

BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_5_4=y

Kami menulis

BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_19=y

Sebagai gantinya

BR2_LINUX_KERNEL_CUSTOM_VERSION=y
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="5.4.26"

Kami menulis

BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,STMicroelectronics,linux,v4.19-stm32mp-r1.2)/linux-v4.19-stm32mp-r1.2.tar.gz"

Simpan dan tutup file. File konfigurasi sudah siap, mari kita terapkan (Anda perlu menjalankannya dari direktori buildroot):

make CROSS_COMPILE=arm-linux-gnueabihf- stm32mp157a_dk1_new_defconfig

Perintah ini akan mentransfer informasi dari file konfigurasi kami stm32mp157a_dk1_defconfig ke file .config, yang terletak di direktori buildroot. Di masa depan, perakitan akan dibangun berdasarkan file .config.

Jadi, sekarang semuanya hampir siap untuk memulai proses build, tetapi sebelum itu Anda perlu mengkonfigurasi kernel kami.

Di sini perlu dikatakan bahwa secara default fungsi minimal akan dimasukkan dalam kernel. Jika kita ingin mengembangkannya, maka kernel perlu dikonfigurasi untuk diri kita sendiri. Minimal, Anda perlu menambahkan dukungan untuk Grup Kontrol ke kernel: tanpa ini, Arch Linux kami tidak akan mulai. Selain itu, sebagai contoh, saya akan menunjukkan cara menambahkan dukungan untuk drive USB-flash ke kernel: sebagai hasilnya, papan debug kami akan dapat bekerja dengan drive flash.
Untuk memulai konfigurator kernel dari direktori buildroot, jalankan perintah

make linux-menuconfig

dan pergi minum teh. Proses ini tidak cepat dan tergantung pada kekuatan komputer Anda dapat berlangsung dari lima belas menit hingga beberapa jam. Penting: selama pekerjaan buildroot Anda memerlukan koneksi yang stabil ke Internet, banyak paket berbeda akan diunduh.
Jika dalam proses muncul kesalahan

configure: error: you should not run configure as root (set FORCE_UNSAFE_CONFIGURE=1 in environment to bypass this check)
See `config.log' for more details

akan perlu menjalankan perintah

export FORCE_UNSAFE_CONFIGURE=1

dan restart konfigurator kernel.

Akibatnya, jendela konfigurator akan muncul:



Tambahkan dukungan Grup Kontrol: Pengaturan umum -> Dukungan Grup Kontrol dan atur tanda bintang dengan spasi:



Dan bagaimana cara menambahkan dukungan flash drive?
SCSI . 80- , , , USB FLASH . Device Drivers -> SCSI support :



USB FLASH . Device Drivers -> USB support USB Mass Storage support:



, FLASH : File systems -> Native language support -> Codepage 437 File systems -> Native language support -> NLS ISO 8859-1:





, USB FLASH .

Setelah semua pengaturan di konfigurator kernel dibuat, simpan dengan tombol Simpan dan keluar dari konfigurator dengan tombol Keluar .

Sekarang tinggal memulai proses pembangunan dengan perintah:

make CROSS_COMPILE=arm-linux-gnueabihf-

dan Anda bisa minum teh untuk kedua kalinya, proses ini juga membutuhkan banyak waktu.

Jika semuanya berjalan dengan lancar, maka set file berikut akan muncul di direktori buildroot / output / images:

  • rootfs.ext2 adalah sistem file root yang dikompilasi dengan ext2. Itu tidak menarik bagi kami;
  • rootfs.ext4 adalah sistem file root yang dikompilasi dengan ext4. Ini akan berguna bagi kita nanti;
  • sdcard.img - Gambar kartu microSD, termasuk FSBL + U-Boot + zImage + rootfs. File untuk pemalas, ini memungkinkan Anda untuk tidak repot menandai kartu microSD dan segera mengunggah seluruh sistem ke dalamnya. Tentu saja, ini bukan cara kami :).
  • stm32mp157a-dk1.dtb - file pohon perangkat. Pastikan berguna untuk memulai sistem;
  • u-boot.img dan u-boot-spl.stm32 - file FSBL dan U-Boot. Karena kami mengumpulkannya pada langkah terakhir, kami tidak membutuhkannya;
    Mengapa kami mengumpulkannya secara terpisah?
    , Buildroot U-Boot. , . U-Boot, – Linux.
  • zGambar - jantung dari seluruh sistem - file kernel Linux yang terkompresi.

Jadi, proses perakitan selesai, sekarang kami melanjutkan untuk menandai kartu memori microSD dan membuat partisi di atasnya.

Partisi dan bagian kartu microSD


Menandai kartu microSD dan membuat partisi adalah tahap yang sangat penting, sangat terkait dengan platform perangkat keras tertentu. Sayangnya, informasi tentang masalah ini pada prosesor tertentu tidak selalu mudah ditemukan, dan bahkan jika Anda mengumpulkan U-Boot yang berfungsi penuh dan kernel Linux, semua ini tidak akan bekerja dengan kesalahan sedikit pun dalam tata letak kartu microSD.

Segera, saya perhatikan bahwa kartu microSD yang dengannya sistem diluncurkan pada STM32MP1 harus memiliki markup GPT. Utilitas gdisk akan membantu kita dengan ini , tetapi lebih lanjut tentang itu nanti.

Bagian kartu microSD akan terlihat seperti ini:



Seperti yang dapat Anda lihat dari gambar, kartu harus mengandung setidaknya 5 partisi: fsbl1, fsbl2, ssbl, kernel, rootfs. Selain itu, Anda juga dapat membuat satu atau beberapa bagian data untuk menyimpan informasi apa pun di dalamnya.

Bagian fsbl1 dan fsbl2 benar-benar identik dan bootloader primer ditulis untuk mereka (seperti yang Anda ingat, ini adalah file u-boot-spl.stm32 yang kami terima selama proses perakitan U-Boot). Terlepas dari kenyataan bahwa semuanya harus bekerja dan hanya dengan satu bagian seperti itu, dokumentasi tentang STM2MP1 merekomendasikan untuk melakukan keduanya. Persyaratan lain berlaku untuk bagian ini:

  • Setiap partisi harus berukuran 256 KB.
  • , fsbl (fsbl1 fsbl2). : , .

Bagian ssbl dimaksudkan untuk menulis bootloader U-Boot (file u-boot.img yang kami terima selama proses perakitan U-Boot). Ukuran partisi ssbl yang disarankan adalah 2 MB.
Bagian kernel dimaksudkan untuk menulis padanya kernel Linux (file zImage ), pohon perangkat ( file stm32mp157a-dk1.dtb ), serta skrip untuk U-Boot, yang dengannya sistem akan diluncurkan. Ukuran partisi kernel yang disarankan adalah 64 MB.

Bagian rootfs adalah untuk menulis sistem file root. Kami akan mencoba menulis kepadanya sistem file root yang dikompilasi oleh Buildroot, serta sistem file root Arch Linux. Ukuran partisi rootfs yang disarankan adalah 1 GB atau lebih.
Bagian data dimaksudkan untuk menyimpan data pengguna. Anda dapat membuat satu atau beberapa bagian. Dan Anda dapat melakukannya tanpa itu sama sekali. Pada artikel ini, saya tidak akan membuat bagian ini.

Jadi, kami mulai melakukan markup. Kami memasukkan kartu microSD ke pembaca kartu komputer kami dengan Linux on board dan menggunakan sarana apa pun yang tersedia (misalnya, menggunakan dmesg) menentukan nama perangkat yang muncul. Dalam kasus saya, ini adalah / dev / sdb. Dalam kasus Anda, itu mungkin nama yang berbeda.

Jalankan utilitas gdisk dan hapus markup sepenuhnya pada kartu microSD:

root@debian:/home/myuser# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.3
Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): x
Expert command (? for help): z
About to wipe out GPT on /dev/sdb. Proceed? (Y/N): y
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
Blank out MBR? (Y/N): y

Untuk jaga-jaga, kami memalu awal kartu microSD dengan nol.

dd if=/dev/zero of=/dev/sdb bs=1M count=64

Sekarang jalankan gdisk lagi, tambahkan markup dan buat 5 partisi pada kartu microSD sesuai dengan tabel yang saya berikan di atas:

root@debian:/home/myuser# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-30873566, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-30873566, default = 30873566) or {+-}size{KMGTP}: +256K
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): n
Partition number (2-128, default 2): 2
First sector (34-30873566, default = 4096) or {+-}size{KMGTP}: 
Last sector (4096-30873566, default = 30873566) or {+-}size{KMGTP}: +256K
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): n
Partition number (3-128, default 3): 3
First sector (34-30873566, default = 6144) or {+-}size{KMGTP}: 
Last sector (6144-30873566, default = 30873566) or {+-}size{KMGTP}: +2M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): n
Partition number (4-128, default 4): 4
First sector (34-30873566, default = 10240) or {+-}size{KMGTP}: 
Last sector (10240-30873566, default = 30873566) or {+-}size{KMGTP}: +64M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): n
Partition number (5-128, default 5): 5
First sector (34-30873566, default = 141312) or {+-}size{KMGTP}: 
Last sector (141312-30873566, default = 30873566) or {+-}size{KMGTP}: 
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

Selanjutnya, tambahkan nama ke bagian pada kartu microSD. Seperti yang Anda ingat, ini sangat penting untuk bagian pertama di mana FSBL akan ditulis: jika Anda tidak menetapkan nama yang diperlukan untuk mereka, sistem tidak akan memulai:

root@debian:/home/myuser# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): c
Partition number (1-5): 1
Enter name: fsbl1

Command (? for help): c
Partition number (1-5): 2
Enter name: fsbl2

Command (? for help): c
Partition number (1-5): 3
Enter name: ssbl

Command (? for help): c
Partition number (1-5): 4
Enter name: kernel

Command (? for help): c
Partition number (1-5): 5
Enter name: roootfs

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

Di akhir pekerjaan dengan kartu microSD, kita perlu menambahkan atribut bootable BIOS lawas ke bagian di mana kita akan menulis kernel Linux. Tanpa atribut ini, kernel menolak untuk memulai:

root@debian:/home/myuser# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): x

Expert command (? for help): a
Partition number (1-5): 4
Known attributes are:
0: system partition
1: hide from EFI
2: legacy BIOS bootable
60: read-only
62: hidden
63: do not automount

Attribute value is 0000000000000000. Set fields are:
  No fields set

Toggle which attribute field (0-63, 64 or <Enter> to exit): 2
Have enabled the 'legacy BIOS bootable' attribute.
Attribute value is 0000000000000004. Set fields are:
2 (legacy BIOS bootable)

Toggle which attribute field (0-63, 64 or <Enter> to exit): 

Expert command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

Itu saja, tata letak kartu memori sudah siap. Untuk jaga-jaga, periksa apakah semuanya sudah direkam sebagaimana mestinya. Untuk melakukan ini, jalankan gdisk lagi dan jalankan perintah p . Hasilnya harus memberi tahu gambar:



Sekarang buat sistem file ext4 di / dev / sdb4 dan / dev / sdb5:

mkfs.ext4 /dev/sdb4
mkfs.ext4 /dev/sdb5

Dan kami meresepkan label volume sehingga nantinya lebih mudah untuk mengaksesnya:

e2label /dev/sdb4 kernel
e2label /dev/sdb5 rootfs

Ini melengkapi pembuatan bagian dari kartu memori, Anda dapat melanjutkan untuk menulis file ke sana.

Rekaman kartu microSD


Jadi, pada tahap saat ini, semuanya siap untuk direkam pada kartu microSD. Kami memasukkannya ke pembaca kartu komputer Linux dan menulis bootloader primer (FSBL) di bagian pertama dan kedua dari kartu mocroSD:

dd if=u-boot/u-boot-spl.stm32 of=/dev/sdb1
dd if=u-boot/u-boot-spl.stm32 of=/dev/sdb2

Sekarang tulis U-Boot ke bagian ketiga kartu microSD:

dd if=u-boot/u-boot.img of=/dev/sdb3

Selanjutnya, Anda perlu menyalin kernel, file tree perangkat dan skrip boot ke bagian keempat pada kartu microSD.

Sebelum mulai menyalin file, Anda perlu sedikit penjelasan tentang skrip unduhan. Dalam skrip ini, sebenarnya, berbagai informasi untuk U-Boot diindikasikan, dengan bantuan yang dapat mem-boot sistem dan mentransfer kontrol ke kernel. Ada berbagai cara untuk menulis skrip ini, tetapi yang paling sederhana (menurut saya) dijelaskan dalam dokumentasi untuk STM32MP1: Anda perlu membuat direktori / extlinux di root bagian kernel dan membuat file teks dengan nama extlinux.conf dengan konten berikut:

LABEL stm32mp157a-dk1
KERNEL /zImage
FDT /stm32mp157a-dk1.dtb
APPEND root=/dev/mmcblk0p5 rootwait rw console=ttySTM0,115200

Semuanya cukup sederhana di sini: kami memberi tahu loader tempat untuk mendapatkan kernel, bagan perangkat, sistem file root, dan mengatakan bahwa kami akan memiliki port ttySTM0 sebagai konsol yang berfungsi.

Sekarang salin kernel:

cp -a buildroot/output/images/zImage /media/myuser/kernel/

Catatan: di direktori / media / myuser /, saya memasang kartu microSD ketika dipasang di pembaca kartu. Dalam kasus Anda, ini mungkin direktori yang berbeda.

Salin file hierarki perangkat:

cp -a buildroot/output/images/stm32mp157a-dk1.dtb /media/myuser/kernel/

Buat direktori:

mkdir /media/myuser/kernel/extlinux

Buat file:

nano /media/myuser/kernel/extlinux/extlinux.conf

dan isi dengan isinya:

LABEL stm32mp157a-dk1
KERNEL /zImage
FDT /stm32mp157a-dk1.dtb
APPEND root=/dev/mmcblk0p5 rootwait rw console=ttySTM0,115200

Simpan file dan tutup editor.

Mengenai hal ini, bagian keempat dari kartu microSD sudah siap: kernel linux dan semua file tambahan untuk itu sudah ditulis. Sudah pada tahap ini, jika Anda memasukkan kartu microSD ke papan debug, kernel Linux harus dimuat, namun, pada akhirnya itu akan menabrak panik kernel karena fakta bahwa sistem file root tidak dapat dipasang. Ini tidak mengejutkan, karena kami telah mencatatnya sejauh ini.

Ada tahap terakhir, di mana kita akan menulis sistem file root ke kartu microSD. Dan di sini berbagai opsi dimungkinkan:

  1. Tulis sistem file root yang dihasilkan oleh Buildroot
  2. Tulis ulang sistem file root Arch Linux

Pertama, tuliskan sistem file root yang dihasilkan Buildroot untuk kami dan cobalah untuk memulainya. Ini bukan tujuan artikel ini, tetapi bagi saya tampaknya secara umum mungkin berguna untuk aplikasi apa pun, terutama karena tindakan ini tidak memakan banyak waktu. Sistem file root ditulis ke bagian kelima dari kartu microSD kami hanya dengan satu perintah:

dd if=buildroot/output/images/rootfs.ext4 of=/dev/sdb5

Sekarang masukkan kartu memori ke papan debug dan mulai sistem. Kami akan mengamati output informasi debugging melalui konsol USB-UART: akses ke sana disediakan melalui port microUSB pada papan STM32MP157A-DK1. Menampilkan informasi yang ditampilkan dimungkinkan dalam program terminal apa pun, misalnya Putty atau Minicom. Untuk keperluan artikel ini, saya menggunakan yang terakhir dengan membuka jendela terminal lain di Debian.

Sekarang kita memasukkan kartu microSD ke papan debug, memasok daya ke papan dan melihat terminal. Jika semuanya dilakukan dengan benar, maka log kernel FSBL, U-Boot, harus dituangkan di sana dan pada akhirnya - undangan untuk memasuki login akan muncul. Kita memasuki root dan - voila - kita menuju konsol sistem yang baru saja kita kumpulkan:



Ya, ia bahkan tidak memiliki pengelola paket, dan secara umum fungsinya sangat buruk, tetapi dengan bantuan Buildroot Anda dapat membuatnya dengan sangat keren dan membuat sistem yang sangat kompleks. Sementara itu, ukurannya hanya 7 megabyte!



Setelah memastikan bahwa sistem file root buatan sendiri berhasil dijalankan, sekarang saatnya untuk memulai Arch Linux. Sekali lagi, masukkan kartu microSD ke pembaca kartu komputer kita dan format lagi bagian kelima dari kartu memori:

mkfs.ext4 /dev/sdb5

Unduh arsip dengan Arch Linux, yang dikumpulkan di bawah armv7, dari situs resmi. Buka paket arsip ke direktori archlinux dan gunakan perintah:

cp -a archlinux/* /media/myuser/rootfs 

Salin ke bagian rootfs dari kartu microSD.

Kami membersihkan direktori / media / myuser / rootfs / boot: kami tidak memerlukan konten, karena kernel dan bagan perangkat berada di bagian terpisah dari kartu microSD:

rm –rf /media/myuser/rootfs/boot/*

Kemudian, Anda dapat me-mount partisi / dev / sdb4 di direktori boot, di mana kita memiliki imej kernel.

Setelah itu, masukkan kartu microSD ke papan debug, berikan energi dan nikmati kerja ArchLinux:



Setelah Arch Linux berhasil dimulai, saya memutuskan untuk mencoba menjalankan Debian di papan debug juga. Menggunakan manipulasi yang sangat mirip dengan sistem file root, ini berhasil:



Kesimpulan


Dalam perjalanan artikel ini, kami bermain cukup dengan papan debug STM32MP157A-DK1: kami membangun U-Boot, kernel Linux, sistem file root kami sendiri untuk itu, dan juga meluncurkan Arch Linux dan Debian. Saya berharap materi ini akan berguna bagi seseorang baik ketika bekerja dengan prosesor dari keluarga STM32MP1, atau dengan papan tunggal lainnya pada ARM.


All Articles