ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年5月30日 星期三

2012年5月29日 星期二

athero wifi sdk in android

ref: http://r40eubuntu.blogspot.com/2012/05/android-enable-wifi-ap-mode.html

wifi driver 分成兩部份: driver ko & proprietary bin。
  1. driver ko: 就是 kernel interface。 -- 這部份有 source code
  2. proprietary bin : driver 啟動時,load 進 wifi module。 -- 這部份沒有 source code
整個 wifi driver 是以 atheros wifi sdk 的方式提供的。

android framework 中,他是在: /system/wlan/atheros/

裡面有兩個 folder ,分別是 driver ko 跟 proprietary bin。

要 build 這個 folder ,還要修改BoardConfig.mk

因為 Android.mk 有: ifneq ($(TARGET_SIMULATOR),true) ifeq ($(BOARD_WLAN_CHIP_AR6003), true) # The board config file for the product must define BOARD_WLAN_ATHEROS_SDK # in order to build the atheros wlan components. ifdef BOARD_WLAN_ATHEROS_SDK include $(BOARD_WLAN_ATHEROS_SDK)/host/Android.mk include $(BOARD_WLAN_ATHEROS_SDK)-proprietary/host/Android.mk endif endif endif 所以這個 folder 可以同時放很多版本的 sdk,然後由 BoardConfig.mk 指定要使用的版本。

修改完 BoardConfig.mk 後,就可以到 /system/wlan/atheros 去 build (mm)。
結果出現 error : ATH_LINUXPATH 沒定義。

到 sdk ../host/Android.mk 去看,發現有針對 TARGET_PRODUCT 作 case build。
所以TARGET_PRODUCT name 有改的,他就不知道了。
改一下,把自己的 product name 加進去。 --- OK

driver OK!



接著是 helper tool ..
先參考 init.rc 看一下啟動的 script tool 是...

好像只有設定 wifi prop 和用 wlan_tool啟動 wpa_supplicant service

發現 imx5x/imx5x.mk 差異頗大..

wlan_tool 包含在 sdk 裡面。

wpa_supplicant 有三個版本,檢查各自的 Android,mk 可以知道:
  1. wpa_supplicant : WPA_SUPPLICANT_VERSION := VER_0_5_X
  2. wpa_supplicant_6 : ifeq ($(WPA_SUPPLICANT_VERSION),VER_0_6_X)
  3. wpa_supplicant_ath : ifeq ($(WPA_SUPPLICANT_VERSION),VER_0_8_ATHEROS)
在 BoardConfig.mk 可以找到要用的版本定義: WPA_SUPPLICANT_VERSION := VER_0_8_ATHEROS


init.rc:

wifi 需要:
  1. /data/misc/wifi 目錄
  2. /data/misc/wifi/wpa_supplicant.conf 檔案
  3. /data/system/wpa_supplicant 目錄
然後要設定 setprop wifi.interface wlan0 mkdir /data/misc/wifi/sockets 0770 wifi wifi mkdir /data/misc/dhcp 0770 dhcp dhcp chown dhcp dhcp /data/misc/dhcp 另外這是 dhcpcd client daemon service dhcpcd_wlan0 /system/bin/logwrapper /system/bin/dhcpcd -d -B wlan0 disabled oneshot 還有 wpa_supplicant , wlan service: service wpa_supplicant /system/bin/wlan_tool wpa_supplicant socket wpa_wlan0 dgram 660 root wifi disabled oneshot service wlan_tool /system/bin/wlan_tool oneshot 另外,wifi 的 jni 中有實做的底層,會在 hardware/libhardware_legacy 的 wifi folder 中。
jni 所 include 的 wifi.h ,就是再 libhardware_legacy/include

test gist

source code 的話...

2012年5月25日 星期五

android: enable wifi ap mode

因為這版bsp,wifi 可以動。所以看看是不是 ap mode 也可以起得來。
直接 enable thethering -- portable Wi-Fi hotspot。
結果是 Error。

log 是.. E/WifiService( 2379): ath: load Wi-Fi driver for AP mode. set_cpu_freq, wp 0 I/wlan_tool( 2679): loadAPdriver+ I/wlan_tool( 2680): AP wifi loading I/wlan_tool( 2684): Try to load AP driver with ifname=softap0 devmode=ap AR6000: configuration opcode 7 is only used for RTOS systems, not Linux systemsD/dalvikvm( 2379): GC_CONCURRENT freed 979K, 45% free 4279K/7751K, external 2765K/3965K, paused 4ms+6ms AR6K: ** HIF layer does not support scatter requests (17) W/Netd ( 2309): action=5, iface=softap0 wmi_control_rx() : Unknown id 0x101e D/Tethering( 2379): interfaceLinkStatusChanged softap0, false D/NetdConnector( 2379): RCV <- {600 Iface linkstate softap0 down} W/Netd ( 2309): action=5, iface=softap0 /Tethering( 2379): interfaceLinkStatusChanged softap0, false D/NetdConnector( 2379): RCV <- {600 Iface linkstate softap0 down} D/Tethering( 2379): softap0 is not a tetherable iface, ignoring W/Netd ( 2309): action=5, iface=softap0 D/Tethering( 2379): interfaceLinkStatusChanged softap0, false D/NetdConnector( 2379): RCV <- {600 Iface added softap0} D/NetdConnector( 2379): RCV <- {600 Iface linkstate softap0 down} I/wlan_tool( 2699): ar6000 AP driver loaded I/wlan_tool( 2701): loadAPdriver- D/SoftapController( 2309): Softap driver stop: 0 D/SoftapController( 2309): fwReloadSoftap: argv[2]:wlan0 argv[3]:AP D/SoftapController( 2309): Softap fwReload - Ok D/SoftapController( 2309): Softap driver start: 0 D/NetdConnector( 2379): SND -> {softap stop wlan0} {null} D/NetdConnector( 2379): RCV <- {200 Softap operation succeeded} D/NetdConnector( 2379): RSP <- {200 Softap operation succeeded} D/NetdConnector( 2379): SND -> {softap fwreload wlan0 AP} {null} D/NetdConnector( 2379): RCV <- {200 Softap operation succeeded} D/NetdConnector( 2379): RSP <- {200 Softap operation succeeded} D/NetdConnector( 2379): SND -> {softap start wlan0} {null} D/NetdConnector( 2379): RCV <- {200 Softap operation succeeded} D/NetdConnector( 2379): RSP <- {200 Softap operation succeeded} E/SoftapController( 2309): AR6000_IOCTL wlap0 set wlan state failed: -1:No such device D/NetdConnector( 2379): SND -> {softap set wlan0 wlap0 "xxxAndroidAP" open null} {null} D/NetdConnector( 2379): RCV <- {400 Softap operation failed (No such device)} D/NetdConnector( 2379): RSP <- {400 Softap operation failed (No such device)} E/WifiService( 2379): Exception in startAccessPoint()

所以問題應該是在: E/SoftapController( 2309): AR6000_IOCTL wlap0 set wlan state failed: -1:No such device
然後記得以前 auron 說過,當初 ap mode fail 是 interface name 不對。
對照一下,果然,前面 wlan_tool 使用 softap0,後面 framework 都用 wlap0。

所以修改一下 wlan_tool
... 這個是在 atheros wifi sdk 的 driver project 中..



附記:auron 改 WifiService.java ,其中 SOFTAP_IFACE=" " 她改 wlan1
要注意 可以作為 tether 的 interface 寫在 framework/base/core/res/res/values/config.xml:

2012年5月17日 星期四

find . contains .git then sun command...

因為加上 bsp 後,有一堆 framework folder 的 git 都沒有列入 manifest 中,
所以用 repo 會找不到。

所以改用 script: 找所有包含 .git 的目錄,然後 run XXX command:
allgit.sh #/bin/sh find . -type d -name '.git' | while read F; do D=$F/../ cd "$D" echo $PWD git $1 cd - > /dev/null echo --------------- done
然後就這樣: allgit.sh status
就是到每個project 去 run 'git status'

2012年5月15日 星期二

kernel logo, splash screen

ref: http://www.imxdev.org/wiki/index.php?title=I.MX25_PDK_U-boot_SplashScreen

這樣看來好像可以寫成 script 自動..
目前 .config 是enable: CONFIG_LOGO_LINUX_CLUT224=y 所以ppm 檔名是: logo_linux_clut244.ppm

實際上轉換檔案的時候,好像 8bpp 的才 OK。
其他好像都會變成單色,
所以最好先follow uboot 的方式,用 imagemagick 把 jpg 轉 8bpp bmp

convert splash.jpg -colors 256 -compress none splash.bmp
然後再把bmp 轉 ppm: bmptoppm splash.bmp | ppmquant 224 | pnmtoplainpnm > drivers/video/logo/logo_linux_clut224.ppm

ref: http://blog.csdn.net/linwhwylb/article/details/7365648
直接轉...
$ convert linux.gif -resize 320x240\! -colors 224 -compress none logo_linux_clut224.ppm 

2012年5月10日 星期四

android : reconnect 3G after disconect wifi

這個 2.3.3 版 android,在 wifi 斷線的時候,好像不會自動把 3G 連回去喔..

之後手動去 mobile data 關掉再開一次,3G 才會繼續連線。

... 但是手機連 2.2. 的都會呀!!!

連線"狀態" 的處理,好像是 ConnectivityService.java 負責的。
每個DISCONNECT, CONNECT 都會有 event 過來。

他負責各 network 的相互關係,例如以上的動作,就是由他完成的。
wifi 只要負責開,關就可以。
wifi 開了之後,ConnectivityService 會知道,他就幫你把其他的網路都關掉。

所以改這裡應該可以叫他把 3g 接回去..


懶得寫,直接貼 diff: services/java/com/android/server/ConnectivityService.java patch | blob | history diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index c782e4e..76c5a15 100644 (file) --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -58,7 +58,7 @@ import java.util.List; */ public class ConnectivityService extends IConnectivityManager.Stub { - private static final boolean DBG = false; + private static final boolean DBG = true; private static final String TAG = "ConnectivityService"; // how long to wait before switching back to a radio's default network @@ -161,6 +161,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { private static final int EVENT_SET_MOBILE_DATA = MAX_NETWORK_STATE_TRACKER_EVENT + 7; + private static final int EVENT_ENABLE_MOBILE_DATA_AGAIN = + MAX_NETWORK_STATE_TRACKER_EVENT + 8; + private Handler mHandler; // list of DeathRecipients used to make sure features are turned off when @@ -896,6 +899,16 @@ public class ConnectivityService extends IConnectivityManager.Stub { (enabled ? ENABLED : DISABLED), 0)); } + /** + * don't care about current state, enable mobiledata anyway + */ + private void enableMobileDataAgain() { + enforceChangePermission(); + if (DBG) Slog.d(TAG,"enableMobileDataAgain"); + + mHandler.sendMessage(mHandler.obtainMessage(EVENT_ENABLE_MOBILE_DATA_AGAIN,0,0)); + } + private void handleSetMobileData(boolean enabled) { if (getMobileDataEnabled() == enabled) return; @@ -921,6 +934,15 @@ public class ConnectivityService extends IConnectivityManager.Stub { } } + private void handleEnableMobileDataAgain() { + if (mNetTrackers[ConnectivityManager.TYPE_MOBILE] != null) { + if (DBG) { + Slog.d(TAG, "enable again : " + mNetTrackers[ConnectivityManager.TYPE_MOBILE]); + } + mNetTrackers[ConnectivityManager.TYPE_MOBILE].reconnect(); + } + } + private int getNumConnectedNetworks() { int numConnectedNets = 0; @@ -969,6 +991,12 @@ public class ConnectivityService extends IConnectivityManager.Stub { int prevNetType = info.getType(); + if(prevNetType == ConnectivityManager.TYPE_WIFI) + if(getMobileDataEnabled()){ + Slog.d(TAG,"wifi disc, recover mobile data"); + enableMobileDataAgain(); + } + mNetTrackers[prevNetType].setTeardownRequested(false); /* * If the disconnected network is not the active one, then don't report @@ -1607,6 +1635,11 @@ public class ConnectivityService extends IConnectivityManager.Stub { handleSetMobileData(enabled); break; } + case EVENT_ENABLE_MOBILE_DATA_AGAIN: + { + handleEnableMobileDataAgain(); + break; + } } } }

其實沒有處理 connectionfail 的情況...
info.getTypeName() -- info.getType(). "mobile"-- TYPE_MOBILE "WIFI" -- TYPE_WIFI getMobileDataEnabled(). setMobileDataEnabled() EVENT_ENABLE_MOBILE_DATA_AGAIN

2012年5月9日 星期三

決定 log 的 buffer (radio, event, main..)

android 有N個 log buffer。
每個 package 在 call log.X( ) 時,會 output 到不同的 buffer。

至於怎麼決定要 output 的 buffer,參考: system/core/liblog/logd_write.c: log_id_t log_id = LOG_ID_MAIN; if (!tag) tag = ""; /* XXX: This needs to go! */ if (!strcmp(tag, "HTC_RIL") || !strncmp(tag, "RIL", 3) || /* Any log tag with "RIL" as the prefix */ !strcmp(tag, "AT") || !strcmp(tag, "GSM") || !strcmp(tag, "STK") || !strcmp(tag, "CDMA") || !strcmp(tag, "PHONE") || !strcmp(tag, "SMS")) log_id = LOG_ID_RADIO;

所以是依照 呼叫 Log 時,第一個參數 字串決定的。

所以要變更某 package 的 log output buffer ,就只有改這個地方囉..hard code tag compare string..

2012年5月8日 星期二

android service & control via property

android 的 service 在 init.rc 中指定(宣告?): service myserver /usr/sbin/myservice user root disabled oneshot 這樣的設定,系統啟動時,是 disabled

然後可以用 property set 來啟動這個 service:

2012年5月7日 星期一

GsmDataConnectionTracker 內有一個 private subclass : private class ApnChangeObserver extends ContentObserver { 在Gsm生成時,註冊 傾聽 database 的變化: apnObserver = new ApnChangeObserver(); p.getContext().getContentResolver().registerContentObserver( Telephony.Carriers.CONTENT_URI, true, apnObserver); 這個 Telephony.Carriers.CONTENT_URI 好像就是 apn list。
所以database 變更 (apn 變更)時,observer 的 onChage 就會被呼叫: public void onChange(boolean selfChange) { sendMessage(obtainMessage(EVENT_APN_CHANGED)); }
送出 EVENT_APN_CHANGED 出去..

同理,handleMessage 收到,就call.. case EVENT_APN_CHANGED: onApnChanged(); break; 還是同一個 class,onApnChanged: if (state != State.DISCONNECTING) { 先斷線,再重連: cleanUpConnection(isConnected, Phone.REASON_APN_CHANGED); if (!isConnected) { // reset reconnect timer mRetryMgr.resetRetryCount(); mReregisterOnReconnectFailure = false; trySetupData(Phone.REASON_APN_CHANGED); trySetupData( ) 一堆檢查後,call phone.notifyDataConnection( )作連線的動作。

2012年5月4日 星期五

wifi 與 mobile 間的連動.

就是 wifi 連上的時候,3G 會被關閉。
wifi 關掉後,3G 又會打開..

從 log 上看.. V/WifiStateTracker( 2408): DhcpHandler: DHCP request succeeded D/NetworkStateTracker( 2408): setDetailed state, old =OBTAINING_IPADDR and new state=CONNECTED V/WifiStateTracker( 2408): IP configuration: ipaddr 192.168.204.177 gateway 192.168.204.254 netmask 255.255.255.0 dns1 192.168.147.15 dns2 192.168.147.240 DHCP server 192.168.204.254 lease 3600 seconds D/ConnectivityService( 2408): NetworkStateTracker.EVENT_STATE_CHANGED D/ConnectivityService( 2408): ConnectivityChange for WIFI: CONNECTED/CONNECTED V/ConnectivityService( 2408): handleConnect : type 1mNetworkPreference9mActiveDefaultNetwork0 V/ConnectivityService( 2408): Policy requires mobile teardown I/pppd ( 3011): Terminating on signal 15 I/pppd ( 3011): Connect time 94.3 minutes. I/pppd ( 3011): Sent 32451 bytes, received 353433 bytes. W/NetworkStateTracker( 2408): Can't set tcp buffer sizes:java.io.FileNotFoundException: /sys/kernel/ipv4/tcp_rmem_min (No such file or directory) D/WifiWatchdogService( 2408): (android.server.ServerThread) AP4 (00:1e:58:30:70:f9) does not require the watchdog D/pppd ( 3011): Script /etc/ppp/ip-down-ppp0 started (pid 3525) D/pppd ( 3011): sent [LCP TermReq id=0x2 "User request"] 好像是 ConnectivityService 負責.

grep 一下 "Policy requires mobile teardown".
結果在:
ConnectivityService.java: Ln1264: private void handleConnect(NetworkInfo info) { int type = info.getType(); // snapshot isFailover, because sendConnectedBroadcast() resets it boolean isFailover = info.isFailover(); NetworkStateTracker thisNet = mNetTrackers[type]; Slog.v(TAG,"handleConnect : type " +type+"mNetworkPreference"+mNetworkPreference+"mActiveDefaultNetwork"+mActiveDefaultNetwork); // if this is a default net and other default is running // kill the one not preferred if (mNetAttributes[type].isDefault()) { if (mActiveDefaultNetwork != -1 && mActiveDefaultNetwork != type) { if ((type != mNetworkPreference && mNetAttributes[mActiveDefaultNetwork].mPriority > mNetAttributes[type].mPriority) || mNetworkPreference == mActiveDefaultNetwork) { // don't accept this one Slog.v(TAG, "Not broadcasting CONNECT_ACTION " + "to torn down network " + info.getTypeName()); teardown(thisNet); return; } else { // tear down the other NetworkStateTracker otherNet = mNetTrackers[mActiveDefaultNetwork]; Slog.v(TAG, "Policy requires " + otherNet.getNetworkInfo().getTypeName() + " teardown"); if (!teardown(otherNet)) { Slog.e(TAG, "Network declined teardown request"); return; } if (isFailover) { otherNet.releaseWakeLock(); } } }
後面的部份: tear down the other.

所以負責 關掉 wifi 後,打開 mobile (3g) 應該是 handleDisconnect ?

但是看 handleDisconnect,好像只是被動的check network failover 是否成功。
沒有真的去 activate anthor network。

開啟這個 class 的 DBG 選項後,再看 log..

結果:android-reconnect-3g-after-disconect-wifi

2012年5月3日 星期四

COPS

COPS 的意義好像很多,現在配合 reference-ril.c 來看一下。
一樣是 reference : HUAWEI UMTS Datacard Modem AT Command Interface Specification V2.3

Operator selection +COPS

設定: +COPS=[<mode> [,<format> [,<oper> [,<rat> ]]]] 這樣的寫法就是說,後面不一定要。

成功的話,會是 OK,如果 MS 有問題,會回: +CME ERROR: ..

詢問:

+COPS? 回應format 跟 set 一樣 : mode, format, oper, rat。

更偉大的是

一些 HUAWEI E180 的at command..

我參考的是 HUAWEI UMTS Datacard Modem AT Command Interface Specification V2.3

因為我的 ril 不能正確顯示 2G, 3G 連線 (永遠顯示 'G'),所以看一下有關 2G, 3G 部份。

首先..
那些 BANDSET, CGAATT 都沒效..

只有看到一個:
^SYSCFG:
依照說明書,是 System Configuration reference setting

^SYSCFG= <mode>,<acqorder>,<band>,<roam>,<srvdomain>

mode: System Mode reference
  • 2: Automatic search
  • 13: GSM Only
  • 14: WCDMA Only
  • 16: No change

acqorder: Network access sequence reference
  • 0 : Automatic search
  • 1 : GSM first, WCDMA later
  • 2 : WCDMA first, GSM later
  • 3 : No change

band : band freq
.. 很複雜,一對數字,設定就照抄就是

roam : Roming support:
  • 0 : Not supported
  • 1 : Roaming is supported
  • 2 : No change

srcdomain : domain setting
  • 0 : CS_ONLY
  • 1 : PS_ONLY
  • 2 : CS_PS
  • 3 : Any
  • 4 : No change


example: AT^SYSCFG? ^SYSCFG:13,1,3FFFFFF,1,2 改 WCDMA first.. AT^SYSCFG=2,2,3FFFFFFF,1,2 OK 看一下: AT^SYSCFG? ^SYSCFG:2,2,3FFFFFFF,1,2
但是我一變更mode 後,dongle 好像有重新開機....

2012年5月2日 星期三

一些reference ril

  1. http://gitorious.org/~hyc/xdandroid/hycs-hardware_xdandroid-ril
  2. http://gitorious.org/linux-on-qualcomm-s-msm/android-htc-ril/blobs/diamond/htcgeneric-ril.c
  3. http://plbl.googlecode.com/svn-history/r29/trunk/Modem/code/sierra-ril-android/aferre-sierra-ril-07b4acc/sierra-ril.c
  4. http://gitorious.org/linux-on-qualcomm-s-msm/android-htc-ril/blobs/diamond/htcgeneric-ril.c
  5. https://github.com/aferre/sierra-ril/blob/master/sierra-ril.c
  6. http://code.google.com/p/plbl/source/browse/trunk/Modem/code/sierra-ril-android/aferre-sierra-ril-07b4acc/sierra-ril.c?r=29
  7. https://github.com/aferre/sierra-ril/commits/master
  8. http://forum.xda-developers.com/showthread.php?t=717785&page=3
  9. https://github.com/DerArtem/huaweigeneric-ril
  10. https://github.com/xiaolu/huaweigeneric-ril
  11. http://androidhtc.git.sourceforge.net/git/gitweb.cgi?p=androidhtc/ril.git;a=commitdiff;h=d13743e18f3512b19a358eb2e7b4289e8e89771f
  12. http://gitorious.org/xdandroid/rootfs/commit/2b715f5/diffs
  13. http://trac.osuosl.org/trac/replicant/wiki/How_to_port_Replicant
  14. http://forum.xda-developers.com/archive/index.php/t-1009112.html
  15. https://gitorious.org/rilspy/rilspy
  16. http://gitorious.org/~hyc/xdandroid/hycs-hardware_xdandroid-ril/commits/androidhtc1
  17. http://www.mail-archive.com/android-porting@googlegroups.com/msg16920.html
  18. http://fecbob.pixnet.net/blog/post/35393886-android-%E4%B8%8B-%E5%B0%8D3g-%E6%A8%A1%E7%B5%84%E9%80%B2%E8%A1%8Cat-%E5%91%BD%E4%BB%A4%E8%AA%BF%E8%A9%A6
  19. http://3g-modem.wetpaint.com/page/executing+AT-commands+under+Windows

標籤

網誌存檔