Files
tinygo/src/machine/machine_atmega328pb.go
T
deadprogram 2bee29959b refactor: use *SPI everywhere to make consistant for implementations.
Fixes #4663 "in reverse" by making SPI a pointer everywhere, as discussed
in the comments.

Signed-off-by: deadprogram <ron@hybridgroup.com>
2025-03-11 06:06:31 -07:00

120 lines
2.3 KiB
Go

//go:build avr && atmega328pb
package machine
import (
"device/avr"
"runtime/interrupt"
"runtime/volatile"
)
const irq_USART0_RX = avr.IRQ_USART0_RX
const irq_USART1_RX = avr.IRQ_USART1_RX
var (
UART1 = &_UART1
_UART1 = UART{
Buffer: NewRingBuffer(),
dataReg: avr.UDR1,
baudRegH: avr.UBRR1H,
baudRegL: avr.UBRR1L,
statusRegA: avr.UCSR1A,
statusRegB: avr.UCSR1B,
statusRegC: avr.UCSR1C,
}
)
func init() {
// Register the UART interrupt.
interrupt.New(irq_USART1_RX, _UART1.handleInterrupt)
}
// I2C0 is the only I2C interface on most AVRs.
var I2C0 = &I2C{
srReg: avr.TWSR0,
brReg: avr.TWBR0,
crReg: avr.TWCR0,
drReg: avr.TWDR0,
srPS0: avr.TWSR0_TWPS0,
srPS1: avr.TWSR0_TWPS1,
crEN: avr.TWCR0_TWEN,
crINT: avr.TWCR0_TWINT,
crSTO: avr.TWCR0_TWSTO,
crEA: avr.TWCR0_TWEA,
crSTA: avr.TWCR0_TWSTA,
}
var I2C1 = &I2C{
srReg: avr.TWSR1,
brReg: avr.TWBR1,
crReg: avr.TWCR1,
drReg: avr.TWDR1,
srPS0: avr.TWSR1_TWPS10,
srPS1: avr.TWSR1_TWPS11,
crEN: avr.TWCR1_TWEN1,
crINT: avr.TWCR1_TWINT1,
crSTO: avr.TWCR1_TWSTO1,
crEA: avr.TWCR1_TWEA1,
crSTA: avr.TWCR1_TWSTA1,
}
// SPI configuration
var SPI0 = &SPI{
spcr: avr.SPCR0,
spdr: avr.SPDR0,
spsr: avr.SPSR0,
spcrR0: avr.SPCR0_SPR0,
spcrR1: avr.SPCR0_SPR1,
spcrCPHA: avr.SPCR0_CPHA,
spcrCPOL: avr.SPCR0_CPOL,
spcrDORD: avr.SPCR0_DORD,
spcrSPE: avr.SPCR0_SPE,
spcrMSTR: avr.SPCR0_MSTR,
spsrI2X: avr.SPSR0_SPI2X,
spsrSPIF: avr.SPSR0_SPIF,
sck: PB5,
sdo: PB3,
sdi: PB4,
cs: PB2,
}
var SPI1 = &SPI{
spcr: avr.SPCR1,
spdr: avr.SPDR1,
spsr: avr.SPSR1,
spcrR0: avr.SPCR1_SPR10,
spcrR1: avr.SPCR1_SPR11,
spcrCPHA: avr.SPCR1_CPHA1,
spcrCPOL: avr.SPCR1_CPOL1,
spcrDORD: avr.SPCR1_DORD1,
spcrSPE: avr.SPCR1_SPE1,
spcrMSTR: avr.SPCR1_MSTR1,
spsrI2X: avr.SPSR1_SPI2X1,
spsrSPIF: avr.SPSR1_SPIF1,
sck: PC1,
sdo: PE3,
sdi: PC0,
cs: PE2,
}
// getPortMask returns the PORTx register and mask for the pin.
func (p Pin) getPortMask() (*volatile.Register8, uint8) {
switch {
case p >= PB0 && p <= PB7: // port B
return avr.PORTB, 1 << uint8(p-portB)
case p >= PC0 && p <= PC7: // port C
return avr.PORTC, 1 << uint8(p-portC)
case p >= PD0 && p <= PD7: // port D
return avr.PORTD, 1 << uint8(p-portD)
default: // port E
return avr.PORTE, 1 << uint8(p-portE)
}
}