浏览代码

the unit of read/write offset and buffer size is changed to the block size in block device driver read/write interface.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@793 bbd45198-f89e-11dd-88c7-29a3b14d5316
bernard.xiong@gmail.com 15 年之前
父节点
当前提交
b5763568c9

+ 40 - 4
components/dfs/filesystems/elmfat/dfs_elm.c

@@ -41,6 +41,10 @@ static int elm_result_to_dfs(FRESULT result)
 		status = -DFS_STATUS_EROFS;
 		break;
 
+	case FR_MKFS_ABORTED:
+		status = -DFS_STATUS_EINVAL;
+		break;
+		
 	default:
 		status = -1;
 		break;
@@ -534,8 +538,8 @@ DRESULT disk_read (BYTE drv, BYTE *buff, DWORD sector, BYTE count)
 	rt_size_t result;
 	rt_device_t device = disk[drv];
 
-	result = rt_device_read(device, sector * 512, buff, count * 512);
-	if (result == count * 512)
+	result = rt_device_read(device, sector, buff, count);
+	if (result == count)
 	{
 		return RES_OK;
 	}
@@ -549,8 +553,8 @@ DRESULT disk_write (BYTE drv, const BYTE *buff, DWORD sector, BYTE count)
 	rt_size_t result;
 	rt_device_t device = disk[drv];
 
-	result = rt_device_write(device, sector * 512, buff, count * 512);
-	if (result == count * 512)
+	result = rt_device_write(device, sector, buff, count);
+	if (result == count)
 	{
 		return RES_OK;
 	}
@@ -561,6 +565,38 @@ DRESULT disk_write (BYTE drv, const BYTE *buff, DWORD sector, BYTE count)
 /* Miscellaneous Functions */
 DRESULT disk_ioctl (BYTE drv, BYTE ctrl, void *buff)
 {
+	rt_device_t device = disk[drv];
+
+	if (device == RT_NULL) return RES_ERROR;
+	
+	if (ctrl == GET_SECTOR_COUNT)
+	{
+		struct rt_device_blk_geometry geometry;
+
+		rt_memset(&geometry, 0, sizeof(geometry));
+		rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);
+
+		*(DWORD*)buff = geometry.sector_count;
+	}
+	else if (ctrl == GET_SECTOR_SIZE)
+	{
+		struct rt_device_blk_geometry geometry;
+
+		rt_memset(&geometry, 0, sizeof(geometry));
+		rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);
+
+		*(DWORD*)buff = geometry.bytes_per_sector;
+	}
+	else if (ctrl == GET_BLOCK_SIZE) /* Get erase block size in unit of sectors (DWORD) */
+	{
+		struct rt_device_blk_geometry geometry;
+
+		rt_memset(&geometry, 0, sizeof(geometry));
+		rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);
+
+		*(DWORD*)buff = geometry.block_size/geometry.bytes_per_sector;
+	}
+
 	return RES_OK;
 }
 

+ 2 - 2
components/dfs/filesystems/elmfat/ff.c

@@ -2772,7 +2772,7 @@ FRESULT f_forward (
 /* Create File System on the Drive                                       */
 /*-----------------------------------------------------------------------*/
 #define N_ROOTDIR	512			/* Multiple of 32 and <= 2048 */
-#define N_FATS		1			/* 1 or 2 */
+#define N_FATS		2			/* 1 or 2 */  //	my edit
 #define MAX_SECTOR	131072000UL	/* Maximum partition size */
 #define MIN_SECTOR	2000UL		/* Minimum partition size */
 
@@ -2780,7 +2780,7 @@ FRESULT f_forward (
 FRESULT f_mkfs (
 	BYTE drv,			/* Logical drive number */
 	BYTE partition,		/* Partitioning rule 0:FDISK, 1:SFD */
-	WORD allocsize		/* Allocation unit size [bytes] */
+	DWORD allocsize		/* Allocation unit size [bytes] */
 )
 {
 	static const DWORD sstbl[] = { 2048000, 1024000, 512000, 256000, 128000, 64000, 32000, 16000, 8000, 4000,   0 };

+ 1 - 1
components/dfs/filesystems/elmfat/ff.h

@@ -434,7 +434,7 @@ FRESULT f_chmod (const XCHAR*, BYTE, BYTE);			/* Change attriburte of the file/d
 FRESULT f_utime (const XCHAR*, const FILINFO*);		/* Change timestamp of the file/dir */
 FRESULT f_rename (const XCHAR*, const XCHAR*);		/* Rename/Move a file or directory */
 FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*);	/* Forward data to the stream */
-FRESULT f_mkfs (BYTE, BYTE, WORD);					/* Create a file system on the drive */
+FRESULT f_mkfs (BYTE, BYTE, DWORD);					/* Create a file system on the drive */
 FRESULT f_chdir (const XCHAR*);						/* Change current directory */
 FRESULT f_chdrive (BYTE);							/* Change current drive */
 

+ 1 - 1
components/dfs/filesystems/elmfat/ffconf.h

@@ -39,7 +39,7 @@
 /* To enable string functions, set _USE_STRFUNC to 1 or 2. */
 
 
-#define	_USE_MKFS	0		/* 0 or 1 */
+#define	_USE_MKFS	1		/* 0 or 1 */
 /* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */
 
 

+ 51 - 4
components/net/lwip/src/netif/ethernetif.c

@@ -1,3 +1,49 @@
+/*
+ * File      : ethernetif.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2010-07-07     Bernard      fix send mail to mailbox issue.
+ */
+
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved. 
+ * 
+ * Redistribution and use in source and binary forms, with or without modification, 
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ * 
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ */
+
 #include <rtthread.h>
 
 #include "lwip/debug.h"
@@ -100,10 +146,11 @@ err_t ethernetif_linkoutput(struct netif *netif, struct pbuf *p)
 	/* send a message to eth tx thread */
 	msg.netif = netif;
 	msg.buf   = p;
-	rt_mb_send(&eth_tx_thread_mb, (rt_uint32_t) &msg);
-
-	/* waiting for ack */
-	rt_sem_take(&(enetif->tx_ack), RT_WAITING_FOREVER);
+	if (rt_mb_send(&eth_tx_thread_mb, (rt_uint32_t) &msg) == RT_EOK)
+	{
+		/* waiting for ack */
+		rt_sem_take(&(enetif->tx_ack), RT_WAITING_FOREVER);
+	}
 
 	return ERR_OK;
 }