summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/gen83xx/spi/spi_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc/gen83xx/spi/spi_init.c')
-rw-r--r--c/src/lib/libbsp/powerpc/gen83xx/spi/spi_init.c188
1 files changed, 153 insertions, 35 deletions
diff --git a/c/src/lib/libbsp/powerpc/gen83xx/spi/spi_init.c b/c/src/lib/libbsp/powerpc/gen83xx/spi/spi_init.c
index 8fddc2b680..b065ffc6f0 100644
--- a/c/src/lib/libbsp/powerpc/gen83xx/spi/spi_init.c
+++ b/c/src/lib/libbsp/powerpc/gen83xx/spi/spi_init.c
@@ -20,11 +20,23 @@
#include <mpc83xx/mpc83xx_spidrv.h>
#include <bsp/irq.h>
#include <bsp.h>
-#if defined(MPC8349EAMDS)
+
+#if defined( MPC8313ERDB)
+
+#include <libchip/spi-sd-card.h>
+
+#elif defined( MPC8349EAMDS)
+
#include <libchip/spi-flash-m25p40.h>
-#endif
-#if defined(HSC_CM01)
+
+#elif defined( HSC_CM01)
+
#include <libchip/spi-fram-fm25l256.h>
+
+#else
+
+#warning No SPI configuration available
+
#endif
/*=========================================================================*\
@@ -51,7 +63,19 @@ static rtems_status_code bsp_spi_sel_addr
| o = ok or error code |
\*=========================================================================*/
{
-#if defined(MPC8349EAMDS)
+
+#if defined( MPC8313ERDB)
+
+ /* Check address */
+ if (addr > 0) {
+ return RTEMS_INVALID_NUMBER;
+ }
+
+ /* SCS (active low) */
+ mpc83xx.gpio [0].gpdat &= ~0x20000000;
+
+#elif defined( MPC8349EAMDS)
+
/*
* check device address for valid range
*/
@@ -64,8 +88,9 @@ static rtems_status_code bsp_spi_sel_addr
* set it to be active/low
*/
mpc83xx.gpio[0].gpdat &= ~(1 << (31- 0));
-#endif
-#if defined(HSC_CM01)
+
+#elif defined( HSC_CM01)
+
/*
* check device address for valid range
*/
@@ -88,7 +113,9 @@ static rtems_status_code bsp_spi_sel_addr
* GPIO1[27] is high-active strobe
*/
mpc83xx.gpio[0].gpdat |= (1 << (31- 27));
+
#endif
+
return RTEMS_SUCCESSFUL;
}
@@ -110,20 +137,30 @@ static rtems_status_code bsp_spi_send_start_dummy
| o = ok or error code |
\*=========================================================================*/
{
-#if defined(MPC8349EAMDS)
+
+#if defined( MPC8313ERDB)
+
+ /* SCS (inactive high) */
+ mpc83xx.gpio [0].gpdat |= 0x20000000;
+
+#elif defined( MPC8349EAMDS)
+
/*
* GPIO1[0] is nSEL_SPI for M25P40
* set it to inactive/high
*/
mpc83xx.gpio[0].gpdat |= (1 << (31- 0));
-#endif
-#if defined(HSC_CM01)
+
+#elif defined( HSC_CM01)
+
/*
* GPIO1[27] is high-active strobe
* set it to inactive/ low
*/
mpc83xx.gpio[0].gpdat &= ~(0x1 << (31-27));
+
#endif
+
return 0;
}
@@ -148,21 +185,31 @@ static rtems_status_code bsp_spi_send_stop
#if defined(DEBUG)
printk("bsp_spi_send_stop called... ");
#endif
-#if defined(MPC8349EAMDS)
+
+#if defined( MPC8313ERDB)
+
+ /* SCS (inactive high) */
+ mpc83xx.gpio [0].gpdat |= 0x20000000;
+
+#elif defined( MPC8349EAMDS)
+
/*
* deselect given device
* GPIO1[0] is nSEL_SPI for M25P40
* set it to be inactive/high
*/
mpc83xx.gpio[0].gpdat |= (1 << (31- 0));
-#endif
-#if defined(HSC_CM01)
+
+#elif defined( HSC_CM01)
+
/*
* deselect device
* GPIO1[27] is high-active strobe
*/
mpc83xx.gpio[0].gpdat &= ~(1 << (31- 27));
+
#endif
+
#if defined(DEBUG)
printk("... exit OK\r\n");
#endif
@@ -174,28 +221,58 @@ static rtems_status_code bsp_spi_send_stop
\*=========================================================================*/
rtems_libi2c_bus_ops_t bsp_spi_ops = {
- init: mpc83xx_spi_init,
- send_start: bsp_spi_send_start_dummy,
- send_stop: bsp_spi_send_stop,
- send_addr: bsp_spi_sel_addr,
- read_bytes: mpc83xx_spi_read_bytes,
- write_bytes: mpc83xx_spi_write_bytes,
- ioctl: mpc83xx_spi_ioctl
+ .init = mpc83xx_spi_init,
+ .send_start = bsp_spi_send_start_dummy,
+ .send_stop = bsp_spi_send_stop,
+ .send_addr = bsp_spi_sel_addr,
+ .read_bytes = mpc83xx_spi_read_bytes,
+ .write_bytes = mpc83xx_spi_write_bytes,
+ .ioctl = mpc83xx_spi_ioctl
};
static mpc83xx_spi_desc_t bsp_spi_bus_desc = {
{/* public fields */
- ops: &bsp_spi_ops,
- size: sizeof(bsp_spi_bus_desc),
+ .ops = &bsp_spi_ops,
+ .size = sizeof(bsp_spi_bus_desc)
},
{ /* our private fields */
- reg_ptr: &mpc83xx.spi,
- initialized: FALSE,
- irq_number: BSP_IPIC_IRQ_SPI,
- base_frq : 0 /* filled in during init */
+ .reg_ptr =&mpc83xx.spi,
+ .initialized = FALSE,
+ .irq_number = BSP_IPIC_IRQ_SPI,
+ .base_frq = 0 /* filled in during init */
}
};
+#ifdef MPC8313ERDB
+
+#include <libchip/spi-sd-card.h>
+
+sd_card_driver_entry sd_card_driver_table [1] = { {
+ .driver = {
+ .ops = &sd_card_driver_ops,
+ .size = sizeof( sd_card_driver_entry)
+ },
+ .table_index = 0,
+ .minor = 0,
+ .device_name = "sd-card-a",
+ .disk_device_name = "/dev/sd-card-a",
+ .transfer_mode = SD_CARD_TRANSFER_MODE_DEFAULT,
+ .command = SD_CARD_COMMAND_DEFAULT,
+ /* .response = whatever, */
+ .response_index = SD_CARD_COMMAND_SIZE,
+ .n_ac_max = SD_CARD_N_AC_MAX_DEFAULT,
+ .block_number = 0,
+ .block_size = 0,
+ .block_size_shift = 0,
+ .busy = 1,
+ .verbose = 1,
+ .schedule_if_busy = 0
+ }
+};
+
+#endif /* MPC8313ERDB */
+
+
/*=========================================================================*\
| initialization |
\*=========================================================================*/
@@ -229,7 +306,33 @@ rtems_status_code bsp_register_spi
/*
* init port pins used to address/select SPI devices
*/
-#if defined(MPC8349EAMDS)
+
+#if defined( MPC8313ERDB)
+
+ /*
+ * Configured as master (direct connection to SD card)
+ *
+ * GPIO[28] : SOUT
+ * GPIO[29] : SIN
+ * GPIO[30] : SCLK
+ * GPIO[02] : SCS (inactive high), GPIO[02] is normally connected to U43 at
+ * pin 15 of MC74LCX244DT.
+ */
+
+ /* Function */
+ mpc83xx.syscon.sicrl = (mpc83xx.syscon.sicrl & ~0x03fc0000) | 0x30000000;
+
+ /* Direction */
+ mpc83xx.gpio [0].gpdir = (mpc83xx.gpio [0].gpdir & ~0x0000000f) | 0x2000000b;
+
+ /* Data */
+ mpc83xx.gpio [0].gpdat |= 0x20000000;
+
+ /* Open Drain */
+ /* mpc83xx.gpio [0].gpdr |= 0x0000000f; */
+
+#elif defined( MPC8349EAMDS)
+
/*
* GPIO1[0] is nSEL_SPI for M25P40
* set it to be output, high
@@ -237,8 +340,9 @@ rtems_status_code bsp_register_spi
mpc83xx.gpio[0].gpdat |= (1 << (31- 0));
mpc83xx.gpio[0].gpdir |= (1 << (31- 0));
mpc83xx.gpio[0].gpdr &= ~(1 << (31- 0));
-#endif
-#if defined(HSC_CM01)
+
+#elif defined( HSC_CM01)
+
/*
* GPIO1[24] is SPI_A0
* GPIO1[25] is SPI_A1
@@ -249,7 +353,9 @@ rtems_status_code bsp_register_spi
mpc83xx.gpio[0].gpdat &= ~(0xf << (31-27));
mpc83xx.gpio[0].gpdir |= (0xf << (31-27));
mpc83xx.gpio[0].gpdr &= ~(0xf << (31-27));
+
#endif
+
/*
* update base frequency in spi descriptor
*/
@@ -264,28 +370,40 @@ rtems_status_code bsp_register_spi
return -ret_code;
}
spi_busno = ret_code;
-#if defined(MPC8349EAMDS)
+
+#if defined( MPC8313ERDB)
+
+ /* Register SD Card driver */
+ ret_code = rtems_libi2c_register_drv(
+ sd_card_driver_table [0].device_name,
+ (rtems_libi2c_drv_t *) &sd_card_driver_table [0],
+ spi_busno,
+ 0
+ );
+
+#elif defined( MPC8349EAMDS)
+
/*
* register M25P40 Flash
*/
ret_code = rtems_libi2c_register_drv(RTEMS_BSP_SPI_FLASH_DEVICE_NAME,
spi_flash_m25p40_rw_driver_descriptor,
spi_busno,0x00);
- if (ret_code < 0) {
- return -ret_code;
- }
-#endif
-#if defined(HSC_CM01)
+#elif defined(HSC_CM01)
+
/*
* register FM25L256 FRAM
*/
ret_code = rtems_libi2c_register_drv(RTEMS_BSP_SPI_FRAM_DEVICE_NAME,
spi_fram_fm25l256_rw_driver_descriptor,
spi_busno,0x02);
+
+#endif
+
if (ret_code < 0) {
return -ret_code;
}
-#endif
+
/*
* FIXME: further drivers, when available
*/