Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Devices.cpp « SAME5x « Hardware « src - github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 30d4dbbdd4729606892653f757992495bcfca3d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*
 * Devices.cpp
 *
 *  Created on: 9 Jul 2020
 *      Author: David
 *  License: GNU GPL v3
 */

#include "Devices.h"
#include <RepRapFirmware.h>
#include <AnalogIn.h>
#include <AnalogOut.h>
#include <Platform/TaskPriorities.h>

#include <hal_gpio.h>
#include <hal_usb_device.h>
#include <peripheral_clk_config.h>

// Analog input support
constexpr size_t AnalogInTaskStackWords = 300;
static Task<AnalogInTaskStackWords> analogInTask;

#ifdef SERIAL_AUX_DEVICE

// Serial device support
void Serial0PortInit(AsyncSerial *) noexcept
{
	SetPinFunction(Serial0TxPin, Serial0PinFunction);
	SetPinFunction(Serial0RxPin, Serial0PinFunction);
}

void Serial0PortDeinit(AsyncSerial *) noexcept
{
	pinMode(Serial0TxPin, INPUT_PULLUP);
	pinMode(Serial0RxPin, INPUT_PULLUP);
}

AsyncSerial serialUart0(Serial0SercomNumber, Sercom0RxPad, 512, 512, Serial0PortInit, Serial0PortDeinit);

# if !defined(SERIAL0_ISR0) || !defined(SERIAL0_ISR2) || !defined(SERIAL0_ISR3)
#  error SERIAL0_ISRn not defined
# endif

void SERIAL0_ISR0() noexcept
{
	serialUart0.Interrupt0();
}

void SERIAL0_ISR2() noexcept
{
	serialUart0.Interrupt2();
}

void SERIAL0_ISR3() noexcept
{
	serialUart0.Interrupt3();
}

#endif

#ifdef SERIAL_AUX2_DEVICE

void Serial1PortInit(AsyncSerial *) noexcept
{
	SetPinFunction(Serial1TxPin, Serial1PinFunction);
	SetPinFunction(Serial1RxPin, Serial1PinFunction);
}

void Serial1PortDeinit(AsyncSerial *) noexcept
{
	pinMode(Serial1TxPin, INPUT_PULLUP);
	pinMode(Serial1RxPin, INPUT_PULLUP);
}

AsyncSerial serialUart1(Serial1SercomNumber, Sercom1RxPad, 512, 512, Serial1PortInit, Serial1PortDeinit);

# if !defined(SERIAL1_ISR0) || !defined(SERIAL1_ISR2) || !defined(SERIAL1_ISR3)
#  error SERIAL1_ISRn not defined
# endif

void SERIAL1_ISR0() noexcept
{
	serialUart1.Interrupt0();
}

void SERIAL1_ISR2() noexcept
{
	serialUart1.Interrupt2();
}

void SERIAL1_ISR3() noexcept
{
	serialUart1.Interrupt3();
}

#endif

SerialCDC serialUSB(UsbVBusPin, 512, 512);

static void UsbInit() noexcept
{
	// Set up USB clock
	hri_gclk_write_PCHCTRL_reg(GCLK, USB_GCLK_ID, GCLK_PCHCTRL_GEN(GclkNum48MHz) | GCLK_PCHCTRL_CHEN);
	hri_mclk_set_AHBMASK_USB_bit(MCLK);
	hri_mclk_set_APBBMASK_USB_bit(MCLK);

	// Set up USB pins
	// This is the code generated by Atmel Start. I don't know whether it is all necessary.
	gpio_set_pin_direction(PortAPin(24), GPIO_DIRECTION_OUT);
	gpio_set_pin_level(PortAPin(24), false);
	gpio_set_pin_pull_mode(PortAPin(24), GPIO_PULL_OFF);
	gpio_set_pin_function(PortAPin(24), PINMUX_PA24H_USB_DM);

	gpio_set_pin_direction(PortAPin(25), GPIO_DIRECTION_OUT);
	gpio_set_pin_level(PortAPin(25), false);
	gpio_set_pin_pull_mode(PortAPin(25), GPIO_PULL_OFF);
	gpio_set_pin_function(PortAPin(25), PINMUX_PA25H_USB_DP);
}

#if HAS_HIGH_SPEED_SD

static void SdhcInit() noexcept
{
	// Set up SDHC clock
#if defined(DUET3MINI_V04)
	// Using SDHC 1
	hri_mclk_set_AHBMASK_SDHC1_bit(MCLK);
	hri_gclk_write_PCHCTRL_reg(GCLK, SDHC1_GCLK_ID, GCLK_PCHCTRL_GEN(GclkNum90MHz) | GCLK_PCHCTRL_CHEN);
	hri_gclk_write_PCHCTRL_reg(GCLK, SDHC1_GCLK_ID_SLOW, GCLK_PCHCTRL_GEN(GclkNum31KHz) | GCLK_PCHCTRL_CHEN);
#elif defined(FMDC_V02)
	// Using SDHC 1 on v0.2 board
	hri_mclk_set_AHBMASK_SDHC1_bit(MCLK);
	hri_gclk_write_PCHCTRL_reg(GCLK, SDHC1_GCLK_ID, GCLK_PCHCTRL_GEN(GclkNum90MHz) | GCLK_PCHCTRL_CHEN);
	hri_gclk_write_PCHCTRL_reg(GCLK, SDHC1_GCLK_ID_SLOW, GCLK_PCHCTRL_GEN(GclkNum31KHz) | GCLK_PCHCTRL_CHEN);
#else
# error Unknown board
#endif

	// Setup SD card interface pins
	for (Pin p : SdMciPins)
	{
		SetPinFunction(p, SdMciPinsFunction);
	}
}

#endif

void DeviceInit() noexcept
{
	// Ensure the Ethernet PHY or WiFi module is held reset
	pinMode(EspResetPin, OUTPUT_LOW);

	UsbInit();
#if HAS_HIGH_SPEED_SD
	SdhcInit();
#endif

	AnalogIn::Init(NvicPriorityAdc);
	AnalogOut::Init();
	analogInTask.Create(AnalogIn::TaskLoop, "AIN", nullptr, TaskPriority::AinPriority);
}

void StopAnalogTask() noexcept
{
	AnalogIn::Exit();								// make sure that the ISR doesn't try to wake the analog task after we terminate it
	analogInTask.TerminateAndUnlink();
}

// End