4 #ifndef XUD_XFER_DATA_H_
5 #define XUD_XFER_DATA_H_
7 #include <xcore/chanend.h>
8 #include <xcore/assert.h>
13 static inline XUD_Result_t xud_data_get_start(XUD_ep ep, uint8_t *buffer)
16 unsigned int *ep_struct = (
unsigned int *) ep;
23 asm (
"ldw %0, %1[0]":
"=r"(chan_array_ptr):
"r"(ep));
24 asm (
"stw %0, %1[3]"::
"r"(buffer),
"r"(ep));
25 asm (
"stw %0, %1[0]"::
"r"(ep),
"r"(chan_array_ptr));
30 static inline XUD_Result_t xud_data_get_check(chanend_t c,
unsigned *length,
int *is_setup)
37 if (chanend_test_control_token_next_byte(c)) {
44 word_len = chanend_in_word(c);
47 if (chanend_test_control_token_next_byte(c)) {
49 tail_bitlen = chanend_in_control_token(c);
52 tail_bitlen = chanend_in_byte(c);
61 byte_len = (4 * word_len) + (tail_bitlen / 8);
72 XUD_Result_t xud_data_get_finish(XUD_ep ep);
73 XUD_Result_t xud_setup_data_get_finish(XUD_ep ep);
75 static inline XUD_Result_t xud_data_set_start(XUD_ep ep, uint8_t *buffer,
int len)
81 unsigned int *ep_struct = (
unsigned int *) ep;
90 tailLength = (8 * len) & 0x1F;
93 wordLength = len /
sizeof(uint32_t);
97 if ((tailLength == 0) && (wordLength != 0)) {
102 wordLength *=
sizeof(uint32_t);
103 tailLength = (32 * len) & 0x7F;
104 asm (
"ldw %0, %1[0]":
"=r"(chan_array_ptr):
"r"(ep));
109 asm (
"add %0, %1, %2":
"=r"(tmp):
"r"(buffer),
"r"(wordLength << 2));
112 asm (
"neg %0, %1":
"=r"(tmp2):
"r"(wordLength));
115 asm (
"add %0, %1, %2":
"=r"(tmp):
"r"(buffer),
"r"(wordLength));
118 asm (
"neg %0, %1":
"=r"(tmp2):
"r"(len>>2));
122 asm (
"stw %0, %1[6]"::
"r"(tmp2),
"r"(ep));
125 asm (
"stw %0, %1[3]"::
"r"(tmp),
"r"(ep));
128 asm (
"stw %0, %1[7]"::
"r"(tailLength),
"r"(ep));
132 asm (
"ldw %0, %1[0]":
"=r"(chan_array_ptr):
"r"(ep));
134 asm (
"stw %0, %1[0]"::
"r"(ep),
"r"(chan_array_ptr));
139 XUD_Result_t xud_data_set_finish(chanend_t c, XUD_ep ep);