原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://lancelot.blog.51cto.com/393579/247246
在USB设备初始化枚举过程中,需要发送一些设置命令到USB设备上,需要调用本函数来完成。函数的处理跟控制端口读数据差不多,只不过TD的数据传输方向设置不一样:
/**
*
通过控制端口发送设置数据的命令
* @
param pSetup Setup
包指针
* @
param *pData
数据缓冲区指针
*/
short
ctrlCmdSet(
unsignedint
pSetup,
unsignedchar
*pData)
{
//
初始化控制端点的
ED
AT91F_CreateEd(
(
unsignedint
) &controlEd,
// ED Address
64,
// Max packet
0,
// TD format
0,
// Skip
0,
// Speed
0x0,
// Direction
0,
// Endpoint
usbDevInfo.
addr
,
// Func Address
(
unsignedint
) &genTd[2],
// TDQTailPointer
(
unsignedint
) &genTd[0],
// TDQHeadPointer
0,
// ToggleCarry
0x0);
// NextED
//
控制端点的第一个
TD
,用于发送
Setup
包
AT91F_CreateGenTd(
(
unsignedint
) &genTd[0],
// TD Address
2,
// Data Toggle
TD_DELAY_INT,
// DelayInterrupt
TD_SETUP,
// Direction
1,
// Buffer Rounding
(
unsignedint
) pSetup,
// Current Buffer Pointer
(
unsignedint
) &genTd[1],
// Next TD
8);
// Buffer Length
//
控制端点的第二个
TD
,用于发送数据
AT91F_CreateGenTd(
(
unsignedint
) &genTd[1],
// TD Address
3,
// Data Toggle
TD_DELAY_INT,
// DelayInterrupt
TD_IN,
// Direction
1,
// Buffer Rounding
(
unsignedint
) pData,
// Current Buffer Pointer
(
unsignedint
) &genTd[2],
// Next TD
0);
// Buffer Length
//
标志
TD
队列结束的最后一个
TD
,设置为空
AT91F_CreateGenTd(
(
unsignedint
) &genTd[2],
// TD Address
3,
// Data Toggle
TD_DELAY_INT,
// DelayInterrupt
TD_OUT,
// Direction
1,
// Buffer Rounding
0x0,
// Current Buffer Pointer
(
unsignedint
) 0,
// Next TD
0x0);
// Buffer Length
//
调用底层接口把数据发送出去
ohciCtrlXfer(&controlEd);
usbRunCmd(USB_CMD_TYPE_CTRL_WRITE, 2);
return
0;
}
|