romfile.c

来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 229 行

C
229
字号

#ifdef __BOOT__
#include "../../SysUpdate/ShareSrc/Kernel.h"
#else
#include "Kernel.h"
#endif

#include "romfile.h"

ROM_FILE_TABLE romFileTable[ROM_FILE_NUM];
ROM_HANDLE_TABLE romHandleTable[ROM_FILE_NUM * ROM_FILE_USER];

const ROM_FILE_AREA romFileArea[] = {{0x0, 0x5000},{0x5000, 0x37000}};

BOOL isRomFileHandle(INT fd)
{
    return (fd >= ROM_FILE_HANDLE);
}

INT32 RomSearchFileName(UINT8 *pFileName)
{
    UINT32 i;
    UINT32 area;
    
    area = 1;
    if(pFileName[0] == 'd' || pFileName[0] == 'D'){
        area = 0;
    }

    for(i = 0; i < ROM_FILE_NUM * ROM_FILE_USER; i++){
        if(memicmp(romFileTable[i].name, pFileName + 3, 12) == 0){
            if(romFileTable[i].area == area){
                return i;
            }
        }
    }
    return -1;
}

INT32 RomSearchFreeHandle(void)
{
    UINT32 i;
    for(i = 0; i < ROM_FILE_NUM * ROM_FILE_USER; i++){
        if(romHandleTable[i].state == HANDLE_CLOSED){
            return i;
        }
    }
    return -1;
}

BOOL romFileInitial(VOID)
{
    UINT8 *buf;
    UINT32 i, j;
    
    memset(&romFileTable[0], 0, sizeof(romFileTable));
    memset(&romHandleTable[0], 0, sizeof(romHandleTable));

	buf = (UINT8*)MemAlloc(((ROM_FILE_NUM + 1) * (12 + 4) / 512 + 1) * 512);
	if (!buf){
		return FALSE;
	}
	i = 0;

    // read rom file table from area "D"
    if(!FlashIoEx(0, romFileArea[0].firstSector, buf, ((ROM_FILE_NUM + 1) * (12 + 4) / 512 + 1), 1)){
        MemFree(buf);
        return FALSE;
    }

    //??? we should check it
    
    for(; i < ROM_FILE_NUM; i++){
        memcpy(romFileTable[i].name, buf + i * (12 + 4), 12);
        if(romFileTable[i].name[0] == 0xff){
            break;
        }
        romFileTable[i].area = 0;
        romFileTable[i].offset = *((UINT32 *)(buf + i * (12 + 4) + 12));
        romFileTable[i].length = *((UINT32 *)(buf + (i + 1) * (12 + 4) + 12)) - romFileTable[i].offset;
    }

    // read rom file table from area "C"
    if(!FlashIoEx(0, romFileArea[1].firstSector, buf, ((ROM_FILE_NUM + 1) * (12 + 4) / 512 + 1), 1)){
        MemFree(buf);
        return FALSE;
    }

    //??? we should check it
    
    for(j = i; j < ROM_FILE_NUM; j++){
        memcpy(romFileTable[j].name, buf + (j - i) * (12 + 4), 12);
        if(romFileTable[j].name[0] == 0xff){
            break;
        }
        romFileTable[j].area = 1;
        romFileTable[j].offset = *((UINT32 *)(buf + (j - i) * (12 + 4) + 12));
        romFileTable[j].length = *((UINT32 *)(buf + (j - i + 1) * (12 + 4) + 12)) - romFileTable[j].offset;
    }
    
    MemFree(buf);
	return TRUE;
}

INT romFileOpen(UINT8 *pFileName, UINT8 openMode)
{
    INT32 tableNum;
    INT32 handleNum;
    handleNum = RomSearchFreeHandle();
    if(handleNum == -1){
        return NUF_NO_MEMORY;
    }
    tableNum = RomSearchFileName(pFileName);
    if(tableNum == -1){
        return NUF_NOFILE;
    }
    romFileTable[tableNum].user ++;
    romHandleTable[handleNum].fileTable = &romFileTable[tableNum];
    romHandleTable[handleNum].current = 0;
    romHandleTable[handleNum].state = HANDLE_OPENED;
    return handleNum + ROM_FILE_HANDLE;
}

STATUS  romFileClose(INT fd)
{
    if(romHandleTable[fd - ROM_FILE_HANDLE].fileTable -> user == 0){
        return NUF_BADFILE;
    }
    if(romHandleTable[fd - ROM_FILE_HANDLE].state != HANDLE_OPENED){
        return NUF_BADFILE;
    }
    romHandleTable[fd - ROM_FILE_HANDLE].fileTable -> user --;
    romHandleTable[fd - ROM_FILE_HANDLE].state = HANDLE_CLOSED;
    return NU_SUCCESS;
}

INT32   romFileRead(INT fd, CHAR *buf, INT32 count)
{
    UINT32 current = romHandleTable[fd - ROM_FILE_HANDLE].current;
    UINT32 area = romHandleTable[fd - ROM_FILE_HANDLE].fileTable->area;
    UINT32 offset = romHandleTable[fd - ROM_FILE_HANDLE].fileTable->offset;
    UINT32 length = romHandleTable[fd - ROM_FILE_HANDLE].fileTable->length;
    UINT32 tempcount = count;
    UINT8  *tempbuf;
    
	tempbuf = (UINT8*)MemAlloc(512);
	if (!tempbuf){
		return NUF_NO_MEMORY;
	}

    // read the first page
    
    if((offset + current) % 512){
        if(!FlashIoEx(0, romFileArea[area].firstSector + (offset + current) / 512, tempbuf, 1, 1)){
            MemFree(tempbuf);
            return NUF_IO_ERROR;
        }
        if((offset + current) % 512 + tempcount <= 512){
            memcpy(buf, tempbuf + (offset + current) % 512, tempcount);
            romHandleTable[fd - ROM_FILE_HANDLE].current += tempcount;
            MemFree(tempbuf);
            return tempcount;
        }
        memcpy(buf, tempbuf + (offset + current) % 512, 512 - (offset + current) % 512);
        buf += (512 - (offset + current) % 512);
        tempcount -= (512 - (offset + current) % 512);
        current += (512 - (offset + current) % 512);
    }
    
    // read middle pages
    if(tempcount <= 512){
        if(!FlashIoEx(0, romFileArea[area].firstSector + (offset + current) / 512, tempbuf, 1, 1)){
            MemFree(tempbuf);
            return NUF_IO_ERROR;
        }
        memcpy(buf, tempbuf, tempcount);
        romHandleTable[fd - ROM_FILE_HANDLE].current += count;
        MemFree(tempbuf);
        return count;
    }
    if(!FlashIoEx(0, romFileArea[area].firstSector + (offset + current) / 512, buf, tempcount/512, 1)){
        MemFree(tempbuf);
        return NUF_IO_ERROR;
    }
    buf += (tempcount/512*512);
    current += (tempcount/512*512);
    tempcount -= (tempcount/512*512);
    
    // read the last page
    if(tempcount){
        if(!FlashIoEx(0, romFileArea[area].firstSector + (offset + current) / 512, tempbuf, 1, 1)){
            MemFree(tempbuf);
            return NUF_IO_ERROR;
        }
        memcpy(buf, tempbuf, tempcount);
    }
    romHandleTable[fd - ROM_FILE_HANDLE].current += count;
    MemFree(tempbuf);
    return count;
}

INT32   romFileSeek(INT fd, INT32 offset, INT16 origin)
{
    switch(origin){
        case FILESEEK_BEGIN:
            if(offset < romHandleTable[fd - ROM_FILE_HANDLE].fileTable -> length){
                romHandleTable[fd - ROM_FILE_HANDLE].current = offset;
                return offset;
            }else{
                return NUF_MAXFILE_SIZE;
            }
        case FILESEEK_CURRENT:
            if(offset  + romHandleTable[fd - ROM_FILE_HANDLE].current 
                < romHandleTable[fd - ROM_FILE_HANDLE].fileTable -> length){
                romHandleTable[fd - ROM_FILE_HANDLE].current += offset;
                return romHandleTable[fd - ROM_FILE_HANDLE].current;
            }else{
                return NUF_MAXFILE_SIZE;
            }
        default:
            return NUF_INVPARM;
    }
}

INT32   romFileLength(INT fd)
{
    return romHandleTable[fd - ROM_FILE_HANDLE].fileTable -> length;
}

⌨️ 快捷键说明

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