stm32f107 usbhÖ÷ģʽ¿â½âÎö ÏÂÔØ±¾ÎÄ

1¡£azerty»òQWERTY¼üÅ̵ÄÑ¡ÔñÊÇͨ¹ýÔÚÎļþusbh_hid_keybrd.hÖÐ# qwerty_keyboard£¬ # azerty_keyboardÀ´ÉùÃ÷µÄ

3¿âÓû§APIºÍ»Øµ÷º¯Êý 3.1¿âÓû§API

¿âÓû§API¹¦ÄܾÖÏÞÓÚÒÔÏÂÁ½¸ö¹¦ÄÜ£º

¡övoid usbh_process£¨void£©£º´Ë¹¦ÄÜʵÏֵĺËÐÄ״̬»ú³ÌÐò¡£ËüÒª´ÓÓû§µÄÖ÷Ñ­»·ÖÜÆÚµ÷Óᣠ¡öusbh_init£ºÕâ¸öº¯ÊýÓ¦¸Ã±»³ÆÎªÖ÷»úµÄUSBÓ²¼þÓë¿âµÄ³õʼ»¯¡£ ÏÂÃæÎªusbh_initµÄº¯ÊýÔ­ÐÍ£º

void USBH_Init(USB_OTG_CORE_HANDLE *pdev, USBH_Class_cb_TypeDef *class_cb, USBH_Usr_cb_TypeDef *usr_cb)

¨Cpdev£ºÖ¸ÏòUSBÖ÷»ú¼Ä´æÆ÷ºËÐĽṹµÄÖ¸Õ루ΪÁ˽«À´ÐèÒª£©

¨Cclass_cb£ºÖ¸ÕëÖ¸ÏòÀà½á¹¹USBH_Class_cb_TypeDef£¬Ëü¼È¿ÉÒÔÖ¸ÏòMSC_cbÀàÀ´²Ù×÷MSCÉ豸Ҳ¿ÉÒÔÖ¸ÏòHID_cbÀà²Ù×÷HIDÊó±ê/¼üÅÌÉ豸¡£

¨Cusr _cb£ºÖ¸ÏòUSBH_Usr_cb_TypeDefÀà½á¹¹¡£Õâ¸ö½á¹¹¶¨Òå¶ÀÁ¢Àà»Øµ÷º¯Êý¡££¨¼û3.2.2½Ú£©

3.2Óû§µÄ»Øµ÷º¯Êý

Óû§»Øµ÷º¯ÊýÔÚÓû§Ä£°åÎļþusbh_usr.cÖÐÉùÃ÷ ¶¨ÒåÁËÁ½ÖÖÀàÐ͵ÄÓû§»Øµ÷£º

¡öÓëÀàµÄÏà¹Ø²Ù×÷µÄ»Øµ÷º¯Êý£¨MSC»òHID£©

¡öÓëÀà²Ù×÷Ïà¶ÀÁ¢µÄ»Øµ÷º¯Êý£»ËûÃÇÖ÷ÒªÊÇÔÚö¾Ù½×¶Î±»µ÷Óá£ÕâЩ»Øµ÷ÊÇÒ»¸öUSBH_Usr_cb_TypeDef½á¹¹ÀàÐÍÖж¨Òå 3.2.1ÀàµÄ»Øµ÷º¯Êý MSCÓû§»Øµ÷º¯Êý¹¦ÄÜ

¶ÔÓÚMSC£¬ÏÂÃæµÄ»Øµ÷º¯Êý±»µ÷Óãºint usr_msc_application£¨void£©¡£

ÀàµÄ³õʼ»¯½áÊøºó£¬Õâ¸öº¯Êý±»MSC״̬»úµ÷ÓõÄΪÁ˰ïÖúÓû§·ÃÎÊÎļþ²Ù×÷ϵͳ¡£ ÔÚÕâ¸ö»Øµ÷º¯Êý£¬Óû§¿ÉÒÔ·ÃÎÊÈκÎFATÎļþϵͳ£¨Îļþ´ò¿ª£¬Îļþ¶Á£¬Ð´Îļþ¡­¡­£©Ê¹ÓÃEFSLÎļþϵͳAPI¡£

ͬʱ£¬Óû§¿ÉÒÔ·ÃÎÊÒ»¸öÓë¿âMSCÀàÇý¶¯²»Í¬µÄ³ö¿Ú½á¹¹±äÁ¿£¬usbh_msc_param¡£Õâ¸ö±äÁ¿Ìṩ¹ØÓÚ´óÈÝÁ¿´æ´¢µÄ¹Ø¼üÐÅÏ¢¡£

Õâ¸ö±äÁ¿ÊÇʹÓÃÒ»ÖÖÀàÐÍmassstorageparameter_typedef¶¨ÒåµÄ½á¹¹£¬¶¨ÒåÈçÏ£º typedef struct __MassStorageParameter {

uint32_t MSCapacity; /*MS device capacity in bytes */

uint32_t MSSenseKey; /*Request Sense SCSI command returned value */ uint16_t MSPageLength; /* MS device Page length */ uint8_t MSBulkOutEp; /* Bulk OUT endpoint address */ uint8_t MSBulkInEp; /*Bulk IN endpoint address */

uint8_t MSWriteProtect; /*Write protection status, 0: non protected, 1:protected */ } MassStorageParameter_TypeDef; HIDÓû§µÄ»Øµ÷º¯Êý

¶ÔHIDÀ࣬ÒÔ϶¨ÒåµÄ»Øµ÷º¯Êý£º

¡övoid USR_MOUSE_Init(void)£ºÓû§µÄÊó±êÓ¦ÓóÌÐò³õʼ»¯ ¡övoid USR_KEYBRD_Init(void)£º¼üÅÌÓ¦ÓõÄÓû§³õʼ»¯

¡övoid USR_MOUSE_ProcessData(HID_MOUSE_Data_TypeDef *data)£ºÕâ¸ö»Øµ÷º¯Êý ±»µ÷Óõ±hid_mouse_data_typedefÊý¾ÝÀàÐ͵ÄÊäÈë²ÎÊýÓÐЧʱ£¨¼ûÏÂÃæ¸½×¢1£©¡£ ¡övoid USR_KEYBRD_ProcessData (uint8_t data)£ºÕâ¸ö»Øµ÷±»µ÷ÓÃʱ£¬Ò»¸öеÄASCII×Ö·ûÐÍ¡£ÆäÌØÕ÷ÊÇÊäÈë²ÎÊýÊý¾Ý¡£

×¢£º1 HID_MOUSE_Data_TypeDef¶¨ÒåÈçÏ£º

typedef struct _HID_MOUSE_Data {

uint8_t x; uint8_t y;

uint8_t z; /* Not Supported */

uint8_t button; /*Bitmap showing pressed buttons 1:pressed, 0: non pressed */ }

HID_MOUSE_Data_TypeDef; 3.2.2Àà¶ÀÁ¢µÄ»Øµ÷º¯Êý

ÕâÀà¶ÀÁ¢µÄ»Øµ÷º¯ÊýÊÇÔÚÒ»¸ö½á¹¹ÀàÐͶ¨Òå usbh_usr_cb_typedef¶¨ÒåÈçÏ£º

typedef struct _USBH_USR_PROP {

void (*Init)(void);

void (*DeviceAttached)(void); void (*ResetDevice)(void);

void (*DeviceDisconnected)(void); void (*OverCurrentDetected)(void);

void (*DeviceSpeedDetected)(uint8_t DeviceSpeed); void (*DeviceDescAvailable)(void *); void (*DeviceAddressAssigned)(void);

void (*ConfigurationDescAvailable)(USBH_CfgDesc_TypeDef *, USBH_InterfaceDesc_TypeDef *, USBH_EpDesc_TypeDef *);

void (*ManufacturerString)(void *); void (*ProductString)(void *); void (*SerialNumString)(void *); void (*EnumerationDone)(void);

USBH_USR_Status (*UserInput)(void);

void (*USBH_USR_DeviceNotSupported)(void); void (*UnrecoveredError)(void); }

USBH_Usr_cb_TypeDef; ÒÔÉϻص÷º¯Êý¹¦ÄÜÃèÊöÈçÏ¡£

¨C³õʼ»¯£º³õʼ»¯Ê±±»usbh_initÄں˵÷ÓõŦÄÜ¡£ÔÚÕâ¸ö¹¦ÄÜ£¬Óû§¿ÉÒÔʵÏÖÈκÎ×Ô¼ºµÄÓ¦ÓóÌÐòÏà¹ØµÄÌØ¶¨µÄ³õʼ»¯¡£

¨Cdeviceattached£ºµ±Ò»¸öUSBÉ豸Á¬½Óʱ±»µ÷Óá£Ëü¿ÉÒÔͨ¹ýÏÔʾÆÁ¸æËßÓû§ÈκÎÓÐÓõÄÉ豸Á¬½ÓÐÅÏ¢¡£

¨Cdevicereset£º´ÓÖ÷ģʽ·¢³öµÄUSB¸´Î»ÃüÁî¡£ ¨Cdevicedisconnect£º¡°µ±Ò»¸öÉ豸¶Ï¿ªÊ±µ÷Óá£

¨Covercurrentdetected£º¶ÔUSBµÄVBUSµçÁ÷½øÐмì²âʱµ÷Óᣠ¨Cdevicespeeddetected£º¼ì²â×°Öô«ÊäËÙÂÊʱµ÷Óà ¨Cdevicedescavailable£ºÉ豸ÃèÊö·ûÓÐЧʱµ÷Óà ¨Cdeviceaddressassigned£ºµ±É豸µØÖ··ÖÅäʱµ÷Óá£

¨Cconfigurationdescavailable£ºµ±É豸£¬½Ó¿ÚºÍ¶ËµãÃèÊö·û¿ÉÓÃʱµ÷ÓÃÃèÊö·ûÊÇ¿ÉÓÃµÄ ¨Cmanufacturingstring£ºÌáÈ¡ÖÆÔìÉÌ×Ö·û´®Ê±µ÷Óᣠ¨Cproductstring£ºÌáÈ¡É豸×Ö·û´®Ê±µ÷Óᣠ¨Cserialnumstring£ºÐòÁкÅ×Ö·û´®Ìáȡʱµ÷Óᣠ¨Cenumerationdone£ºÃ¶¾ÙÍê³Éʱµ÷Óá£

¨Cuserinput£ºÃ¶¾ÙµÄ¹ý³Ì½áÊøºó£¬ÌáʾÓû§½øÒ»²½µÄÐж¯£¬Èç°´ÏÂÒ»¸ö°´Å¥Æô¶¯Ö÷ģʽµÄÀà²Ù×÷

¨Cusbh_usr_devicenotsupported£º±»¼ì²âµÄÉ豸ÊÇÔÚ²»ÔÚµ±Ç°ÀàÇý¶¯³ÌÐòÖ§³Öʱµ÷Óᣠ¨Cunrecoverederror£ºÔÚ¡°host_error_state¡±×´Ì¬Ê±µ÷ÓÃÄں˵Ä״̬»ú¡£ËüÔÊÐíÓû§´¦ÀíÈκδíÎó£¬ÔÚÒº¾§ÆÁÉÏÏÔʾһ¸ö´íÎóµÄÐÅÏ¢£¬ÀýÈç¡£

×¢£º1É豸µÄËÙÂÊÐÅÏ¢ÊÇͨ¹ýdevicespeed²ÎÊý·µ»Ø¡£¿ÉÄܵÄÖµÊÇ£º0x1¶ÔӦȫËÙÉ豸£¬0x2¶ÔÓ¦µÍËÙÉ豸¡£

2É豸ÃèÊö·ûµÄÐÅϢͨ¹ýÖ¸ÕëDeviceDesc·µ»Ø£¬ËüÖ¸Ïòusbh_devdesc_typedefdefinedÐͽṹÈçÏ£º

typedef struct _DeviceDescriptor {

uint8_t bLength;

uint8_t bDescriptorType;

uint16_t bcdUSB; /* USB Specification Number which device complies too */ uint8_t bDeviceClass;

uint8_t bDeviceSubClass; uint8_t bDeviceProtocol; uint8_t bMaxPacketSize;

uint16_t idVendor; /* Vendor ID (Assigned by USB Org) */

uint16_t idProduct; /* Product ID (Assigned by Manufacturer) */ uint16_t bcdDevice; /* Device Release Number */

uint8_t iManufacturer; /* Index of Manufacturer String Descriptor */ uint8_t iProduct; /* Index of Product String Descriptor */

uint8_t iSerialNumber; /* Index of Serial Number String Descriptor */ uint8_t bNumConfigurations; /* Number of Possible Configurations */ }

USBH_DevDesc_TypeDef;

3É豸ÅäÖÃÐÅÏ¢£¨ÅäÖ㬽ӿںͶ˵ãÃèÊö·û£©Í¨¹ý½á¹¹Ö¸Õë·µ»Øusbh_cfgdesc_typedef£¬usbh_interfacedesc_typedefºÍusbh_epdesc_typedefdefined¶¨ÒåÈçÏ£º typedef struct _ConfigurationDescriptor {

uint8_t bLength;

uint8_t bDescriptorType; uint16_t wTotalLength; uint8_t bNumInterfaces; uint8_t bConfigurationValue; uint8_t iConfiguration; uint8_t bmAttributes; uint8_t bMaxPower; }

USBH_CfgDesc_TypeDef;

typedef struct _InterfaceDescriptor {

uint8_t bLength;

uint8_t bDescriptorType; uint8_t bInterfaceNumber;

uint8_t bAlternateSetting; /* Value used to select alternative setting */ uint8_t bNumEndpoints; /* Number of Endpoints used for this interface */ uint8_t bInterfaceClass; /* Class Code (Assigned by USB Org) */

uint8_t bInterfaceSubClass; /* Subclass Code (Assigned by USB Org) */ uint8_t bInterfaceProtocol; /* Protocol Code */

uint8_t iInterface; /* Index of String Descriptor Describing this interface */ }

USBH_InterfaceDesc_TypeDef; typedef struct _EndpointDescriptor {

uint8_t bLength;

uint8_t bDescriptorType;

uint8_t bEndpointAddress; /* indicates what endpoint this descriptor is describing */

uint8_t bmAttributes; /* specifies the transfer type. */

uint16_t wMaxPacketSize; /* Maximum Packet Size this endpoint is capable of sending or receiving */

uint8_t bInterval; /* is used to specify the polling interval of certain transfers. */ }

USBH_EpDesc_TypeDef;

4ΪÁËÒÆ¶¯ÄÚºË״̬»úµ½host_class_request״̬£¬userinput»Øµ÷º¯ÊýÓ¦¸Ã·µ»ØÖµusbh_usr_resp_okÀàÐ͵Äusbh_usr_status typedef enum {