home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / DEV / ATCOM / RMHELP.C < prev    next >
C/C++ Source or Header  |  1995-04-14  |  19KB  |  536 lines

  1. /*DDK*************************************************************************/
  2. /*                                                                           */
  3. /* COPYRIGHT    Copyright (C) 1995 IBM Corporation                           */
  4. /*                                                                           */
  5. /*    The following IBM OS/2 WARP source code is provided to you solely for  */
  6. /*    the purpose of assisting you in your development of OS/2 WARP device   */
  7. /*    drivers. You may use this code in accordance with the IBM License      */
  8. /*    Agreement provided in the IBM Device Driver Source Kit for OS/2. This  */
  9. /*    Copyright statement may not be removed.                                */
  10. /*                                                                           */
  11. /*****************************************************************************/
  12. /**************************************************************************
  13.  *
  14.  * SOURCE FILE NAME =  RMHELP.C
  15.  *
  16.  * DESCRIPTIVE NAME =  Helpers for COM.SYS
  17.  *
  18.  *
  19.  *
  20.  * VERSION = V0.1
  21.  *
  22.  * DATE  09/07/94
  23.  *
  24.  * DESCRIPTION : (see above)
  25.  *
  26.  * Purpose: (see above)
  27.  *
  28.  *
  29.  *
  30.  * FUNCTIONS  :
  31.  *
  32.  * NOTES
  33.  *
  34.  *
  35.  * STRUCTURES
  36.  *
  37.  * EXTERNAL REFERENCES
  38.  *
  39.  *
  40.  *
  41.  * EXTERNAL FUNCTIONS
  42.  *
  43. */
  44. #define INCL_NOPMAPI
  45. #include <os2.h>
  46. #include <string.h>
  47.  
  48. #ifndef FAR
  49. #define FAR far
  50. #endif
  51.  
  52. #include "rmbase.h"
  53. #include "cominfo.h"
  54. #include "rmhelp.h"  // brings in rmcalls.h
  55.  
  56. #define USESIRQ     1         //Driver does indeed use IRQs....
  57.  
  58. /*--------------------------------------------------------*/
  59. /* # D E F I N E S                                        */
  60. /*--------------------------------------------------------*/
  61. #ifndef MAXADN                          //Maximum number of adapters
  62. #define MAXADN 4
  63. #endif
  64. #ifndef MAXPORT                         //Maximum number of I/O ranges
  65. #define MAXPORT 1
  66. #endif
  67. #ifndef MAXIRQ                          //Maximum number of IRQs
  68. #define MAXIRQ  1
  69. #endif
  70. #define MAXRESOURCE (MAXPORT+MAXIRQ)
  71.  
  72.  
  73. /*--------------------------------------------------------*/
  74. /* Set the DRIVERSTRUCT and ADAPTERSTRUCT data areas      */
  75. /*--------------------------------------------------------*/
  76.  
  77. /*----------------------------------------------*/
  78. /* Driver Description                           */
  79. /*----------------------------------------------*/
  80. DRIVERSTRUCT DriverStruct =
  81. {
  82.    "COM.SYS",                                /* DrvrName                */
  83.    "Asynchronous Communications Driver",     /* DrvrDescript            */
  84.    "IBM OS/2",                               /* VendorName              */
  85.    CMVERSION_MAJOR,                          /* MajorVer                */
  86.    CMVERSION_MINOR,                          /* MinorVer                */
  87.    1994,9,17,                                /* Date                    */
  88.    DRF_STATIC,                               /* DrvrFlags               */
  89.    DRT_OS2,                                  /* DrvrType                */
  90.    DRS_CHAR,                                 /* DrvrSubType             */
  91.    NULL                                      /* DrvrCallback            */
  92. };
  93.  
  94. /*----------------------------------------------*/
  95. /* Adapter Description 0                        */
  96. /*----------------------------------------------*/
  97. ADAPTERSTRUCT AdapterStruct=
  98. {
  99.   "SERIAL_# Serial Controller",      /* AdaptDescriptName; */
  100.   AS_NO16MB_ADDRESS_LIMIT,           /* AdaptFlags;        */
  101.   AS_BASE_COMM,                      /* BaseType;          */
  102.   AS_SUB_SERIAL,                     /* SubType;           */
  103.   AS_INTF_16450,                     /* InterfaceType;     */
  104.   AS_HOSTBUS_OTHER,                  /* HostBusType;       */
  105.   AS_BUSWIDTH_16BIT,                 /* HostBusWidth;      */
  106.   NULL                               /* pAdjunctList;      */
  107. };
  108.  
  109. UCHAR LComName[] = KEY_COMM;
  110.  
  111. UCHAR FSComName[] = "COM#: ";
  112.  
  113.  
  114. /*----------------------------------------------*/
  115. /* GLOBAL VARS FOR RM                           */
  116. /*                                              */
  117. /* RM.LIB needs these declared                  */
  118. /*----------------------------------------------*/
  119. PFN             RM_Help               = 0L;
  120. ULONG           RMFlags               = 0L;
  121. ULONG           Device_Help           = 0L;
  122. PFN             RM_Help0              = 0L;
  123. PFN             RM_Help3              = 0L;
  124.  
  125. /*----------------------------------------------*/
  126. /* GLOBAL HANDLE VARIABLES                      */
  127. /*                                              */
  128. /* These variables get the handles for          */
  129. /* drivers, adapter (only 1), and resources.    */
  130. /* The RMHELP wrappers are written so that most */
  131. /* drivers using RMHELP as a template will not  */
  132. /* have to reference these directly.            */
  133. /*                                              */
  134. /*----------------------------------------------*/
  135.  
  136. USHORT    curadn  = 0;        /* Current Adapter Number           */
  137. USHORT    cSerialNodes = 0;   /* Number of other SERIAL_# Nodes   */
  138. HDRIVER   hDriver = NULL;     /* global handle to driver          */
  139. HADAPTER  hAdapter[MAXADN];   /* global handle to adapter         */
  140. HRESOURCE hResPorts[MAXADN];  /* global handles to ports resource */
  141. HRESOURCE hResIRQs[MAXADN];   /* global handles to IRQs resource  */
  142.  
  143. VOID FAR RMHELP_SetDevHelp(ULONG dhaddr)
  144. {
  145.      Device_Help = dhaddr;
  146. }
  147.  
  148. /*--------------------------------------------------------*/
  149. /* RMHELP_CreateDriver - registers to RM susbsystem       */
  150. /*                       (which initializes the DD to     */
  151. /*                        RM connection)                  */
  152. /*                                                        */
  153. /*--------------------------------------------------------*/
  154.  
  155. USHORT FAR RMHELP_CreateDriver()
  156. {
  157.    USHORT     rc;
  158.    HANDLELIST HandleList;
  159.  
  160.    memset(hResPorts,0,MAXADN*sizeof(HRESOURCE));
  161.    memset(hResIRQs,0,MAXADN*sizeof(HRESOURCE));
  162.  
  163.    if (rc = RMCreateDriver(&DriverStruct,&hDriver) )
  164.       return( rc );
  165.  
  166.    HandleList.cMaxHandles = 1;
  167.  
  168.    if ( !(RMKeyToHandleList(HANDLE_PHYS_TREE,
  169.                             "SERIAL*",
  170.                             &HandleList) ) ) {
  171.       cSerialNodes = HandleList.cHandles;
  172.    }
  173.  
  174.  
  175.    return(rc);
  176.  
  177. }
  178.  
  179. /*--------------------------------------------------------*/
  180. /* RMHELP_DestroyDriver - deregisters the driver from     */
  181. /*                        RM sub-system and releases all  */
  182. /*                        claimed resources               */
  183. /*                                                        */
  184. /*--------------------------------------------------------*/
  185.  
  186. VOID FAR RMHELP_DestroyDriver()
  187. {
  188.      RMDestroyDriver(hDriver);
  189.  
  190.      /*-------------------------*/
  191.      /* Null out global handles */
  192.      /*-------------------------*/
  193.  
  194.      hDriver = NULL;
  195.      memset(hAdapter,0,MAXADN*sizeof(HRESOURCE));
  196.      memset(hResPorts,0,MAXADN*MAXPORT*sizeof(HRESOURCE));
  197.      memset(hResIRQs,0,MAXADN*MAXIRQ*sizeof(HRESOURCE));
  198.  
  199. }
  200.  
  201. /*--------------------------------------------------------*/
  202. /* RMHELP_CreateAdapter - tells RM to associate adapter   */
  203. /*                        to driver and resources to      */
  204. /*                        adapater                        */
  205. /*                                                        */
  206. /*--------------------------------------------------------*/
  207.  
  208. USHORT FAR RMHELP_CreateAdapter(USHORT adn)
  209. {
  210.      UCHAR       ResourceBuf[ sizeof(HRESOURCE) * MAXRESOURCE ];
  211.      PAHRESOURCE pResourceList = (PAHRESOURCE)ResourceBuf;
  212.      ADJUNCT     adj;
  213.      USHORT      rescnt;
  214.  
  215.  
  216.      adj.pNextAdj=NULL;
  217.      adj.AdjLength=sizeof(ADJUNCT);
  218.      adj.AdjType=ADJ_ADAPTER_NUMBER;
  219.      adj.Adapter_Number = adn + cSerialNodes ;
  220.  
  221.      rescnt=0;                          //no resources to begin with
  222.  
  223.      if (hResPorts[adn] != 0) {
  224.         pResourceList->hResource[rescnt++]=hResPorts[adn];
  225.      }
  226.  
  227.  
  228.      if (hResIRQs[adn] != 0) {
  229.         pResourceList->hResource[rescnt++] = hResIRQs[adn];
  230.      }
  231.  
  232.      pResourceList->NumResource=rescnt;
  233.      AdapterStruct.pAdjunctList=&adj;
  234.  
  235.      RMCreateAdapter(hDriver,
  236.                      &hAdapter[adn],
  237.                      &AdapterStruct,
  238.                      NULL,
  239.                      pResourceList) ;
  240.  
  241.  
  242.  
  243.      return(0);
  244. }
  245.  
  246. /*--------------------------------------------------------*/
  247. /* RMHELP_FreeAdapter -   tells RM to free adapter and    */
  248. /*                        resources allocated to adapter  */
  249. /*                                                        */
  250. /*--------------------------------------------------------*/
  251.  
  252. VOID FAR RMHELP_FreeAdapter(USHORT adn)
  253. {
  254.  
  255.    if (hResPorts[adn] != 0) {
  256.         RMDeallocResource(hDriver,hResPorts[adn]);
  257.    }
  258.  
  259.    if (hResIRQs[adn] != 0) {
  260.         RMDeallocResource(hDriver,hResIRQs[adn]);
  261.    }
  262.  
  263.    if (hAdapter[adn] != 0) {
  264.         RMDestroyAdapter(hDriver,hAdapter[adn]);
  265.    }
  266. }
  267.  
  268. /*--------------------------------------------------------*/
  269. /* RMHELP_AllocPorts - attempts to claim a port resource */
  270. /*                       from RM subsystem                */
  271. /*                                                        */
  272. /* ARGS:                                                  */
  273. /*                                                        */
  274. /* USHORT baseport - base IO port.                        */
  275. /* USHORT nPorts   - number of prts inclusive of base port*/
  276. /*                                                        */
  277. /*--------------------------------------------------------*/
  278. USHORT FAR RMHELP_AllocPorts(USHORT MachType, USHORT baseport,USHORT nPorts)
  279. {
  280.    RESOURCESTRUCT Resource;
  281.  
  282.  
  283.    if (hResPorts[curadn] == 0) {
  284.  
  285.       Resource.ResourceType             = RS_TYPE_IO;
  286.       Resource.IOResource.BaseIOPort    = baseport;
  287.       Resource.IOResource.NumIOPorts    = nPorts;
  288.  
  289.       if ( (MachType == MACH_EISA) || (MachType == MACH_UCHNL) ) {
  290.            Resource.IOResource.IOAddressLines=16;
  291.       } else {
  292.            Resource.IOResource.IOAddressLines=10;
  293.       }
  294.  
  295.       Resource.IOResource.IOFlags       = RS_IO_MULTIPLEXED;
  296.       return(RMAllocResource( hDriver, &hResPorts[curadn], &Resource ));
  297.    }
  298.  
  299.    return(RMHELP_ERR_RESOURCECLAIMED);
  300. }
  301.  
  302.  
  303. /*--------------------------------------------------------*/
  304. /* RMHELP_AllocIRQ   - attempts to claim a IRQ resource   */
  305. /*                       from RM subsystem                */
  306. /*                                                        */
  307. /* ARGS:                                                  */
  308. /*                                                        */
  309. /* USHORT IRQlevel - IRQ level to claim                   */
  310. /*                                                        */
  311. /*--------------------------------------------------------*/
  312. USHORT FAR RMHELP_AllocIRQ(USHORT MachType, USHORT IRQlevel)
  313. {
  314.      RESOURCESTRUCT Resource;
  315.  
  316.      if (hResIRQs[curadn] == 0) {
  317.           Resource.ResourceType          = RS_TYPE_IRQ;
  318.           Resource.IRQResource.PCIIrqPin = RS_PCI_INT_NONE;
  319.           if (MachType == MACH_UCHNL)
  320.              Resource.IRQResource.IRQFlags  = RS_IRQ_SHARED;
  321.           else
  322.              Resource.IRQResource.IRQFlags  = RS_IRQ_MULTIPLEXED;
  323.           Resource.IRQResource.IRQLevel  = IRQlevel;
  324.           return(RMAllocResource(hDriver,&(hResIRQs[curadn]),&Resource));
  325.      }
  326.  
  327.      return(RMHELP_ERR_RESOURCECLAIMED);
  328. }
  329.  
  330.  
  331.  
  332. /*****************************************************************************/
  333. /*****************************************************************************/
  334. /********                                               **********************/
  335. /********  All COM specific code appears below this     **********************/
  336. /********                divider!!!                     **********************/
  337. /********                                               **********************/
  338. /********                                               **********************/
  339. /*****************************************************************************/
  340. /*****************************************************************************/
  341.  
  342. /*--------------------------------------------------------*/
  343. /* RMHELP_GetPorts   - attempts to claim resources for a  */
  344. /*                     COM port                           */
  345. /*                                                        */
  346. /* ARGS:  ptr = COM driver ComInfo structure              */
  347. /*                                                        */
  348. /*--------------------------------------------------------*/
  349. USHORT FAR RMHELP_GetPorts(USHORT MachType,PCOMINFO pComInfo)
  350. {
  351.      USHORT rc = 0;
  352.  
  353.      curadn = pComInfo->ci_port_number;
  354.  
  355.      if ( (pComInfo->ci_port != 0) &&
  356.           (rc = RMHELP_AllocPorts(MachType, pComInfo->ci_port,8)) ) {
  357.         return(rc);
  358.      }
  359.  
  360.      if ( (pComInfo->ci_irq != 0) &&
  361.           (rc=RMHELP_AllocIRQ(MachType, pComInfo->ci_irq)) ) {
  362.        return(rc);
  363.      }
  364.  
  365.      return(0);
  366. }
  367.  
  368. /*----------------------------------------------------------*/
  369. /* RMHELP_PortInitComplete - Bind resources to the port     */
  370. /*                                                          */
  371. /*      We also examine the ComInfo structure for the       */
  372. /*      hardware type and update our structures accordingly */
  373. /*                                                          */
  374. /* ARGS:  pComInfo = COM driver ComInfo structure           */
  375. /*                                                          */
  376. /*----------------------------------------------------------*/
  377.  
  378. USHORT FAR RMHELP_PortInitComplete(PCOMINFO pComInfo, USHORT BusType)
  379. {
  380.    USHORT rc=0;
  381.  
  382.    switch (BusType) {
  383.       case MACH_EISA:
  384.          AdapterStruct.HostBusType=AS_HOSTBUS_EISA;
  385.          break;
  386.       case MACH_UCHNL:
  387.          AdapterStruct.HostBusType=AS_HOSTBUS_uCHNL;
  388.          break;
  389.       case MACH_PCMCIA:
  390.          AdapterStruct.HostBusType=AS_HOSTBUS_PCMCIA;
  391.          break;
  392.       case MACH_ISA:
  393.          AdapterStruct.HostBusType=AS_HOSTBUS_ISA;
  394.          break;
  395.       default:
  396.          AdapterStruct.HostBusType=AS_HOSTBUS_PLANAR;
  397.          break;
  398.    }
  399.  
  400.    switch (pComInfo->ci_flagx & FX_CHIP_MASK) {
  401.       case FX_8250:
  402.       case FX_16450:
  403.          AdapterStruct.InterfaceType=AS_INTF_16450;
  404.          break;
  405.       case FX_16550A:
  406.          AdapterStruct.InterfaceType=AS_INTF_16550;
  407.          break;
  408.    }
  409.  
  410.    /*-------------------------------*/
  411.    /* If not pcmcia modem, create   */
  412.    /* an adapter                    */
  413.    /*-------------------------------*/
  414.  
  415.    if (!(pComInfo->ci_flagx1 & FX1_PCMCIA_MODEM)) {
  416.       rc = RMHELP_CreateAdapter( pComInfo->ci_port_number );
  417.       if (!rc){
  418.         pComInfo->ci_hAdapter = hAdapter[pComInfo->ci_port_number];
  419.         rc = RMHELP_CreateLDev(pComInfo);
  420.       }
  421.    }
  422.  
  423.    return( rc  );
  424. }
  425.  
  426. /*----------------------------------------------------------*/
  427. /* RMHELP_PortDidntInstall - Free resources from a port     */
  428. /*                                                          */
  429. /* ARGS:  locus = code to indicate point of failure         */
  430. /*        port  = adapter number to free                    */
  431. /*                                                          */
  432. /*----------------------------------------------------------*/
  433. USHORT FAR RMHELP_PortDidntInstall(USHORT Locus, USHORT Port)
  434. {
  435.      return( RMHELP_FreeAdapter( Port ));
  436. }
  437.  
  438. /*----------------------------------------------------------*/
  439. /* RMHELP_CreateLDev - Create logical device nodes          */
  440. /*                                                          */
  441. /* ARGS:                                                    */
  442. /*        pComInfo  = pointer to ComInfo                    */
  443. /*                                                          */
  444. /*----------------------------------------------------------*/
  445. USHORT FAR RMHELP_CreateLDev( PCOMINFO pComInfo )
  446. {
  447.   LDEVSTRUCT    RMLDevStr;
  448.   SYSNAMESTRUCT RMSysNameStr;
  449.   ADJUNCT       RMAdjunct;
  450.   HLDEV         hRMLDev;
  451.   HSYSNAME      hRMSysName;
  452.   USHORT        rc=0;
  453.  
  454.   if (!(pComInfo->ci_hLDev)){
  455.      memset( (PSZ)&RMLDevStr, 0, sizeof(LDEVSTRUCT) );
  456.  
  457.      memset( (PSZ)&RMSysNameStr, 0, sizeof(SYSNAMESTRUCT) );
  458.  
  459.      RMLDevStr.LDevClass        = LDEV_CLASS_SERIAL;
  460.      RMLDevStr.pAdjunctList     = &RMAdjunct;
  461.      RMAdjunct.AdjType          = ADJ_DEVICE_NUMBER;
  462.      RMAdjunct.AdjLength        = sizeof(ADJUNCT);
  463.      RMAdjunct.pNextAdj         = NULL;
  464.  
  465.      RMLDevStr.LDevDescriptName = LComName;
  466.      RMAdjunct.Device_Number = pComInfo->ci_port_number;
  467.  
  468.      if ( !(rc = RMCreateLDev( (HDRIVER)     hDriver,
  469.                                (PHLDEV)      &hRMLDev,
  470.                                (HDEVICE)     pComInfo->ci_hAdapter,
  471.                                (PLDEVSTRUCT) &RMLDevStr  )) )
  472.      {
  473.        pComInfo->ci_hLDev = hRMLDev;
  474.  
  475.        RMSysNameStr.SysDescriptName = FSComName;
  476.        RMSysNameStr.pAdjunctList    = NULL;
  477.  
  478.        FSComName[3] = (UCHAR)(pComInfo->ci_port_number + 1 + '0');
  479.  
  480.        rc = RMCreateSysName( (HDRIVER)        hDriver,
  481.                              (PHSYSNAME)      &hRMSysName,
  482.                              (HDEVICE)        hRMLDev,
  483.                              (PSYSNAMESTRUCT) &RMSysNameStr  );
  484.  
  485.        pComInfo->ci_hSysName = hRMSysName;
  486.      }
  487.   }
  488.  
  489.   return rc;
  490. }
  491.  
  492.  
  493. /*----------------------------------------------------------*/
  494. /* RMHELP_DestroyLDev - Destroy logical device nodes        */
  495. /*                                                          */
  496. /* ARGS:  pComInfo = pointer to ComInfo Structure           */
  497. /*                                                          */
  498. /*                                                          */
  499. /*----------------------------------------------------------*/
  500. VOID FAR RMHELP_DestroyLDev( PCOMINFO pComInfo )
  501. {
  502.   if (pComInfo) {
  503.      if (pComInfo->ci_hSysName)
  504.         RMDestroySysName( hDriver, pComInfo->ci_hSysName );
  505.      pComInfo->ci_hSysName = 0;
  506.      if (pComInfo->ci_hLDev)
  507.         RMDestroyLDev( hDriver, pComInfo->ci_hLDev );
  508.      pComInfo->ci_hLDev = 0;
  509.   }
  510. }
  511.  
  512. /*----------------------------------------------------------*/
  513. /* RMHELP_FindPCMCIA - Find PCMCIA Node to hang LDEV        */
  514. /*                                                          */
  515. /* ARGS:  pComInfo = pointer to ComInfo Structure           */
  516. /*                                                          */
  517. /*                                                          */
  518. /*----------------------------------------------------------*/
  519. VOID FAR RMHELP_FindPCMCIANode( PCOMINFO pComInfo )
  520. {
  521.    HANDLELIST HandleList;
  522.  
  523.    HandleList.cMaxHandles = 1;
  524.  
  525.    if ( !(RMKeyToHandleList(HANDLE_PHYS_TREE,
  526.                             "PCMCIA*",
  527.                             &HandleList) ) ) {
  528.       if( HandleList.cHandles )
  529.          pComInfo->ci_hAdapter = HandleList.Handles[0];
  530.       else
  531.          pComInfo->ci_hAdapter = 0;
  532.    } else {
  533.       pComInfo->ci_hAdapter = 0;
  534.    }
  535. }
  536.