zynq_7010/usbdevice.h

98 lines
3.1 KiB
C++
Executable File

/*
* @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 <stdint.h>
#include <thread>
#include <functional>
#include <memory>
#include "camtp.h"
#include "buildconf.h"
#include "usb_gadget.h"
//#define AIO_BULK_TRANSFER
#ifdef AIO_BULK_TRANSFER
#include <libaio.h>
#include <queue>
#include <mutex>
#endif
class ThreadPool ;
class UsbDevice
{
public:
UsbDevice(std::function<bool(int, struct usb_ctrlrequest*, unsigned char*)> handler = std::function<bool(int, struct usb_ctrlrequest*, unsigned char*)>(),
std::function<void(bool)> call_back = std::function<void(bool)>());
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_ctx> camtp_context;
usb_gadget gadget;
std::function<bool(int, struct usb_ctrlrequest*, unsigned char*)> ctrl_handler;
std::function<void(bool)> connect_call;
std::thread thread_main;
usb_gadget *usb_ctx;
volatile bool b_connected;
std::shared_ptr<ThreadPool> intPointPool ;
int loop_continue = 0 ;
#ifdef AIO_BULK_TRANSFER
// int handle_ffs_aio_ep0(usb_gadget * ctx);
io_context_t aio_ctx = 0;
std::queue<iocb *> aio_cb;
int evfd;
std::thread aio_event_thread;
int aio_event_poll();
std::mutex mx;
#endif
};