ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2011年12月29日 星期四

microcom : busybox version minicom

Busybox 提供一個 serial port 通訊程式,類似 minicom。

microcom -d 1200 -s 115200 /dev/ttyUSB3 : 設定 character timeout 是 1200ms,baudrate 是 115200,對 /dev/ttyUSB3 動作。


package 有問題,ref: http://r40eubuntu.blogspot.tw/2013/10/uart-terminal-with-log-microcom.html

android root fs file,dir attribute

android root 的directory, file attribute 是在製作 root image 時就設定的。
permission 的設定是在 system/core/include/private/android_filesystem_config.h 實際reference ,使用的是: system/core/cpio/mkbootfs.c

2011年12月28日 星期三

CHT E180 (Huawei) 3G dongle in Debian

中華電信的 E180 3G dongle ,實際插入後看 VID, PID 不是 E180。
idVendor=12d1, idProduct=140c 但是和網路上 140C 的 Huawei dongle 不一樣的是,這個(fake) E180 是同時有 3G modem, CD ROM + card reader 三種 device profile 同時啟動。
所以不必用 usb modeswitch 來切換到 usb serial mode。

插入後會看到 6 個裝置:
  1. ttyUSB0-3
  2. CD-ROM
  3. Direct Access ,SD Storage
插入後,用 debian 內建的 network manager 就可以,
依照 SIM card 選 Taiwan, CHT (emome) 就會設定好 APN, dial number..

然後就可以上網了。

Network manager 一旦關閉掉這個 mobile 連線 後,要再重新插拔一次dongle 才會出現..(很慢,大約要 15 sec)。



寄一下這個 sim card 的 default gw 是:10.64.64.64 route : Destination Gateway Genmask Flags Metric Ref Use Iface 10.64.64.64 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ppp0 0.0.0.0 10.64.64.64 0.0.0.0 UG 0 0 0 ppp0


ttyUSB3 好像是 control port,但是一上電,會自動,定期送: ^BOOT:32614906,0,0,0,20 ^SRVST:1 ^MODE:5,4 ^STIN:0,0,0 ^RSSI:13 ^RSSI:13 .. 依照 這一篇(http://forum.huawei.com/jive4/thread.jspa?threadID=328818) 的說法,下 AT^CURC=0 就可以停止這些 unsolicied response.

2011年12月26日 星期一

usb ethernet -- android & linux

開啟 USB Tethering 後...可以參考http://support.google.com/mobile/bin/answer.py?hl=en&answer=182134
文章是說明 XP 的,沒有Linux 的原因是,linux native support ..(?)

實際插入後,dmesg 看.. [ 3322.275837] usb 2-1.1.4.3: new high speed USB device using ehci_hcd and address 7 [ 3322.385272] usb 2-1.1.4.3: New USB device found, idVendor=0fce, idProduct=014f [ 3322.385277] usb 2-1.1.4.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 3322.385280] usb 2-1.1.4.3: Product: SEMC HSUSB Device [ 3322.385282] usb 2-1.1.4.3: Manufacturer: SEMC [ 3322.385285] usb 2-1.1.4.3: SerialNumber: XXXXXXXXXXXX [ 3322.385429] usb 2-1.1.4.3: configuration #1 chosen from 1 choice [ 3360.185459] usb 2-1.1.4.3: USB disconnect, address 7 [ 3360.404499] usb 2-1.1.4.3: new high speed USB device using ehci_hcd and address 8 [ 3360.513935] usb 2-1.1.4.3: New USB device found, idVendor=0fce, idProduct=714f [ 3360.513939] usb 2-1.1.4.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 3360.513942] usb 2-1.1.4.3: Product: SEMC HSUSB Device [ 3360.513945] usb 2-1.1.4.3: Manufacturer: SEMC [ 3360.513947] usb 2-1.1.4.3: SerialNumber: XXXXXXXXXXXX [ 3360.514069] usb 2-1.1.4.3: configuration #1 chosen from 1 choice [ 3360.582488] usbcore: registered new interface driver cdc_ether [ 3360.587738] usb0: register 'rndis_host' at usb-0000:00:1d.0-1.1.4.3, RNDIS device, XX:XX:XX:XX:XX:XX [ 3360.587786] usbcore: registered new interface driver rndis_host [ 3371.666534] usb0: no IPv6 routers present 所以host 要 support,要 enable cdc_ether ,還有 rndis_host。

在 driver/net/usb/Makefile 有: obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o obj-$(CONFIG_USB_NET_RNDIS_HOST) += rndis_host.o
有關 USB_NET_CDCETHER : config USB_NET_CDCETHER tristate "CDC Ethernet support (smart devices such as cable modems)" depends on USB_USBNET default y
所以要 enable USB_USBNET: config USB_USBNET tristate "Multi-purpose USB Networking Framework" select MII 還有,這些是屬於... menu "USB Network Adapters" depends on USB && NET

2011年12月23日 星期五

Use wlan & in-office nic

大概就是
  1. 公司內部的server ,用 eth0
  2. 外部,用 wireless
因為wireless 用 3G-Ap,沒有鎖 port, site。

方法:

就是改 route table,把公司的 ip 導到 eth0,其他都是 wlan0

wireless, ethernet 都接上後, route : $sudo route -n Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.43.0 0.0.0.0 255.255.255.0 U 2 0 0 wlan0 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlan0 0.0.0.0 192.168.43.1 0.0.0.0 UG 0 0 0 wlan0 公司內部又分很多 sub network,我的ethernet 好像是在 192.168.144.0 網段,
所以仙家一下: $sudo route add -net 192.168.144.netmask 255.255.255. dev eth0 然後加上要 access 的 server: $sudo route add -host 191.168.147.233 gw 192.168.144.254 dev eth0 因為公司有分很多 sub net, 144 網段的 gateway 是 254。

這樣就可以了,
-- check 一下 default gw,要是 wireless 的 192.168.43.1。
如果有新增加eth 的 gw,要刪除掉。


還有接上外部網站變慢是 dns 的關係,注意要把 dns 加到 route path 中: sudo route add -host 192.168.147.15 gw 192.168.144.254 dev eth0



一個一個加很白痴,就設 192.168.147.0 的 gw 是 192.168.144.254 就好..
sudo route add -net 192.168.147.0 netmask 255.255.255.0 gw 192.168.144.254 dev eth0

enable dell inspiron N4010 wireless module

先 lspci 看一下 wireless module 是.. 04:00.0 Network controller: Broadcom Corporation BCM4313 802.11b/g/n Wireless LAN Controller (rev 01) 或是用 lshw --class network 看 *-network description: Wireless interface product: BCM4313 802.11b/g/n Wireless LAN Controller vendor: Broadcom Corporation physical id: 0 bus info: pci@0000:04:00.0 logical name: wlan0 version: 01 serial: 5c:ac:4c:98:d7:59 width: 64 bits clock: 33MHz capabilities: pm msi pciexpress bus_master cap_list ethernet physical wireless configuration: broadcast=yes driver=brcm80211 ip=192.168.43.230 latency=0 multicast=yes wireless=IEEE 802.11bgn resources: irq:17 memory:f0300000-f0303fff 知道是 BCM4313

然後 google 到這一篇:http://wiki.debian.org/brcm80211
照著作,安裝 firmware-brcm80211,然後 modprobe..
-- 奇怪我第一次 modprobe 沒效, -r 後再 一次才 iwconfig OK.

裝進去後,就可以在 GUI networkmanager applet看到...
... 就可以操作了..

2011年12月20日 星期二

3G 開通紀錄

紀錄一下,3G 開通。

2011年12月15日 星期四

Activity Stack 只留一個 app (act)

其實就是 setAlwaysFinish 就可以。
-- 如果可以把 system setting 的 default 就設 enable 應該比較漂亮。

不然就在 Code 中: import android.app.ActivityManagerNative; import android.util.Log; try { ActivityManagerNative.getDefault().setAlwaysFinish(true); } catch (RemoteException ex) { Log.d(TAG,"setAlwaysFinish failed!!"); } 結果可以用 adk 的 hierarchyviewer 來看。

2011年12月14日 星期三

use sqilt3 command to show the system settings

android 的 system settings 存放在 sqilt3 database 裡。
所以可以用 sqilt3 command 來檢視/變更。

先開啟 database: #sqilt3 /data/data/com.android.providers.settings/database/settings.db 顯示 所有內容: sqilte>select * from system; 1|volume_music|12 2|volume_ring|5 3|volume_system|7 4|volume_voice|4 5|volume_alarm|6 6|volume_notification|5 7|volume_bluetooth_sco|7 8|mode_ringer|2 9|vibrate_on|4 10|mode_ringer_streams_affected|166 11|mute_streams_affected|46 12|dim_screen|1 13|stay_on_while_plugged_in|0 14|screen_off_timeout|-1 15|emergency_tone|0 16|xec_dls_control|0 17|call_auto_retry|0 18|dtmf_tone_type|0 19|hearing_aid|0 20|tty_mode|0 21|airplane_mode_on|0 22|airplane_mode_radios|cell,bluetooth,wifi 23|airplane_mode_toggleable_radios|bluetooth,wifi 24|auto_time|1 25|screen_brightness|255 26|screen_brightness_mode|0 27|window_animation_scale|1.0 28|transition_animation_scale|1.0 29|accelerometer_rotation|1 30|haptic_feedback_enabled|1 31|notification_light_pulse|1 32|set_install_location|0 33|default_install_location|0 34|power_sounds_enabled|1 35|low_battery_sound|/system/media/audio/ui/LowBattery.ogg 36|dock_sounds_enabled|0 37|desk_dock_sound|/system/media/audio/ui/Dock.ogg 38|desk_undock_sound|/system/media/audio/ui/Undock.ogg 39|car_dock_sound|/system/media/audio/ui/Dock.ogg 40|car_undock_sound|/system/media/audio/ui/Undock.ogg 41|lockscreen_sounds_enabled|0 42|lock_sound|/system/media/audio/ui/Lock.ogg 43|unlock_sound|/system/media/audio/ui/Unlock.ogg 44|vibrate_in_silent|1 45|notifications_use_ring_volume|1 46|next_alarm_formatted| 47|alarm_alert|content://media/internal/audio/media/1 48|notification_sound|content://media/internal/audio/media/2 49|ringtone|content://media/internal/audio/media/3 50|pointer_location|0 52|ServiceIntentActionToResumeSD| 69|MediaPlaybackPath|content://media/external/audio/media/131076 70|always_finish_activities|1 sqlite> default 沒有 show 欄位名稱,可以用: sqlite>.header on 打開,然後再顯示一次.. sqlite> select * from system; _id name value ---------- ------------ ---------- 1 volume_music 12 2 volume_ring 5 3 volume_syste 7 4 volume_voice 4 5 volume_alarm 6 6 volume_notif 5 7 volume_bluet 7 8 mode_ringer 2 ...

limit max process & immediately destroy activity

限制 max activity 的code 是在./services/java/com/android/server/am/ActivityManagerService.java
其中的trimApplication()

call trimApplication 的有:
  1. activityStopped
  2. unregisterReceiver
  3. finishReceiver
另外,還有./services/java/com/android/server/am/ActivityStack.java 的
  1. activityIdleInternal
是在handleMessage( ) 中呼叫。
呼叫的時機:
  1. IDLE_TIMEOUT_MSG
  2. IDLE_NOW_MSG
還有 ./services/java/com/android/server/am/ActivityManagerService.java 的
activityIdle


除了以上的code,在 trimApplication( ) 中可以看到,mProcessLimit 也可以用來限制 activity 的數量。

mProcessLimit 的存取 方法是:
  1. setProcessLimit
  2. getProcessLimit
這個 SET_PROCESS_LIMIT 好像也是 app 的 permission。

在 developement Setting 的 writeProcessLimitOptions( ) 使用到

這個就是 Immediately Destroy Activity 的上一個選項 max process limit (?)

但是實際測試, max process limit=1,和 immediately destroy activity 好像效果不一樣。
以 播放影片的 Gallery 為例:
程式進入,是 GalleryPicker, 選好 folder 後,再開啟 ImageGallery。

當 enable immediately destroy activity 時,可以正常動作。
但是 set max process limit=1 卻不行,要開啟 ImageGallery 時,就 fail 回到GalleryPicker。

activity hierarchy

android 的 activity 是像 stack 一樣堆疊起來。
android sdk 提供一個 tool,讓你看activity stack 的狀態: hierarchyviewer 是 GUI 介面,會自動 update。
用這個 tool,可以看到 stack 的狀態。

實際測試,可以知道 在 app 中按下 HOME key,只是把 launcher 叫出來,原app 被 push 到 stack。

要在該 app 按 BACK,才會從 activity stack 中剔除。

另外,配合上一篇的內容。

當 enable "Immediately destroy activies" 的話。
activity stack 只會留最上面的 app,一旦被推到後面的 app,會從 stack 中移除。
-- 就像按下 BACK 一樣。

但是這只限於 activity。
app 中的 service 並不受影響。




hierarchyviewer 有兩個,一個是 eclipse 的 perspective view,另一個在 out/host/linux-x86/bin 下。
這邊用的是 eclipse 的

update flashplayer 11 for debian squeeze

最近 squeeze 的 chrom 一直 complain flash player plugin 太舊,所以不執行。

所以到 adobe 網站去download,但是沒有 debian 的版本。
只好 download tar.gz 版,自己解開。

google 一下手動安裝。
好像就是把 libflashplayer.so copy 到某個目錄就可以。
其他 /usr /,... 的,大概是因為原來就有 install none-free 版的 rev 10,所以不必用。

這樣,就只要把解開的 libflashplayer.so 覆蓋掉 /usr/lib/flashplugin-nonfree/libflash.so
然後重開 chrome 就可以..

至少沒有 complain,然後 youtube 播放 OK。

test android app state

看看 app 內部的變數,會因為 HOME, BACK 後重啟動而有不同嗎?
test app 就是用 一個 button,按一下 increase 一次 counter,然後看每次啟動 counter 是否被 reset。

import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.Button; import android.widget.LinearLayout; import android.view.View; public class testAndroidActivity extends Activity implements View.OnClickListener { final String TAG = "testAndroid"; LinearLayout layout; Button btn; int clickcnt = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); btn = new Button(this); btn.setText(Integer.toString(clickcnt)); btn.setOnClickListener(this); layout.addView(btn,150,100); setContentView(layout); Log.v(TAG,"onCreate"); } public void onClick(View v) { Log.v(TAG, "onClick"); clickcnt++; btn.setText(Integer.toString(clickcnt)); } 結果..

啟動 app,按button 3 次後, button 顯示 3,然後:
  1. 按下 HOME 後再重新啟動:一樣是 3
  2. 按下 BACK 後再重新啟動:顯示 0 (被 reset)
所以 HOME key 並不會destroy app... back 才會。

實際上, HOME 沒有 destroy app 的說法不一定成立。
.. 到 development setting,設定 "immediately destroy activity"
這樣按 HOME key 每次都會 destroy app..

看 logcat message... enable "immediately destroy activity" 時,
按下 HOME key 的行為就像按下 BACK 一樣 (對單一 activity 的 app 而言)。

android app, input

android 的每個 app 好像都是一個包含完整的 framework 程式。
舉例來說:
framework 的 keyinput 機制,包含在每個 app 中。
所以當按下 HOME 鍵,會因為 app 中的 input framework 會收到 KEYCODE_HOME。

因為 framework 的 input framwework 有處理 HOME key,並且寫好了對 KEYCODE_HOME 的動作: sent intent to HOME。
所以會叫起 Launcher。
....
也就是說,按HOME 鍵,其實是 app 處理 (並沒有一個 處理 home key 的 server process)。 app 裡的 input framework code ,叫起 HOME launcher。

create button without using xml

完全寫在 code 裡的方法, layout 和 button 都不用 xml 定義。
from : http://toimy.blogspot.com/2010/07/android.html
import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.Button; import android.widget.LinearLayout; import android.view.View; public class testAndroidActivity extends Activity implements View.OnClickListener { final String TAG = "testAndroid"; LinearLayout layout; Button btn; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); btn = new Button(this); btn.setText("Button"); btn.setOnClickListener(this); layout.addView(btn,150,50); setContentView(layout); } public void onClick(View v) { Log.v(TAG, "onClick"); } ..

2011年12月13日 星期二

create android project from command line

就是 follow 這一篇: http://developer.android.com/guide/developing/projects/projects-cmdline.html
用 android sdk 提供的 tool : android,來 create project ,
也就是說,幫你把 一堆 xml, java, folder 都create 好,然後填一些基本的東西。

command example: android create project \ --target 1 \ --name MyAndroidApp \ --path ./MyAndroidAppProject \ --activity MyAndroidAppActivity \ --package com.example.myandroid target 的內容可以用 command: android list targets ---------- id: 1 or "android-3" Name: Android 1.5 Type: Platform API level: 3 Revision: 4 Skins: HVGA-L, QVGA-L, HVGA-P, QVGA-P, HVGA (default) ABIs : armeabi ---------- id: 2 or "Google Inc.:Google APIs:3" Name: Google APIs Type: Add-On Vendor: Google Inc. Revision: 3 Description: Android + Google APIs Based on Android 1.5 (API level 3) Libraries: * com.google.android.maps (maps.jar) API for Google Maps Skins: QVGA-P, HVGA (default), HVGA-L, QVGA-L, HVGA-P ABIs : armeabi ---------- id: 3 or "android-4" Name: Android 1.6 Type: Platform API level: 4 Revision: 3 Skins: WVGA800 (default), QVGA, HVGA, WVGA854 ABIs : armeabi path 選項,如果 path 不存在,就會幫你create。
這樣做完後,follow 上一篇,加上 Android.mk ,就可以 build 了。

.. 會出現 error: Android make apk error:This attribute must be localized. 參考這一篇:http://jjnnykimo.pixnet.net/blog/post/31996155-android-make-apk-error%3Athis-attribute-must-be-localized.
把原來寫死的 layout/main.xml 字串,改在 value/string.xml 中,就可以了。

另外這一篇 http://www.kandroid.org/online-pdk/guide/build_cookbook.html 有提供一些 template 寫 Android.mk

2011年12月8日 星期四

some tools from SE released source

Sony-Ericson release 的 source code有一些東西:
  1. kexec-tools : running system 抽換 kernel 的 tool , (當然 kernel 要有 enable kexec 才行)
  2. inputattach : 把新的 serial input device 加到 kernel 的 input system 中 (例如搖桿)
可惜一般的 android kernel 不會 enable KEXEC。所以要用 1 的話,可能要重 build kernel。
2 的話,可能可以用在bluetooth 搖桿上...
bt 搖桿 --> serial 裝置 --> attach 到 kernel input interface

這樣就可以直接 support 利用 kernel input interface 操縱的 ap/system (android support ?)

2011年12月7日 星期三

init/main.c 的 start_kernel : setup_arch(&command_line)
kernel/setup.c 的 __init setup_arch(char **cmdline_p)
  有加 _init,會不會後來又再 run 一次? 
code: struct tag *tags = (struct tag *)&init_tags; struct machine_desc *mdesc; char *from = default_command_line; mdesc = setup_machine(machine_arch_type); machine_name = mdesc->name; if (mdesc->soft_reboot) reboot_setup("s"); if (__atags_pointer) tags = phys_to_virt(__atags_pointer); else if (mdesc->boot_params) tags = phys_to_virt(mdesc->boot_params); else init_tags.mem.start = PHYS_OFFSET; __atags_pointer 是 uboot 傳遞參數的位址,boot_params 也是。

這裡的 boot loader 好像都沒有用,所以是用 PHYS_OFFSET。
這個 constant 每個 chip 定義不一樣。

/arch/arm/plat-mxc/include/mach/memory.h:17:#define MX1_PHYS_OFFSET UL(0x08000000) ./arch/arm/plat-mxc/include/mach/memory.h:18:#define MX21_PHYS_OFFSET UL(0xc0000000) ./arch/arm/plat-mxc/include/mach/memory.h:19:#define MX25_PHYS_OFFSET UL(0x80000000) ./arch/arm/plat-mxc/include/mach/memory.h:20:#define MX27_PHYS_OFFSET UL(0xa0000000) ./arch/arm/plat-mxc/include/mach/memory.h:21:#define MX3x_PHYS_OFFSET UL(0x80000000) ./arch/arm/plat-mxc/include/mach/memory.h:22:#define MX37_PHYS_OFFSET UL(0x40000000) ./arch/arm/plat-mxc/include/mach/memory.h:23:#define MX50_PHYS_OFFSET UL(0x70000000) ./arch/arm/plat-mxc/include/mach/memory.h:24:#define MX51_PHYS_OFFSET UL(0x90000000) ./arch/arm/plat-mxc/include/mach/memory.h:25:#define MX53_PHYS_OFFSET UL(0x70000000) ./arch/arm/plat-mxc/include/mach/memory.h:26:#define MXC91231_PHYS_OFFSET UL(0x90000000) 所以是 MX51 是 0x90000000

property_set/get in android

android 的 property 系統也是一種 IPC 的方法 (用在跟 system 溝通上).
一般 c program 可以用 property_set, property_get 來設定/取得 property 值。

property related function 實做在 system/core/libcutils/propertied.c
基本上就是用 local socket 跟 PROP_SERVICE_NAME 溝通。

property service 好像是在 init 就啟動了.. void start_property_service(void) { int fd; load_properties_from_file(PROP_PATH_SYSTEM_BUILD); load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT); load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE); /* Read persistent properties after all default values have been loaded. */ load_persistent_properties(); fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM, 0666, 0, 0); if(fd < 0) return; fcntl(fd, F_SETFD, FD_CLOEXEC); fcntl(fd, F_SETFL, O_NONBLOCK); listen(fd, 8); property_set_fd = fd; } core/init 這個 process 最後,好像就是在做 property_service.. main() 的最後: for(;;) { ... ... nr = poll(ufds, fd_count, timeout); if (nr <= 0) continue; for (i = 0; i < fd_count; i++) { if (ufds[i].revents == POLLIN) { if (ufds[i].fd == get_property_set_fd()) handle_property_set_fd(); else if (ufds[i].fd == get_keychord_fd()) handle_keychord(); else if (ufds[i].fd == get_signal_fd()) handle_signal(); } } } ufds 就是剛剛 create_socket(PROP_SERVICE_NAME...) 的 fd

這個 source file : core/init/property_service.c 有所有 property 的操作。

像:
persistant property value (以 persistant. 開頭的 property)存放方式,位置: #define PERSISTENT_PROPERTY_DIR "/data/property"

2011年12月5日 星期一

"adb server is out of date. killing"

啟動 adb 時,會出現:"adb server is out of date. killing"。
因為 adb server 被重啟動,所以沒有辦法建立兩個連線。

查這段 message "adb server is out of date. killing",是在 ./system/core/adb/adb_client.c:251: printf("adb server is out of date. killing...\n"); 是 compare version: int adb_connect(const char *service) { // first query the adb server's version int fd = _adb_connect("host:version"); .... char buf[100]; int n; int version = ADB_SERVER_VERSION - 1; // if we have a file descriptor, then parse version result if(readx(fd, buf, 4)) goto error; buf[4] = 0; n = strtoul(buf, 0, 16); if(readx(fd, buf, n)) goto error; adb_close(fd); if (sscanf(buf, "%04x", &version) != 1) goto error; } else { ........ } .... if(version != ADB_SERVER_VERSION) { printf("adb server is out of date. killing...\n"); 就是去詢問 host adb server 的版本,然後和自己比較。
不一樣就 print msg & restart



就在我加上 debug message (print out version),重新 run 後,就 OK 了
===> 所以說,我 pc 上的 adb 版本太舊了...

標籤

網誌存檔