diff options
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.c | 188 |
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 */ |