Skip to content

Commit 67e3516

Browse files
authored
Merge pull request #442 from Infineon/Infineon_psoc6_support
Add PSOC6 Support to Adafruit Neopixel Library.
2 parents f7d78d9 + a4dfee3 commit 67e3516

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed

Adafruit_NeoPixel.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,12 @@ extern "C" void espShow(uint16_t pin, uint8_t *pixels, uint32_t numBytes,
400400
extern "C" void k210Show(uint8_t pin, uint8_t *pixels, uint32_t numBytes,
401401
boolean is800KHz);
402402
#endif // KENDRYTE_K210
403+
404+
405+
#if defined(ARDUINO_ARCH_PSOC6)
406+
extern "C" void psoc6_show(uint8_t pin, uint8_t *pixels, uint32_t numBytes,
407+
boolean is800KHz);
408+
#endif
403409
/*!
404410
@brief Transmit pixel data in RAM to NeoPixels.
405411
@note On most architectures, interrupts are temporarily disabled in
@@ -444,6 +450,10 @@ void Adafruit_NeoPixel::show(void) {
444450
noInterrupts(); // Need 100% focus on instruction timing
445451
#endif
446452

453+
#if defined(ARDUINO_ARCH_PSOC6)
454+
psoc6_show(pin, pixels, numBytes, is800KHz);
455+
#endif
456+
447457
#if defined(__AVR__)
448458
// AVR MCUs -- ATmega & ATtiny (no XMEGA) ---------------------------------
449459

psoc6.c

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#if defined(ARDUINO_ARCH_PSOC6)
2+
3+
#include "cyhal_gpio.h"
4+
#include "cyhal_system.h"
5+
#include "cy_syslib.h"
6+
#include "Arduino.h"
7+
8+
void psoc6_show(uint8_t pin, uint8_t *pixels, uint32_t numBytes, bool is800KHZ)
9+
{
10+
if (!pixels) return;
11+
noInterrupts();
12+
GPIO_PRT_Type *base = CYHAL_GET_PORTADDR(mapping_gpio_pin[pin]);
13+
uint32_t pinNum = CYHAL_GET_PIN(mapping_gpio_pin[pin]);
14+
if(is800KHZ){
15+
for (uint16_t i = 0; i < numBytes; i++) {
16+
uint8_t b = pixels[i];
17+
for (uint8_t j = 0; j < 8; j++) {
18+
bool bit = (b & 0x80) != 0;
19+
b <<= 1;
20+
switch (bit) {
21+
case 1:
22+
// Send a 1-bit
23+
Cy_GPIO_Write(base, pinNum, 1);
24+
Cy_GPIO_Write(base, pinNum, 1);
25+
Cy_GPIO_Write(base, pinNum, 1);
26+
Cy_GPIO_Write(base, pinNum, 1);
27+
Cy_GPIO_Write(base, pinNum, 0);
28+
Cy_GPIO_Write(base, pinNum, 0);
29+
break;
30+
case 0:
31+
// Send a 0-bit
32+
Cy_GPIO_Write(base, pinNum, 1);
33+
Cy_GPIO_Write(base, pinNum, 1);
34+
Cy_GPIO_Write(base, pinNum, 0);
35+
Cy_GPIO_Write(base, pinNum, 0);
36+
Cy_GPIO_Write(base, pinNum, 0);
37+
Cy_GPIO_Write(base, pinNum, 0);
38+
Cy_GPIO_Write(base, pinNum, 0);
39+
break;
40+
}
41+
}
42+
}
43+
}
44+
else{
45+
for (size_t i = 0; i < numBytes; i++){
46+
uint8_t b = pixels[i];
47+
for (uint8_t j = 0; j < 8; j++) {
48+
bool bit = (b & 0x80) != 0;
49+
b <<= 1;
50+
switch (bit){
51+
case 1:
52+
// Send a 1-bit
53+
Cy_GPIO_Write(base, pinNum, 1);
54+
Cy_GPIO_Write(base, pinNum, 1);
55+
Cy_GPIO_Write(base, pinNum, 1);
56+
Cy_GPIO_Write(base, pinNum, 1);
57+
Cy_GPIO_Write(base, pinNum, 1);
58+
Cy_GPIO_Write(base, pinNum, 1);
59+
Cy_GPIO_Write(base, pinNum, 1);
60+
Cy_GPIO_Write(base, pinNum, 1);
61+
Cy_GPIO_Write(base, pinNum, 0);
62+
Cy_GPIO_Write(base, pinNum, 0);
63+
Cy_GPIO_Write(base, pinNum, 0);
64+
break;
65+
case 0:
66+
// Send a 0-bit
67+
Cy_GPIO_Write(base, pinNum, 1);
68+
Cy_GPIO_Write(base, pinNum, 1);
69+
Cy_GPIO_Write(base, pinNum, 1);
70+
Cy_GPIO_Write(base, pinNum, 1);
71+
Cy_GPIO_Write(base, pinNum, 0);
72+
Cy_GPIO_Write(base, pinNum, 0);
73+
Cy_GPIO_Write(base, pinNum, 0);
74+
Cy_GPIO_Write(base, pinNum, 0);
75+
Cy_GPIO_Write(base, pinNum, 0);
76+
Cy_GPIO_Write(base, pinNum, 0);
77+
Cy_GPIO_Write(base, pinNum, 0);
78+
break;
79+
}
80+
}
81+
}
82+
}
83+
interrupts();
84+
delayMicroseconds(50);
85+
return;
86+
}
87+
#endif

0 commit comments

Comments
 (0)