From 041ef1d9eac47d251737f8aff4ec20ed47212499 Mon Sep 17 00:00:00 2001 From: Yanfeng Liu Date: Fri, 3 May 2024 07:11:55 +0800 Subject: [PATCH] video/fb: kernel build framebuffer support This supports running fb demo app in kernel build with new config `rv-virt/kfb64`. The demo shows colored rectangles in graphic window with the following console logs: ``` nsh> cat /proc/version NuttX version 12.4.0 1ea10ddacc-dirty May 3 2024 07:03:59 rv-virt/kfb64 nsh> fb VideoInfo: fmt: 13 xres: 640 yres: 480 nplanes: 1 PlaneInfo (plane 0): fbmem: 0x80218010 fblen: 1228800 stride: 2560 display: 0 bpp: 32 Mapped FB: 0xc2000010 0: ( 0, 0) (640,480) 1: ( 58, 43) (524,394) 2: (116, 86) (408,308) 3: (174,129) (292,222) 4: (232,172) (176,136) 5: (290,215) ( 60, 50) Test finished ``` Signed-off-by: Yanfeng Liu --- .../qemu-rv/rv-virt/configs/kfb64/defconfig | 109 ++++++++++++++++++ drivers/video/Kconfig | 1 + drivers/video/fb.c | 5 + 3 files changed, 115 insertions(+) create mode 100644 boards/risc-v/qemu-rv/rv-virt/configs/kfb64/defconfig diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/kfb64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/kfb64/defconfig new file mode 100644 index 0000000000..e664496f2e --- /dev/null +++ b/boards/risc-v/qemu-rv/rv-virt/configs/kfb64/defconfig @@ -0,0 +1,109 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_DISABLE_OS_API is not set +# CONFIG_NSH_DISABLE_LOSMART is not set +CONFIG_16550_ADDRWIDTH=0 +CONFIG_16550_UART0=y +CONFIG_16550_UART0_BASE=0x10000000 +CONFIG_16550_UART0_CLOCK=3686400 +CONFIG_16550_UART0_IRQ=35 +CONFIG_16550_UART0_SERIAL_CONSOLE=y +CONFIG_16550_UART=y +CONFIG_ALLOW_BSD_COMPONENTS=y +CONFIG_ARCH="risc-v" +CONFIG_ARCH_ADDRENV=y +CONFIG_ARCH_BOARD="rv-virt" +CONFIG_ARCH_BOARD_QEMU_RV_VIRT=y +CONFIG_ARCH_CHIP="qemu-rv" +CONFIG_ARCH_CHIP_QEMU_RV64=y +CONFIG_ARCH_CHIP_QEMU_RV=y +CONFIG_ARCH_CHIP_QEMU_RV_ISA_A=y +CONFIG_ARCH_CHIP_QEMU_RV_ISA_C=y +CONFIG_ARCH_CHIP_QEMU_RV_ISA_M=y +CONFIG_ARCH_DATA_NPAGES=128 +CONFIG_ARCH_DATA_VBASE=0xC0100000 +CONFIG_ARCH_HEAP_NPAGES=128 +CONFIG_ARCH_HEAP_VBASE=0xC0200000 +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_KERNEL_STACKSIZE=3072 +CONFIG_ARCH_PGPOOL_MAPPING=y +CONFIG_ARCH_PGPOOL_PBASE=0x80400000 +CONFIG_ARCH_PGPOOL_SIZE=4194304 +CONFIG_ARCH_PGPOOL_VBASE=0x80400000 +CONFIG_ARCH_RISCV=y +CONFIG_ARCH_SHM_NPAGES=512 +CONFIG_ARCH_SHM_VBASE=0xC2000000 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARCH_TEXT_NPAGES=128 +CONFIG_ARCH_TEXT_VBASE=0xC0000000 +CONFIG_ARCH_USE_MMU=y +CONFIG_ARCH_USE_MPU=y +CONFIG_ARCH_USE_S_MODE=y +CONFIG_BINFMT_ELF_EXECUTABLE=y +CONFIG_BOARD_LOOPSPERMSEC=6366 +CONFIG_BUILD_KERNEL=y +CONFIG_DEBUG_ASSERTIONS=y +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEV_SIMPLE_ADDRENV=y +CONFIG_DEV_ZERO=y +CONFIG_DRIVERS_VIDEO=y +CONFIG_DRIVERS_VIRTIO=y +CONFIG_DRIVERS_VIRTIO_GPU=y +CONFIG_DRIVERS_VIRTIO_MMIO=y +CONFIG_DRIVERS_VIRTIO_SERIAL=y +CONFIG_ELF=y +CONFIG_EXAMPLES_FB=y +CONFIG_EXAMPLES_HELLO=y +CONFIG_FS_HOSTFS=y +CONFIG_FS_LARGEFILE=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=3072 +CONFIG_INIT_FILEPATH="/system/bin/init" +CONFIG_INIT_MOUNT=y +CONFIG_INIT_MOUNT_DATA="fs=../apps" +CONFIG_INIT_MOUNT_FLAGS=0x1 +CONFIG_INIT_MOUNT_FSTYPE="hostfs" +CONFIG_INIT_MOUNT_SOURCE="" +CONFIG_INIT_MOUNT_TARGET="/system" +CONFIG_INIT_STACKSIZE=3072 +CONFIG_LIBC_ENVPATH=y +CONFIG_LIBC_EXECFUNCS=y +CONFIG_LIBC_PERROR_STDOUT=y +CONFIG_LIBC_STRERROR=y +CONFIG_LIBM=y +CONFIG_MEMSET_64BIT=y +CONFIG_MEMSET_OPTSPEED=y +CONFIG_MM_PGALLOC=y +CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_FILE_APPS=y +CONFIG_NSH_READLINE=y +CONFIG_PATH_INITIAL="/system/bin" +CONFIG_RAM_SIZE=33554432 +CONFIG_RAM_START=0x80000000 +CONFIG_RAM_VSTART=0x80000000 +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_RISCV_SEMIHOSTING_HOSTFS=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_SERIAL_UART_ARCH_MMIO=y +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=2 +CONFIG_START_MONTH=11 +CONFIG_START_YEAR=2022 +CONFIG_SYMTAB_ORDEREDBYNAME=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_NSH_PROGNAME="init" +CONFIG_TESTING_GETPRIME=y +CONFIG_TESTING_OSTEST=y +CONFIG_VIDEO_FB=y diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 06669725cd..5f5fbfc6fc 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -49,6 +49,7 @@ if DRIVERS_VIDEO config VIDEO_FB bool "Framebuffer character driver" default n + select ARCH_VMA_MAPPING if BUILD_KERNEL config VIDEO_FB_NPOLLWAITERS int "Video fb poll count of each open structure" diff --git a/drivers/video/fb.c b/drivers/video/fb.c index 20ad585e56..456607ac00 100644 --- a/drivers/video/fb.c +++ b/drivers/video/fb.c @@ -1032,7 +1032,12 @@ static int fb_mmap(FAR struct file *filep, FAR struct mm_map_entry_s *map) if (map->offset >= 0 && map->offset < panelinfo.fblen && map->length && map->offset + map->length <= panelinfo.fblen) { +#ifdef CONFIG_BUILD_KERNEL + map->vaddr = vm_map_region((uintptr_t)panelinfo.fbmem + map->offset, + panelinfo.fblen); +#else map->vaddr = (FAR char *)panelinfo.fbmem + map->offset; +#endif return OK; }