CE设备上要加上一个设备唯一码的功能,就是设备的ID,用于识别该唯一的设备。
唯一码应该只有生产商具有可写权限,用户只有只读权限。而且必须是非易失性的,那么就必须存放在Nandflash之类的存储器上。
这样子的话,就有几种方法可用:
1、专门开辟一个物理块用于存放该数据
2、参考LoongEmbedded说的在TOC中添加设备的ID信息
以上两种方法都涉及到Eboot和Nandflash驱动。
第二种方法LoongEmbedded的博客上有说,可以参考:http://blog.csdn.net/loongembedded/article/details/11784395
直接在TOC上面添加设备信息,这个有一定的风险,如果操作不当的话,可能会把系统的入口地址给冲掉。而且,在重新烧写Eboot之后,也可能会把设备的ID给刷掉。
我曾使用过这种方法,但是在写完之后,发现无法进入系统,因为已经找不到系统的入口地址了。但是写进去的数据和读取出来的块数据看上去是正常的
后来,我改用了第一种方法,直接开一个块来存放这个设备ID。并把这个块作为保留块。
Nandflash的0、1、2 block都是保留的,用于NBOOT、TOC和EBOOT的信息存放,而接下来如果没有其他占用块的话,那么应该就是MBR的块。
我直接把 block 3 也设置为保留块,用于存放这个设备ID。
【注意】如果你没有IROM的源码这样修改没啥用处,只要你从SD模式下烧写了NK和Eboot之后就会把block 3中的数据也给刷没了。
添加block 3为保留块,可以参考设置TOC 、 Eboot等为保留块是如何配置的,然后再修改一下NK的起始块就OK。
我在Eboot和IROM中添加了设备ID的读取和调试信息显示,然后在 Nandflash驱动中添加了读取和写入设备ID的接口,然后APP层通过调用 DSK1: 设备的这两个接口
来读写设备ID。
在弄这个功能的时候遇到N多问题,如:写入设备ID,重启后发现Nandflash的数据都没了,更有甚者系统都启动不了。写入后再读取出来发现正常,
但重启后发现数据不见了的问题。还遇到可以打开DSK1: 设备,但发现访问添加的那两个接口时返回了 87的错误。
最离谱的是可以打开 DSK1: 设备,但是访问接口时发现没有任何反应,最后发现原来打开的这个设备既然是假死状态的,联机只看到该设备为活动的,但具体是哪个dll
等信息都看不到。
【注意】要注意修改Nandflash驱动后,要编译相关有引用该库的驱动,然后重新打包NK来测试。在写入块数据的时候,要注意在写完一个sector的数据有,要把对应的保留块等信息写在该块的最后一页上面。
在修正上述的所有问题后,测试发现无论是在SD模式下烧写Eboot、NK还是在Nand启动模式下烧写NK都不会把写入的设备ID给冲掉,除非是设备ID的那个block出现坏块
或者Nandflash坏了,才会出现不见的情况。