質問編集履歴

1

すみません、codeボタンというものあるの知りませんでした。よろしくお願いいたします。

2019/10/18 09:02

投稿

Gammodler
Gammodler

スコア9

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,268 @@
1
+ ```ここに言語を入力
2
+
3
+ コード
4
+
5
+ static int __init mydev_init(void)
6
+
7
+ {
8
+
9
+ int ret;
10
+
11
+
12
+
13
+ printk("<1>Hello module world.\n");
14
+
15
+ printk("<1>Module parameters were (0x%08x) and \"%s\"\n", myint, mystr);
16
+
17
+
18
+
19
+ static struct resource foomatic_resources[] = {
20
+
21
+ {
22
+
23
+ .start = 0x43c00000,
24
+
25
+ .end = 0x43c0ffff,
26
+
27
+ .flags = IORESOURCE_MEM,
28
+
29
+ .name = "io-memory"
30
+
31
+ },
32
+
33
+ {
34
+
35
+ .start = 20,
36
+
37
+ .end = 20,
38
+
39
+ .flags = IORESOURCE_IRQ,
40
+
41
+ .name = "irq",
42
+
43
+ }
44
+
45
+ };
46
+
47
+
48
+
49
+ pdev = platform_device_register_simple(DRIVER_NAME, 0, foomatic_resources,
50
+
51
+ ARRAY_SIZE(foomatic_resources));
52
+
53
+ printk("ARRAY_SIZE(foomatic_resources) %x\n", ARRAY_SIZE(foomatic_resources));
54
+
55
+
56
+
57
+ if (pdev == NULL) { printk("Adding platform device pdev\"%x\" failed\n", pdev);
58
+
59
+ kfree(pdev); return -ENODEV; }
60
+
61
+ else{
62
+
63
+ printk("Adding platform device pdev\"%x\" successfull\n", pdev);
64
+
65
+ }
66
+
67
+
68
+
69
+ return platform_driver_register(&mydev_driver);
70
+
71
+ }
72
+
73
+
74
+
75
+ pdevは問題なく取得できました。
76
+
77
+ 次に呼ばれるprobe機能を以下に示します:
78
+
79
+
80
+
81
+ // mydev構造体
82
+
83
+ struct mydev_local {
84
+
85
+ int irq;
86
+
87
+ unsigned long mem_start;
88
+
89
+ unsigned long mem_end;
90
+
91
+ void __iomem *base_addr;
92
+
93
+ };
94
+
95
+
96
+
97
+ // 割り込みHandler
98
+
99
+ static irqreturn_t mydev_irq(int irq, void *lp)
100
+
101
+ {
102
+
103
+ printk("mydev interrupt\n");
104
+
105
+ return IRQ_HANDLED;
106
+
107
+ }
108
+
109
+
110
+
111
+ // modprobe mydev.koで呼ばれるModule
112
+
113
+ static int mydev_probe(struct platform_device *pdev)
114
+
115
+ {
116
+
117
+ struct resource *r_irq; /* Interrupt resources */
118
+
119
+ struct resource *r_mem; /* IO mem resources */
120
+
121
+ struct device *dev = &pdev->dev;
122
+
123
+ struct mydev_local *lp = NULL;
124
+
125
+
126
+
127
+ int rc = 0;
128
+
129
+
130
+
131
+ dev_info(dev, "Device Tree Probing\n");
132
+
133
+
134
+
135
+ /* Get iospace for the device */
136
+
137
+ r_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
138
+
139
+ if (!r_mem) {
140
+
141
+ dev_err(dev, "invalid address\n");
142
+
143
+ return -ENODEV;
144
+
145
+ }
146
+
147
+
148
+
149
+ lp = (struct mydev_local *) kmalloc(sizeof(struct mydev_local), GFP_KERNEL); if (!lp) {
150
+
151
+ dev_err(dev, "Cound not allocate mydev device\n");
152
+
153
+ return -ENOMEM;
154
+
155
+ }
156
+
157
+
158
+
159
+ dev_set_drvdata(dev, lp);
160
+
161
+
162
+
163
+ lp->mem_start = r_mem->start;
164
+
165
+ lp->mem_end = r_mem->end;
166
+
167
+
168
+
169
+ if (!request_mem_region(lp->mem_start,
170
+
171
+ lp->mem_end - lp->mem_start + 1,
172
+
173
+ DRIVER_NAME)) {
174
+
175
+ dev_err(dev, "Couldn't lock memory region at %p\n",
176
+
177
+ (void *)lp->mem_start);
178
+
179
+ rc = -EBUSY;
180
+
181
+ goto error1;
182
+
183
+ }
184
+
185
+
186
+
187
+ lp->base_addr = ioremap(lp->mem_start, lp->mem_end - lp->mem_start + 1);
188
+
189
+ if (!lp->base_addr) {
190
+
191
+ dev_err(dev, "mydev: Could not allocate iomem\n");
192
+
193
+ rc = -EIO;
194
+
195
+ goto error2;
196
+
197
+ }
198
+
199
+
200
+
201
+ /* Get IRQ for the device */
202
+
203
+ r_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
204
+
205
+ if (!r_irq) {
206
+
207
+ dev_info(dev, "no IRQ found\n");
208
+
209
+ dev_info(dev, "mydev at 0x%08x mapped to 0x%08x\n",
210
+
211
+ (unsigned int __force)lp->mem_start,
212
+
213
+ (unsigned int __force)lp->base_addr);
214
+
215
+ return 0;
216
+
217
+ }
218
+
219
+ lp->irq = r_irq->start;
220
+
221
+
222
+
223
+ rc = request_irq(lp->irq, &mydev_irq, 0, DRIVER_NAME, lp);
224
+
225
+ if (rc) {
226
+
227
+ dev_err(dev, "testmodule: Could not allocate interrupt %d.\n",
228
+
229
+ lp->irq);
230
+
231
+ goto error3;
232
+
233
+ }
234
+
235
+
236
+
237
+ dev_info(dev,"mydev at 0x%08x mapped to 0x%08x, irq=%d\n",
238
+
239
+ (unsigned int __force)lp->mem_start,
240
+
241
+ (unsigned int __force)lp->base_addr,
242
+
243
+ lp->irq);
244
+
245
+ return 0;
246
+
247
+ error3:
248
+
249
+ free_irq(lp->irq, lp);
250
+
251
+ error2:
252
+
253
+ release_mem_region(lp->mem_start, lp->mem_end - lp->mem_start + 1);
254
+
255
+ error1:
256
+
257
+ kfree(lp);
258
+
259
+ dev_set_drvdata(dev, NULL);
260
+
261
+ return rc;
262
+
263
+ }
264
+
1
- Zynq-700(ARM)割り込みがかからない
265
+ ```Zynq-700(ARM)割り込みがかからない
2
266
 
3
267
 
4
268
 
@@ -38,384 +302,124 @@
38
302
 
39
303
 
40
304
 
41
- static int __init mydev_init(void)
42
-
43
- {
44
-
45
- int ret;
46
-
47
-
48
-
49
- printk("<1>Hello module world.\n");
50
-
51
- printk("<1>Module parameters were (0x%08x) and \"%s\"\n", myint, mystr);
52
-
53
-
54
-
55
- static struct resource foomatic_resources[] = {
56
-
57
- {
58
-
59
- .start = 0x43c00000,
60
-
61
- .end = 0x43c0ffff,
62
-
63
- .flags = IORESOURCE_MEM,
64
-
65
- .name = "io-memory"
66
-
67
- },
68
-
69
- {
70
-
71
- .start = 20,
72
-
73
- .end = 20,
74
-
75
- .flags = IORESOURCE_IRQ,
76
-
77
- .name = "irq",
78
-
79
- }
305
+
306
+
307
+ これを実行させると、どのError表示も行われませんが、割り込みはかかりません。
308
+
309
+
310
+
311
+ 割り込み要求はmydevのintr Portに10Hzの繰り返し波形、あるいはボタンによるLevel信号を印加することで、結果を確認しています。
312
+
313
+ オシロスコープで波形は確認済です。
314
+
315
+ 他のPin入出力は良好に動作しているので、ここが問題とは考えにくいです。
316
+
317
+
318
+
319
+
320
+
321
+ Target側
322
+
323
+ cat /proc/interrupts
324
+
325
+ の結果です。
326
+
327
+
328
+
329
+ 18: 7179 1714 GIC 29 Edge twd
330
+
331
+ 20: 0 0 GIC 38 Level mydev
332
+
333
+ 21: 43 0 GIC 39 Level f8007100.adc
334
+
335
+
336
+
337
+ 全く受かっていないようです。
338
+
339
+ Level割り込みになっているようなので、終了処理をしないと次が受かりません。
340
+
341
+ しかしゼロですからそれもないでしょう。
342
+
343
+
344
+
345
+ lp->irq=20の理由が分かりません。
346
+
347
+ Xynq-7000ではPL割り込みは61番以降なのです。
348
+
349
+ これは明らかに範囲外です。
350
+
351
+ しかしXilinxのCommunityで差し支えないような記述を見たこともあります。
352
+
353
+ 関知する必要はないのでしょうか。
354
+
355
+ =20の出どころを探ってみました。
356
+
357
+ 以下はdevice-treeのpl.dtsi Fileの内容です:
358
+
359
+
360
+
361
+ / {
362
+
363
+ amba_pl: amba_pl {
364
+
365
+ #address-cells = <1>;
366
+
367
+ #size-cells = <1>;
368
+
369
+ compatible = "simple-bus";
370
+
371
+ ranges ;
372
+
373
+ my_ip_0: my_ip@43c00000 {
374
+
375
+ compatible = "xlnx,my-ip-189.2";
376
+
377
+ interrupt-parent = <&intc>;
378
+
379
+ interrupts = <0 29 4>;
380
+
381
+ reg = <0x43c00000 0x10000>;
382
+
383
+ xlnx,s00-axi-my-ip-addr-width = <0x4>;
384
+
385
+ xlnx,s00-axi-my-ip-data-width = <0x20>;
386
+
387
+ };
80
388
 
81
389
  };
82
390
 
83
-
84
-
85
- pdev = platform_device_register_simple(DRIVER_NAME, 0, foomatic_resources,
86
-
87
- ARRAY_SIZE(foomatic_resources));
88
-
89
- printk("ARRAY_SIZE(foomatic_resources) %x\n", ARRAY_SIZE(foomatic_resources));
90
-
91
-
92
-
93
- if (pdev == NULL) { printk("Adding platform device pdev\"%x\" failed\n", pdev);
94
-
95
- kfree(pdev); return -ENODEV; }
96
-
97
- else{
98
-
99
- printk("Adding platform device pdev\"%x\" successfull\n", pdev);
100
-
101
- }
102
-
103
-
104
-
105
- return platform_driver_register(&mydev_driver);
106
-
107
- }
108
-
109
-
110
-
111
- pdevは問題なく取得できました。
112
-
113
- 次に呼ばれるprobe機能を以下に示します:
114
-
115
-
116
-
117
- // mydev構造体
118
-
119
- struct mydev_local {
120
-
121
- int irq;
122
-
123
- unsigned long mem_start;
124
-
125
- unsigned long mem_end;
126
-
127
- void __iomem *base_addr;
128
-
129
391
  };
130
392
 
131
393
 
132
394
 
133
- // 割込みHandler
134
-
135
- static irqreturn_t mydev_irq(int irq, void *lp)
136
-
137
- {
138
-
139
- printk("mydev interrupt\n");
140
-
141
- return IRQ_HANDLED;
142
-
143
- }
144
-
145
-
146
-
147
- // modprobe mydev.ko呼ばれModule
148
-
149
- static int mydev_probe(struct platform_device *pdev)
150
-
151
- {
152
-
153
- struct resource *r_irq; /* Interrupt resources */
154
-
155
- struct resource *r_mem; /* IO mem resources */
156
-
157
- struct device *dev = &pdev->dev;
158
-
159
- struct mydev_local *lp = NULL;
160
-
161
-
162
-
163
- int rc = 0;
164
-
165
-
166
-
167
- dev_info(dev, "Device Tree Probing\n");
168
-
169
-
170
-
171
- /* Get iospace for the device */
172
-
173
- r_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
174
-
175
- if (!r_mem) {
176
-
177
- dev_err(dev, "invalid address\n");
178
-
179
- return -ENODEV;
180
-
181
- }
182
-
183
-
184
-
185
- lp = (struct mydev_local *) kmalloc(sizeof(struct mydev_local), GFP_KERNEL); if (!lp) {
186
-
187
- dev_err(dev, "Cound not allocate mydev device\n");
188
-
189
- return -ENOMEM;
190
-
191
- }
192
-
193
-
194
-
195
- dev_set_drvdata(dev, lp);
196
-
197
-
198
-
199
- lp->mem_start = r_mem->start;
200
-
201
- lp->mem_end = r_mem->end;
202
-
203
-
204
-
205
- if (!request_mem_region(lp->mem_start,
206
-
207
- lp->mem_end - lp->mem_start + 1,
208
-
209
- DRIVER_NAME)) {
210
-
211
- dev_err(dev, "Couldn't lock memory region at %p\n",
212
-
213
- (void *)lp->mem_start);
214
-
215
- rc = -EBUSY;
216
-
217
- goto error1;
218
-
219
- }
220
-
221
-
222
-
223
- lp->base_addr = ioremap(lp->mem_start, lp->mem_end - lp->mem_start + 1);
224
-
225
- if (!lp->base_addr) {
226
-
227
- dev_err(dev, "mydev: Could not allocate iomem\n");
228
-
229
- rc = -EIO;
230
-
231
- goto error2;
232
-
233
- }
234
-
235
-
236
-
237
- /* Get IRQ for the device */
238
-
239
- r_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
240
-
241
- if (!r_irq) {
242
-
243
- dev_info(dev, "no IRQ found\n");
244
-
245
- dev_info(dev, "mydev at 0x%08x mapped to 0x%08x\n",
246
-
247
- (unsigned int __force)lp->mem_start,
248
-
249
- (unsigned int __force)lp->base_addr);
250
-
251
- return 0;
252
-
253
- }
254
-
255
- lp->irq = r_irq->start;
256
-
257
-
258
-
259
- rc = request_irq(lp->irq, &mydev_irq, 0, DRIVER_NAME, lp);
260
-
261
- if (rc) {
262
-
263
- dev_err(dev, "testmodule: Could not allocate interrupt %d.\n",
264
-
265
- lp->irq);
266
-
267
- goto error3;
268
-
269
- }
270
-
271
-
272
-
273
- dev_info(dev,"mydev at 0x%08x mapped to 0x%08x, irq=%d\n",
274
-
275
- (unsigned int __force)lp->mem_start,
276
-
277
- (unsigned int __force)lp->base_addr,
278
-
279
- lp->irq);
280
-
281
- return 0;
282
-
283
- error3:
284
-
285
- free_irq(lp->irq, lp);
286
-
287
- error2:
288
-
289
- release_mem_region(lp->mem_start, lp->mem_end - lp->mem_start + 1);
290
-
291
- error1:
292
-
293
- kfree(lp);
294
-
295
- dev_set_drvdata(dev, NULL);
296
-
297
- return rc;
298
-
299
- }
300
-
301
-
302
-
303
- これを実行させると、どのError表示も行われませんが、割り込みはかかりません。
304
-
305
-
306
-
307
- 割り込み要求はmydevのintr Portに10Hzの繰り返し波形、あるいはボタンによるLevel信号を印加することで、結果を確認しています。
308
-
309
- オシロスコープで波形は確認済です。
310
-
311
- 他のPin入出力は良好に動作しているので、ここが問題とは考えにくいです。
312
-
313
-
314
-
315
-
316
-
317
- Target側
395
+ この中に"20"は見当たません。
396
+
397
+ petalinuxの場合*.dtb Fileはimage.ubに繰り込まれているので、特段の操作は不要と明記されていたように思います。しかし念のため起動用sdcardにsystem.dtbを格納してあります。参照の状況を見るため、下記を実行してみたのですが
398
+
399
+ root@mydev:/sys/firmware/devicetree/base# cat compatible
400
+
401
+ 何も表示されませんでした。
402
+
403
+ 今回のケースではdevice-treeは参照されていなような感じがします。
404
+
405
+
406
+
407
+ "20"の出どころは謎です。
408
+
409
+ petalinuxの処理系がAssignしたのだから関知する必要はない、ということしたら助かのですが。
410
+
411
+
412
+
413
+
414
+
415
+ PLからの割り込みは61番以降という原則にこだわりがあったので
416
+
417
+ lp->irq=20 61
418
+
419
+ に強引に書き換えてみました。これはxparameters.hで指定されている数値です。
318
420
 
319
421
  cat /proc/interrupts
320
422
 
321
- の結果です。
322
-
323
-
324
-
325
- 18: 7179 1714 GIC 29 Edge twd
326
-
327
- 20: 0 0 GIC 38 Level mydev
328
-
329
- 21: 43 0 GIC 39 Level f8007100.adc
330
-
331
-
332
-
333
- 全く受かっていないようです。
334
-
335
- Level割り込みになっているようなので、終了処理をしないと次が受かりません。
336
-
337
- しかしゼロですからそれもないでしょう。
338
-
339
-
340
-
341
- lp->irq=20の理由が分かりません。
342
-
343
- Xynq-7000ではPL割り込みは61番以降なのです。
344
-
345
- これは明らかに範囲外です。
346
-
347
- しかしXilinxのCommunityで差し支えないような記述を見たこともあります。
348
-
349
- 関知する必要はないのでしょうか。
350
-
351
- =20の出どころを探ってみました。
352
-
353
- 以下はdevice-treeのpl.dtsi Fileの内容です:
354
-
355
-
356
-
357
- / {
358
-
359
- amba_pl: amba_pl {
360
-
361
- #address-cells = <1>;
362
-
363
- #size-cells = <1>;
364
-
365
- compatible = "simple-bus";
366
-
367
- ranges ;
368
-
369
- my_ip_0: my_ip@43c00000 {
370
-
371
- compatible = "xlnx,my-ip-189.2";
372
-
373
- interrupt-parent = <&intc>;
374
-
375
- interrupts = <0 29 4>;
376
-
377
- reg = <0x43c00000 0x10000>;
378
-
379
- xlnx,s00-axi-my-ip-addr-width = <0x4>;
380
-
381
- xlnx,s00-axi-my-ip-data-width = <0x20>;
382
-
383
- };
384
-
385
- };
386
-
387
- };
388
-
389
-
390
-
391
- この中に"20"は見当たりません。
392
-
393
- petalinuxの場合*.dtb Fileはimage.ubに繰り込まれているので、特段の操作は不要と明記されていたように思います。しかし念のため起動用sdcardにsystem.dtbを格納してあります。参照の状況を見るため、下記を実行してみたのですが
394
-
395
- root@mydev:/sys/firmware/devicetree/base# cat compatible
396
-
397
- 何も表示されませんでした。
398
-
399
- 今回のケースではdevice-treeは参照されていなような感じがします。
400
-
401
-
402
-
403
- "20"の出どころは謎です。
404
-
405
- petalinuxの処理系がAssignしたのだから関知する必要はない、ということでしたら助かるのですが。
406
-
407
-
408
-
409
-
410
-
411
- PLからの割り込みは61番以降という原則にこだわりがあったので
412
-
413
- lp->irq=20 → 61
414
-
415
- に強引に書き換えてみました。これはxparameters.hで指定されている数値です。
416
-
417
- cat /proc/interrupts
418
-
419
423
  の結果は
420
424
 
421
425