小松鼠嚇了一跳,有了魔法眼鏡後,這世界看起來完全不一樣了

顯示具有 android 標籤的文章。 顯示所有文章
顯示具有 android 標籤的文章。 顯示所有文章

2012年9月6日 星期四

窮人的 3D 全像 : 使用 Android 手機



這是一個簡單的實做,利用隨手可得 Android Phone 來製作 Swept-volume display。顯示的是一個立方體,其中兩面顯示英文字母,一面顯示黃色,其他幾面是空心的。因為手機螢幕及錄影機的 framerate 的緣故,錄得不是很好,(有點類似錄 CRT 電視的情況),實際上的效果要好些。 其他還有弄一些單純的方塊,方塊中加個圓管,十字架,方塊中一個小方塊,但就沒有錄了。

 視覺暫留顯示(POV Display) 不罕見,如下面的影片

 

 Volume Display 最常見的就是 Led Cube,




 上面兩個都是常見的 DIY project,Swept-volume display 差不多就是上面兩個東西的混合。
用手機的好處就是 X,Y 的解析度是 480x800,不是 LED Cube 的 8x8 能比的。做 POV Display,也不用額外的硬體,單純用人力揮動配合手機的 accelerometer 即可。
但 Z 軸的解析度就很差。假設手一秒來回揮動三次,一般手機螢幕更新率是 60Hz,那表示 Z 方向從頭到尾移動一次只花了 1/6 秒,畫面只更新了 10 次。外加一些誤差(手的誤差和 sensor 的更新率),去頭去尾之後,Z 軸的解析度也只有 6~8。
當然你也可以手揮動得慢一點,但是太慢了就無法讓眼睛產生視覺暫留。
總之,暫時無法弄出 Leia 公主。修改之後應該還可以再擠出一些 Z 軸的 frame 出來。

更新:新影片,攝影技巧好得多。比較有信心能弄出 Leia 公主或初音了。

2011年12月5日 星期一

Acer Stream Kernel on Github

https://github.com/tjwei/acer-stream-minimal-kernel

時間回到我寫 Porting custom rom to Acer Stream 的時候,由 Acer 的官方 Stream 的 kernel source 來看, Acer 的 kernel 像是從 msm-eclair_chocolate 改來的,但不確定是哪個 commit 改來的。我大致上比較了一下,看起和 msm-57e7a9f 差不多,外加一些 patch。
所以如果你只是要自行編譯 stream 的 kernel,只需抓回並解開  msm-57e7a9f,然後把 acer 的 source 覆蓋上去,然後執行
make acer-q8k-a3-dvt_defconfig && make -j12 即可。
當時 msm-eclair_chocolate 最新的 master 版本是 eea0918,我試著把 57e7a9f 和 acer 官方 kernel 的差異補回 eea0918,功能似乎完全也正常。現在放在 github 上的 fullpatch 這個 branch 上。
由於這次的成功,所以我如法泡製,修改某 msm-froyo 版本。但由於版本差異過大,無法成功開機。

2011年9月21日 星期三

Porting custom rom to Acer Stream

No download available yet.
以前剛接觸 Linux 時,興沖沖的重新編譯完 kernel,往往會發生開機只出現 Li 兩個字的慘劇 (原來應該是顯示 Lilo 後跑出一堆開機訊息,但是連 Lilo 四個字母都跑不完,機器就停在那裡了。)
由於 Acer Stream 都沒人弄 rom,只好自己弄。

一開始傻傻的編譯了一份 AOSP 的 system.img,想說至少可以開機吧,沒想到頗類似當年的 Li。所有程式無法執行,gdbserver 是跑起來了,只是跑起來才發現我是用 adb shell 進去而不是 ssh,網路根本沒跑起來。
還好現在網路發達,大部分的問題網路上都找得到答案。
當然找答案也是要有點方向。

一開始經由官方版本和AOSP的 linker/bin/lib 等等的組合,外加readelf 之後發現官方版本和自己編出的 linker 的 entry point 不同。 大致上猜出是 shared library 放置的記憶體位置問題。

搜尋了一下,發現這是 android prelink 以及 VMSPLIT_2G 的問題。所以這方面把 prelink map 平移一下即可。另外我也 complie 了一份 VMSPLIT_2G=n 的 kernel。
再 來就是 RGBA8888 的問題。 Stream 的 kernel 回報不正確的解析度,而且固定為 32bit 色彩 RGBA8888。32bit 用 #define 寫死了,無法 ioctl 設定。因此把這些 #define 改了,重編成 RGB565 的格式。
最後就是 Acer 的 kernel 大概因為用 zip 壓檔的緣故,很多檔案不見了。Linux 的 kernel 中有些檔案,檔名僅僅只有大小寫不同,但卻是兩個不同的檔。碰到這種除了大小寫外完全相同的檔名,Acer 用的 zip 就會只挑其中一個放入 zip 檔中。所以只好從其他地方的 source 補回來。

這樣之後,只要選對 kernel,很多 2.2 的 custom rom 都能開機到 GUI。我試過了
AOSP (full_passion, 改 prelink map),
liquid metal 官方 2.2
liquid miui 
malez recovery (正常顯示)

基本上都沒怎麼改就能跑 GUI,不過當然硬體也都不太靈。

也試了 liquid metal 的 2.3.3 leak,不過不成功。
大概 kernel 至少要弄到 2.6.34 才行。

2011年9月17日 星期六

ClockworkMod Recovery for Acer Stream

Download here (Warning! Very experimental. Use at your own risk.)

Install:
Use fastboot (or Rom Manager?) to flash the recovery image. See ClockworkMod Recovery for more information.


Acer Stream 這隻手機,就像 Kindle DX 一樣,出來時也都算風風光光,也一度是名義上的旗艦機種,但因為銷售不理想,很快都被原廠打入冷宮,停止更新。現在完全找不到 Acer Stream 的 Custom Rom,所以,只好自力救濟一下了。由於我對 Android custom rom 幾乎毫無經驗,所以先從 Recovery image 開始。
Acer Stream 的特點:
  • image header 是 4K
  • Framebuffer 的 bits per pixel 似乎固定為 32。VSCREENINFO 傳回的 xres 和 yres 不可靠,預設是 1280x800, 但其實 lcd 的解析度是 480x800。OS_RESOLUTION 的傳回值才是對的。framebuffer 的 第二頁的起始值固定在 1280x800x4 bytes 的位置。大部分 recovery image 畫面會壞掉的原因在此。我猜大概要支援 HDMI 的緣故。
  • /data 不是 mtd@userdata 而是 mmcblk1p1 。
原本打算用 malez recovery 來改,但發現好像沒有提供 source。所以抓了野火機的 ClockworkMod Recovery Image,並且抓下 source 重新編譯 recovery。(主要的困難是 kernel.org 被駭,花了一點時間才抓到完整的 source。)
我只修改了 graphics.c ,修改的部份如下:
    if (ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) {
        perror("failed to get fb0 info");
        close(fd);
        return -1;
    }
    // should use OS_RESOLUTION ioctl to get xres
    vi.xres=480;

    bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (bits == MAP_FAILED) {
        perror("failed to mmap framebuffer");
        close(fd);
        return -1;
    }

    fb->version = sizeof(*fb);
    fb->width = vi.xres;
    fb->height = vi.yres;
    fb->stride = vi.xres;
    fb->data = bits;
    fb->format = GGL_PIXEL_FORMAT_RGBX_8888;
    memset(fb->data, 0, vi.yres * vi.xres * 4);

    fb++;

    fb->version = sizeof(*fb);
    fb->width = vi.xres;
    fb->height = vi.yres;
    fb->stride = vi.xres;
    fb->data = (void*) (((unsigned) bits) + (fi.smem_len>>1));
    fb->format = GGL_PIXEL_FORMAT_RGBX_8888;
    memset(fb->data, 0, vi.yres * vi.xres * 4);

    return fd;
}

static void get_memory_surface(GGLSurface* ms) {
  ms->version = sizeof(*ms);
  ms->width = vi.xres;
  ms->height = vi.yres;
  ms->stride = vi.xres;
  ms->data = malloc(vi.xres * vi.yres * 4);
  ms->format = GGL_PIXEL_FORMAT_RGBX_8888;
}

static void set_active_framebuffer(unsigned n)
{
    if (n > 1) return;
    vi.yoffset = n * vi.yres;
    if (ioctl(gr_fb_fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
        printf("active fb swap failed %d\n", n);
    }
}

void gr_flip(void)
{
    GGLContext *gl = gr_context;

    /* swap front and back buffers */
    gr_active_fb = (gr_active_fb + 1) & 1;

    /* copy data from the in-memory surface to the buffer we're about
     * to make active. */
    memcpy(gr_framebuffer[gr_active_fb].data, gr_mem_surface.data,
           vi.xres * vi.yres * 4);

    /* inform the display driver */
    set_active_framebuffer(gr_active_fb);
}

2011年4月15日 星期五

成功的 Acer Stream 的 HDMI 測試程式

由於找到 mini HDMI 接線了,所以又繼續了之前的失敗的 Acer Stream HDMI 測試, 然後就...成功了。
程式完全沒有改,還是之前那個非常即興的程式,草率到按鈕名稱都用預設的 Button, Button2。程式 apk 放在這裡
但只要這樣就行了,將 Acer Stream 的 hdmi 線接上,然後按下 Button2 即可。

要注意幾點:
  • 電視螢幕解析度是 16:9,而手機螢幕是 480x800,這會造成問題。所以手機 Portrait mode 時,電視是在 landscape mode,手機變成 landscape,電視顯示會變成橫向。這對大部分的程式會造成問題。
  • 可以用 touch screen 和按鍵可以操作。但是Home 鍵似乎無效。
  • 大部分的播放器在 Fullsreen 播放時,會進入 landscape 模式,所以電視會變成橫向,而且畫面變得細長。
  • Youtube 直拿時,播放效果還不錯。Angry bird 可以進入,但是會變成橫向,很難玩。Abduction 2可以玩,而且因為是直拿的,所以正向。但上下長度太窄,看不容易玩。
  • 內建的瀏覽器似乎會當機。
  • 程式是利用 jni 呼叫 libnemoPlayer_hdmi_jni.so 切換的。 acer 有公佈 kernel source,裡面有 /dev/adi752x 的 driver,所以可以找到對應的 ioctl 參數。但寫 HDMItest 時我還沒有裝 ndk。
  • 要 Clone 螢幕,比較難,要改寫 adi752x 的 driver 才行。
  • 也許透過修改 AndroidManifest 來讓原本 landscape 的程式可以在 hdmi 上跑。
  • 如果有 open source 的 SFC,PSX 模擬器,配合 Wiimote ,應該可以讓 Acer Stream 在電視上玩老遊戲。
(更新)*****************
  • psx4droid 和 snesdroid 等模擬器,只要把 orientation 設定成 portrait mode ,即可玩。光這個就值回票價(?),所以其實這個小程式算是有點用途。
  • Youtube 直拿時可播,但解析度低。
  • Opera Mobile 似乎是可用的。
  • 電視最好設定成點對點映射模式。
  • 電源鍵也會失效。
  • 有時螢幕會消失(比方在 Launcher 中),連背景音樂也停住,似乎是機器會間歇性的卡住?

    2011年3月29日 星期二

    Android: 台北市公車站牌資訊 更新至 1.1

    這是台北市公車站牌資訊的更新版本。這個版本主要的更動在於增加了「起站->迄站」的資訊取代原來指顯示「去」「回」的簡陋資訊。另外對於排版做了變更,應該更容易查閱。
    下載位置於此

    2011年3月25日 星期五

    失敗的 Acer Stream 的 HDMI 測試程式

    Acer Stream 像是一些其他的 Android 機器一樣,有 HDMI 輸出,但使用特製(沒有公開?)的 API。只能用內建的 nemo player 來播放影片或者照片。
    因此,想試試寫程式來控制 HDMI。第一步是透過 nemo player 控制 HDMI 輸出, 寫程式倒是還好。但是完成後,就發現久未使用 mini HDMI 線,竟然找不到了。線到用時方恨少,無法進一步測試發展,程式放在這裡。有興趣的人可以試試看。理論上,第一個按鈕會測試是否接上 HDMI 線,傳回適當的值。第二個按鈕會嘗試open hdmi 裝置,然後 start 裝置。

    因為沒有測試,完全不知道連上電視後會發生什麼事情?

    雖然安裝時會需要同意使用很多權限設定,但這些只是我拷貝 nemo player 的權限設定, 因為我不知道是否會影響,並無木馬。需要 2.2 Rom 使用。
    ******
    更新: 成功的 Acer Stream 的 HDMI 測試程式

    Android: 台北市公車站牌資訊


    這是我寫的一個 android 程式,很小,功能也很簡單,就是輸入公車站牌名稱後,它會顯示該站牌的即時公車到站資訊。
    本來是自己拿來用,方便的小工具。昨天修了一下,包起來。小問題還不少,所以暫時不會放上 market。
    雖然 android 上已經有不少公車即時資訊的軟體了,比方 Voice Go 或 Taipei bus 之類的。但是我有時會有需要站牌到站資訊的需求,比方說我從捷運公館站想到萬芳醫院,這裡面有一堆公車都能搭,這時我就想一目了然的知道公車的到站資訊。
    雖然公館本來就有跑馬燈的到站資訊,但一來跑馬燈資訊稍縱即逝,無法一覽無遺。二來,不是所有的公車都名列其上。
    這時,這個軟體就派上用場了。
    更重要的是,這提供了一些資訊,幫助我判斷公車會停在哪個位置。曾在公館站人群中狹小的通道上追逐過公車的人,都知道我的意思吧!

    但除此之外,此程式別無功能。所以,主要是用來和其他的公車軟體互補搭配。

    要注意的幾點是:
    •  資料是由台北公車官方網站上抓下來的即時資訊原味呈現。而這個資訊其實有誤差。所以如何判斷,請自行斟酌。
    • 更新採手動更新。因為如前所言,資訊並不十分精確,並不需要時時盯著螢幕看。需要時按一下就可。
    • 去、回需要根據公車行駛路線而定,因為我沒有把資料庫包進去,所以需要使用者判斷。比方說欣欣客運的 236 是從深坑總站出發,然後到台北車站後在繞回來。所以從深坑到台北車站就是去,台北車站往深坑就是回。未來會處理這點。
    • 承前,之所只專注於單一功能,原因是這種東西需要靠後台提供資訊來源,似乎還是要和政府/廠商合作比較好。
    • 需 android 1.6 以上。 2.2 以上支援 app2sd。也支援 quick search box,但有點問題。



    ****更新至 1.1 版***
    增加了「起站->迄站」的資訊取代原來指顯示「去」「回」的簡陋資訊。另外對於排版做了變更。
    下載位置於此