diff options
| author | hathach <[email protected]> | 2013-10-02 13:32:39 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2013-10-02 13:32:39 +0700 |
| commit | 1263dbb1221fc550737e560c415857829e8ecfd1 (patch) | |
| tree | d2a5bfe2a942cd8295e3037108526d6c899e470d | |
| parent | 5c8389b9ae88d04b7d45330ad8b79ce0352b547b (diff) | |
enhacne msc demo, update IAR project file
| -rw-r--r-- | demos/host/host_os_none/host_os_none.ewp | 16 | ||||
| -rw-r--r-- | demos/host/src/cli.c | 2 | ||||
| -rw-r--r-- | demos/host/src/msc_app.c | 20 | ||||
| -rw-r--r-- | tinyusb/class/msc_host.c | 16 | ||||
| -rw-r--r-- | tinyusb/class/msc_host.h | 2 | ||||
| -rw-r--r-- | vendor/fatfs/diskio.c | 15 | ||||
| -rw-r--r-- | vendor/fatfs/diskio.h | 5 | ||||
| -rw-r--r-- | vendor/fatfs/ff.c | 5 | ||||
| -rw-r--r-- | vendor/fatfs/ff.h | 1 | ||||
| -rw-r--r-- | vendor/fatfs/integer.h | 4 |
10 files changed, 62 insertions, 24 deletions
diff --git a/demos/host/host_os_none/host_os_none.ewp b/demos/host/host_os_none/host_os_none.ewp index 31e345cc5..f47f439c6 100644 --- a/demos/host/host_os_none/host_os_none.ewp +++ b/demos/host/host_os_none/host_os_none.ewp @@ -300,6 +300,7 @@ <state>$PROJ_DIR$\..\..\bsp\lpc43xx\CMSIS_LPC43xx_DriverLib\inc</state> <state>$PROJ_DIR$\..\..\bsp</state> <state>$PROJ_DIR$\..\..\..\tinyusb</state> + <state>$PROJ_DIR$\..\..\..\vendor\fatfs</state> </option> <option> <name>CCStdIncCheck</name> @@ -930,6 +931,9 @@ <name>$PROJ_DIR$\..\src\cdc_serial_app.c</name> </file> <file> + <name>$PROJ_DIR$\..\src\cli.c</name> + </file> + <file> <name>$PROJ_DIR$\..\src\keyboard_app.c</name> </file> <file> @@ -994,6 +998,18 @@ </group> </group> <group> + <name>fatfs</name> + <file> + <name>$PROJ_DIR$\..\..\..\vendor\fatfs\ccsbcs.c</name> + </file> + <file> + <name>$PROJ_DIR$\..\..\..\vendor\fatfs\diskio.c</name> + </file> + <file> + <name>$PROJ_DIR$\..\..\..\vendor\fatfs\ff.c</name> + </file> + </group> + <group> <name>tinyusb</name> <group> <name>class</name> diff --git a/demos/host/src/cli.c b/demos/host/src/cli.c index ea83d7bdf..d507cc606 100644 --- a/demos/host/src/cli.c +++ b/demos/host/src/cli.c @@ -296,6 +296,8 @@ cli_error_t cli_cmd_list(char * p_para) putchar('\n'); } } + +// (void) f_closedir(&target_dir); } else { diff --git a/demos/host/src/msc_app.c b/demos/host/src/msc_app.c index 8c1ff0dbe..2591e61a0 100644 --- a/demos/host/src/msc_app.c +++ b/demos/host/src/msc_app.c @@ -84,10 +84,8 @@ void tusbh_msc_mounted_cb(uint8_t dev_addr) printf("LBA 0-0x%X Block Size: %d\n", last_lba, block_size); //------------- file system (only 1 LUN support) -------------// - // TODO MSC refractor this hack - // DSTATUS stat = disk_initialize(0); uint8_t phy_disk = dev_addr-1; - disk_state[phy_disk] = 0; + disk_initialize(phy_disk); if ( disk_is_ready(phy_disk) ) { @@ -118,7 +116,19 @@ void tusbh_msc_unmounted_cb(uint8_t dev_addr) uint8_t phy_disk = dev_addr-1; f_mount(phy_disk, NULL); // unmount disk - disk_state[phy_disk] = STA_NOINIT; + disk_deinitialize(phy_disk); + + if ( phy_disk == f_get_current_drive() ) + { // active drive is unplugged --> change to other drive + for(uint8_t i=0; i<TUSB_CFG_HOST_DEVICE_MAX; i++) + { + if ( disk_is_ready(i) ) + { + f_chdrive(i); + cli_init(); // refractor, rename + } + } + } } void tusbh_msc_isr(uint8_t dev_addr, tusb_event_t event, uint32_t xferred_bytes) @@ -131,7 +141,7 @@ void tusbh_msc_isr(uint8_t dev_addr, tusb_event_t event, uint32_t xferred_bytes) //--------------------------------------------------------------------+ void msc_app_init(void) { - + diskio_init(); } //------------- main task -------------// diff --git a/tinyusb/class/msc_host.c b/tinyusb/class/msc_host.c index df41a5998..1b3e62dd4 100644 --- a/tinyusb/class/msc_host.c +++ b/tinyusb/class/msc_host.c @@ -105,7 +105,7 @@ tusb_error_t tusbh_msc_get_capacity(uint8_t dev_addr, uint32_t* p_last_lba, uint (*p_last_lba) = msch_data[dev_addr-1].last_lba; (*p_block_size) = (uint32_t) msch_data[dev_addr-1].block_size; - + return TUSB_ERROR_NONE; } @@ -127,16 +127,16 @@ static tusb_error_t msch_command_xfer(msch_interface_t * p_msch, void* p_buffer) { // there is data phase if (p_msch->cbw.flags & TUSB_DIR_DEV_TO_HOST_MASK) { - ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_out, &p_msch->cbw, sizeof(msc_cmd_block_wrapper_t), false) ); + ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_out, (uint8_t*) &p_msch->cbw, sizeof(msc_cmd_block_wrapper_t), false) ); ASSERT_STATUS( hcd_pipe_queue_xfer(p_msch->bulk_in , p_buffer, p_msch->cbw.xfer_bytes) ); }else { - ASSERT_STATUS( hcd_pipe_queue_xfer(p_msch->bulk_out, &p_msch->cbw, sizeof(msc_cmd_block_wrapper_t)) ); + ASSERT_STATUS( hcd_pipe_queue_xfer(p_msch->bulk_out, (uint8_t*) &p_msch->cbw, sizeof(msc_cmd_block_wrapper_t)) ); ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_out , p_buffer, p_msch->cbw.xfer_bytes, false) ); } } - ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_in , &p_msch->csw, sizeof(msc_cmd_status_wrapper_t), true) ); + ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_in , (uint8_t*) &p_msch->csw, sizeof(msc_cmd_status_wrapper_t), true) ); return TUSB_ERROR_NONE; } @@ -234,8 +234,8 @@ tusb_error_t tusbh_msc_test_unit_ready(uint8_t dev_addr, uint8_t lun, msc_cmd_s memcpy(p_msch->cbw.command, &cmd_test_unit_ready, p_msch->cbw.cmd_len); // TODO MSCH refractor test uinit ready - ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_out, &p_msch->cbw, sizeof(msc_cmd_block_wrapper_t), false) ); - ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_in , p_csw, sizeof(msc_cmd_status_wrapper_t), true) ); + ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_out, (uint8_t*) &p_msch->cbw, sizeof(msc_cmd_block_wrapper_t), false) ); + ASSERT_STATUS( hcd_pipe_xfer(p_msch->bulk_in , (uint8_t*) p_csw, sizeof(msc_cmd_status_wrapper_t), true) ); return TUSB_ERROR_NONE; } @@ -266,7 +266,7 @@ tusb_error_t tusbh_msc_read10(uint8_t dev_addr, uint8_t lun, void * p_buffer, u return TUSB_ERROR_NONE; } -tusb_error_t tusbh_msc_write10(uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint16_t block_count) +tusb_error_t tusbh_msc_write10(uint8_t dev_addr, uint8_t lun, void const * p_buffer, uint32_t lba, uint16_t block_count) { msch_interface_t* p_msch = &msch_data[dev_addr-1]; @@ -287,7 +287,7 @@ tusb_error_t tusbh_msc_write10(uint8_t dev_addr, uint8_t lun, void * p_buffer, u memcpy(p_msch->cbw.command, &cmd_write10, p_msch->cbw.cmd_len); - ASSERT_STATUS ( msch_command_xfer(p_msch, p_buffer)); + ASSERT_STATUS ( msch_command_xfer(p_msch, (void*) p_buffer)); return TUSB_ERROR_NONE; } diff --git a/tinyusb/class/msc_host.h b/tinyusb/class/msc_host.h index 4dbb3ef6c..41ff7d6b5 100644 --- a/tinyusb/class/msc_host.h +++ b/tinyusb/class/msc_host.h @@ -67,7 +67,7 @@ uint8_t const* tusbh_msc_get_product_name(uint8_t dev_addr); tusb_error_t tusbh_msc_get_capacity(uint8_t dev_addr, uint32_t* p_last_lba, uint32_t* p_block_size); tusb_error_t tusbh_msc_read10 (uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint16_t block_count) ATTR_WARN_UNUSED_RESULT; -tusb_error_t tusbh_msc_write10(uint8_t dev_addr, uint8_t lun, void * p_buffer, uint32_t lba, uint16_t block_count) ATTR_WARN_UNUSED_RESULT; +tusb_error_t tusbh_msc_write10(uint8_t dev_addr, uint8_t lun, void const * p_buffer, uint32_t lba, uint16_t block_count) ATTR_WARN_UNUSED_RESULT; tusb_error_t tusbh_msc_request_sense(uint8_t dev_addr, uint8_t lun, uint8_t *p_data) ATTR_WARN_UNUSED_RESULT; tusb_error_t tusbh_msc_test_unit_ready(uint8_t dev_addr, uint8_t lun, msc_cmd_status_wrapper_t * p_csw) ATTR_WARN_UNUSED_RESULT; // TODO to be refractor diff --git a/vendor/fatfs/diskio.c b/vendor/fatfs/diskio.c index 55a1e5f24..70010d849 100644 --- a/vendor/fatfs/diskio.c +++ b/vendor/fatfs/diskio.c @@ -48,7 +48,7 @@ // MACRO CONSTANT TYPEDEF //--------------------------------------------------------------------+ // TODO change it to portable init -volatile DSTATUS disk_state[TUSB_CFG_HOST_DEVICE_MAX] = { [0 ... TUSB_CFG_HOST_DEVICE_MAX-1] = STA_NOINIT }; +static DSTATUS disk_state[TUSB_CFG_HOST_DEVICE_MAX]; //--------------------------------------------------------------------+ // INTERNAL OBJECT & FUNCTION DECLARATION @@ -71,12 +71,23 @@ static DRESULT wait_for_io_complete(uint8_t usb_addr) } +void diskio_init(void) +{ + memset(disk_state, STA_NOINIT, TUSB_CFG_HOST_DEVICE_MAX); +} + //pdrv Specifies the physical drive number. DSTATUS disk_initialize ( BYTE pdrv ) { + disk_state[pdrv] &= (~STA_NOINIT); // clear NOINIT bit return disk_state[pdrv]; } +void disk_deinitialize ( BYTE pdrv ) +{ + disk_state[pdrv] |= STA_NOINIT; // set NOINIT bit +} + DSTATUS disk_status (BYTE pdrv) { return disk_state[pdrv]; @@ -134,7 +145,7 @@ DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff) static inline uint8_t month2number(char* p_ch) ATTR_PURE ATTR_ALWAYS_INLINE; static inline uint8_t month2number(char* p_ch) { - uint8_t const * const month_str[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + char const * const month_str[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; for(uint8_t i=0; i<12; i++) { diff --git a/vendor/fatfs/diskio.h b/vendor/fatfs/diskio.h index b6aa881fb..ca97e3403 100644 --- a/vendor/fatfs/diskio.h +++ b/vendor/fatfs/diskio.h @@ -18,8 +18,6 @@ extern "C" { /* Status of Disk Functions */ typedef BYTE DSTATUS; -extern volatile DSTATUS disk_state[TUSB_CFG_HOST_DEVICE_MAX]; - /* Results of Disk Functions */ typedef enum { RES_OK = 0, /* 0: Successful */ @@ -74,7 +72,8 @@ typedef enum { /*---------------------------------------*/ /* Prototypes for disk control functions */ - +void diskio_init(void); +void disk_deinitialize ( BYTE pdrv ); DSTATUS disk_initialize (BYTE pdrv); DSTATUS disk_status (BYTE pdrv); DRESULT disk_read (BYTE pdrv, BYTE*buff, DWORD sector, BYTE count); diff --git a/vendor/fatfs/ff.c b/vendor/fatfs/ff.c index 5e6a37e29..28aca2b59 100644 --- a/vendor/fatfs/ff.c +++ b/vendor/fatfs/ff.c @@ -2762,7 +2762,10 @@ FRESULT f_chdrive ( return FR_OK; } - +BYTE f_get_current_drive(void) +{ + return CurrVol; +} FRESULT f_chdir ( const TCHAR *path /* Pointer to the directory path */ diff --git a/vendor/fatfs/ff.h b/vendor/fatfs/ff.h index caaae8f2c..5c2a611ae 100644 --- a/vendor/fatfs/ff.h +++ b/vendor/fatfs/ff.h @@ -222,6 +222,7 @@ FRESULT f_chmod (const TCHAR* path, BYTE value, BYTE mask); /* Change attribut FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change times-tamp of the file/dir */ FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ FRESULT f_chdrive (BYTE drv); /* Change current drive */ +BYTE f_get_current_drive(void); FRESULT f_chdir (const TCHAR* path); /* Change current directory */ FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */ FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* sn); /* Get volume label */ diff --git a/vendor/fatfs/integer.h b/vendor/fatfs/integer.h index 37cda0e07..f34f56d92 100644 --- a/vendor/fatfs/integer.h +++ b/vendor/fatfs/integer.h @@ -17,10 +17,6 @@ typedef int INT; typedef unsigned int UINT; /* These types must be 8-bit integer */ -#ifndef LPC_TYPES_H // avoid typedef redefinition in lpc_types.h -typedef char CHAR; -#endif - typedef unsigned char UCHAR; typedef unsigned char BYTE; |
