Skip to content

Commit 902f408

Browse files
aykevldeadprogram
authored andcommitted
samd21: add GPIO support for port B
1 parent 5438f16 commit 902f408

File tree

1 file changed

+116
-9
lines changed

1 file changed

+116
-9
lines changed

src/machine/machine_atsamd21.go

Lines changed: 116 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,24 @@ const (
4040
func (p GPIO) Configure(config GPIOConfig) {
4141
switch config.Mode {
4242
case GPIO_OUTPUT:
43-
sam.PORT.DIRSET0 = (1 << p.Pin)
44-
// output is also set to input enable so pin can read back its own value
45-
p.setPinCfg(sam.PORT_PINCFG0_INEN)
43+
if p.Pin < 32 {
44+
sam.PORT.DIRSET0 = (1 << p.Pin)
45+
// output is also set to input enable so pin can read back its own value
46+
p.setPinCfg(sam.PORT_PINCFG0_INEN)
47+
} else {
48+
sam.PORT.DIRSET1 = (1 << (p.Pin - 32))
49+
// output is also set to input enable so pin can read back its own value
50+
p.setPinCfg(sam.PORT_PINCFG0_INEN)
51+
}
4652

4753
case GPIO_INPUT:
48-
sam.PORT.DIRCLR0 = (1 << p.Pin)
49-
p.setPinCfg(sam.PORT_PINCFG0_INEN)
54+
if p.Pin < 32 {
55+
sam.PORT.DIRCLR0 = (1 << p.Pin)
56+
p.setPinCfg(sam.PORT_PINCFG0_INEN)
57+
} else {
58+
sam.PORT.DIRCLR0 = (1 << p.Pin)
59+
p.setPinCfg(sam.PORT_PINCFG0_INEN)
60+
}
5061

5162
case GPIO_SERCOM:
5263
if p.Pin&1 > 0 {
@@ -78,16 +89,48 @@ func (p GPIO) Configure(config GPIOConfig) {
7889

7990
// Get returns the current value of a GPIO pin.
8091
func (p GPIO) Get() bool {
81-
return (sam.PORT.IN0>>p.Pin)&1 > 0
92+
if p.Pin < 32 {
93+
return (sam.PORT.IN0>>p.Pin)&1 > 0
94+
} else {
95+
return (sam.PORT.IN1>>p.Pin)&1 > 0
96+
}
8297
}
8398

8499
// Set the pin to high or low.
85100
// Warning: only use this on an output pin!
86101
func (p GPIO) Set(high bool) {
87-
if high {
88-
sam.PORT.OUTSET0 = (1 << p.Pin)
102+
if p.Pin < 32 {
103+
if high {
104+
sam.PORT.OUTSET0 = (1 << p.Pin)
105+
} else {
106+
sam.PORT.OUTCLR0 = (1 << p.Pin)
107+
}
108+
} else {
109+
if high {
110+
sam.PORT.OUTSET1 = (1 << (p.Pin - 32))
111+
} else {
112+
sam.PORT.OUTCLR1 = (1 << (p.Pin - 32))
113+
}
114+
}
115+
}
116+
117+
// Return the register and mask to enable a given GPIO pin. This can be used to
118+
// implement bit-banged drivers.
119+
func (p GPIO) PortMaskSet() (*uint32, uint32) {
120+
if p.Pin < 32 {
121+
return (*uint32)(&sam.PORT.OUTSET0), 1 << p.Pin
122+
} else {
123+
return (*uint32)(&sam.PORT.OUTSET1), 1 << (p.Pin - 32)
124+
}
125+
}
126+
127+
// Return the register and mask to disable a given port. This can be used to
128+
// implement bit-banged drivers.
129+
func (p GPIO) PortMaskClear() (*uint32, uint32) {
130+
if p.Pin < 32 {
131+
return (*uint32)(&sam.PORT.OUTCLR0), 1 << p.Pin
89132
} else {
90-
sam.PORT.OUTCLR0 = (1 << p.Pin)
133+
return (*uint32)(&sam.PORT.OUTCLR1), 1 << (p.Pin - 32)
91134
}
92135
}
93136

@@ -859,6 +902,70 @@ func setPinCfg(p uint8, val sam.RegValue8) {
859902
sam.PORT.PINCFG0_30 = val
860903
case 31:
861904
sam.PORT.PINCFG0_31 = val
905+
case 32: // PB00
906+
sam.PORT.PINCFG1_0 = sam.RegValue(val) << 24
907+
case 33: // PB01
908+
sam.PORT.PINCFG1_0 = sam.RegValue(val) << 16
909+
case 34: // PB02
910+
sam.PORT.PINCFG1_0 = sam.RegValue(val) << 8
911+
case 35: // PB03
912+
sam.PORT.PINCFG1_0 = sam.RegValue(val)
913+
case 36: // PB04
914+
sam.PORT.PINCFG1_4 = sam.RegValue(val) << 24
915+
case 37: // PB05
916+
sam.PORT.PINCFG1_4 = sam.RegValue(val) << 16
917+
case 38: // PB06
918+
sam.PORT.PINCFG1_4 = sam.RegValue(val) << 8
919+
case 39: // PB07
920+
sam.PORT.PINCFG1_4 = sam.RegValue(val)
921+
case 40: // PB08
922+
sam.PORT.PINCFG1_8 = sam.RegValue(val) << 24
923+
case 41: // PB09
924+
sam.PORT.PINCFG1_8 = sam.RegValue(val) << 16
925+
case 42: // PB10
926+
sam.PORT.PINCFG1_8 = sam.RegValue(val) << 8
927+
case 43: // PB11
928+
sam.PORT.PINCFG1_8 = sam.RegValue(val)
929+
case 44: // PB12
930+
sam.PORT.PINCFG1_12 = sam.RegValue(val) << 24
931+
case 45: // PB13
932+
sam.PORT.PINCFG1_12 = sam.RegValue(val) << 16
933+
case 46: // PB14
934+
sam.PORT.PINCFG1_12 = sam.RegValue(val) << 8
935+
case 47: // PB15
936+
sam.PORT.PINCFG1_12 = sam.RegValue(val)
937+
case 48: // PB16
938+
sam.PORT.PINCFG1_16 = sam.RegValue(val) << 24
939+
case 49: // PB17
940+
sam.PORT.PINCFG1_16 = sam.RegValue(val) << 16
941+
case 50: // PB18
942+
sam.PORT.PINCFG1_16 = sam.RegValue(val) << 8
943+
case 51: // PB19
944+
sam.PORT.PINCFG1_16 = sam.RegValue(val)
945+
case 52: // PB20
946+
sam.PORT.PINCFG1_20 = sam.RegValue(val) << 24
947+
case 53: // PB21
948+
sam.PORT.PINCFG1_20 = sam.RegValue(val) << 16
949+
case 54: // PB22
950+
sam.PORT.PINCFG1_20 = sam.RegValue(val) << 8
951+
case 55: // PB23
952+
sam.PORT.PINCFG1_20 = sam.RegValue(val)
953+
case 56: // PB24
954+
sam.PORT.PINCFG1_24 = sam.RegValue(val) << 24
955+
case 57: // PB25
956+
sam.PORT.PINCFG1_24 = sam.RegValue(val) << 16
957+
case 58: // PB26
958+
sam.PORT.PINCFG1_24 = sam.RegValue(val) << 8
959+
case 59: // PB27
960+
sam.PORT.PINCFG1_24 = sam.RegValue(val)
961+
case 60: // PB28
962+
sam.PORT.PINCFG1_28 = sam.RegValue(val) << 24
963+
case 61: // PB29
964+
sam.PORT.PINCFG1_28 = sam.RegValue(val) << 16
965+
case 62: // PB30
966+
sam.PORT.PINCFG1_28 = sam.RegValue(val) << 8
967+
case 63: // PB31
968+
sam.PORT.PINCFG1_28 = sam.RegValue(val)
862969
}
863970
}
864971

0 commit comments

Comments
 (0)