目录

一、USB OTG

二、I.MX6ULL USB 接口简介

硬件原理图

1、USB HUB 原理图

2 、USB OTG 原理图

三、使能驱动

1、打开 HID 驱动

2、 使能 USB 键盘和鼠标驱动

3 、使能 Linux 内核中的 SCSI 协议

4、使能 U 盘驱动

四、测试u盘

五、 Linux 内核自带 USB OTG


USB 是很常用的接口,目前大多数的设备都是 USB 接口的,比如鼠标、键盘、 USB 摄像
头等,我们在实际开发中也常常遇到 USB 接口的设备,来学习一下如何使能 Linux内核自带的 USB 驱动

一、USB OTG

USB 分为 HOST(主机)和从机(或 DEVICE),有些设备可能有时候需要做HOST,有时候又需要做 DEVICE,配两个 USB 口当然可以实现,但是太浪费资源了。如果一个 USB 接口既可以做 HOST 又可以做 DEVICE 那就太好了,使用起来就方便很多。为此, USBOTG 应运而生, OTG 是 On-The-Go 的缩写,支持 USB OTG 功能的 USB 接口既可以做 HOST,也可以做 DEVICE。Mini USB 插头有 5 根线,其中一条就是 ID 线。 ID 线的高低电平表示 USB 口工作在 HOST 还是 DEVICE 模式:
ID=1: OTG 设备工作在从机模式。
ID=0: OTG 设备工作在主机模式。

二、I.MX6ULL USB 接口简介

I.MX6ULL 内部集成了两个独立的 USB 控制器,这两个 USB 控制器都支持 OTG 功能。
I.MX6ULL 内部 USB 控制器特性如下:
①、有两个 USB2.0 控制器内核分别为 Core0 和 Core1,这两个 Core 分别连接到 OTG1 和OTG2。
②、两个 USB2.0 控制器都支持 HS、 FS 和 LS 模式,不管是主机还是从机模式都支持HS/FS/LS,硬件支持 OTG 信号、会话请求协议和主机协商协议,支持 8 个双向端点。
③、支持低功耗模式,本地或远端可以唤醒。
④、每个控制器都有一个 DMA

每个 USB 控制器都有两个模式:正常模式(normal mode)和低功耗模式(low power mode)。
每个 USB OTG 控制器都可以运行在高速模式(HS 480Mbps)、全速模式(LS 12Mbps)和低速模式
(1.5Mbps)。正常模式下每个 OTG 控制器都可以工作在主机(HOST)或从机(DEVICE)模式下,每
个 USB 控制器都有其对应的接口。低功耗模式顾名思义就是为了节省功耗, USB2.0 协议中要
求,设备在上行端口检测到空闲状态以后就可以进入挂起状态。在从机(DEVICE)模式下,端口
停止活动 3ms 以后 OTG 控制器内核进入挂起状态。

硬件原理图

1、USB HUB 原理图

I.MX6ULL 的 USB OTG2 扩展成了 4 路 HOST 接口,其中一路供 4G 模块使用,因此就剩下了三个通用的 USB A 插座,U10 就是 USB HUB 芯片 GL850G, GL850G 是一款符合 USB2.0 标准的 USB HUB 芯片,支持一拖四扩展,可以将一路 USB 扩展为 4 路 USB HOST 接口

2 、USB OTG 原理图

开发板上还有一路 USB OTG 接口,使用 I.MX6ULL 的 USB OTG1 接口。此路 USB OTG 既可以作为主机(HOST),也可以作为从机(DEVICE),从而实现完整的 OTG 功能,左侧的为 Mini USB 插座,当 OTG 作为从机(DEVICE)的时候 USB 线接入此接口。右侧为 USB A 插座,当 OTG 作为主机的时候将 USB 设备插入到此接口中,另外开发板上集成了一个 USB HOST 接口

主机(HOST)模式: 主机模式下必须将 Mini USB 线拔出来,将 USB 设备连接到对应的USB HOST 接口上。 Mini USB 线拔出来以后 USB_OTG_VBUS 就没有电压了,此时 USB_OTG1_ID线就被 R31 这个 100K 电阻下拉到地,因此 USB_OTG1_ID 线的电压就为 0,当 ID 线为 0 的时候就表示 OTG 工作在主机模式。

从机(DEVICE)模式: USB_OTG_VBUS 是 Mini USB 的电源线,只有插入Mini USB 线以后 USB_OTG_VBUS 才有效(5V)。插入 Mini USB 线就表示开发板此时要做从机(此时不考虑接 OTG 线的情况), USB_OTG_VBUS 就是电脑供的 5V 电压,由于分压电阻 R111和 R31 的作用,此时 USB_OTG1_ID 的电压就是 4.5V 左右,很明显这一个高电平。当 ID 线为高的时候就表示 OTG 工作在从机模式

三、使能驱动

NXP 官方的 Linux 内核默认已经使能了 USB 键盘鼠标和  U 盘驱动

1、打开 HID 驱动

-> Device Drivers
      -> HID support

-> HID bus support (HID [=y])
                        -> <*> Generic HID driver

2、 使能 USB 键盘和鼠标驱动

-> Device Drivers
        -> HID support
                -> USB HID support
                        -> <*> USB HID transport layer

3 、使能 Linux 内核中的 SCSI 协议

-> Device Drivers
        -> SCSI device support
                -> <*> SCSI disk support

4、使能 U 盘驱动

-> Device Drivers
        -> USB support (USB_SUPPORT [=y])
                -> Support for Host-side USB (USB [=y])
                        -> <*> USB Mass Storage support

注意 U 盘要为 FAT32 格式的!NTFS 和 exFAT 由于版权问题所以在 Linux下支持的不完善,操作的话可能会有问题,比如只能读,不能写或者无法识别等

编译内核用新的zImage和设备树启动开发板

四、测试u盘

插上u盘在开发版就会打印下面信息

进入dev目录就能看到这个目录

/dev/sda 是整个 U盘, /dev/sda1 是 U 盘的第一个分区,我们一般使用 U 盘的时候都是只有一个分区。要想访问 U盘我们需要先对 U 盘进行挂载,理论上挂载到任意一个目录下都可以,这里我创建一个/mnt/usb_disk 目录,然后将 U 盘挂载到/mnt/usb_disk 目录下,命令如下

mkdir /mnt/usb_disk -p //创建目录
mount /dev/sda1 /mnt/usb_disk/ -t vfat -o iocharset=utf8 //挂载

-t 指定挂载所使用的文件系统类型,这里设置为 vfat,也就是 FAT 文件系统,“-o iocharset”设置硬盘编码格式为 utf8,否则的话 U 盘里面的中文会显示乱码

上图可以看到,挂载成功以后进入到/mnt/usb_disk 目录下能读能写

至此 U 盘就能正常读写操作了,直接对/mnt/usb_disk 目录进行操作就行了。如果要拔出 U盘要执行一个 sync 命令进行同步,然后在使用 unmount 进行 U 盘卸载,命令如下所示:

sync //同步
cd / //如果处于/mnt/usb_disk 目录先退出来,否则卸载的提示设备忙,导致卸载失败
umount /mnt/usb_disk //卸载

五、 Linux 内核自带 USB OTG

这里因为开发板为了在板子上集成 OTG 的主机和从机接口对 ID 线做了修改,需要修改 ID 引脚的电气属性

查阅原理图可以知道, USB OTG1 的 ID 引脚连接到了 I.MX6ULL 的 GPIO1_IO00 这个引
脚上, USB OTG 默认工作在主机(HOST)模式下,因此 ID 线应该是低电平。这里需要修改设备树中 GPIO1_IO00 这个引脚的电气属性,将其设置为默认下拉

MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058

就是将 GPIO1_IO00 复用为 OTG1 ID,并且设置电气属性为 0X13058,默认下拉,设备树修改好以后重新编译并用新的设备树启动系统,系统重启成功以后就可以正常使用 USB OTG1 接口, OTG 既可以做主机,也可以做从机,做主机的话测试,直接在开发板的 OTG HOST 接口上插入 USB 鼠标键盘、 U 盘等设备。

体验Linux USB 驱动相关推荐

  1. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  2. Linux USB驱动程序设计

    Linux USB驱动程序设计 1. USB发展史 USB(Universal Serial Bus ),通用串行总线,是一种外部总线标准,用于规范电脑与外部设备的连接和通讯. USB是在1994年底 ...

  3. 【正点原子Linux连载】第六十七章 Linux USB驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  4. Linux USB 驱动开发实例(七)—— 基于USB 总线的无线网卡浅析

    回顾一下USB的相关知识 USB(Universal Serial Bus)总线又叫通用串行外部总线, 它是20世纪90年代发展起来的.USB接口现在得到了广泛的应用和普及,现在的PC机中都带有大量的 ...

  5. 嵌入式Linux USB驱动开发之教你一步步编写USB驱动程序

    2019独角兽企业重金招聘Python工程师标准>>> 编写与一个USB设备驱动程序的方法和其他总线驱动方式类似,驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标 ...

  6. Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

    http://blog.csdn.net/zqixiao_09/article/details/51057086 设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程 ...

  7. linux usb驱动

    0.usb协议     usb的版本:     硬件         usb 1.0     OHCI        微软                 硬件 > 软件         usb ...

  8. USB基础---Linux USB驱动层次

    在Linux系统中,提供主机侧和设备侧视角的USB驱动框架,从主机侧看到的USB主机控制器和设备驱动,以及从设备侧看到的设备控制器和Gadget驱动. Linux系统中USB驱动的整体视图 图1 (1 ...

  9. Linux USB 驱动开发实例 (三)—— 基于USB总线的无线网卡浅析

    回顾一下USB的相关知识   USB(Universal Serial Bus)总线又叫通用串行外部总线,它是20世纪90年代发展起来的.USB接口现在得到了广泛的应用和普及,现在的PC机中都带有大量 ...

最新文章

  1. 腾讯提结合ACNet进行细粒度分类,效果达到最新SOTA | CVPR 2020
  2. 热力图和相关系数分析
  3. unslider调用配置选项
  4. oracle 返回表的函数,oracle 返回表函数
  5. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 25丨求团队人数【难度中等】​
  6. php书签源码,OneNav简约PHP导航书签源码
  7. 华为发布MetaAAU 能耗降低30% 性能节能双提升
  8. mysql取整,小数点处理函数floor(), round()
  9. 【自然语言处理系列】14篇NER命名实体识别学术论文多角度超全对比 | 详见汇报PPT
  10. KITTI数据集Raw Data与Ground Truth序列00-10的对应关系,以及对应的标定参数
  11. 代码简洁之道,检测出你代码中的 bug、漏洞、异味
  12. nginx反向代理负载均衡功能
  13. java复数类实部_Java编写一个复数类Complex,具有实部、虚部成员变量,可以完成加、减、乘、除和获得实部和虚部的方法...
  14. 阿里云飞天计划体验-阿里云开发者社区
  15. 微擎系统操作记实--公众号管理员权限设置
  16. 淘宝淘口令解密,解析,转换接口,API对接
  17. 想学文字生成图片?3招告诉你描述文字生成图片怎么做
  18. 解线性方程组的迭代法--大型稀疏矩阵---松弛迭代法C++实现
  19. 计算机老是跳出usb设备无法识别,如何解决电脑一直弹出USB设备无法识别的问题?...
  20. Docker - 使用Docker Compose部署应用

热门文章

  1. 哈佛结构和冯·诺依曼结构的区别【转】
  2. 实现延迟队列的4种方案
  3. 生物素化双孢蘑菇凝集素(ABL);Biotin-ABL
  4. CSDN 首发,收藏并实践本文,你就是大学最靓的仔~
  5. 利用genedoc绘制一张多序列比对图
  6. 黑龙江计算机二级考试时间报名,2019年9月黑龙江二级计算机考试时间通知
  7. Android手机插上usb能充电但不能识别的一种解决方法
  8. WRF中使用SRTM高分辨率的地形资料
  9. 在eclipse中导入数据库驱动文件jar包
  10. 正厚知识 | 超算“超”在何处