@@ -931,6 +931,356 @@ void ws2812_writeByte125(char c, uint32_t *portSet, uint32_t *portClear, uint32_
931
931
[portClear]"m"(*portClear));
932
932
}
933
933
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
+
934
1284
__attribute__((always_inline))
935
1285
void ws2812_writeByte168(char c, uint32_t *portSet, uint32_t *portClear, uint32_t maskSet, uint32_t maskClear) {
936
1286
// Timings:
@@ -1832,6 +2182,16 @@ func (d Device) writeByte125(c byte) {
1832
2182
interrupt .Restore (mask )
1833
2183
}
1834
2184
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
+
1835
2195
func (d Device ) writeByte168 (c byte ) {
1836
2196
portSet , maskSet := d .Pin .PortMaskSet ()
1837
2197
portClear , maskClear := d .Pin .PortMaskClear ()
0 commit comments