平臺:TI am5728
u-boot:201801
項目需要在spl中顯示logo,其中就需要分配framebuffer,如果framebuffer較小,一般可以直接用芯片的OCMC_RAM做framebuffer,我的芯片上的OCMC_RAM2和OCMC_RAM3 的2M內存足夠顯示較小的圖片。
當然,2M往往是不夠的用的(比如使用bmp格式的image),這時候就需要在DDR中分配framebuffer了,下面分配一個10MB的framebuffer爲例:
在u-boot的board_init_f 中會調用 setup_dest_addr函數 設置重定位地址,
setup_dest_addr在common/board_f.c中:
gd->ram_size最終會保存到內核設備樹的memory節點中,修改gd->ram_size會改變內核使用的的DDR大小!
關於內存的初始化可以看這裏:linux kernel內存初始化過程
因爲logo在內核階段也要顯示,所以這裏直接在gd->ram_size上修改。修改的時候如果CONFIG_SYS_MEM_TOP_HIDE沒有用,直接定義這個宏在DDR頂端保留一段內存(當然也可以自己定義一個宏):
由於logo是在spl中開始顯示的,所以在spl中也需要設置,在spl的board_init_r函數中調用reserve_mmu函數,
reserve_mmu在common/spl/spl.c中:
加上setup_dest_addr中使用的CONFIG_SYS_MEM_TOP_HIDE即可。
在內核中如果要操作spl/uboot 中使用的framebuffer,需要在u-boot的 board_init_f => dram_init_banksize中加一個dram的bank:
並在設備樹中分配把這段內存分配爲保留內存即可。