2019-04-16
关键字: RK 、 挂载、U盘
笔者手里有一块非常原生的运行 Android 4.4 操作系统的 RK3128 开发板。原生到各种功能模块都不能用的地步。今天就遇到一个不按常理出牌的 U 盘挂载问题,特此记录一下。
问题现象
在确保了硬件电路、dts 配置、驱动加载以及 USB 模式都没有问题的情况下,给开发板插入 U 盘,串口上也能识别到发现 U 盘设备的内核打印。但是不能自动挂载,且在常规的 dev 目录下也没有发现有 sd* 的设备文件节点出现。
解决过程
在插入 U 盘设备后,可以发现有如下打印信息
shell@rk312x:/dev/block # shell@rk312x:/dev/block # [ 1127.769007] dwc_otg_hcd_handle_port_intr: hcd->state = 4, hcd->flags = 1 [ 1127.775872] 10180000.usb resume, HPRT0:0x21401 [ 1127.905831] Indeed it is in host mode hprt0 = 00021501 [ 1128.082717] usb 3-1: new high-speed USB device number 4 using usb20_otg [ 1128.083395] Indeed it is in host mode hprt0 = 00001101 [ 1128.282860] usb 3-1: New USB device found, idVendor=0bda, idProduct=0109 [ 1128.283004] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 1128.283088] usb 3-1: Product: USB2.0-CRW [ 1128.283152] usb 3-1: Manufacturer: Generic [ 1128.283216] usb 3-1: SerialNumber: 20090815198100000 [ 1128.297475] usb-storage 3-1:1.0: USB Mass Storage device detected [ 1128.298382] scsi2 : usb-storage 3-1:1.0 [ 1129.284565] scsi 2:0:0:0: Direct-Access Generic- SD/MMC 1.00 PQ: 0 ANSI: 0 CCS [ 1129.288155] sd 2:0:0:0: Attached scsi generic sg0 type 0 [ 1129.989467] sd 2:0:0:0: [sda] 1990656 512-byte logical blocks: (1.01 GB/972 MiB) [ 1129.990407] sd 2:0:0:0: [sda] Write Protect is off [ 1129.991351] sd 2:0:0:0: [sda] No Caching mode page found [ 1129.991430] sd 2:0:0:0: [sda] Assuming drive cache: write through [ 1129.997344] sd 2:0:0:0: [sda] No Caching mode page found [ 1129.997433] sd 2:0:0:0: [sda] Assuming drive cache: write through [ 1129.999700] sda: sda1 [ 1130.007541] sd 2:0:0:0: [sda] No Caching mode page found [ 1130.007584] sd 2:0:0:0: [sda] Assuming drive cache: write through [ 1130.007619] sd 2:0:0:0: [sda] Attached SCSI removable disk [ 1130.130219] FAT-fs (sda1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck. [ 1130.167493] init: no such service 'fuse_usb_storage' shell@rk312x:/dev/block #
看到了这个信息,就说明至少板子是正确识别到了我们的 U 盘设备,甚至连我的 U 盘的容量都正确读取出来了。
对于成熟一点的 rk3128 开发板来说,外部存储设备都会被自动挂载到 /mnt 目录下面。如果在这个目录下面看不到我们 U 盘里面的文件,那可以全局搜索一下。搜索也无果的话,就只能手动去挂载了。
一般来说,外部存储设备都会被挂载到 /dev 目录下的 sd* 文件上。如果在这个目录下面发现了有,则可以手动挂载
mount /dev/sda1 /mnt/usb_storage
但是很遗憾,笔者手里这块 rk3128 就是没在 dev 目录下发现这些设备节点。
我们知道至少系统是成功识别到 U 盘设备的,可能只是我们不知道它被映射在了哪个目录下而已。这个时候,就只能靠 find 命令了。
我们注意到在刚插入 U 盘时,内核打印有一句
[ 1127.775872] 10180000.usb resume, HPRT0:0x21401
这个 10180000.usb 即是我们的 U 盘设备标识符。我们 find 一下它。
shell@rk312x: # busybox find / -name "10180000*" find: /mnt/shell/emulated: Transport endpoint is not connected /sys/bus/platform/devices/10180000.usb /sys/bus/platform/drivers/usb20_otg/10180000.usb /sys/devices/10180000.usb /sys/devices/10180000.usb/udc/10180000.usb /sys/class/udc/10180000.usb /dev/block/platform/10180000.usb
注意到结果最后一行有个 /dev/block/platform/10180000.usb 。我们进去看看。
1|shell@rk312x: # ll /dev/block/platform/10180000.usb drwxr-xr-x root root 2016-01-21 09:27 by-num lrwxrwxrwx root root 2016-01-21 09:27 sda -> /dev/block/sda lrwxrwxrwx root root 2016-01-21 09:27 sda1 -> /dev/block/sda1 shell@rk312x: #
原来 sda 设备节点被映射到了 /dev/block/ 目录下面!下面的结果为了减少篇幅,省略了一些无关紧要的记录。
shell@rk312x: # ll /dev/block/ brw------- root root 8, 0 2016-01-21 09:27 sda brw------- root root 8, 1 2016-01-21 09:27 sda1 shell@rk312x: #
这下可终于让我们给找到 sda 节点的真实映射目录了。可以手动来挂载我们的 U 盘了。
mount -t vfat /dev/block/sda1 /mnt/usb_storage
命令执行以后就可以在 /mnt/usb_storage 目录下面看到我们 U 盘中的内容了。
rk3128 的板子比较奇怪,不加 -t 参数就不能成功挂载!而且笔者试了几个 U 盘,发现只能挂上 FAT 格式的 U 盘,至于原因尚未可知。
如果想要让系统实现自动挂载的功能,则可以修改
./device/rockchip/rk312x/fstab.rk30board.bootmode.emmc
或
./device/rockchip/rk312x/fstab.rk30board.bootmode.unknow
在这个文件中添加这个 U 盘的识别码记录即可
...
/devices/101c0000.usb /mnt/usb_storage vfat defaults voldmanaged=usb_storage:auto
...