6555|23

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince更新内核问题(eboot logo) [复制链接]

系统:wince 5.0 CPU 三星2450
目的:用户实现更新开机画面。
        方法一:把bootlogo.bmp写到nand的某一块,然后eboot去读,我还没有想这个
        方法二:在电脑上把bootlogo.bmp通过工具转换成rm.bin(已经完成),然后拷贝到用户区nand,下一步就是在wince上实现更新rm.bin(其实这个和更新内核是一样的道理)。我只需要把rm.bin像用DNW一样,写到nand的某块(比如第9块),问题就解决了。现在就是这个问题没有解决.

    不知道我的有什么问题,系统运行没有报错,但是也没有成功。问题是dwImageStart和pcharbuff是不是对应的,也就是是不是WriteRawImageToBootMedia能接收pcharbuff,pcharbuff应该是虚拟内存,dwImageStart是不是物理内存呢。这个我也不是很清楚,大家帮我看看,问题解决了,我会整理发在我博客里面供大家参考。



  1. PVOID pcharbuff;
  2. viod main()//先用这个做过例子其实都是我弄了一个驱动,在驱动层实现的,这里应该是个IOCONTROL
  3. {
  4. Readimagefrombootmedia( );
  5. WriteRawImageToBootMedia((DWORD)pcharbuff, bootFile1.length, (DWORD)pcharbuff);
  6.                                
  7. }
  8. BOOL WriteRawImageToBootMedia(DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr)
  9. //主要是利用FIL里面的擦除、同步、读写。完成把dwImageStart开始的数据写到nand的某块,dwImageStart看了一下里面的参考代码,都是

  10. 0x80200000,这个应该是物理内存了吧?我想利用这个写函数实现写如nand。我认为主要问题就是这个dwImageStart
  11. //pLowFuncTbl = FIL_GetFuncTbl();pLowFuncTbl->Read、pLowFuncTbl->Erase、pLowFuncTbl->Write、pLowFuncTbl->Sync
  12. {
  13.   ......
  14.   .......
  15. }

  16. BOOL  Readimagefrombootmedia( )
  17. {
  18.       HANDLE hFile;
  19.       DWORD  dwErr ;
  20.       LPDWORD  nBytesRead=0;
  21.       BOOL bSuccess=FALSE;
  22.       pcharbuff=(char *)malloc(0x100000);        

  23.       hFile   =   CreateFile(
  24.                                        _T( "\\PocketMory1\\res.bin"),
  25.                                         GENERIC_READ,
  26.                                         0,
  27.                                         NULL,
  28.                                         OPEN_EXISTING,
  29.                                         FILE_ATTRIBUTE_NORMAL,
  30.                                         NULL
  31.                                         );

  32.         if( hFile  ==INVALID_HANDLE_VALUE )
  33.                 {
  34.                 dwErr   =   GetLastError();      
  35.                 RETAILMSG(TRUE, (TEXT("CreateFile  failed ,GetLastError=%d\r\n") , dwErr));
  36.                 }

  37.         dwSize = GetFileSize (hFile, NULL) ;


  38.         if(!ReadFile(hFile, pcharbuff, dwSize  , nBytesRead , NULL))
  39.                 {
  40.                 RETAILMSG(TRUE, (TEXT("ReadFile  failed \r\n")));
  41.                 }


  42.         RETAILMSG(TRUE, (TEXT("-Readimagefrombootmedia\r\n")));

  43.           return TRUE;

  44. }

复制代码

最新回复

看样子这个问题已经就这样了,先结贴,有问题再开贴,谢谢楼上的诸位!  详情 回复 发表于 2009-5-11 10:17
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
别人的QQ留言,摘录过来:

看你的程序好像是应用层的,调用驱动里的 FMD_WriteSector,但是需要修改下驱动, 因为正常wince驱动里 那一块区域是被锁定的,否则就被分区了。
WriteRawImageToBootMedia  不过这个函数我的eboot里面没有 不知道是不是你自己写的(我从eboot里面弄过来的)

FMD_WriteSector很多地方都有 boot 和 bsp 里面应该都有的。应用最好是通过调用驱动里的函数来写flash
如果直接把这段代码搬到应用里还要先做初始化的工作 就是FMD_Init 里面的工作

 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
应用层做也是可以的,可以借助文件系统。
不过麻烦的是在应用层需要把NANDFLASH的驱动基本要重新一便,包括很多跟芯片相关的定义,有点晕乎!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 adrian_bleu 的回复:
别人的QQ留言,摘录过来:

看你的程序好像是应用层的,调用驱动里的 FMD_WriteSector,但是需要修改下驱动, 因为正常wince驱动里 那一块区域是被锁定的,否则就被分区了。
WriteRawImageToBootMedia  不过这个函数我的eboot里面没有 不知道是不是你自己写的(我从eboot里面弄过来的)

FMD_WriteSector很多地方都有 boot 和 bsp 里面应该都有的。应用最好是通过调用驱动里的函数来写flash
如果直接把这段代码搬到应用…


的确如此,我去年就是这么做的,我的博客flash标签下写了文章。我是做了 wince ghost的初级版本而已,不过和楼主所说应该一致。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
帮顶下  不用开帖了  
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
关注一下
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
关注学习
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
感觉通过应用层写会有问题吧!因为wince里不会把flash所有的空间都开放给应用层使用,而且因为文件系统的管理,你每次修改的图片文件未必都放在同一个物理地址,这样的话在eboot里读取图片会增加困难的吧。还是要使用底层驱动程序将图片文件写到一个固定的位置,这样方便eboot读取。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 
楼上,我就是要把nand用户区的图片写到nand的保留块中,要做的就是这个,但是要在应用层实现,而不是底层
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
如果直接在应用程序里调用createfile,那么在eboot里就也要实现文件系统,因为必须以fat格式查找nandflash分区中的文件,这样难度要增加很多。可以修改下FMD的驱动,初始化你所需要的nandflash用户区,然后直接在应用程序里调用驱动程序提供的功能,将图片文件写到nandflash用户区,这样在eboot里只要在nandflash用户区固定地址调出图片数据显示就可以了,这样来的简单些。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

11
 
先谢谢楼上和回复的朋友们。不知道是我没有理解你的意思,还是你没有理解我的意思。我先说一下我的意思。我先把图片通过一个工具转换成了rm.bin格式(这个就和nk.bin很类似了,我已经完成这个),在我的eboot里面已经实现了这样的功能:通过DNW软件、USB下载rm.bin文件到nand的第10块(放在保留块就可以),下载成功之后,系统重庆,我的eboot已经实现了从第10块读取图片信息(即rm.bin文件),就会显示新的开机logo,但是,上面的操作需要串口和USB,我就要在wince系统起来之后,通过应用程序实现上面的过程(我认为这个就是更新内核的精简形式)
rm.bin文件存放在nand(就是系统起来之后我们看到的nand 盘符那部分),现在我就是要把rm.bin文件直接写到nand的第10块,通过应用程序完成。我用的是2450,就是不知道用那些nand读写接口,才接触这些,所以比较菜,嘿嘿

我是在驱动里面做了一个假驱动,来开放完成上述操作的接口。BOOL  Readimagefrombootmedia( )就把rm.bin文件找到,并且读到虚拟内存pcharbuff,然后把pcharbuff开始的数据在写到nand的第10块。
我认为我的问题在后面,Readimagefrombootmedia( )这个应该是没有问题的。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
LZ的思路我觉得没有问题,wince起来以后,可以通过文件系统从U盘里把图片文件读到内存里,然后把内存里的内容写到指定nandflash位置。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 down2004 的回复:
LZ的思路我觉得没有问题,wince起来以后,可以通过文件系统从U盘里把图片文件读到内存里,然后把内存里的内容写到指定nandflash位置。

可以通过文件系统从U盘里把图片文件读到内存里,我的代码是不是没有问题?内存里的内容写到指定nandflash位置。我就是这个没有实现,2450用的whimory,不知道用哪些,正在看,做过的给个指点,嘿嘿
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

14
 
很想结贴,但是问题还没有解决,我会记得结贴给大家分的!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
pcharbuff=(char *)malloc(0x100000);分配这么大的虚拟内存,(ReadFile(hFile, pcharbuff, dwSize  , nBytesRead , NULL)不会有问题吧
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

16
 
uping
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 14 楼 adrian_bleu 的回复:
pcharbuff=(char *)malloc(0x100000);分配这么大的虚拟内存,(ReadFile(hFile, pcharbuff, dwSize  , nBytesRead , NULL)不会有问题吧

直接用malloc分配1M空间应该会失败,用文件映射CreateFileMapping可以的。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

18
 
使用方法1比较好,我在PXA270平台就是这样做的
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 16 楼 down2004 的回复:
引用 14 楼 adrian_bleu 的回复:
pcharbuff=(char *)malloc(0x100000);分配这么大的虚拟内存,(ReadFile(hFile, pcharbuff, dwSize  , nBytesRead , NULL)不会有问题吧

直接用malloc分配1M空间应该会失败,用文件映射CreateFileMapping可以的。


嘻嘻,这样是没有问题的,分配空间可以,我做了下面的试验,成功。谢谢了。本来认为就是没有问题的,昨天突然想了一下没有验证,又验证了一下,哈哈。现在问题就是写入nand

  1. hFile   =   CreateFile(
  2.                                        _T( "\\PocketMory1\\res.bin"),
  3.                                         GENERIC_READ,
  4.                                         0,
  5.                                         NULL,
  6.                                         OPEN_EXISTING,
  7.                                         FILE_ATTRIBUTE_NORMAL,
  8.                                         NULL
  9.                                         );
  10.              hFile1   =   CreateFile(
  11.                                        _T( "\\PocketMory1\\res1.bin"),
  12.                                         GENERIC_READ|GENERIC_WRITE,
  13.                                         0,
  14.                                         NULL,
  15.                                         CREATE_NEW,
  16.                                         FILE_ATTRIBUTE_NORMAL,
  17.                                         NULL
  18.                                         );
  19. dwsize = GetFileSize (hFile, NULL) ;
  20. pcharbuff=(LPBYTE)malloc(0x100000);
  21. if(!ReadFile(hFile, pcharbuff, dwsize  , &nBytesRead , NULL))
  22.                 {
  23.                 RETAILMSG(TRUE, (TEXT("ReadFile  failed \r\n")));
  24.                 }


  25.         if(nBytesRead==dwsize)
  26.                 RETAILMSG(TRUE, (TEXT("ReadFile  successful \r\n")));
  27.         else
  28.                 RETAILMSG(TRUE, (TEXT("ReadFile failed \r\n")));
  29.        
  30.         bSuccess = WriteFile(hFile1, pcharbuff, dwsize, &writelen, NULL);    /* 将数据写入文件中 */   
  31.         if(bSuccess==TRUE)
  32.                 RETAILMSG(TRUE, (TEXT("WriteFile  successful \r\n")));
  33.         else
  34.                 RETAILMSG(TRUE, (TEXT("WriteFile failed \r\n")));
  35.        

  36.        CloseHandle(hFile);
  37.        CloseHandle(hFile1);
复制代码
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

20
 
学习下。分配大内存,一定要检查下是否成功的。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表