Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,5 @@ examples/AN01032_100Mbit_avb_i2s_demo/doc/pdf/
.*.swp
.settings
*/doc/pdf/tsn.pdf
examples/AN01032_100Mbit_avb_i2s_demo/src/aem_descriptors.generated/aem_descriptors.h
examples/AN01032_100Mbit_avb_i2s_demo/src/aem_descriptors.generated/aem_entity_strings.h
32 changes: 32 additions & 0 deletions examples/AN00202_gige_avb_i2s_demo/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(app_gige_avb_i2s_demo)

set(APP_HW_TARGET SLICEKIT-ETH-TRIANGLE1-PLL-TRIANGLE0.xn)

set(APP_DEPENDENT_MODULES "lib_tsn(8.0.0)"
"lib_i2s(6.0.1)")


set(APP_COMPILER_FLAGS -Os
-g
-report
-lquadflash)

set(APP_COMPILER_FLAGS_main.xc ${APP_COMPILER_FLAGS} -falways-inline -O3)

set(APP_XSCOPE_SRCS src/config.xscope)
set(APP_INCLUDES src
src/aem_descriptors.generated)

set(XMOS_SANDBOX_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..)


# Run AEM descriptor script
execute_process(
COMMAND python2 ${CMAKE_CURRENT_LIST_DIR}/src/generate.py ${CMAKE_CURRENT_LIST_DIR}/src/ ${CMAKE_CURRENT_LIST_DIR}/src/aem_descriptors.generated/
COMMAND echo "running python AEM generate"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})


XMOS_REGISTER_APP()
32 changes: 32 additions & 0 deletions examples/AN00203_gige_avb_tdm_demo/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(app_gige_avb_tdm_demo)

set(APP_HW_TARGET SLICEKIT-ETH-TRIANGLE1-PLL-TRIANGLE0.xn)

set(APP_DEPENDENT_MODULES "lib_tsn(8.0.0)"
"lib_i2s(6.0.1)")


set(APP_COMPILER_FLAGS -Os
-g
-report
-lquadflash)

set(APP_COMPILER_FLAGS_main.xc ${APP_COMPILER_FLAGS} -falways-inline -O3)

set(APP_XSCOPE_SRCS src/config.xscope)
set(APP_INCLUDES src
src/aem_descriptors.generated)

set(XMOS_SANDBOX_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..)


# Run AEM descriptor script
execute_process(
COMMAND python2 ${CMAKE_CURRENT_LIST_DIR}/src/generate.py ${CMAKE_CURRENT_LIST_DIR}/src/ ${CMAKE_CURRENT_LIST_DIR}/src/aem_descriptors.generated/
COMMAND echo "running python AEM generate"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})


XMOS_REGISTER_APP()
32 changes: 32 additions & 0 deletions examples/AN01032_100Mbit_avb_i2s_demo/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
cmake_minimum_required(VERSION 3.21)
include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake)
project(app_100Mbit_avb_i2s_demo)

set(APP_HW_TARGET SLICEKIT-ETH-TRIANGLE1-PLL-TRIANGLE0.xn)

set(APP_DEPENDENT_MODULES "lib_tsn(8.0.0)"
"lib_i2s(6.0.1)")


set(APP_COMPILER_FLAGS -Os
-g
-report
-lquadflash)

set(APP_COMPILER_FLAGS_main.xc ${APP_COMPILER_FLAGS} -falways-inline -O3)

set(APP_XSCOPE_SRCS src/config.xscope)
set(APP_INCLUDES src
src/aem_descriptors.generated)

set(XMOS_SANDBOX_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..)


# Run AEM descriptor script
execute_process(
COMMAND python2 ${CMAKE_CURRENT_LIST_DIR}/src/generate.py ${CMAKE_CURRENT_LIST_DIR}/src/ ${CMAKE_CURRENT_LIST_DIR}/src/aem_descriptors.generated/
COMMAND echo "running python AEM generate"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})


XMOS_REGISTER_APP()
2 changes: 1 addition & 1 deletion examples/AN01032_100Mbit_avb_i2s_demo/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ XCC_FLAGS_main.xc = $(XCC_FLAGS) -falways-inline -O3

# The USED_MODULES variable lists other module used by the application.

USED_MODULES = lib_tsn(>=8.0.0) lib_i2s(>=2.3.0)
USED_MODULES = lib_tsn(>=8.0.0) lib_i2s(>=2.3.0) lib_gpio

VERBOSE=0

Expand Down
12 changes: 12 additions & 0 deletions examples/AN01032_100Mbit_avb_i2s_demo/src/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ def do_replace(read_file, write_file, replace_defines):
def main():
srcpath = sys.argv[1]
dstpath = sys.argv[2]
if not os.path.exists(dstpath):
os.makedirs(dstpath)
read_file = open(os.path.join(srcpath, 'aem_descriptors.h.in'), 'r')
write_file = open(os.path.join(dstpath, 'aem_descriptors.h'), 'w')

Expand All @@ -60,3 +62,13 @@ def main():
print "AEM descriptor header file generation complete"

main()

# ensure we exit cleanly when we run from cmake
try:
sys.stdout.close()
except:
pass
try:
sys.stderr.close()
except:
pass
65 changes: 35 additions & 30 deletions examples/AN01032_100Mbit_avb_i2s_demo/src/main.xc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include <print.h>
#include <string.h>
#include <xscope.h>
#include "gpio.h"
// #include "gpio.h"
#include "i2s.h"
#include "i2c.h"
#include "avb.h"
Expand All @@ -31,6 +31,7 @@ fl_QSPIPorts qspi_ports =
};



in port p_rxclk = PORT_ETH_RXCLK;
in port p_rxer = PORT_ETH_RXER;
in port p_rxd = PORT_ETH_RXD;
Expand All @@ -48,12 +49,11 @@ port p_sda = PORT_AUD_SDA;

out buffered port:32 p_fs[1] = { PORT_AUD_PLL }; // Low frequency PLL frequency reference
out buffered port:32 p_i2s_lrclk = PORT_AUD_LRCLK;
out buffered port:32 p_i2s_bclk = PORT_AUD_SCLK;
out port p_i2s_bclk = PORT_AUD_SCLK;
in port p_i2s_mclk = PORT_AUD_MCLK;
out buffered port:32 p_aud_dout[2] = {PORT_AUD_DAC0, PORT_AUD_DAC1};
in buffered port:32 p_aud_din[2] = {PORT_AUD_ADC0, PORT_AUD_ADC1};
clock clk_i2s_bclk = on tile[0]: XS1_CLKBLK_2;
clock clk_i2s_mclk = on tile[0]: XS1_CLKBLK_3;
out port p_codec_rst_leds = PORT_AUD_CTRL;

// I2C addresses for the CODECS
Expand All @@ -72,14 +72,14 @@ const int codec2_addr = 0x49;

#pragma unsafe arrays
[[always_inline]][[distributable]]
void buffer_manager_to_i2s(server i2s_callback_if i2s,
void buffer_manager_to_i2s(server i2s_frame_callback_if i2s,
streaming chanend c_audio,
client interface i2c_master_if i2c,
out port p_codec_rst_leds)
{
audio_frame_t *unsafe p_in_frame;
audio_double_buffer_t *unsafe double_buffer;
int32_t *unsafe sample_out_buf;
int32_t *unsafe sample_out_buf = NULL;
unsigned cur_sample_rate;
timer tmr;

Expand Down Expand Up @@ -190,8 +190,10 @@ void buffer_manager_to_i2s(server i2s_callback_if i2s,
case i2s.restart_check() -> i2s_restart_t restart:

unsafe {
if (sample_out_buf[8]) {
restart = I2S_RESTART;
/* Ensure we have received our first sample buf first and then
check for magic value which indicates a sample rate change */
if (sample_out_buf != NULL && sample_out_buf[AVB_NUM_MEDIA_INPUTS + AVB_NUM_MEDIA_OUTPUTS]) {
restart = I2S_RESTART;
while (!stestct(c_audio)) {
c_audio :> int;
}
Expand All @@ -203,25 +205,26 @@ void buffer_manager_to_i2s(server i2s_callback_if i2s,
}
break; // End of restart check

case i2s.receive(size_t index, int32_t sample):
unsafe {
p_in_frame->samples[index] = sample;
case i2s.receive(size_t num_in, int32_t samples[num_in]):
for(int index = 0; index < num_in; index++){
unsafe {
p_in_frame->samples[index] = samples[index];
}
}
break;

case i2s.send(size_t index) -> int32_t sample:

unsafe {
if (index == 0) {
c_audio :> sample_out_buf;
}
sample = sample_out_buf[index];
if (index == (AVB_NUM_MEDIA_INPUTS-1)) {
tmr :> p_in_frame->timestamp;
audio_frame_t *unsafe new_frame = audio_buffers_swap_active_buffer(*double_buffer);
c_audio <: p_in_frame;
p_in_frame = new_frame;
case i2s.send(size_t num_out, int32_t samples[num_out]):
unsafe{
c_audio :> sample_out_buf;
for(int index = 0; index < num_out; index++){
samples[index] = sample_out_buf[index];
}

tmr :> p_in_frame->timestamp;
audio_frame_t *unsafe new_frame = audio_buffers_swap_active_buffer(*double_buffer);
c_audio <: p_in_frame;
p_in_frame = new_frame;

}
break; // End of send
}
Expand Down Expand Up @@ -344,7 +347,7 @@ int main(void)
i2c_master_if i_i2c[NUM_I2C_IFS];

// I2S and audio buffering interfaces
i2s_callback_if i_i2s;
i2s_frame_callback_if i_i2s;
streaming chan c_audio;
interface push_if i_audio_in_push;
interface pull_if i_audio_in_pull;
Expand Down Expand Up @@ -386,16 +389,14 @@ int main(void)


on tile[0]: {
set_core_high_priority_on();
configure_clock_src(clk_i2s_mclk, p_i2s_mclk);
start_clock(clk_i2s_mclk);
i2s_master(i_i2s,
i2s_frame_master(i_i2s,
p_aud_dout, AVB_NUM_MEDIA_OUTPUTS/2,
p_aud_din, AVB_NUM_MEDIA_INPUTS/2,
32,
p_i2s_bclk,
p_i2s_lrclk,
clk_i2s_bclk,
clk_i2s_mclk);
p_i2s_mclk,
clk_i2s_bclk);
}

on tile[0]: [[distribute]] buffer_manager_to_i2s(i_i2s, c_audio, i_i2c[I2S_TO_I2C], p_codec_rst_leds);
Expand All @@ -422,7 +423,11 @@ int main(void)
on tile[0]: {
char mac_address[6];
if (otp_board_info_get_mac(otp_ports0, 0, mac_address) == 0) {
fail("No MAC address programmed in OTP");
const char mac_address_manual[] = {0x12, 0x34, 0x56, 0x67, 0x89, 0xab};
debug_printf("No MAC address programmed in OTP, falling back to %x:%x:%x:%x:%x:%x\n",
mac_address_manual[0], mac_address_manual[1], mac_address_manual[2],
mac_address_manual[3], mac_address_manual[4], mac_address_manual[5]);
memcpy(mac_address, mac_address_manual, sizeof(mac_address));
}
i_eth_cfg[MAC_CFG_TO_AVB_MANAGER].set_macaddr(0, mac_address);
[[combine]]
Expand Down
37 changes: 37 additions & 0 deletions lib_tsn/lib_build_info.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
set(LIB_NAME lib_tsn)
set(LIB_VERSION 8.0.0)
set(LIB_DEPENDENT_MODULES "lib_ethernet(develop)"
"lib_i2c(6.4.0)"
"lib_logging(2.1.0)"
"lib_xassert(4.3.1)"
"lib_otpinfo(2.1.0)"
"lib_random(1.2.0)")

set(LIB_OPTIONAL_HEADERS "ethernet_conf.h"
"random_conf.h"
"avb_conf.h")

set(LIB_COMPILER_FLAGS -g
-Os)

set(LIB_COMPILER_FLAGS_media_clock_server.xc ${LIB_COMPILER_FLAGS} -g -O3)
set(LIB_COMPILER_FLAGS_audio_output_fifo.c ${LIB_COMPILER_FLAGS} -O3)
set(LIB_COMPILER_FLAGS_avb_1722_talker_support_audio.c ${LIB_COMPILER_FLAGS} -O3)
set(LIB_COMPILER_FLAGS_audio_buffering.xc ${LIB_COMPILER_FLAGS} -O3)
set(LIB_COMPILER_FLAGS_avb_1722_talker.xc ${LIB_COMPILER_FLAGS} -O3)

set(LIB_INCLUDES api
src
src/util
src/srp
src/ptp
src/media_clock
src/media_clock/external_hw/CS2100CP
src/media_clock/external_hw/CS2300CP
src/avb
src/audio_buffering
src/1722_1
src/1722
src/1722/maap)

XMOS_REGISTER_MODULE()