github.com/tinygo-org/tinygo@v0.31.3-0.20240404173401-90b0bf646c27/src/machine/machine_atmega328pb.go (about)

     1  //go:build avr && atmega328pb
     2  
     3  package machine
     4  
     5  import (
     6  	"device/avr"
     7  	"runtime/interrupt"
     8  	"runtime/volatile"
     9  )
    10  
    11  const irq_USART0_RX = avr.IRQ_USART0_RX
    12  const irq_USART1_RX = avr.IRQ_USART1_RX
    13  
    14  var (
    15  	UART1  = &_UART1
    16  	_UART1 = UART{
    17  		Buffer: NewRingBuffer(),
    18  
    19  		dataReg:    avr.UDR1,
    20  		baudRegH:   avr.UBRR1H,
    21  		baudRegL:   avr.UBRR1L,
    22  		statusRegA: avr.UCSR1A,
    23  		statusRegB: avr.UCSR1B,
    24  		statusRegC: avr.UCSR1C,
    25  	}
    26  )
    27  
    28  func init() {
    29  	// Register the UART interrupt.
    30  	interrupt.New(irq_USART1_RX, _UART1.handleInterrupt)
    31  }
    32  
    33  // I2C0 is the only I2C interface on most AVRs.
    34  var I2C0 = &I2C{
    35  	srReg: avr.TWSR0,
    36  	brReg: avr.TWBR0,
    37  	crReg: avr.TWCR0,
    38  	drReg: avr.TWDR0,
    39  	srPS0: avr.TWSR0_TWPS0,
    40  	srPS1: avr.TWSR0_TWPS1,
    41  	crEN:  avr.TWCR0_TWEN,
    42  	crINT: avr.TWCR0_TWINT,
    43  	crSTO: avr.TWCR0_TWSTO,
    44  	crEA:  avr.TWCR0_TWEA,
    45  	crSTA: avr.TWCR0_TWSTA,
    46  }
    47  
    48  var I2C1 = &I2C{
    49  	srReg: avr.TWSR1,
    50  	brReg: avr.TWBR1,
    51  	crReg: avr.TWCR1,
    52  	drReg: avr.TWDR1,
    53  	srPS0: avr.TWSR1_TWPS10,
    54  	srPS1: avr.TWSR1_TWPS11,
    55  	crEN:  avr.TWCR1_TWEN1,
    56  	crINT: avr.TWCR1_TWINT1,
    57  	crSTO: avr.TWCR1_TWSTO1,
    58  	crEA:  avr.TWCR1_TWEA1,
    59  	crSTA: avr.TWCR1_TWSTA1,
    60  }
    61  
    62  // SPI configuration
    63  var SPI0 = SPI{
    64  	spcr: avr.SPCR0,
    65  	spdr: avr.SPDR0,
    66  	spsr: avr.SPSR0,
    67  
    68  	spcrR0:   avr.SPCR0_SPR0,
    69  	spcrR1:   avr.SPCR0_SPR1,
    70  	spcrCPHA: avr.SPCR0_CPHA,
    71  	spcrCPOL: avr.SPCR0_CPOL,
    72  	spcrDORD: avr.SPCR0_DORD,
    73  	spcrSPE:  avr.SPCR0_SPE,
    74  	spcrMSTR: avr.SPCR0_MSTR,
    75  
    76  	spsrI2X:  avr.SPSR0_SPI2X,
    77  	spsrSPIF: avr.SPSR0_SPIF,
    78  
    79  	sck: PB5,
    80  	sdo: PB3,
    81  	sdi: PB4,
    82  	cs:  PB2,
    83  }
    84  
    85  var SPI1 = SPI{
    86  	spcr: avr.SPCR1,
    87  	spdr: avr.SPDR1,
    88  	spsr: avr.SPSR1,
    89  
    90  	spcrR0:   avr.SPCR1_SPR10,
    91  	spcrR1:   avr.SPCR1_SPR11,
    92  	spcrCPHA: avr.SPCR1_CPHA1,
    93  	spcrCPOL: avr.SPCR1_CPOL1,
    94  	spcrDORD: avr.SPCR1_DORD1,
    95  	spcrSPE:  avr.SPCR1_SPE1,
    96  	spcrMSTR: avr.SPCR1_MSTR1,
    97  
    98  	spsrI2X:  avr.SPSR1_SPI2X1,
    99  	spsrSPIF: avr.SPSR1_SPIF1,
   100  
   101  	sck: PC1,
   102  	sdo: PE3,
   103  	sdi: PC0,
   104  	cs:  PE2,
   105  }
   106  
   107  // getPortMask returns the PORTx register and mask for the pin.
   108  func (p Pin) getPortMask() (*volatile.Register8, uint8) {
   109  	switch {
   110  	case p >= PB0 && p <= PB7: // port B
   111  		return avr.PORTB, 1 << uint8(p-portB)
   112  	case p >= PC0 && p <= PC7: // port C
   113  		return avr.PORTC, 1 << uint8(p-portC)
   114  	case p >= PD0 && p <= PD7: // port D
   115  		return avr.PORTD, 1 << uint8(p-portD)
   116  	default: // port E
   117  		return avr.PORTE, 1 << uint8(p-portE)
   118  	}
   119  }