zoukankan      html  css  js  c++  java
  • rk3128 手动挂载 U 盘

    2019-04-16

    关键字: RK 、 挂载、U盘、Hub挂载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
    ...

    番外:Hub芯片适配与USB设备挂载

    有些开发板会通过Hub芯片来扩展USB接口的数量。

    对于这种经过了 Hub 芯片的USB接口适配来说,首先要适配Hub芯片的驱动。关于硬件设备驱动程序的适配一般不复杂,本文就再赘述了。这里主要记录一下当硬件与Hub驱动都正常工作的情况下如何来适配USB接口。

    正常而言,一个U盘在插进USB接口以后,系统会自动将它“认上来”,我们可以直接在文件管理器中读取到这个U盘里面的文件内容。 这一功能包含了:

    1、U盘硬件识别;

    2、U盘设备映射成文件;

    3、将U盘设备文件挂载成存储盘。

    在用户眼里这一“自动”过程其实是由系统帮我们实现了这一系列的流程而已。

    如果我们的U盘在插入以后,不能被认上来,那么可以在以上几个步骤中找找原因。

    首先我们来看看前两步。

    当我们适配好Hub的驱动程序后,插入U盘,可以看到如下内核打印信息:

    [   10.339544] android_work: sent uevent USB_STATE=CONFIGURED
    [  490.101898] usb 1-1.1: new high-speed USB device number 3 using rockchip_ehci1_host
    [  490.212642] usb 1-1.1: New USB device found, idVendor=14cd, idProduct=1212
    [  490.212850] usb 1-1.1: New USB device strings: Mfr=1, Product=3, SerialNumber=2
    [  490.212973] usb 1-1.1: Product: Mass Storage Device
    [  490.213077] usb 1-1.1: Manufacturer: Generic
    [  490.213156] usb 1-1.1: SerialNumber: 121220160204
    [  490.220365] usb-storage 1-1.1:1.0: USB Mass Storage device detected
    [  490.223720] scsi0 : usb-storage 1-1.1:1.0
    [  490.230439] rockchip-rt5631 rockchip-rt5631.31: ASoC: CODEC (null) not registered
    [  490.230497] rockchip_rt5631_audio_probe() register card failed:-517
    [  490.230541] platform rockchip-rt5631.31: Driver rockchip-rt5631 requests probe deferral
    [  490.231179] rockchip-rt3261 rockchip-rt3224.32: ASoC: CODEC (null) not registered
    [  490.231223] rockchip_rt3261_audio_probe() register card failed:-517
    [  490.231262] platform rockchip-rt3224.32: Driver rockchip-rt3261 requests probe deferral
    [  490.231756] rockchip-es8388 rockchip-es8388.30: ASoC: CODEC (null) not registered
    [  490.231800] rockchip_es8388_audio_probe() register card failed:-517
    [  490.231830] platform rockchip-es8388.30: Driver rockchip-es8388 requests probe deferral
    [  491.205814] scsi 0:0:0:0: Direct-Access     Mass     Storage Device   1.00 PQ: 0 ANSI: 0 CCS
    [  491.215685] rockchip-rt5631 rockchip-rt5631.31: ASoC: CODEC (null) not registered
    [  491.215993] rockchip_rt5631_audio_probe() register card failed:-517
    [  491.216187] platform rockchip-rt5631.31: Driver rockchip-rt5631 requests probe deferral
    [  491.217087] sd 0:0:0:0: Attached scsi generic sg0 type 0
    [  491.218948] rockchip-rt3261 rockchip-rt3224.32: ASoC: CODEC (null) not registered
    [  491.219190] rockchip_rt3261_audio_probe() register card failed:-517
    [  491.219379] platform rockchip-rt3224.32: Driver rockchip-rt3261 requests probe deferral
    [  491.221518] rockchip-es8388 rockchip-es8388.30: ASoC: CODEC (null) not registered
    [  491.221747] rockchip_es8388_audio_probe() register card failed:-517
    [  491.221907] platform rockchip-es8388.30: Driver rockchip-es8388 requests probe deferral
    [  491.457689] sd 0:0:0:0: [sda] 15679488 512-byte logical blocks: (8.02 GB/7.47 GiB)
    [  491.459200] sd 0:0:0:0: [sda] Write Protect is off
    [  491.460781] sd 0:0:0:0: [sda] No Caching mode page found
    [  491.460875] sd 0:0:0:0: [sda] Assuming drive cache: write through
    [  491.471083] sd 0:0:0:0: [sda] No Caching mode page found
    [  491.471199] sd 0:0:0:0: [sda] Assuming drive cache: write through
    [  491.473791]  sda: sda1
    [  491.488854] sd 0:0:0:0: [sda] No Caching mode page found
    [  491.488934] sd 0:0:0:0: [sda] Assuming drive cache: write through
    [  491.488999] sd 0:0:0:0: [sda] Attached SCSI removable disk
    [  492.564591] FAT-fs (sda1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

    最主要的信息就是前面的 usb 1-1.1 了。只要能看到这个信息,就表明上面三个步骤中的前两步都是没问题的。那问题就只能出现最后一步映射上了。

    这个映射,靠的是一个叫 fstab 的文件:文件系统映射表。

    不同的系统这一文件的名称与位置可能不一样。笔者的Android系统中,这一文件为:

    ./device/rockchip/rk3288/fstab.rk30board.bootmode.emmc

    前面我们在插入U盘以后看到的那串内核打印里有个前缀“usb 1-1.1”,这后面的 ".1" 就代表这个U口在Hub中的序号。我们把同一个U盘往不同的口插,可以看到这个序号是不一样的。这个需要记住。

    其次,我们还要知道Hub芯片是接在CPU的哪一个USB资源口上,我们需要知道这一usb资源的地址。

    例如,笔者手里的板子就是接到 usb4 上的,它的地址如下:

    知道了上面这些信息以后,就可以在 fstab 文件中添加或修改自动挂载信息了。如下图所示:

    第一列就是Hub上每一个U口的信息。第二列就是在Android系统中的挂载点。这两部分的信息需要根据自己的实际情况来填写,其余部分照抄就行了。

    要注意,如果挂载点还有其它设备在使用着,应视情况删去其它挂载信息或更改挂载点。总之,我们要保证被挂载点是唯一的。

    如此,再次编译系统镜像,验证就可以解决Hub式的USB接口不能认到U盘等设备的问题了。


  • 相关阅读:
    用Java求两个字符串所有的公共子序列
    Windows系统上安装logstash和logstash-input-jdbc
    Linux下zip文件的压缩和解压命令
    Linux-root用户下新建用户及为新用户配置密码
    Linux下查看是否安装jdk的命令
    使用git clone命令报错:error: RPC failed; curl 18 transfer closed with outstanding read data remaining
    SCP not a regular file
    常用正则表达式
    Android Wear 兼容
    git diff 配置 meld diff
  • 原文地址:https://www.cnblogs.com/chorm590/p/10716509.html
Copyright © 2011-2022 走看看