summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-03 07:20:11 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-04 10:13:28 +0200
commit27de4e1fb8bcdbdd8cb882fc0d7a2c152b4e027a (patch)
treedef0664dcddc53fd5d599b455c64f76ca2293606 /c/src/lib/libbsp/powerpc
parentbsps: Move config macros to RTEMS_BSP_CONFIGURE (diff)
downloadrtems-27de4e1fb8bcdbdd8cb882fc0d7a2c152b4e027a.tar.bz2
bsps: Move libchip to bsps
This patch is a part of the BSP source reorganization. Update #3285.
Diffstat (limited to 'c/src/lib/libbsp/powerpc')
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/Makefile.am2
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/ide/ata.c239
2 files changed, 1 insertions, 240 deletions
diff --git a/c/src/lib/libbsp/powerpc/gen5200/Makefile.am b/c/src/lib/libbsp/powerpc/gen5200/Makefile.am
index 80ef4018b8..191016701a 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/Makefile.am
+++ b/c/src/lib/libbsp/powerpc/gen5200/Makefile.am
@@ -57,7 +57,7 @@ libbsp_a_SOURCES += console/console.c
libbsp_a_SOURCES += i2c/i2c.c i2c/i2cdrv.c i2c/mpc5200mbus.c i2c/mpc5200mbus.h
# ide
libbsp_a_SOURCES += ide/idecfg.c ide/pcmcia_ide.c ide/pcmcia_ide.h
-libbsp_a_SOURCES += ide/ata.c
+libbsp_a_SOURCES += ../../../../../../bsps/powerpc/gen5200/dev/mpc5200-ata.c
libbsp_a_SOURCES += ide/ata-instance.c
libbsp_a_SOURCES += ide/ata-dma-pio-single.c
diff --git a/c/src/lib/libbsp/powerpc/gen5200/ide/ata.c b/c/src/lib/libbsp/powerpc/gen5200/ide/ata.c
deleted file mode 100644
index de7ee27fb3..0000000000
--- a/c/src/lib/libbsp/powerpc/gen5200/ide/ata.c
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (c) 2010-2013 embedded brains GmbH. All rights reserved.
- *
- * embedded brains GmbH
- * Dornierstr. 4
- * 82178 Puchheim
- * Germany
- * <rtems@embedded-brains.de>
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#define NDEBUG
-
-#include <bsp/ata.h>
-
-#include <bsp.h>
-#include <bsp/fatal.h>
-#include <bsp/mpc5200.h>
-
-#include <libcpu/powerpc-utility.h>
-
-bool ata_execute_io_command(uint8_t command, uint32_t lba, uint32_t sector_count_32)
-{
- assert(sector_count_32 >= 1);
- assert(sector_count_32 <= 256);
-
- assert(ata_is_drive_ready_for_selection());
-
- ATA->write.head = (uint8_t) (0xe0 | ((lba >> 24) & 0x0f));
-
- ata_wait_400_nano_seconds();
- ata_wait_for_drive_ready();
-
- /*
- * It seems that the write to the ATA device registers is sometimes not
- * successful. The write is retried until the read back values are all right
- * or a timeout is reached.
- */
- bool ok = false;
- uint8_t sector = (uint8_t) lba;
- uint8_t cylinder_low = (uint8_t) (lba >> 8);
- uint8_t cylinder_high = (uint8_t) (lba >> 16);
- uint8_t sector_count = (uint8_t) sector_count_32;
- int i;
- for (i = 0; !ok && i < 100; ++i) {
- ATA->write.sector = sector;
- ATA->write.cylinder_low = cylinder_low;
- ATA->write.cylinder_high = cylinder_high;
- ATA->write.sector_count = sector_count;
-
- uint8_t actual_sector = ATA->read.sector;
- uint8_t actual_cylinder_low = ATA->read.cylinder_low;
- uint8_t actual_cylinder_high = ATA->read.cylinder_high;
- uint8_t actual_sector_count = ATA->read.sector_count;
-
- ok = actual_cylinder_high == cylinder_high
- && actual_cylinder_low == cylinder_low
- && actual_sector == sector
- && actual_sector_count == sector_count;
- }
-
- if (ok) {
- ATA->write.command = command;
- }
-
- return ok;
-}
-
-void ata_reset_device(void)
-{
- /* ATA/ATAPI-7 V2, 11.2 Software reset protocol */
- ATA->write.control = DCTRL_SRST;
- rtems_bsp_delay(5);
- ATA->write.control = 0;
- rtems_bsp_delay(2000);
- ata_wait_for_not_busy();
-}
-
-bool ata_set_transfer_mode(uint8_t mode)
-{
- assert(ata_is_drive_ready_for_selection());
-
- ATA->write.head = 0xe0;
-
- ata_wait_400_nano_seconds();
- ata_wait_for_drive_ready();
-
- ATA->write.feature = 0x3;
- ATA->write.sector_count = mode;
- ATA->write.command = 0xef;
-
- ata_wait_for_not_busy();
-
- return ata_check_status();
-}
-
-static bool probe(void)
-{
- bool card_present = true;
-
-#ifdef MPC5200_BOARD_BRS5L
- volatile struct mpc5200_gpt *gpt = &mpc5200.gpt[GPT2];
-
- /* Enable card detection on GPT2 */
- gpt->emsel = (GPT_EMSEL_GPIO_IN | GPT_EMSEL_TIMER_MS_GPIO);
-
- /* Check for card detection (-CD0) */
- if ((gpt->status & GPT_STATUS_PIN) != 0) {
- card_present = false;
- }
-#endif
-
- return card_present;
-}
-
-static void create_lock(ata_driver *self)
-{
- rtems_status_code sc = rtems_semaphore_create(
- rtems_build_name('A', 'T', 'A', ' '),
- 1,
- RTEMS_LOCAL | RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
- 0,
- &self->lock
- );
- if (sc != RTEMS_SUCCESSFUL) {
- bsp_fatal(MPC5200_FATAL_ATA_LOCK_CREATE);
- }
-}
-
-static void destroy_lock(const ata_driver *self)
-{
- rtems_status_code sc = rtems_semaphore_delete(self->lock);
- if (sc != RTEMS_SUCCESSFUL) {
- bsp_fatal(MPC5200_FATAL_ATA_LOCK_DESTROY);
- }
-}
-
-void ata_driver_create(ata_driver *self, const char *device_file_path, rtems_block_device_ioctl io_control)
-{
- self->card_present = probe();
-
- if (ata_driver_is_card_present(self)) {
- create_lock(self);
- ata_reset_device();
-
- uint16_t sector_buffer[256];
- ata_dev_t ata_device;
- rtems_status_code sc = ata_identify_device(0, 0, sector_buffer, &ata_device);
-
- if (sc == RTEMS_SUCCESSFUL && ata_device.lba_avaible) {
- sc = ide_controller_config_io_speed(0, ata_device.modes_available);
-
- if (sc == RTEMS_SUCCESSFUL) {
- sc = rtems_blkdev_create(
- device_file_path,
- ATA_SECTOR_SIZE,
- ata_device.lba_sectors,
- io_control,
- self
- );
-
- if (sc != RTEMS_SUCCESSFUL) {
- bsp_fatal(MPC5200_FATAL_ATA_DISK_CREATE);
- }
- }
- }
- }
-}
-
-void ata_driver_destroy(ata_driver *self)
-{
- destroy_lock(self);
- /* TODO */
- assert(0);
-}
-
-static bool transfer_pio_polled(ata_driver *self, bool read, rtems_blkdev_sg_buffer *sg, size_t sg_count)
-{
- bool ok = true;
-
- ata_sg_context sg_context;
- ata_sg_create(&sg_context, sg, sg_count);
- rtems_blkdev_bnum start_sector = ata_sg_get_start_sector(&sg_context);
- rtems_blkdev_bnum sector_count = ata_sg_get_sector_count(&sg_context);
- rtems_blkdev_bnum relative_sector = 0;
-
- uint8_t command = ata_read_or_write_sectors_command(read);
-
- while (ok && relative_sector < sector_count) {
- rtems_blkdev_bnum remaining_sectors = sector_count - relative_sector;
- rtems_blkdev_bnum transfer_count = ata_max_transfer_count(remaining_sectors);
- rtems_blkdev_bnum transfer_end = relative_sector + transfer_count;
-
- ok = ata_execute_io_command(command, start_sector + relative_sector, transfer_count);
-
- rtems_blkdev_bnum transfer;
- for (transfer = relative_sector; ok && transfer < transfer_end; ++transfer) {
- uint16_t *current = ata_sg_get_sector_data_begin(&sg_context, transfer);
- uint16_t *end = ata_sg_get_sector_data_end(&sg_context, current);
-
- ok = ata_wait_for_data_request();
-
- if (ok) {
- if (read) {
- while (current != end) {
- *current = ATA->read.data;
- ++current;
- }
- } else {
- while (current != end) {
- ATA->write.data = *current;
- ++current;
- }
- }
- }
- }
-
- if (ok) {
- ata_wait_for_not_busy();
- ok = ata_check_status();
- }
-
- relative_sector += ATA_PER_TRANSFER_SECTOR_COUNT_MAX;
- }
-
- return ok;
-}
-
-int ata_driver_io_control_pio_polled(
- rtems_disk_device *dd,
- uint32_t cmd,
- void *arg
-)
-{
- return ata_driver_io_control(dd, cmd, arg, transfer_pio_polled);
-}