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 {