打印

STM32 USB库中为何要交换wValue和wIndex的字节序

[复制链接]
2954|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zapphire|  楼主 | 2011-9-16 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
移植一个AVR的程序到STM32,发现USB库中无聊的交换了wValue和wIndex的字节序。如下代码:
   pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */
    pInformation->USBbRequest = *pBuf.b++; /* bRequest */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwIndex  = ByteSwap(*pBuf.w++); /* wIndex */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwLength = *pBuf.w; /* wLength */


搜索所有的历程,只有DFU用到word值,还蛋疼的再交换回来,如下:
  B0 = pInfo->USBwValues.bw.bb0;
  B1 = pInfo->USBwValues.bw.bb1;
  wBlockNum = (uint16_t)B1;
  wBlockNum = wBlockNum * 0x100;
  wBlockNum += (uint16_t)B0; /* wBlockNum value updated*/

  B0 = pInfo->USBwLengths.bw.bb0;
  B1 =  pInfo->USBwLengths.bw.bb1;
  wlength = (uint16_t)B0;
  wlength = wlength * 0x100;
  wlength += (uint16_t)B1; /* wlength value updated*/


USB传输和STM32都是little-endian字节序,为何要多此一举呢?有达人可以给解释一下吗?
沙发
IJK| | 2011-9-16 12:03 | 只看该作者
我估计写STM32 USB库的人,如LZ所说,就是多此一举。
也或许 STM32 USB库是从ST很老的ST7 USB库修改而来,而ST7是big endian的,所以会有这样的遗留问题。

如果LZ觉得不爽,把这些冗余地方去掉好了

使用特权

评论回复
板凳
zapphire|  楼主 | 2011-9-16 12:11 | 只看该作者
本帖最后由 zapphire 于 2011-9-16 13:08 编辑

我也估计是历史遗留问题,从big-endian移植的结果。

第一次用ST的产品,这个问题还是挺扯的,应该算bug,USB定义为word,在MCU内应用层就应该以word的形式可以访问到正确的值。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

1

粉丝