Android查找USB设备的uEvent路径
时间: 2023-10-25 17:00:39 浏览: 222
Android中查找USB设备的uEvent路径可以通过以下步骤进行:
1. 进入Android系统终端
2. 执行以下命令查找USB设备的vendor id和product id:
lsusb
3. 根据上一步查找到的vendor id和product id,在/sys/bus/usb/devices/目录下查找对应的USB设备目录,例如:
cd /sys/bus/usb/devices/1-1.2/
(其中1-1.2是USB设备的地址)
4. 在USB设备目录下查找uEvent文件,例如:
cat ./uevent
uEvent文件中包含了USB设备的一些信息,可以根据需要进行解析。
相关问题
连接到 HUB 的 USB 设备的 KERNELS 路径
连接到HUB的USB设备的KERNELS路径通常可以通过以下步骤找到:
1. 运行`lsusb`命令,查看USB设备的Vendor ID和Product ID。例如,假设我们要查找连接到HUB上的USB鼠标设备,可以运行以下命令:
```
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 006: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 005: ID 05e3:0612 Genesys Logic, Inc. Hub
Bus 001 Device 004: ID 05e3:0745 Genesys Logic, Inc. Logilink CR0012
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
从输出中可以看到,该鼠标设备的Vendor ID为046d,Product ID为c077。
2. 进入/sys/bus/usb/devices目录,查找对应的USB设备节点。例如,在上面的输出中,该鼠标设备连接到了Bus 001的Device 006,因此我们可以进入/sys/bus/usb/devices/1-3目录,查看该设备的KERNELS路径:
```
$ cd /sys/bus/usb/devices/1-3
$ ls -l
total 0
drwxr-xr-x. 4 root root 0 Apr 20 17:20 1-3:1.0
lrwxrwxrwx. 1 root root 0 Apr 20 17:20 bDeviceClass -> ../../../../../../../class/input/
lrwxrwxrwx. 1 root root 0 Apr 20 17:20 bDeviceProtocol -> ../../../../../../../class/input/mouse0/protocol
lrwxrwxrwx. 1 root root 0 Apr 20 17:20 bDeviceSubClass -> ../../../../../../../class/input/
lrwxrwxrwx. 1 root root 0 Apr 20 17:20 bcdDevice -> ../../../../../../../class/input/mouse0/version
lrwxrwxrwx. 1 root root 0 Apr 20 17:20 bus -> ../../../../../../../bus/usb/
lrwxrwxrwx. 1 root root 0 Apr 20 17:20 configuration -> ../../../../../../../usb1/1-3/1-3:1.0/configuration
-rw-r--r--. 1 root root 4.0K Apr 20 17:20 descriptors
-rw-r--r--. 1 root root 4.0K Apr 20 17:20 devnum
lrwxrwxrwx. 1 root root 0 Apr 20 17:20 device -> ../../../../../../../usb1/1-3/
-rw-r--r--. 1 root root 4.0K Apr 20 17:20 idProduct
-rw-r--r--. 1 root root 4.0K Apr 20 17:20 idVendor
-rw-r--r--. 1 root root 4.0K Apr 20 17:20 maxchild
drwxr-xr-x. 2 root root 0 Apr 20 17:20 power
lrwxrwxrwx. 1 root root 0 Apr 20 17:20 product -> ../../../../../../../usb1/1-3/1-3:1.0/product
-r--r--r--. 1 root root 4.0K Apr 20 17:20 quirks
-rw-r--r--. 1 root root 4.0K Apr 20 17:20 speed
lrwxrwxrwx. 1 root root 0 Apr 20 17:20 subsystem -> ../../../../../../../bus/usb/
-rw-r--r--. 1 root root 4.0K Apr 20 17:20 uevent
lrwxrwxrwx. 1 root root 0 Apr 20 17:20 usb_device -> ../../../../../../../usb1/1-3/
```
从输出中可以看到,该鼠标设备的KERNELS路径为1-3:1.0。
因此,连接到HUB的USB设备的KERNELS路径通常是/sys/bus/usb/devices/<Bus>-<Device>:<Interface>,其中Bus和Device是通过`lsusb`命令获得的,Interface通常为0或1。
Android uevent检测u盘挂载地址
在Android系统中,可以使用uevent来检测U盘的挂载地址。具体步骤如下:
1. 在Android系统中,U盘的插入和拔出都会发送uevent消息,可以通过注册一个uevent监听器来接收这些消息。
2. 在uevent消息中,会包含有U盘的一些信息,比如设备名称、挂载路径等。
3. 在接收到U盘插入消息时,可以解析uevent消息中的挂载路径信息,即可获得U盘的挂载地址。
以下是一个使用uevent检测U盘挂载地址的示例代码:
```
import android.os.Handler;
import android.os.Looper;
import android.os.MessageQueue;
import android.util.Log;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class UdiskMonitor {
private static final String TAG = "UdiskMonitor";
private static final String UDISK_MOUNT_PATH = "/sys/class/android_usb/android0/f_mass_storage/lun/file";
private OnUdiskMountedListener mListener;
public void startMonitor(final OnUdiskMountedListener listener) {
mListener = listener;
// 在主线程中监听uevent消息
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
// 开始监听uevent消息
startUeventMonitor();
return false;
}
});
}
});
}
private void startUeventMonitor() {
BufferedReader reader = null;
try {
// 打开uevent监听文件
reader = new BufferedReader(new FileReader(new File("/proc/net/netlink")));
String line;
while ((line = reader.readLine()) != null) {
// 解析uevent消息
String[] parts = line.split(" ");
if (parts.length >= 6 && parts[0].equals("1")) {
String action = parts[1];
String devPath = parts[4];
if (action.equals("add") && devPath.equals(UDISK_MOUNT_PATH)) {
// U盘被插入,获取挂载路径并回调监听器
String mountPath = getUdiskMountPath();
if (mountPath != null) {
if (mListener != null) {
mListener.onUdiskMounted(mountPath);
}
}
}
}
}
} catch (IOException e) {
Log.e(TAG, "startUeventMonitor: " + e.getMessage());
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
Log.e(TAG, "startUeventMonitor: " + e.getMessage());
}
}
}
}
private String getUdiskMountPath() {
String mountPath = null;
try {
// 读取U盘挂载路径
BufferedReader reader = new BufferedReader(new FileReader(new File(UDISK_MOUNT_PATH)));
mountPath = reader.readLine().trim();
reader.close();
} catch (IOException e) {
Log.e(TAG, "getUdiskMountPath: " + e.getMessage());
}
return mountPath;
}
public interface OnUdiskMountedListener {
void onUdiskMounted(String mountPath);
}
}
```
在上述代码中,我们通过监听uevent消息来检测U盘的插入和拔出事件。当接收到U盘插入事件时,我们通过读取U盘的挂载路径来获取U盘的挂载地址,并通过回调监听器来通知外部应用程序。
阅读全文