Enabling SPI1 on Linux (Diva)

From DAVE Developer's Wiki
Jump to: navigation, search
Info Box
Diva-am335x-overview.png Applies to Diva
Tux.png Applies to Linux

Introduction

This article shows how to enable the SPI1 interface (with CS0 and CS1 chip selects) which can be used in a standard Linux application.

Pin Mux Option

SPI1 signals are available at different Diva pins. The following configurations can be used:

Option 1

Signal Diva Connector Phisical Pin CPU Ball
SPI1_SCLK J1.109 C18
SPI1_D0 J1.31 E18
SPI1_D1 J1.29 E17
SPI1_CS0 J1.144 C12
SPI1_CS1 J1.69 A15

Option 2

200px-Emblem-important.svg.png This configuration can be implemented on the DivaEVB-Lite using the on-board expansion connectors. 200px-Emblem-important.svg.png
Signal Diva Connector Phisical Pin CPU Ball DivaEVB-Lite signal
SPI1_SCLK J1.150 A13 J10.7
SPI1_D0 J1.140 B13 J9.15
SPI1_D1 J1.142 D12 J9.17
SPI1_CS0 J1.144 C12 J9.19
SPI1_CS1 J1.69 A15 J11.19

Linux kernel patches

200px-Emblem-important.svg.png The patches below applies to DIVELK 1.0.0 Linux source tree. 200px-Emblem-important.svg.png

Option 1

The files arch/arm/mach-omap2/board-diva.c and arch/arm/mach-omap2/diva_pinmux_table.h must be modified according to the following patches:


diff --git a/arch/arm/mach-omap2/board-diva.c b/arch/arm/mach-omap2/board-diva.c
index f6b77fc..a8b3996 100644
--- a/arch/arm/mach-omap2/board-diva.c
+++ b/arch/arm/mach-omap2/board-diva.c
@@ -356,6 +356,30 @@ static void spi0_init(int evm_id, int profile)
 			ARRAY_SIZE(diva_spi0_slave_info));
 }
 
+/* -------------- SPI 1 Platform Data -----------------------------*/
+struct spi_board_info __initdata diva_spi1_slave_info[] = {
+	{
+		.modalias = "spidev",
+		.max_speed_hz = 2000000,     /* max spi clock (SCK) speed in HZ */
+		.bus_num = 2,
+		.chip_select = 0,
+	},
+	{
+		.modalias = "spidev",
+		.max_speed_hz = 2000000,     /* max spi clock (SCK) speed in HZ */
+		.bus_num = 2,
+		.chip_select = 1,
+	},
+};
+
+/* setup spi0 */
+
+static void spi1_init(int evm_id, int profile)
+{
+	setup_pin_mux(spi1_pin_mux);
+	spi_register_board_info(diva_spi1_slave_info,
+			ARRAY_SIZE(diva_spi1_slave_info));
+}
 
 /* ----------- NAND Init ---------------------------------------*/
 
@@ -878,6 +902,7 @@ static struct evm_dev_cfg diva_dev_cfg[] = {
 	{mmc0_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
 	{rmii1_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
 	{spi0_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
+	{spi1_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
 	{usb0_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
 	{usb1_init,	DEV_ON_BASEBOARD, PROFILE_NONE},

diff --git a/arch/arm/mach-omap2/diva_pinmux_table.h b/arch/arm/mach-omap2/diva_pinmux_table.h
index 5a2646a..9509b46 100644
--- a/arch/arm/mach-omap2/diva_pinmux_table.h
+++ b/arch/arm/mach-omap2/diva_pinmux_table.h
@@ -180,6 +180,21 @@ static struct pinmux_config w1_gpio_pin_mux[] = {
 	{NULL, 0},
 };
 
+/* Module pin mux for SPI fash */
+static struct pinmux_config spi1_pin_mux[] = {
+	{"ecap0_in_pwm0_out.spi1_sclk", OMAP_MUX_MODE0 | AM33XX_PULL_ENBL
+							| AM33XX_INPUT_EN},
+	{"uart0_ctsn.spi1_d0", OMAP_MUX_MODE0 | AM33XX_PULL_ENBL | AM33XX_PULL_UP
+							| AM33XX_INPUT_EN},
+	{"uart0_rtsn.spi1_d1", OMAP_MUX_MODE0 | AM33XX_PULL_ENBL
+							| AM33XX_INPUT_EN},
+	{"mcasp0_ahclkr.spi1_cs0", OMAP_MUX_MODE0 | AM33XX_PULL_ENBL | AM33XX_PULL_UP
+							| AM33XX_INPUT_EN},
+	{"xdma_event_intr0.spi1_cs1", OMAP_MUX_MODE0 | AM33XX_PULL_ENBL | AM33XX_PULL_UP
+							| AM33XX_INPUT_EN},
+	{NULL, 0},
+};
+
 /*
  * the following mux configurations are un-tested but are left here for
  * reference. They are all comment-out to avoid "defined but not used" warning

The kernel must be rebuilt to make these modifications effective.


Option 2

The files arch/arm/mach-omap2/board-diva.c and arch/arm/mach-omap2/diva_pinmux_table.h must be modified according to the following patches:


diff --git a/arch/arm/mach-omap2/board-diva.c b/arch/arm/mach-omap2/board-diva.c
index 42898e9..8f7810d 100644
--- a/arch/arm/mach-omap2/board-diva.c
+++ b/arch/arm/mach-omap2/board-diva.c
@@ -356,6 +356,30 @@ static void spi0_init(int evm_id, int profile)
 			ARRAY_SIZE(diva_spi0_slave_info));
 }
 
+/* -------------- SPI 1 Platform Data -----------------------------*/
+struct spi_board_info __initdata diva_spi1_slave_info[] = {
+	{
+		.modalias = "spidev",
+		.max_speed_hz = 2000000,     /* max spi clock (SCK) speed in HZ */
+		.bus_num = 2,
+		.chip_select = 0,
+	},
+	{
+		.modalias = "spidev",
+		.max_speed_hz = 2000000,     /* max spi clock (SCK) speed in HZ */
+		.bus_num = 2,
+		.chip_select = 1,
+	},
+};
+
+/* setup spi1 */
+
+static void spi1_init(int evm_id, int profile)
+{
+	setup_pin_mux(spi1_pin_mux);
+	spi_register_board_info(diva_spi1_slave_info,
+			ARRAY_SIZE(diva_spi1_slave_info));
+}
 
 /* ----------- NAND Init ---------------------------------------*/
 
@@ -872,11 +896,12 @@ static struct evm_dev_cfg diva_dev_cfg[] = {
 	{mmc0_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
 	{rmii1_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
 	{spi0_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
+	{spi1_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
 	{usb0_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
 	{usb1_init,	DEV_ON_BASEBOARD, PROFILE_NONE},
 	
 	{mfd_tscadc_init,	DEV_ON_BASEBOARD, PROFILE_NONE},	
-	{mcasp0_init,   DEV_ON_BASEBOARD, PROFILE_NONE},
+	//{mcasp0_init,   DEV_ON_BASEBOARD, PROFILE_NONE},
 	
 	{w1_init, DEV_ON_BASEBOARD, PROFILE_NONE},


200px-Emblem-important.svg.png With this pinmux configuration, the SPI1 signals are shared with the McASP0 signals. Thus, for a proper setup, the MCASP0 interface initialization must be disabled in evm_dev_cfg diva_dev_cfg[] (please see the patch above). 200px-Emblem-important.svg.png

diff --git a/arch/arm/mach-omap2/diva_pinmux_table.h b/arch/arm/mach-omap2/diva_pinmux_table.h
index f6647b0..d2722a3 100644
--- a/arch/arm/mach-omap2/diva_pinmux_table.h
+++ b/arch/arm/mach-omap2/diva_pinmux_table.h
@@ -179,6 +179,19 @@ static struct pinmux_config w1_gpio_pin_mux[] = {
 	{NULL, 0},
 };
 
+/* Module pin mux for SPI1 */
+
+
+static struct pinmux_config spi1_pin_mux[] = {
+	{"mcasp0_aclkx.spi1_sclk", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL | AM33XX_INPUT_EN}, // clock
+	{"mcasp0_fsx.spi1_d0", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL | AM33XX_PULL_UP | AM33XX_INPUT_EN}, // d0
+	{"mcasp0_axr0.spi1_d1", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL | AM33XX_INPUT_EN}, // d1
+	{"mcasp0_ahclkr.spi1_cs0", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL | AM33XX_PULL_UP | AM33XX_INPUT_EN}, // cs0
+	{"xdma_event_intr0.spi1_cs1", OMAP_MUX_MODE4 | AM33XX_PULL_ENBL | AM33XX_PULL_UP | AM33XX_INPUT_EN}, // cs1
+	{NULL, 0},
+};
+
+
 /*
  * the following mux configurations are un-tested but are left here for
  * reference. They are all comment-out to avoid "defined but not used" warning
@@ -187,7 +200,7 @@ static struct pinmux_config w1_gpio_pin_mux[] = {
 #ifdef UNUSED_DIVA_PINMUX
 
 /* Module pin mux for SPI flash */
-static struct pinmux_config spi1_pin_mux[] = {
+/*static struct pinmux_config spi1_pin_mux[] = {
 	{"mcasp0_aclkx.spi1_sclk", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
 		| AM33XX_INPUT_EN},
 	{"mcasp0_fsx.spi1_d0", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
@@ -197,7 +210,7 @@ static struct pinmux_config spi1_pin_mux[] = {
 	{"mcasp0_ahclkr.spi1_cs0", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
 		| AM33XX_PULL_UP | AM33XX_INPUT_EN},
 	{NULL, 0},
-};
+};*/
 
 /* Module pin mux for rgmii1 */
 static struct pinmux_config rgmii1_pin_mux[] = {

The kernel must be rebuilt to make these modifications effective.

Using the interface

Users can access the peripherals connected to the SP1 bus through the spidev interface. For further information, please refer to

Patch download