ctex中dvi格式 Linux GUI加速 2

2021-10-14 04:49:20 字數 3939 閱讀 6246

在上一小節《linux gui加速(1)_gui系統概述》中,我們從應用層到kernel層大致分析了linux中的圖形介面的構成,並在最後給出了kernel中drm+kms的軟體顯示框架以及accelerate logic+framebuffer+displayport的硬體結構。在這一子篇會將這兩塊內容詳細展開。

本篇主要以xilinx的xc7z010 的sopc(zybo的開發板)為硬體平台,在以下幾方面介紹:

以zynq 7000的邏輯資源(pl)搭建crtc/encoder/connector硬體模組,以hdmi輸出介面為例,介紹各個模組的介面特性(framebuffer對應著物理的ddr部分);

會先給出drm+kms驅動框架下的主要模組,並針對上述硬體子模組分析對應的核心驅動部分;

在各類soc上,crtc+endode+connector一般是整合在乙個外設模組掛在系統匯流排上,以arm為例,crtc/endoder等需要配置的外設模組,配置介面掛在apb匯流排,資料介面直接在ahb匯流排上,實現和framebuffer的高速通訊。

我們按照connector-->encoder-->crtc-->framebuffer的順序倒過來介紹吧。

connector其實就是和顯示器連線的物理介面,常見的有vga/hdmi/dvi/dp等。以hdmi為例,hdmi的介面訊號主要由以下幾組訊號組成:

1組***s clock:差分時鐘用於同步訊號驅動;

1組i2c:用於edid的獲取;

1組音訊匯流排;

通過connector讀出的顯示器支援的引數;

核心靜態配置或devicetree傳入的引數;

使用者空間輸入的引數)

hdmi型別的connector的任務就是輸出顯示器解碼晶元所需的訊號時序(主要是***s clock以及***s data)。

encoder比較好理解,在此處其實就是將一定格式的影象訊號(如rgb、yuv等)編碼成connector需要輸出的訊號。以hdmi為例,幀/行同步/顯示內容都是通過***s data的序列匯流排輸出的,那麼並行的時序按照hdmi的標準編碼為序列順序則是encoder的任務;

在本片中的xc7z010 sopc中encoder+connector如下:

crtc的任務是從framebuffer中讀出待顯示的影象,並按照相應的格式輸出給encoder(本處的crtc功能受限,相關格式配置只能通過配置硬體ip引數來改變,而不能通過核心)。在本例中,crtc的硬體構成如下:

axi video direct memory access ip,通過axi4匯流排獲取ddr中framebuffer資料,轉為video-stream流格式的影象資訊;

如下圖:

plane其實就是圖層,實際輸出的影象往往由多個圖層疊加而成(想象一下photoshop的過程),比如主圖層,顯示游標的圖層,其中有些圖層由硬體加速模組生成,本例中不涉及,因此所有plane的相關操作都由軟體實現,不涉及到任何硬體結構。

framebuffer對應著儲存空間中的影象資料,此處對應硬體為ddr。

麻雀雖小,五臟俱全,次例程中的顯示框架非常簡單,但也包含了framebuffer、crtc、planes、encoder、connector5個元件,片內硬體結構如下:

(ps:dynamic clock generator生成顯示子系統中各元件所需的驅動時鐘,由linux中的common clock framework統一管理)

按照dri中幾個元件分別介紹。

對於第一點,gem主要完成的事情是:

在linux kernel下的預設實現方式是cma(contiguous memory allocator)實現的,核心中對應**是:

drivers/gpu/drm/drm_fb_cma_helper.c

這裡稍微提一下cma,cma是個好東西,不僅在視訊記憶體管理中有應用,在所有軟硬體協 同處理中同樣起這重要的作用。在一般的硬體(片內硬體加速模組)加速方案中,一般 實現方式如下:

framebuffer中在不同格式下所需要處理的圖層的數量不一,具體的視訊記憶體處理、格式解析主要在下列原始碼表中:

(視訊記憶體管理)

drivers/gpu/drm/drm_framebuffer.c

drivers/gpu/drm/drm_gem.c

drivers/gpu/drm/drm_gem_cma_helper.c

drivers/gpu/drm/drm_fb_cma_helper.c

drivers/gpu/drm/drm_fb_framebuffer_helper.c

drivers/gpu/drm/drm_fb_fourcc.c

drivers/gpu/drm/drm_fb_cma_helper.c

drivers/gpu/drm/drm_fb_cma_helper.c

drivers/gpu/drm/drm_fb_cma_helper.c

(視訊記憶體更新驅動介面)

drivers/gpu/drm/ati_pcigart.c

drivers/gpu/drm/ati_agpsupport.c

crtc雖然字面上意思為陰極射線映象管控制器,但crt在普通顯示裝置中早已被淘汰,dri中crtc主要承擔的作用:

上述功能的主要通過struct drm_crtc_funcs和struct drm_crtc_helper_funcs這兩個描述符實現:

drm_crtc_funcs中的兩個重要控制代碼set_config和page_flip,其中,

set_config主要任務是:

page_flip解決的問題很簡單:

當page_flip完成後,會通過event通知使用者層準備好下一幀的資料;

不涉及到gpu的話,planes沒有那麼複雜,主要是負責:

的建立、更新、銷毀,其中圖層的更新(多個圖層的疊加),通過struct中的drm_plane_funcs來實現。

比較形象的例子如下:

由於connector和encoder是soc與外設直接打交道的地方,因此對應著不同soc也是驅動適配修改最頻繁的地方。dri中這兩塊通過適配struct drm_connector_helper_funcs和struct drm_encoder_helper_funcs來實現。

linux kernel中的drm+kms中涉及到的點太多,由於能力和時間問題,沒能遍歷一遍,只能根據自己認為的重點討論一邊,但有些點我認為比較重要的,但沒能深入了解,比如:

等,如果大家能夠交流一下自己的理解,那再好不過了。

Ctex中WinEdt經常彈出註冊小視窗 解決辦法

使用winedt 7避免跳出 註冊對話方塊 在options選單下點options 在advanced configuration event handlers 下點exit,在end 前新增一行 regdeletevalue hkey current user software winedt 7 ...

LaTeX技巧001 ctex下使用其他中文字型

第一步 找到字型 要想使用字型,那麼就要看自己的計算機裡是不是有這樣的字型,如果沒有那麼什麼都是空談。首先在命令視窗執行下面的命令 fc list lang zh c font.txt這個命令的作用是將計算機內所有的中文字型寫入c盤下的font.txt檔案內,然後我們檢視一下font.txt的內容。...

使用Ctex中遇到的一些問題

2 使用dvi2pdf編譯dvi檔案生成pdf檔案 注意要將存成eps格式。話說排版心好累啊!但是還是要好好排版好好加油滴!這篇文章主要是彙總了一下我在使用ctex進行排版的時候遇到的一些問題。1.第一次使用ctex的時候,dvi2pdf按鈕為灰色,無法使用?將電腦系統日期往前調整,比如2006年等...