android平台驱动开发(三)--设备类节点实现重启功能

驱动开发

如何创建设备类属性节点



前言

最简单的设备属性累节点创建以及实现底层的重启功能


一、代码添加

在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.sh

xxxx@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_reboot

taro:/ # 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节点重启。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨染天姬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值