usb设备描述符,usb请求,usb中断在固件中的处理框架 点击:373 | 回复:0



xilinxue

    
发表于:2010-03-31 13:00:37
楼主
如果你对usb描述符和usb标准请求有一个大体认识,并仔细了解了你所用芯片对usb中断处理方式,那下面的内容或许对你会一些帮助。
对usb描述符中要说两点,一.配置描述符,接口描述符,端点描述符三者是一起返回上位机的,接口描述符与端点描述符不能单独被返回。

二.usb是小端模式,注意wLength,wIndex,wValue这些双字节位域的赋值问题。

三.usb固件以usb中断,usb请求和usb描述符为基本框架进行编程,usb中断怎么处理各芯片会有差别,但大体都是产生usb中断后,固件进一步判断某一寄存器各个位来断定当前是usb何种中断,假设当前产生的是setup中断(端点0),那接下来就进行setup中断处理,在setup中断处理中我们就要通过标准请求来处理各种描述符。

void USB0_ISR(void) interrupt 8(这里的interrupt 8是C8051F340对中断的处理方式)
{
读相关寄存器来判断具体是usb何种中断
{
if 恢复中断
{
调用恢复中断处理函数
}
if 复位中断
{
复位中断处理
}
if setup中断
{
Handle_Setup(); // setup中断处理
}
挂起中断,端点中断(包括除端点0外不同端点的输入/输出中断,视具体要求)

}
//setup中断处理
void Handle_Setup(void)
{

1.从buffer中读取上位机发来的setup包
2.读取setup包各域进行分支处理(虽然过长的switch case不是好的编程思想,但是当用单片机做开发时考虑到单片机有限的存储空间,还是选switch case最合适)

switch(Setup.bRequest) //对标准请求中bRequest域进行判断处理
{
case GET_STATUS:
Get_Status();
break;
case CLEAR_FEATURE:
Clear_Feature();
break;
case SET_FEATURE:
Set_Feature();
break;
case SET_ADDRESS:
Set_Address(); //设置地址
break;
case GET_DEOR:
Get_Deor(); //获取设备描述符,你把准备好的设备描述符写到buffer里,等待上位机读buffer
break;
case GET_CONFIGURATION:
Get_Configuration(); //获取配置描述符
break;
case SET_CONFIGURATION:
Set_Configuration(); //设置配置描述符
break;
case GET_INTERFACE:
Get_Interface();
break;
case SET_INTERFACE:
Set_Interface();
break;
default:
Force_Stall();
break;
}
}

setup其它的域,wLength,wIndex,wValue在各描述符中处理。

各描述符的处理函数可放一单独文件中统一管理。

接下来写各除端点0的各端点的输入/输出中断处理函数以及读写buffer函数



楼主最近还看过

SSI ļʱ