wince6.0下如何实现系统运行起来后升级更新NK.BIN?

时间:2022-07-15 17:55:03
如题,应该要写个驱动,接收应用层指令,然后读取外部存储器(如U盘)里的NK.BIN进行更新,更新时要读写MBR,TOC吗?这个驱动该如何写?有做过成功的代码示例吗?跪谢分享。

36 个解决方案

#1


需要 EBoot 来实现,不是驱动。

#2


EBOOT实现,大家都这么做的,现在我们想通过系统来实现,如何做?

#3


应该在系统起来后要能对flash操作,读写MBR、TOC。这个应该要在驱动里做吧?应用程序不懂能否实现。

#4


引用 3 楼  的回复:
应该在系统起来后要能对flash操作,读写MBR、TOC。这个应该要在驱动里做吧?应用程序不懂能否实现。

这是个好的想法,后续我们也打算长时间来实现,关注一下。

#5


CE5.0上我们实现过,但是6.0实现起来够呛~

#6


引用 5 楼  的回复:
CE5.0上我们实现过,但是6.0实现起来够呛~

5.0如何实现的?能否贴一下代码?我改改看能否在6.0上实现。这样大家都可以学习一下。谢谢!

#7


CE5.0和6.0机制不一样,CE5.0在应用层可以直接操作flash的扇区,而6.0不可以,所以贴出来意义也不大
引用 6 楼  的回复:
引用 5 楼 的回复:
CE5.0上我们实现过,但是6.0实现起来够呛~

5.0如何实现的?能否贴一下代码?我改改看能否在6.0上实现。这样大家都可以学习一下。谢谢!

#8


哦,这样呀,那怎么办呢?

#9


引用 7 楼  的回复:
CE5.0和6.0机制不一样,CE5.0在应用层可以直接操作flash的扇区,而6.0不可以,所以贴出来意义也不大引用 6 楼  的回复:
引用 5 楼 的回复:
CE5.0上我们实现过,但是6.0实现起来够呛~

5.0如何实现的?能否贴一下代码?我改改看能否在6.0上实现。这样大家都可以学习一下。谢谢!


是操作扇区的,http://blog.csdn.net/nanjianhui/article/details/2196466
看这里实现这些后,然后知道你的NK写在哪个扇区就把NK.bin直接写到扇区里

#10


可是应用程序如何知道NK.BIN写在哪个扇区呢?读取toc结构体吗?谢谢hudaweikevin前辈的重要指点。

#11


我要更改C:\WINCE600\PLATFORM\SMDKV210\SRC\COMMON\NANDFLASH\FMD\fmd.cpp文件中的FMD_OEMIoControl的方法,增加读、写、擦除flash的方法,还要增加写toc、写MBR的方法吧?我看bootloader中的烧写NK.BIN有写MBR和TOC的操作。

#12


我们以前弄的是直接固定地址的,因为你的NK一般是固定从flash某个位置写起的

#13


引用 12 楼  的回复:
我们以前弄的是直接固定地址的,因为你的NK一般是固定从flash某个位置写起的

是可以用固定地址。就是写完要写TOC和MBR吗?

#14


该回复于2012-05-16 12:52:26被版主删除

#15


以前我做过一个demo ,
试了一阵子,可以,后来TMD硬盘坏了。
程序不见了。

不过我写了博客,你去我的博客 搜索 更新 啥 的字眼应该还在的。
原理和app的代码我都贴出来了,
不过我的bootloader 烧写的是NK.nb0 ,没涉及TOC ,就比较简单。
不过TOC的东西, 你可以参考eboot去实现即可。

#16


引用楼主  的回复:
如题,应该要写个驱动,接收应用层指令,然后读取外部存储器(如U盘)里的NK.BIN进行更新,更新时要读写MBR,TOC吗?这个驱动该如何写?有做过成功的代码示例吗?跪谢分享。


你的思路是对的。
三星内部有这个东东,是以驱动的形式存在的。

#17


引用 16 楼  的回复:
你的思路是对的。
三星内部有这个东东,是以驱动的形式存在的。

哦?在哪里?能告诉我哪个文件或目录下吗?谢谢!

#18


引用 17 楼  的回复:
引用 16 楼 的回复:
你的思路是对的。
三星内部有这个东东,是以驱动的形式存在的。

哦?在哪里?能告诉我哪个文件或目录下吗?谢谢!


韩国三星内部有这个代码,未公开 ,不在BSP中。就是一个

#19


就是一个以驱动形式存在的EBOOT,可以这样理解。

#20


还是没有告诉如何详细操作的具体结果!!

#21


引用 20 楼  的回复:
还是没有告诉如何详细操作的具体结果!!


具体原理就是这样啊,代码是木有的

#22


顶一下,谁有系统起来后的升级NK.BIN的驱动源码呀?谢谢分享!

#23


引用 7 楼  的回复:
CE5.0和6.0机制不一样,CE5.0在应用层可以直接操作flash的扇区,而6.0不可以,所以贴出来意义也不大引用 6 楼  的回复:
引用 5 楼 的回复:
CE5.0上我们实现过,但是6.0实现起来够呛~

5.0如何实现的?能否贴一下代码?我改改看能否在6.0上实现。这样大家都可以学习一下。谢谢!


CE6.0做个驱动就好,意议还是挺大的。

#24


是呀,谁做过?分享一下经验和代码。谢谢

#25


应用程序可以开辟100MB的内存空间吗?应用层把NK.BIN读取到内存,然后传地址给驱动,让驱动连续地把NK.BIN写入到flash。还是只能一块一块(128KB)地传到驱动,然后驱动也一块一块地写进flash?

#26


我也打算做一个,我的想法是系统起来后,在应用程层将待更新的NK_new.bin放到NandFlash的一个目录中,然后下次开机时,在EBOOT起来后,找到这个目录下的文件,然后覆盖原来的NK。但这里有个问题,EBOOT下如何找到那个目录。

#27


EBOOT去做这事

#28


引用 26 楼  的回复:
我也打算做一个,我的想法是系统起来后,在应用程层将待更新的NK_new.bin放到NandFlash的一个目录中,然后下次开机时,在EBOOT起来后,找到这个目录下的文件,然后覆盖原来的NK。但这里有个问题,EBOOT下如何找到那个目录。

你的这种做法需要在eboot下分析flash的文件系统,比较麻烦。最好还是在系统运行过程中直接写flash,然后软件重启。

#29


引用 26 楼  的回复:
我也打算做一个,我的想法是系统起来后,在应用程层将待更新的NK_new.bin放到NandFlash的一个目录中,然后下次开机时,在EBOOT起来后,找到这个目录下的文件,然后覆盖原来的NK。但这里有个问题,EBOOT下如何找到那个目录。

你的这种做法需要在eboot下分析flash的文件系统,比较麻烦。最好还是在系统运行过程中直接写flash,然后软件重启。

#30


在应用层直接更新NK所在Flash对应块的话,NK的大小变化很大的话,就有可能把原来的应用程序也覆盖了,总有点不放心。因为我的内核中并没有包函应用程序,主要是方便分开升级。

#31


我的前面的问题欢迎多探讨呀。谢谢!

#32


http://blog.csdn.net/zhengmeifu/article/details/7611501 我的博客记录了我的想法。欢迎去看看。

#33


在线等高手指点。。。。

#34


在应用程序来直接更新内核,在/WINCE600/PUBLIC/COMMON/OAK/DRIVERS/BLOCK/MSFLASHFMD/下有多个FMD.cpp, fasl\, ram\, sdnpci\, sdnpci\, strata\下各自都有一个 不知是在哪个里改FMD_OEMIoControl。
另外DeviceIoControl传进去的句柄如何得到,通过CreateFile(TEXT("DSK1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)得到的是INVALID_HANDLE_VALUE

#35


我现在的想法是直接块写原来NK.BIN所在的块,写完后就写TOC,这样不知是否可以。看eboot下的代码是先打开binfs分区,然后传入分区句柄来更新nk.bin。

#36


如果在应用层直接写Flash,要解决几个问题:
1 应用层操作Flash的接口,http://blog.csdn.net/nanjianhui/article/details/2196466 这个贴子中有说到怎么实现, A)打开"DSK1:"失败, B)修改FMD.cpp中FMD_OEMIoControl函数,但不知哪个。
to zhengmeifu, 你试验过,这个可以实现吗?
2 要知道NK在Flash中起始位在哪,我看了EBOOT的代码,没找到在哪。
3 正在运行的应用程序允许擦除吗?

#1


需要 EBoot 来实现,不是驱动。

#2


EBOOT实现,大家都这么做的,现在我们想通过系统来实现,如何做?

#3


应该在系统起来后要能对flash操作,读写MBR、TOC。这个应该要在驱动里做吧?应用程序不懂能否实现。

#4


引用 3 楼  的回复:
应该在系统起来后要能对flash操作,读写MBR、TOC。这个应该要在驱动里做吧?应用程序不懂能否实现。

这是个好的想法,后续我们也打算长时间来实现,关注一下。

#5


CE5.0上我们实现过,但是6.0实现起来够呛~

#6


引用 5 楼  的回复:
CE5.0上我们实现过,但是6.0实现起来够呛~

5.0如何实现的?能否贴一下代码?我改改看能否在6.0上实现。这样大家都可以学习一下。谢谢!

#7


CE5.0和6.0机制不一样,CE5.0在应用层可以直接操作flash的扇区,而6.0不可以,所以贴出来意义也不大
引用 6 楼  的回复:
引用 5 楼 的回复:
CE5.0上我们实现过,但是6.0实现起来够呛~

5.0如何实现的?能否贴一下代码?我改改看能否在6.0上实现。这样大家都可以学习一下。谢谢!

#8


哦,这样呀,那怎么办呢?

#9


引用 7 楼  的回复:
CE5.0和6.0机制不一样,CE5.0在应用层可以直接操作flash的扇区,而6.0不可以,所以贴出来意义也不大引用 6 楼  的回复:
引用 5 楼 的回复:
CE5.0上我们实现过,但是6.0实现起来够呛~

5.0如何实现的?能否贴一下代码?我改改看能否在6.0上实现。这样大家都可以学习一下。谢谢!


是操作扇区的,http://blog.csdn.net/nanjianhui/article/details/2196466
看这里实现这些后,然后知道你的NK写在哪个扇区就把NK.bin直接写到扇区里

#10


可是应用程序如何知道NK.BIN写在哪个扇区呢?读取toc结构体吗?谢谢hudaweikevin前辈的重要指点。

#11


我要更改C:\WINCE600\PLATFORM\SMDKV210\SRC\COMMON\NANDFLASH\FMD\fmd.cpp文件中的FMD_OEMIoControl的方法,增加读、写、擦除flash的方法,还要增加写toc、写MBR的方法吧?我看bootloader中的烧写NK.BIN有写MBR和TOC的操作。

#12


我们以前弄的是直接固定地址的,因为你的NK一般是固定从flash某个位置写起的

#13


引用 12 楼  的回复:
我们以前弄的是直接固定地址的,因为你的NK一般是固定从flash某个位置写起的

是可以用固定地址。就是写完要写TOC和MBR吗?

#14


该回复于2012-05-16 12:52:26被版主删除

#15


以前我做过一个demo ,
试了一阵子,可以,后来TMD硬盘坏了。
程序不见了。

不过我写了博客,你去我的博客 搜索 更新 啥 的字眼应该还在的。
原理和app的代码我都贴出来了,
不过我的bootloader 烧写的是NK.nb0 ,没涉及TOC ,就比较简单。
不过TOC的东西, 你可以参考eboot去实现即可。

#16


引用楼主  的回复:
如题,应该要写个驱动,接收应用层指令,然后读取外部存储器(如U盘)里的NK.BIN进行更新,更新时要读写MBR,TOC吗?这个驱动该如何写?有做过成功的代码示例吗?跪谢分享。


你的思路是对的。
三星内部有这个东东,是以驱动的形式存在的。

#17


引用 16 楼  的回复:
你的思路是对的。
三星内部有这个东东,是以驱动的形式存在的。

哦?在哪里?能告诉我哪个文件或目录下吗?谢谢!

#18


引用 17 楼  的回复:
引用 16 楼 的回复:
你的思路是对的。
三星内部有这个东东,是以驱动的形式存在的。

哦?在哪里?能告诉我哪个文件或目录下吗?谢谢!


韩国三星内部有这个代码,未公开 ,不在BSP中。就是一个

#19


就是一个以驱动形式存在的EBOOT,可以这样理解。

#20


还是没有告诉如何详细操作的具体结果!!

#21


引用 20 楼  的回复:
还是没有告诉如何详细操作的具体结果!!


具体原理就是这样啊,代码是木有的

#22


顶一下,谁有系统起来后的升级NK.BIN的驱动源码呀?谢谢分享!

#23


引用 7 楼  的回复:
CE5.0和6.0机制不一样,CE5.0在应用层可以直接操作flash的扇区,而6.0不可以,所以贴出来意义也不大引用 6 楼  的回复:
引用 5 楼 的回复:
CE5.0上我们实现过,但是6.0实现起来够呛~

5.0如何实现的?能否贴一下代码?我改改看能否在6.0上实现。这样大家都可以学习一下。谢谢!


CE6.0做个驱动就好,意议还是挺大的。

#24


是呀,谁做过?分享一下经验和代码。谢谢

#25


应用程序可以开辟100MB的内存空间吗?应用层把NK.BIN读取到内存,然后传地址给驱动,让驱动连续地把NK.BIN写入到flash。还是只能一块一块(128KB)地传到驱动,然后驱动也一块一块地写进flash?

#26


我也打算做一个,我的想法是系统起来后,在应用程层将待更新的NK_new.bin放到NandFlash的一个目录中,然后下次开机时,在EBOOT起来后,找到这个目录下的文件,然后覆盖原来的NK。但这里有个问题,EBOOT下如何找到那个目录。

#27


EBOOT去做这事

#28


引用 26 楼  的回复:
我也打算做一个,我的想法是系统起来后,在应用程层将待更新的NK_new.bin放到NandFlash的一个目录中,然后下次开机时,在EBOOT起来后,找到这个目录下的文件,然后覆盖原来的NK。但这里有个问题,EBOOT下如何找到那个目录。

你的这种做法需要在eboot下分析flash的文件系统,比较麻烦。最好还是在系统运行过程中直接写flash,然后软件重启。

#29


引用 26 楼  的回复:
我也打算做一个,我的想法是系统起来后,在应用程层将待更新的NK_new.bin放到NandFlash的一个目录中,然后下次开机时,在EBOOT起来后,找到这个目录下的文件,然后覆盖原来的NK。但这里有个问题,EBOOT下如何找到那个目录。

你的这种做法需要在eboot下分析flash的文件系统,比较麻烦。最好还是在系统运行过程中直接写flash,然后软件重启。

#30


在应用层直接更新NK所在Flash对应块的话,NK的大小变化很大的话,就有可能把原来的应用程序也覆盖了,总有点不放心。因为我的内核中并没有包函应用程序,主要是方便分开升级。

#31


我的前面的问题欢迎多探讨呀。谢谢!

#32


http://blog.csdn.net/zhengmeifu/article/details/7611501 我的博客记录了我的想法。欢迎去看看。

#33


在线等高手指点。。。。

#34


在应用程序来直接更新内核,在/WINCE600/PUBLIC/COMMON/OAK/DRIVERS/BLOCK/MSFLASHFMD/下有多个FMD.cpp, fasl\, ram\, sdnpci\, sdnpci\, strata\下各自都有一个 不知是在哪个里改FMD_OEMIoControl。
另外DeviceIoControl传进去的句柄如何得到,通过CreateFile(TEXT("DSK1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)得到的是INVALID_HANDLE_VALUE

#35


我现在的想法是直接块写原来NK.BIN所在的块,写完后就写TOC,这样不知是否可以。看eboot下的代码是先打开binfs分区,然后传入分区句柄来更新nk.bin。

#36


如果在应用层直接写Flash,要解决几个问题:
1 应用层操作Flash的接口,http://blog.csdn.net/nanjianhui/article/details/2196466 这个贴子中有说到怎么实现, A)打开"DSK1:"失败, B)修改FMD.cpp中FMD_OEMIoControl函数,但不知哪个。
to zhengmeifu, 你试验过,这个可以实现吗?
2 要知道NK在Flash中起始位在哪,我看了EBOOT的代码,没找到在哪。
3 正在运行的应用程序允许擦除吗?