libusb学习笔记

一.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");

    else

        printf("Device Opened\n");
 
 

    libusb_free_device_list(devs, 1); 

    int r;

    unsigned char data[4]; 

    // data to write

    data[0]='a'; // some dummy values

    data[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 it

        printf("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 129

    printf("Writing Datas:%d\n",r);

    if(r == 0 && actual == 4) //we write the 4 bytes successfully

        printf("Writing Successful!\n");

    else

        printf("Write Error.\n");

 

    r = libusb_release_interface(dev_handle, 0); //release the claimed interface

    if(r!=0) 

    {

        printf("Cannot Release Interface.\n");

        return 1;

    }

    printf("Released Interface.\n");

 

    libusb_close(dev_handle); 

    //close the device we opened

    libusb_exit(ctx); 

    //needs to be called to end the

    return 0;

}

 
 

 
 

Makefile:

# -----------------------------------------------------------

# Des: Makefile for the libusb test app

# Date: 2016.11.02 hj

# -----------------------------------------------------------

default: all

CC = arm-Linux-gnueabihf-gcc -DWITH_NONAMESPACES

LDFLAGS = -L./lib -ludev -lusb-1.0 -lpthread 

INCLUDE = -I./include 

DFLAGS = -g -O2 -Wall -D_GNU_SOURCE -D__USE_XOPEN

NAME = libusb_test

SERVER_OBJS = *.o 

all: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拥抱藍天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值