STM32MP1: U-Boot و Buildroot و Arch Linux وقليلاً من Debian

مرحبا يا هابر!

منذ فترة ، أطلقت شركة STMicroelectronics سلسلة معالجات مثيرة للاهتمام من سلسلة STM32MP1. عندما وضعت يدي أخيرًا على لوحة التصحيح استنادًا إلى هذا المعالج ، فوجئت عندما اكتشفت أنها تفتقر إلى أي بنى تعتمد على التوزيعات الشائعة (Debian ، Arch Linux ، إلخ). كل ما تبقى هو محاولة تكييف بعض أدوات التوزيع لهذه اللوحة بنفسك. بناء على نتائج هذا ، ظهر هذا المقال.



ما هي الخصائص؟


لن تكتمل هذه المقالة بدون نظرة عامة موجزة على الأقل لخصائص معالجات سلسلة STM32MP1. توجد ثلاث مجموعات من المعالجات في سلسلة STM32MP1: STM32MP151 و STM32MP153 و STM32MP157. يتم إعطاء خصائصها الرئيسية في الجدول.



كما ترى من الجدول ، فإن الفرق بين العائلات هو أن STM32MP151 يحتوي على قلب واحد من Cortex-A7 ، في حين أن STM32MP153 و STM32MP157 لهما مركزان ، و STM32MP157 يدعم أيضًا 3D GPU. ولكن بشكل عام ، فإن خصائص هذه المعالجات في عام 2020 لا تترك أي انطباع ، فهي متواضعة إلى حد ما. لماذا ما زلت انتبه لهم؟

لماذا STM32MP1؟


في الواقع ، قد يبرز سؤال منطقي تمامًا: هل هناك Raspberry Pi ، وهناك Banana Pi ، و Orange Pi ، وأخيرًا - لماذا نحتاج إلى STM32MP1 أخرى؟ علاوة على ذلك ، عادةً ما يكون لجميع هذه المجالس أداء أعلى بكثير من هدف دراستنا. الجواب بسيط - أثناء قيامك بأي حرف يدوية للاستخدام المنزلي ، يجب عليك أن تأخذ التوت وسوف يكون ذلك صحيحًا. ولكن إذا كنا نتحدث عن المنتجات التي يتم إنتاجها بكميات كبيرة للتطبيقات الصناعية - فهنا أشياء أخرى تبدأ في لعب دور حاسم ، وبفضله يكون STM32MP1 هو الفائز:

  • نطاق الحرارة الشغالة. بالنسبة لـ STM32MP1 ، يبدأ عند سالب 40 درجة ، في حين أنه بالنسبة للعديد من معالجات أجهزة الكمبيوتر ذات اللوحة الواحدة ، يكون جيدًا إذا كان سالب 20.
  • . STMicroelectronics , .
  • . DigiKey Mouser STM32MP1, .

بالطبع ، ST32MP1 ليس المعالج الوحيد في السوق للتطبيقات الصناعية. هناك كل من NXP و TI. بالنسبة لـ TI ، كان لدي مشروع لوحدة معقدة إلى حد ما بناءً عليها ، وكان هناك رواسب من عدد ملحوظ من ميزات الأجهزة التي لم يتم تغطيتها في الوثائق ، ولكن إذا لم يتم احترامها ، فقد يفشل المعالج تمامًا ، وليس على الفور ، ولكن بمرور الوقت و في أكثر الأوقات غير المناسبة. بالإضافة إلى ذلك ، كان معالجًا أحادي النواة ، ومع زيادة عدد المهام المسندة إليه ، ظهرت مشاكل في الأداء أكثر فأكثر. في الوقت نفسه ، كنت أتعامل مع وحدات التحكم الدقيقة في STMicroelectronics ، وقد أثبتت أنها جيدة جدًا ، لذلك قررت أن أحاول اختيار هذا الصغير الجديد.

لوحة التصحيح


للتجارب ، اشتريت لوحة تصحيح أخطاء STM32MP157A-DK1. هذه اللوحة متواضعة إلى حد ما من حيث المعدات: لا تحتوي على شاشة LCD مثل STM32MP157C-DK2 أو أي جهاز طري غني مثل STM32MP157A-EV1. ومع ذلك ، هناك فتحة لبطاقة microSD ووحدة تحكم USB-UART والعديد من منافذ USB و Ethernet. في البداية ، أكثر من كاف. ولتخفيف القصة الجافة مع صورة ، أرفق صورة لوحة التصحيح هذه.



ما هو من البرامج الجاهزة؟


في STMicroelectronics ، يكون كل شيء جيدًا جدًا من حيث الأجهزة ، ولكنه رهيب من حيث البرامج. كل هذه التعديلات في Atollic True Studio و CubeMX و CubeIDE ، والتي هي عربات التي تجرها الدواب أكثر وأكثر مع كل إصدار جديد ، تثير بعض القلق. الوضع أفضل قليلاً مع دعم STM32MP1. تقدم STMicroelectronics فقط تجميع معين لـ OpenSTLinux. هذا التجميع هو توزيع مبني باستخدام مشروع Yocto. بالطبع ، كل هذا يمكن أن يوجد في هذا الشكل ، ولكن بالنسبة لي كان العيب الرئيسي هو عدم الوصول إلى مستودعات التوزيعات المعروفة. هذا يعني أنك لن تكون قادرًا على وضع أي أداة مساعدة على مستودعاتك من مستودعات التوزيعات الشائعة ببساطة عن طريق تشغيل أمر مثل apt-get install. غالبًا لا يكون هذا مطلوبًا للحلول المضمنة ، ولكن المواقف ممكنة ،عندما تكون هذه الفرصة بالتأكيد غير ضرورية.

ماذا نفعل؟


لذا ، فإن المهمة واضحة - نحتاج إلى تشغيل بعض التوزيع الشائع على لوحة التصحيح لدينا. وقع اختياري على Arch Linux. ليست هذه هي أسهل التوزيع، لكنها تتكيف بشكل جيد لأجهزة ARM: هناك جمعيات الجاهزة والرسمي موقع مخصص لذلك.

أول شيء حاولت حل المشكلة باستخدام المفاجئة - ما عليك سوى سحب قلب محمل الإقلاع الجاهز من توزيع Arch Linux ، الذي تم تجميعه تحت armv7. نجح هذا في بعض الأحيان في لوحات أخرى ، ولكن كان هناك إخفاق في انتظاري: على الرغم من حقيقة أن النواة تم تجميعها من أجل الهندسة الصحيحة ، إلا أنها لم تبدأ. حسنًا ، فأنت بحاجة إلى تجميع النواة الخاصة بك وفي نفس الوقت اللودر الخاص بك. كانت خطة العمل الخاصة بي على النحو التالي:

  1. قم بإنشاء محمّل إقلاع U-Boot.
  2. بناء نواة لينكس.
  3. نحتفل ببطاقة microSD.
  4. نكتب محمل الإقلاع والنواة ونظام الملفات الجذرية على بطاقة microSD.
  5. الربح

إعداد التجميع


لتنفيذ هذه الخطة ، نحتاج إلى جهاز كمبيوتر يعمل بنظام Linux وقارئ بطاقات للتسجيل على بطاقة microSD. استخدمت جهاز كمبيوتر محمول مع دبيان 10 ، ولكن بشكل عام هذا ليس مهمًا ، قد تختلف أسماء الأدوات قليلاً. لذا ، نضع المرافق المطلوبة. ألاحظ على الفور أنه يجب الآن تنفيذ جميع الأوامر كجذر أو من خلال 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

استعدادًا للتجميع ، نقوم بإنشاء ثلاثة دلائل في دليل العمل: u-boot (لـ bootloader) و buildroot (لبناء النظام) و archlinux (للتوزيع):

mkdir u-boot
mkdir buildroot
mkdir archlinux

سنحتاج هذه الأدلة أكثر. سأشير إلى هذه الأسماء لاحقًا في نص المقالة.

تجميع U-boot


لقد تم بالفعل كتابة الكثير من المقالات حول U-Boot ، وكجزء من هذا ، لن أتعمق في شرح ما هو ، وما هو الغرض وكيف يعمل. لا يسعني إلا أن أقول أن هذا هو برنامج تحميل يوفر بدء تشغيل Linux على أجهزة ARM. الكود المصدري لبرنامج تحميل U-Boot متاح على GitHub.

من أجل إنشاء U-Boot ، أولاً نقوم بنسخ مستودع U-Boot في دليل u-boot الذي أنشأناه سابقًا:

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

لإنشاء U-Boot بنجاح ، نحتاج إلى ملف شجرة جهاز وملف تكوين U-Boot.

ملف شجرة الجهاز هو ملف تابع للجهاز. يصف هذا الملف تكوين المعالج للوحة معينة. إذا قمت بإنشاء جهازك بناءً على أي معالج ARM وتخطط لتشغيل Linux عليه ، فستحتاج إلى تطوير ملف شجرة جهازك له (أو تكييف بعض الأجهزة الجاهزة). ومع ذلك ، تحتوي العديد من لوحات تصحيح الأخطاء بالفعل على ملفات جاهزة: يقوم مطورو U-Boot المهتمون بتضمينها في مستودعهم. لذا ، انظر إلى دليل u-boot / arch / arm / dts. يجب أن يحتوي على ملف stm32mp157a-dk1.dtb - هذا هو ملف شجرة الجهاز للوحة التصحيح.

في ملف تكوين U-Boot ، تتم كتابة إعدادات أداة تحميل التمهيد الأساسية.

تكوين U-Boot من البداية عملية طويلة وشاقة إلى حد ما ، لأن هناك العديد من الإعدادات. لهذه الأغراض ، هناك كل من تكوينات وحدة التحكم والرسوم البيانية. ومع ذلك ، كنا هنا محظوظين: في دليل u-boot / configs يوجد ملف stm32mp15_basic_defconfig . هذا هو ملف التكوين الأساسي لـ U-Boot لألواح تصحيح الأخطاء STM32MP15. نفتح هذا الملف ونرى أنه بالنسبة لنا لبدء تشغيله بسرعة كافية لتغيير سطر واحد فقط: بدلاً من ذلك

CONFIG_DEFAULT_DEVICE_TREE=”stm32mp157c-ev1”

اكتب

CONFIG_DEFAULT_DEVICE_TREE=”stm32mp157a-dk1”

مع هذا الخط ، نقول لمحمّل الإقلاع أننا بحاجة إلى استخدام ملف شجرة الجهاز للوحة لدينا.

أنت الآن جاهز لبناء U-Boot. نستخدم التكوين لدينا:

make CROSS_COMPILE=arm-linux-gnueabihf- stm32mp15_basic_defconfig

وتشغيل التجميع:

make CROSS_COMPILE=arm-linux-gnueabihf-

إذا سار كل شيء بسلاسة ، في دليل u-boot يجب أن يكون لدينا مجموعة من الملفات. من بين هذين ، هناك اهتمامان لنا: u-boot-spl.stm32 و u-boot.img .

الملف الأول هو ما يسمى محمّل التمهيد للمرحلة الأولى (FSBL). وهي تقع أمام U-Boot ، وتبدأ أولاً وتهيئ ذاكرة DDR3 ، وهي ضرورية لبدء U-Boot. في اللوحات الأخرى ، غالبًا ما يتم دمج FSBL مع U-Boot في صورة واحدة ، ولكن هنا يجب عليك كتابة كل صورة على محرك أقراص USB محمول بشكل منفصل.

هذا كل شيء مع U-Boot في الوقت الحالي ، احفظ الملفات المحددة وتابع مباشرة إلى تجميع نواة Linux.

تجميع نواة لينكس


سأستخدم Buildroot لبناء نواة لينكس. بالطبع ، لهذه الأغراض ، يمكنك استخدام Yocto الشائعة بنفس القدر ، أو حتى محاولة بناء النواة من مصدر من kernel.org. ومع ذلك ، كان لدي بعض الخبرة في العمل مع Buildroot ، لذلك قررت ذلك. بالإضافة إلى ذلك ، يقوم Buildroot أيضًا ببناء نظام الملفات الجذر (rootfs) وحتى محمل U-Boot.

الآن ، وبأي وسيلة متاحة ، قم بتنزيل الأرشيف من Buildroot من الموقع الرسمي ، وقم بفكه في دليل buildroot وانتقل إليه.

كما هو الحال في U-Boot ، فإن أول شيء عليك الاهتمام به هو ملف التكوين للأجهزة الخاصة بنا.

ننتقل إلى دليل buildroot / configs ونرى أن المطورين قد أضافوا بالفعل ملف تكوين للوحة لدينا: هناك ملفstm32mp157a_dk1_defconfig (صحيح للبناء Buildroot-2020.05 ، في الإصدارات السابقة من هذا الملف لم يكن هناك بعد).

لقد حاولت بناء نواة 5.4.26 باستخدام ملف التكوين هذا ، وبدأ بشكل عام بنجاح على لوحتي. ومع ذلك ، لسبب ما ، تبين أن ملف شجرة جهاز Linux في هذا التجميع يتم اقتطاعه: بشكل افتراضي لم يكن هناك دعم لمنافذ USB. دعونا نأمل أنه بمرور الوقت سيتم إصلاح هذا الخطأ ، ولكن ماذا تفعل الآن؟

ذهبت لجوجل لهذه المشكلة ووجدت مستودعات STMicroelectronics ، حيث وجدت مصادر Linux 4.19 مع تصحيحات لمنتجاتها. بما في ذلك ، كانت هناك ملفات DTB الصحيحة. يبقى فقط أن نخبر Buildroot باستخدام هذا المستودع عند بناء النواة. للقيام بذلك ، انسخ الملف stm32mp157a_dk1_defconfig وأعد تسميته إلى stm32mp157a_dk1_new_defconfig . افتحها وقم بإجراء التغييرات التالية:

بدلاً من ذلك

BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_5_4=y

نحن نكتب

BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_19=y

في حين أن

BR2_LINUX_KERNEL_CUSTOM_VERSION=y
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="5.4.26"

نحن نكتب

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"

أحفظ وأغلق الملف. ملف التكوين جاهز ، دعنا نطبقه (تحتاج إلى تنفيذه من دليل buildroot):

make CROSS_COMPILE=arm-linux-gnueabihf- stm32mp157a_dk1_new_defconfig

سينقل هذا الأمر المعلومات من ملف التكوين stm32mp157a_dk1_defconfig إلى ملف .config ، الموجود في دليل buildroot. في المستقبل ، سيتم بناء التجميع على أساس ملف .config.

لذا ، أصبح كل شيء جاهزًا تقريبًا لبدء عملية البناء ، ولكن قبل ذلك تحتاج إلى تكوين نواة لدينا.

هنا يجدر القول أنه بشكل افتراضي سيتم تضمين الحد الأدنى من الوظائف في النواة. إذا أردنا توسيعها ، فستحتاج النواة إلى التهيئة لأنفسنا. كحد أدنى ، ستحتاج إلى إضافة دعم لمجموعة التحكم إلى النواة: بدون ذلك ، لن يبدأ Arch Linux. بالإضافة إلى ذلك ، كمثال ، سأوضح كيفية إضافة دعم محركات أقراص USB-flash إلى kernel: ونتيجة لذلك ، ستتمكن لوحة التصحيح من العمل مع محركات الأقراص المحمولة.
لبدء الأمر kernel configurator من دليل buildroot ، قم بتنفيذ الأمر

make linux-menuconfig

وتذهب لشرب الشاي. هذه العملية ليست سريعة واعتمادا على قوة جهاز الكمبيوتر الخاص بك يمكن أن تستغرق من خمس عشرة دقيقة إلى عدة ساعات. هام: أثناء عمل buildroot تحتاج إلى اتصال مستقر بالإنترنت ، سيتم تنزيل العديد من الحزم المختلفة.
إذا حدث خطأ في العملية

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

ستحتاج إلى تنفيذ الأمر

export FORCE_UNSAFE_CONFIGURE=1

وأعد تشغيل أداة ضبط kernel.

نتيجة لذلك ، يجب أن تظهر نافذة أداة التهيئة:



إضافة دعم مجموعة التحكم: الإعداد العام -> دعم مجموعة التحكم وتعيين العلامة النجمية بمسافة:



وكيفية إضافة دعم محرك أقراص فلاش؟
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 .

بعد إجراء جميع الإعدادات في أداة تهيئة kernel ، احفظها باستخدام الزر حفظ واخرج من أداة التكوين باستخدام الزر خروج .

الآن يبقى فقط لبدء عملية البناء بالأمر:

make CROSS_COMPILE=arm-linux-gnueabihf-

ويمكنك شرب الشاي مرة ثانية ، وهذه العملية تستغرق أيضًا الكثير من الوقت.

إذا سار كل شيء بسلاسة ، فيجب أن تظهر مجموعة الملفات التالية في دليل buildroot / output / images:

  • rootfs.ext2 هو نظام ملفات جذر مترجم مع ext2. لا يهمنا.
  • rootfs.ext4 هو نظام ملفات جذر مترجم مع ext4. سيكون مفيدًا لنا بعد قليل ؛
  • sdcard.img - صورة لبطاقة microSD ، بما في ذلك FSBL + U-Boot + zImage + rootfs. ملف للكسل ، يسمح لك بعدم الإزعاج بترميز بطاقة microSD وتحميل النظام بالكامل على الفور. بالطبع هذه ليست طريقتنا :).
  • stm32mp157a-dk1.dtb - ملف شجرة الجهاز. تأكد من أن تكون في متناول اليد لبدء النظام ؛
  • u-boot.img و u-boot-spl.stm32 - ملف FSBL و U-Boot. بما أننا جمعناها في الخطوة الأخيرة ، فنحن لسنا بحاجة إليها ؛
    لماذا جمعناها بشكل منفصل؟
    , Buildroot U-Boot. , . U-Boot, – Linux.
  • zImage - قلب النظام بأكمله - ملف نواة لينكس مضغوط.

لذا ، تم الانتهاء من عملية التجميع ، والآن ننتقل إلى تمييز بطاقة ذاكرة microSD وإنشاء أقسام عليها.

التقسيم وأقسام بطاقة microSD


يعد وضع علامة على بطاقة microSD وإنشاء أقسام مرحلة مهمة جدًا ، وهي مرتبطة بقوة بمنصة أجهزة معينة. لسوء الحظ ، ليس من السهل دائمًا العثور على معلومات حول هذه المشكلة على معالج معين ، وحتى إذا جمعت U-Boot يعمل بكامل طاقته ونواة Linux ، فلن يعمل أي من هذا مع أدنى خطأ في تخطيط بطاقة microSD.

على الفور ، ألاحظ أن بطاقة microSD التي تم تشغيل النظام بها على STM32MP1 يجب أن تحتوي على ترميز GPT. ستساعدنا أداة gdisk في ذلك ، ولكن المزيد عن ذلك لاحقًا.

يجب أن تبدو أقسام بطاقة microSD كما يلي:



كما ترى من الشكل ، يجب أن تحتوي البطاقة على 5 أقسام على الأقل: fsbl1 ، fsbl2 ، ssbl ، kernel ، rootfs. بالإضافة إلى ذلك ، يمكنك أيضًا إنشاء مقطع بيانات واحد أو أكثر لتخزين أي معلومات عليها.

إن قسمي fsbl1 و fsbl2 متطابقان تمامًا ويتم كتابة برنامج تحميل التمهيد الأساسي إليهما (كما تتذكر ، هذا هو ملف u-boot-spl.stm32 الذي تلقيناه أثناء عملية تجميع U-Boot). على الرغم من حقيقة أن كل شيء يجب أن يعمل ومع قسم واحد فقط من هذا القبيل ، فإن الوثائق على STM2MP1 توصي بعمل قسمين. تنطبق متطلبات أخرى على هذه الأقسام:

  • يجب أن يكون حجم كل قسم 256 كيلوبايت.
  • , fsbl (fsbl1 fsbl2). : , .

الغرض من قسم ssbl هو كتابة U-Boot bootloader ( ملف u-boot.img الذي استلمناه أثناء عملية تجميع U-Boot). حجم قسم ssbl الموصى به هو 2 ميجابايت.
قسم kernel مخصص للكتابة إليه Linux kernel (ملف zImage ) ، وشجرة الجهاز ( ملف stm32mp157a-dk1.dtb ) ، بالإضافة إلى البرنامج النصي لـ U-Boot ، الذي سيتم تشغيل النظام معه. حجم قسم النواة الموصى به هو 64 ميغابايت.

قسم rootfs مخصص لكتابة نظام الملفات الجذر. سنحاول أن نكتب إليها نظام الملفات الجذر الذي تم تجميعه بواسطة Buildroot ، وكذلك نظام الملفات الجذر لـ Arch Linux. حجم قسم rootfs الموصى به هو 1 جيجابايت أو أكثر.
قسم البيانات مخصص لتخزين بيانات المستخدم. يمكنك إنشاء قسم واحد أو أكثر. ويمكنك الاستغناء عنها على الإطلاق. في هذه المقالة ، لن أقوم بإنشاء هذا القسم.

لذا ، نبدأ في الترميز. نقوم بإدخال بطاقة microSD في قارئ البطاقات على جهاز الكمبيوتر الخاص بنا مع Linux على متن الطائرة وباستخدام أي وسيلة متاحة (على سبيل المثال ، باستخدام dmesg) تحديد اسم الجهاز الذي يظهر. في حالتي ، هذا هو / dev / sdb. في حالتك ، قد يكون اسم مختلف.

قم بتشغيل الأداة gdisk وحذف الترميز بالكامل على بطاقة 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

تحسبًا لذلك ، فإننا نطرق بداية بطاقة microSD بالأصفار.

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

الآن قم بتشغيل gdisk مرة أخرى ، أضف الترميز وقم بإنشاء 5 أقسام على بطاقة microSD وفقًا للجدول الذي قدمته أعلاه:

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.

بعد ذلك ، أضف الأسماء إلى الأقسام الموجودة على بطاقة microSD. كما تتذكر ، يعد هذا أمرًا بالغ الأهمية بشكل خاص للأقسام الأولى حيث ستتم كتابة FSBL: إذا لم تقم بتعيين الأسماء المطلوبة لهم ، فلن يبدأ النظام:

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.

في نهاية العمل مع بطاقة microSD ، نحتاج إلى إضافة سمة BIOS القابلة للتمهيد القديمة إلى القسم الذي سنكتب فيه نواة Linux. بدون هذه السمة ، رفضت النواة البدء:

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.

هذا كل شيء ، تخطيط بطاقة الذاكرة جاهز. فقط في حالة تحقق من تسجيل كل شيء كما ينبغي. للقيام بذلك ، قم بتشغيل gdisk مرة أخرى وقم بتشغيل الأمر p . يجب أن تنصح النتيجة بالصورة:



الآن قم بإنشاء نظام الملفات ext4 على / dev / sdb4 و / dev / sdb5:

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

ونصف ملصقات الحجم بحيث يسهل الوصول إليها لاحقًا:

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

هذا يكمل إنشاء أقسام بطاقة الذاكرة ، يمكنك المتابعة لكتابة الملفات إليها.

تسجيل بطاقة MicroSD


لذلك ، في المرحلة الحالية ، كل شيء جاهز للتسجيل على بطاقة microSD. نقوم بإدراجه في قارئ البطاقات لجهاز كمبيوتر Linux وكتابة محمل التمهيد الأساسي (FSBL) في القسمين الأول والثاني من بطاقة mocroSD:

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

الآن اكتب U-Boot في القسم الثالث من بطاقة microSD:

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

بعد ذلك ، تحتاج إلى نسخ kernel وملف شجرة الجهاز والبرنامج النصي للتمهيد إلى القسم الرابع على بطاقة microSD.

قبل البدء في نسخ الملفات ، تحتاج إلى شرح بسيط حول البرنامج النصي للتنزيل. في هذا البرنامج النصي ، في الواقع ، يشار إلى معلومات مختلفة لـ U-Boot ، والتي يمكن من خلالها تشغيل النظام ونقل التحكم إلى النواة. هناك طرق مختلفة لكتابة هذه البرامج النصية ، ولكن أبسط (في رأيي) موصوفة في وثائق STM32MP1: تحتاج إلى إنشاء دليل / extlinux في جذر قسم kernel وإنشاء ملف نصي باسم extlinux.conf بالمحتويات التالية:

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

كل شيء بسيط للغاية هنا: نخبر اللودر بمكان الحصول على النواة وشجرة الجهاز ونظام الملفات الجذري ونقول أنه سيكون لدينا منفذ ttySTM0 كوحدة تحكم عاملة.

الآن نسخ النواة:

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

ملاحظة: في الدليل / media / myuser / أقوم بتركيب بطاقة microSD عند تثبيتها في قارئ البطاقات. في حالتك ، قد يكون دليل مختلف.

انسخ ملف شجرة الجهاز:

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

إنشاء دليل:

mkdir /media/myuser/kernel/extlinux

قم بإنشاء ملف:

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

واملأها بالمحتويات:

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

احفظ الملف وأغلق المحرر.

على هذا الجزء الرابع من بطاقة microSD جاهز: نواة لينكس وجميع الملفات الإضافية لها مكتوبة بالفعل. بالفعل في هذه المرحلة ، إذا قمت بإدخال بطاقة microSD في لوحة التصحيح ، يجب تحميل نواة Linux ، ومع ذلك ، في النهاية سوف تتعطل ذعر kernel بسبب حقيقة أنه لا يمكن تحميل نظام الملفات الجذر. هذا ليس مفاجئًا ، لأننا سجلناه حتى الآن.

هناك المرحلة النهائية ، حيث سنكتب نظام الملفات الجذر على بطاقة microSD. وهنا خيارات مختلفة ممكنة:

  1. اكتب نظام الملفات الجذر الذي تم إنشاؤه بواسطة Buildroot
  2. أعد كتابة نظام الملفات الجذر Arch Arch

أولاً ، اكتب نظام الملفات الجذر الذي أنشأه Buildroot لنا وحاول البدء به. لم يكن هذا هو الغرض من هذه المقالة ، ولكن يبدو لي أنه بشكل عام قد يتبين أنه مفيد لأي تطبيقات ، خاصة وأن هذا الإجراء لا يستغرق الكثير من الوقت. يتم كتابة نظام الملفات الجذر إلى القسم الخامس من بطاقة microSD الخاصة بنا باستخدام أمر واحد فقط:

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

أدخل بطاقة الذاكرة الآن في لوحة التصحيح وابدأ تشغيل النظام. سنراقب إخراج معلومات تصحيح الأخطاء عبر وحدة تحكم USB-UART: يتم توفير الوصول إليها من خلال منفذ microUSB على لوحة STM32MP157A-DK1. يمكن عرض المعلومات المعروضة في أي برنامج طرفي ، على سبيل المثال معجون أو Minicom. لأغراض هذه المقالة ، استخدمت الأخيرة بفتح نافذة طرفية أخرى في دبيان.

الآن نقوم بإدخال بطاقة microSD في لوحة التصحيح ، ونوفر الطاقة للوحة وننظر إلى المحطة. إذا تم كل شيء بشكل صحيح ، فيجب سكب سجلات FSBL و U-Boot و kernel هناك وفي النهاية - ستظهر دعوة لدخول تسجيل الدخول. ندخل الجذر و - فويلا - نصل إلى وحدة التحكم في النظام الذي جمعناه للتو:



نعم ، ليس لديها حتى مدير حزم ، وعمومًا تكون الوظائف ضعيفة للغاية ، ولكن بمساعدة Buildroot يمكنك بناءها بشكل رائع وإنشاء نظام معقد يعمل حقًا. في غضون ذلك ، يبلغ حجمها 7 ميغابايت فقط!



بعد التأكد من بدء تشغيل نظام الملفات الجذر محلية الصنع بنجاح ، حان الوقت لبدء Arch Linux. مرة أخرى ، أدخل بطاقة microSD في قارئ البطاقات بجهاز الكمبيوتر الخاص بنا وقم بإعادة تهيئة القسم الخامس من بطاقة الذاكرة مرة أخرى:

mkfs.ext4 /dev/sdb5

قم بتنزيل الأرشيف باستخدام Arch Linux ، الذي تم تجميعه تحت armv7 ، من الموقع الرسمي. قم بفك ضغط الأرشيف في دليل archlinux وباستخدام الأمر:

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

انسخه إلى قسم rootfs لبطاقة microSD.

نقوم بتنظيف الدليل / الوسائط / myuser / rootfs / boot: لا نحتاج إلى المحتويات ، لأن النواة وشجرة الجهاز موجودة في قسم منفصل من بطاقة microSD:

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

في وقت لاحق ، يمكنك تحميل قسم / dev / sdb4 في دليل التمهيد ، حيث لدينا صورة kernel.

بعد ذلك ، أدخل بطاقة microSD في لوحة التصحيح وقم بتنشيط ArchLinux وتمتع بالعمل:



بعد أن بدأ Arch Linux بنجاح ، قررت أن أحاول تشغيل Debian على لوحة التصحيح أيضًا. باستخدام معالجات متشابهة تمامًا مع نظام الملفات الجذر ، نجح في:



استنتاج


في هذه المقالة ، لعبنا بما فيه الكفاية مع لوحة تصحيح STM32MP157A-DK1: ضع U-Boot ، و Linux kernel ، ونظام ملفات الجذر الخاص بنا تحته ، وأطلقنا أيضًا Arch Linux و Debian. آمل أن تكون هذه المادة مفيدة لشخص ما سواء عند العمل مع معالجات عائلة STM32MP1 ، أو مع أي لوحة أخرى على ARM.


All Articles