如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额0.1元起步,多少随意
声明:本文只用于个人学习交流,若不慎造成侵权,请及时联系我,立即予以改正
锋影
email:[email protected]
本文主要就探讨如下问题:
需求如下:
1.需要制作整盘flash镜像,提供给产线,批量烧录FLASH芯片。
2.产品使用过程中,不拆机情况下,将全部系统重装。
3.产品使用过程中,不拆机情况下,将系统重装,但保留用户数据。
涉及到的知识点有:
启动IPL如何开发,OS镜像如何制作,应用和数据文件系统如何制作,系统OS如何更新全部,如何保留数据更新os/apps。
通过本文档可以了解系统的启动过程,IPL,OS的定制,烧录和升级方式。
软件环境:QNX CAR2
分区 |
格式 |
大小 |
描述 |
OS |
FAT32 |
2M |
系统内核 |
rootfs |
QNX6 |
10M |
根文件系统 |
Apps |
QNX6 |
10M |
应用程序分区 |
Datas |
QNX6 |
Left all |
应用数据分区 |
n 启动时先将程序分区和数据分区分别挂载到目录 /opt/apps和/opt/datas目录下面。
Mount /dev/fs0p2 /opt/apps
Mount /dev/fs0p3 /opt/datas
n
Rootfs中的/opt/datas /opt/apps同样存在一份能初始的能正常运行的备份,以便在系统挂载两个分区失败时也能正常的启动。
n 挂载失败后的处理
系统中的异常检测模块监测分区挂载情况,在分区挂载失败后,自动进行分区的格式化并将根分区的初始数据拷贝到对应的分区。
如果分区修复成功,则通知系统进行重启。如果分区修复失败,则需要界面报错系统数据分区异常,需要检修。最好在主界面上有警告图标,在系统信息中可查询到详细的错误信息(显示分区挂载状态)。
n 分区异常时功能减化
当系统的数据分区挂载失败时,需要置相关系统标记,通知所的模块系统不再支持大数据量的存储(包括歌曲列表扫描,蓝牙电话本同步等),当用户使用此操作时,需要提示用户数据分区异常,功能暂不支持。
l
IPL的作用和功能
最低化的初始化相关硬件环境,让OS能运行起来。
1.从硬复位向量中第一个被执行。
2.设置存储控制器,包括片选和PCI控制器等。
3.配置时钟。
4.建立RAM内存堆栈,进行OS文件系统校验和拷贝OS启动程序到RAM中,将控制权跳转到OS的启动程序中。
l
IPL支持SD/USB卡启动
1.初始化硬件(via assembly-language code),存储控制器,时间等。
2.查找启动镜像(via image_scan()).,查找顺序为SD/USB/FLASH,如果SD/USB存在启动镜像,则从SD/USB启动,否则从FLASH启动。
3.拷贝启动镜像中的启动部分到RAM中(via image_setup())。
4.跳转到RAM中的启动部分,将控制权交由OS镜像。(via image_start()).
5.附上启动OS的校验/拷贝和跳转代码
checksum (image_paddr, startup_size)
checksum (image_paddr + startup_size, stored_size - startup_size)
copy (image_paddr, ram_paddr, startup_size)
jump (startup_vaddr)
l
IPL的烧写和升级
1.于系统ROM中,初始时可以需要进行芯片烧录。
2.支持整片芯片的夹具烧录。
3.支持UI界面烧录:
开发SPI总结ROM芯片写程序,在UI层调用此烧录程序直接写BIN文件。
l
IPL的开发用例
1.以下为IPL的源码目录结构
2.以下为IPL的用例代码:
#include "ipl.h"
unsigned int image;
int main (void)
{
/*
* Image is located at 0x2840000
* Therefore, we don't require an image_download_8250 function
*/
image = image_scan (0x2840000, 0x2841000);
/*
* Copy startup to ram; it will do any necessary work on the image
*/
image_setup (image);
/*
* Set up link register and jump to startup entry point
*/
image_start (image);
return (0);
}
QNX中镜像分为:
1.启动镜像
内容包括:neutrino os,启动单元,执行程序及相关的库,数据和文件。
每个QNX系统必需仅包含一个启动镜像,只读,启动镜像的格式如下:
l Boot prefix的地址,通过virtual= or
physical= attribute属性拽定FLASH中的物理起始地址。
l boot prefix, startup header, startup, and startup trailer只是带启动功能的镜像中出现。
l the startup trailer the image trailer中定义的相关的checksum。
2.非启动镜像
用于一些独立的,独立配置的场景。具体用处未知。只读。
1.
利用mkifs工具制作neutrino启动镜像。
2.
利用mkefs工具制作apps程序分区镜像。
3.
利用mkefs工具制作datas数据分区镜像。
4.
利用mkimage工具将以下三个镜像整合为一个镜像。
5.
利用mkrec工具进行镜像的FLASH格式转化。(可选)
6.
利用cat或cp工具,将镜像拷贝到FLASH中(/dev/fsp0)。
n
设置环境变量
export PATH=/opt/bins:$PATH
export LD_LIBRARY_PATH=/opt/bins:$ LD_LIBRARY_PATH
n
在buildfile脚本的文件名前加入相关的权限
# 文件权限设置
[uid=0 gid=0 perms=0666] file1
# 批量设置文件权限
[uid=5 gid=1 perms=0666]
file1
file2
file3
file4
# 内嵌文件的权限为执行mkifs的用户权限。
n
文件目录放置
# 将本地/release_1.0的目录及所属放置于目标版的/product目录下。
/product=/release_1.0
n
生成image
mkifs shell.bld shell.ifs
n
显示image内容
Dumpifs
n
整合FLASH整片文件系统
1.
利用mkifs创建带启动功能的rootfs文件系统.
mkifs rootfs.bld
rtoofs.ifs
2.
利用mkefs创建FLASH APP和DATAS分区文件系统
mkefs appfs.bld
app.ifs
mkefs datafs.bld
data.ifs
mkimage nto.ifs fs.ifs > flash.ifs
mkrec -s 256k flash.ifs > flash.srec
n
擦除FLASH
flashctl -p /dev/fs0 -e
n
FHASH烧写
cat ipl_image flash_image > /dev/fs0
cat flash_image > /dev/fs0p1
1.
整盘恢复(清空用户数据)
n 制作内核镜像,启动镜像,应用镜像和数据镜像,并将四个镜像文件合并为一个镜像target.img。
n 制作SD/USB卡启动镜像,包含待升级的target.img;内置一个应用程序,功能为:利用cp工具读取target.img文件,并写入到FLASH中,界面显示升级进度条及相关风险提示信息。
n 制作IPL,支持启动顺序为:SD/USB/FLASH。
n 插入SD卡启动镜像,自动完成升级,升级完成后拔出SD卡。
2.
整盘恢复(保留用户数据)
n 制作内核镜像,启动镜像,应用镜像。
n 制作SD/USB卡启动镜像,包含以上的三个镜像;内置一个应用程序,功能为:利用cp工具将以上三个镜像分别写入相应的FLASH分区中,界面显示升级进度条及相关风险提示信息。
cat rootfs_image > /dev/fs0p3
cat app_image > /dev/fs0p2
cp os_image /dev/fs0p1
n 制作IPL,支持启动顺序为:SD/USB/FLASH。
n 插入SD卡启动镜像,自动完成升级,升级完成后拔出SD卡。
[virtual=x86,bios +compress] .bootstrap = {
startup-bios
PATH=/proc/boot:/bin procnto
}
[+script] .script = {
devc-con -e -n5 &
reopen /dev/con1
devf-i365sl -r -b3 -m2 -u2 -t4 &
waitfor /fs0p0
[+session] TERM=qansi PATH=/proc/boot:/bin esh &
}
[type=link] /tmp=/dev/shmem
[type=link] /bin=/fs0p0/bin
[type=link] /etc=/fs0p0/etc
libc.so
[type=link] /usr/lib/ldqnx.so.2=/proc/boot/libc.so
libsocket.so
[data=copy]
devf-i365sl
devc-con
esh
1. 根分区如何挂载和制作,还是直接规划到OS image中。
2. 应用和数据分区是做成QNX6文件系统还是做成ETFS文件系统(征对FLASH),如何制作。
3. 以上为大体的方案,但是细节地方还是有些需要深入研究。比如:
FLASH分区有FAT,QNX6等,是否能将各分区的文件系统合并成一个文件进行烧录?
比如数据和应用分区是用mkefs生成ffs3的文件系统还是利用mketfs生成etfs的文件系统好?