阅读:1524回复:13
求助:d12中的一个概念性问题!!!菜鸟有一事不明,望各路大虾不吝赐教! typedef struct _device_request { unsigned char bmRequestType; unsigned char bRequest; unsigned short wValue; unsigned short wIndex; unsigned short wLength; } DEVICE_REQUEST; 看下面的这个语句,调用了成员wValue uchar bDescriptor = MSB(ControlData.DeviceRequest.wValue); 想问: 其中的成员的值是怎么来的,谁给的? |
|
沙发#
发布于:2003-02-16 10:43
请参看USB 1.1协议第九章,USB-HOST之间的通信协议
|
|
|
板凳#
发布于:2003-02-16 13:29
看你固件程序里的setup中断的处理函数,这个结构里存放的就是8个字节的setup包里的内容,赋值也是在那里,
我觉得你的固建立应该是SetupToken_Handler( )函数,你看有没有? :D |
|
地板#
发布于:2003-02-17 23:24
找不到那个函数,我用的是philips的!
我老是找不到 程序给它们赋值的地方! 还是先看看第九章吧我! |
|
地下室#
发布于:2003-02-18 09:51
这个玩意应该是host端发过来的,在固件端只是判断描述符的类型和索引值。
|
|
5楼#
发布于:2003-02-18 11:18
jinghuiren !
你用的是哪个的固件? 我用的phlips的 ,不过和周立功的差不离 固件里没有你说的那个函数, 麻烦您给小弟细说一下 ^_^ |
|
6楼#
发布于:2003-02-18 11:41
如楼上所说,在规范第9章里有说明,该值随请求类型的不同而不同,有的可能是固件根据规范赋的,有的是主机下发的。你可以查查get_descriptor等等处理的函数
|
|
7楼#
发布于:2003-02-18 14:54
jinghuiren ! 我用的也是philips的,看在你给我放了十分的面子上,我帮你找一下子! :D 我手头上没有1.1的文件,我用的2.0的.是这样的,你看isr.c文件里是不是有一个叫ep0setup()的函数,一般得有setup的字样,然后看这个函数里是不是调用了包含Token字符的函数,这个函数应该实在主程序里实现的,里面开头除了一下变量初始化之外,还有一个读取setup端点的函数,赋值就在这里了! |
|
8楼#
发布于:2003-02-18 15:16
给你找着了:
在usb_isr()函数中有下面这两行 if(D12IS_ENDP0OUT) ep0_rxdone(); 上面这个函数的实现如下 void ep0_rxdone(void) { ISR_eplts = Hal4D12_ReadLastTransactionStatus(0); // Clear interrupt flag if (!D12EP0LTS_SUCCESS) return; //注意此处,如果是主机发来的setup包,那么就把DCPFSMstate设为setup请求,这个请求是在主程序里处理的. if (D12EP0LTS_SETUP) { if(DCPFSM_SetupProc || DCPFSM_Dataout || DCPFSM_Datain ) { D12BF_SetupOverwritten = 1; } DCPFSMstate = USBFSM4DCP_SETUPPROC;//USBFSM4DCP_SETUPPROC =0x01 } //下面这个函数是setup包的处理函数,首先要接受8字节的setup包,然后再作相应的处理. void MLsup_USBSetupTokenHandler(void) { D12BF_SetupOverwritten = 0; DCPXfer_wResidue = 0; //看下面这一行,等号右端的函数的实现在hal4d12.c中,你可以自己去看一下,它有三个参数,第一个是端点号,第二个是读取得字节数,第三个是存储的地址指针,你看一下第三个参数是什么? :D 它的声明在主函数文件mainloop里:STRUC_EXT DEVICE_REQUEST DATA_SEG DCPDeviceRequest; tempvars4UsbReq.chars.c0 = Hal4D12_ReadEndpoint(0, sizeof(DEVICE_REQUEST),(INT8 *)(&(DCPDeviceRequest))); if( tempvars4UsbReq.chars.c0 == sizeof(DEVICE_REQUEST) ) { DCPDeviceRequest.wValue = Hal4Sys_SwapINT16(DCPDeviceRequest.wValue); DCPDeviceRequest.wIndex = Hal4Sys_SwapINT16(DCPDeviceRequest.wIndex); DCPDeviceRequest.wLength = Hal4Sys_SwapINT16(DCPDeviceRequest.wLength); 如果跟你的程序不一样,但是philips的程序风格差不多,你可以自己根据蛛丝马迹找一下子哈. :D |
|
9楼#
发布于:2003-02-18 16:45
真是太感谢了 crying !
对你的景仰之情如长江之水滔滔不绝,黄河水之泛滥........ |
|
10楼#
发布于:2003-02-18 19:12
就是下面这个吧? void ep0_rxdone(void) { unsigned char ep_last, i; ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag if (ep_last & D12_SETUPPACKET)//判断最后成功接受的信息包中 // 是否包含有一个setup标志 { ControlData.wLength = 0; ControlData.wCount = 0; //判断端点是否满,如是,则取出 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest), (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) D12_ReadEndpoing( )这个函数的第三个参数 (unsigned char *)(&(ControlData.DeviceRequest)) 就是请求的地址 那么该函数从该地址读出的数据就是所赋的值 ! 不知jing大虾认为是不是如此? |
|
11楼#
发布于:2003-02-19 10:12
呵呵,终于被你找到了,其实我觉得你对固件的理解还是不够深入,而且有些程序段你还不明白是干什么用的,对吧,那就加油干吧,有什么问题大家可以帮你。 :)
|
|
12楼#
发布于:2003-02-19 15:51
总算找到了,呵呵。 :D
|
|
13楼#
发布于:2003-02-19 21:40
感动! 集体真温暖 55555
谢谢虾们! |
|