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  }