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