驱动开发
如何创建设备类属性节点
文章目录
- 驱动开发
- 前言
- 一、代码添加
- 二、编译
- 三、 验证
- 总结
前言
最简单的设备属性累节点创建以及实现底层的重启功能
一、代码添加
在AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\msm-kernel\drivers\misc\目录下新建test_reboot.c
#include <linux/module.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/list.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/ctype.h>
#include <linux/platform_device.h>
#include <linux/reboot.h>
#include <linux/kdev_t.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <asm/io.h>
#include <linux/ioport.h>const char * test_reboot_mode = "0";
static struct class *test_class = NULL;static ssize_t force_reboot_store(struct class *class, struct class_attribute *attr,const char *buf, size_t count)
{if (sysfs_streq(buf, "1")){printk(KERN_INFO "do restart\n");kernel_restart(NULL);test_reboot_mode=buf;}else if (sysfs_streq(buf, "0")){printk(KERN_INFO "do nothing\n");test_reboot_mode=buf;}return count;
}static ssize_t force_reboot_show(struct class *class, struct class_attribute *attr,char *buf)
{return sprintf(buf, "%s\n", test_reboot_mode);
}static CLASS_ATTR_RW(force_reboot);static int test_mode_probe(struct platform_device *pdev)
{printk(KERN_INFO "%s start...\n",__func__);return 0;
}static int test_mode_remove(struct platform_device *pdev)
{return 0;
}static struct platform_driver test_mode_driver = {.probe = test_mode_probe,.remove = test_mode_remove,.driver = {.name = "force-reboot",},
};static int test_driver_init(void)
{int ret;printk(KERN_INFO "%s,%d: Enter\n",__func__,__LINE__);test_class = class_create(THIS_MODULE,"test_class");ret = PTR_ERR(test_class);if (IS_ERR(test_class)){printk(KERN_ERR "could not create sysfs files\n");return ret;}ret = class_create_file(test_class, &class_attr_force_reboot);if (ret) {printk(KERN_ERR "could not create sysfs files\n");return ret;}return platform_driver_register(&test_mode_driver);
}static void test_driver_exit(void)
{printk(KERN_INFO "%s,%d: Enter\n",__func__,__LINE__);class_remove_file(test_class, &class_attr_force_reboot);class_destroy(test_class);platform_driver_unregister(&test_mode_driver);return;
}module_init(test_driver_init);
module_exit(test_driver_exit);MODULE_AUTHOR("zh@testsmart.com");
MODULE_DESCRIPTION("testSmart Hardware Verion driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:test-mode-driver");
修改misc目录下的Makefile
AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\msm-kernel\drivers\misc\Makefile
+obj-m += test_reboot.o
注:obj-m最好是以宏控的方式控制,当然也可以以obj-y的方式编译进内核,后续详细介绍
二、编译
以骁龙8 gen1 plus平台为例
在AU_LINUX_ANDROID_LA.VENDOR.1.0目录下执行:
xxxx@u99:~/AU_LINUX_ANDROID_LA.VENDOR.1.0$bash kernel_platform/qcom/proprietary/prebuilt_HY11/vendorsetup.shxxxx@u99:~/AU_LINUX_ANDROID_LA.VENDOR.1.0$cd kernel_platform/xxxx@u99:~/AU_LINUX_ANDROID_LA.VENDOR.1.0/kernel_platform$BUILD_CONFIG=./common/build.config.msm.waipio ./build/all-variants.sh "./build/build.sh"
如上编译完成后AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\out\msm-waipio-waipio-consolidate\dist\目录下会生成test_reboot.ko;push到设备中验证即可。
三、 验证
adb push AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\out\msm-waipio-waipio-consolidate\dist\test_reboot.ko /vendor_dlkm/lib/modules/
adb push AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\out\msm-waipio-waipio-consolidate\dist\test_reboot.ko /vendor/lib/modules/
taro:/ # insmod vendor/lib/modules/test_reboot.ko
taro:/ # taro:/ # find sys/ |grep force_reboot
sys/class/test_class/force_reboottaro:/ # cat sys/class/test_class/force_reboot
0
taro:/ # echo 1 > sys/class/test_class/force_reboot//echo 1 即可重启
总结
这里创建的设备节点在cat sys/class/test_class/目录下,且可以实现echo节点重启。