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

VxWorks

开发平台:

C/C++

  1. /* usrUsbBulkDevInit.c - USB Mass Storage CBI driver initialization */
  2. /* Copyright 1999-2002 Wind River Systems, Inc. */
  3. /*
  4. Modification history
  5. --------------------
  6. 01e,20dec01,wef  declare usrFdiskPartRead.
  7. 01d,07dec01,wef  Fixed more warnings. 
  8. 01c,13nov01,wef  Removed warnings, added CBIO layer for dosFs2.
  9. 01b,12apr01,wef  added support for multiple devices, added new param to 
  10.  usbBulkBlkDevCreate () for read/ write type.
  11. 01a,10dec00,wef  Created
  12. */
  13.  
  14. /*
  15. DESCRIPTION
  16.  
  17. This configlette initializes the USB Mass Storage Control / Bulk / Interrupt
  18. driver and places it in the driver table.  On boot, it can be refered to by 
  19. the name given specified by the BULK_DRIVE_NAME configuration parameter.  
  20. This configlette assumes the USB host stack has already been initialized and 
  21. has a host controller driver attached.
  22.  
  23. */
  24. /* includes */
  25. #include "dosFsLib.h"
  26. #include "dcacheCbio.h"
  27. #include "dpartCbio.h"
  28. #include "usb/usbdLib.h"
  29. #include "usb/usbQueueLib.h"
  30. #include "drv/usb/usbBulkDevLib.h"
  31. #ifdef _WRS_VXWORKS_5_X
  32. #include "usrFdiskPartLib.h"
  33. #endif
  34. /* defines */
  35. #define VX_UNBREAKABLE 0x0002 /* No debuging into this task */
  36. /* locals */
  37. LOCAL QUEUE_HANDLE  bulkCallbackQueue;
  38. LOCAL USB_MESSAGE   bulkDeviceStatus;
  39. LOCAL BLK_DEV * pBulkBlkDev = NULL; /* Store for drive structure */
  40. USBD_NODE_ID        bulkNodeId;
  41. /* externals */
  42. #ifndef _WRS_VXWORKS_5_X
  43. IMPORT STATUS usrFdiskPartRead
  44.     (
  45.     CBIO_DEV_ID cDev,            /* device from which to read blocks */
  46.     PART_TABLE_ENTRY *pPartTab,  /* table where to fill results */
  47.     int nPart                    /* # of entries in <pPartTable> */
  48.     );
  49. #endif
  50. /*************************************************************************
  51. *
  52. * bulkMountDrive - mounts a drive to the DOSFS.
  53. *
  54. * RETURNS: OK or ERROR
  55. */
  56. LOCAL STATUS bulkMountDrive
  57.     (
  58.     USBD_NODE_ID attachCode             /* attach code */
  59.     )
  60.     {
  61.     CBIO_DEV_ID cbio, masterCbio;
  62.     /* Create the block device with in the driver */
  63.     pBulkBlkDev = (BLK_DEV *) usbBulkBlkDevCreate (bulkNodeId, 
  64.  0, 
  65.  0, 
  66.  USB_SCSI_FLAG_READ_WRITE10);
  67.     if (pBulkBlkDev == NULL)
  68. {
  69. logMsg ("usbBulkBlkDevCreate() returned ERRORn", 0, 0, 0, 0, 0, 0);
  70. return ERROR;
  71. }
  72.     /* optional dcache */
  73.     cbio = dcacheDevCreate ((CBIO_DEV_ID) pBulkBlkDev, 0, 0, "usbBulkCache");
  74.     if( NULL == cbio )
  75.         {
  76.         /* insufficient memory, will avoid the cache */
  77.         printf ("WARNING: Failed to create disk cachen");
  78.         }
  79.     masterCbio = dpartDevCreate (cbio, 1, usrFdiskPartRead);
  80.     if( NULL == masterCbio )
  81.         {
  82.         printf ("Error creating partition managern");
  83.         return ERROR;
  84.         }
  85.     /* Mount the drive to DOSFS */
  86.     if (dosFsDevCreate (BULK_DRIVE_NAME, 
  87. dpartPartGet(masterCbio, 0), 
  88. 0x20,
  89. NONE) 
  90. == ERROR)
  91.             {
  92.             printf ("Error creating dosFs devicen");
  93.             return ERROR;
  94.             }
  95.     return OK;
  96.     }
  97. /*************************************************************************
  98. *
  99. * bulkAttachCallback - user attach callback for USB BULK class driver.
  100. *
  101. * RETURNS: Nothing
  102. */
  103. LOCAL VOID bulkAttachCallback
  104.     (
  105.     pVOID arg,     /* caller-defined argument */
  106.     USBD_NODE_ID nodeId,     /* pointer to BULK Device */
  107.     UINT16 attachCode     /* attach code */
  108.     )
  109.     {
  110.     usbQueuePut (bulkCallbackQueue,
  111.  0, /* msg */
  112.  attachCode, /* wParam */
  113.  (UINT32) nodeId, /* lParam */
  114.  5000);
  115.     }
  116. /***************************************************************************
  117. *
  118. * bulkClientThread- Handle control of drives being plugged / unplugged
  119. *
  120. * This function controls what happens when a new drive gets plugged in
  121. * or when an existing drive gets removed.
  122. *
  123. * RETURNS: Nothing
  124. */
  125.  
  126. LOCAL VOID bulkClientThread(void)
  127.     {
  128. #if 0
  129.     DEV_HDR *hdr;
  130. #endif
  131.     while (1)
  132.         {
  133. /* 
  134.  * the queue parameters will be:
  135.  * lParam = nodeId
  136.  * wParam = attach code
  137.  */
  138.         usbQueueGet (bulkCallbackQueue, &bulkDeviceStatus, OSS_BLOCK);
  139. /* If attached. Only one device is supported at a time */
  140. if (bulkDeviceStatus.wParam == USB_BULK_ATTACH)
  141.     {
  142.     bulkNodeId = (USBD_NODE_ID) bulkDeviceStatus.lParam;
  143.     /* Lock the device for protection */
  144.     if (usbBulkDevLock (bulkNodeId) != OK)
  145. printf ("usbBulkDevLock() returned ERRORn");
  146.     /* Mount the drive to the DOS file system */
  147.     if (bulkMountDrive(bulkNodeId) != OK)
  148. printf ("bulkMountDrive () returned ERRORn");
  149.             printf ("Bulk Device Installed as %sn", BULK_DRIVE_NAME);
  150.     }
  151. /* Device was removed */
  152. else if (bulkDeviceStatus.wParam == USB_BULK_REMOVE)
  153.     {
  154.     bulkNodeId = (USBD_NODE_ID) bulkDeviceStatus.lParam;
  155.     /* Remove the dosFs handles if the device is not being used */
  156. #if 0
  157. /*
  158.  * This is the ideal way to handle this, but
  159.  * iosDevDelete () is not supported on block
  160.  * devices.
  161.  */
  162.             if ( (hdr = iosDevFind (BULK_DRIVE_NAME, NULL)) != NULL )
  163.                 iosDevDelete (hdr);
  164. #endif
  165.     /* Unlock the BULK device structure, so that it gets destroyed */
  166.     if (usbBulkDevUnlock (bulkNodeId) != OK)
  167. {
  168. printf ("usbBulkDevUnlock() returned ERRORn");
  169. return;
  170. }
  171.             printf ("%s removed and uninstalled from FSn", BULK_DRIVE_NAME);
  172.     /* Mark bulk node structure as dead */
  173.     bulkNodeId = NULL;
  174.     }
  175. }
  176.     }
  177. /*************************************************************************
  178. *
  179. * usrUsbBulkDevInit - initializes USB BULK Mass storage driver.
  180. *
  181. * This function initializes the BULK driver and registers a CBI - BULK 
  182. * drive with the USBD.  In addition, it also spawns a task to handle 
  183. * plugging / unplugging activity.
  184. *
  185. * RETURNS: Nothing
  186. */
  187.  
  188. void usrUsbBulkDevInit (void)
  189.  
  190.     {
  191.     int taskId;
  192.     /* Initialize the BULK class driver */
  193.  
  194.     if (usbBulkDevInit () == OK)
  195. logMsg ("usbBulkDevInit() returned OKn", 0, 0, 0, 0, 0, 0);
  196.     else
  197. logMsg ("usbBulkDevInit() returned ERRORn", 0, 0, 0, 0, 0, 0);
  198.  
  199.     /*  This queue is used to pass status parameters to the task spawned below */
  200.     if (usbQueueCreate (128, &bulkCallbackQueue)!=OK)
  201.         {
  202. logMsg ("callback queue creation errorn ", 0, 0, 0, 0, 0, 0);
  203. return;
  204. }
  205.     /* Spawn a task to manage drive removal and insertion */
  206.     if((taskId = taskSpawn ("tBulkClnt", 
  207.     5, 
  208.     0,
  209.     20000, 
  210.     (FUNCPTR) bulkClientThread, 
  211.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )) ==ERROR)
  212. {
  213. logMsg (" TaskSpawn Error...!n", 0, 0, 0, 0, 0, 0);
  214. return;
  215. }
  216.   
  217.     /* Register for dynamic attach callback */
  218.  
  219.     if (usbBulkDynamicAttachRegister (bulkAttachCallback, (pVOID)NULL) != OK)
  220. logMsg ("usbBulkDynamicAttachRegister() returned ERRORn", 0, 0, 0, 0, 0, 0);
  221.     }