元の記事、「によりハスHi3559AV100プラットフォームウィーガンド受信プログラム」という質問を投げかけ、これはとても詳細の資料を開くには、専用のその記事に書かれていますが、より多くのコンテンツとして一つの比較的独立しているべきです。
受信ウィーガンドハスのプラットフォーム上でプログラムを実行しながら分析は、外部GPIOウィーガンドに影響を与えるMPPモジュールの多くを実行するためにハスチップによるものであるとき発見する前に、それは、失われた割り込みが発生していますが、中断中で使用される手順を受け取ります。
さらなる分析は、一度判決を確認した(下記参照)猫の/ proc /割り込みが得られた知見をコマンドを実行した結果によると、大半はCPU0、ウィーガンドで中断されている上記が生成されますCPU0に割り当てられた割り込みも使用します問題。
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////
CPU0 CPU1 CPU2 CPU3
1:0 0 0 0 GIC-0 arch_timer 29レベル
2:arch_timer 9156822 9156735 9156532 9156650 GIC-0 30レベル
3:0 0 0 0 GIC-0 243レベルIPCM
9:157 0 0 GIC-0 38レベルUART-PL011
14:0 0 0 0 GIC-0 63レベルはPL022
0 0 0 0 GIC-0 64レベルはPL022:15
16:0 0 0 0 GIC-0 65レベルはPL022
17:0 0 0 0 GIC-0 66レベルPL022
18:0 0 0 0 0 GIC-PL022 67レベル
19:0 0 0 0 GIC-0 192レベル12140000.gpio_chip
20:0 0 0 0 GIC-0 193レベル12141000.gpio_chip
21:0 0 0 0 GIC-0 194レベル12142000.gpio_chip
22:0 0 0 0 GIC-0 195レベル12143000.gpio_chip
23:0 0 0 0 GIC-0 196レベル12144000.gpio_chip
24:0 0 0 0 GIC-0 197レベル12145000.gpio_chip
25:0 0 0 0 GIC-0 198レベル12146000.gpio_chip
26:0 0 0 0 GIC-0 199レベル12147000.gpio_chip
27:0 0 0 0 GIC-0 200レベル12148000.gpio_chip
28:0 0 0 0 GIC-0 201レベル12149000.gpio_chip
29:0 0 0 0 GIC- 0 202レベル1214a000.gpio_chip
30:0 0 0 0 GIC-0 203レベル1214b000.gpio_chip
31:2 0 0 GIC-0 204レベル1214c000.gpio_chip
32:0 0 0 0 GIC-0 205レベル1214d000.gpio_chip
33: 0 0 0 0 GIC-0 206レベル1214e000.gpio_chip
34:0 0 0 0 GIC-0 207レベル1214f000.gpio_chip
35:0 0 0 0 GIC-0 208レベル12150000.gpio_chip
36:0 0 0 0 GIC-0 209レベル12151000.gpio_chip
37:0 0 0 0 GIC- 0 210レベル12152000.gpio_chip
38:0 0 0 0 GIC-0 215レベル180d3000.shub_gpio
39:0 0 0 0 0 GIC-43レベル180b0000.rtc
40:5588734 0 0 GIC-0 68レベル101c0000.ethernet
42: 212 0 0 0 GIC-0 116レベルxhci-HCD:USB1
43:0 0 0 0 GIC-0 117レベルxhci-HCD:USB3
44:2314 0 0 GIC-0 58レベルmmc0
45:0 0 0 0 GIC-0 106レベルMMC1
46:0 0 0 0 GIC-0 107レベルMMC2
53:0 0 0 0 GIC-0 113レベルhiedmacv310
55:0 0 0 0 GIC-0 92レベルVI_CAP0
56:0 0 0 0 GIC-0 93レベルVI_PROC0
57:0 0 0 0 GIC-0 94レベルVI_PROC1
58:0 0 0 0 GIC-0 118レベルSLVS_EC0
59:0 0 0 0 GIC-0 120レベルMIPI0
60:796266 0 0 GIC-0 77レベルVPSS0
61:43022 0 0 GIC-0 78レベルVPSS1
62:690722 0 0 GIC-0 75レベルVGS0
63: 222459 0 0 GIC-0 76レベルVGS1
64:0 0 0 0 GIC-0 79レベルGDC0
65:0 0 0 0 GIC-0 80レベルGDC1
66:0 0 0 0 GIC-0 83レベルDIS
67:0 0 0 GIC-0 184レベルAVS
68:0 0 0 0 GIC-0 99レベルVOのInt
69:0 0 0 0 GIC-0 100レベルHIFBのInt
70:0 0 0 0 GIC-0 95レベルMIPI_TX
72:0 0 0 0 GIC-0 71レベルVEDU_0
73:0 0 0 0 GIC-0 72レベルVEDU_1
74:0 0 0 0 GIC-0 73レベルVEDU_2
75:652 0 0 GIC-0 81レベルJPGE_0
76:0 0 0 0 GIC-0 123レベルvdh_bd
77: 912964 0 0 GIC-0 124レベルvdh_pd
78:861008 0 0 GIC-0 126レベルvdh_scd
79:0 0 0 0 GIC-0 84レベルJPEGD_0
80:484599 0 0 GIC-0 90レベルnnie0
81:484821 0 0 GIC-0 91レベルnnie1
82: 0 0 0 0 GIC-0 240レベルDPU RECT
83:0 0 0 0 GIC-0 241レベルDPU MATCH
84:326 0 0 GIC-0 88レベルIVE
86:0 0 0 0 GIC-0 101レベルAIO割り込み
87 :1 0 0 0 GIC-0 134レベル11c00000.gpu
88:3 0 0 0 GIC-0 tde_osr_isr 85レベル
89:1 0 0 0 GIC-0 135レベル11c00000.gpu
90:1 0 0 0 GIC-0 133レベル11c00000.gpu
97:0 0 0 0 PL061 2エッジRST
193:1 0 0 0 PL061 2エッジwiegand_data1
195:1 0 0 0 PL061 4エッジwiegand_data0
IPI0:1297810 2253123 4008151 9711865再スケジュール割り込み
IPI1:割り込み21 10 25 10ファンクションコール
IPI2:0 0 0 0 CPU停止割り込み
IPI3:0 0 0 0タイマ放送割り込み
IPI4:0 0 0 0 IRQ仕事割り込み
IPI5:0 0 0 0 CPUのウェイクアップ割り込み
エラー:0
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////
どのように私はこの問題を解決することができますか?インターネット上で解決策を見つけます。
1. echoコマンドのCPUのマスク描画の/ proc / IRQ /割り込みID / smp_affinityドキュメントの使用は、CPUへの割り込みの変更親和性を達成することができます。
動作この方法によれば4> / procの/ IRQ / 193 / smp_affinityエコーを、結果が次のエラーをお勧め:
エコー:書き込みエラー:入力/出力エラー
この問題に対する別の解決法によれば、答えは残念です、これは、何の解決策ハードウェアまたはオペレーティング・システム上の意思決定ではありません!
方法1が失敗します。
2.解決策を見つけるために、コア層に焦点を当て、アプリケーション層から分離しません。そのようなカーネル関数:irq_set_affinity(clock_event_device-> IRQ、cpumask)、CPUのIRQは、一つまたはどのサービスCPUのIRQを示すいくつかに関連付けられます。
コードの修正モジュールのこの方法によれば、次のステートメントを追加します。
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////
構造体cpumaskのcpumask。
cpumask.bits [0] =(unsigned long型)0×02;
irq_set_affinity_hint(wiegand_in_devp-> d0_irq、&cpumask)。
irq_set_affinity_hint(wiegand_in_devp-> d1_irq、&cpumask)。
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////
irq_set_affinity_hint機能は、カーネル/ IRQ / manage.cに順番に機能irq_set_affinityを呼び出すこと__irq_set_affinity関数呼び出し、です。
この方法は、根本的に問題を解決していないようにみえますが、実際にウィガン2 GPIO割り込み、またはCPU0に割り当てられた後、モジュールが観察されたコンパイルして実行、CAT / procの/ IRQ / 193 / smp_affinity結果、まだF、何の変化。それはなぜでしょうか?カーネルコードの印刷問題のデバッグに参加し続ける(赤色の太字で以下を参照)、ここで見つかりました:
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// //////////
INT irq_set_affinity_locked(構造体irq_data *データ、CONST構造体cpumask *マスク、
BOOL力)
{
構造体irq_chip *チップ= irq_data_get_irq_chip(データ)。
構造体irq_desc * DESC = irq_data_to_desc(データ)。
int型RET = 0;
printk( "111 \ n");
(!チップはチップボード||> irq_set_affinity)であれば
、戻り-EINVAL。
printk( "222 \ n");
(irq_can_move_pcntxt(データ)){もし
RET = irq_do_set_affinity(データ、マスク、力)。
}他{
irqd_set_move_pending(データ)。
irq_copy_pending(DESC、マスク)。
}
IF(desc-> affinity_notify){
kref_get(&desc-> affinity_notify-> KREF)。
schedule_work(&desc-> affinity_notify->仕事);
}
irqd_set(データ、IRQD_AFFINITY_SET)。
右を返します。
}
////////////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////////////
実際にダウンを実行しませんでした、これはチップボード> irq_set_affinity空のリードによるものである必要がありますが、更なる研究が設定する方法に必要とされる場所は空である理由の特定には、設定する必要があります......