ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2010年10月29日 星期五

reference-ril in Android

Android 提供的 Ril (Radio Interface Layer) 說明在: PDK - Telephony 在init.rc: /root/init.rc:service ril-daemon /system/bin/rild -l /system/lib/libreference-ril.so -- -d /dev/ttyUSB3 -u /dev/ttyUSB0 rild 和 libreference-ril.so 的 sourcecode 在 hardware/ril 真正執行 AT Command 的好像是 reference-ril。 libreference-ril 的參數: d, u 是 MODEM 的 command port
  • d : tty Device (dial ?)
  • u : data channel
像某家的 Modem 就是:
  • ttyUSB2 : AT Command Interface
  • ttyUSB3 : Modem Interface
modem 就是 data channel ? AT Command 就是 tty ?
libreference-ril 的 reference 是 android 提供給 vendor 的 for reference Ril 實作。

DDR Clock

iMX51 好像boot rom code 就包含 setup clk。 所以在 boot code 中都沒有看到設定 (只有讀出來)。 有關 DDR clk 的設定,在 FreeScale Forume 有提到: User Manual Section: 7.3.3.6 CCM Bus Clock Divider Register. 其中
  • bit 30 : Select for DDR main clock
  • bit29-27 : Divider for DDR podf
這兩項 field 的說明有提到 變更這兩項後, ddr clk 的狀態會 update 到 CCM Divider Handshake In-Process Register 對應的 bit
  • bit 8 : ddr src select mux is budy
  • bit 7 : ddr_podf_busy
這幾個 busy bit 是 0 代表轉換完成。

2010年10月28日 星期四

use generic usb serial driver to support new vid pid

simcom 的 3G module 在 2.6.20 以後的版本,可以用 usbserial.ko。
但是因為其中的 AGPS 功能,沒有實作 RX channel,所以要稍微修改 driver。

又因為這一個 module 的 VID, PID 沒有在 usbserial.ko 的 support list 中。
所以要手動 load usbserial.ko

在 driver/usb/serial/generic.c 中,有宣告 這個 module 吃的參數:
module_parameter(vendor,ushort,0); module_parameter(product,ushort,0);
所以可以在 insmod 時,傳入vid, pid,讓 usbserial.ko support 新的 device...

例如:
#insmod usbserial.ko vendor=0x05f9 product=0x0fff

Add Busybox in Android

就 follow 一般的 cross build for ARM,設好 ARCH, CROSS_COMPILE 兩個環境變數。
make menuconfig -- 設定 static 和不 install 在 /usr。
就可以 build 了。
build 好後。產生 busybox 這個ˊ執行檔,copy 到 /system/bin 下。
在 android build system 下作 make snod 產生新的 system.bin.
修改 init.rc 把,system.img mount 成 rw.

Android 開機後..在 console 下 #busybox --install /system/bin 就可以了。


應該要看 install 在 /system/bin 下,再產生 system.bin 的方法..

2010年10月27日 星期三

sound test -console tool to play wav : alsa_aplay

android 有內建 console mode 的 play sound tool.
在 external/alsa-util 下

是從 alsa-util 的 aplay porting 過來的: alsa_aplay.

但是因為 Android VM 一啟動就站住了 sound card。所以要用之前要先把 Android 的 audio service 停掉: # stop media 然後再使用 alsa_aplay:

列出所有 command #alsa_aplay --help
列出目前系統的 pcm 裝置: #alsa_aplay -L 如果 default 是正確的,就可以用: alas_aplay ./11k.wav 來播放 wav 檔。
在 system/extras/sound 的 playwav.c 沒有辦法使用,因為 sound device 不對。

android 的 sound 支援好像是用 /hardware/alsa_sound 產生的 audio library,讓所有需要的 ap 呼叫。


ref: http://superuser.com/questions/53957/what-do-alsa-devices-like-hw0-0-mean-how-do-i-figure-out-which-to-use
aplay 的參數:
$alsa_aplay -D hw:2,0 -f S8 -c 2 /dev/uramdom
其中:
-D sound device, 
2 是 card index
0 是 device index

-f format
-c channels  , 有時候沒給的話會出現error

在usb serial 加入 新的 module

debian squeeze 要 build module, 要 install
  • kernel header : uame -a 看一下 kernel 的版本。然後 install 對應的 linux-headers (我的 sempron 是 linux-headers-2.6.32-5-686)
    其實就是 "aptitude install linux-header-$(uname -r)
  • 還需要 module-assistant
裝完 kernel header 後,在 /lib/modules/2.6.32-5-686 會多一個 build 的 link,link 到 /usr/src/linux-headers-2.6.32-5-common build 的動作就跟 書上說的一樣: make -C /lib/module/2.6.32-5-686/build M=`pwd` modules module 的 makefile 就跟書上寫的一樣,寫 obj-m := option.o 我要 build 的 module name

整個重寫: apt-get install linux-source-2.6.32 -- 這是要拿到 option.c 再 apt-get install linux-headers-2.6.32-5-686 奇怪,應該用第一個步驟也可以+ copy .config from /boot/ 然後 make scripts 後應該也可以。 但是為沒有整個ˊmake 過,所以沒有 modules.symvers。再 make ˊ時會warnning。 build好的 option.ko insmod 時會說 format error. 參考:這一篇 http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=228&blogId=1

insmod : init_module failed (Exec format error)

手動insmod ,結果出現 error,說是 init_module failed (Exec format error).
用 file 看 format 是正確的 arm..

用 hello.ko 測試 build 環境是否 OK -- 一樣也是 Exec format error。

後來重 build uImage,在這個 uImage 上 insmod 就 OK 了 !!

猜是改了 kernel 的 .config,但是確沒有重 build kernel image。

2010年10月26日 星期二

LOCAL_BUILT_MODULE and LOCAL_INSTALLED_MODULE must not be defined by component makefiles

出現在 base_rule.mk

binary.mk dynamic_binary.mk prebuild.mk 都有 include base_rule.mk
在上面的 mk 開頭都加上 $(info in binary.mk) 或 dynamic_binary.mk,,
prebuild.mk..

再 make 一次,發現是 binary.mk include base_rule.mk 後出現 error message.

找 binary.mk
有 dynamic_binary.mk executable.mk ...
猜是 executable.mk



印出來看,是哪一個 variable 被 define..
out/target/product/myBBG/system/bin/unifi_helper build/core/base_rules.mk:112: *** hardware/libhardware_legacy/unifi-linux/unifi_helper: LOCAL_BUILT_MODULE and LOCAL_INSTALLED_MODULE must not be defined by component makefiles. Stop. 另一個是: out/target/product/imx51_BBG/system/bin/unifi_manager build/core/base_rules.mk:112: *** hardware/libhardware_legacy/unifi-linux/os_linux: LOCAL_BUILT_MODULE and LOCAL_INSTALLED_MODULE must not be defined by component makefiles. Stop.



好像是擺放位置的問題:
hardware\libhardware_legacy 目的在 build 出 libhardware_legacy.so
所以該目錄下的 各 folder 都不能再define LOCAL_MODULE.

所以把 unifi_wifi 擺在 hardware/libhardware_legacy 下是不行的

果然,搬移到 external 後 就 OK 了。

2010年10月25日 星期一

put vendor's wifi driver in android

將 prebuild 的 optin 設好,結果開啟 wifi 後 dmesg 出現:
no symbol version for module_layout
google 一下,說是 kernel config 有把 CONFIG_MODULEVERSION 打開,但是 build module 時沒有打開。

因為 module 是 vendor 提供的,所以只好修改 kernel,把 config 關掉.

... 結果一樣不行 :(


以 212 來測試,把 包含 Android.mk 的最高一層 folder - 好像是 unifi-linux。
參考 driver/config.android-arm.mk 的 內容 (folder depth),好像 copy 到 hardware/libhardware_legacy 下。

看一下 driver/config.android-arm.mk ,那個 kernel source path name 要改一下。

但是要先到 driver 下 ./build android-arm 會有error,但是可以成功 build 出*.ko
但是因為 tools 也在 all 的 dependency 中,所以會 build fail.
修改 Makfile,把 tools 刪掉就可以。

然後到 unifi_wifi 那一層,下 mm 指令,就可以把 userland 的 program 都 build 完。

繼續作 make snod 會發生 這個 新增 module, 和 prebuild 裡那個舊的衝突的問題..

put strace in android

因為這個人 http://benno.id.au/blog/2007/11/18/android-runtime-strace很好心的放了port 好,還是 static link 的 strace。 所以download 下來就可以 run 了 (其實我把他 放進 system/bin 中)。 build strace for android 的方法 follow 這一篇 strace 是用 autoconf ,所以 configure script 看不懂。 cross compile for android 大概是: build 一個 arm-linux , static link 的 strace。 所以
  • 設好 cross toolchain 的 path
  • 設好 cross toolchain 的 name : export CC=/opt/....
  • configure -host=arm-linux
  • configure 完會產生 Makefile,把 CFLAGS 加上 -static
然後就可以 make 了

myhello - native shell runnable program in android-linux

會這樣寫是因為這是在 shell run 的程式,沒有用 Dalvik. 是要看看 android linux 的 bionic , share library 用偷懶的方法,拿 system/extra/sound 來參考 (copy)
  • 在 system/extra 下 create "myhello" folder
  • copy sound 的 Android.mk 過來
  • 修改 Android.mk
  • mm
build log: make: Entering directory `/home/checko/myandroid8.1' target thumb C: myhello <= system/extras/myhello/myhello.c target Executable: myhello (out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates/LINKED/myhello) target Non-prelinked: myhello (out/target/product/myBBG/symbols/system/bin/myhello) target Strip: myhello (out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates/myhello) Install: out/target/product/myBBG/system/bin/myhello Copy: out/target/product/myBBG/system/etc/apns-conf.xml make: Leaving directory `/home/checko/myandroid8.1' 在 croot (android project root),用 make showcommands myhello 的 log: build/core/copy_headers.mk:15: warning: overriding commands for target `out/target/product/myBBG/obj/include/libpv/getactualaacconfig.h' build/core/copy_headers.mk:15: warning: ignoring old commands for target `out/target/product/myBBG/obj/include/libpv/getactualaacconfig.h' /bin/bash: line 0: cd: sdk/layoutopt/app/src/resources: No such file or directory No private recovery resources for TARGET_DEVICE myBBG target thumb C: myhello <= system/extras/myhello/myhello.c prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gcc -I system/core/include -I hardware/libhardware/include -I hardware/libhardware_legacy/include -I hardware/ril/include -I dalvik/libnativehelper/include -I frameworks/base/include -I frameworks/base/opengl/include -I external/skia/include -I out/target/product/myBBG/obj/include -I bionic/libc/arch-arm/include -I bionic/libc/include -I bionic/libstdc++/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -I bionic/libm/include -I bionic/libm/include/arch/arm -I bionic/libthread_db/include -I system/extras/myhello -I out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates -I out/target/product/myBBG/obj/STATIC_LIBRARIES/libwebcore_intermediates -c -fno-exceptions -Wno-multichar -msoft-float -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -march=armv5te -mtune=xscale -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -include system/core/include/arch/linux-arm/AndroidConfig.h -I system/core/include/arch/linux-arm/ -mthumb-interwork -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -DSK_RELEASE -DNDEBUG -g -Wstrict-aliasing=2 -finline-functions -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -DNDEBUG -UDEBUG -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -MD -o out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates/myhello.o system/extras/myhello/myhello.c Install: out/host/linux-x86/bin/apriori out/host/linux-x86/bin/acp -fpt out/host/linux-x86/obj/EXECUTABLES/apriori_intermediates/apriori out/host/linux-x86/bin/apriori Install: out/host/linux-x86/bin/soslim out/host/linux-x86/bin/acp -fpt out/host/linux-x86/obj/EXECUTABLES/soslim_intermediates/soslim out/host/linux-x86/bin/soslim target Executable: myhello (out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates/LINKED/myhello) prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-g++ -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -o out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates/LINKED/myhello -Lout/target/product/myBBG/obj/lib -Wl,-rpath-link=out/target/product/myBBG/obj/lib -lc -lstdc++ -lm out/target/product/myBBG/obj/lib/crtbegin_dynamic.o out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates/myhello.o -Wl,--no-undefined /home/checko/myandroid8.1/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/interwork/libgcc.a out/target/product/myBBG/obj/lib/crtend_android.o target Non-prelinked: myhello (out/target/product/myBBG/symbols/system/bin/myhello) out/host/linux-x86/bin/acp -fpt out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates/LINKED/myhello out/target/product/myBBG/symbols/system/bin/myhello target Strip: myhello (out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates/myhello) out/host/linux-x86/bin/soslim --strip --shady --quiet out/target/product/myBBG/symbols/system/bin/myhello --outfile out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates/myhello Install: out/target/product/myBBG/system/lib/libdl.so out/host/linux-x86/bin/acp -fpt out/target/product/myBBG/obj/lib/libdl.so out/target/product/myBBG/system/lib/libdl.so Install: out/target/product/myBBG/system/lib/libc.so out/host/linux-x86/bin/acp -fpt out/target/product/myBBG/obj/lib/libc.so out/target/product/myBBG/system/lib/libc.so Install: out/target/product/myBBG/system/lib/libstdc++.so out/host/linux-x86/bin/acp -fpt out/target/product/myBBG/obj/lib/libstdc++.so out/target/product/myBBG/system/lib/libstdc++.so Install: out/target/product/myBBG/system/lib/libm.so out/host/linux-x86/bin/acp -fpt out/target/product/myBBG/obj/lib/libm.so out/target/product/myBBG/system/lib/libm.so Install: out/target/product/myBBG/system/bin/myhello out/host/linux-x86/bin/acp -fpt out/target/product/myBBG/obj/EXECUTABLES/myhello_intermediates/myhello out/target/product/myBBG/system/bin/myhello 這樣build 出來的 myhello 會被 install 在 system/bin 中,boot 後直接 invoke 就可以執行。 啟動 strace myhello 的內容: strace myhello execve("/system/bin/myhello", ["myhello"], [/* 19 vars */]) = 0 syscall_983045(0xb0017900, 0xbed6dbb4, 0, 0x847c, 0xb000f448, 0xbed6dbb0, 0x8, 0xf0005, 0, 0, 0, 0, 0, 0xbed6db58, 0xb000194b, 0xb000228c, 0x80000010, 0xb0017900, 0, 0, 0xc764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) = 0 getpid() = 2109 sigaction(SIGILL, {0xb0001d45, [], SA_RESTART}, {SIG_DFL}, 0) = 0 sigaction(SIGABRT, {0xb0001d45, [], SA_RESTART}, {SIG_DFL}, 0) = 0 sigaction(SIGBUS, {0xb0001d45, [], SA_RESTART}, {SIG_DFL}, 0) = 0 sigaction(SIGFPE, {0xb0001d45, [], SA_RESTART}, {SIG_DFL}, 0) = 0 sigaction(SIGSEGV, {0xb0001d45, [], SA_RESTART}, {SIG_DFL}, 0) = 0 sigaction(SIGSTKFLT, {0xb0001d45, [], SA_RESTART}, {SIG_DFL}, 0) = 0 sigaction(SIGPIPE, {0xb0001d45, [], SA_RESTART}, {SIG_DFL}, 0) = 0 getuid32() = 0 geteuid32() = 0 getgid32() = 0 getegid32() = 0 stat64("/system/lib/libc.so", {st_mode=S_IFREG|0644, st_size=239972, ...}) = 0 open("/system/lib/libc.so", O_RDONLY|O_LARGEFILE) = 3 lseek(3, 0, SEEK_SET) = 0 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0 \250\0\000"..., 4096) = 4096 lseek(3, -8, SEEK_END) = 239964 read(3, "\0\0\340\257PRE ", 8) = 8 mmap2(0xafe00000, 286720, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xafe00000 mmap2(0xafe00000, 228532, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xafe00000 mprotect(0xafe00000, 229376, PROT_READ|PROT_WRITE|PROT_EXEC) = 0 mmap2(0xafe38000, 8596, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x38) = 0xafe38000 mmap2(0xafe3b000, 42160, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xafe3b000 close(3) = 0 mprotect(0xafe00000, 229376, PROT_READ|PROT_EXEC) = 0 getuid32() = 0 geteuid32() = 0 getgid32() = 0 getegid32() = 0 gettid() = 2109 syscall_983045(0xafe42ad4, 0xafe42a98, 0, 0x40, 0xafe38e08, 0xbed6dbb0, 0xbed6da58, 0xf0005, 0, 0, 0, 0, 0, 0xbed6da48, 0xafe1f721, 0xafe0d89c, 0x60000010, 0xafe42ad4, 0, 0, 0xc764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) = 0 mmap2(NULL, 32768, PROT_READ, MAP_SHARED, 9, 0) = 0x40000000 open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 3 read(3, "\223\31\234=", 4) = 4 close(3) = 0 stat64("/system/lib/libstdc++.so", {st_mode=S_IFREG|0644, st_size=5268, ...}) = 0 open("/system/lib/libstdc++.so", O_RDONLY|O_LARGEFILE) = 3 lseek(3, 0, SEEK_SET) = 0 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0X\10\0\000"..., 4096) = 4096 lseek(3, -8, SEEK_END) = 5260 read(3, "\0\0\320\257PRE ", 8) = 8 mmap2(0xafd00000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xafd00000 mmap2(0xafd00000, 2848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xafd00000 mprotect(0xafd00000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC) = 0 mmap2(0xafd01000, 232, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x1) = 0xafd01000 close(3) = 0 mprotect(0xafd00000, 4096, PROT_READ|PROT_EXEC) = 0 getuid32() = 0 geteuid32() = 0 getgid32() = 0 getegid32() = 0 stat64("/system/lib/libm.so", {st_mode=S_IFREG|0644, st_size=132116, ...}) = 0 open("/system/lib/libm.so", O_RDONLY|O_LARGEFILE) = 3 lseek(3, 0, SEEK_SET) = 0 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0@ \0\000"..., 4096) = 4096 lseek(3, -8, SEEK_END) = 132108 read(3, "\0\0\300\257PRE ", 8) = 8 mmap2(0xafc00000, 135168, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xafc00000 mmap2(0xafc00000, 129828, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xafc00000 mprotect(0xafc00000, 131072, PROT_READ|PROT_WRITE|PROT_EXEC) = 0 mmap2(0xafc20000, 280, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x20) = 0xafc20000 close(3) = 0 mprotect(0xafc00000, 131072, PROT_READ|PROT_EXEC) = 0 getuid32() = 0 geteuid32() = 0 getgid32() = 0 getegid32() = 0 mprotect(0x8000, 4096, PROT_READ|PROT_EXEC) = 0 getuid32() = 0 geteuid32() = 0 getgid32() = 0 getegid32() = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40008000 mprotect(0x40008000, 4096, PROT_READ) = 0 fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(207, 16), ...}) = 0 brk(0) = 0xa000 brk(0xa000) = 0xa000 brk(0xc000) = 0xc000 mprotect(0x40008000, 4096, PROT_READ|PROT_WRITE) = 0 mprotect(0x40008000, 4096, PROT_READ) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo ...}) = 0 write(1, "Hello Bionic\n", 13Hello Bionic ) = 13 mprotect(0x40008000, 4096, PROT_READ|PROT_WRITE) = 0 mprotect(0x40008000, 4096, PROT_READ) = 0 munmap(0x40008000, 4096) = 0 exit_group(0) = ? Process 2109 detached 所以確認 share library path 是 OK 的 :(

又是 ToDoToday

雖然 每次的 ToDoToday 都沒作(完),還是要寫一下。 (linux 平台可以作/學的事情太多..)
  • build a Hello program with Android.mk -- to test the share library problem
  • try ver 8.1 unifi_wifi support (read the ref doc to unterstand android wifi arch)
  • read iMX51 SD3 register
  • read mDDR datasheet -- prepare for u-boot
  • 64bit ubuntu install test
  • win7 64bit 的燒錄軟體

2010年10月22日 星期五

Mantain log : Sempron26Debian - upgrade to squeeze

因為 lenny 不認識 ext4,被迫要upgrade 到 squeeze。
所以..

修改 source.list
/etc/init.d/gdm stop
還有停止一堆 service (後來發現這不必作)
apt-get dist-upgrade
然後就一堆 complain
....
第二天
apt-get -f upgrade

apt-get install locale
gdm 進不去,說 X 打不開。 -- remove 重新安裝 OK.
deforma-app remove gs

upgrade-from-grub-legacy
aptitude dist-upgrade 又一堆..

終於upgrade 到新 kernel 了.. X 也開得進去.

出現 error in Version string '3.0.12-54655_Debian_lenny': invalid character in revision number follow 這一篇 : dpkg --clear-avail

2010年10月21日 星期四

android, prelink tool

prelink 的 tool 是 apriori (build/tool/apriori) command 是:(build/core/definitions.mk) define transform-to-prelinked @mkdir -p $(dir $@) @echo "target Prelink: $(PRIVATE_MODULE) ($@)" $(hide) $(APRIORI) \ --prelinkmap $(TARGET_PRELINKER_MAP) \ --locals-only \ --quiet \ $< \ --output $@ endef 會依照 Android.mk 中的 LOCAL_PRELINK_MODULE 定義來決定要不要作 prelink。 但是grep 一下,default 好像是 false... 好像沒有找到是 true 的 program..

enable proprietary wifi_csr module in standard bsp

原來 android source code 的 vendor 從 2.2 後改成 device 了。 所以新增自己的 board 要加在 device folder 裡。 原來 prebuild/proprietory 的部分依照各 device/vendor 不同,放在各自的 device\ 內。 v9.0 提供 csr wifi 的 no-disclose driver。 放在 proprietary/wifi_csr 但是因為
  • 是 user
  • makefile 沒有包含在 board mk
所以build 出來的 image 沒有含這些 files 修改:
  • 把 fsl-wifi.mk 的 LOCAL_MODULE_TAGS 由 user 改 eng
  • imx51_bbg/AndroidBoard.mk 中加入 include device/fsl/proprietary/wifi_csr/fsl-wifi.mk
然後重新 make 就可以。 有關 android 的 wifi support,這一篇 port wifi driver to android 有說明

find command in envsetup.sh

Android 的 envsetup.sh 中有 search command , cgrep, jgrep : function jgrep() { find . -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@" } function cgrep() { find . -type f -name "*\.c*" -print0 | xargs -0 grep --color -n "$@" } 可以學起來,search Makefile.. mk 等等其他檔案用。 還有一個是針對 目錄的:resgrep 先找出所有 名為 res 的 folder,再到所有 res folder 裡的.xml 檔裡找.. function resgrep() { for dir in `find . -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done; } 稍微筆記一下: find
  • -type 指定目錄(d) 或是檔案 (f)
  • -name 指定match pattern (string)
-print0, xargs -0
  • find 的輸出用 NULL (0x00) 作結尾,不用 newline
  • xargs 把 0x00 作分別字元,不用 space
find 如果不要包含 "." 開頭的檔案/目錄。可以用 find . -not -name '.*' find 如果要包含很多檔名 pattern,可以用 -o -name 來加: find . -name '*\.java' -o -name '*\.c*' 但是一個 -o 有自己的 option,所以配合起來變成: find . -name '*\.c' -print0 -o -name '*\.h' -print0 | xargs -0 grep pattern

ToDo Today - 一堆..

  • Ask about capability of encoding/decoding in the same time
  • Ask the PAN Serice Center the working weekend of this month
  • standard hello program with share library
  • put strace in system

2010年10月20日 星期三

porting -- pdk document

android kernel source 可以 build 出 pdk,會順便 build 出 document。 在 developement\pdk\readme 有說明 $mkdir dist $time make -j4 pdk pdk_all DIST_DIR=dist 看 build log 可以知道 build 出來的 doc 位置。 但是這個 document link 好像是絕對位置,不是相對位址,所以沒有辦法放到 disk 中 單純的看。 google android site 有提供一個 online 版本(?) Porting http://source.android.com/porting/index.html 好像就是 pdk 的內容。 (或是 這一個 http://pdk.android.com/online-pdk/guide/index.html ) .. 有些 link 點不出來,可以自己看 url ,自己打 link build_system 這一篇要先看,可以減少很多 rebuild 的時間。

build option on building playwav

剛好要try alsa,所以就用 system/extra/sound/playwav 來看 target 是 sound (不是 playwav)。 touch system/extra/sound/playwav.c 看一下 build command.. prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gcc -I system/core/include -I hardware/libhardware/include -I hardware/libhardware_legacy/include -I hardware/ril/include -I dalvik/libnativehelper/include -I frameworks/base/include -I frameworks/base/opengl/include -I external/skia/include -I out/target/product/imx51_BBG/obj/include -I bionic/libc/arch-arm/include -I bionic/libc/include -I bionic/libstdc++/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -I bionic/libm/include -I bionic/libm/include/arch/arm -I bionic/libthread_db/include -I system/extras/sound -I out/target/product/imx51_BBG/obj/EXECUTABLES/sound_intermediates -I out/target/product/imx51_BBG/obj/STATIC_LIBRARIES/libwebcore_intermediates -c -fno-exceptions -Wno-multichar -msoft-float -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -march=armv5te -mtune=xscale -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -include system/core/include/arch/linux-arm/AndroidConfig.h -I system/core/include/arch/linux-arm/ -mthumb-interwork -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -DSK_RELEASE -DNDEBUG -g -Wstrict-aliasing=2 -finline-functions -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -DNDEBUG -UDEBUG -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -MD -o out/target/product/imx51_BBG/obj/EXECUTABLES/sound_intermediates/playwav.o system/extras/sound/playwav.c 果然很麻煩... sound 的 makefile: LOCAL_PATH := $(call my-dir) // 就是 pwd include $(CLEAR_VARS) // 清掉所有變數 LOCAL_MODULE := sound // 這個 program 要用的名字 LOCAL_SRC_FILES := playwav.c LOCAL_MODULE_TAGS := optional // 屬於哪一類的 tag .. 在 make 時會指定 eng, debug, user.. include $(BUILD_EXECUTABLE) 其中LOCAL_MODULE_TAGS 是用來決定build 哪些 target 需要的變數。 像 optional 就永遠不會 build 進 system. 改為 eng 後,在ˋ build eng 時,就會 build 進去。

ToDo Today - 8.1 做好後可以作的事

  • try strace -- 看一下 default share library search path .
  • - makefile /command to build single executable file. (use dynamic linking)
about new nb, the vm
  • archlinux
  • gentoo
  • bsd
  • osx86

2010年10月18日 星期一

筆記 -- LDD3 chapter 14

kernel 2.6 後的 driver model 增加了以下的能力:
  • Power Management and System Shutdown -- 確保 device driver 在系統 power off 和 shutdown 之前都能獲得通知。
  • Communication with User Space -- sysfs
  • Hotpluggable Devices
  • Devices Classes
  • Object Lifecycle
Bus, Device, Class Kobject, Ksets Ksets 是 Kobject 的 container sysfs mount 在 /sys 負責 kernel 的 subsystem,每個 subsystem 都有自己的 Ksets. sysfs 就是在處理 Kobject. udev 把所有資訊藉由 sysfs 公布在 user space。 hotplug 就是由 Kobject 的加入/移除 所引發的。

2010年10月15日 星期五

How to checkout the code from ViewVC link

要 checkout http://code.google.com/chrome/extensions/samples.html 的 sample code。 ViewVC 的 link 是: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/browserAction/set_icon_path/ 對應的 svn link 是? 在 get the code 有說: svn co http://src.chromium.org/svn/trunk/src/chrome/common/extensions/docs/examples/tutorials/getstarted/
Note the difference in the url, namely /viewvc/chrome was replaced with /svn.

2 other ways to do cp

記一下好了,有點好笑 :) 因為 android 沒有包 cp 命令,所以可以改用以下方式: cat sourcefile > destinationfile 或是. dd if=sourcefile of=destinationfile 但是.. android 沒有 cp,但是有 dd ? 從 這裡 看到的

ToDo Today

  • Build/Run strace in Android
  • find out why *.so cannot load in simple Hello program
  • Reading "Writting an ALSA Driver"
  • Run Android x86 in QEMU/Virtualbox -- for reference. and testing.
  • mDDR spec and DCD.

bookmark Writting an ALSA Driver

可能要看一下這個: Writting An ALSA Driver

2010年10月14日 星期四

只要重新產生 system.img

system.img 是 從 out/target/product/imx51_bbg/system 做出來的。 如果改了 這個 folder 的內容,想要重新產生 system.img。不要管 system folde 裡面的 file 的 dependency,可以用 snod 這個 target: make snod 在 build/core/Makefile 可以看到 snod 這個 target: .PHONY: systemimage-nodeps snod systemimage-nodeps snod: $(filter-out systemimage-nodeps snod,$(MAKECMDGOALS)) \ | $(INTERNAL_MKUSERFS) @echo "make $@: ignoring dependencies" $(call build-systemimage-target,$(INSTALLED_SYSTEMIMAGE)) $(hide) $(call assert-max-image-size,$(INSTALLED_SYSTEMIMAGE),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE),yaffs) 有說明是: make system.img ignoring depencies. 至於 做出 system.img 的command,可以用 showcommands 這個 target.. make showcommands snod 這樣 就會 show 出所有 build snod 這個target 的 command: make snod: ignoring dependencies Target system fs image: out/target/product/imx51_bbg/system.img num_blocks=`du -sk out/target/product/imx51_bbg/system | tail -n1 | awk '{print $1;}'`; if [ $num_blocks -lt 20480 ]; then extra_blocks=3072; else extra_blocks=20480; fi ; if [ "" != "" ]; then num_blocks=; num_inodes=4096; else num_blocks=`expr $num_blocks + $extra_blocks` ; num_inodes=`find out/target/product/imx51_bbg/system | wc -l` ; num_inodes=`expr $num_inodes + 500`; fi; out/host/linux-x86/bin/genext2fs -a -d out/target/product/imx51_bbg/system -b $num_blocks -N $num_inodes -m 0 out/target/product/imx51_bbg/system.img; tune2fs -L system out/target/product/imx51_bbg/system.img tune2fs 1.41.11 (14-Mar-2010) tune2fs -j out/target/product/imx51_bbg/system.img tune2fs 1.41.11 (14-Mar-2010) Creating journal inode: done This filesystem will be automatically checked every 20 mounts or 0 days, whichever comes first. Use tune2fs -c or -i to override. tune2fs -C 1 out/target/product/imx51_bbg/system.img tune2fs 1.41.11 (14-Mar-2010) Setting current mount count to 1 e2fsck -fy out/target/product/imx51_bbg/system.img ; [ $? -lt 4 ] e2fsck 1.41.11 (14-Mar-2010) Filesystem did not have a UUID; generating one. Filesystem has feature flag(s) set, but is a revision 0 filesystem. Fix? yes Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity /lost+found not found. Create? yes Pass 4: Checking reference counts Pass 5: Checking group summary information system: ***** FILE SYSTEM WAS MODIFIED ***** system: 596/1144 files (1.8% non-contiguous), 86956/103536 blocks true 大概是用 genext2fs 從 system folder 做出一個ext2 的 system.img。 然後再用 tune2fs -j 把 system.img 轉為 ext3。
這個 build-userimage-ext2-target 定義在 external/genext2fs/Config.mk # $(1): src directory # $(2): output file # $(3): label (if any) # $(4): if true, add journal define build-userimage-ext2-target @mkdir -p $(dir $(2)) $(hide) num_blocks=`du -sk $(1) | tail -n1 | awk '{print $$1;}'`;\ if [ $$num_blocks -lt 20480 ]; then extra_blocks=3072; \ else extra_blocks=20480; fi ; \ num_blocks=`expr $$num_blocks + $$extra_blocks` ; \ num_inodes=`find $(1) | wc -l` ; num_inodes=`expr $$num_inodes + 500`; \ $(MKEXT2IMG) -a -d $(1) -b $$num_blocks -N $$num_inodes -m 0 $(2) $(if $(strip $(3)),\ $(hide) $(TUNE2FS) -L $(strip $(3)) $(2)) $(if $(strip $(4)),\ $(hide) $(TUNE2FS) -j $(2)) $(TUNE2FS) -C 1 $(2) $(E2FSCK) -fy $(2) ; [ $$? -lt 4 ] endef 是在 core/Makefile include 近來的: ifeq ($(TARGET_USERIMAGES_USE_EXT2),true) include external/genext2fs/Config.mk INTERNAL_MKUSERFS := $(MKEXT2IMG) ..

2010年10月13日 星期三

u-boot load ramdisk.img error : Bad Data CRC

放了一些東西到 ramdisk.img,結果 u-boot 在 boot 的時候說: Verifying Checksum ... Bad Data CRC 查一下 u-boot 的 boot cmd,結果load rootfs 的 command 是 cp.b 0x400000 ${rd_loadaddr} 0x4B000 0x4B000 只有 300k,所以才會 fail.. * 看錯了,這個是 copy ram to ram 的 command,應該是用在nfs。 mmc boot 應該要看 mmc read 那個 boot command

mkbootfs -- cpio

android 的 kernel rootfs 是 ramdisk.
製作的 tools是 mkbootfs:

android 的 system/core/cpio 是 mkbootfs 的 source code。

mkbootfs 跟 cpio 很像,但是..好像不需要給 file list,只要給 folder,他就會把folder 所有的內容 archive 起來 (以 cpio 的格式)。

在 build/core/Makefile 中,有 invoke mkbootfs
$(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@ 其中 TARGET_ROOT_OUT 就是先建好的 root folder 。

mkbootfs archive 完後,再交給 gzip 壓縮。

簡單的說,要做出 ramdisk.img,就是.. mkbootfs root | minigzip > ramdisk.img 然後給u-boot 用要.. mkimage -A arm -O linux -T ramdisk -C none -a 0x90308000 -n "Android Root Filesystem" -d ramdisk.img ./uramdisk.img
要解刊 ramdisk 的話..
mv ramdisk.img ramdisk.img.gz gunzip ramdisk.img.gz mkdir worktmp; cd worktmp cpio -i -F ../ramdisk.img
如果是已經用 mkimage 處理過的 uramdisk.img,就要先把 ramdisk.img.gz 抓出來:
$dd if=uramdisk.img of=ramdisk.img.gz bs=1 skip=64 ..據說 mkimage 用 開頭的 64 byte 塞u-boot 資訊。

這樣dd出 ramdisk.img.gz 後,就可以用

ref: http://qustion1234.blogspot.com/2009/09/how-to-extract-ramdisk-content-from.html

scp, ssh without asking password

就是產生一對 public/private dsa key pair (id_dsa, id_dsa.pub)
然後把 id_dsa_pub 的內容 append 到 server 的 loging-username home folder 的 .ssh/authorized_keys 裡。

以 charles@testserver.com 來說,就是 append 到 testserver.com 的 /home/charles/.ssh/authorized_keys

這樣以後 ssh 或 scp charles@testserver.com 都不需要輸入 password 了。

ref: http://www.hostingrails.com/HowTo-SSH-SCP-without-a-password

在client 端產生 public/private key pair: $ ssh-keygen -t dsa 如果都用enter回答,產生的 key 會放在 ~/.ssh 下 copy public key 過去 server $ ssh-copy-id -i ~/.ssh/id_dsa.pub user@'server-ip'


如果client 端 重新run了一次 keygen,這樣 public private key 又對不起來。 連到這個client 的 pc 會出現: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is 2b:92:13:c5:e5:42:e5:6b:d3:41:d0:84:48:03:7c:73. Please contact your system administrator. Add correct host key in /home/charles-chang/.ssh/known_hosts to get rid of this message. Offending key in /home/charles-chang/.ssh/known_hosts:6 RSA host key for 192.168.4.25 has changed and you have requested strict checking. Host key verification failed. 這樣,要請發生fail的 pc 作刪除 host的動作:(remove) ssh-keygen -R 192.168.4.25 再重新連線

有時候發現沒效,到 /var/log/auth.log 看一下,寫:
Authentication refused: bad ownership or modes for directory /home/charles-chang
發現 這個目錄 g 有 w, 所以改掉 (dwxr-xr-x) 之後就 OK 了。

init in Android

android system 的 init 在 system/core/init 要 print message 可以用 INFO( )。 實際上 INFO 是 call log_write ( ), 最後的輸出位置跟 dmesg 一樣。

2010年10月12日 星期二

disable auto mount in ubuntu

partition , format 完,要做 dd 時,要注意最好把 natilus 的 auto mount 關掉。
方法 ref http://www.liberiangeek.net/2010/09/disableenable-auto-mount-ubuntu-10-0410-10-maverick-meerkat/

大概就是:
  • 開啟 gconf-editor
  • 到 apps -- nautilus -- pre-ference-media auto mount open
  • 把 auto mount 的 option 關掉,同時把 never 打開。

另外,到了 xential 時,如果用 lxde 做 desktop。
方法是:
  • 開啟 pcmanfm
  • Edit - Preference - Volume Management
  • Auto Mount 的 option 全部 uncheck

virtualbox guest addition for ubuntu 10.10

VirtualBox 3.2.8 安裝 10.10 , guest addition 不能正常動作。

依照 forume 的說明, download 3.2.9 的 guest addition 就可以:

http://www.virtualbox.org/download/testcase/VBoxGuestAdditions_3.2.9-66155.iso
* 10.10 每次在安裝完或解除 guestion addition 後,螢幕都會變得混亂。

* 2010/10/11 virtualbox 3.2.10 release 了,應該直接support 10.10 (release notes 有說 support 3.2.26 )

2010年10月11日 星期一

worklog - boot from SD card failed.

boot 到.. Freeing init memory 176k 就沒了,ref boot OK 的 log.... 前面應該要有: mmc0: new SD card at address 7e39 mmcblk0: mmc0:7e39 A2GZS 1.87 GiB mmcblk0: p1 p2 p3 <> p4 mmc1: new SD card at address 90bd mmcblk1: mmc1:90bd A2GZS 1.87 GiB mmcblk1: p1但是我的沒有.. 結果是: uboot 的 env environment 沒設。 要設 boot from SD card 的參數。

Virtualbox NAT -- set port forwarding to use ssh

VirtualBox Guest 用 NAT,但是又希望能用 ssh 連進去。
參考一堆,大概是說 VirtualBox 有 extradata 這個參數,可以用vboxmanage setextradata來設。
要設的東西就是你vm 的網卡,要開 Config guest , host port 和 protocol
Key: VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/GuestPort, Value: 22 Key: VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/HostPort, Value: 2222 Key: VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/Protocol, Value: TCP 其中 e1000 這個比較 !@#$,因為如果你選 pcnet 就要寫 pcnet,選 intel 就要寫 e1000..
不然 VM 開機就會有 "找不到 MAC" 的 error。

要找到正確的 device name (pcnet, e1000) 可以到 VM 的 log 目錄,每一個 log 都有,還會有所有 Device 的key name.

設定: c:\VBoxManage.exe setextradata ubuntu910_20G "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/HostPort" 2222 c:\VBoxManage.exe setextradata ubuntu910_20G "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/GuesttPort" 22 c:\VBoxManage.exe setextradata ubuntu910_20G "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/Protocol" TCP
設完後,VM重開就可以用 ssh localhost:2222 連到 VM。


*要刪除的話只要同樣的設 extradata,但是data 是空的就可以。

set structure field and set function - in u-boot

看到 image_set_load( ),卻找不到 實作。 所以猜又是自動產生的 function,改 grep image_set,就發現: mage_set_hdr_l(f) \
        static inline void image_set_##f(image_header_t *hdr, uint32_t val) \
        { \
                hdr->ih_##f = cpu_to_uimage (val); \
        }
所以 image_set_load( ) 也只是在設 structure 的 load 欄位。

新買的 Transend 4G SDHC class 4 SD card (x2)

記錄一下剛買到,fdisk 的資料: Disk /dev/sdb: 3965 MB, 3965190144 bytes 49 heads, 48 sectors/track, 3292 cylinders Units = cylinders of 2352 * 512 = 1204224 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdb1 4 3293 3868160 b W95 FAT32

2010年10月8日 星期五

graphic serial control in ubuntu - gtkterm & putty

ubuntu 上的 hyperterminal 程式,除了 minicom 外,還有 graphic ui 的 gtkterm 跟 putty。 用 apt-get install 就可以安裝了。

HUIWEI EM770 WCDMA module in Linux

HUIWEI EM770 是 WCDMA 的 3G module。
minipci 的 interface,所以都是用 usb 的介面。

插入 ubuntu 10.04 後,dmesg:
[ 34.241471] usb 1-1: new high speed USB device using ehci_hcd and address 2 [ 34.817413] usb 1-1: configuration #1 chosen from 1 choice [ 34.919398] Initializing USB Mass Storage driver... [ 34.922803] usbcore: registered new interface driver usb-storage [ 34.922808] USB Mass Storage support registered. [ 35.331910] usbcore: registered new interface driver usbserial [ 35.332304] USB Serial support registered for generic [ 35.332672] usbcore: registered new interface driver usbserial_generic [ 35.332676] usbserial: USB Serial Driver core [ 35.361189] USB Serial support registered for GSM modem (1-port) [ 35.361218] option 1-1:1.0: GSM modem (1-port) converter detected [ 35.361429] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0 [ 35.361445] option 1-1:1.1: GSM modem (1-port) converter detected [ 35.361568] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1 [ 35.361589] option 1-1:1.2: GSM modem (1-port) converter detected [ 35.363318] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2 [ 35.363419] option 1-1:1.3: GSM modem (1-port) converter detected [ 35.363630] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB3 [ 35.363701] usbcore: registered new interface driver option [ 35.363714] option: v0.7.2:USB Driver for GSM modems 所以知道是 usb-serial device。 介面是 tty。

用 lsusb 來看:

Bus 001 Device 002: ID 12d1:140c Huawei Technologies Co., Ltd.
從 dmesg 可以知道是 usb-serial -- option driver,所以應該是要看: drivers/usb/serial/option.c 裡面有 PID 列表,找一下 lsusb 列出的 VID, PID: #define HUAWEI_VENDOR_ID 0x12D1 ... #define HUAWEI_PRODUCT_E140C 0x140C
開啟 minicom 來試: sudo minicom -s用 -s 做設定。設定 com port 是 /dev/ttyUSB0 save as default 後退出,重新再開 sudo minicom -o因為ttyUSB0.1.2 的全縣,要用 sudo 才可以開啟。
拿 source code 下來看:apt-get install linux-source 會download 在 /usr/src。
這樣拿下來的是 ubuntu patch 好的 kernel。

ubuntu 的 kernel config 會在 /boot/
config 後面會加上 kernel revision name。

把它 copy 到 解開的 kernel source 下, rename 成 .config

Eclipse 開啟 AVD 的速度

記錄一下,不開啟 VM 的時候, 38 sec AVD 開機完畢 (出現開機的鎖定畫面)。

開啟 VM 後,一樣是 38 sec (因為VM沒有 run 很重的 loading ?)

附註:

要記得設定:
Run -- Run Configuration -- Android Application -- Hello Android -- [Page] Target -- Select Prefered AVD for delopement.

"Language Support" not show in Ubuntu 10.04

選中文,安裝完 10.04 後,Administrator 的 "Language Support" 不見了。 找一台 OK的機器,看看 Language Support 的 program name 是 ... gnome-language-selector。 所以手動 啟動,發現有 error,原來這已經是known-bug: gnome-language-selector crashed when started 解決的方法是:
What fixed the issue for me was:

1. Deleting /var/lib/locales/supported.d/local

2. Deleting /usr/lib/locales/* (you may want to backup the data in this directory, to recover if the next step doesn't work)

3. sudo dpkg-reconfigure locales

After that, gnome-language-selector works.

Install Android SDK (again)

整個安裝就是很麻煩...
  • 需要 JDK 跟 eclipse。
  • 從 eclipse 的 help 安裝 ADT (android plugin for Eclipse)

  • 安裝 Android SDK -- 其實就是 download,解開
  • 從 Android SDK 裡的 SDK Manager.exe 安裝需要的 SDK 版本和document

SDK Manager.exe 也可以由 Eclipse 裡的 Windows -- Android SDK and AVD Manager 啟動。
但是要在 Windows -- Peference 中設好 Android SDK 的 Location.

2010年10月7日 星期四

notes on fdisk

fdisk 在 new partition 的時候,first cylinder 的輸入也可以用 +10M 這樣的 size 指定。

iMX51 the very first boot process -- configure DDR controller and load bootloader to run

當設定為 SD/MMC boot。 boot ROM 會從第3 個 sector (第 0x400byte) 讀取 DCD (Device Configuration Data)。
放在 SD/MMC 中,由 boot ROM load 進 DRAM 中 run 的 code 是 u-boot。
所以 u-boot 的 bin 檔要包含這段 DCD 在 bin 的開頭。
imx51 的 uboot 是用 flash_header.S 來完成。
flash_header.o 在 lds 會被擺在 bin 的最前頭。
flash_header.S 的開頭:
.org CONFIG_FLASH_HEADER_OFFSET另外定義 CONFIG_FLASH_HEADER_OFFSET 是 0x400。
另外,在 DCD table 最後是:
.word _end - TEXT_BASE 其中,_end 宣告在 u-boot.lds 中,是 bin 的最後。
TEXT_BASE 定義在 board 的 config.mk。是 u-boot load 到 ram 的位址。

所以在 iMX , DDR 的參數設定是由 boot-rom 的 code 做的,他會參考 boot device 的 DCD 內容設定register,然後再 load bootloader 到 DDR。
要 load 的長度和target address也是寫在 boot device 的 DCD 中。

iMX51 的 boot configuration

ref: freescale forume, freescale user manual 利用 BMOD pin 可以設定四種 boot mode:
  • 00 : Internal Boot (Boot from internal Boot ROM)
  • 01 : -- Reserved
  • 10 : Internal Boot (Boot from internal Boot ROM)
  • 11 : Serial Downloader (UART or USB)
其中 00 和 10 不一樣的地方在 internal boot rom 有沒有參考 gpio 做 boot device 的設定。 iMX51 內部有一個 Boot eFUSE。存放很多 boot configuration 的設定。 table 9-2 有列出eFUSE 中,每一個 option 的名稱,和是否可以由外部 gpio 來 overwrite。 eFUSE 是一個一次性燒錄的區域。可以利用 FreeScale 提供的 tool 來燒錄eFUSE 的值。 boot ROM 開機後,會參考 eFUSE 的內容,決定開機的裝置。
boot mode = 10 boot ROM 完全參考 eFUSE 的內容來動作。但是如果eFUSE 的內容是"un_programmed",會自動切換到 serial download mode,讓 user download boot code。 boot mode = 00 boot ROM 會參考 eFUSE 的內容和 GPIO 的內容。 在 eFUSE 的 table 中有列出哪些 option 對應到外部的 GPIO。 在這個 mode, boot rom code 會參考 GPIO 的值來開機。 這些可以 overwrite eFUSE 設定的 gpio 大多是 有 multiple function (e.g : display_data..),但是只有在 boot 的時候,boot rom 會參考這個 pin 的 high/low 值。 所以 hardware 要設定這些 pin 的 high-low,同時要考慮到不要影響他正常的 funciton 。 -- 也就是 pull-high, pull-low 電阻不可以太小。
開發和量產初期應該都是設為 00。
要使用 SD CARD 來開機,要設定 eFUSE 的:
  • BT_MEM_CTL : 11 - Expansion Device (SD/MMC/EEPROM)
  • BT_MEM_TYPE : 00 - SD/MMC/eMMC/eSD
還可以指定開機的 SD Slot:
  • BT_SRC : 00 - Slot 1, 01 - Slot 2, 10 - Slot 3, 11 - Slot 4.

BBG 上 default 是用 SD 0 開機 (底面),要改用上面的 SD 1 開機,要修改:
  • DIPSW - 6 要是 High
  • uboot 的 env virable : bootcmd 中,mmc read 0 都要改成 mmc read 1
* 可以看 uboot 的 help mmc 看 mmc 這個 command 的用法。

2010年10月5日 星期二

why need preserve 1st sector (mbr) when booting from SDMMC -iMX51

Fdisk 一個 512M SD card,進入後: WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). 用 p 顯示: Disk /dev/sdb: 507 MB, 507379712 bytes 16 heads, 61 sectors/track, 1015 cylinders Units = cylinders of 976 * 512 = 499712 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x6f20736b follow prompt,用 c command 關掉 DOS-compatible mode,就變成: Disk /dev/sdb: 507 MB, 507379712 bytes 16 heads, 61 sectors/track, 1015 cylinders, total 990976 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x6f20736b 可以看到,total unit 變成 total sectors。 bootable SD card 要preserve mbr 的原因是,ref xxx_Linux_UG.pdf: bootloader 需要看 mbr 內/後 的 partition table,好知道boot partition 的位置。 所以partition 好後,燒 bootloader, uImage 時,要把 mbr sector 保存起來,以免燒 bootloader 時被清掉。

Make Sure Virtualbox can detect USB card reader

Virtalbox 使用 USB Card Reader ,要是 差著沒有 format 好的 SD Card 把 Card Reader 插入 usb,VirtualBox 常常會抓不到。
好像是因為 Windows 會因為 SD Card format 不對,所以跳出 "format" 的提示。


所以先插入空的讀卡機,這樣 VirtualBox 就可以 抓到,然後再插入 SD card 就可以了。

worklog .. migrate to larger hd

因為 build 完 android, 20G就用掉 92% (其實我還 tar 了整個android folder)。
所以就想趁早 upgrade hard disk.

最 好的方法大概是 用 archlinux 的方法,手動 parititon 後 copy 舊 hard disk 的系統過來,再 make bootable。

但是有點複雜,所以就用重新安裝的方式,再copy android folder 和 prebuild toolchain 過來。

所以重新 install 完, apt install 需要的 package 後,就 copy 需要的 folder 過去:
$ cp -a myandroid iMx51AndroidBsp ~/ 我也是第一次知道原來 cp 可以一次寫很多個 file/folder name,只有最後一個會被認為是 target name.

... 但是這樣 copy 好像很慢....

2010年10月4日 星期一

Win7 login 公司 server 的 domain name 要用大寫。 DOMAIN\username

工作的備忘 worklog

repo sync 完的 myandroid 壓好 myandroid.tar.gz
但是 kernel_imx 的版本是錯的。
所以重download並且壓一份:kernel_imx.tar.gz

2010年10月1日 星期五

HD benchmark result - Dell Inspiron 14R


backup 一下這一台 Dell inspiron 14R - i5 460M 的 HD benchmark.

fore ref : Nelson 那台Thinkpad, 內建的 HD 是 80M/s, 外接 eSATA 到 Philip 800G 是 90M/s

http://r40eubuntu.blogspot.com/2011/04/new-microsd-card-pendrive.html

標籤

網誌存檔