基本固件框架的追踪研读之SETUP命令的处理5
来源:互联网 发布:开源的java开发平台 编辑:程序博客网 时间:2024/06/01 16:17
书接上回
接下来,是响应“读取状态请求”:
case SC_GET_STATUS: // *** Get Status
同样,if(DR_GetStatus())可以不予理会。由文档可知,获取状态又可分为三部分:1、获取设备状态:牵涉到远程唤醒和自供电位;2、获取端口状态:牵涉到停止位;3、获取接口状态:USB规格保留使用。
固件判断SETUPDAT[0],识别是哪一种获取状态请求,关于判断的依据,可以看下面的文档部分:
#define GS_DEVICE 0x80 // Get Status: Device#define GS_INTERFACE 0x81 // Get Status: Interface#define GS_ENDPOINT 0x82 // Get Status: End Point
case GS_DEVICE: // Device EP0BUF[0] = ((BYTE)Rwuen << 1) | (BYTE)Selfpwr; EP0BUF[1] = 0; EP0BCH = 0; EP0BCL = 2; break;
固件返回的是:支持远程唤醒,USB供电。
case GS_INTERFACE: // Interface EP0BUF[0] = 0; EP0BUF[1] = 0; EP0BCH = 0; EP0BCL = 2; break;
case GS_ENDPOINT: // End Point EP0BUF[0] = *(BYTE xdata *) epcs(SETUPDAT[4]) & bmEPSTALL; EP0BUF[1] = 0; EP0BCH = 0; EP0BCL = 2; break;
文档中的说明如下:
SETUPDAT[4],用于说明是哪个端点,且其BIT7标明的端点的方向。STALL位,在EPxCS寄存器里。
// macro for generating the address of an endpoint's control and status register (EPnCS)#define epcs(EP) (EPCS_Offset_Lookup_Table[(EP & 0x7E) | (EP > 128)] + 0xE6A1)
这个宏用于产生EP所对应的端点的控制状态寄存器的地址(不包含EP0):1、(EP & 0x7E):是哪个端点?2、(EP > 128):是输入端点还是输入端点?3、EPCS_Offset_Lookup_Table[(EP & 0x7E) | (EP > 128)],查找数组,这个数组是所有端点(不包含EP0)控制状态寄存器地址的偏离值:
// this table is used by the epcs macro const char code EPCS_Offset_Lookup_Table[] ={ 0, // EP1OUT 1, // EP1IN 2, // EP2OUT 2, // EP2IN 3, // EP4OUT 3, // EP4IN 4, // EP6OUT 4, // EP6IN 5, // EP8OUT 5, // EP8IN};
4、0xE6A1是端点控制状态寄存器地址的基数:
*(BYTE xdata *) epcs(SETUPDAT[4])则是提取对应地址的内容;*(BYTE xdata *) epcs(SETUPDAT[4]) & bmEPSTALL则是仅保留STALL的状态。 需要注意的是,一旦固件设置了STALL位,就只能由Host发送Clear Feature/Stall request来清除。不过,EP0是例外,为了防止在控制传输的时候设备锁死:
最后,别忘了default:
default: // Invalid Command EZUSB_STALL_EP0(); // Stall End Point 0
0 0
- 基本固件框架的追踪研读之SETUP命令的处理5
- 基本固件框架的追踪研读之SETUP命令的处理1
- 基本固件框架的追踪研读之SETUP命令的处理2
- 基本固件框架的追踪研读之SETUP命令的处理3
- 基本固件框架的追踪研读之SETUP命令的处理4
- 基本固件框架的追踪研读之SETUP命令的处理6
- 基本固件框架的追踪研读之SETUP命令的处理7
- 基本固件框架的追踪研读之USB事务处理
- 基本固件框架的追踪研读之描述符1
- 基本固件框架的追踪研读之USB控制传输
- EZ-USB固件框架的追踪研读之main函数1
- EZ-USB固件框架的追踪研读之main函数2
- EZ-USB固件框架的追踪研读之main函数3
- 追踪研读法破解EZ-USB的“远程唤醒”
- GDI对位图文件的基本处理
- 用Source Insight追踪Arduino的setup和loop
- 【Darwin学习笔记】之QTSSReflectorModule的Setup消息处理
- 【Darwin学习笔记】之QTSSReflectorModule的Setup消息处理
- mybatis执行批量更新batch update 的方法(oracle,mysql)
- Intent传值的使用
- Xcode 插件
- sharesdk
- Xencenter管理Localstorage执行scan时报错:Error code: SR_BACKEND_FAILURE_46
- 基本固件框架的追踪研读之SETUP命令的处理5
- [BZOJ 3343]教主的魔法
- maven系列(一)
- Android接口解析方法
- 性能测试脚本开发(C&C#&Java)
- 【Android应用开发技术:媒体开发】音频
- 设置控件某个地方的圆角属性
- UIKit Dynamics 教程:抛掷 Views
- 线索二叉树模型的建立与遍历