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

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


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

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

        本章的思维导图如下:

一、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原理图分析

2、USB OTG原理图分析

三、USB协议简析

1、USB描述符

2、USB数据包类型

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

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驱动:

         使能鼠标和键盘驱动:

        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

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 内核,会得到三个.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 内核,配置路径如下:

        配置完成以后重新编译内核,得到新的 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 声
卡设备了。
 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻量封装WebGPU渲染系统示例<55>- 顶点数据更新

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/VertexUpdateTest.ts 当前示例运行效果: ​​​​​​​ 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: export class VertexUpdateTest {pr…

【实用工具】vim常用命令

快速移动(上下左右箭头可替代) 左移 h 右移 l 下移 j 上移 K在本行操作 0 移动到本行行首 ^ 移动到本行的第一个不是 blank 字符 $ 移动到本行行尾 w 光标移动到下一个单词的开头 e 光标移动到下一个单词的结尾跨行移动光标 nG 光标定位到第n行的行首 gg 光标定位到第一行的…

dll不能运行是什么意思,分享5种有效的修复方法

在计算机使用过程中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;其中一种常见的问题是“dll不能运行”。这个问题可能会影响到我们的正常使用&#xff0c;甚至导致某些软件无法启动。那么&#xff0c;“dll不能运行是什么意思”呢&#xff1f;dll文件丢失怎么恢复&am…

下载大模型,保存阿里云盘

一、解决场景 下载模型或数据集&#xff0c;到国内云GPU平台、阿里云盘&#xff08;便于持久化储存&#xff0c;或者分享朋友&#xff09;。 及时收藏&#xff0c;下次还能找到&#xff01; 二、优势 此方法可以避免大文件下载到本地——占用内存&#xff0c;受到小带宽网络…

STL——常用算术生成算法

注&#xff1a;算术生成算法属于小型算法&#xff0c;使用时包含头文件#include<numeric> 算法简介&#xff1a; accumulate—— // 计算容器元素累计总和fill—— // 向容器中添加元素 1.accumulate 函数原型&#xff1a; accumulate(iterator beg, iterator end, …

西班牙语中关于时间的相关表达-柯桥 外贸西语学习

今天来为大家介绍一下询问时间和被别人询问时间西语相关表达。 如何向他人询问时间&#xff1f; Qu hora es? 几点了&#xff1f; Tienes hora? 你知道时间吗&#xff1f; Me puede decir la hora? 你可以告诉我时间吗&#xff1f; 如何表达时间&#xff1f;我…

Kafka安装及简单使用介绍

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

Pillow图像处理(PIL.Image类的详细使用)

文章目录 Opencv、Matplotlib(plt)、Pillow(PIL)、Pytorch读取数据的通道顺序Python图像处理库&#xff08;PIL、Pillow、Scikit-image、Opencv&#xff09;Pillow 官方文档&#xff08;超详细&#xff0c;超推荐&#xff09;一、PIL库与Pillow库的区别二、Pillow库&#xff08…

【Linux】Shell

Shell 文章目录 Shell1. 简介2. Shell 脚本入门3. 变量4. 运算式5. 条件判断6. 流程控制6.1 if 判断6.2 case 语句6.3 for 循环6.4 while 循环 7. read 读取控制台输入8. 函数8.1 系统函数8.2 自定义函数 9. 正则表达式入门10. 文本处理工具10.1 cut10.2 awk 11. 归档文件案例 …

特殊的C++vector容器迭代器失效情况:vector iterator not incrementable

众所周知&#xff0c;容器删除元素会使当前使用的迭代器失效&#xff0c;除了重新分配迭代器&#xff0c;还可以使用下面的写法&#xff0c;使删除元素时重新赋值一个有效的迭代器 for(auto iter v->begin();iter!v->end();){if(...){//判断条件iter v->erase(iter)…

X210 Linux开发板挂载NFS文件系统

软件版本 VirtualBox v7.0、Ubuntu 20.04.3 LTS 网络搭建 采用“路由器”“有线网”来将Linux开发板和Ubuntu虚拟机连接在同一个局域网中。具体接线如下&#xff1a; Linux开发板通过网线直接连接到“路由器”的LAN接口上&#xff0c;然后笔记本电脑通过Wifi与路由器连接。…

burpsuite模块介绍之dashboard(仪表板)

导语 "Dashboard主要分为三块:任务、事件日志和动态问题发现" 任务(Tasks):在这个模块中,你可以创建和管理不同类型的任务。其中包括两个预设模板: "来自代理(所有流量)的被动抓取"(live passive crawl from proxy (all traffic)):该任务模板…

纯CSS的华为充电动画,它来了

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; Krpano专栏&#xff1a;想学Krpano的&#xff0c;冲 &#x1f514…

location常用属性和方法

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在在JavaScript中location常用属性和方法以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可…

MySql 第三方工具SQL Sugar

MySQL 是一个非常流行和强大的开源关系数据库管理系统。由于其开源性质&#xff0c;许多第三方工具和库被开发出来&#xff0c;以帮助用户更有效地使用 MySQL。这些第三方工具提供了各种功能&#xff0c;包括数据库管理、SQL 查询生成和优化、备份和恢复等。在这篇博客中&#…

vol----学习随记!!!

目录 一、代码生成1.先新建一个功能的对应的代码配置各项解释&#xff1a; 2.后设置配置菜单3.再点保存&#xff0c;生成vue页面&#xff0c;生成model&#xff0c;生成业务类4.再通过菜单设置编写系统菜单 一、代码生成 1.先新建一个功能的对应的代码配置 各项解释&#xff…

二手房交易流程及避坑指南

文章目录 一、写作目的二、主要流程1、查档2、签定金合同3、网签4、交首付5、解押过户6、出产证7、拿房款8、交房 一、写作目的 近几个月房价一直跌跌不休&#xff0c;对于投资客来说这段时间肯定不好过&#xff0c;但这段时间也正是置换房子的好时候&#xff0c;在这次的房产…

Go语言中支持的internal目录配置与组织内私网包配置详解

Go 中的内部包 这里可能会有歧义 可能是 Go 的 internal 目录中的包也可能是指内部开发的包 函数和变量的可见性 对于函数和变量而言&#xff0c;有如下规则&#xff1a;1 &#xff09;小写字母开头的函数变量结构体只能在本包内访问2 &#xff09;大写字母开头的函数变量结…

移动应用开发:揭秘内侧APP封装台的高效

在数字化浪席卷下&#xff0c;移应用已经成连接企业与用户纽带。为了抢占市场先机&#xff0c;快速发布高质量的移动应用成为业竞争的关键。侧APP封装平因此而诞生&#xff0c;成为了应开发者的得助手。以下是内侧APP封装台的全面解读&#xff0c;助在应用开发海洋中乘风破浪。…

基于CMake的大型C++工程组织

此文适合大型C工程&#xff0c;涉及到多个自定义库&#xff0c;多个第三方库&#xff0c;以及还有给第三方用户进行二次开发的需求下&#xff0c;应对这种复杂编译环境下的工程组织方式的一些经验介绍&#xff0c;希望给大型工业软件的开发者一些参考 一个大型工程&#xff0c…