做usb复合设备,用mass storage的例程修改了一个SPI FLASH模拟U盘的代码,还算顺利能够正常工作。工作要求再加一个功能利用BULK传输数据,实现一个composite device。设备复合好之后,也能枚举出两个设备来,U盘功能能够正常使用,而自定义的设备无法安装驱动。查找下是否下位机代码的问题,之前移植模拟U盘代码的时候是移植的,也没怎么分析各个文件。利用这个机会逐个分析下。
usb_istr.c主要由3部分组成:
第一部分:
void (*pEpInt_IN[7])(void) =
{
EP1_IN_Callback,
EP2_IN_Callback,
EP3_IN_Callback,
EP4_IN_Callback,
EP5_IN_Callback,
EP6_IN_Callback,
EP7_IN_Callback,
};
这里是7个端点IN的调用函数,这7个函数实现于usb_endp.c中。
第二部分:
void (*pEpInt_OUT[7])(void) =
{
EP1_OUT_Callback,
EP2_OUT_Callback,
EP3_OUT_Callback,
EP4_OUT_Callback,
EP5_OUT_Callback,
EP6_OUT_Callback,
EP7_OUT_Callback,
};
这里是7个端点OUT的调用函数,这7个函数实现于usb_endp.c中。
第三部分:
void USB_Istr(void)
{
wIstr = _GetISTR() //读取USB中断状态寄存器
。。。。。。 // 各种各样的中断处理函数
}
这里是对USB8种中断的处理。最常用的就是传输正确中断(CTR)。当然还有挂起中断,唤醒中断,复位请求,错误等。
usb_istr.c的的中断是如何与我们的ENx_XX_Callback()的函数结合起来的呢?我只看了最常用的正确传输中断
。中断传输正确时候 调用CTR_LP();(在usb_istr.c)。而CTR_LP()得函数在usb_int.c中实现。CTR_LP()函数则调用了pEpInt_IN【7】 ,pEpInt_OUT【7】中定义的函数入口。pEpInt_IN【7】 ,pEpInt_OUT【7】中定函数的定义在usb_endp.c种显示。以EP1_OUT_Callback()为例,它的实现又跑到了usb_bot.c中实现。
这样这3个文件就可以关联起来了。