diff --git a/src/machine/board_k210.go b/src/machine/board_k210.go index de96f1ef..4474728d 100644 --- a/src/machine/board_k210.go +++ b/src/machine/board_k210.go @@ -55,265 +55,3 @@ const ( P46 Pin = 46 P47 Pin = 47 ) - -type FPIOAFunc uint16 - -// FPIOA functions. -const ( - JTAG_TCLK FPIOAFunc = 0 // JTAG Test Clock - JTAG_TDI FPIOAFunc = 1 // JTAG Test Data In - JTAG_TMS FPIOAFunc = 2 // JTAG Test Mode Select - JTAG_TDO FPIOAFunc = 3 // JTAG Test Data Out - SPI0_D0 FPIOAFunc = 4 // SPI0 Data 0 - SPI0_D1 FPIOAFunc = 5 // SPI0 Data 1 - SPI0_D2 FPIOAFunc = 6 // SPI0 Data 2 - SPI0_D3 FPIOAFunc = 7 // SPI0 Data 3 - SPI0_D4 FPIOAFunc = 8 // SPI0 Data 4 - SPI0_D5 FPIOAFunc = 9 // SPI0 Data 5 - SPI0_D6 FPIOAFunc = 10 // SPI0 Data 6 - SPI0_D7 FPIOAFunc = 11 // SPI0 Data 7 - SPI0_SS0 FPIOAFunc = 12 // SPI0 Chip Select 0 - SPI0_SS1 FPIOAFunc = 13 // SPI0 Chip Select 1 - SPI0_SS2 FPIOAFunc = 14 // SPI0 Chip Select 2 - SPI0_SS3 FPIOAFunc = 15 // SPI0 Chip Select 3 - SPI0_ARB FPIOAFunc = 16 // SPI0 Arbitration - SPI0_SCLK FPIOAFunc = 17 // SPI0 Serial Clock - UARTHS_RX FPIOAFunc = 18 // UART High speed Receiver - UARTHS_TX FPIOAFunc = 19 // UART High speed Transmitter - RESV6 FPIOAFunc = 20 // Reserved function - RESV7 FPIOAFunc = 21 // Reserved function - CLK_SPI1 FPIOAFunc = 22 // Clock SPI1 - CLK_I2C1 FPIOAFunc = 23 // Clock I2C1 - GPIOHS0 FPIOAFunc = 24 // GPIO High speed 0 - GPIOHS1 FPIOAFunc = 25 // GPIO High speed 1 - GPIOHS2 FPIOAFunc = 26 // GPIO High speed 2 - GPIOHS3 FPIOAFunc = 27 // GPIO High speed 3 - GPIOHS4 FPIOAFunc = 28 // GPIO High speed 4 - GPIOHS5 FPIOAFunc = 29 // GPIO High speed 5 - GPIOHS6 FPIOAFunc = 30 // GPIO High speed 6 - GPIOHS7 FPIOAFunc = 31 // GPIO High speed 7 - GPIOHS8 FPIOAFunc = 32 // GPIO High speed 8 - GPIOHS9 FPIOAFunc = 33 // GPIO High speed 9 - GPIOHS10 FPIOAFunc = 34 // GPIO High speed 10 - GPIOHS11 FPIOAFunc = 35 // GPIO High speed 11 - GPIOHS12 FPIOAFunc = 36 // GPIO High speed 12 - GPIOHS13 FPIOAFunc = 37 // GPIO High speed 13 - GPIOHS14 FPIOAFunc = 38 // GPIO High speed 14 - GPIOHS15 FPIOAFunc = 39 // GPIO High speed 15 - GPIOHS16 FPIOAFunc = 40 // GPIO High speed 16 - GPIOHS17 FPIOAFunc = 41 // GPIO High speed 17 - GPIOHS18 FPIOAFunc = 42 // GPIO High speed 18 - GPIOHS19 FPIOAFunc = 43 // GPIO High speed 19 - GPIOHS20 FPIOAFunc = 44 // GPIO High speed 20 - GPIOHS21 FPIOAFunc = 45 // GPIO High speed 21 - GPIOHS22 FPIOAFunc = 46 // GPIO High speed 22 - GPIOHS23 FPIOAFunc = 47 // GPIO High speed 23 - GPIOHS24 FPIOAFunc = 48 // GPIO High speed 24 - GPIOHS25 FPIOAFunc = 49 // GPIO High speed 25 - GPIOHS26 FPIOAFunc = 50 // GPIO High speed 26 - GPIOHS27 FPIOAFunc = 51 // GPIO High speed 27 - GPIOHS28 FPIOAFunc = 52 // GPIO High speed 28 - GPIOHS29 FPIOAFunc = 53 // GPIO High speed 29 - GPIOHS30 FPIOAFunc = 54 // GPIO High speed 30 - GPIOHS31 FPIOAFunc = 55 // GPIO High speed 31 - GPIO0 FPIOAFunc = 56 // GPIO pin 0 - GPIO1 FPIOAFunc = 57 // GPIO pin 1 - GPIO2 FPIOAFunc = 58 // GPIO pin 2 - GPIO3 FPIOAFunc = 59 // GPIO pin 3 - GPIO4 FPIOAFunc = 60 // GPIO pin 4 - GPIO5 FPIOAFunc = 61 // GPIO pin 5 - GPIO6 FPIOAFunc = 62 // GPIO pin 6 - GPIO7 FPIOAFunc = 63 // GPIO pin 7 - UART1_RX FPIOAFunc = 64 // UART1 Receiver - UART1_TX FPIOAFunc = 65 // UART1 Transmitter - UART2_RX FPIOAFunc = 66 // UART2 Receiver - UART2_TX FPIOAFunc = 67 // UART2 Transmitter - UART3_RX FPIOAFunc = 68 // UART3 Receiver - UART3_TX FPIOAFunc = 69 // UART3 Transmitter - SPI1_D0 FPIOAFunc = 70 // SPI1 Data 0 - SPI1_D1 FPIOAFunc = 71 // SPI1 Data 1 - SPI1_D2 FPIOAFunc = 72 // SPI1 Data 2 - SPI1_D3 FPIOAFunc = 73 // SPI1 Data 3 - SPI1_D4 FPIOAFunc = 74 // SPI1 Data 4 - SPI1_D5 FPIOAFunc = 75 // SPI1 Data 5 - SPI1_D6 FPIOAFunc = 76 // SPI1 Data 6 - SPI1_D7 FPIOAFunc = 77 // SPI1 Data 7 - SPI1_SS0 FPIOAFunc = 78 // SPI1 Chip Select 0 - SPI1_SS1 FPIOAFunc = 79 // SPI1 Chip Select 1 - SPI1_SS2 FPIOAFunc = 80 // SPI1 Chip Select 2 - SPI1_SS3 FPIOAFunc = 81 // SPI1 Chip Select 3 - SPI1_ARB FPIOAFunc = 82 // SPI1 Arbitration - SPI1_SCLK FPIOAFunc = 83 // SPI1 Serial Clock - SPI_SLAVE_D0 FPIOAFunc = 84 // SPI Slave Data 0 - SPI_SLAVE_SS FPIOAFunc = 85 // SPI Slave Select - SPI_SLAVE_SCLK FPIOAFunc = 86 // SPI Slave Serial Clock - I2S0_MCLK FPIOAFunc = 87 // I2S0 Master Clock - I2S0_SCLK FPIOAFunc = 88 // I2S0 Serial Clock(BCLK) - I2S0_WS FPIOAFunc = 89 // I2S0 Word Select(LRCLK) - I2S0_IN_D0 FPIOAFunc = 90 // I2S0 Serial Data Input 0 - I2S0_IN_D1 FPIOAFunc = 91 // I2S0 Serial Data Input 1 - I2S0_IN_D2 FPIOAFunc = 92 // I2S0 Serial Data Input 2 - I2S0_IN_D3 FPIOAFunc = 93 // I2S0 Serial Data Input 3 - I2S0_OUT_D0 FPIOAFunc = 94 // I2S0 Serial Data Output 0 - I2S0_OUT_D1 FPIOAFunc = 95 // I2S0 Serial Data Output 1 - I2S0_OUT_D2 FPIOAFunc = 96 // I2S0 Serial Data Output 2 - I2S0_OUT_D3 FPIOAFunc = 97 // I2S0 Serial Data Output 3 - I2S1_MCLK FPIOAFunc = 98 // I2S1 Master Clock - I2S1_SCLK FPIOAFunc = 99 // I2S1 Serial Clock(BCLK) - I2S1_WS FPIOAFunc = 100 // I2S1 Word Select(LRCLK) - I2S1_IN_D0 FPIOAFunc = 101 // I2S1 Serial Data Input 0 - I2S1_IN_D1 FPIOAFunc = 102 // I2S1 Serial Data Input 1 - I2S1_IN_D2 FPIOAFunc = 103 // I2S1 Serial Data Input 2 - I2S1_IN_D3 FPIOAFunc = 104 // I2S1 Serial Data Input 3 - I2S1_OUT_D0 FPIOAFunc = 105 // I2S1 Serial Data Output 0 - I2S1_OUT_D1 FPIOAFunc = 106 // I2S1 Serial Data Output 1 - I2S1_OUT_D2 FPIOAFunc = 107 // I2S1 Serial Data Output 2 - I2S1_OUT_D3 FPIOAFunc = 108 // I2S1 Serial Data Output 3 - I2S2_MCLK FPIOAFunc = 109 // I2S2 Master Clock - I2S2_SCLK FPIOAFunc = 110 // I2S2 Serial Clock(BCLK) - I2S2_WS FPIOAFunc = 111 // I2S2 Word Select(LRCLK) - I2S2_IN_D0 FPIOAFunc = 112 // I2S2 Serial Data Input 0 - I2S2_IN_D1 FPIOAFunc = 113 // I2S2 Serial Data Input 1 - I2S2_IN_D2 FPIOAFunc = 114 // I2S2 Serial Data Input 2 - I2S2_IN_D3 FPIOAFunc = 115 // I2S2 Serial Data Input 3 - I2S2_OUT_D0 FPIOAFunc = 116 // I2S2 Serial Data Output 0 - I2S2_OUT_D1 FPIOAFunc = 117 // I2S2 Serial Data Output 1 - I2S2_OUT_D2 FPIOAFunc = 118 // I2S2 Serial Data Output 2 - I2S2_OUT_D3 FPIOAFunc = 119 // I2S2 Serial Data Output 3 - RESV0 FPIOAFunc = 120 // Reserved function - RESV1 FPIOAFunc = 121 // Reserved function - RESV2 FPIOAFunc = 122 // Reserved function - RESV3 FPIOAFunc = 123 // Reserved function - RESV4 FPIOAFunc = 124 // Reserved function - RESV5 FPIOAFunc = 125 // Reserved function - I2C0_SCLK FPIOAFunc = 126 // I2C0 Serial Clock - I2C0_SDA FPIOAFunc = 127 // I2C0 Serial Data - I2C1_SCLK FPIOAFunc = 128 // I2C1 Serial Clock - I2C1_SDA FPIOAFunc = 129 // I2C1 Serial Data - I2C2_SCLK FPIOAFunc = 130 // I2C2 Serial Clock - I2C2_SDA FPIOAFunc = 131 // I2C2 Serial Data - CMOS_XCLK FPIOAFunc = 132 // DVP System Clock - CMOS_RST FPIOAFunc = 133 // DVP System Reset - CMOS_PWDN FPIOAFunc = 134 // DVP Power Down Mode - CMOS_VSYNC FPIOAFunc = 135 // DVP Vertical Sync - CMOS_HREF FPIOAFunc = 136 // DVP Horizontal Reference output - CMOS_PCLK FPIOAFunc = 137 // Pixel Clock - CMOS_D0 FPIOAFunc = 138 // Data Bit 0 - CMOS_D1 FPIOAFunc = 139 // Data Bit 1 - CMOS_D2 FPIOAFunc = 140 // Data Bit 2 - CMOS_D3 FPIOAFunc = 141 // Data Bit 3 - CMOS_D4 FPIOAFunc = 142 // Data Bit 4 - CMOS_D5 FPIOAFunc = 143 // Data Bit 5 - CMOS_D6 FPIOAFunc = 144 // Data Bit 6 - CMOS_D7 FPIOAFunc = 145 // Data Bit 7 - SCCB_SCLK FPIOAFunc = 146 // SCCB Serial Clock - SCCB_SDA FPIOAFunc = 147 // SCCB Serial Data - UART1_CTS FPIOAFunc = 148 // UART1 Clear To Send - UART1_DSR FPIOAFunc = 149 // UART1 Data Set Ready - UART1_DCD FPIOAFunc = 150 // UART1 Data Carrier Detect - UART1_RI FPIOAFunc = 151 // UART1 Ring Indicator - UART1_SIR_IN FPIOAFunc = 152 // UART1 Serial Infrared Input - UART1_DTR FPIOAFunc = 153 // UART1 Data Terminal Ready - UART1_RTS FPIOAFunc = 154 // UART1 Request To Send - UART1_OUT2 FPIOAFunc = 155 // UART1 User-designated Output 2 - UART1_OUT1 FPIOAFunc = 156 // UART1 User-designated Output 1 - UART1_SIR_OUT FPIOAFunc = 157 // UART1 Serial Infrared Output - UART1_BAUD FPIOAFunc = 158 // UART1 Transmit Clock Output - UART1_RE FPIOAFunc = 159 // UART1 Receiver Output Enable - UART1_DE FPIOAFunc = 160 // UART1 Driver Output Enable - UART1_RS485_EN FPIOAFunc = 161 // UART1 RS485 Enable - UART2_CTS FPIOAFunc = 162 // UART2 Clear To Send - UART2_DSR FPIOAFunc = 163 // UART2 Data Set Ready - UART2_DCD FPIOAFunc = 164 // UART2 Data Carrier Detect - UART2_RI FPIOAFunc = 165 // UART2 Ring Indicator - UART2_SIR_IN FPIOAFunc = 166 // UART2 Serial Infrared Input - UART2_DTR FPIOAFunc = 167 // UART2 Data Terminal Ready - UART2_RTS FPIOAFunc = 168 // UART2 Request To Send - UART2_OUT2 FPIOAFunc = 169 // UART2 User-designated Output 2 - UART2_OUT1 FPIOAFunc = 170 // UART2 User-designated Output 1 - UART2_SIR_OUT FPIOAFunc = 171 // UART2 Serial Infrared Output - UART2_BAUD FPIOAFunc = 172 // UART2 Transmit Clock Output - UART2_RE FPIOAFunc = 173 // UART2 Receiver Output Enable - UART2_DE FPIOAFunc = 174 // UART2 Driver Output Enable - UART2_RS485_EN FPIOAFunc = 175 // UART2 RS485 Enable - UART3_CTS FPIOAFunc = 176 // UART3 Clear To Send - UART3_DSR FPIOAFunc = 177 // UART3 Data Set Ready - UART3_DCD FPIOAFunc = 178 // UART3 Data Carrier Detect - UART3_RI FPIOAFunc = 179 // UART3 Ring Indicator - UART3_SIR_IN FPIOAFunc = 180 // UART3 Serial Infrared Input - UART3_DTR FPIOAFunc = 181 // UART3 Data Terminal Ready - UART3_RTS FPIOAFunc = 182 // UART3 Request To Send - UART3_OUT2 FPIOAFunc = 183 // UART3 User-designated Output 2 - UART3_OUT1 FPIOAFunc = 184 // UART3 User-designated Output 1 - UART3_SIR_OUT FPIOAFunc = 185 // UART3 Serial Infrared Output - UART3_BAUD FPIOAFunc = 186 // UART3 Transmit Clock Output - UART3_RE FPIOAFunc = 187 // UART3 Receiver Output Enable - UART3_DE FPIOAFunc = 188 // UART3 Driver Output Enable - UART3_RS485_EN FPIOAFunc = 189 // UART3 RS485 Enable - TIMER0_TOGGLE1 FPIOAFunc = 190 // TIMER0 Toggle Output 1 - TIMER0_TOGGLE2 FPIOAFunc = 191 // TIMER0 Toggle Output 2 - TIMER0_TOGGLE3 FPIOAFunc = 192 // TIMER0 Toggle Output 3 - TIMER0_TOGGLE4 FPIOAFunc = 193 // TIMER0 Toggle Output 4 - TIMER1_TOGGLE1 FPIOAFunc = 194 // TIMER1 Toggle Output 1 - TIMER1_TOGGLE2 FPIOAFunc = 195 // TIMER1 Toggle Output 2 - TIMER1_TOGGLE3 FPIOAFunc = 196 // TIMER1 Toggle Output 3 - TIMER1_TOGGLE4 FPIOAFunc = 197 // TIMER1 Toggle Output 4 - TIMER2_TOGGLE1 FPIOAFunc = 198 // TIMER2 Toggle Output 1 - TIMER2_TOGGLE2 FPIOAFunc = 199 // TIMER2 Toggle Output 2 - TIMER2_TOGGLE3 FPIOAFunc = 200 // TIMER2 Toggle Output 3 - TIMER2_TOGGLE4 FPIOAFunc = 201 // TIMER2 Toggle Output 4 - CLK_SPI2 FPIOAFunc = 202 // Clock SPI2 - CLK_I2C2 FPIOAFunc = 203 // Clock I2C2 - INTERNAL0 FPIOAFunc = 204 // Internal function signal 0 - INTERNAL1 FPIOAFunc = 205 // Internal function signal 1 - INTERNAL2 FPIOAFunc = 206 // Internal function signal 2 - INTERNAL3 FPIOAFunc = 207 // Internal function signal 3 - INTERNAL4 FPIOAFunc = 208 // Internal function signal 4 - INTERNAL5 FPIOAFunc = 209 // Internal function signal 5 - INTERNAL6 FPIOAFunc = 210 // Internal function signal 6 - INTERNAL7 FPIOAFunc = 211 // Internal function signal 7 - INTERNAL8 FPIOAFunc = 212 // Internal function signal 8 - INTERNAL9 FPIOAFunc = 213 // Internal function signal 9 - INTERNAL10 FPIOAFunc = 214 // Internal function signal 10 - INTERNAL11 FPIOAFunc = 215 // Internal function signal 11 - INTERNAL12 FPIOAFunc = 216 // Internal function signal 12 - INTERNAL13 FPIOAFunc = 217 // Internal function signal 13 - INTERNAL14 FPIOAFunc = 218 // Internal function signal 14 - INTERNAL15 FPIOAFunc = 219 // Internal function signal 15 - INTERNAL16 FPIOAFunc = 220 // Internal function signal 16 - INTERNAL17 FPIOAFunc = 221 // Internal function signal 17 - CONSTANT FPIOAFunc = 222 // Constant function - INTERNAL18 FPIOAFunc = 223 // Internal function signal 18 - DEBUG0 FPIOAFunc = 224 // Debug function 0 - DEBUG1 FPIOAFunc = 225 // Debug function 1 - DEBUG2 FPIOAFunc = 226 // Debug function 2 - DEBUG3 FPIOAFunc = 227 // Debug function 3 - DEBUG4 FPIOAFunc = 228 // Debug function 4 - DEBUG5 FPIOAFunc = 229 // Debug function 5 - DEBUG6 FPIOAFunc = 230 // Debug function 6 - DEBUG7 FPIOAFunc = 231 // Debug function 7 - DEBUG8 FPIOAFunc = 232 // Debug function 8 - DEBUG9 FPIOAFunc = 233 // Debug function 9 - DEBUG10 FPIOAFunc = 234 // Debug function 10 - DEBUG11 FPIOAFunc = 235 // Debug function 11 - DEBUG12 FPIOAFunc = 236 // Debug function 12 - DEBUG13 FPIOAFunc = 237 // Debug function 13 - DEBUG14 FPIOAFunc = 238 // Debug function 14 - DEBUG15 FPIOAFunc = 239 // Debug function 15 - DEBUG16 FPIOAFunc = 240 // Debug function 16 - DEBUG17 FPIOAFunc = 241 // Debug function 17 - DEBUG18 FPIOAFunc = 242 // Debug function 18 - DEBUG19 FPIOAFunc = 243 // Debug function 19 - DEBUG20 FPIOAFunc = 244 // Debug function 20 - DEBUG21 FPIOAFunc = 245 // Debug function 21 - DEBUG22 FPIOAFunc = 246 // Debug function 22 - DEBUG23 FPIOAFunc = 247 // Debug function 23 - DEBUG24 FPIOAFunc = 248 // Debug function 24 - DEBUG25 FPIOAFunc = 249 // Debug function 25 - DEBUG26 FPIOAFunc = 250 // Debug function 26 - DEBUG27 FPIOAFunc = 251 // Debug function 27 - DEBUG28 FPIOAFunc = 252 // Debug function 28 - DEBUG29 FPIOAFunc = 253 // Debug function 29 - DEBUG30 FPIOAFunc = 254 // Debug function 30 - DEBUG31 FPIOAFunc = 255 // Debug function 31 -) diff --git a/src/machine/machine_k210.go b/src/machine/machine_k210.go index 3c3b506e..e7f145aa 100644 --- a/src/machine/machine_k210.go +++ b/src/machine/machine_k210.go @@ -15,39 +15,111 @@ type PinMode uint8 const ( PinInput PinMode = iota + PinInputPullUp + PinInputPullDown PinOutput - PinPWM - PinSPI - PinI2C = PinSPI ) +type fpioaPullMode uint8 + +const ( + fpioaPullNone fpioaPullMode = iota + fpioaPullDown + fpioaPullUp +) + +func (p Pin) fpioaSetIOPull(pull fpioaPullMode) { + switch pull { + case fpioaPullNone: + kendryte.FPIOA.IO[uint8(p)].ClearBits(kendryte.FPIOA_IO_PU & kendryte.FPIOA_IO_PD) + case fpioaPullUp: + kendryte.FPIOA.IO[uint8(p)].SetBits(kendryte.FPIOA_IO_PU) + kendryte.FPIOA.IO[uint8(p)].ClearBits(kendryte.FPIOA_IO_PD) + case fpioaPullDown: + kendryte.FPIOA.IO[uint8(p)].ClearBits(kendryte.FPIOA_IO_PU) + kendryte.FPIOA.IO[uint8(p)].SetBits(kendryte.FPIOA_IO_PD) + } +} + // Configure this pin with the given configuration. func (p Pin) Configure(config PinConfig) { + var input bool + + kendryte.FPIOA.IO[uint8(p)].SetBits(kendryte.FPIOA_IO_OE_EN | kendryte.FPIOA_IO_IE_EN | kendryte.FPIOA_IO_ST | kendryte.FPIOA_IO_DS_Msk) + switch config.Mode { + case PinInput: + p.fpioaSetIOPull(fpioaPullNone) + input = true + + case PinInputPullUp: + p.fpioaSetIOPull(fpioaPullUp) + input = true + + case PinInputPullDown: + p.fpioaSetIOPull(fpioaPullDown) + input = true + + case PinOutput: + p.fpioaSetIOPull(fpioaPullNone) + input = false + + } + + if p >= P08 && p <= P15 { + // Converts the IO pin number in the effective GPIO number (assuming default FPIOA function). + gpioPin := uint8(p) - 8 + + if input { + kendryte.GPIO.DIRECTION.ClearBits(1 << gpioPin) + } else { + kendryte.GPIO.DIRECTION.SetBits(1 << gpioPin) + } + } else if p >= P16 && p <= P47 { + // Converts the IO pin number in the effective GPIOHS number (assuming default FPIOA function). + gpioPin := uint8(p) - 16 + + if input { + kendryte.GPIOHS.INPUT_EN.SetBits(1 << gpioPin) + kendryte.GPIOHS.OUTPUT_EN.ClearBits(1 << gpioPin) + } else { + kendryte.GPIOHS.OUTPUT_EN.SetBits(1 << gpioPin) + kendryte.GPIOHS.INPUT_EN.ClearBits(1 << gpioPin) + } + } } // Set the pin to high or low. func (p Pin) Set(high bool) { + if p >= P08 && p <= P15 { + gpioPin := uint8(p) - 8 + + if high { + kendryte.GPIO.DATA_OUTPUT.SetBits(1 << gpioPin) + } else { + kendryte.GPIO.DATA_OUTPUT.ClearBits(1 << gpioPin) + } + } else if p >= P16 && p <= P47 { + gpioPin := uint8(p) - 16 + + if high { + kendryte.GPIOHS.OUTPUT_VAL.SetBits(1 << gpioPin) + } else { + kendryte.GPIOHS.OUTPUT_VAL.ClearBits(1 << gpioPin) + } + } } // Get returns the current value of a GPIO pin. func (p Pin) Get() bool { - return true -} - -type FPIOA struct { - Bus *kendryte.FPIOA_Type -} - -var ( - FPIOA0 = FPIOA{Bus: kendryte.FPIOA} -) - -func (fpioa FPIOA) Init() { - // Enable APB0 clock. - kendryte.SYSCTL.CLK_EN_CENT.SetBits(kendryte.SYSCTL_CLK_EN_CENT_APB0_CLK_EN) - - // Enable FPIOA peripheral. - kendryte.SYSCTL.CLK_EN_PERI.SetBits(kendryte.SYSCTL_CLK_EN_PERI_FPIOA_CLK_EN) + var val uint32 + if p >= P08 && p <= P15 { + gpioPin := uint8(p) - 8 + val = kendryte.GPIO.DATA_INPUT.Get() & (1 << gpioPin) + } else if p >= P16 && p <= P47 { + gpioPin := uint8(p) - 16 + val = kendryte.GPIOHS.INPUT_VAL.Get() & (1 << gpioPin) + } + return (val > 0) } type UART struct { diff --git a/src/runtime/runtime_k210.go b/src/runtime/runtime_k210.go index b53ec106..457a1e17 100644 --- a/src/runtime/runtime_k210.go +++ b/src/runtime/runtime_k210.go @@ -99,8 +99,11 @@ func handleInterrupt() { // initPeripherals configures periperhals the way the runtime expects them. func initPeripherals() { + // Enable APB0 clock. + kendryte.SYSCTL.CLK_EN_CENT.SetBits(kendryte.SYSCTL_CLK_EN_CENT_APB0_CLK_EN) - machine.FPIOA0.Init() + // Enable FPIOA peripheral. + kendryte.SYSCTL.CLK_EN_PERI.SetBits(kendryte.SYSCTL_CLK_EN_PERI_FPIOA_CLK_EN) machine.UART0.Configure(machine.UARTConfig{}) } diff --git a/src/runtime/runtime_k210_baremetal.go b/src/runtime/runtime_k210_baremetal.go index f99cb72a..0f993249 100644 --- a/src/runtime/runtime_k210_baremetal.go +++ b/src/runtime/runtime_k210_baremetal.go @@ -3,20 +3,21 @@ package runtime import ( - "device/kendryte" "device/riscv" ) -var clockFrequency int64 = int64(kendryte.SYSCTL.CLK_FREQ.Get()) - -// ticksToNanoseconds converts RTC ticks to nanoseconds. +// ticksToNanoseconds converts CPU ticks to nanoseconds. func ticksToNanoseconds(ticks timeUnit) int64 { - return int64(ticks) * 1e9 / clockFrequency + // The following calculation is actually the following, but with both sides + // reduced to reduce the risk of overflow: + // ticks * 1e9 / (390000000 / 50) + // 50 is the CLINT divider and 390000000 is the CPU frequency. + return int64(ticks) * 5000 / 39 } -// nanosecondsToTicks converts nanoseconds to RTC ticks. +// nanosecondsToTicks converts nanoseconds to CPU ticks. func nanosecondsToTicks(ns int64) timeUnit { - return timeUnit(ns * 64 / 1953125) + return timeUnit(ns * 39 / 5000) } func abort() {