Skip to content

Commit 146b0bf

Browse files
neopixels: initial port to AtlasEdge
Signed-off-by: Dan O'Donovan <dan@emutex.com>
1 parent ca4d7f2 commit 146b0bf

File tree

1 file changed

+145
-1
lines changed

1 file changed

+145
-1
lines changed

libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp

Lines changed: 145 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,151 @@ void Adafruit_NeoPixel::show(void) {
10171017
// ESP8266 show() is external to enforce ICACHE_RAM_ATTR execution
10181018
espShow(pin, pixels, numBytes, is800KHz);
10191019

1020-
#endif // ESP8266
1020+
#elif defined(__ARDUINO_ARC__)
1021+
1022+
// Arduino 101 -----------------------------------------------------------
1023+
1024+
PinDescription *pindesc = &g_APinDescription[pin];
1025+
uint8_t *p = pixels, *end = p + numBytes;
1026+
register uint8_t pix, mask;
1027+
1028+
if (pindesc->ulGPIOType == SS_GPIO) {
1029+
register uint32_t reg = pindesc->ulGPIOBase + SS_GPIO_SWPORTA_DR;
1030+
register uint32_t reg_val = __builtin_arc_lr((volatile uint32_t)reg);
1031+
register uint32_t reg_bit_high = reg_val | (1 << pindesc->ulGPIOId);
1032+
register uint32_t reg_bit_low = reg_val & ~(1 << pindesc->ulGPIOId);
1033+
1034+
while(p < end) {
1035+
pix = *p++;
1036+
for(mask = 0x80; mask; mask >>= 1) {
1037+
__builtin_arc_sr(reg_bit_high, (volatile uint32_t)reg);
1038+
if(pix & mask) {
1039+
__builtin_arc_nop();
1040+
__builtin_arc_nop();
1041+
__builtin_arc_nop();
1042+
__builtin_arc_nop();
1043+
__builtin_arc_nop();
1044+
__builtin_arc_nop();
1045+
__builtin_arc_nop();
1046+
__builtin_arc_nop();
1047+
__builtin_arc_nop();
1048+
__builtin_arc_nop();
1049+
__builtin_arc_nop();
1050+
__builtin_arc_nop();
1051+
__builtin_arc_nop();
1052+
__builtin_arc_nop();
1053+
__builtin_arc_nop();
1054+
__builtin_arc_nop();
1055+
__builtin_arc_sr(reg_bit_low, (volatile uint32_t)reg);
1056+
__builtin_arc_nop();
1057+
__builtin_arc_nop();
1058+
__builtin_arc_nop();
1059+
__builtin_arc_nop();
1060+
__builtin_arc_nop();
1061+
__builtin_arc_nop();
1062+
__builtin_arc_nop();
1063+
__builtin_arc_nop();
1064+
} else {
1065+
__builtin_arc_nop();
1066+
__builtin_arc_nop();
1067+
__builtin_arc_nop();
1068+
__builtin_arc_nop();
1069+
__builtin_arc_nop();
1070+
__builtin_arc_nop();
1071+
__builtin_arc_nop();
1072+
__builtin_arc_nop();
1073+
__builtin_arc_nop();
1074+
__builtin_arc_nop();
1075+
__builtin_arc_sr(reg_bit_low, (volatile uint32_t)reg);
1076+
__builtin_arc_nop();
1077+
__builtin_arc_nop();
1078+
__builtin_arc_nop();
1079+
__builtin_arc_nop();
1080+
__builtin_arc_nop();
1081+
__builtin_arc_nop();
1082+
__builtin_arc_nop();
1083+
__builtin_arc_nop();
1084+
__builtin_arc_nop();
1085+
__builtin_arc_nop();
1086+
__builtin_arc_nop();
1087+
__builtin_arc_nop();
1088+
__builtin_arc_nop();
1089+
__builtin_arc_nop();
1090+
__builtin_arc_nop();
1091+
__builtin_arc_nop();
1092+
}
1093+
}
1094+
}
1095+
} else if(pindesc->ulGPIOType == SOC_GPIO) {
1096+
register uint32_t reg = pindesc->ulGPIOBase + SOC_GPIO_SWPORTA_DR;
1097+
register uint32_t reg_val = MMIO_REG_VAL(reg);
1098+
register uint32_t reg_bit_high = reg_val | (1 << pindesc->ulGPIOId);
1099+
register uint32_t reg_bit_low = reg_val & ~(1 << pindesc->ulGPIOId);
1100+
1101+
while(p < end) {
1102+
pix = *p++;
1103+
for(mask = 0x80; mask; mask >>= 1) {
1104+
MMIO_REG_VAL(reg) = reg_bit_high;
1105+
if(pix & mask) {
1106+
__builtin_arc_nop();
1107+
__builtin_arc_nop();
1108+
__builtin_arc_nop();
1109+
__builtin_arc_nop();
1110+
__builtin_arc_nop();
1111+
__builtin_arc_nop();
1112+
__builtin_arc_nop();
1113+
__builtin_arc_nop();
1114+
__builtin_arc_nop();
1115+
__builtin_arc_nop();
1116+
__builtin_arc_nop();
1117+
__builtin_arc_nop();
1118+
__builtin_arc_nop();
1119+
__builtin_arc_nop();
1120+
__builtin_arc_nop();
1121+
__builtin_arc_nop();
1122+
MMIO_REG_VAL(reg) = reg_bit_low;
1123+
__builtin_arc_nop();
1124+
__builtin_arc_nop();
1125+
__builtin_arc_nop();
1126+
__builtin_arc_nop();
1127+
__builtin_arc_nop();
1128+
__builtin_arc_nop();
1129+
__builtin_arc_nop();
1130+
__builtin_arc_nop();
1131+
} else {
1132+
__builtin_arc_nop();
1133+
__builtin_arc_nop();
1134+
__builtin_arc_nop();
1135+
__builtin_arc_nop();
1136+
__builtin_arc_nop();
1137+
__builtin_arc_nop();
1138+
__builtin_arc_nop();
1139+
__builtin_arc_nop();
1140+
__builtin_arc_nop();
1141+
__builtin_arc_nop();
1142+
MMIO_REG_VAL(reg) = reg_bit_low;
1143+
__builtin_arc_nop();
1144+
__builtin_arc_nop();
1145+
__builtin_arc_nop();
1146+
__builtin_arc_nop();
1147+
__builtin_arc_nop();
1148+
__builtin_arc_nop();
1149+
__builtin_arc_nop();
1150+
__builtin_arc_nop();
1151+
__builtin_arc_nop();
1152+
__builtin_arc_nop();
1153+
__builtin_arc_nop();
1154+
__builtin_arc_nop();
1155+
__builtin_arc_nop();
1156+
__builtin_arc_nop();
1157+
__builtin_arc_nop();
1158+
__builtin_arc_nop();
1159+
}
1160+
}
1161+
}
1162+
}
1163+
1164+
#endif
10211165

10221166

10231167
// END ARCHITECTURE SELECT ------------------------------------------------

0 commit comments

Comments
 (0)