æè¿ã圌ã¯Dropboxã§ãã©ã«ããŒãããéããŠããŠãæåã®ã¯ã©ããã«åºäŒã£ãã ãã€ã¯ãã³ã³ãããŒã©ãŒã䜿ã£ãŠæåã®äžæ©ãèžã¿åºãããšããã»ãšãã©ããã«PCããã¯ã©ããã管çããããšã«ã€ããŠã®èããã¢ã€ãã¢ã蚪ããŠããŸããããŸãã¯ãäœããã®æ¹æ³ã§ãã®PCãšéä¿¡ã§ããŸããã é
åçã§ãæ·±å»ãã«èŠããŸããã ä»ãç§ã¯ããã«ãã¹ãŠãéã§ãã¹ãããããšããŸãããæåã¯çæã«è¶³ãèžã¿å
¥ããŠãçã¿ã䌎ããã«çŽ æ©ãè¶³ãæã¡ãŸããã ããããŠã¹ã¯ãã€ãããã§ç§ãå©ããŠãããŸããã ãããžã§ã¯ããäœååãçµã¿ç«ãŠçŽããŸããããç§ãããèšããªããå¿«é©ã«å®éšã§ããããšãéèŠã§ããã ãã®åŸããã©ã³ããããã°ã賌å
¥ããããããŠã¹ãããŒããŠã§ã¢ã§ããã賌å
¥ããŸããããã¹ãŠãåçã«é«éã«ãªããŸããã
ãŸããUARTãšUSBã詊ããæ¬¡ã«ã€ãŒãµãããã詊ããããšæããŸããã ããããã®æ¬²æ±ã«å¯ŸããŠãç§ã¯èªåã®ããããžã§ã¯ãããæãã€ããŸããã å€ãã®ã¢ã€ãã¢ãããããŠã¹ã®ãããžã§ã¯ãã®åœ¢ã§æ®ã£ãŠããŸãã-ãã®ã¢ã€ãã¢ã¯ãœãããŠã§ã¢éšåã®å®è£
çŽåŸã«æ©ã¿ãŸããã
ãã®æçš¿ããUSBããã€ã¹ãäœãããããŸãã¯ãããããã»ã©é£ãããªãããšãç¥ããããšæã£ããã¹ãŠã®äººã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã ããã«ãç§ã¯ããã«ã·ãã¥ã¬ãŒã¿ãŒã§è©ŠããŠã¿ãããšæããŸããã åå¿è
ããåå¿è
ãŸã§ãGoogleãéããŠèªæžãå§ãããããã£ãšå€ãã®ããšããããããã£ãšå匷ãããããªã©ã
ã¬ãžã¹ã¿ãã¢ãŒãã«ã€ããŠã¯èª¬æããŸããã ç§ã¯ãããç§ã®ç®ã«ç«ãã€ããå©ãã«ãªããšã¯æããªãã ãããã誰ããèªåèªèº«ã«åœ¹ç«ã€äœããããããšæã£ãŠãããç°¡åãªäŸã§ã¯ããã®éåžžã«é
åçãªäœåããã©ãã°ããå¯èœæ§ãé«ããªããŸãïŒãããŠãç§ã«ãšã£ãŠã¯ã»ãšãã©éº»è¬ã§ãïŒã ãããŠãebayã§èµ°ã£ãããäžåœãããããã°ããŒããéã£ãŠããæ¥æ°ãæ°ãå§ããåã«ãä»®æ³ãã€ã¯ãã³ã³ãããŒã©ãŒã詊ããŠã¿ãããšãã§ããŸãã
2ã€ã®ç¬ç¹ãªãããŒã¯ãŒã«ããããžã§ã¯ããäœæããããšæããŸãããããã§ãæšæºã®LEDç¹æ»
ãããããã»ã©è€éã§ã¯ãããŸããã ã«ããã®äžã«ããããã®ç»åã
ããã¹ãå
ã®èª¬æãšã³ãŒãäŸã¯PIC18F4550ãã€ã¯ãã³ã³ãããŒã©çšã§ãã®ã§ãã容赊ãã ãããç§ã¯atmelã䜿çšããŠããŸããã ãŸããSTM8 / 32ã¯8çªç®ã®ããŒãžã§ã³ã§ãæ¬ èœããŠããŸãã
ãã€ã¯ãã³ã³ãããŒã©ãŒã®ã³ãŒãã¯ã
Mikroelektronikaã®mikroCã³ã³ãã€ã©ãŒçšã«äœæãããçè§£ã容æã«ããããã«äœæãããŸãããå°ãªããšãéšåçã«ã¯ããŸããããšæããŸãã
ããããŠã¹ãšMCUã®ãã€ã³ãã£ã³ã°
ããããŠã¹ã¯ããœãããŠã§ã¢ã®åäœãæåã«ãããã¿ã€ãã³ã°ããã³ãã¹ãããããã«äœæãããããã§ãã ããããããããåè·¯ãäœæããéã«è€æ°ã®åçŽåãå¯èœã«ããçç±ã§ãã 以äžã¯ãUART / USBçµç±ã®PCéä¿¡ããã¹ãããããã®çµ¶å¯Ÿã«ååãªãããã§ãã ãã®ãããªã¹ããŒã ã¯ããããŠã¹ã§ã®ã¿æ©èœããããšã«åã³æ³šæãæããããšæããŸãã
ãã¹ãŠã®ãããžã§ã¯ãã¯èšäºã«æ·»ä»ãããŠãããããããã°ã©ã ãã€ã³ã¹ããŒã«ãããšãããã«ãã¹ãŠã詊ãããšãã§ããŸãã

UïŒSïŒART
ãããã¯ã¯beatãããŠããŸãããããã§ãããäžåºŠèª¬æãããŠãã ããã
ããããã®ä»ã®ä»»æã®ããã°ã©ã ãä»®æ³ãã€ã¯ãã³ã³ãããŒã©ãŒã«æ¥ç¶ããã«ã¯ãããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠããããŸãã
COMPIMã¢ãžã¥ãŒã«ã¯ä»®æ³ããŒãã䜿çšããŠæ¥ç¶ããŸããå¥ã®ããŒããäœæãã
ãã«ã¢ãã ãšããŠæ¥ç¶ããå¿
èŠããã
ãŸã ã
ããã§
圹ç«ã€ã®ã¯
ç¡æã®ãŠãŒãã£ãªãã£com0comã§ãã
ããã§2ã€ã®ä»®æ³ããŒããäœæããŸããç§ã®å Žåã¯COM 3ãš4ã§ãã1ã€ã¯Proteus COMPIMã«æ¥ç¶ããã2ã€ç®ã¯æ¢ã«ãå€éšãã§äœ¿çšãããŠããŸã
ããã°ã©ã ãŠã£ã³ããŠ

ãããŠãããã¯devmgmt.mscïŒããã€ã¹ãããŒãžã£ïŒã§ã©ã®ããã«èŠãããã§ã

ããã§ããã¹ãŠã®ãã¹ãã®æºåãæŽããŸããã
ãã¹ãããã°ã©ã ãäœæããchar uart_rd; void main() { UART1_Init(9600); UART1_Write_Text("Hello Habrahabr"); UART1_Write(10); UART1_Write(13); for(;;) { if(UART1_Data_Ready()) { uart_rd = UART1_Read( ); switch(uart_rd) { case 0xD: UART1_Write(10); UART1_Write(13); break; default: UART1_Write(uart_rd); break; } } } }
COMPIMããã€ã¹ãæ§æããŸãïŒå³ã¯ãªãã¯-ããããã£ã®ç·šéïŒã
com0comãCOM3 / COM4ããŒãããšãã¥ã¬ãŒãããããšãæãåºãããŠãã ãã

念ã®ããããã€ã¯ãã³ã³ãããŒã©ãŒã®èšå®ãåçã«æ·»ä»ããŸã

Puttyããªã³ã«ããã·ãªã¢ã«ã¢ãŒãã«ããŠãCOM4ã«æ¥ç¶ããŸãã ä»...ãã¿ã³ãã¯ãªãã¯ããŠãã ãã-çµæãåŸãããŸã
端æ«ãŠã£ã³ããŠã«ããã¹ããå°å·ãããšããã€ã¯ãã³ã³ãããŒã©ãŒããšã³ãŒãè¿ããŸãã EnterããŒãæŒããšããã£ãªããžãšæ°ããè¡ã倿ãããŸãã
Backspaceãæ©èœããŸãã ç§ã¯ããã«ãã€ããŒã¿ãŒããã«ã§å人ãšãã£ããããäœæéãé»è©±åç·ãå æããŠããããšãæãåºããŸãã...

ããã§ãã³ãŒãã倿ŽããŠãã€ã¯ãã³ã³ãããŒã©ãŒã§éã¶ããšãã§ããŸãã
ããšãã°ãããªããã£ãã³ãã³ããã³ãã©ãŒã远å ã§ããŸãã #define CRLF UART1_Write(10);UART1_Write(13) char uart_rd = 0; char cmd[32] = {0}; int char_counter = 0; void cmd_exec(void) { if (strstr(cmd, "hello")) { UART1_Write_Text("EHLO"); CRLF; } else if (strstr(cmd, "test")) { UART1_Write_Text("TSET"); CRLF; } else { UART1_Write_Text("Unknown command"); CRLF; } char_counter=0; memset(cmd, 0, sizeof cmd); } void main(void) { UART1_Init(9600); UART1_Write_Text("MCU started"); UART1_Write(10); UART1_Write(13); for(;;) { if(UART1_Data_Ready()) { uart_rd = UART1_Read( ); switch(uart_rd) { case 0xD: CRLF; cmd_exec(); break; default: UART1_Write(uart_rd); break; } cmd[char_counter++] = uart_rd; if(char_counter == (sizeof cmd - 1)) { CRLF; cmd_exec(); } } } }
USB HID
ãã®ãšããUSBããã€ã¹ãäœãã®ã¯é£ããããšãããããŸããã
HIDããã€ã¹ãã€ãŸãã»ãšãã©ã®å Žåãå
¥åããã€ã¹ããã¹ãããŸãã
ç§ã¯æ¬åœã«èªåãã¹ã¯ãŒãå
¥åããããã£ãã ãã§ãªããå»ã£ããšãã«ã³ã³ãã¥ãŒã¿ãããã¯ããè¿ã¥ãããšãã«ããã¯ãè§£é€ãããã£ãã®ã§ãã ããŠãä»®æ³ããŒããŒãã䜿çšããŠå®è£
ã§ããä»ã®å€ãã®ããšã
䟿å©ãªHIDæ
å ±ã®æã¯
ããã«ãããŸã ã èªã¿åã-åèªã¿åãããŸããã
èŠããã«ãåUSB HIDããã€ã¹ã«ã¯ç¹å¥ãªèª¬æãèšè¿°åããããŸãã ã©ã®çš®é¡ã®ããã€ã¹ã§ããããã©ã®ããã«å¶åŸ¡ã§ãããããã¹ããæ¶è²»ããéããŸãã¯ç¬èªã®é»æºãšãã®ä»ã®æ
å ±ãæã£ãŠãããã©ããã説æããŸãã ãããã£ãŠãOSãããŒããŒãã§ããããšãçè§£ãããããæäœã§ããããã«ãæ£ãã説æãäœæããå¿
èŠããããŸãã
ããããæåã«ãProteusããã®ä»®æ³USBãã¹ããå®éã®PCã«è»¢éããã«ã¯ãä»®æ³ãã©ã€ããŒãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã

ããã€ã¹ãæ¬æ ŒçãªFullSpeed USB 2.0ãšããŠæ©èœãããã«ã¯ãPLLãæå¹ã«ããããã«å¿ããŠæ§æããå¿
èŠããããŸãã
Proteusã§ã¯ãããã»ããµåšæ³¢æ°ã96 MHzã«èšå®ããå¿
èŠããããŸãã
ãã¿ãã¬ã®äžã§ããã¹ã¿ãŒãªã·ã¬ãŒã¿ãŒãã©ã®ããã«æ©èœãããã®èª¬æïŒPICã®å ŽåïŒããã§ãã¹ãŠã詳ãã説æã
ãŸãã
èšè¿°å
ããã調ã¹ãŠå®éšããã ãã§ãšãŠã圹ã«ç«ã¡ãŸããã usb.orgã®ç¡éã®PDFãã©ãã§æãã°ããããããã«æããã«ãªããŸãã
ç§ãã¡ã®å Žåããæšæºã埩å·åããã°ã©ã ããã®å€æŽã¯ã»ãšãã©ãããŸããã
VID / PIDã倿Žãããããã8ãã€ãã®å
¥å/åºåãããã¡ãŒãããããšã瀺ããŸãããå®éããããŒããŒããã¯ã©ã¹ã®ããã€ã¹ãããããã®ããã«äœ¿çšããå¿
èŠãããããšã瀺ããŸããã
ãã¹ãŠã®å€æ°åã¯ããèªèº«ã衚ããŠããŸãã
èšè¿°åã³ãŒãèªäœã倧éã®ã³ãŒã const unsigned int USB_VENDOR_ID = 0xdead; const unsigned int USB_PRODUCT_ID = 0xbeaf; const char USB_SELF_POWER = 0x80;
ãã®èšè¿°åã¯ãããžã§ã¯ãã«è¿œå ãããã¢ã»ã³ããªäžã«èªåçã«äœ¿çšãããŸãã
å
¥åããæãåçŽãªããã°ã©ã unsigned short USBResponse[8] = { 0} absolute 0x500; unsigned short USBCommand[8] = {0} absolute 0x508; char *text="habrahabr"; int i = 0; void interrupt(void) { USB_Interrupt_Proc( ); } void clrUSB(void) { memset(USBCommand, 0, sizeof USBCommand); while ( !HID_Write(&USBCommand, sizeof USBCommand)); } void main(void) { ADCON1 |= 0x0F; CMCON |= 7; HID_Enable(&USBResponse, &USBCommand); delay_ms(1000); for (i=0; i < strlen(text); i++) { USBCommand[2] = text[i] - 93; while ( !HID_Write(&USBCommand, sizeof USBCommand)); clrUSB(); delay_ms(200); } }
å®éããã¹ãŠã®äœæ¥ã¯ã察å¿ãããããã¡ãŒãåããŠPCã«éä¿¡ããããšããæããŸãã UARTã»ã©è€éã§ã¯ãããŸããã ãã¹ãŠã®äœæ¥ã¯ãå²ã蟌ã¿ã«ãŒãã³ã§è¡ãããŸãã IDEã«ã¯ãHIDãæäœããããã®æ¢è£œã®ã©ã€ãã©ãªããããŸãã
ã¹ãã£ã³ããŒããŒãã³ãŒãã¯ASCIIãšã¯ç°ãªãããšãããã§èª¬æããå¿
èŠããã
ãŸãããã³ãŒããéè² è·ã«ããªãããã«ïŒããã«ã¡ã¯ïŒããã®äžäŸ¿ãåå§çãªæ¹æ³ã§åé¿ããŸããã å°æåã§ã®ã¿æ©èœããŸãã åžæãã人ã¯èªåã§å€æãè¡ãããšãã§ããŸãã ç§ã¯KVMã«åæ§ã®ããã€ã¹ã䜿çšããŠããŸããè·å Žã§ã¯ãã¯ã€ã€ã¬ã¹ããŒããŒããšã¯ã¹ãã³ããŒã§ããåœç€Ÿã®D-Link KVMã¯USBã¯ã€ã€ã¬ã¹ãã³ã°ã«ãçè§£ããããªãã®ã§ãã
ããã§ã¡ã¢åž³ãéããProteusãèµ·åããŠïŒæåã«ä»®æ³ãã©ã°ãã¯ãªãã¯ããŸã-USBã³ãã¯ã¿ãããã©ã°ã€ã³ãããŸãïŒãããã«ããŠã¹ã§ãã©ãŒã«ã¹ãã¡ã¢åž³ã«å€æããäœæã
habrahabrãšããåèªãå°å·ããæ¹æ³ã確èªããŸãã

ãããŠããã£ã¹ãããã£ã«ããã€ã¹ãç»å ŽããŸãã

ããã«åºã¥ããŠãç¬èªã®äœãã远å ã§ããŸãã
ãããã©ã®ããã«æ©èœãããã«ã€ããŠããã€ãã®èšèã
8ãã€ãã¯ããŒããŒãI / Oçšã«äºçŽãããŠããŸãïŒ
0修食å
1æªäœ¿çš
2ããŒ1
3ããŒ2
4ããŒ3
5ããŒ4
6ããŒ5
7ããŒ6
修食åããããã¯ç¹æ®ããŒCtrlãShiftãAltã§ãã ãããã¯çµã¿åãããããšãã§ããŸãã ããšãã°ãCtrl Alt Delã®çµã¿åããã®å ŽåïŒ
修食åïŒ0b00000
101 Ctrl ãShiftã
AltããŒã³ãŒãïŒ0x4cïŒããŒã®åé€ïŒ
ããŒã¿è»¢éã®çŽåŸã«USBãããã¡ãæ¶å»ããå¿
èŠãããããšãèŠããŠããå¿
èŠããããŸããããããªããšãã¹ãã£ãããŒããŒã®å¹æãçããŸãã ã€ãŸãã8ã€ã®ãŒããã€ããPCã«éä¿¡ããŸãã ãã®äŸã§ã¯ãclearUSBãµãã«ãŒãã³ããããå®è¡ããŸãã
ã¹ãã£ã³ã³ãŒãã®è©³çްã«ã€ããŠã¯ã
ãã€ã¯ããããã®
ã¢ããªããŒãã«èšèŒãããŠã
ãŸãåæ§ã«ãéåžžã®HIDããã€ã¹ãäœæããPCãããã€ããéåä¿¡ã§ããŸããäœæ¥ã®è«çã«åŸã£ãŠãããã¯åãUARTãšã»ãšãã©å€ãããŸããã ããããããã«ã¯ãäŸãã°ãPCåŽããã®libusbã䜿çšãããªã©ãå¥ã®äœæ¥ãæ¢ã«å¿
èŠã§ãã
ã€ãŒãµããã
ã¿ã€ãã«ã«ã¯åæ ãããŠããŸããããèšåãã䟡å€ããããŸãã
æ®å¿µãªãããããã¯å¥ã®è°è«ã®ãããã¯ã§ããããããã®äŸã¯å®äºããŸããã
ããããå°ãªããšãã·ãã¥ã¬ãŒã¿ãŒèªäœã®æ§ææ¹æ³ã«ã€ããŠã¯èª¬æããäœãã詊ãããšã«æåããŸãã
ããŒããŠã§ã¢ã§æ©èœãããã®ã®äŸã瀺ããŸãããå¿
ãããã·ãã¥ã¬ãŒã¿ã§æ©èœãããšã¯éããŸããã Proteusã¯ãENC28J60ããã³RTL8019ãããçšã®VSMã¢ãã«ãå®è£
ããŠããŸãã ã¯ããç§ãã¡å
šå¡ãäºç®ã®ãããã¯ãŒã¯ã«ãŒãã«ã€ããŠç¥ã£ãŠããã®ãšåããããã§ãã ENCã®äœ¿çšã¯ååã«åºã説æãããŠãããããã§ã¯åé¡ã¯ãªãã¯ãã§ãã ããšãã°ãå°æ¬ãããLifeloverãšããŠãç¥ãããRedshã¯ããã¹ãŠãé·ã培åºçã«
説æããŠããŸãã ãããã£ãŠãéå±ããªãããã«ããã«ã¯ã8019ãåããŸããZ80ãšçµã¿åãããŠäœ¿çšââãããœãããŠã§ã¢ãäœæããã»ã©ã§ãã
USBãšåæ§ã«ããã©ã€ããŒãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãããä»ã¯WinPCAPã§ãã ãããã¯ãUSBãã©ã€ããŒã®é£ã®ä»®æ³ãããã¯ãŒã¯ãã©ã«ããŒã«ãããŸãã ãŸãã¯ã
ãµã€ããã
ææ°ããŒãžã§ã³ãããŠã³ããŒã
ããŸããã®åŸãã¢ãã¬ã¹ã192.168.95.1ã®æ°ããä»®æ³ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ãäœæãããŸãããããã¯ãã¡ãã倿Žã§ããŸãã
æ¢ç¥ã®ã¹ããŒã ã«åŸã£ãŠãUARTã§ãããã°ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãããã
ãã³ãïŒTEXTã©ãã«ã«æ©ãŸãããå Žåã¯ãã³ã³ããŒãã³ãã®èª¬æã«ã¹ããŒã¹ãå
¥ããŠãã ãã

è¶
å°ååè·¯ã®ããããã£ã§ãä»®æ³ãããã¯ãŒã¯ã«ãŒãã®çªå·ãŸãã¯IPãèšè¿°ããããã€ãã®èšå®ã倿Žã§ããŸãã
ç§ã®å Žåãããã¯192.168.50.1ã§ãïŒå€æŽããŸããïŒ

次ã¯ãœãããŠã§ã¢ã§ãã 8019çšã®æ¬æ Œçãªãã©ã€ããŒã¯ãŸã æºåãã§ããŠããŸãããããã¯å¥ã®å€§ããªèšäºã®ãããã¯ã§ããããã®ãããªæä»£é¯èª€ã«èª°ããèå³ãæã€ããšã¯ãªãã§ãããã ãããããããã³ã«ãèšå®ããªããŠãïŒIPã¢ãã¬ã¹ã¯0.0.0.0ã«ãªããŸããïŒãã¬ãžã¹ã¿ã§ICMP /ãããŒããã£ã¹ããæå¹ã«ããããããµããããäžã®å·Šã®ã¢ãã¬ã¹ã«pingãå®è¡ã§ãããã±ãããåä¿¡ãããš
ãããã¯ãŒã¯ã«ãŒãããããLEDã§ç¹æ»
ããŸãã 詊è¡ãããã³ã«æ°ããã¢ãã¬ã¹ã䜿çšããŸããããããªããšãARPããŒãã«ããã£ãã·ã¥ãããŸãã

æ¢è£œã®HEXã¯ãããžã§ã¯ãã«å«ãŸããŠããããããã¹ãŠãæ©èœããããšã確èªããå¿
èŠãããå Žåã¯ãã³ã³ãã€ã©ãããŠã³ããŒãããããšããã§ããŸããã
ã·ãã¥ã¬ãŒã·ã§ã³ãæ©èœãããããã«ãHEXãã¡ã€ã«ã®å Žæããã€ã¯ãã³ã³ãããŒã©ãŒã«äŒããããšãå¿ããªãã§ãã ããã
ãã®
ãªã³ã¯ãããã¹ãŠã®ãã¡ã€ã«ãããŠã³ããŒãã§ããŸã
誰ããããŒããŠã§ã¢ã§è©ŠããŠå®è£
ããããšããåŒ·ãæ¬²æ±ãæã£ãŠããããšãé¡ã£ãŠããŸãã