به نام خدا

سلام خدمت هموطنان عزیزی که به دنبال یادگیری مطالب جدید هستند!

امروز بعد از 4 روز کار میخوام نتیجه اونو در اختیارتون قرار بدم!

بروزرسانی: ۲۱ فروردین ۹۹

بعد از این همه مدت بالاخره یاد گرفتم چطور میشه به صورت درست یک فایل برنامه رو با برد نانو پای و سایر بردهایی که از تراشه Allwiner استفاده میکنن اجرا کرد.

نسخه قبلی آموزش هنوز در پایان این آموزش موجوده

خب یکی از معروف ترین برد های امبدد جهان برد رزبری پای هست

قطعا راه حل این مسیله به راحتی برای این برد پیدا میشود چون افراد زیادی روش کار میکنن

من خودم که یه مدت باهاش کار کردم فهمیدم علاوه بر اینکه راه حل این مسیله براش وجود داره حل این مسیله هم توی این برد (یعنی رزبری)‌راحتتره

یعنی Soc اون جوری طراحی شده که مراحل بوت رو خیلی ساده کرده

اما امان از دست این برد نانو پای

من هنوز نمیدونم دقیقا چطوری تراشه H3 بوت میشه ولی u-boot اینکار رو به خوبی انجام میده و معمولا توزیع های لینوکسی هم که برای این برد و برد های مشابه عرضه میشه با یوبوت کار میکنه

پس ما هم میریم سراغ یوبوت

اولین کاری که باید انجام بدید اینه که ابزار های مورد نیاز کامپایل یوبوت رو دانلود کنید.

فعلا دستور زیر رو وارد کنید و اگه در هنگام کامپایل به ارروی بر خورد کردید مطمین باشید به احتمال ۹۰ درصد مشکل از اینه که شما یکی از ابزار هایی که در هنگام کامپایل بهش نیاز دارید رو ندارید

پس سعی کنید توی اینترنت دنبال ارور بگردید و بفهمید باید چه چیزی رو نصب کنید.

apt-get install swig python-dev

سپس یوبوت رو با استفاده از دستور زیر کلون کنید.

git clone git://git.denx.de/u-boot.git

توی فولدر configs  میتونید کانفیگ های مربوط به تمامی برد هایی که به صورت پیشفرض توسط یوبوت پشتیبانی میشه رو ببینید

دنبال برد خودتون بگردید و اسم کاملش رو یادداشت کنید که بعدا باهاش کار داریم

فایل مربوط به برد من nanopi_m1_defconfig هست

حالا باید یوبوت رو برای برد خودمون توسط اطلاعات مربوط به برد خودمون (که توی فایلی که بالا بهش اشاره کردیم موجود هست)‌کامپایل کنیم

 برای برد هایی با تراشه های ۳۲ بیتی (armhf) دستور زیر رو وارد کنید

make CROSS_COMPILE=arm-linux-gnueabihf- <board_name>_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make CROSS_COMPILE=arm-linux-gnueabihf-

برای برد هایی با تراشه های 64 بیتی برید به سایت منبع و از اونجا مطالعه کنید

فقط یادتون باشه که به جای <board_name>_defconfig اسم همون فایل رو که قبلا گفتم بنویسید (که گفتم برای من nanopi_m1_defconfig هست)

کار یوبوت تموم شد.

فایلی که ما بهش نیاز داریم توی فولدر ریشه یوبوت هست و اسمش 

u-boot-sunxi-with-spl.bin

این چیزی هست که ما از تمام کامپایل یوبوت میخواستیم

کاری که باید بکنیم اینه که این فایل رو با دستور dd در سکتور ۱۶ کارت sd یا هر حافظه ای که میخواهیم به برد وصل کنیم بنویسیم (سکتور ۱۶ میشه بایت ۸k ام)

dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8

حالا کاری که باید بکنیم چیه؟

حالا باید اون برنامه رو که میخوایم روی برد اجرا کنیم رو بنویسیم و کامپایل کنیم. (یه چیزایی برای کامپایل برنامه های ARM توی وبلاگ نوشتم)

بعدش اون فایل رو بریزید توی همون کارت حافظه که در بالا روش فایل u-boot-sunxi-with-spl.bin رو با دستور dd نوشنید.

مرحله آخر اینه که به یوبوت بگیم که فایل برنامه ما رو اجرا کنه

برای اینکار باید یه فایل به اسم boot.cmd ایجاد کنید و دستورات زیر رو توش بنویسید.

fatload mmc 0 0x46000000 main.bin
go 0x46000000

که در اینجا مثلا اسم برنامه ای که من درست کردم main.bin هست.

کاری که دو خط بالا انجام میده اینه که فایل main.bin که برنامه ماست رو توی اون آدرس حافظه که قبلش نوشته لود میکنه و بعدش میپره به اونجا و اجراش میکنه

اما هنوز یه کار دیگه مونده

ما باید با این فایل چیکار کنیم؟

ما نباید این فایل رو توی کارت حافظه بریزیم بلکه باید فایل boot.scr رو توی حافظه بریزیم

برای ساخت فایل boot.scr از روی فایل boot.cmd باید با استفاده از دستور زیر فایل boot.cmd رو کامپایل کنید:

mkimage -C none -A arm -T script -d boot.cmd boot.scr

خروجی این دستور یک فایل boot.scr هست که باید داخل کارت حافظه بریزید.

پس تا اینجا ما دو تا فایل توی کارت حافظه ریختیم یکی برنامه اصلیمون و دیگری boot.scr همچنین یک فایل به اسم u-boot-sunxi-with-spl.bin هم توی سکتور ۱۶ هم این کارت حافظه رایت کردیم.

تموم شد

حالا میتونید کارت حافظه رو به برد متصل کنید و شاهد اجرای برنامه تون باشید.

این آموزش از سایت زیر تهیه شده بود که خودم آزمایش کردم و جواب گرفتم.

این سایت بخش های زیادی داره که سه تا صفحه زیر مهمترین هاشن

فقط حواستون باشه توی این سایت به دو نسخه همیشه اشاره شده یکی نسخه legacy به معنی کلاسیک و قدیمی و یکی نسخه mainline به معنی نسخه ای که جاری هست (آخرین نسخه) 

ما با mainline کار میکنیم

همچننین این رو بدونید که اگه یه جایی به script.bin برخورد کردید این فایل مربوط به نسخه legacy هست و نقش همون فایل nanopi_m1_defconfig رو در نسخه legacy بازی میکنه (که اول مطلب بهش اشاره کردیم).

من در حال حاضر دنبال اینم که کرنل لینوکس رو روش بریزیم 

منبع:

https://linux-sunxi.org/U-Boot

 

نسخه قبلی آموزش

راستش چند وقتی میشه که برد نانوپی خریدم اول روش لینوکس نصب کردم بعد گفتم که خوب چه فایده؟ تصمیم گرفتم که مثل دانشجوها که توی دانشگاه معماری پردازنده های اینتل رو میخونن منم شروع کنم معماری پردازنده آرم رو بخونم البته هیچ منبع فارسی که بخواد درمورد معماری پردازنده آرم توضیح کاربردی داده باشه نمیگم نیست ولی کمه :)

ولی سایت سیسوگ این مطلب ارزشمند رو برای کسانی که رزبری پای دارن ارایه کرده! دستش درد نکنه.

ولی متاسفانه هیچ سایت ایرانی و خارجی چنین مطلبی رو برای نانوپی ارایه نکرده و به سختی چیزی گیر میاد!

دست به کار شدم و سعی کردم یه راهی برای بوت کردن کدی که نوشتم پیدا کنم ولی به اینکه سه روز باهاش کار کردم به نتیجه نرسیدم و بعد از یک وقفه ی چند روزی دوباره دیروز برگشتم ولی اینبار به لطف خدا راهی رو پیدا کردم که جواب میده و اومدم اونو به سرعت با شما عزیزان به اشتراک بگذارم!

خوب بریم سراغ اصل مطلب:

ما از u-boot استفاده میکنیم!

و چون شاید لود کردن یوبوت روی کارت اس دی کمی سخت و وقتگیر باشه شما یکی از سیستم عامل های لینوکس موجود برای بردتون رو پیدا کنید که با یوبوت کار کنه من از نسخه زیر استفاده کردم

Ubuntu_xenial_default_desktop.7z

ولی شما میتوندی هر نسخه ای دیگه هم استفاده کنید

خوب الان مثل قبل اینو با برنامه Win32DiskImager.exe روی کارت SD خودتون بریزید

حالا اگه به نانوپی بزنید و اونو به یک مبدل سریال به USB متصل کنید یوبوت کارهایی رو که داره انجام میده رو نشون میده و یک جا میگه اگه میخواید متوقف کنید یک کلیدی بزنید اصل کار ما اونجاست البته شما زودتر یه کلیدی فشار بدید که یه وقت رد نشه!

خوب این تا اینجا

دقت داشته باشید که نسخه های یوبوت باهم فرق میکنه و فکر کنم این لینکی که دادم نسخه آخر یوبوت رو روش ریختن

الان این فایل رو توی صفحه اول کارت SD بریزید تا اجراش کنیم (توجه کنید که ممکنه کارت SD توی ویندوز قابل خوندن نباشه و باید توسط لینوکس یا یک برنامه جانبی ویندوز این فایل رو توی کارت SD بریزید)(دقت کنید که اگه خواستید کارت SD رو از توی ویندوز فرمت کنید من حتما حتما برنامه AOMEI رو پیشنهاد میکنم به هرحال نصب کنید یه روزی به کارتون میاد!)

حالا کارت SD رو به برد متصل کنید

سیم های UART روهم متصل کنید(عکس زیر برای NanoPI M1 کمکتون میکنه)

حالا با استفاده از یک برنامه ترمینال یا برنامه PutTy به پورت سریال متصل بشید و وقتی گفت برای توقف کلیدی رو بزنید شما سریعا اسپیس (فاصله) رو فشار بدید (البته توصیه میکنم که از قبل تند تند بزنید که رد نشه:)) حالا بسته به نسخه ای که استفاده میکنید و فایلی که روی کارت SD رایت کردیدباید کارهای زیر رو انجام بدید!

 

الف)

اگه فرمت کارت SD شما کاملا ext4 شده و ویندوز اصلا قادر نیست حتی اونو نشون بده و فرمتش کنه و شما فایل دانلودی رو با لینوکس توی اون ریختید توی ترمینال برای یوبوت کد زیر رو واردکنید

ext4load mmc 0 0x41000000 notmain.bin; go 0x41000000

اگه خواستید درون پوشه رو ببینید میتونید بزنید:

ext4ls mmc 0

یا اگه میخواید درون پوشه ی خاصی مثلا پوشه boot رو ببینید میتونید بزنید:

ext4ls mmc 0 /boot

 

ب)

اگه کارت SD شما توسط ویندوز قابل خوندنه حتی اگه بخشی از کارت SD باشه! (مثلا اگه کارت حافظه شما 8 گیگ هست این 50 مگ رو نشون بده) و شما فایلتون رو توسط ویندوز توی همون مقدار از کارت SD ریختید چون فرمت اونجا fat بوده از کد زیر استفاده کنید:

fatload mmc 0 0x41000000 notmain.bin; go 0x41000000

اگه خواستید درون پوشه رو ببینید میتونید بزنید:

fatls mmc 0

یا اگه میخواید درون پوشه ی خاصی مثلا پوشه boot رو ببینید میتونید یزنید

fatls mmc 0 /boot

 

خوب امیدوارم که LED آبی روی برد شما هم چشمک بزنه! چون این کد برای همینکاره!

 

قسمت دوم: برنامه نویسی

راستش من اول خودم به کمک سایت سیسوگ یه برنامه برای بردم نوشتم ولی جواب دیروز فهمیدم که برنامه ام جواب نمیده و از سورسی که در اینجا یه آدم خیر گذاشته استفاده کردم و کار کرد!

اگه میخواید با ویندوز کامپایل کنید این پست سایت سیسوگ کمکتون میکنه.

ادامه ... 

حالا که کامپایلر رو نصب کردید -> حالا برای اینکه اون سورس کد رو که دانلود کردیم کامپایل کنیم! برید توی Makefile مثلاپروزه ی Blink01 و چون برای لینوکس هست شما خودتون تغییرش بدید و دستی وارد کنید!

مثلا من اینجوری replace کردم (دانلود کنید) __ شما فقط از خطوط 26 به پایین رو توی CMD وارد کنید و دقت کنید که اون خط هایی که اولش قرمز نوشته رو وارد نکنید (فقط خطوط 27و30و33و36و37و38و39 رو وارد کنید)

برای راحتی کار این خطوطی که گفتم رو توی یک فایل txt بریزید (بینشون Enter بزنید)بعد فرمت فایل رو به .cmd تغییر بدید و وقتی روش کلیک کنید خودکار انجام میشه:)

خوب امیدوارم مفید بوده باشه!

موفق باشید....!

یا علی مدد....!