一.libusb简介
libusb 设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以操作硬件,从libusb的源代码可以看出,
这些API 调用了内核的底层接口,和kernel driver中所用到的函数所实现的功能差不多,只是libusb更加接近USB 规范。使得
libusb的使用也比开发内核驱动相对容易的多。
二.实例 :获取当前USB设备信息及写数据
#include <stdio.h>#include <libusb.h>void printdev(libusb_device *dev){struct libusb_device_descriptor desc;int r = libusb_get_device_descriptor(dev, &desc);
if (r < 0) {printf("failed to get device descriptor\n");return;}
printf("Number of possible configurations: %d\n",desc.bNumConfigurations);printf("Device Class: %d\n",desc.bDeviceClass);printf("VendorID:%d\n",desc.idVendor);printf("ProductID:%d\n",desc.idProduct);struct libusb_config_descriptor *config;libusb_get_config_descriptor(dev, 0, &config);printf("Interfaces: %d\n",config->bNumInterfaces);const struct libusb_interface *inter;const struct libusb_interface_descriptor *interdesc;const struct libusb_endpoint_descriptor *epdesc;int i,j,k;for(i=0; i<(int)config->bNumInterfaces; i++){
inter = &config->interface[i];for(j=0; j<inter->num_altsetting; j++){
interdesc = &inter->altsetting[j];printf("Interface Number: %d\n",(int)interdesc->bInterfaceNumber);printf("Number of endpoints: %d\n",(int)interdesc->bNumEndpoints);
for(k=0; k<(int)interdesc->bNumEndpoints; k++){
epdesc = &interdesc->endpoint[k];printf("Descriptor Type: %d\n",(int)epdesc->bDescriptorType);printf("EP Address: %d\n",epdesc->bEndpointAddress);}
}
}
libusb_free_config_descriptor(config);
}int main(){libusb_context *ctx=NULL;ssize_t cnt;libusb_device **devs;libusb_device_handle *dev_handle;if(0>libusb_init(&ctx)){
printf("Init Error.\n");return 1;}
cnt=libusb_get_device_list(ctx, &devs);if(cnt < 0){
printf("Get Device Error.\n");return 1;}
printf("Device list:%d\n",cnt);ssize_t i;
for(i = 0; i < cnt; i++){
printdev(devs[i]);}
dev_handle = libusb_open_device_with_vid_pid(ctx, 2385, 5734);if(dev_handle == NULL)printf("Cannot open device\n");elseprintf("Device Opened\n");libusb_free_device_list(devs, 1);int r;unsigned char data[4];// data to writedata[0]='a'; // some dummy valuesdata[1]='b';data[2]='c';data[3]='\0';int actual;
if(libusb_kernel_driver_active(dev_handle, 0) == 1)//find out if kernel driver is attached{
printf("Kernel Driver Active.\n");if(libusb_detach_kernel_driver(dev_handle, 0) == 0) //detach itprintf("Kernel Driver Detached!.\n");}
r = libusb_claim_interface(dev_handle, 0);//claim interface 0 (the first) of device (mine had jsut 1)if(r < 0){
printf("Cannot Claim Interface.\n");return 1;}
printf("Claimed Interface.\n");printf("Writing Data:%s\n",data);r = libusb_bulk_transfer(dev_handle, (2 | LIBUSB_ENDPOINT_OUT), data, 4, &actual, 0); //my device's out endpoint was 2, found with trial- the device had 2 endpoints: 2 and 129printf("Writing Datas:%d\n",r);if(r == 0 && actual == 4) //we write the 4 bytes successfullyprintf("Writing Successful!\n");elseprintf("Write Error.\n");
r = libusb_release_interface(dev_handle, 0); //release the claimed interfaceif(r!=0){
printf("Cannot Release Interface.\n");return 1;}
printf("Released Interface.\n");
libusb_close(dev_handle);//close the device we openedlibusb_exit(ctx);//needs to be called to end thereturn 0;}Makefile:# -----------------------------------------------------------# Des: Makefile for the libusb test app# Date: 2016.11.02 hj# -----------------------------------------------------------default: allCC = arm-Linux-gnueabihf-gcc -DWITH_NONAMESPACESLDFLAGS = -L./lib -ludev -lusb-1.0 -lpthreadINCLUDE = -I./includeDFLAGS = -g -O2 -Wall -D_GNU_SOURCE -D__USE_XOPENNAME = libusb_testSERVER_OBJS = *.oall:server
server: $(SERVER_OBJS)
@echo "Compile $(NAME) success!"@$(CC) $(DFLAGS) -o $(NAME) $(SERVER_OBJS) $(LDFLAGS).c.o:@echo "$(CC): compile $< ..."@$(CC) -c $(DFLAGS) $(INCLUDE) $<
clean:
rm -f *.o *~ $(NAME)
三.库源码:http://download.youkuaiyun.com/detail/qq_18854309/9874750