Android-Gsensor屏幕旋转

转载 2012年03月26日 15:35:13
关于Rotate的实现: 

系统启动windowManger.java时,它会启动phoneWindowManager.java,该类有一个内部类myOrientationListener扩展自windowOrientationListener.java。 
windowOrientationListener.java是一个辅助类,当device的方向发生变化时,供windowManger.java调用,用来接收数据。 
windowOrientationListener.java 内部在sensorManger.java中进行了注册,它回监听G-sensor传来的数据,即x,y,z方向的加速度,收到数据后经过转换处理,若满足Roate条件则调用 
IwindowManager接口的实现类windowManagerService.java中的setRotation()方法实现转屏。 

SensorManager通过polling的方式从设备得到Sensor数据, Sensor数据的结构定义在sensor.h里, 
其中SensorManager只处理了 vector.v, vector.status, time三个域, 分发给已注册的对这些消息的监听者 

比如第一项 vector.v包含x,y,z三个方向的信息值,就是由 WindowOrientataionLister注册的, 
当 SensorManager获取到这三个值之后,会传递给 WindowOrientataionLister,后者代码位于: 
frameworkd/base/core/java/android/view/WindowOrientationListener.java 
WindowOrientataionLister接收到这三个值之后,会计算出设备对应的orientation,并且执行 onOrientationChanged函数进一步上传 

WindowOrientataionLister是个纯虚类,如果在APK里需要控制方向,可以重载一个实例, 
而Android的系统实例对应在 PhoneWindowManager.java里,名字为MyOrientationListener 
frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java 

如果需要旋转, MyOrientationListener则会调用以下代码进行窗口旋转: 
mWindowManager.setRotation(rotation, false, mFancyRotationAnimation); 

问题总结: 
1.将lis302 G-sensor driver从spi总线移植到lis331 i2c总线时遇到的一些问题: 
a).lis331用的中断管脚与lis302不同,通过硬件原理图可知lis331用的是GPN3.故需要在driver的probe中设置 writel((readl(S3C64XX_GPNCON) & ~(0xc0)) | (0x80), S3C64XX_GPNCON); 
b).通过硬件原理图可知lis331的时钟线和数据线用的是i2c chanel1。故需要在/kernel/arch/arm/mach-s3c6410/mach-ur6410.c文件中i2c chanel1即结构变量i2c_devs1[] __initdata中 
添加G-sensor的设备信息,以使driver成功加载。 
c).lis331 driver是中断驱动的,每次G-sensor搜集到新数据都会产生中断,driver要在中断中通过i2cbus将数据从G-sensor中取回。由于i2cbus的读写操作是可能休眠的,而中断中不允许调用可能休眠的函数,故通过linux提供的延迟机制work_queue来解决。 

问题b)的原理: 
i2c驱动包括总线驱动和设备驱动 

总线驱动只是提供对一条特定总线的读写机制,本身并不会去做通信。通过i2c总线驱动提供的函数,设备驱动可以忽略不同总线控制器的差异,不考虑其细节的与硬件设备通讯。 
一个总线驱动通常需要2个模块:struct i2c_adapter和struct i2c_algorithm 定义在include/linux/i2c.h中 
struct i2c_algorithm是为了i2c总线驱动和具体的i2c总线能够对话。很多i2c总线驱动定义和使用它们自己的algorithm.对于一些i2c总线驱动来说,很多algorithm已经写好了。 
drivers/i2c/buses中包含所有的i2c总线驱动,drivers/i2c/algos中包含了所有的algorithm. 

设备驱动通过总线驱动中的读写函数同具体的i2c设备通信,一个设备驱动用两个模块来描述:struct i2c_driver 和struct i2c_client. 
i2c_client代表着位于adapter总线上地址为address,使用driver来驱动的一个设备。它将总线驱动,设备驱动以及设备地址绑定到了一起。 

2.实现sensor.so与driver之间的ioctl时遇到的问题: 
sensor.so中pull数据时打开的文件是input子系统中逻辑input设备的表示层即event handler层中的evdev.c创建的,如果通过此文件描述符实现ioctl,则只能实现与event handler通信,无法实际控制 
Gsnsor driver. event handler层与物理设备的实际driver是通过input.c联系起来的,但input.c中没有实现将event handler层的ioctl传递到实际driver中。 
故采用另创建一个设备节点用来实现sensor.so与driver之间的ioctl.

Android屏幕自动旋转-Sensor属性

使用Eclipse+ADT插件开发Android程序的网友可以通过,ADT Plugin来很好的处理相关的layoutxml布局以及android开发环境的细节设置,今天我们让Android屏幕自动旋...
  • five824
  • five824
  • 2012年02月15日 15:37
  • 447

获取Android设备的方向 -- gsensor

http://www.cnblogs.com/bpasser/archive/2011/10/17/2214517.html 带有g-sensor的Android设备上可通过API获取到...

Android-Gsensor屏幕旋转

关于Rotate的实现:  系统启动windowManger.java时,它会启动phoneWindowManager.java,该类有一个内部类myOrientationListener扩展自...

利用GSensor让屏幕实现360度旋转

在 Android的 Settings->Sound and Display中有 Orientation这一设置项。当选中时,反转手机,手机屏幕会随之旋转,一般只可以旋转90度。 这一 sett...

Android屏幕旋转

  • 2017年08月01日 15:05
  • 399KB
  • 下载

利用GSensor让屏幕实现360度旋 ...

http://www.iteye.com/wiki/blog/812749 在Android的Settings->Sound andDisplay中有Orientation这一设置项。当选中时,反转...

Android屏幕旋转适配

  • 2016年04月24日 15:13
  • 22.97MB
  • 下载

Android开发--教你巧妙应对屏幕旋转

  • 2015年03月11日 15:39
  • 1.29MB
  • 下载

android屏幕旋转在framework中的修改。

在eoeandroid上写, 记录过来。   在framework中修改,可以随意修改屏幕0°指向的方向,其实也是framework层做的映射。 修改HAL层来修改屏幕0°指向的方向应该也是可以的,还...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-Gsensor屏幕旋转
举报原因:
原因补充:

(最多只允许输入30个字)