From b5763568c9a1085b99154cf5fe1ec4137d08044d Mon Sep 17 00:00:00 2001 From: "bernard.xiong@gmail.com" Date: Wed, 14 Jul 2010 23:31:16 +0000 Subject: [PATCH] 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 --- components/dfs/filesystems/elmfat/dfs_elm.c | 44 +++++++++++++++-- components/dfs/filesystems/elmfat/ff.c | 4 +- components/dfs/filesystems/elmfat/ff.h | 2 +- components/dfs/filesystems/elmfat/ffconf.h | 2 +- components/net/lwip/src/netif/ethernetif.c | 55 +++++++++++++++++++-- 5 files changed, 95 insertions(+), 12 deletions(-) diff --git a/components/dfs/filesystems/elmfat/dfs_elm.c b/components/dfs/filesystems/elmfat/dfs_elm.c index 3112d30bc4..f90298e8cc 100644 --- a/components/dfs/filesystems/elmfat/dfs_elm.c +++ b/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; } diff --git a/components/dfs/filesystems/elmfat/ff.c b/components/dfs/filesystems/elmfat/ff.c index e2a75dad59..fc6b73bc76 100644 --- a/components/dfs/filesystems/elmfat/ff.c +++ b/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 }; diff --git a/components/dfs/filesystems/elmfat/ff.h b/components/dfs/filesystems/elmfat/ff.h index 042eb8c894..499f3cad28 100644 --- a/components/dfs/filesystems/elmfat/ff.h +++ b/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 */ diff --git a/components/dfs/filesystems/elmfat/ffconf.h b/components/dfs/filesystems/elmfat/ffconf.h index 7227b81c2e..cafcc4d1fc 100644 --- a/components/dfs/filesystems/elmfat/ffconf.h +++ b/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 */ diff --git a/components/net/lwip/src/netif/ethernetif.c b/components/net/lwip/src/netif/ethernetif.c index f8d449856f..a23c89c3a7 100644 --- a/components/net/lwip/src/netif/ethernetif.c +++ b/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 + * + */ + #include #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(ð_tx_thread_mb, (rt_uint32_t) &msg); - - /* waiting for ack */ - rt_sem_take(&(enetif->tx_ack), RT_WAITING_FOREVER); + if (rt_mb_send(ð_tx_thread_mb, (rt_uint32_t) &msg) == RT_EOK) + { + /* waiting for ack */ + rt_sem_take(&(enetif->tx_ack), RT_WAITING_FOREVER); + } return ERR_OK; }