㈠ usb hub的linux驱动问题求教,多谢
static int __init ohci_hcd_mod_init(void)
{
platform_driver_register(&ohci_hcd_s3c2410_driver);
}
其实真正注册的是ohci_hcd_s3c2410_driver这个驱动。那我们来看一下这个结构体的具体值。
static struct platform_driver ohci_hcd_s3c2410_driver= {
.probe = ohci_hcd_s3c2410_drv_probe,
.remove = ohci_hcd_s3c2410_drv_remove,
.shutdown = usb_hcd_platform_shutdown,
.driver = {
.owner = THIS_MODULE,
.name = "s3c2410-ohci",
},
};
那我们一一来看上述的每一个函数的实现。
2.1 hcd 探测
函数很简单其实现功能的是usb_hcd_s3c2410_probe函数。
static int ohci_hcd_s3c2410_drv_probe(structplatform_device *pdev)
{
returnusb_hcd_s3c2410_probe(&ohci_s3c2410_hc_driver, pdev);
}
ohci_s3c2410_hc_driver提供了对于ohci的操作集。对于这些函数在后面的学习中去看,在此不加扩展。我们将下面的函数剔除枝叶留其主干。
static int usb_hcd_s3c2410_probe (const structhc_driver *driver,
struct platform_device *dev)
{
structusb_hcd *hcd = NULL;
int retval;
#if !defined(CONFIG_ARCH_2410)
usb_host_clk_en(); --使能clk
#endif
s3c2410_usb_set_power(dev->dev.platform_data,1, 1);
s3c2410_usb_set_power(dev->dev.platform_data,2, 1);
hcd =usb_create_hcd(driver, &dev->dev, "s3c24xx"); --创建一个hcd
hcd->rsrc_start= dev->resource[0].start; --获取物理地址
hcd->rsrc_len = dev->resource[0].end -dev->resource[0].start + 1;
request_mem_region(hcd->rsrc_start,hcd->rsrc_len, hcd_name);
clk =clk_get(&dev->dev, "usb-host");
s3c2410_start_hc(dev,hcd);
hcd->regs= ioremap(hcd->rsrc_start, hcd->rsrc_len);
ohci_hcd_init(hcd_to_ohci(hcd));
retval = usb_add_hcd(hcd,dev->resource[1].start, IRQF_DISABLED);
return 0;
}
对于usb的电源管理,我们暂时不看,不看不代表不重要,电源管理是很重要的。
那依次来看上面的函数。usb_create_hcd创建和初始化一个hcd结构体。
s3c2410_start_hc启动hc。这里有一个很奇怪的结构体就是struct s3c2410_hcd_info,在s3c6410中并没有看到该结构体的赋值。也许有人对此很困惑,该结构体做什么用的。那我们来看该结构体的真正面目。
struct s3c2410_hcd_info {
structusb_hcd *hcd; --保存该hcd_info所属的hcd
structs3c2410_hcd_portport[2]; --两个端口。
void (*power_control)(intport, int to); --电源控制
void (*enable_oc)(structs3c2410_hcd_info *, int on);
void (*report_oc)(structs3c2410_hcd_info *, int ports);
};
在usb-host.txt中对其功能进行了说明,就是一对函数,使能过流检测和控制端口电源状态。
power_control:使能或禁止端口电源
enable_oc :使能或禁止端口过流检测
report_oc :当端口存在过流,则会调用该函数。
static void s3c2410_start_hc(structplatform_device *dev, struct usb_hcd *hcd)
{
structs3c2410_hcd_info *info = dev->dev.platform_data;
clk_enable(clk);
if (info !=NULL) { --在s3c6410中该info为空。
info->hcd = hcd;
info->report_oc= s3c2410_hcd_oc;
if(info->enable_oc != NULL) {
(info->enable_oc)(info,1);
}
}
}
初始化ohci_hcd
static void ohci_hcd_init(structohci_hcd *ohci)
{
ohci->next_statechange= jiffies;
spin_lock_init(&ohci->lock);
INIT_LIST_HEAD(&ohci->pending);
}
初始化并注册usb_hcd
完成通用hcd的初始化和注册,在这里同时完成中断的申请和注册。
int usb_add_hcd(struct usb_hcd *hcd,unsigned intirqnum, unsigned long irqflags)
{
int retval;
structusb_device *rhdev;
hcd->authorized_default= hcd->wireless? 0 : 1; --判断是否为无线
set_bit(HCD_FLAG_HW_ACCESSIBLE,&hcd->flags); --设置HW_ACCESSIBLE旗标
if ((retval =hcd_buffer_create(hcd)) != 0) { --开辟hcd的缓冲区
returnretval;
}
if ((retval =usb_register_bus(&hcd->self)) < 0)
gotoerr_register_bus;
if ((rhdev =usb_alloc_dev(NULL, &hcd->self, 0)) == NULL) {
retval= -ENOMEM;
gotoerr_allocate_root_hub;
}
rhdev->speed= (hcd->driver->flags & HCD_USB2) ? USB_SPEED_HIGH :USB_SPEED_FULL;--指定根hub的speed
hcd->self.root_hub= rhdev;
device_init_wakeup(&rhdev->dev,1);
if(hcd->driver->reset && (retval = hcd->driver->reset(hcd))< 0) {--为NULL
gotoerr_hcd_driver_setup;
}
if(device_can_wakeup(hcd->self.controller)
&&device_can_wakeup(&hcd->self.root_hub->dev))
dev_dbg(hcd->self.controller,"supports USB remote wakeup\n");
if(hcd->driver->irq) { --中断处理
if(irqflags & IRQF_SHARED)
irqflags&= ~IRQF_DISABLED;
snprintf(hcd->irq_descr,sizeof(hcd->irq_descr), "%s:usb%d",
hcd->driver->description,hcd->self.busnum);
request_irq(irqnum,&usb_hcd_irq, irqflags,hcd->irq_descr, hcd);--申请中断线
}
hcd->irq= irqnum;
} else {
hcd->irq= -1;
}
hcd->driver->start(hcd); --调用start为 ohci_s3c2410_start
rhdev->bus_mA= min(500u, hcd->power_budget);
register_root_hub(hcd)); --注册root hub
retval =sysfs_create_group(&rhdev->dev.kobj, &usb_bus_attr_group);
if (retval< 0) {
gotoerror_create_attr_group;
}
if(hcd->uses_new_polling && hcd->poll_rh)
usb_hcd_poll_rh_status(hcd);
returnretval;
}
那一一来看上面的函数,学习内核就要有打破砂锅问到底的精神,唯有知道那背后的种种风光,才能领略那种种风采。闲话不说,继续!
记住下面结构体中flag的值。那就看这几个宏定义是什么意思。
#defineHCD_MEMORY 0x0001 --hc的寄存器使用memory映射
#defineHCD_LOCAL_MEM 0x0002 --hc使用local memory
#defineHCD_USB11 0x0010 --usb1.1
#defineHCD_USB2 0x0020 --usb2.0
static const struct hc_driver ohci_s3c2410_hc_driver=
{
.flags = HCD_USB11 | HCD_MEMORY,
};
为hcd分配缓冲池,当hc需要使用DMA内存分配器。
int hcd_buffer_create(struct usb_hcd *hcd)
{
char name[16];
int i, size;
if(!hcd->self.controller->dma_mask &&
!(hcd->driver->flags &HCD_LOCAL_MEM))
return 0;
--#define HCD_BUFFER_POOLS 4
我们查看pool_max其实是一个全局数组。如果需要开辟的缓冲区更大的话,直接采用分配page的函数。
static const size_tpool_max[HCD_BUFFER_POOLS] = {
32,128,512,PAGE_SIZE/ 2
};
for (i = 0; i< HCD_BUFFER_POOLS; i++) {
size = pool_max[i];
if(!size)
continue;
snprintf(name,sizeof name, "buffer-%d", size);
hcd->pool[i] = dma_pool_create(name,hcd->self.controller,size, size, 0);
if(!hcd->pool [i]) {
hcd_buffer_destroy(hcd);
return-ENOMEM;
}
}
return 0;
}
dma_pool_create创建一个DMA池(生成一个dma_pool,并没有分配相应空间,真正分配物理内存将在dma_pool_alloc()总实现)。
下面的函数是usb_bus注册,对于该函数也许很难理解。不过参照网上http://www.su.cn/info/html/e/20080425/301909.html的说明,估计会好理解很多。
每个主机控制器拥有一个USB系统,称为一个USB总线。USBD支持多个主机控制器,即多个USB总线。当每增加一个主机控制器时,会给他分配一个usb_bus结构。USBD动态安装和卸载主机驱动。主机驱动安装时,他的初始化函数一方面完成主机控制器硬件的设置和初始化工作,另一方面调用usb_alloc_bus和usb_register_bus来将自己注册到USBD中去,供USB子系统访问。
static int usb_register_bus(struct usb_bus *bus)
{
int result =-E2BIG;
int busnum;
mutex_lock(&usb_bus_list_lock);
busnum =find_next_zero_bit (busmap.busmap, USB_MAXBUS, 1);
--用busmap来存储主机驱动,一个bit位代表一个主机驱动
if (busnum >=USB_MAXBUS) {
return result;
}
set_bit (busnum,busmap.busmap);
bus->busnum = busnum;
bus->dev =device_create(usb_host_class, bus->controller, MKDEV(0, 0),bus,"usb_host%d", busnum);
--在usb_host类下创建一个usb_host设备。
list_add(&bus->bus_list, &usb_bus_list);
mutex_unlock(&usb_bus_list_lock);
usb_notify_add_bus(bus);
return 0;
}
㈡ linux 下如何实现USB设备重新枚举
umount,mount,umount,mount....巴拉巴拉
㈢ USB在什么情况下会reset呢有哪些情况呢
从电脑向手机的外置SD卡拷贝的文件,请使用USB“读卡器”!!!
㈣ 怎样写linux下的USB设备驱动程序
写一个USB的驱动程序最 基本的要做四件事:驱动程序要支持的设备、注册USB驱动程序、探测和断开、提交和控制urb(USB请求块)
驱动程序支持的设备:有一个结构体struct usb_device_id,这个结构体提供了一列不同类型的该驱动程序支持的USB设备,对于一个只控制一个特定的USB设备的驱动程序来说,struct usb_device_id表被定义为:
/* 驱动程序支持的设备列表 */
static struct usb_device_id skel_table [] = {
{ USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },
{ } /* 终止入口 */
};
MODULE_DEVICE_TABLE (usb, skel_table);
对 于PC驱动程序,MODULE_DEVICE_TABLE是必需的,而且usb必需为该宏的第一个值,而USB_SKEL_VENDOR_ID和 USB_SKEL_PRODUCT_ID就是这个特殊设备的制造商和产品的ID了,我们在程序中把定义的值改为我们这款USB的,如:
/* 定义制造商和产品的ID号 */
#define USB_SKEL_VENDOR_ID 0x1234
#define USB_SKEL_PRODUCT_ID 0x2345
这两个值可以通过命令lsusb,当然你得先把USB设备先插到主机上了。或者查看厂商的USB设备的手册也能得到,在我机器上运行lsusb是这样的结果:
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 002: ID 1234:2345 Abc Corp.
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000
得到这两个值后把它定义到程序里就可以了。
注册USB驱动程序:所 有的USB驱动程序都必须创建的结构体是struct usb_driver。这个结构体必须由USB驱动程序来填写,包括许多回调函数和变量,它们向USB核心代码描述USB驱动程序。创建一个有效的 struct usb_driver结构体,只须要初始化五个字段就可以了,在框架程序中是这样的:
static struct usb_driver skel_driver = {
.owner = THIS_MODULE,
.name = "skeleton",
.probe = skel_probe,
.disconnect = skel_disconnect,
.id_table = skel_table,
};
探测和断开:当 一个设备被安装而USB核心认为该驱动程序应该处理时,探测函数被调用,探测函数检查传递给它的设备信息,确定驱动程序是否真的适合该设备。当驱动程序因 为某种原因不应该控制设备时,断开函数被调用,它可以做一些清理工作。探测回调函数中,USB驱动程序初始化任何可能用于控制USB设备的局部结构体,它 还把所需的任何设备相关信息保存到一个局部结构体中,
提交和控制urb:当驱动程序有数据要发送到USB设备时(大多数情况是在驱动程序的写函数中),要分配一个urb来把数据传输给设备:
/* 创建一个urb,并且给它分配一个缓存*/
urb = usb_alloc_urb(0, GFP_KERNEL);
if (!urb) {
retval = -ENOMEM;
goto error;
}
当urb被成功分配后,还要创建一个DMA缓冲区来以高效的方式发送数据到设备,传递给驱动程序的数据要复制到这块缓冲中去:
buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma);
if (!buf) {
retval = -ENOMEM;
goto error;
}
if (_from_user(buf, user_buffer, count)) {
retval = -EFAULT;
goto error;
}
当数据从用户空间正确复制到局部缓冲区后,urb必须在可以被提交给USB核心之前被正确初始化:
/* 初始化urb */
usb_fill_bulk_urb(urb, dev->udev,
usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr),
buf, count, skel_write_bulk_callback, dev);
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
然后urb就可以被提交给USB核心以传输到设备了:
/* 把数据从批量OUT端口发出 */
retval = usb_submit_urb(urb, GFP_KERNEL);
if (retval) {
err("%s - failed submitting write urb, error %d", __FUNCTION__, retval);
goto error;
}
当urb被成功传输到USB设备之后,urb回调函数将被USB核心调用,在我们的例子中,我们初始化urb,使它指向skel_write_bulk_callback函数,以下就是该函数:
static void skel_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
{
struct usb_skel *dev;
dev = (struct usb_skel *)urb->context;
if (urb->status &&
!(urb->status == -ENOENT ||
urb->status == -ECONNRESET ||
urb->status == -ESHUTDOWN)) {
dbg("%s - nonzero write bulk status received: %d",
__FUNCTION__, urb->status);
}
/* 释放已分配的缓冲区 */
usb_buffer_free(urb->dev, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_dma);
}
有时候USB驱动程序只是要发送或者接收一些简单的数据,驱动程序也可以不用urb来进行数据的传输,这是里涉及到两个简单的接口函数:usb_bulk_msg和usb_control_msg ,在这个USB框架程序里读操作就是这样的一个应用:
/* 进行阻塞的批量读以从设备获取数据 */
retval = usb_bulk_msg(dev->udev,
usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr),
dev->bulk_in_buffer,
min(dev->bulk_in_size, count),
&count, HZ*10);
/*如果读成功,复制到用户空间 */
if (!retval) {
if (_to_user(buffer, dev->bulk_in_buffer, count))
retval = -EFAULT;
else
retval = count;
}
usb_bulk_msg接口函数的定义如下:
int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe,
void *data,int len,int *actual_length,int timeout);
其参数为:
struct usb_device *usb_dev:指向批量消息所发送的目标USB设备指针。
unsigned int pipe:批量消息所发送目标USB设备的特定端点,此值是调用usb_sndbulkpipe或者usb_rcvbulkpipe来创建的。
void *data:如果是一个OUT端点,它是指向即将发送到设备的数据的指针。如果是IN端点,它是指向从设备读取的数据应该存放的位置的指针。
int len:data参数所指缓冲区的大小。
int *actual_length:指向保存实际传输字节数的位置的指针,至于是传输到设备还是从设备接收取决于端点的方向。
int timeout:以Jiffies为单位的等待的超时时间,如果该值为0,该函数一直等待消息的结束。
如果该接口函数调用成功,返回值为0,否则返回一个负的错误值。
usb_control_msg接口函数定义如下:
int usb_control_msg(struct usb_device *dev,unsigned int pipe,__u8 request,__u8requesttype,__u16 value,__u16 index,void *data,__u16 size,int timeout)
除了允许驱动程序发送和接收USB控制消息之外,usb_control_msg函数的运作和usb_bulk_msg函数类似,其参数和usb_bulk_msg的参数有几个重要区别:
struct usb_device *dev:指向控制消息所发送的目标USB设备的指针。
unsigned int pipe:控制消息所发送的目标USB设备的特定端点,该值是调用usb_sndctrlpipe或usb_rcvctrlpipe来创建的。
__u8 request:控制消息的USB请求值。
__u8 requesttype:控制消息的USB请求类型值。
__u16 value:控制消息的USB消息值。
__u16 index:控制消息的USB消息索引值。
void *data:如果是一个OUT端点,它是指身即将发送到设备的数据的指针。如果是一个IN端点,它是指向从设备读取的数据应该存放的位置的指针。
__u16 size:data参数所指缓冲区的大小。
int timeout:以Jiffies为单位的应该等待的超时时间,如果为0,该函数将一直等待消息结束。
如果该接口函数调用成功,返回传输到设备或者从设备读取的字节数;如果不成功它返回一个负的错误值。
这两个接口函数都不能在一个中断上下文中或者持有自旋锁的情况下调用,同样,该函数也不能被任何其它函数取消,使用时要谨慎。
我们要给未知的USB设备写驱动程序,只需要把这个框架程序稍做修改就可以用了,前面我们已经说过要修改制造商和产品的ID号,把0xfff0这两个值改为未知USB的ID号。
#define USB_SKEL_VENDOR_ID 0xfff0
#define USB_SKEL_PRODUCT_ID 0xfff0
还 有就是在探测函数中把需要探测的接口端点类型写好,在这个框架程序中只探测了批量(USB_ENDPOINT_XFER_BULK)IN和OUT端点,可 以在此处使用掩码(USB_ENDPOINT_XFERTYPE_MASK)让其探测其它的端点类型,驱动程序会对USB设备的每一个接口进行一次探测, 当探测成功后,驱动程序就被绑定到这个接口上。再有就是urb的初始化问题,如果你只写简单的USB驱动,这块不用多加考虑,框架程序里的东西已经够用 了,这里我们简单介绍三个初始化urb的辅助函数:
usb_fill_int_urb :它的函数原型是这样的:
void usb_fill_int_urb(struct urb *urb,struct usb_device *dev,
unsigned int pipe,void *transfer_buff,
int buffer_length,usb_complete_t complete,
void *context,int interval);
这个函数用来正确的初始化即将被发送到USB设备的中断端点的urb。
usb_fill_bulk_urb :它的函数原型是这样的:
void usb_fill_bulk_urb(struct urb *urb,struct usb_device *dev,
unsigned int pipe,void *transfer_buffer,
int buffer_length,usb_complete_t complete)
这个函数是用来正确的初始化批量urb端点的。
usb_fill_control_urb :它的函数原型是这样的:
void usb_fill_control_urb(struct urb *urb,struct usb_device *dev,unsigned int pipe,unsigned char *setup_packet,void *transfer_buffer,int buffer_length,usb_complete_t complete,void *context);
这个函数是用来正确初始化控制urb端点的。
还有一个初始化等时urb的,它现在还没有初始化函数,所以它们在被提交到USB核心前,必须在驱动程序中手工地进行初始化,可以参考内核源代码树下的/usr/src/~/drivers/usb/media下的konicawc.c文件。
㈤ 嵌入式Linux,加载USB驱动报错,何解
上位机USB EHCI总线复位失败,无法枚举到USB从设备,有可能是由于上位机内部的USB EHCI控制器损版坏或者USB线缆权短路了,建议用示波器量一下差分信号电压看是不是超出阈值,或者换一个从设备测试一下,都正常的话就可能是上位机的问题了
㈥ 怎么查看linux usb设备驱动
下面的信息都是在VMware中运行Ubuntu12-04系统上执行的。同样该命令也支持在嵌入式系统中进行USB调试。
一、cat设备节点获取信息
在一些嵌入式开发中需要调试USB功能,经常会cat /sys 下的相关设备节点来查看某些信息,比如说我们可以看到 /sys/bus/usb/devices 目录有多个子目录。进入到某个子目录可以看到usb设备更加详细的信息(可以理解为设备描述符)。
1、usb设备在总线上的信息
// usb设备在总线上的信息
root@ubuntu:/sys/kernel/debug# cd /sys/bus/usb/devices
root@ubuntu:/sys/bus/usb/devices# ll
total 0
drwxr-xr-x 2 root root 0 Nov 26 21:21 ./
drwxr-xr-x 4 root root 0 Nov 26 21:21 ../
lrwxrwxrwx 1 root root 0 Nov 26 21:21 1-0:1.0 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-0:1.0/
lrwxrwxrwx 1 root root 0 Dec 15 23:10 1-1 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/
lrwxrwxrwx 1 root root 0 Dec 15 23:18 1-1:1.0 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/
lrwxrwxrwx 1 root root 0 Nov 26 21:21 2-0:1.0 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-0:1.0/
lrwxrwxrwx 1 root root 0 Nov 26 21:21 2-1 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-1/
lrwxrwxrwx 1 root root 0 Nov 26 21:21 2-1:1.0 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-1/2-1:1.0/
lrwxrwxrwx 1 root root 0 Nov 26 21:21 2-2 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/
lrwxrwxrwx 1 root root 0 Nov 26 21:21 2-2:1.0 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/2-2:1.0/
lrwxrwxrwx 1 root root 0 Nov 26 21:21 usb1 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/
lrwxrwxrwx 1 root root 0 Nov 26 21:21 usb2 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/
其中 usbx/第x个总线,x-y:a.b/的目录格式,x表示总线号,y表示端口,a表示配置,b表示接口。
具体解释可以参照如下:
The names that begin with "usb" refer to USB controllers. More accurately, they refer to the "root hub" associated with each controller. The number is the USB bus number. In the example there is only one controller, so its bus is number 1. Hence the name "usb1".
"1-0:1.0" is a special case. It refers to the root hub's interface. This acts just like the interface in an actual hub an almost every respect; see below.
All the other entries refer to genuine USB devices and their interfaces. The devices are named by a scheme like this:
bus-port.port.port ...
In other words, the name starts with the bus number followed by a '-'. Then comes the sequence of port numbers for each of the intermediate hubs along the path to the device.
For example, "1-1" is a device plugged into bus 1, port 1. It happens to be a hub, and "1-1.3" is the device plugged into port 3 of that hub. That device is another hub, and "1-1.3.1" is the device plugged into its port 1.
The interfaces are indicated by suffixes having this form:
:config.interface
That is, a ':' followed by the configuration number followed by '.' followed by the interface number. In the above example, each of the devices is using configuration 1 and this configuration has only a single interface, number 0. So the interfaces show up as;
1-1:1.0 1-1.3:1.0 1-1.3.1:1.0
A hub will never have more than a single interface; that's part of the USB spec. But other devices can and do have multiple interfaces (and sometimes multiple configurations). Each interface gets its own entry in sysfs and can have its own driver.
2、特定设备的详细信息
进入到某个目录中去,可以看到该设备的详细信息,可用cat命令获取信息。
// usb设备的详细信息
root@ubuntu:/sys/bus/usb/devices/usb1# ll
total 0
drwxr-xr-x 6 root root 0 Nov 26 21:21 ./
drwxr-xr-x 4 root root 0 Nov 26 21:21 ../
drwxr-xr-x 10 root root 0 Nov 26 21:21 1-0:1.0/
drwxr-xr-x 5 root root 0 Dec 15 23:10 1-1/
-rw-r--r-- 1 root root 4096 Dec 15 23:40 authorized
-rw-r--r-- 1 root root 4096 Dec 15 23:40 authorized_default
-rw-r--r-- 1 root root 4096 Dec 15 23:40 avoid_reset_quirk
-r--r--r-- 1 root root 4096 Nov 26 21:21 bcdDevice
-rw-r--r-- 1 root root 4096 Nov 26 21:21 bConfigurationValue
-r--r--r-- 1 root root 4096 Nov 26 21:21 bDeviceClass
-r--r--r-- 1 root root 4096 Nov 26 21:21 bDeviceProtocol
-r--r--r-- 1 root root 4096 Nov 26 21:21 bDeviceSubClass
-r--r--r-- 1 root root 4096 Dec 15 23:40 bmAttributes
-r--r--r-- 1 root root 4096 Dec 15 23:40 bMaxPacketSize0
-r--r--r-- 1 root root 4096 Dec 15 23:40 bMaxPower
-r--r--r-- 1 root root 4096 Dec 15 23:40 bNumConfigurations
-r--r--r-- 1 root root 4096 Dec 15 23:40 bNumInterfaces
-r--r--r-- 1 root root 4096 Nov 26 21:21 busnum
-r--r--r-- 1 root root 4096 Dec 15 23:40 configuration
-r--r--r-- 1 root root 65553 Nov 26 21:21 descriptors
-r--r--r-- 1 root root 4096 Dec 15 23:40 dev
-r--r--r-- 1 root root 4096 Nov 26 21:21 devnum
-r--r--r-- 1 root root 4096 Dec 15 23:40 devpath
lrwxrwxrwx 1 root root 0 Nov 27 20:06 driver -> ../../../../../bus/usb/drivers/usb/
drwxr-xr-x 3 root root 0 Dec 15 23:40 ep_00/
-r--r--r-- 1 root root 4096 Nov 26 21:21 idProct
-r--r--r-- 1 root root 4096 Nov 26 21:21 idVendor
-r--r--r-- 1 root root 4096 Dec 15 23:40 ltm_capable
-r--r--r-- 1 root root 4096 Nov 26 21:21 manufacturer
-r--r--r-- 1 root root 4096 Dec 15 23:40 maxchild
drwxr-xr-x 2 root root 0 Nov 26 21:21 power/
-r--r--r-- 1 root root 4096 Nov 26 21:21 proct
-r--r--r-- 1 root root 4096 Dec 15 23:40 quirks
-r--r--r-- 1 root root 4096 Nov 26 21:21 removable
--w------- 1 root root 4096 Dec 15 23:40 remove
-r--r--r-- 1 root root 4096 Nov 26 21:21 serial
-r--r--r-- 1 root root 4096 Nov 26 21:21 speed
lrwxrwxrwx 1 root root 0 Nov 26 21:21 subsystem -> ../../../../../bus/usb/
-rw-r--r-- 1 root root 4096 Nov 26 21:21 uevent
-r--r--r-- 1 root root 4096 Dec 15 23:40 urbnum
-r--r--r-- 1 root root 4096 Dec 15 23:40 version
二、使用debugfs
1、挂载 debugfs 到 /sys/kernel/debug 路径下
root@ubuntu:mount -t debugfs none /sys/kernel/debug
2、执行上述步骤之后,在 /sys/kernel/debug 就会生成如下的文件
root@ubuntu:/sys/bus/usb/devices# cd /sys/kernel/debug/
root@ubuntu:/sys/kernel/debug# ll
total 0
drwx------ 22 root root 0 Nov 26 21:21 ./
drwxr-xr-x 7 root root 0 Nov 26 21:21 ../
drwxr-xr-x 2 root root 0 Nov 26 21:21 acpi/
drwxr-xr-x 32 root root 0 Dec 4 16:30 bdi/
drwxr-xr-x 2 root root 0 Nov 26 21:21 bluetooth/
drwxr-xr-x 2 root root 0 Nov 26 21:21 cleancache/
drwxr-xr-x 2 root root 0 Nov 26 21:21 dma_buf/
drwxr-xr-x 4 root root 0 Nov 26 21:21 dri/
drwxr-xr-x 2 root root 0 Nov 26 21:21 dynamic_debug/
drwxr-xr-x 2 root root 0 Nov 26 21:21 extfrag/
drwxr-xr-x 2 root root 0 Nov 26 21:21 frontswap/
-r--r--r-- 1 root root 0 Nov 26 21:21 gpio
drwxr-xr-x 3 root root 0 Nov 26 21:21 hid/
drwxr-xr-x 2 root root 0 Nov 26 21:21 kprobes/
drwxr-xr-x 3 root root 0 Nov 26 21:21 kvm-guest/
drwxr-xr-x 2 root root 0 Nov 26 21:21 mce/
drwxr-xr-x 2 root root 0 Nov 26 21:21 pinctrl/
-r--r--r-- 1 root root 0 Nov 26 21:21 pwm
drwxr-xr-x 2 root root 0 Nov 26 21:21 regmap/
drwxr-xr-x 3 root root 0 Nov 26 21:21 regulator/
-rw-r--r-- 1 root root 0 Nov 26 21:21 sched_features
-r--r--r-- 1 root root 0 Nov 26 21:21 sleep_time
-r--r--r-- 1 root root 0 Nov 26 21:21 suspend_stats
drwxr-xr-x 7 root root 0 Nov 26 21:21 tracing/
drwxr-xr-x 3 root root 0 Nov 26 21:21 usb/
drwxr-xr-x 2 root root 0 Nov 26 21:21 virtio-ports/
-r--r--r-- 1 root root 0 Nov 26 21:21 vmmemctl
-r--r--r-- 1 root root 0 Nov 26 21:21 wakeup_sources
drwxr-xr-x 2 root root 0 Nov 26 21:21 x86/
3、cat 设备节点
执行下述命令之后会以特定格式打印目前USB总线上所有USB设备的信息如下:
root@ubuntu:/sys/kernel/debug# cat usb/devices
T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 17/900 us ( 2%), #Int= 1, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 3.13
S: Manufacturer=Linux 3.13.0-32-generic uhci_hcd
S: Proct=UHCI Host Controller
S: SerialNumber=0000:02:00.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0e0f ProdID=0003 Rev= 1.03
S: Manufacturer=VMware
S: Proct=VMware Virtual USB Mouse
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=usbhid
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=1ms
T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 3 Spd=12 MxCh= 7
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0e0f ProdID=0002 Rev= 1.00
S: Proct=VMware Virtual USB Hub
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 6
B: Alloc= 0/800 us ( 0%), #Int= 1, #Iso= 0
D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0002 Rev= 3.13
S: Manufacturer=Linux 3.13.0-32-generic ehci_hcd
S: Proct=EHCI Host Controller
S: SerialNumber=0000:02:03.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256ms
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 7 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=ff(vend.) Sub=ff Prot=ff MxPS=64 #Cfgs= 1
P: Vendor=0bda ProdID=0129 Rev=39.60
S: Manufacturer=Generic
S: Proct=USB2.0-CRW
S: SerialNumber=20100201396000000
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=06 Prot=50 Driver=rts5139
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=83(I) Atr=03(Int.) MxPS= 3 Ivl=64ms
至于信息的详细解析可以参照 Linux源代码中 Documentation/usb/proc_usb_info.txt 文件。现摘录其中对该格式的详细解释:
| | |__Proct ID code
| |__Vendor ID code
|__Device info tag #2
String descriptor info:
S: Manufacturer=ssss
| |__Manufacturer of this device as read from the device.
| For USB host controller drivers (virtual root hubs) this may
| be omitted, or (for newer drivers) will identify the kernel
| version and the driver which provi
㈦ usb3.0 设备reset事件需要怎么处理
usb3.0有兼容性问题枣行岩凳御,先试试插上设备后,带嫌在设备管理器里禁用usb3.0控制器,再启用,就好使啦。
㈧ linux usb 设备重新挂载
用crontab
* */1 * * * /etc/init.d/network restart;
每隔一小时重启一下网络服务。
或插拔USB.
* */1 * * * "umount /dev/hdd1;mount /dev/hdd1 /mnt/usb"
通常,在Linux系统中,如果要使用硬盘、光盘、软盘或U盘等存储设备, 一般先要挂载(但有些高版本的Linux可以做到自动识别和加载设备). 当存储设备挂载完成后就可以像目录一样进行访问了.
在挂载之前需要确定下列三种信息:
*) 要挂载对象的文件系统类型;
*) 要挂载对象的设备名称;
*) 确定挂载点.
1) 获得挂载对象的文件系统类型:
cat /proc/filesystems 可以查看当前Linux系统支持的文件类型:
vfat : Windows常用的FAT32文件系统,兼容FAT16系统.
hpfs : OS2文件系统.
ext3 : Linux文件系统
iso9660 : 光盘文件系统
2) 确定设备名称:
在Linux下设备名称通常都在/dev目录下,这些设备的命名都是有规则的,比如: /dev/hda1
"hd"即: hard disk,代表IDE硬盘; 'hd'同样也可以用'sd'代替,即SCSI,代表SCSI硬盘; a代表第一个设备,如果pc机上可以连接4块IDE硬盘, 则设备名称依次为hda,hdb,hdc,hdd. 如果是SCSI硬盘, 则设备名称为sda.sdb,sdc,sdd.
数字1表示a硬盘的第一个分区,hda2,代表硬盘的第二个分区.
查看/var/log/messages文件,可找出Linux辨认出来的设备代号.
3) 确定挂载点:
Linux系统中有一个/mnt目录,专门用作挂载点目录:
挂载光盘的例子:
$mount -t iso9660 /dev/cdrom /mnt/cdrom
$umount /mnt/cdrom
挂载软盘的例子:
$mount /dev/fd0 /mnt/floppy
$umount /mnt/floppy
挂载u盘的例子:
$fdisk -l查看外挂闪存的设备号,一般为/dev/sda1
$mount /dev/sda1 /mnt/usb
$umount /mnt/usb
挂载外挂硬盘分区:
$fdisk -l 查看外挂的硬盘分区设备号,假设为: /dev/hda1
$mount -t vfat /dev/hda1 /mnt/vfat
$umount /mnt/vfat
所以,根据上面流程思想,我们现在来看看如何把自己的USB(U盘设备挂载到系统中来),从而可以自由访问U盘里边的文件。看了以下的操作,你会发现操作命令并不是那么的复杂的。此次测试是在VMWARE+RedHat9.0 上测试的。
首先要查看USB设备的名称。 我们在Terminal终端用这个命令: dmesg|more 查看系统相关信息。dmesg用来显示开机信息,kernel会将开机信息存储在ring buffer中。若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里边。
得到USB设备的设备名称为 sdb
然后在/mnt/下建立一个usb的文件夹:
Mkdir /mnt/usb
最后要用mount命令来挂载sdb(也就是U盘)里边的东西了。
mount /dev/sdb /mnt/usb
其实mount 中并不无其他参数。 因为mount里可以自动识别其中的文件系统。
这样在/mnt/usb下即可以看到里边的文件了。
当卸载USB时,需用umount命令来卸载
㈨ LINUX里reset命令是什么意思
用来对Linux的终端进行初始化