1

我对 Linux 内核编程非常陌生。我通过阅读Greg 的代码创建了一个简单的 USB 驱动程序;如果需要,可以查看我的完整代码

据我所知,这段代码可以从 USB 设备读取数据和写入数据。但是当我连接我的 pendrive 时,我看到了dmesg踪迹,我发现一切正常,但无法在lsblk.

由于它不在那里,我无法安装它,因此无法测试我的驱动程序。这是dmesg痕迹

[20073.437683] [SIMUSB]:Module Loaded
[20073.437730] [SIMUSB] USB Detected
[20073.437734] [SIMUSB] USB Vendor ID=1008 and Product ID=22023
[20073.437737] [SIMUSB] endpoint->bEndpointAddress=1
[20073.437740] [SIMUSB] Result of endpoint->bEndpointAddress & USB_DIR_OUT is 0
[20073.437743] [SIMUSB] ENDPOINT WITH OUT DIRECTION FOUND
[20073.437746] [SIMUSB] Result of endpoint->bmAddress & USB_ENDPOINT_XFERTYPE_MASK is 2
[20073.437749] [SIMUSB] OUT ENDPOINT adress set
[20073.437752] [SIMUSB] endpoint->bEndpointAddress=130
[20073.437755] [SIMUSB] Result of endpoint->bEndpointAddress & USB_DIR_IN is 128
[20073.437757] [SIMUSB] ENDPOINT WITH IN DIRECTION FOUND
[20073.437760] [SIMUSB] Result of endpoint->bmAddress & USB_ENDPOINT_XFERTYPE_MASK is 2
[20073.437763] [SIMUSB] IN ENDPOINT adress set
[20073.437910] [SIMUSB] status=0
[20073.437914] [SIMUSB] USB Registered Successfully

usb_register_dev()只是在in之后添加了一行sim_prob

printk(KERN_INFO "[SIMUSB] retval=%d",retval);

我得到以下命令输出demsg|grep SIMUSB

root@anandlinux:/lin_dev/kprogs/usb_rough# dmesg|grep SIMUSB
[7803.843992] [SIMUSB]:Module Loaded
[7803.844055] [SIMUSB] USB Detected
[7803.844060] [SIMUSB] USB Vendor ID=2385 and Product ID=5699
[7803.844064] [SIMUSB] endpoint->bEndpointAddress=129
[7803.844069] [SIMUSB] Result of endpoint->bEndpointAddress & USB_DIR_IN is 128
[7803.844073] [SIMUSB] ENDPOINT WITH IN DIRECTION FOUND
[7803.844077] [SIMUSB] Result of endpoint->bmAddress & USB_ENDPOINT_XFERTYPE_MASK is 2
[7803.844080] [SIMUSB] IN ENDPOINT adress set
[7803.844085] [SIMUSB] endpoint->bEndpointAddress=2
[7803.844089] [SIMUSB] OUT ENDPOINT adress set
[7803.844156] [SIMUSB] retval=0
[7803.844186] [SIMUSB] status=0
[7803.844188] [SIMUSB] USB Registered Successfully
root@anandlinux:/lin_dev/kprogs/usb_rough# 
4

1 回答 1

0

您只是在 USB 层注册设备。这不允许您挂载文件系统或设备,除非您还向 SCSI 层注册了设备。运行lsusb以查看您的设备。lsblk不会显示它,因为它没有在块层注册。

阅读此文档https://www.kernel.org/doc/Documentation/scsi/scsi_mid_low_api.txt以了解 SCSI 层 API

另外,drivers/usb/storage/usb.c在内核源代码树中进行检查。这是适用于大多数 USB 驱动器的通用usb-storage驱动程序。通过 storage_probe 函数。你可以看到它调用了usb_stor_probe1usb_stor_prob2函数。这些函数被导出,因此您可以在您的探测函数中使用它们,前提是您在要链接的内核映像中内置了 usb-storage 模块,并且还具有声明它们的标头。

有关如何使用上述两个函数的示例,请参见drivers/usb/storage/alauda.c alauda_probe函数。你可以在类似的线路上做一些事情。该文件与 usb-storage 驱动程序位于内核源代码中的同一目录中。如果您想使用这些功能,您可能也必须这样做。

注意:如果您usb-storage加载了模块,那么它将声明您的设备并且不会调用您的驱动程序探测功能。您可能会模仿驱动程序中存在的功能,或者找到让驱动程序认领您的设备的方法。

于 2013-10-04T10:07:31.063 回答