امبدد لینوکس, توصیه شده, کویکتل

ساخت پروگرامر OpenCpu ماژول های کوییکتل با F1c100s

ساخت پروگرامر OpenCpu ماژول های کوییکتل با F1c100s

اگر تابه‌حال با ماژول‌های کوییکتل و قابلیت OpenCpu آنها کارکرده باشید (اگر آشنایی ندارید پیشنهاد می‌کنم که حتماً یه سری به اینجا بزنید) میدونید که برای پروگرام این ماژول به نرم‌افزار ویندوزی خاصی (Qflash) نیاز هست، حالا اگر شما یک شرکت تولیدکننده با خروجی بالا باشید و توی محصولاتتون از این ماژول‌ها استفاده کرده باشید باید چیکار می‌کنید؟! باید مثلاً 10 تا سیستم ویندوزی آماده کنید و فقط برای یه پروگرام ساده ازش استفاده کنید!! خب اگر از خلاقیتتون استفاده نکنید مطمئناً تنها راه شما همین هست. اما توی این آموزش می‌خوایم بهتون روش خیلی به‌صرفه‌تری رو برای پروگرامر پیشنهاد بدیم و باهم قدم‌به‌قدم پیادش کنیم (تا در نهایت بتوانیم ساخت پروگرامر OpenCpu را یاد بگیریم) پس با سیسوگ همراه باشید تا به سراغ این پروژه جذاب بریم…

 

پروگرام ماژول های OpenCpu

همونطور که گفتیم برای پروگرام ماژول های OpenCpu شرکت کوییکتل نیاز هست که از نرم افزار ویندوزی Qflash که نسخه لینوکسی هم نداره استفاده کنید، به همین دلیل باید برای اینکار از یک سیستم ویندوزی استفاده کنید .

داخل ماژول MC60 شرکت کوییکتل از چیپ MT6261 و در ماژول M66 از MT5303 استفاده شده، خوشبختانه در اینجا یک کد برای پروگرام کردن این چیپ ها قرار داده شده که اصل کار هست و همین به ما کمک میکنه که پروگرامر خودمون رو بسازیم.

تصویر پروگرامری که در ادامه نحوه ساختش رو توضیح میدیم:

opencpu programmer

ساخت پروگرامر

ما اساس کار خودمون رو برای پروگرام ماژول MC60 قرار می‌دهیم و بر اساس اون پیش میریم، حالا ما یک کد پایتون داریم و یک فایل باینری، برای اجرای کد پایتون باید از یک پردازنده قوی استفاده کنیم که ما اینجا تصمیم گرفتیم که از تراشه ارزان‌قیمت F1c100s که قبلاً هم در سیسوگ در موردش صحبت کرده بودیم استفاده کنیم (البته شما اگر دانشش رو داشته باشید میتونید همین کد پایتون رو برای c بازنویسی کنید و پروگرامرتون رو با مثلاً یه میکروی stm32 پیاده‌سازی کنید).

در اینجا میتونید راهنمای کامل استفاده از پروگرامر ماژول MC60 رو مشاهده کنید.

 

اساس کار به این صورت هست که بعد از اتصال تغذیه برنامه پروگرامر اجرا میشه:

  1. اول باید برد خودمون رو به پروگرامر متصل کنیم
  2. بعد از اون ولتاژ خروجی برد رو به کمک جامپر ها مشخص میکنیم ، تامین تغذیه ماژول هم برای راحتی و کامل بودن هست و هم به این دلیل که برای شروع پروگرام نیاز هست که ماژول ریست بشه
  3. با زدن دکمه start پروگرام شروع میشه و در صورت موفقیت آمیز بودن پیغام finished نمایش داده میشه و یک تک بوق تایید توسط بازر زده میشه

 

شماتیک

در ادامه شماتیک این پروگرامر رو مشاهده می‌کنید.

شماتیک نکته خاصی نداره ، برای راحتی کار از برد Licheepi nano استفاده کردیم تا درگیر مدارات پردازنده نشیم و یه برد ساده داشته باشیم

در اینجا هم از یک بافر برای سریال استفاده کردیم تا در صورت مشکل داشتن پین‌های سریال ماژولی که باید پروگرام به شه (مثلاً موقع مونتاژ به یک خط تغذیه وصل شده باشه و ولتاژ داشته باشه) این بافر بسوزه و به‌راحتی تعویض به شه و پردازنده اصلی آسیب نبینه.

ماژول Wifi هم در اینجا تعبیه‌شده تا در توسعه‌های آینده یکسری استفاده ازش به شه و در حال حاضر نیاز به مونتاژ نیست چون کاری انجام نمی‌ده.

 

نرم افزار پروگرامر

برای استفاده از این برد ما نیاز به یک ایمیج شخصی‌سازی‌شده داریم برای این کار از بیلد روت آماده‌شده برای برد SINUX F1 استفاده می‌کنیم (اگر با بیلدروت آشنایی ندارید میتونید از اینجا شروع کنید) که داخلش پشتیبانی از licheepi nano هم هست، البته اگر امکانات لازم رو ندارید و یا میخواید فقط تست کنید ایمیج آماده‌شده رو میتونید از اینجا دانلود کنید.

ابتدا لازم هست که پشتیبانی از spi (برای LCD) و uart_2 (برای پروگرام) رو در device tree اضافه کنیم، این چند خط رو به فایل board/sisoog/sinux/f1/devicetree/linux/devicetree.dts اضافه می‌کنیم.

حالا این پکیج ها رو به buildroot اضافه کنیم:

  • python3
  • python-serial

برای اینکار دستور زیر را می‌نویسیم:

پکیج ها در این مسیر قرار دارند:

menuconfig buildroot

با زدن y بر روی هر پکیج، انتخاب شده و آماده نصب می‌شود.

حالا دستور

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

مرحله بعدی راه‌اندازی نمایشگر هست، برای این کار من یک کد آماده پیدا کردم ولی نسخه کرنل استفاده‌شده پایین بود و makefile هم نیاز به تغییراتی داشت تا با ایمیج ما همخوانی داشته باشه، برای همین نسخه مناسب رو در اینجا  قراردادم.

برای شروع اول کد درایور رو دریافت می‌کنیم

دستور make رو زده و آدرس بیلدروت خودمون رو هم بهش میدیم (برای استفاده از کامپایلر و کرنل)

فایل خروجی ما st7920fb.ko هست که توی پوشه /root برد لیچی پای اون رو قرار میدیم.

این درایور درواقع میاد و ال سی دی گرافیکی رو به‌عنوان یک فریم بافر معرفی میکنه و ما میتونیم به‌صورت frame buffer باهاش در ارتباط باشیم. ما میتونیم از طریق کد پایتون به فریم بافر دسترسی داشته باشیم و دیتا رو نمایش بدیم، من چندتا کتابخونه و روش‌های مختلف رو بررسی کردم اما همه اونها حجم فایل زیادی تولید میکرند و پردازش زیادی می‌گرفتند، پس تصمیم گرفتم که از یک راه دیگه پیش‌برم.

روشی که من پیش رفتم این هست که یک فایل c نوشتم که چندتا ورودی مشخص میگیره و بر اساس اونها دیتای مشخصی رو روی نمایشگر نشون می‌ده، مثلاً این دستورات:

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

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

برای کامپایل کد، از کامپایلر buildroot استفاده می‌کنیم:

حالا فایل خروجی رو به پوشه  /root برد لیچی پای انتفال میدیم.

قبل از ادامه کار بهتره که یه تستی داشته باشیم، sd card  رو داخل ماژول قرارداده، پین های سریال ماژول رو به یک مبدل وصل کرده و تغذیه برد رو متصل می‌کنیم.

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

با یوزر root لاگین میشیم ، باید دوتا فایل داشته باشیم

ابتدا با دستور insmod درایور نمایشگر رو لود میکنیم و بعد از اون چند تا دستور رو با کد display تست میکنیم.

حالا میریم سراغ کد اصلی که فایل mtkflasher.py هست ، به این فایل بخش های زیر اضافه شده:

  • خواندن وضعیت کلید
  • نمایش اطلاعات بر روی نمایشگر
  • تکرار برنامه
  • کنترل وضعیت خروجی ها

به طور مثال این تابع main ما هست که چرخه کامل پروگرام رو انجام میده.

این فایل رو هم به /root اضافه می‌کنیم.

لازم هست که اینجا یه توضیحی در مورد کنترل GPIO ها داده به شه. همونطور که میدونید توی لینوکس همه‌چیز یا فایل هست و یا پروسس. این سیستم به این معنی هست که پس ما با فایل‌ها زیاد سروکار داریم حتی برای خاموش و روشن کردن یک led!

برای کار با gpio ها یک کتابخونه ای در کرنل لینوکس هست که به ما کمک میکنه به gpio ها دسترسی داشته باشیم، برای اطلاعات بیشتر میتونید به این لینک سر بزنید. برای استفاده از اون به این صورت عمل می‌کنیم:

ابتدا به پوشه درایور می‌رویم

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

برای برد لیچی پای شماره پینی که میخواید رو به کمک فایل در پوشه های کرنل می‌تونید پیدا کنید.

"output/build/linux-5.4.92/drivers/pinctrl/sunxi/pinctrl-sunxi.h"

به طور مثال پین PE11 که به بازر وصل هست شمارش میشه 139، برای تست اون رو اضافه می‌کنیم

حالا وارد پوشه میشیم، جهت پین رو خروجی قرار می‌دهیم و وضعیتش را عوض می‌کنیم.

برای این آموزش تا همین حد آشنایی با gpio ها کافیه 🙂

مرحله بعدی لود شدن برنامه پروگرامر بعد از بوت هست، همونطور که میدونید بعد از لود شدن کرنل تنها یک برنامه اجرا میشه که init هست و اون میاد بقیه برنامه ها رو اجرا میکنه، ما توی بیلدروت از busybox init استفاده کردیم و باید اسکریپت خودمون رو به پوشه /etc/init.d/ اضافه کنیم، اسم فایل رو S31Programmer میزاریم و محتواش رو به این صورت قرار می‌دهیم.

همونطور که می‌بینید ما :

  • ابتدا درایور lcd رو لود کردیم
  • پین‌های ورودی و خروجی رو اضافه کردیم
  • پین‌ها رو مقدار دهی کردیم
  • و در نهایت برنامه اصلی رو اجرا کردیم

مرحله آخر هم بحث انتقال فایل پروگرام از طریق usb هست، برای این کار از پکیج uMTPrd استفاده‌شده که برد رو میتونه به‌عنوان یک دستگاه ذخیره‌سازی معرفی کنه از طریق usb، این پکیج به‌صورت پیش‌فرض توی کانفیگ ها SINUX F1 فعال هست و نیاز نیست که اضافش کنیم، فقط یک پوشه به نام mc60_firmware در مسیر /root می‌سازیم و آدرس اون رو به umtprd میدیم تا این پوشه فقط قابل‌دسترسی باشه، برای این کار فایل /etc/umtprd/umtprd.conf رو ویرایش کرده و در این خط مسیر دلخواهمون رو بهش میدیم

کار تموم هست ، فقط مطمئن بشید که همه این کار ها رو انجام دادید

 

امیدوارم که خسته نشده باشید 🙂 . توی این آموزش ما فقط سرنخ ها رو برای یکسری کارها دادیم و باید حتما هر کدوم از مباحث رو دنبالش رو بگیرید و بیشتر باهاش آشنا بشید تا بتونید به‌خوبی ازش استفاده کنید.

در ادامه هم میتونید فیلمی از نحوه استفاده از پروگرامر رو بررسی کنید:

 

خرید پروگرامر ماژول MC60 از فروشگاه سیسوگ

 

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

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

نوشته های مشابه

19 دیدگاه در “ساخت پروگرامر OpenCpu ماژول های کوییکتل با F1c100s

  1. Avatar for AmirAli AmirAli گفت:

    “کار تموم هست ، فقط مطمئن بشید که همه این کار ها رو انجام دادید”
    توی جدول انتهایی جای این دوتا فایل اشتباه قرار گرفته یا باید هیمنطوری بزاریم فایل هارو؟
    /root/mc60_firmware/mt6261_da.bin
    /root/MC60_AVLHDR.bin
    این فایل MC60_AVLHDR دوبار تکرار شده

    1. Avatar for Mahdi.h   Mahdi.h   گفت:

      فایل MC60_AVLHDR به اشتباه دوبار تکرار شده و اصلاح شد، این فایل همون فایل اصلی هست که روی ماژول پروگرام میشه و توی پوشه build/gcc در داخل sdk خود openCPU هست. البته اسمش متفاوته و یه چیزی توی این مایه هاست APPGS3MDM32A01.bin
      فایل mt6261_da هم نیازه و در گیت هاب قرار گرفته

  2. Avatar for AmirAli AmirAli گفت:

    # ls
    display simpleGUI st7920fb.ko
    # insmod st7920fb.ko
    [ 45.343660] st7920fb: loading out-of-tree module taints kernel.
    # ./display clear
    -sh: ./display: Permission denied

    ارور میده برا تست ال سی دی
    یه فایل simpleGUI اضافه داره نسبت به توضیحات شما

    1. Avatar for Mahdi.h   Mahdi.h   گفت:

      باید دسترسی اجرا به فایل display بدید
      برای اینکار از این کامند استفاده کنید
      chmod +x display

      1. Avatar for AmirAli AmirAli گفت:

        ممنون از پاسخگوییتون
        # ./display clear
        -sh: ./display: Permission denied
        # chmod +x display
        # ./display clear
        Error: cannot open framebuffer device.

        این پیامو میده بعدش

      2. Avatar for AmirAli AmirAli گفت:

        ممنون
        فریم بافر رو نمیتونه بازش کنه. فایل fb1 ساخته نمیشه داخل پوشه dev
        کجارو باید کانفیگ کرد؟

  3. Avatar for AmirAli AmirAli گفت:

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

    1. Avatar for Mahdi.h   Mahdi.h   گفت:

      سلام. همونطور که در مطلب هم اشاره شده درایور ال سی دی ما st7920 هست و با سرچ اون در موتور جست و جوی آیسی میتونید اون نوع ال سی دی رو خریداری کنید

      1. Avatar for S.AmirAli S.AmirAli گفت:

        خیلی ممنونم
        من لینوکس کار نکردم، میخوام از ایمیج اماده استفاده کنم، فایل رو با نرم افزار خاصی باید بریزم توی sd card یا همینطوری که بقیه فایلهارو انتقال میدیم انجامش بدم؟
        تا چه حافظه ای پشتیبانی میکنه برای sd card، من ۳۲ گیگ خریدم

        1. Avatar for Mahdi.h   Mahdi.h   گفت:

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

  4. Avatar for جواد جواد گفت:

    سلام
    بعد از اضافه کردن پکیج سریال پایتون و make این ارور میاد.
    SyntaxError: invalid syntax
    make[1]: *** [package/pkg-generic.mk:269: /home/SinuxF1/New/buildroot-sinux/output/build/python-serial-3.4/.stamp_built] Error 1
    ممنون میشم راهنمایی کنین

    1. Avatar for s.AmirAli s.AmirAli گفت:

      سلام
      برای منم همین ارور میاد

      (cd /home/mashroti/buildroot-sinux/output/build/python-serial-3.4//; _PYTHON_SYSCONFIGDATA_NAME=”{ [ -e /home/mashroti/buildroot-sinux/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/python3.8//_sysconfigdata__linux_*.py ] && basename /home/mashroti/buildroot-sinux/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/python3.8//_sysconfigdata__linux_*.py .py; } || true” PATH=”/home/mashroti/buildroot-sinux/output/host/bin:/home/mashroti/buildroot-sinux/output/host/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin” PATH=”/home/mashroti/buildroot-sinux/output/host/bin:/home/mashroti/buildroot-sinux/output/host/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin” AR=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-ar” AS=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-as” LD=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-ld” NM=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-nm” CC=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-gcc” GCC=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-gcc” CPP=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-cpp” CXX=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-g++” FC=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-gfortran” F77=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-gfortran” RANLIB=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-ranlib” READELF=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-readelf” STRIP=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-strip” OBJCOPY=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-objcopy” OBJDUMP=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-objdump” AR_FOR_BUILD=”/usr/bin/ar” AS_FOR_BUILD=”/usr/bin/as” CC_FOR_BUILD=”/usr/bin/gcc” GCC_FOR_BUILD=”/usr/bin/gcc” CXX_FOR_BUILD=”/usr/bin/g++” LD_FOR_BUILD=”/usr/bin/ld” CPPFLAGS_FOR_BUILD=”-I/home/mashroti/buildroot-sinux/output/host/include” CFLAGS_FOR_BUILD=”-O2 -I/home/mashroti/buildroot-sinux/output/host/include” CXXFLAGS_FOR_BUILD=”-O2 -I/home/mashroti/buildroot-sinux/output/host/include” LDFLAGS_FOR_BUILD=”-L/home/mashroti/buildroot-sinux/output/host/lib -Wl,-rpath,/home/mashroti/buildroot-sinux/output/host/lib” FCFLAGS_FOR_BUILD=”” DEFAULT_ASSEMBLER=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-as” DEFAULT_LINKER=”/home/mashroti/buildroot-sinux/output/host/bin/arm-buildroot-linux-gnueabi-ld” CPPFLAGS=”-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64″ CFLAGS=”-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Os ” CXXFLAGS=”-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Os ” LDFLAGS=”” FCFLAGS=” -Os ” FFLAGS=” -Os ” PKG_CONFIG=”/home/mashroti/buildroot-sinux/output/host/bin/pkg-config” STAGING_DIR=”/home/mashroti/buildroot-sinux/output/host/arm-buildroot-linux-gnueabi/sysroot” INTLTOOL_PERL=/usr/bin/perl PYTHONPATH=”/home/mashroti/buildroot-sinux/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/python3.8/” PYTHONNOUSERSITE=1 _python_sysroot=/home/mashroti/buildroot-sinux/output/host/arm-buildroot-linux-gnueabi/sysroot _python_prefix=/usr _python_exec_prefix=/usr /home/mashroti/buildroot-sinux/output/host/bin/python setup.py build )
      File “/home/mashroti/buildroot-sinux/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/python3.8/site.py”, line 178
      file=sys.stderr)
      ^
      SyntaxError: invalid syntax
      make[1]: *** [package/pkg-generic.mk:269: /home/mashroti/buildroot-sinux/output/build/python-serial-3.4/.stamp_built] Error 1
      make: *** [Makefile:84: _all] Error 2

      متن کاملش اینه

    2. Avatar for s.AmirAli s.AmirAli گفت:

      make sisoog_sinux_f1_defconfig

      این دستور زدم و درست شد

  5. Avatar for مهدی مهدی گفت:

    مطمئنید برای استفاده از qflash باید از ویندوز استفاده کنید؟

    1. Avatar for Mahdi.h   Mahdi.h   گفت:

      مطمئنا میشه توی لینوکس هم از اون استفاده کرد و ما خودمون هم با کمک wine از qflash توی لینوکس استفاده میکنیم. اما مشکل اینجاست که qflash رو نمیشه روی f1c100s بالا آورد 🙂

  6. Avatar for مسعود مسعود گفت:

    سلام
    اینکه فریمورهای جدید کویکتل تو ایران جواب نمیدن صحت داره؟

    1. Avatar for Sisoog Os Sisoog Os گفت:

      سلام کلیت خبر صحیح میباشد

  7. Avatar for جواد جواد گفت:

    سلام
    مثل همیشه عالی بود..
    خیلی ارزشمند هست این مطالبی که لطف میکنین و در اختیار همه قرار میدین.
    خداقوت

    1. Avatar for Mahdi.h   Mahdi.h   گفت:

      سلام.
      خواهش میکنم 🙂

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *