@@ -40,13 +40,24 @@ const (
4040func (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.
8091func (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!
86101func (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