با قسمت پانزدهم از دوره ورود به دنیای امبدد لینوکس که دوره مقدماتی آموزش امبدد لینوکس می باشد همراه ما باشید.
یه خبر خوب دارم واستون! توی این مدت که ما نبودیم کریس بیکار نبوده و یه ویرایش جدید از کتابش رو به همراه فرانک نوشته و در سال 2022 منتشر کرده.
این کتاب نسبت به دو ویرایش قبل خودش خیلی کاملتر هست و فصلهای بیشتری داره و علاوه بر حوزه امبدد لینوکس در خصوص سیستم پروگرمینگ همصحبت شده.
این کتاب رو میتوانید از لینک زیر دانلود کنید:
یوبوت U-Boot
بوت لودرهای Bootloader اپن سورس زیاد هستند ولی پرکاربردترینشون که بیشتر از همه هم در حال توسعه هست و معماریهای بیشتری رو پشتیبانی میکنه Das U-Boot هست که معمولا به اختصار بش یوبوت U-Boot میگن. در حال حاضر نسخه اصلی یوبوت U-Boot پردازندهها و بردهای زیادی رو پشتیبانی میکنه. توضیحات تئوری رو ول کنیم و بریم توی عمل بیشتر باش آشنا شیم.
در قسمتهای قبلی آموزش، مسیر حرکت و فصلهای پیش رو، بسیاری از مفاهیم موردنیاز و سؤالها و ابهامات شما در این دوره پاسخدادهشده است.
پس اگر اولین بار است که این آموزش را شروع میکنید، با توجه به سلسلهمراتب پیشبینیشده برای آموزشها، بهتر است از جلسه اول شروع کنید!
برای مطالعهی بیشتر امبدد لینوکس لطفا بر روی لینک کلیک کنید.
دانلود و کامپایل یوبوت U-Boot برای رسپبریپای سه بی پلاس
اول بریم اونجایی که باید بریم!
1 | cd ~/EmbeddedLinux/RPI3BP/ |
خوب الان سورس کنیم اونچیزی رو که باید سورس کنیم!
1 | source at00exports.sh |
خوب حالا بریم توی فولدر مربوط به بوت لودر Bootloader
1 | cd bootldr |
خوب حالا گیت کنیم سورس رو:
1 | git clone git://git.denx.de/u-boot.git |
حالا ببینیم کدوم بردها رو به صورت پیش فرض پشتیبانی میکنه:
1 2 3 4 5 6 7 8 9 10 11 12 | cd u-boot/ ls ./configs … imx6ul_geam_mmc_defconfig rpi_0_w_defconfig imx6ul_geam_nand_defconfig rpi_2_defconfig imx6ul_isiot_emmc_defconfig rpi_3_32b_defconfig imx6ul_isiot_nand_defconfig rpi_3_b_plus_defconfig imx7_cm_defconfig rpi_3_defconfig imx8mm_beacon_defconfig rpi_4_32b_defconfig imx8mm-cl-iot-gate_defconfig rpi_4_defconfig imx8mm-cl-iot-gate-optee_defconfig rpi_arm64_defconfig … |
خوب خوشبختانه rpi_3_b_plus_defconfig به ما میگه که برد رسپبریپای سه مدل بی پلاس رو یوبوت به صورت پیش فرض پشتیبانی میکنه 🙂
خوب حالا بریم سراغ کانفیگ کردن و کامپایل یوبوت U-Boot برای رسپبریپای سه بی پلاس
اولش باید کراس کامپایلر رو اکسپورت کنیم توی فایل at00exports.sh این کار رو با کامپایلر خودمون کردیم برای کراس کامپایل SQLite ولی از اینجا به بعد از کامیپایلر لینارو میخوایم استفاده کنیم، اولش یه تغییر مسیر میدیم تا کامپایلر جای درستی دانلود بشه:
1 | cd ../../build-tools/ |
خب حالا دانلود و اکسترکتش میکنیم
1 2 3 4 | wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz tar -xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu at00toolchain |
خب حالا باز برمیگردیم همونجا که بودیم
1 | cd ../bootldr/u-boot/ |
خب حالا اکسپورتهامون رو انجام میدیم
1 2 | export PATH=$PATH:/home/at00/EmbeddedLinux/RPI3BP/build-tools/at00toolchain/bin/ export CROSS_COMPILE=/home/at00/EmbeddedLinux/RPI3BP/build-tools/at00toolchain/bin/aarch64-linux-gnu- |
خوب حالا میتونیم تنظیمات مربوط به بردمون رو انجام بدیم:
1 | make rpi_3_b_plus_defconfig |
پیشنهاد میکنم توی منوها به خوبی بگردین تنظیمات جالبی هست که میتونید تغییر بدین و شخصی سازی بیشتری انجام بدین روی یوبوت U-Boot و در نهایت
1 | make -j$(nproc) |
خوب تازه همه چیز شروع شد! اول ببینیم چه خروجیهایی داریم:
1 2 3 4 | ~/EmbeddedLinux/RPI3BP/bootldr/u-boot$ ls api boot config.mk doc env include lib Makefile README test u-boot.bin u-boot.lds u-boot.srec arch cmd configs drivers examples Kbuild Licenses net scripts tools u-boot.cfg u-boot.map u-boot.sym board common disk dts fs Kconfig MAINTAINERS post System.map u-boot u-boot.cfg.configs u-boot-nodtb.bin |
که از بین همشون معمولا با اینا کار داریم
خب الان خیلی سوال وجود داره:
چه جوری از یوبوت استفاده کنیم؟ اصلا روی چی باید بریزیمش؟ چه جوری باید بریزیمش؟ این سوالها به دیتاشیت و اطلاعاتی برمیگرده که شرکت سازنده SoC در اختیار ما (یا از ما بهترون!) میذاره. بله درسته از ما بهترون! واقعیت این هست که همیشه در مورد همهی پردازنده این اطلاعات به صورت آزاد و در دسترس همه وجود نداره.
در خصوص رسپبریپای سه بی پلاس متوجه میشید که با دنیای متن باز به تنهایی نمیشه این برد رو برای لینوکس اماده کرد. رسپبریپای سه بی پلاس کارش رو از GPU شروع میکنه و بعدش به دنبال یک پارتیشن با فایل سیستم FAT میگرده که از توی اون پارتیشن سه تا فایل لازم داره به جز فایل مربوط به بوتلودر. خب اولش پارتیشن رو بسازیم بعدش بریم فایلهایی که میخواد رو دانلود کنیم. برای ساختن پارتشین یک کارت حافظه میکرو اس دی با هر ظرفیتی که دوست دارید رو به کامپوترتون وصل کنید. کارت حافظه من ۴ گیگابایتی هست و ادرسش اینه:
1 | /dev/sdc |
خب اولش مطمئن میشم که مونت نشده و اگه شده از مونت خارجش میکنم:
1 | sudo umount /dev/sdc* # makes sure it's not mounted |
خب حالا با استفاده از partred کارت حافظه رو پارتیشن بندی میکنم من به جز پارتیشن بوت یه پارتیشن دیگه هم ساختم. اگر با parted آشنا نیستین بشین و کار کردن باش رو یاد بگیرین. نکته اخلاقی به ادرس کارت حافظهتون دقت کنید که اشتباهی نباشه چون ممکنه همه اطالاعات هاردتون از دست بره! نکته اخلاقی دو اگه فقط میخواین کپی پیست کنین به اون \ اخر دستورات دقت کنید اگه نباشه به خطا میخورین!
1 2 3 4 | sudo parted -s /dev/sdc \ mklabel msdos \ mkpart primary fat32 1M 30M \ mkpart primary ext4 30M 100% |
خب الان کارت حافظه من دو تا پارتیشن داره که با دومی کاری نداریم فعلا. در اولی باید اطلاعات لازم برای بوت لودر داخلی رسپبریپای سه بی پلاس باشه که طبق اطلاعات کم و پیش در دسترس ازش میشه این فایلها به اضافه بوتلودر:
bootcode.bin,fixup.dat,start.elf
خب این سه تا فایل رو اینجوری میتوینم به دست بیاریم! از فولدر بوت لودر میایم بیرون و این مخزن رو دانلود میکنیم
1 2 | wget https://github.com/raspberrypi/firmware/archive/master.zip unzip master.zip |
خب الان به جز یه فایل که خودمون باید بسازیمش هر انچه میخواهیم برای اجرای یوبوت رو داریم. این فایل فایل تنظیماتی هست که بوتلودر start.elf لازم داره:
1 2 3 4 5 | config.txt enable_uart=1 kernel=u-boot.bin arm_64bit=1 core_freq=250 |
خب حالا پارتیشن FATی که ساختیم رو مونت میکنیم و فایلهایی رو که باید رو میریزیم توش:
1 2 3 4 | sudo mount /dev/sdc1 /mnt sudo cp ./u-boot/u-boot.bin /mnt/ sudo cp ./u-boot/u-boot.bin /mnt/ sudo cp ./firmware-master/boot/{fixup.dat,start.elf,bootcode.bin} /mnt/ |
و در نهایت انمونت میکنیم کارت حافظه رو و داخل برد میذاریم.
1 | sudo umount /dev/sdc1 |
خب اگر سال و فال و حال و مال و اصل و نصل و تخت و بختتون برقرار و بردوام باشه این خروجی رو روی سریال خواهید داشت
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | U-Boot 2022.04-00992-g9bb99fa958 (Apr 24 2022 - 01:32:32 +0430) DRAM: 948 MiB RPI 3 Model B+ (0xa020d3) Core: 60 devices, 11 uclasses, devicetree: embed MMC: mmc@7e202000: 0, mmc@7e300000: 1 Loading Environment from FAT... Unable to read "uboot.env" from mmc0:1... In: serial Out: vidconsole Err: vidconsole Net: No ethernet found. starting USB... Bus usb@7e980000: USB DWC2 scanning bus usb@7e980000 for devices... 4 USB Device(s) found scanning usb for storage devices... 0 Storage Device(s) found Hit any key to stop autoboot: 0 |
و خب خیلی سریع هم باید اینتر رو بزنین که وارد محیط یوبوت U-Boot بشین.
به عنوان اولین دستور یوبوت U-Boot این رو اجرا کنید:
1 2 3 4 5 | version U-Boot 2022.04-00992-g9bb99fa958 (Apr 24 2022 - 01:32:32 +0430) aarch64-linux-gnu-gcc (Linaro GCC 7.5-2019.12) 7.5.0 GNU ld (Linaro_Binutils-2019.12) 2.28.2.20170706 |
یه سری هم به نظرات این پایین بندازید، نظرات رو بخونید و اگر شما هم نظری دارید، لطفا با ما به اشتراک بگذارید!
سلام
روی رزبری ۴ خیلی سعی کردم u-boot لود بشه ولی نشد آخر فهمیدم باید فایل دیوایس تری با پسوند .dtb که واسه برد فایل bcm2711-rpi-4-b.dtb بود هم کنار فایل های دیگه قرار میدادم هنوز ولی دلیلشو نمیدونم
سلام
در خصوص رزپری یه سری اطلاعت اپن سورس نیست و در دسترس نیست و معمولا با سعی و خطا و مهندسی معکوس میشه فهمید باید چیکار کرد.
سلام
ممنون از آموزش خوبی که گذاشتید.
سلام وقتتون بخیر
خواهش میکنم امیدوارم مفید بوده باشه
اینجا چرا از toolchain لینوکسی برای کامپایل u-boot استفاده کردیم؟ ما که اینجا داریم u-boot رو به صورت baremetal میاریم بالا و اصلا کرنل لینوکسی نداریم که بخوایم از toolchain لینوکسی استفاده کنیم!
بهتره که با هم یه بار دیگه مباحث رو مرور کنیم …
ما یه تولچین داریم که در اصل کامپایلرمون هست و باهاش هر کد c که داریم میتونیم کامپایل کنیم و فایل مناسب برای اجرا روی پردازندمون رو بسازیم.
حالا یه یوبوت داریم که بوت لودر هست و کارش اماده کردن سیستم برای اجرای کرنل لینوکس هست (و اصلا قبل از کرنل لینوکس اجرا میشه و در واقع یوبوت هست که کرنل رو اجرا میکنه).
کارت عالیه پسر
سلام علی جان
محبت دارید ?