極客筆記Camera KMD ISP子系統(tǒng)
相機(jī)驅(qū)動(dòng)層–V4L2框架解析
一、概覽
相機(jī)驅(qū)動(dòng)層位于HAL Moudle與硬件層之間,借助linux內(nèi)核驅(qū)動(dòng)框架,以文件節(jié)點(diǎn)的方式暴露接口給用戶空間,讓HAL Module通過標(biāo)準(zhǔn)的文件訪問接口,從而能夠?qū)⒄?qǐng)求順利地下發(fā)到內(nèi)核中,而在內(nèi)核中,為了更好的支持視頻流的操作,早先提出了v4l視頻處理框架,但是由于操作復(fù)雜,并且代碼無法進(jìn)行較好的重構(gòu),難以維護(hù)等原因,之后便衍生出了v4l2框架。
按照v4l2標(biāo)準(zhǔn),它將一個(gè)數(shù)據(jù)流設(shè)備抽象成一個(gè)videoX節(jié)點(diǎn),從屬的子設(shè)備都對(duì)應(yīng)著各自的v4l2_subdev實(shí)現(xiàn),并且通過media controller進(jìn)行統(tǒng)一管理,整個(gè)流程復(fù)雜但高效,同時(shí)代碼的擴(kuò)展性也較高。
而對(duì)高通平臺(tái)而言,高通整個(gè)內(nèi)核相機(jī)驅(qū)動(dòng)是建立在v4l2框架上的,并且對(duì)其進(jìn)行了相應(yīng)的擴(kuò)展,創(chuàng)建了一個(gè)整體相機(jī)控制者的CRM,它以節(jié)點(diǎn)video0暴露給用戶空間,主要用于管理內(nèi)核中的Session、Request以及與子設(shè)備,同時(shí)各個(gè)子模塊都實(shí)現(xiàn)了各自的v4l2_subdev設(shè)備,并且以v4l2_subdev節(jié)點(diǎn)暴露給用戶空間,與此同時(shí),高通還創(chuàng)建了另一個(gè)video1設(shè)備Camera SYNC,該設(shè)備主要用于同步數(shù)據(jù)流,保證用戶空間和內(nèi)核空間的buffer能夠高效得進(jìn)行傳遞。
再往下與相機(jī)驅(qū)動(dòng)交互的便是整個(gè)相機(jī)框架的最底層Camera Hardware了,驅(qū)動(dòng)部分控制著其上下電邏輯以及寄存器讀取時(shí)序并按照I2C協(xié)議進(jìn)行與硬件的通信,和根據(jù)MIPI CSI協(xié)議傳遞數(shù)據(jù),從而達(dá)到控制各個(gè)硬件設(shè)備,并且獲取圖像數(shù)據(jù)的目的。
V4L2英文是Video for Linux 2,該框架是誕生于Linux系統(tǒng),用于提供一個(gè)標(biāo)準(zhǔn)的視頻控制框架,其中一般默認(rèn)會(huì)嵌入media controller框架中進(jìn)行統(tǒng)一管理,v4l2提供給用戶空間操作節(jié)點(diǎn),media controller控制對(duì)于每一個(gè)設(shè)備的枚舉控制能力,于此同時(shí),由于v4l2包含了一定數(shù)量的子設(shè)備,而這一系列的子設(shè)備都是處于平級(jí)關(guān)系,但是在實(shí)際的圖像采集過程中,子設(shè)備之間往往還存在著包含于被包含的關(guān)系,所以為了維護(hù)并管理這種關(guān)系,media controller針對(duì)多個(gè)子設(shè)備建立了的一個(gè)拓?fù)鋱D,數(shù)據(jù)流也就按照這個(gè)拓?fù)鋱D進(jìn)行流轉(zhuǎn)
