summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-10-02 13:32:39 +0700
committerhathach <[email protected]>2013-10-02 13:32:39 +0700
commit1263dbb1221fc550737e560c415857829e8ecfd1 (patch)
treed2a5bfe2a942cd8295e3037108526d6c899e470d
parent5c8389b9ae88d04b7d45330ad8b79ce0352b547b (diff)
enhacne msc demo, update IAR project file
-rw-r--r--demos/host/host_os_none/host_os_none.ewp16
-rw-r--r--demos/host/src/cli.c2
-rw-r--r--demos/host/src/msc_app.c20
-rw-r--r--tinyusb/class/msc_host.c16
-rw-r--r--tinyusb/class/msc_host.h2
-rw-r--r--vendor/fatfs/diskio.c15
-rw-r--r--vendor/fatfs/diskio.h5
-rw-r--r--vendor/fatfs/ff.c5
-rw-r--r--vendor/fatfs/ff.h1
-rw-r--r--vendor/fatfs/integer.h4
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;