1

簡単なテストデバイスを作成しました。私の意図は、いくつかのカスタム sysfs ファイルを作成し、それらから設定を取得することです。最初に kobject を追加して、独自の sys_ops を試しました。それはうまくいきました。ただし、プラットフォーム デバイスを使用して同じことをしようとすると、読み書きできないファイルが作成されます。ここで何が悪いのか教えてもらえますか?

=============sysfs_file.c==================================

    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/platform_device.h>
    #include <linux/kobject.h>
    #include <linux/slab.h>

    struct kobject *myob;
    char *ops_buffer;
    struct attribute my_atr = {
    .name = "custom_attrbute",
    .mode = S_IWUGO|S_IRUGO,
    };
    int atp_probe(struct platform_device *dev)
    {
        printk("%s\n", __func__);
        myob = &dev->dev.kobj;
        ops_buffer = kzalloc(PAGE_SIZE, GFP_KERNEL);
        sysfs_create_file(myob, &my_atr);
        return 0;
    }
    int atp_remove(struct platform_device *dev)
    {
    printk("%s\n", __func__);
        sysfs_remove_file(myob, &my_atr);
        kfree(ops_buffer);
        return 0;
    }
    struct platform_device atp_dev = {
        .name = "Aerrow_Test_Platform",
        .id = 0,
    };
    struct platform_driver atp_drv = {
        .driver = {
        .name = "Aerrow_Test_Platform",
        .owner = THIS_MODULE,
        },
        .probe = atp_probe,
        .remove = atp_remove,
    };
    static int __init sfst_init(void)
    {
        int ret;
        printk("%s\n",__func__);
        ret = platform_device_register(&atp_dev);
        printk("%s: device add ret = %d\n", __func__, ret);
        ret = platform_driver_register(&atp_drv);
        printk("%s: driver register ret = %d\n", __func__, ret);
        return 0;
    }
    static void __exit sfst_exit(void)
    {   
        printk("%s", __func__);
        platform_driver_unregister(&atp_drv);
        platform_device_del(&atp_dev);
    }
    module_init(sfst_init);
    module_exit(sfst_exit);
    MODULE_LICENSE("GPL");

================================================== ================================== 出力は次のとおりです。

preetam@preetam-Veriton-Series:ko_training$ cd /sys/devices/platform/Aerrow_Test_Platform.0/
preetam@preetam-Veriton-Series:Aerrow_Test_Platform.0$ ls
custom_attrbute ドライバー modalias 電源サブシステム uevent
preetam@preetam-Veriton-Series:Aerrow_Test_Platform.0$ cat custom_attrbute
cat: custom_attrbute: 入出力エラー
preetam@preetam-Veriton-Series:Aerrow_Test_Platform.0$ echo "HELLO" > custom_attrbute
bash: echo: 書き込みエラー: 入出力エラー
preetam@preetam-Veriton-Series:Aerrow_Test_Platform.0$ cat custom_attrbute cat: custom_attrbute: 入出力エラー

プラットフォーム デバイスの ktype ops メソッドは追加の属性を処理できませんか、それともコードに問題がありますか? 独自の kobject を作成し、この属性をその下に配置すると、同じことが機能します。

4

1 に答える 1

2

「裸の属性には、属性の値を読み書きする手段が含まれていません。サブシステムは、特定のオブジェクトタイプの属性を追加および削除するために、独自の属性構造とラッパー関数を定義することをお勧めします。」- kernel.org/doc/Documentation/filesystems/sysfs.txt から。

この裸の属性構造の代わりに device_attribute を試すことができます。また、独自の show と store を定義して、sysfs エントリを読み書きします。

于 2013-02-20T11:59:56.797 に答える