.. _program_listing_file_etherbone.h: Program Listing for File etherbone.h ==================================== |exhale_lsh| :ref:`Return to documentation for file ` (``etherbone.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #ifndef __ETHERBONE_H__ #define __ETHERBONE_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include /* The EtherBone record has a struct that looks like this: struct etherbone_record { // 1... uint8_t bca : 1; uint8_t rca : 1; uint8_t rff : 1; uint8_t ign1 : 1; uint8_t cyc : 1; uint8_t wca : 1; uint8_t wff : 1; uint8_t ign2 : 1; uint8_t byte_enable; uint8_t wcount; uint8_t rcount; uint32_t write_addr; union { uint32_t value; read_addr; }; } __attribute__((packed)); This is wrapped inside of an EtherBone network packet header: struct etherbone_packet { uint8_t magic[2]; // 0x4e 0x6f uint8_t version : 4; uint8_t ign : 1; uint8_t no_reads : 1; uint8_t probe_reply : 1; uint8_t probe_flag : 1; uint8_t port_size : 4; uint8_t addr_size : 4; uint8_t padding[4]; struct etherbone_record records[0]; } __attribute__((packed)); LiteX only supports a single record per packet, so either wcount or rcount is set to 1. For a read, the read_addr is specified. For a write, the write_addr is specified along with a value. The same type of record is returned, so your data is at offset 16. */ struct eb_connection; int eb_unfill_read32(uint8_t wb_buffer[20]); int eb_fill_write32(uint8_t wb_buffer[20], uint32_t data, uint32_t address); int eb_fill_read32(uint8_t wb_buffer[20], uint32_t address); struct eb_connection *eb_connect(const char *addr, const char *port, int is_direct); void eb_disconnect(struct eb_connection **conn); uint32_t eb_read32(struct eb_connection *conn, uint32_t addr); void eb_write32(struct eb_connection *conn, uint32_t val, uint32_t addr); #ifdef __cplusplus }; #endif /* __cplusplus */ #endif /* __ETHERBONE_H__ */