اطلاعیه

Collapse
No announcement yet.

اموزش راه اندازی USB-HID (کیل)

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

    اموزش راه اندازی USB-HID (کیل)

    با سلام(اموزش تصحیح شد)
    داخل یکی از پست ها دوستی درخواست این آموزش رو کرد گفتم که اینجا بذارم. اینم بگم که تجربه اول من در پست نوشتنه، کم و کسرشو ببخشین.
    در این اموزش ما قرار نیست پروتکل USB رو فراگیری کنیم، فقط اونقدی که به ما در فهم کد کمک کنه رو یاد می گیریم.
    برای شروع، از مثال آماده کیل شروع می کنیم. مثال منطبق با میکروی خودتون رو پیدا کنید و با همون کار کنین.
    داخل پروژه یه فایل با اسم usbhw.c هست که سخت افزار رو مشخص می کنه، با تغییر این فایل می تونین فایل رو واسه سخت افزار خودتون تغییر بدین که می ذاریم به عهده خودتون.
    با فایل usbcore.c هم هیچ کاری نداریم بذارین به حال خودش بمونه.
    اما 3 فایل دیگه اونایی هستند که ما با هاشون کار داریم. به زبون ساده usb انتقال دیتا رو بوسیله ی تعدادی endpoint صورت میده. میشه اینطور فرض کرد که پورت به 16 قسمت مجازی تقسیم میشه که هر کدوم می تونن ورودی خروجی یا هر دو باشن. endpoint 0 هم یک حالت خاص هست و برای کنترل دستگاه استفاده میشه.
    هر endpoint دارای قسمت های IN و OUT می تونه باشه، اولی اجباری و دومی اختیاریه.
    خب بهتره بپریم وسط کار تا ببینیم چی داریم.اگر سخت افزار رو درست ببندین و مثال رو اجرا کنین و با یک برنامه ای پورت USB رو رصد کنید می بینید که همین طور دیتا دارهپشت سر هم ارسال میشه و خب این اصلا خوب نیست، ما شاید بخوایم کنترلی روی دیتا داشته باشیم، مثلا هر وقت اتفاق خاصی افتاد، دیتا ارسال بشه. چطور میشه این کارو کرد؟
    باید دید تعریف IN و OUT چیه؟
    مکانیزم کار اینطوریه، شما حتی اگه با مد اینتراپت USB کار کنید کاری جز polling انجام نمیدین. توسط فایل usbdesc.c که بعدا توضیح میدم، شما یک زمان برای HOST در نظر میگیرین،HOST در دو صورتدستگاه شما رو poll می کنه،
    1-اتمام ارسال دیتای فعلی(هر وقت بافر ارسال تموم شد، هاست می پرسهکه آیا دیتای دیگه ای هم هست؟)
    2-اگه دستگاه برای مدت زمانی که الان گفتیم چیزی نفرسته
    حالا هر وقت هاست، دستگاه ما رو poll کرد اگر بافر ارسال پر باشه دیتا ارسال میشه و گرنه خود موتور usb اون پشت مشت ها بهش می فهمونه که دیتایی نیست.
    حالا، یه بار دیگه به کد نگاه کنین. تو فایل USBUSER.C، به قسمت اندپوینت 1 نگاه کنین، (void USB_EndPoint1 (U32 event
    هر دفعه تابع USB_WriteEP رو صدا می کنه، این تابع برای پر کردن بافر ارسال هست.خب معلوم شد، اولین دفعه ای که به هاست متصل میشیم در بخش USB_CONFIGURE_EVENT بافر پر میشه، حالا اولین دفعه که هاست ما رو poll کنه چون بافر پره ارسال میشه،حالا که ارسال تموم شد طبق تعریف اینتراپت IN چون ما فقط اندپوینت 1 رو راه انداختیم، میاد به قسمت IN اندپوینت 1 و یک بار دیگه بافر پر میشه، دیتا که ارسال شد یه بار دیگه اینتراپت میاد و باز هم بافر پر میشه و الی آخر....
    خب یکی از اشتباهاتی که ممکنه این کد باعثش بشه همینه، لازم نیست بافر توی اینتراپت IN اندپوینت 1 صدا بشه، هر جایی می تونه باشه، و اصلا درستش اینه که اینجا پر نشه.
    اینتراپت OUT هم که اختیاریه وقتی ایجاد میشه که دیتایی از طرف هاست اماده باشه که میشه با دستور USB_ReadEP اون رو خوند.
    خب نمی دونم نوشتارم از چه حدی از مقبولیت برخورداره، اگه شرایط مناسب بود کمی ادامه هم برای اموزش می ذاریم که توضیحات فایل های دیگه و نحوه افزایش بایت های ارسالی و دریافتی می باشد.




    The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

    #2
    پاسخ : اموزش راه اندازی USB-HID (کیل)

    توی این آیتم(usb)
    من یکی که مشکل دارم،اگه کامل بگی که خیلی خوبه
    هميشه به ياد خدا باش !

    دیدگاه


      #3
      پاسخ : اموزش راه اندازی USB-HID (کیل)

      منتظریم ولی انگار خبری نیست

      دیدگاه


        #4
        پاسخ : اموزش راه اندازی USB-HID (کیل)

        سلام
        ممکنه درباره 2 تا تابع زیر یکم توضیح بدین یعنی منظور از Report type و Report ID و Request type چیه؟


        کد:
        int usbd_hid_get_report (
         U8 rtype,         // Report type
         U8 rid,          // Report ID
         U8* buf,          // Pointer to the buffer to report data
         U8 req           // Request type
        );
        کد:
        void usbd_hid_set_report (
         U8 rtype,         // Report type
         U8 rid,          // Report ID
         U8* buf,          // Pointer to the buffer to report data
         int len,          // Length of report (in bytes)
         U8 req           // Request type
        );

        دیدگاه


          #5
          پاسخ : اموزش راه اندازی USB-HID (کیل)

          با سلام
          دوست عزیز بنده خدمت شما عرض کردم، بنده اطلاع چندانی از پروتوکل پیچیده USB ندارم، صرفا نحوه کارکرد اون و بعضی اصول اولیه رو بنا به نیار برای راه اندازی اون فرا گرفتم، این طور که به نظر میاد مواردی که شما نام بردید مربوط به بسته های USB ارسالی و جزیی از ساختار اون ها می باشد، که در موردشون اطلاعات چندانی ندارم
          The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

          دیدگاه


            #6
            پاسخ : اموزش راه اندازی USB-HID (کیل)

            نوشته اصلی توسط hessam2013
            با سلام
            داخل یکی از پست ها دوستی درخواست این آموزش رو کرد گفتم که اینجا بذارم. اینم بگم که تجربه اول من در پست نوشتنه، کم و کسرشو ببخشین.
            در این اموزش ما قرار نیست پروتکل USB رو فراگیری کنیم، فقط اونقدی که به ما در فهم کد کمک کنه رو یاد می گیریم.
            برای شروع، از مثال آماده کیل شروع می کنیم. مثال منطبق با میکروی خودتون رو پیدا کنید و با همون کار کنین.
            داخل پروژه یه فایل با اسم usbhw.c هست که سخت افزار رو مشخص می کنه، با تغییر این فایل می تونین فایل رو واسه سخت افزار خودتون تغییر بدین که می ذاریم به عهده خودتون.
            با فایل usbcore.c هم هیچ کاری نداریم بذارین به حال خودش بمونه.
            اما 3 فایل دیگه اونایی هستند که ما با هاشون کار داریم. به زبون ساده usb انتقال دیتا رو بوسیله ی تعدادی endpoint صورت میده. میشه اینطور فرض کرد که پورت به 16 قسمت مجازی تقسیم میشه که هر کدوم می تونن ورودی خروجی یا هر دو باشن. endpoint 0 هم یک حالت خاص هست و برای کنترل دستگاه استفاده میشه.
            هر endpoint دارای قسمت های IN و OUT می تونه باشه، اولی اجباری و دومی اختیاریه.
            خب بهتره بپریم وسط کار تا ببینیم چی داریم.اگر سخت افزار رو درست ببندین و مثال رو اجرا کنین و با یک برنامه ای پورت USB رو رصد کنید می بینید که همین طور دیتا دارهپشت سر هم ارسال میشه و خب این اصلا خوب نیست، ما شاید بخوایم کنترلی روی دیتا داشته باشیم، مثلا هر وقت اتفاق خاصی افتاد، دیتا ارسال بشه. چطور میشه این کارو کرد؟
            باید دید تعریف IN و OUT چیه؟
            مکانیزم کار اینطوریه، شما حتی اگه با مد اینتراپت USB کار کنید کاری جز polling انجام نمیدین. توسط فایل usbdesc.c که بعدا توضیح میدم، شما یک زمان برای HOST در نظر میگیرین،HOST در دو صورتدستگاه شما رو poll می کنه،
            1-اتمام ارسال دیتای فعلی(هر وقت بافر ارسال تموم شد، هاست می پرسهکه آیا دیتای دیگه ای هم هست؟)
            2-اگه دستگاه برای مدت زمانی که الان گفتیم چیزی نفرسته
            حالا هر وقت هاست، دستگاه ما رو poll کرد اگر بافر ارسال پر باشه دیتا ارسال میشه و گرنه خود موتور usb اون پشت مشت ها بهش می فهمونه که دیتایی نیست.
            حالا، یه بار دیگه به کد نگاه کنین. تو فایل USBUSER.C، به قسمت اندپوینت 1 نگاه کنین، (void USB_EndPoint1 (U32 event
            هر دفعه تابع USB_WriteEP رو صدا می کنه، این تابع برای پر کردن بافر ارسال هست.خب معلوم شد، اولین دفعه ای که هاست ما رو poll کنه، چون ما فقط اندپوینت 1 رو راه انداختیم، میاد به قسمت IN اندپوینت 1 و بافر پر میشه، دیتا که ارسال شد یه بار دیگه poll میشیم و باز هم بافر پر میشه و الی آخر....
            خب یکی از اشتباهاتی که ممکنه این کد باعثش بشه همینه، لازم نیست بافر توی اینتراپت IN اندپوینت 1 صدا بشه، هر جایی می تونه باشه، و اصلا درستش اینه که اینجا پر نشه.
            اینتراپت OUT هم که اختیاریه وقتی ایجاد میشه که دیتایی از طرف هاست اماده باشه که میشه با دستور USB_ReadEP اون رو خوند.
            خب نمی دونم نوشتارم از چه حدی از مقبولیت برخورداره، اگه شرایط مناسب بود کمی ادامه هم برای اموزش می ذاریم که توضیحات فایل های دیگه و نحوه افزایش بایت های ارسالی و دریافتی می باشد.
            آقا حوبه که همت کردی و میخوای شروع کنی به پر کردن کپسولای اکسیژن :biggrin:
            می تونی کمی ریزتر بشی تو این قسمتا، همون طور که گفتم مثلا یک تابعی درست کنیم که هر وقت فراخونیش کردیم یک بایت دلخواه رو باهاش بتونیم بفرستیم واسه کامپیوتر.
            ---------
            .
            .
            ...........

            دیدگاه


              #7
              پاسخ : اموزش راه اندازی USB-HID (کیل)

              خیلی ممنون از دوستان، آقا شما اینقد اکسیژن مصرف می کنن دستگاهاون فردا ترمیناتور نشن :cry2:
              خوب برای ادامه آموزش میریم سراغ فایل USBUSER.c
              تو این فایل تمام رخداد های USB در توابعی جداگانه دسته بندی شده اند تا ما بتونیم روتین مربوط به هر رویداد رو به راحتی در اونا بنویسیم.
              رویدادها حالات مختلفی دارند. مثل روشن شدن، ریست شدن، اتصال به هاست دریافت یا ارسال و ... برای مثال در کد زیر در روتین مربوط به اتصال به هاست ما یک کاراکتر رو به بافر ارسال، ارسال می کنیم. یعنی هر وقت دستگاه به هاست متصل شد این حرف برای هاست ارسال میشه.
              کد:
              #if USB_CONFIGURE_EVENT
              void USB_Configure_Event (void) {
              
               if (USB_Configuration) {          /* Check if USB is configured */
                InReport = 'a';
                USB_WriteEP(HID_EP_IN, &InReport, sizeof(InReport));
               }
              }
              #endif
              همون طور که میبینید برای ارسال از تابع USB_WriteEP استفاده شده، این تابع در حقیقت ارسال رو انجام نمیده، بافر ارسال رو پر میکنه و در پست اول توضیح داده شد که این عمل با ارسال تفاوت می کنه. بعد از پر شدن بافر، موتور USB منتظر می مونه تا هاست یک اینتراپت بده بعد ارسال انجام میشه. نکته دیگه اینه که بافر ما فقط یک بایت رو تو خودش نگه میداره اما این اندازه می تونه بیشترم بشه،
              خب من فکر کنم برای الان شما اگه سخت افزار دارین، مثال رو کامپایل کنین و سعی کنین با استفاده از اینتراپت IN در endpoint1 مثلا 100 تا کاراکتر رو به pc ارسال کنید. اگه این کارو کردید یعنی نیمی از کنترل فلوی USB رو یاد گرفتین.
              موفق باشین. :applause:
              The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

              دیدگاه


                #8
                پاسخ : اموزش راه اندازی USB-HID (کیل)

                نوشته اصلی توسط hessam2013
                خیلی ممنون از دوستان، آقا شما اینقد اکسیژن مصرف می کنن دستگاهاون فردا ترمیناتور نشن :cry2:
                خوب برای ادامه آموزش میریم سراغ فایل USBUSER.c
                تو این فایل تمام رخداد های USB در توابعی جداگانه دسته بندی شده اند تا ما بتونیم روتین مربوط به هر رویداد رو به راحتی در اونا بنویسیم.
                رویدادها حالات مختلفی دارند. مثل روشن شدن، ریست شدن، اتصال به هاست دریافت یا ارسال و ... برای مثال در کد زیر در روتین مربوط به اتصال به هاست ما یک کاراکتر رو به بافر ارسال، ارسال می کنیم. یعنی هر وقت دستگاه به هاست متصل شد این حرف برای هاست ارسال میشه.
                کد:
                #if USB_CONFIGURE_EVENT
                void USB_Configure_Event (void) {
                
                 if (USB_Configuration) {          /* Check if USB is configured */
                  InReport = 'a';
                  USB_WriteEP(HID_EP_IN, &InReport, sizeof(InReport));
                 }
                }
                #endif
                همون طور که میبینید برای ارسال از تابع USB_WriteEP استفاده شده، این تابع در حقیقت ارسال رو انجام نمیده، بافر ارسال رو پر میکنه و در پست اول توضیح داده شد که این عمل با ارسال تفاوت می کنه. بعد از پر شدن بافر، موتور USB منتظر می مونه تا هاست یک اینتراپت بده بعد ارسال انجام میشه. نکته دیگه اینه که بافر ما فقط یک بایت رو تو خودش نگه میداره اما این اندازه می تونه بیشترم بشه،
                خب من فکر کنم برای الان شما اگه سخت افزار دارین، مثال رو کامپایل کنین و سعی کنین با استفاده از اینتراپت IN در endpoint1 مثلا 100 تا کاراکتر رو به pc ارسال کنید. اگه این کارو کردید یعنی نیمی از کنترل فلوی USB رو یاد گرفتین.
                موفق باشین. :applause:
                دوست عزیز, ممنون از آموزش بی نظیرتون
                من تو آرم یکم تازه کارم.
                من اومدم تو endpoint1 یک فلگ گذاشتم که هروقت اجرا شد فلگ رو 1 کنه.
                بعد یه روتین نوشتم که inreport رو مقدار بده, فلگ رو 0 کنه بعد صبر کنه تا فلگ 1 بشه. دوبه مقدار بعدی رو به inreport بده.
                ولی درست کار نمیکنه.
                میشه راهنمایی کنید.
                ممنون

                دیدگاه


                  #9
                  پاسخ : اموزش راه اندازی USB-HID (کیل)

                  من اومدم تو endpoint1 یک فلگ گذاشتم که هروقت اجرا شد فلگ رو 1 کنه.
                  بعد یه روتین نوشتم که inreport رو مقدار بده, فلگ رو 0 کنه بعد صبر کنه تا فلگ 1 بشه. دوبه مقدار بعدی رو به inreport بده.
                  ولی درست کار نمیکنه.
                  میشه راهنمایی کنید.
                  با سلام
                  خواهش می کنم،
                  خوب شما همه این کارارو کردین، ایا بافر ارسال رو با دستور USB_WriteEP پر کردین، تا اینکارو نکنین روتین وقفه اجرا نمیشه.
                  The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                  دیدگاه


                    #10
                    پاسخ : اموزش راه اندازی USB-HID (کیل)

                    بله این کار رو هم کردم. هم توی endpoint امتحان کردم. هم توی روتین خودم.
                    ولی فقط 1-2 تا از کاراکتر ها رو می تونیم بگیرم. ظاهرا همه رو می فرسته. ولی سمت کامپیوتر 1-2 تا رو می تونم بگیرم.

                    دیدگاه


                      #11
                      پاسخ : اموزش راه اندازی USB-HID (کیل)

                      فکر کنم بد نباشه روتین و وقفه اندپوینت رو بذارین یه نگاه بکنیم
                      The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                      دیدگاه


                        #12
                        پاسخ : اموزش راه اندازی USB-HID (کیل)

                        مررررررسی دوستان تاپیک خوبی میتونه بااااشه. :wow: :wow:
                        منم خیلی مشکل با کار با USB دارم.امیدوارم بتونیم به کمک همدیگر به جایی برسونیم

                        دیدگاه


                          #13
                          پاسخ : اموزش راه اندازی USB-HID (کیل)

                          سلام دوستان
                          من می خوام حالت USB Mass Storage (Host) رو در LPC1788 راه بندازم. کسی هست بتونه راهنماییم کنه باید از کجا شروع کنم؟

                          دیدگاه


                            #14
                            پاسخ : اموزش راه اندازی USB-HID (کیل)

                            کسی تونسته سایز بافر رو تغییر بده و از اندپوینتهای بیشتری استفاده کنه
                            منظورم اینه که تو حالت hid سرعت رو بالا ببریم؟
                            هميشه به ياد خدا باش !

                            دیدگاه


                              #15
                              پاسخ : اموزش راه اندازی USB-HID (کیل)

                              برای سایز بافر من خودم از لینک زیر یادگرفتم برای اولین بار، البته سرچ کنید تو فروم کیل چند تا لینک دیگه هم هست که به فهم کمک می کنه، بخونین خیلی خوب و کامل گفته
                              http://www.keil.com/forum/11137/
                              اینم یدونه دیگه
                              http://www.keil.com/forum/17770/expa...-example-code/
                              The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                              دیدگاه

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