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

VxWorks

开发平台:

C/C++

  1. /* usrUsbPegasusEndInit.c - Initialization of the USB END driver */
  2. /* Copyright 1999-2002 Wind River Systems, Inc. */
  3. /*
  4. Modification history
  5. --------------------
  6. 01f,25apr02,wef  add support for Micro Connector device.
  7. 01e,05mar02,wef  cleaned up printf's.
  8. 01d,17dec01,wef  merge from veloce
  9. 01c,04dec01,wef  Pulled code from src/test/usb/usbPegasusTest.c here and cleaned
  10.  up.
  11. 01b,10jun01,wef  moved end attach functionality to src/test/usb/usbPegasusTest.c
  12. 01a,23aug00,wef  Created
  13. */
  14. /*
  15. DESCRIPTION
  16. This configlette initializes the USB END pegasus driver.  This assumes the
  17. USB host stack has already been initialized and has a host controller
  18. driver attached.   
  19. */
  20. /* includes */
  21. #include "ipProto.h"
  22. #include "usb/ossLib.h"
  23. #include "usb/usbQueueLib.h"
  24. #include "drv/usb/usbPegasusEnd.h"
  25. /* defines */
  26. /* externals */
  27. IMPORT END_OBJ *       usbPegasusEndLoad (char * initString);
  28. /* locals */
  29. LOCAL QUEUE_HANDLE  pegasusCallbackQueue;
  30. LOCAL USB_MESSAGE   pegasusDeviceStatus;
  31. LOCAL END_OBJ*    pEnd;
  32. /******************************************************************************
  33. *
  34. * sysUsbEndPegasusLoad - load (create) USB END device
  35. *
  36. * This routine loads the usb end device with initial parameters specified by
  37. * values given in the BSP configuration files (config.h).
  38. *
  39. * RETURNS: pointer to END object or ERROR.
  40. *
  41. */
  42.  
  43. END_OBJ * sysUsbPegasusEndLoad
  44.     (
  45.     char * pParamStr,   /* ptr to initialization parameter string */
  46.     void * unused       /* unused optional argument */
  47.     )
  48.     {
  49.     /*
  50.      * The usbEnd driver END_LOAD_STRING should be:
  51.      * "<vendorId>:<productId>:<noofRxbuffers>:<noofIRPs>"
  52.      */
  53.     char paramStr [END_INIT_STR_MAX];   /* from end.h */
  54.     static char usbEndParam[] = "%d:%d:%d:%d";
  55.     if (strlen (pParamStr) == 0)
  56.         {
  57.         /* 
  58.          * muxDevLoad() calls us twice.  If the string is
  59.          * zero length, then this is the first time through
  60.          * this routine, so we just return the device name.
  61.          */
  62. pEnd = usbPegasusEndLoad(pParamStr);
  63.         }
  64.     else
  65. {
  66. /*
  67.  * On the second pass though here, we actually create 
  68.  * the initialization parameter string on the fly.   
  69.  * Note that we will be handed our unit number on the 
  70.  * second pass through and we need to preserve that information.
  71.  * So we use the unit number handed from the input string.
  72.  */
  73. sprintf (paramStr, "%c:n", * pParamStr);
  74. sprintf (usbEndParam,
  75.  "%d:%d:%d:%dn", 
  76.  SOHOWARE_VENDOR_ID, 
  77.  SOHOWARE_PRODUCT_ID, 
  78.  PEGASUS_NO_IN_BFRS, 
  79.  PEGASUS_NO_OUT_IRPS);
  80. strcat(paramStr,usbEndParam);
  81. if ((pEnd = usbPegasusEndLoad (paramStr)) == (END_OBJ *)NULL)
  82.     {
  83.     printf ("Error: usb network device failed usbEndLoad routine.n");
  84.     }
  85. }
  86.     return (pEnd);
  87.     }
  88. /******************************************************************************
  89. *
  90. * usbLoadPegasus - load (create) USB END device
  91. *
  92. * This function is taken from usrEndLibInit() and modified suitably to load 
  93. * the end driver when USB Ethernet device is dynamically attached or detached. 
  94. *
  95. * RETURNS: OK or ERROR.
  96. *
  97. */
  98. STATUS usbLoadPegasus 
  99.     ( 
  100.     int unitNum, 
  101.     USB_PEGASUS_DEV * pDev
  102.     )
  103.     {
  104.     
  105.     END_OBJ*      pCookie = NULL;
  106.     /* Add our default address resolution functions. */
  107. #ifdef INCLUDE_NT_ULIP
  108.     muxAddrResFuncAdd (M2_ifType_ethernet_csmacd, 0x800, ntResolv);
  109. #else
  110.     muxAddrResFuncAdd (M2_ifType_ethernet_csmacd, 0x800, arpresolve);
  111. #endif
  112.     pCookie = (END_OBJ *) muxDevLoad(unitNum, 
  113.      sysUsbPegasusEndLoad,
  114.      NULL,
  115.      1,
  116.      NULL);
  117.     if (pCookie == NULL)
  118. {
  119.         printf ("muxDevLoad failed for PEGASUS device n");
  120.         return(ERROR);  
  121. }
  122.     else
  123. {
  124.         if (muxDevStart(pCookie) == ERROR)
  125.     {
  126.             printf ("muxDevStart failed for Pegasus device n");
  127.     return(ERROR);
  128.     }
  129.         }
  130.     return (OK);
  131.     }
  132. /******************************************************************************
  133. *
  134. * usbPegasusEndStart -  make the network device operational
  135. *
  136. * After muxDevStart hass been executed, this then attaches an IP address
  137. * to the USB device and then starts the it.
  138. *
  139. * RETURNS: Nothing
  140. *
  141. */
  142. void usbPegasusEndStart
  143.     ( 
  144.     int       unitNum, /* unit number */
  145.     char *    pAddrString, /* enet address */
  146.     int       netmask /* netmask */
  147.     )
  148.     {
  149.     M2_INTERFACETBL  endM2Tbl;
  150.     pEnd = endFindByName (PEGASUS_NAME, unitNum);
  151.     if (pEnd == NULL)
  152. {
  153. printf ("Could not find %s%dn", PEGASUS_NAME, unitNum);
  154. return;
  155. }
  156.     if (muxIoctl(pEnd, EIOCGMIB2, (caddr_t) &endM2Tbl) == ERROR)
  157. {
  158. printf ("Cannot perform EIOCMIB2 ioctl.n");
  159. return;
  160. }
  161.  
  162.     if (ipAttach(unitNum, PEGASUS_NAME) != OK)
  163. {
  164. printf ("Failed to attach to device %s", PEGASUS_NAME);
  165. return;
  166. }
  167.  
  168.     if (usrNetIfConfig (PEGASUS_NAME, 
  169. unitNum, 
  170. pAddrString, 
  171. PEGASUS_TARGET_NAME, 
  172. netmask) 
  173.     != OK)
  174. {
  175. printf ("Failed to configure %s%d for IP.n", PEGASUS_NAME, unitNum);
  176. return;
  177. }
  178.     printf ("Attached TCP/IP interface to %s unit %dn", PEGASUS_NAME, unitNum);
  179.     }
  180. /***************************************************************************
  181. *
  182. * usbPegasusAttachCallback - configuration level callback
  183. *
  184. * When a Pegasus device is inserted, this will get called.  It passes the 
  185. * attach message to tUsbPgs task.
  186. *
  187. * RETURNS: nothing
  188. */
  189.  
  190. VOID usbPegasusAttachCallback
  191.     (
  192.     pVOID arg,                      /* caller-defined argument */
  193.     USB_PEGASUS_DEV * pDev,         /* pointer to Pegasus Device */
  194.     UINT16 attachCode               /* attach code */
  195.     )
  196.  
  197.     {
  198.     usbQueuePut (pegasusCallbackQueue,
  199.  0,    /* msg */
  200.  attachCode, /* wParam */
  201.  (UINT32)pDev, /* lParam */
  202.  5000);
  203.     }
  204. /***************************************************************************
  205. *
  206. * pegasusClientThread - handles device insertions / removals.
  207. *
  208. * This routine is the configuration level handler that monitors device 
  209. * insertions and removals.  Upon device connection, it starts the USB 
  210. * network device.
  211. *
  212. * RETURNS: nothing
  213. */
  214.  
  215. void pegasusClientThread(void)
  216.     {
  217.     int unitNum = 0, index;
  218.     USB_PEGASUS_DEV * pDev;
  219.     int noOfSupportedDevices = (sizeof (pegasusAdapterList) /
  220.                                  (2 * sizeof (UINT16)));
  221.     while (1)
  222.         {
  223.         usbQueueGet (pegasusCallbackQueue, &pegasusDeviceStatus, OSS_BLOCK);
  224. pDev = (USB_PEGASUS_DEV *)pegasusDeviceStatus.lParam;
  225.  
  226. for (index = 0; index < noOfSupportedDevices; index++)
  227.             if (pDev->vendorId == pegasusAdapterList[index][0] &&
  228.                 pDev->productId == pegasusAdapterList[index][1])
  229.         {
  230. break;
  231. if (index == noOfSupportedDevices)
  232.     {
  233.     printf ("Unsupported Device.n");
  234.     continue; 
  235.     }
  236. /* Device is connected */
  237. if (pegasusDeviceStatus.wParam == USB_PEGASUS_ATTACH)
  238.     {
  239.     printf ("Loading Pegasus Devicen");
  240.     if (usbPegasusDevLock ((USBD_NODE_ID) pDev->nodeId) != OK)
  241. printf ("usbPegasusDevLock() returned ERRORn");
  242.     else
  243. {
  244. if(usbLoadPegasus(unitNum, pDev) == OK)
  245.     {
  246.     /* Attach IP address*/
  247.     usbPegasusEndStart(unitNum, 
  248.        PEGASUS_IP_ADDRESS, 
  249.        PEGASUS_NET_MASK);
  250.     } 
  251. else 
  252.     printf ("usbLoadPegasus returned ERRORn");
  253. }
  254.     }
  255. /* Device was removed */
  256.         else if (pegasusDeviceStatus.wParam == USB_PEGASUS_REMOVE)
  257.     {
  258.    
  259.         printf ("Pegasus Device Unload in progressn");
  260.       if (usbPegasusDevUnlock ((USBD_NODE_ID) pDev->nodeId) != OK)
  261. {
  262. printf ("usbPegasusDevUnlock() returned ERRORn");
  263. continue;
  264. }
  265.             if (routeDelete(PEGASUS_DESTINATION_ADDRESS, 
  266.     PEGASUS_IP_ADDRESS)
  267.   !=OK)
  268. {
  269. printf (" RouteDeletion failed  n");
  270. continue;
  271. }
  272.     if (muxDevUnload(PEGASUS_NAME, unitNum)!=OK)
  273. {
  274.         printf ("  muxDevUnload failedn");
  275. continue;
  276. }
  277.        printf (" Pegasus Device Unloaded sucessfullyn");
  278.     }
  279. }
  280.     }
  281. /*****************************************************************************
  282. *
  283. * usrUsbPegasusEndInit - initialize the USB END Pegasus driver
  284. *
  285. * This function initializes the USB END Pegasus driver and spawns a task
  286. * to manage device insertion / removals.
  287. *
  288. * RETURNS: nothing 
  289. */
  290. void usrUsbPegasusEndInit (void)
  291.     {
  292.     int taskId;
  293.     if (usbPegasusEndInit () == OK)
  294.         printf ("usbPegasusEndInit () returned OKn");
  295.     else
  296. {
  297.         printf ("usbPegasusEndInit () returned ERRORn");
  298. return;
  299. }
  300.  
  301.     if (usbQueueCreate (128, &pegasusCallbackQueue)!=OK)
  302. {
  303. printf ("pegasusCallbackQueue creation errorn ");
  304. return;
  305. }
  306.     if((taskId = taskSpawn ("tUsbPgs", 
  307.     5, 
  308.     0,
  309.     20000, 
  310.     (FUNCPTR) pegasusClientThread, 
  311.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )) ==ERROR)
  312. {
  313. printf ("Error spawning tUsbPgsn");
  314. return;
  315. }
  316.     if (usbPegasusDynamicAttachRegister (usbPegasusAttachCallback, NULL) != OK)
  317. {
  318. printf ("usbPegasusDynamicAttachRegister() returned ERRORn");
  319. return;
  320. }
  321.     }