class K2MMPacket: magic = 0x4f6f version = 1 header_length = 8 header_fields = { "magic": _HeaderField(0, 0, 16, user=False), "version": _HeaderField(2, 4, 4, user=False), "nr": _HeaderField(2, 2, 1, user=True), "pr": _HeaderField(2, 1, 1, user=True), "pf": _HeaderField(2, 0, 1, user=True), "addr_size": _HeaderField(3, 0, 8, user=False), "port_size": _HeaderField(4, 0, 8, user=False) } header = Header(header_fields, header_length, swap_field_bytes=True) @staticmethod def get_header(dw, aligned=True): return _Header( __class__.header_fields, length = dw // 8 if aligned else __class__.header_length, swap_field_bytes = True) @staticmethod def packet_description(dw): param_layout = __class__.get_header(dw).get_layout() payload_layout = [ ("data", dw), ("last_be", dw//8), ("error", dw//8) ] return EndpointDescription(payload_layout, param_layout) @staticmethod def packet_user_description(dw): param_layout = __class__.get_header(dw).get_user_layout() # param_layout = _remove_from_layout(param_layout, "magic", "portsize", "addrsize", "version") param_layout += eth_udp_user_description(dw).param_layout payload_layout = [ ("data", dw), ("last_be", dw//8), ("error", dw//8) ] return EndpointDescription(payload_layout, param_layout)
eth_min_len = 46 eth_interpacket_gap = 12 eth_preamble = 0xd555555555555555 buffer_depth = 2**log2_int(eth_mtu, need_pow2=False) ethernet_type_ip = 0x800 ethernet_type_arp = 0x806 mac_header_length = 14 mac_header_fields = { "target_mac": HeaderField(0, 0, 48), "sender_mac": HeaderField(6, 0, 48), "ethernet_type": HeaderField(12, 0, 16) } mac_header = Header(mac_header_fields, mac_header_length, swap_field_bytes=True) arp_hwtype_ethernet = 0x0001 arp_proto_ip = 0x0800 arp_opcode_request = 0x0001 arp_opcode_reply = 0x0002 arp_header_length = 28 arp_header_fields = { "hwtype": HeaderField(0, 0, 16), "proto": HeaderField(2, 0, 16), "hwsize": HeaderField(4, 0, 8), "protosize": HeaderField(5, 0, 8), "opcode": HeaderField(6, 0, 16), "sender_mac": HeaderField(8, 0, 48),
"c": HeaderField(0*4, 15, 1), "command": HeaderField(0*4, 16, 8), "features_lsb": HeaderField(0*4, 24, 8), "lba_lsb": HeaderField(1*4, 0, 24), "device": HeaderField(1*4, 24, 8), "lba_msb": HeaderField(2*4, 0, 24), "features_msb": HeaderField(2*4, 24, 8), "count": HeaderField(3*4, 0, 16), "icc": HeaderField(3*4, 16, 8), "control": HeaderField(3*4, 24, 8) } fis_reg_h2d_header = Header(fis_reg_h2d_header_fields, fis_reg_h2d_header_length, swap_field_bytes=False) fis_reg_d2h_header_length = 5 fis_reg_d2h_header_fields = { "type": HeaderField(0*4, 0, 8), "pm_port": HeaderField(0*4, 8, 4), "i": HeaderField(0*4, 14, 1), "status": HeaderField(0*4, 16, 8), "errors": HeaderField(0*4, 24, 8), "lba_lsb": HeaderField(1*4, 0, 24), "device": HeaderField(1*4, 24, 8), "lba_msb": HeaderField(2*4, 0, 24),
from litex.soc.interconnect.packet import HeaderField, Header etherbone_magic = 0x4e6f etherbone_version = 1 etherbone_packet_header_length = 8 etherbone_packet_header_fields = { "magic": HeaderField(0, 0, 16), "version": HeaderField(2, 4, 4), "nr": HeaderField(2, 2, 1), # No Reads "pr": HeaderField(2, 1, 1), # Probe Reply "pf": HeaderField(2, 0, 1), # Probe Flag "addr_size": HeaderField(3, 4, 4), # 1=8bits, 2=16bits, 4=32bits, 8=64bits "port_size": HeaderField(3, 0, 4), # Same as above } etherbone_packet_header = Header(etherbone_packet_header_fields, etherbone_packet_header_length, swap_field_bytes=True) # When reading/writing to a FIFO, you don't increase # the address after each write. etherbone_record_header_length = 4 etherbone_record_header_fields = { "bca": HeaderField(0, 0, 1), # ReplyToCfgSpace - ??? (C)onfig (A)dress "rca": HeaderField(0, 1, 1), # ReadFromCfgSpace - (R)ead from (C)onfig (A)dress "rff": HeaderField(0, 2, 1), # ReadFIFO - (R)ead (F)I(F)O "cyc": HeaderField(0, 4, 1), # DropCycle - Drop(Cyc)le "wca": HeaderField(0, 5, 1), # WriteToCfgSpace - (W)rite to (C)onfig (A)dress "wff": HeaderField(0, 6, 1), # WriteFIFO - (W)rite (F)I(F)O "byte_enable": HeaderField(1, 0, 8), # Select
from litex.soc.integration.soc_core import soc_core_args, soc_core_argdict from litex.soc.interconnect import stream from litex.soc.interconnect.csr import CSRStatus, AutoCSR, CSRStorage from litex.soc.interconnect.packet import Header, HeaderField, Packetizer from litex.soc.interconnect.stream import EndpointDescription from liteeth.common import eth_udp_user_description, convert_ip # from liteeth.frontend.stream import LiteEthStream2UDPTX fragmenter_header_length = 8 fragmenter_header_fields = { "total_fragmets": HeaderField(0, 0, 32), "fragment_id": HeaderField(4, 0, 32), } fragmenter_header = Header(fragmenter_header_fields, fragmenter_header_length, swap_field_bytes=True) def udp_fragmenter_description(dw): param_layout = [ ("length", 32), ] payload_layout = fragmenter_header.get_layout() + [ ("data", dw), ] return EndpointDescription(payload_layout, param_layout) class UDPFragmenterPacketizer(Packetizer): def __init__(self, dw=8):