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

📄 fdt.c

📁 新一代基于事件的嵌入式操作系统dyos在三星的s3c44b0的arm芯片上的完整移植代码
💻 C
📖 第 1 页 / 共 3 页
字号:
//返回: 无
//注: 添加时间管理后,文件创建时间由time函数得到---db
//-----------------------------------------------------------------------------
void __DFFSD_asm_FDT_item(struct fdt_info *FDT_item,union file_attrs attr,
                          char *name)
{
    uint8_t attr_mirror;
    ufast_t i;
    //因存在可能的移植问题,不宜直接使用位联合结构的attr参数
    attr_mirror = 0;
    if(attr.bits.read_only)
        attr_mirror +=cn_FS_ATTR_READ_ONLY;
    if(attr.bits.hidden)
        attr_mirror +=cn_FS_ATTR_HIDDEN;
    if(attr.bits.folder)
        attr_mirror +=cn_FS_ATTR_DIRECTORY;
    if(attr.bits.archive)
        attr_mirror +=cn_FS_ATTR_ARCHIVE;   //以上只初始化4个属性,还两个暂不用
    FDT_item->mattr = attr_mirror;
    FDT_item->name_buf_len = cn_flash_file_name_limit +1;
    for(i = 0; i < 8; i++)
        FDT_item->file_size[i] = 0;    //文件尺寸=0
    //name是模块内部提供的字符串指针,已经经过字符串长度合法性检查
    if(strlen(name) <= cn_flash_file_name_limit)//读取文件柜名字
        strcpy(FDT_item->name,name);
    else
    {
        memcpy(FDT_item->name,name,cn_flash_file_name_limit);
        FDT_item->name[cn_flash_file_name_limit] = '\0';
    }
    FDT_item->second_create = 0x00;
    FDT_item->minute_create = 0x00;
    FDT_item->hour_create = 0x12;
    FDT_item->date_create = 0x04;
    FDT_item->month_create = 0x01;
    FDT_item->year_low_create = 0x09;
    FDT_item->year_high_create = 0x20;
    FDT_item->second_modify = 0x00;
    FDT_item->minute_modify = 0x00;
    FDT_item->hour_modify = 0x12;
    FDT_item->date_modify = 0x04;
    FDT_item->month_modify = 0x01;
    FDT_item->year_low_modify = 0x09;
    FDT_item->year_high_modify = 0x20;
    return;
}

//----读取文件(目录)参数-------------------------------------------------------
//功能:从FDT表项的内存镜像中的中读取文件(目录)信息,并初始化文件结构指针fp。
//参数:DBX_flash_tag,被操作的文件柜指针,通用结构,非flash专用。
//      fp,保存文件(目录)属性的文件指针
//      FDT_item,从flash中读出的FDT表项
//返回:无
//-----------------------------------------------------------------------------
void __DFFSD_uasm_FDT_item(struct st_DBX_flash_tag *DBX_flash_tag,
                              struct file_rsc *fp,
                              struct fdt_info *FDT_item)
{
    struct flash_chip *chip;
    uint8_t attr_mirror;
    uint32_t name_len;
    chip = DBX_flash_tag->chip;
    fp->attr.all = 0;
    attr_mirror = FDT_item->mattr;
    if(attr_mirror & cn_FS_ATTR_READ_ONLY)
        fp->attr.bits.read_only =1;
    if(attr_mirror & cn_FS_ATTR_DIRECTORY)
        fp->attr.bits.folder =1;
    if(attr_mirror & cn_FS_ATTR_HIDDEN)
        fp->attr.bits.hidden =1;
    if(attr_mirror & cn_FS_ATTR_ARCHIVE)
        fp->attr.bits.archive =1;   //以上只初始化3个属性,还两个暂不用
    fp->second_create = FDT_item->second_create;
    fp->minute_create = FDT_item->minute_create;
    fp->hour_create = FDT_item->hour_create;
    fp->date_create = FDT_item->date_create;
    fp->month_create = FDT_item->month_create ;
    fp->year_low_create = FDT_item->year_low_create;
    fp->year_high_create = FDT_item->year_high_create;
    fp->second_modify = FDT_item->second_modify;
    fp->minute_modify = FDT_item->minute_modify;
    fp->hour_modify = FDT_item->hour_modify;
    fp->date_modify = FDT_item->date_modify;
    fp->month_modify = FDT_item->month_modify ;
    fp->year_low_modify = FDT_item->year_low_modify;
    fp->year_high_modify = FDT_item->year_high_modify;
    //读文件尺寸,为防止符号为扩展导致不必要的麻烦,按无符号数移位。
    fp->file_size = __pick_little_32bit(FDT_item->file_size,0)
            +((uint64_t)__pick_little_32bit(FDT_item->file_size,1)<<32);
    name_len = rtstrlen(FDT_item->name,cn_flash_file_name_limit);
    if(name_len != cn_limit_uint32)  //文件柜名字不超过cn_flash_file_name_limit
        strcpy(fp->name, FDT_item->name);
    else
    {
        memcpy(fp->name, FDT_item->name,cn_flash_file_name_limit);
        fp->name[cn_flash_file_name_limit] = '\0';
    }
    return ;
}

//----解析根目录条目-------------------------------------------------------
//功能:从根目录的FDT表项的内存镜像中读取根目录信息,写到DBX_flash_tag中
//参数:DBX_flash_tag,被操作的文件柜指针,通用结构,非flash专用。
//      FDT_item,从flash中读出的FDT表项
//返回:无
//-----------------------------------------------------------------------------
void __DFFSD_uasm_root_folder(struct st_DBX_flash_tag *DBX_flash_tag,
                                struct fdt_info *FDT_item)
{
    //根目录的FDT条目的file_size有特殊用途,前4字节为FDT表中空闲FDT条目数,后
    //4个字节是FDT表中总FDT条目数
    DBX_flash_tag->FDT_free_num = __pick_little_32bit(FDT_item->file_size,0);
    DBX_flash_tag->FDT_capacity = __pick_little_32bit(FDT_item->file_size,1);
    return ;
}

//----修改fdt条目中的起始块号--------------------------------------------------
//功能: 当一个文件的首块被修改时,该文件的fdt条目中保存的起始块号也将被修改。只
//      有在发生磨损平衡块交换时,才有可能调用本函数,故在调用本函数时产生的写
//      操作并不修改磨损次数,即使发生坏块交换,也不调用标准的块分配函数
//      __allocate_block分配空闲块,而是直接从free块中取一块,不修改磨损次数。
//      这样可以避免发生连环套。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
//      FDT_item_no,fdt条目编号。
//      new_block_no,替换块号
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_fstart_dson(struct st_DBX_flash_tag *DBX_flash_tag,
                       uint32_t FDT_item_no,uint32_t new_block_no)
{
    struct fdt_info FDT_item;
    __DFFSD_read_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
    __fill_little_32bit(FDT_item.fstart_dson,0,new_block_no);
    __DFFSD_write_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
    return ;
}

//----在FDT中修改文件尺寸------------------------------------------------------
//功能: 修改FDT表项中的文件尺寸域。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
//      fp,被修改的文件指针,由调用方保证不是目录而是文件。
//      new_size,新的文件尺寸
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_file_size(struct st_DBX_flash_tag *DBX_flash_tag,
                                  struct file_rsc *fp,sint64_t new_size)
{
    uint32_t FDT_item_no;
    struct fdt_info FDT_item;
    FDT_item_no = (uint32_t)fp->file_medium_tag;
    __DFFSD_read_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
    __fill_little_32bit(FDT_item.file_size,0,new_size);
    //为防止符号为扩展导致不必要的麻烦,按无符号数移位。
    __fill_little_32bit(FDT_item.file_size,1,(uint64_t)new_size>>32);
    __DFFSD_write_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
    return ;
}

//----在FDT中修改文件名------------------------------------------------------
//功能: 修改FDT表项中的文件(目录)名域。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
//      fp,被修改的文件指针
//      name,新的文件(目录)名
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_item_name(struct st_DBX_flash_tag *DBX_flash_tag,
                                  struct file_rsc *fp,char *name)
{
    uint32_t FDT_item_no;
    struct fdt_info FDT_item;
    FDT_item_no = (uint32_t)fp->file_medium_tag;
    __DFFSD_read_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
    //name是模块内部提供的字符串指针,已经经过字符串长度合法性检查
    if(strlen(name) <= cn_flash_file_name_limit)//读取文件柜名字
        strcpy(FDT_item.name,name);
    else
    {
        memcpy(FDT_item.name,name,cn_flash_file_name_limit);
        FDT_item.name[cn_flash_file_name_limit] = '\0';
    }
    __DFFSD_write_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
    return ;
}

//----在FDT中修改文件属性------------------------------------------------------
//功能: 修改FDT表项中的文件(目录)属性域。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
//      fp,被修改的文件指针
//      attr,新的文件(目录)属性
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_item_attr(struct st_DBX_flash_tag *DBX_flash_tag,
                                  struct file_rsc *fp,union file_attrs attr)
{
    uint32_t FDT_item_no;
    struct fdt_info FDT_item;
    uint8_t attr_mirror;
    FDT_item_no = (uint32_t)fp->file_medium_tag;
    __DFFSD_read_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
    //因存在可能的移植问题,不宜直接使用位联合结构的attr参数
    attr_mirror = FDT_item.mattr;
    if(attr.bits.read_only)
        attr_mirror +=cn_FS_ATTR_READ_ONLY;
    if(attr.bits.hidden)
        attr_mirror +=cn_FS_ATTR_HIDDEN;
    if(attr.bits.archive)
        attr_mirror +=cn_FS_ATTR_ARCHIVE;   //以上只初始化3个属性,还两个暂不用
                                            //不能修改目录/文件属性
    FDT_item.mattr = attr_mirror;
    __DFFSD_write_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
    return ;
}
/*      db 先注释,待把time结构确定后再说
//----在FDT中修改创建时间------------------------------------------------------
//功能: 修改FDT表项中的创建时间域。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
//      fp,被修改的文件指针
//      new_time,新的时间
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_item_ctime(struct st_DBX_flash_tag *DBX_flash_tag,
                                  struct file_rsc *fp,struct time new_time)
{
    return ;
}

//----在FDT中修改修改时间------------------------------------------------------
//功能: 修改FDT表项中的修改时间域。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
//      fp,被修改的文件指针
//      new_time,新的时间
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_item_utime(struct st_DBX_flash_tag *DBX_flash_tag,
                                  struct file_rsc *fp,struct time new_time)
{
    return ;
}
*/

⌨️ 快捷键说明

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