Can libusb be used on the USB device side, e.g. Linux Gadget Device?
No.
libusb only provides an API for writing software on the host. Of course, if the device also acts as a USB host then libusb could still be useful, but only for the host part of the device.
libusb主要用于HOST端,device(gadget)端看起来支持度不行,device端可以通过HID节点进行读写
/*****************************************************************
* Author: DriverMonkey
* Mail: bookworepeng@Hotmail.com
* Phone: 18575593141
* QQ: 196568501
* Blog: http://blog.csdn.net/drivermonkey
* Date: 02/07/2015
*****************************************************************/
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define HID_MAX_PACKET_SIZE 64
#define HID_BUFFER_SIZE (10*1024*1024)// 10M bytes
typedef struct
{
char null_array[HID_MAX_PACKET_SIZE];
}buffer_offset_size_t;
static char hid_read_buffer[HID_BUFFER_SIZE];
static char hid_write_buffer[HID_BUFFER_SIZE];
static int hid_file_handle = 0;
static const char* hid_file_name = "/dev/hidg0";
static int hid_init(void);
static int hid_read(void* buffer, int buffer_size);
static int hid_write(void* buffer, int buffer_size);
/*****************************************************************
* Function name: main
* Author: DriverMonkey
* Function Description: main function just for hid temp testing
* Input argv:
* Output argv:
* Return:
* Be careful:
*****************************************************************/
int main(void)
{
int read_size = 0;
int test_count = 100;
hid_init();
while(test_count--)
{
memset(hid_read_buffer, 0x00, HID_BUFFER_SIZE);
read_size = hid_read(hid_read_buffer, HID_BUFFER_SIZE);
//printf("getting report::%s \n", hid_read_buffer);
memset(hid_write_buffer, 0x00, HID_BUFFER_SIZE);
strcpy(hid_write_buffer, hid_read_buffer);
hid_write(hid_write_buffer, read_size);
}
return 0;
}
/*****************************************************************
* Function name: hid_init
* Author: DriverMonkey
* Function Description: init HID
* Input argv:
* Output argv:
* Return: >= 0 - no error
< 0 - reading error
* Be careful: Must be called befoore HID be used!
*****************************************************************/
static int hid_init(void)
{
if ((hid_file_handle = open(hid_file_name, O_RDWR, 0666)) < 0)
{
perror(hid_file_name);
return hid_file_handle;
}else
{
return hid_file_handle;
}
}
/*****************************************************************
* Function name: hid_read
* Author: DriverMonkey
* Function Description: Read data form hid driver
* Input argv: buffer_size - buffer size
* Output argv: buffer - buffer to save reading out data
* Return: >= 0 - read size
< 0 - reading error
* Be careful:
*****************************************************************/
static int hid_read(void* buffer, int buffer_size)
{
if(buffer == NULL)
{
perror("hid_read::pointer error!");
return -1;
}
return read(hid_file_handle, buffer, buffer_size);
}
/*****************************************************************
* Function name: hid_read
* Author: DriverMonkey
* Function Description: Read data form hid driver
* Input argv: buffer_size - buffer size
* Output argv: buffer - buffer to save reading out data
* Return: >= 0 - no error
< 0 - reading error
* Be careful:
*****************************************************************/
static int hid_write(void* buffer, int buffer_size)
{
int return_v = 0;
int writting_count = buffer_size / HID_MAX_PACKET_SIZE;
int remainding_size = buffer_size % HID_MAX_PACKET_SIZE;
buffer_offset_size_t* buffer_offset = (buffer_offset_size_t*)buffer;
if(buffer == NULL)
{
perror("hid_write::pointer error!");
return -1;
}
while(writting_count--)
{
return_v = write(hid_file_handle, buffer_offset,HID_MAX_PACKET_SIZE);
if(return_v < 0)
{
perror("hid_write::writting error!");
return return_v;
}
buffer_offset++;
}
return_v = write(hid_file_handle, buffer_offset, remainding_size);
return return_v;
}