ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年9月27日 星期四

根據 config file 來 mount storage 裝置,並且在各狀態適當的送出 message。

config file 長得: ####################### ## Regular device mount ## ## Format: dev_mount


實際的 code,設計一個 DirectVolume class 來對應每一個 volume directory (也就是 config file 中的一行)。

前面的 label, mount_point, part 在 新 DirectoryVolume 物件生成時傳進去: dv = new DirectVolume(vm, label, mount_point, atoi(part));

後面的 sysfs_path 再一個一個的加進剛剛生成的 DirectVolume 物件中..
(所以一個 label 可以有很多個 sysfs_path ?)
while((sysfs_path = strsep(&next, " \t"))) { if (dv->addPath(sysfs_path)) { SLOGE("Failed to add devpath %s to volume %s", sysfs_path, label); goto out_fail; } }

2012年9月25日 星期二

suspend power button

EIM_A27 -- GPIO2_2_21

static struct power_key_platform_data pwrkey_data = { .key_value = KEY_F4, .register_pwrkey = mxc_register_powerkey, .get_key_status = mxc_pwrkey_getstatus, }; 所以 report key value 是 KEY_F4

然後 KEY_F4 是: ./include/linux/input.h:185:#define KEY_F4 62

2012年9月21日 星期五

android screencast

分為兩部份: agent (run 在 android device),和 screencast 本體 (pc)。

agent 在 pc 程式啟動後,會用 adb push 到 device,然後啟動。

agent 和 screencast program 會建立通道, screen cast 會把 key, mouse event 傳給 agent,
agent 再把 這些command 用 : if(type.equals("pointer")) { wm.injectPointerEvent(getMotionEvent(paramList), false); return; }
把動作輸入到系統。

至於android device 的螢幕,經由另一個 thread,. 抓 fb 的資料傳到 pc... Process p = Runtime.getRuntime().exec("/system/bin/cat /dev/graphics/fb0"); InputStream is = p.getInputStream(); System.out.println("Starting sending framebuffer"); OutputStream os = s.getOutputStream(); byte[] buff = new byte[336*512*2]; while(true) { int nb = is.read(buff); if(nb < -1) break; System.out.println("val "+nb); os.write(buff,0,nb); Thread.sleep(10); } is.close();

2012年9月18日 星期二

__init 只有在開機時需要用到的空間

kernel 升級後,proc 下的某個 module variable 竟然被清成 0 了。

後來發現那個 variable 有 __init 宣告。

所以只有在剛開機時,值還在,開完後就被清掉了。




ref: http://adrianhuang.blogspot.tw/2010/01/linux-kernel-init-initdata.html

所以以前能動真是奇蹟 ...

2012年9月17日 星期一

Nexus s 開始服役

中古機,NT 4500 買的。已經是 jelly bean.

感想,相機真是糟呀,,,

2012年9月14日 星期五

open fail on the 2nd pl2303 cable

接兩個 pl2303,第二條 (ttyUSB1) open 時會有 error。

猜是 kernel 的問題。

看一下,10.4 的 kernel 是2.6.35.3
我把 driver/usb/serial/ 下有用到的 source 都改為 linux-2.6.30.y 的版本
還有 include/linux/usb/serial.h 和一些source 要加上 include slab.h
後,還是一樣不OK。

有一篇說是因為 pl2303 是 1.1,接在 2.0 的 hub/port 上,interrupt 的時間比較長。
沒辦法 match 2.0 的 spec。

所以街一個 1.1 的 hub 再接 pl2303 就可以。

有一篇甚至用 company command echo 1 > ....ehci/company 就可以work!

另一篇有說改 pl2303 用的 interrupt_in_urb 的 structure,把 interrupt 從 1 改 32 就可以,,
這個 interrupt_in_urb 的 structure 好像是在 usb-serial.c 中,,,

所以去修改一下 usb-serial,把 bInterval 增加一下:

在 usb_serial_probe 中..
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 3a38054..3ebe5d0 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c @@ -1005,7 +1005,7 @@ int usb_serial_probe(struct usb_interface *interface, endpoint->bEndpointAddress), port->interrupt_in_buffer, buffer_size, serial->type->read_int_callback, port, - endpoint->bInterval); + endpoint->bInterval+2); } } else if (num_interrupt_in) { dbg("the device claims to support interrupt in transfers, but read_int_callback is not defined");

2012年9月13日 星期四

Add a new entry in Settings. --- save and restore

系統啟動後,Wifi AP Config, restore 的動作好像是在WifiService 作的。

AP Config 好像是存成檔案,不是用 sql 存的。

WifiService 啟動的時候,在 生成函數 WifiService( ) 最後就有: //Initiate a read of Wifi Ap configuration Message.obtain(mWifiHandler, MESSAGE_READ_WIFI_AP_CONFIG).sendToTarget();

對應的 MESSAGE_READ_WIFI_AP_CONFIG 的 handler 是: private class WifiHandler extends Handler { ... ... case MESSAGE_READ_WIFI_AP_CONFIG: readWifiApConfigBlocked(); break;

readWifiApConfigBlocked( ) 是:
DataInputStream in = null; try { WifiConfiguration config = new WifiConfiguration(); in = new DataInputStream(new BufferedInputStream(new FileInputStream( WIFIAP_CONFIG_FILE))); int version = in.readInt(); if (version != 1) { Slog.e(TAG, "Bad version on hotspot configuration file, set defaults"); setDefaultWifiApConfiguration(); return; } config.SSID = in.readUTF(); int authType = in.readInt(); config.allowedKeyManagement.set(authType); if (authType != KeyMgmt.NONE) { config.preSharedKey = in.readUTF(); } synchronized (mWifiApConfigLock) { mWifiApConfig = config; } } catch (IOException ignore) { setDefaultWifiApConfiguration(); } finally {
其中的 WIFI_AP_CONFIG_FILE 是在: private static final String WIFIAP_CONFIG_FILE = Environment.getDataDirectory() + "/misc/wifi/softap.conf";
這個 file 要在 WifiService 只少啟動一次後,才會產生。



系統的其他 component 要得到 wifi ap configuration 要靠 WifiConfiguration 這個 class。
然後是用 Parcel (Android 的 serialize) 作傳送。

所以讀入 config 後,還要修改 WifiConfiguration Parcel 的內容,把 Channel Number 加進去。

2012年9月12日 星期三

Add a new entry in Settings.

設定中一些都是預先寫好的設定輸入格式 class。
source code 都在;

frameworks/base/core/java/android/preference:

 CheckBoxPreference.java
 DialogPreference.java
 EditTextPreference.java
 GenericInflater.java
 ListPreference.java


Preference 的每一頁。的每個 entry 排列,都是寫在 xml 裡。

每一頁的 class 的 onCreate( ),就是作: addPreferencesFromResource(R.xml.wifi_advanced_settings);
把 layout load 進來。
 R.xml.wifi_advanced_settings 對應到 xml/wifi_advanced_settinfgs.xml 

xml 的內容就是 class name, title。


所以要在 wifi_ap mode 新增一個 channel setting,就是:

先在 xml/wifi_ap_settings.xml 新增一個 entry: <ListPreference android:key="wifi_ap_chanell_num" android:title="@string/wifi_ap_channel_num_text" android:persistent="false" />
然後在 字串定義的 xml 把新增個@string/wifi_ap_channel_num_text 定義出來:

values/strings.xml:
<string name="wifi_ap_channel_num_text">Channel Number</string>

光是作這兩個,在 ap setting 最後就可以多一個 Channel Number 的設定選項。

接著作 code 的部份...,


2012年9月11日 星期二

wifi hostspot / hostap channel

Android 的 hotspot 沒有可以設 channel 的地方,找一下..

hotspot 的 daemon 是 /external/hostapd

查了一下有設定 channel 的code。
是啟動時,從 argument 給的 (當然也可以吃 config)。

... 先 JUMP OUT 一下...

在 /system 下找一下 hostap ---- /net/SoftapController.cpp
/* * Arguments: * argv[2] - wlan interface * argv[3] - softap interface * argv[4] - SSID * argv[5] - Security * argv[6] - Key * argv[7] - Channel * argv[8] - Preamble * argv[9] - Max SCB */ int SoftapController::setSoftap(int argc, char *argv[]) {

這個 function 依照 argv[] 寫好 /data/wifi/hostapd.conf,然後用 prop start hostapd。

所以包含設定和啟動。

呼叫這個 function 的是..netd/CommandListener.cpp

int CommandListener::SoftapCmd::runCommand(SocketClient *cli, int argc, char **argv) { ,,,, } else if (!strcmp(argv[1], "set")) { rc = sSoftapCtrl->setSoftap(argc, argv);

簡單來說,就是..如果是 set command,就把所有 argument 包好,交給 setSoftap( )

runCommand( ) 是 CommandListener,是 Android 的一種 Service。

是利用 socket 作 IPC 的 server。
這種 server 用的都是 plain text 。所以找一下 SoftapCmd 的 comand string 是...

CommandListener::SoftapCmd::SoftapCmd() : NetdCommand("softap") { }
所以是 "softap"

之後就是 framework 的 client 端 (呼叫端),找一下 framework...

services/java/com/android/server/NetworkManagementService.java

public void startAccessPoint(WifiConfiguration wifiConfig, String wlanIface, String softapIface) throws IllegalStateException { .... .... else { /** * softap set arg1 arg2 arg3 [arg4 arg5 arg6 arg7 arg8] * argv1 - wlan interface * argv2 - softap interface * argv3 - SSID * argv4 - Security * argv5 - Key * argv6 - Channel * argv7 - Preamble * argv8 - Max SCB */ String str = String.format("softap set " + wlanIface + " " + softapIface + " %s %s %s", convertQuotedString(wifiConfig.SSID), wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_PSK) ? "wpa2-psk" : "open", convertQuotedString(wifiConfig.preSharedKey)); mConnector.doCommand(str); } mConnector.doCommand(String.format("softap startap"));
這段code就是從 WifiConfig 取出 參數值,包裝成 argv[]傳給 softap set

找到!!

code 只有作到參數 arg5,後面 6,7,8 都是用 default。

所以要可以設 hotspot channel,就可以把 argv6 加上去..

所以要作:
  • WifiConfig 新增 softap_channel
  • 設定增加一個 item 設定 softap_channel (1-11)
  • 這段code,增加一個 argument,把 WifiConfig.softap_channel 拿出來

2012年9月3日 星期一

把 ehci-arc.c 和 ehci-hub.c 的 function 都加上 entry message,發現即使平時沒事,都會有:
ehci_watchdog
ehci_work
timer_action
反覆出現。

標籤

網誌存檔