娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

Tiny210v2(S5PV210) 平臺下FIMD對應的framebuffer驅動中,關于video buffer的理解

發布者:VelvetWhisper最新更新時間:2024-12-27 來源: cnblogs關鍵字:Tiny210v2  S5PV210  FIMD  framebuffer驅動  video  buffer 手機看文章 掃描二維碼
隨時隨地手機看文章

如之前所說,一直想知道顯示數據都在哪個地方,通常的數據,比如 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 ||

        |--------------|                         ||

[1] [2] [3] [4] [5] [6]
關鍵字:Tiny210v2  S5PV210  FIMD  framebuffer驅動  video  buffer 引用地址:Tiny210v2(S5PV210) 平臺下FIMD對應的framebuffer驅動中,關于video buffer的理解

上一篇:應用目錄S5PV210的BL1應用
下一篇:S5PV210 | 根文件系統文件詳情

推薦閱讀最新更新時間:2025-04-24 09:20

基于framebuffer技術的DVI顯示驅動程序的開發
引言 DVI是Digital VisualInterface(數字視頻接口)的縮寫。在嵌入式電子領域,像DVI這樣的高清接口應用越來越多,很多嵌入式產品采用H.264視頻編碼技術,支持播放H.264格式的720P分辨率的視頻文件,這就需要至少1024 768分辨率的顯示輸出設備。 MX51是飛思卡爾半導體的基于ARM Cortex-A8內核的高端ARM嵌入式多媒體處理器,支持720P視頻多種格式的硬解碼,可以用來開發高清機頂盒、上網本等產品,很多情況下需要集成DVI這樣的高清視頻端子。 在嵌入式電子產品中,Linux操作系統占有越來越多的市場份額。本文采用Linux2.6.28內核和MX51作為系統的軟、硬件平臺,詳細論述了基
[單片機]
基于<font color='red'>framebuffer</font>技術的DVI顯示<font color='red'>驅動</font>程序的開發
S5PV210 Linux字符驅動之PWM蜂鳴器驅動
在SMDK210.C中添加如下beeper_device 結構體 static struct platform_device beeper_device = { .name = pwm_buzzer , .id = 1, .dev = { .parent = &s3c_device_timer .dev, //PWM1是定時器1 .platform_data= 0, }, }; 然后在smdkv210_devices中添加該結構體 static struct platform_device *smdkv210_devices __initdata = { &s3c_device_fb, &s3c_device_adc,
[單片機]
<font color='red'>S5PV210</font> Linux字符<font color='red'>驅動</font>之PWM蜂鳴器<font color='red'>驅動</font>
S5PV210啟動燒寫過程信息
記錄下S5PV210啟動燒寫過程信息,對分析系統啟動及燒寫流程大有幫助: 通過串口燒的信息: OEMInitLIb is Success +++InitializeInterrupt() ---InitializeInterrupt() +++OTGDEV_InitOtg OTGDEV_SetSoftDisconnect ---OTGDEV_InitOtg TSR START ADDRESS : 0x47700000 TSR IMAGE SIZE : 0x00080000 DOWNLOADING IS COMPLETED Microsoft Windows CE Bootloader Common Library Version
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 石河子市| 清原| 三亚市| 兴和县| 股票| 宁河县| 会东县| 丰原市| 古丈县| 龙江县| 中山市| 五寨县| 铜山县| 福泉市| 西吉县| 瓦房店市| 云浮市| 乐至县| 白银市| 平原县| 上蔡县| 合川市| 高陵县| 台南市| 平罗县| 湘西| 安塞县| 兴安县| 龙山县| 奉化市| 鞍山市| 财经| 横山县| 麻城市| 淄博市| 平泉县| 德令哈市| 海原县| 怀化市| 乌拉特中旗| 隆子县|