USL-5P/A5.ボタン割り込み
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
*メモ [#p6ca7065]
USL-5Pのボタンの割り込みメモ
-ユーザプロセスへどうやってボタン割り込みを通知するか?~...
--案1:割り込みハンドラでsignalを生成してユーザプロセスに...
--案2:ユーザプロセスはselectで待ちうけ。割り込みハンドラ...
結果的にボタンの押下イベントがユーザプロセスへ伝わる。~
-前者は、直感的で解りやすい。後者は、扱いやすい。?
*まず、前者の実装を行ってみる。 [#l731e969]
-カーネル内
--割り込み番号13までサポート。さらに、ボタン割り込みを登...
#pre{{
void __init init_julian_IRQ(void)
{
int i;
for (i=5; i<&color(red){14};; i++)
make_julian_irq(i);
}
}}
--割り込みハンドラの登録。(2つの割り込みでハンドラを共...
#pre{{
if (request_irq(IRQ_POWER, &color(red){sw_interrupt};, 0...
printk(KERN_ERR "Unable to get IRQ 11.\n");
return 1;
}
if (request_irq(IRQ_BUTTON, &color(red){sw_interrupt};, ...
printk(KERN_ERR "Unable to get IRQ 12.\n");
return 1;
}
}}
--割り込みハンドラ本体
#pre{{
static irqreturn_t &color(red){sw_interrupt};(int irq, vo...
{
landisk_btn = (0x0ff & (~ctrl_inb(PA_STATUS))); // ...
disable_irq(IRQ_BUTTON); // ...
disable_irq(IRQ_POWER); // ...
ctrl_outb(0x00, PA_PWRINT_CLR); // ...
if(landisk_btnctrlpid != 0){ // ...
kill_proc(landisk_btnctrlpid, SIGUSR1, 1); // ...
landisk_btnctrlpid = 0; // ...
}
return IRQ_HANDLED;
}
}}
--ユーザプロセスのPID受け渡し部分(ioctlルーチン)。~
#pre{{
case GIODRV_IOCSGIO_BTNPID:
landisk_btnctrlpid = data; // data: ユーザプ...
landisk_btn = 0;
if(irq_desc[IRQ_BUTTON].depth){
enable_irq(IRQ_BUTTON); // ボタン割り込み...
}
if(irq_desc[IRQ_POWER].depth){
enable_irq(IRQ_POWER); // ボタン割り込み...
}
break;
}}
-シグナルを受け取るユーザプロセス~
#pre{{
int main(int argc, char *argv[])
{
…省略…
pid = getpid();
if(signal(SIGUSR1, catch_SIGUSR1) == SIG_ERR){ // シグ...
printf("failed to set signal handler.\n");
exit(0);
}
while(1){
catch_signal = 0; // ハンドシ...
ioctl(fd, GIODRV_IOCSGIO_BTNPID, &pid); // 自身のPID...
// (ボタン割り込み発生時、カーネルは本PIDへシグ...
while(catch_signal == 0){ // シグナル...
sleep(10); // シグナル受信時、sleepは即刻解除され...
}
// 以下シグナル(ボタン割り込み)を受け取った場合のみ...
…省略…
}
}
static void catch_SIGUSR1(int sig) // シグナルハンドラ
{
catch_signal = 1;
}
}}
-うまく動作しているみたい。
*後者の実装 [#e2b1deee]
前者の実装で満足してしまったので、今後の課題とする。
終了行:
*メモ [#p6ca7065]
USL-5Pのボタンの割り込みメモ
-ユーザプロセスへどうやってボタン割り込みを通知するか?~...
--案1:割り込みハンドラでsignalを生成してユーザプロセスに...
--案2:ユーザプロセスはselectで待ちうけ。割り込みハンドラ...
結果的にボタンの押下イベントがユーザプロセスへ伝わる。~
-前者は、直感的で解りやすい。後者は、扱いやすい。?
*まず、前者の実装を行ってみる。 [#l731e969]
-カーネル内
--割り込み番号13までサポート。さらに、ボタン割り込みを登...
#pre{{
void __init init_julian_IRQ(void)
{
int i;
for (i=5; i<&color(red){14};; i++)
make_julian_irq(i);
}
}}
--割り込みハンドラの登録。(2つの割り込みでハンドラを共...
#pre{{
if (request_irq(IRQ_POWER, &color(red){sw_interrupt};, 0...
printk(KERN_ERR "Unable to get IRQ 11.\n");
return 1;
}
if (request_irq(IRQ_BUTTON, &color(red){sw_interrupt};, ...
printk(KERN_ERR "Unable to get IRQ 12.\n");
return 1;
}
}}
--割り込みハンドラ本体
#pre{{
static irqreturn_t &color(red){sw_interrupt};(int irq, vo...
{
landisk_btn = (0x0ff & (~ctrl_inb(PA_STATUS))); // ...
disable_irq(IRQ_BUTTON); // ...
disable_irq(IRQ_POWER); // ...
ctrl_outb(0x00, PA_PWRINT_CLR); // ...
if(landisk_btnctrlpid != 0){ // ...
kill_proc(landisk_btnctrlpid, SIGUSR1, 1); // ...
landisk_btnctrlpid = 0; // ...
}
return IRQ_HANDLED;
}
}}
--ユーザプロセスのPID受け渡し部分(ioctlルーチン)。~
#pre{{
case GIODRV_IOCSGIO_BTNPID:
landisk_btnctrlpid = data; // data: ユーザプ...
landisk_btn = 0;
if(irq_desc[IRQ_BUTTON].depth){
enable_irq(IRQ_BUTTON); // ボタン割り込み...
}
if(irq_desc[IRQ_POWER].depth){
enable_irq(IRQ_POWER); // ボタン割り込み...
}
break;
}}
-シグナルを受け取るユーザプロセス~
#pre{{
int main(int argc, char *argv[])
{
…省略…
pid = getpid();
if(signal(SIGUSR1, catch_SIGUSR1) == SIG_ERR){ // シグ...
printf("failed to set signal handler.\n");
exit(0);
}
while(1){
catch_signal = 0; // ハンドシ...
ioctl(fd, GIODRV_IOCSGIO_BTNPID, &pid); // 自身のPID...
// (ボタン割り込み発生時、カーネルは本PIDへシグ...
while(catch_signal == 0){ // シグナル...
sleep(10); // シグナル受信時、sleepは即刻解除され...
}
// 以下シグナル(ボタン割り込み)を受け取った場合のみ...
…省略…
}
}
static void catch_SIGUSR1(int sig) // シグナルハンドラ
{
catch_signal = 1;
}
}}
-うまく動作しているみたい。
*後者の実装 [#e2b1deee]
前者の実装で満足してしまったので、今後の課題とする。
ページ名: