Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求

Linux版本号4.1.15   芯片I.MX6ULL                                    大叔学Linux    品人间百味  思文短情长


       最近更新的速度和频率大不如以前,主要原因还是自己有些懈怠了。学习是一个持续努力的过程,一旦中断,再想保持以往的状态可能要付出比以前更多的努力。这里,我自己先检讨一下自己。不管出于什么原因,什么突发事件,保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求。请大家监督我,谢谢。

         本章并不讲解具体的 USB 开发,本章我们就来学习一下如何使能 Linux内核自带的 USB 驱动。

        本章的思维导图如下:

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第1张图片

一、USB接口简介

1、什么是USB?

2、USB电气特性

        USB A 插头从左到右线序依次为 1,2,3,4,第 1 根线为 VBUS,电压为5V,第 2 根线为 D-,第 3 根线为 D+,第 4 根线为 GND。

        Mini USB 插头,线序从左往右依次是 1~5。第 1 根线为 VCC(5V),第 2 根线为 D-,第 3 根线为 D+,第 4 根线为 ID,第 5 根线为 GND。可以看出 Mini USB 插头相比 USB A 插头多了一个 ID 线,这个 ID 线用于实现 OTG 功能,通过 ID 线来判断当前连接的是主设备(HOST)还是从设备SLAVE)。
 

3、USB拓扑结构

        可以对原生的 USB 口数量进行扩展,但是我们不能对原生 USB 口的带宽进行扩展。

        USB 只能主机与设备之间进行数据通信, USB 主机与主机、设备与设备之间是不能通信的。

        一个 USB 主控制器最多可以分配 127 个地址。

        USB 主机和从机之间的通信通过管道(Pipe)来完成,在主机端管道其实就是一组缓冲区,用来存放主机数据,在设备端管道对应一个特定的端点。
 

4、什么是USB OTG?

        一个 USB 接口既可以做 HOST 又可以做 DEVICE。

        ID线。

        ID 线的高低电平表示 USB 口工作在 HOST 还是 DEVICE 模式:
                ID=1: OTG 设备工作在从机模式。
                ID=0: OTG 设备工作在主机模式

5、I.MX6ULL USB接口简介

        两个独立的USB控制器。

        

二、硬件原理图分析

1、USB HUB原理图分析

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第2张图片

2、USB OTG原理图分析

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第3张图片

三、USB协议简析

1、USB描述符

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第4张图片

2、USB数据包类型

        USB 协议定义了 4 种不同的包结构:令牌(Token)包、数据(Data)包、握手(Handshake)包和特殊(Special)包。

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第5张图片

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第6张图片

3、USB传输类型

        控制传输:建立阶段(SETUP)、数据阶段(DATA)(可选)和状态阶段(STATUS)。建立阶段使用 SETUP 令牌包, SETUP 使用DATA0 包。数据阶段是 0 个、 1 个或多个输入(IN)/输出(OUT)事务,数据阶段的所有输入事务必须是同一个方向的。数据阶段的第一个数据包必须是 DATA1,每
次正确传输以后就在 DATA0 和 DATA1 之间进行切换。数据阶段完成以后就是状态阶段,状态阶段的传输方向要和数据阶段相反。
        同步传输:周期性、低时延、数据量大的场合。同步传输没有握手阶段,即使数据传输出错了也不会重传。
        批量传输:用于大批量传输大块数据的,这些数据对实时性没有要求。批量传输分为批量读(输入)和批量写(输出),如果是批量读的话第一阶段的 IN 令牌包,如果是批量写那么第一阶段就是 OUT 令牌包。
        中断传输:适用于传输数据量小、具有周期性并且要求响应速度快的数据。
 

4、USB枚举

        第一回合,总线复位信号。地址0.主机向地址0的端点0发送数据,请求设备描述符。ACK确认数据包。

        第二回合,复位信号。地址设置。

        第三回合,设备描述符数据包。

        第四回合,配置描述符、配置集合、字符串描述符。

四、Linux内核自带HOST试验

1、USB鼠标键盘测试

        打开HID驱动:

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第7张图片

         使能鼠标和键盘驱动:

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第8张图片

        USB HID Transport layer和HIDBP(BootProtocol)键盘、鼠标的驱动不能一起使用!
        如果成功驱动的话就会在/dev/input 目录下生成一个名为eventX(X=0,1,2,3…)的文件。
        首先将屏幕设置为控制台,打开开发板根文件系统中的/etc/inittab 文件,然后在里面加入下面这一行:

tty1::askfirst:-/bin/sh

        完成以后重启开发板,此时屏幕就会作为终端控制台,会有“Please press Enter to activate
this console.”这样提示。按下键盘上的 Enter(回车)键即可使能 LCD 屏幕控制台,然后我们就可以输入各种命令来执行相应的操作
 

2、U盘试验

使能 Linux 内核中的 SCSI 协议
 

使能 USB Mass Storage

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第9张图片

FAT32 格式
将 U 盘挂载到/mnt/usb_disk 目录下,命令如下:

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

         如果要拔出 U盘要执行一个 sync 命令进行同步,然后在使用 unmount 进行 U 盘卸载,命令如下所示:

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

五、Linux内核自带USB OTG试验

1、修改设备树

        USB OTG1 的 ID 引脚连接到了 I.MX6ULL 的 GPIO1_IO00引脚。

        USB OTG 默认工作在主机(HOST)模式下,因此 ID 线应该是低电平。

        修改设备树中 GPIO1_IO00 这个引脚的电气属性,将其设置为默认下拉。打开设备树 imx6ull-alientek-emmc.dts,在 iomuxc 节点的 pinctrl_hog_1 子节点下添加 GPIO1_IO00 引脚信息,如下所示:

1 &iomuxc {
2 pinctrl-names = "default";
3 pinctrl-0 = <&pinctrl_hog_1>;
4 imx6ul-evk {
5 pinctrl_hog_1: hoggrp-1 {
6 fsl,pins = <
7 ......
8 MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058 /*OTG1 ID */
9 >;
10 };
11 ......
12 };

2、OTG主机试验

3、OTG从机试验

        模拟U盘:

        配置 Linux
 

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第10张图片

        将驱动编译为模块,使用时直接使用命令加载模块即可。

        配置好以后重新编译 Linux 内核,会得到三个.ko 驱动模块(带路径):

                drivers/usb/gadget/libcomposite.ko
                drivers/usb/gadget/function/usb_f_mass_storage.ko
                drivers/usb/gadget/legacy/g_mass_storage.ko
        将上述三个.ko 模块拷贝到开发板根文件系统中,命令如下:

cd drivers/usb/gadget/ //进入 gadget 目录下
sudo cp libcomposite.ko /home/zuozhongkai/linux/nfs/rootfs/lib/modules/4.1.15/
sudo cp function/usb_f_mass_storage.ko /home/zuozhongkai/linux/nfs/rootfs/lib/modules/4.1.15/
sudo cp legacy/g_mass_storage.ko /home/zuozhongkai/linux/nfs/rootfs/lib/modules/4.1.15/

        使用新编译出来的 zImage 启动开发板,在开发板上插入一个 U 盘,
        使用 Type-C 线将开发板的 USB Type-C 接口与电脑连接起来。

        连接好以后依次加载 libcomposite.ko、 usb_f_mass_storage.ko 和 g_mass_storage.ko 这三个驱动文件,顺序不能错了!命令如下:

depmod
modprobe libcomposite.ko
modprobe usb_f_mass_storage.ko
modprobe g_mass_storage.ko file=/dev/sda1 removable=1//加载 g_mass_storage.ko 的时候使用 //file 参数指定使用的大容量存储设备,我这里使用 U 盘
//对应的/dev/sda1。

        如果加载成功的话电脑就会出现一个 U 盘。操作完成以后要退出的话执行如下命令:

rmmod g_mass_storage.ko

        USB声卡:

        配置 Linux 内核,配置路径如下:
Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求_第11张图片

        配置完成以后重新编译内核,得到新的 zImage 和三个.ko驱动模块文件:

                drivers/usb/gadget/libcomposite.ko
                drivers/usb/gadget/function/usb_f_uac1.ko
                drivers/usb/gadget/legacy/g_audio.ko
        将上述三个.ko 模块拷贝到开发板根文件系统中,命令如下:

cd drivers/usb/gadget/
sudo cp libcomposite.ko /home/zuozhongkai/linux/nfs/rootfs/lib/modules/4.1.15/
sudo cp function/usb_f_uac1.ko /home/zuozhongkai/linux/nfs/rootfs/lib/modules/4.1.15/
sudo cp legacy/g_audio.ko /home/zuozhongkai/linux/nfs/rootfs/lib/modules/4.1.15/

        拷贝完成以后使用新编译出来的 zImage 启动开发板,用 Mini USB 线将开发板与电脑连接起来,最后依次加载 libcomposite.ko、 usb_f_uac1.ko 和 g_audio.ko 这三个驱动模块,命令如下:

depmod
modprobe libcomposite.ko
modprobe usb_f_uac1.ko
modprobe g_audio.ko

        加载完成以后稍等一会虚拟出一个 USB 声卡,打开电脑的设备管理器,选择“声音、视频
和游戏控制器”,会发现有一个名为“AC Interface”设备。“AC Interface”就是开发板模拟出来的 USB 声卡,设置 windows,选择音频输出使用“AC Interface”。

        一切设置好以后就可以从开发板上听到电脑输出的声音,此时开发板就完全是一个 USB 声
卡设备了。
 

本笔记为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。

你可能感兴趣的:(嵌入式Linux驱动开发学习,linux,学习,arm开发,嵌入式硬件,arm)