OS News 介紹目前各OS動態的網站
以下這篇文章是我覺得蠻有趣的一個主題.
Linux Kernel Patch Works Around Microsoft's FAT Patents
看完這篇新聞的感想就是有時候寫程式除了架構盡量簡單以外, 還有其他因素的事情要考慮, 所以才會看到有些CODE明明可以寫的不用這樣繞一大圈, 可是卻偏偏這樣寫.
2009年7月5日 星期日
X86的開機流程
最近在網路上找到一篇介紹 X86開機流程介紹的文章
作者叫做 Gustavo 他不是 natvie writer 但是他所寫的文章卻非常的流暢, 下筆如行雲流水, 讓人感覺不出他不是美國人, 真的讓人很佩服(遠望...)
1. 介紹 目前 INTEL X86 架構的簡介文章, 淺顯易懂
Motherboard Chipsets and the Memory Map
2. X86開機後 CPU 如何設置, 如何跳到的位置 BIOS 然後就 MBR 然後 就..... (我承認我文筆不好)
How Computers Boot Up ( X86 )
當初看這兩篇是因為我想要了解 Linux kernel 開機的流程.. 因為搞不懂怎麼跳到 GRUB然後怎麼跳到 KERNEL 的那些步驟
3. GRUB的開機流程
Details of GRUB on the PC
最後 The Kernel Boot Process
我在看完這幾篇文章以後 對於X86的開機流程有了大致上的了解.. 感覺不賴~
作者叫做 Gustavo 他不是 natvie writer 但是他所寫的文章卻非常的流暢, 下筆如行雲流水, 讓人感覺不出他不是美國人, 真的讓人很佩服(遠望...)
1. 介紹 目前 INTEL X86 架構的簡介文章, 淺顯易懂
Motherboard Chipsets and the Memory Map
2. X86開機後 CPU 如何設置, 如何跳到的位置 BIOS 然後就 MBR 然後 就..... (我承認我文筆不好)
How Computers Boot Up ( X86 )
當初看這兩篇是因為我想要了解 Linux kernel 開機的流程.. 因為搞不懂怎麼跳到 GRUB然後怎麼跳到 KERNEL 的那些步驟
3. GRUB的開機流程
Details of GRUB on the PC
最後 The Kernel Boot Process
我在看完這幾篇文章以後 對於X86的開機流程有了大致上的了解.. 感覺不賴~
2009年6月6日 星期六
Android Cupcake on EeePC 900 with Huawei E169
來野人獻曝一下
1. 下載 Android cupcake for eeepc 701
請參考這個網站
http://virtuallyshocking.com/2008/12/20/building-android-for-the-asus-eeepc-701/
2. git 回來的 cupcake/vendor/asus/eeepc_701/kernel 是 2.6.25
cupcake/kernel 為 2.6.27 不過這個沒有關係稍作修改就好了
下載http://wiki.androidx86.org/index.php?title=Asus_Eee_PC_901 裡面的 kernel config
3. 把該 kernel config 複製為 cupcake/kernel/.config
make menuconfig
EXT2 ( installer needs it to mount ramdisk )
PPP ( choose all options )
USB serial
Includes USB GSM and CDMA option
Framebuffer
VESA VGA Driver (雖然 有 I915的Framebuffer driver 但是我試過沒辦法作用)
4. 修改 cupcake/kernel/drivers/rtc/alarm.c
Delete #include
Add below code to alarm.c
#ifdef __i386__
static void save_time_delta(struct timespec *delta, struct timespec *rtc)
{
set_normalized_timespec(delta,
xtime.tv_sec - rtc->tv_sec,
xtime.tv_nsec - rtc->tv_nsec);
}
#endif
5. Enable PPPD for x86
pppd 的 Android.mk 預設只有當 TARGET=arm的時候才會編譯
刪除 pppd\Android.mk 第一行 if 與 最後一行 fi 即可
6. Add chat to source tree
chat 請去 ppp.samba.org 下載 2.4.3 版的 pppd-2.4.3.tar.gz 裡面有 chat.c
複製到 cupcake/external/ppp/chat 內 並且新增一個 Android.mk 在該目錄
------------------------------------Android.mk ------------------------------------------------------
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
chat.c
LOCAL_SHARED_LIBRARIES := \
libcutils libc
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include
LOCAL_CFLAGS := -DANDROID_CHANGES -DTERMIOS -DSIGTYPE=void -UNO_SLEEP -DFNDELAY=O_NDELAY
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:= chat
include $(BUILD_EXECUTABLE)
----------------------------------------------------------------------------------------------------------
7. 新增兩個 script 到 cupcake/system/core/rootdir/etc/ppp 下面
-----------------------PPP Script : ppp-startup ---------------------------------
#!/system/bin/sh
setprop net.dns1 168.95.1.1
/system/xbin/pppd –detach modem crtscts debug \
/dev/ttyUSB0 460800 noipdefault \
defaultroute usepeerdns \
connect “/etc/ppp/pppondialer”
-------------------------------------------------------------------------
-----------------------chat Script : pppondialer----------------------------------------------------
#!/system/bin/sh
chat –v –s \
TIMEOUT 3 \
ABORT BUSY \
ABORT ERROR \
“” ‘AT’ \
OK ‘ATH0’ \
OK ‘ATZ’ \
TIMEOUT 30 \
OK ‘ATQ0 V1 E1 S0=0 &C1 &C2 +FCLASS=0’ \
OK ‘AT+CGDCONT=1,”IP”,”internet”’ \ internet 為中華電信 APN name
OK ‘AT+CSQ’ \
OK ‘ATD*99#’ \
TIMEOUT 50 \
CONNECT ‘’
-------------------------------------------------------------------------------------
8. 修改 cupcake/system/core/rootdir/Androidk.mk 內 copy_from
copy_from = ....\
etc/ppp/ppp-startup
etc/ppp/pppondialer
don't forget add the execution permission
9.Revise BoardConfig.mk
vendor/asus/eeepc_701/BoardConfig.mk
BOOT_KERNEL_CMDLINE
For using VESA VGA Framebuffer, append option “vga=788 “ to end of line
10 將external/e2fsprogs/Android.mk中第二行註解#字號拿掉
include $(call all-subdir-makefiles)
11. 修改bootable/diskinstaller/init.rc如下:
service installer /system/bin/installer -p /dev/block/sdc2
12. 修改framework/base/preloaded-classes:
#com.android.internal.policy.impl.PhoneLayoutInflater
#com.android.internal.policy.impl.PhoneWindow
#com.android.internal.policy.impl.PhoneWindow$1
#com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback
#com.android.internal.policy.impl.PhoneWindow$DecorView
#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState
#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState
#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState$1
13. 修改vendor/asus/eee_701/init.rc:
# Define the oom_adj values for the classes of processes that can be killed by the kernel. These are used in ActivityManagerService.
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.HOME_APP_ADJ 4
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
# Define the memory thresholds at which the above process classes will
# be killed. These numbers are in pages (4k).
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
setprop ro.SECONDARY_SERVER_MEM 4096
setprop ro.HOME_APP_MEM 4096
setprop ro.HIDDEN_APP_MEM 8192
setprop ro.CONTENT_PROVIDER_MEM 8704
setprop ro.EMPTY_APP_MEM 16384
14. TARGET_ARCH=x86 TARGET_PRODUCT=eee_701 DISABLE_DEXPREOPT=true make -j8 installer_img 編譯 Android cupcake
然後用 dd if=out/target/product/installer.img of=/dev/sdx 安裝 android 到 usb 隨身碟上面, 接下來插入 eeepc 開機吧~ have for fun
15. 安裝完成後 進入Android 按 Alt+CTRL + F1 進入 Console 呼叫 進入 /system/etc/ppp
插入 E169 如果你有看到 /dev/ttyUSB0 有出現那就 並且執行 ppp-startup 然後試看看你的瀏覽器吧!
1. 下載 Android cupcake for eeepc 701
請參考這個網站
http://virtuallyshocking.com/2008/12/20/building-android-for-the-asus-eeepc-701/
2. git 回來的 cupcake/vendor/asus/eeepc_701/kernel 是 2.6.25
cupcake/kernel 為 2.6.27 不過這個沒有關係稍作修改就好了
下載http://wiki.androidx86.org/index.php?title=Asus_Eee_PC_901 裡面的 kernel config
3. 把該 kernel config 複製為 cupcake/kernel/.config
make menuconfig
EXT2 ( installer needs it to mount ramdisk )
PPP ( choose all options )
USB serial
Includes USB GSM and CDMA option
Framebuffer
VESA VGA Driver (雖然 有 I915的Framebuffer driver 但是我試過沒辦法作用)
4. 修改 cupcake/kernel/drivers/rtc/alarm.c
Delete #include
Add below code to alarm.c
#ifdef __i386__
static void save_time_delta(struct timespec *delta, struct timespec *rtc)
{
set_normalized_timespec(delta,
xtime.tv_sec - rtc->tv_sec,
xtime.tv_nsec - rtc->tv_nsec);
}
#endif
5. Enable PPPD for x86
pppd 的 Android.mk 預設只有當 TARGET=arm的時候才會編譯
刪除 pppd\Android.mk 第一行 if 與 最後一行 fi 即可
6. Add chat to source tree
chat 請去 ppp.samba.org 下載 2.4.3 版的 pppd-2.4.3.tar.gz 裡面有 chat.c
複製到 cupcake/external/ppp/chat 內 並且新增一個 Android.mk 在該目錄
------------------------------------Android.mk ------------------------------------------------------
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
chat.c
LOCAL_SHARED_LIBRARIES := \
libcutils libc
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include
LOCAL_CFLAGS := -DANDROID_CHANGES -DTERMIOS -DSIGTYPE=void -UNO_SLEEP -DFNDELAY=O_NDELAY
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:= chat
include $(BUILD_EXECUTABLE)
----------------------------------------------------------------------------------------------------------
7. 新增兩個 script 到 cupcake/system/core/rootdir/etc/ppp 下面
-----------------------PPP Script : ppp-startup ---------------------------------
#!/system/bin/sh
setprop net.dns1 168.95.1.1
/system/xbin/pppd –detach modem crtscts debug \
/dev/ttyUSB0 460800 noipdefault \
defaultroute usepeerdns \
connect “/etc/ppp/pppondialer”
-------------------------------------------------------------------------
-----------------------chat Script : pppondialer----------------------------------------------------
#!/system/bin/sh
chat –v –s \
TIMEOUT 3 \
ABORT BUSY \
ABORT ERROR \
“” ‘AT’ \
OK ‘ATH0’ \
OK ‘ATZ’ \
TIMEOUT 30 \
OK ‘ATQ0 V1 E1 S0=0 &C1 &C2 +FCLASS=0’ \
OK ‘AT+CGDCONT=1,”IP”,”internet”’ \ internet 為中華電信 APN name
OK ‘AT+CSQ’ \
OK ‘ATD*99#’ \
TIMEOUT 50 \
CONNECT ‘’
-------------------------------------------------------------------------------------
8. 修改 cupcake/system/core/rootdir/Androidk.mk 內 copy_from
copy_from = ....\
etc/ppp/ppp-startup
etc/ppp/pppondialer
don't forget add the execution permission
9.Revise BoardConfig.mk
vendor/asus/eeepc_701/BoardConfig.mk
BOOT_KERNEL_CMDLINE
For using VESA VGA Framebuffer, append option “vga=788 “ to end of line
10 將external/e2fsprogs/Android.mk中第二行註解#字號拿掉
include $(call all-subdir-makefiles)
11. 修改bootable/diskinstaller/init.rc如下:
service installer /system/bin/installer -p /dev/block/sdc2
12. 修改framework/base/preloaded-classes:
#com.android.internal.policy.impl.PhoneLayoutInflater
#com.android.internal.policy.impl.PhoneWindow
#com.android.internal.policy.impl.PhoneWindow$1
#com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback
#com.android.internal.policy.impl.PhoneWindow$DecorView
#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState
#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState
#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState$1
13. 修改vendor/asus/eee_701/init.rc:
# Define the oom_adj values for the classes of processes that can be killed by the kernel. These are used in ActivityManagerService.
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.HOME_APP_ADJ 4
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
# Define the memory thresholds at which the above process classes will
# be killed. These numbers are in pages (4k).
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
setprop ro.SECONDARY_SERVER_MEM 4096
setprop ro.HOME_APP_MEM 4096
setprop ro.HIDDEN_APP_MEM 8192
setprop ro.CONTENT_PROVIDER_MEM 8704
setprop ro.EMPTY_APP_MEM 16384
14. TARGET_ARCH=x86 TARGET_PRODUCT=eee_701 DISABLE_DEXPREOPT=true make -j8 installer_img 編譯 Android cupcake
然後用 dd if=out/target/product/installer.img of=/dev/sdx 安裝 android 到 usb 隨身碟上面, 接下來插入 eeepc 開機吧~ have for fun
15. 安裝完成後 進入Android 按 Alt+CTRL + F1 進入 Console 呼叫 進入 /system/etc/ppp
插入 E169 如果你有看到 /dev/ttyUSB0 有出現那就 並且執行 ppp-startup 然後試看看你的瀏覽器吧!
2008年6月9日 星期一
SurfaceView 如何使用
SurfaceView sv;
SurfaceHolder holder;
sv = (SurfaceView) findViewById ( R.id.sv1 );
holder = sv.getHolder();
Canvas cv = holder.lockCanvas();
cv.drawBitmap ( bitmap , left , top , new Paint() );
holder.unlockCanvasAndPost(cv);
這一段 code 會比使用 ImageView 觀看 Bitmap 來的更快, 因為我們利用的 Canvas 直接繪圖, 但是 ImageView 在到 android.graphics.drawable.BitmapDrawable 的 onDraw (Canvas canvas); 之前還需要作很多判斷, 所以速度上來說會比直接使用 Canvas 慢上許多.
另外 drawBitmap 其實是呼叫 JNI native_drawBitmap 來作實際上得繪圖動作.
public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint)
{
native_drawBitmap(mNativeCanvas, bitmap.ni(), left, top, paint == null ? 0 : paint.mNativePaint);
}
2008年6月7日 星期六
測量 CLOCK and Times
自己寫的在 linux 下面測量時間的方式 , 跟大家分享一下 。
typedef struct clock_info {
char name[20];
clock_t start;
clock_t end;
clock_t total;
clock_t times;
clock_t max;
clock_t min;
clock_t tmp_dur;
} clock_info;
void clock_info_Init( clock_info *ci , char *name)
{
strncpy(ci->name, name, 20);
ci->start = 0 ; ci->end = 0; ci->total = 0;
ci->times = 0 ; ci->max = 0; ci->min = 0;
ci->tmp_dur = 0;
}
void clock_info_sample_start ( clock_info *ci, clock_t sample )
{
ci->start = sample;
}
void clock_info_sample_end ( clock_info *ci , clock_t sample )
{
ci->end = sample;
ci->tmp_dur = ci->end - ci->start;
ci->total += ci->tmp_dur;
ci->times ++;
if ( ci->times == 1 )
{
ci->max = ci->tmp_dur;
ci->min = ci->tmp_dur;
}
if ( ci->tmp_dur > ci->max )
ci->max = ci->tmp_dur;
if ( ci->tmp_dur <>min )
ci->min = ci->tmp_dur;
}
void clock_info_print ( clock_info *ci )
{
char str[255];
sprintf(str," CLOCK Measurement report CLOCKS_PER_SEC = %d\n", CLOCKS_PER_SEC);
printf(str);
double avg = (double)( (double) ci->total / (double) ci->times ) ;
double max = (double) ci->max;
double min = (double) ci->min;
sprintf(str," <%s>\t max : %7.5f (clk) \t min : %7.5f (clk) \t avg : %7.5f (clk) \n",
ci->name, max , min , avg);
printf(str);
avg = ( avg / (double)CLOCKS_PER_SEC );
max = ( max / (double)CLOCKS_PER_SEC );
min = ( min / (double)CLOCKS_PER_SEC );
sprintf(str," <%s>\t max : %7.5f (s) \t min : %7.5f (s) \t avg : %7.5f (s)\n",
ci->name, max , min , avg );
printf(str);
avg = avg * 1000.0;
max = max * 1000.0;
min = min * 1000.0;
sprintf(str," <%s>\t max : %7.5f (ms) \t min : %7.5f (ms) \t avg : %7.5f (ms) \n",
ci->name, max , min , avg);
prinf(str);
}
typedef struct clock_info {
char name[20];
clock_t start;
clock_t end;
clock_t total;
clock_t times;
clock_t max;
clock_t min;
clock_t tmp_dur;
} clock_info;
void clock_info_Init( clock_info *ci , char *name)
{
strncpy(ci->name, name, 20);
ci->start = 0 ; ci->end = 0; ci->total = 0;
ci->times = 0 ; ci->max = 0; ci->min = 0;
ci->tmp_dur = 0;
}
void clock_info_sample_start ( clock_info *ci, clock_t sample )
{
ci->start = sample;
}
void clock_info_sample_end ( clock_info *ci , clock_t sample )
{
ci->end = sample;
ci->tmp_dur = ci->end - ci->start;
ci->total += ci->tmp_dur;
ci->times ++;
if ( ci->times == 1 )
{
ci->max = ci->tmp_dur;
ci->min = ci->tmp_dur;
}
if ( ci->tmp_dur > ci->max )
ci->max = ci->tmp_dur;
if ( ci->tmp_dur <>min )
ci->min = ci->tmp_dur;
}
void clock_info_print ( clock_info *ci )
{
char str[255];
sprintf(str," CLOCK Measurement report CLOCKS_PER_SEC = %d\n", CLOCKS_PER_SEC);
printf(str);
double avg = (double)( (double) ci->total / (double) ci->times ) ;
double max = (double) ci->max;
double min = (double) ci->min;
sprintf(str," <%s>\t max : %7.5f (clk) \t min : %7.5f (clk) \t avg : %7.5f (clk) \n",
ci->name, max , min , avg);
printf(str);
avg = ( avg / (double)CLOCKS_PER_SEC );
max = ( max / (double)CLOCKS_PER_SEC );
min = ( min / (double)CLOCKS_PER_SEC );
sprintf(str," <%s>\t max : %7.5f (s) \t min : %7.5f (s) \t avg : %7.5f (s)\n",
ci->name, max , min , avg );
printf(str);
avg = avg * 1000.0;
max = max * 1000.0;
min = min * 1000.0;
sprintf(str," <%s>\t max : %7.5f (ms) \t min : %7.5f (ms) \t avg : %7.5f (ms) \n",
ci->name, max , min , avg);
prinf(str);
}
Android上面呼叫 ffmpeg 解壓縮的播放程式

這禮拜五完成一支 可以在Android上面呼叫 ffmpeg 解壓縮的播放程式,這支程式的架構是目前計畫的目標,在 Android 上打出一條路徑可以讓硬體 執行解壓縮。
雖然之前就有做出雛形,但是因為 IPC 控制機制設計不好,所以程式容易 Crash ,另外也容易產生 memory leaking。
最後在本週五下班之前修改出來,每 110ms 可以解壓縮完一張 H.264的 Frame,程式不會 Crash。也能夠控制程式的關閉、暫停等等,實在非常感動 努力了三個月終於有一支可以上檯面交差的程式了。( 備註一下 110ms 的時間測量方式 我是採用 clock() 這個 system call 測量得知的 )
在這段撰寫程式的這段時間中, 我遇到了 java threading、同步等兩大難題, 要在 java 裡面做 thread 控制,要在 jni 與 ffmpeg decoder 之間做 ipc 控制。
java threading 算是比較簡單且容易撰寫,但需要閱讀的文件也是最多的。不習慣 synchronized 這種 coding 方式。另外 Thread 要呼叫某個 class的方法必須透過 Android Handler,但是 Handler 沒有 message filter 的功能所以必須自己設計。這大概是我覺得重點的地方。
同步通訊的部份,我用 FIFO ( mkfifo ) 的方式,開通兩個 fifo 讓兩支程式做溝通,傳控制訊息。 至於解開後的 raw data ( RGB32 ) 則適用 memory mapping i/o 的方式,讓 jni 與 ffmpeg decoder 共用同一個 page 降低搬移與傳輸資料的成本。
這邊不得不提一下為何要用 RGB32,因為 FFmpeg 解壓縮的單位是 byte,如果你用 RGB16 就是佔兩個 bytes,RGB24 就是三個。但是 Android 的 Bitmap 可讀取資料來源 array 是 int 格式, 在 java 的定義中是佔了 4 bytes ,所以用 RGB32 可以避免掉 Align data 的時間。
如果加上 SetIntArrayRegion(env, iarr, 0, size, tmp); 就可以輕鬆的把解壓縮完後的 data 傳完 java (但是 Bitmap 那邊要選用 ARGB888 的 config )。
另外還有一件事情就是論文被通知 accept 。
最後感謝跟我一起工作的同事們,沒有你們互相切磋 這隻程式沒法完成,謝謝你們。
這一周真的既勞累又充實, 疲勞都被成功的喜悅給淹沒了。
(加班三天~~ 囧!!)
2008年5月27日 星期二
幫android換掉 sh
android的 init是 google自己寫的, 它會讀取 /etc/init.rc 作一些動作
我不喜歡它原本 sh , 因為不方便使用沒有 history的功能,
我修改如下
console {
exec /system/bin/busybox
args {
0 sh
}
console yes
}
這樣 run emulator的時候加上 -console 就會直接執行 busybox sh
但是 adb shell 則是直接 run /system/bin/sh 這要怎麼辦呢
先把原本的sh改名, 然後 ln -s busybox sh.
對了 android的 sh可不是由 toolbox link過來的喔 是一隻獨立的程式.
我不喜歡它原本 sh , 因為不方便使用沒有 history的功能,
我修改如下
console {
exec /system/bin/busybox
args {
0 sh
}
console yes
}
這樣 run emulator的時候加上 -console 就會直接執行 busybox sh
但是 adb shell 則是直接 run /system/bin/sh 這要怎麼辦呢
先把原本的sh改名, 然後 ln -s busybox sh.
對了 android的 sh可不是由 toolbox link過來的喔 是一隻獨立的程式.
訂閱:
文章 (Atom)