diff --git a/userspace/CMakeLists.txt b/userspace/CMakeLists.txt index 79a7ab8a9c..c10c321ddd 100644 --- a/userspace/CMakeLists.txt +++ b/userspace/CMakeLists.txt @@ -24,6 +24,7 @@ set(USERSPACE_PROJECTS tee test test-globals + test-framebuffer touch u8sum whoami diff --git a/userspace/test-framebuffer/CMakeLists.txt b/userspace/test-framebuffer/CMakeLists.txt new file mode 100644 index 0000000000..cd2b58e0e5 --- /dev/null +++ b/userspace/test-framebuffer/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.26) + +project(test-framebuffer CXX) + +set(SOURCES + main.cpp +) + +add_executable(test-framebuffer ${SOURCES}) +target_compile_options(test-framebuffer PUBLIC -O2 -g) +target_link_libraries(test-framebuffer PUBLIC libc) + +add_custom_target(test-framebuffer-install + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/test-framebuffer ${BANAN_BIN}/ + DEPENDS test-framebuffer +) diff --git a/userspace/test-framebuffer/main.cpp b/userspace/test-framebuffer/main.cpp new file mode 100644 index 0000000000..159bba03aa --- /dev/null +++ b/userspace/test-framebuffer/main.cpp @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +int main() +{ + int fd = open("/dev/fb0", O_RDWR); + if (fd == -1) + { + perror("open"); + return 1; + } + + framebuffer_info_t fb_info; + if (pread(fd, &fb_info, sizeof(fb_info), -1) == -1) + { + perror("read"); + return 1; + } + + size_t fb_size = fb_info.width * fb_info.height * fb_info.bpp / 8; + + void* addr = mmap(nullptr, fb_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) + { + perror("mmap"); + return 1; + } + + memset(addr, 0xFF, fb_size); + + if (msync(addr, fb_size, MS_SYNC) == -1) + { + perror("msync"); + return 1; + } + + sleep(4); + + munmap(addr, fb_size); + close(fd); + + return 0; +}