ACPI对USB的管理

1、_UPC (USB端口功能)

这个可选对象是一个方法,它允许平台与操作系统通信,通过当前USB主机总线适配器规范(如UHCI、OHCI和EHCI)没有提供的某些USB端口功能。如果由平台实现,此对象将出现在给定USB主机总线适配器上的每个USB端口(子端口);操作系统软件可以在启动时检查这些特征,以获得有关系统的USB拓扑结构、可用的USB端口等方面的知识。此方法适用于USB根集线器端口以及通过集成的USB集线器实现的端口

参数 : 无

返回值:

一个包如下所述的返回值信息:

Package {

Connectable  // Integer (BYTE) 端口的链接状态,非0可连接、0不可连接

Type  // Integer (BYTE) 主机类型

Reserved0  // Integer

Reserved1 // Integer)

}

其他说明:

“可连接”端口的定义取决于特定平台中USB端口的实现。例如,

•如果USB端口是用户可见的(由_PLD对象表示)和可连接的,那么终端用户可以自由地连接和断开USB设备到USB端口。

•如果一个USB端口不是用户可见的,是可连接的,那么终端用户不能自由地连接和断开USB设备到USB端口。直接“硬连接”到USB端口的USB设备就是一个USB端口的例子,它不是用户可见的,而是可连接的。

•如果一个USB端口是用户不可见的,也不是可连接的,那么这个USB端口是由USB主机控制器物理实现的,但是平台不使用它,因此终端用户不能访问它。

USB端口不能被指定为既可见又不可连接。

Type-C连接器的引脚支持一个USB2信号对(D+/D-)和两个超速信号对(SSTXp1/SSTXn1和ssrp2 /SSRXn2)。两个SS信号对的使用使得CC线和USB超高速数据总线线可以用于电缆轨道内的信令,而不考虑电缆的方向和扭曲。

Type-C连接器- USB2 USB2专用插座

这些只实现USB2信号对,而不实现SS信号对。

Type-C连接器-带有开关插座的USB2和SS

这些实现了USB2信号对,以及一个带有物理多路复用器的功能开关,该多路复用器用于动态地将两个高速信号对中的一个连接到单个USB主机控制器端口,作为Type-C插头方向的功能。

Type-C连接器-无开关插座的USB2和SS

这些实现了USB2信号对和功能开关,通过连接每个插座的超速度信号对到一个单独的USB主机控制器端口。

注意:更多信息请参考USB Type-C规范中的4.5.1.1节。下面是一个为USB主机控制器的根集线器实现的端口特征对象

例子:

•实现三个端口;端口1不是用户可见/不可连接的,端口2和3是用户可见和可连接的。

•端口2位于后面板上

•端口3有一个集成的端口中心。注意,由于该端口承载一个集成的集线器,因此它不能与另一个主机控制器共享(例如,如果集成的集线器是USB2.0集线器,则该端口永远不能与USB1.1伙伴控制器共享)。

•可通过嵌入式集线器使用的端口位于前面板上,彼此相邻。

2、USB 2.0主机控制器和_UPC、_PLD

实现USB2.0主控制器的平台必须为每个端口实现一个_UPC和一个_PLD对象,这些对象由一个或多个符合USB1.1的同伴控制器(例如UHCI或OHCI)组成,可以在EHCI主机控制器与其关联的同伴控制器之间路由。这是必需的,因为如果OSPM禁用父主机控制器,则为EHCI主机控制器的子端口实现的USB端口功能对象可能不可用。例如,如果EHCI主机控制器上的根端口1可路由到它的伙伴控制器上的根端口1,则命名空间必须在每个主机控制器的关联端口1子对象下提供_UPC和_PLD对象。

它是USB 2.0端口的一种常见设计,由两个控制器管理:一个用于低速和全速(USB 1.1速度),另一个用于高速(从USB 2.0开始提供的新速度)。如果是这种情况,第3根集线器可能来自管理高速连接的EHCI控制器,而第1和第2根集线器可能来自管理低速和全速连接的一对OHCI或UHCI控制器。然后,计算机上的每个USB端口将连接到两个控制器,EHCI控制器和另外两个控制器中的一个,使用哪一个将取决于连接到该端口的USB设备所选择的速度。

3、_PLD(设备物理位置)

这个可选对象是一个方法,它将设备外部接口的物理位置的一般描述传递给OSPM。_PLD可以是系统希望描述的任何ACPI名称空间对象的子对象。系统软件可以使用这些信息向用户描述特定的连接器或设备输入机制可以用于给定的任务,或者需要用户干预才能进行正确的操作。_PLD应该只在它的父设备出现时才进行计算,这是由设备的存在机制(即_STA或其他)表示的。

外部暴露的设备接口可以位于系统外壳的任何表面。系统外壳的各个表面由“Panel”字段标识(如下所述)。_PLD方法返回数据,以描述设备接口所在的位置,以及可能在该位置呈现的形状(如下所述)。一个物理设备可以有多个接口。_PLD描述位于面板左下角的“原点”的单个设备接口的偏移和旋转。

所有面板引用(顶部、底部、右侧、左侧等)都被解释为用户面向系统的前面。对于手持移动设备,前面板是控制显示屏幕的面板,当以纵向方向查看显示时,其原点位于左下角。例如,右侧面板是从前面看到的系统的右侧。

当用户面对相应的面板时,面板的所有“原点”引用都被解释为其左下角。顶部面板应与系统在其前面板上显示,而底部面板应与系统在其后面板上显示。所有其他面板都应在系统位于其底部面板上时进行查看。更多信息请参见图6-34。Figure 6-34 System Panel and Panel Origin Positions

这些数据位还假设,如果系统能够像笔记本电脑一样打开,那么该设备可能存在于笔记本电脑系统的基础上或盖子上。如果是后者,应设置“盖”位(如下所述),指示设备接口在盖上。如果设备在盖上,则描述描述设备在盖上打开系统时的接口位置。如果设备接口不在盖子上,则说明说明设备接口在系统合上盖子时的位置。

要呈现系统面板的视图,需要收集所有定义相同面板和Lid值的_pld。然后,根据其Order字段的值对_pld进行排序,并通过绘制每个接口的形状(以其正确的形状、颜色、水平偏移量、垂直偏移量、宽度、高度和方向)来呈现面板的视图,首先从all Order = 0 _pld开始。参见图6-37中的示例。

由于系统连接或断开到坞站或端口复制器,设备接口的位置可能会改变。因此,类型0x09的Notify事件将导致OSPM重新计算驻留在被通知的特定设备下的_PLD对象。如果平台无法检测到连接或断开到停靠站或端口复制器的更改,则不应使用_PLD对象来描述将在此类事件后更改位置的设备接口。

参数 : 无

返回值 :包含一个可变长度的包

名称 占位(bit)

Revision --- 7 --- 版本号

Ignore Color --- 1 --- 如设置,则忽略Color域,标识颜色未知

Color --- 24 --- 设备接口的RGB值(Bits [15:8]:红

Bits [23:16]:绿值 Bits [31:24]蓝值)

Width --- 16 --- 设备接口的宽度,单位毫米

Height --- 16 --- 接口的高度,单位毫米

User Visible --- 1 --- 用户可见,置1可见

Dock --- 1 --- 如置,则设备接口位于停靠站或端口复制器中

Lid --- 1 --- 笔记本设备接口

Panel --- 3 --- 机箱位置(0-顶 1-底 2左 3右 4前 5后 6)

Vertical Position --- 2 --- 设备接口所在垂直位置(0-顶 1中间 2底)

Horizontal Position --- 2 --- 设备接口所在水平位置(0-顶 1中间 2底)

Shape --- 4 --- 设备接口的形状(0-圆 1-椭圆 2-方 3-垂直    的方型 4-水平方 5-垂直的梯形 6-水平梯 7-无 8-去角型)

Group Orientation --- 1 --- 如设置1,则垂直组,否则为水平组

Group Token --- 1 --- 组的唯一标号

Group Position --- 8 --- 标识设备接口的组内位置

Bay --- 1 --- 如设置则设备接口在一个bay里或就是bay

Ejectable --- 1 --- 设置则设备是ejectable,标识设备没_EJx 对象

OSPM Ejection

required --- 1 --- 设置则需要OSPM顶出:如OSPM需要参 与顶出过程,用户操作的物理硬件退出是不可能的。

Cabinet Number --- 8 --- 对于单柜,始终为0

Card Cage Number --- 8 --- 对于单卡槽,始终为0

reference --- 1 --- 设置则_PLD定义一个“reference”形状,用    于在呈现_PLD时帮助用户根据其他形状确定方向

Rotation --- 4 --- 围绕图形原点顺时针旋转45度,其中:0 – 0°

1 – 45°  2 – 90°  3 – 135°  4 – 180°

5 – 225°  6 – 270°  7 – 315°

Order --- 5 --- 标识由_PLD描述的接口的绘图顺序。Order = 0接口在Order = 1接口之前绘制。顺序= 1,顺序= 2,依此类推。顺序=最后绘制31个接口。顺序应该总是从0开始,并连续分配。

Reserved --- 4 --- 保留,必须为0

Vertical Offset --- 16 --- 形状原点与面板原点的垂直偏移量,0xFFFFFFFF 标识这个域不支持

Horizontal Offset --- 16 --- 形状原点与面板原点的水平偏移量,0xFFFFFFFF 标识这个域不支持

注意:所有额外的缓冲区条目可能包含特定于oem的数据,但是必须以{GUID, data}对开始。这些附加数据可能提供特定于某些系统或某类机器的物理位置信息。

Buffers 1 – N Return Value (Optional):

Buffer 1 Bit [127:0] – GUID 1

Buffer 2 Bit [127:0] – Data 1

Buffer 3 Bit [127:0] – GUID 2

Buffer 4 Bit [127:0] – Data 2

图6-37提供了一个外部设备接口的呈现示例,这些接口可能通过_PLD信息传递给用户。注意,与系统总线树(_SB)对象相关联的三个_pld(系统后面板、电源和主板(MB)连接器区域)。它们的参考标志被设置,指示用于向用户提供用于标识其他设备接口的相对位置的可视队列。

接口(C1到C16)由系统总线树中的_PLD对象定义。以下接口的面板和Lid字段分别设置为Back和0。系统后面板、电源、MB接头区域接口参考标志设置为1。在本例中用于渲染图6-37:

请注意,原点位于后面板的左下角,其中正的水平和垂直偏移值分别位于右侧和上方。

4、内核解析

handle = adev->handle;

status = acpi_get_physical_device_location(handle, &pld);

if (ACPI_FAILURE(status) || !pld)

return adev;

port_dev->location = USB_ACPI_LOCATION_VALID

| pld->group_token << 8 | pld->group_position;

port_dev->connect_type = usb_acpi_get_connect_type(handle, pld);

内核中调用acpi_get_physical_device_location函数评估_PLD控制方法,获取数据后填充struct acpi_pld_info结构。

调用usb_acpi_get_connect_type方法,获取_UPC中描述的Connectable字段,当这个字段非0,且上面_PLD中获取的user_visible字段为真,表示端口用户可见,则初始化相应usb端口的连接类型,包括USB_PORT_CONNECT_TYPE_HOT_PLUG和USB_PORT_CONNECT_TYPE_HARD_WIRED两种类型。

初始化port_dev->connect_type。

在drivers/usb/core/hub.c文件中,set_usb_port_removable函数判断根据端口connect_type变量,初始化udev->removable。

removable_show函数中调用udev->removable向上层到处接口使用。

ACPI相关(6)- ACPI对USB的管理相关推荐

  1. ACPI相关(4)- PCI电源管理

    一 ACPI模式下设备的休眠唤醒 ACPI规范假设设备可以处于四个电源状态之一,分别标记为D0,D1,D2和D3,大致对应于本机PCI PM D0-D3状态(尽管D3hot和D3cold之间的差异并未 ...

  2. ACPI相关(5)- PCI热插拔(一)

    PCI ACPI相关 1.热插拔流程 1) 设备状态模式检测的信号脚 ---- 对应的GPEx_STS的位 2) 在DSDT中编写对应的_LXX控制方法.(用于表示某个GPE事件中GPEx_STS状态 ...

  3. ACPI相关(5)- PCI热插拔(二)

    ACPI热插拔在系统中的实现 1.系统初始化阶段 在上电阶段PCI设备的扫描节点,ACPI模式根节点(主桥)被PCI总线驱动枚举,从驱动程序的角度上来看可以把root看作一个PCI桥,包含4个地址区间 ...

  4. ACPI相关(1)- 简介

    什么是ACPI? ACPI首先可以理解为一个独立于体系结构的电源管理和配置框架,它在主机OS中形成一个子系统.该框架建立一个硬件寄存器集来定义电源状态(休眠.hibernate.唤醒等).硬件寄存器集 ...

  5. linux acpi 作用,Linux ACPI服务ACPI 驱动体系简介

    Linux ACPI服务DSDT: DSDT 称做 Differentiated Definition Block,存在于 BIOS 中并与当前的硬件平台兼容的,提供了系统的硬件特性(例如某些设备的内 ...

  6. 检查一下计算机的acpi,科普一下acpi:acpi是什么?acpi有什么用?

    在我们的电脑操作系统中有很多重要的程序,比如acpi程序,很多朋友不知道acpi是什么,为了让大家对acpi有更好的了解和人事,今天小编就来跟你说说acpi是什么,希望对您有帮助. 在我们的电脑操作系 ...

  7. ACPI\HPQ0004、ACPI\HPQ0004

    本人机器HP 6531S 出于尝试WIN7的心理,今天把机器装成WIN7 ,设备管理器中,大部分设备的驱动都已经自动安装完成了. 还有两个设备没完成安装: 第一个设备是:ACPI\HPQ0004 第二 ...

  8. usb redirector for linux,USB Redirector(管理usb设备软件)V6.10.1 官方版

    USB Redirector(管理usb设备软件)是一款非常优秀的USB设备共享和管理软件.USB Redirector功能强大.操作简单,让用户更轻松的管理usb设备,极大的提高了用户的工作效率,非 ...

  9. http相关知识 - (2)状态管理 - session

    http相关知识 - (2)状态管理 - session 1. Session原理 (1)Session用于存储特定的用户会话所需的信息.Session对象的引入是为了弥补无状态HTTP协议的不足. ...

最新文章

  1. 基于组件的.NET软件开发(3)
  2. 开发日记-20190913 关键词 汇编语言王爽版 第一章
  3. React中的路由react-router
  4. 互联网思维之求职信,百战百胜
  5. zabbix监控搭建
  6. 继承性和层叠性 权重 盒模型 padding(内边距) border(边框) margin 标准文档流 块级元素和行内元素...
  7. MySQL为什么有时候会选错索引?
  8. 巴科斯范式BNF: Backus-Naur Form介绍
  9. python isalnum函数_Python 字符串 (isdigit, isalnum,isnumeric)转
  10. python编程语言优缺点_原创001 第一次接触这个神奇而又无所不能的编程语言:Python...
  11. Java ObjectStreamClass getSerialVersionUID()方法(带示例)
  12. bzoj3631: [JLOI2014]松鼠的新家
  13. apache2.2:使一个目录允许执行cgi程序
  14. caffe,caffe2 and pytorch
  15. CVPR学习(六):CVPR2019-目标跟踪
  16. 一个最简单的SPRINGMVC示例
  17. Java读取共享文件夹下面的文件(利用smb协议)
  18. 在线生成抖音风格的文字
  19. CReFF缓解长尾数据联邦学习(IJCAI 2022)
  20. Misc训练笔记(一)

热门文章

  1. MATLAB学习——数组类型
  2. Mysql 分学科拿取前三名的数据
  3. 茂名可视化3d建模,智慧城市园区数字孪生可视化,数字孪生可视化工厂
  4. Openpilot EP1:Openpilot开源项目深度解析
  5. 马云个人名义捐款华为_扒一扒马云的捐款
  6. 努力学习打卡Day03
  7. vue 项目种使用svg图标
  8. 判断是否是微信中打开网页
  9. 三极管放大电路(multisim实现,实测数据)
  10. 大数据和云计算技术周报(第169期)