Skip to content

Commit c56b2a4

Browse files
deadprogramaykevl
authored andcommitted
machine/samd21: handle PINMUX and PINCFG registers correctly for PORTB pins
Signed-off-by: Ron Evans <[email protected]>
1 parent b1c70d8 commit c56b2a4

File tree

1 file changed

+162
-34
lines changed

1 file changed

+162
-34
lines changed

src/machine/machine_atsamd21.go

Lines changed: 162 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func (p GPIO) Configure(config GPIOConfig) {
123123
sam.PORT.DIRCLR0 = (1 << p.Pin)
124124
p.setPinCfg(sam.PORT_PINCFG0_INEN)
125125
} else {
126-
sam.PORT.DIRCLR0 = (1 << p.Pin)
126+
sam.PORT.DIRCLR1 = (1<<p.Pin - 32)
127127
p.setPinCfg(sam.PORT_PINCFG0_INEN)
128128
}
129129

@@ -160,7 +160,7 @@ func (p GPIO) Get() bool {
160160
if p.Pin < 32 {
161161
return (sam.PORT.IN0>>p.Pin)&1 > 0
162162
} else {
163-
return (sam.PORT.IN1>>p.Pin)&1 > 0
163+
return (sam.PORT.IN1>>(p.Pin-32))&1 > 0
164164
}
165165
}
166166

@@ -787,6 +787,38 @@ func getPMux(p uint8) sam.RegValue8 {
787787
return sam.PORT.PMUX0_14
788788
case 15:
789789
return sam.PORT.PMUX0_15
790+
case 16:
791+
return sam.RegValue8(sam.PORT.PMUX1_0>>24) & 0xff
792+
case 17:
793+
return sam.RegValue8(sam.PORT.PMUX1_0>>16) & 0xff
794+
case 18:
795+
return sam.RegValue8(sam.PORT.PMUX1_0>>8) & 0xff
796+
case 19:
797+
return sam.RegValue8(sam.PORT.PMUX1_0 & 0xff)
798+
case 20:
799+
return sam.RegValue8(sam.PORT.PMUX1_4>>24) & 0xff
800+
case 21:
801+
return sam.RegValue8(sam.PORT.PMUX1_4>>16) & 0xff
802+
case 22:
803+
return sam.RegValue8(sam.PORT.PMUX1_4>>8) & 0xff
804+
case 23:
805+
return sam.RegValue8(sam.PORT.PMUX1_4 & 0xff)
806+
case 24:
807+
return sam.RegValue8(sam.PORT.PMUX1_8>>24) & 0xff
808+
case 25:
809+
return sam.RegValue8(sam.PORT.PMUX1_8>>16) & 0xff
810+
case 26:
811+
return sam.RegValue8(sam.PORT.PMUX1_8>>8) & 0xff
812+
case 27:
813+
return sam.RegValue8(sam.PORT.PMUX1_8 & 0xff)
814+
case 28:
815+
return sam.RegValue8(sam.PORT.PMUX1_12>>24) & 0xff
816+
case 29:
817+
return sam.RegValue8(sam.PORT.PMUX1_12>>16) & 0xff
818+
case 30:
819+
return sam.RegValue8(sam.PORT.PMUX1_12>>8) & 0xff
820+
case 31:
821+
return sam.RegValue8(sam.PORT.PMUX1_12 & 0xff)
790822
default:
791823
return 0
792824
}
@@ -828,6 +860,38 @@ func setPMux(p uint8, val sam.RegValue8) {
828860
sam.PORT.PMUX0_14 = val
829861
case 15:
830862
sam.PORT.PMUX0_15 = val
863+
case 16:
864+
sam.PORT.PMUX1_0 = (sam.PORT.PMUX1_0 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
865+
case 17:
866+
sam.PORT.PMUX1_0 = (sam.PORT.PMUX1_0 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
867+
case 18:
868+
sam.PORT.PMUX1_0 = (sam.PORT.PMUX1_0 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
869+
case 19:
870+
sam.PORT.PMUX1_0 = (sam.PORT.PMUX1_0 &^ 0xff) | (sam.RegValue(val))
871+
case 20:
872+
sam.PORT.PMUX1_4 = (sam.PORT.PMUX1_4 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
873+
case 21:
874+
sam.PORT.PMUX1_4 = (sam.PORT.PMUX1_4 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
875+
case 22:
876+
sam.PORT.PMUX1_4 = (sam.PORT.PMUX1_4 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
877+
case 23:
878+
sam.PORT.PMUX1_4 = (sam.PORT.PMUX1_4 &^ 0xff) | (sam.RegValue(val))
879+
case 24:
880+
sam.PORT.PMUX1_8 = (sam.PORT.PMUX1_8 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
881+
case 25:
882+
sam.PORT.PMUX1_8 = (sam.PORT.PMUX1_8 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
883+
case 26:
884+
sam.PORT.PMUX1_8 = (sam.PORT.PMUX1_8 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
885+
case 27:
886+
sam.PORT.PMUX1_8 = (sam.PORT.PMUX1_8 &^ 0xff) | (sam.RegValue(val))
887+
case 28:
888+
sam.PORT.PMUX1_12 = (sam.PORT.PMUX1_12 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
889+
case 29:
890+
sam.PORT.PMUX1_12 = (sam.PORT.PMUX1_12 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
891+
case 30:
892+
sam.PORT.PMUX1_12 = (sam.PORT.PMUX1_12 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
893+
case 31:
894+
sam.PORT.PMUX1_12 = (sam.PORT.PMUX1_12 &^ 0xff) | (sam.RegValue(val))
831895
}
832896
}
833897

@@ -898,6 +962,70 @@ func getPinCfg(p uint8) sam.RegValue8 {
898962
return sam.PORT.PINCFG0_30
899963
case 31:
900964
return sam.PORT.PINCFG0_31
965+
case 32: // PB00
966+
return sam.RegValue8(sam.PORT.PINCFG1_0>>24) & 0xff
967+
case 33: // PB01
968+
return sam.RegValue8(sam.PORT.PINCFG1_0>>16) & 0xff
969+
case 34: // PB02
970+
return sam.RegValue8(sam.PORT.PINCFG1_0>>8) & 0xff
971+
case 35: // PB03
972+
return sam.RegValue8(sam.PORT.PINCFG1_0 & 0xff)
973+
case 37: // PB04
974+
return sam.RegValue8(sam.PORT.PINCFG1_4>>24) & 0xff
975+
case 38: // PB05
976+
return sam.RegValue8(sam.PORT.PINCFG1_4>>16) & 0xff
977+
case 39: // PB06
978+
return sam.RegValue8(sam.PORT.PINCFG1_4>>8) & 0xff
979+
case 40: // PB07
980+
return sam.RegValue8(sam.PORT.PINCFG1_4 & 0xff)
981+
case 41: // PB08
982+
return sam.RegValue8(sam.PORT.PINCFG1_8>>24) & 0xff
983+
case 42: // PB09
984+
return sam.RegValue8(sam.PORT.PINCFG1_8>>16) & 0xff
985+
case 43: // PB10
986+
return sam.RegValue8(sam.PORT.PINCFG1_8>>8) & 0xff
987+
case 44: // PB11
988+
return sam.RegValue8(sam.PORT.PINCFG1_8 & 0xff)
989+
case 45: // PB12
990+
return sam.RegValue8(sam.PORT.PINCFG1_12>>24) & 0xff
991+
case 46: // PB13
992+
return sam.RegValue8(sam.PORT.PINCFG1_12>>16) & 0xff
993+
case 47: // PB14
994+
return sam.RegValue8(sam.PORT.PINCFG1_12>>8) & 0xff
995+
case 48: // PB15
996+
return sam.RegValue8(sam.PORT.PINCFG1_12 & 0xff)
997+
case 49: // PB16
998+
return sam.RegValue8(sam.PORT.PINCFG1_16>>24) & 0xff
999+
case 50: // PB17
1000+
return sam.RegValue8(sam.PORT.PINCFG1_16>>16) & 0xff
1001+
case 51: // PB18
1002+
return sam.RegValue8(sam.PORT.PINCFG1_16>>8) & 0xff
1003+
case 52: // PB19
1004+
return sam.RegValue8(sam.PORT.PINCFG1_16 & 0xff)
1005+
case 53: // PB20
1006+
return sam.RegValue8(sam.PORT.PINCFG1_20>>24) & 0xff
1007+
case 54: // PB21
1008+
return sam.RegValue8(sam.PORT.PINCFG1_20>>16) & 0xff
1009+
case 55: // PB22
1010+
return sam.RegValue8(sam.PORT.PINCFG1_20>>8) & 0xff
1011+
case 56: // PB23
1012+
return sam.RegValue8(sam.PORT.PINCFG1_20 & 0xff)
1013+
case 57: // PB24
1014+
return sam.RegValue8(sam.PORT.PINCFG1_24>>24) & 0xff
1015+
case 58: // PB25
1016+
return sam.RegValue8(sam.PORT.PINCFG1_24>>16) & 0xff
1017+
case 59: // PB26
1018+
return sam.RegValue8(sam.PORT.PINCFG1_24>>8) & 0xff
1019+
case 60: // PB27
1020+
return sam.RegValue8(sam.PORT.PINCFG1_24 & 0xff)
1021+
case 61: // PB28
1022+
return sam.RegValue8(sam.PORT.PINCFG1_28>>24) & 0xff
1023+
case 62: // PB29
1024+
return sam.RegValue8(sam.PORT.PINCFG1_28>>16) & 0xff
1025+
case 63: // PB30
1026+
return sam.RegValue8(sam.PORT.PINCFG1_28>>8) & 0xff
1027+
case 64: // PB31
1028+
return sam.RegValue8(sam.PORT.PINCFG1_28 & 0xff)
9011029
default:
9021030
return 0
9031031
}
@@ -971,69 +1099,69 @@ func setPinCfg(p uint8, val sam.RegValue8) {
9711099
case 31:
9721100
sam.PORT.PINCFG0_31 = val
9731101
case 32: // PB00
974-
sam.PORT.PINCFG1_0 = sam.RegValue(val) << 24
1102+
sam.PORT.PINCFG1_0 = (sam.PORT.PINCFG1_0 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
9751103
case 33: // PB01
976-
sam.PORT.PINCFG1_0 = sam.RegValue(val) << 16
1104+
sam.PORT.PINCFG1_0 = (sam.PORT.PINCFG1_0 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
9771105
case 34: // PB02
978-
sam.PORT.PINCFG1_0 = sam.RegValue(val) << 8
1106+
sam.PORT.PINCFG1_0 = (sam.PORT.PINCFG1_0 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
9791107
case 35: // PB03
980-
sam.PORT.PINCFG1_0 = sam.RegValue(val)
1108+
sam.PORT.PINCFG1_0 = (sam.PORT.PINCFG1_0 &^ 0xff) | (sam.RegValue(val))
9811109
case 36: // PB04
982-
sam.PORT.PINCFG1_4 = sam.RegValue(val) << 24
1110+
sam.PORT.PINCFG1_4 = (sam.PORT.PINCFG1_4 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
9831111
case 37: // PB05
984-
sam.PORT.PINCFG1_4 = sam.RegValue(val) << 16
1112+
sam.PORT.PINCFG1_4 = (sam.PORT.PINCFG1_4 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
9851113
case 38: // PB06
986-
sam.PORT.PINCFG1_4 = sam.RegValue(val) << 8
1114+
sam.PORT.PINCFG1_4 = (sam.PORT.PINCFG1_4 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
9871115
case 39: // PB07
988-
sam.PORT.PINCFG1_4 = sam.RegValue(val)
1116+
sam.PORT.PINCFG1_4 = (sam.PORT.PINCFG1_4 &^ 0xff) | (sam.RegValue(val))
9891117
case 40: // PB08
990-
sam.PORT.PINCFG1_8 = sam.RegValue(val) << 24
1118+
sam.PORT.PINCFG1_8 = (sam.PORT.PINCFG1_8 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
9911119
case 41: // PB09
992-
sam.PORT.PINCFG1_8 = sam.RegValue(val) << 16
1120+
sam.PORT.PINCFG1_8 = (sam.PORT.PINCFG1_8 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
9931121
case 42: // PB10
994-
sam.PORT.PINCFG1_8 = sam.RegValue(val) << 8
1122+
sam.PORT.PINCFG1_8 = (sam.PORT.PINCFG1_8 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
9951123
case 43: // PB11
996-
sam.PORT.PINCFG1_8 = sam.RegValue(val)
1124+
sam.PORT.PINCFG1_8 = (sam.PORT.PINCFG1_8 &^ 0xff) | (sam.RegValue(val))
9971125
case 44: // PB12
998-
sam.PORT.PINCFG1_12 = sam.RegValue(val) << 24
1126+
sam.PORT.PINCFG1_12 = (sam.PORT.PINCFG1_12 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
9991127
case 45: // PB13
1000-
sam.PORT.PINCFG1_12 = sam.RegValue(val) << 16
1128+
sam.PORT.PINCFG1_12 = (sam.PORT.PINCFG1_12 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
10011129
case 46: // PB14
1002-
sam.PORT.PINCFG1_12 = sam.RegValue(val) << 8
1130+
sam.PORT.PINCFG1_12 = (sam.PORT.PINCFG1_12 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
10031131
case 47: // PB15
1004-
sam.PORT.PINCFG1_12 = sam.RegValue(val)
1132+
sam.PORT.PINCFG1_12 = (sam.PORT.PINCFG1_12 &^ 0xff) | (sam.RegValue(val))
10051133
case 48: // PB16
1006-
sam.PORT.PINCFG1_16 = sam.RegValue(val) << 24
1134+
sam.PORT.PINCFG1_16 = (sam.PORT.PINCFG1_16 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
10071135
case 49: // PB17
1008-
sam.PORT.PINCFG1_16 = sam.RegValue(val) << 16
1136+
sam.PORT.PINCFG1_16 = (sam.PORT.PINCFG1_16 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
10091137
case 50: // PB18
1010-
sam.PORT.PINCFG1_16 = sam.RegValue(val) << 8
1138+
sam.PORT.PINCFG1_16 = (sam.PORT.PINCFG1_16 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
10111139
case 51: // PB19
1012-
sam.PORT.PINCFG1_16 = sam.RegValue(val)
1140+
sam.PORT.PINCFG1_16 = (sam.PORT.PINCFG1_16 &^ 0xff) | (sam.RegValue(val))
10131141
case 52: // PB20
1014-
sam.PORT.PINCFG1_20 = sam.RegValue(val) << 24
1142+
sam.PORT.PINCFG1_20 = (sam.PORT.PINCFG1_20 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
10151143
case 53: // PB21
1016-
sam.PORT.PINCFG1_20 = sam.RegValue(val) << 16
1144+
sam.PORT.PINCFG1_20 = (sam.PORT.PINCFG1_20 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
10171145
case 54: // PB22
1018-
sam.PORT.PINCFG1_20 = sam.RegValue(val) << 8
1146+
sam.PORT.PINCFG1_20 = (sam.PORT.PINCFG1_20 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
10191147
case 55: // PB23
1020-
sam.PORT.PINCFG1_20 = sam.RegValue(val)
1148+
sam.PORT.PINCFG1_20 = (sam.PORT.PINCFG1_20 &^ 0xff) | (sam.RegValue(val))
10211149
case 56: // PB24
1022-
sam.PORT.PINCFG1_24 = sam.RegValue(val) << 24
1150+
sam.PORT.PINCFG1_24 = (sam.PORT.PINCFG1_24 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
10231151
case 57: // PB25
1024-
sam.PORT.PINCFG1_24 = sam.RegValue(val) << 16
1152+
sam.PORT.PINCFG1_24 = (sam.PORT.PINCFG1_24 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
10251153
case 58: // PB26
1026-
sam.PORT.PINCFG1_24 = sam.RegValue(val) << 8
1154+
sam.PORT.PINCFG1_24 = (sam.PORT.PINCFG1_24 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
10271155
case 59: // PB27
1028-
sam.PORT.PINCFG1_24 = sam.RegValue(val)
1156+
sam.PORT.PINCFG1_24 = (sam.PORT.PINCFG1_24 &^ 0xff) | (sam.RegValue(val))
10291157
case 60: // PB28
1030-
sam.PORT.PINCFG1_28 = sam.RegValue(val) << 24
1158+
sam.PORT.PINCFG1_28 = (sam.PORT.PINCFG1_28 &^ (0xff << 24)) | (sam.RegValue(val) << 24)
10311159
case 61: // PB29
1032-
sam.PORT.PINCFG1_28 = sam.RegValue(val) << 16
1160+
sam.PORT.PINCFG1_28 = (sam.PORT.PINCFG1_28 &^ (0xff << 16)) | (sam.RegValue(val) << 16)
10331161
case 62: // PB30
1034-
sam.PORT.PINCFG1_28 = sam.RegValue(val) << 8
1162+
sam.PORT.PINCFG1_28 = (sam.PORT.PINCFG1_28 &^ (0xff << 8)) | (sam.RegValue(val) << 8)
10351163
case 63: // PB31
1036-
sam.PORT.PINCFG1_28 = sam.RegValue(val)
1164+
sam.PORT.PINCFG1_28 = (sam.PORT.PINCFG1_28 &^ 0xff) | (sam.RegValue(val))
10371165
}
10381166
}
10391167

0 commit comments

Comments
 (0)