visionTmdDrv.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:12k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* visionTmdDrv.c - Wind River Low-Level visionTMD IO subsystem */
  2. /* Copyright 1988-2002 Wind River Systems Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01j,13jul02,tcr  Added support for the 440.
  7. 01g,21dec01,g_h  Rename to visionTmdDrv.c
  8. 01f,29nov01,g_h  Cleaning for T2.2
  9. 01e,12nov01,g_h  Adding ColdFire.
  10. 01d,05may01,g_h  rename to visionTMDrv.c and cleaning
  11. 01c,11apr01,rnr  Turned into a LOW-LEVEL IO subsystem called form vDriver
  12. 01b,07feb01,g_h  renaming module name and cleaning
  13. 01a,07may97,est  Adapted from memdrv.c
  14. */
  15. /*
  16. DESCRIPTION
  17. This driver is a LOW-LEVEL I/O subsystem module which is utilized by the
  18. generic WR wdbVisionDrv driver. This subsystem performs basic BYTE level I/O
  19. through the JTAG/BDM interface.
  20. USER-CALLABLE ROUTINES
  21. None
  22. All routines which are callable from this module can be done so only
  23. from the vDriver interface. Only "visionTMDLowLevelIOInit" is declared as
  24. as GLOBAL entry point.
  25. SEE ALSO:
  26. .pG "I/O System"
  27. */
  28. #include "vxWorks.h"
  29. #include "ioLib.h"
  30. #include "iosLib.h"
  31. #include "memLib.h"
  32. #include "cacheLib.h"
  33. #include "errnoLib.h"
  34. #include "string.h"
  35. #include "stdlib.h"
  36. #include "stdio.h"
  37. #include "taskLib.h"
  38. #include "drv/wdb/vision/wdbVisionDrvIF.h"
  39. #include "drv/wdb/vision/visionTmdDrv.h"
  40. /* typedefs */
  41. typedef struct tmdDataControl 
  42.     {
  43.     TMD_DESCRIPTOR *pSpace;
  44.     TMD_DESCRIPTOR *pTxDesc;
  45.     TMD_DESCRIPTOR *pRxDesc; 
  46.     } TMD_DATA_CONTROL;
  47. /* locals data */
  48. LOCAL TMD_DATA_CONTROL  control;
  49. LOCAL FUNCPTR tmdSignalTxReady   = NULL;
  50. LOCAL FUNCPTR tmdSignalDescReady = NULL;
  51. LOCAL FUNCPTR tmdSignalRxReady   = NULL;
  52. /* globals data */
  53. volatile unsigned long txDesc; /* global copies for rx/tx */
  54. volatile unsigned long rxDesc; /* emulator descriptors    */
  55. /* externals */
  56. #if (CPU == PPC604)
  57. IMPORT void tmdPPC604SignalTxReady (void);
  58. IMPORT void tmdPPC604SignalDescReady (void);
  59. IMPORT void tmdPPC604SignalRxReady (void);
  60. #elif (CPU == PPC405)
  61. IMPORT void tmdPPC405SignalTxReady (void);
  62. IMPORT void tmdPPC405SignalDescReady (void);
  63. IMPORT void tmdPPC405SignalRxReady (void);
  64. #elif (CPU == PPC440)
  65. IMPORT void tmdPPC440SignalTxReady (void);
  66. IMPORT void tmdPPC440SignalDescReady (void);
  67. IMPORT void tmdPPC440SignalRxReady (void);
  68. #elif ((CPU == PPC603) || (CPU == PPC860))
  69. IMPORT void tmdPPCSignalTxReady (void);
  70. IMPORT void tmdPPCSignalDescReady (void);
  71. IMPORT void tmdPPCSignalRxReady (void);
  72. #elif (CPU == MIPS32)
  73. IMPORT void tmdMIPS32SignalTxReady (void);
  74. IMPORT void tmdMIPS32SignalDescReady (void);
  75. IMPORT void tmdMIPS32SignalRxReady (void);
  76. #elif (CPU == ARMARCH4)
  77. IMPORT void tmdARMARCH4SignalTxReady (void);
  78. IMPORT void tmdARMARCH4SignalDescReady (void);
  79. IMPORT void tmdARMARCH4SignalRxReady (void);
  80. #elif (CPU == XSCALE)
  81. IMPORT void tmdXSCALESignalTxReady (void);
  82. IMPORT void tmdXSCALESignalDescReady (void);
  83. IMPORT void tmdXSCALESignalRxReady (void);
  84. #elif ((CPU == SH7700) || (CPU == SH7750) || (CPU == SH7600))
  85. IMPORT void tmdSH7xxxSignalTxReady (void);
  86. IMPORT void tmdSH7xxxSignalDescReady (void);
  87. IMPORT void tmdSH7xxxSignalRxReady (void);
  88. #elif (CPU == MCF5200)
  89. IMPORT void tmdMCF5200SignalTxReady (void);
  90. IMPORT void tmdMCF5200SignalDescReady (void);
  91. IMPORT void tmdMCF5200SignalRxReady (void);
  92. #else
  93. #error "This CPU is not supported !!!"
  94. #endif
  95. /* forward declarations */
  96. VDR_ULONG tmdLowLevelIOInit (V_DRIVER_INTERFACE *pInterfaceData);
  97. LOCAL VDR_ULONG tmdOpen (VDR_PDATA prv);
  98. LOCAL VDR_ULONG tmpClose (VDR_PDATA prv);
  99. LOCAL VDR_ULONG tmdReadStatus (VDR_PDATA prv ,VDR_ULONG *pStatus);
  100. LOCAL VDR_ULONG tmdWriteStatus (VDR_PDATA prv ,VDR_ULONG *pStatus);
  101. LOCAL VDR_ULONG tmdWrite (VDR_PDATA prv ,VDR_UCHAR *pData ,VDR_ULONG size);
  102. LOCAL VDR_ULONG tmdRead (VDR_PDATA prv  ,VDR_UCHAR *pData, 
  103.                          VDR_ULONG size ,VDR_ULONG *rcvBytes);
  104. /***************************************************************************
  105. *
  106. * tmdLowLevelIOInit - initialization entry point for the subsystem
  107. *
  108. * This routine sets up the return parameter space with the entry 
  109. * point names/addresses and any private data the I/O subsystem
  110. * wants to be persistent between the two drivers.
  111. *
  112. * RETURNS: OK, or ERROR if the I/O system cannot install the driver.
  113. */
  114. VDR_ULONG tmdLowLevelIOInit 
  115.     (
  116.     V_DRIVER_INTERFACE * pInterfaceData 
  117.     ) 
  118.     {
  119.     /*
  120.      *  Setup the return space to indicate we have success in our
  121.      *  initialization and can continue onward.
  122.      */
  123.     pInterfaceData->openFunc = (VDR_OPEN_PTR) tmdOpen;
  124.     pInterfaceData->closeFunc = (VDR_CLOSE_PTR) tmpClose;
  125.     pInterfaceData->readStatusFunc = (VDR_READ_STATUS_PTR) tmdReadStatus;
  126.     pInterfaceData->writeStatusFunc = (VDR_WRITE_STATUS_PTR) tmdWriteStatus;
  127.     pInterfaceData->readFunc = (VDR_READ_PTR) tmdRead;
  128.     pInterfaceData->writeFunc = (VDR_WRITE_PTR) tmdWrite;
  129.     pInterfaceData->privateData = (VDR_PDATA) &control;
  130. /* Initialization of the signal routines */
  131.     #if (CPU == PPC604)
  132.     tmdSignalTxReady = (FUNCPTR)tmdPPC604SignalTxReady;
  133.     tmdSignalDescReady = (FUNCPTR)tmdPPC604SignalDescReady;
  134.     tmdSignalRxReady = (FUNCPTR)tmdPPC604SignalRxReady;
  135.     #elif (CPU == PPC405)
  136.     tmdSignalTxReady = (FUNCPTR)tmdPPC405SignalTxReady;
  137.     tmdSignalDescReady = (FUNCPTR)tmdPPC405SignalDescReady;
  138.     tmdSignalRxReady = (FUNCPTR)tmdPPC405SignalRxReady;
  139.     #elif (CPU == PPC440)
  140.     tmdSignalTxReady = (FUNCPTR)tmdPPC440SignalTxReady;
  141.     tmdSignalDescReady = (FUNCPTR)tmdPPC440SignalDescReady;
  142.     tmdSignalRxReady = (FUNCPTR)tmdPPC440SignalRxReady;
  143.     #elif ((CPU == PPC603) || (CPU == PPC860))
  144.     tmdSignalTxReady = (FUNCPTR)tmdPPCSignalTxReady;
  145.     tmdSignalDescReady = (FUNCPTR)tmdPPCSignalDescReady;
  146.     tmdSignalRxReady = (FUNCPTR)tmdPPCSignalRxReady;
  147.     #elif (CPU == MIPS32)
  148.     tmdSignalTxReady = (FUNCPTR)tmdMIPS32SignalTxReady;
  149.     tmdSignalDescReady = (FUNCPTR)tmdMIPS32SignalDescReady;
  150.     tmdSignalRxReady = (FUNCPTR)tmdMIPS32SignalRxReady;
  151.     #elif (CPU == ARMARCH4)
  152.     tmdSignalTxReady = (FUNCPTR)tmdARMARCH4SignalTxReady;
  153.     tmdSignalDescReady = (FUNCPTR)tmdARMARCH4SignalDescReady;
  154.     tmdSignalRxReady = (FUNCPTR)tmdARMARCH4SignalRxReady;
  155.     #elif (CPU == XSCALE)
  156.     tmdSignalTxReady = (FUNCPTR)tmdXSCALESignalTxReady;
  157.     tmdSignalDescReady = (FUNCPTR)tmdXSCALESignalDescReady;
  158.     tmdSignalRxReady = (FUNCPTR)tmdXSCALESignalRxReady;
  159.     #elif ((CPU == SH7700) || (CPU == SH7750) || (CPU == SH7600))
  160.     tmdSignalTxReady = (FUNCPTR)tmdSH7xxxSignalTxReady;
  161.     tmdSignalDescReady = (FUNCPTR)tmdSH7xxxSignalDescReady;
  162.     tmdSignalRxReady = (FUNCPTR)tmdSH7xxxSignalRxReady;
  163.     #elif (CPU == MCF5200)
  164.     tmdSignalTxReady = (FUNCPTR)tmdMCF5200SignalTxReady;
  165.     tmdSignalDescReady = (FUNCPTR)tmdMCF5200SignalDescReady;
  166.     tmdSignalRxReady = (FUNCPTR)tmdMCF5200SignalRxReady;
  167.     #else
  168.     #error "This CPU is not supported !!!"
  169.     #endif
  170.     return( VDR_SUCCESS );
  171.     }
  172. /***************************************************************************
  173. *
  174. * tmdOpen - open a connection 
  175. *
  176. * This routine open connection between the TMD runtime said and the Emulator.
  177. *
  178. * RETURNS: VDR_SUCCESS or VDR_FAILURE
  179. */
  180. LOCAL VDR_ULONG tmdOpen
  181.     ( 
  182.     VDR_PDATA prv  /* private data */
  183.     )
  184.     {
  185.     TMD_DATA_CONTROL *pCtrl = (TMD_DATA_CONTROL*)prv;
  186.     /* Create the device descriptor space */
  187.     pCtrl->pSpace = (TMD_DESCRIPTOR*)cacheDmaMalloc (2 * sizeof(TMD_DESCRIPTOR));
  188.     if (pCtrl->pSpace == (TMD_DESCRIPTOR*)NULL)
  189.         {
  190.         return(VDR_FAILURE);
  191.         }
  192.     pCtrl->pTxDesc = pCtrl->pSpace;
  193.     pCtrl->pRxDesc = pCtrl->pSpace + 1;
  194.     /* Initialize descriptor values */
  195.     pCtrl->pTxDesc->status = TX_BUF_EMPTY;
  196.     pCtrl->pTxDesc->count  = 0;
  197.     pCtrl->pRxDesc->status = RX_BUF_EMPTY;
  198.     pCtrl->pRxDesc->count  = 0;
  199.     /* take address of descriptors (globals for in line asm() routine) */ 
  200.     txDesc = (volatile)((unsigned long)pCtrl->pTxDesc);
  201.     rxDesc = (volatile)((unsigned long)pCtrl->pRxDesc);
  202.     /*
  203.      *  Send a background "signal" to the Emulator to inform it 
  204.      *  where it can find the buffer descriptors.
  205.      */
  206.     ((tmdSignalDescReady)());
  207.     return(VDR_SUCCESS);
  208.     }
  209. /***************************************************************************
  210. *
  211. * tmdCLose - closes the TMD connection
  212. *
  213. * This routine close the connection between the TMD and the Emulator.
  214. *
  215. * RETURNS: VDR_SUCCESS or VDR_FAILURE
  216. */
  217. LOCAL VDR_ULONG tmpClose
  218.     ( 
  219.     VDR_PDATA prv  /* private data */
  220.     )
  221.     {
  222.     TMD_DATA_CONTROL *pCtrl = (TMD_DATA_CONTROL*)prv;
  223.     /* Deallocate the associated with the XMIT/RECV buffers */
  224.     if (cacheDmaFree ((void*)pCtrl->pSpace) == OK)
  225.         {
  226.         return(VDR_SUCCESS);
  227.         }
  228.     else
  229.         {
  230.         return(VDR_FAILURE);
  231.         }
  232.     }
  233. /***************************************************************************
  234. *
  235. * tmdReadStatus - determines if data is present to be read.
  236. *
  237. * This routine determines if data is present to be read.
  238. *
  239. * RETURNS: VDR_SUCCESS or VDR_FAILURE
  240. */
  241. LOCAL VDR_ULONG tmdReadStatus
  242.     ( 
  243.     VDR_PDATA  prv,     /* private data    */
  244.     VDR_ULONG *pStatus  /* returned status */
  245.     )
  246.     {
  247.     VDR_ULONG retVal = VDR_SUCCESS;
  248.     TMD_DATA_CONTROL *pCtrl = (TMD_DATA_CONTROL*)prv;
  249.     /* Check if the ctrl pointer is correct */
  250.     if (pCtrl != NULL)
  251. {
  252.         if (pCtrl->pRxDesc->status == RX_BUF_EMPTY)
  253.             {
  254.     *pStatus = VDR_DATA_NONE;
  255.             }
  256.         else
  257.             {
  258.     *pStatus = VDR_DATA_FOUND;
  259.             }
  260.         }
  261.     else
  262.         {
  263.         retVal = VDR_FAILURE;
  264.         }
  265.     return (retVal);
  266.     }
  267. /***************************************************************************
  268. *
  269. * tmdWriteStatus - determines if data is present to be write.
  270. *
  271. * This routine determines
  272. * RETURNS: VDR_SUCCESS or VDR_FAILURE
  273. */
  274. LOCAL VDR_ULONG  tmdWriteStatus
  275.     ( 
  276.     VDR_PDATA  prv,     /* private data    */
  277.     VDR_ULONG *pStatus  /* returned status */
  278.     )
  279.     {
  280.     VDR_ULONG retVal = VDR_SUCCESS;
  281.     TMD_DATA_CONTROL *pCtrl = (TMD_DATA_CONTROL*)prv;
  282.     /* Check if the ctrl pointer is correct */
  283.     if (pCtrl != NULL)
  284. {
  285. if (pCtrl->pTxDesc->status == TX_BUF_EMPTY)
  286.             {
  287.     *pStatus = VDR_WRITE_COMPLETE;
  288.             }
  289.         else
  290.             {
  291.             *pStatus = VDR_WRITE_PENDING;
  292.             }
  293. }
  294.     else /* NULL pointer */  
  295.         {
  296.         retVal = VDR_FAILURE;
  297.         }
  298.     return(retVal);
  299.     }
  300. /***************************************************************************
  301. *
  302. * tmdRead - read data from the receive buffer.
  303. *
  304. * This routine read data from the receive buffer.
  305. *
  306. * RETURNS: VDR_SUCCESS or FAILURE and the number of bytes read
  307. */
  308. LOCAL VDR_ULONG tmdRead
  309.     ( 
  310.     VDR_PDATA  prv,      /* Private data             */
  311.     VDR_UCHAR *pData,    /* return data space        */
  312.     VDR_ULONG  size,     /* Max size of return space */
  313.     VDR_ULONG *pRcvBytes /* Number of bytes returned */
  314.     )
  315.     {
  316.     TMD_DATA_CONTROL *pCtrl = (TMD_DATA_CONTROL*)prv;
  317.     VDR_ULONG         status;
  318.     /* First see if there is any data there */
  319.     if (tmdReadStatus(prv ,&status) != VDR_SUCCESS)
  320.         {
  321.         *pRcvBytes = 0;
  322.         return(VDR_FAILURE);
  323.         }
  324.     if (status == VDR_DATA_NONE)
  325.         {
  326.         *pRcvBytes = 0;
  327.         return(VDR_SUCCESS);
  328.         }
  329.     /* There is data go retrieve it */
  330.     MEMCOPY (pData , &pCtrl->pRxDesc->buf[0] ,pCtrl->pRxDesc->count);
  331.     *pRcvBytes = pCtrl->pRxDesc->count;
  332.     /* Now indicate to the firmware that we have retrieved the data */
  333.     pCtrl->pRxDesc->count  = 0;
  334.     pCtrl->pRxDesc->status = RX_BUF_EMPTY;
  335.     ((tmdSignalRxReady)());
  336.     return (VDR_SUCCESS);
  337.     }
  338. /***************************************************************************
  339. *
  340. * tmdWrite - write data to the TMD channel
  341. *
  342. * This routine write data to the TMD channel.
  343. *
  344. * RETURNS: VDR_SUCCESS or VDR_FAILURE
  345. */
  346. LOCAL VDR_ULONG tmdWrite
  347.     ( 
  348.     VDR_PDATA  prv,   /* Private data        */
  349.     VDR_UCHAR *pData, /* Data to be written  */
  350.     VDR_ULONG  size   /* # of bytes to write */
  351.     )
  352.     {
  353.     TMD_DATA_CONTROL *pCtrl = (TMD_DATA_CONTROL*)prv;
  354.     /* 
  355.      *   Move the data into the transmit space , setup the count and
  356.      *   indicate the data is there.
  357.      */
  358.  
  359.     MEMCOPY ((char*)&pCtrl->pTxDesc->buf[0] ,pData ,size);
  360.     pCtrl->pTxDesc->count  = size;
  361.     pCtrl->pTxDesc->status = TX_BUF_NOT_EMPTY;
  362.     /* Tell the emulation that there is data to be retrieved */
  363.     ((tmdSignalTxReady)());
  364.     return (VDR_SUCCESS);
  365.     }