当前位置:  技术问答>linux和unix

怎样利用linux的系统接口来操作USB设备

    来源: 互联网  发布时间:2016-05-11

    本文导语:    我想用linux的标准接口来操作USB设备,就像USB驱动的测试程序一样,能够读取USB的属性, 问一下怎么操作,要用到linux哪些系统接口,哪个做过的大虾帮忙一下,DX。。 | ...


  我想用linux的标准接口来操作USB设备,就像USB驱动的测试程序一样,能够读取USB的属性,
问一下怎么操作,要用到linux哪些系统接口,哪个做过的大虾帮忙一下,DX。。

|
链接: http://libusb.wiki.sourceforge.net/

|
/* armtools/src/usbdl.h
 *
 * USB Download Tool,base on dltool.c by Ben Dooks
 * copyright (c) 2007 thexin chan 
 *
 * 2007-10-24 create version.
 */

#ifndef __USBDL_H_
#define __USBDL_H_

#include 
#include 
#include 
#include 
#include 

#include 
#include 

#include 

/* usb downloader struct */
/* ep:which ep used to download*/
struct usb_down_t {
char *name;
int id_vendor;
int id_product;

struct usb_bus *bus;
struct usb_bus *busses;
struct usb_device *device;
usb_dev_handle *devh;

/*which ep used for download*/
int ep;

/*
 * private data for this struct.
 * you can give some data into here like address,size...
 * or some struct variable.
 */
void *priv_data;

/*
 * transmit file,chars sended will return.
 */
unsigned long (*transmit_file)(struct usb_down_t *usbdl,const char *fname);
};

int usbdl_init(struct usb_down_t *usbdl);
int usbdl_transmit(struct usb_down_t *usbdl,unsigned char *data,unsigned long size);

#endif /*__USBDL_H_*/




/* armtools/src/usbdl.c
 *
 * copyright (c) thexin chan 
 *
 * 2007-10-24 create version.
 */

#include 
#include 
#include 

#include "usbdl.h"
#include "debug.h"

static void print_usb_device(struct usb_device *dev);

/*
 * check the usb device is match the vendor and product id,
 * return 0:invalid 1:valid
 */
static int usbdl_verify_device(int vendor, int product,struct usb_device *dev)
{
if (dev->descriptor.bNumConfigurations != 1)
return 0;

/*debug information*/
print_usb_device(dev);

if (dev->descriptor.idVendor == vendor &&
    dev->descriptor.idProduct == product)
return 1;

return 0;
}

/*
 * match the device on bus with id_vendor,and id_product.
 * return NULL: no match ,usb_device*: match.
 */
static struct usb_device* usbdl_match_bus(int vendor,int product,struct usb_bus *bus)
{
struct usb_device *dev;

dprintk("bus %p: dirname %sn", bus, bus->dirname);

for(dev=bus->devices;dev!=NULL;dev=dev->next){
dprintk("dev %p filename %sn",dev,dev->filename);

if(!usbdl_verify_device(vendor,product,dev))
continue;

return dev;
}

return NULL;
}

/*
 * match the usb_down_t 
 * set usbdl->device,usbdl->bus to first valid device and bus.
 * return 0:matched,busses;pbus!=NULL;pbus=pbus->next){
pdev = usbdl_match_bus(usbdl->id_vendor,usbdl->id_product,pbus);
if(pdev!=NULL){
usbdl->device = pdev;
usbdl->bus = pbus;
dprintk("matched: bus %p, device %pn", pbus, pdev);
return 0;
}
}

usbdl->device = NULL;
usbdl->bus = NULL;

return -1;
}

int usbdl_init(struct usb_down_t *usbdl)
{
usb_init();
usb_find_busses();
usb_find_devices();

usbdl->busses = usb_get_busses();
return usbdl_match(usbdl);
}

/*
 * transmit data to usb_device 's ep.
 * return bytes writed,or busses)
usbdl_init(usbdl);

if(!usbdl->device || !usbdl->bus){
dprintk("no matched usb device,id_vendor=%d,id_product=%dn",
usbdl->id_vendor,usbdl->id_product);
return -1;

}

usbdl->devh = usb_open(usbdl->device);
if(!usbdl->devh){
dprintk("usb_open error: %sn",strerror(errno));
return -2;
}

if(usb_claim_interface(usbdl->devh,0)devh);
return -3;
}


ret = usb_bulk_write(usbdl->devh,usbdl->ep,(void*)data,size,5*1000*1000);
if(ret != size){
dprintk("usb_bulk_write request write %ld bytes,but %ld writed : %sn",
size,ret,strerror(errno));
}else
dprintk("usb_bulk_write success write %ld bytes datan",ret);

usb_release_interface(usbdl->devh,0);
usb_close(usbdl->devh);
usbdl->devh = 0;

return 0;
}

/*print functions for print usb configurations*/
void print_endpoint(struct usb_endpoint_descriptor *endpoint)
{
dprintk("      bEndpointAddress: %02xhn", endpoint->bEndpointAddress);
dprintk("      bmAttributes:     %02xhn", endpoint->bmAttributes);
dprintk("      wMaxPacketSize:   %dn", endpoint->wMaxPacketSize);
dprintk("      bInterval:        %dn", endpoint->bInterval);
dprintk("      bRefresh:         %dn", endpoint->bRefresh);
dprintk("      bSynchAddress:    %dn", endpoint->bSynchAddress);
}


void print_altsetting(struct usb_interface_descriptor *interface)
{
int i;

dprintk("    bInterfaceNumber:   %dn", interface->bInterfaceNumber);
dprintk("    bAlternateSetting:  %dn", interface->bAlternateSetting);
dprintk("    bNumEndpoints:      %dn", interface->bNumEndpoints);
dprintk("    bInterfaceClass:    %dn", interface->bInterfaceClass);
dprintk("    bInterfaceSubClass: %dn", interface->bInterfaceSubClass);
dprintk("    bInterfaceProtocol: %dn", interface->bInterfaceProtocol);
dprintk("    iInterface:         %dn", interface->iInterface);

for (i = 0; i bNumEndpoints; i++)
print_endpoint(&interface->endpoint[i]);
}

void print_interface(struct usb_interface *interface)
{
int i;

for (i = 0; i num_altsetting; i++)
print_altsetting(&interface->altsetting[i]);
}

void print_configuration(struct usb_config_descriptor *config)
{
int i;

dprintk("  wTotalLength:         %dn", config->wTotalLength);
dprintk("  bNumInterfaces:       %dn", config->bNumInterfaces);
dprintk("  bConfigurationValue:  %dn", config->bConfigurationValue);
dprintk("  iConfiguration:       %dn", config->iConfiguration);
dprintk("  bmAttributes:         %02xhn", config->bmAttributes);
dprintk("  MaxPower:             %dn", config->MaxPower);

for (i = 0; i bNumInterfaces; i++)
print_interface(&config->interface[i]);
}

void print_device_desc(struct usb_device_descriptor *desc)
{
dprintk("t=> bNumConfigurations %dn",desc->bNumConfigurations);
dprintk("t=> bLength %dn", desc->bLength);
dprintk("t=> bType   %dn", desc->bDescriptorType);
dprintk("t=> bcdUSB  %xn", desc->bcdUSB);
dprintk("t=> idVendor %xn", desc->idVendor);
dprintk("t=> idProduct %xn", desc->idProduct);
}

void print_usb_device(struct usb_device *dev)
{
int index;

print_device_desc(&dev->descriptor);
for(index=0;indexdescriptor.bNumConfigurations;index++)
print_configuration(&dev->config[index]);
}

    
 
 

您可能感兴趣的文章:

  • 利用ARM2410外部接口连接单色LCD【求助】!!!!!
  • 菜鸟问题:请大家用简单的代码描述一下,如何利用接口实现多重继承!
  • php利用新浪接口查询ip获取地理位置示例
  • 利用kernel提供的接口打印进程号(pid)
  • 利用中国天气预报接口实现简单天气预报
  • linux c 怎样利用pro*c/c++操作 win2000 下 oracle 谢谢
  • 请问crontab -e能利用管道非交互操作吗
  • 利用js(jquery)操作Cookie的方法说明
  • C#利用com操作excel释放进程的解决方法
  • 嵌入式中,利用C语言操作SQLite数据库,查询没有数据返回,请大家帮忙看看哈
  • 如何利用Ganymed SSH-2模拟SSH操作
  • UNIX下利用管道重定向实现对程序的输出进行操作
  • C#利用ODP.net连接Oracle数据库的操作方法
  • jquery easyui利用DataGrid实现CRUD操作
  • 利用Aspose.Word控件实现Word文档的操作
  • 利用java操作Excel文件的方法
  • 巧妙利用Linux操作系统IP伪装防黑
  • C#利用WMI操作DNS服务器(可远程操作,需要相应权限)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux c下利用srand和rand函数生成随机字符串
  • 请问:Linux下用C编程计算CPU利用率和内存利用率?
  • linux下利用(cat,strings,head,sed)命令生成随机字符串
  • 在2003下利用vmware安装了linux,又利用host-only方式上了网,问题如下多谢指点!!!
  • Web前端开发如何利用css样式来控制Html中的h1/h2/h3标签不换行
  • 大虾 紧急求助!!!!如何求得当前机子的处理器利用率和内存利用率?
  • 如何利用libpcap和Python嗅探数据包
  • 如何利用Bash脚本(利用awksedgrepwc等)来自动修改配置文件
  • windows堆栈溢出利用的七种方式
  • 求RADIUS的动态分配IP的问题(利用IPPOOL)
  • iowait和cpu利用率的权衡问题
  • 利用java.net.URLConnection上传文件
  • Qt中利用槽如何来传递参数
  • 浏览器漏洞利用框架 BeEF
  • 怎么样利用Socket进行Java网络编程
  • 请问如何编程获得CPU利用率?(空)
  • 操作系统 iis7站长之家
  • 谁知道linux/unix下利用Schema读取校验xml的开源代码,给一个链接,谢谢!
  • 怎样实现利用fprintf,输出定长字串,位数不足时在左侧填入指定字符填充。。
  • CPU、内存、数据库利用率监控
  • 怎样利用u-boot烧写??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3