• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : [求救]Qt4下open 2440的buttons设备总是报错 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 90672
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
综合积分: 142 分
注册时间: 2013-04-22
最后登录: 2013-10-27
楼主  发表于: 2013-06-25 11:33

 [求救]Qt4下open 2440的buttons设备总是报错

在Qt4下面open micro2440开发板上的buttons,总是失败;open pwm都能成功。

在内核中用打印语句跟踪调试,发现是驱动里在open时,request_irq返回的错误码是-EBUSY,表示中断已经被占用且不能共享。
可是pwm的open函数里面也有request_irq啊。

两者唯一的区别就是buttons是用的外部中断,pwm是内部中断。

而且我用友善提供的测试代码测试按键,是正常的;在友善提供的Qtopia下面测试也是对的。

偏偏在我自己用Qt4开发图形界面时,open buttons失败。

有没有哪位帮我分析一下,问题出在哪啊?已经一个多月了,还没搞定这个问题,急啊
级别: 侠客
UID: 90672
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
综合积分: 142 分
注册时间: 2013-04-22
最后登录: 2013-10-27
1楼  发表于: 2013-06-25 16:46
有没有哪位大侠在Qt4下面开发过按键的应用啊,有没有遇到过这种问题啊?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2013-06-25 18:51
从button驱动的open接口看,更像是在你的程序之前已经有人open了这个驱动从而申请了跟button对应的中断。在任何时候你都可以通过cat /proc/interrupts查看系统中已经申请的中断号。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 侠客
UID: 90672
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
综合积分: 142 分
注册时间: 2013-04-22
最后登录: 2013-10-27
3楼  发表于: 2013-06-28 09:36

 回 2楼(kasim) 的帖子

谢谢斑竹,今天按照斑竹的方法查看了一下,发现之前没有哪个程序占用button的中断;后来又深入跟踪了一下,发现之前自己的判断是错误的;在button的驱动中request_irq返回值加了打印语句,如下:
err: 0
err: 0
err: 0
err: 0
err: 0
err: 0
Could not initialize virtual console switching
err: -16
open buttons failed : Device or resource busy
前面6个err为0,表示6个按键的中断挂接正常。最后多了一个err:-16,不知道是怎么回事?会不会是Could not initialize virtual console switching这个原因造成的?
级别: 侠客
UID: 90672
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
综合积分: 142 分
注册时间: 2013-04-22
最后登录: 2013-10-27
4楼  发表于: 2013-06-28 09:43
我是要同时使用触摸屏和按键,是不是在/etc/profile里的环境变量设置有问题啊
export LD_LIBRARY_PATH=/usr/local/lib
export TSLIB_ROOT=/usr/local/lib
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=/usr/local/etc/ts.conf
export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
export QWS_DISPLAY=:1
export QWS_KEYBOARD=TTY:/dev/buttons
级别: 侠客
UID: 90672
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
综合积分: 142 分
注册时间: 2013-04-22
最后登录: 2013-10-27
5楼  发表于: 2013-06-28 10:12

 设备总是报错

我把export QWS_KEYBOARD=TTY:/dev/buttons改为了export QWS_USB_KEYBOARD = TTY:/dev/buttons,在运行时就没有报上面的错误了,很奇怪啊。难道是Qt4.7和Qt2.2不一样吗?我用的buttons不是usb键盘啊
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
6楼  发表于: 2013-06-28 12:15

 Re:回 2楼(kasim) 的帖子

引用第3楼zjun726于2013-06-28 09:36发表的 回 2楼(kasim) 的帖子 :
谢谢斑竹,今天按照斑竹的方法查看了一下,发现之前没有哪个程序占用button的中断;后来又深入跟踪了一下,发现之前自己的判断是错误的;在button的驱动中request_irq返回值加了打印语句,如下:
err: 0
err: 0
err: 0
err: 0
.......

能把你加打印信息的地方,怎么加的,贴出来吗?
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 侠客
UID: 90672
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
综合积分: 142 分
注册时间: 2013-04-22
最后登录: 2013-10-27
7楼  发表于: 2013-06-28 15:20

 回 6楼(kasim) 的帖子

就是在buttons的驱动open函数里面添加的,如下在request_irq函数下面添加的
int s3c24xx_buttons_open(struct inode *inode, struct file *file)
{
    int i;
    int err = 0;
    
    for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {
    if (button_irqs.irq < 0) {
        continue;
    }
        s3c2410_gpio_cfgpin(button_irqs.pin, S3C2410_GPIO_IRQ);
        
        err = request_irq(button_irqs.irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH,
                          button_irqs.name, (void *)&button_irqs);

        printk("err: %d\n",err);

        if (err)
            break;
    }

    if (err) {
        i--;
        for (; i >= 0; i--) {
        if (button_irqs.irq < 0) {
        continue;
        }
            disable_irq(button_irqs.irq);
            free_irq(button_irqs.irq, (void *)&button_irqs);
        }
        return -EBUSY;
    }

    ev_press = 1;
    
    return 0;
}
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
8楼  发表于: 2013-06-28 16:25

 回 7楼(zjun726) 的帖子

那看起来还是open这个设备两次了?第一次是成功的(6个中断都request成功),第二次在请求第一个中断的时候就因为已经之前申请过出错了,返回-16(-EBUSY)。从你的解决办法看,应该是QT的Server进程在你的程序之前open这个设备。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 侠客
UID: 90672
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
综合积分: 142 分
注册时间: 2013-04-22
最后登录: 2013-10-27
9楼  发表于: 2013-07-03 09:41

 回 8楼(kasim) 的帖子

嗯,今天又看了一下,确实如斑竹所说,Qt的Server进程在我的程序之前open了buttons。
那这样的话,可不可以禁止掉,或者我在程序中如何直接获取Server进程open buttons后的文件描述符
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go