با سلام(اموزش تصحیح شد)
داخل یکی از پست ها دوستی درخواست این آموزش رو کرد گفتم که اینجا بذارم. اینم بگم که تجربه اول من در پست نوشتنه، کم و کسرشو ببخشین.
در این اموزش ما قرار نیست پروتکل 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 اون رو خوند.
خب نمی دونم نوشتارم از چه حدی از مقبولیت برخورداره، اگه شرایط مناسب بود کمی ادامه هم برای اموزش می ذاریم که توضیحات فایل های دیگه و نحوه افزایش بایت های ارسالی و دریافتی می باشد.
داخل یکی از پست ها دوستی درخواست این آموزش رو کرد گفتم که اینجا بذارم. اینم بگم که تجربه اول من در پست نوشتنه، کم و کسرشو ببخشین.
در این اموزش ما قرار نیست پروتکل 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 اون رو خوند.
خب نمی دونم نوشتارم از چه حدی از مقبولیت برخورداره، اگه شرایط مناسب بود کمی ادامه هم برای اموزش می ذاریم که توضیحات فایل های دیگه و نحوه افزایش بایت های ارسالی و دریافتی می باشد.
دیدگاه