{"id":792,"date":"2023-02-08T19:14:12","date_gmt":"2023-02-08T11:14:12","guid":{"rendered":"http:\/\/www.huangrongzhen.ink\/?p=792"},"modified":"2023-02-08T19:14:13","modified_gmt":"2023-02-08T11:14:13","slug":"linux-%e4%b8%8b-framebuffer-%e7%9a%84%e4%bd%bf%e7%94%a8","status":"publish","type":"post","link":"https:\/\/www.huangrongzhen.ink\/?p=792","title":{"rendered":"Linux \u4e0b FrameBuffer \u7684\u4f7f\u7528"},"content":{"rendered":"<div class=\"wp-block-post-excerpt\"><p class=\"wp-block-post-excerpt__excerpt\">\u7528\u4e00\u4e2a\u5b9e\u4f8b\u8bf4\u660e Linux \u4e0b FrameBuffer \u7684\u4f7f\u7528 <\/p><\/div>\n\n\n<p>X\uff0dWindow\uff0dSystem \u662f Unix\/Linux \u4e0a\u7684\u56fe\u5f62\u7cfb\u7edf\uff0c\u5b83\u662f\u901a\u8fc7 X\uff0dServer \u6765\u63a7\u5236\u786c\u4ef6\u7684\u3002FrameBuffer \u4e0d\u662f\u4e00\u4e2a\u56fe\u5f62\u7cfb\u7edf\uff0c\u66f4\u4e0d\u662f\u7a97\u53e3\u7cfb\u7edf\u3002\u5b83\u6bd4 X \u8981\u4f4e\u7ea7\uff0c\u7b80\u5355\u6765\u8bf4 FrameBuffer\u5c31 \u662f\u4e00\u79cd\u673a\u5236\u7684\u5b9e\u73b0\u3002\u8fd9\u79cd\u673a\u5236\u662f\u628a\u5c4f\u5e55\u4e0a\u7684\u6bcf\u4e2a\u70b9\u6620\u5c04\u6210\u4e00\u6bb5\u7ebf\u6027\u5185\u5b58\u7a7a\u95f4\uff0c\u7a0b\u5e8f\u53ef\u4ee5\u7b80\u5355\u7684\u6539\u53d8\u8fd9\u6bb5\u5185\u5b58\u7684\u503c\u6765\u6539\u53d8\u5c4f\u5e55\u4e0a\u67d0\u4e00\u70b9\u7684\u989c\u8272\u3002X \u7684\u9ad8\u5ea6\u53ef\u79fb\u690d\u6027\u5c31\u662f\u6765\u81ea\u4e8e\u8fd9\u79cd\u673a\u5236\uff0c\u4e0d\u7ba1\u662f\u5728\u90a3\u79cd\u56fe\u5f62\u73af\u5883\u4e0b\uff0c\u53ea\u8981\u6709\u8fd9\u79cd\u673a\u5236\u7684\u5b9e\u73b0\u5c31\u53ef\u4ee5\u8fd0\u884c X\u3002\u6240\u4ee5\u5728\u51e0\u4e4e\u6240\u6709\u7684\u5e73\u53f0\u4e0a\u90fd\u6709\u76f8\u5e94\u7684 X \u7248\u672c\u7684\u79fb\u690d\u3002<\/p>\n\n\n\n<p>FrameBuffer \u5bf9\u5e94\u7684\u9a71\u52a8\u4e3a \/dev\/fb*\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">#include &lt;unistd.h>\r\n#include &lt;stdio.h>\r\n#include &lt;fcntl.h>\r\n#include &lt;linux\/fb.h>\r\n#include &lt;sys\/mman.h>\r\n\r\nint main () {\r\n  int fp=0;\r\n  struct fb_var_screeninfo vinfo;\r\n  struct fb_fix_screeninfo finfo;\r\n  long screensize=0;\r\n  char *fbp = 0;\r\n  int x = 0, y = 0;\r\n  long location = 0;\r\n\r\n  \/\/\u4ee5\u53ef\u8bfb\u53ef\u5199\u7684\u5f62\u5f0f\u6253\u5f00 \"\/dev\/fb0\" \u6587\u4ef6\r\n fp = open (\"\/dev\/fb0\",O_RDWR);\r\n\r\n  \/\/\u6253\u5f00\u5931\u8d25\r\n  if (fp &lt; 0){\r\n    printf(\"Error : Can not open framebuffer device\/n\");\r\n    exit(1);\r\n  }\r\n\r\n  \/\/\u83b7\u53d6 fb_var_screeninfo \u53c2\u6570\u4fe1\u606f\r\n  \/\/\u6210\u5458\u53d8\u91cf smem_len \u662f\u8fd9\u4e2a \/dev\/fb0 \u7684\u5927\u5c0f\uff0c\u4e5f\u5c31\u662f\u5185\u5b58\u5927\u5c0f\r\n  \/\/\u6210\u5458\u53d8\u91cf line_length \u662f\u5c4f\u5e55\u4e0a\u4e00\u884c\u7684\u70b9\u5728\u5185\u5b58\u4e2d\u5360\u6709\u7684\u7a7a\u95f4\uff0c\u4e0d\u662f\u4e00\u884c\u4e0a\u7684\u70b9\u6570\r\n  if (ioctl(fp,FBIOGET_FSCREENINFO,&amp;finfo)){\r\n    printf(\"Error reading fixed information\/n\");\r\n    exit(2);\r\n   }\r\n \r\n  \/\/\u83b7\u53d6 fb_fix_screeninfo \u53c2\u6570\u4fe1\u606f\r\n  \/\/\u6210\u5458\u53d8\u91cf xres\u3001yres \u662f x \u548c y \u65b9\u5411\u7684\u5206\u8fa8\u7387\uff0c\u5c31\u662f\u4e24\u4e2a\u65b9\u5411\u4e0a\u7684\u70b9\u6570\r\n  \/\/\u6210\u5458\u53d8\u91cf bits_per_pixel \u662f\u6bcf\u4e00\u70b9\u5360\u6709\u7684\u5185\u5b58\u7a7a\u95f4\uff0c32 \u8868\u793a\u4e00\u4e2a\u50cf\u7d20\u70b9\u5927\u5c0f\u4e3a 32 \u4f4d\u3002\r\n  if (ioctl(fp,FBIOGET_VSCREENINFO,&amp;vinfo)){\r\n    printf(\"Error reading variable information\/n\");\r\n    exit(3);\r\n  }\r\n\r\n  \/\/\u8ba1\u7b97\u5c4f\u5e55\u5360\u636e\u7684\u5185\u5b58\u5927\u5c0f\uff08\u5b57\u8282\uff09\r\n  screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel \/ 8;\r\n\r\n  \/\/\u628a fp \u6240\u6307\u7684\u6587\u4ef6\u4e2d\u4ece\u5f00\u59cb\u5230 screensize \u5927\u5c0f\u7684\u5185\u5bb9\u7ed9\u6620\u5c04\u51fa\u6765\uff0c\u5f97\u5230\u4e00\u4e2a\u6307\u5411\u8fd9\u5757\u7a7a\u95f4\u7684\u6307\u9488\r\n  fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);\r\n  if ((int) fbp == -1)\r\n  {\r\n    printf (\"Error: failed to map framebuffer device to memory.\/n\");\r\n    exit (4);\r\n  }\r\n  \r\n  \/\/\u8bbe\u7f6e\u5750\u6807\uff0c(0\uff0c0)\u70b9\u5728\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff0c\u5e76\u8ba1\u7b97\u5750\u6807\u5bf9\u5e94\u7684\u5185\u5b58\u5730\u5740\r\n  x = 100;\r\n  y = 100;\r\n  location = x * (vinfo.bits_per_pixel \/ 8) + y  *  finfo.line_length;\r\n\r\n  \/\/\u753b\u70b9\uff0c\u6309\u7167 ARGB8888 \u683c\u5f0f\uff0c\u76f4\u63a5\u8d4b\u503c\u6765\u6539\u53d8\u5c4f\u5e55\u4e0a\u67d0\u70b9\u7684\u989c\u8272\r\n  *(fbp + location)     = 100; \/\/\u84dd\u8272\u7684\u8272\u6df1\r\n  *(fbp + location + 1) = 15;  \/\/\u7eff\u8272\u7684\u8272\u6df1\r\n  *(fbp + location + 2) = 200; \/\/\u7ea2\u8272\u7684\u8272\u6df1\r\n  *(fbp + location + 3) = 0;   \/\/\u900f\u660e\u5ea6\r\n  \r\n  \u89e3\u9664\u6620\u5c04\r\n  munmap (fbp, screensize);\r\n\r\n  \u5173\u95ed\u6587\u4ef6\r\n  close (fp);\r\n\r\n  \/\/\u8fd4\u56de\r\n  return 0;\r\n}\r<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u7528\u4e00\u4e2a\u5b9e\u4f8b\u8bf4\u660e Linux \u4e0b FrameBuffer \u7684\u4f7f\u7528<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,6],"tags":[],"_links":{"self":[{"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/posts\/792"}],"collection":[{"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=792"}],"version-history":[{"count":1,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/posts\/792\/revisions"}],"predecessor-version":[{"id":793,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=\/wp\/v2\/posts\/792\/revisions\/793"}],"wp:attachment":[{"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.huangrongzhen.ink\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}