True FFS内核编程

1、格式化FLASH

即使FLASH没有和块设备驱动绑定,也可对其进行格式化。

tffsDevFormat (int tffsDriveNo, int formatArg);

typedef struct

{

  tffsFormatParams formatParams;

  unsigned formatFlags;

} tffsDevFormatParams;

2、创建Boot Image区域
2.1 创建Boot Image区域

创建Boot Image区域,通过在格式化flash,使TFFS段从某个偏移的位置开始。

tffsFormatParams

typedef struct {

  long int bootImageLen; //保留给Boot Image空间大小

  unsigned percentUse;

  unsigned noOfSpareUnits;

  unsigned long vmAddressingLimit;

  int (*progressCallback)(int totalUnitsToFormat, int totalUnitsFormattedSoFar);

  char * volumeLabel;

  unsigned noOfFATcopies;

  unsigned embeddedCISlength;

  char * embeddedCIS;

} tffsFormatParams;

STATUS sysTffsFormat (void)

{

  STATUS status;

  tffsDevFormatParams params =

  {

#define HALF_FORMAT /* lower 0.5MB for bootimage, upper 1.5MB for TFFS */

#ifdef HALF_FORMAT

  {0x80000l, 99, 1, 0x10000l, NULL, {0,0,0,0}, NULL, 2, 0, NULL},

  #else

  {0x000000l, 99, 1, 0x10000l, NULL, {0,0,0,0}, NULL, 2, 0, NULL},

  #endif /* HALF_FORMAT */

  FTL_FORMAT_IF_NEEDED

};

  /* we assume that the drive number 0 is RFA */

  status = tffsDevFormat (0, (int)&params);

  return (status);

}

2.2 写Boot Image到FLASH

采用函数tffsBootImagePut()实现,该函数依赖tffsRawio(),所以不能在TFFS卷装载以后使用。

TffsBootImagePut()能直接操作FLASH的任何区域。

函数定义:

STATUS tffsBootImagePut

(

  int driveNo, /* TFFS drive number */

  int offset, /* offset in the flash chip/card */

  char * filename /* binary format of the bootimage */

)

3 mounting the driver

函数usrTffsConfig()把dosFile文件系统加载到TFFS Flash驱动上。

STATUS usrTffsConfig

(

  int drive, /* drive number of TFFS */

  int removable, /* 0 for nonremovable flash media */

  char * fileName /* mount point */

)

STATUS usrTffsConfig ( int drive, int removable, char * fileName )

{

int dosFsCacheSizeDefault = 128 * 1024 ;

CBIO_DEV_ID pCbio;

BLK_DEV * pBlkDev;

char devName [BOOT_FILE_LEN];

if ((UINT)drive >= noOfDrives) {

printErr ("drive is out of range (0-%d)./n", noOfDrives - 1);

return (ERROR);

}

/* create a block device spanning entire disk (non-distructive!) */

if ((pBlkDev = tffsDevCreate (drive, removable)) == NULL) {

printErr ("tffsDevCreate failed./n");

return (ERROR);

}

/* split off boot device from boot file */

devSplit (fileName, devName);

/* initialize the block device as a dosFs device named */

/* Create e.g. 128 Kbytes disk cache */

if ( (pCbio = dcacheDevCreate( (CBIO_DEV_ID) pBlkDev, NULL,

dosFsCacheSizeDefault, devName)) == NULL )

return (ERROR);

if (dosFsDevCreate (devName, pCbio, 0, NONE) != OK)

return (ERROR);

return (OK);

}

4 TFFS SHELL命令

格式化flash,但保留Boot Image区域。

-> sysTffsFormat

加载RFA medium做为驱动0

-> usrTffsConfig 0,0,"/RFA/"

转自:http://m.blog.csdn.net/blog/da895/6033647

TFFS格式化到创建成功过程的更多相关文章

  1. 实验环境里新创建成功的web application却在浏览器中返回404错误

    刚刚翻笔记翻到一些刚学SharePoint时候解决的一些很2的初级问题,本来是有些挣扎该不该把它们记录到这个blog里的?因为担心这些很初级的文章会拉低这个blog的逼格,但是我的哥们善意的提醒了我一 ...

  2. 创建成功的Python项目

    创建成功的Python项目 前端开发工具技巧介绍—Sublime篇 SEO在网页制作中的应用 观察者模式 使用D3制作图表 英文原文:Create successful Python projects ...

  3. Fabric1.4源码解析:客户端创建通道过程

    在使用Fabric创建通道的时候,通常我们执行一条命令完成,这篇文章就解析一下执行这条命令后Fabric源码中执行的流程. peer channel create -o orderer.example ...

  4. pthread_create线程创建的过程剖析

    http://blog.csdn.net/wangyin159/article/details/47082125 在Linux环境下,pthread库提供的pthread_create()API函数, ...

  5. Delphi窗体创建释放过程及单元文件小结(转)

    Delphi窗体创建释放过程及单元文件小结 Delphi中的窗体,有模式窗体与非模式窗体两种.两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示.当显示模式窗体的时 ...

  6. 《Programming WPF》翻译 第8章 5.创建动画过程

    原文:<Programming WPF>翻译 第8章 5.创建动画过程 所有在这章使用xaml举例说明的技术,都可以在代码中使用,正如你希望的.可是,代码可以使用动画在某种程度上不可能在x ...

  7. pthread_create线程创建的过程剖析(转)

    概述 在Linux环境下,pthread库提供的pthread_create()API函数,用于创建一个线程.线程创建失败时,它可能会返回ENOMEM或EAGAIN.这篇文章主要讨论线程创建过程中碰到 ...

  8. 在git服务器上创建项目过程及遇到的问题

    一: 登录git服务器,输入用户名,密码等 二: New Project 添加项目 设置组可见,项目名称等. 创建成功的项目可以看到该项目的clone地址,可以通过http,ssh两种方式来获取: 三 ...

  9. Spring容器的创建刷新过程

    Spring容器的创建刷新过程 以AnnotionConfigApplicationContext为例,在new一个AnnotionConfigApplicationContext的时候,其构造函数内 ...

随机推荐

  1. Lesson 23 A new house

    Text I had a letter from my sister yesterday. She lives in Nigeria. In her letter, she said that she ...

  2. Leetcode 笔记 101 - Symmetric Tree

    题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...

  3. ASP.NET MVC 视图(一)

    ASP.NET MVC 视图(一) 前言 从本篇开始就进入到了MVC中的视图部分,在前面的一些篇幅中或多或少的对视图和视图中的一些对象的运用进行了描述,不过毕竟不是视图篇幅说的不全面,本篇首先为大家讲 ...

  4. ABP框架 - 多租户

    文档目录 本节内容: 什么是多租户 多部署 - 多数据库 单部署 - 多数据库 单部署 - 单数据库 单部署 - 混数据库 多部署 - 单/多/混 数据库 ABP中的多租户 启用多租户 宿主与租户 会 ...

  5. 【翻译】用AIML实现的Python人工智能聊天机器人

    前言 用python的AIML包很容易就能写一个人工智能聊天机器人. AIML是Artificial Intelligence Markup Language的简写, 但它只是一个简单的XML. 下面 ...

  6. DBUtil数据库连接单例 —— 简单不简单

    单例大概是我最早产生明确模式意识的设计模式,因为它足够简单粗暴,目的足够明确. 单例么,就是不管怎么访问,都返回一个单一实例就好了,我最早应用在数据库的DBUtil中. public class DB ...

  7. JavaScript权威设计--JavaScript类型,值,变量(简要学习笔记三)

    1.负号是一元求反运算 如果直接给数字直接量前面添加负号可以得到他们的负值     2.JavaScript中的运算超出了最大能表示的值不会报错,会显示Infinity. 超出最小也不报错,会显示-I ...

  8. Python标准模块--argparse

    1 模块简介 你一定很奇怪Python是如何命令行中的变量的吧?argparse就是用来解决这个问题的,argparse是optparse的替代. 2 模块使用 2.1 开始 我发现解释一个编程的概念 ...

  9. springmvc+jpa实现分页的两种方式

    1.工具类 public final class QueryTool { public static PageRequest buildPageRequest(int pageNumber, int ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】

    系列目录 上次的探讨没有任何结果,我浏览了大量的文章和个别系统的参考!决定用Cache来做,这可能有点难以接受但是配合mvc过滤器来做效果非常好! 由于之前的过滤器我们用过了OnActionExecu ...