一般 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--interrupt handler 的內容是:
....
reguest_irq(IRQ_GPIO, gpinput_handler, SA_INTERRUPT, "gpinput");
偵測input pin..targetpid 這個variale是由 write operation 設定的..
if (pin0)
sys_kill(targetpid, SIGUSR1);
else if(pin1)
sys_kill(targetpid, SIGUSR2);
else if(pin2)
sys_kill(targetpid, SIGUSER3);
else...
....實際上IOCTL 的argument "buffer" 不能直接拿來用,要先copy_from_user( )複製到kernal space後,才能存取,atoi 也要用kernel 的funciton ,不能直接呼叫。
targetpid = atoi(buffer);
....
配合這樣的driver就可以先set sig hanelder,再用
file = open("/dev/gpinput",O_RDRW);來接收gpinput 送出的signal了。
char pidstr[20];
itoa(pidstr, getpid());
write(file, pidstr, strlen(pidstr));
沒有留言:
張貼留言