Boot Partition
eMMC上有2个Boot Partition,最小为128BK,最大为128KB * BOOT_SIZE_MULT
,BOOT_SIZE_MULT
的值在ECSD寄存器第226
个字节定义。Boot Partition和User Area是物理分开的。
thinking all the time
按照上一篇文章对gadget_configfs.txt的翻译,以imx8qxp mek的板子做为验证,配置为mass storage进行验证。
本文翻译Documentation/usb/gadget_configfs.txt文档。主要是讲述如何通过configfs
来配置USB Gadget的functions
。注意:这里使用的是配置,也就是要求内核必须存在对应的functions
。与ffs
的差别是,ffs
可以创建一个新的functions
,内核并不要求事先存在。
Linux USB Gadget是一个拥有UDC(USB Device Controller)的设备,该设备可以用于连接到USB Host用于扩展额外的功能,比如串口或者大容量存储(MTP)。Android就是一个支持MTP的USB Gadget。当Android手机插入到电脑中(USB Host),电脑可以识别出一个多媒体设备出来。
USB Host可以通过一些configurations
来识别gadget,configuration
包括多个interfaces
(这里可以理解为USB描述符直接的层级关系)。从gadget的角度来看是functions
,每个fcunction
代表一种功能,比如串口或者SCSI磁盘。
Linux为gadget提供一系列的functions
,在drivers/usb/gadget/function/
目录中定义。
创建gadget意味着决定将使用哪些configurations
,以及每种configurations
将提供的functions
,在这之前是以hardcode的方式在代码中设定的,比如drivers/usb/gadget/legacy/
的gadget都是。
configfs
(请参阅Documentation/filesystems/configfs/*
)非常适合告诉内核有关上述决定的内容。为啥是configfs
呢?因为configfs
支持从用户空间配置内核空间的驱动。反之,sysfs
支持同内核空间export一些对象供用户空间查看。本文档是讲关于如何做到的,以及描述了如何设计将configfs
与usb gadget集成在一起。
以下列举了常见的几种Android USB Gadget类型:
1、UMS:USB mass storage,USB大容量存储,也被称为UMS,USB MSC。在旧版Android手机上会将其暴露给计算机,有如下几种缺点:
通用串行总线(USB)通信设备(Communication devices)的定义由三个类组成:
CDC协议定义了一种使得USB总线能够支持任何通信设备的框架,如支持电信设备、多媒体网络设备等。
CDC协议并非试图去重定义已经存在的那些通信设备连接和控制标准,而是去定义了一种确定设备与主机应该使用哪种现有协议的机制。CDC会尽可能的使用已存在的通信数据格式,而只是由USB通过恰当的描述符(descriptor)、接口(interface)和服务请求(request)定义去使这些数据格式能够在USB总线上传输。确切来说,CDC规范描述了一种包含USB接口、数据结构和服务请求的框架,在该框架下种类繁多的通信设备能够被定义和实现。
通常一个CDC类设备由两个子类接口组成:一个通信接口类接口(Communication Interface Class)和0个或多个数据接口类接口(Data Interface Class)。主机主要通过通信接口类对设备进行管理和控制,而通过数据接口类传送数据。对于前面所述的不同CDC类模型,其所对应的接口的端点需求也是不同的,两个接口子类占有不同数量和类型的端点(Endpoints)。
通信接口类接口(Communication Interface )
设备通过通信接口通过定义好的申请(request)和通知(notification)实施设备控制以及可能的呼叫控制。因此通信接口时通信设备必须配置的接口,通信接口类一般需要一个控制端点(Control Endpoint,EP0)和一个可选的中断(Interrupt)端点。为了达到设备控制的目的,通信设备类在配置描述符中必须通过联合功能描述符(Union Functional Descriptor)将通信接口和数据接口组织起来。
数据接口类接口(Data Interface Class)
当通信设备需要传输的数据的数据格式不符合任何类的要求时就需要用数据接口来实现。一个通信设备可以包含0个或多个数据接口,数据接口上的数据格式则是主机和设备通过通信接口协商决定。数据接口子类需要一个方向为输入(IN)的块传输或同步传输类型端点和一个方向为输出(OUT)的块传输或同步传输类型端点。USB CDC包含以下种类,关于每个子类的定义,都可以参考Reference
中指定的文档。
Code | Subclass | Reference |
---|---|---|
00h | RESERVED | |
01h | Direct Line Control Model | USBPSTN1.2 |
02h | Abstract Control Model | USBPSTN1.2 |
03h | Telephone Control Model | USBPSTN1.2 |
04h | Multi-Channel Control Model | USBISDN1.2 |
05h | CAPI Control Model | USBISDN1.2 |
06h | Ethernet Networking Control Model | USBECM1.2 |
07h | ATM Networking Control Model | USBATM1.2 |
08h | Wireless Handset Control Model | USBWMC1.1 |
09h | Device Management | USBWMC1.1 |
0Ah | Mobile Direct Line Model | USBWMC1.1 |
0Bh | OBEX | USBWMC1.1 |
0Ch | Ethernet Emulation Model | USBEEM1.0 |
0Dh | Network Control Model | USBNCM1.0 |
0Dh~7Fh | RESERVED(future use) | |
80h~FEh | RESERVED(vendor specific) |
每个子类的详细介绍如下:
1、背景
开发板通过USB与PC相连,开发板会被枚举成USB网卡,通过网卡进行通信。通过USB连接后,开发板串口生成usb0
网卡,内容如下:
1 | @android:/ # ifconfig -a |
PC的ubuntu下识别到新的网卡enp0s20f0u10
,内容如下:
1 | enp0s20f0u10 Link encap:Ethernet HWaddr de:3b:4e:04:3f:17 |
iperf client
通常表示数据的发送者,所以这里PC的ubuntu做为client。iperf server
表示数据的接收者,所以这里开发板做为server。
1、SPL是Secondary Program Loader
,也就是第二阶段引导启动程序。
2、SPL是一套小的boot代码,主要负责初始化外部的DRAM和flash,然后引导启动u-boot。
3、SPL是在u-boot代码中,与u-boot共用一套代码,通过CONFIG_SPL_XXX
来区分。
u-boot可以引导kernel,那么谁来引导u-boot呢?可以使用Rom code(Boot rom)
引导u-boot,也可以使用SPL
引导u-boot。两者之间有啥差别呢?
1、如果Rom code
直接引导u-boot,那么Rom code
必须能够初始化外部DRAM又或者内部的SRAM足够大能够启动u-boot;
2、如果做不到,那么只能通过SPL来过渡。Rom code
从外设flash上固定的地址读取SPL到内部的SRAM上运行,SPL去初始化外部的DRAM,然后将u-boot从flash上拷贝到外部的DRAM并启动u-boot。下面讲讲u-boot SPL启动流程