usb_claim_interface(Device_handle, 0);
/* 发送数据,所用到的宏定义在usb.h可以找到,我列出来大家看一下
#define USB_ENDPOINT_OUT 0x00
#define USB_TYPE_CLASS (0x01
#define USB_RECIP_INTERFACE 0x01
#define HID_REPORT_SET 0x09 */
send_len = usb_control_msg(Device_handle,
USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE,
HID_REPORT_SET,
0x300,
0,
send_data, 72, USB_TIMEOUT);
/* 发送数据有错误 */
if (send_len
return WRITE_REPORT;
}
if (send_len != 72) {
return send_len;
}
/* 接受数据
#define USB_ENDPOINT_IN 0x80
#define USB_TYPE_CLASS (0x01
#define USB_RECIP_INTERFACE 0x01
#define HID_REPORT_GET 0x01
*/
recv_len = usb_control_msg(Device_handle,
USB_ENDPOINT_IN + USB_TYPE_CLASS + USB_RECIP_INTERFACE,
HID_REPORT_GET,
0x300,
0,
recv_data, 72, USB_TIMEOUT);
if (recv_len
printf("failed to retrieve report from USB device!\n");
return READ_REPORT;
}
if (recv_len != 72) {
return recv_len;
}
/* 和usb_claim_interface对应 */
usb_release_interface(RY2_handle, 0);
memcpy(buffer72, recv_data, 72);
return SUCCESS;
}
3.4 关闭设备
假设我们定义的关闭设备的函数名是Device_Close()
/* 使用hid驱动关闭设备 */
int Device_Close()
{
int handle;
handle = open(“hiddev0”, O_RDONLY);
/* 传统HID驱动调用,通过close()设备文件就可 */
close( handle );
}
/* 使用libusb关闭驱动 */
int Device_Close()
{
/* LIBUSB 驱动打开设备,这里写的是伪代码,不保证代码有用 */
struct usb_device* udev;
usb_dev_handle* device_handle;
device_handle = usb_open(udev);
/* libusb库使用usb_close关闭程序 */
usb_close(device_handle);
}
libusb的驱动框架
前面我们看了些主要的libusb函数的使用,这里我们把前面的内容归纳下:
一般的驱动应该都包含如下接口:
Device_Find(); /* 寻找设备接口 */
Device_Open(); /* 打开设备接口 */
Device_Write(); /* 写设备接口 */
Device_Read(); /* 读设备接口 */
Device_Close(); /* 关闭设备接口 */
具体代码如下:
#include
/* usb.h这个头文件是要包括的,里面包含了必须要用到的数据结构 */
/* 我们将一个设备的属性用一个结构体来概括 */
typedef struct
{
struct usb_device* udev;
usb_dev_handle* device_handle;
/* 这里可以添加设备的其他属性,这里只列出每个设备要用到的属性 */
} device_descript;
/* 用来设置传输数据的时间延迟 */
#define USB_TIMEOUT 10000
/* 厂家ID 和产品 ID */
#define VENDOR_ID 0xffff
#define PRODUCT_ID 0xffff
/* 这里定义数组来保存设备的相关属性,DEVICE_MINOR可以设置能够同时操作的设备数量,用全局变量的目的在于方便保存属性 */
#define DEVICE_MINOR 16
int g_num;
device_descript g_list[ DEVICE_MINOR ];
/* 我们写个设备先找到设备,并把相关信息保存在 g_list 中 */
int Device_Find()
{
struct usb_bus *bus;
struct usb_device *dev;
g_num = 0;
usb_find_busses();
usb_find_devices();
/* 寻找设备 */
for (bus = usb_busses; bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
if(dev->descriptor.idVendor==VENDOR_ID&& dev->descriptor.idProduct == PRODUCT_ID) {
/* 保存设备信息 */
if (g_num
g_list[g_num].udev = dev;
g_num ++;
}
}
}
}
return g_num;
}
/* 找到设备后,我们根据信息打开设备 */
int Device_Open()
{
/* 根据情况打开你所需要操作的设备,这里我们仅列出伪代码 */
if(g_list[g_num].udev != NULL) {
g_list[g_num].device_handle = usb_open(g_list[g_num].udev);
}
}
/* 下面就是操作设备的函数了,我们就不列出来拉,大家可以参考上面的介绍 */
int DeviceWite(int handle)
{
/* 填写相关代码,具体查看设备协议*/
}
int DeviceOpen(int handle)
{
/* 填写相关代码,具体查看设备协议 */
}
/* 最后不要忘记关闭设备 */
void Device_close(int handle)
{
/* 调用usb_close */
}
小结
到此,使用libusb进行驱动开发介绍完了,通过对库所提供的API的使用可以体会到libusb的易用性。