اطلاعیه

Collapse
No announcement yet.

mini2440 و Linux

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    mini2440 و Linux


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

    لطفا سوالات مربوط به wince رو اینجا قرار ندید و برای اون تاپیک مجزا ایجاد کنید

    بخش اول آموزش رو آقای رستمی اینجا مطرح کردند مبحث دوم مربوط به فلش کردن u-boot بود که در ادامه مراحل کار رو توضیح خواهم داد.

    طریقه کامپایل و فلش کردن u-boot رو در وبلاگ آقای Bill Sargent میتونید ببینید مراحل کار احتیاجی به ترجمه نداره من فقط یه سری توضیحاتی در مورد روند کار میدم

    برنامه بوت لودری که به صورت پیش فرض روی mini2440 نصب هست Supervivi نام داره که به علت محدودیت هایی که داره ما سراغ u-boot میریم u-boot امکانات بیشتری به ما میده از جمله اینکه امکان بوت از طریق NFS و کارتهای حافظه SD و همچنین USB رو داره همچنین از فایل سیستمهای متعددی پشتیبانی میکنه که Supervivi پشتیبانی نمکنه.
    برای مثال vivi فقط از سیستم فایل YAFFS پشتیبانی میکنه. همچنین vivi از پشتیبانی ضعیف تری برخورداره به این دلیل که جامعه کاربری پایین تری داره
    شما برای اینکه بتونید u-boot رو فلش کنید میبایست یک فایل با پسوند bin (البته پسوند بیمعنی هست و اینجا صرفا نشان دهنده نوع فایل هست که از نوع باینری میباشد) داشته باشید این فایل رو میتونید مستقیما با یک کراس کامپایلر از روی سورس کامپایل کنید و یا اینکه از یک فایل آماده استفاده کنید. من به شدت توصیه میکنم این کار رو از طریق کامپایل سورس انجام بدید این کار باعث میشه سیستم شما داری یک نسخه به روز از u-boot باشه همچنین اگر شما هم مثل من در لینوکس تازه کار هستید باعث میشه کلی چیز یاد بگیرید پس پیش به سوی کامپایل!!

    حالا سوالی که ممکنه پیش بیاد اینه که من برای شروع کار باید از چه توضیعی از لینوکس استفاده کنم اصل قضیه اینه که هیچ تفاوتی نمیکنه ولی خود من در این چند وقت متوجه این موضوع شدم که اکثر افراد حرفه ای و این کاره!! از دبیان استفاده میکنند. من خودم از ubuntu استفاده میکردم که در کامپایل به مشکل بر خوردم و هیچ کس نتونست کمک کنه به هر حال الان از دبیان استفاده میکنم و تا حالا هم به مشکل غیر قابل حلی!! بر نخوردم.

    سورس کدی که استفاده خواهیم کرد توسط Buserror ایجاد شده
    در متن وبلاگ گفته شده که برای اینکه کد در RAM کار کنه باید اصلاحاتی انجام بشه که البته به این اصلاحات نیازی نیست. همچنین اگر حتی با وجود اعمال تغییرات باز هم نتونستید با موفقیت u-boot رو اجرا کنید نگران نشید برای منم همین اتفاق افتاد!!
    در آخر آموزش بروزرسانی ای میبینید که اگر به اون عمل کنید مشکلتون حل میشه.

    از اونجا که من امروز موتور تایپم روشن شده :mrgreen: طول تاپیک از حد مجاز بیشتر شده!! پس ادامش در پست بعدی...


    Work with what you have .Never limit yourself by things you could have had

    #2
    پاسخ : mini2440 و Linux

    خوب من متن آموزش رو کپی میکنم و هر جا لازم باشه توضیح میدم و ترجمه هم میکنم.!!

    این متن با اجازه آقای Bill Sargent کپی و ترجمه شده است.

    Step 1: Get the source

    کد:
    mkdir uboot ; cd uboot
    git clone git://repo.or.cz/u-boot-openmoko/mini2440.git
    Step 2: Set your cross compiler prefix so you don't end up compiling this for x86.

    کد:
    export CROSS_COMPILE=arm-none-linux-gnueabi-

    در اینجا پیش نام کراس کامپایلرتون رو تعیین میکنید. آقای رستمی در آموزش هاشون توضیحات کافی رو دادن.


    Step 3: Modify the source to disable CONFIG_USE_IRQ. Open include/configs/mini2440.h.

    کد:
    #define USE_920T_MMU
    //#define CONFIG_USE_IRQ          1    /* Needed for USB device! */

    Disabling this obviously disables the use of USB During boot. You can fix this by reflashing a normal copy of u-boot from within u-boot once this is up and running. In the above example, I commented it out but you can probably just change the 1 to a 0.

    این همون مرحله ای هست که گفتم نیاز نیست.

    Step 4: Make and compile.

    کد:
     cd ../../
     make mini2440_config
     make
    Assuming this all compiles correctly, you will have a u-boot.bin file in your directory now as well as a 2k and 16k block size bin file. Those two are for flashing inside of U-Boot. The normal .bin is for flashing from ram from within supervivi.

    همونطور که مشخصه شما اگر کامپایل به درستی صورت گرفته باشه سه تا فایل bin دارید از u-boot.bin باید استفاده کنید فایل های 2k و 16k برای فلش کردن u-boot از طریق u-boot استفاده میشه

    Step 5: Flashing u-boot to the mini2440. In this example, we'll be using DMW for Windows to transfer the binary over to the board with the supplied USB cable.

    اگر از ویندوز سون استفاده میکنید درایور و DMW به روز رو از سایت سازنده دانلود کنید. بعد مراحل زیر رو انجام بدید.

    5a. Set boot switch to NOR.
    5b. When supervivi pops up, hit q for supervivi shell.
    5c. Load the image in to ram at 0x32000000 (6 zeros) memory location.
    کد:
     shell> load ram 0x32000000 <uboot bin size in bytes> u-boot
    5d. Use DNW to transfer the u-boot.bin from your computer to the board.
    5e. Execute the loaded bin file you loaded in to RAM.
    کد:
    shell> go 0x32000000

    در مورد مراحلی که در زیر میبینید خودم هم نمیدونم برای چی هست !! u-boot یه manual ای داره که فکر میکنم تو اون توضیح داده شده باشه من فعلا وقت نکردم بخونم اگر از دوستان کسی میدونه لطفا بگه تا استفاده کنیم.

    5f. You should now be inside u-boot at a MINI24440# prompt. Now we prepare the NAND.

    کد:
    MINI2440# nand scrub
    5g. Create the bad block table.

    کد:
    MINI2440# nand createbbt
    5h. Write the u-boot that we're running at 0x32000000, to the NAND.

    کد:
    MINI2440# nand write.e 0x32000000 0x0 <u-boot bin size in hex>
    5i. Partition the NAND.

    کد:
    MINI2440# dynpart
    5j Create the dynamic environment space for u-boot.

    کد:
    MINI2440# dynenv set u-boot_env
    5k. Save the environment to NAND.

    کد:
    MINI2440# saveenv

    خوب اگر همه چی درست پیش رفته باشه شما بعد از قرار دادن mini2440 در حالت NAND و ریبوت کردن سیستم باید خط فرمان u-boot رو که به صورت mini2440# هست رو ببینید اما اگر در مرحله 5c به مشکل زیر برخوردید :

    Supervivi> go 0x32000000 go to 0x32000000
    argument 0 = 0x00000000
    argument 1 = 0x00000000
    argument 2 = 0x00000000
    argument 3 = 0x00000000
    ---hang---

    دستور العمل زیر رو اجرا کنید


    1. Switch the system to NOR and boot with supervivi.
    2. hit v in supervivi
    3. i uploaded the u-boot.bin file
    4. switch the system to NAND and boot up with u-boot. You'll get some errors.
    5. Run nand scrubs and createbbt
    6. switch back to NOR
    7. hit v again and upload U-boot since you just erased it.
    8. switch back to nand and it should boot up with minimal errors using u-boot.
    9. run the dynpart and dynenv and saveenv as mentioned above

    لیست مراجع و مطالعه بیشتر:


    http://bill.station51.net/index.php?post/2010/01/16/U-Boot-on-Mini2440
    http://bliterness.blogspot.com/ - Busseror's blog
    http://code.google.com/p/mini2440/ ... - Buserror's Google code page. (البته این سایت از اون سایت هایی هست که باید یکم شیطونی کنید تا بتونید ببینیدشون!!)
    http://repo.or.cz/w/openembedded/mi... - Git repository for the modified Openembedded
    http://repo.or.cz/w/u-boot-openmoko... - Git repository for u-boot

    با تشکر
    Work with what you have .Never limit yourself by things you could have had

    دیدگاه


      #3
      پاسخ : پاسخ : mini2440 و Linux

      نوشته اصلی توسط jh_topgraph
      در مورد مراحلی که در زیر میبینید خودم هم نمیدونم برای چی هست !! u-boot یه manual ای داره که فکر میکنم تو اون توضیح داده شده باشه من فعلا وقت نکردم بخونم اگر از دوستان کسی میدونه لطفا بگه تا استفاده کنیم.[/size]

      5f. You should now be inside u-boot at a MINI24440# prompt. Now we prepare the NAND.

      کد:
      MINI2440# nand scrub
      5g. Create the bad block table.

      کد:
      MINI2440# nand createbbt
      5h. Write the u-boot that we're running at 0x32000000, to the NAND.

      کد:
      MINI2440# nand write.e 0x32000000 0x0 <u-boot bin size in hex>
      5i. Partition the NAND.

      کد:
      MINI2440# dynpart
      5j Create the dynamic environment space for u-boot.

      کد:
      MINI2440# dynenv set u-boot_env
      5k. Save the environment to NAND.

      کد:
      MINI2440# saveenv
      توضیح قسمتهای 5G الی 5K :
      دستور nand scrub کل حافظهٔ NAND را پاک خواهد کرد. توصیه میشود قبل از اجرای این مراحل از NAND Flash یک نسخهٔ پشتیبان تهیه کنید.

      *دستور nand createbbt برای ایجاد مجدد جدول Bad Block است. حافظهآ‌های NAND هم مانند هر حافظهٔ دیگری ممکن است خراب شوند. معمولا در انتهای حافظهٔ NAND دو بلوک برای نگهداری این بلوکهای خراب در نظر گرفته میآ‌شود (معمولا این بلوکهای حافظه نسبت به دیگر بلوکها کیفیت بهتری دارند)
      وقتی حافظهٔ NAND پاک میآ‌شود، تمام بیتهای آن به 1 تبدیل میآ‌شوند. حالا اگر مقدار بایتی مخالف با 0xFF باشد، معلوم میشود که آن مکان حافظه خراب است و بلوک حاوی این بایت خراب در جدول گفته شده بعنوان Bad علامتگزاری میشود.

      *دستور nand write.e برای نوشتن اطلاعات از حافظهٔ RAM درون حافظهٔ NAND است.
      این دستور آرگومانهایی مانند آدرس شروع حافظهٔ RAM و پارتیشن Nand را نیاز دارد.

      مثلا برای نوشتن اطلاعات از RAM با آدرس شروع 0x32000000 در پارتیشن Kernel موجود در Nand اینطور مینویسیم :

      nand write.e 0x32000000 kernel


      علت استفاده از آدرس 0x32000000 در این دستور این است که ما در مراحل قبلی u-boot را در این آدرس RAM بارگزاری کردیم (توسط supervivi )

      دستور مشابه دیگر nand write است، ولی نکتهآ‌ای که لازم است در اینجا ذکر کنم و خیلی مهم است، استفاده از nand write.e بجای nand write است.
      وقتی از nand write.e استفاده میآ‌کنید، u-boot به Bad Blockهای موجود در حافظه هم توجه میآ‌کند و از آن بلوکهای معیوب میآ‌گذرد. این موضوع مخصوصا در هنگام نوشتن بر روی پارتیشن kernel یا rootfs که حجم زیادی دارند اهمیت بیشتری پیدا میآ‌کند.

      *توسط دستور dynpart تنظیمات و آدرسهای پارتیشنهای موجود در حافظهٔ NAND به متغیر محیطی mtdparts اختصاص داده میآ‌شود.

      *در مورد عملکرد dynenv set u-boot_env اطلاع دقیقی ندارم. فقط در این حد که آفست (آدرس شروع پارتیشن u-boot_env که متغیرهای محیطی u-boot در آن ذخیره است) را در مکان خاصی از حافظهٔ NAND مینویسد )

      نکتهآ‌ای که باید به آن توجه کرد این است که نام پارتیشن متغیرهای محیطی که در اینجا u-boot_env است حتما باید از دستور dynpart استخراج شود. در ورژنهای مختلف u-boot ممکن است نام این پارتیشن تغییر کند.
      خروجی دستور dynpart مشابه زیر است :

      mtdparts mtdparts=gta01-0:0x00030000(u-boot),0x00004000(u-boot env),0x00208000(kernel),0x00400000(initrd),0x039c4 000(rootfs)


      *دستور saveenv نیز محتویات موجود در متغیرهای محیطی u-boot را در پارتیشن u-boot_env (که آدرس آن معلوم شده است) میآ‌نویسد.

      مطالعه بیشتر :
      http://wiki.openmoko.org/wiki/NAND_bad_blocks
      چگونه هوشمندانه بپرسیم

      دیدگاه


        #4
        پاسخ : mini2440 و Linux

        سلام مجدد

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

        آقای رستمی شما تو پست قبلیتون گفته بودید که emdebian رو نصب کردید راستش من الان یک هفته هست که دارم با Openembedded سر و کله میزنم ولی هنوز موفق نشدم angstrom رو کامپایل کنم از طرفی مشکل اصلی من همین bitbake هست!! حالا اینکه چقدر با این برنامه مشکل دارم بماند ولی میترسم چند روز دیگه باهاش کار کنم شارژ اینترنتم تموم بشه :redface: :mrgreen:و البته در مورد اینکه چرا angstrom رو انتخاب کردم راستش من دید خوبی نسبت به کل ماجرا!! نداشتم و به این خاطر Openembedded و Angstrom رو انتخاب کردم که دیدم اکثر آموزشها برای اون نوشته شده (امان از درد بی سواتی!!)

        میدونم سرتون خیلی شلوغه ولی میشه یه مختصری درباره کامپایل emdebian توضیح بدید و یا مراجعی رو برای مطالعه معرفی کنید. همچنین مراجعی رو که برای یاد گرفتن لینوکس خودتون مطالعه کردید و مفید میدونید. البته توی این مدت خیلی پیشرفت کردم :rolleyes: دیگه کارای معمولیم رو با shell انجام میدم و ... ولی هنوز دید درستی در مورد برنامه نویسی در محیط لینوکس و همچنین اسکریپت های شل ندارم.

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

        یه پیشنهادی هم دارم برای دوستانی که تا به حال با لینوکس کار نکردن (البته من خودمم تازه کارم و یه 3 ماهی میشه کار باهاش رو شروع کردم.) دارم. من کاری به اینکه ویندوز بهتره یا لینوکس و .. ندارم. تخصصی هم در این رابطه ندارم که بخوام در موردش حرف بزنم و حرفهایی که میزنم همش چیزی هست که تو این مدت فهمیدم. باور کنید این ور یه دنیای دیگس همه حرفه ای هستن ولی این اصلا باعث نمیشه که دست تازه کار ها رو نگیرن. اینجا اگر کسی میگه نرم افزار آزاد و یا متن باز پشتش یه فکر و یه فلسفه خوابیده. کلی چیز جدید یاد میگیرید که حتی تا حالا اسمش رو هم نشنیده بودید.
        مثلا یادمه دفعه اول که داشتم آموزشهای آقای رستمی رو میخوندم چیزی در مورد سیستمهای کنترل ورژن git نوشته بودن برام جالب شد که ببینم چیه (اون موقع تازه ubuntu رو نصب کرده بودم) انقدر مجذوب قضیه شده بودم که حدود 8 ساعت تموم داشتم در موردش میخوندم حتی داشتم مستندات آموزشی github رو هم انجام میدادم!!

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

        شرمنده بازم زیاد حرف زدم

        موفق باشید

        چند تا لینک برای مطالعه بیشتر:

        http://www.technotux.org/html/index.php
        http://forum.ubuntu.ir/
        http://www.gnuiran.org/
        Work with what you have .Never limit yourself by things you could have had

        دیدگاه


          #5
          پاسخ : mini2440 و Linux

          با سلام
          متاسفانه موقع make به ارور زیر رسیدم:

          کد:
          arm-none-linux-gnueabi-ld: error: Source object /home/shahryar/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/armv4t/libgcc.a(_bswapsi2.o) has EABI version 5, but target u-boot has EABI version 0
          arm-none-linux-gnueabi-ld: failed to merge target specific data of file /home/shahryar/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/armv4t/libgcc.a(_bswapsi2.o)
          /home/shahryar/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/armv4t/libgcc.a(_bswapsi2.o):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
          make: *** [u-boot] Error 1

          u-boot 1.1.5
          تولچین هم با فایل arm-2010.09-50-arm-none-linux-gnueabi.bin از codesourcery گرفتم که با gui بود
          کسی میدونه چجوری میشه مشکل رو بر طرف کرد؟
          با تشکر


          مشکل تقریبا حل شد
          علتش قدیمی بودن فایل های u-boot بوده که با نسخه جدید کامپایلر هماهنگ نبوده لذا با پاک کردن صورت مساله(!) روش زیر رو انجام دادم:
          برای حل مشکل بالا هم ابتدا به دایرکتوری محل نصب کامپایلر میرید و فایل uninstall رو اجرا میکنید سپس همین ورژنی که اینجا هست:
          http://www.codesourcery.com/sgpp/lite/arm/portal/package3696/public/arm-none-linux-gnueabi/arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
          رو به هر شکلی که خواستید دانلود میکنید(مثلا با مرورگر)
          بعد بزاریدش تو دایرکتوری home (دایرکتوری های دیگه هم میتونه باشه من حال دردسر بیشتر نداشتم :mrgreen
          تو ترمینال میرید و میزنید:

          کد:
          tar xvf arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar

          این خط دستور میاد محتویات فایل فشرده ای که دانلود کردید و اسمش هم اصولا باید همین باشه رو گذاشتید تو home رو در دایرکتوری ای به اسم arm-2008q3 میزاره
          حالا فرقش با قبل اینه که شما فایل باینری ندارید اجراش کنید صرفا تو ترمینال میزنید:(به جای shahryar اسم user خودتون رو بزنید)

          کد:
          echo "export PATH=\$PATH:/home/shahryar/arm-2008q3/bin" >> ~/.bashrc

          کامپایلر شما آمادست
          برای اینکه مطمپن بشید ورژن کامپایلرتون تغییر کرده دستور زیر رو اجرا کنید:

          کد:
          arm-none-linux-gnueabi-gcc -v

          اگه همون فایل رو استفاده کرده باشید باید خط آخر ورژن رو 4.3.2 نشون بده
          حالا طبق آموزش بالا که آقای حسینی لطف کردند گذاشتند عمل کنید
          سه نکته دیگه:
          ۱- مرحله دوم آموزش آقای حسینی رو حتما در دایرکتوری uboot/mini2440 زده بشه حتما وگرنه از کامپایلری که نصب کردیم استفاده نمیشه
          ۲- اینکه این u-boot فقط برای mini2440 نیست انگار برای اطلاعات بیشتر به فایل makefile برید مثلا مرحله ۴ به جای mini2440 میشه زد at91sam9260-ek
          ۳- دایرکتوری همون فولدر هست(برای دوستانی که با لینوکس آشنایی چندانی ندارند)

          راستی این کامپایل میشه ولی کار نمیکنه
          همش هنگ میکنه چی کار کنم؟
          فلشم 256 مگ هست


          دیگه کامپایل کردن u-boot برام مهم نیست
          عوضش یه فایل آماده برای فلش 256MB پیدا کردم که کار میکنه با دستور العمل بالا
          میتونید از اینجا دانلودش کنید

          برای نصب arm-linux-gcc که ظاهرا برای کامپایل کرنل استفاده میشه هم میتونید به روش بالا عمل کنید
          در ضمن اگر یه وقت اروری دیدید با این مضمون:

          کد:
          arm-linux-gcc: Command not found

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

          دیدگاه


            #6
            پاسخ : mini2440 و Linux

            باسلام
            به آقا شهریار گل
            برای نصب arm-linux-gcc که ظاهرا برای کامپایل کرنل استفاده میشه هم میتونید به روش بالا عمل کنید
            در ضمن اگر یه وقت اروری دیدید با این مضمون:

            والا بنده رو 9260 دارم کار می کنم ولی معماری یکی می باشد.
            GCC کامپایلر برای LINUX هست!
            و این arm-linux-gcc برای کراس کامپایلر بر روی ARM هست ربطی به کرنل نداره

            دیدگاه


              #7
              پاسخ : mini2440 و Linux

              نوشته اصلی توسط S.R.F
              باسلام
              به آقا شهریار گل
              برای نصب arm-linux-gcc که ظاهرا برای کامپایل کرنل استفاده میشه هم میتونید به روش بالا عمل کنید
              در ضمن اگر یه وقت اروری دیدید با این مضمون:

              والا بنده رو 9260 دارم کار می کنم ولی معماری یکی می باشد.
              GCC کامپایلر برای LINUX هست!
              و این arm-linux-gcc برای کراس کامپایلر بر روی ARM هست ربطی به کرنل نداره
              سلام
              راستشو بخواید من حالا که فکر میکنم میبینم که احتمالا همه جورشو دیدم لااقل مطمئنم rootfs رو میشه با هر دو ساخت
              [hr]
              اینجا کسی درایور نویسی لینوکس بلده؟
              میخوام OV7670 رو به جای OV9650 بزنم به بورد قراره درایورش رو تغییر بدم منتها تو تغییر بعضی تنظیمات اولیه رو که بررسی کردم دیدم رجیستر های تنظیم شده تو دوربین وجود خارجی نداره حداقل بر حسب دیتاشیت
              به علاوه اینکه میخوام بالاترین سرعت ممکن رو داشته باشم در دریافت اطلاعات
              در کل چجوری باید از node file استفاده کنم؟بهینه ترین روشش چیه؟
              با تشکر

              دیدگاه

              لطفا صبر کنید...
              X