embox
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
19EMBOX_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
24static struct imx6_ecspi imx6_ecspi2 = {25.base_addr = BASE_ADDR,26.cs_count = 1,27.cs_array = {28{4, 29}29},30.cs_iomux = {31IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA11,32}33};34
35static void imx_ecspi2_pins_init(void) {36int gpio_n, port;37int 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 */45for (i = 0; i < imx6_ecspi2.cs_count; i++) {46/* Force GPIO mode. */47iomuxc_write(imx6_ecspi2.cs_iomux[i], 0x15);48
49gpio_n = imx6_ecspi2.cs_array[i][0];50port = imx6_ecspi2.cs_array[i][1];51gpio_setup_mode(gpio_n, 1 << port, GPIO_MODE_OUT);52gpio_set(gpio_n, 1 << port, 1);53}54
55/* Init selected GPIO group. */56#if PINS_GROUP == 157/* MISO */58iomuxc_write(IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA10, 0x12);59iomuxc_write(IOMUXC_ECSPI2_MISO_SELECT_INPUT, 0x2);60/* MOSI */61iomuxc_write(IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA09, 0x12);62iomuxc_write(IOMUXC_ECSPI2_MOSI_SELECT_INPUT, 0x2);63/* CLK */64iomuxc_write(IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA08, 0x12);65iomuxc_write(IOMUXC_ECSPI2_CSPI_CLK_IN_SELECT_INPUT, 0x2);66#else67#error "Wrong pins group for SPI2"68#endif69}
70
71static int imx6_ecspi2_init(void) {72log_debug("");73clk_enable("ecspi2");74imx_ecspi2_pins_init();75return imx6_ecspi_init(&imx6_ecspi2);76}
77
78#define SPI_DEV_NAME ixm6_ecspi279
80PERIPH_MEMORY_DEFINE(imx6_ecspi2, BASE_ADDR, 0x44);81SPI_DEV_DEF(SPI_DEV_NAME, &imx6_ecspi_ops, &imx6_ecspi2, 1);82