home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lxapi32.zip / Dev32 / lxinit.c < prev    next >
C/C++ Source or Header  |  2002-04-26  |  6KB  |  249 lines

  1. /* $Id: lxinit.c,v 1.2 2002/04/26 23:08:56 smilcke Exp $ */
  2.  
  3. /*
  4.  * init.c
  5.  * Autor:               Stefan Milcke
  6.  * Erstellt am:         07.09.2001
  7.  * Letzte Aenderung am: 09.04.2002
  8.  *
  9. */
  10.  
  11. // Device support
  12. extern "C"
  13. {
  14. #define INCL_NOPMAPI
  15. #define INCL_DOSINFOSEG
  16. #include <os2.h>
  17. }
  18.  
  19. #include <devhelp.h>
  20. #include <devtype.h>
  21. #include <devrp.h>
  22. #include <ldefos2.h>
  23. #include "lxdevown.h"
  24. #include "Ver_32.h"
  25.  
  26. #include <string.h>
  27. #include "sprintf.h"
  28. extern "C"
  29. {
  30. #include <lxapios2.h>
  31. #include <lxapilib.h>
  32. #include <linux/types.h>
  33. #include <linux/module.h>
  34. };
  35.  
  36. #ifdef KEE
  37. #include <kee.h>
  38. #endif
  39.  
  40. #define PAGE_SIZE 4096
  41.  
  42. extern "C" int verbose;
  43. extern "C" int verbose_modulelist;
  44. extern "C" int doint3;
  45. extern "C" int nocoremodule;
  46. extern "C" int nomodule;
  47.  
  48. extern unsigned long build_level;
  49.  
  50. static const char ERR_ERROR[] = "ERROR: ";
  51. static const char ERR_LOCK[]  = "Unable to lock 32 bit data & code segments, exiting...\r\r\n";
  52. static const char ERR_SIGN[]  = "LXAPI support driver V%d.%d Build %d Copyright 2001-2002 by Stefan Milcke\r\n";
  53. static const char LOADEDMODULE[] = "Loaded module:";
  54. static const char NOMODULE[] = "No module loaded. Use LXAPICFG to configure driver.\r\n";
  55. static const char CRLF[]      = "\r\n";
  56. static char buffer[400];
  57.  
  58. typedef struct {
  59.  USHORT MsgLength;
  60.  WORD32 MsgPtr;
  61. } MSG_TABLE;
  62.  
  63. extern "C" WORD32 MSG_TABLE32;
  64.  
  65. extern "C" int sprintf(char *buffer,const char *format, ...);
  66.  
  67. //------------------------------- DevSaveMessage -------------------------------
  68. //Print messages with DosWrite when init is done or has failed (see startup.asm)
  69. void DevSaveMessage(char __far *str, int length)
  70. {
  71.  MSG_TABLE __far *msg = (MSG_TABLE __far *)__Make48Pointer(MSG_TABLE32);
  72.  char __far *str16 = (char __far *)__Make48Pointer(msg->MsgPtr);
  73.  int i;
  74.  for(i=0;i<length;i++)
  75.   str16[msg->MsgLength + i] = str[i];
  76.  str16[msg->MsgLength + length] = 0;
  77.  msg->MsgLength += length;
  78.  return;
  79. }
  80.  
  81. //-------------------------------- LockSegments --------------------------------
  82. int LockSegments(void)
  83. {
  84. #ifdef KEE
  85.  KEEVMLock lock;
  86. #else
  87.  char   lock[12];
  88.  ULONG  PgCount;
  89. #endif
  90.  ULONG  segsize;
  91.  // Locks DGROUP into physical memory
  92.  //NOTE: VMLock rounds base address down to nearest page
  93.  //      So we MUST take this into account when calculating the
  94.  //      size of our code/data
  95.  segsize = OffsetFinalDS32 - ((OffsetBeginDS32) & ~0xFFF);
  96.  if(segsize & 0xFFF)
  97.     segsize += PAGE_SIZE;
  98.   segsize &= ~0xFFF;
  99. #ifdef KEE
  100.  if(KernVMLock(VMDHL_LONG,
  101.                (PVOID)((OffsetBeginDS32) & ~0xFFF),
  102.                segsize,
  103.                &lock,
  104.                (KEEVMPageList*)-1,
  105.                0))
  106. #else
  107.  if(DevVMLock(VMDHL_LONG,
  108.               ((OffsetBeginDS32) & ~0xFFF),
  109.               segsize,
  110.               (LINEAR)-1,
  111.               __StackToFlat((ULONG)lock),
  112.              (LINEAR)__StackToFlat((ULONG)&PgCount)))
  113. #endif
  114.   return(1);
  115.  // Locks CODE32 into physical memory
  116.  segsize = OffsetFinalCS32 - ((OffsetBeginCS32) & ~0xFFF);
  117.  if(segsize & 0xFFF)
  118.   segsize += PAGE_SIZE;
  119.  segsize &= ~0xFFF;
  120. #ifdef KEE
  121.  if(KernVMLock(VMDHL_LONG,
  122.                (PVOID)((OffsetBeginCS32) & ~0xFFF),
  123.                segsize,
  124.                &lock,
  125.                (KEEVMPageList*)-1,
  126.                0))
  127. #else
  128.  if(DevVMLock(VMDHL_LONG,
  129.               ((OffsetBeginCS32) & ~0xFFF),
  130.               segsize,
  131.               (LINEAR)-1,
  132.               __StackToFlat((ULONG)lock),
  133.               (LINEAR)__StackToFlat((ULONG)&PgCount)))
  134. #endif
  135.   return(1);
  136.  return 0;
  137. }
  138.  
  139.  
  140. //-------------------------------- WriteString ---------------------------------
  141. extern "C" VOID WriteString(const char __far* str, int length)
  142. {
  143.   // Write the string
  144.   DevSaveMessage((char __far *)str, length);
  145.   return;
  146. }
  147.  
  148. extern "C" DWORD TIMER_HDLRPTR;
  149.  
  150. extern "C"
  151. {
  152. void parseArgs(RPInit __far *rp);
  153. int __mallocInit(void);
  154. void *malloc(unsigned long size);
  155. void request_module(char *modName);
  156.  
  157. int init_timervecs(void);
  158. void pci_init(void);
  159. int videodev_init(void);
  160. void videodev_exit(void);
  161.  
  162. extern struct os2lx_parm *pcidrv_parms;
  163. extern int num_pcidrv_parms;
  164. };
  165. int init_pci(){ pci_init(); return 0; }
  166.  
  167. struct os2lx_module timer_module={"timer",0,init_timervecs,NULL,NULL,0};
  168. struct os2lx_module pci_module={"pci_core",0,init_pci,NULL,&pcidrv_parms,&num_pcidrv_parms};
  169. struct os2lx_module i2c_module={"i2c_core",0,NULL,NULL,NULL,0};
  170. struct os2lx_module videodev_module={"videodev",0,videodev_init,videodev_exit,NULL,0};
  171.  
  172. extern "C" unsigned long initResourceManager(void);
  173. extern "C" void pci_name_device_init(void);
  174. extern "C" void pci_name_device_free(void);
  175.  
  176. //------------------------------ DiscardableInit -------------------------------
  177. WORD32 DiscardableInit(RPInit __far* rp)
  178. {
  179.  GetTKSSBase();
  180.  if(LockSegments())
  181.  {
  182.   WriteString(ERR_ERROR, sizeof(ERR_ERROR)-1);
  183.   WriteString(ERR_LOCK, sizeof(ERR_LOCK)-1);
  184.   return RPDONE | RPERR;
  185.  }
  186.  rp->Out.FinalCS = 0;
  187.  rp->Out.FinalDS = 0;
  188.  
  189.  //Do you init here:
  190.  __mallocInit(); // Init heap for malloc
  191.  // Add all supported modules
  192.  OS2_do_add_module(&timer_module,0);
  193.  OS2_do_add_module(&pci_module,0);
  194.  OS2_do_add_module(&i2c_module,0);
  195.  OS2_do_add_module(&videodev_module,0);
  196.  // Init timer
  197.  DevSetTimer(TIMER_HDLRPTR);
  198.  parseArgs(rp);
  199.  if(doint3)
  200.   DebugInt3();
  201.  initResourceManager();
  202. #ifdef CONFIG_PCI_NAMES
  203.  pci_name_device_init();
  204. #endif
  205.  if(!nocoremodule)
  206.  {
  207.   request_module("timer");
  208.   request_module("pci_core");
  209.   request_module("i2c_core");
  210.   request_module("videodev");
  211.  }
  212.  if(verbose)
  213.  {
  214.   sprintf(buffer
  215.           ,ERR_SIGN
  216.           ,LX32_DRV_MAJOR_VERSION
  217.           ,LX32_DRV_MINOR_VERSION
  218.           ,BUILD_LEVEL);
  219.   WriteString(buffer,strlen(buffer));
  220.   if(!nomodule)
  221.   {
  222.    if(verbose_modulelist)
  223.    {
  224.     int n,i;
  225.     n=OS2_get_num_modules();
  226.     for(i=0;i<n;i++)
  227.     {
  228.      char *pName=NULL;
  229.      WriteString(LOADEDMODULE,strlen(LOADEDMODULE));
  230.      pName=OS2_get_module_name(i);
  231.      WriteString(pName,strlen(pName));
  232.      WriteString(CRLF,strlen(CRLF));
  233.     }
  234.    }
  235.   }
  236.   else
  237.   {
  238.    WriteString(NOMODULE,strlen(NOMODULE));
  239.   }
  240.  }
  241.  // Complete the installation
  242.  rp->Out.FinalCS = _OffsetFinalCS16;
  243.  rp->Out.FinalDS = _OffsetFinalDS16;
  244.  
  245.  // Confirm a successful installation
  246.  return RPDONE;
  247. }
  248.  
  249.