基于高通MSM8953平台android9.0的GPIO驱动开发

2.1、注册设备:

2.1.1、添加编译选项:

1)、修改kernel/msm-4.9/drivers/leds下Makefile文件:

        obj-$(CONFIG_LED_GPIO) += led_gpio.o

2)、修改kernel/msm-4.9/drivers/leds下Kconfig文件:

        config LED_GPIO

                tristate "led_gpio"

2.1.2、修改驱动配置文件,驱动编译进系统:

        修改kernel/msm-4.9/arch/arm64/configs下的msm8953_defconfig文件:

                CONFIG_LED_GPIO=y

2.2、注册驱动:

2.2.1、修改dts设备树文件:

1)、文件名:msm8953-mtp-dtsi。

2)、文件路径:kernel/msm-4.9/arch/arm64/boot/dts/qcom/msm8953-mtp-dtsi

3)、在&soc下添加:

&soc {

led_gpio {

compatible = "led_gpio";

         led_gpio,gpio97 = <&tlmm 97 0x1>;

};

};

2.2.2、添加驱动:

在kernel/msm-4.9/drivers/leds下添加led_gpio.c文件:

#include <linux/types.h>

#include <linux/pm.h>

#include <linux/gpio.h>

#include <linux/slab.h>

#include <linux/init.h>

#include <linux/platform_device.h>

#include <linux/fsl_devices.h>

#include <asm/setup.h>

#include <linux/of.h>

#include <linux/of_gpio.h>

#include <linux/stat.h>

#include <linux/module.h>

#include <linux/err.h>

#include <linux/spinlock.h>

#include <linux/err.h>

#include <linux/regulator/consumer.h>

int led_gpio97 = -1;

static struct class * led_gpios_class = NULL;

static struct device * led_gpio97_dev = NULL;

#define CTL_LED_ON "1"

#define CTL_LED_OFF "0"

//使用 cat命令时候调用此函数

static ssize_t led_gpio97_show(struct device *dev,struct device_attribute *attr, char *buf)

{

int gpio_state = gpio_get_value(led_gpio97);

sprintf(buf, "%d\n", gpio_state);

return strlen(buf);

}

//使用 echo 命令时候调用此函数

static ssize_t led_gpio97_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)

{

if(!strncmp(buf, CTL_LED_ON, strlen(CTL_LED_ON))) {

gpio_set_value(led_gpio97, 1);

} else if(!strncmp(buf, CTL_LED_OFF, strlen(CTL_LED_OFF))) {

gpio_set_value(led_gpio97, 0);

}

return count;

}

static struct device_attribute led_gpio97_dev_attr = {

.attr = {

.name = "state",

.mode = S_IRWXU|S_IRWXG|S_IRWXO,

},

.show = led_gpio97_show,

.store = led_gpio97_store,

};

static int led_gpio_probe(struct platform_device *pdev)

{

int ret = 0;

printk("enter led_gpio_probe \n");

//寻找设备树dts下的 "led_gpio,gpio97" 名称对应的GPIO口

led_gpio97 = of_get_named_gpio(pdev->dev.of_node, "led_gpio,gpio97", 0);

if (led_gpio97 < 0)

printk("led_gpio97 is not available \n");

//对应修改的dts的 label

ret = gpio_request(led_gpio97, "led_gpio");

if(0 != ret) {

printk("gpio request %d failed.", led_gpio97);

goto fail1;

}

gpio_direction_output(led_gpio97, 0); //设置gpio为输出

//创建led_gpios节点

led_gpios_class = class_create(THIS_MODULE, "led_gpios");

if(IS_ERR(led_gpios_class))

{

ret = PTR_ERR(led_gpios_class);

printk("Failed to create class.\n");

return ret;

}

//创建led_gpio97 的驱动设备

led_gpio0_dev=device_create(led_gpios_class, NULL, 0, NULL, "led_gpio7");

if (IS_ERR(led_gpio97_dev))

{

ret = PTR_ERR(test_gpios_class);

printk("Failed to create device(led_gpio97_dev)!\n");

return ret;

}

//根据 led_gpio0_dev_attr 配置,生成相应的文件

ret = device_create_file(led_gpio97_dev, & led_gpio97_dev_attr);

if(ret)

{

pr_err("%s: led_gpio97 creat sysfs failed\n",__func__);

return ret;

}

printk("enter led_gpio_probe, ok \n");

fail1:

return ret;

}

static int led_gpio_remove(struct platform_device *pdev)

{

device_destroy(led_gpios_class, 0);

class_destroy(led_gpios_class);

device_remove_file(led_gpio97_dev, & led_gpio97_dev_attr);

return 0;

}

static int led_gpio_suspend(struct platform_device *pdev,pm_message_t state)

{

return 0;

}

static int led_gpio_resume(struct platform_device *pdev)

{

return 0;

}

static struct of_device_id led_gpio_dt_match[] = {

{ .compatible = "led_gpio",},

{ },

};

  

MODULE_DEVICE_TABLE(of, led_gpio_dt_match);

//驱动的方法与函数对应

static struct platform_driver gpio_led_driver = {

.driver = {

.name = "led_gpio",

.owner = THIS_MODULE,

.of_match_table = of_match_ptr(led_gpio_dt_match),

},

.probe = led_gpio_probe,

.remove = led_gpio_remove,

.suspend = led_gpio_suspend,

.resume = led_gpio_resume,

};

  

static __init int gpio_led_init(void)

{

return platform_driver_register(&gpio_led_driver);

}

static void __exit gpio_led_exit(void)

{

platform_driver_unregister(&gpio_led_driver);

}

  

module_init(gpio_led_init);

module_exit(gpio_led_exit);

MODULE_LICENSE("GPL");

2.3、编译系统:

source build/envsetup.sh

lunch msm8953_64-userdebug

make -j8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实现归并排序算法

归并排序算法 &#xff08;1&#xff09;基本思想&#xff1a;归并&#xff08;Merge&#xff09;排序法是将两个&#xff08;或两个以上&#xff09;有序表合并成一个新的有序表&#xff0c;即把待排序序列分为若干个子序列&#xff0c;每个子序列是有序的。然后再把有序子序…

蛋白质序列FeatureDict转化为TensorDict

主要转化语句为 tensor_dict {k: tf.constant(v) for k, v in np_example.items() if k in features_metadata}。 增加了特征名称的选择&#xff0c;不同特征维度&#xff0c;特征数的判断等。 from typing import Dict, Tuple, Sequence, Union, Mapping, Optional #import …

postgresql_conf中常用配置项

在 PostgreSQL 的 postgresql.conf 配置文件中&#xff0c;有许多常用的配置项&#xff0c;这些配置项可以根据特定需求和性能优化进行调整。以下是一些常用的配置项及其作用&#xff1a; 1. shared_buffers 用于设置 PostgreSQL 实例使用的共享内存缓冲区大小。增加此值可以…

游戏被攻击该怎么办?游戏盾该如何使用,游戏盾如何防护攻击

随着Internet互联网络带宽的增加和多种DDOS黑客工具的不断发布&#xff0c;DDOS拒绝服务攻击的实施越来越容易&#xff0c;DDOS攻击事件正在成上升趋势。出于商业竞争、打击报复和网络敲诈等多种因素&#xff0c;导致很多商业站点、游戏服务器、聊天网络等网络服务商长期以来一…

Nacos 配置加密功能也太鸡肋了吧,有种更好的方式

大家好&#xff0c;我是风筝&#xff0c;微信搜「古时的风筝」&#xff0c;更多干货 当项目中用了 Nacos 做配置中心&#xff0c;是不是所有的配置都放到里面呢&#xff0c;大部分时候为了省事和统一&#xff0c;系统所有的配置都直接放在里面了&#xff0c;有时候&#xff0c…

什么是自动化测试框架?常用的自动化测试框架有哪些?

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”…

Redis相关知识

yum安装redis 使用以下命令&#xff1a;直接将redis安装到Linux服务器&#xff08;Xshell&#xff09;中 yum -y install redis 启动redis 使用以下命令&#xff0c;以后台运行方式启动redis redis-server /etc/redis.conf & 操作redis 使用以下命令启动redis客户端 redis-…

RFID在新能源工厂大放异彩

RFID在新能源工厂大放异彩 我国在十四五规划中提出了建设绿色低碳发展的目标&#xff0c;新能源产业成为了国家发展的重点领域之一&#xff0c;开始大力支持各种新能源厂商发展。各个厂商之间不仅比产品、比技术。也比生产想要降本增效&#xff0c;为了实现这一目标&#xff0…

MBD Introduction

介绍 MATLAB是MathWorks公司的商业数学软件&#xff0c;应用于科学计算、可视化以及交互式程序设计等高科技计算环境。Simulink是MATLAB中的一种可视化仿真工具。 Simulink是一个模块图环境&#xff0c;用于多域仿真以及基于模型的设计。它支持系统设计、仿真、自动代码生成以…

Spring基于xml半注解开发

目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解&#xff0c;主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置&#xff0c;使用Component注解替代<bean>标签中的id以及class属性&#xff0c;而对…

算法Day26 数位统计

数位统计 Description 给你一个整数n&#xff0c;统计并返回各位数字都不同的数字x的个数&#xff0c;其中0 ≤ x < 10^n。 Input 输入整数n 0≤n≤13 Output 输出整数个数 Sample 代码 import java.util.Scanner;public class Main {public static void main(String[] ar…

一个Oracle Application Container的实例

本例基本涵盖了Oracle Multitenant功能中application container的以下内容&#xff1a; 创建application container/root创建application PDB创建application SEED在application root中安装application在application root中升级application同步application 整个过程如下 创建…

Epoll服务器(ET工作模式)

目录 Epoll ET服务器设计思路Connection类TcpServer类 回调函数Accepter函数Recever函数Sender函数Excepter函数 事件处理套接字相关接口封装运行Epoll服务器 Epoll ET服务器 设计思路 在epoll ET服务器中&#xff0c;我们需要处理如下几种事件&#xff1a; 读事件&#xff…

基于javeweb实现的图书借阅管理系统

一、系统架构 前端&#xff1a;jsp | js | css | jquery 后端&#xff1a;servlet | jdbc 环境&#xff1a;jdk1.7 | mysql | tocmat 二、代码及数据库 三、功能介绍 01. 登录页 02. 首页 03. 图书管理 04. 读者管理 05. 图书分类管理 06. 图书借阅信息 07. 图书归还信…

CDN加速技术:降低服务器与网站成本的智慧选择

随着互联网的飞速发展&#xff0c;网站的访问量不断攀升&#xff0c;服务器负载压力逐渐增大。为了提高用户体验、降低服务器成本&#xff0c;并确保网站的高可用性&#xff0c;CDN&#xff08;内容分发网络&#xff09;加速技术应运而生。本文将从服务器与网站成本的角度分析C…

NLP项目实战01--电影评论分类

介绍&#xff1a; 欢迎来到本篇文章&#xff01;在这里&#xff0c;我们将探讨一个常见而重要的自然语言处理任务——文本分类。具体而言&#xff0c;我们将关注情感分析任务&#xff0c;即通过分析电影评论的情感来判断评论是正面的、负面的。 展示&#xff1a; 训练展示如下…

比较不同聚类方法的评估指标

归一化互信息&#xff08;NMI&#xff09; 要求&#xff1a;需要每个序列的真实标签&#xff08;分类信息&#xff09;

你在地铁上修过bug吗?

作为技术人员&#xff0c;有没有遇到下班路上收到老板电话&#xff0c;系统故障&#xff0c;然后地铁上掏出电脑&#xff0c;修bug的场景。自己负责的业务线上出现问题&#xff0c;负责人心里是很慌的&#xff0c;在这种心理状态下做事很容易二次犯错&#xff0c;造成更大的问题…

SAP UI5 walkthrough step10 Descriptor for Applications

在这一步&#xff0c;我们将会把所有的应用相关的描述性的文件独立放到manifest.json 新建一个manifest.json文件 webapp/manifest.json (New) {"_version": "1.58.0","sap.app": {"id": "ui5.walkthrough","i18n&q…

【已解决】No module named ‘sklearn‘

问题描述 No module named ‘sklearn‘ 解决办法 pip install scikit-learn 完结撒花 契约、包容、感恩、原则……这些成年人该有的基本精神&#xff0c;为什么我在他们身上找不到呢&#xff1f;