Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长
最近更新的速度和频率大不如以前,主要原因还是自己有些懈怠了。学习是一个持续努力的过程,一旦中断,再想保持以往的状态可能要付出比以前更多的努力。这里,我自己先检讨一下自己。不管出于什么原因,什么突发事件,保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求。请大家监督我,谢谢。
本章并不讲解具体的 USB 开发,本章我们就来学习一下如何使能 Linux内核自带的 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)。
可以对原生的 USB 口数量进行扩展,但是我们不能对原生 USB 口的带宽进行扩展。
USB 只能主机与设备之间进行数据通信, USB 主机与主机、设备与设备之间是不能通信的。
一个 USB 主控制器最多可以分配 127 个地址。
USB 主机和从机之间的通信通过管道(Pipe)来完成,在主机端管道其实就是一组缓冲区,用来存放主机数据,在设备端管道对应一个特定的端点。
一个 USB 接口既可以做 HOST 又可以做 DEVICE。
ID线。
ID 线的高低电平表示 USB 口工作在 HOST 还是 DEVICE 模式:
ID=1: OTG 设备工作在从机模式。
ID=0: OTG 设备工作在主机模式
两个独立的USB控制器。
USB 协议定义了 4 种不同的包结构:令牌(Token)包、数据(Data)包、握手(Handshake)包和特殊(Special)包。
控制传输:建立阶段(SETUP)、数据阶段(DATA)(可选)和状态阶段(STATUS)。建立阶段使用 SETUP 令牌包, SETUP 使用DATA0 包。数据阶段是 0 个、 1 个或多个输入(IN)/输出(OUT)事务,数据阶段的所有输入事务必须是同一个方向的。数据阶段的第一个数据包必须是 DATA1,每
次正确传输以后就在 DATA0 和 DATA1 之间进行切换。数据阶段完成以后就是状态阶段,状态阶段的传输方向要和数据阶段相反。
同步传输:周期性、低时延、数据量大的场合。同步传输没有握手阶段,即使数据传输出错了也不会重传。
批量传输:用于大批量传输大块数据的,这些数据对实时性没有要求。批量传输分为批量读(输入)和批量写(输出),如果是批量读的话第一阶段的 IN 令牌包,如果是批量写那么第一阶段就是 OUT 令牌包。
中断传输:适用于传输数据量小、具有周期性并且要求响应速度快的数据。
第一回合,总线复位信号。地址0.主机向地址0的端点0发送数据,请求设备描述符。ACK确认数据包。
第二回合,复位信号。地址设置。
第三回合,设备描述符数据包。
第四回合,配置描述符、配置集合、字符串描述符。
打开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 屏幕控制台,然后我们就可以输入各种命令来执行相应的操作
使能 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 //卸载
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 };
模拟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声卡:
配置完成以后重新编译内核,得到新的 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 声
卡设备了。
本笔记为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。