OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [stable_0_2_0/] [or1ksim/] [peripheral/] [atahost.c] - Diff between revs 1461 and 1486

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 1461 Rev 1486
Line 27... Line 27...
#include <inttypes.h>
#include <inttypes.h>
#endif
#endif
 
 
#include "port.h"
#include "port.h"
#include "arch.h"
#include "arch.h"
/* get a prototype for 'register_memoryarea()', and 'adjust_rw_delay()' */
/* get a prototype for 'reg_mem_area()', and 'adjust_rw_delay()' */
#include "abstract.h"
#include "abstract.h"
#include "sim-config.h"
#include "sim-config.h"
#include "sched.h"
#include "sched.h"
 
 
/* all user defineable settings are in 'atahost_define.h'             */
/* all user defineable settings are in 'atahost_define.h'             */
Line 53... Line 53...
   ata->regs.dtr0  = (DMA_MODE0_TEOC << ATA_TEOC) | (DMA_MODE0_TD << ATA_TD) | (DMA_MODE0_TM << ATA_TM);
   ata->regs.dtr0  = (DMA_MODE0_TEOC << ATA_TEOC) | (DMA_MODE0_TD << ATA_TD) | (DMA_MODE0_TM << ATA_TM);
   ata->regs.dtr1  = (DMA_MODE0_TEOC << ATA_TEOC) | (DMA_MODE0_TD << ATA_TD) | (DMA_MODE0_TM << ATA_TM);
   ata->regs.dtr1  = (DMA_MODE0_TEOC << ATA_TEOC) | (DMA_MODE0_TD << ATA_TD) | (DMA_MODE0_TM << ATA_TM);
   ata->regs.txb   = 0;
   ata->regs.txb   = 0;
 
 
   // inform simulator about new read/write delay timings
   // inform simulator about new read/write delay timings
   adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
   adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
 
 
   /* the reset bit in the control register 'ctrl' is set, reset connect ata-devices */
   /* the reset bit in the control register 'ctrl' is set, reset connect ata-devices */
   ata_devices_hw_reset(&ata->devices, 1);
   ata_devices_hw_reset(&ata->devices, 1);
}
}
/* ========================================================================= */
/* ========================================================================= */
Line 68... Line 68...
*/
*/
uint32_t ata_read32( oraddr_t addr, void *dat )
uint32_t ata_read32( oraddr_t addr, void *dat )
{
{
    ata_host *ata = dat;
    ata_host *ata = dat;
 
 
    addr -= ata->baseaddr;
 
 
 
    /* determine if ata_host or ata_device addressed */
    /* determine if ata_host or ata_device addressed */
    if (is_ata_hostadr(addr))
    if (is_ata_hostadr(addr))
    {
    {
        // Accesses to internal register take 2cycles
        // Accesses to internal register take 2cycles
        adjust_rw_delay( ata->baseaddr, 2, 2 );
        adjust_rw_delay( ata->mem, 2, 2 );
 
 
        switch( addr ) {
        switch( addr ) {
            case ATA_CTRL :
            case ATA_CTRL :
                return ata -> regs.ctrl;
                return ata -> regs.ctrl;
 
 
Line 118... Line 116...
        // make sure simulator uses correct read/write delay timings
        // make sure simulator uses correct read/write delay timings
#if (DEV_ID > 1)
#if (DEV_ID > 1)
        if ( (addr & 0x7f) == ATA_DR)
        if ( (addr & 0x7f) == ATA_DR)
        {
        {
          if (ata->devices.dev)
          if (ata->devices.dev)
              adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.ftcr1), ata_pio_delay(ata->regs.ftcr1) );
              adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.ftcr1), ata_pio_delay(ata->regs.ftcr1) );
          else
          else
              adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.ftcr0), ata_pio_delay(ata->regs.ftcr0) );
              adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.ftcr0), ata_pio_delay(ata->regs.ftcr0) );
        }
        }
        else
        else
#endif
#endif
        adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
        adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
 
 
        return ata_devices_read(&ata->devices, addr & 0x7f);
        return ata_devices_read(&ata->devices, addr & 0x7f);
    }
    }
}
}
/* ========================================================================= */
/* ========================================================================= */
Line 139... Line 137...
*/
*/
void ata_write32( oraddr_t addr, uint32_t value, void *dat )
void ata_write32( oraddr_t addr, uint32_t value, void *dat )
{
{
    ata_host *ata = dat;
    ata_host *ata = dat;
 
 
    addr -= ata->baseaddr;
 
 
 
    /* determine if ata_host or ata_device addressed */
    /* determine if ata_host or ata_device addressed */
    if (is_ata_hostadr(addr))
    if (is_ata_hostadr(addr))
    {
    {
       // Accesses to internal register take 2cycles
       // Accesses to internal register take 2cycles
       adjust_rw_delay( ata->baseaddr, 2, 2 );
       adjust_rw_delay( ata->mem, 2, 2 );
 
 
        switch( addr ) {
        switch( addr ) {
            case ATA_CTRL :
            case ATA_CTRL :
                ata -> regs.ctrl =  value;
                ata -> regs.ctrl =  value;
 
 
Line 207... Line 203...
        // make sure simulator uses correct read/write delay timings
        // make sure simulator uses correct read/write delay timings
#if (DEV_ID > 1)
#if (DEV_ID > 1)
        if ( (addr & 0x7f) == ATA_DR)
        if ( (addr & 0x7f) == ATA_DR)
        {
        {
          if (ata->devices.dev)
          if (ata->devices.dev)
              adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.ftcr1), ata_pio_delay(ata->regs.ftcr1) );
              adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.ftcr1), ata_pio_delay(ata->regs.ftcr1) );
          else
          else
              adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.ftcr0), ata_pio_delay(ata->regs.ftcr0) );
              adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.ftcr0), ata_pio_delay(ata->regs.ftcr0) );
        }
        }
        else
        else
#endif
#endif
        adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
        adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
 
 
        ata_devices_write(&ata->devices, addr & 0x7f, value);
        ata_devices_write(&ata->devices, addr & 0x7f, value);
    }
    }
}
}
/* ========================================================================= */
/* ========================================================================= */
Line 338... Line 334...
}
}
 
 
void ata_sec_end(void *dat)
void ata_sec_end(void *dat)
{
{
  ata_host *ata = dat;
  ata_host *ata = dat;
 
  struct mem_ops ops;
 
 
  if(!ata->enabled) {
  if(!ata->enabled) {
    free(dat);
    free(dat);
    return;
    return;
  }
  }
 
 
  /* Connect ata_devices.                                            */
  /* Connect ata_devices.                                            */
  ata_devices_init(&ata->devices);
  ata_devices_init(&ata->devices);
 
 
  register_memoryarea(ata->baseaddr, ATA_ADDR_SPACE, 4, 0, ata_read32, ata_write32, dat);
  memset(&ops, 0, sizeof(struct mem_ops));
 
 
 
  ops.readfunc32 = ata_read32;
 
  ops.read_dat32 = dat;
 
  ops.writefunc32 = ata_write32;
 
  ops.write_dat32 = dat;
 
 
 
  /* Delays will be readjusted later */
 
  ops.delayr = 2;
 
  ops.delayw = 2;
 
 
 
  ata->mem = reg_mem_area(ata->baseaddr, ATA_ADDR_SPACE, 0, &ops);
 
 
  reg_sim_reset(ata_reset, dat);
  reg_sim_reset(ata_reset, dat);
  reg_sim_stat(ata_status, dat);
  reg_sim_stat(ata_status, dat);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.