@@ -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))
9351285void 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+
18352195func (d Device ) writeByte168 (c byte ) {
18362196 portSet , maskSet := d .Pin .PortMaskSet ()
18372197 portClear , maskClear := d .Pin .PortMaskClear ()
0 commit comments