| 
 常用ubantu的同学们可能经常会遇到设置开机进入文本模式的选择问题,今天就写一下这方面的一点小技巧,相信会对每个人都有一定的帮助。 具体步骤如下: (1)、修改启动菜单配置文件 
# vi /etc/default/grub 
修改 
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 
为: 
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash text vga=0x311"  
  
注释: 
这里text表示进入文本模式,vga=0x311表示使用Framebuffer显示驱动, 
0x311是指示色深和分辨率的参数 
      | 640x480 800x600 1024x768 1280x1024 
------+----------------------------------------------------- 
256   | 0x301     0x303     0x305       0x307 
32k   | 0x310     0x313     0x316       0x319 
16bpp | 0x311     0x314     0x317       0x31A 
16M   | 0x312     0x315     0x318       0x31B 
(2)、更新启动菜单 
$ sudo update-grub 
写入到/boot/grub/grub.cfg 
(3)、修改initramfs 
$ sudo gedit /etc/initramfs-tools/modules 
添加: 
vesafb 
(4)、 
$ sudo gedit /etc/modprobe.d/blacklist-framebuffer.conf 
用#注释以下行 
# blacklist vesafb 
(5)、更新initramfs 
$ sudo update-initramfs -u 
(生成新的initrd) 
(6)、 
然后重启机器,即可进入Framebuffer 
如果要切换回X11,可以输入: 
$ startx 
(7)、图形界面切换到字符界面 
A、atl+ctrl+shift+F1 
B、ctrl+c 写了一个对LCD的测试代码: #include <unistd.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <linux/fb.h> 
#include <sys/mman.h> 
int main() 
{ 
    int fbfd = 0; 
    struct fb_var_screeninfo vinfo; 
    struct fb_fix_screeninfo finfo; 
    long int screensize = 0; 
    char *fbp = 0; 
    int x = 0, y = 0; 
    long int location = 0; 
 
    // Open the file for reading and writing 
    fbfd = open("/dev/fb0", O_RDWR); 
    if (0 > fbfd) { 
        printf("Error: cannot open framebuffer device.\n"); 
        exit(1); 
    } 
    printf("The framebuffer device was opened successfully.\n"); 
 
    // Get variable screen information 
    if (0 > ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { 
        printf("Error reading variable information.\n"); 
        exit(3); 
    } 
 
    printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel); 
 
    // Figure out the size of the screen in bytes 
    screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; 
 
    // Map the device to memory 
    fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, 
                       fbfd, 0); 
    if ( fbp == MAP_FAILED) { 
        printf("Error: failed to map framebuffer device to memory.\n"); 
        exit(4); 
    } 
    printf("The framebuffer device was mapped to memory successfully.\n"); 
 
unsigned short *lcd = (unsigned short *)fbp; 
// Figure out where in memory to put the pixel 
    for (int x = 0; x < vinfo.xres; x++) 
{ 
for (int y = 0; y < vinfo.yres; y++)  
        { 
*lcd++ = (0x1F << 11); 
//*lcd++ = (0x3F << 5); 
//*lcd++ = (0x1F); 
        } 
} 
 
munmap(fbp, screensize); 
    printf("The framebuffer device was munmapped to memory successfully.\n"); 
    close(fbfd); 
    printf("The framebuffer device was closed successfully.\n"); 
    return 0; 
}   
是不是很有用处呢,小处处处见真知,童鞋们加油哦!  |