12

私はこのLinuxフレームバッファを初めて使用するので、フレームバッファに線グラフを描画するように誰かに案内してもらいます。そして、私はターボcでグラフを描くためのコードを持っていますが、今はLinuxです。だから私を助けてください。

ありがとう、ラフル

4

3 に答える 3

19

(例)open()の右側のファイルで使用してから、を使用してメモリにマップします。マンページは、それらの使用方法がわからない場合に、これらのシステムコールに役立ちます。/dev/dev/fb0mmap()

ioctl()次に、のいくつかのsにいくつかの構造と定数があり<linux/fb.h>ます。多くのカーネルヘッダーと同様に、ファイルを参照するだけで多くのことを学ぶことができます。

特に興味深いのは、 。FBIOGET_VSCREENINFOを使用したioctlstruct fb_var_screeninfoです。これにはxresyres(解像度)とが含まれていることに注意してくださいbits_per_pixel。次に、とのFBIOGET_FSCREENINFOようstruct fb_fix_screeninfoな詳細情報がtypeありline_lengthます。

したがって、(x、y)のピクセルは。にある可能性がありますmmap_base_address + x * bits_per_pixel/8 + y * line_length。ピクセルの正確な形式は、ioctlを介して取得する構造によって異なります。それらの読み取り/書き込み方法を決定するのはあなたの仕事です。

これを使ってからしばらく経ちましたので、詳細については少しぼんやりしています。

これは、それがどのように行われるかを説明するための簡単で汚いコードサンプルです...私はこれをテストしていません。

#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/mman.h>

#include <linux/fb.h>

#include <unistd.h>
#include <fcntl.h>

#include <stdio.h>

int main()
{
   struct fb_var_screeninfo screen_info;
   struct fb_fix_screeninfo fixed_info;
   char *buffer = NULL;
   size_t buflen;
   int fd = -1;
   int r = 1;

   fd = open("/dev/fb0", O_RDWR);
   if (fd >= 0)
   {
      if (!ioctl(fd, FBIOGET_VSCREENINFO, &screen_info) &&
          !ioctl(fd, FBIOGET_FSCREENINFO, &fixed_info))
      {
         buflen = screen_info.yres_virtual * fixed_info.line_length;
         buffer = mmap(NULL,
                       buflen,
                       PROT_READ|PROT_WRITE,
                       MAP_SHARED,
                       fd,
                       0);
         if (buffer != MAP_FAILED)
         {
            /*
             * TODO: something interesting here.
             * "buffer" now points to screen pixels.
             * Each individual pixel might be at:
             *    buffer + x * screen_info.bits_per_pixel/8
             *           + y * fixed_info.line_length
             * Then you can write pixels at locations such as that.
             */

             r = 0;   /* Indicate success */
         }
         else
         {
            perror("mmap");
         }
      }
      else
      {
         perror("ioctl");
      }
   }
   else
   {
      perror("open");
   }

   /*
    * Clean up
    */
   if (buffer && buffer != MAP_FAILED)
      munmap(buffer, buflen);
   if (fd >= 0)
      close(fd);

   return r;
}
于 2009-12-02T05:40:25.730 に答える
4

asveikauの答えの代わりに、 DirectFBを使用することもできます。これにより、作業が大幅に簡素化される可能性があります。

于 2009-12-02T06:12:13.550 に答える