github.com/tinygo-org/tinygo@v0.31.3-0.20240404173401-90b0bf646c27/src/machine/machine_atsamd51p20.go (about) 1 //go:build sam && atsamd51 && atsamd51p20 2 3 // Peripheral abstraction layer for the atsamd51. 4 // 5 // Datasheet: 6 // http://ww1.microchip.com/downloads/en/DeviceDoc/60001507C.pdf 7 package machine 8 9 import "device/sam" 10 11 const HSRAM_SIZE = 0x00040000 12 13 var ( 14 sercomI2CM0 = &I2C{Bus: sam.SERCOM0_I2CM, SERCOM: 0} 15 sercomI2CM1 = &I2C{Bus: sam.SERCOM1_I2CM, SERCOM: 1} 16 sercomI2CM2 = &I2C{Bus: sam.SERCOM2_I2CM, SERCOM: 2} 17 sercomI2CM3 = &I2C{Bus: sam.SERCOM3_I2CM, SERCOM: 3} 18 sercomI2CM4 = &I2C{Bus: sam.SERCOM4_I2CM, SERCOM: 4} 19 sercomI2CM5 = &I2C{Bus: sam.SERCOM5_I2CM, SERCOM: 5} 20 sercomI2CM6 = &I2C{Bus: sam.SERCOM6_I2CM, SERCOM: 6} 21 sercomI2CM7 = &I2C{Bus: sam.SERCOM7_I2CM, SERCOM: 7} 22 23 sercomSPIM0 = SPI{Bus: sam.SERCOM0_SPIM, SERCOM: 0} 24 sercomSPIM1 = SPI{Bus: sam.SERCOM1_SPIM, SERCOM: 1} 25 sercomSPIM2 = SPI{Bus: sam.SERCOM2_SPIM, SERCOM: 2} 26 sercomSPIM3 = SPI{Bus: sam.SERCOM3_SPIM, SERCOM: 3} 27 sercomSPIM4 = SPI{Bus: sam.SERCOM4_SPIM, SERCOM: 4} 28 sercomSPIM5 = SPI{Bus: sam.SERCOM5_SPIM, SERCOM: 5} 29 sercomSPIM6 = SPI{Bus: sam.SERCOM6_SPIM, SERCOM: 6} 30 sercomSPIM7 = SPI{Bus: sam.SERCOM7_SPIM, SERCOM: 7} 31 ) 32 33 // setSERCOMClockGenerator sets the GCLK for sercom 34 func setSERCOMClockGenerator(sercom uint8, gclk uint32) { 35 switch sercom { 36 case 0: 37 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM0_CORE].ClearBits(sam.GCLK_PCHCTRL_CHEN) 38 sam.MCLK.APBAMASK.SetBits(sam.MCLK_APBAMASK_SERCOM0_) 39 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM0_CORE].Set((gclk << sam.GCLK_PCHCTRL_GEN_Pos) | 40 sam.GCLK_PCHCTRL_CHEN) 41 case 1: 42 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM1_CORE].ClearBits(sam.GCLK_PCHCTRL_CHEN) 43 sam.MCLK.APBAMASK.SetBits(sam.MCLK_APBAMASK_SERCOM1_) 44 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM1_CORE].Set((gclk << sam.GCLK_PCHCTRL_GEN_Pos) | 45 sam.GCLK_PCHCTRL_CHEN) 46 case 2: 47 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM2_CORE].ClearBits(sam.GCLK_PCHCTRL_CHEN) 48 sam.MCLK.APBBMASK.SetBits(sam.MCLK_APBBMASK_SERCOM2_) 49 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM2_CORE].Set((gclk << sam.GCLK_PCHCTRL_GEN_Pos) | 50 sam.GCLK_PCHCTRL_CHEN) 51 case 3: 52 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM3_CORE].ClearBits(sam.GCLK_PCHCTRL_CHEN) 53 sam.MCLK.APBBMASK.SetBits(sam.MCLK_APBBMASK_SERCOM3_) 54 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM3_CORE].Set((gclk << sam.GCLK_PCHCTRL_GEN_Pos) | 55 sam.GCLK_PCHCTRL_CHEN) 56 case 4: 57 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM4_CORE].ClearBits(sam.GCLK_PCHCTRL_CHEN) 58 sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_SERCOM4_) 59 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM4_CORE].Set((gclk << sam.GCLK_PCHCTRL_GEN_Pos) | 60 sam.GCLK_PCHCTRL_CHEN) 61 case 5: 62 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM5_CORE].ClearBits(sam.GCLK_PCHCTRL_CHEN) 63 sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_SERCOM5_) 64 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM5_CORE].Set((gclk << sam.GCLK_PCHCTRL_GEN_Pos) | 65 sam.GCLK_PCHCTRL_CHEN) 66 case 6: 67 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM6_CORE].ClearBits(sam.GCLK_PCHCTRL_CHEN) 68 sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_SERCOM6_) 69 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM6_CORE].Set((gclk << sam.GCLK_PCHCTRL_GEN_Pos) | 70 sam.GCLK_PCHCTRL_CHEN) 71 case 7: 72 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM7_CORE].ClearBits(sam.GCLK_PCHCTRL_CHEN) 73 sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_SERCOM7_) 74 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_SERCOM7_CORE].Set((gclk << sam.GCLK_PCHCTRL_GEN_Pos) | 75 sam.GCLK_PCHCTRL_CHEN) 76 } 77 } 78 79 // This chip has five TCC peripherals, which have PWM as one feature. 80 var ( 81 TCC0 = (*TCC)(sam.TCC0) 82 TCC1 = (*TCC)(sam.TCC1) 83 TCC2 = (*TCC)(sam.TCC2) 84 TCC3 = (*TCC)(sam.TCC3) 85 TCC4 = (*TCC)(sam.TCC4) 86 ) 87 88 func (tcc *TCC) configureClock() { 89 // Turn on timer clocks used for TCC and use generic clock generator 0. 90 switch tcc.timer() { 91 case sam.TCC0: 92 sam.MCLK.APBBMASK.SetBits(sam.MCLK_APBBMASK_TCC0_) 93 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC0].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) 94 case sam.TCC1: 95 sam.MCLK.APBBMASK.SetBits(sam.MCLK_APBBMASK_TCC1_) 96 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC1].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) 97 case sam.TCC2: 98 sam.MCLK.APBCMASK.SetBits(sam.MCLK_APBCMASK_TCC2_) 99 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC2].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) 100 case sam.TCC3: 101 sam.MCLK.APBCMASK.SetBits(sam.MCLK_APBCMASK_TCC3_) 102 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC3].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) 103 case sam.TCC4: 104 sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_TCC4_) 105 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC4].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN) 106 } 107 } 108 109 func (tcc *TCC) timerNum() uint8 { 110 switch tcc.timer() { 111 case sam.TCC0: 112 return 0 113 case sam.TCC1: 114 return 1 115 case sam.TCC2: 116 return 2 117 case sam.TCC3: 118 return 3 119 case sam.TCC4: 120 return 4 121 default: 122 return 0x0f // should not happen 123 } 124 }