📄 usb_package.vhd
字号:
---------------------------------------------------------------------------------------------------
--
-- File : USB_PACKAGE.vhd
-- Create Time : Fri Apr 16 20:39:30 2004
-- Title : USB_PACKAGE
-- Design : USB Interface IP Core
-- Author : Lou Xinghua (louxinghua99@mails.tsinghua.edu.cn)
-- Company : Department of Engineering Physics in Tsinghua Unversity, Beijing, China
-- Version : 1.0
--
---------------------------------------------------------------------------------------------------
--
-- Description :
-- USB Package, where device detail information included.
-- Written by Lou Xinghua
--
---------------------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package USB_PACKAGE is
--------------------------------------------------------------------------------------------------
-- Custom Type
---------------------------------------------------------------------------------------------------
type REG256x8 is array(0 to 255) of std_logic_vector( 7 downto 0 );
type REG8x8 is array(0 to 7) of STD_LOGIC_VECTOR(7 downto 0);
type REG8x1 is array(0 to 7) of STD_LOGIC;
subtype INTEGER8 is INTEGER range 0 to 255;
---------------------------------------------------------------------------------------------------
-- State Machine
---------------------------------------------------------------------------------------------------
type TRANSEIVER_STATE
is (TS_DISCONNECTED,
TS_CONNECTING,
TS_IDLE,
TS_END_REQUESTHANDLER,
TS_READ_IR,
TS_READ_LTS,
TS_BUSRESET,
TS_SUSPENDCHANGE,
TS_EP0_RECEIVE,
TS_EP0_TRANSMIT,
TS_EP2_RECEIVE,
TS_EP2_TRANSMIT,
TS_END_RECEIVE,
TS_END_TRANSMIT,
TS_SEND_DESCRIPTOR_1ST,
TS_SEND_DESCRIPTOR,
TS_SET_ADDRESS,
TS_SET_CONFIGURATION,
TS_GET_CONFIGURATION,
TS_GET_INTERFACE,
TS_SEND_STATUS,
TS_CLEAR_FEATURE,
TS_SET_FEATURE,
TS_SET_INTERFACE,
TS_READ_ENDPOINT,
TS_WRITE_ENDPOINT,
TS_STALL,
TS_ERROR);
type INT_HANDLE_STATE
is (IH_START,
IH_READ_LTS,
IH_ACK_ENDPOINT,
IH_END_RECEIVE,
IH_RECEIVE,
IH_ENABLE_EP,
IH_DISABLE_EP,
IH_IDLE);
type REQUEST_HANDLER_STATE
is (RH_IDLE,
RH_ERROR);
-- Request Handler Command
constant RH_SEND_DESCRIPTOR_1ST: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant RH_SEND_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant RH_SET_ADDRESS: STD_LOGIC_VECTOR(7 downto 0) := X"02";
constant RH_SET_CONFIGURATION: STD_LOGIC_VECTOR(7 downto 0) := X"03";
constant RH_SEND_CONFIGURATION: STD_LOGIC_VECTOR(7 downto 0) := X"04";
constant RH_SEND_INTERFACE: STD_LOGIC_VECTOR(7 downto 0) := X"05";
constant RH_SEND_STATUS: STD_LOGIC_VECTOR(7 downto 0) := X"06";
constant RH_CLEAR_FEATURE: STD_LOGIC_VECTOR(7 downto 0) := X"07";
constant RH_SET_FEATURE: STD_LOGIC_VECTOR(7 downto 0) := X"08";
constant RH_SET_INTERFACE: STD_LOGIC_VECTOR(7 downto 0) := X"09";
constant RH_INVALID_COMMAND: STD_LOGIC_VECTOR(7 downto 0) := X"FF";
---------------------------------------------------------------------------------------------------
-- USB Protocol Constant
---------------------------------------------------------------------------------------------------
-- Descriptor Packet Size
constant SIZE_DEVICE_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"12";
constant SIZE_CONFIGURATION_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"09";
constant SIZE_INTERFACE_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"09";
constant SIZE_ENDPOINT_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"07";
constant SIZE_ALL_CONFIGURATION_DESCRIPTOR_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"2E";
constant SIZE_ALL_CONFIGURATION_DESCRIPTOR_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"00";
-- Data Length
constant LENGTH_SETUP_PACKET: INTEGER8 := 8;
constant LENGTH_ENDPOINT0_BUFFER: INTEGER8 := 16;
constant LENGTH_DEVICE_DESCRIPTOR: INTEGER8 := 18;
constant LENGTH_CONFIGURATION_DESCRIPTOR: INTEGER8 := 46;
-- EndPoint Packet Size
constant SIZE_ENDPOINT0_PACKET: STD_LOGIC_VECTOR(7 downto 0) := X"10";
constant SIZE_ENDPOINT1_PACKET: STD_LOGIC_VECTOR(7 downto 0) := X"04";
constant SIZE_ENDPOINT1_PACKET_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"04";
constant SIZE_ENDPOINT1_PACKET_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant SIZE_ENDPOINT2_PACKET: STD_LOGIC_VECTOR(7 downto 0) := X"40";
constant SIZE_ENDPOINT2_PACKET_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"40";
constant SIZE_ENDPOINT2_PACKET_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"00";
-- EndPoint Type
constant ENDPOINT_TYPE_MASK: STD_LOGIC_VECTOR(7 downto 0) := X"03";
constant TYPE_ENDPOINT_CONTROL: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant TYPE_ENDPOINT_ISOCHRONOUS: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant TYPE_ENDPOINT_BULK: STD_LOGIC_VECTOR(7 downto 0) := X"02";
constant TYPE_ENDPOINT_INTERRUPT: STD_LOGIC_VECTOR(7 downto 0) := X"03";
constant ENDPOINT_DIRECTION_MASK: STD_LOGIC_VECTOR(7 downto 0) := X"80";
-- EndPoint Address
constant ADDRESS_ENDPOINT1_TX: STD_LOGIC_VECTOR(7 downto 0) := X"81";
constant ADDRESS_ENDPOINT1_RX: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant ADDRESS_ENDPOINT2_TX: STD_LOGIC_VECTOR(7 downto 0) := X"82";
constant ADDRESS_ENDPOINT2_RX: STD_LOGIC_VECTOR(7 downto 0) := X"02";
-- Descriptor Type
constant TYPE_DEVICE_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant TYPE_CONFIGURATION_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"02";
constant TYPE_STRING_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"03";
constant TYPE_INTERFACE_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"04";
constant TYPE_ENDPOINT_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"05";
constant TYPE_POWER_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"06";
-- Device Code of (ID & Number & Index)
constant CODE_DEVICE_CLASS: STD_LOGIC_VECTOR(7 downto 0) := X"DC";
constant CODE_BCD_USB_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant CODE_BCD_USB_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant CODE_ID_VENDOR_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"71";
constant CODE_ID_VENDOR_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"04";
constant CODE_ID_PRODUCT_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"66";
constant CODE_ID_PRODUCT_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"06";
constant CODE_BCD_DEVICE_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant CODE_BCD_DEVICE_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant CODE_NUMBER_CONFIGURATIONS: STD_LOGIC_VECTOR(7 downto 0) := X"19";
-- Configuration Code of (ID & Number & Index)
constant CODE_BM_ATTRIBUTES: STD_LOGIC_VECTOR(7 downto 0) := X"60";
-- Interface Code of (ID & Number & Index)
constant CODE_NUMBER_ENDPOINTS: STD_LOGIC_VECTOR(7 downto 0) := X"04";
constant CODE_INTERFACE_CLASS: STD_LOGIC_VECTOR(7 downto 0) := X"DC";
constant CODE_INTERFACE_SUB_CLASS: STD_LOGIC_VECTOR(7 downto 0) := X"A0";
constant CODE_INTERFACE_PROTOCOL: STD_LOGIC_VECTOR(7 downto 0) := X"B0";
-- EndPoint Code of (ID & Number & Index)
constant CODE_NUMBER_INTERVAL: STD_LOGIC_VECTOR(7 downto 0) := X"0A";
-- Recipient
constant RECIPIENT_MASK: STD_LOGIC_VECTOR(7 downto 0) := X"1F";
constant RECIPIENT_DEVICE: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant RECIPIENT_INTERFACE: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant RECIPIENT_ENDPOINT: STD_LOGIC_VECTOR(7 downto 0) := X"02";
-- Request Type
constant REQUEST_TYPE_MASK: STD_LOGIC_VECTOR(7 downto 0) := X"60";
constant TYPE_STANDARD_REQUEST: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant TYPE_CLASS_REQUEST: STD_LOGIC_VECTOR(7 downto 0) := X"20";
constant TYPE_VENDOR_REQUEST: STD_LOGIC_VECTOR(7 downto 0) := X"40";
constant REQUEST_GET_STATUS: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant REQUEST_CLEAR_FEATURE: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant REQUEST_SET_FEATURE: STD_LOGIC_VECTOR(7 downto 0) := X"03";
constant REQUEST_SET_ADDRESS: STD_LOGIC_VECTOR(7 downto 0) := X"05";
constant REQUEST_GET_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"06";
constant REQUEST_SET_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"07";
constant REQUEST_GET_CONFIGURATION: STD_LOGIC_VECTOR(7 downto 0) := X"08";
constant REQUEST_SET_CONFIGURATION: STD_LOGIC_VECTOR(7 downto 0) := X"09";
constant REQUEST_GET_INTERFACE: STD_LOGIC_VECTOR(7 downto 0) := X"0A";
constant REQUEST_SET_INTERFACE: STD_LOGIC_VECTOR(7 downto 0) := X"0B";
constant REQUEST_SYNC_FRAME: STD_LOGIC_VECTOR(7 downto 0) := X"0C";
-- Special Consants
---------------------------------------------------------------------------------------------------
-- Descriptors
---------------------------------------------------------------------------------------------------
-- Descriptors Set
constant TRANSEIVER_DATA: REG256x8 :=
( -- Address Comments
SIZE_DEVICE_DESCRIPTOR, -- 00000000 Start of device descriptor
TYPE_DEVICE_DESCRIPTOR,
CODE_BCD_USB_HIGH,
CODE_BCD_USB_LOW,
CODE_DEVICE_CLASS,
X"00",
X"00",
SIZE_ENDPOINT0_PACKET,
CODE_ID_VENDOR_HIGH,
CODE_ID_VENDOR_LOW,
CODE_ID_PRODUCT_HIGH,
CODE_ID_PRODUCT_LOW,
CODE_BCD_DEVICE_HIGH,
CODE_BCD_DEVICE_LOW,
X"00",
X"00",
X"00",
CODE_NUMBER_CONFIGURATIONS, -- 00000011 End of device descriptor
SIZE_CONFIGURATION_DESCRIPTOR, -- 00000012 Start of configuration descriptor
TYPE_CONFIGURATION_DESCRIPTOR,
SIZE_ALL_CONFIGURATION_DESCRIPTOR_HIGH,
SIZE_ALL_CONFIGURATION_DESCRIPTOR_LOW,
X"01",
X"01",
X"00",
CODE_BM_ATTRIBUTES,
X"01", -- 0000001A End of configuration descriptor
SIZE_INTERFACE_DESCRIPTOR, -- 0000001B Start of interface descriptor
TYPE_INTERFACE_DESCRIPTOR,
X"00",
X"00",
CODE_NUMBER_ENDPOINTS,
CODE_INTERFACE_CLASS,
CODE_INTERFACE_SUB_CLASS,
CODE_INTERFACE_PROTOCOL,
X"00", -- 00000023 End of interface descriptor
SIZE_ENDPOINT_DESCRIPTOR, -- 00000024 Start of endpoint1(tx) descriptor
TYPE_ENDPOINT_DESCRIPTOR,
ADDRESS_ENDPOINT1_TX,
TYPE_ENDPOINT_INTERRUPT,
SIZE_ENDPOINT1_PACKET_HIGH,
SIZE_ENDPOINT1_PACKET_LOW,
CODE_NUMBER_INTERVAL, -- 0000002A End of endpoint1(tx) descriptor
SIZE_ENDPOINT_DESCRIPTOR, -- 0000002B Start of endpoint1(rx) descriptor
TYPE_ENDPOINT_DESCRIPTOR,
ADDRESS_ENDPOINT1_RX,
TYPE_ENDPOINT_INTERRUPT,
SIZE_ENDPOINT1_PACKET_HIGH,
SIZE_ENDPOINT1_PACKET_LOW,
CODE_NUMBER_INTERVAL, -- 00000031 End of endpoint1(rx) descriptor
SIZE_ENDPOINT_DESCRIPTOR, -- 00000032 Start of endpoint2(tx) descriptor
TYPE_ENDPOINT_DESCRIPTOR,
ADDRESS_ENDPOINT2_TX,
TYPE_ENDPOINT_BULK,
SIZE_ENDPOINT2_PACKET_HIGH,
SIZE_ENDPOINT2_PACKET_LOW,
CODE_NUMBER_INTERVAL, -- 00000038 End of endpoint2(tx) descriptor
SIZE_ENDPOINT_DESCRIPTOR, -- 00000039 Start of endpoint2(rx) descriptor
TYPE_ENDPOINT_DESCRIPTOR,
ADDRESS_ENDPOINT2_RX,
TYPE_ENDPOINT_BULK,
SIZE_ENDPOINT2_PACKET_HIGH,
SIZE_ENDPOINT2_PACKET_LOW,
CODE_NUMBER_INTERVAL, -- 0000003F End of endpoint2(rx) descriptor
others => X"00"
);
-- Address
--constant ADDRESS_DEVICE_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"00";
--constant ADDRESS_CONFIGURATION_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"12";
--constant ADDRESS_EP0_BUFFER: STD_LOGIC_VECTOR(7 downto 0) := X"40";
--constant ADDRESS_EP1_BUFFER: STD_LOGIC_VECTOR(7 downto 0) := X"50";
--constant ADDRESS_EP2_BUFFER: STD_LOGIC_VECTOR(7 downto 0) := X"60";
constant ADDRESS_DEVICE_DESCRIPTOR: INTEGER8 := 0;
constant ADDRESS_CONFIGURATION_DESCRIPTOR: INTEGER8 := 18;
constant ADDRESS_EP0_BUFFER: INTEGER8 := 64;
constant ADDRESS_SET_ADDRESS: INTEGER8 := 66;
constant ADDRESS_SET_CONFIGURATION: INTEGER8 := 66;
constant ADDRESS_DESCRIPTOR_TYPE: INTEGER8 := 67;
constant ADDRESS_REQUEST_VALUE_HIGH: INTEGER8 := 66;
constant ADDRESS_REQUEST_VALUE_LOW: INTEGER8 := 67;
constant ADDRESS_DATA_LENGTH_HIGH: INTEGER8 := 70;
constant ADDRESS_DATA_LENGTH_LOW: INTEGER8 := 71;
constant ADDRESS_EP1_BUFFER: INTEGER8 := 80;
constant ADDRESS_EP2_BUFFER: INTEGER8 := 96;
constant ADDRESS_TEMP_DATA: INTEGER8 := 192;
constant ADDRESS_DEVICE_REQUEST_TYPE: INTEGER8 := 64;
constant ADDRESS_DEVICE_REQUEST: INTEGER8 := 65;
end USB_PACKAGE;
--}} End of automatically maintained section
package body USB_PACKAGE is
end USB_PACKAGE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -