From 92e07ec8afa28662b740009eeee616d312d6d1ff Mon Sep 17 00:00:00 2001 From: Ron Evans Date: Mon, 7 Oct 2019 16:44:57 +0200 Subject: [PATCH] machine/samd51: update to accomodate differences in updated SVD files for from main CMSIS-SVD repo Signed-off-by: Ron Evans --- src/machine/board_itsybitsy-m4.go | 2 +- src/machine/machine_atsamd51.go | 413 +++++++---------------- src/machine/machine_atsamd51g19.go | 508 ++++------------------------- src/runtime/runtime_atsamd51.go | 64 ++-- src/runtime/runtime_atsamd51g19.go | 14 +- 5 files changed, 231 insertions(+), 770 deletions(-) diff --git a/src/machine/board_itsybitsy-m4.go b/src/machine/board_itsybitsy-m4.go index 6998a9cf..3f98d0af 100644 --- a/src/machine/board_itsybitsy-m4.go +++ b/src/machine/board_itsybitsy-m4.go @@ -74,7 +74,7 @@ const ( // SPI on the ItsyBitsy M4. var ( - SPI0 = SPI{Bus: sam.SERCOM1_SPI, + SPI0 = SPI{Bus: sam.SERCOM1_SPIM, SCK: SPI0_SCK_PIN, MOSI: SPI0_MOSI_PIN, MISO: SPI0_MISO_PIN, diff --git a/src/machine/machine_atsamd51.go b/src/machine/machine_atsamd51.go index 85053bc7..af59a674 100644 --- a/src/machine/machine_atsamd51.go +++ b/src/machine/machine_atsamd51.go @@ -316,7 +316,7 @@ func (a ADC) getADCChannel() uint8 { // UART on the SAMD51. type UART struct { Buffer *RingBuffer - Bus *sam.SERCOM_USART_Type + Bus *sam.SERCOM_USART_INT_Type Mode PinMode } @@ -325,7 +325,7 @@ var ( UART0 = USBCDC{Buffer: NewRingBuffer()} // The first hardware serial port on the SAMD51. Uses the SERCOM3 interface. - UART1 = UART{Bus: sam.SERCOM3_USART, + UART1 = UART{Bus: sam.SERCOM3_USART_INT, Buffer: NewRingBuffer(), Mode: PinSERCOMAlt, } @@ -395,17 +395,17 @@ func (uart UART) Configure(config UARTConfig) { config.RX.Configure(PinConfig{Mode: uart.Mode}) // reset SERCOM0 - uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_CTRLA_SWRST) - for uart.Bus.CTRLA.HasBits(sam.SERCOM_USART_CTRLA_SWRST) || - uart.Bus.SYNCBUSY.HasBits(sam.SERCOM_USART_SYNCBUSY_SWRST) { + uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_INT_CTRLA_SWRST) + for uart.Bus.CTRLA.HasBits(sam.SERCOM_USART_INT_CTRLA_SWRST) || + uart.Bus.SYNCBUSY.HasBits(sam.SERCOM_USART_INT_SYNCBUSY_SWRST) { } // set UART mode/sample rate // SERCOM_USART_CTRLA_MODE(mode) | // SERCOM_USART_CTRLA_SAMPR(sampleRate); // sam.SERCOM_USART_CTRLA_MODE_USART_INT_CLK = 1? - uart.Bus.CTRLA.Set((1 << sam.SERCOM_USART_CTRLA_MODE_Pos) | - (1 << sam.SERCOM_USART_CTRLA_SAMPR_Pos)) // sample rate of 16x + uart.Bus.CTRLA.Set((1 << sam.SERCOM_USART_INT_CTRLA_MODE_Pos) | + (1 << sam.SERCOM_USART_INT_CTRLA_SAMPR_Pos)) // sample rate of 16x // Set baud rate uart.SetBaudRate(config.BaudRate) @@ -413,35 +413,35 @@ func (uart UART) Configure(config UARTConfig) { // setup UART frame // SERCOM_USART_CTRLA_FORM( (parityMode == SERCOM_NO_PARITY ? 0 : 1) ) | // dataOrder << SERCOM_USART_CTRLA_DORD_Pos; - uart.Bus.CTRLA.SetBits((0 << sam.SERCOM_USART_CTRLA_FORM_Pos) | // no parity - (lsbFirst << sam.SERCOM_USART_CTRLA_DORD_Pos)) // data order + uart.Bus.CTRLA.SetBits((0 << sam.SERCOM_USART_INT_CTRLA_FORM_Pos) | // no parity + (lsbFirst << sam.SERCOM_USART_INT_CTRLA_DORD_Pos)) // data order // set UART stop bits/parity // SERCOM_USART_CTRLB_CHSIZE(charSize) | // nbStopBits << SERCOM_USART_CTRLB_SBMODE_Pos | // (parityMode == SERCOM_NO_PARITY ? 0 : parityMode) << SERCOM_USART_CTRLB_PMODE_Pos; //If no parity use default value - uart.Bus.CTRLB.SetBits((0 << sam.SERCOM_USART_CTRLB_CHSIZE_Pos) | // 8 bits is 0 - (0 << sam.SERCOM_USART_CTRLB_SBMODE_Pos) | // 1 stop bit is zero - (0 << sam.SERCOM_USART_CTRLB_PMODE_Pos)) // no parity + uart.Bus.CTRLB.SetBits((0 << sam.SERCOM_USART_INT_CTRLB_CHSIZE_Pos) | // 8 bits is 0 + (0 << sam.SERCOM_USART_INT_CTRLB_SBMODE_Pos) | // 1 stop bit is zero + (0 << sam.SERCOM_USART_INT_CTRLB_PMODE_Pos)) // no parity // set UART pads. This is not same as pins... // SERCOM_USART_CTRLA_TXPO(txPad) | // SERCOM_USART_CTRLA_RXPO(rxPad); - uart.Bus.CTRLA.SetBits(uint32((txpad << sam.SERCOM_USART_CTRLA_TXPO_Pos) | - (rxpad << sam.SERCOM_USART_CTRLA_RXPO_Pos))) + uart.Bus.CTRLA.SetBits(uint32((txpad << sam.SERCOM_USART_INT_CTRLA_TXPO_Pos) | + (rxpad << sam.SERCOM_USART_INT_CTRLA_RXPO_Pos))) // Enable Transceiver and Receiver //sercom->USART.CTRLB.reg |= SERCOM_USART_CTRLB_TXEN | SERCOM_USART_CTRLB_RXEN ; - uart.Bus.CTRLB.SetBits(sam.SERCOM_USART_CTRLB_TXEN | sam.SERCOM_USART_CTRLB_RXEN) + uart.Bus.CTRLB.SetBits(sam.SERCOM_USART_INT_CTRLB_TXEN | sam.SERCOM_USART_INT_CTRLB_RXEN) // Enable USART1 port. // sercom->USART.CTRLA.bit.ENABLE = 0x1u; - uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_CTRLA_ENABLE) - for uart.Bus.SYNCBUSY.HasBits(sam.SERCOM_USART_SYNCBUSY_ENABLE) { + uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_INT_CTRLA_ENABLE) + for uart.Bus.SYNCBUSY.HasBits(sam.SERCOM_USART_INT_SYNCBUSY_ENABLE) { } // setup interrupt on receive - uart.Bus.INTENSET.Set(sam.SERCOM_USART_INTENSET_RXC) + uart.Bus.INTENSET.Set(sam.SERCOM_USART_INT_INTENSET_RXC) // Enable RX IRQ. Currently assumes SERCOM3. arm.EnableIRQ(sam.IRQ_SERCOM3_0) @@ -460,14 +460,14 @@ func (uart UART) SetBaudRate(br uint32) { // sercom->USART.BAUD.FRAC.FP = (baudTimes8 % 8); // sercom->USART.BAUD.FRAC.BAUD = (baudTimes8 / 8); - uart.Bus.BAUD.Set(uint16(((baud % 8) << sam.SERCOM_USART_BAUD_FRAC_MODE_FP_Pos) | - ((baud / 8) << sam.SERCOM_USART_BAUD_FRAC_MODE_BAUD_Pos))) + uart.Bus.BAUD.Set(uint16(((baud % 8) << sam.SERCOM_USART_INT_BAUD_FRAC_MODE_FP_Pos) | + ((baud / 8) << sam.SERCOM_USART_INT_BAUD_FRAC_MODE_BAUD_Pos))) } // WriteByte writes a byte of data to the UART. func (uart UART) WriteByte(c byte) error { // wait until ready to receive - for !uart.Bus.INTFLAG.HasBits(sam.SERCOM_USART_INTFLAG_DRE) { + for !uart.Bus.INTFLAG.HasBits(sam.SERCOM_USART_INT_INTFLAG_DRE) { } uart.Bus.DATA.Set(uint32(c)) return nil @@ -496,7 +496,7 @@ func handleSERCOM3_OTHER() { func handleUART1() { // should reset IRQ UART1.Receive(byte((UART1.Bus.DATA.Get() & 0xFF))) - UART1.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INTFLAG_RXC) + UART1.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC) } // I2C on the SAMD51. @@ -662,7 +662,7 @@ func (i2c I2C) Tx(addr uint16, w, r []byte) error { // WriteByte writes a single byte to the I2C bus. func (i2c I2C) WriteByte(data byte) error { // Send data byte - i2c.Bus.DATA.Set(uint32(data)) + i2c.Bus.DATA.Set(data) // wait until transmission successful timeout := i2cTimeout @@ -737,7 +737,7 @@ func (i2c I2C) readByte() byte { // SPI type SPI struct { - Bus *sam.SERCOM_SPI_Type + Bus *sam.SERCOM_SPIM_Type SCK Pin MOSI Pin MISO Pin @@ -770,8 +770,8 @@ func (spi SPI) Configure(config SPIConfig) { } // Disable SPI port. - spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPI_CTRLA_ENABLE) - for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_ENABLE) { + spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPIM_CTRLA_ENABLE) + for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPIM_SYNCBUSY_ENABLE) { } // enable pins @@ -780,9 +780,9 @@ func (spi SPI) Configure(config SPIConfig) { config.MISO.Configure(PinConfig{Mode: PinSERCOMAlt}) // reset SERCOM - spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_SWRST) - for spi.Bus.CTRLA.HasBits(sam.SERCOM_SPI_CTRLA_SWRST) || - spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_SWRST) { + spi.Bus.CTRLA.SetBits(sam.SERCOM_SPIM_CTRLA_SWRST) + for spi.Bus.CTRLA.HasBits(sam.SERCOM_SPIM_CTRLA_SWRST) || + spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPIM_SYNCBUSY_SWRST) { } // set bit transfer order @@ -792,34 +792,34 @@ func (spi SPI) Configure(config SPIConfig) { } // Set SPI master - // SERCOM_SPI_CTRLA_MODE_SPI_MASTER = 3 - spi.Bus.CTRLA.Set(uint32((3 << sam.SERCOM_SPI_CTRLA_MODE_Pos) | - (doPad << sam.SERCOM_SPI_CTRLA_DOPO_Pos) | - (diPad << sam.SERCOM_SPI_CTRLA_DIPO_Pos) | - (dataOrder << sam.SERCOM_SPI_CTRLA_DORD_Pos))) + // SERCOM_SPIM_CTRLA_MODE_SPI_MASTER = 3 + spi.Bus.CTRLA.Set(uint32((3 << sam.SERCOM_SPIM_CTRLA_MODE_Pos) | + (doPad << sam.SERCOM_SPIM_CTRLA_DOPO_Pos) | + (diPad << sam.SERCOM_SPIM_CTRLA_DIPO_Pos) | + (dataOrder << sam.SERCOM_SPIM_CTRLA_DORD_Pos))) - spi.Bus.CTRLB.SetBits((0 << sam.SERCOM_SPI_CTRLB_CHSIZE_Pos) | // 8bit char size - sam.SERCOM_SPI_CTRLB_RXEN) // receive enable + spi.Bus.CTRLB.SetBits((0 << sam.SERCOM_SPIM_CTRLB_CHSIZE_Pos) | // 8bit char size + sam.SERCOM_SPIM_CTRLB_RXEN) // receive enable - for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_CTRLB) { + for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPIM_SYNCBUSY_CTRLB) { } // set mode switch config.Mode { case 0: - spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPI_CTRLA_CPHA) - spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPI_CTRLA_CPOL) + spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPIM_CTRLA_CPHA) + spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPIM_CTRLA_CPOL) case 1: - spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_CPHA) - spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPI_CTRLA_CPOL) + spi.Bus.CTRLA.SetBits(sam.SERCOM_SPIM_CTRLA_CPHA) + spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPIM_CTRLA_CPOL) case 2: - spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPI_CTRLA_CPHA) - spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_CPOL) + spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPIM_CTRLA_CPHA) + spi.Bus.CTRLA.SetBits(sam.SERCOM_SPIM_CTRLA_CPOL) case 3: - spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_CPHA | sam.SERCOM_SPI_CTRLA_CPOL) + spi.Bus.CTRLA.SetBits(sam.SERCOM_SPIM_CTRLA_CPHA | sam.SERCOM_SPIM_CTRLA_CPOL) default: // to mode 0 - spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPI_CTRLA_CPHA) - spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPI_CTRLA_CPOL) + spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPIM_CTRLA_CPHA) + spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPIM_CTRLA_CPOL) } // Set synch speed for SPI @@ -827,8 +827,8 @@ func (spi SPI) Configure(config SPIConfig) { spi.Bus.BAUD.Set(uint8(baudRate)) // Enable SPI port. - spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_ENABLE) - for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_ENABLE) { + spi.Bus.CTRLA.SetBits(sam.SERCOM_SPIM_CTRLA_ENABLE) + for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPIM_SYNCBUSY_ENABLE) { } } @@ -838,7 +838,7 @@ func (spi SPI) Transfer(w byte) (byte, error) { spi.Bus.DATA.Set(uint32(w)) // wait for receive - for !spi.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_RXC) { + for !spi.Bus.INTFLAG.HasBits(sam.SERCOM_SPIM_INTFLAG_RXC) { } // return data @@ -855,33 +855,33 @@ func InitPWM() { sam.MCLK.APBCMASK.SetBits(sam.MCLK_APBCMASK_TCC2_) //use clock generator 0 - sam.GCLK.PCHCTRL25.Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[25].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) - sam.GCLK.PCHCTRL29.Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[29].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) } // Configure configures a PWM pin for output. func (pwm PWM) Configure() { // Set pin as output - sam.PORT.DIRSET0.Set(1 << uint8(pwm.Pin)) + sam.PORT.GROUP[0].DIRSET.Set(1 << uint8(pwm.Pin)) // Set pin to low - sam.PORT.OUTCLR0.Set(1 << uint8(pwm.Pin)) + sam.PORT.GROUP[0].OUTCLR.Set(1 << uint8(pwm.Pin)) // Enable the port multiplexer for pin - pwm.setPinCfg(sam.PORT_PINCFG0_PMUXEN) + pwm.setPinCfg(sam.PORT_GROUP_PINCFG_PMUXEN) // Connect timer/mux to pin. pwmConfig := pwm.getMux() if pwm.Pin&1 > 0 { // odd pin, so save the even pins - val := pwm.getPMux() & sam.PORT_PMUX0_PMUXE_Msk - pwm.setPMux(val | uint8(pwmConfig< 0 { + if getEPINTFLAG(0)&sam.USB_DEVICE_ENDPOINT_EPINTFLAG_RXSTP > 0 { // ack setup received - setEPINTFLAG(0, sam.USB_DEVICE_EPINTFLAG_RXSTP) + setEPINTFLAG(0, sam.USB_DEVICE_ENDPOINT_EPINTFLAG_RXSTP) // parse setup setup := newUSBSetup(udd_ep_out_cache_buffer[0][:]) // Clear the Bank 0 ready flag on Control OUT - setEPSTATUSCLR(0, sam.USB_DEVICE_EPSTATUSCLR_BK0RDY) + setEPSTATUSCLR(0, sam.USB_DEVICE_ENDPOINT_EPSTATUSCLR_BK0RDY) usbEndpointDescriptors[0].DeviceDescBank[0].PCKSIZE.ClearBits(usb_DEVICE_PCKSIZE_BYTE_COUNT_Mask << usb_DEVICE_PCKSIZE_BYTE_COUNT_Pos) ok := false @@ -1318,18 +1318,18 @@ func handleUSBIRQ() { if ok { // set Bank1 ready - setEPSTATUSSET(0, sam.USB_DEVICE_EPSTATUSSET_BK1RDY) + setEPSTATUSSET(0, sam.USB_DEVICE_ENDPOINT_EPSTATUSSET_BK1RDY) } else { // Stall endpoint - setEPSTATUSSET(0, sam.USB_DEVICE_EPINTFLAG_STALL1) + setEPSTATUSSET(0, sam.USB_DEVICE_ENDPOINT_EPINTFLAG_STALL1) } - if getEPINTFLAG(0)&sam.USB_DEVICE_EPINTFLAG_STALL1 > 0 { + if getEPINTFLAG(0)&sam.USB_DEVICE_ENDPOINT_EPINTFLAG_STALL1 > 0 { // ack the stall - setEPINTFLAG(0, sam.USB_DEVICE_EPINTFLAG_STALL1) + setEPINTFLAG(0, sam.USB_DEVICE_ENDPOINT_EPINTFLAG_STALL1) // clear stall request - setEPINTENCLR(0, sam.USB_DEVICE_EPINTENCLR_STALL1) + setEPINTENCLR(0, sam.USB_DEVICE_ENDPOINT_EPINTENCLR_STALL1) } } @@ -1338,15 +1338,15 @@ func handleUSBIRQ() { for i = 1; i < uint32(len(endPoints)); i++ { // Check if endpoint has a pending interrupt epFlags := getEPINTFLAG(i) - if (epFlags&sam.USB_DEVICE_EPINTFLAG_TRCPT0) > 0 || - (epFlags&sam.USB_DEVICE_EPINTFLAG_TRCPT1) > 0 { + if (epFlags&sam.USB_DEVICE_ENDPOINT_EPINTFLAG_TRCPT0) > 0 || + (epFlags&sam.USB_DEVICE_ENDPOINT_EPINTFLAG_TRCPT1) > 0 { switch i { case usb_CDC_ENDPOINT_OUT: handleEndpoint(i) setEPINTFLAG(i, epFlags) case usb_CDC_ENDPOINT_IN, usb_CDC_ENDPOINT_ACM: - setEPSTATUSCLR(i, sam.USB_DEVICE_EPSTATUSCLR_BK1RDY) - setEPINTFLAG(i, sam.USB_DEVICE_EPINTFLAG_TRCPT1) + setEPSTATUSCLR(i, sam.USB_DEVICE_ENDPOINT_EPSTATUSCLR_BK1RDY) + setEPINTFLAG(i, sam.USB_DEVICE_ENDPOINT_EPINTFLAG_TRCPT1) } } } @@ -1362,7 +1362,7 @@ func initEndpoint(ep, config uint32) { usbEndpointDescriptors[ep].DeviceDescBank[1].ADDR.Set(uint32(uintptr(unsafe.Pointer(&udd_ep_in_cache_buffer[ep])))) // set endpoint type - setEPCFG(ep, ((usb_ENDPOINT_TYPE_INTERRUPT + 1) << sam.USB_DEVICE_EPCFG_EPTYPE1_Pos)) + setEPCFG(ep, ((usb_ENDPOINT_TYPE_INTERRUPT + 1) << sam.USB_DEVICE_ENDPOINT_EPCFG_EPTYPE1_Pos)) case usb_ENDPOINT_TYPE_BULK | usbEndpointOut: // set packet size @@ -1372,16 +1372,16 @@ func initEndpoint(ep, config uint32) { usbEndpointDescriptors[ep].DeviceDescBank[0].ADDR.Set(uint32(uintptr(unsafe.Pointer(&udd_ep_out_cache_buffer[ep])))) // set endpoint type - setEPCFG(ep, ((usb_ENDPOINT_TYPE_BULK + 1) << sam.USB_DEVICE_EPCFG_EPTYPE0_Pos)) + setEPCFG(ep, ((usb_ENDPOINT_TYPE_BULK + 1) << sam.USB_DEVICE_ENDPOINT_EPCFG_EPTYPE0_Pos)) // receive interrupts when current transfer complete - setEPINTENSET(ep, sam.USB_DEVICE_EPINTENSET_TRCPT0) + setEPINTENSET(ep, sam.USB_DEVICE_ENDPOINT_EPINTENSET_TRCPT0) // set byte count to zero, we have not received anything yet usbEndpointDescriptors[ep].DeviceDescBank[0].PCKSIZE.ClearBits(usb_DEVICE_PCKSIZE_BYTE_COUNT_Mask << usb_DEVICE_PCKSIZE_BYTE_COUNT_Pos) // ready for next transfer - setEPSTATUSCLR(ep, sam.USB_DEVICE_EPSTATUSCLR_BK0RDY) + setEPSTATUSCLR(ep, sam.USB_DEVICE_ENDPOINT_EPSTATUSCLR_BK0RDY) case usb_ENDPOINT_TYPE_INTERRUPT | usbEndpointOut: // TODO: not really anything, seems like... @@ -1394,10 +1394,10 @@ func initEndpoint(ep, config uint32) { usbEndpointDescriptors[ep].DeviceDescBank[1].ADDR.Set(uint32(uintptr(unsafe.Pointer(&udd_ep_in_cache_buffer[ep])))) // set endpoint type - setEPCFG(ep, ((usb_ENDPOINT_TYPE_BULK + 1) << sam.USB_DEVICE_EPCFG_EPTYPE1_Pos)) + setEPCFG(ep, ((usb_ENDPOINT_TYPE_BULK + 1) << sam.USB_DEVICE_ENDPOINT_EPCFG_EPTYPE1_Pos)) // NAK on endpoint IN, the bank is not yet filled in. - setEPSTATUSCLR(ep, sam.USB_DEVICE_EPSTATUSCLR_BK1RDY) + setEPSTATUSCLR(ep, sam.USB_DEVICE_ENDPOINT_EPSTATUSCLR_BK1RDY) case usb_ENDPOINT_TYPE_CONTROL: // Control OUT @@ -1408,7 +1408,7 @@ func initEndpoint(ep, config uint32) { usbEndpointDescriptors[ep].DeviceDescBank[0].ADDR.Set(uint32(uintptr(unsafe.Pointer(&udd_ep_out_cache_buffer[ep])))) // set endpoint type - setEPCFG(ep, getEPCFG(ep)|((usb_ENDPOINT_TYPE_CONTROL+1)<>uint8(p))&1 > 0 + return (sam.PORT.GROUP[0].IN.Get()>>uint8(p))&1 > 0 } else { - return (sam.PORT.IN1.Get()>>(uint8(p)-32))&1 > 0 + return (sam.PORT.GROUP[1].IN.Get()>>(uint8(p)-32))&1 > 0 } } @@ -63,166 +63,106 @@ func (p Pin) Configure(config PinConfig) { switch config.Mode { case PinOutput: if p < 32 { - sam.PORT.DIRSET0.Set(1 << uint8(p)) + sam.PORT.GROUP[0].DIRSET.Set(1 << uint8(p)) // output is also set to input enable so pin can read back its own value - p.setPinCfg(sam.PORT_PINCFG0_INEN) + p.setPinCfg(sam.PORT_GROUP_PINCFG_INEN) } else { - sam.PORT.DIRSET1.Set(1 << uint8(p-32)) + sam.PORT.GROUP[1].DIRSET.Set(1 << uint8(p-32)) // output is also set to input enable so pin can read back its own value - p.setPinCfg(sam.PORT_PINCFG0_INEN) + p.setPinCfg(sam.PORT_GROUP_PINCFG_INEN) } case PinInput: if p < 32 { - sam.PORT.DIRCLR0.Set(1 << uint8(p)) - p.setPinCfg(sam.PORT_PINCFG0_INEN) + sam.PORT.GROUP[0].DIRCLR.Set(1 << uint8(p)) + p.setPinCfg(sam.PORT_GROUP_PINCFG_INEN) } else { - sam.PORT.DIRCLR1.Set(1< 0 { // odd pin, so save the even pins - val := p.getPMux() & sam.PORT_PMUX0_PMUXE_Msk - p.setPMux(val | (uint8(PinSERCOM) << sam.PORT_PMUX0_PMUXO_Pos)) + val := p.getPMux() & sam.PORT_GROUP_PMUX_PMUXE_Msk + p.setPMux(val | (uint8(PinSERCOM) << sam.PORT_GROUP_PMUX_PMUXO_Pos)) } else { // even pin, so save the odd pins - val := p.getPMux() & sam.PORT_PMUX0_PMUXO_Msk - p.setPMux(val | (uint8(PinSERCOM) << sam.PORT_PMUX0_PMUXE_Pos)) + val := p.getPMux() & sam.PORT_GROUP_PMUX_PMUXO_Msk + p.setPMux(val | (uint8(PinSERCOM) << sam.PORT_GROUP_PMUX_PMUXE_Pos)) } // enable port config - p.setPinCfg(sam.PORT_PINCFG0_PMUXEN | sam.PORT_PINCFG0_DRVSTR | sam.PORT_PINCFG0_INEN) + p.setPinCfg(sam.PORT_GROUP_PINCFG_PMUXEN | sam.PORT_GROUP_PINCFG_DRVSTR | sam.PORT_GROUP_PINCFG_INEN) case PinSERCOMAlt: if p&1 > 0 { // odd pin, so save the even pins - val := p.getPMux() & sam.PORT_PMUX0_PMUXE_Msk - p.setPMux(val | (uint8(PinSERCOMAlt) << sam.PORT_PMUX0_PMUXO_Pos)) + val := p.getPMux() & sam.PORT_GROUP_PMUX_PMUXE_Msk + p.setPMux(val | (uint8(PinSERCOMAlt) << sam.PORT_GROUP_PMUX_PMUXO_Pos)) } else { // even pin, so save the odd pins - val := p.getPMux() & sam.PORT_PMUX0_PMUXO_Msk - p.setPMux(val | (uint8(PinSERCOMAlt) << sam.PORT_PMUX0_PMUXE_Pos)) + val := p.getPMux() & sam.PORT_GROUP_PMUX_PMUXO_Msk + p.setPMux(val | (uint8(PinSERCOMAlt) << sam.PORT_GROUP_PMUX_PMUXE_Pos)) } // enable port config - p.setPinCfg(sam.PORT_PINCFG0_PMUXEN | sam.PORT_PINCFG0_DRVSTR) + p.setPinCfg(sam.PORT_GROUP_PINCFG_PMUXEN | sam.PORT_GROUP_PINCFG_DRVSTR) case PinCom: if p&1 > 0 { // odd pin, so save the even pins - val := p.getPMux() & sam.PORT_PMUX0_PMUXE_Msk - p.setPMux(val | (uint8(PinCom) << sam.PORT_PMUX0_PMUXO_Pos)) + val := p.getPMux() & sam.PORT_GROUP_PMUX_PMUXE_Msk + p.setPMux(val | (uint8(PinCom) << sam.PORT_GROUP_PMUX_PMUXO_Pos)) } else { // even pin, so save the odd pins - val := p.getPMux() & sam.PORT_PMUX0_PMUXO_Msk - p.setPMux(val | (uint8(PinCom) << sam.PORT_PMUX0_PMUXE_Pos)) + val := p.getPMux() & sam.PORT_GROUP_PMUX_PMUXO_Msk + p.setPMux(val | (uint8(PinCom) << sam.PORT_GROUP_PMUX_PMUXE_Pos)) } // enable port config - p.setPinCfg(sam.PORT_PINCFG0_PMUXEN) + p.setPinCfg(sam.PORT_GROUP_PINCFG_PMUXEN) case PinAnalog: if p&1 > 0 { // odd pin, so save the even pins - val := p.getPMux() & sam.PORT_PMUX0_PMUXE_Msk - p.setPMux(val | (uint8(PinAnalog) << sam.PORT_PMUX0_PMUXO_Pos)) + val := p.getPMux() & sam.PORT_GROUP_PMUX_PMUXE_Msk + p.setPMux(val | (uint8(PinAnalog) << sam.PORT_GROUP_PMUX_PMUXO_Pos)) } else { // even pin, so save the odd pins - val := p.getPMux() & sam.PORT_PMUX0_PMUXO_Msk - p.setPMux(val | (uint8(PinAnalog) << sam.PORT_PMUX0_PMUXE_Pos)) + val := p.getPMux() & sam.PORT_GROUP_PMUX_PMUXO_Msk + p.setPMux(val | (uint8(PinAnalog) << sam.PORT_GROUP_PMUX_PMUXE_Pos)) } // enable port config - p.setPinCfg(sam.PORT_PINCFG0_PMUXEN | sam.PORT_PINCFG0_DRVSTR) + p.setPinCfg(sam.PORT_GROUP_PINCFG_PMUXEN | sam.PORT_GROUP_PINCFG_DRVSTR) } } // getPMux returns the value for the correct PMUX register for this pin. func (p Pin) getPMux() uint8 { - switch uint8(p) >> 1 { - case 0: - return sam.PORT.PMUX0_0.Get() - case 1: - return sam.PORT.PMUX0_1.Get() - case 2: - return sam.PORT.PMUX0_2.Get() - case 3: - return sam.PORT.PMUX0_3.Get() - case 4: - return sam.PORT.PMUX0_4.Get() - case 5: - return sam.PORT.PMUX0_5.Get() - case 6: - return sam.PORT.PMUX0_6.Get() - case 7: - return sam.PORT.PMUX0_7.Get() - case 8: - return sam.PORT.PMUX0_8.Get() - case 9: - return sam.PORT.PMUX0_9.Get() - case 10: - return sam.PORT.PMUX0_10.Get() - case 11: - return sam.PORT.PMUX0_11.Get() - case 12: - return sam.PORT.PMUX0_12.Get() - case 13: - return sam.PORT.PMUX0_13.Get() - case 14: - return sam.PORT.PMUX0_14.Get() - case 15: - return sam.PORT.PMUX0_15.Get() - case 16: - return uint8(sam.PORT.PMUX1_0.Get()>>0) & 0xff - case 17: - return uint8(sam.PORT.PMUX1_0.Get()>>8) & 0xff - case 18: - return uint8(sam.PORT.PMUX1_0.Get()>>16) & 0xff - case 19: - return uint8(sam.PORT.PMUX1_0.Get()>>24) & 0xff - case 20: - return uint8(sam.PORT.PMUX1_4.Get()>>0) & 0xff - case 21: - return uint8(sam.PORT.PMUX1_4.Get()>>8) & 0xff - case 22: - return uint8(sam.PORT.PMUX1_4.Get()>>16) & 0xff - case 23: - return uint8(sam.PORT.PMUX1_4.Get()>>24) & 0xff - case 24: - return uint8(sam.PORT.PMUX1_8.Get()>>0) & 0xff - case 25: - return uint8(sam.PORT.PMUX1_8.Get()>>8) & 0xff - case 26: - return uint8(sam.PORT.PMUX1_8.Get()>>16) & 0xff - case 27: - return uint8(sam.PORT.PMUX1_8.Get()>>24) & 0xff - case 28: - return uint8(sam.PORT.PMUX1_12.Get()>>0) & 0xff - case 29: - return uint8(sam.PORT.PMUX1_12.Get()>>8) & 0xff - case 30: - return uint8(sam.PORT.PMUX1_12.Get()>>16) & 0xff - case 31: - return uint8(sam.PORT.PMUX1_12.Get()>>24) & 0xff + switch { + case p < 32: + return sam.PORT.GROUP[0].PMUX[uint8(p)>>1].Get() + case p >= 32 && p < 64: + return sam.PORT.GROUP[1].PMUX[uint8(p-32)>>1].Get() default: return 0 } @@ -230,205 +170,21 @@ func (p Pin) getPMux() uint8 { // setPMux sets the value for the correct PMUX register for this pin. func (p Pin) setPMux(val uint8) { - switch uint8(p) >> 1 { - case 0: - sam.PORT.PMUX0_0.Set(val) - case 1: - sam.PORT.PMUX0_1.Set(val) - case 2: - sam.PORT.PMUX0_2.Set(val) - case 3: - sam.PORT.PMUX0_3.Set(val) - case 4: - sam.PORT.PMUX0_4.Set(val) - case 5: - sam.PORT.PMUX0_5.Set(val) - case 6: - sam.PORT.PMUX0_6.Set(val) - case 7: - sam.PORT.PMUX0_7.Set(val) - case 8: - sam.PORT.PMUX0_8.Set(val) - case 9: - sam.PORT.PMUX0_9.Set(val) - case 10: - sam.PORT.PMUX0_10.Set(val) - case 11: - sam.PORT.PMUX0_11.Set(val) - case 12: - sam.PORT.PMUX0_12.Set(val) - case 13: - sam.PORT.PMUX0_13.Set(val) - case 14: - sam.PORT.PMUX0_14.Set(val) - case 15: - sam.PORT.PMUX0_15.Set(val) - case 16: - sam.PORT.PMUX1_0.Set(sam.PORT.PMUX1_0.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 17: - sam.PORT.PMUX1_0.Set(sam.PORT.PMUX1_0.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 18: - sam.PORT.PMUX1_0.Set(sam.PORT.PMUX1_0.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 19: - sam.PORT.PMUX1_0.Set(sam.PORT.PMUX1_0.Get()&^(0xff<<24) | (uint32(val) << 24)) - case 20: - sam.PORT.PMUX1_4.Set(sam.PORT.PMUX1_4.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 21: - sam.PORT.PMUX1_4.Set(sam.PORT.PMUX1_4.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 22: - sam.PORT.PMUX1_4.Set(sam.PORT.PMUX1_4.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 23: - sam.PORT.PMUX1_4.Set(sam.PORT.PMUX1_4.Get()&^(0xff<<24) | (uint32(val) << 24)) - case 24: - sam.PORT.PMUX1_8.Set(sam.PORT.PMUX1_8.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 25: - sam.PORT.PMUX1_8.Set(sam.PORT.PMUX1_8.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 26: - sam.PORT.PMUX1_8.Set(sam.PORT.PMUX1_8.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 27: - sam.PORT.PMUX1_8.Set(sam.PORT.PMUX1_8.Get()&^(0xff<<24) | (uint32(val) << 24)) - case 28: - sam.PORT.PMUX1_12.Set(sam.PORT.PMUX1_12.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 29: - sam.PORT.PMUX1_12.Set(sam.PORT.PMUX1_12.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 30: - sam.PORT.PMUX1_12.Set(sam.PORT.PMUX1_12.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 31: - sam.PORT.PMUX1_12.Set(sam.PORT.PMUX1_12.Get()&^(0xff<<24) | (uint32(val) << 24)) + switch { + case p < 32: + sam.PORT.GROUP[0].PMUX[uint8(p)>>1].Set(val) + case p >= 32 && p < 64: + sam.PORT.GROUP[1].PMUX[uint8(p-32)>>1].Set(val) } } // getPinCfg returns the value for the correct PINCFG register for this pin. func (p Pin) getPinCfg() uint8 { - switch p { - case 0: - return sam.PORT.PINCFG0_0.Get() - case 1: - return sam.PORT.PINCFG0_1.Get() - case 2: - return sam.PORT.PINCFG0_2.Get() - case 3: - return sam.PORT.PINCFG0_3.Get() - case 4: - return sam.PORT.PINCFG0_4.Get() - case 5: - return sam.PORT.PINCFG0_5.Get() - case 6: - return sam.PORT.PINCFG0_6.Get() - case 7: - return sam.PORT.PINCFG0_7.Get() - case 8: - return sam.PORT.PINCFG0_8.Get() - case 9: - return sam.PORT.PINCFG0_9.Get() - case 10: - return sam.PORT.PINCFG0_10.Get() - case 11: - return sam.PORT.PINCFG0_11.Get() - case 12: - return sam.PORT.PINCFG0_12.Get() - case 13: - return sam.PORT.PINCFG0_13.Get() - case 14: - return sam.PORT.PINCFG0_14.Get() - case 15: - return sam.PORT.PINCFG0_15.Get() - case 16: - return sam.PORT.PINCFG0_16.Get() - case 17: - return sam.PORT.PINCFG0_17.Get() - case 18: - return sam.PORT.PINCFG0_18.Get() - case 19: - return sam.PORT.PINCFG0_19.Get() - case 20: - return sam.PORT.PINCFG0_20.Get() - case 21: - return sam.PORT.PINCFG0_21.Get() - case 22: - return sam.PORT.PINCFG0_22.Get() - case 23: - return sam.PORT.PINCFG0_23.Get() - case 24: - return sam.PORT.PINCFG0_24.Get() - case 25: - return sam.PORT.PINCFG0_25.Get() - case 26: - return sam.PORT.PINCFG0_26.Get() - case 27: - return sam.PORT.PINCFG0_27.Get() - case 28: - return sam.PORT.PINCFG0_28.Get() - case 29: - return sam.PORT.PINCFG0_29.Get() - case 30: - return sam.PORT.PINCFG0_30.Get() - case 31: - return sam.PORT.PINCFG0_31.Get() - case 32: // PB00 - return uint8(sam.PORT.PINCFG1_0.Get()>>0) & 0xff - case 33: // PB01 - return uint8(sam.PORT.PINCFG1_0.Get()>>8) & 0xff - case 34: // PB02 - return uint8(sam.PORT.PINCFG1_0.Get()>>16) & 0xff - case 35: // PB03 - return uint8(sam.PORT.PINCFG1_0.Get()>>24) & 0xff - case 37: // PB04 - return uint8(sam.PORT.PINCFG1_4.Get()>>0) & 0xff - case 38: // PB05 - return uint8(sam.PORT.PINCFG1_4.Get()>>8) & 0xff - case 39: // PB06 - return uint8(sam.PORT.PINCFG1_4.Get()>>16) & 0xff - case 40: // PB07 - return uint8(sam.PORT.PINCFG1_4.Get()>>24) & 0xff - case 41: // PB08 - return uint8(sam.PORT.PINCFG1_8.Get()>>0) & 0xff - case 42: // PB09 - return uint8(sam.PORT.PINCFG1_8.Get()>>8) & 0xff - case 43: // PB10 - return uint8(sam.PORT.PINCFG1_8.Get()>>16) & 0xff - case 44: // PB11 - return uint8(sam.PORT.PINCFG1_8.Get()>>24) & 0xff - case 45: // PB12 - return uint8(sam.PORT.PINCFG1_12.Get()>>0) & 0xff - case 46: // PB13 - return uint8(sam.PORT.PINCFG1_12.Get()>>8) & 0xff - case 47: // PB14 - return uint8(sam.PORT.PINCFG1_12.Get()>>16) & 0xff - case 48: // PB15 - return uint8(sam.PORT.PINCFG1_12.Get()>>24) & 0xff - case 49: // PB16 - return uint8(sam.PORT.PINCFG1_16.Get()>>0) & 0xff - case 50: // PB17 - return uint8(sam.PORT.PINCFG1_16.Get()>>8) & 0xff - case 51: // PB18 - return uint8(sam.PORT.PINCFG1_16.Get()>>16) & 0xff - case 52: // PB19 - return uint8(sam.PORT.PINCFG1_16.Get()>>24) & 0xff - case 53: // PB20 - return uint8(sam.PORT.PINCFG1_20.Get()>>0) & 0xff - case 54: // PB21 - return uint8(sam.PORT.PINCFG1_20.Get()>>8) & 0xff - case 55: // PB22 - return uint8(sam.PORT.PINCFG1_20.Get()>>16) & 0xff - case 56: // PB23 - return uint8(sam.PORT.PINCFG1_20.Get()>>24) & 0xff - case 57: // PB24 - return uint8(sam.PORT.PINCFG1_24.Get()>>0) & 0xff - case 58: // PB25 - return uint8(sam.PORT.PINCFG1_24.Get()>>8) & 0xff - case 59: // PB26 - return uint8(sam.PORT.PINCFG1_24.Get()>>16) & 0xff - case 60: // PB27 - return uint8(sam.PORT.PINCFG1_24.Get()>>24) & 0xff - case 61: // PB28 - return uint8(sam.PORT.PINCFG1_28.Get()>>0) & 0xff - case 62: // PB29 - return uint8(sam.PORT.PINCFG1_28.Get()>>8) & 0xff - case 63: // PB30 - return uint8(sam.PORT.PINCFG1_28.Get()>>16) & 0xff - case 64: // PB31 - return uint8(sam.PORT.PINCFG1_28.Get()>>24) & 0xff + switch { + case p < 32: + return sam.PORT.GROUP[0].PINCFG[p].Get() + case p >= 32 && p <= 64: + return sam.PORT.GROUP[1].PINCFG[p-32].Get() default: return 0 } @@ -436,134 +192,10 @@ func (p Pin) getPinCfg() uint8 { // setPinCfg sets the value for the correct PINCFG register for this pin. func (p Pin) setPinCfg(val uint8) { - switch p { - case 0: - sam.PORT.PINCFG0_0.Set(val) - case 1: - sam.PORT.PINCFG0_1.Set(val) - case 2: - sam.PORT.PINCFG0_2.Set(val) - case 3: - sam.PORT.PINCFG0_3.Set(val) - case 4: - sam.PORT.PINCFG0_4.Set(val) - case 5: - sam.PORT.PINCFG0_5.Set(val) - case 6: - sam.PORT.PINCFG0_6.Set(val) - case 7: - sam.PORT.PINCFG0_7.Set(val) - case 8: - sam.PORT.PINCFG0_8.Set(val) - case 9: - sam.PORT.PINCFG0_9.Set(val) - case 10: - sam.PORT.PINCFG0_10.Set(val) - case 11: - sam.PORT.PINCFG0_11.Set(val) - case 12: - sam.PORT.PINCFG0_12.Set(val) - case 13: - sam.PORT.PINCFG0_13.Set(val) - case 14: - sam.PORT.PINCFG0_14.Set(val) - case 15: - sam.PORT.PINCFG0_15.Set(val) - case 16: - sam.PORT.PINCFG0_16.Set(val) - case 17: - sam.PORT.PINCFG0_17.Set(val) - case 18: - sam.PORT.PINCFG0_18.Set(val) - case 19: - sam.PORT.PINCFG0_19.Set(val) - case 20: - sam.PORT.PINCFG0_20.Set(val) - case 21: - sam.PORT.PINCFG0_21.Set(val) - case 22: - sam.PORT.PINCFG0_22.Set(val) - case 23: - sam.PORT.PINCFG0_23.Set(val) - case 24: - sam.PORT.PINCFG0_24.Set(val) - case 25: - sam.PORT.PINCFG0_25.Set(val) - case 26: - sam.PORT.PINCFG0_26.Set(val) - case 27: - sam.PORT.PINCFG0_27.Set(val) - case 28: - sam.PORT.PINCFG0_28.Set(val) - case 29: - sam.PORT.PINCFG0_29.Set(val) - case 30: - sam.PORT.PINCFG0_30.Set(val) - case 31: - sam.PORT.PINCFG0_31.Set(val) - case 32: // PB00 - sam.PORT.PINCFG1_0.Set(sam.PORT.PINCFG1_0.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 33: // PB01 - sam.PORT.PINCFG1_0.Set(sam.PORT.PINCFG1_0.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 34: // PB02 - sam.PORT.PINCFG1_0.Set(sam.PORT.PINCFG1_0.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 35: // PB03 - sam.PORT.PINCFG1_0.Set(sam.PORT.PINCFG1_0.Get()&^(0xff<<24) | (uint32(val) << 24)) - case 36: // PB04 - sam.PORT.PINCFG1_4.Set(sam.PORT.PINCFG1_4.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 37: // PB05 - sam.PORT.PINCFG1_4.Set(sam.PORT.PINCFG1_4.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 38: // PB06 - sam.PORT.PINCFG1_4.Set(sam.PORT.PINCFG1_4.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 39: // PB07 - sam.PORT.PINCFG1_4.Set(sam.PORT.PINCFG1_4.Get()&^(0xff<<24) | (uint32(val) << 24)) - case 40: // PB08 - sam.PORT.PINCFG1_8.Set(sam.PORT.PINCFG1_8.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 41: // PB09 - sam.PORT.PINCFG1_8.Set(sam.PORT.PINCFG1_8.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 42: // PB10 - sam.PORT.PINCFG1_8.Set(sam.PORT.PINCFG1_8.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 43: // PB11 - sam.PORT.PINCFG1_8.Set(sam.PORT.PINCFG1_8.Get()&^(0xff<<24) | (uint32(val) << 24)) - case 44: // PB12 - sam.PORT.PINCFG1_12.Set(sam.PORT.PINCFG1_12.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 45: // PB13 - sam.PORT.PINCFG1_12.Set(sam.PORT.PINCFG1_12.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 46: // PB14 - sam.PORT.PINCFG1_12.Set(sam.PORT.PINCFG1_12.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 47: // PB15 - sam.PORT.PINCFG1_12.Set(sam.PORT.PINCFG1_12.Get()&^(0xff<<24) | (uint32(val) << 24)) - case 48: // PB16 - sam.PORT.PINCFG1_16.Set(sam.PORT.PINCFG1_16.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 49: // PB17 - sam.PORT.PINCFG1_16.Set(sam.PORT.PINCFG1_16.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 50: // PB18 - sam.PORT.PINCFG1_16.Set(sam.PORT.PINCFG1_16.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 51: // PB19 - sam.PORT.PINCFG1_16.Set(sam.PORT.PINCFG1_16.Get()&^(0xff<<24) | (uint32(val) << 24)) - case 52: // PB20 - sam.PORT.PINCFG1_20.Set(sam.PORT.PINCFG1_20.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 53: // PB21 - sam.PORT.PINCFG1_20.Set(sam.PORT.PINCFG1_20.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 54: // PB22 - sam.PORT.PINCFG1_20.Set(sam.PORT.PINCFG1_20.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 55: // PB23 - sam.PORT.PINCFG1_20.Set(sam.PORT.PINCFG1_20.Get()&^(0xff<<24) | (uint32(val) << 24)) - case 56: // PB24 - sam.PORT.PINCFG1_24.Set(sam.PORT.PINCFG1_24.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 57: // PB25 - sam.PORT.PINCFG1_24.Set(sam.PORT.PINCFG1_24.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 58: // PB26 - sam.PORT.PINCFG1_24.Set(sam.PORT.PINCFG1_24.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 59: // PB27 - sam.PORT.PINCFG1_24.Set(sam.PORT.PINCFG1_24.Get()&^(0xff<<24) | (uint32(val) << 24)) - case 60: // PB28 - sam.PORT.PINCFG1_28.Set(sam.PORT.PINCFG1_28.Get()&^(0xff<<0) | (uint32(val) << 0)) - case 61: // PB29 - sam.PORT.PINCFG1_28.Set(sam.PORT.PINCFG1_28.Get()&^(0xff<<8) | (uint32(val) << 8)) - case 62: // PB30 - sam.PORT.PINCFG1_28.Set(sam.PORT.PINCFG1_28.Get()&^(0xff<<16) | (uint32(val) << 16)) - case 63: // PB31 - sam.PORT.PINCFG1_28.Set(sam.PORT.PINCFG1_28.Get()&^(0xff<<24) | (uint32(val) << 24)) + switch { + case p < 32: + sam.PORT.GROUP[0].PINCFG[p].Set(val) + case p >= 32 && p <= 64: + sam.PORT.GROUP[1].PINCFG[p-32].Set(val) } } diff --git a/src/runtime/runtime_atsamd51.go b/src/runtime/runtime_atsamd51.go index b6b39e30..ebe1e959 100644 --- a/src/runtime/runtime_atsamd51.go +++ b/src/runtime/runtime_atsamd51.go @@ -44,15 +44,15 @@ func initClocks() { // Set OSCULP32K as source of Generic Clock Generator 3 // GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_XOSC32K].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSCULP32K) | GCLK_GENCTRL_GENEN; //generic clock gen 3 - sam.GCLK.GENCTRL3.Set((sam.GCLK_GENCTRL_SRC_OSCULP32K << sam.GCLK_GENCTRL_SRC_Pos) | + sam.GCLK.GENCTRL[3].Set((sam.GCLK_GENCTRL_SRC_OSCULP32K << sam.GCLK_GENCTRL_SRC_Pos) | sam.GCLK_GENCTRL_GENEN) - for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL3) { + for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL_GCLK3) { } // Set OSCULP32K as source of Generic Clock Generator 0 - sam.GCLK.GENCTRL0.Set((sam.GCLK_GENCTRL_SRC_OSCULP32K << sam.GCLK_GENCTRL_SRC_Pos) | + sam.GCLK.GENCTRL[0].Set((sam.GCLK_GENCTRL_SRC_OSCULP32K << sam.GCLK_GENCTRL_SRC_Pos) | sam.GCLK_GENCTRL_GENEN) - for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL0) { + for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL_GCLK0) { } // Enable DFLL48M clock @@ -82,56 +82,56 @@ func initClocks() { } // set GCLK7 to use DFLL48M as clock source - sam.GCLK.GENCTRL7.Set((sam.GCLK_GENCTRL_SRC_DFLL << sam.GCLK_GENCTRL_SRC_Pos) | + sam.GCLK.GENCTRL[7].Set((sam.GCLK_GENCTRL_SRC_DFLL << sam.GCLK_GENCTRL_SRC_Pos) | (24 << sam.GCLK_GENCTRL_DIVSEL_Pos) | sam.GCLK_GENCTRL_GENEN) - for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL7) { + for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL_GCLK7) { } // Set up the PLLs // Set PLL0 at 120MHz - sam.GCLK.PCHCTRL1.Set(sam.GCLK_PCHCTRL_CHEN | + sam.GCLK.PCHCTRL[1].Set(sam.GCLK_PCHCTRL_CHEN | (sam.GCLK_PCHCTRL_GEN_GCLK7 << sam.GCLK_PCHCTRL_GEN_Pos)) - sam.OSCCTRL.DPLLRATIO0.Set((0x0 << sam.OSCCTRL_DPLLRATIO_LDRFRAC_Pos) | - (59 << sam.OSCCTRL_DPLLRATIO_LDR_Pos)) - for sam.OSCCTRL.DPLLSYNCBUSY0.HasBits(sam.OSCCTRL_DPLLSYNCBUSY_DPLLRATIO) { + sam.OSCCTRL.DPLL[0].DPLLRATIO.Set((0x0 << sam.OSCCTRL_DPLL_DPLLRATIO_LDRFRAC_Pos) | + (59 << sam.OSCCTRL_DPLL_DPLLRATIO_LDRFRAC_Pos)) + for sam.OSCCTRL.DPLL[0].DPLLSYNCBUSY.HasBits(sam.OSCCTRL_DPLL_DPLLSYNCBUSY_DPLLRATIO) { } // MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51, via Adafruit lib. - sam.OSCCTRL.DPLLCTRLB0.Set((sam.OSCCTRL_DPLLCTRLB_REFCLK_GCLK << sam.OSCCTRL_DPLLCTRLB_REFCLK_Pos) | - sam.OSCCTRL_DPLLCTRLB_LBYPASS) + sam.OSCCTRL.DPLL[0].DPLLCTRLB.Set((sam.OSCCTRL_DPLL_DPLLCTRLB_REFCLK_GCLK << sam.OSCCTRL_DPLL_DPLLCTRLB_REFCLK_Pos) | + sam.OSCCTRL_DPLL_DPLLCTRLB_LBYPASS) - sam.OSCCTRL.DPLLCTRLA0.Set(sam.OSCCTRL_DPLLCTRLA_ENABLE) - for !sam.OSCCTRL.DPLLSTATUS0.HasBits(sam.OSCCTRL_DPLLSTATUS_CLKRDY) || - !sam.OSCCTRL.DPLLSTATUS0.HasBits(sam.OSCCTRL_DPLLSTATUS_LOCK) { + sam.OSCCTRL.DPLL[0].DPLLCTRLA.Set(sam.OSCCTRL_DPLL_DPLLCTRLA_ENABLE) + for !sam.OSCCTRL.DPLL[0].DPLLSTATUS.HasBits(sam.OSCCTRL_DPLL_DPLLSTATUS_CLKRDY) || + !sam.OSCCTRL.DPLL[0].DPLLSTATUS.HasBits(sam.OSCCTRL_DPLL_DPLLSTATUS_LOCK) { } // // Set PLL1 to 100MHz - sam.GCLK.PCHCTRL2.Set(sam.GCLK_PCHCTRL_CHEN | + sam.GCLK.PCHCTRL[2].Set(sam.GCLK_PCHCTRL_CHEN | (sam.GCLK_PCHCTRL_GEN_GCLK7 << sam.GCLK_PCHCTRL_GEN_Pos)) - sam.OSCCTRL.DPLLRATIO1.Set((0x0 << sam.OSCCTRL_DPLLRATIO_LDRFRAC_Pos) | - (49 << sam.OSCCTRL_DPLLRATIO_LDR_Pos)) // this means 100 Mhz? - for sam.OSCCTRL.DPLLSYNCBUSY1.HasBits(sam.OSCCTRL_DPLLSYNCBUSY_DPLLRATIO) { + sam.OSCCTRL.DPLL[1].DPLLRATIO.Set((0x0 << sam.OSCCTRL_DPLL_DPLLRATIO_LDRFRAC_Pos) | + (49 << sam.OSCCTRL_DPLL_DPLLRATIO_LDR_Pos)) // this means 100 Mhz? + for sam.OSCCTRL.DPLL[1].DPLLSYNCBUSY.HasBits(sam.OSCCTRL_DPLL_DPLLSYNCBUSY_DPLLRATIO) { } // // MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51 - sam.OSCCTRL.DPLLCTRLB1.Set((sam.OSCCTRL_DPLLCTRLB_REFCLK_GCLK << sam.OSCCTRL_DPLLCTRLB_REFCLK_Pos) | - sam.OSCCTRL_DPLLCTRLB_LBYPASS) + sam.OSCCTRL.DPLL[1].DPLLCTRLB.Set((sam.OSCCTRL_DPLL_DPLLCTRLB_REFCLK_GCLK << sam.OSCCTRL_DPLL_DPLLCTRLB_REFCLK_Pos) | + sam.OSCCTRL_DPLL_DPLLCTRLB_LBYPASS) - sam.OSCCTRL.DPLLCTRLA1.Set(sam.OSCCTRL_DPLLCTRLA_ENABLE) + sam.OSCCTRL.DPLL[1].DPLLCTRLA.Set(sam.OSCCTRL_DPLL_DPLLCTRLA_ENABLE) // for !sam.OSCCTRL.DPLLSTATUS1.HasBits(sam.OSCCTRL_DPLLSTATUS_CLKRDY) || // !sam.OSCCTRL.DPLLSTATUS1.HasBits(sam.OSCCTRL_DPLLSTATUS_LOCK) { // } // Set up the peripheral clocks // Set 48MHZ CLOCK FOR USB - sam.GCLK.GENCTRL1.Set((sam.GCLK_GENCTRL_SRC_DFLL << sam.GCLK_GENCTRL_SRC_Pos) | + sam.GCLK.GENCTRL[1].Set((sam.GCLK_GENCTRL_SRC_DFLL << sam.GCLK_GENCTRL_SRC_Pos) | sam.GCLK_GENCTRL_IDC | sam.GCLK_GENCTRL_GENEN) - for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL1) { + for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL_GCLK1) { } // // Set 100MHZ CLOCK FOR OTHER PERIPHERALS @@ -142,18 +142,18 @@ func initClocks() { // } // // Set 12MHZ CLOCK FOR DAC - sam.GCLK.GENCTRL4.Set((sam.GCLK_GENCTRL_SRC_DFLL << sam.GCLK_GENCTRL_SRC_Pos) | + sam.GCLK.GENCTRL[4].Set((sam.GCLK_GENCTRL_SRC_DFLL << sam.GCLK_GENCTRL_SRC_Pos) | sam.GCLK_GENCTRL_IDC | (4 << sam.GCLK_GENCTRL_DIVSEL_Pos) | sam.GCLK_GENCTRL_GENEN) - for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL4) { + for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL_GCLK4) { } // // Set up main clock - sam.GCLK.GENCTRL0.Set((sam.GCLK_GENCTRL_SRC_DPLL0 << sam.GCLK_GENCTRL_SRC_Pos) | + sam.GCLK.GENCTRL[0].Set((sam.GCLK_GENCTRL_SRC_DPLL0 << sam.GCLK_GENCTRL_SRC_Pos) | sam.GCLK_GENCTRL_IDC | sam.GCLK_GENCTRL_GENEN) - for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL0) { + for sam.GCLK.SYNCBUSY.HasBits(sam.GCLK_SYNCBUSY_GENCTRL_GCLK0) { } sam.MCLK.CPUDIV.Set(sam.MCLK_CPUDIV_DIV_DIV1) @@ -258,7 +258,7 @@ func timerSleep(ticks uint32) { // set compare value cnt := sam.RTC_MODE0.COUNT.Get() - sam.RTC_MODE0.COMP0.Set(uint32(cnt) + (ticks * 10 / 305)) // each counter tick == 30.5us + sam.RTC_MODE0.COMP[0].Set(uint32(cnt) + (ticks * 10 / 305)) // each counter tick == 30.5us // enable IRQ for CMP0 compare sam.RTC_MODE0.INTENSET.SetBits(sam.RTC_MODE0_INTENSET_CMP0) @@ -285,7 +285,7 @@ func initUSBClock() { // Put Generic Clock Generator 1 as source for USB //GCLK->PCHCTRL[USB_GCLK_ID].reg = GCLK_PCHCTRL_GEN_GCLK1_Val | (1 << GCLK_PCHCTRL_CHEN_Pos); - sam.GCLK.PCHCTRL10.Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[10].Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) } @@ -295,8 +295,8 @@ func initADCClock() { sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_ADC1_) // Put Generic Clock Generator 1 as source for ADC0 and ADC1. - sam.GCLK.PCHCTRL40.Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[40].Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) - sam.GCLK.PCHCTRL41.Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[41].Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) } diff --git a/src/runtime/runtime_atsamd51g19.go b/src/runtime/runtime_atsamd51g19.go index ff425d6d..c70e79be 100644 --- a/src/runtime/runtime_atsamd51g19.go +++ b/src/runtime/runtime_atsamd51g19.go @@ -9,35 +9,35 @@ import ( func initSERCOMClocks() { // Turn on clock to SERCOM0 for UART0 sam.MCLK.APBAMASK.SetBits(sam.MCLK_APBAMASK_SERCOM0_) - sam.GCLK.PCHCTRL7.Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[7].Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) // sets the "slow" clock shared by all SERCOM - sam.GCLK.PCHCTRL3.Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[3].Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) // Turn on clock to SERCOM1 sam.MCLK.APBAMASK.SetBits(sam.MCLK_APBAMASK_SERCOM1_) - sam.GCLK.PCHCTRL8.Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[8].Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) // Turn on clock to SERCOM2 sam.MCLK.APBBMASK.SetBits(sam.MCLK_APBBMASK_SERCOM2_) - sam.GCLK.PCHCTRL23.Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[23].Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) // Turn on clock to SERCOM3 sam.MCLK.APBBMASK.SetBits(sam.MCLK_APBBMASK_SERCOM3_) - sam.GCLK.PCHCTRL24.Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[24].Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) // Turn on clock to SERCOM4 sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_SERCOM4_) - sam.GCLK.PCHCTRL34.Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[34].Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) // Turn on clock to SERCOM5 sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_SERCOM5_) - sam.GCLK.PCHCTRL35.Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | + sam.GCLK.PCHCTRL[35].Set((sam.GCLK_PCHCTRL_GEN_GCLK1 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) }