当前位置: 首页 > news >正文

android平台驱动开发(四)--系统属性节点控制GPIO

驱动开发

如何创建系统属性节点
直接在sys/目录下创建


文章目录

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


前言

最简单的系统属性节点控制GPIO


一、代码添加

在AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\msm-kernel\drivers\misc\目录下新建test.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>static ssize_t eth_en_store(struct kobject *dev,struct kobj_attribute  *attr,const char *buf, size_t len)
{unsigned long new;if (kstrtoul(buf, 0, &new)) {pr_err("%s kstrtoul err\n", __func__);return -EINVAL;}if (!!new == 1) {pr_err("%s set 1, g_rtase_resume\n", __func__);} else {pr_err("%s set 0, g_rtase_suspend\n", __func__);}return len;
}static ssize_t eth_en_show(struct kobject *dev,struct kobj_attribute  *attr, char *buf)
{return sprintf(buf, "%s\n", "sucess");
}static struct kobj_attribute eth_en_attribute_attr =__ATTR(eth_en, S_IWUSR|S_IRUGO, eth_en_show, eth_en_store);static struct attribute *sysfs_eth_en_attributes[] = {&eth_en_attribute_attr.attr,NULL
};static const struct attribute_group sysfs_eth_en_attr_group = {.attrs = sysfs_eth_en_attributes,
};static const struct of_device_id of_test_demo_match[] = {{ .compatible = "test-demo", },{},
};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   = "test",.owner  = THIS_MODULE,.of_match_table = of_match_ptr(of_test_demo_match),},
};static int test_driver_init(void)
{if ((k_obj = kobject_create_and_add("test_demo", NULL)) == NULL ) {pr_err("sysfs_demo sys node create error \n");}if(sysfs_create_group(k_obj, &sysfs_eth_en_attr_group) ) {pr_err("sysfs_create_group failed\n");}return platform_driver_register(&test_demo_driver);
}static void test_driver_exit(void)
{printk(KERN_INFO "%s,%d: Enter\n",__func__,__LINE__);if (k_obj) {sysfs_remove_group(k_obj, &sysfs_eth_en_attr_group);kobject_put(k_obj);}platform_driver_unregister(&test_demo_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\目录下会生成hello_world.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 即可重启

总结

关于kobject相关的函数后续继续更新,这个是linux的核心函数

相关文章:

  • 【数据库】-4 mysql权限语句
  • Disruptor—核心源码实现分析(三)
  • 全球地表水与地下水盐度数据(1980-2019)含45,103个地表水站点与208,550个地下水站点
  • RAG综述:大模型检索增强生成全解析
  • C++数据结构 : 二叉搜索树
  • 【Elasticsearch】使用脚本删除索引中的某个字段
  • SLOT:测试时样本专属语言模型优化,让大模型推理更精准!
  • 中车靶场,网络安全暑期实训营
  • FOFA网络空间测绘初学者指南:像探险家一样探索数字世界
  • 什么是数据驱动?以及我们应如何理解数据驱动?
  • ICMP与TCP端口:网络层与传输层解析
  • Flutter 实现6个验收码输入框
  • 实现单例模式的6种方法(Python)
  • 防爆手机VS普通手机,区别在哪里?
  • 获取oracle的HQL日志,采取参数日志,拼装SQL语句
  • Oracle初识
  • Java大师成长计划之第32天:使用Kubernetes进行Java应用编排与管理
  • C++学习-入门到精通【9】面向对象编程:继承
  • 低空经济数据湖架构设计方案
  • 贝壳后端golang面经
  • 网站运营团队/企业网站seo推广
  • 西安网站排名哪家公司好/如何做网络营销?
  • wordpress复制按钮插件/seo效果分析
  • 做网站的职业叫什么/湖南关键词优化品牌价格
  • 老太太做受网站/百度网址大全首页链接
  • 网站logo做黑页/小程序定制开发公司