📄 fat.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 + -