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

VxWorks

开发平台:

C/C++

  1. /* usrDsp.c - dsp support library */
  2. /* Copyright 1984-1999 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01b,08nov00,zl   set spTaskOptions for DSP.
  8. 01a,10mar98,jmb  fix mem's dspLib.c scalablity problem.
  9. */
  10. /*
  11. DESCRIPTION
  12. This library calls dspInit to activate DSP support.  It must be
  13. called before any tasks using the dsp are spawned.  This is done
  14. automatically by the root task, usrRoot(), in usrConfig.c when 
  15. INCLUDE_DSP is defined in configAll.h.
  16. This libraray also provides debugging support for DSP registers
  17. in the target shell and initializes other configurable DSP
  18. support facilties.
  19. For information about architecture-dependent dsp routines, see
  20. the manual entry for dspArchLib.
  21. The dspShow() routine displays DSP registers on a per-task basis.
  22. For information on this facility, see the manual entries for 
  23. dspShow().
  24. VX_DSP_TASK OPTION
  25. Saving and restoring dsp registers adds to the context switch
  26. time of a task.  Therefore, dsp registers are not saved
  27. and restored for every task.  Only those tasks spawned with the task
  28. option VX_DSP_TASK will have dsp registers saved and restored.
  29. .RS 4 4
  30. %NOTE:  If a task does any dsp operations,
  31. it must be spawned with VX_DSP_TASK.
  32. .RE
  33. INCLUDE FILES: dspLib.h
  34. SEE ALSO: dspArchLib, dspShow, intConnect(),
  35. .pG "Basic OS"
  36. */
  37. #ifndef  __INCusrDspc
  38. #define  __INCusrDspc
  39. #ifdef INCLUDE_DEBUG
  40. #include "stdio.h"
  41. #endif /* INCLUDE_DEBUG */
  42. #include "regs.h"
  43. #include "dspLib.h"
  44. #ifdef INCLUDE_DEBUG
  45. /* externals (from usrLib.c) */
  46. IMPORT STATUS changeReg (char *pPrompt, void *value, int width);
  47. BOOL substrcmp (char *s, char *s1);
  48. /* forward declarations */
  49. LOCAL void dspRegsListHook ();
  50. LOCAL STATUS dspMregsHook (int tid, char *regName, int *pDone);
  51. #endif /* INCLUDE_DEBUG */
  52. /******************************************************************************
  53. *
  54. * usrDspInit - initialize dsp support
  55. *
  56. * This routine initializes dsp support and must be
  57. * called before using the dsp.  This is done
  58. * automatically by the root task, usrRoot(), in usrConfig.c when INCLUDE_DSP
  59. * is defined in configAll.h.
  60. * RETURNS: N/A
  61. */
  62. void usrDspInit (void)
  63.     {
  64.     dspInit();
  65. #ifdef INCLUDE_DEBUG
  66.     _func_dspMregsHook = (FUNCPTR) dspMregsHook;
  67.     _func_dspRegsListHook = (VOIDFUNCPTR) dspRegsListHook;
  68. #endif
  69. #ifdef  INCLUDE_SHELL
  70.     {
  71.     extern int shellTaskOptions;
  72.     extern int spTaskOptions;
  73.     shellTaskOptions |= VX_DSP_TASK;
  74.     spTaskOptions |= VX_DSP_TASK;
  75.     }
  76. #endif  /* INCLUDE_SHELL */
  77. #ifdef  INCLUDE_SHOW_ROUTINES
  78.     dspShowInit ();                     /* install dsp show routine */
  79. #endif  /* INCLUDE_SHOW_ROUTINES */
  80.     }
  81. #ifdef INCLUDE_DEBUG
  82. /******************************************************************************
  83. *
  84. * dspMRegHook - hook for mRegs to get/set DSP registers
  85. *
  86. * Given a task id:
  87. *   If regName is NULL, then walk through all DSP regs and
  88. * allow user to set any; done is never TRUE.
  89. *   If regName is not NULL, then try to match the register
  90. * name, setting done = TRUE if match is found.
  91. *
  92. * This routine allows mRegs to walk through DSP register set.
  93. * It is here so that vxWorks will link w/out DSP support.
  94. * Usage: dspMregsHookRtn = dspMregsHook.
  95. *
  96. * RETURNS: OK or ERROR; also sets '*done = TRUE' if the user
  97. * asked for one register by name and it was matched here.
  98. *
  99. * NOMANUAL
  100. */
  101. LOCAL STATUS dspMregsHook 
  102.     (
  103.     int tid,  /* IN: task id of DSP register set */
  104.     char *regName,  /* IN: NULL means all regs */
  105.     int *pDone /* OUT: set TRUE if regName != NULL && found */
  106.     )
  107.     {
  108.     int width = 4;
  109.     int ix;
  110.     void * tmp;
  111.     DSPREG_SET dspRegSet;
  112.     if (dspTaskRegsGet (tid, &dspRegSet) != OK)
  113. return (ERROR);
  114.     for (ix = 0; dspRegName[ix].regName != (char *) NULL; ix ++)
  115. {
  116. if ((regName == NULL) || substrcmp (dspRegName[ix].regName, regName))
  117.     {
  118.     tmp = (void *) ((int) &dspRegSet + dspRegName[ix].regOff);
  119.     if (changeReg (dspRegName[ix].regName, tmp, width) == ERROR)
  120. return (ERROR);
  121.     
  122.     if (regName != NULL)
  123. {
  124. *pDone = TRUE;
  125. break;
  126. }
  127.     }
  128. }
  129.     if (!*pDone)
  130. {
  131. for (ix = 0; dspCtlRegName[ix].regName != (char *) NULL; ix ++)
  132.     {
  133.     if ((regName == NULL) || 
  134. substrcmp (dspCtlRegName[ix].regName, regName))
  135. {
  136. tmp = (void *) ((int) &dspRegSet + dspCtlRegName[ix].regOff);
  137. if (changeReg (dspCtlRegName[ix].regName, tmp, width) == ERROR)
  138.     return (ERROR);
  139. if (regName != NULL)
  140.     {
  141.     *pDone = TRUE;
  142.     break;
  143.     }
  144. }
  145.     }
  146. }
  147.     dspTaskRegsSet (tid, &dspRegSet);
  148.     return (OK);
  149.     }
  150. /******************************************************************************
  151. *
  152. * dspRegsListHook - hook for mRegs to list DSP registers
  153. *
  154. * This routine allows mRegs to list DSP register set.
  155. * It is here so that vxWorks will link w/out DSP support.
  156. * Usage: dspRegsListHookRtn = dspRegsListHook.
  157. *
  158. * RETURNS: N/A
  159. *
  160. * NOMANUAL
  161. */
  162. LOCAL void dspRegsListHook ()
  163.     {
  164.     int ix;
  165.     for (ix = 0; dspRegName[ix].regName != (char *) NULL; ix++)
  166. printf ("%s ", dspRegName[ix].regName);
  167.     
  168.     for (ix = 0; dspCtlRegName[ix].regName != (char *) NULL; ix++)
  169. printf ("%s ", dspCtlRegName[ix].regName);
  170.     printf ("n");
  171.     }
  172. #endif /* INCLUDE_DEBUG */
  173. #endif /* __INCusrDspc */