linux framebuffer 出错?求助
本帖最后由 yyplc 于 2012-05-10 17:49 编辑今天写一个应用程序测试linux 视频子系统frame buffer设备,发现ioctl竟然出错,均返回-1,不知到为什么?
更奇怪的是,在内核端fb_ioctl加入printk调式,竟然也没有输出,说明用户程序ioctl的时候,根本不会执行fbioctl!!!
求助高手,指点一下菜鸟!
static const struct file_operations fb_fops = {
.owner = THIS_MODULE,
.read = fb_read,
.write = fb_write,
.unlocked_ioctl = fb_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = fb_compat_ioctl,
#endif
.mmap = fb_mmap,
.open = fb_open,
.release = fb_release,
#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
.get_unmapped_area = get_fb_unmapped_area,
#endif
#ifdef CONFIG_FB_DEFERRED_IO
.fsync = fb_deferred_io_fsync,
#endif
};
用户程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
//#include <sys/types.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
int main(void)
{
int fd;
int fbsize;
unsigned char *fbbuf;
char buf;
int i,res,adc_data;
if ((fd = open("/dev/fb0",O_RDWR)) < 0) {
printf("open adc_dev failed\n");
return 1;
}
if((res = ioctl(fd,FBIOGET_FSCREENINFO,&finfo)) == -1)
{
printf("ERROR reading fixed information.error = %d\n",res);
}
if ((res = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo)) ==-1) {
printf("bad vscreeninfo ioctl.error = %d\n",res);
}
fbsize = vinfo.xres * vinfo.yres * (vinfo.bits_per_pixel/8);
printf("fbisze: %d",fbsize);
if ((fbbuf = mmap(0, fbsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == (void*) -1)
{
printf("map video error.\n");
}
for (i = 0; i< fbsize; i++) {
*(fbbuf+i) = 0x0;
}
munmap(fbbuf, fbsize);
close(fd);
return 0;
} 你先确定你open的设备节点是对的吗? 你ioctl下的cmd和内核是对应的吗? stefan_weids 发表于 2012-05-09 09:35 static/image/common/back.gif
你先确定你open的设备节点是对的吗? 你ioctl下的cmd和内核是对应的吗?
open节点没错,能返回。
ioctl的cmd是没错的。可以查看源码
现在,无论是在PC或者S3C2440上测试,设备都能正确打开,但ioctl都返回错误值!!
:dizzy: stefan_weids 发表于 2012-05-09 09:35 static/image/common/back.gif
你先确定你open的设备节点是对的吗? 你ioctl下的cmd和内核是对应的吗?
谢谢,你说的是对的
粗心造成...
解决了
犯了一个及其低级的错误!
楼主位的程序改正了 我刚刚说把你的程序改正了#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
//#include <sys/types.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
int main(void)
{
int fd;
int fbsize;
unsigned char *fbbuf;
char buf;
int i,res,adc_data;
if ((fd = open("/dev/fb0",O_RDWR)) < 0) {
printf("open adc_dev failed\n");
return 1;
}
if((res = ioctl(fd,FBIOGET_FSCREENINFO,&finfo)) == -1)
{
printf("ERROR reading fixed information.error = %d\n",res);
}
if ((res = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo)) ==-1) {
printf("bad vscreeninfo ioctl.error = %d\n",res);
}
fbsize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel;
printf("fbisze: %d",fbsize);
fbbuf = mmap(0, finfo.smem_len , PROT_READ | PROT_WRITE , MAP_SHARED, fd, 0);
if( fbbuf == MAP_FAILED)
{
printf("map video error.\n");
}
for (i = 0; i< finfo.smem_len; i++) {
*(fbbuf+i) = 0x0;
}
munmap(fbbuf, finfo.smem_len);
close(fd);
return 0;
}你现在可以试试。 主要是的代码问题,与设备节点和ioctl下的cmd无关。
是,粗心导致,也被fb_open了
因为觉得fb_open都能打开了,那么说明file_operations已经挂接成功
事实上file_operations没有关联node....
页:
[1]