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

news/2024/11/23 2:08:24/

驱动开发

如何创建设备类属性节点


文章目录

  • 驱动开发
  • 前言
  • 一、代码添加
  • 二、编译
  • 三、 验证
  • 总结


前言

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


一、代码添加

在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节点重启。


http://www.ppmy.cn/news/371047.html

相关文章

PostgreSQL 15:新特性预告

PostgreSQL 15 版本正在开发中&#xff0c;不远的将来就会与大家见面&#xff0c;所以是时候看看未来的一些新功能吧&#xff01; 1.删除public 模式的创建权限 直到今天&#xff0c;使用 PostgreSQL 14&#xff0c;每个人都可以默认写入public 模式。使用 PostgreSQL 15&…

python中文编码与处理详解(个人认为比较全面详细了)

注意&#xff1a;本文只是针对 python 2&#xff0c;在 python 3 中&#xff0c;编码方式与处理技巧有些许变化&#xff0c;具体请参考&#xff1a; Python 2 与 Python 3 的差异对比&#xff1a; http://my.oschina.net/leejun2005/blog/173553 一、使用中文字符 在pytho…

python unicode编码转换中文_python unicode转中文及转换默认编码

原博文 2016-11-16 22:20 − 一、   在爬虫抓取网页信息时常需要将类似"\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8"转换为中文,实际上这是unicode的中文编码。可用以下方法转换: 1、 1 >>> s = u\u4eba\u751f\u82e6\u77ed... 相关推荐 2019-12…

Linux下安装JDK 及 OpenJDK的卸载

今日发现我Linux系统中安装的JDK是1.8的版本&#xff0c;但是在查询时候竟然是1.7的版本&#xff0c;因为我目前从事大数据方向的开发&#xff0c;这对于当前很多流行的技术不是很友好&#xff0c;故解决此问题&#xff0c;也让各位同仁不必再为此烦恼。 1、查询JDK版本 [roo…

centos7 搭建oracle11g rac

一、部分理论 RAC&#xff0c;全称real application clusters&#xff0c; 译为“实时应用集群”&#xff0c;是Oracle新版数据库中采用的一项新技术&#xff0c;是高可用性的一-种&#xff0c;也是Oracle 数据库支持网格计算环境的核心技术。 ●VIP -虚拟IP地址(Virtual IP)。…

移动端页面px布局适配方案(viewport)

通过 <meta name"viewport"> 给视口设置固定的宽度&#xff0c;浏览器对页面自动缩放来实现页面的适配效果 可配合移动端手机网页适配iPad与折叠屏设备实现多平台兼容 简单描述下实现原理&#xff1a; 浏览器的宽度与取决于 <meta name"viewport"…

java jdk 8u111_8u111-jdk-alpine在java开发中的NullPointerException错误解决方案

问题描述 在部署一个验证码服务的容器服务时遇到了一个空指针错误,错误代码为: java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) at s…

持续集成(Jenkins部署)

Jenkins通过脚本任务触发&#xff0c;实现代码的自动化分发。 系统环境&#xff1a; [rootqas-jenkins ~]# cat /etc/redhat-release CentOS release 6.8 (Final)Centos防火墙及SELINUX关闭 /etc/init.d/iptables stop chkconfig iptables off sed -i s/SELINUXenforcing/SELI…