发 帖  
原厂入驻New

FPGA固件开发-设备收发器模块的请求回复状态实现

2018-11-28 15:01:34  699 FPGA 收发器 模块
分享
请求回复状态的功能就是对各个请求作出响应。USB 的标准请求已经在前面做了介绍,下面就以获取描述符请求为例介绍一下请求响应的实现方法,其他的标准请求以及厂商请求(获取、设置密码)相对来说比较简单,实现的方法请读者参考源代码。

获取描述符请求是最为重要的请求,因为这在设备枚举过程中是必需的,它是主机了解设备的第一个步。获取描述符请求的处理流程如图 6-47 所示。
12.jpg
获取设备描述符请求响应的实现代码如下:

  1. -- 获取描述符请求响应状态
  2. when TS_SEND_DESCRIPTOR =>
  3. handle_step := 0;
  4. active_ep := X"01";
  5. -- 判断是否是设备请求
  6. IF ts_data(ADDRESS_DESCRIPTOR_TYPE) = TYPE_DEVICE_DESCRIPTOR then
  7. -- LED 输出,提示作用
  8. led(0) <= '0';
  9. -- 检查数据长度是否符合要求
  10. if data_length > LENGTH_DEVICE_DESCRIPTOR then
  11. data_length := LENGTH_DEVICE_DESCRIPTOR;
  12. end if;
  13. -- 判断描述符长度是否超过端点 0 的缓存大小
  14. if data_length > LENGTH_ENDPOINT0_BUFFER then
  15. to_write := LENGTH_ENDPOINT0_BUFFER;
  16. is_transmit := '1';
  17. else
  18. to_write := data_length;
  19. end if;
  20. -- 设置传输状态标志位,设置传输数据源(描述符)以及数据长度
  21. data_count := to_write;
  22. ram_address := ADDRESS_DEVICE_DESCRIPTOR;
  23. -- 准备转入进入控制输入状态(TS_WRITE_ENDPOINT),发送数据
  24. ts_state <= TS_WRITE_ENDPOINT;
  25. elsif ts_data(ADDRESS_DESCRIPTOR_TYPE) = TYPE_CONFIGURATION_DESCRIPTOR then
  26. -- 检查数据长度,LED 输出,提示作用
  27. if data_length > LENGTH_CONFIGURATION_DESCRIPTOR then
  28. data_length := LENGTH_CONFIGURATION_DESCRIPTOR;
  29. led(2) <= '0';
  30. else
  31. led(1) <= '0';
  32. end if;
  33. -- 判断描述符长度是否超过端点 0 的缓存大小
  34. if data_length > LENGTH_ENDPOINT0_BUFFER then
  35. to_write := LENGTH_ENDPOINT0_BUFFER;
  36. is_transmit := '1';
  37. else
  38. to_write := data_length;
  39. end if;
  40. -- 设置传输状态标志位,设置传输数据源(描述符)以及数据长度
  41. data_count := to_write;
  42. ram_address := ADDRESS_CONFIGURATION_DESCRIPTOR;
  43. -- 设置传输状态标志位,设置传输数据源(描述符)以及数据长度
  44. ts_state <= TS_WRITE_ENDPOINT;
  45. else
  46. ts_state <= TS_IDLE;
  47. end if;
  48. last_ts_state := TS_END_REQUESTHANDLER;
复制代码


获取描述符请求的仿真波形可以参考图 6-47 所示。
0
2018-11-28 15:01:34   评论 分享淘帖

相关讨论

只有小组成员才能发言,加入小组>>

216个成员聚集在这个小组

加入小组

热门话题

创建小组步骤

关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表