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 }