11.13.2006

GPIO (Input) Driver : Automatic Singal on Interrupt

今天Jerry 寄了一個 gpio driver給我看,是很有趣的作法,這是作input用的GPIO。

一般 driver implement read function ,然後用polling 的方式,
這個driver則implement Write function ,
write 要接收signal 的process 的pid,然後driver在detect 到gpio pin level change 就會signal 該pid。


該gpio (實際上應該只有gpinput)的source 約略是:

module input function :
 program 好peripherial register,設定好pin function--
....
reguest_irq(IRQ_GPIO, gpinput_handler, SA_INTERRUPT, "gpinput");
interrupt handler 的內容是:
 偵測input pin..
if (pin0)
sys_kill(targetpid, SIGUSR1);
else if(pin1)
sys_kill(targetpid, SIGUSR2);
else if(pin2)
sys_kill(targetpid, SIGUSER3);
else...
targetpid 這個variale是由 write operation 設定的..
  ....
targetpid = atoi(buffer);
....
實際上IOCTL 的argument "buffer" 不能直接拿來用,要先copy_from_user( )複製到kernal space後,才能存取,atoi 也要用kernel 的funciton ,不能直接呼叫。


配合這樣的driver就可以先set sig hanelder,再用
 file = open("/dev/gpinput",O_RDRW);

char pidstr[20];
itoa(pidstr, getpid());
write(file, pidstr, strlen(pidstr));
來接收gpinput 送出的signal了。

沒有留言: