Firstly well done. Very clear and simple interface, which is easy to use.
My feedback:
make it more explicit in description of s_chan_free that it sends END control tokens
consider making s_chan_outct just outct and s_chan_check_ct just chkct
similarly for byte/word input/output functions (we already use inuint, soutt, etc.)
either use 's' prefix or specify one type for streaming and non-streaming channel ends, the general resource type
should there also be s_chanend_alloc and s_chanend_free functions?
there is a clear bug in s_chan_free, might be worth adding some simple channel/channel end tests (without exit calls so hanging can be spotted)
there is a clear bug in chan_input_byte
should implementation be in src directory rather than api?
is chan_output/input block identical to transaction block output/input, could it be remove? (there is no direct xC equivalent to channel block output/input)
use of REFERENCE_PARAM versus pointers is inconsistent
how about renaming chan_init_transaction_master to t_chan_init_master/slave?
suggest moving clear_all function to top of event header, so it's immediately obvious that clear_all must be called first (I looked into event header file and missed that clear_all must be called first; then I noticed clear_all is called first by looking in the example code)
inline assembly can use immediate operands instead of hardcoded values, e.g. asm("setc res[%0], %1" :: "r"(x), "i"(XS1_SETC_COND_EQ))
cosmetic: insonsistent use of C and C++ style comments
Firstly well done. Very clear and simple interface, which is easy to use.
My feedback: