/* * @Author: your name * @Date: 2022-04-02 13:45:24 * @LastEditTime: 2023-01-11 14:09:48 * @LastEditors: Zhaozhonmin 1656963645@qq.com * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \zynq_ps\usb\inc\usbdevice.h */ #pragma once #include #include #include #include #include "camtp.h" #include "buildconf.h" #include "usb_gadget.h" #include "JsonConfig.h" //#define AIO_BULK_TRANSFER #ifdef AIO_BULK_TRANSFER #include #include #include #endif class ThreadPool ; class UsbDevice { public: UsbDevice(std::function handler = std::function(), std::function call_back = std::function()); virtual ~UsbDevice(); int read_bulk(void* data, int size ,int timeOutMs); int write_bulk(void* data, int size); int write_int(void* data, unsigned char size); void abort_int(); void flush_bluk_buffer(); void reset(); void showUsbStatus(); void resetUSB(); bool is_connected() { return b_connected; } void setLoop_continue(int loop) { loop_continue = loop ; b_connected = loop ; } #ifdef AIO_BULK_TRANSFER void aio_cancel(); #endif private: void usb_main(); usb_gadget * init_usb_camtp_gadget(camtp_ctx * ctx); void deinit_usb_camtp_gadget(usb_gadget * usbctx); int handle_ffs_ep0(usb_gadget * ctx); int handle_ep0(usb_gadget * ctx); int add_usb_string(usb_gadget * usbctx, int id, const char * string); void fill_ep_descriptor(camtp_ctx * ctx, usb_gadget * usbctx,struct usb_endpoint_descriptor_no_audio * desc,int index,unsigned int flags); void fill_if_descriptor(camtp_ctx * ctx, usb_gadget * usbctx, struct usb_interface_descriptor * desc); void fill_config_descriptor(camtp_ctx * ctx , usb_gadget * usbctx,struct usb_config_descriptor * desc,int total_size, int hs); void fill_dev_descriptor(camtp_ctx * ctx, usb_gadget * usbctx,struct usb_device_descriptor * desc); void handle_setup_request(usb_gadget * ctx, struct usb_ctrlrequest* setup); int init_eps(usb_gadget * ctx, int ffs_mode); int init_ep(usb_gadget * ctx,int index,int ffs_mode); int write(int fd, void* data, size_t size); int read(int fd, void* data, size_t size , int timeOutMs = -1); static const int cacheSize; std::shared_ptr camtp_context; usb_gadget gadget; std::function ctrl_handler; std::function connect_call; std::thread thread_main; usb_gadget *usb_ctx; volatile bool b_connected; std::shared_ptr intPointPool ; int loop_continue = 0 ; int vid_; int pid_; #ifdef AIO_BULK_TRANSFER // int handle_ffs_aio_ep0(usb_gadget * ctx); io_context_t aio_ctx = 0; std::queue aio_cb; int evfd; std::thread aio_event_thread; int aio_event_poll(); std::mutex mx; #endif };