# usb3vision **Repository Path**: sharpcat2013/usb3vision ## Basic Information - **Project Name**: usb3vision - **Description**: Driver for USB3 Vision(TM) class devices - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-12-18 - **Last Updated**: 2022-07-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # usb3vision Driver for USB3 Vision(TM) class devices This driver is the kernel piece of a larger driver intended to acquire images from USB3 Vision class devices. USB3 Vision utilizes GenICam, a usermode generic programming interface that translates high-level actions into register read/write operations. Therefore, significant application logic outside of this kernel module is needed to incorporate GenICam and be fully compatible with the USB3Vision specification. Devices are enumerated at /sys/class/usbmisc/u3vX, where X is a number associated with the camera. From there you can check ./device/device_guid and ensure that you've found the device you are looking for. Then you can open /dev/devX to get a file handle to the device that you can use for interacting with the ioctl interface. The ioctl interface is provided in u3v_shared.h: * U3V_IOCTL_READ * U3V_IOCTL_WRITE * U3V_IOCTL_GET_STREAM_ALIGNMENT * U3V_IOCTL_GET_OS_MAX_TRANSFER * U3V_IOCTL_CONFIGURE_STREAM * U3V_IOCTL_UNCONFIGURE_STREAM * U3V_IOCTL_CONFIGURE_BUFFER * U3V_IOCTL_UNCONFIGURE_BUFFER * U3V_IOCTL_QUEUE_BUFFER * U3V_IOCTL_WAIT_FOR_BUFFER * U3V_IOCTL_CANCEL_ALL_BUFFERS * U3V_IOCTL_CTRL_MSG * U3V_IOCTL_START_EVENTS * U3V_IOCTL_WAIT_FOR_EVENT * U3V_IOCTL_STOP_EVENTS * U3V_IOCTL_CONFIGURE_STREAM2 These functions take a struct as a parameter with any necessary information. For example, let's look at configuring a buffer. The struct associated with that call looks like this: struct u3v_configure_buffer { void __user *u_image_buffer; void __user *u_chunk_data_buffer; __u64 __user *u_buffer_handle; }; Usermode code would create that struct and fill it in, then call the ioctl with the file descriptor you got from opening the device, the macro from u3v_shared, and the struct. Here's an example: // Do this just once, at the beginning char* devicePath = "/dev/u3vX"; int fd = open(devicePath, O_RDWR); if (fd == -1) { // error handling } ---------------------------------------------------------- // Then ioctl calls would be something like this struct u3v_configure_buffer configureBuffer; configureBuffer.u_image_buffer = imageBuffer; // pointer to user image data buffer configureBuffer.u_chunk_data_buffer = chunkDataBuffer; // pointer to user chunk data buffer configureBuffer.u_buffer_handle = bufferHandle; // pointer to uint64_t handle that will be populated by the kernel driver int ret = ioctl(fd, U3V_IOCTL_CONFIGURE_BUFFER, &configureBuffer); if (ret != 0) { // error handling }