<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cyher.NET &#187; android</title>
	<atom:link href="http://cyher.net/tag/android/feed" rel="self" type="application/rss+xml" />
	<link>http://cyher.net</link>
	<description>Technology, Life, Code, OpenSource, *nix, Mac and iphone, Mobile development</description>
	<lastBuildDate>Wed, 16 Mar 2011 01:25:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Android 手机电源管理实例 &#8211; milestone</title>
		<link>http://cyher.net/gnulinux/android/android-phone-powermanagement</link>
		<comments>http://cyher.net/gnulinux/android/android-phone-powermanagement#comments</comments>
		<pubDate>Sun, 25 Jul 2010 08:07:59 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[milestone]]></category>
		<category><![CDATA[power management]]></category>

		<guid isPermaLink="false">http://cyher.net/?p=637064</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[
<table id="wp-table-reloaded-id-1-no-1" class="wp-table-reloaded wp-table-reloaded-id-1">
<thead>
	<tr class="row-1 odd">
		<th class="column-1"></th><th class="column-2">MOTO Milestone (omap)</th><th class="column-3">HTC tattoo (msm7225)</th><th class="column-4">HTC Magic (msm7201A)</th><th class="column-5">某手机(保密)(msm7227)</th>
	</tr>
</thead>
<tbody>
	<tr class="row-2 even">
		<td class="column-1">开机过程</td><td class="column-2">200ma-1000ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5">200ma-500ma</td>
	</tr>
	<tr class="row-3 odd">
		<td class="column-1">HSDPA 联网</td><td class="column-2">700ma</td><td class="column-3"></td><td class="column-4">500ma</td><td class="column-5"></td>
	</tr>
	<tr class="row-4 even">
		<td class="column-1">idle, 屏幕最暗, 黑色背景,键灯关</td><td class="column-2">44ma</td><td class="column-3">13ma</td><td class="column-4">33ma</td><td class="column-5">60ma</td>
	</tr>
	<tr class="row-5 odd">
		<td class="column-1">idle, 屏幕中等, 黑色背景,键灯关</td><td class="column-2">69ma</td><td class="column-3">64ma</td><td class="column-4">73ma</td><td class="column-5">88ma</td>
	</tr>
	<tr class="row-6 even">
		<td class="column-1">idle, 屏幕最亮, 黑色背景,键灯关</td><td class="column-2">104ma</td><td class="column-3">97ma</td><td class="column-4">135ma</td><td class="column-5">120ma</td>
	</tr>
	<tr class="row-7 odd">
		<td class="column-1">idle, 屏幕最暗, 动态桌面,键灯关</td><td class="column-2">330ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-8 even">
		<td class="column-1">idle, 屏幕中等, 动态桌面,键灯关</td><td class="column-2">350ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-9 odd">
		<td class="column-1">idle, 屏幕最亮, 动态桌面,键灯关</td><td class="column-2">450ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-10 even">
		<td class="column-1">idle, 屏幕最暗, 白背景,键灯关</td><td class="column-2">51ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-11 odd">
		<td class="column-1">idle, 屏幕中等, 白背景,键灯关</td><td class="column-2">92ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-12 even">
		<td class="column-1">idle, 屏幕最亮, 白背景,键灯关</td><td class="column-2">167ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-13 odd">
		<td class="column-1">照相机预览</td><td class="column-2">400ma-500ma(1G)<br />
325ma-350ma(550M)</td><td class="column-3">210ma-260ma</td><td class="column-4">295ma-334ma</td><td class="column-5"></td>
	</tr>
	<tr class="row-14 even">
		<td class="column-1">录制音频(开屏)</td><td class="column-2">107ma-112ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-15 odd">
		<td class="column-1">录制音频(关屏)</td><td class="column-2">43ma-59ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-16 even">
		<td class="column-1">录制视频</td><td class="column-2">500ma-700ma(1G)<br />
427ma-558ma(550M)</td><td class="column-3">260ma-360ma</td><td class="column-4">360ma-390ma</td><td class="column-5"></td>
	</tr>
	<tr class="row-17 odd">
		<td class="column-1">google maps(gps开)</td><td class="column-2">540ma-750ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-18 even">
		<td class="column-1">浏览网页(HSDPA)(有数据链接时)</td><td class="column-2">400ma-600ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-19 odd">
		<td class="column-1">浏览网页(EDGE)(有数据链接时)</td><td class="column-2">200ma-500ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-20 even">
		<td class="column-1">开屏,放mp3,耳机</td><td class="column-2">90ma-120ma</td><td class="column-3"></td><td class="column-4">168ma-220ma</td><td class="column-5">285ma</td>
	</tr>
	<tr class="row-21 odd">
		<td class="column-1">关屏, 放mp3,耳机</td><td class="column-2">30ma-50ma</td><td class="column-3"></td><td class="column-4">93ma-112ma</td><td class="column-5">210ma</td>
	</tr>
	<tr class="row-22 even">
		<td class="column-1">开屏, 放mp4,耳机(放自己拍摄的)</td><td class="column-2">250ma-300ma</td><td class="column-3"></td><td class="column-4">300ma-327ma</td><td class="column-5"></td>
	</tr>
	<tr class="row-23 odd">
		<td class="column-1">开启g-sensro和gps</td><td class="column-2">320ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-24 even">
		<td class="column-1">wifi扫描时</td><td class="column-2">150ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-25 odd">
		<td class="column-1">开led闪光灯(长亮)</td><td class="column-2">50ma(单独计算)</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-26 even">
		<td class="column-1">虚拟按键led</td><td class="column-2">20ma(单独计算)</td><td class="column-3">14ma</td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-27 odd">
		<td class="column-1">GSM通话(开接近)</td><td class="column-2">350ma-450ma</td><td class="column-3"></td><td class="column-4"></td><td class="column-5"></td>
	</tr>
	<tr class="row-28 even">
		<td class="column-1">suspend(关屏进入休眠)</td><td class="column-2">2ma</td><td class="column-3">1ma</td><td class="column-4">1ma</td><td class="column-5">2ma</td>
	</tr>
</tbody>
</table>

]]></content:encoded>
			<wfw:commentRss>http://cyher.net/gnulinux/android/android-phone-powermanagement/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>android驱动之虚拟按键</title>
		<link>http://cyher.net/gnulinux/android/virualkey</link>
		<comments>http://cyher.net/gnulinux/android/virualkey#comments</comments>
		<pubDate>Mon, 22 Mar 2010 03:09:57 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[driver]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[virualkey]]></category>

		<guid isPermaLink="false">http://cyher.net/?p=637050</guid>
		<description><![CDATA[1    背景 nexus one工业设计简洁，类似于iphone只有一个按键的设计，只有中间的一个轨迹球。但是android标准键盘是有 HOME，MENU，BACK，SEARCH等，但是同时要保持工业设计。nexus one是这样解决问题的，显示屏是800X480，但是在电容触摸屏是8xx*480的就是比800要大的地方就变成了虚拟按键，模拟了android标准按键。 2    方案 要实现，虚拟按键，在android里面是靠两层协助实现，底层要把虚拟按键在比显示屏多出的地方规定好虚拟按键的位置大小以及键值等，给上层一文件接口。上层java层启动一个服务来读取这一区域的按键响应，这样就是大体的架构。具体实现如下： 2.1    底层虚拟按键功能实现方案 简而言之，就是在内核中把虚拟按键的所有信息给上层给出，用什么方式？就是用sys文件系统的方式，sys文件系统的路径是约定好的所以代码如下实现。给出信息的协议格式是一段连续的字符串，每个按键有六项分别用冒号分割，按键按键之间也是用冒号分割，六项按顺序分别是： 键类型:键值:按键区域中心x坐标:按键区域中心y坐标:按键区域宽:按键区域高 arch/arm/mach-msm/board-mahimahi.c static ssize_t mahimahi_virtual_keys_show&#40;struct kobject *kobj, struct kobj_attribute *attr, char *buf&#41; &#123; if &#40;system_rev &#38;gt; 2&#41; &#123; /* center: x: back: 55, menu: 172, home: 298, search 412, y: 835 */ return sprintf&#40;buf, __stringify&#40;EV_KEY&#41; &#34;:&#34; __stringify&#40;KEY_BACK&#41; &#34;:55:835:90:55&#34; &#34;:&#34; __stringify&#40;EV_KEY&#41; &#34;:&#34; __stringify&#40;KEY_MENU&#41; &#34;:172:835:125:55&#34; [...]]]></description>
			<content:encoded><![CDATA[<h1>1    背景</h1>
<p>nexus one工业设计简洁，类似于iphone只有一个按键的设计，只有中间的一个轨迹球。但是android标准键盘是有 HOME，MENU，BACK，SEARCH等，但是同时要保持工业设计。nexus one是这样解决问题的，显示屏是800X480，但是在电容触摸屏是8xx*480的就是比800要大的地方就变成了虚拟按键，模拟了android标准按键。</p>
<h1>2    方案</h1>
<p>要实现，虚拟按键，在android里面是靠两层协助实现，底层要把虚拟按键在比显示屏多出的地方规定好虚拟按键的位置大小以及键值等，给上层一文件接口。上层java层启动一个服务来读取这一区域的按键响应，这样就是大体的架构。具体实现如下：</p>
<h3>2.1    底层虚拟按键功能实现方案</h3>
<p>简而言之，就是在内核中把虚拟按键的所有信息给上层给出，用什么方式？就是用sys文件系统的方式，sys文件系统的路径是约定好的所以代码如下实现。给出信息的协议格式是一段连续的字符串，每个按键有六项分别用冒号分割，按键按键之间也是用冒号分割，六项按顺序分别是：</p>
<p><code>键类型:键值:按键区域中心x坐标:按键区域中心y坐标:按键区域宽:按键区域高</code></p>
<p>arch/arm/mach-msm/board-mahimahi.c</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> ssize_t mahimahi_virtual_keys_show<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> kobject <span style="color: #339933;">*</span>kobj<span style="color: #339933;">,</span>
			       <span style="color: #993333;">struct</span> kobj_attribute <span style="color: #339933;">*</span>attr<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>buf<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>system_rev <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #808080; font-style: italic;">/* center: x: back: 55, menu: 172, home: 298, search 412, y: 835 */</span>
		<span style="color: #b1b100;">return</span> sprintf<span style="color: #009900;">&#40;</span>buf<span style="color: #339933;">,</span>
			__stringify<span style="color: #009900;">&#40;</span>EV_KEY<span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>KEY_BACK<span style="color: #009900;">&#41;</span>  <span style="color: #ff0000;">&quot;:55:835:90:55&quot;</span>
		   <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>EV_KEY<span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>KEY_MENU<span style="color: #009900;">&#41;</span>   <span style="color: #ff0000;">&quot;:172:835:125:55&quot;</span>
		   <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>EV_KEY<span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>KEY_HOME<span style="color: #009900;">&#41;</span>   <span style="color: #ff0000;">&quot;:298:835:115:55&quot;</span>
		   <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>EV_KEY<span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>KEY_SEARCH<span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;:412:835:95:55&quot;</span>
		   <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #808080; font-style: italic;">/* center: x: home: 55, menu: 185, back: 305, search 425, y: 835 */</span>
		<span style="color: #b1b100;">return</span> sprintf<span style="color: #009900;">&#40;</span>buf<span style="color: #339933;">,</span>
			__stringify<span style="color: #009900;">&#40;</span>EV_KEY<span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>KEY_HOME<span style="color: #009900;">&#41;</span>  <span style="color: #ff0000;">&quot;:55:835:70:55&quot;</span>
		   <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>EV_KEY<span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>KEY_MENU<span style="color: #009900;">&#41;</span>   <span style="color: #ff0000;">&quot;:185:835:100:55&quot;</span>
		   <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>EV_KEY<span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>KEY_BACK<span style="color: #009900;">&#41;</span>   <span style="color: #ff0000;">&quot;:305:835:70:55&quot;</span>
		   <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>EV_KEY<span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;:&quot;</span> __stringify<span style="color: #009900;">&#40;</span>KEY_SEARCH<span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;:425:835:70:55&quot;</span>
		   <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">struct</span> kobj_attribute mahimahi_virtual_keys_attr <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	.<span style="color: #202020;">attr</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		.<span style="color: #202020;">name</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;virtualkeys.synaptics-rmi-touchscreen&quot;</span><span style="color: #339933;">,</span>
		.<span style="color: #202020;">mode</span> <span style="color: #339933;">=</span> S_IRUGO<span style="color: #339933;">,</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	.<span style="color: #202020;">show</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>mahimahi_virtual_keys_show<span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">struct</span> attribute <span style="color: #339933;">*</span>mahimahi_properties_attrs<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>mahimahi_virtual_keys_attr.<span style="color: #202020;">attr</span><span style="color: #339933;">,</span>
	NULL
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">struct</span> attribute_group mahimahi_properties_attr_group <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	.<span style="color: #202020;">attrs</span> <span style="color: #339933;">=</span> mahimahi_properties_attrs<span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> kobject <span style="color: #339933;">*</span>properties_kobj<span style="color: #339933;">;</span>
&nbsp;
properties_kobj <span style="color: #339933;">=</span> kobject_create_and_add<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;board_properties&quot;</span><span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>properties_kobj<span style="color: #009900;">&#41;</span>
	ret <span style="color: #339933;">=</span> sysfs_create_group<span style="color: #009900;">&#40;</span>properties_kobj<span style="color: #339933;">,</span>
					 <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>mahimahi_properties_attr_group<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>properties_kobj <span style="color: #339933;">||</span> ret<span style="color: #009900;">&#41;</span>
	pr_err<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;failed to create board_properties<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>2.2    JAVA上层方案</h3>
<p>Java层主要是读取按键信息，然后经过一定的算法，来识别虚拟按键，基本不需要修改，但最好还是熟悉java层的架构这样出问题的时候利于定位<br />
frameworks/base/services/java/com/<a href="http://cyher.net/tag/android" class="st_tag internal_tag" rel="tag" title="标签 android 下的日志">android</a>/server/KeyInputQueue.java</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/*这是虚拟按键的类里面包括了VirtualKey所用到的成员变量和按键定位方法*/</span>
    <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">class</span> VirtualKey <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">int</span> scancode<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> centerx<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> centery<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> width<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> height<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">int</span> hitLeft<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> hitTop<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> hitRight<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> hitBottom<span style="color: #339933;">;</span>
&nbsp;
        InputDevice lastDevice<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> lastKeycode<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">boolean</span> checkHit<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> x, <span style="color: #000066; font-weight: bold;">int</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;=</span> hitLeft <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> x <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span> hitRight                     <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> y <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;=</span> hitTop <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> y <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span> hitBottom<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">void</span> computeHitRect<span style="color: #009900;">&#40;</span>InputDevice dev, <span style="color: #000066; font-weight: bold;">int</span> dw, <span style="color: #000066; font-weight: bold;">int</span> dh<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>dev <span style="color: #339933;">==</span> lastDevice<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">return</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>DEBUG_VIRTUAL_KEYS<span style="color: #009900;">&#41;</span> Log.<span style="color: #006633;">v</span><span style="color: #009900;">&#40;</span>TAG, <span style="color: #0000ff;">&quot;computeHitRect for &quot;</span> <span style="color: #339933;">+</span> scancode
                    <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;: dev=&quot;</span> <span style="color: #339933;">+</span> dev <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; absX=&quot;</span> <span style="color: #339933;">+</span> dev.<span style="color: #006633;">absX</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; absY=&quot;</span> <span style="color: #339933;">+</span> dev.<span style="color: #006633;">absY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            lastDevice <span style="color: #339933;">=</span> dev<span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">int</span> minx <span style="color: #339933;">=</span> dev.<span style="color: #006633;">absX</span>.<span style="color: #006633;">minValue</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">int</span> maxx <span style="color: #339933;">=</span> dev.<span style="color: #006633;">absX</span>.<span style="color: #006633;">maxValue</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">int</span> halfw <span style="color: #339933;">=</span> width<span style="color: #339933;">/</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">int</span> left <span style="color: #339933;">=</span> centerx <span style="color: #339933;">-</span> halfw<span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">int</span> right <span style="color: #339933;">=</span> centerx <span style="color: #339933;">+</span> halfw<span style="color: #339933;">;</span>
            hitLeft <span style="color: #339933;">=</span> minx <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>left<span style="color: #339933;">*</span>maxx<span style="color: #339933;">-</span>minx<span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span>dw<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            hitRight <span style="color: #339933;">=</span> minx <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>right<span style="color: #339933;">*</span>maxx<span style="color: #339933;">-</span>minx<span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span>dw<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">int</span> miny <span style="color: #339933;">=</span> dev.<span style="color: #006633;">absY</span>.<span style="color: #006633;">minValue</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">int</span> maxy <span style="color: #339933;">=</span> dev.<span style="color: #006633;">absY</span>.<span style="color: #006633;">maxValue</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">int</span> halfh <span style="color: #339933;">=</span> height<span style="color: #339933;">/</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">int</span> top <span style="color: #339933;">=</span> centery <span style="color: #339933;">-</span> halfh<span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">int</span> bottom <span style="color: #339933;">=</span> centery <span style="color: #339933;">+</span> halfh<span style="color: #339933;">;</span>
            hitTop <span style="color: #339933;">=</span> miny <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>top<span style="color: #339933;">*</span>maxy<span style="color: #339933;">-</span>miny<span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span>dh<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            hitBottom <span style="color: #339933;">=</span> miny <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>bottom<span style="color: #339933;">*</span>maxy<span style="color: #339933;">-</span>miny<span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span>dh<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">/*以下就是与底层接口的函数，如果这个函数和底层接口正常，基本上虚拟按键就能够ok*/</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> readVirtualKeys<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> deviceName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">FileInputStream</span> fis <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileInputStream</span><span style="color: #009900;">&#40;</span>
                    <span style="color: #0000ff;">&quot;/sys/board_properties/virtualkeys.&quot;</span> <span style="color: #339933;">+</span> deviceName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/*这里就是读取kernel给出信息的地方，也就是地层与上层接口的地方，所以整个实现的重点就是这里*/</span>
            <span style="color: #003399;">InputStreamReader</span> isr <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span>fis<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">BufferedReader</span> br <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span>isr, <span style="color: #cc66cc;">2048</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">String</span> str <span style="color: #339933;">=</span> br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>str <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> it <span style="color: #339933;">=</span> str.<span style="color: #006633;">split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>DEBUG_VIRTUAL_KEYS<span style="color: #009900;">&#41;</span> Log.<span style="color: #006633;">v</span><span style="color: #009900;">&#40;</span>TAG, <span style="color: #0000ff;">&quot;***** VIRTUAL KEYS: &quot;</span> <span style="color: #339933;">+</span> it<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> N <span style="color: #339933;">=</span> it.<span style="color: #006633;">length</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span>N<span style="color: #339933;">;</span> i<span style="color: #339933;">+=</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #0000ff;">&quot;0x01&quot;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>it<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        Log.<span style="color: #006633;">w</span><span style="color: #009900;">&#40;</span>TAG, <span style="color: #0000ff;">&quot;Unknown virtual key type at elem #&quot;</span> <span style="color: #339933;">+</span> i
                                <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;: &quot;</span> <span style="color: #339933;">+</span> it<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                    <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
                        VirtualKey sb <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> VirtualKey<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        sb.<span style="color: #006633;">scancode</span> <span style="color: #339933;">=</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>it<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        sb.<span style="color: #006633;">centerx</span> <span style="color: #339933;">=</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>it<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        sb.<span style="color: #006633;">centery</span> <span style="color: #339933;">=</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>it<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        sb.<span style="color: #006633;">width</span> <span style="color: #339933;">=</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>it<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        sb.<span style="color: #006633;">height</span> <span style="color: #339933;">=</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>it<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">+</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>DEBUG_VIRTUAL_KEYS<span style="color: #009900;">&#41;</span> Log.<span style="color: #006633;">v</span><span style="color: #009900;">&#40;</span>TAG, <span style="color: #0000ff;">&quot;Virtual key &quot;</span>
                                <span style="color: #339933;">+</span> sb.<span style="color: #006633;">scancode</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;: center=&quot;</span> <span style="color: #339933;">+</span> sb.<span style="color: #006633;">centerx</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;,&quot;</span>
                                <span style="color: #339933;">+</span> sb.<span style="color: #006633;">centery</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; size=&quot;</span> <span style="color: #339933;">+</span> sb.<span style="color: #006633;">width</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;x&quot;</span>
                                <span style="color: #339933;">+</span> sb.<span style="color: #006633;">height</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        mVirtualKeys.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>sb<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">NumberFormatException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        Log.<span style="color: #006633;">w</span><span style="color: #009900;">&#40;</span>TAG, <span style="color: #0000ff;">&quot;Bad number at region &quot;</span> <span style="color: #339933;">+</span> i <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; in: &quot;</span>
                                <span style="color: #339933;">+</span> str, e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
            br.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">FileNotFoundException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            Log.<span style="color: #006633;">i</span><span style="color: #009900;">&#40;</span>TAG, <span style="color: #0000ff;">&quot;No virtual keys found&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            Log.<span style="color: #006633;">w</span><span style="color: #009900;">&#40;</span>TAG, <span style="color: #0000ff;">&quot;Error reading virtual keys&quot;</span>, e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<h3>2.3    总结</h3>
<p>方案基本上就是这样，主要是调试工作可能需要一段时间，还有如果要做虚拟按键，还需要硬件的支持（超过显示区域的触摸屏区域）。本代码基于android 2.1请根据实际情况修改</p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/gnulinux/android/virualkey/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>android驱动之jogball</title>
		<link>http://cyher.net/gnulinux/android/android-driver-jogball</link>
		<comments>http://cyher.net/gnulinux/android/android-driver-jogball#comments</comments>
		<pubDate>Tue, 16 Mar 2010 09:18:16 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[driver]]></category>
		<category><![CDATA[input]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://cyher.net/?p=637024</guid>
		<description><![CDATA[1 简介 JogBall是首款Android手机-HTC Dream上附带的类似轨迹球Trackball的滑轮，通过Jogball用户可以轻松的实现网页的翻页、地图翻 转等操作，这种在手机上增加轨迹球的方式可以取消传统的4维导航键，Jogball并非HTC公司的首例，早在HTC 3300(Dopod P800)就 实现了这项功能，轨迹球操作方式的加入可以实现像电脑上鼠标一样轻松操控。现在jogball基本上算是android手机的标准配置了。 2 框图&#38;架构 2.1 gpio_event子系统 Jogball驱动是由linux代码中的gpio_event子系统实现的。 由以下文件组成： driver/input/misc/gpio_event.c driver/input/misc/gpio_input.c driver/input/misc/gpio_output.c driver/input/misc/gpio_matrix.c driver/input/misc/gpio_axis.c gpio_event子系统是一个关于gpio的输入设备的通用代码，里面可以包含一般嵌入式设备中需要的键盘阵列和坐标有关的输入等。 2.2 Jogball架构 Jogball是归类于gpio_axis.c中的，是一个相对坐标系，判断电信号的高低来对坐标加或者减一定数值。具体细节在gpio_axis.c中 gpio_axis.c中的结构体初始化是在xxx-borad.c中的，基本架构就是这样，细节在下文叙述。 3 硬件描述 3.1 Jogball机械特性 Jogball是一个基于滚球滚动的输入设备，所以它机械特性也是比较重要，知道他的机械特性，便于我们理解驱动。 Jogball和以前的滚球鼠标比较相似，依靠滚轮的滚动来带动四周的圆柱体旋转。每个圆柱体端头都有一个磁铁，这个磁体铁从横断 面来看就是由N极的扇形和S极的扇形来组成一个圆周。这样当磁铁旋转的时候，N极和S极切换，使霍尔IC产生高低电平。 注意：在滚球旋转时，两个相对方向只有一个方向可以转动，这是为了减化软件编写的一个机械特性。 3.2 Jogball的电气特性 Jogball最重要的电特性就是这个霍尔IC， 霍尔元件的工作原理：所谓霍尔效应，是指磁场作用于载流金属导体、半导体中的载流子时，产生横向电位差的物理现 象。金属的霍尔效应是1879年被美 国物理学家霍尔发现的。当电流通过金属箔片时，若在垂直于电流的方向施加磁场，则金属箔片 两侧面会出现横向电位差。半导体中的霍尔效应比金属箔片中更为明 显，而铁磁金属在居里温度以下将呈现极强的霍尔效应。 所以jogball是旋转磁轴引起磁场的变幻，来产生高低电压的。从而根据机械特性就不难理解jogball的数字输入过程。 3.3 Jogball的原理图 其实jogball只是机械结构,原理图是hall ic的,有兴趣的人在这里下载 4 数据结构 struct hero_axis_info &#123; struct gpio_event_axis_info info; /*gpio_event_axis结构的信息*/ uint16_t [...]]]></description>
			<content:encoded><![CDATA[<h1><span style="color: #000000;">1 简介</span></h1>
<p>JogBall是首款Android手机-HTC Dream上附带的类似轨迹球Trackball的滑轮，通过Jogball用户可以轻松的实现网页的翻页、地图翻</p>
<p>转等操作，这种在手机上增加轨迹球的方式可以取消传统的4维导航键，Jogball并非HTC公司的首例，早在HTC 3300(Dopod P800)就</p>
<p>实现了这项功能，轨迹球操作方式的加入可以实现像电脑上鼠标一样轻松操控。现在jogball基本上算是android手机的标准配置了。</p>
<h1><span style="color: #000000;">2 框图&amp;架构</span></h1>
<p><span style="color: #000000;"><br />
</span></p>
<h3><span style="color: #000000;">2.1    gpio_event子系统</span></h3>
<p>Jogball驱动是由linux代码中的gpio_event子系统实现的。<br />
由以下文件组成：</p>
<ul>
<li> <a href="http://cyher.net/tag/driver" class="st_tag internal_tag" rel="tag" title="标签 driver 下的日志">driver</a>/input/misc/gpio_event.c</li>
<li> driver/input/misc/gpio_input.c</li>
<li> driver/input/misc/gpio_output.c</li>
<li> driver/input/misc/gpio_matrix.c</li>
<li> driver/input/misc/gpio_axis.c</li>
</ul>
<p>gpio_event子系统是一个关于gpio的输入设备的通用代码，里面可以包含一般嵌入式设备中需要的键盘阵列和坐标有关的输入等。</p>
<h3><span style="color: #000000;">2.2 Jogball架构</span></h3>
<p>Jogball是归类于gpio_axis.c中的，是一个相对坐标系，判断电信号的高低来对坐标加或者减一定数值。具体细节在gpio_axis.c中</p>
<p>gpio_axis.c中的结构体初始化是在xxx-borad.c中的，基本架构就是这样，细节在下文叙述。</p>
<h1><span style="color: #000000;">3 硬件描述</span></h1>
<p><span style="color: #000000;"><br />
</span></p>
<h3><span style="color: #000000;">3.1 Jogball机械特性</span></h3>
<p>Jogball是一个基于滚球滚动的输入设备，所以它机械特性也是比较重要，知道他的机械特性，便于我们理解驱动。<br />
Jogball和以前的滚球鼠标比较相似，依靠滚轮的滚动来带动四周的圆柱体旋转。每个圆柱体端头都有一个磁铁，这个磁体铁从横断</p>
<p>面来看就是由N极的扇形和S极的扇形来组成一个圆周。这样当磁铁旋转的时候，N极和S极切换，使霍尔IC产生高低电平。<br />
注意：在滚球旋转时，两个相对方向只有一个方向可以转动，这是为了减化软件编写的一个机械特性。</p>
<h3><span style="color: #000000;">3.2 Jogball的电气特性</span></h3>
<p>Jogball最重要的电特性就是这个霍尔IC，</p>
<blockquote><p>霍尔元件的工作原理：所谓霍尔效应，是指磁场作用于载流金属导体、半导体中的载流子时，产生横向电位差的物理现</p>
<p>象。金属的霍尔效应是1879年被美 国物理学家霍尔发现的。当电流通过金属箔片时，若在垂直于电流的方向施加磁场，则金属箔片</p>
<p>两侧面会出现横向电位差。半导体中的霍尔效应比金属箔片中更为明 显，而铁磁金属在居里温度以下将呈现极强的霍尔效应。</p></blockquote>
<p>所以jogball是旋转磁轴引起磁场的变幻，来产生高低电压的。从而根据机械特性就不难理解jogball的数字输入过程。</p>
<p>3.3 Jogball的原理图</p>
<p>其实jogball只是机械结构,原理图是hall ic的,有兴趣的人在<a href="http://www.datasheetarchive.com/pdf-datasheets/Datasheets-24/DSA-469829.pdf" target="_blank">这里下载</a></p>
<h1><span style="color: #000000;">4 数据结构</span></h1>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> hero_axis_info <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">struct</span> gpio_event_axis_info info<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*gpio_event_axis结构的信息*/</span>
        <span style="color: #993333;">uint16_t</span> in_state<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/*记录输入的高低电平信号*/</span>
        <span style="color: #993333;">uint16_t</span> out_state<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/*记录输出的高低电平信号*/</span>
        <span style="color: #993333;">uint16_t</span> temp_state<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/*临时存储高低电平*/</span>
        <span style="color: #993333;">uint16_t</span> threshold<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/*门限值，超过这个值上报给input子系统*/</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> gpio_event_axis_info <span style="color: #009900;">&#123;</span>
        <span style="color: #808080; font-style: italic;">/* initialize to gpio_event_axis_func */</span>
        <span style="color: #993333;">struct</span> gpio_event_info info<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*gpio_event信息*/</span>
        <span style="color: #993333;">uint8_t</span>  count<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*gpio的数量*/</span>
        <span style="color: #993333;">uint8_t</span>  type<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* EV_REL or EV_ABS */</span>
        <span style="color: #993333;">uint16_t</span> code<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*输入键值类型*/</span>
        <span style="color: #993333;">uint16_t</span> decoded_size<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*gpio 数组的大小*/</span>
        <span style="color: #993333;">uint16_t</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>map<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> gpio_event_axis_info <span style="color: #339933;">*</span>info<span style="color: #339933;">,</span> <span style="color: #993333;">uint16_t</span> in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*解析回调函数*/</span>
        <span style="color: #993333;">uint32_t</span> <span style="color: #339933;">*</span>gpio<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*gpio端口数组*/</span>
        <span style="color: #993333;">uint32_t</span> flags<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*调试标值*/</span>
        <span style="color: #993333;">uint32_t</span> enable_emc_protect_delay<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*保护间隔时间*/</span>
        <span style="color: #993333;">uint16_t</span> emc_gpio_state<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* 延时中用到gpio_state*/</span>
        atomic_t emc_disable_irqnum<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/*延时中用到的屏蔽的中断号*/</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> gpio_event_info <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>func<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> input_dev <span style="color: #339933;">*</span>input_dev<span style="color: #339933;">,</span>
        <span style="color: #993333;">struct</span> gpio_event_info <span style="color: #339933;">*</span>info<span style="color: #339933;">,</span>
        <span style="color: #993333;">void</span> <span style="color: #339933;">**</span>data<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> func<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #808080; font-style: italic;">/*给gpio_event子系统中实现注册到内核中的回调函数*/</span>
        <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> input_dev <span style="color: #339933;">*</span>input_dev<span style="color: #339933;">,</span>
        <span style="color: #993333;">struct</span> gpio_event_info <span style="color: #339933;">*</span>info<span style="color: #339933;">,</span>
        <span style="color: #993333;">void</span> <span style="color: #339933;">**</span>data<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> type<span style="color: #339933;">,</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> code<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* out events */</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> gpio_event_platform_data <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>name<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/*名字*/</span>
        <span style="color: #993333;">struct</span> gpio_event_info <span style="color: #339933;">**</span>info<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/*gpio_event的结构指针*/</span>
        size_t info_count<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/*注册到axis中的info 结构体的数量*/</span>
        <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>power<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">struct</span> gpio_event_platform_data <span style="color: #339933;">*</span>pdata<span style="color: #339933;">,</span> bool on<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/*电源管理回调函数*/</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<h1><span style="color: #000000;">5 代码分析</span></h1>
<h3><span style="color: #000000;">5.1 通用代码</span></h3>
<p>driver/input/misc/gpio_event.c</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*gpio_event基本数据结构*/</span>
<span style="color: #993333;">struct</span> gpio_event <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">struct</span> input_dev <span style="color: #339933;">*</span>input_dev<span style="color: #339933;">;</span>
        <span style="color: #993333;">const</span> <span style="color: #993333;">struct</span> gpio_event_platform_data <span style="color: #339933;">*</span>info<span style="color: #339933;">;</span>
        <span style="color: #993333;">struct</span> early_suspend early_suspend<span style="color: #339933;">;</span>
        <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>state<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*注册给input的回调函数*/</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> gpio_input_event<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> input_dev <span style="color: #339933;">*</span>dev<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> type<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> code<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> value<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*调用下层给的回调函数来实现具体的注册*/</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> gpio_event_call_all_func<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> gpio_event <span style="color: #339933;">*</span>ip<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> func<span style="color: #009900;">&#41;</span>
<span style="color: #808080; font-style: italic;">/*电源管理*/</span>
<span style="color: #339933;">#ifdef CONFIG_HAS_EARLYSUSPEND</span>
<span style="color: #993333;">void</span> gpio_event_suspend<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> early_suspend <span style="color: #339933;">*</span>h<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #993333;">void</span> gpio_event_resume<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> early_suspend <span style="color: #339933;">*</span>h<span style="color: #009900;">&#41;</span>
<span style="color: #339933;">#endif</span>
<span style="color: #808080; font-style: italic;">/*注册*/</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> __init gpio_event_probe<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> platform_device <span style="color: #339933;">*</span>pdev<span style="color: #009900;">&#41;</span>
<span style="color: #808080; font-style: italic;">/*注销*/</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> gpio_event_remove<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> platform_device <span style="color: #339933;">*</span>pdev<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">struct</span> platform_driver gpio_event_driver
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> __devinit gpio_event_init<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">void</span> __exit gpio_event_exit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>gpio_event.c:主要是gpio_event子系统的框架</p>
<h3><span style="color: #000000;">5.2    soc代码</span></h3>
<p>driver/input/misc/gpio_axis.c</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> gpio_axis_state <span style="color: #009900;">&#123;</span>
<span style="color: #993333;">struct</span> input_dev <span style="color: #339933;">*</span>input_dev<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/*input设备结构*/</span>
<span style="color: #993333;">struct</span> gpio_event_axis_info <span style="color: #339933;">*</span>info<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*坐标系数据结构*/</span>
<span style="color: #993333;">uint32_t</span> pos<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*位置*/</span>
<span style="color: #993333;">struct</span> hrtimer emc_hrtimer_delay<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* 延时时间*/</span>
atomic_t atomic_emc_hrtimer_is_run<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*延时的原子变量*/</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #808080; font-style: italic;">/*上报input数据*/</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">void</span> gpio_event_update_axis<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> gpio_axis_state <span style="color: #339933;">*</span>as<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> report<span style="color: #009900;">&#41;</span>
<span style="color: #808080; font-style: italic;">/*时间处理函数*/</span>
<span style="color: #993333;">static</span> <span style="color: #000000; font-weight: bold;">enum</span> hrtimer_restart emc_progress_hrtimer_handler_func<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> hrtimer <span style="color: #339933;">*</span>timer<span style="color: #009900;">&#41;</span>
<span style="color: #808080; font-style: italic;">/*中断处理函数*/</span>
<span style="color: #993333;">static</span> irqreturn_t gpio_axis_irq_handler<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> irq<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>dev_id<span style="color: #009900;">&#41;</span>
<span style="color: #808080; font-style: italic;">/*给上层的注册回调函数*/</span>
<span style="color: #993333;">int</span> gpio_event_axis_func<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> input_dev <span style="color: #339933;">*</span>input_dev<span style="color: #339933;">,</span> <span style="color: #993333;">struct</span> gpio_event_info <span style="color: #339933;">*</span>info<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">**</span>data<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> func<span style="color: #009900;">&#41;</span></pre></div></div>

<h3><span style="color: #000000;">5.3    platform代码</span></h3>
<p>例如：/arch/arm/match-msm/board-72&#215;7.c</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">uint16_t</span> hero_axis_map<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> gpio_event_axis_info <span style="color: #339933;">*</span>info<span style="color: #339933;">,</span> <span style="color: #993333;">uint16_t</span> in<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">struct</span> hero_axis_info <span style="color: #339933;">*</span>ai <span style="color: #339933;">=</span> container_of<span style="color: #009900;">&#40;</span>info<span style="color: #339933;">,</span> <span style="color: #993333;">struct</span> hero_axis_info<span style="color: #339933;">,</span> info<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">uint16_t</span> out <span style="color: #339933;">=</span> ai<span style="color: #339933;">-&gt;</span>out_state<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>nav_just_on<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>jiffies <span style="color: #339933;">==</span> nav_on_jiffies <span style="color: #339933;">||</span> jiffies <span style="color: #339933;">==</span> nav_on_jiffies <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
                <span style="color: #b1b100;">goto</span> ignore<span style="color: #339933;">;</span>
        nav_just_on <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ai<span style="color: #339933;">-&gt;</span>in_state <span style="color: #339933;">^</span> in<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #808080; font-style: italic;">/*检测在方向1上有没有数值变化*/</span>
        out<span style="color: #339933;">--;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ai<span style="color: #339933;">-&gt;</span>n_state <span style="color: #339933;">^</span> in<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #808080; font-style: italic;">/*检测在方向1相对方向上有没有数值变化*/</span>
        out<span style="color: #339933;">++;</span>
ai<span style="color: #339933;">-&gt;;</span>out_state <span style="color: #339933;">=</span> out<span style="color: #339933;">;</span>
ignore<span style="color: #339933;">:</span>
        ai<span style="color: #339933;">-&gt;</span>in_state <span style="color: #339933;">=</span> in<span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ai<span style="color: #339933;">-&gt;</span>out_state <span style="color: #339933;">-</span> ai<span style="color: #339933;">-&gt;</span>temp_state <span style="color: #339933;">==</span> ai<span style="color: #339933;">-&gt;</span>threshold<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ai<span style="color: #339933;">-&gt;</span>temp_state<span style="color: #339933;">++;</span>
        ai<span style="color: #339933;">-&gt;</span>out_state <span style="color: #339933;">=</span> ai<span style="color: #339933;">-&gt;</span>temp_state<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ai<span style="color: #339933;">-&gt;</span>temp_state <span style="color: #339933;">-</span> ai<span style="color: #339933;">-</span>out_state <span style="color: #339933;">==</span> ai<span style="color: #339933;">-&gt;</span>threshold<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ai<span style="color: #339933;">-&gt;</span>temp_state<span style="color: #339933;">--;</span>
        ai<span style="color: #339933;">-&gt;</span>out_state <span style="color: #339933;">=</span> ai<span style="color: #339933;">-&gt;</span>temp_state<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>abs<span style="color: #009900;">&#40;</span>ai<span style="color: #339933;">-&gt;</span>out_state <span style="color: #339933;">-</span> ai<span style="color: #339933;">-&gt;;</span>temp_state<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> ai<span style="color: #339933;">-&gt;</span>threshold<span style="color: #009900;">&#41;</span>
        ai<span style="color: #339933;">-&gt;</span>temp_state <span style="color: #339933;">=</span> ai<span style="color: #339933;">-&gt;</span>out_state<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">return</span> ai<span style="color: #339933;">-&gt;</span>temp_state<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>以上函数，是最终的数据解析函数，也就是把硬件中读出来的数据，转化为实际的位置变化的函数。此函数主要做了差错控制，增加</p>
<p>了程序的鲁棒性和可订制性。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #993333;">struct</span> hero_axis_info hero_x_axis <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
        .<span style="color: #202020;">threshold</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
                .<span style="color: #202020;">info</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
                .<span style="color: #202020;">info</span>.<span style="color: #202020;">func</span> <span style="color: #339933;">=</span> gpio_event_axis_func<span style="color: #339933;">,</span>
                .<span style="color: #202020;">count</span> <span style="color: #339933;">=</span> ARRAY_SIZE<span style="color: #009900;">&#40;</span>hero_x_axis_gpios<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                .<span style="color: #202020;">type</span> <span style="color: #339933;">=</span> EV_REL<span style="color: #339933;">,</span>
                .<span style="color: #202020;">code</span> <span style="color: #339933;">=</span> REL_X<span style="color: #339933;">,</span>
                .<span style="color: #202020;">decoded_size</span> <span style="color: #339933;">=</span> 1U <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;&amp;</span>lt<span style="color: #339933;">;</span> ARRAY_SIZE<span style="color: #009900;">&#40;</span>hero_x_axis_gpios<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                .<span style="color: #202020;">map</span> <span style="color: #339933;">=</span> hero_axis_map<span style="color: #339933;">,</span>
                .<span style="color: #202020;">gpio</span> <span style="color: #339933;">=</span> hero_x_axis_gpios<span style="color: #339933;">,</span>
                .<span style="color: #202020;">flags</span> <span style="color: #339933;">=</span> GPIOEAF_PRINT_UNKNOWN_DIRECTION <span style="color: #808080; font-style: italic;">/*| GPIOEAF_PRINT_RAW | GPIOEAF_PRINT_EVENT */</span><span style="color: #339933;">,</span>
                .<span style="color: #202020;">enable_emc_protect_delay</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">*</span> NSEC_PER_MSEC<span style="color: #339933;">,</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>X轴上的info结构体的初始化</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #993333;">struct</span> hero_axis_info hero_y_axis <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
        .<span style="color: #202020;">threshold</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
                .<span style="color: #202020;">info</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
                .<span style="color: #202020;">info</span>.<span style="color: #202020;">func</span> <span style="color: #339933;">=</span> gpio_event_axis_func<span style="color: #339933;">,</span>
                .<span style="color: #202020;">count</span> <span style="color: #339933;">=</span> ARRAY_SIZE<span style="color: #009900;">&#40;</span>hero_y_axis_gpios<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                .<span style="color: #202020;">type</span> <span style="color: #339933;">=</span> EV_REL<span style="color: #339933;">,</span>
                .<span style="color: #202020;">code</span> <span style="color: #339933;">=</span> REL_Y<span style="color: #339933;">,</span>
                .<span style="color: #202020;">decoded_size</span> <span style="color: #339933;">=</span> 1U <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;&amp;</span>lt<span style="color: #339933;">;</span> ARRAY_SIZE<span style="color: #009900;">&#40;</span>hero_y_axis_gpios<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                .<span style="color: #202020;">map</span> <span style="color: #339933;">=</span> hero_axis_map<span style="color: #339933;">,</span>
                .<span style="color: #202020;">gpio</span> <span style="color: #339933;">=</span> hero_y_axis_gpios<span style="color: #339933;">,</span>
                .<span style="color: #202020;">flags</span> <span style="color: #339933;">=</span> GPIOEAF_PRINT_UNKNOWN_DIRECTION <span style="color: #808080; font-style: italic;">/*| GPIOEAF_PRINT_RAW | GPIOEAF_PRINT_EVENT  */</span><span style="color: #339933;">,</span>
                .<span style="color: #202020;">enable_emc_protect_delay</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">*</span> NSEC_PER_MSEC<span style="color: #339933;">,</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Y轴上的info结构体的初始化</p>
<h1><span style="color: #000000;">6 备注</span></h1>
<p>在android的framework的代码中识别jogball设备是识别成鼠标的特性的，不仅有坐标还是由按键的，但是驱动中并没有axis中并没</p>
<p>有按键，所以在注册input设备的时候要加入按键的键值。如下代码：<br />
在drivers/input/misc/gpio_axis.c中的gpio_event_axis_func函数中</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">as<span style="color: #339933;">-&gt;</span>input_dev <span style="color: #339933;">=</span> input_dev<span style="color: #339933;">;</span>
as<span style="color: #339933;">-&gt;</span>info <span style="color: #339933;">=</span> ai<span style="color: #339933;">;</span>
&nbsp;
input_set_capability<span style="color: #009900;">&#40;</span>input_dev<span style="color: #339933;">,</span> ai<span style="color: #339933;">-&gt;</span>type<span style="color: #339933;">,</span> ai<span style="color: #339933;">-&gt;;</span>code<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ai<span style="color: #339933;">-&gt;</span>type <span style="color: #339933;">==</span> EV_ABS<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        input_set_abs_params<span style="color: #009900;">&#40;</span>input_dev<span style="color: #339933;">,</span> ai<span style="color: #339933;">-&gt;</span>code<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>
        ai<span style="color: #339933;">-&gt;</span>decoded_size <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>input_set_capability(input_dev, ai->type, BT_MOUSE);</p>
<p>本文源码是基于hero手机kernel代码<br />
kernel_hero/arch/arm/mach-msm/board-hero.c<br />
下载地址 <a href="http://developer.htc.com/">http://developer.htc.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/gnulinux/android/android-driver-jogball/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>手机操作系统这点事</title>
		<link>http://cyher.net/os/phone_os</link>
		<comments>http://cyher.net/os/phone_os#comments</comments>
		<pubDate>Tue, 20 Jan 2009 11:51:27 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[OS]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[symbian]]></category>
		<category><![CDATA[webOS]]></category>
		<category><![CDATA[windows mobile]]></category>

		<guid isPermaLink="false">http://cyher.net/?p=636853</guid>
		<description><![CDATA[       瘾科技上有这么一则投票,你喜欢那个手机操作系统?那么就去看看结果吧.上图几个手机都是这些操作系统的代表作(现今最牛逼的各个操作系统的代表). 手机操作系统,说来话长,除了iphoneOS和android,都有比较悠久的历史: windows mobile英文, 中文; palm OS英文,中文 ; symbian英文 , 中文;我很早之前就开始关注,也许不能说是关注,就是在其中找乐子.我的历史:首先我得到了一个palm zire 72,被palmOS的快速便捷震撼了(当时可没有multi-touch),就在胖友和蜥蜴的争吵中我了解了windowsCE,也就是现在的mobile ,于是也就有了一段mobile生涯,但是总是win它毕竟是”瘟”啊,在哪都一样!索性symbian一把,symbian确实让人眼前一亮,但是大同小异,没有什么出色的地方(说是实时性比较好,在n73上的龟速,也不是一个palmer能忍受的).接下来的日子Mac OS X的iphone版告诉我,快速和绚丽原来是可以并存的!我也算一代败家&#8230;..操作系统是感受过了,手机也换了不少. 研究嵌入式也有一段时间了,这些手机操作系统,确切的说都是嵌入式操作系统, 基本上都是基于ARM的,嵌入式系统是离不开硬件的(android例外).iphoneOS,Android,WebOS都是类UNIX的,前者是unix后两个是linux内核,这就意味这,这几款手机的实时性不好,但是话说回来,手机这东西感觉要实时性没什么用.symbian和windowsMobile是实时性好,但是看来也没强到哪里去&#8230;看来现在有些嵌入式的性能指标我们是可以忽略的!现在什么最重要?好了现在看看文章最上面的那张图,得出什么结论了么?       大屏:这几个手机的屏幕都是属于业界前端的,尤其是索爱的X1更是登峰造极,这要求在整个操作系统的图形系统要很好,硬件也要支持.       触摸:windows上的触摸技术已经达到了一个新的高度,但是就是现在还没有多点触硬件支持,iphone就不用说了,perfect!palm pre用的屏也是电容式的,webOS同样支持multi-touch.nokia好像也有什么手势技术,不过现在还没有出来就不说了.android实在是太低调了,听说支持mutli-touch就是没有启用&#8230;.       网络:这几款手机哪个不是网络应用非常牛,windows和symbian要黯淡许多!看人家palm多直接webOS,不过据我推测,这个webOS的命名是因为在webOS上开发可以用html5,css等web语言得来的把.这就要求操作系统在网络支持上面要越来越强,可怜的windows在这点上我觉得你比不上原生于服务器的linux和BSD&#8211;iphoneOS.       MID:这个名词在2008年着实火疯了,上面几款手机有3款有全键盘,都有硕大的屏幕,全面的网络接入,高性能的硬件,无数的应用软件和大量的开发人员支持,好了现在把前面叙述的特点在脑中想一下,确实能和MID比一下了,以后MID和手机之间的界限将被这些手机和OS变的模糊.    这给我们程序员带来了什么呢?   看看app store中iphone的软件下载量,5个月1万个应用5亿次下载. 有多少人就写了个iphone的软件一夜几万美元.说笑,不过google也如法炮制同样也有app store,palm也有了.给了程序员一次很好的机会,不管是java,web,c程序员都会在移动平台找到他位置的.再说android的山寨方案,这就是嵌入式linux的程序员的机会了,依据不同的硬件移植android,恩,很不错?!   坐观风云变!自己也要想点什么了.]]></description>
			<content:encoded><![CDATA[<div id="attachment_636861" class="wp-caption aligncenter" style="width: 310px"><a href="http://cyher.net/wp-content/uploads/2009/01/appl_mobile_2009-top_banner.jpg" rel="lightbox[636853]"><img class="size-medium wp-image-636861 " title="appl_mobile_2009-top_banner" src="http://cyher.net/wp-content/uploads/2009/01/appl_mobile_2009-top_banner-300x93.jpg" alt="手机操作系统" width="300" height="93" /></a><p class="wp-caption-text">手机操作系统</p></div>
<p>       <a href="http://cn.engadget.com/2009/01/19/which-moblie-os-you-love01/#poll24920" target="_blank">瘾科技</a>上有这么一则投票,你喜欢那个手机操作系统?那么就去看看结果吧.上图几个手机都是这些操作系统的代表作(现今最牛逼的各个操作系统的代表).</p>
<p>手机操作系统,说来话长,除了iphoneOS和android,都有比较悠久的历史:<br />
<a href="http://en.wikipedia.org/wiki/Windows_Mobile" target="_blank">windows mobile英文</a>, <a href="http://zh.wikipedia.org/wiki/Windows_Mobile" target="_blank">中文</a>; <a href="http://en.wikipedia.org/w/index.php?title=Palm_OS&amp;variant=zh-cn" target="_blank">palm OS英文</a>,<a href="http://zh.wikipedia.org/wiki/Palm" target="_blank">中文</a> ; <a href="http://en.wikipedia.org/wiki/Symbian" target="_blank">symbian英文 , </a><a href="http://zh.wikipedia.org/wiki/Symbian_OS" target="_blank">中文</a>;我很早之前就开始关注,也许不能说是关注,就是在其中找乐子.我的历史:首先我得到了一个palm zire 72,被palmOS的快速便捷震撼了(当时可没有multi-touch),就在胖友和蜥蜴的争吵中我了解了windowsCE,也就是现在的mobile ,于是也就有了一段mobile生涯,但是总是win它毕竟是”瘟”啊,在哪都一样!索性symbian一把,symbian确实让人眼前一亮,但是大同小异,没有什么出色的地方(说是实时性比较好,在n73上的龟速,也不是一个palmer能忍受的).接下来的日子Mac OS X的iphone版告诉我,快速和绚丽原来是可以并存的!我也算一代败家&#8230;..操作系统是感受过了,<a href="http://cyher.net/handheld/换手机，患病。。。。" target="_blank">手机也换了不少</a>.</p>
<p>研究嵌入式也有一段时间了,这些手机操作系统,确切的说都是嵌入式操作系统,<br />
基本上都是基于ARM的,嵌入式系统是离不开硬件的(android例外).iphoneOS,<a href="http://cyher.net/tag/android" class="st_tag internal_tag" rel="tag" title="标签 android 下的日志">Android</a>,WebOS都是类UNIX的,前者是unix后两个是linux内核,这就意味这,这几款手机的实时性不好,但是话说回来,手机这东西感觉要实时性没什么用.symbian和windowsMobile是实时性好,但是看来也没强到哪里去&#8230;看来现在有些嵌入式的性能指标我们是可以忽略的!现在什么最重要?好了现在看看文章最上面的那张图,得出什么结论了么?</p>
<p>      大屏:这几个手机的屏幕都是属于业界前端的,尤其是索爱的X1更是登峰造极,这要求在整个操作系统的图形系统要很好,硬件也要支持.<br />
      触摸:windows上的触摸技术已经达到了一个新的高度,但是就是现在还没有多点触硬件支持,iphone就不用说了,perfect!palm pre用的屏也是电容式的,webOS同样支持multi-touch.nokia好像也有什么手势技术,不过现在还没有出来就不说了.android实在是太低调了,听说支持mutli-touch就是没有启用&#8230;.<br />
      网络:这几款手机哪个不是网络应用非常牛,windows和symbian要黯淡许多!看人家palm多直接webOS,不过据我推测,这个webOS的命名是因为在webOS上开发可以用html5,css等web语言得来的把.这就要求操作系统在网络支持上面要越来越强,可怜的windows在这点上我觉得你比不上原生于服务器的linux和BSD&#8211;iphoneOS.<br />
      MID:这个名词在2008年着实火疯了,上面几款手机有3款有全键盘,都有硕大的屏幕,全面的网络接入,高性能的硬件,无数的应用软件和大量的开发人员支持,好了现在把前面叙述的特点在脑中想一下,确实能和MID比一下了,以后MID和手机之间的界限将被这些手机和OS变的模糊. </p>
<p><span style="white-space: pre;">  </span>这给我们程序员带来了什么呢?<br />
<span style="white-space: pre;">  </span>看看app store中<a href="http://www.apple4us.com/2008/12/app-store-5-month-10000-apps.html" target="_blank">iphone的软件下载量</a>,5个月1万个应用5亿次下载.<br />
有多少人就写了个iphone的软件一夜几万美元.说笑,不过google也如法炮制同样也有app store,palm也有了.给了程序员一次很好的机会,不管是java,web,c程序员都会在移动平台找到他位置的.再说android的山寨方案,这就是嵌入式linux的程序员的机会了,依据不同的硬件移植android,恩,很不错?!</p>
<p><span style="white-space: pre;">  </span>坐观风云变!自己也要想点什么了.</p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/os/phone_os/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

