<?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>kumama &#187; android</title>
	<atom:link href="http://kumama.org/category/android/feed/" rel="self" type="application/rss+xml" />
	<link>http://kumama.org</link>
	<description>go言語とかgolangとかGAEとかネットサービスとかその他色々・・・</description>
	<lastBuildDate>Thu, 28 Apr 2011 09:39:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Androidは複数形</title>
		<link>http://kumama.org/2011/02/android_is_androids/</link>
		<comments>http://kumama.org/2011/02/android_is_androids/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 14:56:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=220</guid>
		<description><![CDATA[「Androidのアップグレード問題に関してひとこと」を読んで。 直感的に感じているのは各端末毎のスペックがばらばらで、端末毎のおもてなしを最適化するのが困難な上に、１端末種類のパイが少ないから最適化にかけた情熱が見合わないと言うこと。端末の画面サイズの違いやタッチパネルの感度・感覚の違いが低いレイヤで吸収できてないから、使い心地を作り込む作業が難しい。直感的操作がメインのスマホなら当然のこと。直感的操作・使い心地という抽象的な指標だから抽象的にしかかけないので伝わるかどうか微妙だけど。 まー、iOSも複数端末有るけどfewで収まる範囲。Androidはmany。あとＨＷの変更サイクルが今のところ推測可能かつ緩やかかつUIというかUXに関してはある程度統一されてるのでiOSの方が安心と言うことか。 おいらはこの記事「The Problem with Inconsistent Button Layouts on Android」読んでAndroidは難しいなーと思いました。 と、書きつつも実は「Androidのアップグレード問題に関してひとこと」には突っ込みたい所満載。 スマートフォンの場合は、それぞれのハードウェアも大きく異なっているし、共通Biosのようなものも存在しない。 んー、今のところARMコアで SoC の系統が同じならそんなに違わない。Biosは無いだろうけどAndroidは基本、Linuxカーネルさえ動けば何とか成る。Androidでgoogleが追加したドライバもちょっと有る物のそれは移植が困難な物ではない。 こう考えてみると、MicrosoftとIntelが作り出した「Windowsパソコン」というプラットフォーム・ビジネスの成功が実はものすごく例外的なものだったんではないかとつくづく思えて来る。 これってバージョンアップの話をしてるんだろうか…。バージョンアップに関して言えば3.1/95/98/ME/XP/Vista/7ってハード買い換えずにアップグレードして満足に使ってた人って少ないんじゃないだろうか。少なくとも普及後近年の状況だと未だに半数以上が１０年前のＯＳのＸＰだし。１０年前のＰＣで７やDirectX11が快適に使えるわけもなく。この辺年のスパンでアップデートするＯＳに比べ日進月歩なAndroidでバージョンアップが難しいっていう話はハード買い換え前提じゃないからあると思う。 最近書評とかも少ないなぁ。]]></description>
			<content:encoded><![CDATA[<p>「<a href="http://satoshi.blogs.com/life/2011/02/android.html">Androidのアップグレード問題に関してひとこと</a>」を読んで。</p>
<p>直感的に感じているのは各端末毎のスペックがばらばらで、端末毎のおもてなしを最適化するのが困難な上に、１端末種類のパイが少ないから最適化にかけた情熱が見合わないと言うこと。端末の画面サイズの違いやタッチパネルの感度・感覚の違いが低いレイヤで吸収できてないから、使い心地を作り込む作業が難しい。直感的操作がメインのスマホなら当然のこと。直感的操作・使い心地という抽象的な指標だから抽象的にしかかけないので伝わるかどうか微妙だけど。</p>
<p>まー、iOSも複数端末有るけどfewで収まる範囲。Androidはmany。あとＨＷの変更サイクルが今のところ推測可能かつ緩やかかつUIというかUXに関してはある程度統一されてるのでiOSの方が安心と言うことか。</p>
<p>おいらはこの記事「<a href="http://www.tested.com/news/the-problem-with-inconsistent-button-layouts-on-android/1463/">The Problem with Inconsistent Button Layouts on Android</a>」読んでAndroidは難しいなーと思いました。<br />
<span id="more-220"></span><br />
と、書きつつも実は「<a href="http://satoshi.blogs.com/life/2011/02/android.html">Androidのアップグレード問題に関してひとこと</a>」には突っ込みたい所満載。</p>
<blockquote><p>スマートフォンの場合は、それぞれのハードウェアも大きく異なっているし、共通Biosのようなものも存在しない。</p></blockquote>
<p>んー、今のところARMコアで SoC の系統が同じならそんなに違わない。Biosは無いだろうけどAndroidは基本、Linuxカーネルさえ動けば何とか成る。Androidでgoogleが追加したドライバもちょっと有る物のそれは移植が困難な物ではない。</p>
<blockquote><p>こう考えてみると、MicrosoftとIntelが作り出した「Windowsパソコン」というプラットフォーム・ビジネスの成功が実はものすごく例外的なものだったんではないかとつくづく思えて来る。</p></blockquote>
<p>これってバージョンアップの話をしてるんだろうか…。バージョンアップに関して言えば3.1/95/98/ME/XP/Vista/7ってハード買い換えずにアップグレードして満足に使ってた人って少ないんじゃないだろうか。少なくとも普及後近年の状況だと<a href="http://www.itmedia.co.jp/news/articles/1101/05/news062.html">未だに半数以上が</a>１０年前のＯＳのＸＰだし。１０年前のＰＣで７やDirectX11が快適に使えるわけもなく。この辺年のスパンでアップデートするＯＳに比べ日進月歩なAndroidでバージョンアップが難しいっていう話はハード買い換え前提じゃないからあると思う。</p>
<p>最近書評とかも少ないなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2011/02/android_is_androids/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android/eclairのBeagleBoardで無線ＬＡＮ</title>
		<link>http://kumama.org/2010/01/android-eclair-beagleboard-wlan/</link>
		<comments>http://kumama.org/2010/01/android-eclair-beagleboard-wlan/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 11:15:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=123</guid>
		<description><![CDATA[まぁ、その３ｗ initがuevent見てFirmwareのロードしてくれるはずなんだけど、initにデバック入れてみて見てもuevent拾ってなさげ。 kernelにFirm抱き合わせにして回避。 基本、有線ＬＡＮでnsfrootしてるので無線ＬＡＮは必要ないんだけど、 ConnectionManager?がネットにつながってるとみなしてくれず。 ブラウザはOKだけどダウンロードが動かん。 OpenWnnも動かなかったり Eclairは色々まだまだ前途多難ぽい]]></description>
			<content:encoded><![CDATA[<p>まぁ、その３ｗ</p>
<p>initがuevent見てFirmwareのロードしてくれるはずなんだけど、initにデバック入れてみて見てもuevent拾ってなさげ。<br />
kernelにFirm抱き合わせにして回避。</p>
<p>基本、有線ＬＡＮでnsfrootしてるので無線ＬＡＮは必要ないんだけど、<br />
ConnectionManager?がネットにつながってるとみなしてくれず。<br />
ブラウザはOKだけどダウンロードが動かん。</p>
<p>OpenWnnも動かなかったり Eclairは色々まだまだ前途多難ぽい</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2010/01/android-eclair-beagleboard-wlan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android/eclairのWebSocketsは未完</title>
		<link>http://kumama.org/2010/01/android-eclair-websockets-broaken/</link>
		<comments>http://kumama.org/2010/01/android-eclair-websockets-broaken/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 10:16:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=119</guid>
		<description><![CDATA[未完ねた２本目。 というか、年末からの色々２本目。 beagle-board有るから動かして試せば良いやぁって思ってたけど、 動かない動かない(WebSockets以外が)ってことでソースを追う。 現状、Chromeでしか動かないんだけどその実装は以下っぽい。 http://src.chromium.org/viewvc/chrome/trunk/src/net/websockets/ ってWebKitじゃないのか・・・と思いつつもwebkitのwebcoreのsvnにコードはある http://trac.webkit.org/browser/trunk/WebCore/websockets 一方、eclairのwebkitはというとこれ。 http://android.git.kernel.org/?p=platform/external/webkit.git;a=tree;f=WebCore/websockets 79 bool WebSocket::send(const String&#038;, ExceptionCode&#038; ec) 80 { 81 if (m_state != OPEN) { 82 ec = INVALID_STATE_ERR; 83 return false; 84 } 85 // FIXME: send message on WebSocketChannel. 86 return false; 87 } orz 使える分けね～。 r47029辺りでsyncしてそれっきりぽい。 v8入ってコードもあるから動くかと思った…。コードの中見なかったのが敗因。 強引にWebKit入れ替えようかとも思ったものの、Nexsus OneちゅうかAndroid 2.1が公開されてサポート状況見てからにしよう。 Nexsus OneもブラウザのUserAgent見てるとAppleWebKit/530.17ベース(Safari 4.0ぐらい？)で変わってないぽくって期待は出来ないのだが…]]></description>
			<content:encoded><![CDATA[<p><del datetime="2010-01-09T01:07:43+00:00">未完ねた２本目。</del><br />
というか、年末からの色々２本目。</p>
<p>beagle-board有るから動かして試せば良いやぁって思ってたけど、<br />
動かない動かない(WebSockets以外が)ってことでソースを追う。</p>
<p>現状、Chromeでしか動かないんだけどその実装は以下っぽい。<br />
<a href="http://src.chromium.org/viewvc/chrome/trunk/src/net/websockets/">http://src.chromium.org/viewvc/chrome/trunk/src/net/websockets/</a></p>
<p>ってWebKitじゃないのか・・・と思いつつもwebkitのwebcoreのsvnにコードはある<br />
<a href="http://trac.webkit.org/browser/trunk/WebCore/websockets">http://trac.webkit.org/browser/trunk/WebCore/websockets</a></p>
<p>一方、eclairのwebkitはというとこれ。<br />
<a href="http://android.git.kernel.org/?p=platform/external/webkit.git;a=tree;f=WebCore/websockets">http://android.git.kernel.org/?p=platform/external/webkit.git;a=tree;f=WebCore/websockets</a></p>
<pre>  79 bool WebSocket::send(const String&#038;, ExceptionCode&#038; ec)<br />
  80 {<br />
  81     if (m_state != OPEN) {<br />
  82         ec = INVALID_STATE_ERR;<br />
  83         return false;<br />
  84     }<br />
  85     // FIXME: send message on WebSocketChannel.<br />
  86     return false;<br />
  87 }
<pre>
<p>orz<br />
使える分けね～。</p>
<p>r47029辺りでsyncしてそれっきりぽい。</p>
<p>v8入ってコードもあるから動くかと思った…。コードの中見なかったのが敗因。</p>
<p>強引にWebKit入れ替えようかとも思ったものの、Nexsus OneちゅうかAndroid 2.1が公開されてサポート状況見てからにしよう。<br />
Nexsus OneもブラウザのUserAgent見てるとAppleWebKit/530.17ベース(Safari 4.0ぐらい？)で変わってないぽくって期待は出来ないのだが…</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2010/01/android-eclair-websockets-broaken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>beagleboard-eclairでマウス（未完</title>
		<link>http://kumama.org/2010/01/beagleboard-eclair-mouse-not-complet/</link>
		<comments>http://kumama.org/2010/01/beagleboard-eclair-mouse-not-complet/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 09:58:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=118</guid>
		<description><![CDATA[年末ぐらいからの色々。その１。 WebSocket が Android 2.0 (eclair) で使えたら良いなぁと思いつつ、 BeagleBoardでeclair動かしてみてたものの。 マウスが標準のAndroidだと未サポートってことで、ちょっと作りかけ。 色々なAndroidの実装というかリポジトリ覗いたんだけど、Android側に手を入れてる実装が多い。 Android側の更新が頻繁なことを考えるとKernel側でマウスを仮想タッチパネルに仕立て上げるほうが 良さそうっていう発想の元色々。 はじめはフィルタドライバで実装してたんだけど、Androidが拾ってくれない。 /dev/input/mouse とかは Android の EventHub は見てなくて/dev/input/event を見てる。 ということで evdev.c で EV_REL を　EV_ABS にごまかしたりする仮想デバイスぽいドライバを。 カーソルの描画はOVL2使えば良いやって思ってたけど、微妙に失敗してるっぽい。 っていうか、androidがfbのダブルバッファリングに使ってるのか？ fbconかもしれん…けど見切れてない。 あと、画面の電源が入ってないときはタッチパネルのイベントを無視するっていうコードが、 Android側に入っていてそこだけは面倒でAndroid側修正した。 frameworks/base/services/java/com/android/server/KeyInputQueue.java:502 if (ev.type == RawInputEvent.EV_ABS) { send = true; } とりあえずな現状のkernelパッチは続きに。 diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index af87135..47bfa45 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -20,8 [...]]]></description>
			<content:encoded><![CDATA[<p>年末ぐらいからの色々。その１。</p>
<p>WebSocket が Android 2.0 (eclair) で使えたら良いなぁと思いつつ、<br />
BeagleBoardでeclair動かしてみてたものの。<br />
マウスが標準のAndroidだと未サポートってことで、ちょっと作りかけ。</p>
<p>色々なAndroidの実装というかリポジトリ覗いたんだけど、Android側に手を入れてる実装が多い。<br />
Android側の更新が頻繁なことを考えるとKernel側でマウスを仮想タッチパネルに仕立て上げるほうが<br />
良さそうっていう発想の元色々。</p>
<p>はじめはフィルタドライバで実装してたんだけど、Androidが拾ってくれない。<br />
/dev/input/mouse とかは Android の EventHub は見てなくて/dev/input/event を見てる。</p>
<p>ということで evdev.c で EV_REL を　EV_ABS にごまかしたりする仮想デバイスぽいドライバを。<br />
カーソルの描画はOVL2使えば良いやって思ってたけど、微妙に失敗してるっぽい。<br />
っていうか、androidがfbのダブルバッファリングに使ってるのか？<br />
fbconかもしれん…けど見切れてない。</p>
<p>あと、画面の電源が入ってないときはタッチパネルのイベントを無視するっていうコードが、<br />
Android側に入っていてそこだけは面倒でAndroid側修正した。</p>
<pre class="brush:go">frameworks/base/services/java/com/android/server/KeyInputQueue.java:502
                        if (ev.type == RawInputEvent.EV_ABS) {
                            send = true;
                        }</pre>
<p>とりあえずな現状のkernelパッチは続きに。</p>
<p><span id="more-118"></span></p>
<pre class="brush:go">diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c<br />
index af87135..47bfa45 100644<br />
--- a/drivers/input/evdev.c<br />
+++ b/drivers/input/evdev.c<br />
@@ -20,8 +20,20 @@<br />
 #include
<linux/major.h>
 #include
<linux/device.h>
 #include
<linux/wakelock.h>
+#include
<linux/fb.h>
 #include "input-compat.h"</p>
<p>+static unsigned short cursor[8][8] = {<br />
+	{0,0,0,0,0,2,2,2},<br />
+	{0,1,1,0,2,2,2,2},<br />
+	{0,1,1,1,0,2,2,2},<br />
+	{0,0,1,1,1,0,2,2},<br />
+	{0,2,0,1,1,1,0,2},<br />
+	{2,2,2,0,1,0,2,2},<br />
+	{2,2,2,2,0,2,2,2},<br />
+	{2,2,2,2,2,2,2,2}<br />
+};<br />
+<br />
 struct evdev {<br />
 	int exist;<br />
 	int open;<br />
@@ -51,7 +63,7 @@ static struct evdev *evdev_table[EVDEV_MINORS];<br />
 static DEFINE_MUTEX(evdev_table_mutex);</p>
<p> static void evdev_pass_event(struct evdev_client *client,<br />
-			     struct input_event *event)<br />
+				 struct input_event *event)<br />
 {<br />
 	/*<br />
 	 * Interrupts are disabled, just acquire the lock<br />
@@ -65,17 +77,28 @@ static void evdev_pass_event(struct evdev_client *client,<br />
 	kill_fasync(&#038;client->fasync, SIGIO, POLL_IN);<br />
 }</p>
<p>+static int x = 0;<br />
+static int y = 0;<br />
+static int press = 0;<br />
+<br />
 /*<br />
  * Pass incoming event to all connected clients.<br />
  */<br />
 static void evdev_event(struct input_handle *handle,<br />
 			unsigned int type, unsigned int code, int value)<br />
 {<br />
+	int lx = 0;<br />
+	int ly = 0;<br />
+	int lfb = 0;<br />
+<br />
 	struct evdev *evdev = handle->private;<br />
 	struct evdev_client *client;<br />
 	struct input_event event;<br />
 	struct timespec ts;</p>
<p>+	printk(KERN_DEBUG "[%s] Event. Dev: %s, Type: %d, Code: %d, Value: %d<br />
",<br />
+		 handle->name, handle->dev->phys, type, code, value);<br />
+<br />
 	ktime_get_ts(&#038;ts);<br />
 	event.time.tv_sec = ts.tv_sec;<br />
 	event.time.tv_usec = ts.tv_nsec / NSEC_PER_USEC;<br />
@@ -83,6 +106,230 @@ static void evdev_event(struct input_handle *handle,<br />
 	event.code = code;<br />
 	event.value = value;</p>
<p>+	if( type == EV_REL ){<br />
+		switch( code ){<br />
+			case REL_X: x += value; break;<br />
+			case REL_Y: y += value; break;<br />
+			default: break;<br />
+		}<br />
+		if( press ) {<br />
+		rcu_read_lock();<br />
+		event.type = EV_ABS;<br />
+		event.code = ABS_X;<br />
+		event.value = x;<br />
+		client = rcu_dereference(evdev->grab);<br />
+		if (client)<br />
+			evdev_pass_event(client, &#038;event);<br />
+		else<br />
+			list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+				evdev_pass_event(client, &#038;event);<br />
+		rcu_read_unlock();<br />
+<br />
+		rcu_read_lock();<br />
+		event.type = EV_ABS;<br />
+		event.code = ABS_Y;<br />
+		event.value = y;<br />
+		client = rcu_dereference(evdev->grab);<br />
+		if (client)<br />
+			evdev_pass_event(client, &#038;event);<br />
+		else<br />
+			list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+				evdev_pass_event(client, &#038;event);<br />
+		rcu_read_unlock();<br />
+<br />
+		rcu_read_lock();<br />
+		event.type = EV_ABS;<br />
+		event.code = ABS_PRESSURE;<br />
+		event.value = press;<br />
+		client = rcu_dereference(evdev->grab);<br />
+		if (client)<br />
+			evdev_pass_event(client, &#038;event);<br />
+		else<br />
+			list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+				evdev_pass_event(client, &#038;event);<br />
+		rcu_read_unlock();<br />
+<br />
+		rcu_read_lock();<br />
+		event.type = 0;<br />
+		event.code = 0;<br />
+		event.value = 0;<br />
+		client = rcu_dereference(evdev->grab);<br />
+		if (client)<br />
+			evdev_pass_event(client, &#038;event);<br />
+		else<br />
+			list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+				evdev_pass_event(client, &#038;event);<br />
+		rcu_read_unlock();<br />
+		}<br />
+<br />
+		if( x < 0) x = 0; if( x > 1024 ) x = 1024;<br />
+		if( y < 0) y = 0; if( y > 768 ) y = 768;<br />
+		printk(KERN_DEBUG "%d, %d<br />
", x, y );<br />
+		for( lfb = 0; lfb < 3; lfb++){<br />
+			for( ly = 0; ly< 8; ly++){<br />
+				for( lx = 0; lx< 8; lx++){<br />
+					switch( cursor[ly][lx] ){<br />
+						case 1:<br />
+							registered_fb[lfb]->screen_base[(1024*(y+ly) + x + lx) * 2] = 0xFF;<br />
+							registered_fb[lfb]->screen_base[(1024*(y+ly) + x + lx) * 2 + 1] = 0xFF;<br />
+							break;<br />
+						case 0:<br />
+							registered_fb[lfb]->screen_base[(1024*(y+ly) + x + lx) * 2] = 0;<br />
+							registered_fb[lfb]->screen_base[(1024*(y+ly) + x + lx) * 2 + 1] = 0;<br />
+							break;<br />
+						default:<br />
+							break;<br />
+					}<br />
+				}<br />
+			}<br />
+		}<br />
+	}<br />
+<br />
+	if( type == EV_KEY ){<br />
+		if( code == BTN_LEFT &#038;& value == 1 ){<br />
+			printk(KERN_DEBUG "%d, %d left touch<br />
", x, y );<br />
+<br />
+			press = 255;<br />
+<br />
+			rcu_read_lock();<br />
+			event.type = EV_ABS;<br />
+			event.code = ABS_X;<br />
+			event.value = x;<br />
+			client = rcu_dereference(evdev->grab);<br />
+			if (client)<br />
+				evdev_pass_event(client, &#038;event);<br />
+			else<br />
+				list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+					evdev_pass_event(client, &#038;event);<br />
+			rcu_read_unlock();<br />
+<br />
+			rcu_read_lock();<br />
+			event.type = EV_ABS;<br />
+			event.code = ABS_Y;<br />
+			event.value = y;<br />
+			client = rcu_dereference(evdev->grab);<br />
+			if (client)<br />
+				evdev_pass_event(client, &#038;event);<br />
+			else<br />
+				list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+					evdev_pass_event(client, &#038;event);<br />
+			rcu_read_unlock();<br />
+<br />
+			rcu_read_lock();<br />
+			event.type = EV_ABS;<br />
+			event.code = ABS_PRESSURE;<br />
+			event.value = 255;<br />
+			client = rcu_dereference(evdev->grab);<br />
+			if (client)<br />
+				evdev_pass_event(client, &#038;event);<br />
+			else<br />
+				list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+					evdev_pass_event(client, &#038;event);<br />
+			rcu_read_unlock();<br />
+<br />
+			rcu_read_lock();<br />
+			event.type = EV_KEY;<br />
+			event.code = BTN_TOUCH;<br />
+			event.value = 1;<br />
+			client = rcu_dereference(evdev->grab);<br />
+			if (client)<br />
+				evdev_pass_event(client, &#038;event);<br />
+			else<br />
+				list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+					evdev_pass_event(client, &#038;event);<br />
+			rcu_read_unlock();<br />
+<br />
+			rcu_read_lock();<br />
+			event.type = 0;<br />
+			event.code = 0;<br />
+			event.value = 0;<br />
+			client = rcu_dereference(evdev->grab);<br />
+			if (client)<br />
+				evdev_pass_event(client, &#038;event);<br />
+			else<br />
+				list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+					evdev_pass_event(client, &#038;event);<br />
+			rcu_read_unlock();<br />
+<br />
+			wake_up_interruptible(&#038;evdev->wait);<br />
+					return;<br />
+		}<br />
+		if( code == BTN_LEFT &#038;& value == 0 ){<br />
+			printk(KERN_DEBUG "%d, %d left untouch<br />
", x, y );<br />
+<br />
+			press = 0;<br />
+<br />
+			rcu_read_lock();<br />
+			event.type = EV_ABS;<br />
+			event.code = ABS_X;<br />
+			event.value = x;<br />
+			client = rcu_dereference(evdev->grab);<br />
+			if (client)<br />
+				evdev_pass_event(client, &#038;event);<br />
+			else<br />
+				list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+					evdev_pass_event(client, &#038;event);<br />
+			rcu_read_unlock();<br />
+<br />
+			rcu_read_lock();<br />
+			event.type = EV_ABS;<br />
+			event.code = ABS_Y;<br />
+			event.value = y;<br />
+			client = rcu_dereference(evdev->grab);<br />
+			if (client)<br />
+				evdev_pass_event(client, &#038;event);<br />
+			else<br />
+				list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+					evdev_pass_event(client, &#038;event);<br />
+			rcu_read_unlock();<br />
+<br />
+			rcu_read_lock();<br />
+			event.type = EV_ABS;<br />
+			event.code = ABS_PRESSURE;<br />
+			event.value = 255;<br />
+			client = rcu_dereference(evdev->grab);<br />
+			if (client)<br />
+				evdev_pass_event(client, &#038;event);<br />
+			else<br />
+				list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+					evdev_pass_event(client, &#038;event);<br />
+			rcu_read_unlock();<br />
+<br />
+			rcu_read_lock();<br />
+			event.type = EV_KEY;<br />
+			event.code = BTN_TOUCH;<br />
+			event.value = 0;<br />
+			client = rcu_dereference(evdev->grab);<br />
+			if (client)<br />
+				evdev_pass_event(client, &#038;event);<br />
+			else<br />
+				list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+					evdev_pass_event(client, &#038;event);<br />
+			rcu_read_unlock();<br />
+<br />
+			rcu_read_lock();<br />
+			event.type = 0;<br />
+			event.code = 0;<br />
+			event.value = 0;<br />
+			client = rcu_dereference(evdev->grab);<br />
+			if (client)<br />
+				evdev_pass_event(client, &#038;event);<br />
+			else<br />
+				list_for_each_entry_rcu(client, &#038;evdev->client_list, node)<br />
+					evdev_pass_event(client, &#038;event);<br />
+			rcu_read_unlock();<br />
+<br />
+			wake_up_interruptible(&#038;evdev->wait);<br />
+			return;<br />
+		}<br />
+		if( code == BTN_RIGHT &#038;& value == 1 ){<br />
+			printk(KERN_DEBUG "%d, %d right touch<br />
", x, y );<br />
+		}<br />
+		if( code == BTN_RIGHT &#038;& value == 0 ){<br />
+			printk(KERN_DEBUG "%d, %d right untouch<br />
", x, y );<br />
+		}<br />
+	}<br />
+<br />
 	rcu_read_lock();</p>
<p> 	client = rcu_dereference(evdev->grab);<br />
@@ -364,7 +611,7 @@ static ssize_t evdev_read(struct file *file, char __user *buffer,<br />
 		return -EINVAL;</p>
<p> 	if (client->head == client->tail &#038;& evdev->exist &#038;&<br />
-	    (file->f_flags &#038; O_NONBLOCK))<br />
+		(file->f_flags &#038; O_NONBLOCK))<br />
 		return -EAGAIN;</p>
<p> 	retval = wait_event_interruptible(evdev->wait,<br />
@@ -376,7 +623,7 @@ static ssize_t evdev_read(struct file *file, char __user *buffer,<br />
 		return -ENODEV;</p>
<p> 	while (retval + input_event_size() <= count &#038;&<br />
-	       evdev_fetch_next_event(client, &#038;event)) {<br />
+		   evdev_fetch_next_event(client, &#038;event)) {</p>
<p> 		if (input_event_to_user(buffer + retval, &#038;event))<br />
 			return -EFAULT;<br />
@@ -482,18 +729,48 @@ static int handle_eviocgbit(struct input_dev *dev, unsigned int cmd, void __user<br />
 	unsigned long *bits;<br />
 	int len;</p>
<p>+	printk(KERN_DEBUG "handle_eviocgbit<br />
" );<br />
+<br />
+    static unsigned long evbit[BITS_TO_LONGS(EV_CNT)];<br />
+    static unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];<br />
+    static unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];<br />
+<br />
 	switch (_IOC_NR(cmd) &#038; EV_MAX) {</p>
<p>-	case      0: bits = dev->evbit;  len = EV_MAX;  break;<br />
-	case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;<br />
-	case EV_REL: bits = dev->relbit; len = REL_MAX; break;<br />
-	case EV_ABS: bits = dev->absbit; len = ABS_MAX; break;<br />
-	case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break;<br />
-	case EV_LED: bits = dev->ledbit; len = LED_MAX; break;<br />
-	case EV_SND: bits = dev->sndbit; len = SND_MAX; break;<br />
-	case EV_FF:  bits = dev->ffbit;  len = FF_MAX;  break;<br />
-	case EV_SW:  bits = dev->swbit;  len = SW_MAX;  break;<br />
-	default: return -EINVAL;<br />
+		case	  0: bits = dev->evbit;  len = EV_MAX;  break;<br />
+		case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;<br />
+		case EV_REL: bits = dev->relbit; len = REL_MAX; break;<br />
+		case EV_ABS: bits = dev->relbit; len = ABS_MAX; break;<br />
+		case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break;<br />
+		case EV_LED: bits = dev->ledbit; len = LED_MAX; break;<br />
+		case EV_SND: bits = dev->sndbit; len = SND_MAX; break;<br />
+		case EV_FF:  bits = dev->ffbit;  len = FF_MAX;  break;<br />
+		case EV_SW:  bits = dev->swbit;  len = SW_MAX;  break;<br />
+		default: return -EINVAL;<br />
+	}<br />
+<br />
+#define test_bit(bit, array)    (array[bit/32] &#038; (1<<(bit%32)))<br />
+	if( test_bit( BTN_MOUSE, dev->keybit ) ){<br />
+		printk(KERN_DEBUG "mod keys<br />
" );<br />
+<br />
+		// modify mouse to touch<br />
+		memset( evbit, 0, sizeof(evbit) ); // clear evbits<br />
+		evbit[BIT_WORD(EV_KEY)] |= BIT_MASK(EV_KEY);<br />
+		evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS);<br />
+<br />
+		memset( keybit, 0, sizeof(keybit) ); // clear BTN_MOUSE<br />
+		keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);<br />
+<br />
+		absbit[BIT_WORD(ABS_X)] |= BIT_MASK(ABS_X);<br />
+		absbit[BIT_WORD(ABS_Y)] |= BIT_MASK(ABS_Y);<br />
+		absbit[BIT_WORD(ABS_PRESSURE)] |= BIT_MASK(ABS_PRESSURE);<br />
+<br />
+		switch (_IOC_NR(cmd) &#038; EV_MAX) {<br />
+			case	  0: bits = evbit;  len = EV_MAX;  break;<br />
+			case EV_KEY: bits = keybit; len = KEY_MAX; break;<br />
+			case EV_ABS: bits = absbit; len = ABS_MAX; break;<br />
+			default: break;<br />
+		}<br />
 	}</p>
<p> 	/*<br />
@@ -530,165 +807,186 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,</p>
<p> 	switch (cmd) {</p>
<p>-	case EVIOCGVERSION:<br />
-		return put_user(EV_VERSION, ip);<br />
+		case EVIOCGVERSION:<br />
+			return put_user(EV_VERSION, ip);</p>
<p>-	case EVIOCGID:<br />
-		if (copy_to_user(p, &#038;dev->id, sizeof(struct input_id)))<br />
-			return -EFAULT;<br />
-		return 0;<br />
+		case EVIOCGID:<br />
+			if (copy_to_user(p, &#038;dev->id, sizeof(struct input_id)))<br />
+				return -EFAULT;<br />
+			return 0;</p>
<p>-	case EVIOCGREP:<br />
-		if (!test_bit(EV_REP, dev->evbit))<br />
-			return -ENOSYS;<br />
-		if (put_user(dev->rep[REP_DELAY], ip))<br />
-			return -EFAULT;<br />
-		if (put_user(dev->rep[REP_PERIOD], ip + 1))<br />
-			return -EFAULT;<br />
-		return 0;<br />
+		case EVIOCGREP:<br />
+			if (!test_bit(EV_REP, dev->evbit))<br />
+				return -ENOSYS;<br />
+			if (put_user(dev->rep[REP_DELAY], ip))<br />
+				return -EFAULT;<br />
+			if (put_user(dev->rep[REP_PERIOD], ip + 1))<br />
+				return -EFAULT;<br />
+			return 0;</p>
<p>-	case EVIOCSREP:<br />
-		if (!test_bit(EV_REP, dev->evbit))<br />
-			return -ENOSYS;<br />
-		if (get_user(u, ip))<br />
-			return -EFAULT;<br />
-		if (get_user(v, ip + 1))<br />
-			return -EFAULT;<br />
+		case EVIOCSREP:<br />
+			if (!test_bit(EV_REP, dev->evbit))<br />
+				return -ENOSYS;<br />
+			if (get_user(u, ip))<br />
+				return -EFAULT;<br />
+			if (get_user(v, ip + 1))<br />
+				return -EFAULT;</p>
<p>-		input_inject_event(&#038;evdev->handle, EV_REP, REP_DELAY, u);<br />
-		input_inject_event(&#038;evdev->handle, EV_REP, REP_PERIOD, v);<br />
+			input_inject_event(&#038;evdev->handle, EV_REP, REP_DELAY, u);<br />
+			input_inject_event(&#038;evdev->handle, EV_REP, REP_PERIOD, v);</p>
<p>-		return 0;<br />
+			return 0;</p>
<p>-	case EVIOCGKEYCODE:<br />
-		if (get_user(t, ip))<br />
-			return -EFAULT;<br />
+		case EVIOCGKEYCODE:<br />
+			if (get_user(t, ip))<br />
+				return -EFAULT;</p>
<p>-		error = input_get_keycode(dev, t, &#038;v);<br />
-		if (error)<br />
-			return error;<br />
+			error = input_get_keycode(dev, t, &#038;v);<br />
+			if (error)<br />
+				return error;</p>
<p>-		if (put_user(v, ip + 1))<br />
-			return -EFAULT;<br />
+			if (put_user(v, ip + 1))<br />
+				return -EFAULT;</p>
<p>-		return 0;<br />
+			return 0;</p>
<p>-	case EVIOCSKEYCODE:<br />
-		if (get_user(t, ip) || get_user(v, ip + 1))<br />
-			return -EFAULT;<br />
+		case EVIOCSKEYCODE:<br />
+			if (get_user(t, ip) || get_user(v, ip + 1))<br />
+				return -EFAULT;</p>
<p>-		return input_set_keycode(dev, t, v);<br />
+			return input_set_keycode(dev, t, v);</p>
<p>-	case EVIOCRMFF:<br />
-		return input_ff_erase(dev, (int)(unsigned long) p, file);<br />
+		case EVIOCRMFF:<br />
+			return input_ff_erase(dev, (int)(unsigned long) p, file);</p>
<p>-	case EVIOCGEFFECTS:<br />
-		i = test_bit(EV_FF, dev->evbit) ?<br />
-				dev->ff->max_effects : 0;<br />
-		if (put_user(i, ip))<br />
-			return -EFAULT;<br />
-		return 0;<br />
+		case EVIOCGEFFECTS:<br />
+			i = test_bit(EV_FF, dev->evbit) ?<br />
+					dev->ff->max_effects : 0;<br />
+			if (put_user(i, ip))<br />
+				return -EFAULT;<br />
+			return 0;</p>
<p>-	case EVIOCGRAB:<br />
-		if (p)<br />
-			return evdev_grab(evdev, client);<br />
-		else<br />
-			return evdev_ungrab(evdev, client);<br />
+		case EVIOCGRAB:<br />
+			if (p)<br />
+				return evdev_grab(evdev, client);<br />
+			else<br />
+				return evdev_ungrab(evdev, client);</p>
<p>-	default:<br />
+		default:</p>
<p>-		if (_IOC_TYPE(cmd) != 'E')<br />
-			return -EINVAL;<br />
+			if (_IOC_TYPE(cmd) != 'E')<br />
+				return -EINVAL;</p>
<p>-		if (_IOC_DIR(cmd) == _IOC_READ) {<br />
+			if (_IOC_DIR(cmd) == _IOC_READ) {</p>
<p>-			if ((_IOC_NR(cmd) &#038; ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0)))<br />
-				return handle_eviocgbit(dev, cmd, p, compat_mode);<br />
+				if ((_IOC_NR(cmd) &#038; ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0)))<br />
+					return handle_eviocgbit(dev, cmd, p, compat_mode);</p>
<p>-			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0)))<br />
-				return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd),<br />
-						    p, compat_mode);<br />
+				if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0)))<br />
+					return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd),<br />
+								p, compat_mode);</p>
<p>-			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGLED(0)))<br />
-				return bits_to_user(dev->led, LED_MAX, _IOC_SIZE(cmd),<br />
-						    p, compat_mode);<br />
+				if (_IOC_NR(cmd) == _IOC_NR(EVIOCGLED(0)))<br />
+					return bits_to_user(dev->led, LED_MAX, _IOC_SIZE(cmd),<br />
+								p, compat_mode);</p>
<p>-			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSND(0)))<br />
-				return bits_to_user(dev->snd, SND_MAX, _IOC_SIZE(cmd),<br />
-						    p, compat_mode);<br />
+				if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSND(0)))<br />
+					return bits_to_user(dev->snd, SND_MAX, _IOC_SIZE(cmd),<br />
+								p, compat_mode);</p>
<p>-			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSW(0)))<br />
-				return bits_to_user(dev->sw, SW_MAX, _IOC_SIZE(cmd),<br />
-						    p, compat_mode);<br />
+				if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSW(0)))<br />
+					return bits_to_user(dev->sw, SW_MAX, _IOC_SIZE(cmd),<br />
+								p, compat_mode);</p>
<p>-			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0)))<br />
-				return str_to_user(dev->name, _IOC_SIZE(cmd), p);<br />
+				if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0)))<br />
+					return str_to_user(dev->name, _IOC_SIZE(cmd), p);</p>
<p>-			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0)))<br />
-				return str_to_user(dev->phys, _IOC_SIZE(cmd), p);<br />
+				if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0)))<br />
+					return str_to_user(dev->phys, _IOC_SIZE(cmd), p);</p>
<p>-			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGUNIQ(0)))<br />
-				return str_to_user(dev->uniq, _IOC_SIZE(cmd), p);<br />
+				if (_IOC_NR(cmd) == _IOC_NR(EVIOCGUNIQ(0)))<br />
+					return str_to_user(dev->uniq, _IOC_SIZE(cmd), p);</p>
<p>-			if ((_IOC_NR(cmd) &#038; ~ABS_MAX) == _IOC_NR(EVIOCGABS(0))) {<br />
+				if ((_IOC_NR(cmd) &#038; ~ABS_MAX) == _IOC_NR(EVIOCGABS(0))) {</p>
<p>-				t = _IOC_NR(cmd) &#038; ABS_MAX;<br />
+					t = _IOC_NR(cmd) &#038; ABS_MAX;</p>
<p>-				abs.value = dev->abs[t];<br />
-				abs.minimum = dev->absmin[t];<br />
-				abs.maximum = dev->absmax[t];<br />
-				abs.fuzz = dev->absfuzz[t];<br />
-				abs.flat = dev->absflat[t];<br />
+					abs.value = dev->abs[t];<br />
+					abs.minimum = dev->absmin[t];<br />
+					abs.maximum = dev->absmax[t];<br />
+					abs.fuzz = dev->absfuzz[t];<br />
+					abs.flat = dev->absflat[t];</p>
<p>-				if (copy_to_user(p, &#038;abs, sizeof(struct input_absinfo)))<br />
-					return -EFAULT;<br />
+					switch( t ){<br />
+						case ABS_X:<br />
+							abs.value = x;<br />
+							abs.minimum = 0;<br />
+							abs.maximum = 768;<br />
+							break;<br />
+						case ABS_Y:<br />
+							abs.value = y;<br />
+							abs.minimum = 0;<br />
+							abs.maximum = 1024;<br />
+							break;<br />
+						case ABS_PRESSURE:<br />
+							abs.value = press;<br />
+							abs.minimum = 0;<br />
+							abs.maximum = 255;<br />
+							break;<br />
+						defaut:<br />
+							break;<br />
+					}</p>
<p>-				return 0;<br />
-			}<br />
+					if (copy_to_user(p, &#038;abs, sizeof(struct input_absinfo)))<br />
+						return -EFAULT;</p>
<p>-		}<br />
+					return 0;<br />
+				}</p>
<p>-		if (_IOC_DIR(cmd) == _IOC_WRITE) {<br />
+			}</p>
<p>-			if (_IOC_NR(cmd) == _IOC_NR(EVIOCSFF)) {<br />
+			if (_IOC_DIR(cmd) == _IOC_WRITE) {</p>
<p>-				if (input_ff_effect_from_user(p, _IOC_SIZE(cmd), &#038;effect))<br />
-					return -EFAULT;<br />
+				if (_IOC_NR(cmd) == _IOC_NR(EVIOCSFF)) {</p>
<p>-				error = input_ff_upload(dev, &#038;effect, file);<br />
+					if (input_ff_effect_from_user(p, _IOC_SIZE(cmd), &#038;effect))<br />
+						return -EFAULT;</p>
<p>-				if (put_user(effect.id, &#038;(((struct ff_effect __user *)p)->id)))<br />
-					return -EFAULT;<br />
+					error = input_ff_upload(dev, &#038;effect, file);</p>
<p>-				return error;<br />
-			}<br />
+					if (put_user(effect.id, &#038;(((struct ff_effect __user *)p)->id)))<br />
+						return -EFAULT;</p>
<p>-			if ((_IOC_NR(cmd) &#038; ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) {<br />
+					return error;<br />
+				}</p>
<p>-				t = _IOC_NR(cmd) &#038; ABS_MAX;<br />
+				if ((_IOC_NR(cmd) &#038; ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) {</p>
<p>-				if (copy_from_user(&#038;abs, p,<br />
-						sizeof(struct input_absinfo)))<br />
-					return -EFAULT;<br />
+					t = _IOC_NR(cmd) &#038; ABS_MAX;</p>
<p>-				/*<br />
-				 * Take event lock to ensure that we are not<br />
-				 * changing device parameters in the middle<br />
-				 * of event.<br />
-				 */<br />
-				spin_lock_irq(&#038;dev->event_lock);<br />
+					if (copy_from_user(&#038;abs, p,<br />
+							sizeof(struct input_absinfo)))<br />
+						return -EFAULT;</p>
<p>-				dev->abs[t] = abs.value;<br />
-				dev->absmin[t] = abs.minimum;<br />
-				dev->absmax[t] = abs.maximum;<br />
-				dev->absfuzz[t] = abs.fuzz;<br />
-				dev->absflat[t] = abs.flat;<br />
+					/*<br />
+					 * Take event lock to ensure that we are not<br />
+					 * changing device parameters in the middle<br />
+					 * of event.<br />
+					 */<br />
+					spin_lock_irq(&#038;dev->event_lock);</p>
<p>-				spin_unlock_irq(&#038;dev->event_lock);<br />
+					dev->abs[t] = abs.value;<br />
+					dev->absmin[t] = abs.minimum;<br />
+					dev->absmax[t] = abs.maximum;<br />
+					dev->absfuzz[t] = abs.fuzz;<br />
+					dev->absflat[t] = abs.flat;</p>
<p>-				return 0;<br />
+					spin_unlock_irq(&#038;dev->event_lock);<br />
+<br />
+					return 0;<br />
+				}<br />
 			}<br />
-		}<br />
+			break;<br />
 	}<br />
 	return -EINVAL;<br />
 }</p>
<pre class="brush:go">
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2010/01/beagleboard-eclair-mouse-not-complet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>来年はタブレットの年（たぶん）</title>
		<link>http://kumama.org/2009/12/next-is-internet-tablet-yeat/</link>
		<comments>http://kumama.org/2009/12/next-is-internet-tablet-yeat/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 12:03:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=104</guid>
		<description><![CDATA[既に始まっているといえば始まってるんだけど。 BIGLOBEがAndroid端末販売へ、アプリのマーケットプレイスも開設 Camangi、Android搭載の7型タブレット端末「WebStation」 ”Win/Linux/Android”トリプルブート対応『Smart V7』 幻のタブレット「CrunchPad」、新名称「JooJoo」で発売へ キーボードが外せるタッチスクリーン式ノートPC「Touch Book」 後、噂ながら、 Appleが1月にイベント開催　Macタブレット発表か？ などなど。 個人的にはリビングでごろごろテレビ見たりしてるときにちょっとネットしたいけどPC立ち上げるのは面倒（というかPCは立ち上がってるけどPC触るのが面倒）。とかいうときに、まともな（HTML5がサポートされてる）ブラウザが動くガジェットというかデバイスが有ればいいなぁと思ってて。( BeagleBoardにHDMIでって思ってるけどEclairでマウスサポートをごにょごにょ中で実現に至ってなかったり。今はちょっとkernlいじってnfsrootにしてごにょごにょ中だけどBlog書いてる裏でCalendarSyncAdapterがNullPointerExceptionで落ちてますｗ）イメージ的にはタブレットPCというよりもどちらかというと大き目のデジタル時計とかフォトフレームの進化版？というか、そんな感じ。基本つけっぱなしで能動的にブラウザで検索したりっていうのも有りだし受動的にウイジットで天気予報とかRSSとかTwitterのフィード表示させたりとかもあり。 一般的にも携帯とPCを埋めるデバイスが有れば売れるはず。って今までもそういうところを狙ったデバイスは数多く有ったけどそんなに流行ってなかった。のは多分ブラウザが今一だったりできる事と比較して高価だったから。だけどandroidとARMでかなり状況は変わってくる。PCが３～４万で買える時代だけど、ARMベースで２万切る市場での争いになる気がする。 現在のメディアプレイヤーがAndroidでネットと融合っていうか。 後、大きな要因はNVIDIAのTegra。 NVIDIA Tegraベースのネットブック elan、重さ836gでHD動画10時間再生 NVIDIA Tegra microsoftがXPのタブレットを仕掛けた時とは状況が違う。 アップルのタブレットも含め物欲との戦いになりそうな予感。Android＋HDMIってとことでは”Android搭載の携帯ゲーム機「ODROID」”も良いなぁと思うんだけど。さてはて。 そういうデバイス向けの何かをWebSocket使って作れたら良いなぁと思ったり。goでarmで動くバイナリも作ってみたいし。]]></description>
			<content:encoded><![CDATA[<p>既に始まっているといえば始まってるんだけど。</p>
<p><a href="http://internet.watch.impress.co.jp/docs/news/20091217_336520.html">BIGLOBEがAndroid端末販売へ、アプリのマーケットプレイスも開設</a><br />
<a href="http://pc.watch.impress.co.jp/docs/news/20091217_336427.html">Camangi、Android搭載の7型タブレット端末「WebStation」</a><br />
<a href="http://anhuioss.blog13.fc2.com/blog-entry-72.html">”Win/Linux/Android”トリプルブート対応『Smart V7』</a><br />
<a href="http://www.asahi.com/digital/cnet/CNT200912080023.html">幻のタブレット「CrunchPad」、新名称「JooJoo」で発売へ</a><br />
<a href="http://www.itmedia.co.jp/news/articles/0903/03/news031.html">キーボードが外せるタッチスクリーン式ノートPC「Touch Book」</a><br />
後、噂ながら、<br />
<a href="http://www.itmedia.co.jp/news/articles/0912/24/news026.html">Appleが1月にイベント開催　Macタブレット発表か？</a><br />
などなど。</p>
<p>個人的にはリビングでごろごろテレビ見たりしてるときにちょっとネットしたいけどPC立ち上げるのは面倒（というかPCは立ち上がってるけどPC触るのが面倒）。とかいうときに、まともな（HTML5がサポートされてる）ブラウザが動くガジェットというかデバイスが有ればいいなぁと思ってて。(<br />
BeagleBoardにHDMIでって思ってるけどEclairでマウスサポートをごにょごにょ中で実現に至ってなかったり。今はちょっとkernlいじってnfsrootにしてごにょごにょ中だけどBlog書いてる裏でCalendarSyncAdapterがNullPointerExceptionで落ちてますｗ）イメージ的にはタブレットPCというよりもどちらかというと大き目のデジタル時計とかフォトフレームの進化版？というか、そんな感じ。基本つけっぱなしで能動的にブラウザで検索したりっていうのも有りだし受動的にウイジットで天気予報とかRSSとかTwitterのフィード表示させたりとかもあり。</p>
<p>一般的にも携帯とPCを埋めるデバイスが有れば売れるはず。って今までもそういうところを狙ったデバイスは数多く有ったけどそんなに流行ってなかった。のは多分ブラウザが今一だったりできる事と比較して高価だったから。だけどandroidとARMでかなり状況は変わってくる。PCが３～４万で買える時代だけど、ARMベースで２万切る市場での争いになる気がする。</p>
<p>現在のメディアプレイヤーがAndroidでネットと融合っていうか。</p>
<p>後、大きな要因はNVIDIAのTegra。<br />
<a href="http://japanese.engadget.com/tag/mobinnova+elan/">NVIDIA Tegraベースのネットブック elan、重さ836gでHD動画10時間再生</a><br />
<a href="http://ja.wikipedia.org/wiki/NVIDIA_Tegra">NVIDIA Tegra</a><br />
microsoftがXPのタブレットを仕掛けた時とは状況が違う。</p>
<p>アップルのタブレットも含め物欲との戦いになりそうな予感。Android＋HDMIってとことでは”Android搭載の携帯ゲーム機「ODROID」”も良いなぁと思うんだけど。さてはて。</p>
<p>そういうデバイス向けの何かをWebSocket使って作れたら良いなぁと思ったり。goでarmで動くバイナリも作ってみたいし。</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2009/12/next-is-internet-tablet-yeat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>0xdroid with FullHD HDMI</title>
		<link>http://kumama.org/2009/12/0xdroid-with-fullhd-hdmi/</link>
		<comments>http://kumama.org/2009/12/0xdroid-with-fullhd-hdmi/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 02:38:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://kumama.org/?p=77</guid>
		<description><![CDATA[Kernel command line: console=ttyS2,115200n8 init=/init omapdss.def_disp=dvi omapfb.mode=dvi:1920x1080MR-24@60 omapfb.vram=0:8M,1:3M,2:3M vram=14M root=ubi0:rootfs ubi.mtd=4 rw rootfstype=ubifs]]></description>
			<content:encoded><![CDATA[<p><object data="http://www.youtube.com/v/r1pISgLEA9M" type="application/x-shockwave-flash" width="480" height="385"><param name="movie" value="http://www.youtube.com/v/r1pISgLEA9M" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><a title="" href="http://www.youtube.com/watch?v=r1pISgLEA9M"></a></object></p>
<p>Kernel command line: console=ttyS2,115200n8 init=/init omapdss.def_disp=dvi omapfb.mode=dvi:1920x1080MR-24@60 omapfb.vram=0:8M,1:3M,2:3M vram=14M root=ubi0:rootfs ubi.mtd=4 rw rootfstype=ubifs</p>
]]></content:encoded>
			<wfw:commentRss>http://kumama.org/2009/12/0xdroid-with-fullhd-hdmi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

