主题 : 国嵌USB专题教程(价值580元) 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 5132
精华: 0
发帖: 14
金钱: 80 两
威望: 27 点
综合积分: 28 分
注册时间: 2009-04-11
最后登录: 2013-01-03
190楼  发表于: 2010-08-28 16:22
谢谢了,看看
级别: 新手上路
UID: 27580
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
综合积分: 20 分
注册时间: 2010-08-28
最后登录: 2011-08-23
191楼  发表于: 2010-08-28 17:10
好东西,终于在这里出现了
级别: 新手上路
UID: 27600
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2010-08-28
最后登录: 2010-08-28
192楼  发表于: 2010-08-28 17:44
我也来顶
级别: 新手上路
UID: 1445
精华: 0
发帖: 10
金钱: 55 两
威望: 10 点
综合积分: 20 分
注册时间: 2008-08-28
最后登录: 2011-05-06
193楼  发表于: 2010-08-28 19:23
看看是啥东西
级别: 侠客
UID: 6851
精华: 0
发帖: 65
金钱: 370 两
威望: 131 点
综合积分: 130 分
注册时间: 2009-06-19
最后登录: 2011-09-23
194楼  发表于: 2010-08-28 21:13
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的易用性。
级别: 新手上路
UID: 12830
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2010-01-14
最后登录: 2012-09-23
195楼  发表于: 2010-08-28 21:56
let me see see
级别: 新手上路
UID: 23570
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
综合积分: 12 分
注册时间: 2010-06-22
最后登录: 2010-09-13
196楼  发表于: 2010-08-29 08:24
谢谢楼主。
baiguangyu001
级别: 新手上路
UID: 27627
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2010-08-29
最后登录: 2010-11-06
197楼  发表于: 2010-08-29 08:35
谢谢分享
级别: 新手上路
UID: 27629
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2010-08-29
最后登录: 2010-08-29
198楼  发表于: 2010-08-29 10:52
看看
级别: 新手上路
UID: 21390
精华: 0
发帖: 8
金钱: 45 两
威望: 9 点
综合积分: 16 分
注册时间: 2010-05-15
最后登录: 2011-05-02
199楼  发表于: 2010-08-29 16:50
看看