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

sdio_ext.cpp - github.com/thirdpin/libopencm3_cpp_extensions.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: dda9d3bad473517c561d4d7f6c1f2a4eaedcda20 (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
#include "sdio_ext.h"

namespace SDIO_CPP_Extension {

namespace cfg = config;

void SDIO_ext::_init()
{
	_init_rcc();
	_init_gpio();
}

void SDIO_ext::_init_rcc()
{
	rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_SDIOEN);

	rcc_periph_clock_enable(cfg::RCC_PERIPH_DATA_CLK);
	rcc_periph_clock_enable(cfg::RCC_PERIPH_CMD);
}

void SDIO_ext::_init_gpio()
{
    // Pin mappings for STM32F217.
    // PC8  - SDIO_D0
    // PC9  - SDIO_D1
    // PC10 - SDIO_D2
    // PC11 - SDIO_D3
    // PC12 - SDIO_CK
    // PD2  - SDIO_CMD

	// Data pins
	gpio::GPIO_ext data_pins[cfg::COUNT_OF_DATA_PINS];
	for (int i = 0; i < cfg::COUNT_OF_DATA_PINS; ++i) {
		data_pins[i].init(cfg::DATA_PINS[i]);
		data_pins[i].mode_setup(gpio::Mode::ALTERNATE_FUNCTION,
							    gpio::PullMode::NO_PULL);
		data_pins[i].set_output_options(gpio::OutputType::PUSH_PULL,
									    gpio::Speed::FAST_50MHz);
		data_pins[i].set_af(cfg::SDIO_ALTERNATIVE_FUNC_NUMBER);
	}

	// Command pin
	gpio::GPIO_ext cmd_pin(cfg::CMD_PIN);
	cmd_pin.mode_setup(gpio::Mode::ALTERNATE_FUNCTION,
					   gpio::PullMode::NO_PULL);
	cmd_pin.set_output_options(gpio::OutputType::PUSH_PULL,
							   gpio::Speed::FAST_50MHz);
	cmd_pin.set_af(cfg::SDIO_ALTERNATIVE_FUNC_NUMBER);

	// Clock pin
	gpio::GPIO_ext clk_pin(cfg::CLK_PIN);
	clk_pin.mode_setup(gpio::Mode::ALTERNATE_FUNCTION,
					   gpio::PullMode::NO_PULL);
	clk_pin.set_output_options(gpio::OutputType::PUSH_PULL,
							   gpio::Speed::FAST_50MHz);
	clk_pin.set_af(cfg::SDIO_ALTERNATIVE_FUNC_NUMBER);
}

} /* namespace hw */