| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- /* Define to prevent recursive inclusion -------------------------------------*/
- #ifndef __USB_USBTMC_H
- #define __USB_USBTMC_H
- #ifdef __cplusplus
- extern "C" {
- #endif
- //----------------------------------------------------------------
- // Refer to:
- // [1] USBTMC Standard, rev. 1.0, 14/04/2003
- // "Universal Serial Bus Test and Measurement Class Specification (USBTMC)"
- // [2] USBTMC-USB488 Standard, rev. 1.0, 14/04/2003
- // "Universal Serial Bus Test and Measurement Class, Subclass USB488 Specification (USBTMC-USB488)
- //----------------------------------------------------------------
- /* Includes ------------------------------------------------------------------*/
- #include "usbd_ioreq.h"
- #include "usb/usb_hooks.h"
- #include "usb/usb_config.h"
- #include "core/config.h"
- #include "drivers/usb/class/common/class_common.h"
- #define USBTMC_BULKIO_EP 0x01 /* Bulk_IN_OUT */
- #define USBTMC_INTIO_EP 0x02 /* Interrupt_IN */
- #define USBTMC_BULKIN_EP (0x80 | USBTMC_BULKIO_EP) /* EP1 for data IN */
- #define USBTMC_BULKOUT_EP (0x7F & USBTMC_BULKIO_EP) /* EP1 for data OUT */
- #define USBTMC_INTERRUPTIN_EP (0x80 | USBTMC_INTIO_EP) /* EP2 for data IN */
- #define USBTMC_BENCHMARK_EP USBTMC_BULKIO_EP
- #define USBTMC_DATAIN_MAX_PACKET_SIZE 64 // Control-EP size
- #define USBTMC_DATAOUT_MAX_PACKET_SIZE 64 // Control-EP size
- // Refer [1], 3.4 Interrupt-IN.
- // The Host, after an Interrupt-IN transfer has completed, must interpret the first byte in the next Interrupt-
- // IN DATA payload as a new notification, beginning with bNotify1. Note that the USB 2.0 specification,
- // section 5.7.3, defines when an interrupt transfer must be considered complete. If no subclass specification
- // applies (bInterfaceProtocol = 0, see Table 44), or if the notification is a vendor specific request, the last
- // Interrupt-IN transaction must be a short packet (< wMaxPacketSize).
- #define USBTMC_INTIN_MAX_PACKET_SIZE 2 // INT-EP size: in accordance to [2]
- #define USBTMC_USE_COMMON_EP0RXREADY 1
- #define USBTMC_USE_COMMON_EP0TXSENT 1
- #if USB_CONTROL_USBTMC_RX_BUFFER < USB_MAX_EP0_SIZE
- #error Invalid USB_CONTROL_USBTMC_RX_BUFFER buffer size. Must be at least USB_MAX_EP0_SIZE bytes.
- #endif
- #if USB_CONTROL_USBTMC_TX_BUFFER < USB_MAX_EP0_SIZE
- #error Invalid USB_CONTROL_USBTMC_TX_BUFFER buffer size. Must be at least USB_MAX_EP0_SIZE bytes.
- #endif
- /*---------------------------------------------------------------------*/
- /* USBTMC interface definitions */
- /*---------------------------------------------------------------------*/
- typedef struct
- {
- USBD_HandleTypeDef * pdev; // for @USBD_USBTMC_DataIn_BeginSend()
- sUSBTransfer_t ep0_tx_transfer; // Control-IN EP
- sUSBTransfer_t ep0_rx_transfer; // Control-OUT EP
- sUSBTransfer_t ep1_tx_transfer; // Bulk-IN EP
- sUSBTransfer_t ep1_rx_transfer; // Bulk-OUT EP
- sUSBTransfer_t ep2_tx_transfer; // Interrupt-IN EP
- uint8_t ep0_tx_buffer[ USB_CONTROL_USBTMC_TX_BUFFER ]; // Control-IN EP
- uint8_t ep0_rx_buffer[ USB_CONTROL_USBTMC_RX_BUFFER ]; // Control-OUT EP
- uint8_t ep1_tx_buffer[ USB_BULK_USBTMC_TX_BUFFER ]; // Bulk-IN EP
- uint8_t ep1_rx_buffer[ USB_BULK_USBTMC_RX_BUFFER ]; // Bulk-OUT EP
- uint8_t ep2_tx_buffer[ USB_INTERRUPT_USBTMC_TX_BUFFER ]; // Interrupt-IN EP
- }
- USBD_USBTMC_HandleTypeDef;
- static inline size_t usbd_usbtmc_get_control_tx_transfer_size()
- {
- return sizeof(((USBD_USBTMC_HandleTypeDef*)0)->ep0_tx_buffer);
- }
- static inline size_t usbd_usbtmc_get_control_rx_transfer_size()
- {
- return sizeof(((USBD_USBTMC_HandleTypeDef*)0)->ep0_rx_buffer);
- }
- static inline size_t usbd_usbtmc_get_bulk_tx_transfer_size()
- {
- return sizeof(((USBD_USBTMC_HandleTypeDef*)0)->ep1_tx_buffer);
- }
- static inline size_t usbd_usbtmc_get_bulk_rx_transfer_size()
- {
- return sizeof(((USBD_USBTMC_HandleTypeDef*)0)->ep1_rx_buffer);
- }
- static inline size_t usbd_usbtmc_get_interrupt_tx_transfer_size()
- {
- return sizeof(((USBD_USBTMC_HandleTypeDef*)0)->ep2_tx_buffer);
- }
- #if CONFIG_USB_USBTMC_ENABLE
- extern const USBD_COMMON_ItfTypeDef USBD_Interface_Usbtmc_UsbInterface;
- #endif
- extern const USBD_ClassTypeDef USBD_USBTMC;
- #define USBD_USBTMC_CLASS &USBD_USBTMC
- sUSBTransfer_t * USBD_USBTMC_GetDataTxTransferHandle(); // Bulk-IN (USBTMC)
- sUSBTransfer_t * USBD_USBTMC_GetDataRxTransferHandle(); // Bulk-OUT (USBTMC)
- sUSBTransfer_t * USBD_USBTMC_GetInterruptTxTransferHandle(); // Interrupt-IN (USBTMC)
- const USBD_DescriptorsTypeDef * USBD_USBTMC_GetDescriptorHandlers();
- // USBD_USBTMC_DataIn_BeginSend
- // Initiates the first packet sending using virtual DataIN event
- // @bTxAlreadyPrepared - if the TX-transfer is already prepared to transmission, do not reset transfer, do not call TX-handler
- uint8_t USBD_USBTMC_DataIn_BeginSend( uint8_t epnum, bool bTxAlreadyPrepared );
- // USBD_USBTMC_DataIn_ZeroSend
- // Queue zero packet in EP IN
- uint8_t USBD_USBTMC_DataIn_ZeroSend( uint8_t epnum );
- // USBD_USBTMC_ClearEP()
- // Restore specfied halted data-endpoint by it's address and reset the buffer
- // Recover the Rx-transfer for specified endpoint
- // Restarts the receiving for the specified endpoint
- void USBD_USBTMC_ClearEP( uint8_t epaddr );
- // USBD_USBTMC_StallEP()
- // Halt specfied data-endpoint by it's address and reset the buffer
- void USBD_USBTMC_StallEP( uint8_t epaddr );
- // USBD_USBTMC_NakEP()
- // Reset hardware EP buffer and setup the end-point to Not-acknowlage mode
- // No data will be returned by EP util the data will be queued again
- void USBD_USBTMC_NakEP( uint8_t epaddr );
- // USBD_USBTMC_GetTxQueuedSize
- // Returns amound of bytes queued in USBTMC IN endpoint.
- // @epaddr - USBTMC EP-IN number
- // @pCount - pointer to the value to store the packet length, can not be NULL
- // Return: true if there is a queued packet in EP-IN, the length is stored in @pCount
- // false if there no queued packet in EP-IN, @pCount has not been modified
- bool USBD_USBTMC_GetTxQueuedSize( uint8_t epaddr, uint32_t * pCount );
- #ifdef __cplusplus
- }
- #endif
- #endif /* __USB_USBTMC_H */
|