Zyboでフレームバッファを使う

以下でZyboでフレームバッファを使ってXを動かしている

  • ZYBO26 (Linux + simple framebuffer でX Windowを動かすまで)

http://bravo-fpga.blogspot.jp/2016/12/zybo26-linux-simple-frame-buffer-x.html

Simple Framebufferを使う

  • Simple framebufferを有効にする

http://se.hatenablog.jp/entry/2014/11/19/081514

fsbl_hooks.c
FsblHookBeforeHandoff()内

	{
		DisplayCtrl hdmiCtrl;
		u32 *fPtr[3] = {(u32 *)0x1F000000 , (u32 *)0x1F000000 , (u32 *)0x1F000000};
		fsbl_printf(DEBUG_GENERAL,"HDMI display initialization\n\r");
		Status = DisplayInitialize(&hdmiCtrl, XPAR_AXIVDMA_1_DEVICE_ID,XPAR_AXI_DISPCTRL_1_S_AXI_BASEADDR, 1, fPtr, (1024*4));
		if(Status != XST_SUCCESS){
			fsbl_printf(DEBUG_GENERAL,"HDMI display initialization failed\n\r");
			return XST_FAILURE;
		}
		Status = DisplayStart(&hdmiCtrl);
		if(Status != XST_SUCCESS){
			fsbl_printf(DEBUG_GENERAL,"Could not start display\n\r");
			return XST_FAILURE;
		}
	}

vga_modes.h内

static const VideoMode VMODE_1024x768 = {
	.label = "1024x768@60Hz",
	.width = 1024,
	.height = 768,
	.hps = 1048,
	.hpe = 1184,
	.hmax = 1344,
	.hpol = 1,
	.vps = 771,
	.vpe = 777,
	.vmax = 806,
	.vpol = 1,
	.freq = 60.0
};

output.bif

//arch = zynq; split = false; format = BIN
the_ROM_image:
{
	[bootloader]/home/shohei/Downloads/zybo_base_system_2017.3/source/vivado/hw/zybo_bsd/zybo_bsd.sdk/FSBL/Debug/FSBL.elf
	/home/shohei/Downloads/zybo_base_system_2017.3/source/vivado/hw/zybo_bsd/zybo_bsd.sdk/system_wrapper_hw_platform_1/system_wrapper.bit
	/home/shohei/Downloads/zybo_minimal/images/linux/u-boot.elf

bootgenコマンド

bootgen -image output.bif -o i BOOT.bin -w

結局以下の関数XAxiVdma_SetFrmStore()は、demoでも失敗していて、かつ動作しているので、コメントアウトして差し支えないみたい。

	Status = XAxiVdma_SetFrmStore(&(dispPtr->vdma), DISPLAY_NUM_FRAMES, XAXIVDMA_READ);
	if (Status != XST_SUCCESS)
	{
		xil_printf("Setting Frame Store Number Failed in Read Channel %d\r\n", Status);
		return XST_FAILURE;
	}

起動するも、simplebufferが立ち上がらない。
次のエラーが出る。

simple-framebuffer: probe of 1f000000.fb failed with error -12

drivers/video/fbdev/simplefb.cにprintkを仕込んでみたが、今度はカーネルが起動しなくなった。
以下によると、512MB以下のシステムだとsimple-framebufferドライバが起動時にロードされないバグがあるらしい。Zyboで動かしてる人がいるのに、不思議である。
https://wiki.trenz-electronic.de/display/PD/Debian+Installation

Linux mainstream simple-framebuffer driver has a bug that prevents the driver to install correctly if the total system memory is less than 512MByte. Error -12 would come then during the startup and the driver will not get loaded. There is no simple easy patch known.