USB HOST驱动中的内存分配

简介:

前面遇到过一个问题, USB HUB上只能接入有限的设备, 情况描述为:

HUB上接入两个U盘,后插入的会失败于建立第二个端偶的PIPE, Debug Message显示为

-CphysMem AllocateMemory: No memory available
-TDQueue: TDQueue - no memory for TD List
-CBulkPipe::OpenPipe - no memory for TD

问题位于 driver\ohcd2\Transfer.cpp   line 298  TDQueue::QueueInit().  再进一步, hcd\common\cphysmem.cpp的函数FindFreeBlock在while循环中失败

详细记录表面现象为:
BOT + CBIT   OK
BOT + BOT   OK
BOT + BOT + MOUSE  OK
BOT + BOT + MOUSE + KBD   KBD失败
BOT + CBIT + MOUSE  MOUSE失败
CBIT + CBIT   后面一个CBIT失败

很明显是内存分配出问题了, 我在新闻组上征求意见, Bruce Eitman (eMVP) 答复如下:
CPhysMem manages a pool of memory for use within the USB Host driver, Allocations from that pool can fail if there simply isn't enough memory to allocate or if it is fragmented. You can set the amount of memory available by changing the amout requested in calls to it's constructor

里面提到了constructor, 我查到usb host 初次调用CPhysMem时, 几种内存情况为:
Total Alloc Region size = 64K
Special Alloc REgion size = 4K
HighPri Alloc Region size = 16K
Normal Alloc Region size = 44K
调用路线:
SOhcdPdd::InitializeOHCI (bul_ohci.cpp)  ->  HcdMdd_CreateMemoryObject (Hcddriv.cpp)

所以修改点在bul_ohci.cpp开头的两个全局变量上
gc_TotalAvailablePhysicalMemory
gcHighPriorityPhysicalMemory

修改后问题果然解决. 使用时故意看了一下各种USB设备占用的内存量:
Logitech MOU :  4928 byte
CBIT U盘  :  20736 byte
BOT U盘:  14944 byte
Delux USB KBD:  7776 byte


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

相关文章
|
Linux Windows
反射内存卡驱动的安装
【8月更文挑战第28天】以下是反射内存卡驱动安装的一般步骤:首先确认内存卡型号及操作系统版本,并从制造商官网下载兼容的驱动程序。安装时,运行安装包,按提示接受许可协议,选择安装路径,连接内存卡,并完成安装,可能需重启计算机。最后,通过设备管理器验证安装是否成功,如遇问题可查阅相关文档或求助技术支持。
371 4
驱动保护 -- 向被保护的内存写数据
驱动保护 -- 向被保护的内存写数据
194 0
驱动保护 -- 向被保护的内存写数据
驱动保护 -- 向被保护的内存写数据
189 0
|
Linux 存储 缓存
蜕变成蝶~Linux设备驱动之CPU与内存和I/O
那是世上最远的距离 思念让我无法去呼吸 你的一动和一举 占据我心里 陪我每个孤独无尽的夜里  用我心中盛放的画笔 描绘你微笑时的绚丽 爱让人痛彻心底 我却不怀疑 你的存在是我生命的奇迹 感受你的每一次的呼吸 多想告诉你我有多爱你 如果我说我愿意 为你而死去 可否你的梦里留下我痕迹 无数悸动变换...
|
应用服务中间件 nginx 缓存
每个软件都自己把操作系统的host配置项加到内存中供频繁调用
nginx的转发,http_pass 转发到一个域名passport.ab.cn   那具体是到哪台机器上。   其实可以通过/etc/hosts文件来配置的。   可以理解,这个hosts文件是操作系统级别的,所有在这个操作系统上的软件都绕不过它。
901 0
|
安全
在驱动和应用程序间共享内存
<p class="p0" style="margin-top:0pt; text-indent:21pt; margin-bottom:0pt"><span style="font-family:黑体"><span style="font-size:10.5pt">在不同的场合,很多驱动编写人员需要在驱动和用户程序间共享内存。两种最容易的技术是:</span><span style="f
1607 0