rtems_status_code mpc55xx_sd_card_init( bool mount) { rtems_status_code sc = RTEMS_SUCCESSFUL; int rv = 0; sd_card_driver_entry *e = &sd_card_driver_table [0]; RTEMS_DEBUG_PRINT( "Task started\n"); sc = mpc55xx_dspi_init(); RTEMS_CHECK_SC( rv, "Intitalize DSPI bus"); e->bus = mpc55xx_dspi_bus_table [0].bus_number; sc = sd_card_register(); RTEMS_CHECK_SC( sc, "Register SD Card"); if (mount) { sc = rtems_bdpart_register_from_disk( MPC55XX_DEVICE_FILE); RTEMS_CHECK_SC( sc, "Initialize IDE partition table"); rv = rtems_fsmount( mpc55xx_fs_table, sizeof( mpc55xx_fs_table) / sizeof( mpc55xx_fs_table [0]), NULL); RTEMS_CHECK_RV_SC( rv, "Mount file systems"); } return RTEMS_SUCCESSFUL; }
/*=========================================================================*\ | Function: | \*-------------------------------------------------------------------------*/ rtems_status_code bsp_register_spi ( /*-------------------------------------------------------------------------*\ | Purpose: | | register SPI bus and devices | +---------------------------------------------------------------------------+ | Input Parameters: | \*-------------------------------------------------------------------------*/ void /* <none> */ ) /*-------------------------------------------------------------------------*\ | Return Value: | | 0 or error code | \*=========================================================================*/ { rtems_status_code sc = RTEMS_SUCCESSFUL; int ret_code; unsigned spi_busno; /* * init I2C library (if not already done) */ rtems_libi2c_initialize (); /* * init port pins used to address/select SPI devices */ #if defined( MPC83XX_BOARD_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( MPC83XX_BOARD_MPC8349EAMDS) /* * GPIO1[0] is nSEL_SPI for M25P40 * set it to be output, high */ mpc83xx.gpio[0].gpdat |= (1 << (31- 0)); mpc83xx.gpio[0].gpdir |= (1 << (31- 0)); mpc83xx.gpio[0].gpdr &= ~(1 << (31- 0)); #elif defined( MPC83XX_BOARD_HSC_CM01) /* * GPIO1[24] is SPI_A0 * GPIO1[25] is SPI_A1 * GPIO1[26] is SPI_A2 * GPIO1[27] is high-active strobe * set pins to be output, low */ 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 */ bsp_spi_bus_desc.softc.base_frq = BSP_bus_frequency; /* * register SPI bus */ ret_code = rtems_libi2c_register_bus("/dev/spi", &(bsp_spi_bus_desc.bus_desc)); if (ret_code < 0) { return -ret_code; } spi_busno = (unsigned) ret_code; #if defined( MPC83XX_BOARD_MPC8313ERDB) /* Register SD Card driver */ sd_card_driver_table [0].bus = spi_busno; sc = sd_card_register(); if (sc != RTEMS_SUCCESSFUL) { return sc; } #elif defined( MPC83XX_BOARD_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); #elif defined(MPC83XX_BOARD_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; } /* * FIXME: further drivers, when available */ return 0; }