sysIo.c
上传用户:yingyi0918
上传日期:2022-06-26
资源大小:214k
文件大小:8k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysIo.c - System Input/Output routines for IDT BSP. */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * This file has been developed or significantly modified by the
  6.  * MIPS Center of Excellence Dedicated Engineering Staff.
  7.  * This notice is as per the MIPS Center of Excellence Master Partner
  8.  * Agreement, do not remove this notice without checking first with
  9.  * WR/Platforms MIPS Center of Excellence engineering management.
  10.  */
  11. /*
  12. modification history
  13. --------------------
  14. 01a,05mar02,d_c  Make common for idt79s33x, idt79eb33x
  15. */
  16. /*
  17. DESCRIPTION
  18. This file contains the board-specific routines for intput and output.
  19. It is included as a part of sysLib.c.
  20. The "sysConfig*" functions (below) are necessary because the RC32334/RC32332
  21. PCI bridge does not perform byte-lane swapping for PCI config cycles.
  22. How ever it *does* perform byte-lane swapping for normal PCI cycles.
  23. The "sysConfig*" functions are only used by the PCI modules for
  24. config cycles.
  25. It is assumed that this file is include by sysLib.c.
  26. */
  27. /* includes */
  28. #include "vxWorks.h"
  29. #include "config.h"
  30. #include "sysLib.h"
  31. /* defines */
  32. /*
  33.  * Override in/out functions used for PCI config cycle access.  This
  34.  * was necessary because the PCI controller does not perform byte-lane
  35.  * swapping for config cycles.  The "Config" functions are defined in
  36.  * sysIo.c.
  37.  */
  38. #define PCI_IN_BYTE(x) sysConfigInByte (x)
  39. #define PCI_IN_WORD(x) sysConfigInWord (x)
  40. #define PCI_IN_LONG(x) sysConfigInLong (x)
  41. #define PCI_OUT_BYTE(x,y) sysConfigOutByte (x,y)
  42. #define PCI_OUT_WORD(x,y) sysConfigOutWord (x,y)
  43. #define PCI_OUT_LONG(x,y) sysConfigOutLong (x,y)
  44. /* Macros for swapping bytes within words and half-words */
  45. #define SHORT_BYTESWAP(x) (MSB(x) | (LSB(x) << 8))
  46. #define LONG_BYTESWAP(x)  LONGSWAP(x)
  47. /* typedefs */
  48. /* globals */
  49. /* locals */
  50. int   sysVectorIRQ0 = INT_NUM_IRQ0 ;
  51. /* forward declarations */
  52. LOCAL BOOL      sysIsPciMapped (ULONG address);
  53. /***************************************************************************
  54. *
  55. * sysConfigInByte - Read one byte from PCI configuration space
  56. *
  57. * RETURNS: The byte that was read
  58. */
  59. UCHAR sysConfigInByte
  60.     (
  61.     ULONG address /* Address to read */
  62.     )
  63.     {
  64.     ULONG leAddress; /* Address offset for little endian access */
  65.     
  66.     /*
  67.      * Address swap for byte address by XOR operation
  68.      * to translate BigEndian to Litle Endian
  69.      */
  70.     leAddress = address ^ 0x3;
  71.     return (*(UCHAR *)leAddress);
  72.     }
  73. /***************************************************************************
  74. *
  75. * sysConfigInWord - Read one half-word from PCI configuration space
  76. *
  77. * RETURNS: The half-word that was read
  78. */
  79. USHORT sysConfigInWord
  80.     (
  81.     ULONG address /* Address to read */
  82.     )
  83.     {
  84.     ULONG leAddress; /* Address offset for little endian access */
  85.     
  86.     /*
  87.      * Address swap for half-word address by XOR operation
  88.      * to translate BigEndian to Litle Endian
  89.      */
  90.     leAddress = address ^ 0x2;
  91.     return (*(USHORT *)leAddress);
  92.     }
  93. /***************************************************************************
  94. *
  95. * sysConfigInLong - Read one long word from PCI configuration space
  96. *
  97. * RETURNS: The word that was read
  98. */
  99. ULONG sysConfigInLong
  100.     (
  101.     ULONG address /* Address to read */
  102.     )
  103.     {
  104.     return (*(ULONG *)address);
  105.     }
  106. /***************************************************************************
  107. *
  108. * sysConfigOutByte - Write a byte to PCI configuration Space
  109. *
  110. * RETURNS: N/A
  111. */
  112. void sysConfigOutByte
  113.     (
  114.     ULONG address, /* Address to write to */
  115.     UCHAR data /* Data to write */
  116.     )
  117.     {
  118.     ULONG leAddress; /* Address offset for little endian access */
  119.     
  120.     /*
  121.      * Address swap for byte address by XOR operation
  122.      * to translate BigEndian to Litle Endian
  123.      */
  124.     leAddress = (address ^ 0x3);
  125.     *(UCHAR *)leAddress = data;
  126.     }
  127. /***************************************************************************
  128. *
  129. * sysConfigOutWord - Write a word to PCI configuration space
  130. *
  131. * RETURNS: N/A
  132. */
  133. void sysConfigOutWord
  134.     (
  135.     ULONG address, /* Address to write to */
  136.     USHORT data /* Data to write */
  137.     )
  138.     {
  139.     ULONG leAddress; /* Address offset for little endian access */
  140.     
  141.     /*
  142.      * Address swap for half-word address by XOR operation
  143.      * to translate BigEndian to Litle Endian
  144.      */
  145.     leAddress = (address ^ 0x2);
  146.     *(USHORT *)leAddress = data;
  147.     }
  148. /***************************************************************************
  149. *
  150. * sysConfigOutLong - Write a word to PCI configuration space
  151. *
  152. * RETURNS: N/A
  153. */
  154. void sysConfigOutLong
  155.     (
  156.     ULONG address, /* Address to write to */
  157.     ULONG data /* Data to write */
  158.     )
  159.     {
  160.     *(ULONG *)address = data;
  161.     }
  162. /***************************************************************************
  163. *
  164. * sysInByte - Read one byte
  165. *
  166. * RETURNS: The byte that was read
  167. */
  168. UCHAR sysInByte
  169.     (
  170.     ULONG address /* Address to read */
  171.     )
  172.     {
  173.     return (*(UCHAR *)address);
  174.     }
  175. /***************************************************************************
  176. *
  177. * sysInWord - Read one word
  178. *
  179. * RETURNS: The half-word that was read, byte-swapped if read from PCI
  180. */
  181. USHORT sysInWord
  182.     (
  183.     ULONG address /* Address to read */
  184.     )
  185.     {
  186.     USHORT retVal; /* Final return value */
  187.     USHORT rawRetVal; /* Raw value before possible byte swap */
  188.     rawRetVal = *(USHORT *)address;
  189.     if (sysIsPciMapped (address))
  190. {
  191. retVal = (USHORT) SHORT_BYTESWAP(rawRetVal);
  192. }
  193.     else
  194. {
  195. retVal = rawRetVal;
  196. }
  197.     return (retVal);
  198.     }
  199. /***************************************************************************
  200. *
  201. * sysInLong - Read a long word
  202. *
  203. * RETURNS: The word that was read, byte-swapped if read from PCI
  204. */
  205. ULONG sysInLong
  206.     (
  207.     ULONG address /* Address to read */
  208.     )
  209.     {
  210.     ULONG retVal; /* Final return value */
  211.     ULONG rawRetVal; /* Raw value before possible byte swap */
  212.     
  213.     rawRetVal = *(ULONG *)address;
  214.     if (sysIsPciMapped (address))
  215. {
  216. retVal = LONG_BYTESWAP(rawRetVal);
  217. }
  218.     else
  219. {
  220. retVal = rawRetVal;
  221. }
  222.     return (retVal);
  223.     }
  224. /***************************************************************************
  225. *
  226. * sysOutByte - Write a byte
  227. *
  228. * RETURNS: N/A
  229. */
  230. void sysOutByte
  231.     (
  232.     ULONG address, /* Address to write to */
  233.     UCHAR data /* Data to write */
  234.     )
  235.     {
  236.     *(UCHAR *)address = data;
  237.     }
  238. /***************************************************************************
  239. *
  240. * sysOutWord - Write a word, swapping bytes if output to PCI space
  241. *
  242. * RETURNS: N/A
  243. */
  244. void sysOutWord
  245.     (
  246.     ULONG address, /* Address to write to */
  247.     USHORT data /* Data to write */
  248.     )
  249.     {
  250.     USHORT outData; /* Output data after possible byte swap */
  251.     
  252.     if (sysIsPciMapped (address))
  253. {
  254. outData = SHORT_BYTESWAP(data);
  255. }
  256.     else
  257. {
  258. outData = data;
  259. }
  260.     *(USHORT *)address = outData;
  261.     }
  262. /***************************************************************************
  263. *
  264. * sysOutLong - Write a long word, swapping the bytes if output to PCI space
  265. *
  266. * RETURNS: N/A
  267. */
  268. void sysOutLong
  269.     (
  270.     ULONG address, /* Address to write to */
  271.     ULONG data /* Data to write */
  272.     )
  273.     {
  274.     ULONG outData; /* Output data after possible byte swap */
  275.     
  276.     if (sysIsPciMapped (address))
  277. {
  278. outData = LONG_BYTESWAP(data);
  279. }
  280.     else
  281. {
  282. outData = data;
  283. }
  284.     *(ULONG *)address = outData;
  285.     }
  286. /**************************************************************************
  287. *    
  288. * sysIsPciMapped - Is address within an area mapped to the PCI bus?
  289. *
  290. * This routine tests the passed address to determine if it is within
  291. * an area mapped to the PCI bus. This includes PCI I/O space and
  292. * PCI memory space 1, 2 and 3.
  293. *
  294. * RETURNS: TRUE if address falls in PCI-mapped space
  295. *          FALSE otherwise
  296. */
  297. LOCAL BOOL sysIsPciMapped
  298.     (
  299.     ULONG address /* Address under consideration */
  300.     )
  301.     {
  302.     BOOL isPciMapped = /* TRUE if address is PCI-mapped */
  303.         (
  304.             (
  305.     address >= CPU_TO_PCI_MEM_BASE1 &&
  306.     address < (CPU_TO_PCI_MEM_BASE1 + CPU_TO_PCI_MEM_SIZE1)
  307.     )
  308.     ||
  309.     (
  310.     address >= CPU_TO_PCI_MEM_BASE2 &&
  311.     address < (CPU_TO_PCI_MEM_BASE2 + CPU_TO_PCI_MEM_SIZE2)
  312.     )
  313.     ||
  314.     (
  315.     address >= CPU_TO_PCI_MEM_BASE3 &&
  316.     address < (CPU_TO_PCI_MEM_BASE3 + CPU_TO_PCI_MEM_SIZE3)
  317.     )
  318.     ||
  319.     (
  320.     address >= CPU_TO_PCI_IO_BASE &&
  321.     address < (CPU_TO_PCI_IO_BASE + CPU_TO_PCI_IO_SIZE)
  322.     )
  323.         );
  324.     return (isPciMapped);
  325.     }
  326.