#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
int main() {
// 打开 framebuffer 设备
int fb_fd = open("/dev/fb0", O_RDWR);
if (fb_fd == -1) {
perror("无法打开 framebuffer 设备");
exit(1);
}
// 读取屏幕信息
struct fb_var_screeninfo var_info;
if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &var_info) == -1) {
perror("无法获取屏幕信息");
close(fb_fd);
exit(1);
}
// 计算屏幕尺寸
int screen_size = var_info.xres_virtual * var_info.yres_virtual * var_info.bits_per_pixel / 8;
// 映射 framebuffer 设备到内存中
char* fb_data = (char*)mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0);
if (fb_data == MAP_FAILED) {
perror("无法映射 framebuffer 设备到内存中");
close(fb_fd);
exit(1);
}
// 绘制蓝色正方形
int x, y;
for (y = 0; y < 50; y++) {
for (x = 0; x < 50; x++) {
// 计算当前像素位置的索引
int pixel_index = (var_info.xoffset + x) * (var_info.bits_per_pixel / 8)
+ (var_info.yoffset + y) * var_info.xres_virtual * (var_info.bits_per_pixel / 8);
// 设置蓝色像素值 (RGB: 0, 0, 255)
fb_data[pixel_index + 0] = 0; // 蓝色通道
fb_data[pixel_index + 1] = 0; // 绿色通道
fb_data[pixel_index + 2] = 255; // 红色通道 (因为是小端存储)
// 可选:设置透明度通道
fb_data[pixel_index + 3] = 0; // 透明度通道 (只有 ARGB 布局下才会使用,可以忽略)
}
}
// 刷新屏幕
if (ioctl(fb_fd, FBIOPUT_VSCREENINFO, &var_info) == -1) {
perror("无法刷新屏幕");
}
// 释放内存映射
munmap(fb_data, screen_size);
// 关闭 framebuffer 设备
close(fb_fd);
return 0;
}