產(chǎn)品開發(fā)流程及每個(gè)流程內(nèi)容網(wǎng)站優(yōu)化網(wǎng)站優(yōu)化
全志ARM926 Melis2.0系統(tǒng)的開發(fā)指引⑥
- 編寫目的
- 9. 系統(tǒng)啟動(dòng)流程
- 9.1. Shell 部分
- 9.2.Orange 和 desktop 部分
- 9.3. app_root 加載部分
- 9.4. home 加載部分
- 10. 顯示相關(guān)知識(shí)概述
- 10.1. 總體結(jié)構(gòu)
- 10.2. 顯示過(guò)程
- 10.3. 顯示寬高參數(shù)關(guān)系
- -. 全志相關(guān)工具和資源
- -.1 全志固件鏡像修改工具 ImageModify.exe 下載
- -.2 全志固件USB刷機(jī)工具 PhoenixSuit 下載
- -.3 全志Melis2.0 用戶手冊(cè).pdf下載
- -.4 全志melis2.0 sdk源碼庫(kù)下載
編寫目的
本文檔是全志 Melis2.0 系統(tǒng)的開發(fā)指引文檔,旨在協(xié)助開發(fā)者了解和掌握 Melis 系統(tǒng),快速搭建 Melis系統(tǒng)的開發(fā)環(huán)境,將 Melis2.0 系統(tǒng)應(yīng)用到產(chǎn)品開發(fā)中。
9. 系統(tǒng)啟動(dòng)流程
系統(tǒng)加載流程:boot0- boot1-kernel(epos.img)-shell
當(dāng)硬件目標(biāo)平臺(tái)上電后,BROM 就會(huì)將 BOOT0 裝載到 SRAM 中,并從 SRAM 開始執(zhí)行,將控制權(quán)交給 eBoot。
eBoot 的啟動(dòng)流程分為兩個(gè)階段:
第一個(gè)階段是 BOOT0 加載 BOOT1,BOOT0 將 BOOT1 裝載到 DRAM,在 DRAM 上執(zhí)行;
第二個(gè)階段是 BOOT1 加載系統(tǒng)內(nèi)核,BOOT1 將內(nèi)核裝載到 DRAM。
每個(gè)階段分別初始化各自所須的硬件資源,同時(shí)也為下一個(gè)階段做好準(zhǔn)備工作。本文主要說(shuō)明從 shell
部分到 home 應(yīng)用的建立。具體流程如下圖:
圖57:
下面結(jié)合代碼進(jìn)行系統(tǒng)加載流程說(shuō)明:
9.1. Shell 部分
系統(tǒng)初始化完成之后首先進(jìn)入 Shell 進(jìn)行初始化操作(路徑:suniv\beetles\ramfs
shell.zgj)。 Shell 部分主要函數(shù)是 shellmain()它主要調(diào)用三個(gè)函數(shù),分別是 Esh_init() 、
Esh_StartUp()、Esh_ReaderLoop()。
Esh_init():主要完成一些必要文件的獲取路徑,申請(qǐng)資源等操作。
Esh_StartUp():檢查并執(zhí)行 Esh_init()函數(shù)獲取的 script。(路徑:suniv\beetles\ramfs\ startup.esh)
Startup.esh:腳本執(zhí)行 startx。查看 Esh_builtin.c 文件中定義:shell 命令 startx 調(diào)用的是 dostart.c
dostartx.c:__exec_startx()。該函數(shù)完成 desktop.mod 和 orange.mod 兩個(gè)模塊的加載和檢查。
Esh_ReaderLoop():主要完成 shell 命令讀取和執(zhí)行。等待模塊、驅(qū)動(dòng)、窗口等部分安裝初始化完成后,
在循環(huán)中不斷讀取串口的調(diào)試命令進(jìn)行處理??蓤?zhí)行的命令均在 Esh_builtin.c 文件中。
9.2.Orange 和 desktop 部分
模塊加載:以 desktop.mod 為例,查看 mod_desktop 文件夾下面的 make.cfg 有
TARGET = $(WORKSPACEPATH)/beetles/rootfs/mod/desktop.mod
查看入口代碼文件 magic.c 找到初始化接口:在 desktop 模塊的 MOpen 函數(shù)中加載了 init 模塊:
模塊加載:查看 init 文件夾下面的 make.cfg 有
TARGET = $(WORKSPACEPATH)/beetles/rootfs/apps/init.axf。
首先查看 magic.c 文件,在 MOpen 函數(shù)中創(chuàng)建了一個(gè)線程 application_init_process。
Desktop 模塊加載完成之后加載 init 模塊。Init 模塊創(chuàng)建一個(gè)應(yīng)用初始化線程 application_init_process。
線程首先裝載必要的驅(qū)動(dòng),例如音頻驅(qū)動(dòng)、按鍵驅(qū)動(dòng)等。接下來(lái)是卡量產(chǎn)的必要準(zhǔn)備工作,這里不做過(guò)多研究。該線程最重要的三項(xiàng)工作是:
1、創(chuàng)建主管理窗口,用于消息的接受和預(yù)處理。該窗口名稱為 init_mainwin。關(guān)于窗口的分類以及功
能見(jiàn)其他章節(jié)。窗口創(chuàng)建時(shí)向自身發(fā)送 GUI_MSG_CREATE 消息,進(jìn)行初始化操作。
init_mainwin 消息主管理窗口負(fù)責(zé)消息預(yù)處理,新消息先經(jīng)過(guò)本窗口,收到之后在回調(diào)函數(shù)
init_mainwin_cb()中進(jìn)行預(yù)處理。在調(diào)試階段可以在這里將經(jīng)過(guò)的消息打印出來(lái),查看消息是否被傳遞到主消息窗口,之后再一級(jí)級(jí)向下尋找消息傳播路徑。
2、在消息循環(huán)前在_process_init()函數(shù)中加載 app_root 應(yīng)用和注冊(cè)鉤子函數(shù)。鉤子函數(shù)的作用是從
input 輸入子系統(tǒng)中拿消息。
3、啟動(dòng)消息接收和分發(fā)服務(wù)
9.3. app_root 加載部分
在 applets 文件夾下的 make.cfg 有
TARGET = $(WORKSPACEPATH)/beetles/rootfs/apps/app_root.axf
這正是 inti 部分加載的 app_rootfs.axf 文件。首先創(chuàng)建根管理窗口 APP_ROOT。
首 先 調(diào) 用 app_root_wincreat() 函 數(shù) 創(chuàng) 建 一 個(gè) 管 理 窗 口 , 其 父 窗 口 是 init 創(chuàng) 建 的 根 窗 口
init_mainwin ,名字是 APP_ROOT,并且有一個(gè)重要參數(shù) ManWindowProc(管理窗口消息處理過(guò)程),注冊(cè)的回調(diào)函數(shù)為app_root_win_proc()。父窗口 init_mainwin 發(fā)送的消息首先在這里被處理,或者將子窗口的消息發(fā)送給父窗口。窗口創(chuàng)建時(shí)向自身發(fā)送 GUI_MSG_CREATE 消息,進(jìn)行初始化操作。
app_root_win_proc()函數(shù)完成消息處理任務(wù)。其中較為重要的是 GUI_MSG_CREATE 和 GUI_MSG_COMMAND以及 GUI_MSG_KEY 三種消息。不需要處理的消息交給默認(rèn)流程往下分發(fā)。
接收到 GUI_MSG_CREATE 進(jìn)行應(yīng)用創(chuàng)建。
接收到 GUI_MSG_COMMAND,處理子窗口向父窗口發(fā)送來(lái)的消息。根據(jù) app 的 ID 進(jìn)行各個(gè) app 之間的切換。包括資源的關(guān)閉打開等。
接收到 GUI_MSG_KEY 進(jìn)行按鍵消息處理,完成按鍵響應(yīng),或者直接攔截按鍵消息。
9.4. home 加載部分
APP_ROOT 的回調(diào)函數(shù)接收到 GUI_MSG_CREATE 消息,繼續(xù)進(jìn)行桌面創(chuàng)建。首先進(jìn)行內(nèi)存資源申請(qǐng),創(chuàng)建子管理窗口 APP_HOME。創(chuàng)建函數(shù)為 app_home_create()。Home 管理窗口的名字是 APP_HOME,父管理窗口為APP_ROOT,消息處理回調(diào)函數(shù)為 app_home_proc()。窗口創(chuàng)建時(shí)向自身發(fā)送 GUI_MSG_CREATE 消息繼續(xù)進(jìn)行初始化操作。
app_home_proc()函數(shù)主要完成消息處理任務(wù),其中較為重要的是 GUI_MSG_CREATE 和 GUI_MSG_COMMAND以及 GUI_MSG_KEY 三種消息。不需要處理的消息交給默認(rèn)流程往下分發(fā)。
接收到 GUI_MSG_COMMAND,處理子窗口向本窗口發(fā)送的消息。
接收到 GUI_MSG_KEY 進(jìn)行按鍵消息處理,完成按鍵響應(yīng),或者直接攔截按鍵消息。
接收到 GUI_MSG_CREATE 接著完成一系列初始化操作:
其中 app_main_menu_create()創(chuàng)建主菜單圖層窗口,申請(qǐng)圖層,圖層大小與屏幕大小一致。另外創(chuàng)建framewin 窗口依賴在圖層窗口之上。framewin 管理窗口為 APP_HOME,回調(diào)函數(shù)為_main_menu_Proc()創(chuàng)建 framewin 窗口時(shí)向自身發(fā)送 GUI_MSG_CREATE 和 GUI_MSG_PAINT 消息,進(jìn)行資源初始化和桌面繪制。
_main_menu_Proc()函數(shù)主要完成消息處理任務(wù),其中較為重要的是 GUI_MSG_CREATE 和 GUI_MSG_PAINT以及 GUI_MSG_KEY 三種消息。不需要處理的消息交給默認(rèn)流程往下分發(fā)。
接收到 GUI_MSG_PAINT,繪制桌面內(nèi)容,有些應(yīng)用該消息未使用,直接在 GUI_MSG_CREATE 完成繪制。
接收到 GUI_MSG_KEY,進(jìn)行按鍵消息處理,完成按鍵響應(yīng)。
接收到 GUI_MSG_CREATE,初始化 ui 資源,繪制桌面,激活桌面顯示:
至此,應(yīng)用桌面創(chuàng)建完成。
10. 顯示相關(guān)知識(shí)概述
10.1. 總體結(jié)構(gòu)
應(yīng)用層:melis 的默認(rèn)應(yīng)用名為“beetles”,它是獨(dú)立于內(nèi)核的一個(gè)應(yīng)用軟件。它通過(guò)調(diào)用“Orange GUI”和“Display Driver”的各項(xiàng)接口,實(shí)現(xiàn)了消息轉(zhuǎn)發(fā),窗口繪制和圖像顯示。
BSP-Orange :Orange 是基于 Melis 操作系統(tǒng)之上的一套 GUI 系統(tǒng),支持多任務(wù)多圖層等操作,給上層提供了豐富的 UI 工具。
BSP-Display_driver: Display 驅(qū)動(dòng)是 Melis 內(nèi)核對(duì)底層硬件接口的封裝,屏蔽硬件差異,提供一致的接口給上層。所有的顯示相關(guān)操作,最終都將依賴于該驅(qū)動(dòng)。
硬件層:真正實(shí)現(xiàn)顯示的硬件模塊。最主要的模塊是 DE(display engine)和 TCON。DE 主要的工作是將上層傳入的圖層數(shù)據(jù)進(jìn)行裁剪、格式轉(zhuǎn)換、放大縮小等相關(guān)操作,然后將數(shù)據(jù)輸送到 TCON。
10.2. 顯示過(guò)程
當(dāng)應(yīng)用層想要顯示一個(gè)圖層,則需要向驅(qū)動(dòng)層請(qǐng)求一個(gè)可用的圖層,然后將自己的顯示參數(shù)(圖層模式,數(shù)據(jù)格式,數(shù)據(jù)寬高,數(shù)據(jù) buf 地址等)設(shè)置到圖層中,就可以將數(shù)據(jù)顯示到屏幕上。偽代碼如下:
在這些參數(shù)中要注意 buf 的設(shè)置,因?yàn)椴煌袷降臄?shù)據(jù),其存儲(chǔ)方式存在差異。
當(dāng)顯示的數(shù)據(jù)是 ARGB8888 數(shù)據(jù)時(shí),其 buf 長(zhǎng)度應(yīng)該是“width * height * 4”,A、R、G、B 各有一份自己的數(shù)據(jù),但因?yàn)檫@些數(shù)據(jù)都是連續(xù)交替的存放的,只要數(shù)據(jù)格式一定,對(duì)應(yīng)數(shù)據(jù)的位置也是固定的,所以這里只需要給“l(fā)ayer_para.fb.addr[0]”設(shè)置地
當(dāng)顯示數(shù)據(jù)是 YUV 數(shù)據(jù)時(shí),常常 Y、U、V 數(shù)據(jù)是分開存儲(chǔ)或者 Y 數(shù)據(jù)和 UV 數(shù)據(jù)是分開存儲(chǔ)的,所以可能會(huì) 存 在 多 個(gè) buf 地 址 的 情 況 , 這 時(shí) 就 要 用 到 “ layer_para.fb.addr[0] ” 、 “ layer_para.fb.addr[1] ” 、“l(fā)ayer_para.fb.addr[2]”參數(shù)配合使用。設(shè)置好地址后,DE 會(huì)自動(dòng)將 BUF 合并,然后將圖層傳送到 Tcon 中。
10.3. 顯示寬高參數(shù)關(guān)系
各個(gè)寬高參數(shù)間有對(duì)應(yīng)的關(guān)系。寬高和位置的設(shè)置,主要是為了靈活地顯示一張圖片中的內(nèi)容。當(dāng)只需要顯示一張圖片的某個(gè)部分、或者僅將圖片在屏幕的某個(gè)位置上顯示時(shí),就需要對(duì)各個(gè)寬高進(jìn)行特定配置。傳入?yún)?shù)中的圖層 buf,我們可以認(rèn)定為這是一整張圖片,稱這個(gè) buf 為“frame buffer”,其寬高為“l(fā)ayer_para.fb.size.width ”和“l(fā)ayer_para.fb.size.height”,而我們可以設(shè)置一個(gè)窗口,讓我 們 在 顯 示 過(guò) 程 中 , 僅 顯 示 窗 口 中 的 內(nèi) 容 , 這 個(gè) 窗 口 從 ( layer_para.src_win.x ,
layer_para.src_win.y ) 坐 標(biāo) 開 始 , 顯 示 寬 為 “l(fā)ayer_para.src_win.width ” 、 高 為
“l(fā)ayer_para.src_win.height”的內(nèi)容。這里可以看出,“src_win”的寬高必須要比“fb.size”的寬高小
或者相等,且坐標(biāo)也不能越界,否則顯示是不正常的。
當(dāng)截取到一個(gè)窗口后,這個(gè)窗口的數(shù)據(jù)將鋪滿“SCN”(顯示窗口),“src_win”和“scn_win”
的比值,將是這個(gè)窗口被拉伸縮小的倍數(shù),當(dāng)然,最好不要設(shè)置比較奇怪的比值(一般的比值
都是 1、2、1/2)否則將會(huì)讓顯示不成功,或者顯示不正常。
最后,顯示窗口“scn_win”將從(scn_win.x ,scn_win.y)點(diǎn)開始在屏幕上顯示,顯示寬為
“scn_win.width”,高為“scn_win.height”的圖層。
-. 全志相關(guān)工具和資源
-.1 全志固件鏡像修改工具 ImageModify.exe 下載
下載地址:
固件鏡像修改工具 ImageModify.exe下載 ImageModify_20230906.rar
-.2 全志固件USB刷機(jī)工具 PhoenixSuit 下載
下載地址:
USB刷機(jī)工具 PhoenixSuit下載 PhoenixSuit_CN_V1.1.1_20230906.rar
-.3 全志Melis2.0 用戶手冊(cè).pdf下載
下載地址:
全志Melis2.0 用戶手冊(cè).pdf下載 documents_20230906_melis_v2.0.rar
-.4 全志melis2.0 sdk源碼庫(kù)下載
下載地址:
全志melis2.0 sdk源碼庫(kù)下載 melis2.0-sdk-release_20230906V2.0.rar