Linuxフレームバッファーへの直接アクセス-コピーエリア
-
06-07-2019 - |
質問
組み込みLinuxアプリケーションのフレームバッファ上で長方形を非常にすばやく移動したい。関数 cfb_copyarea
が役に立つかもしれません。しかし、関数を呼び出すための/ dev / fbデバイス上のioctlを見つけることができません。または、この関数を直接呼び出すことはできますか?
解決 3
数日間の調査の結果、私が知る限り、この関数を呼び出すためのioctlはありません。できればカーネルモジュールで独自のシステムコールを記述する必要があります。または、カーネルソースからアルゴリズムをコピーし、nmapedメモリ経由でユーザー空間で使用します。
他のヒント
FrameBufferを初期化して閉じるコードは次のとおりです
class CFrameBuffer
{
void* m_FrameBuffer;
struct fb_fix_screeninfo m_FixInfo;
struct fb_var_screeninfo m_VarInfo;
int m_FBFD;
int InitFB()
{
int iFrameBufferSize;
/* Open the framebuffer device in read write */
m_FBFD = open(FB_NAME, O_RDWR);
if (m_FBFD < 0) {
printf("Unable to open %s.\n", FB_NAME);
return 1;
}
/* Do Ioctl. Retrieve fixed screen info. */
if (ioctl(m_FBFD, FBIOGET_FSCREENINFO, &m_FixInfo) < 0) {
printf("get fixed screen info failed: %s\n",
strerror(errno));
close(m_FBFD);
return 1;
}
/* Do Ioctl. Get the variable screen info. */
if (ioctl(m_FBFD, FBIOGET_VSCREENINFO, &m_VarInfo) < 0) {
printf("Unable to retrieve variable screen info: %s\n",
strerror(errno));
close(m_FBFD);
return 1;
}
/* Calculate the size to mmap */
iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;
printf("Line length %d\n", m_FixInfo.line_length);
/* Now mmap the framebuffer. */
m_FrameBuffer = mmap(NULL, iFrameBufferSize, PROT_READ | PROT_WRITE,
MAP_SHARED, m_FBFD,0);
if (m_FrameBuffer == NULL) {
printf("mmap failed:\n");
close(m_FBFD);
return 1;
}
return 0;
}
void CloseFB()
{
munmap(m_FrameBuffer,0);
close(m_FBFD);
}
};
このコードは完全に正しいわけではありませんが、多くのLinuxデバイスで機能しますが、一部のデバイスでは機能しません。フレームバッファーのサイズを計算するには、これを行わないでください:
iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;
代わりに、これを行います:
iFrameBufferSize = m_FixInfo.smem_len;
そして、コードの移植性が高まります。
所属していません StackOverflow