遥控通过串口传输,再通过input方式上报键值问题

C_yue_654 2012-05-07 04:56:37
向大家请教个问题,实现遥控功能。是通过ttymxc3串口传输,再通过input方式把键值上报上去。由于我是在串口驱动里注册的一个input节点。如果要从这个节点里读到键值的话必须要打开两个节点。就是把event1这个节点和ttymxc3这个串口节点都要打开,才能读到相应的键值。现在问题是我通过测试程序来读取键值是可以的,用QT却不能读到键值。
麻烦大家多顶顶,或者给一个更好的实现方法。
...全文
290 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_16975699 2014-06-27
  • 打赏
  • 举报
回复
你是如何实现的?能说一下方法和给一下代码吗?
C_yue_654 2012-05-09
  • 打赏
  • 举报
回复
多谢deep_pro的顶帖。qt可以读到键值了。 就如我上一种情况会不会对其他有影响。比如:影响qt读键盘的值。暂时没找到驱动的原因。也就input_register_device直接注册。
deep_pro 2012-05-08
  • 打赏
  • 举报
回复
那就是因为没有打开ttymxc3的话,你的串口驱动不会被激活,也就不会上报input事件了
你可以另外用一个应用程序一开机就打开ttymxc3 ,激活串口驱动

另外,你的内核版本是什么?有可能还有另外一个问题导致qt不认你的input事件
http://topic.csdn.net/u/20120213/00/af1b5dae-73ad-4d35-be5b-e2943a26af99.html
C_yue_654 2012-05-08
  • 打赏
  • 举报
回复
遥控通过串口传输,我就是在串口驱动里注册一个input上报节点。把串口里的传过来的值通过这个节点用键盘码的方式上报。上层通过这个节点获取键值。如果想读到这个节点值,必须打开input和串口两个节点。 大概过程就这样子。相应的代码
static void mxc_kpp_close(struct input_dev *dev)
{

}

static int mxckb_ir_init(void)
{

int retval,i,code,scan;
mxckbd_ir_dev = input_allocate_device();//申请input_dev结构
if (!mxckbd_ir_dev) {
printk(KERN_ERR
"mxckbd_ir_dev: not enough memory for input device\n");
retval = -ENOMEM;
return retval;
}
//填充
mxckbd_ir_dev->keycode = (void *)mxckpd_ir_keycodes;
mxckbd_ir_dev->keycodesize = sizeof(mxckpd_ir_keycodes[0]);
mxckbd_ir_dev->keycodemax = KEYBOARD_NUM;
mxckbd_ir_dev->name = "mxckpd_ir";
mxckbd_ir_dev->id.bustype = BUS_HOST;
mxckbd_ir_dev->open = mxc_kpp_open;
mxckbd_ir_dev->close = mxc_kpp_close;
/* mxckbd_ir_dev->phys = "input/event0";
mxckbd_ir_dev->id.vendor = 0x0001;
mxckbd_ir_dev->id.product = 0x0001;
mxckbd_ir_dev->id.version = 0x0100;
*/
/* setup input device */
retval = input_register_device(mxckbd_ir_dev);//注册设备
if (retval < 0) {
printk(KERN_ERR
"mxckbd_ir_dev: failed to register input device\n");
goto err2;
}


__set_bit(EV_KEY, mxckbd_ir_dev->evbit);//比如按键,应该对哪些键值的按键进行处理(对于其它按键不予理睬)
for (i = 0; i < IR_KEY_NUM; i++)
{
scan=mxckpd_ir_keycodes[i];
__set_bit(mxckpd_keycodes[scan], mxckbd_ir_dev->keybit);
}
input_set_capability(mxckbd_ir_dev, EV_MSC, MSC_SCAN);//记录本设备对于哪些事件感兴趣(对其进行处理)
__clear_bit(KEY_RESERVED, mxckbd_ir_dev->keybit);
err2:
input_free_device(mxckbd_ir_dev);
return retval;

}
在串口驱动的rx里通过这函数获取串口里的信息,进行上报。
static void report_key(char ch)
{
int i;
unsigned char new_ir_val=ch;
unsigned short new_key_val;
unsigned short old_key_val;
new_key_val=mxckpd_keycodes[ch];
//printk("\nnew_key_val is %d \n",new_key_val);
input_event(mxckbd_ir_dev, EV_MSC, MSC_SCAN, new_ir_val);//上报事件

if (new_key_val != KEY_RESERVED) {
//printk("\nreport DOWN key is %d\n",new_key_val);
input_report_key(mxckbd_ir_dev, new_key_val, 1);
old_key_val=new_key_val;
}


if (old_key_val != KEY_RESERVED)
{
// printk("\nreport UP key is %d\n",old_key_val);
input_report_key(mxckbd_ir_dev, old_key_val, 0);

}
input_sync(mxckbd_ir_dev);

}
还有些相应的中断函数。
deep_pro 2012-05-08
  • 打赏
  • 举报
回复
读event1是无法读到信息的。而是要从event0里面读。
-------------
这种情况肯定不对的,需要检查你的驱动。

另外有一种不需要写驱动的方法,你自己写应用程序接受串口来的数据,然后把数据按照input_event结构体格式写入event0 ,qt读event0 即可
这种方法你能搜到很多信息
C_yue_654 2012-05-08
  • 打赏
  • 举报
回复
我内核版本是2.6.35的,我测试程序是可以用的。只是客户那边说QT读不到,有没有跟上报的键值有关系。(比如说不标准) 多谢deep_pro, 我还有个问题比较困扰,就是当我没有在串口驱动里注册input节点时,在dev/input/下已经有了个event0 ,当我注册了这个节点时就多了个event1。奇怪的是event1应当是我在串口驱动下创建的节点,但是我读event1是无法读到信息的。而是要从event0里面读。
deep_pro 2012-05-07
  • 打赏
  • 举报
回复
只要event就足够了

如果要从这个节点里读到键值的话必须要打开两个节点。就是把event1这个节点和ttymxc3这个串口节点都要打开,才能读到相应的键值。
------------------------------
你把你的详细过程说一说,你的做法不是正常方法,我不能理解
C_yue_654 2012-05-07
  • 打赏
  • 举报
回复
有两个节点,设置环境变量只能设置一个节点。我设置的是event1
deep_pro 2012-05-07
  • 打赏
  • 举报
回复
该你的qt环境变量脚本 里面有指定输入设备的环境变量

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧