[font=΢ÈíÑźÚ]±¾ÎÄתÖÁ[/font]
[font=΢ÈíÑźÚ]ÖйúITʵÑéÊÒ¡¡[color=Black]Ï£Íû¶Ô´ó¼ÒÓÐÓÃ[/font][/color] [align=left][font=΢ÈíÑźÚ] Ëæ×ÅÉú»îˮƽµÄÌá¸ß£¬ÈËÃǶÔUSBÉ豸µÄʹÓÃÒ²Ô½À´Ô½¶à£¬¼øÓÚLinuxÔÚÓ²¼þÅäÖÃÉÏÉв»ÄÜÈ«²¿¼´²å¼´Óã¬Òò´Ë¹ØÓÚLinuxÈçºÎÅäÖúÍʹÓ㬳ÉΪÀ§ÈÅÎÒÃǵÄÒ»´óÎÊÌâ¡£[/font][/align]
ʲôÊÇUSB£¿
[font=΢ÈíÑźÚ] USBÊÇÓ¢ÎÄUniversal SerialBusµÄËõд£¬ÒâΪͨÓô®ÐÐ×ÜÏß¡£USB×î³õÊÇΪÁËÌæ´úÐí¶à²»Í¬µÄµÍËÙ×ÜÏߣ¨°üÀ¨²¢ÐС¢´®ÐкͼüÅÌÁ¬½Ó£©¶øÉè¼ÆµÄ£¬ËüÒÔµ¥Ò»ÀàÐ͵Ä×ÜÏßÁ¬½Ó¸÷ÖÖ²»Í¬µÄÀàÐ͵ÄÉ豸¡£USBµÄ·¢Õ¹ÒѾ³¬Ô½ÁËÕâЩµÍËÙµÄÁ¬½Ó·½Ê½£¬ËüÏÖÔÚ¿ÉÒÔÖ§³Ö¼¸ºõËùÓпÉÒÔÁ¬½Óµ½PCÉϵÄÉ豸¡£×îеÄUSB¹æ·¶ÐÞ¶©ÁËÀíÂÛÉϸߴï480MbpsµÄ¸ßËÙÁ¬½Ó¡£LinuxÄÚºËÖ§³ÖÁ½ÖÖÖ÷ÒªÀàÐ͵ÄUSBÇý¶¯³ÌÐò£ºËÞÖ÷ϵͳÉϵÄÇý¶¯³ÌÐòºÍÉ豸ÉϵÄÇý¶¯³ÌÐò£¬´ÓËÞÖ÷µÄ¹ÛµãÀ´¿´£¨Ò»¸öÆÕͨµÄËÞÖ÷Ò²¾ÍÊÇÒ»¸öPC»ú£©£¬ËÞÖ÷ϵͳµÄUSBÉ豸Çý¶¯³ÌÐò¿ØÖƲåÈëÆäÖеÄUSBÉ豸£¬¶øUSBÉ豸µÄÇý¶¯³ÌÐò¿ØÖƸÃÉ豸ÈçºÎ×÷Ϊһ¸öUSBÉ豸ºÍÖ÷»úͨÐÅ¡£[/font]
USBµÄ¾ßÌå¹¹³É
[font=΢ÈíÑźÚ] ÔÚ¶¯ÊÖдUSBÇý¶¯³ÌÐòÕâǰ£¬ÈÃÎÒÃÇÏÈ¿´¿´Ð´µÄUSBÇý¶¯³ÌÐòÔÚÄÚºËÖеĽṹ£¬ÈçÏÂͼ£º[/font]
[align=center][font=΢ÈíÑźÚ][img=400,244]http://linux.chinaitlab.com/UploadFiles_7565/200710/20071016111625771.gif[/img][/font][/align][font=΢ÈíÑźÚ] USBÇý¶¯³ÌÐò´æÔÚÓÚ²»Í¬µÄÄÚºË×ÓϵͳºÍUSBÓ²¼þ¿ØÖÆÆ÷Ö®¼ä£¬USBºËÐÄΪUSBÇý¶¯³ÌÐòÌṩÁËÒ»¸öÓÃÓÚ·ÃÎʺͿØÖÆUSBÓ²¼þµÄ½Ó¿Ú£¬¶ø²»±Ø¿¼ÂÇϵͳµ±Ç°´æÔڵĸ÷ÖÖ²»Í¬ÀàÐ͵ÄUSBÓ²¼þ¿ØÖÆÆ÷¡£USBÊÇÒ»¸ö·Ç³£¸´ÔÓµÄÉ豸£¬linuxÄÚºËΪÎÒÃÇÌṩÁËÒ»¸ö³ÆÎªUSBµÄºËÐĵÄ×ÓϵͳÀ´´¦Àí´ó²¿·ÖµÄ¸´ÔÓÐÔ£¬USBÉ豸°üÀ¨ÅäÖÃ(configuration)¡¢½Ó¿Ú£¨interface£©ºÍ¶Ëµã(endpoint)£¬USBÉ豸°ó¶¨µ½½Ó¿ÚÉÏ£¬¶ø²»ÊÇÕû¸öUSBÉ豸¡£ÈçÏÂͼËùʾ£º[/font]
[align=center][font=΢ÈíÑźÚ][img=368,420]http://linux.chinaitlab.com/UploadFiles_7565/200710/20071016111626867.gif[/img][/font][/align]
[font=΢ÈíÑźÚ] USBͨÐÅ×î»ù±¾µÄÐÎʽÊÇͨ¹ý¶Ëµã£¨USB¶Ëµã·ÖÖжϡ¢ÅúÁ¿¡¢µÈʱ¡¢¿ØÖÆËÄÖÖ£¬Ã¿ÖÖÓÃ;²»Í¬£©£¬USB¶ËµãÖ»ÄÜÍùÒ»¸ö·½Ïò´«ËÍÊý¾Ý£¬´ÓÖ÷»úµ½É豸»òÕß´ÓÉ豸µ½Ö÷»ú£¬¶Ëµã¿ÉÒÔ¿´×÷Êǵ¥ÏòµÄ¹ÜµÀ£¨pipe£©¡£ËùÒÔÎÒÃÇ¿ÉÒÔÕâÑùÈÏΪ£ºÉ豸ͨ³£¾ßÓÐÒ»¸ö»òÕ߸ü¶àµÄÅäÖã¬ÅäÖþ³£¾ßÓÐÒ»¸ö»òÕ߸ü¶àµÄ½Ó¿Ú£¬½Ó¿Úͨ³£¾ßÓÐÒ»¸ö»òÕ߸ü¶àµÄÉèÖ㬽ӿÚûÓлò¾ßÓÐÒ»¸öÒÔÉϵĶ˵㡣Çý¶¯³ÌÐò°ÑÇý¶¯³ÌÐò¶ÔÏó×¢²áµ½USB×ÓϵͳÖУ¬ÉÔºóÔÙʹÓÃÖÆÔìÉ̺ÍÉ豸±êʶÀ´ÅжÏÊÇ·ñÒѾ°²×°ÁËÓ²¼þ¡£USBºËÐÄʹÓÃÒ»¸öÁÐ±í£¨ÊÇÒ»¸ö°üº¬ÖÆÔìÉÌIDºÍÉ豸ºÅIDµÄÒ»¸ö½á¹¹Ì壩À´Åж϶ÔÓÚÒ»¸öÉ豸¸ÃʹÓÃÄÄÒ»¸öÇý¶¯³ÌÐò£¬ÈȲ岦½Å±¾Ê¹ÓÃËüÀ´È·¶¨µ±Ò»¸öÌØ¶¨µÄÉ豸²åÈ뵽ϵͳʱ¸Ã×Ô¶¯×°ÔØÄÄÒ»¸öÇý¶¯³ÌÐò¡£[/font]
[font=΢ÈíÑźÚ] ÉÏÃæÎÒÃǼòҪ˵Ã÷ÁËÇý¶¯³ÌÐòµÄ»ù±¾ÀíÂÛ£¬ÔÚдһ¸öÉ豸Çý¶¯³ÌÐò֮ǰ£¬ÎÒÃÇ»¹ÒªÁ˽âÒÔÏÂÁ½¸ö¸ÅÄģ¿éºÍÉ豸Îļþ¡£[/font]
[font=΢ÈíÑźÚ] Ä£¿é£ºÊÇÔÚÄں˿ռäÔËÐеijÌÐò£¬Êµ¼ÊÉÏÊÇÒ»ÖÖÄ¿±ê¶ÔÏóÎļþ£¬Ã»ÓÐÁ´½Ó£¬²»ÄܶÀÁ¢ÔËÐУ¬µ«ÊÇ¿ÉÒÔ×°ÔØµ½ÏµÍ³ÖÐ×÷ΪÄں˵ÄÒ»²¿·ÖÔËÐУ¬´Ó¶ø¿ÉÒÔ¶¯Ì¬À©³äÄں˵ŦÄÜ¡£Ä£¿é×îÖ÷ÒªµÄÓô¦¾ÍÊÇÓÃÀ´ÊµÏÖÉ豸Çý¶¯³ÌÐò¡£Linux϶ÔÓÚÒ»¸öÓ²¼þµÄÇý¶¯£¬¿ÉÒÔÓÐÁ½ÖÖ·½Ê½£ºÖ±½Ó¼ÓÔØµ½Äں˴úÂëÖУ¬Æô¶¯ÄÚºËʱ¾Í»áÇý¶¯´ËÓ²¼þÉ豸¡£ÁíÒ»ÖÖ¾ÍÊÇÒÔÄ£¿é·½Ê½£¬±àÒëÉú³ÉÒ»¸ö.koÎļþ(ÔÚ2.4ÒÔÏÂÄÚºËÖÐÊÇÓÃ.o×÷Ä£¿éÎļþ£¬ÎÒÃÇÒÔ2.6µÄÄÚºËΪ׼£¬ÒÔÏÂͬ)¡£µ±Ó¦ÓóÌÐòÐèҪʱÔÙ¼ÓÔØµ½Äں˿ռäÔËÐС£ËùÒÔÎÒÃÇËù˵µÄÒ»¸öÓ²¼þµÄÇý¶¯³ÌÐò£¬Í¨³£Ö¸µÄ¾ÍÊÇÒ»¸öÇý¶¯Ä£¿é¡£[/font]
[font=΢ÈíÑźÚ] É豸Îļþ£º¶ÔÓÚÒ»¸öÉ豸£¬Ëü¿ÉÒÔÔÚ/devÏÂÃæ´æÔÚÒ»¸ö¶ÔÓ¦µÄÂß¼É豸½Úµã£¬Õâ¸ö½ÚµãÒÔÎļþµÄÐÎʽ´æÔÚ£¬µ«Ëü²»ÊÇÆÕͨÒâÒåÉϵÄÎļþ£¬ËüÊÇÉ豸Îļþ£¬¸üÈ·ÇеÄ˵£¬ËüÊÇÉ豸½Úµã¡£Õâ¸ö½ÚµãÊÇͨ¹ýmknodÃüÁÁ¢µÄ£¬ÆäÖÐÖ¸¶¨ÁËÖ÷É豸ºÅºÍ´ÎÉ豸ºÅ¡£Ö÷É豸ºÅ±íÃ÷ÁËijһÀàÉ豸£¬Ò»°ã¶ÔÓ¦×ÅÈ·¶¨µÄÇý¶¯³ÌÐò£»´ÎÉ豸ºÅÒ»°ãÊÇÇø·Ö²»Í¬ÊôÐÔ£¬ÀýÈ粻ͬµÄʹÓ÷½·¨£¬²»Í¬µÄλÖ㬲»Í¬µÄ²Ù×÷¡£Õâ¸öÉ豸ºÅÊÇ´Ó/proc/devicesÎļþÖлñµÃµÄ£¬ËùÒÔÒ»°ãÊÇÏÈÓÐÇý¶¯³ÌÐòÔÚÄÚºËÖУ¬²ÅÓÐÉ豸½ÚµãÔÚĿ¼ÖС£Õâ¸öÉ豸ºÅ£¨ÌØÖ¸Ö÷É豸ºÅ£©µÄÖ÷Òª×÷Ó㬾ÍÊÇÉùÃ÷É豸ËùʹÓõÄÇý¶¯³ÌÐò¡£Çý¶¯³ÌÐòºÍÉ豸ºÅÊÇÒ»Ò»¶ÔÓ¦µÄ£¬µ±Äã´ò¿ªÒ»¸öÉ豸Îļþʱ£¬²Ù×÷ϵͳ¾ÍÒѾ֪µÀÕâ¸öÉ豸Ëù¶ÔÓ¦µÄÇý¶¯³ÌÐò¡£¶ÔÓÚÒ»¸öÓ²¼þ£¬LinuxÊÇÕâÑùÀ´½øÐÐÇý¶¯µÄ£ºÊ×ÏÈ£¬ÎÒÃDZØÐëÌṩһ¸ö.koµÄÇý¶¯Ä£¿éÎļþ¡£ÎÒÃÇҪʹÓÃÕâ¸öÇý¶¯³ÌÐò£¬Ê×ÏÈÒª¼ÓÔØËü£¬ÎÒÃÇ¿ÉÒÔÓÃinsmodxxx.ko£¬ÕâÑùÇý¶¯¾Í»á¸ù¾Ý×Ô¼ºµÄÀàÐÍ£¨×Ö·ûÉ豸ÀàÐÍ»ò¿éÉ豸ÀàÐÍ£¬ÀýÈçÊó±ê¾ÍÊÇ×Ö·ûÉ豸¶øÓ²Å̾ÍÊÇ¿éÉ豸£©Ïòϵͳע²á£¬×¢²á³É¹¦ÏµÍ³»á·´À¡Ò»¸öÖ÷É豸ºÅ£¬Õâ¸öÖ÷É豸ºÅ¾ÍÊÇϵͳ¶ÔËüµÄΨһ±êʶ¡£Çý¶¯¾ÍÊǸù¾Ý´ËÖ÷É豸ºÅÀ´´´½¨Ò»¸öÒ»°ã·ÅÖÃÔÚ/devĿ¼ÏµÄÉ豸Îļþ¡£ÔÚÎÒÃÇÒª·ÃÎÊ´ËÓ²¼þʱ£¬¾Í¿ÉÒÔ¶ÔÉ豸Îļþͨ¹ýopen¡¢read¡¢write¡¢closeµÈÃüÁî½øÐС£¶øÇý¶¯¾Í»á½ÓÊÕµ½ÏàÓ¦µÄread¡¢write²Ù×÷¶ø¸ù¾Ý×Ô¼ºµÄÄ£¿éÖеÄÏàÓ¦º¯Êý½øÐвÙ×÷ÁË¡£[/font]
USBÇý¶¯³ÌÐòÈçºÎÓ¦ÓÃ
[font=΢ÈíÑźÚ] Á˽âÁËÉÏÊöÀíÂÛºó£¬ÎÒÃǾͿÉÒÔ¶¯ÊÖдÇý¶¯³ÌÐò£¬Èç¹ûÄã»ù±¾¹¦ºÃ£¬¶øÇÒд¹ýlinuxϵÄÓ²¼þÇý¶¯£¬USBµÄÓ²¼þÇý¶¯ºÍpci_driverºÜÀàËÆ£¬ÄÇôдUSBµÄÇý¶¯¾Í±È½Ï¼òµ¥ÁË£¬Èç¹ûÄãÖ»ÊÇ´óÌåÁ˽âÁËlinuxµÄÓ²¼þÇý¶¯£¬ÄÇÒ²²»Òª½ô£¬ÒòΪÔÚlinuxµÄÄÚºËÔ´ÂëÖÐÓÐÒ»¸ö¿ò¼Ü³ÌÐò¿ÉÒÔÄÃÀ´½èÓÃһϣ¬Õâ¸ö¿ò¼Ü³ÌÐòÔÚ/usr/src/~£¨ÄãµÄÄں˰汾£¬ÒÔÏÂͬ£©/drivers/usbÏ£¬ÎļþÃûΪusb-skeleton.c¡£Ð´Ò»¸öUSBµÄÇý¶¯³ÌÐò×î»ù±¾µÄÒª×öËļþÊ£ºÇý¶¯³ÌÐòÒªÖ§³ÖµÄÉ豸¡¢×¢²áUSBÇý¶¯³ÌÐò¡¢Ì½²âºÍ¶Ï¿ª¡¢Ìá½»ºÍ¿ØÖÆurb£¨USBÇëÇó¿é£©£¨µ±È»Ò²¿ÉÒÔ²»ÓÃurbÀ´´«ÊäÊý¾Ý£¬ÏÂÎÄÎÒÃÇ»á˵µ½£©¡£[/font]
[font=΢ÈíÑźÚ] Çý¶¯³ÌÐòÖ§³ÖµÄÉ豸£ºÓÐÒ»¸ö½á¹¹Ìåstruct usb_device_id£¬Õâ¸ö½á¹¹ÌåÌṩÁËÒ»Áв»Í¬ÀàÐ͵ĸÃÇý¶¯³ÌÐòÖ§³ÖµÄUSBÉ豸£¬¶ÔÓÚÒ»¸öÖ»¿ØÖÆÒ»¸öÌØ¶¨µÄUSBÉ豸µÄÇý¶¯³ÌÐòÀ´Ëµ£¬struct usb_device_id±í±»¶¨ÒåΪ£º[/font]
[font=΢ÈíÑźÚ] /* Çý¶¯³ÌÐòÖ§³ÖµÄÉ豸Áбí */[/font]
[font=΢ÈíÑźÚ] static struct usb_device_id skel_table [] = {[/font]
[font=΢ÈíÑźÚ] { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },[/font]
[font=΢ÈíÑźÚ] { } /* ÖÕÖ¹Èë¿Ú */[/font]
[font=΢ÈíÑźÚ] };[/font]
[font=΢ÈíÑźÚ] MODULE_DEVICE_TABLE (usb, skel_table);[/font]
[font=΢ÈíÑźÚ] ¶ÔÓÚPCÇý¶¯³ÌÐò£¬MODULE_DEVICE_TABLEÊDZØÐèµÄ£¬¶øÇÒusb±ØÐèΪ¸ÃºêµÄµÚÒ»¸öÖµ£¬¶øUSB_SKEL_VENDOR_IDºÍUSB_SKEL_PRODUCT_ID¾ÍÊÇÕâ¸öÌØÊâÉ豸µÄÖÆÔìÉ̺ͲúÆ·µÄIDÁË£¬ÎÒÃÇÔÚ³ÌÐòÖаѶ¨ÒåµÄÖµ¸ÄΪÎÒÃÇÕâ¿îUSBµÄ£¬È磺[/font]
[font=΢ÈíÑźÚ] /* ¶¨ÒåÖÆÔìÉ̺ͲúÆ·µÄIDºÅ */[/font]
[font=΢ÈíÑźÚ] #define USB_SKEL_VENDOR_ID 0x1234[/font]
[font=΢ÈíÑźÚ] #define USB_SKEL_PRODUCT_ID 0x2345[/font]
[font=΢ÈíÑźÚ] ÕâÁ½¸öÖµ¿ÉÒÔͨ¹ýÃüÁîlsusb£¬µ±È»ÄãµÃÏȰÑUSBÉ豸ÏȲ嵽Ö÷»úÉÏÁË¡£»òÕ߲鿴³§É̵ÄUSBÉ豸µÄÊÖ²áÒ²Äܵõ½£¬ÔÚÎÒ»úÆ÷ÉÏÔËÐÐlsusbÊÇÕâÑùµÄ½á¹û£º[/font]
[font=΢ÈíÑźÚ] Bus 004 Device 001: ID 0000:0000[/font]
[font=΢ÈíÑźÚ] Bus 003 Device 002: ID 1234:2345 Abc Corp.[/font]
[font=΢ÈíÑźÚ] Bus 002 Device 001: ID 0000:0000[/font]
[font=΢ÈíÑźÚ] Bus 001 Device 001: ID 0000:0000[/font]
[font=΢ÈíÑźÚ] µÃµ½ÕâÁ½¸öÖµºó°ÑËü¶¨Òåµ½³ÌÐòÀï¾Í¿ÉÒÔÁË¡£[/font]
[font=΢ÈíÑźÚ] ×¢²áUSBÇý¶¯³ÌÐò£ºËùÓеÄUSBÇý¶¯³ÌÐò¶¼±ØÐë´´½¨µÄ½á¹¹ÌåÊÇstructusb_driver¡£Õâ¸ö½á¹¹Ì屨ÐëÓÉUSBÇý¶¯³ÌÐòÀ´Ìîд£¬°üÀ¨Ðí¶à»Øµ÷º¯ÊýºÍ±äÁ¿£¬ËüÃÇÏòUSBºËÐÄ´úÂëÃèÊöUSBÇý¶¯³ÌÐò¡£´´½¨Ò»¸öÓÐЧµÄstruct usb_driver½á¹¹Ì壬ֻÐëÒª³õʼ»¯Îå¸ö×ֶξͿÉÒÔÁË£¬ÔÚ¿ò¼Ü³ÌÐòÖÐÊÇÕâÑùµÄ£º[/font]
[font=΢ÈíÑźÚ] static struct usb_driver skel_driver = {[/font]
[font=΢ÈíÑźÚ] .owner = THIS_MODULE,[/font]
[font=΢ÈíÑźÚ] .name = "skeleton",[/font]
[font=΢ÈíÑźÚ] .probe = skel_probe,[/font]
[font=΢ÈíÑźÚ] .disconnect = skel_disconnect,[/font]
[font=΢ÈíÑźÚ] .id_table = skel_table,[/font]
[font=΢ÈíÑźÚ] };[/font]
[font=΢ÈíÑźÚ] struct module *owner £ºÖ¸Ïò¸ÃÇý¶¯³ÌÐòµÄÄ£¿éËùÓÐÕßµÄÅúÕë¡£USBºËÐÄʹÓÃËüÀ´ÕýÈ·µØ¶Ô¸ÃUSBÇý¶¯³ÌÐò½øÐÐÒýÓüÆÊý£¬Ê¹Ëü²»»áÔÚ²»ºÏÊʵÄʱ¿Ì±»Ð¶Ôصô£¬Õâ¸ö±äÁ¿Ó¦¸Ã±»ÉèÖÃΪTHIS_MODULEºê¡£[/font]
[font=΢ÈíÑźÚ] const char *name£ºÖ¸ÏòÇý¶¯³ÌÐòÃû×ÖµÄÖ¸Õ룬ÔÚÄں˵ÄËùÓÐUSBÇý¶¯³ÌÐòÖÐËü±ØÐëÊÇΨһµÄ£¬Í¨³£±»ÉèÖÃΪºÍÇý¶¯³ÌÐòÄ£¿éÃûÏàͬµÄÃû×Ö¡£[/font]
[font=΢ÈíÑźÚ] int (*probe) (struct usb_interface *intf,const structusb_device_id*id)£ºÕâ¸öÊÇÖ¸ÏòUSBÇý¶¯³ÌÐòÖеÄ̽²âº¯ÊýµÄÖ¸Õë¡£µ±USBºËÐÄÈÏΪËüÓÐÒ»¸ö½Ó¿Ú£¨usb_interface£©¿ÉÒÔÓɸÃÇý¶¯³ÌÐò´¦Àíʱ£¬Õâ¸öº¯Êý±»µ÷Óá£[/font]
[font=΢ÈíÑźÚ] void (disconnect)(struct usb_interface*intf)£ºÖ¸ÏòUSBÇý¶¯³ÌÐòÖеĶϿªº¯ÊýµÄÖ¸Õ룬µ±Ò»¸öUSB½Ó¿Ú£¨usb_interface£©±»´ÓϵͳÖÐÒÆ³ý»òÕßÇý¶¯³ÌÐòÕýÔÚ´ÓUSBºËÐÄÖÐÐ¶ÔØÊ±£¬USBºËÐĽ«µ÷ÓÃÕâ¸öº¯Êý¡£[/font]
[font=΢ÈíÑźÚ] const struct usb_device_id *id_table£ºÖ¸ÏòIDÉ豸±íµÄÖ¸Õ룬Õâ¸ö±í°üº¬ÁËÒ»ÁиÃÇý¶¯³ÌÐò¿ÉÒÔÖ§³ÖµÄUSBÉ豸£¬Èç¹ûûÓÐÉèÖÃÕâ¸ö±äÁ¿£¬USBÇý¶¯³ÌÐòÖеÄ̽²â»Øµ÷º¯Êý¾Í²»»á±»µ÷Óá£[/font]
[font=΢ÈíÑźÚ] ÔÚÕâ¸ö½á¹¹ÌåÖл¹ÓÐÆäËüµÄ¼¸¸ö»Øµ÷º¯Êý²»ÊǺܳ£Óã¬ÕâÀï¾Í²»Ò»Ò»ËµÃ÷ÁË¡£ÒÔstruct usb_driverÖ¸ÕëΪ²ÎÊýµÄusb_register_driverº¯Êýµ÷ÓðÑstructusb_driver×¢²áµ½USBºËÐÄ¡£Ò»°ãÊÇÔÚUSBÇý¶¯³ÌÐòµÄÄ£¿é³õʼ»¯´úÂëÖÐÍê³ÉÕâ¸ö¹¤×÷µÄ£º[/font]
[font=΢ÈíÑźÚ] static int __init usb_skel_init(void)[/font]
[font=΢ÈíÑźÚ] {[/font]
[font=΢ÈíÑźÚ] int result;[/font]
[font=΢ÈíÑźÚ] /* Çý¶¯³ÌÐò×¢²áµ½USB×ÓϵͳÖÐ*/[/font]
[font=΢ÈíÑźÚ] result = usb_register(&skel_driver);[/font]
[font=΢ÈíÑźÚ] if (result)[/font]
[font=΢ÈíÑźÚ] err("usb_register failed. Error number %d", result);[/font]
[font=΢ÈíÑźÚ] return result;[/font]
[font=΢ÈíÑźÚ] }[/font]
[font=΢ÈíÑźÚ] µ±USBÇý¶¯³ÌÐò½«Òª±»Ð¶¿ªÊ±£¬ÐèÒª°Ñstruct usb_driver´ÓÄÚºËÖÐ×¢Ïú¡£Í¨¹ýµ÷ÓÃusb_deregister_driverÀ´Íê³ÉÕâ¸ö¹¤×÷£¬µ±µ÷Ó÷¢Éúʱ£¬µ±Ç°°ó¶¨µ½¸ÃÇý¶¯³ÌÐòÉϵÄÈκÎUSB½Ó¿Ú¶¼±»¶Ï¿ª£¬¶Ï¿ªº¯Êý½«±»µ÷Óãº[/font]
[font=΢ÈíÑźÚ] static void __exit usb_skel_exit(void)[/font]
[font=΢ÈíÑźÚ] {[/font]
[font=΢ÈíÑźÚ] /* ´Ó×ÓϵͳעÏúÇý¶¯³ÌÐò */[/font]
[font=΢ÈíÑźÚ] usb_deregister(&skel_driver);[/font]
[font=΢ÈíÑźÚ] }[/font]
[font=΢ÈíÑźÚ] ̽²âºÍ¶Ï¿ª£ºµ±Ò»¸öÉ豸±»°²×°¶øUSBºËÐÄÈÏΪ¸ÃÇý¶¯³ÌÐòÓ¦¸Ã´¦Àíʱ£¬Ì½²âº¯Êý±»µ÷Óã¬Ì½²âº¯Êý¼ì²é´«µÝ¸øËüµÄÉ豸ÐÅÏ¢£¬È·¶¨Çý¶¯³ÌÐòÊÇ·ñÕæµÄÊʺϸÃÉ豸¡£µ±Çý¶¯³ÌÐòÒòΪijÖÖÔÒò²»Ó¦¸Ã¿ØÖÆÉ豸ʱ£¬¶Ï¿ªº¯Êý±»µ÷Óã¬Ëü¿ÉÒÔ×öһЩÇåÀí¹¤×÷¡£Ì½²â»Øµ÷º¯ÊýÖУ¬USBÇý¶¯³ÌÐò³õʼ»¯ÈκοÉÄÜÓÃÓÚ¿ØÖÆUSBÉ豸µÄ¾Ö²¿½á¹¹Ì壬Ëü»¹°ÑËùÐèµÄÈκÎÉ豸Ïà¹ØÐÅÏ¢±£´æµ½Ò»¸ö¾Ö²¿½á¹¹ÌåÖУ¬ÏÂÃæÊÇ̽²âº¯ÊýµÄ²¿·ÖÔ´Â룬ÎÒÃǼÓÒÔ·ÖÎö¡£[/font]
[font=΢ÈíÑźÚ] /* ÉèÖö˵ãÐÅÏ¢ */[/font]
[font=΢ÈíÑźÚ] /* ֻʹÓõÚÒ»¸öÅúÁ¿INºÍÅúÁ¿OUT¶Ëµã */[/font]
[font=΢ÈíÑźÚ] iface_desc = interface->cur_altsetting;[/font]
[font=΢ÈíÑźÚ] for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {[/font]
[font=΢ÈíÑźÚ] endpoint = &iface_desc->endpoint[/font].desc;
if (!dev->bulk_in_endpointAddr &&
(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
== USB_ENDPOINT_XFER_BULK)) {
/* ÕÒµ½Ò»¸öÅúÁ¿IN¶Ëµã */
buffer_size = endpoint->wMaxPacketSize;
dev->bulk_in_size = buffer_size;
dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;
dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
if (!dev->bulk_in_buffer) {
err("Could not allocate bulk_in_buffer");
goto error;
}
}
if (!dev->bulk_out_endpointAddr &&
!(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
== USB_ENDPOINT_XFER_BULK)) {
/* ÕÒµ½Ò»¸öÅúÁ¿OUT¶Ëµã */
dev->bulk_out_endpointAddr = endpoint->bEndpointAddress;
}
}
if (!(dev->bulk_in_endpointAddr && dev->bulk_out_endpointAddr)) {
err("Could not find both bulk-in and bulk-out endpoints");
goto error;
}
ÔÚ̽²âº¯ÊýÀÕâ¸öÑ»·Ê×ÏÈ·ÃÎʸýӿÚÖдæÔÚµÄÿһ¸ö¶Ëµã£¬¸ø¸Ã¶ËµãÒ»¸ö¾Ö²¿Ö¸ÕëÒÔ±ãÒÔºó·ÃÎÊ£º
for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
endpoint = &iface_desc->endpoint.desc;
ÔÚÒ»ÂÖ̽²â¹ýºó£¬ÎÒÃǾÍÓÐÁËÒ»¸ö¶Ëµã£¬ÔÚ»¹Ã»Óз¢ÏÖÅúÁ¿INÀàÐ͵Ķ˵ãʱ£¬Ì½²â¸Ã¶Ëµã·½ÏòÊÇ·ñΪIN£¬Õâ¿ÉÒÔͨ¹ý¼ì²éUSB_DIR_INÊÇ·ñ°üº¬ÔÚbEndpointAddress¶Ëµã±äÁ¿ÓÐÈ·¶¨£¬Èç¹ûÊǵϰ£¬ÎÒÃÇÔÚ̽²â¸Ã¶ËµãÀàÐÍÊÇ·ñΪÅúÁ¿£¬ÏÈÓÃUSB_ENDPOINT_XFERTYPE_MASKλÑÚÀ´È¡bmAttributes±äÁ¿µÄÖµ£¬È»ºó̽²âËüÊÇ·ñºÍUSB_ENDPOINT_XFER_BULKֵƥÅ䣺
if (!dev->bulk_out_endpointAddr &&
!(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
== USB_ENDPOINT_XFER_BULK))
Èç¹ûËùÓÐÕâЩ̽²â¶¼Í¨¹ýÁË£¬Çý¶¯³ÌÐò¾ÍÖªµÀËüÒѾ·¢ÏÖÁËÕýÈ·µÄ¶ËµãÀàÐÍ£¬¿ÉÒ԰Ѹö˵ãµÄÏà¹ØÐÅÏ¢±£´æµ½Ò»¸ö¾Ö²¿½á¹¹ÌåÖÐÒÔ±ãÉÔºóÓÃËüÀ´ºÍ¶Ëµã½øÐÐͨÐÅ£º
/* ÕÒµ½Ò»¸öÅúÁ¿INÀàÐ͵Ķ˵ã */
buffer_size = endpoint->wMaxPacketSize;
dev->bulk_in_size = buffer_size;
dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;
dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
if (!dev->bulk_in_buffer) {
err("Could not allocate bulk_in_buffer");
goto error;
}
ÒòΪUSBÇý¶¯³ÌÐòÒªÔÚÉ豸µÄÉúÃüÖÜÆÚµÄÉÔºóʱ¼ä»ñÈ¡ºÍ½Ó¿ÚÏà¹ØÁªµÄ¾Ö²¿Êý¾Ý½á¹¹Ì壬ËùÒÔµ÷ÓÃÁËusb_set_intfdataº¯Êý£¬°ÑËü±£´æµ½struct usb_interface½á¹¹ÌåÖÐÒÔ±ãºóÃæµÄ·ÃÎÊ
/* °ÑÊý¾ÝÖ¸Õë±£´æµ½Õâ¸ö½Ó¿ÚÉ豸ÖÐ */
usb_set_intfdata(interface, dev);
ÎÒÃÇÒÔºóµ÷ÓÃusb_set_intfdataº¯ÊýÀ´»ñÈ¡Êý¾Ý¡£µ±ÕâÒ»Çж¼Íê³Éºó£¬USBÇý¶¯³ÌÐò±ØÐëÔÚ̽²âº¯ÊýÖе÷ÓÃusb_register_devº¯ÊýÀ´°Ñ¸ÃÉ豸ע²áµ½USBºËÐÄÀ
/* ×¢²áÉ豸µ½USBºËÐÄ */
retval = usb_register_dev(interface, &skel_class);
if (retval) {
/* ÓÐЩÇé¿öÏÂÊDz»ÔÊÐí×¢²áÇý¶¯³ÌÐòµÄ */
err("Not able to get a minor for this device.");
usb_set_intfdata(interface, NULL);
goto error;
}
µ±Ò»¸öUSBÉ豸±»¶Ï¿ªÊ±£¬ºÍ¸ÃÉ豸Ïà¹ØÁªµÄËùÓÐ×ÊÔ´¶¼Ó¦¸Ã±»¾¡¿ÉÄܵÄÇåÀíµô£¬ÔÚ´Ëʱ£¬Èç¹ûÒÑÔÚÔÚ̽²âº¯ÊýÖе÷ÓÃÁË×¢²áº¯ÊýÀ´Îª¸ÃUSBÉ豸·ÖÅäÁËÒ»¸ö´ÎÉ豸ºÅ»°£¬±ØÐëµ÷ÓÃusb_deregister_devº¯ÊýÀ´°Ñ´ÎÉ豸ºÅ½»»¹¸øUSBºËÐÄ¡£ÔÚ¶Ï¿ªº¯ÊýÖУ¬´Ó½Ó¿Ú»ñȡ֮ǰµ÷ÓÃusb_set_intfdataÉèÖõÄÈκÎÊý¾ÝÒ²ÊǺÜÖØÒªµÄ¡£È»ºóÉèÖÃstructusb_interface½á¹¹ÌåÖеÄÊý¾ÝÖ¸ÕëΪNULL£¬ÒÔ·ÀÈκβ»Êʵ±µÄ¶Ô¸ÃÊý¾ÝµÄ´íÎó·ÃÎÊ¡£
ÔÚ̽²âº¯ÊýÖлá¶Ôÿһ¸ö½Ó¿Ú½øÐÐÒ»´Î̽²â£¬ËùÒÔÎÒÃÇÔÚдUSBÇý¶¯³ÌÐòµÄʱºò£¬Ö»Òª×öºÃµÚÒ»¸ö¶Ëµã£¬ÆäËüµÄ¶Ëµã¾Í»á×Ô¶¯Íê³É̽²â¡£ÔÚ̽²âº¯ÊýÖÐÎÒÃÇҪעÒâµÄÊÇÔÚÄÚºËÖÐÓýṹÌåstruct usb_host_endpointÀ´ÃèÊöUSB¶Ëµã£¬Õâ¸ö½á¹¹ÌåÔÚÁíÒ»¸öÃûΪstructusb_endpoint_descriptorµÄ½á¹¹ÌåÖаüº¬ÁËÕæÕýµÄ¶ËµãÐÅÏ¢£¬structusb_endpoint_descriptor½á¹¹Ìå°üº¬ÁËËùÓеÄUSBÌØ¶¨µÄÊý¾Ý£¬¸Ã½á¹¹ÌåÖÐÎÒÃÇÒª¹ØÐĵö×Ö¶ÎÊÇ£º
bEndpointAddress£ºÕâ¸öÊÇÌØ¶¨µÄUSBµØÖ·£¬¿ÉÒÔ½áºÏUSB_DIR_INºÍUSB_DIR_OUTÀ´Ê¹Óã¬ÒÔÈ·¶¨¸Ã¶ËµãµÄÊý¾ÝÊÇ´«ÏòÉ豸»¹ÊÇÖ÷»ú¡£
bmAttributes£ºÕâ¸öÊǶ˵ãµÄÀàÐÍ£¬Õâ¸öÖµ¿ÉÒÔ½áºÏλÑÚÂëUSB_ENDPOINT_XFERTYPE_MASKÀ´Ê¹Óã¬ÒÔÈ·¶¨´Ë¶ËµãµÄÀàÐÍÊÇUSB_ENDPOINT_XFER_ISOC£¨µÈʱ£©¡¢USB_ENDPOINT_XFER_BULK£¨ÅúÁ¿£©¡¢USB_ENDPOINT_XFER_INTµÄÄÄÒ»ÖÖ¡£
wMaxPacketSize£ºÕâ¸öÊǶ˵ãÒ»´Î¿ÉÒÔ´¦ÀíµÄ×î´ó×Ö½ÚÊý£¬Çý¶¯³ÌÐò¿ÉÒÔ·¢ËÍÊýÁ¿´óÓÚ´ËÖµµÄÊý¾Ýµ½¶Ëµã£¬ÔÚʵ¼Ê´«ÊäÖУ¬Êý¾ÝÁ¿Èç¹û´óÓÚ´ËÖµ»á±»·Ö¸î¡£
bInterval£ºÕâ¸öÖµÖ»ÓÐÔڶ˵ãÀàÐÍÊÇÖжÏÀàÐÍʱ²ÅÆð×÷Óã¬ËüÊǶ˵ãÖжÏÇëÇóµÄ¼ä¸ôʱ¼ä£¬ÒÔºÁÃëΪµ¥Î»¡£
Ìá½»ºÍ¿ØÖÆurb£ºµ±Çý¶¯³ÌÐòÓÐÊý¾ÝÒª·¢Ë͵½USBÉ豸ʱ£¨´ó¶àÊýÇé¿öÊÇÔÚÇý¶¯³ÌÐòµÄдº¯ÊýÖУ©£¬Òª·ÖÅäÒ»¸öurbÀ´°ÑÊý¾Ý´«Ê䏸É豸£º
/* ´´½¨Ò»¸öurb,²¢ÇÒ¸øËü·ÖÅäÒ»¸ö»º´æ*/
urb = usb_alloc_urb(0, GFP_KERNEL);
if (!urb) {
retval = -ENOMEM;
goto error;
}
µ±urb±»³É¹¦·ÖÅäºó£¬»¹Òª´´½¨Ò»¸öDMA»º³åÇøÀ´ÒÔ¸ßЧµÄ·½Ê½·¢ËÍÊý¾Ýµ½É豸£¬´«µÝ¸øÇý¶¯³ÌÐòµÄÊý¾ÝÒª¸´ÖƵ½Õâ¿é»º³åÖÐÈ¥£º
buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma);
if (!buf) {
retval = -ENOMEM;
goto error;
}
if (copy_from_user(buf, user_buffer, count)) {
retval = -EFAULT;
goto error;
}
µ±Êý¾Ý´ÓÓû§¿Õ¼äÕýÈ·¸´ÖƵ½¾Ö²¿»º³åÇøºó£¬urb±ØÐëÔÚ¿ÉÒÔ±»Ìá½»¸øUSBºËÐÄ֮ǰ±»ÕýÈ·³õʼ»¯£º
/* ³õʼ»¯urb */
usb_fill_bulk_urb(urb, dev->udev,
usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr),
buf, count, skel_write_bulk_callback, dev);
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
È»ºóurb¾Í¿ÉÒÔ±»Ìá½»¸øUSBºËÐÄÒÔ´«Êäµ½É豸ÁË£º
/* °ÑÊý¾Ý´ÓÅúÁ¿OUT¶Ë¿Ú·¢³ö */
retval = usb_submit_urb(urb, GFP_KERNEL);
if (retval) {
err("%s - failed submitting write urb, error %d", __FUNCTION__, retval);
goto error;
}
µ±urb±»³É¹¦´«Êäµ½USBÉ豸֮ºó£¬urb»Øµ÷º¯Êý½«±»USBºËÐĵ÷Óã¬ÔÚÎÒÃǵÄÀý×ÓÖУ¬ÎÒÃdzõʼ»¯urb£¬Ê¹ËüÖ¸Ïòskel_write_bulk_callbackº¯Êý£¬ÒÔϾÍÊǸú¯Êý£º
static void skel_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
{
struct usb_skel *dev;
dev = (struct usb_skel *)urb->context;
if (urb->status &&
!(urb->status == -ENOENT ||
urb->status == -ECONNRESET ||
urb->status == -ESHUTDOWN)) {
dbg("%s - nonzero write bulk status received: %d",
__FUNCTION__, urb->status);
}
/* ÊÍ·ÅÒÑ·ÖÅäµÄ»º³åÇø */
usb_buffer_free(urb->dev, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_dma);
}
ÓÐʱºòUSBÇý¶¯³ÌÐòÖ»ÊÇÒª·¢ËÍ»òÕß½ÓÊÕһЩ¼òµ¥µÄÊý¾Ý£¬Çý¶¯³ÌÐòÒ²¿ÉÒÔ²»ÓÃurbÀ´½øÐÐÊý¾ÝµÄ´«Ê䣬ÕâÊÇÀïÉæ¼°µ½Á½¸ö¼òµ¥µÄ½Ó¿Úº¯Êý£ºusb_bulk_msgºÍusb_control_msg £¬ÔÚÕâ¸öUSB¿ò¼Ü³ÌÐòÀï¶Á²Ù×÷¾ÍÊÇÕâÑùµÄÒ»¸öÓ¦Óãº
/* ½øÐÐ×èÈûµÄÅúÁ¿¶ÁÒÔ´ÓÉ豸»ñÈ¡Êý¾Ý */
retval = usb_bulk_msg(dev->udev,
usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr),
dev->bulk_in_buffer,
min(dev->bulk_in_size, count),
&count, HZ*10);
/*Èç¹û¶Á³É¹¦£¬¸´ÖƵ½Óû§¿Õ¼ä */
if (!retval) {
if (copy_to_user(buffer, dev->bulk_in_buffer, count))
retval = -EFAULT;
else
retval = count;
}
usb_bulk_msg½Ó¿Úº¯ÊýµÄ¶¨ÒåÈçÏ£º
int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe,
void *data,int len,int *actual_length,int timeout);
Æä²ÎÊýΪ£º
struct usb_device *usb_dev£ºÖ¸ÏòÅúÁ¿ÏûÏ¢Ëù·¢Ë͵ÄÄ¿±êUSBÉ豸ָÕë¡£
unsigned int pipe£ºÅúÁ¿ÏûÏ¢Ëù·¢ËÍÄ¿±êUSBÉ豸µÄÌØ¶¨¶Ëµã£¬´ËÖµÊǵ÷ÓÃusb_sndbulkpipe»òÕßusb_rcvbulkpipeÀ´´´½¨µÄ¡£
void *data£ºÈç¹ûÊÇÒ»¸öOUT¶Ëµã£¬ËüÊÇÖ¸Ïò¼´½«·¢Ë͵½É豸µÄÊý¾ÝµÄÖ¸Õë¡£Èç¹ûÊÇIN¶Ëµã£¬ËüÊÇÖ¸Ïò´ÓÉ豸¶ÁÈ¡µÄÊý¾ÝÓ¦¸Ã´æ·ÅµÄλÖõÄÖ¸Õë¡£
int len£ºdata²ÎÊýËùÖ¸»º³åÇøµÄ´óС¡£
int *actual_length£ºÖ¸Ïò±£´æÊµ¼Ê´«Êä×Ö½ÚÊýµÄλÖõÄÖ¸Õ룬ÖÁÓÚÊÇ´«Êäµ½É豸»¹ÊÇ´ÓÉ豸½ÓÊÕÈ¡¾öÓڶ˵ãµÄ·½Ïò¡£
int timeout£ºÒÔJiffiesΪµ¥Î»µÄµÈ´ýµÄ³¬Ê±Ê±¼ä£¬Èç¹û¸ÃֵΪ0£¬¸Ãº¯ÊýÒ»Ö±µÈ´ýÏûÏ¢µÄ½áÊø¡£
Èç¹û¸Ã½Ó¿Úº¯Êýµ÷Óóɹ¦£¬·µ»ØÖµÎª0£¬·ñÔò·µ»ØÒ»¸ö¸ºµÄ´íÎóÖµ¡£
usb_control_msg½Ó¿Úº¯Êý¶¨ÒåÈçÏ£º
int usb_control_msg(struct usb_device *dev,unsigned intpipe,__u8 request,__u8requesttype,__u16 value,__u16 index,void*data,__u16 size,int timeout)
³ýÁËÔÊÐíÇý¶¯³ÌÐò·¢ËͺͽÓÊÕUSB¿ØÖÆÏûÏ¢Ö®Í⣬usb_control_msgº¯ÊýµÄÔË×÷ºÍusb_bulk_msgº¯ÊýÀàËÆ£¬Æä²ÎÊýºÍusb_bulk_msgµÄ²ÎÊýÓм¸¸öÖØÒªÇø±ð£º
struct usb_device *dev£ºÖ¸Ïò¿ØÖÆÏûÏ¢Ëù·¢Ë͵ÄÄ¿±êUSBÉ豸µÄÖ¸Õë¡£
unsigned int pipe£º¿ØÖÆÏûÏ¢Ëù·¢Ë͵ÄÄ¿±êUSBÉ豸µÄÌØ¶¨¶Ëµã£¬¸ÃÖµÊǵ÷ÓÃusb_sndctrlpipe»òusb_rcvctrlpipeÀ´´´½¨µÄ¡£
__u8 request£º¿ØÖÆÏûÏ¢µÄUSBÇëÇóÖµ¡£
__u8 requesttype£º¿ØÖÆÏûÏ¢µÄUSBÇëÇóÀàÐÍÖµ¡£
__u16 value£º¿ØÖÆÏûÏ¢µÄUSBÏûÏ¢Öµ¡£
__u16 index£º¿ØÖÆÏûÏ¢µÄUSBÏûÏ¢Ë÷ÒýÖµ¡£
void *data£ºÈç¹ûÊÇÒ»¸öOUT¶Ëµã£¬ËüÊÇÖ¸Éí¼´½«·¢Ë͵½É豸µÄÊý¾ÝµÄÖ¸Õë¡£Èç¹ûÊÇÒ»¸öIN¶Ëµã£¬ËüÊÇÖ¸Ïò´ÓÉ豸¶ÁÈ¡µÄÊý¾ÝÓ¦¸Ã´æ·ÅµÄλÖõÄÖ¸Õë¡£
__u16 size£ºdata²ÎÊýËùÖ¸»º³åÇøµÄ´óС¡£
int timeout£ºÒÔJiffiesΪµ¥Î»µÄÓ¦¸ÃµÈ´ýµÄ³¬Ê±Ê±¼ä£¬Èç¹ûΪ0£¬¸Ãº¯Êý½«Ò»Ö±µÈ´ýÏûÏ¢½áÊø¡£
Èç¹û¸Ã½Ó¿Úº¯Êýµ÷Óóɹ¦£¬·µ»Ø´«Êäµ½É豸»òÕß´ÓÉ豸¶ÁÈ¡µÄ×Ö½ÚÊý£»Èç¹û²»³É¹¦Ëü·µ»ØÒ»¸ö¸ºµÄ´íÎóÖµ¡£
ÕâÁ½¸ö½Ó¿Úº¯Êý¶¼²»ÄÜÔÚÒ»¸öÖжÏÉÏÏÂÎÄÖлòÕß³ÖÓÐ×ÔÐýËøµÄÇé¿öϵ÷Óã¬Í¬Ñù£¬¸Ãº¯ÊýÒ²²»Äܱ»ÈÎºÎÆäËüº¯ÊýÈ¡Ïû£¬Ê¹ÓÃʱҪ½÷É÷¡£
ÎÒÃÇÒª¸øÎ´ÖªµÄUSBÉ豸дÇý¶¯³ÌÐò£¬Ö»ÐèÒª°ÑÕâ¸ö¿ò¼Ü³ÌÐòÉÔ×öÐ޸ľͿÉÒÔÓÃÁË£¬Ç°ÃæÎÒÃÇÒѾ˵¹ýÒªÐÞ¸ÄÖÆÔìÉ̺ͲúÆ·µÄIDºÅ£¬°Ñ0xfff0ÕâÁ½¸öÖµ¸ÄΪδ֪USBµÄIDºÅ¡£
#define USB_SKEL_VENDOR_ID 0xfff0
#define USB_SKEL_PRODUCT_ID 0xfff0
»¹ÓоÍÊÇÔÚ̽²âº¯ÊýÖаÑÐèҪ̽²âµÄ½Ó¿Ú¶ËµãÀàÐÍдºÃ£¬ÔÚÕâ¸ö¿ò¼Ü³ÌÐòÖÐֻ̽²âÁËÅúÁ¿£¨USB_ENDPOINT_XFER_BULK£©INºÍOUT¶Ëµã£¬¿ÉÒÔÔÚ´Ë´¦Ê¹ÓÃÑÚÂ루USB_ENDPOINT_XFERTYPE_MASK£©ÈÃÆä̽²âÆäËüµÄ¶ËµãÀàÐÍ£¬Çý¶¯³ÌÐò»á¶ÔUSBÉ豸µÄÿһ¸ö½Ó¿Ú½øÐÐÒ»´Î̽²â£¬µ±Ì½²â³É¹¦ºó£¬Çý¶¯³ÌÐò¾Í±»°ó¶¨µ½Õâ¸ö½Ó¿ÚÉÏ¡£ÔÙÓоÍÊÇurbµÄ³õʼ»¯ÎÊÌ⣬Èç¹ûÄãֻд¼òµ¥µÄUSBÇý¶¯£¬Õâ¿é²»Óöà¼Ó¿¼ÂÇ£¬¿ò¼Ü³ÌÐòÀïµÄ¶«Î÷ÒѾ¹»ÓÃÁË£¬ÕâÀïÎÒÃǼòµ¥½éÉÜÈý¸ö³õʼ»¯urbµÄ¸¨Öúº¯Êý£º
usb_fill_int_urb £ºËüµÄº¯ÊýÔÐÍÊÇÕâÑùµÄ£º
void usb_fill_int_urb(struct urb *urb,struct usb_device *dev,
unsigned int pipe,void *transfer_buff,
int buffer_length,usb_complete_t complete,
void *context,int interval);
Õâ¸öº¯ÊýÓÃÀ´ÕýÈ·µÄ³õʼ»¯¼´½«±»·¢Ë͵½USBÉ豸µÄÖж϶˵ãµÄurb¡£
usb_fill_bulk_urb £ºËüµÄº¯ÊýÔÐÍÊÇÕâÑùµÄ£º
void usb_fill_bulk_urb(struct urb *urb,struct usb_device *dev,
unsigned int pipe,void *transfer_buffer,
int buffer_length,usb_complete_t complete)
Õâ¸öº¯ÊýÊÇÓÃÀ´ÕýÈ·µÄ³õʼ»¯ÅúÁ¿urb¶ËµãµÄ¡£
usb_fill_control_urb £ºËüµÄº¯ÊýÔÐÍÊÇÕâÑùµÄ£º
void usb_fill_control_urb(struct urb *urb,struct usb_device*dev,unsigned int pipe,unsigned char *setup_packet,void*transfer_buffer,int buffer_length,usb_complete_t complete,void*context);
Õâ¸öº¯ÊýÊÇÓÃÀ´ÕýÈ·³õʼ»¯¿ØÖÆurb¶ËµãµÄ¡£
»¹ÓÐÒ»¸ö³õʼ»¯µÈʱurbµÄ£¬ËüÏÖÔÚ»¹Ã»Óгõʼ»¯º¯Êý£¬ËùÒÔËüÃÇÔÚ±»Ìá½»µ½USBºËÐÄǰ£¬±ØÐëÔÚÇý¶¯³ÌÐòÖÐÊÖ¹¤µØ½øÐгõʼ»¯£¬¿ÉÒԲο¼ÄÚºËÔ´´úÂëÊ÷ϵÄ/usr/src/~/drivers/usb/mediaϵÄkonicawc.cÎļþ¡£
Çý¶¯Ä£¿éµÄ±àÒë¡¢ÅäÖúÍʹÓÃ
ÏÖÔÚÎÒÃǵÄÇý¶¯³ÌÐòÒѾ´óÌåдºÃÁË£¬È»ºóÔÚlinuxϰÑËü±àÒë³ÉÄ£¿é¾Í¿ÉÒÔ°ÑÇý¶¯Ä£¿é²åÈëµ½ÄÚºËÖÐÔËÐÐÁË£¬±àÒëµÄMakefileÎļþ¿ÉÒÔÕâÑùÀ´Ð´£º
ifneq ($(KERNELRELEASE),)
obj-m := xxx.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.mod.* *.o *.ko .*.ko.* .tmp* .*.mod.o.* .*.o.*
ÆäÖÐxxxÊÇÔ´ÎļþµÄÎļþÃû£¬ÔÚlinuxÏÂÖ±½ÓÖ´ÐÐmake¾Í¿ÉÒÔÉú³ÉÇý¶¯Ä£¿é£¨xxx.ko£©ÁË¡£Éú³ÉÇý¶¯Ä£¿éºóʹÓÃinsmodxxx.ko¾Í¿ÉÒÔ²åÈëµ½ÄÚºËÖÐÔËÐÐÁË£¬ÓÃlsmod¿ÉÒÔ¿´µ½Äã²åÈëµ½ÄÚºËÖеÄÄ£¿é£¬Ò²¿ÉÒÔ´ÓϵͳÖÐÓÃÃüÁîrmmodxxx°ÑÄ£¿éÐ¶ÔØµô£»Èç¹û°Ñ±àÒë³öÀ´µÄÇý¶¯Ä£¿é¿½±´µ½/lib/modules/~/kernel/drivers/usb/Ï£¬È»ºódepmodһϣ¬ÄÇôÄãÔÚ²åÈëUSBÉ豸µÄʱºò£¬ÏµÍ³¾Í»á×Ô¶¯ÎªÄã¼ÓÔØÇý¶¯Ä£¿éµÄ£»µ±È»Õâ¸öµÃÓÐhotplugµÄÖ§³Ö£»¼ÓÔØÇý¶¯Ä£¿é³É¹¦ºó¾Í»áÔÚ/dev/ÏÂÉú³ÉÉ豸ÎļþÁË£¬Èç¹ûÓÃÃüÁîcat /proc/bus/usb/devices£¬ÎÒÃÇ¿ÉÒÔ¿´µ½Çý¶¯³ÌÐòÒѾ°ó¶¨µ½½Ó¿ÚÉÏÁË£º
T: Bus=03 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=02(comm.) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=1234 ProdID=2345 Rev= 1.10
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 0mA
I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=test_usb_driver /*ÎÒÃǵÄÇý¶¯*/
E: Ad=01(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
´Ë¿ò¼Ü³ÌÐòÉú³ÉµÄÊÇskel0£¨¿ÉÒÔ×ÔÓÉÐ޸쩵ÄÉ豸Îļþ£¬ÏÖÔھͿÉÒÔ¶ÔÕâ¸öÉ豸Îļþ½øÐдò¿ª¡¢¶Áд¡¢¹Ø±ÕµÈµÄ²Ù×÷ÁË¡£
Ãæ¶Ô²ã³ö²»ÇîµÄеÄUSBÉ豸£¬±ØÐëÓÐÈ˲»¶Ï±àдеÄÇý¶¯³ÌÐòÒÔ±ãÈÃÕâЩÉ豸Äܹ»ÔÚlinuxÏÂÕý³£µÄ¹¤×÷£¬´ÓÕâ¸öÒâÒåÉϽ²£¬Çý¶¯³ÌÐòµÄ±àд±¾Éí¾ÍÊÇÒ»¼þ·Ç³£ÓÐÒâÒåµÄ¹¤×÷£¬±¾ÎÄÖ»ÊÇÆðµ½Ò»¸öÅ×שÒýÓñµÄ×÷Ó㬰ïÖúÄÇЩÓÐÖ¾ÓÚдÇý¶¯³ÌÐòµÄ¿ª·¢ÈËÔ±½øÒ»²½Á˽âUSBÇý¶¯³ÌÐòµÄÉè¼ÆË¼Â·£¬´Ó¶øÎüÒý¸ü¶àµÄÈ˼ÓÈëµ½Õâ¸ö¶ÓÎéÖÐÀ´¡£linux²»½öΪÎÒÃÇÌṩÁËÒ»¸ö¶¥¼¶ÖÊÁ¿µÄ²Ù×÷ϵͳ£¬¶øÇÒҲΪÎÒÃÇÌṩÁ˲ÎÓëµ½ÆäδÀ´¿ª·¢¹ý³ÌµÄ»ú»á£¬ÎÒÃÇÍêÈ«¿ÉÒÔ´ÓÖеõ½ÎÞ¾¡µÄ¿ìÀÖ£¡
[ ±¾Ìû×îºóÓÉ bakeloar ÓÚ 2007-11-20 11:52 ±à¼ ]
tjwangzhen ÓÚ 2010-01-24 13:40:04·¢±í:
лл·ÖÏíÁË ºÃÎÄÕÂ
ljtxqiang ÓÚ 2009-09-21 13:25:48·¢±í:
Ì«¸ßÉîÁË¡£¡£¡£¡£
tjwangzhen ÓÚ 2009-09-20 19:05:27·¢±í:
ѧϰÁË Ð»Ð»Â¥Ö÷·ÖÏí ÓÐЩ²»¶®
zzy870720z ÓÚ 2009-09-20 16:25:07·¢±í:
ѧϰÖÐ
shenhao0129 ÓÚ 2009-09-13 20:53:07·¢±í:
Õâ¸öʱ¼äÒªºÃºÃµÄ¿´Ò»Ïµģ¡ÏÈÊÕ²ØÒ»ÏÂ
pcibm0225 ÓÚ 2009-09-13 00:44:43·¢±í:
Ì«ÄѶ®
fengnjupt ÓÚ 2009-07-21 01:36:41·¢±í:
̫רҵ£¬¿´Íê¾ÍÏë˯¾õ
hantu ÓÚ 2009-07-18 02:11:17·¢±í:
Ó¦¸Ã·Åµ½±à³Ì°æ¿éºÃһЩ
N596 ÓÚ 2009-07-17 21:19:54·¢±í:
ÊÕ²ØÁË£¬ÓÐʱ¼äÂýÂý¿´¡£
·ÉÏè26 ÓÚ 2009-07-17 15:47:43·¢±í:
²»´í
feigu ÓÚ 2009-07-08 12:57:17·¢±í:
Ì«ÀíÂÛÁË
xt01214 ÓÚ 2009-07-08 10:54:11·¢±í:
¿´µÄÔÎÔεģ¡
ÓÐûÓмòµ¥Ò»µãµÄ°¡
bbsytc ÓÚ 2009-07-08 00:37:19·¢±í:
²»´í лл·ÖÏí
zhenwei252 ÓÚ 2009-07-08 00:29:21·¢±í:
ÓеãÉî°Â¡£¡£
jagub ÓÚ 2009-07-07 17:23:08·¢±í:
ºÃ¶«Î÷£¬¾ÍÊÇÁýͳÁËһЩ
renxj_811222 ÓÚ 2009-07-07 17:19:53·¢±í:
¿´Ò»¿´£¬Ó¦¸ÃÓÐЩ°ïÖú