
å°ãªããšãååã®èªè ãèšäºã®ã¿ã€ãã«ã®å°ãªããšãååã解èªã§ãããšä¿¡ããã:)誰ãç¥ããªãã®ã-ç§ã¯èª¬æããã ç§ã®ããã€ã¹ã¯ãäžåºŠã«2ã€ã®USBæ©èœãå®è£ ããå¿ èŠããããŸãã
- 倧容éèšæ¶è£ 眮 ïŒå¥å倧容éèšæ¶ã¯ã©ã¹-MSC ïŒã ããã€ã¹ã«éåžžã®ãã©ãã·ã¥ãã©ã€ãã®ãµããããŠãSDã«ãŒãã«ããããŒã¿ãå«ããã¡ã€ã«ãæäŸããŠã»ããã
- ãã1ã€ã®æ©èœã¯ä»®æ³COMããŒãã§ã ïŒUSBçšèªã§ã¯ã éä¿¡ããã€ã¹ã¯ã©ã¹-CDCãšãåŒã°ããŸãïŒã ãã®ãã£ãã«ãéããŠãç§ã¯éåžžã®ç«¯æ«ã§èŠãã®ã«äŸ¿å©ãªãããããçš®é¡ã®åæ¹èšå ¥ã®çµè«ãæã£ãŠããŸãã
USBã䜿çšããã»ãšãã©ã®äŸã§ã¯ãUSBãã©ãã·ã¥ãã©ã€ããããŠã¹ãã«ã¹ã¿ã HIDããã€ã¹ããŸãã¯ä»®æ³COMããŒããšãã1çš®é¡ã®ããã€ã¹ã®ã¿ãå®è£ ãããŠããŸãã ããããå°ãªããšã2ã€ã®é¢æ°ãåæã«å®è£ ããæ¹æ³ã®å¥å šãªèª¬æãèŠã€ããããšã¯ããã»ã©ç°¡åã§ã¯ãããŸããã§ããã ç§ã®èšäºã§ã¯ããã®ã®ã£ãããåããããšæããŸãã
STM32ãã€ã¯ãã³ã³ãããŒã©ãŒã«åºã¥ããè€åUSBããã€ã¹ã®äœæã«ã€ããŠèª¬æããŸãããã¢ãããŒãèªäœã¯ä»ã®ãã€ã¯ãã³ã³ãããŒã©ãŒã«ãé©çšã§ããŸãã èšäºã§ã¯ãåã¯ã©ã¹ãåå¥ã«è©³çŽ°ã«åæãããšãšãã«ãè€åããã€ã¹ãæ§ç¯ããåçã«ã€ããŠãåæããŸãã ãããããŸãæåã«ã
ãããè¡ããïŒ
çè«ã®ããã
USBã€ã³ã¿ãŒãã§ãŒã¹ã¯éåžžã«è€éã§ããã«ãã¬ãã«ã§å€é¢çã§ãã æ¥éäžããã°ãå§åãããããšã¯ãããŸããã èšäºã®1ã€ïŒãã ããå¿ããŠããŸããïŒã§ã¯ãããã®èšäºã2åèªãã§ããæã«ããäžåºŠããšããã¹ã¿ã€ã«ã®ãã¬ãŒãºãèŠãŸããã ã¯ãã圌ã¯ãã®ããã§ããããªãã¯ãããæåã«è¡ãããšãã§ããªããªããŸãã å人çã«ãç§ã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯å€ããå°ãªãããæ°ã¶æã®æŽ»çºãªæåãšèªæžã®ä»æ§ã®åŸã«ã®ã¿ã¬ã€ã¢ãŠããããŠããŸãã
ç§ã¯ãŸã USBã®å°é家ã§ã¯ãªãã®ã§ãäœãèµ·ãã£ãŠããã®ãããã詳ãã説æããèšäºãåç §ããããšããå§ãããŸãã ç§ã¯æãéèŠãªå Žæãææãããããã©ã®ããã«æ©èœããããç°¡åã«èª¬æããã ãã§ãã ãŸã第äžã«ã USBã®ç°¡åãªèª¬æ ïŒ ç¿»èš³ ïŒãšUSB Made Simpleããå§ãããŸãïŒèªåã§èªãã§ããŸããããå€ãã®äººããå§ãããŸãïŒã USBããã€ã¹ã®ç¹å®ã®ã¯ã©ã¹ã®ä»æ§ãå¿ èŠã«ãªããŸã ã
ãããããUSBã€ã³ã¿ãŒãã§ãŒã¹ã§æãéèŠãªã®ã¯ãã³ãã«ã§ãã ããæ£ç¢ºã«ã¯ãèšè¿°åããã±ãŒãžã§ãããããŸãã ããã€ã¹ããã¹ã«æ¥ç¶ãããšããã¹ãã¯ããã€ã¹ã®æ©èœã亀æã¬ãŒããããŒãªã³ã°é »åºŠãããã€ã¹ãå®è£ ããã€ã³ã¿ãŒãã§ãŒã¹ãªã©ãèšè¿°ããããã€ã¹èšè¿°åãèŠæ±ããŸãã ãã³ãã«ã¯éèŠã§éåžžã«ããªã±ãŒããªãã®ã§ã-1ãã€ãã®ãã¹ã§ãããã€ã¹ãåäœããªããªããŸãã
ããã€ã¹ã¯ãããŸããŸãªã¿ã€ãã®ããã€ãã®èšè¿°åã䜿çšããŠèªèº«ãèšè¿°ããŸãã
- ããã€ã¹èšè¿°å - ããã€ã¹å
šäœãããã€ã¹ã®ååã補é å
ãã·ãªã¢ã«çªå·ã«ã€ããŠèª¬æããŸãã æååããŒã¿ã¯ãåå¥ã®æååèšè¿°åïŒæååèšè¿°åïŒã«ãã£ãŠèšè¿°ãããŸã
- æ§æèšè¿°å âããã€ã¹ã¯1ã€ä»¥äžã®æ§æãæã€ããšãã§ããŸãã åæ§æã¯ãããã€ã¹ãšã®éä¿¡é床ãã€ã³ã¿ãŒãã§ãŒã¹ã®ã»ãããããã³é»åèšå®ã決å®ããŸãã ãã®ãããããšãã°ãããããªãŒé»æºã§åäœããã©ãããããã¯ãããã€ã¹ã«äœã亀æã¬ãŒãã䜿çšããŠïŒã©ãããããããããªãŒã§ã¯ãªãïŒç¬èªã®é»æºã«åãæ¿ããããã«ããã€ã¹ã«èŠæ±ããïŒæ§æãéžæããïŒå ŽåããããŸãã ãã¡ãããããã¯ããã€ã¹ããã®ãããªæ§æãæäŸããå Žåã«ã®ã¿æ©èœããŸãã
- ã€ã³ã¿ãŒãã§ãŒã¹èšè¿°å -ããã€ã¹ãšã®éä¿¡ã®ã€ã³ã¿ãŒãã§ãŒã¹ãèšè¿°ããŸãã ããã€ãã®ã€ã³ã¿ãŒãã§ãŒã¹ããããŸãã ããšãã°ãããŸããŸãªæ©èœïŒMSCãCDCãHIDïŒãã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŸãã äžéšã®æ©èœïŒCDCãDFUãªã©ïŒã¯ãäœæ¥ã®ããã«äžåºŠã«è€æ°ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããŸãã è€åããã€ã¹ã®å Žåãç°ãªãæ©èœããã®è€æ°ã®ã€ã³ã¿ãŒãã§ãŒã¹ãäžåºŠã«å®è£
ããããããçžäºã«é£æºãããå¿
èŠããããŸãã
- èšè¿°åãšã³ããã€ã³ãïŒãšã³ããã€ã³ãèšè¿°åïŒ -ç¹å®ã®ã€ã³ã¿ãŒãã§ã€ã¹å
ã®éä¿¡ãã£ãã«ã説æãããã±ãããµã€ãºãèšå®ããå²ã蟌ã¿ã®ãã©ã¡ãŒã¿ãŒã説æããŸãã ãšã³ããã€ã³ãã䜿çšããŠãããŒã¿ãéåä¿¡ããŸãã
- ç¹å®ã®ã€ã³ã¿ãŒãã§ãŒã¹ã®åã ã®åŽé¢ã説æããããŸããŸãªèšè¿°åããããããããŸãã
ãã¹ãã¯ãåäžã®ãã€ãã¹ããªãŒã ã§èšè¿°åãèŠæ±ããŸãã èšè¿°åãåãæ§æå ã§ç¹å®ã®é åºã«ãªãããšã¯éåžžã«éèŠã§ããããããªããšããã¹ãã¯ã©ã®èšè¿°åãäœã®ããã«ãããæ··ä¹±ããŸãã åæ§æã¯ãæ§æèšè¿°åãšãã€ã³ã¿ãŒãã§ãŒã¹ãèšè¿°ããèšè¿°åã®ã»ããã§æ§æãããŸãã åã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã€ã³ã¿ãŒãã§ã€ã¹èšè¿°åãšãšã³ããã€ã³ãèšè¿°åã®ã»ããã«ãã£ãŠèšè¿°ãããŸãã åãšã³ãã£ãã£ã¯ããã®èšè¿°åãè¿ãã«éã³ãŸãã
ãŸããUSBã¯ãã¹ãæåã®ãããã³ã«ã§ããããšãç解ããå¿ èŠããããŸãã ããã€ã¹ã®æ§æãåä¿¡ãéä¿¡-USBã®ãã¹ãŠã¯ãã¹ãã«ãã£ãŠå¶åŸ¡ãããŸãã ç§ãã¡ã«ãšã£ãŠãããã¯ãã€ã¯ãã³ã³ãããŒã©ãŒã®åŽé¢ããã®å¶åŸ¡ãããŒããªãããšãæå³ããŸã-ãã¹ãŠã®USBäœæ¥ã¯å²ã蟌ã¿ãšã³ãŒã«ããã¯ã«åºã¥ããŠããŸãã ãŸããããã¯ãé·æéã®æäœãéå§ããããªãããšãæå³ããä»ã®å²ã蟌ã¿ãšçžäºäœçšãããšãã¯ïŒåªå 床ãèæ ®ãããªã©ïŒãéåžžã«æ³šæããå¿ èŠããããŸãã ãã ãããã®ãããªäœã¬ãã«ã«èœã¡ãªãããã«ããŠãã ããã
ãŸãããã¹ãã®æ¹åãé¢æ°ã®ååã§æ瀺ãããŸãã USBã®çšèªã§ã¯ããã¹ãããããã€ã¹ãžã®æ¹åã¯OUTãšåŒã°ããŸãããã³ã³ãããŒã©ãŒã®å Žåãããã¯ææ³ã§ãã éã«ãããã€ã¹ãããã¹ããžã®æ¹åã¯INãšåŒã°ããŸãããç§ãã¡ã«ãšã£ãŠããã¯ããŒã¿ã®éä¿¡ãæå³ããŸãã ãããã£ãŠããã€ã¯ãã³ã³ãããŒã©ãŒã§ã¯ãDataOutïŒïŒé¢æ°ãå®éã«ããŒã¿ãåä¿¡ããDataInïŒïŒãããŒã¿ãéä¿¡ããŸãã ããããããã¯ããã§ãããšããã§-æ¢è£œã®ã³ãŒãã䜿çšããŸãã
CDC-ä»®æ³COMããŒã
ããããè€åããã€ã¹å šäœãåãåºããŠããã«ãã£ã¹ãããŠãæ©èœããŸãã-ãã¥ã¢ã³ã¹ãšèœãšãç©Žãå€ãããŸãã åã€ã³ã¿ãŒãã§ã€ã¹ãåå¥ã«ãããã°ããŠãããè€åããã€ã¹ã«ç§»è¡ããæ¹ãè¯ããšæããŸãã ç§ã¯CDCããå§ããŸã äŸåé¢ä¿ã¯å¿ èŠãããŸããã
ç§ã¯æè¿STM32ãã¥ãŒãã«ç§»åããŸãã-STM32çšã®äœã¬ãã«ãã©ã€ããŒã®ããã±ãŒãžã§ãã ç¹å®ã®ã¯ã©ã¹ã®USBããã€ã¹ãå®è£ ããUSB管çã³ãŒããå«ãŸããŠããŸãã USBã³ã¢ãšCDCã®ãã³ãã¬ãŒãå®è£ ã䜿çšããŠãèªåã§éžåŒããéå§ããŸãã ãã©ã³ã¯ã¯ã\ Middlewares \ ST \ STM32_USB_Device_Libraryãã£ã¬ã¯ããªãŒã«ãããŸãã STM32F1ã·ãªãŒãºã³ã³ãããŒã©ãŒã«ã¯Cubeã䜿çšããCubeããŒãžã§ã³1.6ïŒ2017幎4æïŒããã³ãã«ãããUSBã©ã€ãã©ãªããŒãžã§ã³2.4.2ïŒ2015幎12æïŒ
ã©ã€ãã©ãªã®ãã³ãã¬ãŒãå®è£ ã«ã¯ããã³ãã¬ãŒããšåŒã°ãããã¡ã€ã«ã«ç¬èªã®ã³ãŒããèšè¿°ããããšãå«ãŸããŸãã ã©ã€ãã©ãªå šäœãšUSBã®åçãç解ããªããšããããè¡ãã®ã¯å°é£ã§ãã ããããç°¡åã«ãªããŸã-CubeMXã°ã©ãã£ã«ã«ã³ã³ãã£ã®ã¥ã¬ãŒã¿ã䜿çšããŠãããã®ãã¡ã€ã«ãçæããŸã ã
CubeMXãæäŸããå®è£ ã¯ãããã«äœ¿çšã§ããç¶æ ã§ãã ã³ãŒããæžãå¿ èŠããªãã£ãã®ã¯å°ãæ®å¿µã§ãã å®å šã«å®æããå®è£ ã®äŸã䜿çšããŠãCDCãç 究ããå¿ èŠããããŸãã çæãããã³ãŒãã®äžã§æãèå³æ·±ãå ŽæãèŠãŠã¿ãŸãããã
æåã«ãusbd_desc.cïŒããã€ã¹èšè¿°åïŒããã³usbd_cdc.cïŒæ§æèšè¿°åãã€ã³ã¿ãŒãã§ãŒã¹ããšã³ããã€ã³ãïŒãã¡ã€ã«ã«ããèšè¿°åã調ã¹ãŸãã äžèšã§èšãã°usb ïŒ ãã·ã¢èª ïŒã«ã¯ããã¹ãŠã®èšè¿°åã®éåžžã«è©³çŽ°ãªèª¬æããããŸãã åãã£ãŒã«ããåå¥ã«èª¬æããã®ã§ã¯ãªããæãéèŠã§èå³æ·±ããã£ãŒã«ãã®ã¿ã«çŠç¹ãåœãŠãŸãã
ããã€ã¹èšè¿°å
#define USBD_VID 1155 #define USBD_LANGID_STRING 1033 #define USBD_MANUFACTURER_STRING "STMicroelectronics" #define USBD_PID_FS 22336 #define USBD_PRODUCT_STRING_FS "STM32 Virtual ComPort" #define USBD_SERIALNUMBER_STRING_FS "00000000001A" #define USBD_CONFIGURATION_STRING_FS "CDC Config" #define USBD_INTERFACE_STRING_FS "CDC Interface" #define USBD_MAX_NUM_CONFIGURATION 1 /* USB Standard Device Descriptor */ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { 0x12, /*bLength */ USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ 0x00, /* bcdUSB */ 0x02, 0x02, /*bDeviceClass*/ 0x02, /*bDeviceSubClass*/ 0x00, /*bDeviceProtocol*/ USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ LOBYTE(USBD_VID), /*idVendor*/ HIBYTE(USBD_VID), /*idVendor*/ LOBYTE(USBD_PID_FS), /*idVendor*/ HIBYTE(USBD_PID_FS), /*idVendor*/ 0x00, /*bcdDevice rel. 2.00*/ 0x02, USBD_IDX_MFC_STR, /*Index of manufacturer string*/ USBD_IDX_PRODUCT_STR, /*Index of product string*/ USBD_IDX_SERIAL_STR, /*Index of serial number string*/ USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ } ; /* USB_DeviceDescriptor */
ããã§ã¯ã次ã®ãã£ãŒã«ãã«èå³ããããŸãã
- bDeviceClassãbDeviceSubClassãbDeviceProtocol-ãã¹ãã«ã©ã®ãããªçš®é¡ã®ããã€ã¹ããããäœãã§ããã®ããã©ã®ãã©ã€ããŒãããŒãããã®ãããã¹ãã«èª¬æããŸãã ãã®å Žåãããã€ã¹ã¯Communication Device Classãå®è£
ããŠãããšèšããŸããã€ãŸãããã¹ãã¯ä»®æ³COMããŒããäœæãããã®ããã€ã¹ã«æ¥ç¶ããå¿
èŠããããŸãã
- PIDïŒè£œåIDïŒããã³VIDïŒãã³ããŒIDïŒ-ãããã®ãã£ãŒã«ãã§ã¯ããã¹ãã¯ã·ã¹ãã ã«æ¥ç¶ãããŠããããŸããŸãªããã€ã¹ãåºå¥ããŸãã åæã«ããã€ã¹ã¯åãã¯ã©ã¹ãå®è£ ããŸãã 圌ãã¯ãåžå Žã§è²©å£²ãããŠããããã€ã¹ã®å Žåãäžæã®VID / PIDãæã€ããšãéåžžã«éèŠã§ãããšèšããŸããããããã®IDã誰ãšã©ãã§æäŸãããã®ãã¯ããããŸããã§ããã åäžã³ããŒã®ããŒã ããã€ã¹ã®å Žåãããã©ã«ãå€ã§ååã§ãã
æååå®æ°ïŒããã€ã¹åãã·ãªã¢ã«çªå·ïŒã¯èšè¿°åèªäœã«ã¯æžã蟌ãŸããªãããšã«æ³šæããŠãã ããã è¡ã¯åå¥ã®èšè¿°åã§èšè¿°ãããæ®ãã¯ãã¹ãŠè¡ã®ã€ã³ããã¯ã¹ã®ã¿ã瀺ããŸãã STã®ã©ã€ãã©ãªã®å Žåãæååèšè¿°åã¯ãªã³ã¶ãã©ã€ïŒgrrrrrrïŒã§çæãããããã説æããŸããã
æ§æèšè¿°å
__ALIGN_BEGIN const uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = { /*Configuration Descriptor*/ 0x09, /* bLength: Configuration Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ 0x00, 0x02, /* bNumInterfaces: 2 interface */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ 0xC0, /* bmAttributes: self powered */ 0x32, /* MaxPower 100 mA */
ããã§ã¯ã次ã®ããšã«èå³ããããŸãã
- wTotalLength-ãã®æ§æã®èšè¿°åããã±ãŒãžå
šäœã®ãµã€ãº-ãã¹ãã¯ããã®æ§æãã©ãã§çµäºããŠæ¬¡ã®æ§æãå§ãŸãããç¥ãããšãã§ããŸãã è€åããã€ã¹ãäœæãããšãã«ä¿®æ£ããå¿
èŠããããŸãã ãã®æ§æã®ãã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãœãªãããããã¯ã§ããå¿
èŠããããå€wTotalLengthããã®ãããã¯ã®é·ãã決å®ããããšãæãåºãããŠãã ããã
- bNumInterfacesïŒéä¿¡ããã€ã¹ã¯ã©ã¹ã¯ã2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠå®è£
ãããŸãã 1ã€ã¯ç®¡ççšããã1ã€ã¯éä¿¡ãããå®éã®ããŒã¿çšã§ãã
- bmAttributesãšMaxPowerã¯ãããã€ã¹ãç¬èªã®é»æºãæã£ãŠããããåæã«USBããŒãããæ倧100 mAãæ¶è²»ãããããšã瀺ããŠããŸãã ãããã®ãã©ã¡ãŒã¿ãŒã¯ãå°æ¥çã«æããã«åçããå¿ èŠããããŸãã
次ã«ãæåã®CDCã€ã³ã¿ãŒãã§ã€ã¹ãžã®ãã³ãã«ãæ¥ãŸãã ãã®ã¯ã©ã¹ã®ããã€ã¹ã¯ãããã€ãã®ç°ãªãéä¿¡ã¢ãã«ïŒé»è©±ãçŽæ¥æ¥ç¶ãå€åœéæ¥ç¶ïŒãå®è£ ã§ããŸããããã®å Žåã¯æœè±¡å¶åŸ¡ã¢ãã«ã«ãªããŸãã
CDC管çã€ã³ã¿ãŒãã§ã€ã¹ãã³ãã«
/*Interface Descriptor */ 0x09, /* bLength: Interface Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ /* Interface descriptor type */ 0x00, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x01, /* bNumEndpoints: One endpoints used */ 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x01, /* bInterfaceProtocol: Common AT commands */ 0x00, /* iInterface: */
ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã«ã¯ã1ã€ã®ãšã³ããã€ã³ãïŒbNumEndpointsïŒã®ã¿ãååšããŸãã ããããæåã«äžé£ã®æ©èœèšè¿°å-ãã®ã¯ã©ã¹ã®ããã€ã¹ã«åºæã®èšå®ããããŸãã
æ©èœèšè¿°å
/*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x00, /* bDescriptorSubtype: Header Func Desc */ 0x10, /* bcdCDC: spec release number */ 0x01, /*Call Management Functional Descriptor*/ 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x01, /* bDescriptorSubtype: Call Management Func Desc */ 0x00, /* bmCapabilities: D0+D1 */ 0x01, /* bDataInterface: 1 */ /*ACM Functional Descriptor*/ 0x04, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ 0x02, /* bmCapabilities */ /*Union Functional Descriptor*/ 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x06, /* bDescriptorSubtype: Union func desc */ 0x00, /* bMasterInterface: Communication class interface */ 0x01, /* bSlaveInterface0: Data Class Interface */
ç§ãã¡ã®ããã€ã¹ã¯ïŒé»è©±ãããããšããæå³ã§ïŒãåŒã³åºããã®æŠå¿µãç¥ããªãããåæã«ã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãŒïŒé床ãã¹ãããããããDTR / CTSãããïŒãç解ããŠãããšèšããŸãã æåŸã®èšè¿°åã¯ã2ã€ã®CDCã€ã³ã¿ãŒãã§ãŒã¹ã®ã©ã¡ããã³ã³ãããŒã«ã§ããããããã³ããŒã¿ãå®è¡ãããå Žæãèšè¿°ããŸãã äžè¬ã«ãããã§ã¯äœã«ãèå³ããªããäœãå€æŽããŸããã
æåŸã«ãå¶åŸ¡ã€ã³ã¿ãŒãã§ãŒã¹ã®ãšã³ããã€ã³ãèšè¿°å
/*Endpoint 2 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_CMD_PACKET_SIZE), 0x10, /* bInterval: */
ãã®ãšã³ããã€ã³ãã¯å²ã蟌ã¿ã«äœ¿çšããããšæžãããŠããŸãã ãã¹ãã¯ã0x10ïŒ16ïŒmsããšã«ããã€ã¹ãããŒãªã³ã°ããããã€ã¹ã«æ³šæãå¿ èŠãã©ãããå°ããŸãã ãŸããå¶åŸ¡ããŒã ã¯ãã®ãšã³ããã€ã³ããéãæããŸãã
2çªç®ã®ã€ã³ã¿ãŒãã§ãŒã¹ïŒããŒã¿ãå®è¡ãããïŒã®èª¬æã¯ããåçŽã«ãªããŸãã
CDCããŒã¿ã€ã³ã¿ãŒãã§ã€ã¹ãšãã®ãšã³ããã€ã³ã
/*Data class interface descriptor*/ 0x09, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ 0x01, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ 0x00, /* bInterfaceSubClass: */ 0x00, /* bInterfaceProtocol: */ 0x00, /* iInterface: */ /*Endpoint OUT Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ /*Endpoint IN Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_IN_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00 /* bInterval: ignore for Bulk transfer */
ãã«ã¯ã¿ã€ãã®2ã€ã®ãšã³ããã€ã³ããã€ã³ã¿ãŒãã§ã€ã¹ã«ååšããŸãã1ã€ã¯åä¿¡çšããã1ã€ã¯éä¿¡çšã§ãã å®éãUSBã®çšèªã§ã¯ãããã¯1ã€ã®ãšã³ããã€ã³ãã§ãããåæ¹åã§ãã
èªåã§å®å šã«ç解ããŠããªããšããçç±ã ãã§ïŒããšãã°ããã¹ããããã€ã¹ããååŸããå¿ èŠã®ããããŒã¿ã®éãã©ã®ããã«ç¥ã£ãŠããããªã©ïŒããã¹ãŠã®ä»çµã¿ã説æããŸããã æãéèŠãªããšã¯ãã©ã€ãã©ãªããã¹ãŠãå®è£ ããŠããããšã§ãã ã¢ãŒããã¯ãã£ãããèŠãŠã¿ãŸãããã
STã®USBã©ã€ãã©ãªã¯éåžžã«éå±€åãããŠããŸãã ãã®ãããªå»ºç¯ã¬ãã«ã匷調ããŸã
- ã¯ã©ã¹ãã©ã€ã㌠ïŒCDCã®å Žåããããã¯usbd_cdcããã³usbd_cdc_ifãã¡ã€ã«ã§ãïŒïŒããã€ã¹ã®ç¹å®ã®ã¯ã©ã¹ã®ããžãã¯ãå®è£
ããŸã-ä»®æ³COMããŒãã®CDCãããŒã¿ã¹ãã¬ãŒãžããã€ã¹ã®MSCãããŒããŒã/ããŠã¹ã®HIDãããã³ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãåããç¹å®ã®ããã€ã¹ã
- USBã³ã¢ ïŒusbd_core.cãusbd_ctlreq.cãusbd_ioreq.cïŒïŒUSBããã€ã¹ã®ãã¹ãŠã®ã¯ã©ã¹ã®åäœã®äžè¬çãªããžãã¯ãå®è£
ããèŠæ±ãããèšè¿°åããã¹ãã«éä¿¡ãããã¹ãããã®èŠæ±ãåŠçããUSBããã€ã¹å
šäœãæ§æããŸãã ãŸããããŒã¿ã¹ããªãŒã ãã¯ã©ã¹ãã©ã€ããŒã¬ãã«ããäžäœã¬ãã«ã«ããŸãã¯ãã®éã«ãªãã€ã¬ã¯ãããŸãã
- USB HWãã©ã€ã㌠ïŒusbd_conf.cïŒïŒäžã«ããã¬ã€ã€ãŒã¯ãã©ãããã©ãŒã ã«äŸåãããããã€ãã®ãã€ã¯ãã³ã³ãããŒã©ãŒã·ãªãŒãºã§åãããã«æ©èœããŸãã ã³ãŒãã«ã¯ãç¹å®ã®ãã€ã¯ãã³ã³ãããŒã©ãŒçšã®äœã¬ãã«é¢æ°åŒã³åºãã¯ãããŸããã usbd_conf.cãã¡ã€ã«ã¯ãUSBã³ã¢ãšãéžæãããã€ã¯ãã³ã³ãããŒã©ãŒçšã®äœã¬ãã«ãã©ã€ããŒã®ã©ã€ãã©ãªã§ããHALã®éã®ã¬ã€ã€ãŒãå®è£
ããŸãã åºæ¬çã«ãåŒã³åºããäžããäžã«ãªãã€ã¬ã¯ãããã³ãŒã«ããã¯ãäžããäžã«ãªãã€ã¬ã¯ãããåçŽãªã©ãããŒããããŸãã
- HAL ïŒstm32f1xx_hal_pcd.cãstm32f1xx_ll_usb.cïŒïŒãã€ã¯ãã³ã³ãããŒã©ãŒããŒããŠã§ã¢ãšã®éä¿¡ã«åŸäºããã¬ãžã¹ã¿ãŒã§åäœããå²ã蟌ã¿ã«å¿çããŸãã
ãã®æ®µéã§ã¯ãæäžäœå±€ãšusbd_conf.cã®1ã€ã®é¢æ°ã®ã¿ã«é¢å¿ããããŸãã æåŸã®ãã®ããå§ããŸãããïŒ
USBD_LL_InitïŒïŒé¢æ°
/** * @brief Initializes the Low Level portion of the Device driver. * @param pdev: Device handle * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) { /* Init USB_IP */ /* Link The driver to the stack */ hpcd_USB_FS.pData = pdev; pdev->pData = &hpcd_USB_FS; hpcd_USB_FS.Instance = USB; hpcd_USB_FS.Init.dev_endpoints = 8; hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; hpcd_USB_FS.Init.ep0_mps = DEP0CTL_MPS_8; hpcd_USB_FS.Init.low_power_enable = DISABLE; hpcd_USB_FS.Init.lpm_enable = DISABLE; hpcd_USB_FS.Init.battery_charging_enable = DISABLE; if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK) { Error_Handler(); } HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0xC0); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x01 , PCD_SNG_BUF, 0x110); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82 , PCD_SNG_BUF, 0x100); return USBD_OK; }
ãã®é¢æ°ã¯ããã€ã¯ãã³ã³ãããŒã©ãŒã®USBåšèŸºæ©åšãåæåããŸãã æãèå³æ·±ãã®ã¯ãHAL_PCDEx_PMAConfigïŒïŒé¢æ°ã®äžé£ã®åŒã³åºãã§ãã å®éã«ã¯ããã€ã¯ãã³ã³ãããŒã©ã®ããŒãäžã«ã¯ãUSBãããã¡å°çšã«å²ãåœãŠããã512ãã€ãã®ã¡ã¢ãªå šäœããããŸãïŒãã®ã¡ã¢ãªã¯PMA-ãã±ããã¡ã¢ãªé åãšåŒã°ããŸãïŒã ãã ããããã€ã¹ã¯ãšã³ããã€ã³ãã®æ°ãšãã©ã¡ãŒã¿ãŒãäºåã«ç¥ããªãããããã®ã¡ã¢ãªã¯å²ãåœãŠãããŸããã ãããã£ãŠãUSBã¡ã¢ãªã䜿çšããåã«ãéžæãããã©ã¡ãŒã¿ãŒã«åŸã£ãŠå²ãåœãŠãå¿ èŠããããŸãã
ããããå¥åŠãªããšã«ã2ã€ã®ãšã³ããã€ã³ãã ããã¢ããŠã³ã¹ãããã³ãŒã«ã¯5ã§ããã å®éãäžèŠãªãã®ã¯ãããŸããã å®éãåUSBããã€ã¹ã«ã¯ãããã€ã¹ãåæåããŠããå¶åŸ¡ããããã®1ã€ã®åæ¹åãšã³ããã€ã³ããå¿ èŠã§ãã ãã®ãšã³ããã€ã³ãã«ã¯åžžã«0ã®çªå·ãä»ããããŸãããã®é¢æ°ã¯ãšã³ããã€ã³ããåæåããŸãããããããã¡ãŒãåæåããŸãã ãŒããšã³ããã€ã³ãã®å Žåã2ã€ã®ãããã¡ãäœæãããŸã-åä¿¡çšã®0x00ãšéä¿¡çšã®0x80ïŒæäžäœãããã¯éä¿¡ã®æ¹åã瀺ããæäžäœãããã¯ãšã³ããã€ã³ãã®çªå·ã瀺ããŸãïŒã æ®ãã®3ã€ã®åŒã³åºãã¯ããšã³ããã€ã³ã1ïŒããŒã¿ã®åä¿¡ãšéä¿¡ïŒãšãšã³ããã€ã³ã2ïŒã³ãã³ãã®åä¿¡ãšã¹ããŒã¿ã¹ã®éä¿¡-ããã¯åæçã«è¡ãããããããããã¡ãŒã¯1ã€ã ãã§ãïŒã®ãããã¡ãŒãèšè¿°ããŸã
ååŒã³åºãã®æåŸã®ãã©ã¡ãŒã¿ãŒã¯ãå ±æãããã¡ãŒå ã®ãšã³ããã€ã³ããããã¡ãŒã®ãªãã»ããã瀺ããŸãã ãã©ãŒã©ã ã§ãããã®éæ³ã®å®æ°0x18ïŒæåã®ãããã¡ãŒã®éå§ã¢ãã¬ã¹ïŒãšã¯äœã§ããïŒããšãã質åãèŠãŸããã ãã®åé¡ã«ã€ããŠã¯åŸã§è©³ããæ€èšããŸãã PMAã¡ã¢ãªã®æåã®0x18ãã€ãããããã¡å²ãåœãŠããŒãã«ã«ãã£ãŠå æãããŠãããšã ãèšããŸãã
ãããããããã¯ãã¹ãŠå èãšãã®ä»ã®å èã§ãã ãããŠãå€ã«ã¯äœããããŸããïŒ
ãŠãŒã¶ãŒã³ãŒãã¯ãusbd_cdc_if.cãã¡ã€ã«ã«ããåä¿¡ããã³éä¿¡é¢æ°ã§åäœããŸãã ããã€ã¹ããã¹ãã«åããä»®æ³COMããŒãã«ããŒã¿ãéä¿¡ã§ããããã«ãé¢æ°CDC_Transmit_FSïŒïŒãæäŸãããŸãã
é¢æ°CDC_Transmit_FSïŒïŒ
/** * @brief CDC_Transmit_FS * Data send over USB IN endpoint are sent over CDC interface * through this function. * @note * * * @param Buf: Buffer of data to be send * @param Len: Number of data to be send (in bytes) * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY */ uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) { uint8_t result = USBD_OK; USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData; if (hcdc->TxState != 0){ return USBD_BUSY; } USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len); result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); return result; }
åä¿¡ã¯ããå°ãè€éã§ããããŒã¿ãåä¿¡ãããšãUSBã³ã¢ã¯CDC_Receive_FSïŒïŒé¢æ°ããã«ããŸãã ãã®é¢æ°ã§ã¯ãåä¿¡ããããŒã¿ãåŠçããç¬èªã®ã³ãŒããè¿œå ããå¿ èŠããããŸãã ãŸãã¯ã次ã®ããã«ãåŠçãåŠçããã³ãŒã«ããã¯ãåŒã³åºããŸãã
é¢æ°CDC_Receive_FSïŒïŒ
/** * @brief CDC_Receive_FS * Data received over USB OUT endpoint are sent over CDC interface * through this function. * * @note * This function will block any OUT packet reception on USB endpoint * untill exiting this function. If you exit this function before transfer * is complete on CDC interface (ie. using DMA controller) it will result * in receiving more data while previous ones are still not sent. * * @param Buf: Buffer of data to be received * @param Len: Number of data received (in bytes) * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL */ static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len) { uint16_t len = *Len; CDCDataReceivedCallback(Buf, len); // Prepare for next reception USBD_CDC_ReceivePacket(&hUsbDeviceFS); return (USBD_OK); }
ãããã®é¢æ°ã¯ãæ§é ã®ãªããã€ãé åã§æ©èœããããšã«æ³šæããŠãã ããã ç§ã®å Žåãæååãéä¿¡ããå¿ èŠããããŸããã ããã䟿å©ã«ããããã«ãæååããã©ãŒãããããŠããŒãã«éä¿¡ããprintfé¢æ°ã®é¡äŒŒç©ãäœæããŸããã é床ãäžããããã«ãããã«ãããã¡ãªã³ã°ã«ãå°æããŸããã 詳现ã«ã€ããŠã¯ããUSBã®ããã«ãããã¡ãªã³ã°ãããã³ãprintfãã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
åããã¡ã€ã«ã«ã¯ãä»®æ³COMããŒãã®åæå/éåæåæ©èœãããã³ããŒããã©ã¡ãŒã¿ãŒïŒé床ãããªãã£ãã¹ãããããããªã©ïŒãå€æŽããæ©èœãå«ãŸããŠããŸãã ããã©ã«ãã®å®è£ ã§ã¯é床ãå¶éããããç§ã«é©ããŠããŸãã åæåãåæ§ã«è¯å¥œã§ãã ãã®ãŸãŸã«ããŠãããŸãã
æçµçãªããŒã³ãŒãã¯ããã¹ãŠãå®è¡ããã³ãŒãã§ãã
ãã¹ãŠãå®è¡ããã³ãŒã
USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS); USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC); USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS); USBD_Start(&hUsbDeviceFS);
ããã§ãç°ãªããã©ã€ãã¬ãã«ãåæåãããŸãã æåŸã®ã³ãã³ãã«ã¯USBå²ã蟌ã¿ãå«ãŸããŸãã USBã§ã®ãã¹ãŠã®äœæ¥ã¯ããã¹ãããã®èŠæ±ã«å¿ããŠè¡ãããããšãç解ããããšãéèŠã§ãã ãã®å Žåããã©ã€ããŒå éšã§å²ã蟌ã¿ãåŒã³åºããããã©ã€ããŒèªäœããªã¯ãšã¹ããåŠçããããã³ãŒã«ããã¯ãä»ããŠå¥ã®ã³ãŒãã«å§ä»»ããŸãã
ãããæ©èœããã«ã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ãã©ã€ããŒãå¿ èŠã§ãã ååãšããŠãããã¯æšæºãã©ã€ããŒã§ãããã·ã¹ãã ã¯ç¹å¥ãªã€ã³ã¹ããŒã«æé ãªãã§ããã€ã¹ãååŸã§ããŸãã ç§ã®ç¥ãéããSTMã®ä»®æ³COMããŒããã©ã€ã㌠ïŒST Flash Utilityã§æäŸïŒã¯æ¢ã«ã·ã¹ãã ã«ã€ã³ã¹ããŒã«ãããŠãããããã€ã¹ã¯ããèªäœã§ããã¯ã¢ãããããŠããŸãã Linuxã§ãããã¹ãŠãããŒãããã¯ã§å§ãŸããŸããã
MSC-ã¹ãã¬ãŒãžããã€ã¹
CDCãã©ã€ããŒã䜿çšãããšããã¹ãŠãç°¡åã«ãªããŸãããååãšããŠãããã€ã¹èªäœãããŒã¿ã®æçµæ¶è²»è ïŒããšãã°ããã¹ãããã³ãã³ããåä¿¡ïŒãŸãã¯ãžã§ãã¬ãŒã¿ãŒïŒããšãã°ãã»ã³ãµãŒèªã¿åãå€ããã¹ãã«éä¿¡ïŒã§ãã
倧容éèšæ¶ã¯ã©ã¹ã¯ããå°ãè€éã«ãªããŸãã MSCãã©ã€ããŒã¯ãäžæ¹ã§ã¯ãã¹ããšUSBãã¹ãããäžæ¹ã§ã¯ã¹ãã¬ãŒãžããã€ã¹ã®éã®åãªãã¬ã€ã€ãŒã§ãã SDIOãSPIãã©ãã·ã¥ãRAMãã©ã€ãããã£ã¹ã¯ãã©ã€ãããŸãã¯ãããã¯ãŒã¯ãã©ã€ããä»ããŠæ¥ç¶ãããSDã«ãŒãã䜿çšã§ããŸãã äžè¬ã«ãã»ãšãã©ã®å Žåãã¹ãã¬ãŒãžããã€ã¹ã¯ç¹å®ã®ãã©ã€ããŒïŒéåžžã¯éèŠã§ã¯ãªãïŒã§è¡šãããMSCã®å®è£ ãšãããã³ã°ããå¿ èŠããããŸãã
ç§ã®ããã€ã¹ã¯ãSPIã§æ¥ç¶ãããSDã«ãŒãã䜿çšããŠããŸãã ãã®ãããäžã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããã«ã¯ã SdFatã©ã€ãã©ãªã䜿çšããŸãã ãŸããããã€ãã®æœè±¡åã¬ãã«ã«åããããŸãã
- ãŠãŒã¶ãŒã«ã¯Fileã¯ã©ã¹ãæäŸãããŸãããã®ã¯ã©ã¹ã䜿çšããŠããã¡ã€ã«ã®äœæ/ãªãŒãã³ãããŒã¿ã®èªã¿åãããã³æžã蟌ã¿ãè¡ãããšãã§ããŸãã ã¯ã©ã€ã¢ã³ãã³ãŒãã¯ãèšæ¶åªäœãšã®ããåãããã¡ã€ã«ã·ã¹ãã ã®åŸ®åŠãªéãã«ãã£ãŠå¢å€§ããããšã¯ãããŸããã
- Volumeã¯ã©ã¹ã¯ããã¡ã€ã«ã·ã¹ãã ããã£ã¬ã¯ããªãã¯ã©ã¹ã¿ãŒãFATãªã©ãåŠçããããã®ãããã³å
šäœãåŠçããŸãã ããŒã¿ãã£ãªã¢ãšã®éä¿¡ã¯äžäœã¬ãã«ã«å§ä»»ãããŸãã
- SDã«ãŒããã©ã€ããŒ-ãã®ã³ã³ããŒãã³ãã¯ãã«ãŒããšã®éä¿¡æ¹æ³ãéä¿¡ããã³ãã³ããããã³å¿çãèãã³ãã³ããèªèããŠããŸãã ãã®ã©ã€ãã©ãªã¯ãSPIããã³SDIOãä»ããŠæ¥ç¶ãããã«ãŒãçšã«ããã€ãã®ã¿ã€ãã®ãã©ã€ããŒãæäŸããŸãã çè«çã«ã¯ãããšãã°RAMãã£ã¹ã¯ã®ä»£ããã«ãã©ã€ããŒã䜿çšã§ããŸãã
- ãã®äžã«ããã¬ã€ã€ãŒã¯ã¯ãã¹ãã©ãããã©ãŒã ã§ãããããŒã¿ãã«ãŒãã«ã©ã®ããã«æ£ç¢ºã«æžã蟌ãŸãããããŸãã¯ããããèªã¿åããããã«ã€ããŠã¯äœãç¥ããŸããã ããã«ãããç°ãªããã©ãããã©ãŒã ïŒArduinoãšãã®ä»ã®äž¡æ¹ïŒã®ã©ã€ãã©ãªãæ§ç¯ã§ããŸãã ç¹å®ã®ãã©ãããã©ãŒã ãŸãã¯ãã€ã¯ãã³ã³ãããŒã©ãŒçšã«ãå¿
èŠãªã€ã³ã¿ãŒãã§ãŒã¹ãä»ããããŒã¿è»¢éãå®è£
ãããã©ã€ããŒãäœæã§ããŸãã ããã©ã«ãã§ã¯ãã©ã€ãã©ãªã¯ä»¥äžãå«ãããã€ãã®ãã©ã€ããŒãæäŸããŸã Arduino SPIåãã§ãããæ··ä¹±ããHALã«åºã¥ããDMAäŒéãä»ããŠ
ã奜ã¿ãšè©©äººã§ãã©ã€ããŒãæžããŸããã
- æåŸã«ãHALã¯ç¹å®ã®ãã€ã¯ãã³ã³ãããŒã©ãŒã®ã¬ãžã¹ã¿ãŒã§ã®äœæ¥ãæäŸããŸã
USB倧容éã¹ãã¬ãŒãžã®å ŽåãUSBãã©ãã·ã¥ãã©ã€ãäžã®ãã¡ã€ã«ãæäœããŸããããã¹ãããã¡ã€ã«ã·ã¹ãã ã®è§£éã«é¢ãããã¹ãŠã®äœæ¥ãè¡ããŸãã ããã€ã¹ã¯ãç¹å®ã®ããŒã¿ãããã¯ã®èªã¿åããŸãã¯æžã蟌ã¿èŠæ±ãåãåããŸãã ãããã£ãŠãããããã©ã€ããŒä»¥äžã®ã¬ãã«ã«èå³ããããŸãã
MSCã®å®è£ ã«ã¯ãã¹ãã¢ããã®ç¹å®ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå¿ èŠã§ããèªã¿åããšæžã蟌ã¿ãå¯èœã§ããµã€ãºãšã¹ããŒã¿ã¹ãæäŸããããã§ãã SdFatã©ã€ãã©ãªã®SDã«ãŒããã©ã€ããŒã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ãŠãã»ãŒåãæ©èœãæäŸãããŸãã ããã€ã³ã¿ãŒãã§ãŒã¹ãå¥ã®ã€ã³ã¿ãŒãã§ãŒã¹ã«å°ãã¢ããã¿ãŒãæžãããšã ããæ®ã£ãŠããŸãã
移åã®æ¹åã決ããŸããã å®è£ ã«åãââçµã¿ãŸãããã ç§ã¯åã³CubeMXã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒã䜿çšããUSBã³ã³ããŒãã³ãã«å¿ èŠãªãã¡ã€ã«ãçæããŸããã ãã¡ãããèšè¿°åããç 究ãéå§ããŸãã
ããã€ã¹èšè¿°å
* USB Standard Device Descriptor */ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { 0x12, /*bLength */ USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ 0x00, /* bcdUSB */ 0x02, 0x00, /*bDeviceClass*/ 0x00, /*bDeviceSubClass*/ 0x00, /*bDeviceProtocol*/ USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ LOBYTE(USBD_VID), /*idVendor*/ HIBYTE(USBD_VID), /*idVendor*/ LOBYTE(USBD_PID_FS), /*idVendor*/ HIBYTE(USBD_PID_FS), /*idVendor*/ 0x00, /*bcdDevice rel. 2.00*/ 0x02, USBD_IDX_MFC_STR, /*Index of manufacturer string*/ USBD_IDX_PRODUCT_STR, /*Index of product string*/ USBD_IDX_SERIAL_STR, /*Index of serial number string*/ USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ } ; /* USB_DeviceDescriptor */
ããã€ã¹èšè¿°åã¯ããŸãå€æŽãããŠããŸããã å¯äžã®éãã¯ãããã€ã¹ã¯ã©ã¹ãå®çŸ©ãããã£ãŒã«ãã«ãããŸããçŸåšãããã€ã¹ã¯ã©ã¹å šäœã¯å®çŸ©ãããŠããŸããïŒbDeviceClassã®ãŒãïŒããã€ã³ã¿ãŒãã§ã€ã¹ã¬ãã«ã§èšå®ãããŸãïŒããã¯ä»æ§èŠä»¶ã§ãïŒã
æ§æèšè¿°å
0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_MSC_CONFIG_DESC_SIZ, 0x00, 0x01, /* bNumInterfaces: 1 interface */ 0x01, /* bConfigurationValue: */ 0x04, /* iConfiguration: */ 0xC0, /* bmAttributes: */ 0x32, /* MaxPower 100 mA */
CDCã®é¡äŒŒã®èšè¿°åãšéåžžã«é¡äŒŒ-ã€ã³ã¿ãŒãã§ã€ã¹ã®æ°ïŒ1ïŒãšãã¹ããã®é»åãã©ã¡ãŒã¿ãŒïŒæ倧100 mAïŒã決å®ãããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹èšè¿°å
0x09, /* bLength: Interface Descriptor size */ 0x04, /* bDescriptorType: */ 0x00, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints*/ 0x08, /* bInterfaceClass: MSC Class */ 0x06, /* bInterfaceSubClass : SCSI transparent*/ 0x50, /* nInterfaceProtocol */ 0x05, /* iInterface: */
ã€ã³ã¿ãŒãã§ã€ã¹èšè¿°åã¯ã2ã€ã®ãšã³ããã€ã³ãïŒäŒéã®ååŽã«1ã€ïŒã宣èšããŸãã ãŸãããã³ãã«ã¯ãç¹å®ã®å€§å®¹éèšæ¶ãµãã¯ã©ã¹ããã«ã¯å°çšè»¢éã§ãããã©ããã決å®ããŸãã ãããã©ã®ãããªãµãã¯ã©ã¹ã§ããããæ£ç¢ºã«èª¬æãã説æã¯èŠã€ãããŸããã§ããã ããã¯ã2ã€ã®ãšã³ããã€ã³ããä»ããåæ¹åã®ããŒã¿éä¿¡ã«ãã£ãŠã®ã¿éä¿¡ããããã€ã¹ã§ãããšæ³å®ããŠããŸãïŒä»ã®ã¢ãã«ã§ãå²ã蟌ã¿ã䜿çšã§ããŸãïŒã ãã®éä¿¡ã®ãããã³ã«ã¯SCSIã³ãã³ãã§ãã
ãšã³ããã€ã³ãèšè¿°å
0x07, /*Endpoint descriptor length = 7*/ 0x05, /*Endpoint descriptor type */ MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), 0x00, /*Polling interval in milliseconds */ 0x07, /*Endpoint descriptor length = 7 */ 0x05, /*Endpoint descriptor type */ MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), 0x00 /*Polling interval in milliseconds*/
ãã«ã¯ã¿ã€ãã®2ã€ã®ãšã³ããã€ã³ããããã§å®çŸ©ãããŠããŸã-USBã€ã³ã¿ãŒãã§ã€ã¹ã¯ããã®ãããªãšã³ããã€ã³ãã§ã®é床ãä¿èšŒããŸããããããŒã¿ã®é ä¿¡ãä¿èšŒããŸãã ãã±ãããµã€ãºã¯64ãã€ãã«èšå®ãããŸãã
ãšã³ããã€ã³ãã«ã€ããŠè©±ããŠããã®ã§ã察å¿ããPMAãããã¡ãŒã決å®ãããusbd_conf.cãã¡ã€ã«ã調ã¹ã䟡å€ããããŸãã
PMAãããã¡ãŒã®èª¿æŽ
HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0x98); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x01 , PCD_SNG_BUF, 0xD8);
次ã«ãå察åŽããMSCãèŠãŠã¿ãŸãããã ãã®USBã¯ã©ã¹ã¯ããã¹ãããèªã¿åã/æžã蟌ã¿ã³ãã³ããåä¿¡ãããããã®ç¹æ®ãªã€ã³ã¿ãŒãã§ã€ã¹USBD_StorageTypeDefãå€æããŸãã å®è£ ã®ã¿ã代çšã§ããŸãã
ããã€ã¹ã€ã³ã¿ãŒãã§ãŒã¹
/** @defgroup USB_CORE_Exported_Types * @{ */ typedef struct _USBD_STORAGE { int8_t (* Init) (uint8_t lun); int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint16_t *block_size); int8_t (* IsReady) (uint8_t lun); int8_t (* IsWriteProtected) (uint8_t lun); int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); int8_t (* GetMaxLun)(void); int8_t *pInquiry; }USBD_StorageTypeDef;
ããã¯C ++ã§ã¯ãªãCã§ããããããããã®åãšã³ããªã¯å¯Ÿå¿ããé¢æ°ãžã®ãã€ã³ã¿ã§ããåè¿°ããããã«ãMSCã€ã³ã¿ãŒãã§ã€ã¹ãSDã«ãŒãã€ã³ã¿ãŒãã§ã€ã¹ã«é§åããã¢ããã¿ãŒãäœæããå¿ èŠããããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ã®å®è£ ãå§ããŸããããæåã¯åæåé¢æ°ã§ã
åæåé¢æ°
int8_t SD_MSC_Init (uint8_t lun) { (void)lun; // Not used // if(!initSD()) // return USBD_FAIL; return (USBD_OK); }
ãããã£ãŠãSDã«ãŒãã¯ãç°¡åãªæäœã§ããã°ãããããããã«åæåã§ããŸããããããSDã«ãŒãã®å Žåãããã¯åžžã«åœãŠã¯ãŸããšã¯éããŸãããããã«ããããã®é¢æ°ã¯ãã¹ãŠã³ãŒã«ããã¯ã§ãããUSBå²ã蟌ã¿ããåŒã³åºãããããšãå¿ããªãã§ãã ããããŸããå²ã蟌ã¿ãé·æéãããã¯ããªãã§ãã ããããããã£ãŠãUSBã®åæåã®åã«mainïŒïŒããinitSDïŒïŒé¢æ°ãçŽæ¥åŒã³åºããŸãããSD_MSC_InitïŒïŒã¯äœãããŸãã
ãããã®åæå
SdFatSPIDriver spiDriver; SdSpiCard card; bool initSD() { return card.begin(&spiDriver, PA4, SPI_FULL_SPEED); }
ãã©ã€ããŒãå€ãããããã«èŠãããããããŸããããã¢ãŒããã¯ãã£ãæãåºãããŠãã ãããSdFatã©ã€ãã©ãªã®SdSpiCardã¯ã©ã¹ã¯ãSPIãä»ããŠSDã«ãŒããšéä¿¡ããæ¹æ³ããã€ã©ã®ã³ãã³ããéä¿¡ããäœãå¿çãåŸ ã€ããç¥ã£ãŠããŸãããããã圌ã¯SPIèªäœã®æäœæ¹æ³ãç¥ããŸããããããã®ç®çã®ããã«ãSPIãä»ããã«ãŒããšã®éä¿¡ãšDMAãä»ããããŒã¿è»¢éãå®è£ ããSdFatSPIDriverã¯ã©ã¹ãäœæããŸããã
ã©ãã
ã«ãŒãé³éåä¿¡æ©èœ
int8_t SD_MSC_GetCapacity (uint8_t lun, uint32_t *block_num, uint16_t *block_size) { (void)lun; // Not used *block_num = card.cardSize(); *block_size = 512; return (USBD_OK); }
SD_MSC_GetCapacityïŒïŒã®å®è£ ã¯ç°¡åã§ã-SdSpiCardã¯ãããã®ãµã€ãºãããã«ãããã¯åäœã§è¿ãããšãã§ããŸã
èªã¿åãããã³æžã蟌ã¿æ©èœ
int8_t SD_MSC_Read (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { (void)lun; // Not used if(!card.readBlocks(blk_addr, buf, blk_len)) return USBD_FAIL; return (USBD_OK); } int8_t SD_MSC_Write (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { (void)lun; // Not used if(!card.writeBlocks(blk_addr, buf, blk_len)) return USBD_FAIL; return (USBD_OK); }
èªã¿åããšæžã蟌ã¿ãéåžžã«ç°¡åã«å®è£ ãããŸãã
ãã®ä»ã®æ©èœ
int8_t SD_MSC_IsReady (uint8_t lun) { (void)lun; // Not used return (USBD_OK); } int8_t SD_MSC_IsWriteProtected (uint8_t lun) { (void)lun; // Not used return (USBD_OK); // Never write protected }
ç§ãã¡ã®ã«ãŒãã¯åžžã«æºåãã§ããŠããïŒå°æ¥çã«ã¯ã¹ããŒã¿ã¹ãããã«è©³ãã調ã¹ãŸãïŒãæžã蟌ã¿ä¿è·ãããŠããŸããã
ããäžã€
int8_t SD_MSC_GetMaxLun (void) { return 0; // We have just 1 Logic unit number (LUN) which is zero }
LUN-è«çãŠãããçªå·ãçè«çã«ã¯ãã¹ãã¬ãŒãžããã€ã¹ã¯è€æ°ã®ã¡ãã£ã¢ã§æ§æãããå ŽåããããŸãïŒããšãã°ãRAIDã®ããŒããã©ã€ãïŒããã¹ãŠã®SCSIãããã³ã«æ©èœã¯ã䜿çšããã¡ãã£ã¢ã瀺ããŸããGetMaxLuné¢æ°ã¯ãæåŸã®ããã€ã¹ã®çªå·ïŒããã€ã¹ã®æ°ãã1ãåŒããå€ïŒãè¿ããŸãããã©ãã·ã¥ãã©ã€ãã1ã€ããããã0ãè¿ã
ãŸããæåŸã®ããšã§ãã
ã¹ãã¬ãŒãžèšè¿°å
const uint8_t SD_MSC_Inquirydata[] = {/* 36 */ /* LUN 0 */ 0x00, 0x80, 0x02, 0x02, (STANDARD_INQUIRY_DATA_LEN - 5), 0x00, 0x00, 0x00, 'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ 'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '.', '0' ,'1' /* Version : 4 Bytes */ };
æ£çŽã«èšããšããªããããå¿ èŠãªã®ãæ¬åœã«ç解ããŠããŸããã§ããã SCSIä»æ§ã調ã¹ããšãç解ã§ããªãå€ãã®æå³ã®ãããã£ãŒã«ããèŠãŸãããç§ãç¿åŸãããã®ãããããã¯çŽæ¥ïŒã·ãŒã±ã³ã·ã£ã«ã§ã¯ãªãïŒã¢ã¯ã»ã¹ãåããåãå€ãå¯èœïŒåãå€ãå¯èœïŒãªæšæºããã€ã¹ã«ã€ããŠèª¬æããŠããŸãã幞ããªããšã«ãç§ãèŠããã¹ãŠã®äŸã§ããã®é åã¯åãã§ãã®ã§ãããããŠãã ãããçµå±ãããã°ãããŸããã
ä»ãããã¯ãã¹ãŠæ£ããåæåããå¿ èŠããããŸã
åæå
USBD_StatusTypeDef res = USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS); USBD_RegisterClass(&hUsbDeviceFS, &USBD_MSC); USBD_MSC_RegisterStorage(&hUsbDeviceFS, &SdMscDriver); USBD_Start(&hUsbDeviceFS);
æ¥ç¶ããŠç¢ºèªããŸããéåžžã«ãã£ããã§ããããã¹ãŠãæ©èœããŸã-æ¥ç¶ããããã£ã¹ã¯ã¯çŽ50ç§ééããŸãããããã¯ããã®ãããªã€ã³ã¿ãŒãã§ã€ã¹ãä»ãããã©ãã·ã¥ãã©ã€ãã®èªã¿åãã®ç·åœ¢é床ãçŽ200 kb / sã§ãããšããäºå®ã«ãããã®ã§ãã USB倧容éèšæ¶è£ 眮ãã³ã³ãã¥ãŒã¿ãŒã«æ¥ç¶ããããšããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯FATããŒãã«ãèªã¿åããŸããç§ã¯8ã®ã¬ãã€ãã®ãã©ãã·ã¥ãã©ã€ãã䜿çšããŠããŸãããFATã¯ãã§ã«7.5ã¡ã¬ãã€ãã§ããããã«ãMBRãããŒãã»ã¯ã¿ãŒããã¡ã€ã«ããŒãã«ãèªã¿åããŸããããã¯ã»ãŒ50ç§ã§ãã
ãŸããSDã«ãŒãã䜿çšããå Žåã¯DMAãç¡å¹ã«ããå¿ èŠããããŸãã-ãããå«ãŸããŠãããããããã»ã©åçŽã§ã¯ãããŸãããå®éããã©ã€ããŒã®å®è£ ïŒå€æããããã«ïŒã¯å²ã蟌ã¿ããã¯æ©èœãããUSBã§ã¯ãã¹ãŠãå²ã蟌ã¿ãä»ããŠã®ã¿æ©èœããŸãããããµããHAL_DelayïŒïŒã§ãåäœããŸããããŸããFreeRTOSã䜿çšããåæã¯èšããŸã§ããªããå²ã蟌ã¿ã«ãé¢é£ä»ããããŠããŸããããã¯ããçŽãå¿ èŠããããŸãããããã¯å¥ã®è©±ã§ãããUSBè€åããã€ã¹ã«ã¯é©çšãããŸãããããçŽããšãå¿ ãããã«ã€ããŠã®èšäºãæžããŠãããã«ãªã³ã¯ãæ®ããŸãã
æŽæ°ïŒçŽæã©ããããã«ãªã³ã¯ããŸããç§ã¯ãªããšã650kb / sãŸã§ã®é床ããã³ãã³ã°ããããšãã§ããŸãã
CDC + MSCè€åããã€ã¹
ãããŠããã®ãã¹ãŠã®ãŽãã䜿ã£ãŠãåè«ãé£ã°ãããšããŸãïŒCïŒã
ã ãããCDCãŸãã¯MSCã®ãããããå®è£ ã§ããUSBããã€ã¹ãæ§ç¯ããæ¹æ³ãæ¢ã«ç¥ã£ãŠããŸããäž¡æ¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ãåæã«å®è£ ããè€åããã€ã¹ãäœæããŠã¿ãŸããããç§ã¯è€åUSBããã€ã¹ãå®è£ ããä»ã®ãããžã§ã¯ããããã€ãèŠãŠããŸãããããã®ã¢ãããŒãã¯çã«ããªã£ãŠããããã§ããã€ãŸããç¬èªã®ã¯ã©ã¹ãã©ã€ããŒãå®è£ ããäž¡æ¹ã®æ©èœãå®è£ ããŸãã
STM32 Cubeããã±ãŒãžïŒããã«ãŠã§ã¢\ ST \ STM32_USB_Device_Library \ Class \ TemplateïŒããã¯ã©ã¹ã®ç©ºçœãååŸããŸããå å¡«ã¯ããããåµé çã«äœãçŽãããã³ãŒãã«ãªããŸãã
USBããã€ã¹ã®æ§é ã¯æ¬¡ã®ãšããã§ãã
- æ§æã¯1ã€ã ãã§ããã®äžã«3ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ããããŸã
- 1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯MSCãå®è£
ããŸã
- åæ¹åã®ãšã³ããã€ã³ãã1ã€ãããŸã-éåä¿¡çš
- CDCã¯2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ãŠå®è£
ãããŸãã
- æåã«å¶åŸ¡ããŸããã€ã³ã¿ãŒãã§ã€ã¹ãå¶åŸ¡ãã1ã€ã®åæ¹åãšã³ããã€ã³ãããããŸãã
- ããŒã¿çšã®2çªç®ã®CDCã€ã³ã¿ãŒãã§ã€ã¹ãåæ¹åã®ãšã³ããã€ã³ãããããŸã-éåä¿¡çš
- ããã€ã¹å šäœãå¶åŸ¡ããã«ã¯å¥ã®ãšã³ããã€ã³ããå¿ èŠã§ãïŒUSBã©ã€ãã©ãªã®ã³ã¢ã«ãã£ãŠå®è£ ãããŸãïŒ

è€åããã€ã¹ã®èª¬æã®äŸã説æããçŸããåçãIADä»æ§ ããã®é©åïŒ
䟿å®äžããšã³ããã€ã³ããšã€ã³ã¿ãŒãã§ã€ã¹çªå·ãã³ãŒãã§å®£èšããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãšãšã³ããã€ã³ãçªå·
#define MSC_INTERFACE_IDX 0x0 // Index of MSC interface #define CDC_INTERFACE_IDX 0x1 // Index of CDC interface // endpoints numbers // endpoints numbers #define MSC_EP_IDX 0x01 #define CDC_CMD_EP_IDX 0x02 #define CDC_EP_IDX 0x03 #define IN_EP_DIR 0x80 // Adds a direction bit #define MSC_OUT_EP MSC_EP_IDX /* EP1 for BULK OUT */ #define MSC_IN_EP MSC_EP_IDX | IN_EP_DIR /* EP1 for BULK IN */ #define CDC_CMD_EP CDC_CMD_EP_IDX| IN_EP_DIR /* EP2 for CDC commands */ #define CDC_OUT_EP CDC_EP_IDX /* EP3 for data OUT */ #define CDC_IN_EP CDC_EP_IDX | IN_EP_DIR /* EP3 for data IN */
ãšã³ããã€ã³ãã®çªå·ä»ãã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®çªå·ä»ãã«ç¶ããŸãã MSCã«ã¯1çªãCDCå¶åŸ¡ã«ã¯2çªãCDCãä»ããããŒã¿éä¿¡ã«ã¯3çªã䜿çšããŸããäžè¬çãªããã€ã¹ç®¡ççšã®ãŒããšã³ããã€ã³ãããããŸãããUSBã«ãŒãã«ã®è žå ã§åŠçãããããããããã®çªå·ã宣èšããå¿ èŠã¯ãããŸããã
STã®USBã©ã€ãã©ãªã€ã³ã¿ãŒãã§ã€ã¹ã¯è²§åŒ±ã§ããå Žåã«ãã£ãŠã¯ããšã³ããã€ã³ãçªå·ã¯ãéä¿¡æ¹åã®ãã©ã°ãšå ±ã«äœ¿çšãããŸã-èšå®ãããäžäœãããã¯ããã¹ããžã®INã®æ¹åãæå³ããŸãïŒãã®ããã«å®æ°IN_EP_DIRãèšå®ããŸãïŒããã ããä»ã®é¢æ°ã¯åã«ãšã³ããã€ã³ãçªå·ã䜿çšããŸããå ã®ãã¶ã€ã³ãšã¯ç°ãªããããããã¹ãŠã®æ°å€ãåé¢ããé©åãªå Žæã§æ£ããå®æ°ã䜿çšããããšã奜ã¿ãŸãããæ¥å°ŸèŸEP_IDXãä»ããå®æ°ã䜿çšãããå Žåãæ¹åãã©ã°ã¯äœ¿çšãããŸããã
éèŠïŒUSBä»æ§ã«ãããšããšã³ããã€ã³ãã®æ°ã¯äœã§ãæ§ããŸããããèšè¿°åã§å®£èšãããŠããã®ãšåãé åºã§é çªã«äžŠã¹ãæ¹ãè¯ãã§ããã ãã®ç¥èã¯ãWindows USBãã©ã€ããŒãé åºã«ééã£ããšã³ããã€ã³ãã«äŸµå ¥ããäœãæ©èœããªãã£ã1é±éã®ããŒããããã°ã«ãã£ãŠç§ã«äžããããŸããã
ãã€ãã®ããã«èšè¿°åããå§ããŸããããã»ãšãã©ã®èšè¿°åã¯ã¯ã©ã¹å®è£ ïŒusbd_msc_cdc.cïŒã«ååšããŸãããããã€ã¹èšè¿°åãšããã€ãã®ã°ããŒãã«ãªãã®ã¯usbd_desc.cãã¡ã€ã«ã®USBã«ãŒãã«ã§å®çŸ©ãããŸã
æåã«å°ãã®å®æ°
#define USBD_VID 0x0483 #define USBD_PID 0x5741 #define USBD_LANGID_STRING 0x409 #define USBD_MANUFACTURER_STRING "STMicroelectronics" #define USBD_PRODUCT_FS_STRING "Composite MSC CDC" #define USBD_SERIALNUMBER_FS_STRING "00000000055C" #define USBD_CONFIGURATION_FS_STRING "Config Name" #define USBD_INTERFACE_FS_STRING "Interface Name"
ããã€ã¹èšè¿°å
__ALIGN_BEGIN const uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { 0x12, /*bLength */ USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ 0x00, /*bcdUSB */ 0x02, 0xEF, /*bDeviceClass*/ 0x02, /*bDeviceSubClass*/ 0x01, /*bDeviceProtocol*/ USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ LOBYTE(USBD_VID), /*idVendor*/ HIBYTE(USBD_VID), /*idVendor*/ LOBYTE(USBD_PID), /*idVendor*/ HIBYTE(USBD_PID), /*idVendor*/ 0x00, /*bcdDevice rel. 2.00*/ 0x02, USBD_IDX_MFC_STR, /*Index of manufacturer string*/ USBD_IDX_PRODUCT_STR, /*Index of product string*/ USBD_IDX_SERIAL_STR, /*Index of serial number string*/ USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ };
äžè¬ã«ãããã§ã¯ãã¹ãŠãåãã§ãããããã€ã¹ã¯ã©ã¹ïŒbDeviceClassïŒãå®çŸ©ãããã£ãŒã«ãã®ã¿ãç°ãªããŸããçŸåšããããã®ãã£ãŒã«ãã¯ããããè€åããã€ã¹ã§ããããšã瀺ããŠããŸãããã¹ãã¯äžçæžåœåããä»ã®ãã¹ãŠã®èšè¿°åãææ¡ããåã³ã³ããŒãã³ãã®æ£ãããã©ã€ããŒãããŒãããå¿ èŠããããŸããbDeviceProtocolãã£ãŒã«ãã¯ãè€åããã€ã¹ã®éšåãç¹å¥ãªèšè¿°åã§ããInterface Association Descriptorã§èšè¿°ãããããšãæå³ããŸãã圌ã«ã€ããŠããå°ãäœãã
æ§æèšè¿°åã¯ä»¥åãšã»ãŒåãã§ãããéãã¯ã€ã³ã¿ãŒãã§ãŒã¹ã®æ°ã®ã¿ã§ããä»ã3ã€ãããŸã
æ§æèšè¿°å
#define USB_MSC_CDC_CONFIG_DESC_SIZ 98 /* USB MSC+CDC device Configuration Descriptor */ static const uint8_t USBD_MSC_CDC_CfgDesc[USB_MSC_CDC_CONFIG_DESC_SIZ] = { 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_MSC_CDC_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */ 0x00, 0x03, /*bNumInterfaces: 3 interface*/ 0x01, /*bConfigurationValue: Configuration value*/ 0x02, /*iConfiguration: Index of string descriptor describing the configuration*/ 0xC0, /*bmAttributes: bus powered and Supports Remote Wakeup */ 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ /* 09 bytes */
次ã¯ãMSCã®ã€ã³ã¿ãŒãã§ã€ã¹ãšãšã³ããã€ã³ãã®å®£èšã§ãããã®é åºïŒæåã®MSCã次ã«CDCïŒã®çç±ã¯ããããŸãããã ãããç§ãèŠã€ããŠããããã³ããŒããäŸã®1ã€ã«ãããŸãããååãšããŠãã€ã³ã¿ãŒãã§ã€ã¹ã®é åºã¯éèŠã§ã¯ãããŸãããäž»ãªããšã¯ãè¿œå ã®èšè¿°åããã¹ãŠè¿ãã«æã£ãŠããããšã§ãããŸãããšã³ããã€ã³ãã®çªå·ä»ããšãžã§ãŒã¯ãéèŠã§ãã
MSCèšè¿°å
/******************** Mass Storage interface ********************/ 0x09, /* bLength: Interface Descriptor size */ 0x04, /* bDescriptorType: */ MSC_INTERFACE_IDX, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints*/ 0x08, /* bInterfaceClass: MSC Class */ 0x06, /* bInterfaceSubClass : SCSI transparent command set*/ 0x50, /* nInterfaceProtocol */ USBD_IDX_INTERFACE_STR, /* iInterface: */ /* 09 bytes */ /******************** Mass Storage Endpoints ********************/ 0x07, /*Endpoint descriptor length = 7*/ 0x05, /*Endpoint descriptor type */ MSC_IN_EP, /*Endpoint address (IN, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(USB_MAX_PACKET_SIZE), HIBYTE(USB_MAX_PACKET_SIZE), 0x00, /*Polling interval in milliseconds */ /* 07 bytes */ 0x07, /*Endpoint descriptor length = 7 */ 0x05, /*Endpoint descriptor type */ MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(USB_MAX_PACKET_SIZE), HIBYTE(USB_MAX_PACKET_SIZE), 0x00, /*Polling interval in milliseconds*/ /* 07 bytes */
MSCèšè¿°åã¯ãåã®ã»ã¯ã·ã§ã³ã®èšè¿°åãšéãã¯ãããŸããã
ãããŠãããã«æ°ããã¿ã€ãã®èšè¿°å-IADïŒInterface Association DescriptorïŒ-ã€ã³ã¿ãŒãã§ãŒã¹é¢é£èšè¿°åããããŸããããã§ã®é¢é£ä»ãã¯ãçµç¹ãšããæå³ã§ã¯ãªããã©ã®ã€ã³ã¿ãŒãã§ã€ã¹ãã©ã®æ©èœã«é¢é£ä»ããããšããæå³ã§ãã
ã€ã³ã¿ãŒãã§ã€ã¹é¢é£ä»ãèšè¿°å
/******** IAD should be positioned just before the CDC interfaces ****** IAD to associate the two CDC interfaces */ 0x08, /* bLength */ 0x0B, /* bDescriptorType */ CDC_INTERFACE_IDX, /* bFirstInterface */ 0x02, /* bInterfaceCount */ 0x02, /* bFunctionClass */ 0x02, /* bFunctionSubClass */ 0x01, /* bFunctionProtocol */ 0x00, /* iFunction (Index of string descriptor describing this function) */ /* 08 bytes */
ãã®ããªãããŒãªãã³ãã«ã¯ãUSBããã€ã¹ïŒMSCïŒã®ä»¥åã®æ©èœã®èª¬æãçµãã£ãããšããã¹ãã«äŒããä»ã§ã¯å®å šã«ç°ãªãæ©èœããããŸãããããŠãããã¯ããã«ç€ºãããŸã-CDCããŸããããã«é¢é£ä»ããããŠããã€ã³ã¿ãŒãã§ã€ã¹ã®æ°ãšæåã®ã€ã³ã¿ãŒãã§ã€ã¹ã®ã€ã³ããã¯ã¹ã瀺ããŸãã
IADèšè¿°åã¯MSCã«ã¯å¿ èŠãããŸãããã€ã³ã¿ãŒãã§ã€ã¹ã¯1ã€ã ãã§ãããã ããCDCã2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã1ã€ã®æ©èœã«ã°ã«ãŒãåããã«ã¯ãIADãå¿ èŠã§ããããã¯ããã®èšè¿°å ã®ä»æ§ã«èšèŒãããŠããŸã
æåŸã«ãCDCèšè¿°åããããã¯ãåäžã®CDCæ©èœã®èšè¿°åãšå®å šã«äžè²«ããŠãããã€ã³ã¿ãŒãã§ã€ã¹çªå·ãšãšã³ããã€ã³ãã«å¯ŸããŠæ£ç¢ºã§ãã
CDCèšè¿°å
/******************** CDC interfaces ********************/ /*Interface Descriptor */ 0x09, /* bLength: Interface Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ /* Interface descriptor type */ CDC_INTERFACE_IDX, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x01, /* bNumEndpoints: One endpoints used */ 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x01, /* bInterfaceProtocol: Common AT commands */ 0x01, /* iInterface: */ /* 09 bytes */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x00, /* bDescriptorSubtype: Header Func Desc */ 0x10, /* bcdCDC: spec release number */ 0x01, /* 05 bytes */ /*Call Management Functional Descriptor*/ 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x01, /* bDescriptorSubtype: Call Management Func Desc */ 0x00, /* bmCapabilities: D0+D1 */ CDC_INTERFACE_IDX + 1, /* bDataInterface: 2 */ /* 05 bytes */ /*ACM Functional Descriptor*/ 0x04, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ 0x02, /* bmCapabilities */ /* 04 bytes */ /*Union Functional Descriptor*/ 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x06, /* bDescriptorSubtype: Union func desc */ CDC_INTERFACE_IDX, /* bMasterInterface: Communication class interface */ CDC_INTERFACE_IDX + 1, /* bSlaveInterface0: Data Class Interface */ /* 05 bytes */ /*Endpoint 2 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_CMD_PACKET_SIZE), 0x10, /* bInterval: */ /* 07 bytes */ /*Data class interface descriptor*/ 0x09, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ CDC_INTERFACE_IDX + 1, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ 0x00, /* bInterfaceSubClass: */ 0x00, /* bInterfaceProtocol: */ 0x00, /* iInterface: */ /* 09 bytes */ /*Endpoint OUT Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ LOBYTE(CDC_DATA_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_DATA_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ /* 07 bytes */ /*Endpoint IN Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_IN_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ LOBYTE(CDC_DATA_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_DATA_PACKET_SIZE), 0x00, /* bInterval */ /* 07 bytes */
ãã¹ãŠã®èšè¿°åã®æºåãã§ããããæ§æã®åèšãµã€ãºãèšç®ã§ããŸãã
#define USB_CDC_CONFIG_DESC_SIZ 98
ã³ãŒãã®èšè¿°ã«ç§»ããŸããããUSBã«ãŒãã«ã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠã¯ã©ã¹ãã©ã€ããŒãšéä¿¡ããŸã
ã¯ã©ã¹ãã©ã€ããŒã€ã³ã¿ãŒãã§ã€ã¹
typedef struct _Device_cb { uint8_t (*Init) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); uint8_t (*DeInit) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); /* Control Endpoints*/ uint8_t (*Setup) (struct _USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req); uint8_t (*EP0_TxSent) (struct _USBD_HandleTypeDef *pdev ); uint8_t (*EP0_RxReady) (struct _USBD_HandleTypeDef *pdev ); /* Class Specific Endpoints*/ uint8_t (*DataIn) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); uint8_t (*DataOut) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); uint8_t (*SOF) (struct _USBD_HandleTypeDef *pdev); uint8_t (*IsoINIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); const uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); const uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); const uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); const uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); #if (USBD_SUPPORT_USER_STRING == 1) uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev ,uint8_t index, uint16_t *length); #endif } USBD_ClassTypeDef;
USBãã¹äžã®ã¹ããŒã¿ã¹ãŸãã¯ã€ãã³ãã«å¿ããŠãã«ãŒãã«ã¯å¯Ÿå¿ããé¢æ°ãåŒã³åºããŸãã
ã©ã建ç¯åé¡è¿œå ã®æœè±¡åã¬ã€ã€ãå°å ¥ããããšã§è§£æ±ºããããšãã§ãã...ïŒCïŒã¯ãå¥ã®éžè©±ã§ãã
ãã¡ãããæã ã¯å šäœã®å®å šãªæ©èœãå®è£ ããŠããªãã ããã - CDCããã³MSCã¯ã©ã¹ã®å®è£ ã®ããã«ã¯ãæ¢åã®ã³ãŒããæºãããŠããŸããåŒã³åºãã1ã€ãŸãã¯å¥ã®å®è£ ã«ãªãã€ã¬ã¯ãããã¬ã€ã€ãŒã®ã¿ãèšè¿°ããŸãã
åæåãšåæå解é€
/** * @brief USBD_MSC_CDC_Init * Initialize the MSC+CDC interface * @param pdev: device instance * @param cfgidx: Configuration index * @retval status */ static uint8_t USBD_MSC_CDC_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { /* MSC initialization */ uint8_t ret = USBD_MSC_Init (pdev, cfgidx); if(ret != USBD_OK) return ret; /* CDC initialization */ ret = USBD_CDC_Init (pdev, cfgidx); if(ret != USBD_OK) return ret; return USBD_OK; } /** * @brief USBD_MSC_CDC_Init * DeInitialize the MSC+CDC layer * @param pdev: device instance * @param cfgidx: Configuration index * @retval status */ static uint8_t USBD_MSC_CDC_DeInit (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { /* MSC De-initialization */ USBD_MSC_DeInit(pdev, cfgidx); /* CDC De-initialization */ USBD_CDC_DeInit(pdev, cfgidx); return USBD_OK; }
ããã§ã¯ãã¹ãŠãç°¡åã§ããäž¡æ¹ã®ã¯ã©ã¹ãåæåïŒåæå解é€ïŒããŸããåŒã³åºãããé¢æ°èªäœããšã³ããã€ã³ããäœæ/åé€ããŸãã
ãããããæãé£ããæ©èœã¯ã»ããã¢ããã§ãã
ã»ããã¢ãããã³ãã©ãŒ
/** * @brief USBD_MSC_CDC_Setup * Handle the MSC+CDC specific requests * @param pdev: instance * @param req: usb requests * @retval status */ static uint8_t USBD_MSC_CDC_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { // Route requests to MSC interface or its endpoints to MSC class implementaion if(((req->bmRequest & USB_REQ_RECIPIENT_MASK) == USB_REQ_RECIPIENT_INTERFACE && req->wIndex == MSC_INTERFACE_IDX) || ((req->bmRequest & USB_REQ_RECIPIENT_MASK) == USB_REQ_RECIPIENT_ENDPOINT && ((req->wIndex & 0x7F) == MSC_EP_IDX))) { return USBD_MSC_Setup(pdev, req); } return USBD_CDC_Setup(pdev, req); }
ããã¯ãUSBãã¹çµç±ã®æšæºãªã¯ãšã¹ãã®1ã€ãžã®ã³ãŒã«ããã¯ã§ããããã®ãªã¯ãšã¹ãã¯éåžžã«å€é¢çã§ããããã¯ãããŒã¿ã®åä¿¡ïŒååŸïŒãŸãã¯èšå®ïŒèšå®ïŒã®ããããã§ããããã¯ãããã€ã¹å šäœãããã€ã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ãŸãã¯ãšã³ããã€ã³ããžã®ãªã¯ãšã¹ãã§ããå¯èœæ§ããããŸãããŸããããã§ã¯ãåºæ¬çãªUSBä»æ§ã§å®çŸ©ãããããŸãã¯ç¹å®ã®ããã€ã¹ãŸãã¯ã¯ã©ã¹ã«åºæã®æšæºãªã¯ãšã¹ããšããŠæäŸãããŸãã詳现ã¯ãã¡ãïŒã»ã¯ã·ã§ã³ãã»ããã¢ããããã±ãŒãžãïŒã
ããŸããŸãªã±ãŒã¹ãè±å¯ã«ãããããã»ããã¢ããããã±ãŒãžãã³ãã©ãŒã®æ§é ã¯éåžžã«è€éã§ããããã§ã¯ifãswitchãæžãããšã¯ã§ããŸããã USBã«ãŒãã«ã³ãŒãã§ã¯ãåŠçã¯3ã4åã®å€§ããªæ©èœã«åæ£ãããç¹å®ã®ã±ãŒã¹ã§ã¯å¥ã®å°çšããã»ããµã«è»¢éãããŸãïŒããã«å€ãã®æ©èœããããŸãïŒãå¯äžã®è¯ããã¥ãŒã¹ã¯ããªã¯ãšã¹ãã®ããããªéšåã®ã¿ãã¯ã©ã¹ãã©ã€ããŒã¬ãã«ã«æž¡ãããããšã§ãã
ã©ã®ãã±ããããã®æ©èœãééãããã調ã¹ãŸããããåä¿¡è ãããã²ãŒãã§ããããã§ãããã±ããã®åä¿¡è ãã€ã³ã¿ãŒãã§ã€ã¹ã®å Žå-wIndexãã£ãŒã«ãã«ã¯ã€ã³ã¿ãŒãã§ã€ã¹çªå·ãããããšã³ããã€ã³ãã®å Žåã¯wIndexã«ãšã³ããã€ã³ãçªå·ããããŸããããã«åºã¥ããŠããªã¯ãšã¹ããé©åãªãã³ãã©ã«ãªãã€ã¬ã¯ãããŸãã
ã¡ãªã¿ã«ããããæ©èœããããã«ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®æ°ã決å®ããå®çŸ©ãå€æŽããããšãå¿ããŠã¯ãªããŸãããããããªããšããªã¯ãšã¹ãã¯åã«å°éãããUSBã«ãŒãã«å ã§åæãããŸã
#define USBD_MAX_NUM_INTERFACES 3
DataInãšDataOutã®åŒã³åºãã¯ç°¡åã§ãããšã³ããã€ã³ãã®çªå·ããããŸã-ãã®äžã«ããªã¯ãšã¹ãããªãã€ã¬ã¯ãããå Žæã決å®ããŸã
DataInïŒïŒããã³DataOutïŒïŒ
/** * @brief USBD_MSC_CDC_DataIn * handle data IN Stage * @param pdev: device instance * @param epnum: endpoint index * @retval status */ static uint8_t USBD_MSC_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) { if(epnum == MSC_EP_IDX) return USBD_MSC_DataIn(pdev, epnum); return USBD_CDC_DataIn(pdev, epnum); } /** * @brief USBD_MSC_CDC_DataOut * handle data OUT Stage * @param pdev: device instance * @param epnum: endpoint index * @retval status */ static uint8_t USBD_MSC_CDC_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) { if(epnum == MSC_EP_IDX) return USBD_MSC_DataOut(pdev, epnum); return USBD_CDC_DataOut(pdev, epnum); }
éä¿¡æ¹åãã©ã°ã¯ãšã³ããã€ã³ãçªå·ã§ã¯äœ¿çšãããªãããšã«æ³šæããŠãã ããã ããªãã¡äžéšã®é¢æ°ãMSC_IN_EPïŒ0x81ïŒã䜿çšããŠããå Žåã§ãããã®é¢æ°ã§ã¯MSC_EP_IDXïŒ0x01ïŒã䜿çšããå¿ èŠããããŸãã
ããŒã¿ããŒãã®ãšã³ããã€ã³ãã«å°éããå Žåãããããã®ããã®ç¹å¥ãªã³ãŒã«ããã¯ããããŸããäž¡æ¹ã®ã¯ã©ã¹ïŒCDCãšMSCã®äž¡æ¹ïŒããã®å Žåã®ãã³ãã©ãŒãæã£ãŠããå Žåãã©ãããã°ãããããããŸãã-ã€ã³ã¿ãŒãã§ãŒã¹ãŸãã¯ãšã³ããã€ã³ãçªå·ã¯ããã®ãããªãªã¯ãšã¹ãã§æå®ãããŠããŸããããªã¯ãšã¹ãã®å®å ã誰ã§ããããç解ããããšã¯äžå¯èœã§ãã幞ããªããšã«ããã®ãããªãªã¯ãšã¹ããåŠçã§ããã®ã¯CDCã¯ã©ã¹ã®ã¿ã§ã-ããã§ã¯éä¿¡ããŸã
EP0_RxReadyãã³ãã©ãŒ
/** * @brief USBD_MSC_CDC_EP0_RxReady * handle EP0 Rx Ready event * @param pdev: device instance * @retval status */ static uint8_t USBD_MSC_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev) { return USBD_CDC_EP0_RxReady(pdev); }
åãã«è¶³ããªããã³ãã©ãŒã¯ãããããŸãããèšè¿°åã«ã¯ããã€ãã®ã²ãã¿ãŒããããŸããããããã®ã³ãŒãã¯æšæºã§ãããèå³ã®å¯Ÿè±¡ã§ã¯ãããŸããããä»®æ³æ©èœã®è¡šãã«èšå ¥ãã
é¢æ°ãã€ã³ã¿ããŒãã«
USBD_ClassTypeDef USBD_MSC_CDC_ClassDriver = { USBD_MSC_CDC_Init, USBD_MSC_CDC_DeInit, USBD_MSC_CDC_Setup, NULL, //USBD_MSC_CDC_EP0_TxReady, USBD_MSC_CDC_EP0_RxReady, USBD_MSC_CDC_DataIn, USBD_MSC_CDC_DataOut, NULL, //USBD_MSC_CDC_SOF, NULL, //USBD_MSC_CDC_IsoINIncomplete, NULL, //USBD_MSC_CDC_IsoOutIncomplete, USBD_MSC_CDC_GetCfgDesc, USBD_MSC_CDC_GetCfgDesc, USBD_MSC_CDC_GetCfgDesc, USBD_MSC_CDC_GetDeviceQualifierDesc, };
ä»åæåã³ãŒã
åæåã³ãŒã
USBD_Init(&hUsbDeviceFS, &FS_Desc, 0); USBD_RegisterClass(&hUsbDeviceFS, &USBD_MSC_CDC_ClassDriver); USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS); USBD_MSC_RegisterStorage(&hUsbDeviceFS, &SdMscDriver); USBD_Start(&hUsbDeviceFS);
USBã«ãŒãã«ãåæåããã¯ã©ã¹ãã©ã€ããŒãã€ã³ã¹ããŒã«ããŠãã»ã«ã³ããªã€ã³ã¿ãŒãã§ã€ã¹ãæ§æããŸããããã ãã§ããïŒãããããã¹ãŠã§ã¯ãããŸããããã®ãã©ãŒã ã§ã¯ãéå§ãããŸããã
ããã«ãããŸããåã¯ã©ã¹ã«ã¯ããã©ã€ããŒã®ç¶æ ããã©ã€ããŒã®ããŸããŸãªæ©èœã§äœ¿çšã§ããããã€ãã®å€æ°ãªã©ãäžå®éã®ãã©ã€ããŒãããŒã¿ããããŸããããã«ããããã¯åã«ã°ããŒãã«å€æ°ã«ããããšã¯ã§ããŸãã-ç¹å®ã®USBããã€ã¹ã«é¢é£ä»ããããŠããŸãïŒããã§ãªããã°ãå¿ èŠã«å¿ããŠè€æ°ã®ããã€ã¹ãåæã«æäœããããšã¯ã§ããŸããïŒããã®ããããã®ãããªå Žåã®ããã€ãã®ãã£ãŒã«ããUSBãã³ãã«ã«äžåºŠã«å ¥åãããŸããã
USBãã³ãã«ããŒã¿ãã£ãŒã«ã
/* USB Device handle structure */ typedef struct _USBD_HandleTypeDef { ... void *pClassData; void *pUserData; void *pData; } USBD_HandleTypeDef;
åé¡ã¯ãåã¯ã©ã¹ããããã®ãã£ãŒã«ãããã®ããããã£ãšèŠãªãããã®æ§é ã«ããã¿ã€ããŠããããšã§ãã
ããã解決ããæ¹æ³ã¯ããã€ããããŸããåå¿ããã§ã¯ããã®ãã¹ãŠã®å®è£ ã¯ã©ã¹ã«äœããç解ããããã«è¡ãã«ã¯ãäž¡æ¹ã®ãã©ã€ãïŒCDCãšMSCïŒããã®ãã¹ãŠã®ã³ãŒããå梱ãå¥ã®ã¢ãããŒãã¯ãäž¡æ¹ã®ã¯ã©ã¹ã®ããŒã¿ã®äœå°ããããããã®ãã£ãŒã«ãã«æ§é ãé 眮ããããšã§ãããã®åŸãéšåçã«ãããŸããïŒæã ã¯å¯äžã®USBããŒããæã£ãŠããå Žåã¯OKã§ãïŒã°ããŒãã«å€æ°ã«è»¢éãããããŒã¿ã®äžéšã«ã¯ããã®ã¢ãããŒãã䜿çš
ç§ãã¡ã¯ãããç°¡åã§è¡ããŸãããã¯ã©ã¹ãã©ã€ããŒãæä»çãªãã£ãŒã«ããå¿ èŠãšããå Žåã¯ããããã®ãã£ãŒã«ããæäŸããŸã
ãæ£ãããUSBãã³ãã«ãã£ãŒã«ã
typedef struct _USBD_HandleTypeDef { ... USBD_MSC_BOT_HandleTypeDef *pClassDataMSC; const USBD_StorageTypeDef *pClassSpecificInterfaceMSC; USBD_CDC_HandleTypeDef *pClassDataCDC; const USBD_CDC_ItfTypeDef *pClassSpecificInterfaceCDC; PCD_HandleTypeDef *pPCDHandle; } USBD_HandleTypeDef;
æåã«ãç§ã¯åã¯ã©ã¹ã«ãã£ãŒã«ããäžããŸãã-圌ãã«åœŒããæãããã«èŠããŸããŠãã ããã第äºã«ããããã®ãã£ãŒã«ãã«å®éã«ãããã®ã«å¿ããŠãããã®ãã£ãŒã«ãã«ååãä»ããŸãã-UserDataã¯ãããŸããããã€ã³ã¿ãŒãã§ãŒã¹ãžã®ãã€ã³ã¿ãŒããããŸãã
ãã¡ãããé·æã§ã¯ãããçŸããããããšã¬ã¬ã³ãã«ãªããŸãïŒã¡ã¢ãªãšCPUã®æ¶è²»éã¯åãã§ãïŒãããããCã¯äººéçã«è¡ãããšãã§ããŸãããã³ãã«æ§é ã§å°ããªæãå§ããŠãããç解ã§ããªãvoid *ã人éã®ã¿ã€ãã«å€æŽããŸããïŒãšããã§ãvoid * pDataãã£ãŒã«ãã¯ã察å¿ããã¿ã€ãã®pPCDHandleãšåŒã°ããããã«ãªããŸããïŒããŸããå¿ èŠã«å¿ããŠconstãé 眮ããŸããã確ãã«ãç§ã¯åæ¹å®£èšããããå¿ èŠããããŸããã
ãããžã§ã¯ãã®çµç¹ã«ã€ããŠãäžéšã®IDEã§ã¯ããããžã§ã¯ãã次ã®ããã«æ§ç¯ã§ããŸããã¯ã©ã¹ãã©ã€ããŒã®USBã©ã€ãã©ãªãšãœãŒã¹ã³ãŒãã¯STM32ãã¥ãŒãã«ä»å±ããŠããŸãããäžéšã®ãã¡ã€ã«ã¯ãŠãŒã¶ãŒã«æžã蟌ãããšãææ¡ãããŠããŸããã©ã€ãã©ãªãå ±éã®å Žæã«ãããè€æ°ã®ãããžã§ã¯ãã§äœ¿çšãããŠããããšããããŸããUSBã©ã€ãã©ãªã®ã³ãŒããå€æŽããŠãããããã ãã«ãéªéãããªãããã«ç¬èªã®ã³ããŒãäœæããããšããå§ãããŸãã
ãã¡ããããã£ãŒã«ãåã®å€æŽã¯ãã©ã€ããŒã³ãŒãã«åæ ãããå¿ èŠããããŸããããããããã§ã¯ããã¹ãŠãç°¡åã§ã-ã³ã³ããã¹ã眮æã«ããåé¡ã解決ããŸãã
ããã§ã®äž»ãªããšã¯ç¡çãããªãããšã§ããç§ã¯ãããããã®äœ¿çšãèŠãŠãæãå€ããŸãããããã§ãã³ãŒãã«ããã°ããèŠã€ããŠä¿®åŸ©ãããããæ©èœããªãçç±ãç解ããããã«3æ¥éã®è°è«ãããŸããã
ããã°ããšå
¥åããŸã
USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) { ... if (pdev->pClassData) pdev->pClass->DeInit(pdev, pdev->dev_config); ... }
ããã§ã¯å€§äžå€«ã§ãã-pClassDataã確èªããpClassã«æ»ããŸããä¿®æ£ããå ŽåïŒpClassã確èªïŒãæ©èœããŸãããããªãã¡pClassDataã¯ãã¯ã©ã¹ãåæåãããäžçš®ã®ããŒã«ãŒã§ãã
ãã©ã€ããŒã«æ»ããŸããInitïŒïŒã¯äž¡æ¹ã®pClassDataXXXå€æ°ãåæåããããããã®ã³ãŒãã§ãã§ãã¯ã§ããŸãã
æŽæ°ïŒfrondersãæ°ä»ããéèŠãªãã¥ã¢ã³ã¹ã
åæåé¢æ°ïŒUSBD_CDC_InitïŒïŒãªã©ïŒã®å ã®ã¯ã©ã¹å®è£ ïŒCDCãHIDãMSCãããã³ãã®ä»ãã¹ãŠïŒã§ã¯ãpClassDataXXXãã£ãŒã«ãã®ãããã¡ãŒã¯ããã³ãã¬ãŒãå®è£ ã§mallocïŒïŒã§å®çŸ©ãããŠããUSBD_mallocïŒïŒã䜿çšããŠå²ãåœãŠãããŸããç¹å¥ãªãã®ã§ã¯ãªãããã§ã-äœåãéžæãããã®ã¢ãã¬ã¹ã䜿çšããŸãã
USBD_CDC_InitïŒïŒã®æšæºå®è£
static uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { ... pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); ... }
ããããäžéšã®ãããžã§ã¯ãïŒSTMicroelectronicsèªäœããã®äŸãå«ãïŒã§ã¯ãã¡ã¢ãªãç¯çŽããããšã決å®ããã¢ãã±ãŒã¿ãŒã®å®è£ ãäœæããŸããã
æ£ãããªãã¢ãã±ãŒã¿ãŒ
void *USBD_static_malloc(uint32_t size) { static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4+1)];/* On 32-bit boundary */ return mem; }
ååãšããŠããã®ã¢ãããŒãã¯æ©èœããŸããããããŸã§ã®ãšãããããã€ã¹ã¯ã©ã¹ã¯1ã€ãããããŸãããããã€ãã®ã¯ã©ã¹ããã®ãããªã¢ãã±ãŒã¿ãä»ããŠã¡ã¢ãªããå²ãåœãŠããããšãããšããã«ããã¹ãŠãå£ããŸããè€æ°ã®ã¯ã©ã¹ãåããããã¡ãèŠãããŸãã
å®éãããã€ãã®åäžã®æ©èœãæã€ããã€ã¹ïŒããšãã°ã2ã€ä»¥äžã®CDCãå®è£ ããããã€ã¹ïŒãæ§ç¯ããå Žåã«ã®ã¿ãã¡ã¢ãªãå²ãåœãŠãå¿ èŠããããŸãããŸããå€åããã¯ãããã€ãã®ãšããŸããã¯ãªã±ãŒã¹ã§ãã€ã³ã¿ãŒãã§ãŒã¹ããã®å Žã§äœæããã³åé€ããããšãããŸã å¿ èŠã§ããããä»ã®ãã¹ãŠã®å ŽåïŒãã®å€§éšåã¯ïŒãã¡ã¢ãªã®å²ãåœãŠãšãããã¡ã®éçãªå²ãåœãŠãæ°ã«ããŸãããç§ã®ãããžã§ã¯ãã§ã¯ããããè¡ããŸããïŒåæã«ãããŒã¿åã¯çœè²ã«ãªããŸããïŒã
éçå²ãåœãŠ
// A CDC object USBD_CDC_HandleTypeDef cdcInstance; ... uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { ... pdev->pClassDataCDC = &cdcInstance; hcdc = pdev->pClassDataCDC; ... }
æçµã¿ãã-PMAãããã¡ãŒã®å²ãåœãŠ
PMAååž
HAL_PCDEx_PMAConfig(pdev->pPCDHandle , 0x00 , PCD_SNG_BUF, 0x20); HAL_PCDEx_PMAConfig(pdev->pPCDHandle , 0x80 , PCD_SNG_BUF, 0x60); HAL_PCDEx_PMAConfig(pdev->pPCDHandle , MSC_IN_EP, PCD_SNG_BUF, 0xA0); HAL_PCDEx_PMAConfig(pdev->pPCDHandle , MSC_OUT_EP, PCD_SNG_BUF, 0xE0); HAL_PCDEx_PMAConfig(pdev->pPCDHandle, CDC_CMD_EP, PCD_SNG_BUF, 0x100); HAL_PCDEx_PMAConfig(pdev->pPCDHandle, CDC_IN_EP, PCD_SNG_BUF, 0x140); HAL_PCDEx_PMAConfig(pdev->pPCDHandle, CDC_OUT_EP, PCD_SNG_BUF, 0x180);
ãšã³ããã€ã³ãã«ã¯ã7ã€ã®ãããã¡ãå¿ èŠã§ãã2ã€ã¯ãŒããšã³ããã€ã³ãïŒã³ã³ãããŒã«ãã€ã³ãïŒã2ã€ã¯MSCã3ã€ã¯CDCã§ãããã ããããã§æãèå³æ·±ãã®ã¯ãéå§ã¢ãã¬ã¹ïŒæåŸã®ãã©ã¡ãŒã¿ãŒïŒã§ããäœããã®çç±ã§ããã®ãã¥ã¢ã³ã¹ã¯ãã¹ãŠã®ãã¥ãŒããªã¢ã«ã§æ éã«ç®¡çãããŠããŸããããŒã¿ã·ãŒãã«ã¯ãPMAã®ãããã¡ãŒã®å²ãåœãŠãšã¬ãžã¹ã¿ã¬ãã«ã§ã®è¡šç€ºã«ã€ããŠèšèŒãããŠããŸãããHALã®å¯Ÿå¿ããé¢æ°ã®äœ¿çšæ¹æ³ã«é¢ããæ å ±ã¯ãããŸããããã®ã®ã£ãããåããŸãã
ã ãããã³ã³ãããŒã©ã«ã¯ãç¹å¥ãªã¡ã¢ãª-PMAïŒãã±ããã¡ã¢ãªé åïŒããããŸããããã¯ãããã°ã©ã ãããŒã¿ãæžã蟌ãããšãã§ããUSBåšèŸºæ©åšãããŒã¿ãèªã¿åãïŒããã³ãã®éã®ïŒã¡ã¢ãªã§ãããã®ã¡ã¢ãªã¯äºåã«å²ãåœãŠãããŠããŸãããããŸããŸãªãšã³ããã€ã³ããããŸããŸãªãã±ãããµã€ãºã«èšå®ã§ããŸãããããã£ãŠãã©ã®ãããã¡ãŒãã©ãã«ãããã瀺ãããŒãã«BTABLEããããŸããããã«ããã®ããŒãã«èªäœãPMAã«ãããŸããããŒãã«ã¯PMAã®ä»»æã®å Žæã«ç§»åããŠé 眮ã§ããŸãããHALã¯ããŒãã«ãæåã«ããé 眮ã§ããŸããã

ãªãã¡ã¬ã³ã¹ããã¥ã¢ã«STM32F103ã·ãªãŒãºãã€ã¯ãã³ã³ãããŒã©ãŒã®åç
ããã§ã¯ããããã¡ãªãã»ãããã©ã®ããã«èšç®ããŸããïŒããŒãã«ã®ãµã€ãºã¯ã䜿çšããããšã³ããã€ã³ãã®æ°ã«ãã£ãŠç°ãªããŸããããŒãã«å ã®åãšã³ããã€ã³ãã¯ã4ã€ã®16ãããå€ã®ã¬ã³ãŒãã§è¡šãããŸãïŒæ¹åã®1ã€ã䜿çšãããªãå Žåã§ããåä¿¡çšã«2ã€ãéä¿¡çšã«2ã€ïŒã 4ã€ã®ãšã³ããã€ã³ãã䜿çšããŸã-0ãMSCãããã³CDCã«2ã€ïŒãããã¡ãŒã®æ°ãšæ··åããªãã§ãã ãã-ãšã³ããã€ã³ãããšã«2ã€ãããŸããããšã³ããã€ã³ãããšã«2ã€ã§ããã1ã€ã®ãã€ã³ãã¯åäžæ¹åãªã®ã§ããããã¡ãŒã¯1ã€ã ãã§ãïŒããããã£ãŠãããŒãã«ã®ãµã€ãºã¯4ãã€ã³ã* 4ã¬ã³ãŒã* 2ãã€ã= 32ãã€ãã«ãªããŸãã
ãã§ã«è¿°ã¹ãããã«ãHALã¯PMAãšãªã¢ã®å é ã«ã®ã¿é 眮ã§ããŸãããããã£ãŠãæåã®ãããã¡ãŒã¯ãªãã»ãã0x20ïŒ32ãã€ã-ããŒãã«ã®ãµã€ãºïŒã«ã®ã¿é 眮ã§ããŸãããšã³ããã€ã³ããããã¡ã¯ããªãŒããŒã©ããããªãéããPMAã¡ã¢ãªã®ã©ãã«ã§ãé 眮ã§ããŸããåãšã³ããã€ã³ãã¯ãåŠçããæºåãã§ããŠããæ倧ãã±ãããµã€ãºã決å®ããŸãããããã¡ã¯ãã®ãµã€ãºä»¥äžã§ããå¿ èŠããããŸãã
ãããã¡ãŒã64ãã€ãåäœïŒUSBãã«ã¹ããŒãããã€ã¹ã®æ倧æšå¥šãããã¡ãŒãµã€ãºïŒã§é 眮ããŸããããäžéšã®ãšã³ããã€ã³ãã§ã¯ãããããå°ãªãããããšãã§ããŸããããã®ãããCDCå¶åŸ¡ãšã³ããã€ã³ãã«æ²¿ã£ãŠå®è¡ãããããŒã¿ã¯å€ããããŸããïŒCDC_CMD_PACKET_SIZEã¯8ãã€ãã§ãïŒããããã£ãŠããããã¡ãŒã¯8ãã€ãã®ã¿ã«ããããšãã§ããŸããããããæ®å¿µãªãã32ãã€ãã§ãã-ã¡ããã©ã©ãŠã³ãæ°ãååŸããããã«ã
ã³ã³ãã€ã«ããŠå®è¡ããæéã§ããç§ã®Windowsã¯ããã«ããã€ã¹èªäœãç¹å®ãã2ã€ã®ã³ã³ããŒãã³ããèŠãŸãããããã¯æå ±ã§ããããããæªããã®ããããŸããMass Storageããã€ã¹ãããã«æ€åºãããå ŽåãCDCã¯æ€åºãããŸããã

é¢ä¿ãããŸãã-æ£ãããã©ã€ããŒãWindowsã«æ¿å ¥ããã ãã§ããå®éãããã€ã¹ã¯æšæºã§ãããç¹å¥ãªãã©ã€ããŒã¯å¿ èŠãããŸããããã®ããã€ã¹ãæšæºãã©ã€ããŒïŒãã®å Žåã¯usbser.sysïŒã«é¢é£ä»ããã ãã§åå
ã§ããå®éããã®ãããã³ã§ã¯ããŸãç解ããŠããŸãããååãšããŠãSTãµã€ãããSTMicroelectronics Virtual COM Portãã©ã€ããŒãããŠã³ããŒãããå¿ èŠããããŸãããã©ã€ããŒã¯CïŒ\ Program FilesïŒx86ïŒ\ STMicroelectronics \ Software \ Virtual comportãã©ã€ããŒã«ã€ã³ã¹ããŒã«ãããŸãããå éšã«ã¯stmcdc.infãã¡ã€ã«ããããŸã-ãããå¿ èŠã§ãããã®ãã¡ã€ã«ã«ã¯2ã€ã®ã»ã¯ã·ã§ã³ãããã次ã®åœ¢åŒã®è¡ããããŸãã
%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5740
ãããã£ãŠãVID / PIDãããã€ã¹ãã©ã€ããŒã«æ¥ç¶ããŸããããã ãã§ã¯äžååã§ã-CDCãå¶åŸ¡ããã€ã³ã¿ãŒãã§ã€ã¹ã®çªå·ãæå®ããå¿ èŠããããŸããç§ã®å Žåããããæåã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ãïŒMSCãæ åœããã®ã¯ãã«ã§ãïŒããããè¡ãã«ã¯ãè¡ã¯æ¬¡ã®ããã«ãªããŸã
%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5741&MI_01
ãå®éãå ã®è¡ã¯å€æŽã§ãã
ãé©åãªã»ã¯ã·ã§ã³ã«è¡ãè¿œå ããã ãã§ãã
ãã¹ãŠã®æºåãå®äºããããããã€ã¹ã®ãªã¹ãã§åäœããŠããªãããã€ã¹ãèŠã€ããŸãããã©ã€ããŒãæŽæ°ããinfãã¡ã€ã«ãååšãããã£ã¬ã¯ããªãæå®ããŠãã ããããã©ã€ããŒãã€ã³ã¹ããŒã«ãããŸãã Windowsèªäœããã®ããã€ã¹ã«COMxxãšããååãå²ãåœãŠãŸãããæ°ã«å ¥ãã®ç«¯æ«ã䜿çšããŠããã®COMããŒããéãããšãã§ããŸãã
Linuxã䜿çšãããšããã¹ãŠãã·ã³ãã«ã«ãªããŸãã
ã«ããæŽæ°ïŒWindows10ã§ã¯ããã¹ãŠãèªåçã«èµ·åããŸããããã«ãSTèªäœã¯10kã®vcpãã©ã€ããæšå¥šããŠããŸããããæšæºã®ãã©ã€ãã䜿çšããããšãææ¡ããŠããŸãã
ãããã«
ããã€ãã®ãã©ãŒã©ã ã§ãããã®USBã§ã¯ãã¹ãŠãè€éã«ãªã£ãŠããããšãäžéšã®ãã©ã€ããŒã¯âŠä»ããç»é²ããã»ããããããšããã¡ãã»ãŒãžãèŠãŸãããã¿ããªãããã¯ããã»ã©ç°¡åã§ã¯ãããŸãããã¬ãžã¹ã¿ã¬ãã«ãããããæãç°¡åãªéšåã§ãããããããã以å€ã«ããããã€ã¹ãå®è£ ãã¹ãããžãã¯ã®å·šå€§ãªå±€ããããŸãããããŠãããã§ã¯ãããã³ã«ã®ç¥èãäœçŸããŒãžãã®ä»æ§æžã¯äžåãããŸããã
ãããããã¹ãŠãããã»ã©æªãããã§ã¯ãããŸããã人ã ã¯ãã§ã«æ³šæãæãããã¹ãŠã®ããžãã¯ãäœæããŸãããã»ãšãã©ã®å Žåãç®çã®å€ã眮ãæããŠäžéšã®ãã©ã¡ãŒã¿ãŒã調æŽããã ãã§ããã¯ããSTã®ã©ã€ãã©ãªã¯ãŸã ã¢ã³ã¹ã¿ãŒã§ããããããUSB In A Nutshellãç¹å®ã®ã¯ã©ã¹ã®ããã€ã¹ã®ããã€ãã®ä»æ§ãã¹ãããã¡ãŒãšã®é£æºãçèªããåŸãå€ãã®ãã®ãé©åã«é 眮ãããŸããã©ã€ãã©ãªã¯å€å°ãªããšãã¹ãªã ã«èŠãå§ããŸããæ¯èŒçå°ãªãåŽåã§ã«ã¹ã¿ã ã¯ã©ã¹ãã©ã€ããŒãäœæããããšãã§ããŸãããæåããŸããã
è€åCDC + MSCããã€ã¹ã®å®è£ ãè¡ããŸããããã»ãŒåãã¢ãããŒããä»ã®çµã¿åããïŒCDC + HIDãMSC +ãªãŒãã£ãªãCDC + MSC + HIDãªã©ïŒã«é©çšã§ããŸããç§ã®å®è£ ã¯STM32F103ã·ãªãŒãºã®ãã€ã¯ãã³ã³ãããŒã©ãŒã§åäœããããã«èšèšãããŠããŸãããåçèªäœã¯ä»ã®ãã€ã¯ãã³ã³ãããŒã©ãŒïŒSTM32ãå«ãïŒã«é©åãããããšãã§ããŸãã
ãã®èšäºã§ã¯ãUSBãã©ã®ããã«æ©èœãããã詳ãã説æããã¿ã¹ã¯ãèªåã§èšå®ããŸããã§ãã-ãŸãããããããäŒããèšäºãæ¬ããããŸãïŒã»ãã®å°ãã ã觊ããŸããïŒããããŠæ¬¡ã«ãå ã®ãœãŒã¹ïŒä»æ§ïŒ ã
ä»æ§ãæ¹ããŠèª¬æãã代ããã«ãSTã®USBã¹ã¿ãã¯ã®å®è£ ãã©ã®ããã«æ©èœãããã説æããããšããŸããããŸããç¹å¥ãªç¬éã«æ³šæãæã£ãŠããªããããªã®ãã説æããããšããŸããã
ç§ã¯ããã¥ãŒããªã¢ã«ãã«ãã§ãã¯ãå ¥ãããã©ããé·ãéçã£ãŠããŸãããäžæ¹ã§ãç§ã¯æšå¥šäºé ãšæ®µéçãªæ瀺ãäžããç¹å¥ãªãã€ã³ãã«æ³šæãæãããœãŒã¹ãžã®ãªã³ã¯ãäžããŸããäžæ¹ããããžã§ã¯ãã«ããŠã³ããŒãããŠåã蟌ãããã®æ¢è£œã®ã©ã€ãã©ãªãæäŸããããšã¯ã§ããŸããã
å®éãç§ã®ãããžã§ã¯ãã®äœæ¥ã®éçšã§ããã®ã©ã€ãã©ãªã®ãã¡ã€ã«ããžã°ãœãŒããºã«ãããã³ãã®ä»ã®ããŒã«ã䜿çšããŠè¯ãä»äºãããŸãããããã€ã¹ã«å¿ èŠã®ãªãã³ãŒãã倧éã«æšãŠãäžéšãå€æŽããæ°ã«å ¥ããªããã®ã修埩ããŸããã USBã©ã€ãã©ãªã¯ãST Webãµã€ãã«ãããã®ãšã¯å€§ããç°ãªããŸããå€æŽã®äžéšã¯ç§ã®ãããžã§ã¯ãã«åºæã®ãã®ã§ãããä»ã®ç¶æ³ã«ã¯é©ããªãå ŽåããããŸããããããç§ã®ãªããžããªãžãããã-å匷ãèªåãžã®ã³ããŒã質åãæ¹åã®ææ¡ã
æåŸã«ãç§ã®å®è£ ã§äœããã®åœ¢ã§ç§ãå©ããŠããããã¹ãŠã®äººã«æè¬ããããšæããŸããã¿ããªããããšãïŒ