由于要写一个USB下载固件的东西,主要配合更新固件功能,搜集了一些资料,放到了博客里,方便以后查阅。
1. 下载LIBUSB-WIN32。安装libusb-win32-filter-bin-0.1.12.1.exe,测试用
2. 通过VC创建一个DIALOG。
3. 设置好界面
4. 正式开始USB设置
- 拷贝libusb0.dll、libusb.lib、usb.h到刚才创建的目录下。
- 打开VC->Setting->Link下,选择generate项,在library module下填写”libusb.lib “,其实主要添加libusb.lib。
5 . program.
#include<usb.h>
/* usb.h这个头文件是要包括的,里面包含了必须要用到的数据结构 */
/* 我们将一个设备的属性用一个结构体来概括 */
typedefstruct
{
structusb_device* udev;
usb_dev_handle*device_handle;
/* 这里可以添加设备的其他属性,这里只列出每个设备要用到的属性 */
}device_descript;
/* 用来设置传输数据的时间延迟 */
#defineUSB_TIMEOUT 10000
/* 厂家ID 和产品 ID */
#defineVENDOR_ID 0xffff
#definePRODUCT_ID 0xffff
/* 这里定义数组来保存设备的相关属性,DEVICE_MINOR可 以设置能够同时操作的设备数量,用全局变量的目的在于方便保存属性 */
#defineDEVICE_MINOR 16
intg_num;
device_descriptg_list[ DEVICE_MINOR ];
//发现DEVICE。发现一个奇怪的问题,VMWARE中不能运行,但是到真实的PC就可以,看来我要启动到PC下开发了。
void ::OnButtonDevie()
{
// TODO: Add your control notification handler code here
struct usb_bus *bus;
struct usb_device *dev;
g_num = 0;
usb_init();
usb_set_debug(3);
usb_find_busses();
usb_find_devices();
/* */
for (bus = usb_get_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 < DEVICE_MINOR) {
g_list[g_num].udev = dev;
g_num ++;
}
}
}
}
m_nInfo.Format(”Founded %d \n”,g_num);
UpdateData(FALSE);
}
好了,至此,就可以用USB其他的函数完成读写。
6. 关键函数使用
usb_control_msg--------
unsigned char Outbuf[8];
unsigned char request=0x01;
Outbuf[0]= '1';Outbuf[1]= '2';Outbuf[2]= '3';Outbuf[3]= 0x33;Outbuf[4] = 0x44;
Outbuf[5]= 0x55;Outbuf[6] = 0x66;Outbuf[7] = 0x77;
//usb_control_msg先发送setup包,然后根据发送缓冲区的大小,发送in或out包
unsigned char nbytes = usb_control_msg(M_USBhandle,
USB_TYPE_VENDOR| USB_RECIP_DEVICE | USB_ENDPOINT_OUT,
request,
0x00,
0x00,
(char*)Outbuf, 0x08,
5000);
usb_control_msg将会引起主机向从机发送 setup事件,setup传输的数据阶段就是usb_control_msg函数中的参数,另外,setup事物之后,主机会向从机发送 out事物,根据Outbuf的数据和 定义的size来发送数据
usb_interrupt_write----
根据设备定义的中断out端点发送数据,直接以out事务的形式发送
usb_interrupt_read--------
根据设备的描述符里定义的中断查询时间,主机会以这个间隔来发送int请求,等待从机的数据返回