/* * Copyright (c) 2021-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file usbfn_interface.h * * @brief Declares USB interface-specific definitions. * * @since 1.0 * @version 1.0 */ #ifndef USBFN_INTERFACE_H #define USBFN_INTERFACE_H #include "usb_object.h" #include "usbfn_request.h" /** * @brief Defines USB interfaces of the unspecified class. */ #define USB_INTERFACE_CLASS_UNSPEC 0x00 /** * @brief Defines USB interfaces of the Audio class. */ #define USB_INTERFACE_CLASS_AUDIO 0x01 /** * @brief Defines USB interfaces of the Communication Device Class (CDC). */ #define USB_INTERFACE_CLASS_CDC 0x02 /** * @brief Defines USB interfaces of the Human Interface Device (HID) class. */ #define USB_INTERFACE_CLASS_HID 0x03 /** * @brief Defines USB interfaces of the Physical class. */ #define USB_INTERFACE_CLASS_PHYSICAL 0x05 /** * @brief Defines USB interfaces of the Image class. */ #define USB_INTERFACE_CLASS_IMAGE 0x06 /** * @brief Defines USB interfaces of the Printer class. */ #define USB_INTERFACE_CLASS_PRINTER 0x07 /** * @brief Defines USB interfaces of the Mass Storage (MSD) class. */ #define USB_INTERFACE_CLASS_MASS_STORAGE 0x08 /** * @brief Defines USB interfaces of the Hub class. */ #define USB_INTERFACE_CLASS_HUB 0x09 /** * @brief Defines USB interfaces of the CDC-Data class. */ #define USB_INTERFACE_CLASS_CDC_DATA 0x0a /** * @brief Defines USB interfaces of the Smart Card class. */ #define USB_INTERFACE_CLASS_SMARTCARD 0x0b /** * @brief Defines USB interfaces of the Firmware Upgrade class. */ #define USB_INTERFACE_CLASS_FIRM_UPD 0x0c /** * @brief Defines USB interfaces of the Content Security class. */ #define USB_INTERFACE_CLASS_SECURITY 0x0d /** * @brief Defines USB interfaces of the Video class. */ #define USB_INTERFACE_CLASS_VIDEO 0x0e /** * @brief Defines USB interfaces of the Diagnostic Device class. */ #define USB_INTERFACE_CLASS_DIAGNOSTIC 0xdc /** * @brief Defines USB interfaces of the Wireless Controller class. */ #define USB_INTERFACE_CLASS_WIRELESS 0xe0 /** * @brief Defines USB interfaces of the Miscellaneous class. */ #define USB_INTERFACE_CLASS_IAD 0xef /** * @brief Defines USB interfaces of the Application Specific class. */ #define USB_INTERFACE_CLASS_APP_SPEC 0xfe /** * @brief Defines USB interfaces of the Vendor Specific class. */ #define USB_INTERFACE_CLASS_VENDOR 0xff /** * @brief Defines the USB device event status. */ typedef enum { /** USB binding event */ USBFN_STATE_BIND, /** USB unbinding event */ USBFN_STATE_UNBIND, /** USB enabling event */ USBFN_STATE_ENABLE, /** USB disabling event */ USBFN_STATE_DISABLE, /** USB connection setup event */ USBFN_STATE_SETUP, /** USB suspending event */ USBFN_STATE_SUSPEND, /** USB resuming event */ USBFN_STATE_RESUME, } UsbFnDeviceState; /** * @brief Defines structure parameters for the USB interface request. */ struct UsbFnCtrlRequest { /** Request type */ uint8_t reqType; /** Specific request */ uint8_t request; /** Request data value */ uint16_t value; /** Request index value */ uint16_t index; /** * Number of bytes in the data communication phase, which must be less than the * value of bMaxPacketSize0 defined in the device descriptor */ uint16_t length; } __attribute__((packed)); /** * @brief Defines the structure of the events received by the USB interface. */ struct UsbFnEvent { /** Pointer to the received parameters of the control request */ struct UsbFnCtrlRequest *setup; UsbFnDeviceState type; void *context; }; /** * @brief Defines the USB interface information. */ struct UsbFnInterfaceInfo { /** Interface index */ uint8_t index; /** Number of pipes */ uint8_t numPipes; /** Interface class */ uint8_t interfaceClass; /** Interface subclass */ uint8_t subclass; /** Interface protocol */ uint8_t protocol; /** Interface configuration index */ uint8_t configIndex; }; /** * @brief Defines USB interface objects. */ struct UsbFnInterface { /** Pointer to the USB object */ const struct UsbObject *object; /** USB interface information */ struct UsbFnInterfaceInfo info; }; /** * @brief Defines the USB pipe information. */ struct UsbFnPipeInfo { /** Pipe ID */ uint8_t id; /** Pipe type */ UsbPipeType type; /** Pipe direction */ UsbPipeDirection dir; /** Maximum size of data packets that can be sent or received over the pipe */ uint16_t maxPacketSize; /** Data transmission interval of the pipe */ uint8_t interval; }; /** * @brief Defines callback called when endpoint 0 receives a control event. * * This function needs to be defined by the function driver. * * @param event Indicates the pointer to the event information, including the event type and request. */ typedef void (*UsbFnEventCallback)(struct UsbFnEvent *event); /** * @brief Defines the callback called when the function interface obtains or sets custom attributes. * * This function needs to be defined by the function driver. * * @param interface Indicates the pointer to the USB interface object. * @param name Indicates the pointer to the attribute name of the string type. * @param value Indicates the pointer to the attribute value of the string type. * * @return Returns 0 if the operation is successful; * returns a negative value defined in {@link UsbErrorType} otherwise. */ typedef int32_t (*UsbFnPropCallback)(const struct UsbFnInterface *intf, const char *name, const char *value); /** * @brief Defines custom attribute information. */ struct UsbFnRegistInfo { /** Pointer to the attribute name */ const char *name; /** Pointer to the attribute value */ const char *value; /** Pointer to the callback for the request of obtaining custom attributes */ UsbFnPropCallback getProp; /** Pointer to the callback for the request of setting custom attributes */ UsbFnPropCallback setProp; }; #ifdef __cplusplus extern "C" { #endif /** * @brief Defines the callback called when the USB interface starts a thread to receive EP0 events, * such as the setup event. * * @param interface Indicates the pointer to the USB interface object. * @param eventMask Indicates the type of the event to be processed. * The event is defined by UsbFnDeviceState. * Each bit of eventMask indicates an event. * For example, if the value of eventMask is 0xff, all events are received; * if the value of eventMask is 0x01, only the USBFN_STATE_BIND event is received. * @param callback Indicates the callback function called after a request is processed. * It needs to be defined by the application. * @param context Indicates the pointer to the private context data. * * @return Returns 0 if the operation is successful; returns a negative value * defined in {@link UsbErrorType} otherwise. */ int32_t UsbFnStartRecvInterfaceEvent( struct UsbFnInterface *interface, uint32_t eventMask, UsbFnEventCallback callback, void *context); /** * @brief Defines the callback called when the USB interface stops receiving EP0 events. * * @param interface Indicates the pointer to the USB interface object. * * @return Returns 0 if the operation is successful; returns a negative * value defined in {@link UsbErrorType} otherwise. */ int32_t UsbFnStopRecvInterfaceEvent(struct UsbFnInterface *interface); /** * @brief Enables a USB interface. * * This function is mainly used to initialize a request queue and open a pipe. * * @param interface Indicates the pointer to the USB interface object. * * @return Returns a #UsbFnInterfaceHandle containing the USB interface information * if the operation is successful; returns NULL otherwise. */ UsbFnInterfaceHandle UsbFnOpenInterface(struct UsbFnInterface *interface); /** * @brief Disables a USB interface. * * This function is mainly used to close a pipe and delete a request queue. * * @param UsbFnInterfaceHandle Indicates the handle of the USB interface object. * * @return Returns 0 if the operation is successful; returns a negative value * defined in {@link UsbErrorType} otherwise. */ int32_t UsbFnCloseInterface(UsbFnInterfaceHandle handle); /** * @brief Obtains USB pipe information based on the specified pipe ID. * * @param interface Indicates the pointer to the USB interface object. * @param pipeId Indicates the pipe ID. The value ranges from 0 to the total number of pipes on the USB interface. * @param info Indicates the pointer to the obtained pipe information. * * @return Returns 0 if the operation is successful; returns a negative * value defined in {@link UsbErrorType} otherwise. */ int32_t UsbFnGetInterfacePipeInfo(struct UsbFnInterface *interface, uint8_t pipeId, struct UsbFnPipeInfo *info); /** * @brief Registers custom attributes for a USB interface. * * In addition to custom attributes, you can use this function to register the callback function * for the request of obtaining and setting custom attributes. * * @param interface Indicates the pointer to the USB interface object. * @param registInfo Indicates the pointer to the attribute information. * * @return Returns 0 if the operation is successful; returns a negative * value defined in {@link UsbErrorType} otherwise. */ int32_t UsbFnRegistInterfaceProp(const struct UsbFnInterface *interface, const struct UsbFnRegistInfo *registInfo); /** * @brief Obtains custom attributes of a USB interface. * * Custom attributes can be any of the following: attributes of device descriptors, such as VID and PID, * attributes of the USB interface defined in the HCS file, and attributes registered * in the code at the application layer. * For example, if name is idVendor when obtaining the VID, the obtained value will be * stored in value as a hex string. * * @param interface Indicates the pointer to the USB interface object. * @param name Indicates the pointer to the attribute name of the string type. * @param value Indicates the pointer to the attribute value of the string type. Except integer data, * which is a string converted from hex data, all the other types of data are strings by default. * * @return Returns 0 if the operation is successful; returns a negative * value defined in {@link UsbErrorType} otherwise. */ int32_t UsbFnGetInterfaceProp(const struct UsbFnInterface *interface, const char *name, char *value); /** * @brief Sets custom attributes of a USB interface. * * Custom attributes can be any of the following: attributes of device descriptors, such as VID and PID, * attributes of the USB interface defined in the HCS file, and attributes registered * in the code at the application layer. * For example, if name is idVendor when setting the VID, the set value will be * stored in value as a hex string. * * @param interface Indicates the pointer to the USB interface object. * @param name Indicates the pointer to the attribute name of the string type. * @param value Indicates the pointer to the attribute value of the string type. Except integer data, * which is a string converted from hex data, all the other types of data are strings by default. * * @return Returns 0 if the operation is successful; returns a negative * value defined in {@link UsbErrorType} otherwise. */ int32_t UsbFnSetInterfaceProp(const struct UsbFnInterface *interface, const char *name, const char *value); #ifdef __cplusplus } #endif #endif /* USBFN_INTERFACE_H */