DF-4644 / fb_dispatch_probe.c
#include <stdio.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/fbio.h> static void dump_adpinfo(int fd) { video_adapter_info_t ai; memset(&ai, 0x41, sizeof(ai)); if (ioctl(fd, FBIO_ADPINFO, &ai) < 0) { perror("FBIO_ADPINFO"); return; } printf("sizeof(video_adapter_info_t)=%zu\n", sizeof(ai)); printf("index=%d type=%d name=%s unit=%d flags=%x\n", ai.va_index, ai.va_type, ai.va_name, ai.va_unit, ai.va_flags); printf("io=%x/%x mem=%x/%x window=%#x wsize=%zu gran=%zu orig=%u\n", ai.va_io_base, ai.va_io_size, ai.va_mem_base, ai.va_mem_size, ai.va_window, ai.va_window_size, ai.va_window_gran, ai.va_window_orig); printf("unused0=%#x bufsize=%zu mode=%d initmode=%d biosmode=%d lw=%d ds=%d,%d\n", ai.va_unused0, ai.va_buffer_size, ai.va_mode, ai.va_initial_mode, ai.va_initial_bios_mode, ai.va_line_width, ai.va_disp_start.x, ai.va_disp_start.y); int i, n = 0; for (i = 0; i < (int)sizeof(ai.va_reserved); i++) if (((unsigned char *)ai.va_reserved)[i] == 0x41) n++; printf("va_reserved bytes NOT touched by kernel: %d/%zu (0 => fully zeroed by ioctl layer)\n", n, sizeof(ai.va_reserved)); } static void modeinfo(int fd, int mode) { video_info_t vi; memset(&vi, 0, sizeof(vi)); vi.vi_mode = mode; int r = ioctl(fd, FBIO_MODEINFO, &vi); printf("FBIO_MODEINFO vi_mode=%d (0x%x) -> rc=%d", mode, mode, r); if (r == 0) printf(" w=%d h=%d depth=%d window=%#lx\n", vi.vi_width, vi.vi_height, vi.vi_depth, (unsigned long)vi.vi_window); else printf(" errno=%d (%s)\n", errno, strerror(errno)); } int main(void) { int fd = open("/dev/ttyv0", O_RDWR); if (fd < 0) { perror("open /dev/ttyv0"); return 1; } int v = -1; printf("FBIO_ADAPTER -> %d", ioctl(fd, FBIO_ADAPTER, &v)); printf(" index=%d\n", v); dump_adpinfo(fd); modeinfo(fd, 0); modeinfo(fd, 2); modeinfo(fd, 999); modeinfo(fd, -5); modeinfo(fd, 0x7fffffff); video_info_t f; memset(&f, 0, sizeof(f)); f.vi_width = 80; f.vi_height = 25; printf("FBIO_FINDMODE -> %d errno=%d\n", ioctl(fd, FBIO_FINDMODE, &f), errno); if (f.vi_mode >= 0) printf(" found mode %d %dx%d\n", f.vi_mode, f.vi_width, f.vi_height); close(fd); return 0; } |