Changeset 8388ea76 in rtems


Ignore:
Timestamp:
Dec 9, 2007, 6:44:51 AM (13 years ago)
Author:
Till Straumann <strauman@…>
Branches:
4.10, 4.11, 4.9, 5, master
Children:
863b0cef
Parents:
79262a32
Message:

2007-12-08 Till Straumann <strauman@…>

  • Makefile.am: merged shared/vme/vme_universe.c and shared/vme/vme_universe_dma.c into one file. Added support for Tsi148 driver (DMA).
Location:
c/src/lib/libbsp/powerpc
Files:
1 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/powerpc/ChangeLog

    r79262a32 r8388ea76  
     12007-12-08      Till Straumann <strauman@slac.stanford.edu>
     2
     3        * Makefile.am: merged shared/vme/vme_universe.c and
     4        shared/vme/vme_universe_dma.c into one file.
     5        Added support for Tsi148 driver (DMA).
     6
    172007-12-08      Till Straumann <strauman@slac.stanford.edu>
    28
  • c/src/lib/libbsp/powerpc/shared/vme/vme_universe.c

    r79262a32 r8388ea76  
    11/*$Id$*/
     2
     3/* Implementation of the VME.h and VMEDMA.h APIs for the BSP using the
     4 * vmeUniverse/vmeTsi148 drivers
     5 *
     6 * This file is named vme_universe.c for historic reasons.
     7 */
     8
    29
    310#include <rtems.h>
    411#include <bsp.h>
    512#include <bsp/VME.h>
     13#include <bsp/VMEDMA.h>
    614#include <bsp/VMEConfig.h>
    715#include <bsp/irq.h>
     
    1725#define _VME_TSI148_DECLARE_SHOW_ROUTINES
    1826#include <bsp/vmeTsi148.h>
     27#include <bsp/vmeTsi148DMA.h>
    1928#endif
    2029
     
    2231#define _VME_UNIVERSE_DECLARE_SHOW_ROUTINES
    2332#include <bsp/vmeUniverse.h>
     33#include <bsp/vmeUniverseDMA.h>
    2434#if     !defined(BSP_VME_INSTALL_IRQ_MGR) && defined(BSP_VME_UNIVERSE_INSTALL_IRQ_MGR)
    2535#define BSP_VME_INSTALL_IRQ_MGR BSP_VME_UNIVERSE_INSTALL_IRQ_MGR
    2636#endif
    2737#endif
     38
     39#include <bsp/bspVmeDmaList.h>
    2840
    2941/* Wrap BSP VME calls around driver calls - we do this so EPICS doesn't have to
     
    93105} VMEOpsRec, *VMEOps;
    94106
     107/* two separate 'ops' structs for historic reasons */
     108typedef struct DmaOpsRec_ {
     109        int                             (*setup)(int, uint32_t, uint32_t, void *);
     110        int                             (*start)(int, uint32_t, uint32_t, uint32_t);
     111        uint32_t                (*status)(int);
     112        VMEDmaListClass listClass;
     113        int                             nChannels;
     114        int                             *vectors;
     115} DmaOpsRec, *DmaOps;
     116
    95117#ifdef _VME_DRIVER_UNIVERSE
    96118static VMEOpsRec uniOpsRec = {
     
    109131                            VMEUNIVERSE_IRQ_MGR_FLAG_PW_WORKAROUND,
    110132};
     133
     134static int uniVecs[] = { UNIV_DMA_INT_VEC };
     135
     136static DmaOpsRec uniDmaOps = {
     137        setup:                          vmeUniverseDmaSetup,
     138        start:                          vmeUniverseDmaStart,
     139        status:                         vmeUniverseDmaStatus,
     140        listClass:                      &vmeUniverseDmaListClass,
     141        nChannels:                      1,
     142        vectors:                        uniVecs,
     143};
    111144#endif
    112145
     
    126159        irq_mgr_flags:      VMETSI148_IRQ_MGR_FLAG_SHARED,
    127160};
    128 #endif
    129 
    130 static VMEOps theOps = 0;
     161
     162static int tsiVecs[] = {
     163        TSI_DMA_INT_VEC,
     164        TSI_DMA1_INT_VEC,
     165};
     166
     167static DmaOpsRec tsiDmaOps = {
     168        setup:                          vmeTsi148DmaSetup,
     169        start:                          vmeTsi148DmaStart,
     170        status:                         vmeTsi148DmaStatus,
     171        listClass:                      &vmeTsi148DmaListClass,
     172        nChannels:                      2,
     173        vectors:                        tsiVecs,
     174};
     175#endif
     176
     177static VMEOps theOps    = 0;
     178static DmaOps theDmaOps = 0;
    131179
    132180int
     
    207255{
    208256        theOps->inbound_p_show(f);
     257}
     258
     259int
     260BSP_VMEDmaSetup(int channel, uint32_t bus_mode, uint32_t xfer_mode, void *custom_setup)
     261{
     262        return theDmaOps->setup(channel, bus_mode, xfer_mode, custom_setup);
     263}
     264
     265int
     266BSP_VMEDmaStart(int channel, uint32_t pci_addr, uint32_t vme_addr, uint32_t n_bytes)
     267{
     268        return theDmaOps->start(channel, pci_addr, vme_addr, n_bytes);
     269}
     270
     271uint32_t
     272BSP_VMEDmaStatus(int channel)
     273{
     274        return theDmaOps->status(channel);
     275}
     276
     277BSP_VMEDmaListDescriptor
     278BSP_VMEDmaListDescriptorSetup(
     279                BSP_VMEDmaListDescriptor d,
     280                uint32_t                 attr_mask,
     281                uint32_t                                 xfer_mode,
     282                uint32_t                 pci_addr,
     283                uint32_t                 vme_addr,
     284                uint32_t                 n_bytes)
     285{
     286VMEDmaListClass pc;
     287        if ( !d ) {
     288                if ( ! (pc = theDmaOps->listClass) ) {
     289                        pc = (theDmaOps = selectOps())->listClass;     
     290                }
     291                return BSP_VMEDmaListDescriptorNewTool(
     292                                        pc,
     293                                        attr_mask,
     294                                        xfer_mode,
     295                                        pci_addr,
     296                                        vme_addr,
     297                                        n_bytes);
     298                                       
     299        }
     300        return BSP_VMEDmaListDescriptorSetupTool(d, attr_mask, xfer_mode, pci_addr, vme_addr, n_bytes);
     301}
     302
     303int
     304BSP_VMEDmaListStart(int channel, BSP_VMEDmaListDescriptor list)
     305{
     306        return BSP_VMEDmaListDescriptorStartTool(0, channel, list);
     307}
     308
     309/* NOT thread safe! */
     310int
     311BSP_VMEDmaInstallISR(int channel, BSP_VMEDmaIRQCallback cb, void *usr_arg)
     312{
     313int vec;
     314BSP_VME_ISR_t curr;
     315void          *carg;
     316
     317        if ( channel < 0 || channel >= theDmaOps->nChannels )
     318                return -1;
     319
     320        vec = theDmaOps->vectors[channel];
     321
     322        curr = BSP_getVME_isr(vec, &carg);
     323
     324        if ( cb && curr ) {
     325                /* IRQ currently in use */
     326                return -1;
     327        }
     328
     329        if ( !cb && !curr ) {
     330                /* Allow uninstall if no handler is currently installed;
     331                 * just make sure IRQ is disabled
     332                 */
     333                BSP_disableVME_int_lvl(vec);
     334                return 0;
     335        }
     336       
     337        if ( cb ) {
     338                if ( BSP_installVME_isr(vec, (BSP_VME_ISR_t)cb, usr_arg) )
     339                        return -4;
     340                BSP_enableVME_int_lvl(vec);
     341        } else {
     342                BSP_disableVME_int_lvl(vec);
     343                if ( BSP_removeVME_isr(vec, curr, carg) )
     344                        return -4;
     345        }
     346        return 0;
    209347}
    210348
Note: See TracChangeset for help on using the changeset viewer.