embox

Форк
0
/
imx6_ecspi2.c 
81 строка · 2.0 Кб
1
/**
2
 * @file
3
 * @brief i.MX6 Enhanced Configurable SPI driver
4
 * @author Denis Deryugin <deryugin.denis@gmail.com>
5
 * @version 0.1
6
 * @date 12.06.2017
7
 */
8

9
#include <embox/unit.h>
10
#include <framework/mod/options.h>
11
#include <util/log.h>
12
#include <drivers/common/memory.h>
13
#include <drivers/spi.h>
14
#include <drivers/clk/ccm_imx6.h>
15
#include <drivers/iomuxc.h>
16

17
#include "imx6_ecspi.h"
18

19
EMBOX_UNIT_INIT(imx6_ecspi2_init);
20

21
#define BASE_ADDR    OPTION_GET(NUMBER, base_addr)
22
#define PINS_GROUP   OPTION_GET(NUMBER, pins_group)
23

24
static struct imx6_ecspi imx6_ecspi2 = {
25
	.base_addr = BASE_ADDR,
26
	.cs_count  = 1,
27
	.cs_array  = {
28
		{4, 29}
29
	},
30
	.cs_iomux  = {
31
		IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA11,
32
	}
33
};
34

35
static void imx_ecspi2_pins_init(void) {
36
	int gpio_n, port;
37
	int i;
38
	/* SS0 (CS0) */
39
	/* FIXME SPI NSS doesn't work somewhy, so we use gpio instead of:
40
	 * iomuxc_write(IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA11, 0x12);
41
	 * iomuxc_write(IOMUXC_ECSPI2_SS0_SELECT_INPUT, 0x2);
42
	 */
43

44
	/* Init all Chip Selects */
45
	for (i = 0; i < imx6_ecspi2.cs_count; i++) {
46
		/* Force GPIO mode. */
47
		iomuxc_write(imx6_ecspi2.cs_iomux[i], 0x15);
48

49
		gpio_n = imx6_ecspi2.cs_array[i][0];
50
		port   = imx6_ecspi2.cs_array[i][1];
51
		gpio_setup_mode(gpio_n, 1 << port, GPIO_MODE_OUT);
52
		gpio_set(gpio_n, 1 << port, 1);
53
	}
54

55
	/* Init selected GPIO group. */
56
#if PINS_GROUP == 1
57
	/* MISO */
58
	iomuxc_write(IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA10, 0x12);
59
	iomuxc_write(IOMUXC_ECSPI2_MISO_SELECT_INPUT, 0x2);
60
	/* MOSI */
61
	iomuxc_write(IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA09, 0x12);
62
	iomuxc_write(IOMUXC_ECSPI2_MOSI_SELECT_INPUT, 0x2);
63
	/* CLK */
64
	iomuxc_write(IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA08, 0x12);
65
	iomuxc_write(IOMUXC_ECSPI2_CSPI_CLK_IN_SELECT_INPUT, 0x2);
66
#else
67
	#error "Wrong pins group for SPI2"
68
#endif
69
}
70

71
static int imx6_ecspi2_init(void) {
72
	log_debug("");
73
	clk_enable("ecspi2");
74
	imx_ecspi2_pins_init();
75
	return imx6_ecspi_init(&imx6_ecspi2);
76
}
77

78
#define SPI_DEV_NAME      ixm6_ecspi2
79

80
PERIPH_MEMORY_DEFINE(imx6_ecspi2, BASE_ADDR, 0x44);
81
SPI_DEV_DEF(SPI_DEV_NAME, &imx6_ecspi_ops, &imx6_ecspi2, 1);
82

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.