//go:build xtensa // +build xtensa package ws2812 // Warning: autogenerated file. Instead of modifying this file, change // gen-ws2812.go and run "go generate". import "runtime/interrupt" /* #include __attribute__((always_inline)) void ws2812_writeByte80(char c, uint32_t *portSet, uint32_t *portClear, uint32_t maskSet, uint32_t maskClear) { // Timings: // T0H: 28 - 28 cycles or 350.0ns - 350.0ns // T1H: 84 - 84 cycles or 1050.0ns - 1050.0ns // TLD: 92 - cycles or 1150.0ns - uint32_t value = (uint32_t)c; char i = 8; __asm__ __volatile__( "1: // send_bit\n" "\t s32i %[maskSet], %[portSet] // [1] T0H and T1H start here\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t slli %[value], %[value], 1 // [1] shift value to the left by 1\n" "\t bbsi %[value], 8, 2f // [1] branch to skip_store if bit 8 is set\n" "\t s32i %[maskClear], %[portClear] // [1] T0H -> T0L transition\n" "\t2: // skip_store\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t s32i %[maskClear], %[portClear] // [1] T1H -> T1L transition\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t addi %[i], %[i], -1 // [1]\n" "\t bnez %[i], 1b // [1] send_bit, T1H and T1L end here\n" : [value]"+r"(value), [i]"+r"(i) : [maskSet]"r"(maskSet), [portSet]"m"(*portSet), [maskClear]"r"(maskClear), [portClear]"m"(*portClear)); } __attribute__((always_inline)) void ws2812_writeByte160(char c, uint32_t *portSet, uint32_t *portClear, uint32_t maskSet, uint32_t maskClear) { // Timings: // T0H: 56 - 56 cycles or 350.0ns - 350.0ns // T1H: 168 - 168 cycles or 1050.0ns - 1050.0ns // TLD: 184 - cycles or 1150.0ns - uint32_t value = (uint32_t)c; char i = 8; __asm__ __volatile__( "1: // send_bit\n" "\t s32i %[maskSet], %[portSet] // [1] T0H and T1H start here\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t slli %[value], %[value], 1 // [1] shift value to the left by 1\n" "\t bbsi %[value], 8, 2f // [1] branch to skip_store if bit 8 is set\n" "\t s32i %[maskClear], %[portClear] // [1] T0H -> T0L transition\n" "\t2: // skip_store\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t s32i %[maskClear], %[portClear] // [1] T1H -> T1L transition\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t nop\n" "\t addi %[i], %[i], -1 // [1]\n" "\t bnez %[i], 1b // [1] send_bit, T1H and T1L end here\n" : [value]"+r"(value), [i]"+r"(i) : [maskSet]"r"(maskSet), [portSet]"m"(*portSet), [maskClear]"r"(maskClear), [portClear]"m"(*portClear)); } */ import "C" func (d Device) writeByte80(c byte) { portSet, maskSet := d.Pin.PortMaskSet() portClear, maskClear := d.Pin.PortMaskClear() mask := interrupt.Disable() C.ws2812_writeByte80(C.char(c), portSet, portClear, maskSet, maskClear) interrupt.Restore(mask) } func (d Device) writeByte160(c byte) { portSet, maskSet := d.Pin.PortMaskSet() portClear, maskClear := d.Pin.PortMaskClear() mask := interrupt.Disable() C.ws2812_writeByte160(C.char(c), portSet, portClear, maskSet, maskClear) interrupt.Restore(mask) }