Skip to content

Commit 77a59d1

Browse files
committed
ws2812: add RP2350 support
Adding 150MHz support for the RP2350
1 parent c4ff824 commit 77a59d1

File tree

2 files changed

+361
-1
lines changed

2 files changed

+361
-1
lines changed

ws2812/ws2812-asm_cortexm.go

Lines changed: 360 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,356 @@ void ws2812_writeByte125(char c, uint32_t *portSet, uint32_t *portClear, uint32_
931931
[portClear]"m"(*portClear));
932932
}
933933
934+
__attribute__((always_inline))
935+
void ws2812_writeByte150(char c, uint32_t *portSet, uint32_t *portClear, uint32_t maskSet, uint32_t maskClear) {
936+
// Timings:
937+
// T0H: 53 - 55 cycles or 353.3ns - 366.7ns
938+
// T1H: 158 - 160 cycles or 1053.3ns - 1066.7ns
939+
// TLD: 173 - cycles or 1153.3ns -
940+
uint32_t value = (uint32_t)c << 24;
941+
char i = 8;
942+
__asm__ __volatile__(
943+
"1: @ send_bit\n"
944+
"\t str %[maskSet], %[portSet] @ [2] T0H and T0L start here\n"
945+
"\t nop\n"
946+
"\t nop\n"
947+
"\t nop\n"
948+
"\t nop\n"
949+
"\t nop\n"
950+
"\t nop\n"
951+
"\t nop\n"
952+
"\t nop\n"
953+
"\t nop\n"
954+
"\t nop\n"
955+
"\t nop\n"
956+
"\t nop\n"
957+
"\t nop\n"
958+
"\t nop\n"
959+
"\t nop\n"
960+
"\t nop\n"
961+
"\t nop\n"
962+
"\t nop\n"
963+
"\t nop\n"
964+
"\t nop\n"
965+
"\t nop\n"
966+
"\t nop\n"
967+
"\t nop\n"
968+
"\t nop\n"
969+
"\t nop\n"
970+
"\t nop\n"
971+
"\t nop\n"
972+
"\t nop\n"
973+
"\t nop\n"
974+
"\t nop\n"
975+
"\t nop\n"
976+
"\t nop\n"
977+
"\t nop\n"
978+
"\t nop\n"
979+
"\t nop\n"
980+
"\t nop\n"
981+
"\t nop\n"
982+
"\t nop\n"
983+
"\t nop\n"
984+
"\t nop\n"
985+
"\t nop\n"
986+
"\t nop\n"
987+
"\t nop\n"
988+
"\t nop\n"
989+
"\t nop\n"
990+
"\t nop\n"
991+
"\t nop\n"
992+
"\t nop\n"
993+
"\t nop\n"
994+
"\t lsls %[value], #1 @ [1]\n"
995+
"\t bcs.n 2f @ [1/3] skip_store\n"
996+
"\t str %[maskClear], %[portClear] @ [2] T0H -> T0L transition\n"
997+
"\t2: @ skip_store\n"
998+
"\t nop\n"
999+
"\t nop\n"
1000+
"\t nop\n"
1001+
"\t nop\n"
1002+
"\t nop\n"
1003+
"\t nop\n"
1004+
"\t nop\n"
1005+
"\t nop\n"
1006+
"\t nop\n"
1007+
"\t nop\n"
1008+
"\t nop\n"
1009+
"\t nop\n"
1010+
"\t nop\n"
1011+
"\t nop\n"
1012+
"\t nop\n"
1013+
"\t nop\n"
1014+
"\t nop\n"
1015+
"\t nop\n"
1016+
"\t nop\n"
1017+
"\t nop\n"
1018+
"\t nop\n"
1019+
"\t nop\n"
1020+
"\t nop\n"
1021+
"\t nop\n"
1022+
"\t nop\n"
1023+
"\t nop\n"
1024+
"\t nop\n"
1025+
"\t nop\n"
1026+
"\t nop\n"
1027+
"\t nop\n"
1028+
"\t nop\n"
1029+
"\t nop\n"
1030+
"\t nop\n"
1031+
"\t nop\n"
1032+
"\t nop\n"
1033+
"\t nop\n"
1034+
"\t nop\n"
1035+
"\t nop\n"
1036+
"\t nop\n"
1037+
"\t nop\n"
1038+
"\t nop\n"
1039+
"\t nop\n"
1040+
"\t nop\n"
1041+
"\t nop\n"
1042+
"\t nop\n"
1043+
"\t nop\n"
1044+
"\t nop\n"
1045+
"\t nop\n"
1046+
"\t nop\n"
1047+
"\t nop\n"
1048+
"\t nop\n"
1049+
"\t nop\n"
1050+
"\t nop\n"
1051+
"\t nop\n"
1052+
"\t nop\n"
1053+
"\t nop\n"
1054+
"\t nop\n"
1055+
"\t nop\n"
1056+
"\t nop\n"
1057+
"\t nop\n"
1058+
"\t nop\n"
1059+
"\t nop\n"
1060+
"\t nop\n"
1061+
"\t nop\n"
1062+
"\t nop\n"
1063+
"\t nop\n"
1064+
"\t nop\n"
1065+
"\t nop\n"
1066+
"\t nop\n"
1067+
"\t nop\n"
1068+
"\t nop\n"
1069+
"\t nop\n"
1070+
"\t nop\n"
1071+
"\t nop\n"
1072+
"\t nop\n"
1073+
"\t nop\n"
1074+
"\t nop\n"
1075+
"\t nop\n"
1076+
"\t nop\n"
1077+
"\t nop\n"
1078+
"\t nop\n"
1079+
"\t nop\n"
1080+
"\t nop\n"
1081+
"\t nop\n"
1082+
"\t nop\n"
1083+
"\t nop\n"
1084+
"\t nop\n"
1085+
"\t nop\n"
1086+
"\t nop\n"
1087+
"\t nop\n"
1088+
"\t nop\n"
1089+
"\t nop\n"
1090+
"\t nop\n"
1091+
"\t nop\n"
1092+
"\t nop\n"
1093+
"\t nop\n"
1094+
"\t nop\n"
1095+
"\t nop\n"
1096+
"\t nop\n"
1097+
"\t nop\n"
1098+
"\t nop\n"
1099+
"\t nop\n"
1100+
"\t nop\n"
1101+
"\t nop\n"
1102+
"\t nop\n"
1103+
"\t str %[maskClear], %[portClear] @ [2] T1H -> T1L transition\n"
1104+
"\t nop\n"
1105+
"\t nop\n"
1106+
"\t nop\n"
1107+
"\t nop\n"
1108+
"\t nop\n"
1109+
"\t nop\n"
1110+
"\t nop\n"
1111+
"\t nop\n"
1112+
"\t nop\n"
1113+
"\t nop\n"
1114+
"\t nop\n"
1115+
"\t nop\n"
1116+
"\t nop\n"
1117+
"\t nop\n"
1118+
"\t nop\n"
1119+
"\t nop\n"
1120+
"\t nop\n"
1121+
"\t nop\n"
1122+
"\t nop\n"
1123+
"\t nop\n"
1124+
"\t nop\n"
1125+
"\t nop\n"
1126+
"\t nop\n"
1127+
"\t nop\n"
1128+
"\t nop\n"
1129+
"\t nop\n"
1130+
"\t nop\n"
1131+
"\t nop\n"
1132+
"\t nop\n"
1133+
"\t nop\n"
1134+
"\t nop\n"
1135+
"\t nop\n"
1136+
"\t nop\n"
1137+
"\t nop\n"
1138+
"\t nop\n"
1139+
"\t nop\n"
1140+
"\t nop\n"
1141+
"\t nop\n"
1142+
"\t nop\n"
1143+
"\t nop\n"
1144+
"\t nop\n"
1145+
"\t nop\n"
1146+
"\t nop\n"
1147+
"\t nop\n"
1148+
"\t nop\n"
1149+
"\t nop\n"
1150+
"\t nop\n"
1151+
"\t nop\n"
1152+
"\t nop\n"
1153+
"\t nop\n"
1154+
"\t nop\n"
1155+
"\t nop\n"
1156+
"\t nop\n"
1157+
"\t nop\n"
1158+
"\t nop\n"
1159+
"\t nop\n"
1160+
"\t nop\n"
1161+
"\t nop\n"
1162+
"\t nop\n"
1163+
"\t nop\n"
1164+
"\t nop\n"
1165+
"\t nop\n"
1166+
"\t nop\n"
1167+
"\t nop\n"
1168+
"\t nop\n"
1169+
"\t nop\n"
1170+
"\t nop\n"
1171+
"\t nop\n"
1172+
"\t nop\n"
1173+
"\t nop\n"
1174+
"\t nop\n"
1175+
"\t nop\n"
1176+
"\t nop\n"
1177+
"\t nop\n"
1178+
"\t nop\n"
1179+
"\t nop\n"
1180+
"\t nop\n"
1181+
"\t nop\n"
1182+
"\t nop\n"
1183+
"\t nop\n"
1184+
"\t nop\n"
1185+
"\t nop\n"
1186+
"\t nop\n"
1187+
"\t nop\n"
1188+
"\t nop\n"
1189+
"\t nop\n"
1190+
"\t nop\n"
1191+
"\t nop\n"
1192+
"\t nop\n"
1193+
"\t nop\n"
1194+
"\t nop\n"
1195+
"\t nop\n"
1196+
"\t nop\n"
1197+
"\t nop\n"
1198+
"\t nop\n"
1199+
"\t nop\n"
1200+
"\t nop\n"
1201+
"\t nop\n"
1202+
"\t nop\n"
1203+
"\t nop\n"
1204+
"\t nop\n"
1205+
"\t nop\n"
1206+
"\t nop\n"
1207+
"\t nop\n"
1208+
"\t nop\n"
1209+
"\t nop\n"
1210+
"\t nop\n"
1211+
"\t nop\n"
1212+
"\t nop\n"
1213+
"\t nop\n"
1214+
"\t nop\n"
1215+
"\t nop\n"
1216+
"\t nop\n"
1217+
"\t nop\n"
1218+
"\t nop\n"
1219+
"\t nop\n"
1220+
"\t nop\n"
1221+
"\t nop\n"
1222+
"\t nop\n"
1223+
"\t nop\n"
1224+
"\t nop\n"
1225+
"\t nop\n"
1226+
"\t nop\n"
1227+
"\t nop\n"
1228+
"\t nop\n"
1229+
"\t nop\n"
1230+
"\t nop\n"
1231+
"\t nop\n"
1232+
"\t nop\n"
1233+
"\t nop\n"
1234+
"\t nop\n"
1235+
"\t nop\n"
1236+
"\t nop\n"
1237+
"\t nop\n"
1238+
"\t nop\n"
1239+
"\t nop\n"
1240+
"\t nop\n"
1241+
"\t nop\n"
1242+
"\t nop\n"
1243+
"\t nop\n"
1244+
"\t nop\n"
1245+
"\t nop\n"
1246+
"\t nop\n"
1247+
"\t nop\n"
1248+
"\t nop\n"
1249+
"\t nop\n"
1250+
"\t nop\n"
1251+
"\t nop\n"
1252+
"\t nop\n"
1253+
"\t nop\n"
1254+
"\t nop\n"
1255+
"\t nop\n"
1256+
"\t nop\n"
1257+
"\t nop\n"
1258+
"\t nop\n"
1259+
"\t nop\n"
1260+
"\t nop\n"
1261+
"\t nop\n"
1262+
"\t nop\n"
1263+
"\t nop\n"
1264+
"\t nop\n"
1265+
"\t nop\n"
1266+
"\t nop\n"
1267+
"\t nop\n"
1268+
"\t nop\n"
1269+
"\t nop\n"
1270+
"\t nop\n"
1271+
"\t nop\n"
1272+
"\t subs %[i], #1 @ [1]\n"
1273+
"\t beq.n 3f @ [1/3] end\n"
1274+
"\t b 1b @ [1/3] send_bit\n"
1275+
"\t3: @ end\n"
1276+
: [value]"+r"(value),
1277+
[i]"+r"(i)
1278+
: [maskSet]"r"(maskSet),
1279+
[portSet]"m"(*portSet),
1280+
[maskClear]"r"(maskClear),
1281+
[portClear]"m"(*portClear));
1282+
}
1283+
9341284
__attribute__((always_inline))
9351285
void ws2812_writeByte168(char c, uint32_t *portSet, uint32_t *portClear, uint32_t maskSet, uint32_t maskClear) {
9361286
// Timings:
@@ -1832,6 +2182,16 @@ func (d Device) writeByte125(c byte) {
18322182
interrupt.Restore(mask)
18332183
}
18342184

2185+
func (d Device) writeByte150(c byte) {
2186+
portSet, maskSet := d.Pin.PortMaskSet()
2187+
portClear, maskClear := d.Pin.PortMaskClear()
2188+
2189+
mask := interrupt.Disable()
2190+
C.ws2812_writeByte150(C.char(c), (*C.uint32_t)(unsafe.Pointer(portSet)), (*C.uint32_t)(unsafe.Pointer(portClear)), C.uint32_t(maskSet), C.uint32_t(maskClear))
2191+
2192+
interrupt.Restore(mask)
2193+
}
2194+
18352195
func (d Device) writeByte168(c byte) {
18362196
portSet, maskSet := d.Pin.PortMaskSet()
18372197
portClear, maskClear := d.Pin.PortMaskClear()

ws2812/ws2812.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Package ws2812 implements a driver for WS2812 and SK6812 RGB LED strips.
22
package ws2812 // import "tinygo.org/x/drivers/ws2812"
33

4-
//go:generate go run gen-ws2812.go -arch=cortexm 16 48 64 120 125 168 200
4+
//go:generate go run gen-ws2812.go -arch=cortexm 16 48 64 120 125 150 168 200
55
//go:generate go run gen-ws2812.go -arch=tinygoriscv 160 320
66

77
import (

0 commit comments

Comments
 (0)