int mfs_unmount(uint8_t device_no) { if (g_mass_device[device_no].mount >= 'A' && g_mass_device[device_no].mount <= 'Z') { /* Remove the file system */ usb_filesystem_uninstall(g_mass_device[device_no].usb_mfs_handle); /* Mark file system as unmounted */ g_fs_mountp &= ~(1 << (g_mass_device[device_no].mount - 'A')); return 0; } return -1; }
void USB_task(uint_32 param) { _usb_host_handle host_handle; USB_STATUS error; pointer usb_fs_handle = NULL; #if DEMO_USE_POOLS && defined(DEMO_MFS_POOL_ADDR) && defined(DEMO_MFS_POOL_SIZE) _MFS_pool_id = _mem_create_pool((pointer)DEMO_MFS_POOL_ADDR, DEMO_MFS_POOL_SIZE); #endif _lwsem_create(&USB_Stick,0); _lwevent_create(&USB_Event,0); USB_lock(); _int_install_unexpected_isr(); if (MQX_OK != _usb_host_driver_install(USBCFG_DEFAULT_HOST_CONTROLLER)) { printf("\n Driver installation failed"); _task_block(); } error = _usb_host_init(USBCFG_DEFAULT_HOST_CONTROLLER, &host_handle); if (error == USB_OK) { error = _usb_host_driver_info_register(host_handle, (pointer)ClassDriverInfoTable); if (error == USB_OK) { error = _usb_host_register_service(host_handle, USB_SERVICE_HOST_RESUME,NULL); } } USB_unlock(); if (error == USB_OK) { for ( ; ; ) { // Wait for insertion or removal event _lwevent_wait_ticks(&USB_Event,USB_EVENT,FALSE,0); if ( device.STATE== USB_DEVICE_ATTACHED) { if (device.SUPPORTED) { error = _usb_hostdev_select_interface(device.DEV_HANDLE, device.INTF_HANDLE, (pointer)&device.CLASS_INTF); if(error == USB_OK) { device.STATE = USB_DEVICE_INTERFACED; USB_handle = (pointer)&device.CLASS_INTF; // Install the file system usb_fs_handle = usb_filesystem_install( USB_handle, "USB:", "PM_C1:", "c:" ); if (usb_fs_handle) { // signal the application _lwsem_post(&USB_Stick); } } } else { device.STATE = USB_DEVICE_INTERFACED; } } else if ( device.STATE==USB_DEVICE_DETACHED) { _lwsem_wait(&USB_Stick); // remove the file system usb_filesystem_uninstall(usb_fs_handle); } // clear the event _lwevent_clear(&USB_Event,USB_EVENT); } } }
pointer usb_filesystem_install( pointer usb_handle, char_ptr block_device_name, char_ptr partition_manager_name, char_ptr file_system_name ) { uint_32 partition_number; uchar_ptr dev_info; int_32 error_code; uint_32 mfs_status; USB_FILESYSTEM_STRUCT_PTR usb_fs_ptr; usb_fs_ptr = _mem_alloc_system_zero(sizeof(USB_FILESYSTEM_STRUCT)); if (usb_fs_ptr==NULL) { return NULL; } _io_usb_mfs_install(block_device_name, 0, (pointer)usb_handle); usb_fs_ptr->DEV_NAME = block_device_name; /* Open the USB mass storage device */ _time_delay(500); usb_fs_ptr->DEV_FD_PTR = fopen(block_device_name, (char_ptr) 0); if (usb_fs_ptr->DEV_FD_PTR == NULL) { printf("\nUnable to open USB disk"); usb_filesystem_uninstall(usb_fs_ptr); return NULL; } _io_ioctl(usb_fs_ptr->DEV_FD_PTR, IO_IOCTL_SET_BLOCK_MODE, NULL); /* get the vendor information and display it */ printf("\n************************************************************************"); _io_ioctl(usb_fs_ptr->DEV_FD_PTR, IO_IOCTL_GET_VENDOR_INFO, &dev_info); printf("\nVendor Information: %-1.8s Mass Storage Device",dev_info); _io_ioctl(usb_fs_ptr->DEV_FD_PTR, IO_IOCTL_GET_PRODUCT_ID, &dev_info); printf("\nProduct Identification: %-1.16s",dev_info); _io_ioctl(usb_fs_ptr->DEV_FD_PTR, IO_IOCTL_GET_PRODUCT_REV, &dev_info); printf("\nProduct Revision Level: %-1.4s",dev_info); printf("\n************************************************************************"); /* Try Installing a the partition manager */ error_code = _io_part_mgr_install(usb_fs_ptr->DEV_FD_PTR, partition_manager_name, 0); if (error_code != MFS_NO_ERROR) { printf("\nError while initializing (%s)", MFS_Error_text((uint_32)error_code)); usb_filesystem_uninstall(usb_fs_ptr); return NULL; } usb_fs_ptr->PM_NAME = partition_manager_name; usb_fs_ptr->PM_FD_PTR = fopen(partition_manager_name, NULL); if (usb_fs_ptr->PM_FD_PTR == NULL) { error_code = ferror(usb_fs_ptr->PM_FD_PTR); printf("\nError while opening partition (%s)", MFS_Error_text((uint_32)error_code)); usb_filesystem_uninstall(usb_fs_ptr); return NULL; } printf("\n--->USB Mass storage device opened"); partition_number = 1; error_code = _io_ioctl(usb_fs_ptr->PM_FD_PTR, IO_IOCTL_VAL_PART, &partition_number); if (error_code == PMGR_INVALID_PARTITION) { printf("\n--->No partition available on this device"); /* uninitialize */ fclose(usb_fs_ptr->PM_FD_PTR); usb_fs_ptr->PM_FD_PTR = NULL; _io_part_mgr_uninstall(usb_fs_ptr->PM_NAME); usb_fs_ptr->PM_NAME = NULL; /* install MFS without partition */ mfs_status = _io_mfs_install(usb_fs_ptr->DEV_FD_PTR, file_system_name, 0); } else { printf("\n--->Partition Manager installed"); /* Install MFS on the partition #1 */ mfs_status = _io_mfs_install(usb_fs_ptr->PM_FD_PTR, file_system_name, partition_number); } if (mfs_status != MFS_NO_ERROR) { printf("\nError initializing MFS (%s)", MFS_Error_text((uint_32)mfs_status)); /* uninitialize and exit */ usb_filesystem_uninstall(usb_fs_ptr); return NULL; } printf("\n--->File System installed"); usb_fs_ptr->FS_NAME = file_system_name; usb_fs_ptr->FS_FD_PTR = fopen(file_system_name, 0); if (usb_fs_ptr->FS_FD_PTR==NULL) { usb_filesystem_uninstall(usb_fs_ptr); return NULL; } printf("\n--->File System opened"); return (pointer) usb_fs_ptr; }
void USB_task(uint_32 param) { _usb_host_handle host_handle; USB_STATUS error; pointer usb_fs_handle = NULL; usb_msg_t msg; /* Store mounting point used. A: is the first one, bit #0 assigned, Z: is the last one, bit #25 assigned */ uint_32 fs_mountp = 0; #if DEMOCFG_USE_POOLS && defined(DEMOCFG_MFS_POOL_ADDR) && defined(DEMOCFG_MFS_POOL_SIZE) _MFS_pool_id = _mem_create_pool((pointer)DEMOCFG_MFS_POOL_ADDR, DEMOCFG_MFS_POOL_SIZE); #endif /* This event will inform other tasks that the filesystem on USB was successfully installed */ _lwsem_create(&USB_Stick, 0); if (MQX_OK != _lwmsgq_init(usb_taskq, 20, USB_TASKQ_GRANM)) { // lwmsgq_init failed _task_block(); } USB_lock(); _int_install_unexpected_isr(); if (MQX_OK != _usb_host_driver_install(USBCFG_DEFAULT_HOST_CONTROLLER)) { printf("\n Driver installation failed"); _task_block(); } error = _usb_host_init(USBCFG_DEFAULT_HOST_CONTROLLER, &host_handle); if (error == USB_OK) { error = _usb_host_driver_info_register(host_handle, (pointer)ClassDriverInfoTable); if (error == USB_OK) { error = _usb_host_register_service(host_handle, USB_SERVICE_HOST_RESUME,NULL); } } USB_unlock(); if (error != USB_OK) { _task_block(); } for (;;) { /* Wait for event sent as a message */ _lwmsgq_receive(&usb_taskq, (_mqx_max_type *) &msg, LWMSGQ_RECEIVE_BLOCK_ON_EMPTY, 0, 0); //if (device.STATE == USB_DEVICE_ATTACHED) { if (msg.body == USB_EVENT_ATTACH) { /* This event is not so important, because it does not inform about successfull USB stack enumeration */ } else if (msg.body == USB_EVENT_INTF && fs_mountp != 0x3FFC) { /* if mountpoints c: to z: are already used */ // Install the file system, use device->ccs as a handle usb_fs_handle = usb_filesystem_install( (pointer) msg.ccs, "USB:", "PM_C1:", "c:"); if (usb_fs_handle) { DEVICE_STRUCT_PTR dsp = (DEVICE_STRUCT_PTR) msg.ccs; dsp->mount = 'c'; // Mark file system as mounted fs_mountp |= 1 << (dsp->mount - 'a'); // Unlock the USB_Stick = signal to the application as available _lwsem_post(&USB_Stick); } } else if (msg.body == USB_EVENT_DETACH) { DEVICE_STRUCT_PTR dsp = (DEVICE_STRUCT_PTR) msg.ccs; if (dsp->mount >= 'a' && dsp->mount <= 'z') { // Lock the USB_Stick = mark as unavailable _lwsem_wait(&USB_Stick); // Remove the file system usb_filesystem_uninstall(usb_fs_handle); // Mark file system as unmounted fs_mountp &= ~(1 << (dsp->mount - 'a')); } /* Here, the device finishes its lifetime */ _mem_free(dsp); } } }