çŸæç¹ã§ã¯ãã»ãšãã©ã®ãã ã¯RS232ã®USBã¢ããã¿ãŒãããã䜿çšããŠãã®ã¿ã€ãã®æ¥ç¶ãå®è£ ããŠãããããã¢ããã¿ãŒãããã«ä»å±ã®ä»®æ³COMããŒããã©ã€ããŒãä»ããŠããã€ã¹ãšã®éä¿¡ãæŽçããŠããŸãã ãã®ã¢ãããŒãã®æ¬ ç¹ã¯ç解ã§ãããšæããŸãã ããã¯ãå°ãªããšãããŒãäžã®äœåãªãããã§ããããã®ããããšãã®ãã©ã€ããŒã«ãã£ãŠèª²ãããå¶éã§ãã
ãããããã®ãããªããåããæŽçããããã»ã¹å šäœãããããè¡ãããã¹ãã§ããããã«ããã¹ãŠã®æ·±å»ãªããã€ã¹ã§ã©ã®ããã«è¡ããããã匷調ããããšæããŸãã
çµå±ãä»ã¯21äžçŽã§ãããã»ãšãã©ãã¹ãŠã®ãã€ã¯ãã³ã³ãããŒã©ãŒã«USBã¢ãžã¥ãŒã«ããããŸãã ããã¯ããã®ã¢ãžã¥ãŒã«ãè¿ éã«äœ¿çšããæ¹æ³ã«é¢ãããã®ã§ããããã®èšäºã§èª¬æããŸãã
USBããã€ã¹ãã©ã€ããŒãäœæããããã»ã¹ã瀺ãããã«ããã€ã¹èªäœãå¿ èŠãªã®ã§ããã·ã¢ã§å©çšå¯èœãªäžè¬çãªãããã°ããŒãã®1ã€ãéžæããŸãã ãã®ããŒãã¯ãOLIMEXã¢ãã«LPC-P2148ã§è£œé ãããŠããŸãã ããŒãã®ããŒã¹ã¯ãARM7TDMIã¢ãŒããã¯ãã£ã®NXPãã€ã¯ãã³ã³ãããŒã©ãŒLPC2ââ148ã¢ãŒããã¯ãã£ã§ãã ããŒãäžã®ãã¹ãŠã®æ å ±ã¯ã次ã®ãªã³ã¯ã®è£œé å ã®Webãµã€ãã§å ¥æã§ããŸãã ããã¯åœŒå¥³ãã©ã®ããã«èŠãããã§ãã
ã³ã³ãããŒã©ãŒãšãããã°ããŒãã®éžæã¯çµ¶å¯Ÿã«éèŠã§ã¯ãããŸããã ããœã³ã³ã®OSãšããŒãèªäœã®çžäºäœçšãéçºããããã»ã¹ã¯ããã«äŸåããŸããã ãã€ã¯ãã³ã³ãããŒã©ã®ãã¡ãŒã ãŠã§ã¢éçºç°å¢ã¯ãKEILããŒãžã§ã³4.23ã䜿çšããŸããããããéèŠã§ã¯ãããŸããã ãã®ããããã«ã¯è»¢éã¿ã€ãã®ã¿ãå®è£ ããäºå®ã§ãã ããã€ã¹ããã³ã³ãã¥ãŒã¿ãŒã«ããŒã¿é åãèªã¿åããLEDã®ã¹ããŒã¿ã¹ãããã€ã¹ã«è»¢éããŠãããŒããã³ãã³ãã«å¿çããŠããããšãæ確ã«ããŸãã
ããããããããããã«ããã®æ®µéã§ããã«ã¢ã¯ã·ã§ã³ãåå²ããé çªã«å®è¡ããŸãã
1.ããŒããæ©èœããUSBãã£ãã«ãæ©èœããããšã確èªããããã«ãå®æããUSBããã€ã¹ã®äŸãããŒãã«é©åãããŸãã ãããåºçºç¹ã®ããã«ãªããŸãã
2.ããŒãã®ãã¡ãŒã ãŠã§ã¢ãå€æŽããŠã補é å ã®ãã©ã€ããŒãå¿ èŠãšããWindowsçšã®äžæãªããã€ã¹ã«ãªãããã«ããŸãã
3. Windowsãããã€ã¹ããµãŒãã¹ããããã«æ£ããã€ã³ã¹ããŒã«ã§ããããã«ãåºæ¬ãã³ãã¬ãŒãã§ãã空ã®ãã©ã€ããŒã調æŽããŸãã
4.ãŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ãšãã©ã€ããŒã®å¯Ÿè©±ã®å®è£ ã
5.ãã©ã€ããŒãã€ãŸãæ¥ç¶ãããUSBããã€ã¹ã§åäœããWindowsã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
6.ã·ã¹ãã å šäœãå¿ èŠãªæ©èœã§æºããã
ãã®èšäºã«ã¯ãããŸããã é©åãªãã©ã€ããŒãèŠã€ããŠã€ã³ã¹ããŒã«ã§ããOSã®åäœã¡ã«ããºã ã«ã€ããŠã¯èª¬æããŸããã KEILç°å¢ã§ãã¡ãŒã ãŠã§ã¢ãæ§ç¯ããæ¹æ³ã«ã€ããŠã¯èª¬æããŸããã USBèšè¿°åã®ãã©ã¡ãŒã¿ãŒã®èª¬æã¯ãªããäžè¬ã«ãã¡ãŒã ãŠã§ã¢ã®åäœã«ã€ããŠã¯äœãèšãããŸããã æåŸã«ããã¹ãŠã®æ å ±æºããœãŒã¹ã³ãŒããåéãããã€ããªãžã®ãªã³ã¯ãæäŸããŸãã ãããã£ãŠããã®èšäºã§ã«ããŒãããŠããªãç¬éã®èª¬æã¯ã瀺ããããœãŒã¹ã§ç°¡åã«èŠã€ããããšãã§ããŸãã æ£ããç解ããããããã¹ãŠã®ãããã¯ã«é¢ãã詳现æ å ±ã1ã€ã®èšäºã«å ¥ããã®ã¯éçŸå®çã§ãã ããã«ãããæèœãªæ å ±æºããããŸãã
1. RTX_Memoryãµã³ãã«ãOLIMEX LPC-P2148ããŒãã«é©åããã
ãããžã§ã¯ãã®ãã¡ãŒã ãŠã§ã¢ã®åºç€ãšããŠãKEILã§æäŸãããRTX_Memoryã®äŸãåãäžããŸãã ãã®äŸãæ£åžžã«æ©èœãããšãããŒããã³ã³ãã¥ãŒã¿ãŒã«æ¥ç¶ã§ããéåžžã®USBãã©ãã·ã¥ãã©ã€ãã®ããã«è¡šç€ºãããŸãã ãããã£ãŠããã¡ãŒã ãŠã§ã¢ãååŸããŸããããã«ãããæããã«USBã¢ãžã¥ãŒã«ãšãããã»ããµã«å¿ èŠãªãã¹ãŠã®åšèŸºæ©åšãæ£ããæ§æãããŸãã
ãã®ãããžã§ã¯ãã¯ãARM \ Boards \ Keil \ MCB2140 \ RL \ USB \ãã©ã«ãã«ãããŸãã 以äžã®ãã¹ã¯ãKEILç°å¢ãã€ã³ã¹ããŒã«ãããŠããã¡ã€ã³ãã©ã«ããŒã«å¯Ÿããçžå¯Ÿãã¹ã§ãã
ãããžã§ã¯ããå¥ã®å Žæã«ã³ããŒããKEILã«ã¢ããããŒãããŠçµã¿ç«ãŠãŸãã ãšã©ãŒãªãã§éãŸãå¿ èŠããããŸãã ãã®çµæãFlashMagicãŠãŒãã£ãªãã£ã䜿çšããŠãã©ãã·ã¥ã§ããHEXãã¡ã€ã«ãååŸããŸããã
確ãã«ãããŒãäžã§ã¯æ©èœããªãããšã¯æãããªã®ã§ããŸã ãã©ãã·ã¥ããããšã¯ã§ããŸããã
ããŒããšäŸãæžãããããŒãã®åè·¯ãæ¯èŒãããšããããKEILã¢ãã«MCB2140ã§ããå ŽåãD +ã©ã€ã³ãµã¹ãã³ããŒã®æ¥ç¶ã®éãã確èªã§ããŸãã
MCB2140ã§ã¯ãåžžã«3.3Vã«ãã«ã¢ãããããLPC-P2148ã§ã¯ããã®ãã«ã¢ããã¯ãã©ã³ãžã¹ã¿ãä»ããŠãã€ã¯ãã³ã³ãããŒã©ãŒã«ãã£ãŠå¶åŸ¡ãããŸãã
äž¡æ¹ã®ããŒãã®åè·¯å³ã¯ãããããwww.olimex.comããã³www.keil.comã§å ¥æã§ããŸãã
ç°¡åã«ããããã«ãåæåã³ãŒãããããã«å€æŽããŠãããŒãããªã³ã«ãªã£ããšãã«åžžã«D +ã©ã€ã³ãã«ã¢ããããªã³ã«ãªãããã«ããŸããããã¯USB_LINK LEDã§ç€ºãããŸãã
USB_InitïŒïŒããã·ãŒãžã£ã§ãCONNECTè¡ãUSBã¢ãžã¥ãŒã«ããåæããèªåã§ç®¡çããŸãã ãŸããåããã©ã³ãžã¹ã¿ã«USB_LINK LEDãããããããªã³ã«ãããšD +ã©ã€ã³ãªãããèªåçã«ãªã³ã«ãªãããšãããããŸããã
ããã«ãåœç€Ÿã®ããŒãã«ã¯ãMCB2140ãããå°ãªãLEDããããŸãã ãããã£ãŠããããã®ç®çãåå®çŸ©ããå¿ èŠããããŸãã ãã®æç¹ã§ãèªã¿åã/æžã蟌ã¿ããã»ã¹ã瀺ãããã«ããããåå²ãåœãŠããŸããã
LED_CFGã€ã³ãžã±ãŒã¿ãŒãšLED_SUSPã€ã³ãžã±ãŒã¿ãŒããªãããããããžã§ã¯ãã³ãŒãã«åŸã£ãŠãããã®äœ¿çšãã³ã¡ã³ãã¢ãŠãããŠããŸãã
ããã§ããããžã§ã¯ããçµã¿ç«ãŠãŠãã³ã³ãããŒã©ãŒã«ãã©ãã·ã¥ã§ããŸãã ããŒããã³ã³ãã¥ãŒã¿ãŒã«æ¥ç¶ãããšãããŒããå€éšãã©ã€ããšããŠèªèãããã·ã¹ãã ã«çŽ25KBã®ãµã€ãºã®å¥ã®ãã£ã¹ã¯ã衚瀺ãããreadme.txtãã¡ã€ã«ã衚瀺ãããŸãã
ãã®æç¹ã§ãæåã®æ®µéã¯å®äºãããšèŠãªãããšãã§ããŸãã
2. USBãã©ã€ãããäžæã®ããã€ã¹ãžã®ç§»è¡ã
çŸæç¹ã§ã¯ãã©ã®OSãæèŒããã³ã³ãã¥ãŒã¿ãŒã§ããå€éšUSBãã©ã€ããšããŠèªèãããããã€ã¹ããããŸãã ããããWindowsãããã€ã¹ã®æäœæ¹æ³ãç¥ããããã©ã€ããŒãå¿ èŠãšããããšãå¿ èŠã§ãã æ¥ç¶ãããããã€ã¹ããã©ã€ãã¯ã©ã¹ã«å±ããŠãããšããäºå®ã¯ãã€ã³ã¿ãŒãã§ã€ã¹èšè¿°åã«ããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãã©ã¡ãŒã¿ã«ãã£ãŠç€ºãããŸãã
usbdesc.cãã¡ã€ã«ãéããããã§ãã®ãã©ã¡ãŒã¿ãŒãèŠã€ãããšãå€ãUSB_DEVICE_CLASS_STORAGEã§ããããšãããããŸãã
ãããUSB_DEVICE_CLASS_VENDOR_SPECIFICã«çœ®ãæããããã«ç¶ã2ã€ã®ãã£ãŒã«ãããŒãã«çœ®ãæããŸãã
ãããžã§ã¯ããåæ§ç¯ããŠããŒãããã©ãã·ã¥ãããšãWindowsãããã€ã¹ããã©ã€ãã§ããããšãèªèã§ããªããªããé©åãªãã©ã€ããŒã®æäŸãå¿ èŠã«ãªãããšãããããŸãã
åé¡ãããå¯èœæ§ããããŸãã å®éãå€éšèšæ¶è£ 眮ã«é¢é£ããããã€ã¹ã®VIDããã³PIDã以åã«èšæ¶ããŠããWindowsã¯ãããã€ã¹ã¯ã©ã¹ãå€æŽããããšããäºå®ã«æ³šæãæãããšãªãããã®äžã«ãã©ã€ããŒãé 眮ãç¶ããããšãã§ããŸãã 解決çã¯ç°¡åã§ãã ããŒãããŸã ãã©ã€ããšããŠå®çŸ©ãããŠããå Žåã¯ãããã€ã¹ãããŒãžã£ãŒã®USBãã©ã³ãã§èŠã€ããŠããã©ã€ããŒãæåã§åé€ããŸãã ãã®åŸãOSã¯ãã©ã€ããŒãèŠæ±ãå§ããŸãã
3.åºæ¬ãã©ã€ããŒãäœæããŸãã
ãã®ããããã©ã€ããæäŸããå¿ èŠãããæ©èœããUSBââããã€ã¹ããããŸãã
ãŸããããã€ã¹ãUSBãã¹ã«è¡šç€ºããããšãã«ã·ã¹ãã ãèµ·åããããšä»¥å€ã¯ãäœã圹ã«ç«ããªãæãåçŽãªãã©ã€ããŒãäœæããŸãã ãã©ã€ããŒã«ã¯ãæ£ããèµ·åããŠã·ã¹ãã ãã¢ã³ããŒãããããã®æå°éã®ã³ãŒããããããŸããã
æãæå°éã®æ¹æ³ã§ãã©ã€ããŒãäœæããŸãã ã³ãŒãèªäœã¯ã¡ã¢åž³ã§ç·šéãããã³ãã³ãã©ã€ã³ã§åéãããŸãã
éå§ããã«ã¯ãMicrosoft Webãµã€ããããã©ã€ããŒéçºããããããŠã³ããŒãããå¿ èŠããããŸãã Windows Driver KitãšåŒã°ããŸãã WDKããŒãžã§ã³7600.16385.1ã䜿çšããŠããŸãã
ã€ã³ã¹ããŒã«åŸãå€ãã®äŸãã¢ã»ã³ããªã®ç°å¢ãããã³ããã¥ã¡ã³ããååŸããŸãã [ã¹ã¿ãŒã]ã¡ãã¥ãŒã§ãWDKã»ã¯ã·ã§ã³ãš[ãã«ãç°å¢]ãèŠã€ããå¿ èŠããããŸãã ãããã¯ããããããã«ãç°å¢ã§ãã å®éããããã¯ãç®çã®ã·ã¹ãã ã®ãã©ã€ããŒãåéããããã«æ¢ã«ã»ããã¢ãããããŠããã³ã³ãœãŒã«ãæäŸããŸãã
Checkedããã³Freeç°å¢ãããã€ãããOSããšã«åå¥ã®ãã©ã«ããŒãããããšãããããŸãã ããããCheckedã·ã¹ãã ã®æåã®ãã®ã¯ããããã°ã«åœ¹ç«ã€è¿œå æ å ±ãå«ããã©ã€ããŒãåéããŸãã
2çªç®ã¯ãã©ã€ããŒãªãªãŒã¹ãåéããããã䜿çšãããŸãã
Windows XPããåŒãç¶ãx86 Checked Build Environmentã䜿çšããŸãã ããã«ãããWindows XP以éã®ã·ã¹ãã ã§æ£åžžã«åäœãããŠãããŒãµã«ãã©ã€ããŒãåŸãããŸãã
次ã«ãéå§ããã®ã«æã䟿å©ãªãã³ãã¬ãŒããæ¢ããŸãããã
æãé©åãªåè£ã¯ãç¹å®ã®OSR USB-FX2åŠç¿ãããã®äŸã§ããã ããã¯ã©ã®ãããªããŒããããŸã£ããããããªãããå¿ èŠãªäŸã¯WDKã®ãã¹src \ usb \ osrusbfx2 \ã«æ²¿ã£ãŠããã æãèå³æ·±ãã®ã¯ããããåãªãäŸã§ã¯ãªãããã®ããŒãã®ãã©ã€ããŒã®äœææ¹æ³ã«é¢ãã段éçãªãã¥ãŒããªã¢ã«ã§ããããšã§ãã ãŸãã«å¿ èŠãªãã®ã kmdf \ sysãã£ã¬ã¯ããªãããã«æ·±ãèŠãŠããã¹ãŠã®ã¹ãããããããããã«ããããšã確èªããŸãããã ãããã®è©³çŽ°ã«ã€ããŠã¯ãosrusbfx2.htmãã¡ã€ã«ã«ãããµã³ãã«ã®èª¬æãåç §ããŠãã ããã
ããã§ã¯ã以äžã®ã¢ã¯ã·ã§ã³ãããå°ãæ確ã«ããããã«ãå°ãäœè«ããŸãã
å®éã«ã¯ãWindows NTã®ç»å Žä»¥æ¥ããã©ã€ããŒãäœæããéçšã§äœããå€æŽãããŠããŸãã åœæã¯ãOSã«ãŒãã«ã®æ©èœãçŽæ¥äœ¿çšããå¿ èŠããããå€ãã®å ŽåããããŒãããŒããã¢ã³ããŒããPNPã€ãã³ããªã©ã«å¯Ÿå¿ã§ããããã«ããã ãã§ããã åºæ¬çãªæ©èœãç§ã¯å€ãã®ããšãåŠã³ãBSODã«2å以äžé£ã³åºããªããã°ãªããŸããã§ããã ãã®åŸãMicrosoftã¯ãWindowsãã©ã€ããŒã¢ãã«ãšåŒã°ããã¢ãã«ãäœæããŸããããã®ã¢ãã«ã¯ããã©ã€ããŒãã©ã®ããã«èŠããã¹ãããäœããã®æšæºãªã©ãå°å ¥ããŸããã ç§ã¯ããã«ç¹ã«å®å¿ããŠããŸããã§ããã ãããŠæ¬¡ã®ã¹ãããã¯ãWindows Driver FrameworkãšåŒã°ãããã¬ãŒã ã¯ãŒã¯ã§ããã ãã®ãããã§ã人çã¯ãã£ãšæ¥œã«ãªããŸããã ããã§ããã¬ãŒã ã¯ãŒã¯ãã¡ã€ã³ã€ãã³ããåŠçããããã«å¿ èŠãªãã¹ãŠã®åºæ¬ã¢ã¯ã·ã§ã³ã®å®è£ ãåŠçããå¿ èŠãªæ©èœãæ£ããæ¹æ³ã§è¿œå ããã ãã§æžã¿ãŸãã 䜿çšããã®ã¯ãã®æè¡ã§ãã
æåã®ã¹ãããããå§ããŸãã ãx86 Checked Build Environmentããèµ·åãããcdãã³ãã³ãã䜿çšããŠWinDDK \ 7600.16385.1 \ src \ usb \ osrusbfx2 \ kmdf \ sys \ step1 \ãã©ã«ããŒã«ç§»åããŸãã
build -ceZã³ãã³ããå®è¡ããŸãã
ãã«ãããã»ã¹ãçºçãããã®çµæãobjchk_wxp_x86ãã©ã«ããŒãäœæããïŒãã®ååã¯éžæããç°å¢ã«ãã£ãŠç°ãªããŸãïŒãsysæ¡åŒµåãæã€ãã¡ã€ã«ãèŠã€ãããŸãã ãããç§ãã¡ã®ãã©ã€ããŒã§ãã ãããã€ã³ã¹ããŒã«ããã«ã¯ãINFãã¡ã€ã«ãå¿ èŠã§ãã åããããžã§ã¯ãã®æåŸã®ãã©ã«ããŒã§èŠã€ããŠãã ããã osrusbfx2.infãšåŒã°ããŸãã å¯äžã®åé¡ã¯ãäŸã®ããŒãçšã«èšèšãããŠããããšã§ãã ãã®ãã¡ã€ã«ãããŒãçšã®ãã©ã€ããŒãã€ã³ã¹ããŒã«ã§ããããã«ããã«ã¯ãã©ãã§ãVIDãšPIDã®å€ãusbdesc.cãã¡ã€ã«ã®USBããã€ã¹èšè¿°åã«æžã蟌ãŸããŠããå€ã«å€æŽããã ãã§ãã INFãã¡ã€ã«ãç®ã§èŠãŠã¿ããšããã©ã€ããŒãã€ã³ã¹ããŒã«ããããã«WdfCoInstaller01009.dllãã¡ã€ã«ããŸã å¿ èŠã§ããããšãããããŸãã ãŸããWDKã®äŸçµŠã«ãå«ãŸããŠããŸãã
ãã®ããã3ã€ã®ãã¡ã€ã«ãå¥ã ã®ãã©ã«ããŒã«ã³ããŒããŸãïŒçµã¿ç«ãŠãããSYSãINFãWdfCoInstaller01009.dllã
ããŒããã³ã³ãã¥ãŒã¿ãŒã«æ¥ç¶ããWindowsãããã©ã€ããŒãžã®ãã¹ã«ã€ããŠå°ãããããããã®ãã©ã«ããŒãæå®ããŸãã
ãã©ã€ããŒãã¡ã€ã«ãã³ããŒããéåžžã®ããã»ã¹ã芳å¯ãããšãããã€ã¹ãããŒãžã£ãŒã®ãµã³ãã«ããã€ã¹ã¯ã©ã¹ã®äžã«ããã€ã¹ã衚瀺ãããŸãã ãã¹ãŠããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯æºè¶³ã§ãïŒ
ããã§çåãçãããããããŸããããã³ãŒããå®è¡ãããŠããããšãã©ã®ããã«ããŠç¥ãããšãã§ããŸããã èšãæããã°ããã©ã€ããŒããäœããã®ãã£ãŒãããã¯ããããããã®ã§ãã ããã§ããäœãèµ·ãã£ãŠããã®ããç解ããããã«ããã©ã€ããŒã«ãããã°æ å ±ãè¿œå ããæãæ¥ãŸããã
ã«ãŒãã«ã¢ãŒãã§ã¯ãKdPrintïŒïŒé¢æ°ã¯ãããã°æ å ±ãåºåããŸãã ãã®äœ¿çšæ³ã¯ãããç¥ãããŠããprintfïŒïŒãšåãã§ãã åºåã衚瀺ããã«ã¯ãããã°ã©ã DbgViewãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã Microsoftã®Webãµã€ãhttp://technet.microsoft.com/en-us/sysinternals/bb896647ã§å ¥æã§ããŸãã å®è¡ãç¶ãããšãOSã®ã«ãŒãã«ã¢ãŒãããã®ãã¹ãŠã®ãããã°æ å ±ã®åºåã衚瀺ãããŸãã éåžžãå¿ èŠãªã¢ãžã¥ãŒã«ã®ã¡ãã»ãŒãžã®ã¿ã衚瀺ãããããã«ãã£ã«ã¿ãŒãæ§æããŸãã Step_1ã®ç§ã®ããŒãžã§ã³ã§ã¯ãDeviceEntryïŒïŒããã³DeviceAddïŒïŒããã·ãŒãžã£ã«åºåãè¿œå ããŠãã©ã®é¢æ°ãåŒã³åºãããããåçŽã«æžã蟌ã¿ãŸããã ããŒããæ¥ç¶ããã³åæããããšã«ãããDbgViewãŠã£ã³ããŠã§ããããçºçããé åºãæ確ã«ç¢ºèªã§ããŸãã
4.ã«ãŒãã«ã¢ãŒããšãŠãŒã¶ãŒã¢ãŒãã®çžäºäœçšã
ãåãã®ããã«ãããã€ã¹ãã©ã€ããŒã¯ã«ãŒãã«ã¢ãŒãïŒäžéšã®äŸå€ãé€ãïŒã§åäœããã¢ããªã±ãŒã·ã§ã³ã¯ãŠãŒã¶ãŒã¢ãŒãã§åäœããŸãã 察話ã«ã¯ããã¡ã€ã«ã®æäœãšåãã¡ã«ããºã ã䜿çšãããŸãã ã€ãŸããã·ã¹ãã ã«æ¥ç¶ãããŠããåããã€ã¹ã«ã¯ãéåžžã®ãã¡ã€ã«ã®ããã«éãããšãã§ããã·ã³ãã«åããããŸãã ããã§ã¯ãReadFileïŒïŒãWriteFileïŒïŒãªã©ã®ãã¡ã€ã«ãæäœããããã®éåžžã®æé ã䜿çšããŠãã ããã ãã®éšåã§ã¯ããã©ã€ããŒã«ããŒã¿ãéããããéããããæžã蟌ãã ããèªã¿åã£ããããããšãã§ããæ©èœããã©ã€ããŒã«è¿œå ããŸãã
èšé²ãããããŒã¿ãä¿åããŠãåŸã§èªã¿åãæäœäžã«ããããè¿ãããšãã§ããããã«ããŸãã
æåã«è¡ãããšã¯ãEvtDevicePrepareHardwareã€ãã³ãã®ã³ãŒã«ããã¯é¢æ°ãç»é²ããããšã§ããããã¯ãããã€ã¹ãD0ã®åæåãããŠããªãç¶æ ã«å ¥ã£ãåŸããã©ã€ããŒã§äœ¿çšã§ããããã«ãªãåã«PnPãããŒãžã£ãŒãåŒã³åºããŸãã å®éãããã¯éåžžã«åçŽãªããšãæå³ããŸããããã€ã¹ãã¹ã¿ãã¯ãããã©ã€ããŒãèµ·åããŸãããã䜿çšããã«ã¯ããã€ã¹ã®èšå®ãå¿ èŠã«ãªãå ŽåããããŸãã ãã®çš®ã®ãã¥ãŒãã³ã°ã¯ãã®ã€ãã³ãã§è¡ããŸãã USBã«é©çšããå Žåãå°ãªããšãç®çã®æ§æãéžæããå¿ èŠããããŸãã ãããã£ãŠãé¢æ°ãç»é²ããŸãã ãããè¡ãã«ã¯ã次ã®ã³ãŒããDriverEntryã«è¿œå ããŸãã
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
pnpPowerCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware;
WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);
äºçªç®ã åã®æ®µèœã®ãã©ã€ããŒã³ãŒãããã®WdfDeviceCreateããã·ãŒãžã£ã³ãŒã«ã«æ³šæãæããšããã®ããã·ãŒãžã£ã®2çªç®ã®ãã©ã¡ãŒã¿ãŒã«å®æ°WDF_NO_OBJECT_ATTRIBUTESãæž¡ãããããšã«æ°ä»ãã§ãããã ã€ãŸããããã€ã¹ãªããžã§ã¯ãã«ã¯å±æ§ããããŸããã ããããå®éã«ã¯ãå°ãªããšã1ã€ã®å±æ§ãå¿ èŠã§ãã ããã¯ãããããããã€ã¹ã³ã³ããã¹ãã§ãã ç°¡åã«èšãã°ãããã¯ããã©ã€ããŒã«ãã£ãŠãµããŒããããããã€ã¹ã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã«é¢é£ããäœããã®çš®é¡ã®æ§é ã§ããããã©ã€ããŒã®ã»ãŒã©ãã§ãå©çšå¯èœã«ãªããŸãã ããšãã°ãäœããã®çš®é¡ã®ãããã¡ãå«ãŸããŠããå ŽåããããŸãã ãããŠããã©ã€ããŒã§ã¯ãªãããã€ã¹ãªããžã§ã¯ãã«æ·»ä»ãããŸãã è€æ°ã®åäžã®ããã€ã¹ãã³ã³ãã¥ãŒã¿ãŒã«æ¥ç¶ããããšãã§ãããããã¯åããã©ã€ããŒã«ãã£ãŠæäŸãããŸããããããã¯ãã¹ãŠç¬èªã®ããã€ã¹ãªããžã§ã¯ããæã¡ãŸãã
ãã®ãããã³ã³ããã¹ãæ§é äœãäœæããå±æ§ãã©ã¡ãŒã¿ãŒã§åæåããŠãããã«WdfDeviceCreateã«æž¡ããŸãã
typedef struct _DEVICE_CONTEXT {
WDFUSBDEVICE UsbDevice;
WDFUSBINTERFACE UsbInterface;
WDFUSBPIPE BulkReadPipe;
WDFUSBPIPE BulkWritePipe;
} DEVICE_CONTEXT, *PDEVICE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DEVICE_CONTEXT, GetDeviceContext)
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);
äžçªç®ã 次ã«ããã©ã€ããŒããŠãŒã¶ãŒã¢ãŒãããã°ã©ã ã§äœ¿çšã§ããããã«ããã€ã³ã¿ãŒãã§ã€ã¹ãäœæããå¿ èŠããããŸãã 以åã¯ãããã°ã©ãã¯ãCreateFileããã·ãŒãžã£ãä»ããŠããã€ã¹ã«ã¢ã¯ã»ã¹ã§ããååãããŒãã³ãŒãããå¿ èŠããããŸããã ããã§ãã¹ãŠãç°¡åã«ãªããŸããã 1ã€ã®ããã·ãŒãžã£ãåŒã³åºãã ãã§ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããå¿ èŠããããçæãããGUIDã䜿çšããŠãããèå¥ããŸãã ããã«ãŠãŒã¶ãŒã¢ãŒãã§ã¯ãåãGUIDã䜿çšããŠããã€ã¹ãã¡ã€ã«åãååŸããŸãã ãããã£ãŠãGUIDãšãããã€ã³ã¿ãŒãã§ã€ã¹ã«ãªã³ã¯ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
DEFINE_GUID(GUID_DEVINTERFACE_OSRUSBFX2, // Generated using guidgen.exe
0x573e8c73, 0xcb4, 0x4471, 0xa1, 0xbf, 0xfa, 0xb2, 0x6c, 0x31, 0xd3, 0x84);
// {573E8C73-0CB4-4471-A1BF-FAB26C31D384}
status = WdfDeviceCreateDeviceInterface(device,
(LPGUID) &GUID_DEVINTERFACE_OSRUSBFX2,
NULL);// Reference String
æåŸã®1ã€ã æåã®æ®µèœã§ã¯ãEvtDevicePrepareHardwareã€ãã³ããåŠçããããã·ãŒãžã£ãç»é²ããŸããã ä»ãããªãã¯ãããæžãå¿ èŠããããŸãã ç§ã¯èšäºã®ããã¹ããæžãæããŸããããœãŒã¹ã³ãŒããèŠãæ¹ãç°¡åã ãšæããŸãã ãã®æé ã§ã¯ãæ¥ç¶ãããããã€ã¹ã䜿çšãããã©ã€ããŒã®ãã®åŸã®æäœã«å¿ èŠãªãã¹ãŠã®ãã®ãæºåããŠãããšèšããŸãã å ·äœçã«ã¯ãUSBããã€ã¹ãªããžã§ã¯ããäœæããç®çã®æ§æãéžæããããã€ã¹ã³ã³ããã¹ãã®ããã€ã¹ã«å®è£ ãããŠããã€ã³ã¿ãŒãã§ã€ã¹ã®BULKãšã³ããã€ã³ãã«é¢é£ãããã£ãã«èå¥åãä¿åããŸãã ããŒã¿è»¢éãå®è£ ããã«ã¯ããããã®èå¥åãåŸã§å¿ èŠã«ãªããŸãã æ確ã«ããããã«ããã£ãã«ãã©ã¡ãŒã¿ãŒã®åºåãDbgViewã«è¿œå ããŸããã ãããã®ãã©ã¡ãŒã¿ãŒã¯ããã¡ãŒã ãŠã§ã¢ã®usbdesc.hãã¡ã€ã«ã®ãšã³ããã€ã³ãèšè¿°åã§æå®ããå€ãšåãã§ããããšã«æ°ä»ããããããŸããã
ãã®ããããã©ã€ããŒãå床åæ§ç¯ããã·ã¹ãã ã§æŽæ°ã§ããŸãã çŸæç¹ã§ã¯ããã©ã€ããŒã¯èµ·åããã ãã§ã¯ãããŸããã 圌ã¯æ¢ã«æ¥ç¶ãããããã€ã¹ãæ§æããæ¹æ³ãç¥ã£ãŠãããæãéèŠãªããšã¯ããŠãŒã¶ãŒã¢ãŒãããã®ããã°ã©ã ã§å©çšå¯èœã«ãªã£ãŠããŸãã
5.ãŠãŒã¶ãŒã¢ãŒããããã©ã€ããŒãæäœããŸãã
次ã«ããã©ã€ããŒãžã®ã¢ã¯ã»ã¹ã®ã¿ãè©Šã¿ãç°¡åãªã³ã³ãœãŒã«ããã°ã©ã ãäœæããŸãã ãåç¥ã®ããã«ãçŸæç¹ã§ã¯ããã©ã€ããŒã¯èªåèªèº«ã«ã¢ã¯ã»ã¹ããæ©äŒãäžããããšãé€ããŠãä»ã«äœããè¡ãæ¹æ³ãç¥ããŸããã
ããã€ã¹ã§ã®äœæ¥ã¯ãéåžžã®ãã¡ã€ã«ãšããŠããã€ã¹ãéããéåžžã®WriteFileããã³ReadFileããã·ãŒãžã£ã䜿çšããŠããŒã¿ã®æžã蟌ã¿ãšèªã¿åããè¡ãããšã«ãªããŸãã ãŸãããã©ã€ããŒãšã®çžäºäœçšãæŽçããããã®éåžžã«äŸ¿å©ãªDeviceIoControlããã·ãŒãžã£ããããŸããããã¯ããã¡ã€ã«ãæäœãã圢åŒãè¶ ããŠããŸããã䜿çšããŸããã ãã¡ã€ã«ã¯CreateFileã®éåžžã®åŒã³åºãã«ãã£ãŠéãããŸããããã¡ã€ã«åã®ã¿ãå¿ èŠã§ãã ãããŠãããã§GUIDãå¿ èŠã«ãªããŸããããã¯ãã©ã€ããŒã€ã³ã¿ãŒãã§ã€ã¹ã«çµã³ä»ããããŠããŸãã GUIDã䜿çšããŠååãååŸããæé å šäœã«ã€ããŠã¯èª¬æããŸããããWDKã®äŸããå®å šã«åã£ãããšãæ£çŽã«èªããŸãã GetDevicePathããã·ãŒãžã£ã¯GUIDãåãåããããã«å¯Ÿå¿ãããã«ãã¹ãè¿ããŸãã
ãã¡ã€ã«ãéããŠããŸãã ãã¡ã€ã«ãã10ãã€ããèšé²ããŠèªã¿åãåŒã³åºããããã€ãè¿œå ããŸãã
ãããããã©ã€ããŒã«æ»ããŸãããã ãŠãŒã¶ãŒããã°ã©ã ã§ã¯ããã§ã«ãã©ã€ããŒã«æžã蟌ã¿ããã©ã€ããŒããèªã¿åããŸããããã©ã€ããŒã³ãŒãèªäœã¯ããã«ã€ããŠäœãç¥ããŸããã ç¶æ³ãä¿®æ£ããŠãã ããã
ããã§ã®ããžãã¯ã¯ãEvtDevicePrepareHardwareãšåãã§ãã ãã©ã€ããŒããã®èªã¿åããŸãã¯ãã©ã€ããŒãžã®æžã蟌ã¿ã®æé ãçºçãããšãã«åŒã³åºãããã³ãŒã«ããã¯é¢æ°ãç»é²ããå¿ èŠããããŸãã ããã¯EvtDeviceAddã§è¡ãããŸãã I / Oãã¥ãŒãåæåãããã£ãŒã«ãã«ã³ãŒã«ããã¯é¢æ°ãžã®ãã€ã³ã¿ãŒãå ¥åããããã€ã¹ãªããžã§ã¯ãã«ã¢ã¿ããããŠäœæããå¿ èŠããããŸãã è¡ããïŒ
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig,
WdfIoQueueDispatchParallel);
ioQueueConfig.EvtIoRead = EvtIoRead;
ioQueueConfig.EvtIoWrite = EvtIoWrite;
status = WdfIoQueueCreate(device,
&ioQueueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
WDF_NO_HANDLE);
èªã¿åãããã³æžã蟌ã¿ããã·ãŒãžã£ã宣èšããããšã«å ããŠãããããå®è£ ããããšãå¿ããªãã§ãã ããã ãã®æ®µéã§ã¯ã転éãããããŒã¿ãDbgViewã«åºåããã¹ã¿ããé 眮ããèªã¿åãæã«10ãã€ãã®é åãæž¡ããŸãã ãœãŒã¹ã³ãŒãã§ãããã®ã³ãŒããèŠãããšãã§ããŸãã ãããããããšã¯äœããããŸãããã¡ã¢ãªãæäœããããšã«æ³šæãæãããšããå§ãããŸãã ç¹å®ã®ã«ãŒã«ã«åŸã£ãŠããããã¡ãåä¿¡ããå¿ èŠããããŸãã ããŒã¿ã¯ã«ãŒãã«ã¢ãŒããšãŠãŒã¶ãŒã¢ãŒãã®éã移åããŸãã ã¹ã¯ãªãŒã³ã·ã§ããã¯ããã©ã€ããŒã«ããŒã¿ãéä¿¡ããæ¹æ³ãæ確ã«ç€ºããŠãããDbgViewãŠã£ã³ããŠã«è¡šç€ºãããŸãã 次ã«ããã©ã€ããŒããããã±ãŒãžãèªã¿åããã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ã®åºåã§ååŸããŸãã
6.ãã©ã€ããŒã䟿å©ã«ããŸãã
ããã§ããã©ã€ããŒã䟿å©ã«ããæãæ¥ãŸããã çŸæç¹ã§ã¯ã圌ã¯ãŠãŒã¶ãŒã¢ãŒãã§éä¿¡ããŠããŸãããå®éã®ããã€ã¹ã§ã¯åäœããŸããã ããšã¯ãèšé²æé ã§ããã€ã¹ã«ããŒã¿ãéä¿¡ããã³ãŒããšãèªã¿åãæé ã§ããã€ã¹ããããŒã¿ãåä¿¡ããã³ãŒããè¿œå ããã ãã§ãã ãœãŒã¹ã§ã¯ããã©ã€ããŒã§å ¥å/åºåãåŠçããæé ããããã«å€æŽãããŠããããšãããããŸãã ãããã¡ãUSBã«ãŒãã«ãµãã·ã¹ãã ã«ããã«è»¢éããã ãã§ãå¿ èŠã«å¿ããŠãã¹ãŠãå®è¡ãããŸãã
PCãšããã€ã¹éã®å®éã®ããŒã¿è»¢éãéå§ããåã«ãããã€ã¹ã®ãã¡ãŒã ãŠã§ã¢ãå€æŽããŠãäœããã®æ¹æ³ã§ããŒã¿ã«å¿çããå¿ èŠããããŸãã
ããŒã¿åä¿¡ã€ãã³ãã®åŠçã§ã³ãŒããå€æŽããŠãåä¿¡ããæåã®ãã€ãã0x01ã®å Žåã¯LED_1ããªã³ã«ãã0x02ã®å Žåã¯LED_2ããªã³ã«ããŸãã ãããŠä»¥æ¥ ããã€ã¹ãžã®æžã蟌ã¿åŸãããã«10ãã€ããèªã¿åãããã®ã³ãŒããè¿œå ããŸãã çä¿¡ãã±ããã®åŠçã€ãã³ãã§éä¿¡ããããã«ãã±ãããéä¿¡ããããšã«æ³šæããŠãã ããã ããã¯ãUSBã¢ãžã¥ãŒã«ã®ãã®ãããªæ©èœã§ãã INãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ã§ããããã«ãéä¿¡ããããŒã¿ãäºåã«æäŸããå¿ èŠããããŸãã ãŸããæ確ã«ããããã«ã2ã€ã®ç°ãªãé åãæž¡ããŸãã MSC_BulkOutïŒïŒã®å 容ã次ã®ããã«å€æŽããŸãã
void MSC_BulkOut (void) {
BulkLen = USB_ReadEP(MSC_EP_OUT, BulkBuf);
LED_Off( LED_RD | LED_WR );
if( BulkBuf[ 0 ] == 0x01 )
{
USB_WriteEP( MSC_EP_IN, (unsigned char*)aBuff_1, sizeof( aBuff_1 ) );
LED_On( LED_RD );
}
else
if( BulkBuf[ 0 ] == 0x02 )
{
USB_WriteEP( MSC_EP_IN, (unsigned char*)aBuff_2, sizeof( aBuff_1 ) );
LED_On( LED_WR );
}
}
ãŸããããã·ãŒãžã£MSC_BulkInïŒïŒã§ã¯ããã¹ãŠã®ã³ãŒããã³ã¡ã³ãåããå®å šã«ç©ºã®ãŸãŸã«ããŸãã
ã¹ã¯ãªãŒã³ã·ã§ããã«è¡šç€ºãããå šäœã®æã®çµæã
åæã«ãããŒãèªäœã2ã€ã®LEDã§ç¹æ» ããŸãã
ããã ãã§ãã ç¬èªã®USBããã€ã¹çšã®ãã¡ãŒã ãŠã§ã¢ãšå®å šãªãã©ã€ããŒãäœæããŸããã 4kã®ãããã¯ã§è»¢éãéå§ãããšã800 Kb / sã®é床ãéæã§ããŸãã
ã芧ã®ãšããããã©ã€ããŒããã¹ãã¯éåžžã«ã·ã³ãã«ã§ãçŽ250è¡ããå«ãŸããŠããŸããã
ãã®èšäºã§ã¯ãæ©èœãããã©ã€ããŒãååŸããããã«å¿ èŠãªåºæ¬çãªæé ã®ã¿ã説æããŸããã 䜿çšãããæé ã®è©³çŽ°ã«ã€ããŠã¯ãWDKã§èªãå¿ èŠããããŸãã ããã«ãä»ã§ã¯ãã®ããã¥ã¡ã³ããèªãã®ããšãŠã楜ãããªããäŸããããããããŸãã
ãœãŒã¹ã³ãŒããå«ãå®å šãªã¢ãŒã«ã€ãã¯ããããããŠã³ããŒãã§ããŸãã
ã¢ãŒã«ã€ãã«ã¯ããã€ã³ãã§ååãä»ãããããã©ã«ããŒãå«ãŸããåãã©ã«ããŒã«ã¯ã察å¿ãã段èœã§éæããæçµçµæãå«ãŸããŠããŸãã
ãã®èšäºãã¬ã€ãããã¯ããŠã®æãæ¹ããšã¯éã£ãŠããŠã誰ãã圹ã«ç«ã€ãšæãããšãé¡ã£ãŠããŸãã