Linux usb 设备

一:/sys/bus/usb/devices/

  1. 信息显示如下
    在这里插入图片描述

  2. 1-0:1.0

    • 1:表示 1 号总线,或者说 1 号 Root Hub
    • 0:表示端口号
    • 1:表示配置号
    • 0:表示接口号
    • 命名规则:Root Hub-port:configuration.interface
  3. 1-1.1:1.0 or 1-1.2:1.0

    • 1:表示1号总线,或者说1号 Root Hub
    • 1:表示 Hub 连在 Root Hub 上的端口号
    • 1:表示设备连在 Hub 上的端口号
    • 1:表示配置号
    • 0:表示接口号

二:设备信息

在这里插入图片描述

  1. 设备种类
cat /sys/bus/usb/devices/1-1/bDeviceClass

在这里插入图片描述
09:表示为一个usb hub

#define USB_CLASS_PER_INTERFACE		0	/* for DeviceClass */
#define USB_CLASS_AUDIO			1
#define USB_CLASS_COMM			2
#define USB_CLASS_HID			3
#define USB_CLASS_PHYSICAL		5
#define USB_CLASS_STILL_IMAGE		6
#define USB_CLASS_PRINTER		7
#define USB_CLASS_MASS_STORAGE		8
#define USB_CLASS_HUB			9
#define USB_CLASS_CDC_DATA		0x0a
#define USB_CLASS_CSCID			0x0b	/* chip+ smart card */
#define USB_CLASS_CONTENT_SEC		0x0d	/* content security */
#define USB_CLASS_VIDEO			0x0e
#define USB_CLASS_WIRELESS_CONTROLLER	0xe0
#define USB_CLASS_MISC			0xef
#define USB_CLASS_APP_SPEC		0xfe
#define USB_CLASS_VENDOR_SPEC		0xff
  1. version usb协议版本
    在这里插入图片描述
    usb2.0 hub

  2. busnum & devnum
    在这里插入图片描述

  3. dev 主设备号:次设备号
    在这里插入图片描述

  4. bMaxPower 设备最大电流
    在这里插入图片描述

  5. idVendor(厂商 ID) & idProduct(产品 ID)
    在这里插入图片描述

  6. product 产品名称
    在这里插入图片描述

  7. bcdDevice 固件版本
    在这里插入图片描述

  8. speed 速率
    在这里插入图片描述

  9. uevent
    sysfs usb 设备的 uevent 是一个事件通知机制,表示当该 usb 设备在系统上被插入或拔出时,内核会发送一个事件通知给用户空间的系统进程,告知设备的状态变化。这个事件通知会包含一些关于设备的属性信息,例如设的厂商ID、产品ID、序列号等等,方便用户空间的应用程序进行设备管理和配置
    在这里插入图片描述

  10. bmAttributes
    大小为一字节,不同的位,表示不同的特性。

    • bit7 是保留的,必须为1。
    • bit6 表示供电方式:1 设备自供电;0 设备是总线供电的。
    • bit5 表示是否支持远程唤醒:1 支持远程唤醒;0 不支持远程唤醒。
    • bit0~4 是保留的,默认为0。
      在这里插入图片描述
  11. drivers_autoprobe
    drivers_autoprobe 是一个 sysfs 属性,用于在新插入 USB 设备时触发自动探测 USB 驱动程序。当将此属性设置为 1 时,内核将尝试自动加载适当的驱动程序,以便为任何新连接的 USB 设备进行配置。这可以节省手动 USB 设备所需的时间和精力。

三:固定usb设备名方法

根据连接在usb hub上的端口号区分。usb hub端口号是固定的。

  1. 查找需要固定的usb设备
#输入命令:ls /sys/class/tty/ttyUSB* -l,输出结果如下
lrwxrwxrwx root root 2017-08-01 13:40 ttyUSB0 -> …/…/devices/ff540000.usb/usb3/3-1/3-1.1/3-1.1:1.0/ttyUSB0/tty/ttyUSB0
lrwxrwxrwx root root 2017-08-01 13:43 ttyUSB1 -> …/…/devices/ff540000.usb/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1
  1. 添加规则
    终端输入:sudo vi /etc/udev/rules.d/10-local.rules,添加下面的内容(这句话是个模板,每固定一个设备把这句话复制一次,把开头的#号去掉,把KERNELS和SYMLINK改成自己想要的就可以了)。
#ACTION==“add”,KERNELS==“1-2:1.0”,SUBSYSTEMS==“usb”,MODE:=“0777”,SYMLINK+=“name”
ACTION==“add”,KERNELS==“3-1.1:1.0”,SUBSYSTEMS==“usb”,MODE:=“0777”,SYMLINK+=“my_serial0”
ACTION==“add”,KERNELS==“3-1.2:1.0”,SUBSYSTEMS==“usb”,MODE:=“0777”,SYMLINK+=“my_serial1”

KERNELS==“3-1.1:1.0”固定设备信息参考(第一章:第1小节)
SYMLINK+=“my_serial0” 固定名称

四:固定挂载目录

  1. usb挂载规则配置文件
    /etc/udev/rules.d/10-myusbstorage.rules
      1 KERNEL!="sd*", GOTO="auto_mount_end"
      2 SUBSYSTEM!="block", GOTO="auto_mount_end"
      3 ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service"
      4 ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service"
      5 LABEL="auto_mount_end"
    
  2. usb挂载服务
    /etc/systemd/system/usb-mount@.service
      1 [Unit]
      2 Description=Mount USB Drive on %i
      3 
      4 [Service]
      5 Type=oneshot
      6 RemainAfterExit=true
      7 ExecStart=/usr/bin/usbstorage-mount.sh add %i
      8 ExecStop=/usr/bin/usbstorage-mount.sh remove %i
    
  3. usb挂载脚本
    /usr/bin/usbstorage-mount.sh
    #!/bin/bash
    # This script is called from our systemd unit file to mount or unmount
    # a USB drive.
    usage()
    {
        echo "Usage: $0 {add|remove} device_name (e.g. sdb1)"
        exit 1
    }
    if [[ $# -ne 2 ]]; then
       usage
    fi
    
    ACTION="$1"
    DEVBASE="$2"
    DEVICE="/dev/${DEVBASE}"
    
    # See if this drive is already mounted, and if so where
    MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }')
    
    do_mount()
    {
        if [[ -n "${MOUNT_POINT}" ]]; then
            echo "Warning: ${DEVICE} is already mounted at ${MOUNT_POINT}"
            exit 1
        fi
    
        # Get info for this drive: $ID_FS_LABEL, $ID_FS_UUID, and $ID_FS_TYPE
        # added some sed's to avoid space issues
        eval $(/sbin/blkid -o udev ${DEVICE}|sed 's/=/="/'|sed 's/$/"/')
    
        # Figure out a mount point to use
        LABEL="${ID_FS_LABEL}"
        if [[ -z "${LABEL}" ]]; then
            LABEL="${DEVBASE}"
        elif /bin/grep -q " /media/${LABEL} " /etc/mtab; then
            # Already in use, make a unique one
            LABEL+="-${DEVBASE}"
        fi
        # MOUNT_POINT="/media/${LABEL}"
        #MOUNT_POINT="/media/${DEVBASE}"
        MOUNT_POINT="/media/sda1" #修改挂载点
    
        echo "Mount point: ${MOUNT_POINT}"
    
        /bin/mkdir -p "${MOUNT_POINT}"
    
        # Global mount options
        OPTS="rw,relatime"
        #added a chmod checker for file systems that don't 
        #understand allow all to read write
        # CHMOD=no
        # File system type specific mount options
        if [[ ${ID_FS_TYPE} == "vfat" ]]; then
            OPTS+=",users,gid=100,iocharset=utf8,umask=000"
            # OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"
        #added options I wanted on ntfs
        elif [[ ${ID_FS_TYPE} == "ntfs" ]]; then
            OPTS+=",users,gid=100,iocharset=utf8,umask=000"
            # OPTS+=",user,users,umask=000,allow_other"                      
        else
           OPTS+=",users,gid=100,iocharset=utf8,umask=000"
        #    CHMOD=yes
        fi
    
        if ! /bin/mount -o "${OPTS}" ${DEVICE} "${MOUNT_POINT}"; then
            echo "Error mounting ${DEVICE} (status = $?)"
            /bin/rmdir "${MOUNT_POINT}"
            exit 1
        fi
    
    
        echo "**** Mounted ${DEVICE} at ${MOUNT_POINT} ****"
        # if [ "${CHMOD}" = "yes" ];then
        #     /usr/bin/find "${MOUNT_POINT}" -type f -exec chmod 0666 {} \;
        #     /usr/bin/find "${MOUNT_POINT}" -type d -exec chmod 0777 {} \;
        # fi
    }
    
    do_unmount()
    {
        if [[ -z ${MOUNT_POINT} ]]; then
            echo "Warning: ${DEVICE} is not mounted"
        else
            /bin/umount -l ${DEVICE}
            echo "**** Unmounted ${DEVICE}"
        fi
    
        # Delete all empty dirs in /media that aren't being used as mount
        # points. This is kind of overkill, but if the drive was unmounted
        # prior to removal we no longer know its mount point, and we don't
        # want to leave it orphaned...
        for f in /media/* ; do
            if [[ -n $(/usr/bin/find "$f" -maxdepth 0 -type d -empty) ]]; then
                if ! /bin/grep -q " $f " /etc/mtab; then
                    echo "**** Removing mount point $f"
                    /bin/rmdir "$f"
                fi
            fi
        done
    }
    
    case "${ACTION}" in
        add)
            do_mount
            ;;
        remove)
            do_unmount
            ;;
        *)
            usage
            ;;
     esac
    
    MOUNT_POINT="/media/sda1" 为U盘挂载点,修改此处即可
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值