加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

WinCE7的Bootpart参考

发布时间:2020-12-15 06:46:25 所属栏目:百科 来源:网络整理
导读:? ? WinCE7的Bootpart库主要提供Flash分区功能,所以它需要Flash驱动的支持。WinCE7中Bootpart库的源码位置在:WINCE700platformcommonsrccommonbootbootpart。在我的6410开发板的eboot中就使用了Bootpart提供的一些功能函数进行分区管理。不过我看到
?

? WinCE7的Bootpart库主要提供Flash分区功能,所以它需要Flash驱动的支持。WinCE7中Bootpart库的源码位置在:WINCE700platformcommonsrccommonbootbootpart。在我的6410开发板的eboot中就使用了Bootpart提供的一些功能函数进行分区管理。不过我看到也有很多厂商的BSP中并没有使用微软的Bootpart库进行分区,而是直接使用Flash驱动函数来进行这部分工作,其实在Bootpart库的内部函数也是调用Flash驱动函数来完成功能。

? 下面逐一介绍Bootpart库函数:

?

? 1 BP_Init

? BOOL BP_Init(

? LPBYTE pMemory,

? DWORD dwSize,

? LPCTSTR lpActiveReg,

? PPCI_REG_INFO pRegIn,

? PPCI_REG_INFO pRegOut

);

? 这个函数用来初始化Bootpart库。

pMemory指向一块内存用来存储MBR信息,在BP_Init 函数内部将pMemory 赋值给pbMBRSector。dwSize是内存大小。后三个参数传递给FMD_Init,因为在BP_Init函数中会调用FMD_Init初始化Flash。

if (!FMD_Init (lpActiveReg,pRegIn,pRegOut))

? ????return FALSE;

在我开发板的eboot中的OEMPlatformInit函数中调用了BP_Init函数,实际作用是用来初始化Flash和BinFS分区。

OALMSG(TRUE,(TEXT("BP_Initrn")));

if (!BP_Init((LPBYTE)BINFS_RAM_START,BINFS_RAM_LENGTH,NULL,NULL) )

{

??? OALMSG(OAL_WARN,(TEXT("WARNING: OEMPlatformInit failed to initialize Boot Media.rn")));

??? g_bBootMediaExist = FALSE;

}

else

{

??? g_bBootMediaExist = TRUE;

}

?

2 BP_OpenPartition

HANDLE BP_OpenPartition(

? DWORD dwStartSector,

? DWORD dwNumSectors,

? DWORD dwPartType,

? BOOL fActive,

? DWORD dwCreationFlags

);

? 这个函数用来打开或者创建分区。

dwStartSector参数是起始逻辑扇区,如果不指定扇区可以设置为NEXT_FREE_LOC。如果BP_OpenPartition函数用来打开已经存在的的分区,这个参数会被忽略。

dwNumSectors是该分区包含的逻辑扇区数。

dwPartType是分区类型。设置为PART_BOOTSECTION表示创建一个引导扇区用来存储引导信息,分区中的所有block都将被标记为只读。设置为PART_BINFS代表BinFS分区。

fActive用来设置该分区是否是活动分区。

dwCreationFlags用来设置BP_OpenPartition函数的操作类型。设置为PART_CREATE_NEW表示创建新分区,设置为PART_OPEN_EXISTING表示打开已经存在的分区,设置为PART_OPEN_ALWAYS,如果分区不存在,则创建一个新分区,如果分区已经存在,就打开它。

在我开发板的eboot中首先调用BP_OpenPartition函数来创建BinFS分区,用来存储系统镜像。BinFS分区位于紧挨着MBR的下一个block,大小为image size的最大值。

hPart = BP_OpenPartition( (IMAGE_START_BLOCK+1)*PAGES_PER_BLOCK,??? // next block of MBR

SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(dwBINFSPartLength))*PAGES_PER_BLOCK,// align to block

PART_BINFS,

TRUE,

PART_OPEN_ALWAYS);

之后又再次调用BP_OpenPartition函数将Flash中的剩余部分创建为一个FAT32扩展分区。

// create extended partition in whatever is left

//

hPartEx = BP_OpenPartition( NEXT_FREE_LOC,

??????????????????????????? USE_REMAINING_SPACE,

??????????????????????????? PART_DOS32,

??????????????????????????? TRUE,

???????????????????? ???????PART_OPEN_ALWAYS);

?

3 BP_ReadData

BOOL BP_ReadData(

? HANDLE hPartition,

? LPBYTE pbBuffer,

? DWORD dwLength

);

? 这个函数用来从一个分区中读取数据。hPartition是分区句柄,pbBuffer是用来存储数据的缓冲区指针,dwLength是要读取的数据长度。在BP_ReadData函数内部最终是通过Flash驱动的FMD_ReadSector来读取分区数据的。

在我开发板的eboot中有一个ReadOSImageFromBootMedia函数用来把系统镜像从Flash中读取到RAM,在这个函数中就是通过BP_ReadData来读取系统镜像的。

? if ( !BP_ReadData( hPart,(LPBYTE)(g_pTOC->id[g_dwTocEntry].dwLoadAddress),SECTOR_TO_FILE_SIZE(g_pTOC->id[g_dwTocEntry].dwTtlSectors)) )

? {

????? OALMSG(OAL_ERROR,(TEXT("ERROR: ReadOSImageFromBootMedia: Failed to read kernel region from partition.rn")));

????? return(FALSE);

? }

? 4 BP_WriteData

? BOOL BP_WriteData(

? HANDLE hPartition,

? DWORD dwLength

);

? 这个函数用来向分区中写入数据,参数含义和BP_ReadData一样。在我开发板eboot中有一个WriteOSImageToBootMedia函数用来将系统镜像从RAM写入分区。它内部就是调用BP_WriteData将镜像数据写入到BinFS分区的。

? // Write the region to the BINFS partition.

? //

? if ( !BP_WriteData(hPart,(LPBYTE)dwRegionStart,dwRegionLength) )

? {

????? EdbgOutputDebugString("ERROR: StoreImageToBootMedia: Failed to write region to BINFS partition (start=0x%x,length=0x%x).rn",dwRegionStart,dwRegionLength);

????? return(FALSE);

? }

?

? 5 BP_GetPartitionInfo

PPARTENTRY BP_GetPartitionInfo(

? HANDLE hPartition,

);

? 这个函数用来获取分区信息。hPartition是分区句柄,返回的分区信息存储在一个PARTENTRY结构体里面。这个结构体的原型如下:

typedef struct _PARTENTRY {

? BYTE Part_BootInd;

? BYTE Part_FirstHead;

? BYTE Part_FirstSector;

? BYTE Part_FirstTrack;

? BYTE Part_FileSystem;

? BYTE Part_LastHead;

? BYTE Part_LastSector;

? BYTE Part_LastTrack;

? DWORD Part_StartSector;

? DWORD Part_TotalSectors;

} PARTENTRY;

? 主要是扇区起始和结尾Head、Sector、Track,以及分区中的扇区总数,起始逻辑扇区,分区类型等信息。

?

6 BP_LowLevelFormat

BOOL BP_LowLevelFormat(

? DWORD dwStartBlock,

? DWORD dwNumBlocks,

? DWORD dwFlags

);

? 这个函数用来对Flash做低级格式化。在我开发板的eboot打印菜单中有一个功能是:9) Format Boot Media for BinFS,用来格式化BinFS分区。实现代码如下:

if ( !BP_LowLevelFormat( IMAGE_START_BLOCK,

???????????????????????? wNUM_BLOCKS - IMAGE_START_BLOCK,

???????????????????????? FORMAT_SKIP_BLOCK_CHECK) )

{

??? OALMSG(OAL_ERROR,(TEXT("ERROR: BootMonitor: Low-level boot media format failed.rn")));

??? continue;

}

第一个参数是要格式化的起始物理block,第二个参数是block个数,第三个参数设置为FORMAT_SKIP_BLOCK_CHECK,表示跳过读写坏块。BP_LowLevelFormat函数会将从dwStartBlock开始算起第一个good block的第一个扇区作为逻辑扇区0,并将MBR信息写到逻辑扇区0。

?

? 7 BP_SetDataPointer

BOOL BP_SetDataPointer(

? HANDLE hPartition,

? DWORD dwAddress

);

? 这个函数用来设置指定分区的数据指针(data pointer),当下次读写该分区时则从该指针所存储的逻辑字节地址开始操作。

如:

// Set the partition file pointer to the correct offset for the kernel region.

if ( !BP_SetDataPointer(hPart,g_pTOC->id[g_dwTocEntry].dwStoreOffset) )

{

??? return(FALSE);

}

?

// Read the kernel region from the Boot Media into RAM.

if ( !BP_ReadData( hPart,?????????????????????? SECTOR_TO_FILE_SIZE(g_pTOC->id[g_dwTocEntry].dwTtlSectors)) )

{

??? return(FALSE);

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读