puppypyb
驱动牛犊
驱动牛犊
  • 注册日期2003-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分52分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1524回复:13

求助:d12中的一个概念性问题!!!

楼主#
更多 发布于:2003-02-16 02:11
  
  菜鸟有一事不明,望各路大虾不吝赐教!
      
 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);
 
      想问: 其中的成员的值是怎么来的,谁给的?
xjLegend
驱动小牛
驱动小牛
  • 注册日期2002-11-04
  • 最后登录2005-06-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-16 10:43
请参看USB 1.1协议第九章,USB-HOST之间的通信协议
我想要点分,这样才有成就感嘛!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-16 13:29
看你固件程序里的setup中断的处理函数,这个结构里存放的就是8个字节的setup包里的内容,赋值也是在那里,
我觉得你的固建立应该是SetupToken_Handler( )函数,你看有没有? :D
puppypyb
驱动牛犊
驱动牛犊
  • 注册日期2003-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分52分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-17 23:24
找不到那个函数,我用的是philips的!
我老是找不到 程序给它们赋值的地方!

还是先看看第九章吧我!
alien75
驱动牛犊
驱动牛犊
  • 注册日期2002-03-12
  • 最后登录2011-07-26
  • 粉丝1
  • 关注0
  • 积分68分
  • 威望163点
  • 贡献值1点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-18 09:51
这个玩意应该是host端发过来的,在固件端只是判断描述符的类型和索引值。
puppypyb
驱动牛犊
驱动牛犊
  • 注册日期2003-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分52分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-18 11:18
jinghuiren !
你用的是哪个的固件?
我用的phlips的 ,不过和周立功的差不离

固件里没有你说的那个函数, 麻烦您给小弟细说一下 ^_^
iamchine
驱动小牛
驱动小牛
  • 注册日期2002-11-18
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-18 11:41
如楼上所说,在规范第9章里有说明,该值随请求类型的不同而不同,有的可能是固件根据规范赋的,有的是主机下发的。你可以查查get_descriptor等等处理的函数
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-18 14:54
jinghuiren !
你用的是哪个的固件?
我用的phlips的 ,不过和周立功的差不离

固件里没有你说的那个函数, 麻烦您给小弟细说一下 ^_^


我用的也是philips的,看在你给我放了十分的面子上,我帮你找一下子! :D
我手头上没有1.1的文件,我用的2.0的.是这样的,你看isr.c文件里是不是有一个叫ep0setup()的函数,一般得有setup的字样,然后看这个函数里是不是调用了包含Token字符的函数,这个函数应该实在主程序里实现的,里面开头除了一下变量初始化之外,还有一个读取setup端点的函数,赋值就在这里了!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
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
puppypyb
驱动牛犊
驱动牛犊
  • 注册日期2003-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分52分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-02-18 16:45
真是太感谢了 crying !

对你的景仰之情如长江之水滔滔不绝,黄河水之泛滥........
puppypyb
驱动牛犊
驱动牛犊
  • 注册日期2003-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分52分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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大虾认为是不是如此?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-02-19 10:12
呵呵,终于被你找到了,其实我觉得你对固件的理解还是不够深入,而且有些程序段你还不明白是干什么用的,对吧,那就加油干吧,有什么问题大家可以帮你。 :)
dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-02-19 15:51
总算找到了,呵呵。 :D
puppypyb
驱动牛犊
驱动牛犊
  • 注册日期2003-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分52分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-02-19 21:40
  感动!  集体真温暖 55555
  谢谢虾们!
游客

返回顶部