新用户注册入口 老用户登录入口

[转载]和菜鸟一起学android4.0.3源码之vibrator振动器移植心得

文章作者:转载 更新时间:2024-01-17 14:30:45 阅读数量:81
文章标签:AndroidGPIO口高电平/低电平底层驱动控制振动时间
本文摘要:这篇文章详述了在Android系统中实现手机振动功能的过程。通过使用timed_gpio驱动,控制GPIO口的高低电平状态以驱动小直流电机实现振动效果。在底层,配置timed_gpio.c文件并添加platform_device到特定平台代码中,随后编译内核并在/sys/class/timed_output/vibrator/enable路径下操作以控制振动时长。在Android硬件抽象层(HAL)中,通过vibrator_exists、sendit等函数与底层驱动进行交互,实现在Java层调用vibrator_on和vibrator_off接口来便捷地开启或关闭振动器。整个移植过程展示了如何将底层硬件与Android系统有效结合,实现振动功能的定制与控制。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/eastmoon502136/article/details/7909688。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

       手机都是有震动的效果的,前天飞刀从手机里拆了一个振动器,然后让我下周把这个调一下,昨天来公司小试了一把,就搞定了。下面把过程讲一下吧。

       其实android中已经做好了底层的驱动,那便是timed_gpio,就是把定时功能和gpio的功能结合在一起了,振动就是一个小直流电机了,当gpio口是高电平的时候,电机就转动了,当gpio口为低电平的时候,电机就不转了,而time是控制转的时间,也就是gpio口处于高电平的时间。

       具体的代码就在/drivers/staging/android/timed_gpio.c

       在相关平台的platform.c中加入platform device就可以了。

 

static struct timed_gpio vibrator = 
{
.name = “vibrator”,
.gpio = 61, //对应自己平台的gpio号
.max_timeout = 100000,
.active_low = 0;
};
static  struct timed_gpio_platform_data timed_gpio_data = 
{
.num_gpios = 1,
.gpios = &vibrator,
};
static struct platform_device my_timed_gpio = 
{
.name = “timed-gpio”,
.id = -1,
.dev = 
{
.platform_data = &timed_gpio_data,
},
};


 

然后在make menuconfig中选上device下的staging下的android中的相关选项

 

       然后就可以跑一下内核来了,当内核跑起来后,就可以测试了。

       因为timed gpio驱动程序为每个设备在/sys/class/timed_output/目录下建立一个子

录,设备子目录的enable文件就是控制设备的时间的。因为在platform中名称为vibrator

所以,用以下命令可以测试:

echo 10000 > /sys/class/timed_output/vibrator/enable 


        然后可以看下振动器在转了,也可以用示波器或者万用表来验证

        接着可以

cat /sys/class/timed_output/vibrator/enable


        发现enable的值一直在变小,直到为0的时候停止了转动了。

OK底层驱动好了,那么android上层就好办多了,因为android上层几乎和平台关系不大,要改的东西很少很少。

        至于android硬件抽象层,在hardware/libhardware_legacy/include/hardware_legacy/ vibrator目录下。

 

#include <hardware_legacy/vibrator.h>
#include "qemu.h"
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#define THE_DEVICE "/sys/class/timed_output/vibrator/enable"
int vibrator_exists()
{
int fd;
#ifdef QEMU_HARDWARE
if (qemu_check()) {
return 1;
}
#endif
fd = open(THE_DEVICE, O_RDWR);
if(fd < 0)
return 0;
close(fd);
return 1;
}
static int sendit(int timeout_ms)
{
int nwr, ret, fd;
char value[20];
#ifdef QEMU_HARDWARE
if (qemu_check()) {
return qemu_control_command( "vibrator:%d", timeout_ms );
}
#endif
fd = open(THE_DEVICE, O_RDWR);
if(fd < 0)
return errno;
nwr = sprintf(value, "%d\n", timeout_ms);
ret = write(fd, value, nwr);
close(fd);
return (ret == nwr) ? 0 : -1;
}
int vibrator_on(int timeout_ms)
{
/* constant on, up to maximum allowed time */
return sendit(timeout_ms);
}
int vibrator_off()
{
return sendit(0);
}


 

        看到了吧

#define THE_DEVICE "/sys/class/timed_output/vibrator/enable"


        就是我们要操作的底层驱动的地方,只要这个和驱动配上,那么剩下的事情就木有了,直接搞定了。

        其实她也是往这里写数据,androidjava层就不关心她了。好了,然后可以在android启动后设置一个闹钟来测试下了,发现可以,至此androidvibrator移植成功。

        突然发现了,其实以前觉得很难得东西,很不好理解的东西,在过一段时间后再回过头去看的时候才会恍然大悟。学习是个漫长的过程,是一个知识慢慢积累的过程,一口气是吃不成胖子的。

本篇文章为转载内容。原文链接:https://blog.csdn.net/eastmoon502136/article/details/7909688。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
timed_gpio在Android系统底层驱动中,timed_gpio是一种结合了定时功能和GPIO(General Purpose Input/Output,通用输入/输出)功能的驱动模块。它主要用于控制外部设备,如手机中的振动器,通过设定gpio口的高电平持续时间来控制直流电机的工作时长,进而实现振动效果的精确控制。
GPIO(General Purpose Input/Output)GPIO是微处理器或单片机上的一个接口,可以被配置为输入或输出模式,用于与外部硬件设备进行通信。在本文的上下文中,GPIO用于控制振动器直流电机的工作状态,当GPIO口设置为高电平时,电机转动产生振动;低电平时,电机停止转动。
硬件抽象层(HAL, Hardware Abstraction Layer)在Android系统架构中,硬件抽象层位于内核驱动程序与Android框架层之间,它提供了一组标准接口供上层应用调用,以实现对特定硬件设备的访问和控制,而不关心具体的硬件实现细节。在文章所描述的振动器移植过程中,硬件抽象层定义了一系列函数,如vibrator_exists、sendit等,使得Java层能够便捷地操作底层驱动,实现振动器的开启、关闭以及控制振动时长的功能。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在深入理解了Android系统中振动器的实现原理及其与底层硬件交互的过程后,我们可以进一步关注近年来智能手机硬件创新和优化的趋势。随着用户对触觉反馈体验需求的增长,振动器技术也在不断进步。例如,2021年,苹果公司推出了搭载Taptic Engine的iPhone 13系列,通过复杂的线性马达设计实现了细腻、多样的震动反馈,极大地丰富了手机操作的触感体验。
与此同时,开源社区也在积极研发更智能、高效的振动解决方案。近期,一项名为“可编程微流体振动器”的研究成果引起了广泛关注,该技术利用微流体结构产生可调谐的振动效果,有望在未来智能手机、穿戴设备甚至虚拟现实领域带来颠覆性的触觉反馈体验。
此外,针对Android系统的开发者,Google持续更新其硬件接口规范,并鼓励制造商为Android设备提供更好的硬件支持。例如,在最新的Android版本中,提供了更为精细的API以控制振动强度、模式等特性,使得开发者能够根据应用场景创造出更为沉浸式和个性化的用户体验。
综上所述,手机振动器技术正处在快速迭代升级阶段,无论是硬件层面的创新还是软件层面对振动功能的深度挖掘,都在共同推动移动设备触觉反馈质量的提升,值得我们持续关注并深入研究。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
watch -n 5 'command' - 定时执行命令并刷新输出结果(每5秒一次)。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
HessianRPC在高负载下服务降级与熔断器模式保障用户体验 05-01 jQuery和TweenMax简单实用的水平手风琴特效 01-20 jquery选择国家下拉列表框插件 01-21 Sqoop在Hadoop集群中的数据传输机制及数据库迁移、收集与备份恢复应用实践 12-23 简约渔具批发牧渔企业类网站前端模板下载 11-09 基于bootstrap功能齐全的jQuery进度条插件 10-20 简约大气男性护肤产品HTML5网站模板 09-22 宽屏大气机械设备制造公司网站模板 08-13 演讲会门票销售网站模板下载 07-30 本次刷新还10个文章未展示,点击 更多查看。
经典响应式投资理财企业前端模板 06-26 基于Redis的键值对存储实现用户阅读状态跟踪与管理 06-24 Netty框架中CannotFindServerSelection异常:服务器地址配置错误与通道类型匹配详解 06-18 简洁设计公司响应式网站模板下载 05-06 绿色苗木草坪种植绿化类企业前端CMS模板下载 04-30 怎么在cmd开启mysql服务 04-15 保洁公司家庭保洁服务网站模板 03-26 SpringCloud微服务中分布式锁的死锁问题与状态一致性维护:避免循环依赖、公平锁及超时重试机制在Redisson中的实践运用 03-19 HBase性能测试与RegionServer配置、架构及数据模型调优实践:关注响应时间、并发处理能力与BlockCache优化 03-14 jquery控制radio触发事件 02-15 简约HTML5软件营销业务公司网站模板 02-09
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"