facebook pixel בלוג: העולם האכזר של USB - www.4project.co.il
Main logo www.4project.co.il
כל הרכיבים לפרוייקט שלכם
עגלת קניות

העגלה ריקה

העולם האכזר של USB


2025-01-20 20:36:38

הקדמה

מי שעוקב אחרי, בטח שם לב שאני מנסה לבנות כרטיס פיתוח, משהו דומה לכרטיסי Arduino, עם חיבור USB לצריבת התוכניות, כמוקבל בתחום.

לא אפרט על הכרטיס בפוסט זה, כי זו לא הכוונה. מה שחשוב לטובת הפוסט היא העובדה שיש על הכרטיס מחבר USB, שדרכו הוא אמור להתחבר למחשב כדי שאפשר יהיה לצרוב עליו את התוכניות. לא שונה מכרטיסי ארדואינו או רוב כרטיסי פיתוח אחרים.

מה זה VID/PID?

כשהתקן כלשהו מתחבר דרך ה-USB, הוא צריך להזדהות מול המארח (המחשב) כדי להסביר לו מי התחבר ומה הוא יכול לעשות. המחשב יעלה דרייבר מתאים למה שההתקן מבקש כדי שתוכנות אחרות יוכלו לתקשר איתו.

כחלק מתהליך ההזדהות ההתקן צריך לספק שני מספרים: VID ו-PID.
ה-VID הוא Vendor ID, כלומר מספר מזהה של יצרן ההתקן.
ה-PID הוא Product ID, כלומר מספר מזהה של המוצר.

המחשב צריך את כל הנתונים האלה כדי לדעת איזה דרייבר לעלות. אם למשל חיברתם כרטיס קול USB של Creative, אז צריך שהדרייבר הרלוונטי של Creative יתחיל לפעול, כי הוא זה שידע איך לתקשר עם כרטיס הקול. די הגיוני.

מה קורה אם לא התקנתם דרייבר יעודי להתקן שאתם מחברים? המחשב יכול לנסות לעלות דרייבר "גנרי" (Generic driver) שיתאים ליכולות שההתקן מספר על עצמו. זו הסיבה שכל מקלדת או עכבר USB שתחברו למחשב יעבדו לכם מעולה גם בלי שהתקנתם איזה שהוא דרייבר מיוחד בשבילם. אבל אם תרצו לשלוט על הלדים או כפתורים מיוחדים של עכבר Logitech, או לראות כמה סוללה נשארה לו, אתם צריכים להתקין דרייבר של Logitech שתוכנן לעבוד עם העכבר הספציפי הזה.

ה-PID זה פשוט, איזה שהוא מספור שהיצרן מקצה פנימית בארגון שלו למוצר. ה-VID מוקצה ע"י ארגון ה-USB כדי למנוע התנגשות בין המספרים שהיצרנים משתמשים בהם.

הבעיה

מה בסך הכל כרטיס ארדואינו צריך? חיבור טורי (או בשפת USB - התקן CDC) כדי שאפשר יהיה להעביר דרך החיבור הזה את התוכנית שרוצים לצרוב על הבקר, ואחרי זה לתקשר עם הכרטיס ב-Serial console.

תהליך ההזדהות מול המחשב נעשה ע"י ה-bootloader. שזה הדבר הראשון שרץ על הכרטיס כשהוא מקבל מתח. חלק מה-bootloaders מזדהים גם כהתקן זיכרון נייד, שאפשר לגרור אליו את התוצר של קומפילציית התוכנית שלכם כדי שהיא תצרב על הכרטיס.

אז אני עכשיו בשלב של לקמפל bootloader לכרטיס שאני מייצר. יש לא מעט דוגמאות ברשת לכרטיסים שמשתמש במיקרובקר SAMD21. אפשר לקחת את הקוד של Arduino Zero או כרטיסים של SparkFun או Adafruit שמבוססים על אותו השבב, שמפרסמים את הקוד המלא של ה-bootloader.

גם החיבור הטורי וגם התקן זיכרון זה משהו די סטנדרטי בימינו. אתם לא מתקינים דרייבר מיוחד כשאתם מכניסים את ה-DiskOnKey שלכם למחשב. לשניהם יש דרייברים "גנריים" שמאפשרים לכל זה לעבוד. (כן, אני יודע שלפעמים צריך להתקין דרייברים מיוחדים של FTDI, ולפעמים של CH340 ודומיו… אבל לדעתי זה יותר בגלל מלחמות אגו בין היצרנים מאשר צורך פונקציונלי אמיתי).

לתומי חשבתי שאם יש דרייברים גנריים, אז כנראה שיש גם VID/PID גנריים לטובת חיבור טורי או משהו בסגנון. מה עושים המייקרים או סטארטאפים שמנסים את צעדיהם הראשונים בתחום של מיקרובקרים? צריכים לחתום חוזים דרקוניים מול ארגוני ענק כמו ה-USB.org? הרכיב שאני רוצה לחבר צריך רק את החיבור הטורי הגנרי, כמו כל שאר הרכיבים שישתמשו באותו ה-VID/PID, אז לא תהיה שום התנגשות ביניהם, כולם ישתמשו באותו הדרייבר.

אז… מסתבר שאין דבר כזה. כל מי שמייצר מוצר שמתחבר דרך ה-USB חייב VID משלו… ויודעים כמה זה עולה? $6000!!! האא… ואם רוצים לשים לוגו של ה-USB על המוצר שלכם, אז זה עולה עוד $3500 לשנתיים.

אני לא הולך להוציא סכום כזה רק כדי לנסות לייצר כרטיס דמוי Arduino… אז מה בכל זאת אפשר לעשות?

תוך כדי כתיבת הפוסט הגעתי לפוסט בנושא זה ב-hackaday.com מ-2013 שמדברים בדיוק על אותה הסוגיה. נראה שהדברים לא השתנו מאז.

כמי שיצא לו לעבוד בעבר מול ארגון סטנדרטים שדומה ל-USB-IF, אני מניח שרוב ההכנסות שלו הם ממכירת VIDs וחברות שמשלמות דמי חבר כדי להשפיע על הסטנדרט העתידי או לתקן את הקיים. ברור שהם צריכים כסף כדי להתקיים, אבל הייתי מצפה לראש קצת יותר פתוח לחובבים ומתחילים, שבסופו של דבר יכולים לגדול ולהכניס להם עוד כסף...

הפתרונות

מה אם נשתמש במספר אקראי ל-VID? מניח שזה מה שרוב היצרנים האלמוניים מסין עושים…

כל עוד הכרטיס לא עוזב את השולחן שלכם ואתם היחידים שמשתמשים בו, כנראה שאף אחד לא ידע על זה בכלל. זיהיתם התנגשות בין משהו אחר במחשב (לא נראה לא שזה יקרה, אבל נגיד…), אפשר לצרוב bootloader עם מספרים אחרים ולהמשיך את החיים כרגיל. זה מה שאנשים עושים בזמן פיתוח. בוחרים איזה שהוא מספר רנדומלי, או משהו מיוחד כמו 0xCAFE, או 0xBEEF וכדומה.

אבל מה יקרה כשתתחילו למכור את הכרטיס שלכם לאחרים? לא יודע מה אתכם, אני ממש לא רוצה לפגוש את עורכי הדין של Arduino, אם השתמשתי ב-VID שלהם וגם לא של כל חברה אחרת. זה סוג של גניבת זהות בסופו של דבר. צריך משהו יותר חוקי.

התחלתי לחרוש את האינטרנט כדי להבין מה אנשים אחרים עושים במצב דומה…

VID שלא בשימוש יותר

יש חברות שסגרו את הפעילות שלהם או נקנו ע"י חברה אחרת, כך שלא היו צריכים יותר את ה-VID על השם הישן שלהם. מספרי ה-VID האלה נחשבים ל"נטושים" (obsoleted).
ארגון ה-USB אפילו מפרסם רשימה עם מספרים כאלה.

יש חובבים שמשתמשים במספרי VID אלה בתקווה שחברה שנסגרה לא תבוא לתבוע אותם על שימוש ב-VID שכבר לא בשימוש…

יכול להיות… לא יודע… אולי זה טוב לפרוייקט סיום באוניברסיטה, אבל לא נשמע לגיטימי למוצר שאמור להימכר.

קניית PID מבעל VID חוקי

היו כמה יזמים שראו שיש דרישה למצבים כמו שלי וראו בזה הזדמנות עסקית לא ראה. הם קנו VID בכמה אלפי דולרים (פעם זה היה עולה פחות מ-$6000), ומכרו PID תחת ה-VID שלהם בתמורה ל-$20-$50. אחלה רווח מבחינתם (מספרי VID ו-PID הם באורך של 16bit, כך שלכל VID יש 65,536 מספרי PID). משהו שנקרא VID sublicensing.

אני בשמחה הייתי משלם $50 כדי לקבל VID/PID חוקי ולגיטימי למוצר שאני רוצה למכור.

רק שארגון ה-USB לא אהב את הרעיון הזה. הרי זה מקטין את כמות האנשים שיאלצו לשלם להם את ה-$6000. עורכי הדין שלהם שלחו כמה מכתבים מאיימים ליזמים אלה וכולם הפסיקו את פעילות ה-sublicensing.

הנה אחד מהיזמים האלה מסביר על המצב.

pid.codes

הנה עוד ניסיון לחלק PIDs תחת VID חוקי, אבל הפעם בחינם, לפרוייקטי Open Source.
לטענת המפעיל של סידור זה, הם קיבלו VID מחברה שהפסיקה את הפעילות שלה, בתקופה שעוד היה אפשר להעביר את הבעלות על ה-VID למישהו אחר (כנראה שאחרי זה סגרו את הפרצה הזו, או כמו שקראתי באיזה שהוא מקום, ארגון ה-USB גובה כמה אלפי דולרים על העברת בעלות).
ראו את ההסברים באתר pid.codes

פרוייקט שאני רוצה לבנות הוא Open Source, כך שהגשתי בקשה לקבל PID מהחבר'ה האלה. הפעולה די פשוטה ומנוהלת דרך Pull Requests ב-GitHub. אחרי כמה ימים של המתנה ראיתי שיש בקשות מלפני כמה חודשים שעדיין לא טופלו, כך שאני מניח שהם לא ממש ממהרים לתפעל את המערכת הזו, אם בכלל.

יצרני השבבים

ליצרני השבבים יש אינטרס שחובבים וחברות קטנות יקנו את השבבים שלהם, יבנו וימכרו כמה שיותר מוצרים. הם כנראה גם מבינים את המחסום של עלות ה-VID למי שרק מתחיל. מאחר שארגון ה-USB לא מוכן לעזור, היצרנים החליטו לספק פתרון בעצמם. נראה שהם הגיעו להסכמה עם ארגון ה-USB שמאפשר להם לחלק PID בחינם למי שמבקש, תחת מגבלות מסוימות. אחת המגבלות היא שאני יכול להשתמש ב-PID שאני מקבל מהיצרן רק אם המוצר שלי משתמש במיקרובקר שלהם (די הגיוני בסופו של דבר). מגבלה נוספת היא שזה מיועד למי שיהיו לו פחות מ-10 אלף מוצרים. מניח שזו מגבלה שהונחתה מארגון ה-USB כדי לדחוף יצרנים גדולים לקנות בסופו של דבר VID משלהם. לא ממש יודע איך מישהו יוכל לבדוק אם מכרתי 10 או 20 אלף כרטיסים שמשתמשים ב-VID/PID מיצרן השבבים, אבל נראה לי שאם אגיע לכמויות כאלה, לא תהיה לי בעיה לשלם את הסכום הזה ל-USB ולקבל VID משלי.

בכרטיס שלי אני משתמש במיקרובקר ATSAMD21G18 של Microchip, אז פניתי אליהם עם הבקשה ל-PID. לפי מה שאני קורא בפורומים השונים, גם יצרנים אחרים, כמו ST, NXP, FTDI, ESP32 ואחרים מציעים שירות דומה ללקוחות שלהם.

ציפיתי שיהיה צורך לחתום על טפסים משפטיים, לשלוח פקסים, לחכות הרבה זמן או משהו בסגנון הזה, אבל להפתעתי התהליך היה הרבה יותר פשוט ומהיר. מילאתי טופס בקשה באתר של Microchip ותוך שניות קיבלתי אימייל אוטומטי עם VID/PID שאני יכול להשתמש בו! אין יותר פשוט מזה.

נראה שעברתי גם את המשוכה הזו. נשאר לקמפל את ה-bootloader משלי ולחכות להגעת הצורב כדי לצרוב אותו על הכרטיס (בתקווה שכל השאר עובד).

באותו הנושא, אנשים מוטרדים מהעובדה ש-VID הוא רק 16 ביט, מה שאומר שיכולים להיות רק כ-65 אלף יצרנים שיזכו לקבל VID משלהם. הסתכלתי על רשימת ה-VIDs שארגון ה-USB מפרסם, נראה שיש בו כרגע 12 אלף רשומות, כך שיש מספיק לכולם בינתיים.


יש לכם הערות או שאלות?
מוזמנים לשאול ולהגיב כתגובה לפוסט זה בפייסבוק. אל תשלחו הודעות פרטיות, זה לא עובד לי משום מה.

הודעות נוספות:

  • בלוג בדרך להרכבת SMT

    בדרך להרכבת SMT

    2024-10-19 17:35:40

    מכירים את המצב שאתם צריכים לעשות משהו ומבינים שאין לכם את הכלים הנכונים?
    למשל לפתוח בורג פיליפס גדול, אבל יש לכם רק מברג שטוח או מברג שענים בצורת פיליפס?

  • בלוג ניסוי הקופים כמשל לתקשורת I2C מתוך ISR

    ניסוי הקופים כמשל לתקשורת I2C מתוך ISR

    2024-08-18 10:55:33

    בימים האחרונים נתקעתי עם הפרוייקט שאני עובד עליו, שהיה לי צורך לתקשר עם רכיב כלשהו דרך ערוץ ה-I2C מתוך פונקציית טיפול בפסיקה (ISR).
    קראתי הרבה פוסטים בפורומים שונים בהם אנשים נתקלו בבעיה דומה, ובכל הפורומים התשובות דומות - אסור לעשות כמעט כלום מתוך ה-ISR, במיוחד לא לתקשר דרך I2C. אפשר להרים דגל, אותו תבדוק אחרי זה בלולאה הרגילה ותעשה את מה שאתה צריך לפי זה...

  • בלוג האם אנחנו מתכנתים נכון עם הארדואינו? - חלק 2

    האם אנחנו מתכנתים נכון עם הארדואינו? - חלק 2

    2024-06-27 14:45:28

    מה יהיה פוסט הזה?
    אספר לכם על מעבר לכרטיס SAMD21 Mini של SparkFun, הגעה ל-22uA במצב שינה, עוד קיטורים על הספריות הקיימות, מטרות הרעיון שמאחורי כל העבודה הזו

  • בלוג ספריית ה-Event Based Framework

    ספריית ה-Event Based Framework

    2024-06-06 15:04:27

    זהו המשך לפוסט הקודם שלי לגבי תוכנית מסגרת (Framework) שתאפשר לכתוב תוכניות ארדואינו בצורה יעילה (והגיונית) יותר, כמו בסביבות Embedded מקצועיות שאני רגיל.

  • בלוג האם אנחנו מתכנתים נכון עם הארדואינו?

    האם אנחנו מתכנתים נכון עם הארדואינו?

    2024-05-27 13:41:19

    שאלה קצת פילוסופית, וכנראה שיהיו הרבה דעות לכל מני כיוונים בנושא זה, אבל יש לי (ולא רק לי כנראה) בעיה עם הצורה בה כולם מתרגלים לכתוב את הקוד לארדואינו.