PowerManager & Wake-up Function of USB Client

简介:

今天下午只是大概了解了一下,流程中的一些地方看不到代码, 所以这些看不到代码的地方只能猜想WINCE的行为了.

首先是注意到bul_usbfn.cpp里的BulUsbDevice::SetPowerState函数. 这是由UfnPdd_IOControl调用的, 这和WINCE HELP里的要求一致. 而根据WINCE HELP, 设备应该有D0~D4五种电源状态,而实际上PXA27X的USB只有POWER ON和POWER OFF两种状态, 所以该函数的开头作了一下几种状态的判断转换.  

接下来驱动里调用了一个API: SetDevicePowerState,   这个API的具体代码看不到.文档上说This function requests that the bus driver set this device to the power state specified by PowerState. 但比较纳闷的是这函数不应该从硬件上操作模块的寄存器啊,因为这是下一步做的.

然后就调用BulUsbDevice::PowerMgr(FLASE)进行硬件操作, 把UDE关掉.值得注意的是在USB初始化和关闭函数中,UDE的开启关闭和USB CLOCK的开启关闭都是同时的,但是这里的USB的CLOCK并没有关闭. 我个人猜测这应该就是为了后面把USB的SYSINTR发给系统WAKE-UP用的. 也就是说UDE关掉,CLOCK开启, 那么模块的IRQ还是能进来并转换为SYSINTR的.

下面几行就是针对D0~D4进行操作, 其中D1,D2状态已经合并到D0状态.其中注意各状态和IOCTL_HAL_DISABLE_WAKE, IOCTL_HAL_ENABLE_WAKE的对应关系. 而这两个IOCTL操作, 是在oal_ioctl_tab.h里和OAL函数相对应成一个TABLE. 我们只看与电源管理相关的三个:

{ IOCTL_HAL_DISABLE_WAKE,                   0,  OALIoCtlHalDisableWake      },
{ IOCTL_HAL_ENABLE_WAKE,                    0,  OALIoCtlHalEnableWake       },
{ IOCTL_HAL_GET_WAKE_SOURCE,          0,  OALIoCtlHalGetWakeSource    },

所对应的三个函数在platformname\src\common\power\pxa27x\ioctl.c里面可以看到.这个是由OEM完成的. 也就是说, 驱动里调了KernelIoControl, KernelIoControl里又调了OALIoCtlHalxxxxxxx. 而KernelIoControl里面的操作是不可见的.

好象扯远了,回头看BulUsbDevice::SetwerState函数, 调用KernelIoControl(IOCTL_HAL_ENABLE_WAKE, &m_dwSysIntr,  sizeof(m_dwSysIntr), NULL, 0, NULL) 就是让USB的系统中断号SYSINTR能够把系统从SLEEP状态里WAKE-UP起来. 而具体这步操作, 在PM的OALIoCtlHalEnableWake函数里实现, 修改了PXA27X Clock & Power Manager里面的寄存器, 在硬件上ENABLE指定模块的唤醒功能.

再下面是要求开电源时, 操作硬件开启UDE的代码.

那么总结一下流程,假设现在USB CLIENT的电源状态为D0,全开, 而这时系统要进入SLEEP状态, 这时候系统就根据注册表中的值来决定把USB CLIENT切换到D3状态. 通过IOCTL函数告知USB CLIENT DRIVER, 一路走到SetPowerState. 这时候D3<D0, 所以把UDE关闭, 但保持USB CLIENT CLOCK开启. 接着通过KernelIoControl去和那个IOCTL映射表去修改power manager register,使能USB CLIENT的唤醒功能.

系统进入SLEEP状态并且USB CLIENT WAKE-UP ENABLE后,如果来了个USB CLIENT的中断,那么我个人猜想该IRQ转换成SYSINTR后应该不是去走USB驱动里的IST了,而是通知系统WAKE-UP.系统被唤醒后,反过来改变USB CLIENT的POWER STATE为D0, 从而禁能USB CLIENT的WAKE-UP功能, 同时开启UDE. 然后是个人猜测UDE被开启后才使得该IRQ进到驱动的IST中处理 . 系统完全运行起来.

这篇文章是为了记录下午的思路, 很多地方没有看到代码或没有严格论证,想当然地推倒, 是很不严谨的.


本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2006/02/05/325594.html,如需转载请自行联系原作者

相关文章
|
21天前
|
资源调度 Serverless 计算机视觉
高斯函数 Gaussian Function
**高斯函数,或称正态分布,以数学家高斯命名,具有钟形曲线特征。关键参数包括期望值μ(决定分布中心)和标准差σ(影响分布的宽度)。当μ=0且σ²=1时,分布为标准正态分布。高斯函数广泛应用于统计学、信号处理和图像处理,如高斯滤波器用于图像模糊。其概率密度函数为e^(-x²/2σ²),积分结果为误差函数。在编程中,高斯函数常用于创建二维权重矩阵进行图像的加权平均,实现模糊效果。
14 1
|
1月前
|
算法 Serverless C语言
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
30 1
|
1月前
|
存储 安全 编译器
【C++ 包装器类 std::function 和 函数适配器 std::bind】 C++11 全面的std::function和std::bind的入门使用教程
【C++ 包装器类 std::function 和 函数适配器 std::bind】 C++11 全面的std::function和std::bind的入门使用教程
32 0
|
1月前
|
SQL Oracle 关系型数据库
Flink的表值函数(Table-Valued Function,TVF)是一种返回值是一张表的函数
【2月更文挑战第17天】Flink的表值函数(Table-Valued Function,TVF)是一种返回值是一张表的函数
20 1
|
6月前
|
存储 数据安全/隐私保护
均匀散列函数(Uniform Hash Function)
均匀散列函数(Uniform Hash Function)是一种将不同长度的输入数据映射到相同大小的输出数据的散列函数。均匀散列函数的主要特点是,对于相同的输入数据,无论其长度如何,都会得到相同的输出散列值。这种散列函数常用于数据结构的存储和查找,例如哈希表、散列表等。
99 3
|
3月前
|
存储 SQL 安全
函数(Function)和存储过程(Stored Procedure)的区别(小白情感版)
函数(Function)和存储过程(Stored Procedure)的区别(小白情感版)
34 0
|
3月前
|
缓存
pytest 运行测试函数报错的解决办法 TypeError: calling <function xxx> returned None, not a test
pytest 运行测试函数报错的解决办法 TypeError: calling <function xxx> returned None, not a test
96 0
|
3月前
|
数据库
SAP ABAP 更新函数(Update Function Module)执行出错的原因分析试读版
SAP ABAP 更新函数(Update Function Module)执行出错的原因分析试读版
35 0
|
3月前
|
数据库
130. SAP ABAP 更新函数(Update Function Module)执行出错的原因分析
130. SAP ABAP 更新函数(Update Function Module)执行出错的原因分析
25 0
|
4月前
|
SQL
Greenplum【SQL 03】实现树结构+自定义函数+避免函数重复调用+ function cannot execute on a QE slice 问题处理(优化过程全记录)
Greenplum【SQL 03】实现树结构+自定义函数+避免函数重复调用+ function cannot execute on a QE slice 问题处理(优化过程全记录)
34 0

热门文章

最新文章