34 #ifdef __PROPELLER_COG__
39 #ifndef __PROPELLER_COG__
46 this->set_tx_mask((
const Port::Mask) (1 << _cfg_txpin));
51 this->set_tx_mask(tx);
54 virtual void set_tx_mask (
const Port::Mask tx) {
65 return this->m_pin.get_mask();
68 virtual void send (uint16_t originalData)
const {
69 uint32_t wideData = originalData;
73 __asm__
volatile(
"test %[_data], %[_dataMask] wc \n\t"
74 "muxc %[_data], %[_parityMask]"
75 : [_data]
"+r"(wideData)
76 : [_dataMask]
"r"(this->m_dataMask),
77 [_parityMask]
"r"(this->m_parityMask));
79 __asm__
volatile(
"test %[_data], %[_dataMask] wc \n\t"
80 "muxnc %[_data], %[_parityMask]"
81 : [_data]
"+r"(wideData)
82 : [_dataMask]
"r"(this->m_dataMask),
83 [_parityMask]
"r"(this->m_parityMask));
87 wideData |= this->m_stopBitMask;
92 this->shift_out_data(wideData, this->m_totalBits, this->m_bitCycles, this->m_pin.get_mask());
95 virtual void send_array (
const char array[], uint32_t words)
const {
96 char *arrayPtr = (
char *) array;
97 uint32_t data = 0, waitCycles = 0, bits = 0;
99 #ifndef DOXYGEN_IGNORE
100 switch (this->m_parity) {
103 FC_START(
"SendArrayStart%=",
"SendArrayEnd%=")
105 "sendArrayLoop%=: \n\t"
106 " rdbyte %[_data], %[_arrayPtr] \n\t"
108 " or %[_data], %[_stopBitMask] \n\t"
109 " shl %[_data], #1 \n\t"
112 " mov %[_bits], %[_totalBits] \n\t"
113 " mov %[_waitCycles], %[_bitCycles] \n\t"
114 " add %[_waitCycles], CNT \n\t"
115 "sendWordLoop%=: \n\t"
116 " waitcnt %[_waitCycles], %[_bitCycles] \n\t"
117 " shr %[_data],#1 wc \n\t"
118 " muxc outa, %[_mask] \n\t"
119 " djnz %[_bits], #" FC_ADDR(
"sendWordLoop%=",
"SendArrayStart%=")
" \n\t"
122 " add %[_arrayPtr], #1 \n\t"
123 " djnz %[_words], #" FC_ADDR(
"sendArrayLoop%=",
"SendArrayStart%=")
" \n\t"
124 FC_END(
"SendArrayEnd%=")
125 : [_data]
"+r"(data),
126 [_waitCycles]
"+r"(waitCycles),
127 [_arrayPtr]
"+r"(arrayPtr),
130 : [_mask]
"r"(this->m_pin.get_mask()),
131 [_bitCycles]
"r"(this->m_bitCycles),
132 [_totalBits]
"r"(this->m_totalBits),
133 [_stopBitMask]
"r"(this->m_stopBitMask));
137 FC_START(
"SendArrayStart%=",
"SendArrayEnd%=")
140 " rdbyte %[_data], %[_arrayPtr] \n\t"
142 " test %[_data], %[_dataMask] wc \n\t"
143 " muxnc %[_data], %[_parityMask] \n\t"
145 " or %[_data], %[_stopBitMask] \n\t"
146 " shl %[_data], #1 \n\t"
149 " mov %[_bits], %[_totalBits] \n\t"
150 " mov %[_waitCycles], %[_bitCycles] \n\t"
151 " add %[_waitCycles], CNT \n\t"
152 "sendWordLoop%=: \n\t"
153 " waitcnt %[_waitCycles], %[_bitCycles] \n\t"
154 " shr %[_data],#1 wc \n\t"
155 " muxc outa, %[_mask] \n\t"
156 " djnz %[_bits], #" FC_ADDR(
"sendWordLoop%=",
"SendArrayStart%=")
" \n\t"
159 " add %[_arrayPtr], #1 \n\t"
160 " djnz %[_words], #" FC_ADDR(
"sendArrayLoop%=",
"SendArrayStart%=")
" \n\t"
161 FC_END(
"SendArrayEnd%=")
162 : [_data]
"+r"(data),
163 [_waitCycles]
"+r"(waitCycles),
164 [_arrayPtr]
"+r"(arrayPtr),
167 : [_mask]
"r"(this->m_pin.get_mask()),
168 [_bitCycles]
"r"(this->m_bitCycles),
169 [_totalBits]
"r"(this->m_totalBits),
170 [_stopBitMask]
"r"(this->m_stopBitMask),
171 [_dataMask]
"r"(this->m_dataMask),
172 [_parityMask]
"r"(this->m_parityMask));
176 FC_START(
"SendArrayStart%=",
"SendArrayEnd%=")
179 " rdbyte %[_data], %[_arrayPtr] \n\t"
181 " test %[_data], %[_dataMask] wc \n\t"
182 " muxc %[_data], %[_parityMask] \n\t"
184 " or %[_data], %[_stopBitMask] \n\t"
185 " shl %[_data], #1 \n\t"
188 " mov %[_bits], %[_totalBits] \n\t"
189 " mov %[_waitCycles], %[_bitCycles] \n\t"
190 " add %[_waitCycles], CNT \n\t"
191 "sendWordLoop%=: \n\t"
192 " waitcnt %[_waitCycles], %[_bitCycles] \n\t"
193 " shr %[_data],#1 wc \n\t"
194 " muxc outa, %[_mask] \n\t"
195 " djnz %[_bits], #" FC_ADDR(
"sendWordLoop%=",
"SendArrayStart%=")
" \n\t"
198 " add %[_arrayPtr], #1 \n\t"
199 " djnz %[_words], #" FC_ADDR(
"sendArrayLoop%=",
"SendArrayStart%=")
" \n\t"
200 FC_END(
"SendArrayEnd%=")
201 : [_data]
"+r"(data),
202 [_waitCycles]
"+r"(waitCycles),
203 [_arrayPtr]
"+r"(arrayPtr),
206 : [_mask]
"r"(this->m_pin.get_mask()),
207 [_bitCycles]
"r"(this->m_bitCycles),
208 [_totalBits]
"r"(this->m_totalBits),
209 [_stopBitMask]
"r"(this->m_stopBitMask),
210 [_dataMask]
"r"(this->m_dataMask),
211 [_parityMask]
"r"(this->m_parityMask));
218 this->send((uint16_t) c);
221 virtual void puts (
const char string[]) {
222 const uint32_t length = strlen(
string);
224 this->send_array(
string, length);
236 inline void shift_out_data (uint32_t data, uint32_t bits,
const uint32_t bitCycles,
237 const uint32_t txMask)
const {
238 #ifndef DOXYGEN_IGNORE
239 volatile uint32_t waitCycles = bitCycles;
241 FC_START(
"ShiftOutDataStart%=",
"ShiftOutDataEnd%=")
242 " add %[_waitCycles], CNT \n\t"
245 " waitcnt %[_waitCycles], %[_bitCycles] \n\t"
246 " shr %[_data],#1 wc \n\t"
247 " muxc outa, %[_mask] \n\t"
248 " djnz %[_bits], #" FC_ADDR(
"loop%=",
"ShiftOutDataStart%=")
" \n\t"
249 FC_END(
"ShiftOutDataEnd%=")
250 : [_data]
"+r"(data),
251 [_waitCycles]
"+r"(waitCycles),
253 : [_mask]
"r"(txMask),
254 [_bitCycles]
"r"(bitCycles));
262 #ifdef __PROPELLER_COG__