孫德生
(深圳智者行天下科技有限公司, 廣東 深圳 518133)
從2018年5月開(kāi)始,在美國(guó)銷售的所有新車必須配備后視攝像系統(tǒng)[1]。倒車影像顯示系統(tǒng)由最初的倒車?yán)走_(dá)改進(jìn)而來(lái),裝在車尾的倒車攝像頭攝取車輛尾部的畫(huà)面,通過(guò)傳輸線送到車載終端上[2],比如智能后視鏡,通過(guò)圖像的方式顯示車輛周圍的障礙物,幫助駕駛者了解車輛后方情況,及時(shí)發(fā)現(xiàn)障礙物,增強(qiáng)視野、輔助駕駛員安全倒車。
目前車載中控主機(jī)和智能后視鏡基本上是基于Android系統(tǒng),都有倒車影像顯示功能,但是基本上都是等系統(tǒng)啟動(dòng)完成后才能處理倒車影像,因此在車輛熄火時(shí),系統(tǒng)只是做低功耗待機(jī),一旦打火可以立即喚醒響應(yīng)倒車事件,但是為了保障汽車蓄電池電量不影響下次打火不能過(guò)多消耗,系統(tǒng)都設(shè)計(jì)了待機(jī)超過(guò)了一定時(shí)間就主動(dòng)關(guān)機(jī)切斷電源,比如3天、7天。Android系統(tǒng)在關(guān)機(jī)后系統(tǒng)重新啟動(dòng)時(shí)間較長(zhǎng),一般都要15s以上,在啟動(dòng)的這段時(shí)間里,若需要倒車就只能等待系統(tǒng)啟動(dòng)完成。少數(shù)優(yōu)質(zhì)產(chǎn)品提供在系統(tǒng)內(nèi)核中倒車的解決方案,啟動(dòng)系統(tǒng)的內(nèi)核層后當(dāng)檢測(cè)到有倒車信號(hào),啟動(dòng)攝像頭并將圖像數(shù)據(jù)存儲(chǔ)在特定位置內(nèi)存中,然后顯示內(nèi)存從該內(nèi)存中讀取圖像數(shù)據(jù)并顯示圖像數(shù)據(jù)形成倒車影像[3]。提供了快速顯示倒車影像的方法,一定程度上解決了系統(tǒng)啟動(dòng)時(shí)倒車影像顯示慢的問(wèn)題。但是系統(tǒng)從上電要先經(jīng)過(guò)bootloader引導(dǎo),加載、初始化內(nèi)核,到具備內(nèi)核倒車能力也需要5s左右。有些車載終端還設(shè)計(jì)了雙系統(tǒng),加入一個(gè)小系統(tǒng)來(lái)專門(mén)處理倒車影像,但是這種系統(tǒng)的成本比較高,市場(chǎng)接受度不高。
本文提出在bootloader中完成倒車影像顯示的方法,通過(guò)改造bootloader,在bootloader中檢測(cè)倒車,有倒車時(shí)直接初始化攝像頭驅(qū)動(dòng),將獲取的圖像原始數(shù)據(jù)存儲(chǔ)到物理內(nèi)存中再傳遞給顯示引擎圖層,顯示引擎啟動(dòng)兩個(gè)圖層,靠前的圖層用于顯示倒車警示線,靠后的圖層用于顯示視頻圖像,這樣就快速處理了倒車影像的顯示功能,從系統(tǒng)上電到完成倒車影像顯示在2.5s以內(nèi),大大減少了系統(tǒng)啟動(dòng)時(shí)等待倒車影像的時(shí)間,提高了駕駛安全系數(shù),該方法不增加任何硬件成本,經(jīng)濟(jì)性好便于普及應(yīng)用。
本文提出快速處理倒車影像的系統(tǒng)運(yùn)行在智能后視鏡上,基于全志T3平臺(tái),起到了輔助駕駛員安全倒車的作用。
在智能后視鏡系統(tǒng)中倒車影像顯示處理的硬件原理框圖如圖1所示。
圖1 系統(tǒng)倒車硬件原理框圖
倒車攝像頭將車尾的圖像通過(guò)串行器轉(zhuǎn)化為AHD模擬高清信號(hào),再通過(guò)AHD傳輸線束送到智能后視鏡,先通過(guò)AHD解串器將模擬高清信號(hào)解碼轉(zhuǎn)換成BT656信號(hào)再接入主控T3的CSI模塊,CSI控制器將收到圖像數(shù)據(jù)交給運(yùn)行在T3上的軟件系統(tǒng)再做其他處理,比如顏色空間轉(zhuǎn)換、圖像翻轉(zhuǎn)、裁剪等,將處理好的視頻圖像信號(hào)交給顯示模塊通過(guò)LVDS信號(hào)輸出到顯示屏幕上。為了檢測(cè)倒車信號(hào),倒車檢測(cè)線需要接到車輛的制動(dòng)信號(hào)線或者制動(dòng)燈上,倒車信號(hào)的檢測(cè)是基于GPIO電平觸發(fā),倒車時(shí)系統(tǒng)收到中斷信號(hào)再做倒車處理。也可來(lái)自于汽車的CAN總線獲取倒車信號(hào)關(guān)鍵信號(hào),縮短信號(hào)解析周期,提高快速倒車的響應(yīng)速度[4]。
Android系統(tǒng)啟動(dòng)流程如圖2所示。
圖2 Android系統(tǒng)啟動(dòng)流程圖
系統(tǒng)上電,引導(dǎo)固化在芯片自帶ROM里的代碼預(yù)定義的地方開(kāi)始執(zhí)行,加載引導(dǎo)程序BootLoader到RAM中,Boot-Loader初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),加載內(nèi)核kernel,然后跳轉(zhuǎn)到kernel運(yùn)行,kernel啟動(dòng)時(shí)會(huì)設(shè)置緩存、被保護(hù)存儲(chǔ)器、計(jì)劃列表、加載驅(qū)動(dòng)。當(dāng)內(nèi)核完成系統(tǒng)設(shè)置時(shí),它首先在系統(tǒng)文件中尋找init.rc文件,并啟動(dòng)init進(jìn)程。Init再去引導(dǎo)Zygote,Zygote負(fù)責(zé)加載各種系統(tǒng)服務(wù),Activity Manager Service運(yùn)行完成后會(huì)拉起Launcher,顯示系統(tǒng)安裝的應(yīng)用程序的快捷圖標(biāo),發(fā)送BOOT_COMPLETED通知系統(tǒng)啟動(dòng)完成。
從啟動(dòng)流程上,BootLoader是系統(tǒng)運(yùn)行的引導(dǎo)程序,是最早運(yùn)行的可控制程序,因此在系統(tǒng)上電后最快能處理倒車影像系統(tǒng)的最優(yōu)階段,但是因?yàn)锽ootLoader里面沒(méi)有系統(tǒng)的概念,處理復(fù)雜的倒車影像難度大,也正是本文要解決的核心創(chuàng)新點(diǎn)。
BootLoader是一段裸機(jī)程序,是直接與硬件打交道的。U-boot 就 是 這 樣 一 種BootLoader,U-boot 全 稱 為Universal Boot Loader,是遵循GPL條款的開(kāi)放源碼項(xiàng)目。本節(jié)將深入分析在U-boot中實(shí)現(xiàn)倒車影像顯示功能。
U-Boot啟動(dòng)可以兩個(gè)階段,第1階段由匯編語(yǔ)言完成,完成一些與平臺(tái)相關(guān)的硬件設(shè)置,完成CPU模式切換,關(guān)閉看門(mén)狗,初始化內(nèi)存控制器,設(shè)置堆棧,加載第2階段代碼到RAM空間,最后跳轉(zhuǎn)到第2階段代碼入口運(yùn)行。第2階段代碼主要由C語(yǔ)言完成,與板相關(guān),主要完成所有設(shè)備的初始化工作,配置電源輸出,初始化環(huán)境變量,設(shè)置可用的RAM,顯示RAM大小,初始化EMMC,初始化顯示引擎,加載圖片解碼庫(kù),打開(kāi)LCD背光,顯示開(kāi)機(jī)圖片,最后加載系統(tǒng)內(nèi)核,再把CPU的控制權(quán)交出并跳轉(zhuǎn)到內(nèi)核入口地址啟動(dòng)操作系統(tǒng)[5]。
從U-boot的啟動(dòng)流程上分析,在顯示開(kāi)機(jī)圖片的位置系統(tǒng)的顯示系統(tǒng)已經(jīng)工作起來(lái),并且EMMC也已經(jīng)做操作,因此在開(kāi)機(jī)圖片顯示前面來(lái)實(shí)現(xiàn)倒車影像功能具備了一定基礎(chǔ),是最佳位置。
實(shí)現(xiàn)倒車影像顯示功能,還需要完成幾個(gè)功能,首先需要做倒車信號(hào)的檢測(cè),發(fā)現(xiàn)有倒車信號(hào),然后進(jìn)入倒車影像處理功能模塊做相關(guān)處理。工作流程如圖3所示。
圖3 U-boot倒車影像處理流程圖
檢測(cè)倒車信號(hào)基于GPIO電平,無(wú)倒車信號(hào)繼續(xù)正常運(yùn)行U-boot順序執(zhí)行,如果有倒車信號(hào)就立即進(jìn)入倒車處理,首先初始化解碼信號(hào)做AHD信號(hào)解碼,再初始化CSI模塊接收攝像頭數(shù)據(jù)到指定安全此階段不會(huì)被自動(dòng)分配的物理存儲(chǔ)位置,如何開(kāi)啟主控的視頻顯示圖層,將視頻數(shù)據(jù)的位置、格式、分辨率等重要參數(shù)傳給視頻顯示圖層,完成攝像頭數(shù)據(jù)到視頻圖層的數(shù)據(jù)綁定,實(shí)現(xiàn)最核心的一步。接著讀取EMMC中存儲(chǔ)的倒車相關(guān)設(shè)置信息,比如視頻顯示區(qū)域裁剪參數(shù)、是否開(kāi)啟倒車警示線。如果要顯示倒車警示線,需要再?gòu)腅MMC指定文件分區(qū)讀取倒車警示線圖片,再做圖片解碼,再將解碼后的數(shù)據(jù)送到主控的UI顯示圖層[6]。至此倒車影像顯示已經(jīng)工作起來(lái),需要持續(xù)監(jiān)測(cè)倒車信號(hào)是否退出了,若沒(méi)有退出就持續(xù)顯示倒車,若退出倒車需要做相應(yīng)處理,比如關(guān)閉顯示的視頻圖層,關(guān)閉復(fù)位解碼器芯片、CSI控制器,清零視頻數(shù)據(jù)用到的內(nèi)存空間。然后繼續(xù)執(zhí)行Uboot,顯示開(kāi)機(jī)圖片,加載內(nèi)核,讓內(nèi)核繼續(xù)引導(dǎo)Android系統(tǒng)正常啟動(dòng)。
在系統(tǒng)的硬件設(shè)計(jì)上有一個(gè)MCU,負(fù)責(zé)主控供電,考慮防抖延時(shí)監(jiān)測(cè)倒車信號(hào)持續(xù)有效超過(guò)500ms后有穩(wěn)定信號(hào)后才會(huì)給到主控T3[7]。U-boot在啟動(dòng)過(guò)程中檢測(cè)倒車信號(hào)處理倒車。內(nèi)核啟動(dòng)完成后可以處理倒車影像功能[3]。內(nèi)核從開(kāi)始啟動(dòng)到啟動(dòng)完成最快也要3s時(shí)間,顯然在U-boot運(yùn)行中過(guò)了倒車信號(hào)檢測(cè)代碼段到內(nèi)核啟動(dòng)完成可以處理倒車影像之間這段時(shí)間,是一個(gè)盲區(qū)時(shí)段。在內(nèi)核啟動(dòng)完成后可以跟MCU進(jìn)行握手通知MCU系統(tǒng)能夠處理倒車了,可以通過(guò)主控和MCU連接的GPIO電平控制來(lái)實(shí)現(xiàn)。在這個(gè)盲區(qū)時(shí)間段內(nèi)若有倒車信號(hào),立即復(fù)位主控T3,讓T3重新啟動(dòng)快速運(yùn)行到U-boot里再處理倒車影像顯示功能。
本文詳細(xì)分析了當(dāng)前基于Android系統(tǒng)的車載中控和智能后視鏡倒車影像顯示系統(tǒng)在系統(tǒng)啟動(dòng)階段顯示慢的問(wèn)題,如果駕駛員強(qiáng)行倒車可能會(huì)帶來(lái)安全隱患,以及雙系統(tǒng)的處理方案成本高,市場(chǎng)接受度不高。通過(guò)深入分析車載中控和智能后視鏡的Android系統(tǒng)啟動(dòng)流程,提出了一種在U-boot中處理倒車影像顯示的解決方案,可以快速處理倒車影像顯示,從系統(tǒng)上電到顯示倒車畫(huà)面在2.5s左右完成非常迅速,也充分考慮了在U-boot過(guò)了倒車檢測(cè)點(diǎn)到內(nèi)核啟動(dòng)完成具備倒車顯示功能時(shí)這段盲區(qū)的處理方案,充分保障了啟動(dòng)階段能夠快速處理倒車影像顯示的功能。該設(shè)計(jì)不增加硬件成本,經(jīng)濟(jì)性好便于普及,為駕駛員安全倒車增加了保險(xiǎn)系數(shù),保障倒車安全。