hyf610009776 发表于 2014-08-24 21:17

关于linux驱动编写的一些问题(用gpio口来模仿IIC slave驱动)

我最近在学习写一个用gpio口模拟IIC slave的驱动,发现了一些问题,查了好多资料都没有找到明确的答案
我目前的想法是:用两个gpio口来模拟SCL.SDA
然后判断SDA为下降沿的时候触发中断——然后在中断函数中禁用该中断,接着启用线程——线程用while来判断信号(就像下面代码那样),当判断gpio口发来的是结束信号的时候,就使能中断,然后用do_exit来结束线程——接着等待新的SDA下降沿信号

1.我想通过判断一个gpio口的信号为下降沿的时候产生中断,然后在函数中启动一个内核线程,用这个线程来处理接下来gpio口的接收的信号(因为不可能一直在中断函数中处理gpio口的内容信号吧)。这个应该可以吧?
2.因为是模拟IIC slave的驱动,因此我打算在线程中用while里面循环判断SCL的高低(while里面死循环),比如
while(!SCL) ; (这后面跟着一个分号)
SDA=0;
while(SCL) ; (这后面也跟着一个分号)
SDA=1;
可是我觉得这样子很占用cpu,可是如果改成用中断的话又很乱,不知道要怎么写。请问一下又什么好的办法。
3.因为这个是要循环使用的内核线程,为了方便之后接收到新的开始信号的时候在启用中断来启用这个函数。本来我想用do_exit()来退出内核线程的,可是我上网查了一下发现有的说用do_exit也是会产生僵尸线程还是要等待kthread_stop()。请问一下是不是这样?如果是的话,我可不可以直接在线程内调用kthread_stop()来杀死自己?

4.我想问一下,在启动线程这个时间是不是相对于IIC传输可以忽略不记?就是在启动线程的时候不会漏掉gpio口上的信号变化。
页: [1]
查看完整版本: 关于linux驱动编写的一些问题(用gpio口来模仿IIC slave驱动)