LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 917|回复: 7

更改BTTV驱动程序所遇到的困难。

[复制链接]
发表于 2005-6-6 11:49:44 | 显示全部楼层 |阅读模式
bttv的驱动程序存在一个问题,就是如果在接受到V4L2_S_INPUT的ioctl命令后,它会立刻向视频采集卡的控制寄存器写切换视频通道命令,如果这个命令不是发生在垂直同步空闲时间内的话,那么就会产生采集到的该帧的视频确实分别来自两个通道视频组合而产生的图像,画面很明显的被分为上半部分来自于一个视频通道,下半部分却由来自于另一个通道。
在这里向达人请教有关如何解决该问题的方法。
我这里粗略的想法是,在每个垂直同步来临的时候,视频采集卡会产生硬件中断,我们重新写一个硬件中断服务例程,可以先将请求视频通道切换的进程进行排队,然后将他们阻塞,这时候这个中断服务就可以唤醒刚才那些被阻塞了的进程。
但是这会牵涉到系统调用时的阻塞操作,会不会很复杂??
发表于 2005-6-6 12:07:08 | 显示全部楼层
我的也是BTTV的卡,没有你说的这种情况呀,不过我的在换台的时候会杂音,要用E键重新调adioumode。用的是tvtime。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-6 12:19:40 | 显示全部楼层
这个是肉眼看不出来的,大哥。要用程序。
回复 支持 反对

使用道具 举报

发表于 2005-6-7 00:06:15 | 显示全部楼层
我觉得没必要把 ioctl 阻塞啊,不过阻塞的话,恐怕会简单很多,嘻嘻。

我想:
可以在驱动里维护一个 task_queue。
在 ioctl 的实现里 queue_task.
再在 ISR 里 run_task_queue。
回复 支持 反对

使用道具 举报

发表于 2005-6-7 03:45:45 | 显示全部楼层
这个问题好专业。
不过,在系统调用的阻塞操作好像不难实现吧?是不是interruptible_sleep_on,wake_up_interruptible这几个内核调用就可以做到?
另外task_queue在2.6中已经没有了,现在都是用tasklet。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-7 10:33:35 | 显示全部楼层
多谢,多谢!开发遇到问题时还要再向两位请教呢,呵呵。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-7 10:37:32 | 显示全部楼层
Post by chaisave
我觉得没必要把 ioctl 阻塞啊,不过阻塞的话,恐怕会简单很多,嘻嘻。

我想:
可以在驱动里维护一个 task_queue。
在 ioctl 的实现里 queue_task.
再在 ISR 里 run_task_queue。

Chaisave大哥,ISR是什么意思?
回复 支持 反对

使用道具 举报

发表于 2005-6-7 20:51:41 | 显示全部楼层
Post by Tetris
这个问题好专业。
不过,在系统调用的阻塞操作好像不难实现吧?是不是interruptible_sleep_on,wake_up_interruptible这几个内核调用就可以做到?
另外task_queue在2.6中已经没有了,现在都是用tasklet。

我 grep 了一下 2.6.11-5 的源代码,还是有  queue_task 的呢。可能 tasklet 是趋势吧?

ISR=Interrupt Service Routines
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表