如之前所說,一直想知道顯示數據都在哪個地方,通常的數據,比如 framebuffer 中的顯示數據,和OpenGL 處理的數據有啥關系。
目前為止我還沒有弄明白 OpenGL 這塊,但是 framebuffer 這部分差不多了。這篇文章記錄了 framebuffer 的顯示數據相關內容。
1. 關于FIMD
Tiny210v2 開發板屬于 s5pv210 的一種,在這塊開發板上,顯示部分又被叫做 FIMD,我不知道FIMD是什么的縮寫,但D應該和Display Controller有關系吧。
FIMD 的主要功能就是獲取顯示數據,并將數據輸出到顯示屏。當然期間會對顯示數據進行處理:
FIMD一共支持5個layer,在SoC用戶手冊中,將layer成為window,源代碼中也叫做window。
FIMD可以通過AXI總線從內存或者Camera哪里獲取到顯示數據,并進行合成。
2. 內核配置 framebuffer
通過 make menuconfig 可以配置 framebuffer 相關的內容。
保存以后,在 .config 文件中可以找到相關配置內容。
.config
--------------------------------------------------
CONFIG_FB_S3C_DEFAULT_WINDOW=2
CONFIG_FB_S3C_NR_BUFFERS=3
CONFIG_FB_S3C_NUM_OVLY_WIN=1
CONFIG_FB_S3C_NUM_BUF_OVLY_WIN=3
同樣也會在頭文件中生成宏定義:
include/generated/autoconf.h
--------------------------------------------------
#define CONFIG_FB_S3C_DEFAULT_WINDOW 2
#define CONFIG_FB_S3C_NR_BUFFERS 3
#define CONFIG_FB_S3C_NUM_OVLY_WIN 1
#define CONFIG_FB_S3C_NUM_BUF_OVLY_WIN 3
CONFIG_FB_S3C_DEFAULT_WINDOW 是指 默認的 window, 0-4。
CONFIG_FB_S3C_NR_BUFFERS 是指 window 的buffer數,3個就是 trebble-buffer,2個就是double-buffer。
其中第一個是正在顯示的數據,又叫onscreen,其他幾個是后臺描畫的數據,又叫offscreen,通過 flip 操作可以將 onscreen 數據和offscreen 數據交換。
CONFIG_FB_S3C_NUM_OVLY_WIN 是 OVERLAY window, 0-4。
CONFIG_FB_S3C_NUM_BUF_OVLY_WIN 是指 OVERLAY window 的buffer數,和 CONFIG_FB_S3C_NR_BUFFERS 一個意思。
3. 顯示數據buffer
內核初始話過程中,為這些window 的 buffer 預留了一部分內存。
具體看下面的代碼:
初始化函數會首先映射內存空間:
MACHINE_START(MINI210, 'MINI210')
/* Maintainer: Kukjin Kim .boot_params = S5P_PA_SDRAM + 0x100, .fixup = mini210_fixup, .init_irq = s5pv210_init_irq, .map_io = mini210_map_io, .init_machine = mini210_machine_init, #ifdef CONFIG_S5P_HIGH_RES_TIMERS .timer = &s5p_systimer, #else .timer = &s5p_timer, #endif MACHINE_END 在映射內存空間中,保留了一部分內存,保留的大小就和window 以及 buffer數有關系: 大小是 800 x 480 x 2個window x 3個buffer x RGBA的4字節,這是給通常顯示數據的, 除此之外,還預留了 YUV 的數據區域,1280 x 720 x 3個buffer x Y的一個字節數據 + 1280 x 720 x 3個buffer x UV的一個字節數據。 另外還有一個 4096 字節大小的 數據。 這些數據我只理解了 RGBA 數據, YUV 的數據不知道是干啥的? 難道是給 HDMI 輸出用的? arch/arm/mach-sp5v210/Mach-mini210.c -------------------------------------------------- /* Multimedia support */ #define LCD_WIDTH 800 #define LCD_HEIGHT 480 #define BYTES_PER_PIXEL 4 #define NUM_BUFFER_OVLY (CONFIG_FB_S3C_NUM_OVLY_WIN * CONFIG_FB_S3C_NUM_BUF_OVLY_WIN) #define NUM_BUFFER (CONFIG_FB_S3C_NR_BUFFERS + NUM_BUFFER_OVLY) #define PXL2FIMD(pixels) ((pixels) * BYTES_PER_PIXEL * NUM_BUFFER) #define S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMD PXL2FIMD(LCD_WIDTH * LCD_HEIGHT) static struct s5p_media_device mini210_media_devs[] = { ......, { .id = S5P_MDEV_FIMD, .name = 'fimd', .bank = 1, .memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMD, .paddr = 0, }, ......, } static void __init mini210_map_io(void) { ...... frame_size = lcd->width * lcd->height * BYTES_PER_PIXEL; fimd_size = ALIGN(frame_size, PAGE_SIZE) * NUM_BUFFER; if (frame_size > 0x200000) { fimd_size += ALIGN(frame_size, PAGE_SIZE) * 2; // Not used } /* Reserve 0x003f6000 bytes for PVR YUV video, and 1 page */ fimd_size += ALIGN(1280*720, PAGE_SIZE) * 3; fimd_size += ALIGN(1280*360, PAGE_SIZE) * 3 + PAGE_SIZE; if (fimd_size != S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMD) { mini210_fixup_bootmem(S5P_MDEV_FIMD, fimd_size); } ...... s5p_reserve_bootmem(mini210_media_devs, ARRAY_SIZE(mini210_media_devs), S5P_RANGE_MFC); ...... } 這些內存是PAGE對齊的,對齊的部分參考下面的算法。 PAGE_SIZE 大小是 4096。 include/linux/Const.h -------------------------------------------------- #ifdef __ASSEMBLY__ #define _AC(X,Y) X #define _AT(T,X) X #else #define __AC(X,Y) (X##Y) #define _AC(X,Y) __AC(X,Y) #define _AT(T,X) ((T)(X)) #endif arch/arm/include/asm/Page.h -------------------------------------------------- #define PAGE_SHIFT 12 #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) include/linux/Kernel.h -------------------------------------------------- #define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) #define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) #define ALIGN(x, a) __ALIGN_KERNEL((x), (a)) 4. 內核關于FIMD內存預留的相關debug log 在內核的 boot log 中,我們可以找到關于內存預留的log: dmesg log : -------------------------------------------------- [ 0.000000] s5p: 13060 kbytes system memory reserved for fimd at 0x3c330000, 1-bank base(0x3c330000) [ 0.648804] fimd at 0x3c330000 5. 物理內存視圖 畫了一個簡單的物理內存布局圖,可以看到 RGBA 部分的數據,其實一共給 2 個 window 預留了。 | | |--------------| | |0x3CFF0000 -- 0x3CFF0FFF || ???? |--------------| | |0x3CF7F000 -- 0x3CFEFFFF || |--------------| || | |0x3CF0E000 -- 0x3CF7EFFF || treble-buffer YUV( UV ) framebuffer : 1280 x 360 x 1 byte |--------------| || | |0x3CE9D000 -- 0x3CF0DFFF || |--------------| | |0x3CDBC000 -- 0x3CE9EFFF || |--------------| ||
上一篇:應用目錄S5PV210的BL1應用
下一篇:S5PV210 | 根文件系統文件詳情
推薦閱讀最新更新時間:2025-04-24 09:20


設計資源 培訓 開發板 精華推薦
- 用于自動電流選擇的 LTC1174 降壓轉換器的典型應用電路
- MTRCCBB5604P,帶飛思卡爾 MPC5604P MCU 的三相無傳感器 BLDC 開發套件
- LT6656ACDC-3.3、3.3V 低功率 ADC 電壓基準的典型應用
- NCP1129DIPGEVB、25W 離線電源高壓開關評估板
- MINI USB HUB
- 16 位、線性、超穩定、低噪聲、雙極 ±10 V DC 電壓源
- 使用 Analog Devices 的 LT6654AMPS6-2.5 的參考設計
- sHMIctrl-電容50AF
- 【ART-Pi】智能家居中控擴展板+681802A
- LT3663EDCB-3.3 5V 降壓轉換器的典型應用