This updates lib/cmsis-svd, pulling in the updates to the Espressif SVD
files here:
https://github.com/cmsis-svd/cmsis-svd-data/pull/3

This is needed for wifi/BLE support on the ESP32-C3 (the older SVD files
were missing some necessary interrupts).
Этот коммит содержится в:
Ayke van Laethem 2024-01-30 16:45:24 +01:00 коммит произвёл Ron Evans
родитель d04b07fa8b
коммит 5557e97888
6 изменённых файлов: 73 добавлений и 73 удалений

@ -1 +1 @@
Subproject commit 853bb02dc1ac496576fd9de49483a35fa43ca90e Subproject commit 40327a4d2dff0992682be2872aaa6e096f35d2f4

Просмотреть файл

@ -192,7 +192,7 @@ func (p Pin) SetInterrupt(change PinChange, callback func(Pin)) (err error) {
if callback == nil { if callback == nil {
// Disable this pin interrupt // Disable this pin interrupt
p.pin().ClearBits(esp.GPIO_PIN_PIN_INT_TYPE_Msk | esp.GPIO_PIN_PIN_INT_ENA_Msk) p.pin().ClearBits(esp.GPIO_PIN_INT_TYPE_Msk | esp.GPIO_PIN_INT_ENA_Msk)
if pinCallbacks[p] != nil { if pinCallbacks[p] != nil {
pinCallbacks[p] = nil pinCallbacks[p] = nil
@ -216,8 +216,8 @@ func (p Pin) SetInterrupt(change PinChange, callback func(Pin)) (err error) {
} }
p.pin().Set( p.pin().Set(
(p.pin().Get() & ^uint32(esp.GPIO_PIN_PIN_INT_TYPE_Msk|esp.GPIO_PIN_PIN_INT_ENA_Msk)) | (p.pin().Get() & ^uint32(esp.GPIO_PIN_INT_TYPE_Msk|esp.GPIO_PIN_INT_ENA_Msk)) |
uint32(change)<<esp.GPIO_PIN_PIN_INT_TYPE_Pos | uint32(1)<<esp.GPIO_PIN_PIN_INT_ENA_Pos) uint32(change)<<esp.GPIO_PIN_INT_TYPE_Pos | uint32(1)<<esp.GPIO_PIN_INT_ENA_Pos)
return nil return nil
} }
@ -395,7 +395,7 @@ func initUARTClock(bus *esp.UART_Type, regs registerSet) {
// synchronize core register // synchronize core register
bus.SetID_REG_UPDATE(0) bus.SetID_REG_UPDATE(0)
// enable RTC clock // enable RTC clock
esp.RTC_CNTL.SetRTC_CLK_CONF_DIG_CLK8M_EN(1) esp.RTC_CNTL.SetCLK_CONF_DIG_CLK8M_EN(1)
// wait for Core Clock to ready for configuration // wait for Core Clock to ready for configuration
for bus.GetID_REG_UPDATE() > 0 { for bus.GetID_REG_UPDATE() > 0 {
riscv.Asm("nop") riscv.Asm("nop")
@ -419,7 +419,7 @@ func (uart *UART) setupPins(config UARTConfig, regs registerSet) {
// link TX with GPIO signal X (technical reference manual 5.10) (this is not interrupt signal!) // link TX with GPIO signal X (technical reference manual 5.10) (this is not interrupt signal!)
config.TX.outFunc().Set(regs.gpioMatrixSignal) config.TX.outFunc().Set(regs.gpioMatrixSignal)
// link RX with GPIO signal X and route signals via GPIO matrix (GPIO_SIGn_IN_SEL 0x40) // link RX with GPIO signal X and route signals via GPIO matrix (GPIO_SIGn_IN_SEL 0x40)
inFunc(regs.gpioMatrixSignal).Set(esp.GPIO_FUNC_IN_SEL_CFG_SIG_IN_SEL | uint32(config.RX)) inFunc(regs.gpioMatrixSignal).Set(esp.GPIO_FUNC_IN_SEL_CFG_SEL | uint32(config.RX))
} }
func (uart *UART) configureInterrupt(intrMapReg *volatile.Register32) { // Disable all UART interrupts func (uart *UART) configureInterrupt(intrMapReg *volatile.Register32) { // Disable all UART interrupts
@ -611,8 +611,8 @@ func GetRNG() (ret uint32, err error) {
initADCClock() initADCClock()
// ensure fast RTC clock is enabled // ensure fast RTC clock is enabled
if esp.RTC_CNTL.GetRTC_CLK_CONF_DIG_CLK8M_EN() == 0 { if esp.RTC_CNTL.GetCLK_CONF_DIG_CLK8M_EN() == 0 {
esp.RTC_CNTL.SetRTC_CLK_CONF_DIG_CLK8M_EN(1) esp.RTC_CNTL.SetCLK_CONF_DIG_CLK8M_EN(1)
} }
return esp.APB_CTRL.GetRND_DATA(), nil return esp.APB_CTRL.GetRND_DATA(), nil

Просмотреть файл

@ -52,22 +52,22 @@ func (i2c *I2C) Configure(config I2CConfig) error {
//go:inline //go:inline
func (i2c *I2C) initClock(config I2CConfig) { func (i2c *I2C) initClock(config I2CConfig) {
// reset I2C clock // reset I2C clock
esp.SYSTEM.SetPERIP_RST_EN0_EXT0_RST(1) esp.SYSTEM.SetPERIP_RST_EN0_I2C_EXT0_RST(1)
esp.SYSTEM.SetPERIP_CLK_EN0_EXT0_CLK_EN(1) esp.SYSTEM.SetPERIP_CLK_EN0_I2C_EXT0_CLK_EN(1)
esp.SYSTEM.SetPERIP_RST_EN0_EXT0_RST(0) esp.SYSTEM.SetPERIP_RST_EN0_I2C_EXT0_RST(0)
// disable interrupts // disable interrupts
esp.I2C.INT_ENA.ClearBits(0x3fff) esp.I2C0.INT_ENA.ClearBits(0x3fff)
esp.I2C.INT_CLR.ClearBits(0x3fff) esp.I2C0.INT_CLR.ClearBits(0x3fff)
esp.I2C.SetCLK_CONF_SCLK_SEL(i2cClkSource) esp.I2C0.SetCLK_CONF_SCLK_SEL(i2cClkSource)
esp.I2C.SetCLK_CONF_SCLK_ACTIVE(1) esp.I2C0.SetCLK_CONF_SCLK_ACTIVE(1)
esp.I2C.SetCLK_CONF_SCLK_DIV_NUM(i2cClkSourceFrequency / (config.Frequency * 1024)) esp.I2C0.SetCLK_CONF_SCLK_DIV_NUM(i2cClkSourceFrequency / (config.Frequency * 1024))
esp.I2C.SetCTR_CLK_EN(1) esp.I2C0.SetCTR_CLK_EN(1)
} }
//go:inline //go:inline
func (i2c *I2C) initNoiseFilter() { func (i2c *I2C) initNoiseFilter() {
esp.I2C.FILTER_CFG.Set(0x377) esp.I2C0.FILTER_CFG.Set(0x377)
} }
//go:inline //go:inline
@ -83,13 +83,13 @@ func (i2c *I2C) initPins(config I2CConfig) {
muxConfig |= 1 << esp.IO_MUX_GPIO_FUN_DRV_Pos muxConfig |= 1 << esp.IO_MUX_GPIO_FUN_DRV_Pos
config.SDA.mux().Set(muxConfig) config.SDA.mux().Set(muxConfig)
config.SDA.outFunc().Set(54) config.SDA.outFunc().Set(54)
inFunc(54).Set(uint32(esp.GPIO_FUNC_IN_SEL_CFG_SIG_IN_SEL | config.SDA)) inFunc(54).Set(uint32(esp.GPIO_FUNC_IN_SEL_CFG_SEL | config.SDA))
config.SDA.Set(true) config.SDA.Set(true)
// Configure the pad with the given IO mux configuration. // Configure the pad with the given IO mux configuration.
config.SDA.pinReg().SetBits(esp.GPIO_PIN_PIN_PAD_DRIVER) config.SDA.pinReg().SetBits(esp.GPIO_PIN_PAD_DRIVER)
esp.GPIO.ENABLE.SetBits(1 << int(config.SDA)) esp.GPIO.ENABLE.SetBits(1 << int(config.SDA))
esp.I2C.SetCTR_SDA_FORCE_OUT(1) esp.I2C0.SetCTR_SDA_FORCE_OUT(1)
// SCL // SCL
muxConfig = function << esp.IO_MUX_GPIO_MCU_SEL_Pos muxConfig = function << esp.IO_MUX_GPIO_MCU_SEL_Pos
@ -102,10 +102,10 @@ func (i2c *I2C) initPins(config I2CConfig) {
inFunc(53).Set(uint32(config.SCL)) inFunc(53).Set(uint32(config.SCL))
config.SCL.Set(true) config.SCL.Set(true)
// Configure the pad with the given IO mux configuration. // Configure the pad with the given IO mux configuration.
config.SCL.pinReg().SetBits(esp.GPIO_PIN_PIN_PAD_DRIVER) config.SCL.pinReg().SetBits(esp.GPIO_PIN_PAD_DRIVER)
esp.GPIO.ENABLE.SetBits(1 << int(config.SCL)) esp.GPIO.ENABLE.SetBits(1 << int(config.SCL))
esp.I2C.SetCTR_SCL_FORCE_OUT(1) esp.I2C0.SetCTR_SCL_FORCE_OUT(1)
} }
//go:inline //go:inline
@ -127,48 +127,48 @@ func (i2c *I2C) initFrequency(config I2CConfig) {
setup := halfCycle setup := halfCycle
hold := halfCycle hold := halfCycle
esp.I2C.SetSCL_LOW_PERIOD(sclLow - 1) esp.I2C0.SetSCL_LOW_PERIOD(sclLow - 1)
esp.I2C.SetSCL_HIGH_PERIOD(sclHigh) esp.I2C0.SetSCL_HIGH_PERIOD(sclHigh)
esp.I2C.SetSCL_HIGH_PERIOD_SCL_WAIT_HIGH_PERIOD(25) esp.I2C0.SetSCL_HIGH_PERIOD_SCL_WAIT_HIGH_PERIOD(25)
esp.I2C.SetSCL_RSTART_SETUP_TIME(setup) esp.I2C0.SetSCL_RSTART_SETUP_TIME(setup)
esp.I2C.SetSCL_STOP_SETUP_TIME(setup) esp.I2C0.SetSCL_STOP_SETUP_TIME(setup)
esp.I2C.SetSCL_START_HOLD_TIME(hold - 1) esp.I2C0.SetSCL_START_HOLD_TIME(hold - 1)
esp.I2C.SetSCL_STOP_HOLD_TIME(hold - 1) esp.I2C0.SetSCL_STOP_HOLD_TIME(hold - 1)
esp.I2C.SetSDA_SAMPLE_TIME(sda_sample) esp.I2C0.SetSDA_SAMPLE_TIME(sda_sample)
esp.I2C.SetSDA_HOLD_TIME(sdaHold) esp.I2C0.SetSDA_HOLD_TIME(sdaHold)
} }
//go:inline //go:inline
func (i2c *I2C) startMaster() { func (i2c *I2C) startMaster() {
// FIFO mode for data // FIFO mode for data
esp.I2C.SetFIFO_CONF_NONFIFO_EN(0) esp.I2C0.SetFIFO_CONF_NONFIFO_EN(0)
// Reset TX & RX buffers // Reset TX & RX buffers
esp.I2C.SetFIFO_CONF_RX_FIFO_RST(1) esp.I2C0.SetFIFO_CONF_RX_FIFO_RST(1)
esp.I2C.SetFIFO_CONF_RX_FIFO_RST(0) esp.I2C0.SetFIFO_CONF_RX_FIFO_RST(0)
esp.I2C.SetFIFO_CONF_TX_FIFO_RST(1) esp.I2C0.SetFIFO_CONF_TX_FIFO_RST(1)
esp.I2C.SetFIFO_CONF_TX_FIFO_RST(0) esp.I2C0.SetFIFO_CONF_TX_FIFO_RST(0)
// set timeout value // set timeout value
esp.I2C.TO.Set(0x10) esp.I2C0.TO.Set(0x10)
// enable master mode // enable master mode
esp.I2C.CTR.Set(0x113) esp.I2C0.CTR.Set(0x113)
esp.I2C.SetCTR_CONF_UPGATE(1) esp.I2C0.SetCTR_CONF_UPGATE(1)
resetMaster() resetMaster()
} }
//go:inline //go:inline
func resetMaster() { func resetMaster() {
// reset FSM // reset FSM
esp.I2C.SetCTR_FSM_RST(1) esp.I2C0.SetCTR_FSM_RST(1)
// clear the bus // clear the bus
esp.I2C.SetSCL_SP_CONF_SCL_RST_SLV_NUM(9) esp.I2C0.SetSCL_SP_CONF_SCL_RST_SLV_NUM(9)
esp.I2C.SetSCL_SP_CONF_SCL_RST_SLV_EN(1) esp.I2C0.SetSCL_SP_CONF_SCL_RST_SLV_EN(1)
esp.I2C.SetSCL_STRETCH_CONF_SLAVE_SCL_STRETCH_EN(1) esp.I2C0.SetSCL_STRETCH_CONF_SLAVE_SCL_STRETCH_EN(1)
esp.I2C.SetCTR_CONF_UPGATE(1) esp.I2C0.SetCTR_CONF_UPGATE(1)
esp.I2C.FILTER_CFG.Set(0x377) esp.I2C0.FILTER_CFG.Set(0x377)
// wait for SCL_RST_SLV_EN // wait for SCL_RST_SLV_EN
for esp.I2C.GetSCL_SP_CONF_SCL_RST_SLV_EN() != 0 { for esp.I2C0.GetSCL_SP_CONF_SCL_RST_SLV_EN() != 0 {
} }
esp.I2C.SetSCL_SP_CONF_SCL_RST_SLV_NUM(0) esp.I2C0.SetSCL_SP_CONF_SCL_RST_SLV_NUM(0)
} }
type i2cCommandType = uint32 type i2cCommandType = uint32
@ -194,13 +194,13 @@ func nanotime() int64
func (i2c *I2C) transmit(addr uint16, cmd []i2cCommand, timeoutMS int) error { func (i2c *I2C) transmit(addr uint16, cmd []i2cCommand, timeoutMS int) error {
const intMask = esp.I2C_INT_STATUS_END_DETECT_INT_ST_Msk | esp.I2C_INT_STATUS_TRANS_COMPLETE_INT_ST_Msk | esp.I2C_INT_STATUS_TIME_OUT_INT_ST_Msk | esp.I2C_INT_STATUS_NACK_INT_ST_Msk const intMask = esp.I2C_INT_STATUS_END_DETECT_INT_ST_Msk | esp.I2C_INT_STATUS_TRANS_COMPLETE_INT_ST_Msk | esp.I2C_INT_STATUS_TIME_OUT_INT_ST_Msk | esp.I2C_INT_STATUS_NACK_INT_ST_Msk
esp.I2C.INT_CLR.SetBits(intMask) esp.I2C0.INT_CLR.SetBits(intMask)
esp.I2C.INT_ENA.SetBits(intMask) esp.I2C0.INT_ENA.SetBits(intMask)
esp.I2C.SetCTR_CONF_UPGATE(1) esp.I2C0.SetCTR_CONF_UPGATE(1)
defer func() { defer func() {
esp.I2C.INT_CLR.SetBits(intMask) esp.I2C0.INT_CLR.SetBits(intMask)
esp.I2C.INT_ENA.ClearBits(intMask) esp.I2C0.INT_ENA.ClearBits(intMask)
}() }()
timeoutNS := int64(timeoutMS) * 1000000 timeoutNS := int64(timeoutMS) * 1000000
@ -208,7 +208,7 @@ func (i2c *I2C) transmit(addr uint16, cmd []i2cCommand, timeoutMS int) error {
needRestart := false needRestart := false
readLast := false readLast := false
var readTo []byte var readTo []byte
for cmdIdx, reg := 0, &esp.I2C.COMD0; cmdIdx < len(cmd); { for cmdIdx, reg := 0, &esp.I2C0.COMD0; cmdIdx < len(cmd); {
c := &cmd[cmdIdx] c := &cmd[cmdIdx]
switch c.cmd { switch c.cmd {
@ -221,13 +221,13 @@ func (i2c *I2C) transmit(addr uint16, cmd []i2cCommand, timeoutMS int) error {
count := 32 count := 32
if needAddress { if needAddress {
needAddress = false needAddress = false
esp.I2C.SetFIFO_DATA_FIFO_RDATA((uint32(addr) & 0x7f) << 1) esp.I2C0.SetDATA_FIFO_RDATA((uint32(addr) & 0x7f) << 1)
count-- count--
esp.I2C.SLAVE_ADDR.Set(uint32(addr)) esp.I2C0.SLAVE_ADDR.Set(uint32(addr))
esp.I2C.SetCTR_CONF_UPGATE(1) esp.I2C0.SetCTR_CONF_UPGATE(1)
} }
for ; count > 0 && c.head < len(c.data); count, c.head = count-1, c.head+1 { for ; count > 0 && c.head < len(c.data); count, c.head = count-1, c.head+1 {
esp.I2C.SetFIFO_DATA_FIFO_RDATA(uint32(c.data[c.head])) esp.I2C0.SetDATA_FIFO_RDATA(uint32(c.data[c.head]))
} }
reg.Set(i2cCMD_WRITE | uint32(32-count)) reg.Set(i2cCMD_WRITE | uint32(32-count))
reg = nextAddress(reg) reg = nextAddress(reg)
@ -243,8 +243,8 @@ func (i2c *I2C) transmit(addr uint16, cmd []i2cCommand, timeoutMS int) error {
case i2cCMD_READ: case i2cCMD_READ:
if needAddress { if needAddress {
needAddress = false needAddress = false
esp.I2C.SetFIFO_DATA_FIFO_RDATA((uint32(addr)&0x7f)<<1 | 1) esp.I2C0.SetDATA_FIFO_RDATA((uint32(addr)&0x7f)<<1 | 1)
esp.I2C.SLAVE_ADDR.Set(uint32(addr)) esp.I2C0.SLAVE_ADDR.Set(uint32(addr))
reg.Set(i2cCMD_WRITE | 1) reg.Set(i2cCMD_WRITE | 1)
reg = nextAddress(reg) reg = nextAddress(reg)
} }
@ -256,7 +256,7 @@ func (i2c *I2C) transmit(addr uint16, cmd []i2cCommand, timeoutMS int) error {
reg.Set(i2cCMD_WRITE | 1) reg.Set(i2cCMD_WRITE | 1)
reg = nextAddress(reg) reg = nextAddress(reg)
esp.I2C.SetFIFO_DATA_FIFO_RDATA((uint32(addr)&0x7f)<<1 | 1) esp.I2C0.SetDATA_FIFO_RDATA((uint32(addr)&0x7f)<<1 | 1)
needRestart = false needRestart = false
} }
count := 32 count := 32
@ -291,11 +291,11 @@ func (i2c *I2C) transmit(addr uint16, cmd []i2cCommand, timeoutMS int) error {
} }
if reg == nil { if reg == nil {
// transmit now // transmit now
esp.I2C.SetCTR_CONF_UPGATE(1) esp.I2C0.SetCTR_CONF_UPGATE(1)
esp.I2C.SetCTR_TRANS_START(1) esp.I2C0.SetCTR_TRANS_START(1)
end := nanotime() + timeoutNS end := nanotime() + timeoutNS
var mask uint32 var mask uint32
for mask = esp.I2C.INT_STATUS.Get(); mask&intMask == 0; mask = esp.I2C.INT_STATUS.Get() { for mask = esp.I2C0.INT_STATUS.Get(); mask&intMask == 0; mask = esp.I2C0.INT_STATUS.Get() {
if nanotime() > end { if nanotime() > end {
if readTo != nil { if readTo != nil {
return errI2CReadTimeout return errI2CReadTimeout
@ -312,13 +312,13 @@ func (i2c *I2C) transmit(addr uint16, cmd []i2cCommand, timeoutMS int) error {
} }
return errI2CWriteTimeout return errI2CWriteTimeout
} }
esp.I2C.INT_CLR.SetBits(intMask) esp.I2C0.INT_CLR.SetBits(intMask)
for i := 0; i < len(readTo); i++ { for i := 0; i < len(readTo); i++ {
readTo[i] = byte(esp.I2C.GetFIFO_DATA_FIFO_RDATA() & 0xff) readTo[i] = byte(esp.I2C0.GetDATA_FIFO_RDATA() & 0xff)
c.head++ c.head++
} }
readTo = nil readTo = nil
reg = &esp.I2C.COMD0 reg = &esp.I2C0.COMD0
} }
} }
return nil return nil

Просмотреть файл

@ -201,7 +201,7 @@ func (spi SPI) Configure(config SPIConfig) error {
// configure esp32c3 gpio pin matrix // configure esp32c3 gpio pin matrix
config.SDI.Configure(PinConfig{Mode: PinInput}) config.SDI.Configure(PinConfig{Mode: PinInput})
inFunc(FSPIQ_IN_IDX).Set(esp.GPIO_FUNC_IN_SEL_CFG_SIG_IN_SEL | uint32(config.SDI)) inFunc(FSPIQ_IN_IDX).Set(esp.GPIO_FUNC_IN_SEL_CFG_SEL | uint32(config.SDI))
config.SDO.Configure(PinConfig{Mode: PinOutput}) config.SDO.Configure(PinConfig{Mode: PinOutput})
config.SDO.outFunc().Set(FSPID_OUT_IDX) config.SDO.outFunc().Set(FSPID_OUT_IDX)
config.SCK.Configure(PinConfig{Mode: PinOutput}) config.SCK.Configure(PinConfig{Mode: PinOutput})

Просмотреть файл

@ -31,12 +31,12 @@ func main() {
esp.TIMG0.WDTCONFIG0.Set(0) esp.TIMG0.WDTCONFIG0.Set(0)
// Disable RTC watchdog. // Disable RTC watchdog.
esp.RTC_CNTL.RTC_WDTWPROTECT.Set(0x50D83AA1) esp.RTC_CNTL.WDTWPROTECT.Set(0x50D83AA1)
esp.RTC_CNTL.RTC_WDTCONFIG0.Set(0) esp.RTC_CNTL.WDTCONFIG0.Set(0)
// Disable super watchdog. // Disable super watchdog.
esp.RTC_CNTL.RTC_SWD_WPROTECT.Set(0x8F1D312A) esp.RTC_CNTL.SWD_WPROTECT.Set(0x8F1D312A)
esp.RTC_CNTL.RTC_SWD_CONF.Set(esp.RTC_CNTL_RTC_SWD_CONF_SWD_DISABLE) esp.RTC_CNTL.SWD_CONF.Set(esp.RTC_CNTL_SWD_CONF_SWD_DISABLE)
// Change CPU frequency from 20MHz to 80MHz, by switching from the XTAL to // Change CPU frequency from 20MHz to 80MHz, by switching from the XTAL to
// the PLL clock source (see table "CPU Clock Frequency" in the reference // the PLL clock source (see table "CPU Clock Frequency" in the reference

Просмотреть файл

@ -27,7 +27,7 @@ func initTimer() {
// DIVIDER: 16-bit prescaler, set to 2 for dividing the APB clock by two // DIVIDER: 16-bit prescaler, set to 2 for dividing the APB clock by two
// (40MHz). // (40MHz).
// esp.TIMG0.T0CONFIG.Set(0 << esp.TIMG_T0CONFIG_T0_EN_Pos) // esp.TIMG0.T0CONFIG.Set(0 << esp.TIMG_T0CONFIG_T0_EN_Pos)
esp.TIMG0.T0CONFIG.Set(esp.TIMG_T0CONFIG_T0_EN | esp.TIMG_T0CONFIG_T0_INCREASE | 2<<esp.TIMG_T0CONFIG_T0_DIVIDER_Pos) esp.TIMG0.T0CONFIG.Set(esp.TIMG_T0CONFIG_EN | esp.TIMG_T0CONFIG_INCREASE | 2<<esp.TIMG_T0CONFIG_DIVIDER_Pos)
// esp.TIMG0.T0CONFIG.Set(1 << esp.TIMG_T0CONFIG_T0_DIVCNT_RST_Pos) // esp.TIMG0.T0CONFIG.Set(1 << esp.TIMG_T0CONFIG_T0_DIVCNT_RST_Pos)
// esp.TIMG0.T0CONFIG.Set(esp.TIMG_T0CONFIG_T0_EN) // esp.TIMG0.T0CONFIG.Set(esp.TIMG_T0CONFIG_T0_EN)