李宇成 梁宗希
(北方工業(yè)大學(xué)電氣與控制工程學(xué)院 北京 100144)
?
Linux攝像頭驅(qū)動的設(shè)計(jì)優(yōu)化及其對應(yīng)的Android下HAL封裝設(shè)計(jì)方法探究
李宇成梁宗希*
(北方工業(yè)大學(xué)電氣與控制工程學(xué)院北京 100144)
針對Android系統(tǒng)下攝像頭驅(qū)動程序不開源的現(xiàn)狀,將借鑒Linux下的相關(guān)驅(qū)動程序,提出一體化設(shè)計(jì)方案,對驅(qū)動加以改進(jìn)設(shè)計(jì)和優(yōu)化,特別是在FIMC驅(qū)動中,將FIMC和ov9650合成為了一個(gè)設(shè)備,顯著提高了驅(qū)動的運(yùn)行效率。然后,通過對Android框架的分析,設(shè)計(jì)一種HAL模塊,采用三個(gè)線程并行完成攝像頭功能,并用此模塊對驅(qū)動進(jìn)行封裝。內(nèi)容包括Linux攝像頭驅(qū)動的開發(fā)與優(yōu)化,Android HAL模塊的設(shè)計(jì),以及將Linux攝像頭驅(qū)動程序進(jìn)行HAL封裝的具體步驟。最后,給出實(shí)驗(yàn)結(jié)果。
Linux攝像頭驅(qū)動設(shè)計(jì)與優(yōu)化Android HAL設(shè)計(jì)HAL封裝方法
雖然在Linux下有一些攝像頭驅(qū)動的資料,但是這些驅(qū)動都不能夠直接應(yīng)用到Android系統(tǒng)下。導(dǎo)致這種現(xiàn)象的原因是:(1) Linux系統(tǒng)結(jié)構(gòu)與Android系統(tǒng)本身有很大區(qū)別;(2) Android框架底層有HAL(硬件抽象層),它將攝像頭驅(qū)動與Android系統(tǒng)隔離。因而,只有將Linux攝像頭驅(qū)動進(jìn)行重新設(shè)計(jì)和優(yōu)化,方能在Android系統(tǒng)下使用。而適用于Android系統(tǒng)的攝像頭驅(qū)動的設(shè)計(jì)與優(yōu)化方法,鮮見有文獻(xiàn)涉及。
另一方面,隨著Android系統(tǒng)的推廣,手機(jī)、移動設(shè)備以及各種智能終端大量采用Android作為操作系統(tǒng)[1]。在Android系統(tǒng)中,與硬件相關(guān)的驅(qū)動程序大都以HAL形式封裝起來了,目的是保護(hù)軟件開發(fā)商的利益。例如,HAL中的Camera HAL,是聯(lián)系上層攝像頭接口與下層Linux攝像頭驅(qū)動的紐帶[2],它的設(shè)計(jì)好壞,直接影響到攝像頭功能的發(fā)揮[3]。目前,很多Android硬件廠商如三星、高通等都有自己的Camera HAL,別人無法獲得他們的源代碼,這就使得普通開發(fā)者無從研究HAL,給在Android下提高攝像頭效能和進(jìn)一步開發(fā)攝像頭程序帶來了很大的困難。
鑒于上述現(xiàn)狀,很有必要研究適用于Android系統(tǒng)的Linux攝像頭驅(qū)動設(shè)計(jì)與優(yōu)化方法以及Android Camera HAL的封裝方法,以便設(shè)計(jì)者在此基礎(chǔ)之上開發(fā)自己的應(yīng)用程序。本文首先借鑒Linux資料,提取Linux下的攝像頭驅(qū)動的部分代碼加以補(bǔ)充設(shè)計(jì)和優(yōu)化,然后根據(jù)對Android架構(gòu)的分析,設(shè)計(jì)了一個(gè)s5pv210 Camera HAL模塊,并在模塊內(nèi)實(shí)現(xiàn)了一種Camera HAL的封裝方法。為在Android系統(tǒng)中利用和獲取Linux下的巨大開源資源提供了一個(gè)范例。
Linux下攝像頭模塊主要包括四個(gè)方面[4-6]:V4L2驅(qū)動,F(xiàn)IMC模塊,攝像頭驅(qū)動以及i2c驅(qū)動。本文攝像頭模塊設(shè)計(jì)架構(gòu)如圖1所示,F(xiàn)IMC模塊調(diào)用攝像頭驅(qū)動并為V4L2提供接口,攝像頭驅(qū)動獲取視頻數(shù)據(jù)并傳給FIMC,i2c驅(qū)動完成攝像頭與開發(fā)板之間的通信。
圖1 Linux攝像頭驅(qū)動設(shè)計(jì)框架
1.1Linux攝像頭模塊與Android Camera HAL的一體化設(shè)計(jì)
Linux為建立視頻設(shè)備工作環(huán)境,需要借助V4L2架構(gòu),建立struct video_device,而struct video_device的控制函數(shù)struct v4l2_ioctl_ops和文件操作函數(shù)struct v4l2_file_operations等由FIMC驅(qū)動實(shí)現(xiàn)。本文建議的一體化設(shè)計(jì),是將struct v4l2_ioctl_ops和struct v4l2_file_operations的成員函數(shù)videoc_reqbufs(),videoc_querybuf(),open(),release()等封裝進(jìn)V4L2驅(qū)動核心,再由Android HAL對V4L2進(jìn)行封裝。Android上層應(yīng)用程序訪問Camera HAL時(shí),根據(jù)本設(shè)計(jì),會調(diào)用到V4L2,進(jìn)而調(diào)用攝像頭驅(qū)動。
根據(jù)Linux驅(qū)動原理,V4L2為調(diào)用攝像頭驅(qū)動提供統(tǒng)一接口,本設(shè)計(jì)中將V4L2直接嵌入HAL,使Linux攝像頭驅(qū)動與Android HAL聯(lián)為一體。同時(shí),V4L2與HAL之間并未額外添加新的結(jié)構(gòu)層,而是直接把V4L2嵌入到HAL之中,這使整個(gè)攝像頭模塊獲得了一個(gè)較高的運(yùn)行效率。攝像頭驅(qū)動與Android Camera HAL一體化設(shè)計(jì)方案如圖2所示。
圖2 Linux攝像頭模塊與Android Camera HAL一體化方案
1.2i2c驅(qū)動設(shè)計(jì)
攝像頭的工作方式需要通過i2c總線來進(jìn)行設(shè)置,因此,本質(zhì)上可以認(rèn)為攝像頭是一個(gè)i2c設(shè)備,而在i2c驅(qū)動當(dāng)中,最重要的結(jié)構(gòu)體是i2c_client和i2c_adapter,前者表示一個(gè)i2c從器件,后者代表i2c總線控制器和訪問i2c總線必須的算法。
圖3所示的驅(qū)動設(shè)計(jì)框圖是整個(gè)i2c設(shè)備數(shù)據(jù)結(jié)構(gòu)的信息。設(shè)備i2c_client,最初是被i2c_new_device()所創(chuàng)建的,并被device_register()在內(nèi)部調(diào)用,掛載到i2c_bus上。掛載上之后,相應(yīng)的設(shè)備文件會在/sys/bus/i2c文件夾下生成。如果設(shè)備名稱和ov9650驅(qū)動匹配成功,對應(yīng)的probe()函數(shù)會被調(diào)用,而且系統(tǒng)會為圖3所示的ov9650結(jié)構(gòu)分配內(nèi)存,并且初始化各種數(shù)據(jù)變量。
圖3 SCCB驅(qū)動設(shè)計(jì)
1.3FIMC驅(qū)動設(shè)計(jì)與優(yōu)化
FIMC主要用于實(shí)現(xiàn)視頻數(shù)據(jù)接口,同時(shí),它也完成圖像數(shù)據(jù)顏色空間的轉(zhuǎn)換操作。由圖4可知,左邊FIMC驅(qū)動的fimc_vid_cap包含了video_device,并且實(shí)現(xiàn)了控制函數(shù)v4l2_ioctl_ops與文件操作函數(shù)v4l2_file_operations等,video_device由圖2中的V4L2驅(qū)動進(jìn)行調(diào)用。
圖4 優(yōu)化后的fimc驅(qū)動架構(gòu)
在Linux下,fimc與ov9650是兩個(gè)獨(dú)立的設(shè)備模塊,各自擁有不能互訪的內(nèi)存空間。通常需要映射一塊共享內(nèi)存來完成兩者之間的數(shù)據(jù)交換,其好處是,保證了兩個(gè)驅(qū)動的相互獨(dú)立性,缺點(diǎn)是信息交換不如在同一設(shè)備內(nèi)部來的方便。一種簡單的技巧是,在fimc_dev所屬的media_entity以及ov9650所屬的media_entity之間添加pads和list_head變量,使它們同時(shí)都掛載在了圖4右側(cè)的media_device設(shè)備上,當(dāng)FIMC和ov9650中的media_entity都被初始化之后,fimc_md結(jié)構(gòu)體中的fimc_md_probe()函數(shù)將把fimc與ov9650模塊綁定在一起,初始化之后,F(xiàn)IMC和ov9650就合成為一個(gè)大的設(shè)備。由此,這兩個(gè)模塊就能進(jìn)行無內(nèi)外差別的數(shù)據(jù)完全共享。由于兩個(gè)設(shè)備之間的數(shù)據(jù)訪問同步機(jī)制要比同一設(shè)備內(nèi)(抽象的大設(shè)備)訪問的同步機(jī)制復(fù)雜,因此采用合成大設(shè)備的技巧能略微提高數(shù)據(jù)交換效率,在本文的實(shí)驗(yàn)環(huán)境下,優(yōu)化后的驅(qū)動給攝像頭模塊的幀率帶來了2-3FPS的提升。
完成Linux下驅(qū)動的優(yōu)化設(shè)計(jì)之后,需要進(jìn)行Android下HAL模塊的設(shè)計(jì)與實(shí)現(xiàn),HAL模塊沒有統(tǒng)一公開的設(shè)計(jì)方法。本文通過對Android框架的仔細(xì)研究,設(shè)計(jì)了s5pv210 HAL模塊,并在其中采用自定義函數(shù)來封裝V4L2接口,實(shí)現(xiàn)Android對Linux驅(qū)動的調(diào)用。
Android Camera系統(tǒng)使用Linux攝像頭模塊需要Camera HAL[7-9],本文在Android Camera系統(tǒng)的基礎(chǔ)上,首先設(shè)計(jì)s5pv210 HAL模塊,并在其內(nèi)部嵌入V4L2接口函數(shù)。s5pv210 HAL用于封裝V4L2接口的函數(shù)如圖5所示,其中,startPreview()和stopPreview()用于控制預(yù)覽的啟/停,startRecording()與stopRecording()用于控制視頻的啟/停,takePicture()與cancelPicture()用于拍照和刪除照片,其他內(nèi)容如分配內(nèi)存,攝像頭參數(shù)設(shè)置等,都需要用相應(yīng)的封裝函數(shù)來實(shí)現(xiàn)。
圖5 s5pv210 HAL中定義的函數(shù)
本文設(shè)計(jì)的Camera HAL,根據(jù)攝像頭的功能需求實(shí)現(xiàn)了三個(gè)線程。
1) 預(yù)覽線程:預(yù)覽是拍照和攝像的基礎(chǔ)。
2) 拍照線程:該線程需要實(shí)現(xiàn)圖像格式數(shù)據(jù)轉(zhuǎn)換。
3) 攝像線程:屏幕顯示可以調(diào)用預(yù)覽線程,同時(shí),要進(jìn)行格式轉(zhuǎn)換并在本地保存視頻文件。
S5pv210 HAL的總體設(shè)計(jì)框圖如圖6所示,s5pv210 HAL的框架由預(yù)覽、拍照、攝像三個(gè)部分組成,各部分封裝的過程類似。圖7中預(yù)覽模塊的startpreview()接口函數(shù),其中封裝的是Linux下編寫的V4L2完成攝像頭預(yù)覽的過程。而圖5中的startRecording()接口函數(shù),則屬于攝像模塊,其中封裝的是調(diào)用V4L2完成攝像的過程。與預(yù)覽過程不同的是,攝像的過程包含了格式轉(zhuǎn)換與本地文件的保存功能。各個(gè)模塊雖然功能有差異,但HAL封裝方法相同。下面以預(yù)覽模式為例說明本文HAL的函數(shù)封裝方法。
圖6 s5pv210 hal總體設(shè)計(jì)
事實(shí)上,開始預(yù)覽之前,上層應(yīng)用在做完準(zhǔn)備工作(設(shè)置各種參數(shù))之后,僅僅會調(diào)用android::startpreview()這一個(gè)函數(shù),隨后經(jīng)過層層調(diào)用,最終調(diào)用到s5pv210 HAL模塊中的函數(shù)s5pv210 hal::startpreview()。因此,HAL預(yù)覽模塊要做的工作,就是把從設(shè)置V4L2到獲得視頻幀地址的所有過程都封裝到s5pv210 HAL的startpreview()函數(shù)之中,如圖7所示。
圖7 hal預(yù)覽模塊startpreview()函數(shù)封裝
本設(shè)計(jì)中,s5pv210 HAL預(yù)覽模塊所包含的具體流程有:1) 打開視頻設(shè)備、設(shè)置視頻格式;2) 分配內(nèi)存、讀取數(shù)據(jù);3) 數(shù)據(jù)回調(diào)。從程序的健壯性考慮,上述步驟不應(yīng)直接整體封裝到startpreview()函數(shù)之中,而應(yīng)該分成多個(gè)自定義函數(shù),最后再把這些函數(shù)嵌入進(jìn)預(yù)覽模塊startpreview()中。
下面以O(shè)V9650為例,來實(shí)現(xiàn)預(yù)覽模塊的三個(gè)部分。
(1) 打開視頻設(shè)備、設(shè)置視頻格式的實(shí)現(xiàn)
打開視頻設(shè)備使用的是Linux驅(qū)動下的v4l2接口中的open()函數(shù),此函數(shù)會調(diào)用fimc驅(qū)動中的open()函數(shù)的實(shí)現(xiàn)體,最終實(shí)現(xiàn)設(shè)備文件的打開,視頻格式的設(shè)置使用ioctl()函數(shù),該函數(shù)經(jīng)過V4L2,fimc最終調(diào)用攝像頭驅(qū)動,通過i2c對攝像頭進(jìn)行參數(shù)設(shè)置。
void Ov965xCamera::init() {
struct v4l2_format fmt;
struct v4l2_requestbuffers req;
struct v4l2_buffer b;
captureBuf =
(videobuffer*)calloc(1,sizeof(videobuffer));
//分配緩存
enum v4l2_buf_type type =
V4L2_BUF_TYPE_VIDEO_CAPTURE;
v4l2_fd =
open(″/dev/video0″, O_RDWR | O_NONBLOCK);
//打開視頻設(shè)備
……
}
這是嵌入到預(yù)覽模塊startpreview()函數(shù)內(nèi)的一個(gè)自定義函數(shù),其中聲明了V4L2視頻格式變量,內(nèi)存變量等,并打開了攝像頭設(shè)備文件,得到了文件句柄。
其中,省略的部分里還包含設(shè)置視頻格式,檢查V4L2兼容性等其他操作。設(shè)置視頻的長、寬和格式的方法如下所示。
if(v4l2_fd != -1){
memset(&fmt, 0, sizeof fmt);
//設(shè)置攝像頭輸出參數(shù)
fmt.type =
V4L2_BUF_TYPE_VIDEO_CAPTURE;
//設(shè)置v4l2模式
fmt.fmt.pix.width = mWidth;
//設(shè)置寬
fmt.fmt.pix.height = mHeight;
//設(shè)置高
fmt.fmt.pix.pixelformat =
V4L2_PIX_FMT_RGB565;
//設(shè)置視頻格式
fmt.fmt.pix.sizeimage =
(fmt.fmt.pix.width * fmt.fmt.pix.height * 2);
fmt.fmt.pix.field = V4L2_FIELD_NONE;
if (ioctl(v4l2_fd, VIDIOC_S_FMT, &fmt) < 0) {
LOGE(″cannot set fmts ″);
return;
}
……
}
(2) 分配內(nèi)存、讀取數(shù)據(jù)的實(shí)現(xiàn)
進(jìn)程之間傳遞大量數(shù)據(jù)時(shí),一般使用共享內(nèi)存的方式。在Android Binder IPC中,Android系統(tǒng)實(shí)現(xiàn)了一個(gè)匿名共享內(nèi)存子系統(tǒng)。這種Android特有的進(jìn)程間共享內(nèi)存的方式避免了內(nèi)存拷貝,代之以在進(jìn)程間傳遞內(nèi)存基址和偏移值。
在Android的應(yīng)用程序框架層,提供了兩個(gè)C++類MemoryBase和MemoryHeapBase來使用匿名共享內(nèi)存。下述代碼段的initheap()函數(shù),是本文封裝到預(yù)覽模塊的另一個(gè)自定義函數(shù),用于建立程序的緩存。initheap()函數(shù)首先創(chuàng)建堆內(nèi)存MemoryHeapBase,然后創(chuàng)建kBufferCount塊分割內(nèi)存,MemoryBase將堆內(nèi)存分割,每一塊用來存儲一幀視頻。開辟好內(nèi)存,就可以讀取,處理數(shù)據(jù)了。
void CameraHardware::initHeap(){
//開辟Android下內(nèi)存空間
int preview_width, preview_height;
mParameters.getPreviewSize
int how_big =
preview_width * preview_height*2;
//rgb565
mPreviewFrameSize = how_big;
mPreviewHeap = new MemoryHeapBase
(mPreviewFrameSize * kBufferCount);
for (int i = 0; i < kBufferCount; i++) {
//開辟4塊緩存
mBuffers[i] =
new MemoryBase(mPreviewHeap, i *
}
mOv9650Camera = new Ov9650Camera
(preview_width, preview_height);
}
讀取數(shù)據(jù)的過程被封裝到如下自定義函數(shù)Ov965x Camera::getNextFrameAsRgb565()中,該函數(shù)通過調(diào)用V4L2的接口,采用標(biāo)準(zhǔn)的V4L2獲取數(shù)據(jù)的方式獲取數(shù)據(jù),如下:
void Ov965xCamera::getNextFrameAsRgb565(uint16_t *buffer) {
struct v4l2_buffer camb;
memset(&camb, 0, sizeof camb);
camb.type =
V4L2_BUF_TYPE_VIDEO_CAPTURE;
camb.memory = V4L2_MEMORY_MMAP;
camb.index = 0;
ioctl(v4l2_fd, VIDIOC_DQBUF, &camb);
memcpy(buffer,(uint16_t *)
captureBuf[camb.index].ldata,mWidth*mHeight*2);
//把數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶空間
ioctl (v4l2_fd, VIDIOC_QBUF, &camb);
}
(3) 數(shù)據(jù)回調(diào)的實(shí)現(xiàn)
在startpreview()函數(shù)中,還包含一部分功能語句。例如,上述讀取完成之后,直接將幀數(shù)據(jù)的內(nèi)存地址傳給系統(tǒng)的回調(diào)函數(shù)mDataCb(),并由上層service對數(shù)據(jù)進(jìn)行處理。如:
if (mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
mDataCb(CAMERA_MSG_PREVIEW_FRAME
//系統(tǒng)數(shù)據(jù)回調(diào)
這時(shí),回調(diào)函數(shù)會通知cameraservice預(yù)覽準(zhǔn)備工作已做好,接下來cameraservice會把數(shù)據(jù)幀送到屏幕顯示。
由此可見,預(yù)覽模式的封裝過程是,從Linux驅(qū)動中,找出V4L2關(guān)于攝像頭初始化以及其它操作的接口,同時(shí)添加必要的功能語句,然后將其嵌入到s5pv210 HAL模塊的預(yù)覽函數(shù)中,最后,在函數(shù)startpreview()中完成向cameraservice傳送數(shù)據(jù)的功能。
拍照模塊和錄像模塊與預(yù)覽模塊類似,拍照模塊需要編寫圖片格式的數(shù)據(jù)頭,錄像模塊需要編寫視頻的格式轉(zhuǎn)換與本地文件的保存,二者的HAL封裝過程都與預(yù)覽模式類似。封裝完成之后,編譯HAL成.so庫的形式,放在Android的文件系統(tǒng)的system/lib目錄下即可[10]。
測試選用的是友善的tiny210開發(fā)板,處理器芯片是三星的s5pv210,Android版本為2.3,根文件系統(tǒng)采用nfs掛載的方式,把HAL的.so庫放在nfs的根文件目錄中,開機(jī)打開攝像頭設(shè)備,驅(qū)動加載如圖8所示。
圖8 Linux攝像頭驅(qū)動加載
在eclipse調(diào)試中可查看HAL載入情況。
運(yùn)行Android的攝像頭應(yīng)用程序,使之處在預(yù)覽模式當(dāng)中,應(yīng)用程序作為客戶端會向服務(wù)端發(fā)送消息,服務(wù)端獲得消息后經(jīng)過層層調(diào)用,最終調(diào)用到HAL封裝中的預(yù)覽線程。預(yù)覽線程內(nèi)封裝了對V4L2進(jìn)行初始化的各種函數(shù),這樣,就把Android上層應(yīng)用與Linux下層攝像頭驅(qū)動連接了起來。實(shí)驗(yàn)效果如圖9所示。
圖9 ov9650預(yù)覽效果(視頻分辨率800×480)
本文首先在Linux系統(tǒng)下設(shè)計(jì)實(shí)現(xiàn)了一款適用于Android系統(tǒng)的ov9650攝像頭驅(qū)動,并優(yōu)化了FIMC驅(qū)動使之與攝像頭驅(qū)動成為一個(gè)整體,提高了二者之間的數(shù)據(jù)傳輸效率。然后又重點(diǎn)探究了與該攝像頭驅(qū)動對應(yīng)的Android下的Camera HAL的封裝方法,詳細(xì)講述了Camera HAL的封裝過程。針對Android系統(tǒng)下攝像頭驅(qū)動程序不開源的現(xiàn)狀,本文具體示范了將Linux下的開源驅(qū)動程序封裝到Android下的方法,供開發(fā)者參考。最后實(shí)驗(yàn)結(jié)果證明,該方法正確可靠,根據(jù)方法設(shè)計(jì)的HAL能夠滿足攝像頭正常工作。
[1] 溫敏,艾麗蓉,王志國.Android智能手機(jī)系統(tǒng)中文件實(shí)時(shí)監(jiān)控的研究與實(shí)現(xiàn)[J].科學(xué)技術(shù)與工程,2009, 9(7):1716-1719.
[2] 楊長剛.深入剖析Android系統(tǒng)[M].北京:電子工業(yè)出版社,2013.
[3] James Talbot,Justin McLean.Learning Android Application Programming:A Hands-On Guide to Building Android Applications[M].Addison-Wesley Professional,2013.
[4] 李宇成,黃堂猛.基于S5PV210的超高清視頻系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2014,35(11):3813-3819.
[5] Greg Milette,Adam Stroud.Professional Android Sensor Programming[M].Wrox Press,2012.
[6] 童方圓,于強(qiáng).基于Android的實(shí)時(shí)視頻流傳輸系統(tǒng)[J].計(jì)算機(jī)工程與設(shè)計(jì),2012,33(12):4639-4642.
[7] 羅升陽.Android系統(tǒng)源代碼情景分析[M].北京:電子工業(yè)出版社,2012.
[8] 余成鋒,李代平,毛永華.Android 3.0內(nèi)存管理機(jī)制分析[J].計(jì)算機(jī)應(yīng)用與軟件,2013,30(2):229-230.
[9] 李宇成,李聰.基于DM368的視頻處理及軟件設(shè)計(jì)[J].計(jì)算機(jī)測量與控制,2013,21(10):2865-2867,2871.
[10] 農(nóng)麗萍,王力虎,黃一平.Android在嵌入式車載導(dǎo)航系統(tǒng)的應(yīng)用研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(11):2473-2476.
DESIGN AND OPTIMISATION OF LINUX CAMERA DRIVER AND PROBING CORRESPONDING METHOD OF HAL ENCAPSULATION AND DESIGN UNDER ANDROID
Li YuchengLiang Zongxi*
(College of Electrical and Control Engineering,North China University of Technology,Beijing 100144,China)
For current status of camera driver in Android system not being the open-source, by learning form the related driver in Linux, we proposed an integrated design scheme to improve the design of driver and optimise it as well, especially in FIMC driver, we composed the FIMC and ov9650 into a single device, this significantly improved the operation efficiency of camera driver. After that, by analysing Android framework, we designed a HAL module, which completes the functions of camera with three threads in parallel, we also used it to encapsulate Linux camera driver. The content of the paper includes the design and optimisation of Linux camera driver, the design of Android HAL module, and the specific procedure of encapsulating the Linux camera driver with HAL. In end of the paper we submit the experimental result.
Linux camera driver design and optimisationAndroid HAL designEncapsulation method with HAL
2015-03-18。李宇成,教授,主研領(lǐng)域:智能控制,圖像處理,嵌入式開發(fā)。梁宗希,碩士。
TP311.5
A
10.3969/j.issn.1000-386x.2016.09.059