liquan00021416
驱动牛犊
驱动牛犊
  • 注册日期2004-02-28
  • 最后登录2006-08-23
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1545回复:5

请教:关于D12总线供电与自供电固件编程上的一个问题。

楼主#
更多 发布于:2004-03-20 18:34
    看了一些下载的周立功的USB D12 SMART开发板的固件程序,也看了周立功的《PDIUSBD12固件编程与驱动开发》一书上的固件程序,发现了一个关于总线供电与自供电上的问题,现请教如下,望各位大侠赐教。
    我知道配置描述符中定义了设备的配置信息,其中包括了设备是总线供电还是自供电,以及所需的最大电流。固件程序是这样的:
//配置描述符
code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
    sizeof(USB_CONFIGURATION_DESCRIPTOR),
    USB_CONFIGURATION_DESCRIPTOR_TYPE,
    SWAP(CONFIG_DESCRIPTOR_LENGTH),
1,
1,
           0,
0xa0, //总线供电,支持远程唤醒
0x32  //最大功耗(100mA)
};
    该配置描述符明确表示了设备是采用总线供电的。

    但是在USB的标准设备请求中还有一个Get Status请求,可以用来获取设备、接口或端点的状态。而在获取设备状态的Get Status请求中返回的两个字节数据也是关于供电方式以及是否支持远程唤醒的。固件程序是这样的:
//获取状态
void get_status(void)
{
unsigned char endp, txdat[2];
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
unsigned char c;
if (bRecipient == USB_RECIPIENT_DEVICE)  //获取设备状态
{
if(bEPPflags.bits.remote_wakeup == 1)    //获取远程唤醒状态

txdat[0] = 3;    //支持远程唤醒,自供电

else

txdat[0] = 1;    //不支持远程唤醒,自供电


txdat[1]=0;      //保留为0

single_transmit(txdat, 2);

}
else if (bRecipient == USB_RECIPIENT_INTERFACE)
{                                         //获取接口状态

txdat[0]=0;

txdat[1]=0;

single_transmit(txdat, 2);

} else if (bRecipient == USB_RECIPIENT_ENDPOINT)
{        
                                //获取端点状态
endp =
(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);

if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)

c = D12_SelectEndpoint(endp*2 + 1);
else

c = D12_SelectEndpoint(endp*2);

if(c & D12_STALL)

txdat[0] = 1;

else

txdat[0] = 0;
txdat[1] = 0;

single_transmit(txdat, 2);

} else

stall_ep0();

}
    在获取设备状态的Get Status请求中返回的数据却又表明了设备是自供电的。请问各位大侠,这是不是和配置描述符中的描述有矛盾?
liquan00021416
驱动牛犊
驱动牛犊
  • 注册日期2004-02-28
  • 最后登录2006-08-23
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-23 16:11
我懂了!谢谢!
onlyxiaoyu
驱动牛犊
驱动牛犊
  • 注册日期2004-02-22
  • 最后登录2005-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-23 07:49
受到了一点启发
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-22 23:10
首先,先解释远程唤醒。
远程唤醒本身是设备可以动态修改的选项,当然也支持上位机设定(通过Set or Clear Feature完成)。所以,它的问题可以到此为止。

其次,关于供电问题。
事实上,无论你选择那种供电方式,总线都会毫不犹豫地供电出来,而且并没有限制你的电流大小。那么电流限制起到什么作用了呢?迄今为止,它仅仅用于ACPI, 用来计算系统用电负荷,当采用电池供电时,可以算出还能工作多久。

但如果仅仅理解到这里,就有点小气了。应该认为:如果将来硬件可能,供电可能会受到事实上的限制。所以我们不应该鼓励自己利用现在的现实,因为这样的设计可能会在未来产生问题。就像尽量不能使用"Windows未公开的秘密"一样。

总的来说,像周立功提供的代码肯定不是一个优秀的设计。什么东西可用和优秀不是一个概念。
A strong man can save himself. A great man can save another.
sirenfox
驱动牛犊
驱动牛犊
  • 注册日期2004-02-13
  • 最后登录2004-05-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-22 20:58
同关注,这两个不是一个东东把,
用bushound截取u盘和其他的反正是合理的
yangzg
驱动牛犊
驱动牛犊
  • 注册日期2004-01-02
  • 最后登录2004-10-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-22 18:04
关注::::
游客

返回顶部