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

VxWorks

开发平台:

C/C++

  1. /* ncr5390Lib.c - NCR5390 SCSI-Bus Interface Controller library (SBIC) */
  2.   
  3. /* Copyright 1989-1996 Wind River Systems, Inc. */
  4. #include "copyright_wrs.h"
  5. /*
  6. modification history
  7. --------------------
  8. 01a,12jul96,dds changed filename from ncr5390.c to ncr5390Lib.c
  9. 01a,03may96,dds re-written; sample used was wd33c93Lib.c. Old ncr5390Lib.c
  10. is now in ncr5390Lib1.c
  11. */
  12. /*
  13. DESCRIPTION
  14. This library contains the main interface routines to the SCSI-Bus
  15. Interface Controllers (SBIC). These routines simply switch the calls
  16. to the  SCSI-1 or SCSI-2 drivers, implemented in ncr5390Lib1.c or
  17. ncr5390Lib2.c as configured by the Board Support Package (BSP).
  18. In order to configure the SCSI-1 driver, which depends upon scsi1Lib, the
  19. ncr5390CtrlCreate() routine, defined in ncr5390Lib1, must be invoked. 
  20. Similarly ncr5390CtrlCreateScsi2(), defined in ncr5390Lib2 and dependent
  21. on scsi2Lib, must be called to configure and initialize the SCSI-2 driver.
  22. INCLUDE FILES
  23. ncr5390.h, ncr5390_1.h, ncr5390_2.h
  24. */
  25. #include "vxWorks.h"
  26. #include "memLib.h"
  27. #include "logLib.h"
  28. #include "scsiLib.h"
  29. #include "stdlib.h"
  30. #include "errnoLib.h"
  31. #include "stdio.h"
  32. #include "sysLib.h"
  33. #include "intLib.h"
  34. #include "tickLib.h"
  35. #include "taskLib.h"
  36. #include "msgQLib.h"
  37. /* data structures */
  38. typedef struct ncr5390functbl
  39.     {
  40.     FUNCPTR ascCommand;
  41.     FUNCPTR ascIntr;
  42.     FUNCPTR ascRegRead;
  43.     FUNCPTR ascRegWrite;
  44.     FUNCPTR ascXferCountGet;
  45.     FUNCPTR ascXferCountSet;
  46.     FUNCPTR ncr5390CtrlInit;
  47.     FUNCPTR ncr5390Show;
  48.     } SCSIDRV_FUNC_TBL;
  49. /* globals */
  50. SCSIDRV_FUNC_TBL *pNcr5390IfTbl;
  51. /*******************************************************************************
  52. *
  53. * ncr5390IfTblInit - create and partially initialize a NCR5390 ASC structure
  54. *
  55. * NOMANUAL
  56. */
  57. void ncr5390IfTblInit ()
  58.     {
  59.     /* clear allocation to initialize the table */
  60.     pNcr5390IfTbl = calloc (1, sizeof (SCSIDRV_FUNC_TBL));
  61.     }
  62. /*******************************************************************************
  63. *
  64. * ncr5390CtrlInit - initialize the user-specified fields in an ASC structure
  65. *
  66. * This routine initializes an ASC structure, after the structure is created
  67. * with ncr5390CtrlCreate().
  68. * This structure must be initialized before the ASC can be used.
  69. * It may be called more than once; however, it should be called only 
  70. * while there is no activity on the SCSI interface.
  71. *
  72. * Before returning, this routine pulses RST (reset) on the SCSI bus, thus
  73. * resetting all attached devices.
  74. *
  75. * The input parameters are as follows:
  76. * .iP <pAsc> 4
  77. * a pointer to the NCR5390_SCSI_CTRL structure created with
  78. * ncr5390CtrlCreate().
  79. * .iP <scsiCtrlBusId>
  80. * the SCSI bus ID of the ASC, in the range 0 - 7.  The ID is somewhat
  81. * arbitrary; the value 7, or highest priority, is conventional.
  82. * .iP <defaultSelTimeOut>
  83. * the timeout, in microseconds, for selecting a SCSI device attached to this
  84. * controller.  This value is used as a default if no timeout is specified in
  85. * scsiPhysDevCreate().  The recommended value zero (0) specifies
  86. * SCSI_DEF_SELECT_TIMEOUT (250 millisec).  The maximum timeout possible is
  87. * approximately 2 seconds.  Values exceeding this revert to the
  88. * maximum.  
  89. * .iP <scsiPriority>
  90. * the priority to which a task is set when performing a SCSI
  91. * transaction.  Valid priorities are 0 to 255.  Alternatively, the value -1
  92. * specifies that the priority should not be altered during SCSI transactions.
  93. *
  94. * RETURNS: OK, or ERROR if a parameter is out of range.
  95. *
  96. * SEE ALSO: scsiPhysDevCreate(),
  97. */
  98. STATUS ncr5390CtrlInit
  99.     (
  100.     FAST int   *pAsc,            /* ptr to ASC info                       */
  101.     FAST int   scsiCtrlBusId,     /* SCSI bus ID of this ASC               */
  102.     FAST UINT  defaultSelTimeOut, /* default dev. select timeout (microsec) */
  103.     int        scsiPriority       /* priority of task when doing SCSI I/O   */
  104.     )
  105.     {
  106.     if (pNcr5390IfTbl->ncr5390CtrlInit != NULL)
  107. return ((int) (pNcr5390IfTbl->ncr5390CtrlInit) (pAsc, scsiCtrlBusId,
  108.        defaultSelTimeOut, scsiPriority));
  109.     else
  110. return ((int) ERROR);
  111.     }
  112. /*******************************************************************************
  113. *
  114. * ascXferCountSet - load the ASC transfer counter with the specified count
  115. *
  116. * RETURNS: OK, or ERROR if <count> is not in the
  117. * range 0 - NCR5390_MAX_BYTES_PER_XFER.
  118. *
  119. * NOMANUAL
  120. */
  121. int ascXferCountSet
  122.     (
  123.     FAST int  *pAsc,   /* ptr to ASC info    */
  124.     FAST UINT  count    /* count value to load */
  125.     )
  126.     {
  127.     if (pNcr5390IfTbl->ascXferCountSet != NULL)
  128. return ((int) (pNcr5390IfTbl->ascXferCountSet) (pAsc, count));
  129.     else
  130. return ((int) ERROR);
  131.     }
  132. /*******************************************************************************
  133. *
  134. * ascXferCountGet - fetch the ASC transfer count
  135. *
  136. * The value of the transfer counter is copied to *pCount.
  137. *
  138. * RETURNS: N/A.
  139. *
  140. * NOMANUAL
  141. */
  142. void ascXferCountGet
  143.     (
  144.     FAST int  *pAsc,   /* ptr to ASC info      */
  145.     FAST int  *pCount   /* ptr to returned value */
  146.     )
  147.     {
  148.     if (pNcr5390IfTbl->ascXferCountGet != NULL)
  149.         (pNcr5390IfTbl->ascXferCountGet) (pAsc, pCount);
  150.     }
  151. /*******************************************************************************
  152. *
  153. * ascCommand - write a command code to the ASC Command Register
  154. *
  155. * RETURNS: N/A.
  156. *
  157. * NOMANUAL
  158. */
  159. void ascCommand
  160.     (
  161.     int  *pAsc,        /* ptr to ASC info */
  162.     UINT8 cmdCode       /* new command code */
  163.     )
  164.     {
  165.     if (pNcr5390IfTbl->ascCommand != NULL)
  166. (pNcr5390IfTbl->ascCommand) (pAsc, cmdCode);
  167.     }
  168. /*******************************************************************************
  169. *
  170. * ascIntr - interrupt service routine for the ASC
  171. *
  172. * RETURNS: N/A.
  173. *
  174. * NOMANUAL
  175. */
  176. void ascIntr
  177.     (
  178.     int *pAsc          /* ptr to ASC info */
  179.     )
  180.     {
  181.     if (pNcr5390IfTbl->ascIntr != NULL)
  182. (pNcr5390IfTbl->ascIntr) (pAsc);
  183.     }
  184. /*******************************************************************************
  185. *
  186. * ascRegRead - Get the contents of a specified ASC register
  187. *
  188. * RETURNS: N/A.
  189. *
  190. * NOMANUAL
  191. */
  192. void ascRegRead
  193.     (
  194.     int  *pAsc,         /* ptr to an ASC structure */
  195.     UINT8 regAdrs,       /* register to read         */
  196.     int  *pDatum         /* put data here            */
  197.     )
  198.     {
  199.     if (pNcr5390IfTbl->ascRegRead != NULL)
  200. (pNcr5390IfTbl->ascRegRead) (pAsc, regAdrs, pDatum);
  201.     }
  202. /*******************************************************************************
  203. *
  204. * ascRegWrite - write a value to a specified ASC register
  205. *
  206. * RETURNS: N/A.
  207. *
  208. * NOMANUAL
  209. */
  210. void ascRegWrite
  211.     (
  212.     int  *pAsc,         /* ptr to an ASC structure */
  213.     UINT8 regAdrs,       /* register to write        */
  214.     UINT8 datum          /* data to write            */
  215.     )
  216.     {
  217.     if (pNcr5390IfTbl->ascRegRead != NULL)
  218. (pNcr5390IfTbl->ascRegRead) (pAsc, regAdrs, datum);
  219.     }
  220. /*******************************************************************************
  221. *
  222. * ncr5390Show - display the values of all readable NCR5390 chip registers
  223. *
  224. * This routine displays the state of the ASC registers in a user-friendly
  225. * manner.  It is useful primarily for debugging.  It should not be invoked
  226. * while another running process is accessing the SCSI controller.
  227. *
  228. * EXAMPLE:
  229. * .CS
  230. *     -> ncr5390Show
  231. *     REG #00 (Own ID         ) = 0x07
  232. *     REG #01 (Control        ) = 0x00
  233. *     REG #02 (Timeout Period ) = 0x20
  234. *     REG #03 (Sectors        ) = 0x00
  235. *     REG #04 (Heads          ) = 0x00
  236. *     REG #05 (Cylinders MSB  ) = 0x00 
  237. *     REG #06 (Cylinders LSB  ) = 0x00
  238. *     REG #07 (Log. Addr. MSB ) = 0x00
  239. *     REG #08 (Log. Addr. 2SB ) = 0x00
  240. *     REG #09 (Log. Addr. 3SB ) = 0x00
  241. *     REG #0a (Log. Addr. LSB ) = 0x00
  242. *     REG #0b (Sector Number  ) = 0x00
  243. *     REG #0c (Head Number    ) = 0x00 
  244. *     REG #0d (Cyl. Number MSB) = 0x00
  245. *     REG #0e (Cyl. Number LSB) = 0x00
  246. *     REG #0f (Target LUN     ) = 0x00
  247. *     REG #10 (Command Phase  ) = 0x00
  248. *     REG #11 (Synch. Transfer) = 0x00
  249. *     REG #12 (Xfer Count MSB ) = 0x00
  250. *     REG #13 (Xfer Count 2SB ) = 0x00
  251. *     REG #14 (Xfer Count LSB ) = 0x00
  252. *     REG #15 (Destination ID ) = 0x03
  253. *     REG #16 (Source ID      ) = 0x00
  254. *     REG #17 (SCSI Status    ) = 0x42
  255. *     REG #18 (Command        ) = 0x07
  256. * .CE
  257. *
  258. * RETURNS: OK, or ERROR if <pScsiCtrl> and <pSysScsiCtrl> are both NULL.
  259. */
  260. int ncr5390Show
  261.     (
  262.     FAST int *pScsiCtrl   /* ptr to SCSI controller info */
  263.     )
  264.     {
  265.     if (pNcr5390IfTbl->ncr5390Show != NULL)
  266. return ((int) (pNcr5390IfTbl->ncr5390Show) (pScsiCtrl));
  267.     else
  268. return ((int) ERROR);
  269.     }