serio总线 应用在串口触摸屏的serio_device 注册问题

枫叶会再红吗 2017-11-13 07:15:31
大家好,serio串口触摸屏tool里面有段

int ldisc = N_MOUSE;
if(ioctl(fd, TIOCSETD, &ldisc))
{
printf(stderr, "inputattach: canˉt set line discipline\n");
return -1;
}

我想搞清楚,这个ioctl调用了tty_io.c里面的ioctl,但是在这个ioctl里面又调用了一个ioctl(2),这个ioctl是下面(1)传SPIOCSTYPE才会用到的应该,但是这个ioctl是调用的serport里面的?,我现在搞不清楚它是怎么调到serport里面的。
应该从上面它传的N_MOUSE这个ioctl来分析(3),追到内核里面去,但是在tty_ldisc_get 和 get_ldops 这2个函数里面是怎么实现调到serport的?
我是参考网上一位大神的解释,如下:这段代码需要得到N_MOUSE的链路层,先在tty_ldiscs里面查找是否有N_MOUSE链路层的处理函数ops,如果没有,就需要加载serport模块,看看这个模块init函数 retval = tty_register_ldisc(N_MOUSE, &serport_ldisc);
如果有N_MOUSE链路层的处理函数ops,那又是调用谁的ioctl?tty_ioctl里面没有SPIOCSTYPE。如果没有,就注册一个serport,调用其ioctl,这个ioctl内部实现了对serio_device进行初始化操作,但是它是怎么加载serport的?问题就是这里,希望大家能帮下,谢谢。

(1)
if(ioctl(fd, SPIOCSTYPE, &devt))
{
printf(stderr, "inputattach: canˉt set device type\n");
return -1;
}

(2)
if (tty->ops->ioctl) {
retval = (tty->ops->ioctl)(tty, cmd, arg);
if (retval != -ENOIOCTLCMD)
return retval;
}

(3)
long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
case TIOCSETD:
return tiocsetd(tty, p); ->
tty_set_ldisc(tty, ldisc); ->
new_ldisc = tty_ldisc_get(ldisc); ->
ldops = get_ldops(disc)
...全文
361 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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