⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.c

📁 S3c2410 usb host Firmware....
💻 C
字号:

#include "fat.h"
#include "part.h"
/*
 * Convert a string to lowercase.
 */
static void downcase(char *str)
{
    while (*str != '\0') 
    {
        TOLOWER(*str);
        str++;
    }
}


static  block_dev_desc_t *cur_dev = NULL;
static unsigned long part_offset = 0;
static int cur_part = 1;
#define DOS_PART_TBL_OFFSET	    0x1be
#define DOS_PART_MAGIC_OFFSET	    0x1fe
#define DOS_FS_TYPE_OFFSET	           0x36
int disk_read (__u32 startblock, __u32 getsize, __u8 * bufptr)
{
    startblock += part_offset;
    if (cur_dev == NULL)
    return -1;
    if (cur_dev->block_read) 
    {
        //return cur_dev->block_read (cur_dev->dev, startblock, getsize, (unsigned long *)bufptr);
        //add by wqh for debug
        int i,ret;
        ret=cur_dev->block_read (cur_dev->dev, startblock, getsize, (unsigned long *)bufptr);
        //s_UartPrint("block_read(%d+%d %d)\n",startblock,part_offset,getsize);
        //for(i=0;i<getsize*512;i++)
        //	s_UartPrint("[%05d] : %02x\n",i,bufptr[i]);
        return ret;
    }
    return -1;
}


int
fat_register_device(block_dev_desc_t *dev_desc, int part_no)
{
    unsigned char buffer[SECTOR_SIZE];
    if (!dev_desc->block_read)
    return -1;
    cur_dev=dev_desc;
    /* check if we have a MBR (on floppies we have only a PBR) */
    if (dev_desc->block_read (dev_desc->dev, 0, 1, (ulong *) buffer) != 1) 
    {
        FAT_DPRINT("** Can't read from device %d **\n", dev_desc->dev);
        return -1;
    }
    //add by wqh for debug
    int i;
    FAT_DPRINT("** 11111:block_read (0, 1) **\n");
    for(i=0;i<SECTOR_SIZE;i++) FAT_DPRINT("[%03d]:%02x \n", i,buffer[i]);
    if (buffer[DOS_PART_MAGIC_OFFSET] != 0x55 ||
    buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) 
    {
        /* no signature found */
        return -1;
    }
    if(!strncmp((char *)&buffer[DOS_FS_TYPE_OFFSET],"FAT",3)) 
    {
        /* ok, we assume we are on a PBR only */
        cur_part = 1;
        part_offset=0;
        FAT_DPRINT("**1-partoffset=%d cur_part=%d**\n",part_offset,cur_part);
    }
    else 
    {
        disk_partition_t info;
        if(!get_partition_info(dev_desc, part_no, &info)) 
        {
            part_offset = info.start;
            cur_part = part_no;
            FAT_DPRINT("**2-partoffset=%d cur_part=%d**\n",part_offset,cur_part);
        }
        else 
        {
            FAT_DPRINT("** Partition %d not valid on device %d **\n",part_no,dev_desc->dev);
            return -1;
        }
    }
    return 0;
}


/*
 * Get the first occurence of a directory delimiter ('/' or '\') in a string.
 * Return index into string if found, -1 otherwise.
 */
static int
dirdelim(char *str)
{
    char *start = str;
    while (*str != '\0') 
    {
        if (ISDIRDELIM(*str)) return str - start;
        str++;
    }
    return -1;
}


/*
 * Match volume_info fs_type strings.
 * Return 0 on match, -1 otherwise.
 */
static int
compare_sign(char *str1, char *str2)
{
    char *end = str1+SIGNLEN;
    while (str1 != end) 
    {
        if (*str1 != *str2) 
        {
            return -1;
        }
        str1++;
        str2++;
    }
    return 0;
}


/*
 * Extract zero terminated short name from a directory entry.
 */
static void get_name (dir_entry *dirent, char *s_name)
{
    char *ptr;
    memcpy (s_name, dirent->name, 8);
    s_name[8] = '\0';
    ptr = s_name;
    while (*ptr && *ptr != ' ')
    ptr++;
    if (dirent->ext[0] && dirent->ext[0] != ' ') 
    {
        *ptr = '.';
        ptr++;
        memcpy (ptr, dirent->ext, 3);
        ptr[3] = '\0';
        while (*ptr && *ptr != ' ')
        ptr++;
    }
    *ptr = '\0';
    if (*s_name == DELETED_FLAG)
    *s_name = '\0';
    else if (*s_name == aRING)
    *s_name = '

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -