[转]QNX系统开发-镜像制作及烧录分析

如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额0.1元起步,多少随意

声明:本文只用于个人学习交流,若不慎造成侵权,请及时联系我,立即予以改正

锋影

email:[email protected]

 

引言

1.1      文档内容

    本文主要就探讨如下问题:

    需求如下:

1.需要制作整盘flash镜像,提供给产线,批量烧录FLASH芯片。

2.产品使用过程中,不拆机情况下,将全部系统重装。

3.产品使用过程中,不拆机情况下,将系统重装,但保留用户数据。

涉及到的知识点有:

启动IPL如何开发,OS镜像如何制作,应用和数据文件系统如何制作,系统OS如何更新全部,如何保留数据更新os/apps。

通过本文档可以了解系统的启动过程,IPL,OS的定制,烧录和升级方式。

1.2适用平台

软件环境:QNX CAR2

 

1.      
FLASH分区

分区

格式

大小

描述

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         分区异常时功能减化

当系统的数据分区挂载失败时,需要置相关系统标记,通知所的模块系统不再支持大数据量的存储(包括歌曲列表扫描,蓝牙电话本同步等),当用户使用此操作时,需要提示用户数据分区异常,功能暂不支持。

2.      
系统创建流程

2.1制作引导程序(IPL)

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);

}

2.2镜像定义

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.非启动镜像

用于一些独立的,独立配置的场景。具体用处未知。只读。

2.3制作启动镜像(FLASH)

 

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

3.      
系统灾难恢复方法

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卡。

4.      
附录

4.1制作启动镜像的脚本用例

[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

5.      
      问题探讨

1.         根分区如何挂载和制作,还是直接规划到OS image中。
2.         应用和数据分区是做成QNX6文件系统还是做成ETFS文件系统(征对FLASH),如何制作。
3.         以上为大体的方案,但是细节地方还是有些需要深入研究。比如:
      FLASH分区有FAT,QNX6等,是否能将各分区的文件系统合并成一个文件进行烧录?
      比如数据和应用分区是用mkefs生成ffs3的文件系统还是利用mketfs生成etfs的文件系统好?

你可能感兴趣的:(操作系统平台,QNX,OS_BSP,blackberry)