zynq7000(ARM Coatex9)、petalinux2016.2です。
開発環境はHyper-V、CentOS-7です。
ドライバmydevを開発中ですが、
modprobe mydev.ko;
でErrorが発生します。
Error箇所を下記に示します:
static int mydev_probe(struct platform_device *pdev)
{
struct resource r_irq; / Interrupt resources */
struct resource r_mem; / IO mem resources */
struct device *dev = &pdev->dev;
struct mydev_local *lp = NULL;
int rc = 0; dev_info(dev, "Device Tree Probing\n"); /* Get iospace for the device */ r_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!r_mem) {
→ dev_err(dev, "invalid address\n");
return -ENODEV;
}
・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・
→のErrorです。
mydev_probeの関係個所は以下です:
static struct platform_driver mydev_driver = {
.driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE,
.of_match_table = mydev_of_match,
},
.probe = mydev_probe,
.remove = mydev_remove,
};
pdevがもたらすErrorであると思いますが、組み込みの際、先に呼ばれる
mydev_init()中で以下のようにして取得しています:
pdev取得に関しては
http://nbisco.hatenablog.com/entry/2017/01/08/150837
を参考にさせていただいています。
platform_device_register_simple
を利用する方法です。
static int __init mydev_init(void)
{
int ret;
printk("<1>Hello module world.\n"); static struct resource foomatic_resources[] = { { .start = BASEADDRESS, .end = REMAP_SIZE, .flags = IORESOURCE_MEM, .name = "io-memory" }, { .start = 20, ←妥当性を理解していない .end = 20, ←妥当性を理解していない .flags = IORESOURCE_IRQ, .name = "irq", } }; pdev = platform_device_register_simple(DRIVER_NAME, 0, foomatic_resources,0); if (pdev == NULL){ printk("Adding platform device pdev\"%x\" failed\n", pdev); kfree(pdev);
return -ENODEV; }
else{
printk("Adding platform device pdev"%x" successfull\n", pdev);
}
return platform_driver_register(&mydev_driver);
}
この段階で-ENODEV Errorが出ることはありません。
それからfoomatic_resourcesもNULL値ではありません。
しかし
pdev->dev
に正しい値が入っていないのだと思います。
このような処理に
platform_device_register_simple
が妥当であるかはわかりません。
Linux素人、最も定石的な手法、および具体的なCodeをお示しいただけると助かります。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー