ããã«äœãã¬ãã«ïŒAVR-VUSBïŒ
ã¬ãžã¹ã¿ã®USBïŒãã¹ã¹ãã¬ãŒãžã®äŸäœ¿çšããŠãã«ã¯ãšã³ããã€ã³ã
å²ã蟌ã¿ãšã³ããã€ã³ããHIDçšã®äŸäœ¿çšïŒã¬ãžã¹ã¿ã®USBã
ã¬ãžã¹ã¿ã«USBãïŒãªãŒãã£ãªè£ 眮ã®äŸã䜿çšããŠã¢ã€ãœã¯ããã¹ãšã³ããã€ã³ãã
æã ã¯ãã§ã«äœ¿çšããŠãœãããŠã§ã¢USBãæºãããŠããŸãAVRã®äŸã§ã¯ãããéãç³ïŒstm32ïŒã«æéãããããŸããç§ãã¡ã®å®éšå¯Ÿè±¡ã¯ãå€å žçãªSTM32F103C8T6ãšãäœé»åSTM32L151RCT6ã·ãªãŒãºã®ä»£è¡šã§ãã以åãšåæ§ã«ãè³Œå ¥ãããããã°ããŒããšHALã¯äœ¿çšãããèªè»¢è»ãåªå ããŸãã
ã¿ã€ãã«ã«ã¯2ã€ã®ã³ã³ãããŒã©ãŒãããã®ã§ãäž»ãªéãã«ã€ããŠèª¬æãã䟡å€ããããŸãããŸã第äžã«ãããã¯äœããããã«ã¹ã¿ãã¯ããŠããããšãUSBãã¹ãã«äŒãããã«ã¢ããæµæã§ãã L151ã§ã¯çµã¿èŸŒã¿ã§SYSCFG_PMC_USB_PUãããã«ãã£ãŠå¶åŸ¡ãããŸãããF103ã§ã¯ããã§ã¯ãããŸãããå€éšããããŒãã«ã¯ãã ä»ãããVCCãŸãã¯ã³ã³ãããŒã©ãŒã¬ãã°ã«æ¥ç¶ããå¿ èŠããããŸããç§ã®å ŽåãPA10ã®èãç§ã®è ã®äžã«æ¥ãŸããã UART1ãã¶ãäžãã£ãŠãããšãã...ãããŠUART1ã®ããäžæ¹ã®ãã³ããã¿ã³ãšè¡çªããŠããŸã...ç§ã¯çŽ æŽãããããŒããæããŸãããã 2ã€ç®ã®éãã¯ããã©ãã·ã¥ã¡ã¢ãªã®éã§ããF103ã§ã¯64 kBãL151ã§ã¯256 kBã§ããããã«ã¯ãšã³ããã€ã³ãã調æ»ãããšãã«ãã€ã䜿çšããŸãããŸããã¯ãããã³ã°èšå®ããããã«ç°ãªãããã¿ã³ä»ãã®é»çã§ããŸããŸãªèã«æããããšãã§ããŸããããããã¯ãã§ã«éåžžã«äºçŽ°ãªããšã§ãã F103ã®äŸã¯ãªããžããªã§å©çšã§ãããããæ®ãã®å®éšãL151ã«é©åããã ããšã¯é£ãããããŸããããœãŒã¹ã³ãŒãã¯ãã¡ãããå ¥æã§ããŸãïŒ github.com/COKPOWEHEU/usb
USBã§ã®äœæ¥ã®äžè¬åå
ãã®ã³ã³ãããŒã©ãŒã§ã®USBã§ã®æäœã¯ãããŒããŠã§ã¢ã¢ãžã¥ãŒã«ã䜿çšããŠæ³å®ãããŠããŸããã€ãŸããç§ãã¡ã¯åœŒã«äœããã¹ãããäŒãã圌ã¯ããããæåŸã«ãç§ã¯æºåãã§ããŠããŸãïŒãå²ã蟌ã¿ãåŒãåºããŸãããããã£ãŠãã¡ã€ã³ã¡ã€ã³ããã»ãšãã©äœãåŒã³åºãå¿ èŠã¯ãããŸããïŒå¿µã®ããã«usb_class_pollé¢æ°ãæäŸããŸãããïŒãéåžžã®äœæ¥ãµã€ã¯ã«ã¯ãããŒã¿ã®äº€æãšãã1ã€ã®ã€ãã³ãã«éå®ãããŸããæ®ãïŒãªã»ãããã¹ãªãŒããªã©ïŒã¯ãäŸå€çãª1åéãã®ã€ãã³ãã§ãã
ä»åã¯ã亀æã®äœã¬ãã«ã®è©³çŽ°ã«ã€ããŠã¯èª¬æããŸãããèå³ã®ãã人ã¯èª°ã§ãvusbã«ã€ããŠèªãããšãã§ããŸãããã ããéåžžã®ããŒã¿ã®äº€æã¯1ãã€ãã§ã¯ãªããã±ããã§è¡ãããéä¿¡æ¹åã¯ãã¹ãã«ãã£ãŠèšå®ãããŸãããŸãããããã®æ¹åã®ååãæ瀺ããŸããINéä¿¡ã¯ããã¹ããããŒã¿ãåä¿¡ããïŒãããŠããã€ã¹ãéä¿¡ããïŒããšãæå³ããOUTã¯ããã¹ããããŒã¿ãéä¿¡ããïŒãããŠç§ãã¡ãåä¿¡ããïŒããšãæå³ããŸããããã«ãåãã±ããã«ã¯ç¬èªã®ã¢ãã¬ã¹ïŒãã¹ããéä¿¡ãããšã³ããã€ã³ãã®çªå·ïŒããããŸããä»ã®ãšãããããã€ã¹å šäœãæ åœããåäžã®ãšã³ããã€ã³ã0ããããŸãïŒç°¡æœã«ããããã«ãep0ãšãåŒã³ãŸãïŒãæ®ãã¯äœã®ããã«ããã®ããç§ã¯ä»ã®èšäºã§ããªãã«è©±ããŸããæšæºã«ãããšãep0ã®ãµã€ãºã¯äœéããã€ã¹ïŒåãvusbãå±ããïŒã®å Žåã¯å³å¯ã«8ãã€ãã§ããã8ã16ã32ãç§ãã¡ã®ãããªãã«ã¹ããŒãã®64ãã€ãã
ããŒã¿ãå°ããããŠãããã¡ãå®å šã«ãã£ã±ãã«ãªããªãå Žåã¯ã©ããªããŸããïŒããã§ã¯ãã¹ãŠãåçŽã§ãããã±ããå ã®ããŒã¿ã«å ããŠããããã®ãµã€ãºãéä¿¡ãããŸãïŒããã¯ãéä¿¡ã®çµäºã瀺ãwLengthãã£ãŒã«ããŸãã¯SE0ä¿¡å·ã®äœã¬ãã«ã®çµã¿åããã§ããå¯èœæ§ããããŸãïŒããããã£ãŠã転éããå¿ èŠãããå Žåã§ã64ãã€ãã®ep0ãŸã§ã®3ãã€ãã®å Žåãæ£ç¢ºã«3ãã€ãã転éãããŸã...ãã®çµæãäžèŠãªãŒããé§åããããšã«ãã£ãŠåž¯åå¹ ã浪費ããããšã¯ãããŸããããããã£ãŠãå°ããããªãã§ãã ããã64ãã€ããè²»ããäœè£ãããã°ãããããããšãªãè²»ãããŸããç¹ã«ãããã«ãããã¹ã®è² è·ããããã軜æžãããŸããããã¯ã64ãã€ãïŒããã³ãã¹ãŠã®ããããŒãšããŒã«ïŒããããã8ãã€ãïŒããããã«ããããŒãšããŒã«ïŒã®8åãããäžåºŠã«è»¢éããæ¹ãç°¡åã ããã§ãã ïŒã
ããã©ããããããŒã¿ãå€ãããå Žåã¯ã©ãã§ãããããããã§ã¯ãã£ãšè€éã§ããããŒã¿ã¯ãšã³ããã€ã³ãã®ãµã€ãºã§åå²ãããã£ã³ã¯ã§è»¢éããå¿ èŠããããŸãã ep0ã®ãµã€ãºã8ãã€ãã§ããã¹ãã20ãã€ããéä¿¡ããããšããŠãããšããŸããæåã®å²ã蟌ã¿ã§ããã€ã0ã7ãã2çªç®ã®8ã15ã§ã3çªç®ã®16ã20ã§ç§ãã¡ã«å±ããŸããã€ãŸããããã±ãŒãžå šäœãåéããã«ã¯ãæ倧3ã€ã®å²ã蟌ã¿ãåãåãå¿ èŠããããŸãããã®ããã«ãåãHALã§ããªãããŒãªãããã¡ãŒãçºæããããããç解ããããšããŸããããé¢æ°éã§åããã®ã転éãã第4ã¬ãã«ã®åŸãç§ã¯åŸãåããŸããããã®çµæãç§ã®å®è£ ã§ã¯ããããã¡ãªã³ã°ã¯ããã°ã©ããŒã®è©ã«ããã£ãŠããŸãã
ãã ãããã¹ãã¯å°ãªããšãåžžã«ã転éããããšããŠããããŒã¿ã®éã瀺ããŸããããŒã¿ã転éãããšãã¯ãããŒã¿ãçµäºããããšãæ確ã«ããããã«ãäœããã®æ¹æ³ã§ã¬ãã°ã®äœã¬ãã«ã®ç¶æ ãã ãŸãå¿ èŠããããŸããããæ£ç¢ºã«ã¯ãããŒã¿ãçµäºããŠããããšãšãèãåŒã£åŒµãå¿ èŠãããããšãUSBã¢ãžã¥ãŒã«ã«æ確ã«ããããã§ããããã¯æãããªæ¹æ³ã§è¡ãããŸã-ãããã¡ã®äžéšã®ã¿ãæžã蟌ãããšã«ãã£ãŠãããšãã°ããããã¡ã«8ãã€ããããã4ãæžã蟌ãã å Žåãæããã«4ãã€ãã®ããŒã¿ãããããŸããããã®åŸãã¢ãžã¥ãŒã«ã¯éæ³ã®çµã¿åããSE0ãéä¿¡ãã誰ããæºè¶³ããŸãããããŠã8ãã€ããæžã蟌ãã å Žåãããã¯8ãã€ããããªãããšãæå³ããŸããããããšãããã¯ãããã¡ãŒã«åãŸãããŒã¿ã®äžéšã«ãããªãããšãæå³ããŸããïŒ USBã¢ãžã¥ãŒã«ã¯ãããèããŠããŸãããããã£ãŠã転éãåæ¢ãããå Žåã¯ã8ãã€ãã®ãããã¡ãæžã蟌ãã åŸã次ã®0ãã€ãã®ãããã¡ãæžã蟌ãå¿ èŠããããŸããããã¯ãZLPããŒãé·ãã±ãããšåŒã°ããŸããã³ãŒãã§ã©ã®ããã«èŠããããå°ãåŸã§ã話ãããŸãã
èšæ¶ã®æ§æ
æšæºã«ããã°ããšã³ããã€ã³ã0ã®ãµã€ãºã¯æ倧64ãã€ãã§ãããã®ä»ã®ãµã€ãº-æ倧1024ãã€ãããã€ã³ãã®æ°ãããã€ã¹ããšã«ç°ãªãå ŽåããããŸããåãSTM32L1ã¯ãå ¥åã§æ倧7ãã€ã³ããåºåã§æ倧7ãã€ã³ãïŒep0ãã«ãŠã³ãããªãïŒãã€ãŸãæ倧14kBã®ãããã¡ãŒã®ã¿ããµããŒãããŸãããã®ãããªããªã¥ãŒã ã§ã¯ã誰ããå¿ èŠã«ãªãããšã¯ã»ãšãã©ãªãã§ãããã蚱容ã§ããªãã¡ã¢ãªã®æ¶è²»ïŒä»£ããã«ãusbã¢ãžã¥ãŒã«ã¯å ±æã«ãŒãã«ã¡ã¢ãªã®ãã£ã³ã¯ãåãèœãšããããã䜿çšããŸãããã®é åã¯PMAïŒãã±ããã¡ã¢ãªé åïŒãšåŒã°ããUSB_PMAADDRã§å§ãŸããŸãããŸããåãšã³ããã€ã³ãã®ãããã¡ãŒããã®å éšã®ã©ãã«ãããã瀺ãããã«ããããã次ã®æ§é ãæã€8ã€ã®èŠçŽ ã®é åãæåã«å²ãåœãŠããã次ã«ããŒã¿ã®å®éã®é åãå²ãåœãŠãããŸãã
typedef struct{
volatile uint32_t usb_tx_addr;
volatile uint32_t usb_tx_count;
volatile uint32_t usb_rx_addr;
volatile union{
uint32_t usb_rx_count;
struct{
uint32_t rx_count:10;
uint32_t rx_num_blocks:5;
uint32_t rx_blocksize:1;
};
};
}usb_epdata_t;
ããã§ã¯ãéä¿¡ãããã¡ã®å é ãšãã®ãµã€ãºãèšå®ãã次ã«åä¿¡ãããã¡ã®å é ãšãã®ãµã€ãºãèšå®ããŸãããŸããusb_tx_countã¯å®éã®ãããã¡ãµã€ãºã§ã¯ãªãã転éããããŒã¿ã®éãèšå®ããããšã«æ³šæããŠãã ãããã€ãŸããã³ãŒãã¯ã¢ãã¬ã¹usb_tx_addrã«ããŒã¿ãæžã蟌ã¿ã次ã«ãã®ãµã€ãºãusb_tx_countã«æžã蟌ã¿ãããŒã¿ãæžã蟌ãŸããUSBã¢ãžã¥ãŒã«ã¬ãžã¹ã¿ããã«ããŠè»¢éããå¿ èŠããããŸããåä¿¡ãããã¡ãµã€ãºã®å¥åŠãªåœ¢åŒã«ããã«æ³šæãæã£ãŠãã ãããããã¯ã10 rx_countããããå®éã«èªã¿åãããããŒã¿éãæ åœããæ®ãã¯å®éã«ã¯ãããã¡ãµã€ãºãæ åœããæ§é ã§ããããªããæžãããšãã§ããå ŽæããããŠä»ã®äººã®ããŒã¿ãã©ãããå§ãŸãã®ããç¥ãå¿ èŠããããŸãããã®èšå®ã®åœ¢åŒãéåžžã«èå³æ·±ããã®ã§ããrx_block_sizeãã©ã°ã¯ããµã€ãºãèšå®ãããŠããåäœã瀺ããŸãã 0ã«ãªã»ãããããå Žåã次ã«ã2ãã€ãã¯ãŒãã§ã¯ããããã¡ãµã€ãºã¯2 * rx_num_blocksãã€ãŸã0ãã62ã§ãã1ã«èšå®ãããšããããã32ãã€ããããã¯ã§ããããã¡ãµã€ãºã¯32 * rx_num_blocksã«ãªããŸãããããŠã32ãã512ã®ç¯å²ã«ãããŸãïŒã¯ãã1024ãŸã§ã§ã¯ãããŸããããããã³ã³ãããŒã©ãŒã®å¶éã§ãïŒã
ãã®é åã«ãããã¡ãé 眮ããã«ã¯ãã»ããã€ãããã¯ã¢ãããŒãã䜿çšããŸããã€ãŸããã¡ã¢ãªããªã³ããã³ãã§å²ãåœãŠãŸãããããã解æŸããŸããïŒmalloc / freeã¯ãŸã çºæããã®ã«ååã§ã¯ãããŸããã§ããïŒïŒãå²ãåœãŠãããŠããªãã¹ããŒã¹ã®å é ã¯ãå€æ°lastaddrã«ãã£ãŠç€ºãããŸãããã®å€æ°ã¯ãæåã¯PMAã®å é ãããäžèšã§èª¬æããæ§é ã®ããŒãã«ãåŒãããã®ãæããŸãã次ã®ãšã³ããã€ã³ãusb_ep_initïŒïŒãæ§æããé¢æ°ãåŒã³åºããããã³ã«ãããã§æå®ããããããã¡ãŒãµã€ãºã ãã·ãããããŸãããã¡ãããå¿ èŠãªå€ã¯ããŒãã«ã®å¯Ÿå¿ããã»ã«ã«å ¥åãããŸãããã®å€æ°ã®å€ã¯ããªã»ããã€ãã³ãã®åŸã«ãªã»ãããããç¶ããŠusb_class_initïŒïŒãåŒã³åºãããŸãããã®åŒã³åºãã§ã¯ããŠãŒã¶ãŒã®ã¿ã¹ã¯ã«åŸã£ãŠãã€ã³ããåæ§æãããŸãã
éåä¿¡ã¬ãžã¹ã¿ã®æäœ
ãã£ãèšã£ãããã«ãåä¿¡æã«å®éã«åä¿¡ããããŒã¿ã®éïŒusb_rx_countãã£ãŒã«ãïŒãèªã¿åãã次ã«ããŒã¿èªäœãèªã¿åãã次ã«usbã¢ãžã¥ãŒã«ããã«ããŠãããã¡ãŒã解æŸãã次ã®ãã±ãããåä¿¡ã§ããããã«ããŸããéä¿¡ã®å Žåã¯ããã®éã§ããããŒã¿ããããã¡ãŒã«æžã蟌ã¿ã次ã«usb_tx_countã«æžã蟌ãŸããéãèšå®ããæåŸã«ã¢ãžã¥ãŒã«ããã«ããŠãããã¡ãŒããã£ã±ãã«ãªãããã«ããŸããããã転éã§ããŸãã
æåã®çæãããã¡ãŒèªäœãæäœãããšãã«éå§ããŸãããããã¡ãŒã¯ãã³ã³ãããŒã©ãŒã®ä»ã®éšåã®ããã«32ãããã§æ§æãããŠããããäºæ³ã©ãã8ãããã§æ§æãããŠããŸããããããŠãããã16ãããïŒãã®çµæã4ãã€ãã«åãããŠ2ãã€ãã§èªã¿æžããããŸãããã®ãããªåé¯ãããŠãããŠããããšãSTïŒããããªããã°ããªããŠã€ãŸããªã人çã§ãããïŒä»ã§ã¯æ®éã®memcpyãäžå¯æ¬ ãªã®ã§ãç¹å¥ãªæ©èœããã§ã³ã¹ããå¿ èŠããããŸããã¡ãªã¿ã«ãDMAã奜ããªäººãªãããã¹ãã¯ããŠããŸããããããã ãã§ãã®ãããªå€æãã§ããããã§ãã
ãã㊠2çªç®ã®çæã¢ãžã¥ãŒã«ã®ã¬ãžã¹ã¿ã«æžã蟌ã¿ãŸããå®éã®ãšãããåãšã³ããã€ã³ãã®æ§æïŒã¿ã€ãïŒå¶åŸ¡ããã«ã¯ãªã©ïŒãšç¶æ ïŒã«ã€ããŠã¯ã1ã€ã®ã¬ãžã¹ã¿USB_EPnRã責任ãè² ããŸããã€ãŸããå°ãå€æŽããããšã¯ã§ããã泚æããå¿ èŠããããŸããæ®ããå°ç¡ãã«ããªãããã«ããããŠç¬¬äºã«ããã®ã¬ãžã¹ã¿ã«ã¯ãã§ã«4çš®é¡ã®ãããããããŸãïŒäžéšã¯èªã¿åãå°çšïŒããã¯çŽ æŽãããïŒããã®ä»ã¯èªã¿åããšæžã蟌ã¿ïŒãããéåžžïŒããã®ä»ã¯ã¬ã³ãŒã0ãç¡èŠããŸããã1ãæžã蟌ããšãç¶æ ãå察ã«å€æŽããïŒæ¥œãã¿ãå§ãŸããŸãïŒã4çªç®ã¯éã«ãã¬ã³ãŒã1ãç¡èŠããŸãããã¬ã³ãŒã0ã¯ãããã0ã«ãªã»ããããŸããããããã³ãŒããšããŒããŠã§ã¢ã®äž¡æ¹ããã¢ã¯ã»ã¹ããããšãã«ãã¬ãžã¹ã¿ã®æŽåæ§ãç¶æããããã«ãããè¡ããããšæ³å®ããæºåãã§ããŠããŸããããããããªãã¯äœã欲ããã§ããã1ãæžã蟌ãããšã«ãã£ãŠãããããªã»ãããããããã«ã€ã³ããŒã¿ãŒãé 眮ããã®ã¯é¢åã§ãããïŒãŸãã¯ã0ãæžã蟌ãããšã«ãã£ãŠä»ã®ããããå転ãããããã«ã€ã³ããŒã¿ãŒã䜿çšããŸããïŒãã®çµæã2ã€ã®ã¬ãžã¹ã¿ããããèšå®ãããšã次ã®ããã«ãªããŸãïŒãã®ãããªåé¯ã«ã€ããŠã¯STã«å床æè¬ããŸãïŒã
#define ENDP_STAT_RX(num, stat) do{USB_EPx(num) = ((USB_EPx(num) & ~(USB_EP_DTOG_RX | USB_EP_DTOG_TX | USB_EPTX_STAT)) | USB_EP_CTR_RX | USB_EP_CTR_TX) ^ stat; }while(0)
ãããããç§ã¯ã»ãšãã©å¿ããŠããŸããã圌ãã¯çªå·ã§ã¬ãžã¹ã¿ãŒã«ã¢ã¯ã»ã¹ããããšãã§ããŸãããã€ãŸãããã¯ãUSB_EP0RãUSB_EP1Rãªã©ã§ãã圌ãã¯æã£ãŠããŸãããæ°ãå€æ°ã«å ¥ã£ãå Žåãæ²ããããªãç§ã¯èªåã®USB_EPxïŒïŒãçºæããªããã°ãªããŸããã§ãã-ãããŠäœããã¹ããã
ããŠãæç¶ãã«æºæ ããããã«ãæºåãã©ã°ïŒã€ãŸããåã®ããŒã¿ããã§ã«èªã¿åã£ãããšïŒãUSB_EP_RX_VALIDããããã¹ã¯ã«ãã£ãŠèšå®ãããæžã蟌ã¿çšïŒã€ãŸããããŒã¿ãæžã蟌ã¿ãŸããïŒã§ããããšãææããŸãããã«ã§è»¢éå¯èœïŒ-USB_EP_TX_VALIDãã¹ã¯ã«ããã
INããã³OUTãªã¯ãšã¹ãã®åŠç
USBå²ã蟌ã¿ã®çºçã¯ããŸããŸãªããšã瀺ãå¯èœæ§ããããŸãããããã§ã¯éä¿¡èŠæ±ã«çŠç¹ãåœãŠãŸãããã®ãããªã€ãã³ãã®ãã©ã°ã¯ãUSB_ISTR_CTRãããã«ãªããŸãããããèŠãã°ããã¹ããã©ã®ãã€ã³ããšéä¿¡ãããããç解ã§ããŸãããã€ã³ãçªå·ã¯USB_ISTR_EP_IDããããã¹ã¯ã®äžã«é ãããŠãããINãŸãã¯OUTæ¹åã¯ããããUSB_EP_CTR_TXããããšUSB_EP_CTR_RXãããã®äžã«é ãããŠããŸãã
å€ãã®ãã€ã³ããæã€ããšãã§ããããããã«ç¬èªã®åŠçã¢ã«ãŽãªãºã ãããããã察å¿ããã€ãã³ãã§åŒã³åºããããããããã¹ãŠã®ã³ãŒã«ããã¯é¢æ°ãäœæããŸããããšãã°ããã¹ãããšã³ããã€ã³ã3ã«ããŒã¿ãéä¿¡ããUSB-> ISTRãèªã¿åããããããèŠæ±ãOUTã§ããããã€ã³ãçªå·ã3ã§ããããšãåŒãåºããŸãããããã£ãŠãepfunc_out [3]ïŒ3ïŒãåŒã³åºããŸããæ¬åŒ§å ã®ãã€ã³ãçªå·ã¯ããŠãŒã¶ãŒã³ãŒããçªç¶è€æ°ã®ãã€ã³ãã§1ã€ã®ãã³ãã©ãŒããã³ã°ããããå Žåã«éä¿¡ãããŸãããããããUSBèŠæ Œã§ããINå ¥åãã€ã³ããã³ãã¯ä»ãã®7çªç®ã®ãããã§ããŒã¯ããã®ãéäŸã§ããã€ãŸããåºåã®endpoint3ã®çªå·ã¯0x03ã«ãªããå ¥åã®ãšã³ããã€ã³ã3ã¯-0x83ã«ãªããŸãããŸãããããã¯ç°ãªãç¹ã§ãããåæã«äœ¿çšããããšãã§ããäºãã«å¹²æžããŸããããŸããã»ãšãã©ïŒstm32ã§ã¯ãåä¿¡ãšéä¿¡ã®äž¡æ¹ã®ã¿ã€ãïŒãã«ã¯ãå²ã蟌ã¿ãªã©ïŒã®èšå®ããããŸãããããã£ãŠãåã0x83çªç®ã®INãã€ã³ããã³ãŒã«ããã¯ã«äžèŽããŸã 'epfunc_in [3]ïŒ3 | 0x80ïŒã§ã
åãååãep0ã«ãåœãŠã¯ãŸããŸããå¯äžã®éãã¯ããã®åŠçããŠãŒã¶ãŒã³ãŒãå ã§ã¯ãªããã©ã€ãã©ãªå ã§è¡ãããããšã§ããããããHIDã®ãããªç¹å®ã®ãªã¯ãšã¹ããåŠçããå¿ èŠãããå Žåã¯ã©ããªããŸããïŒã©ã€ãã©ãªã³ãŒããããããéžæããªãã§ãã ããããã®ããã«ãç¹å¥ãªã³ãŒã«ããã¯usb_class_ep0_outãšusb_class_ep0_inããããŸãããããã¯ç¹å¥ãªå Žæã§åŒã³åºãããç¹å¥ãªåœ¢åŒãæã£ãŠããŸããããã«ã€ããŠã¯ãæåŸã«è©³ãã説æããŸãã
ãã±ããåŠçå²ã蟌ã¿ã®çºçã«é¢é£ãããã1ã€ã®ããŸãæçœã§ã¯ãªãç¹ã«ã€ããŠèšåãã䟡å€ããããŸãã OUTãªã¯ãšã¹ãã䜿çšãããšããã¹ãŠãç°¡åã«ãªããŸããããŒã¿ãå±ããŸããããã ããINå²ã蟌ã¿ã¯ããã¹ããINèŠæ±ãéä¿¡ãããšãã§ã¯ãªããéä¿¡ãããã¡ã空ã®ãšãã«çæãããŸããã€ãŸããååãšããŠããã®å²ã蟌ã¿ã¯UARTãããã¡ã¢ã³ããŒã©ã³å²ã蟌ã¿ã«äŒŒãŠããŸãããããã£ãŠãäœãããã¹ãã«è»¢éããå Žåã¯ãããŒã¿ã転éãããã¡ãŒã«æžã蟌ã¿ãINå²ã蟌ã¿ãåŸ ã£ãŠãé©åããªããã®ãè¿œå ããã ãã§ãïŒZLPãå¿ããªãã§ãã ããïŒããããŠããéåžžã®ããšã³ããã€ã³ãã§ãã£ãŠããããã°ã©ããŒã«ãã£ãŠå¶åŸ¡ãããŸããä»ã®ãšããç¡èŠããŠããŸããŸãããããããep0ãéããŠã亀æã¯åžžã«è¡ãããŠããŸãããããã£ãŠãããã䜿çšããäœæ¥ã¯ã©ã€ãã©ãªã«çµã¿èŸŒãŸããŠããå¿ èŠããããŸãã
çµæãšããŠã転éã®éå§ã¯ep0_sendé¢æ°ã«ãã£ãŠå®è¡ãããŸãããã®é¢æ°ã¯ããããã¡ãŒã®éå§ã®ã¢ãã¬ã¹ãšè»¢éããããŒã¿ã®éãã°ããŒãã«å€æ°ã«æžã蟌ã¿ãŸãããã®åŸãããèªäœãINã€ãã³ãããã«ããŸããåããŠãã³ãã©ãŒãå°æ¥çã«ã¯ããã®ãã³ãã©ãŒã¯ããŒããŠã§ã¢ã€ãã³ãã§åŒã³åºãããŸãããããã§ãããã·ã¥ããå¿ èŠããããŸãã
ãã³ãã©ãŒèªäœã¯éåžžã«åçŽã§ãã次ã®ããŒã¿ã転éãããã¡ãŒã«æžã蟌ã¿ããããã¡ãŒã®å é ã®ã¢ãã¬ã¹ãã·ããããŠã転éçšã«æ®ã£ãŠãããã€ãæ°ãæžãããŸããå¥ã®æŸèæãåãZLPã«é¢é£ä»ããããŠããã空ã®ãã±ããã§äžéšã®èŠæ±ã«å¿çããå¿ èŠããããŸãããã®å Žåã転éã®çµäºã¯ãããŒã¿ã¢ãã¬ã¹ãNULLã«ãªã£ããšããäºå®ã«ãã£ãŠç€ºãããŸãããããŠã空ã®ãã±ãã-ããã¯ZLPPå®æ°ã«çããããšããµã€ãºããŒãã«çãããšãã«äž¡æ¹ãçºçãããããå®éã®èšé²ã¯çºçããŸããã
ä»ã®ãšã³ããã€ã³ããæäœããå Žåã¯ãåæ§ã®ã¢ã«ãŽãªãºã ãå®è£ ããå¿ èŠããããŸããããããããã¯ãŠãŒã¶ãŒã®é¢å¿äºã§ãããŸããäœæ¥ã®ããžãã¯ã¯ep0ã§ã®äœæ¥ãšã¯ç°ãªãããšãå€ããããã©ã€ãã©ãªã¬ãã«ã§ãããã¡ãªã³ã°ããããããã®ãªãã·ã§ã³ã®æ¹ã䟿å©ãªå ŽåããããŸãã
USBéä¿¡ããžãã¯
ãã¹ãã¯ãããŒã¿ã©ã€ã³ãšé»æºã®éã«ãã«ã¢ããæµæãååšããããšã«ãããæ¥ç¶ã®äºå®ãã®ãã®ãå€æããŸãã圌ã¯ããã€ã¹ããªã»ãããããã¹äžã®ã¢ãã¬ã¹ãå²ãåœãŠãŠãäœãããã€ã¹ã«ã¹ã¿ãã¯ããŠããããæ£ç¢ºã«å€å¥ããããšããŸãããããè¡ãããã«ãããã€ã¹ãšæ§æèšè¿°åïŒããã³å¿ èŠã«å¿ããŠç¹å®ã®èšè¿°åïŒãèªã¿åããŸãããŸããæååèšè¿°åãèªã¿åã£ãŠãããã€ã¹ãããèªäœãåŒã³åºããã®ãç解ããããšãã§ããŸãïŒãã ããVIDïŒPIDã®ãã¢ã«ç²ŸéããŠããå Žåã¯ãããŒã¿ããŒã¹ããè¡ãååŸããããšããå§ãããŸãïŒããã®åŸããã¹ãã¯é©åãªãã©ã€ããŒãããŒãããç解ã§ããèšèªã§ããã€ã¹ãæäœã§ããŸããç解ã§ããèšèªã«ã¯ãç¹å®ã®ã€ã³ã¿ãŒãã§ãŒã¹ãšãšã³ããã€ã³ããžã®ç¹å®ã®èŠæ±ãšåŒã³åºããå«ãŸããŸããããã«ã€ããŠã説æããŸãããæåã«ãå°ãªããšãã·ã¹ãã ã«ããã€ã¹ã衚瀺ããå¿ èŠããããŸãã
SETUPãªã¯ãšã¹ãã®åŠçïŒDeviceDescriptor
USBãå°ãã§ãããã£ãããšããã人ã¯ãé·ãéèŠæããŠããã¯ãã§ããCOKPOWEHEUãINãšOUTã®èŠæ±ã«ã€ããŠè©±ããŠããã®ã§ãããSETUPãæšæºã§è©³ãã説æãããŠããŸããã¯ããããã§ãããããã¯äžçš®ã®OUTãªã¯ãšã¹ãã§ãããç¹å¥ã«æ§é åããããšã³ããã€ã³ã0å°çšã«æå³ãããŠããŸãããã®æ§é ãšäœæ¥ã®æ©èœã«ã€ããŠèª¬æããŸãããã
æ§é èªäœã¯æ¬¡ã®ããã«ãªããŸãã
typedef struct{
uint8_t bmRequestType;
uint8_t bRequest;
uint16_t wValue;
uint16_t wIndex;
uint16_t wLength;
}config_pack_t;
ãã®æ§é ã®åéã¯å€ãã®æ å ±æºã§æ€èšãããŠããŸãããããã§ãæãåºãããŠããã ããŸãã
bmRequestTypeã¯ããããã¹ã¯ã§ããããã®ãããã¯æ¬¡ã®ããšãæå³ããŸã
ã7ïŒéä¿¡æ¹åã 0-ãã¹ãããããã€ã¹ãžã1-ããã€ã¹ãããã¹ããžãå®éãããã¯æ¬¡ã®éä¿¡ã®ã¿ã€ããOUTãŸãã¯INã§ãã
6-5ïŒãªã¯ãšã¹ãã¯ã©ã¹
0x00ïŒUSB_REQ_STANDARDïŒ-æšæºïŒä»ã®ãšããã®ã¿åŠçããŸãïŒ
0x20ïŒUSB_REQ_CLASSïŒ-ã¯ã©ã¹åºæïŒ æ¬¡ã®èšäºã§èª¬æããŸãïŒ
0x40ïŒUSB_REQ_VENDORïŒ-ã¡ãŒã«ãŒåºæïŒãããã«è§Šããå¿ èŠããªãããšãé¡ã£ãŠããŸãïŒ
4-0ïŒå¯Ÿè©±è
0x00ïŒUSB_REQ_DEVICEïŒ-ããã€ã¹å šäœ
0x01ïŒUSB_REQ_INTERFACEïŒ-åå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹
0x02ïŒUSB_REQ_ENDPOINTïŒ
-bRequestãšã³ããã€ã³ã
-wValueãªã¯ãšã¹ã èªäœ-å°ããª16ãããããŒã¿ãã£ãŒã«ããåçŽãªãªã¯ãšã¹ãã®å Žåã¯ãæ¬æ Œçãªè»¢éãè¡ããªãããã«ããŸãã
wIndexã¯åä¿¡è ã®çªå·ã§ããããšãã°ããã¹ããéä¿¡ãããã€ã³ã¿ãŒãã§ãŒã¹ã
wLength-16ãããã®wValueã§ã¯äžååãªå Žåã®è¿œå ããŒã¿ã®ãµã€ãºã
ãŸããããã€ã¹ãæ¥ç¶ãããšãã«ããã¹ãã¯ããã€ã¹ã«äœãè©°ãŸã£ãŠããã®ããæ£ç¢ºã«èŠã€ããããšããŸãããããè¡ãããã«ã次ã®ããŒã¿ãå«ãèŠæ±ãéä¿¡ããŸãïŒ
bmRequestType = 0x80ïŒèªã¿åãèŠæ±ïŒ+ USB_REQ_STANDARDïŒæšæºïŒ+ USB_REQ_DEVICEïŒããã€ã¹å šäœã«ïŒ
bRequest = 0x06ïŒGET_DESCRIPTORïŒ-èšè¿°åèŠæ±
wValue = 0x0100ïŒDEVICE_DESCRIPTORïŒ-ããã€ã¹èšè¿°åå šäœ
wIndex = 0-æªäœ¿çš
wLength = 0-è¿œå ããŒã¿ãªã
次ã«ãããã€ã¹ãåçãéä¿¡ããINèŠæ±ãéä¿¡ããŸããèŠããŠããããã«ããã¹ãããã®INèŠæ±ãšã³ã³ãããŒã©ãŒå²ã蟌ã¿ã¯ççµåã§ãããããå¿çãep0ãã©ã³ââã¹ããã¿ãŒãããã¡ãŒã«ããã«æžã蟌ã¿ãŸããçè«çã«ã¯ããã®èšè¿°åããã³ä»ã®ãã¹ãŠã®èšè¿°åããã®ããŒã¿ã¯ç¹å®ã®ããã€ã¹ã«é¢é£ä»ããããŠãããããã©ã€ãã©ãªã®ã³ã¢ã«é 眮ããããšã¯æå³ããããŸããã察å¿ãããªã¯ãšã¹ãã¯usb_class_get_std_descré¢æ°ã«æž¡ãããŸãããã®é¢æ°ã¯ãããŒã¿ã®å é ãšãã®ãµã€ãºãžã®ãã€ã³ã¿ãŒãã«ãŒãã«ã«è¿ããŸããéèŠãªã®ã¯ãäžéšã®èšè¿°åã¯å¯å€ãµã€ãºã§ããå¯èœæ§ããããšããããšã§ããããããDEVICE_DESCRIPTORã¯ãããã®1ã€ã§ã¯ãããŸããããã®ãµã€ãºãšæ§é ã¯æšæºåãããŠããã次ã®ããã«ãªããŸãã
uint8_t bLength; //
uint8_t bDescriptorType; // . USB_DESCR_DEVICE (0x01)
uint16_t bcdUSB; // 0x0110 usb-1.1, 0x0200 2.0.
uint8_t bDeviceClass; //
uint8_t bDeviceSubClass; //
uint8_t bDeviceProtocol; //
uint8_t bMaxPacketSize0; // ep0
uint16_t idVendor; // VID
uint16_t idProduct; // PID
uint16_t bcdDevice_Ver; // BCD-
uint8_t iManufacturer; //
uint8_t iProduct; //
uint8_t iSerialNumber; //
uint8_t bNumConfigurations; // ( 1)
ãŸããæåã®2ã€ã®ãã£ãŒã«ãïŒèšè¿°åã®ãµã€ãºãšãã®ã¿ã€ãïŒã«æ³šæããŠãã ããããããã¯ã»ãšãã©ãã¹ãŠã®USBèšè¿°åã«å žåçã§ãïŒããããHIDãé€ãïŒãããã«ãbDescriptorTypeãå®æ°ã®å ŽåãbLengthã¯èšè¿°åããšã«ã»ãŒæåã§ã«ãŠã³ãããå¿ èŠããããŸããããæç¹ã§ãç§ã¯ããã«é£œããŠããã¯ããæžãããŸãã
#define ARRLEN1(ign, x...) (1+sizeof((uint8_t[]){x})), x
æž¡ãããåŒæ°ã®ãµã€ãºãèšç®ããæåã®åŒæ°ã®ä»£ããã«çœ®ãæã ãŸããå®éã«ã¯ãèšè¿°åããã¹ããããŠããå ŽåããããŸããããšãã°ã1ã€ã¯æåã®ãã€ãã«ããã1ã€ã¯3ãš4ïŒ16ãããã®æ°å€ïŒã«ã3ã€ç®ã¯6ãš7ïŒ16ãããã®æ°å€ïŒã«ãµã€ãºãå¿ èŠã§ãã ããã¯ãã¯åŒæ°ã®æ£ç¢ºãªå€ãæ°ã«ããŸããããå°ãªããšãæ°ã¯åãã§ããå¿ èŠããããŸããå®éã«ã¯ã1ã3ã4ãããã³6ãã€ããš7ãã€ãã®çœ®æçšã®ãã¯ãããããŸãããããäžè¬çãªäŸã䜿çšããŠãããã®ã¢ããªã±ãŒã·ã§ã³ã瀺ããŸãã
ãšãããããVIDãPIDã®ãããª16ããããã£ãŒã«ããèŠãŠã¿ãŸãããã 1ã€ã®é åã«8ããããš16ãããã®å®æ°ãæ··åšãããŠãæ©èœããªãããšã¯æããã§ããããã«ãšã³ãã£ã¢ã³...äžè¬ã«ããã¯ããåã³åœ¹ã«ç«ã¡ãŸãïŒUSB_U16ïŒxïŒã
VIDã®éžæã«é¢ããŠïŒPIDã¯é£ãã質åã§ãã倧éçç£ãèšç»ããŠããå Žåã§ããå人çšã®ãã¢ãè³Œå ¥ãã䟡å€ããããŸããå人çãªäœ¿çšã®ããã«ãããªãã¯åæ§ã®ããã€ã¹ããä»ã®èª°ããæŸãããšãã§ããŸããç§ã®äŸã§ã¯ãAVRLUFAãšSTMã®ãã¢ããããšããŸãããããšã«ããããã¹ãã¯ãã®ãã¢ããã®å²ãåœãŠã§ã¯ãªããç¹å®ã®å®è£ ãã°ã決å®ããŸããããã€ã¹ã®ç®çã¯ç¹å¥ãªèšè¿°åã§è©³çŽ°ã«èª¬æãããŠããããã§ãã
泚æãçæïŒçµå±ã®ãšãããWindowsã¯ãã©ã€ããŒããã®ãã¢ã«ãã€ã³ãããŸããã€ãŸããããšãã°ãHIDããã€ã¹ãçµã¿ç«ãŠãã·ã¹ãã ã衚瀺ãããã©ã€ããŒãã€ã³ã¹ããŒã«ããŸããã次ã«ãVIDïŒPIDãå€æŽããã«MSDïŒãã©ãã·ã¥ãã©ã€ãïŒã§ããã€ã¹ãåãã©ãã·ã¥ãããšããã©ã€ããŒã¯å€ããŸãŸã«ãªããåœç¶ãããã€ã¹ã¯æ©èœããªããªããŸãããããŒããŠã§ã¢ç®¡çãã«å ¥ãããã©ã€ããŒãåé€ããŠãã·ã¹ãã ã«æ°ãããã©ã€ããŒãèŠã€ããããå¿ èŠããããŸããLinuxã«ãã®åé¡ããªãããšã¯èª°ã«ãšã£ãŠãé©ãããšã§ã¯ãªããšæããŸããããã€ã¹ã¯ãã©ã°ã€ã³ããŠåäœããã ãã§ãã
StringDescriptor
USBèšè¿°åã®ãã1ã€ã®èå³æ·±ãæ©èœã¯ãæååã倧奜ããªããšã§ããèšè¿°åãã³ãã¬ãŒãã§ã¯ãiSerialNumber
泚æãçæïŒæååã ããiSerialNumberã«è²Œãä»ããããšããèªæãã©ãã»ã©å€§ãããŠããu``1.2.3 ''ã®ãããªæ£çŽãªããŒãžã§ã³ã®æååã§ãã£ãŠã- ããªãã§ãã ããïŒäžéšã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ã16é²æ°ãã€ãŸãã0ããã9ãããAãããZãã®ã¿ãå¿ èŠã§ãããšèããŠãããããã ãã§ãããããããã§ããŸãããããããã圌ãã¯åæ¥ç¶ãããšãã«ãããèå¥ããããã«ãã©ãããããããã®ãçªå·ãããããã·ã¥ãæ°ããŸããç§ã¯ç¥ããŸãããããããWindows 7ãæèŒããä»®æ³ãã·ã³ã§ãã¹ããããšãã«ããã®ãããªåé¡ã«æ°ã¥ããŸããã圌女ã¯ããã€ã¹ã«æ¬ é¥ããããšèããŸãããèå³æ·±ãããšã«ãWindowsXPãš10ã¯åé¡ã«æ°ã¥ããŸããã§ããã
ConfigurationDescriptor
ãã¹ãã®èŠ³ç¹ããã¯ãããã€ã¹ã¯äžé£ã®åå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ãè¡šãããããããäœããã®åé¡ã解決ããããã«èšèšãããŠããŸããã€ã³ã¿ãŒãã§ã€ã¹èšè¿°åã¯ããã®ããã€ã¹ãšé¢é£ãããšã³ããã€ã³ããèšè¿°ããŸããã¯ãããšã³ããã€ã³ãã¯ããèªäœã§ã¯èšè¿°ãããŸããããã€ã³ã¿ãŒãã§ãŒã¹ã®äžéšãšããŠã®ã¿èšè¿°ãããŸããéåžžãè€éãªã¢ãŒããã¯ãã£ã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãSETUPèŠæ±ã«ãã£ãŠïŒã€ãŸããep0ãä»ããŠïŒå¶åŸ¡ãããŸãããã®èŠæ±ã§ã¯ãwIndexãã£ãŒã«ããã€ã³ã¿ãŒãã§ã€ã¹çªå·ã«å¯Ÿå¿ããŸããæ倧å€ã¯ãå²ã蟌ã¿ã®ããã«ãšã³ããã€ã³ãããã±ããã«å ¥ããããšãã§ããŸãããŸããããŒã¿ã€ã³ã¿ãŒãã§ã€ã¹ããããã¹ãã¯ãšã³ããã€ã³ãã®èª¬æã®ã¿ãå¿ èŠãšãã亀æã¯ããããééããŸãã
1ã€ã®ããã€ã¹ã«ã¯å€ãã®ã€ã³ã¿ãŒãã§ãŒã¹ããããéåžžã«ç°ãªãã€ã³ã¿ãŒãã§ãŒã¹ãååšããå¯èœæ§ããããŸãããããã£ãŠãããã€ã³ã¿ãŒãã§ã€ã¹ãçµäºããå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ãéå§ããå Žæãæ··ä¹±ãããªãããã«ãèšè¿°åã¯ãããããŒãã®ãµã€ãºã ãã§ãªããã€ã³ã¿ãŒãã§ã€ã¹ã®ãã«ãµã€ãºãåå¥ã«ïŒéåžžã¯3ã4ãã€ãïŒç€ºããŸãããããã£ãŠãã€ã³ã¿ãŒãã§ã€ã¹ã¯å ¥ãå人圢ã®ããã«æããããŸããŸããå ±éã®ã³ã³ããïŒãã¿ã€ãã«ãã®ãµã€ãºãbDescriptorTypeãããã³ã¿ã€ãã«ãå«ãã³ã³ãã³ãã®ãã«ãµã€ãºãæ ŒçŽããïŒå ã«ãããã€ãã®å°ããªã³ã³ãããé 眮ã§ããŸãããåãæ¹æ³ããããŠãŸããŸãå éšãããªããã£ãHIDããã€ã¹ã®èšè¿°åã®äŸã次ã«ç€ºããŸãã
static const uint8_t USB_ConfigDescriptor[] = {
ARRLEN34(
ARRLEN1(
bLENGTH, // bLength: Configuration Descriptor size
USB_DESCR_CONFIG, //bDescriptorType: Configuration
wTOTALLENGTH, //wTotalLength
1, // bNumInterfaces
1, // bConfigurationValue: Configuration value
0, // iConfiguration: Index of string descriptor describing the configuration
0x80, // bmAttributes: bus powered
0x32, // MaxPower 100 mA
)
ARRLEN1(
bLENGTH, //bLength
USB_DESCR_INTERFACE, //bDescriptorType
0, //bInterfaceNumber
0, // bAlternateSetting
0, // bNumEndpoints
HIDCLASS_HID, // bInterfaceClass:
HIDSUBCLASS_NONE, // bInterfaceSubClass:
HIDPROTOCOL_NONE, // bInterfaceProtocol:
0x00, // iInterface
)
ARRLEN1(
bLENGTH, //bLength
USB_DESCR_HID, //bDescriptorType
USB_U16(0x0101), //bcdHID
0, //bCountryCode
1, //bNumDescriptors
USB_DESCR_HID_REPORT, //bDescriptorType
USB_U16( sizeof(USB_HIDDescriptor) ), //wDescriptorLength
)
)
};
ããã§ã¯ããã¹ãã¬ãã«ãå°ããããšã³ããã€ã³ãã1ã€ãèšè¿°ãããŠããªããããããåçŽãªããã€ã¹ãéžæããããšããŸãããããã§ã®æ··ä¹±ã¯ã8ããããš16ãããã®ãŒãã«çããbLENGTHå®æ°ãšwTOTALLENGTHå®æ°ã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ããããŸãããã®å Žåããã¯ãã䜿çšããŠãµã€ãºãèšç®ããããããã¯ããè€è£œããŠæäœæ¥ã§ãã€ããã«ãŠã³ãããã®ã¯ããããã§ãããããŒããæžãã®ã¯ãªããŠå¥åŠãªããšã§ãããããŸããå®æ°ã¯æ³šç®ã«å€ãããã®ã§ãããã³ãŒãã®æ確ãã«è²¢ç®ããŠããŸãã
ã芧ã®ãšããããã®èšè¿°åã¯ãUSB_DESCR_CONFIGãããããŒãïŒããèªäœãå«ãã³ã³ãã³ãã®ãã«ãµã€ãºãä¿åããŸãïŒïŒãUSB_DESCR_INTERFACEã€ã³ã¿ãŒãã§ã€ã¹ïŒããã€ã¹ã®è©³çŽ°ãèšè¿°ããŸãïŒãããã³USB_DESCR_HIDã§æ§æãããŸããã¬ã³ããªã³ã°ããŠããŸãããããŠãæ£ç¢ºã«èšãã°ãç¹å®ã®HIDæ§é ã¯ãç¹å¥ãªèšè¿°åHID_REPORT_DESCRIPTORã§èšè¿°ãããŸããããã¯ãç§ãããŸãã«ãããç¥ã£ãŠãããšããçç±ã ãã§ãããã§ã¯èæ ®ããŸããããããã£ãŠãããã€ãã®äŸããã³ããŒã¢ã³ãããŒã¹ãã«å¶éããŸã ã
ã€ã³ã¿ãŒãã§ã€ã¹ã«æ»ããŸãããããããã«ã¯çªå·ãããããšãèãããšã1ã€ã®ããã€ã¹ã«å€ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãååšããå¯èœæ§ããããšæ³å®ããã®ã¯è«ççã§ããããã«ã1ã€ã®äžè¬çãªã¿ã¹ã¯ïŒããšãã°ãUSB-CDCå¶åŸ¡ã€ã³ã¿ãŒãã§ã€ã¹ãšããŒã¿ã€ã³ã¿ãŒãã§ã€ã¹ïŒãšãåºæ¬çã«ç¡é¢ä¿ãªã¿ã¹ã¯ã®äž¡æ¹ãæ åœããããšãã§ããŸããããšãã°ã1ã€ã®ã³ã³ãããŒã©ãŒã§2ã€ã®USB-CDCã¢ããã¿ãŒãšUSBãã©ãã·ã¥ãã©ã€ãã«å ããŠãããšãã°ããŒããŒããå®è£ ããããšã劚ãããã®ã¯äœããããŸããïŒãããŸã§ã®ç¥èãäžè¶³ããŠããããšãé€ããŠïŒãæããã«ããã©ãã·ã¥ãã©ã€ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯COMããŒããèªèããŠããŸããããã ããããã«ã¯èœãšãç©Žãããããã€ãæ€èšããããšãé¡ã£ãŠããŸãããŸãã1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ããšã³ããã€ã³ãã®æ°ãããŒãªã³ã°ã®é »åºŠãªã©ãç°ãªãè€æ°ã®ä»£æ¿æ§æïŒbAlternateSettingïŒã䜿çšã§ããããšã«ã泚æããŠãã ãããå®éããããè¡ãããçç±ã§ãããã¹ãã垯åå¹ ãç¯çŽããæ¹ãè¯ããšèããå Žåã圌ã¯ã€ã³ã¿ãŒãã§ãŒã¹ã圌ãæã奜ããªä»£æ¿ã¢ãŒãã«åãæ¿ããããšãã§ããŸãã
HIDãšã®éä¿¡
äžè¬çã«ãHIDããã€ã¹ã¯ã枬å®ãŸãã¯èšå®ã§ããç¹å®ã®ãã©ã¡ãŒã¿ãŒã®ã»ããïŒSET_REPORT / GET_REPORTèŠæ±ïŒã»ã©å€ãã®ããŒã¿ãæãããçªç¶ã®å€éšã€ãã³ãïŒINTERRUPTïŒã«ã€ããŠãã¹ãã«éç¥ã§ããå®äžçã®ãªããžã§ã¯ããã·ãã¥ã¬ãŒãããŸãããããã£ãŠãå®éã«ã¯ããããã®ããã€ã¹ã¯ããŒã¿äº€æãç®çãšããŠããŸãã...ãããã誰ããã€ãããåæ¢ããã®ã§ããïŒ
å²ã蟌ã¿ã«ã¯ç¹å¥ãªãšã³ããã€ã³ããå¿ èŠãªã®ã§ãããã§ã¯å²ã蟌ã¿ã«ã€ããŠã¯è§ŠããŸããããã ãããã©ã¡ãŒã¿ã®èªã¿åããšèšå®ãæ€èšããŸãããã®å Žåããã©ã¡ãŒã¿ãŒã¯1ã€ã ãã§ããããã¯ã2ãã€ãã®æ§é ã§ãããèšèšäžã2ã€ã®LEDããŸãã¯ãã¿ã³ãšã«ãŠã³ã¿ãŒãæ åœããŸãã
ããåçŽãªãã®ããå§ããŸããã-ãªã¯ãšã¹ãHIDREQ_GET_REPORTã§èªã¿åããŸããå®éãããã¯DEVICE_DESCRIPTORãšåããªã¯ãšã¹ãã§ãããHIDã«ã®ã¿åºæã§ããããã«ããã®èŠæ±ã¯ããã€ã¹å šäœã§ã¯ãªããã€ã³ã¿ãŒãã§ã€ã¹ã«éä¿¡ãããŸããã€ãŸãã1ã€ã®ããã€ã¹ã«è€æ°ã®ç¬ç«ããHIDããã€ã¹ãå®è£ ããå Žåããããã¯ãªã¯ãšã¹ãã®wIndexãã£ãŒã«ãã§åºå¥ã§ããŸãã確ãã«ãããã¯ç¹ã«HIDã«æé©ãªã¢ãããŒãã§ã¯ãããŸãããèšè¿°åèªäœãè€ååããæ¹ãç°¡åã§ãããããã«ãããç§ãã¡ã¯ãã®ãããªåé¯ããã¯ã»ã©é ãã®ã§ããã¹ããäœãã©ãã«éä¿¡ããããšããããåæããããšããããŸãããã€ã³ã¿ãŒãã§ãŒã¹ãžã®ãªã¯ãšã¹ãã«ã€ããŠãbRequestãã£ãŒã«ããHIDREQ_GET_REPORTã«çããå Žåãå®éã®ããŒã¿ãè¿ããŸããçè«çã«ã¯ããã®ã¢ãããŒãã¯èšè¿°åïŒãã¹ãŠã®bLengthãšbDescriptorTypeãå«ãïŒãè¿ãããšãç®çãšããŠããŸãããHIDã®å Žåãéçºè ã¯ãã¹ãŠãåçŽåããããŒã¿ã®ã¿ã亀æããããšã«ããŸããããããã£ãŠãæ§é ãšãã®ãµã€ãºãžã®ãã€ã³ã¿ãè¿ããŸããããŠãåŠçãã¿ã³ããªã¯ãšã¹ãã«ãŠã³ã¿ãŒã®ãããªå°ãè¿œå ã®ããžãã¯ã
ããè€éãªã±ãŒã¹ã¯ãæžã蟌ã¿èŠæ±ã§ãã SETUPãªã¯ãšã¹ãã§è¿œå ããŒã¿ã«ééããã®ã¯ãããåããŠã§ããã€ãŸããã©ã€ãã©ãªã®ã³ã¢ã¯æåã«ãªã¯ãšã¹ãèªäœãèªã¿åãã次ã«ããŒã¿ãèªã¿åãå¿ èŠããããŸãããããŠããããããŠãŒã¶ãŒé¢æ°ã«è»¢éããŸãããŸãããããã¡ããªãããšããç¥ããããŸããããã€ãã®äœã¬ãã«ã®éæ³ã®çµæãšããŠã次ã®ã¢ã«ãŽãªãºã ãéçºãããŸãããã³ãŒã«ããã¯ã¯åžžã«åŒã³åºãããŸãããããŒã¿ããšã³ããã€ã³ãåä¿¡ãããã¡ãŒã«ãããã€ãïŒãªãã»ããïŒãšãã®ããŒã¿ã®ãµã€ãºïŒãµã€ãºïŒãéç¥ããŸããã€ãŸãããªã¯ãšã¹ãèªäœãåä¿¡ããããšããªãã»ãããšãµã€ãºã®å€ã¯ãŒãã«ãªããŸãïŒããŒã¿ã¯ãããŸããïŒãæåã®ãã±ãããåä¿¡ããããšãããªãã»ããã¯ãŸã ãŒãã§ããããµã€ãºã¯åä¿¡ãããããŒã¿ã®ãµã€ãºã§ãã 2çªç®ã®å Žåããªãã»ããã¯ep0ã®ãµã€ãºã«çãããªãïŒããŒã¿ãåå²ããå¿ èŠãããå Žåã¯ããšã³ããã€ã³ãã®ãµã€ãºã«åŸã£ãŠåå²ããããïŒããµã€ãºã¯åä¿¡ããããŒã¿ã®ãµã€ãºã«çãããªããŸããçã éèŠïŒããŒã¿ãåãå ¥ããããå Žåã¯ããããèªã¿åãå¿ èŠããããŸããããã¯ããã³ãã©ãŒãusb_ep_readïŒïŒãåŒã³åºããŠ1ãè¿ãïŒãèªåã§èããã®ã§ãæ°ã«ããªãã§ãã ãããïŒããåã«0ïŒããã®ããŒã¿ã¯å¿ èŠãããŸãããïŒãèªã¿åããã«è¿ãããšã§å®è¡ã§ããŸãã次ã«ãã©ã€ãã©ãªã³ã¢ãã¯ãªãŒãã³ã°ãåŠçããŸãããã®é¢æ°ã¯ãã®ååã«åºã¥ããŠæ§ç¯ãããŠããŸããããŒã¿ãå©çšå¯èœãã©ããã確èªããå©çšå¯èœãªå Žåã¯ãããèªã¿åããLEDãç¹ç¯ãããŸãã
ããŒã¿äº€æãœãããŠã§ã¢
ããã§ç§ã¯è»èŒªã®åçºæãããŸããã§ããããåã®èšäºãã æ¢è£œã®ããã°ã©ã ãåããŸãã ã
çµè«
å®éãããããã¹ãŠã§ãã STM32ã®ããŒããŠã§ã¢ã¢ãžã¥ãŒã«ã䜿çšããŠUSBãæäœããåºæ¬ã説æããŸããããã¬ãŒãã«ã觊ããŸããã STMCubeãçæãããã©ãŒãããã¯ããã«å°ãªãéã®ã³ãŒããèæ ®ãããšããããç解ããã®ã¯ç°¡åã§ããå®ã®ãšãããç§ã¯ãŸã ãã¥ãŒãããŒãã«ã§ãããç解ããŠããŸãããç°ãªãçµã¿åããã§åããã®ã®åŒã³åºããå€ãããŸããç§ãå§ããEddyEmã®ãªãã·ã§ã³ãç解ããã®ã«ã¯ããã«åªããŠã ãŸãããã¡ãããããæ±ããªãããã§ã¯ãããŸããããå°ãªããšãç解ã«ã¯é©ããŠããŸããç§ã¯ãŸããç§ã®ããŒãžã§ã³ã®ãµã€ãºãSTã®ãµã€ãºã®ã»ãŒ5åã®1ã§ããããšãèªã£ãŠããŸãïŒ14ã«å¯ŸããŠçŽ2.7 kBïŒ-ç§ã¯æé©åã«é¢äžããŠããªããšããäºå®ã«ããããããã確ãã«ããããçž®å°ããããšãã§ããŸãã
ãŸããçãããæ©åšãæ¥ç¶ããéã®ããŸããŸãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®åäœã®éãã«ã泚æããããšæããŸãã Linuxã¯ãèšè¿°åã«ãšã©ãŒããã£ãŠãæ©èœããŸãã Windows XPã7ã10ãããããªãšã©ãŒã§ã圌ãã¯ãããã€ã¹ãå£ããŠãããç§ã¯ãããæ±ãããšãæåŠããããšèªãããããŠãXPã¯BSODã§ãæ€æ šããããšããããŸããããããããã§ãã圌ãã¯åžžã«ãããã€ã¹ã¯ããéãåäœããããšãã§ããŸãããšè¡šç€ºããŸããç§ã¯ããã«ã€ããŠäœããã¹ããããããŸãããäžè¬ã«ãLinuxãéçºã«ã©ãã»ã©åªããŠããŠããèš±ããããŠããŠãŒã¶ãŒãã¬ã³ããªãŒã§ãªãã·ã¹ãã ã§ãã¹ãããå¿ èŠããããŸãã
ãããªãèšç»ïŒä»ã®ã¿ã€ãã®ãšã³ããã€ã³ããæ€èšããŠãã ããïŒãããŸã§ã®ãšãããã³ã³ãããŒã«ã®ã¿ã®äŸããããŸããïŒãä»ã®ã³ã³ãããŒã©ãŒãæ€èšããŠãã ããïŒããšãã°ãç§ã¯ãŸã at90usb162ïŒAVRïŒãšgd32vf103ïŒRISC_VïŒã䜿çšããŠããŸãïŒãããããã¯éåžžã«é ãèšç»ã§ããåãHIDã®ãããªåã ã®USBããã€ã¹ã詳ãã調ã¹ãããšãã§ããŸãããåªå ã¿ã¹ã¯ã§ã¯ãããŸããã