2011年8月29日 星期一

Android Power Management, partial wake lock parts

Android 當在 running mode 按第一次 Power 鍵,關螢幕後,Linux kernel 應該是在early_suspend mode,因此如果跟第一次間隔很短(幾秒?)馬上按第二次 Power 鍵 resume 是直接回到關螢幕前的應用程式 intent。

但是如果第二次間隔跟第一次間隔時間,差距到讓 Linux kernel 進入 suspend mode,則resume 時會看到 Launcher 的螢幕鎖頭。

而卡在 early_suspend 會不會進入 suspend mode,則跟 Android 層是否有要 partial wake lock 有關。

目前已知有取得 partial wake lock 的服務(原來有這麼多 XD):

Android eclair-release branch

同步也會卡...

frameworks/base/core/java/android/content/SyncManager.java

正在關機

frameworks/base/core/java/com/android/internal/app/ShutdownThread.java

SD 卡格式化

frameworks/base/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java

使用者互動

frameworks/base/libs/ui/EventHub.cpp

frameworks/base/services/java/com/android/server/WindowManagerService.java

frameworks/base/services/java/com/android/server/NotificationPlayer.java

鬧鐘
frameworks/base/services/java/com/android/server/AlarmManagerService.java

frameworks/base/media/java/android/media/AsyncPlayer.java

使用電話功能

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

frameworks/base/telephony/java/com/android/internal/telephony/RIL.java

frameworks/base/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java

frameworks/base/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java

frameworks/base/telephony/java/com/android/internal/telephony/cdma/CdmaConnection.java

frameworks/base/telephony/java/com/android/internal/telephony/gsm/GsmConnection.java

frameworks/base/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java

RIL HAL driver
hardware/ril/libril/ril.cpp

frameworks/base/voip/java/com/android/server/sip/SipWakeLock.java

簡訊

frameworks/base/telephony/java/com/android/internal/telephony/SMSDispatcher.java
螢幕鎖

frameworks/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java

開啟 GPS 定位服務
frameworks/base/services/jni/com_android_server_location_GpsLocationProvider.cpp
frameworks/base/services/java/com/android/server/LocationManagerService.java
frameworks/base/services/java/com/android/server/location/GpsLocationProvider.java

聽音樂
frameworks/base/services/audioflinger/AudioPolicyService.cpp

藍芽耳機

frameworks/base/core/java/android/bluetooth/HeadsetBase.java

frameworks/base/core/java/android/bluetooth/ScoSocket.java

(有線?)耳機
frameworks/base/services/java/com/android/server/HeadsetObserver.java
frameworks/base/services/java/com/android/server/DevicePolicyManagerService.java

震動也會鎖

frameworks/base/services/java/com/android/server/VibratorService.java

開 Wifi 會鎖

frameworks/base/services/java/com/android/server/WifiService.java
frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java

備份??

frameworks/base/services/java/com/android/server/BackupManagerService.java

??
frameworks/base/services/java/com/android/server/am/ActivityStack.java

??
frameworks/base/tests/BatteryWaster/src/com/android/batterywaster/BatteryWaster.java

實作的檔案如下:

frameworks/base/core/java/android/os/Power.java

frameworks/base/core/java/android/os/PowerManager.java

frameworks/base/services/java/com/android/server/PowerManagerService.java

JNI 介接層:

frameworks/base/core/jni/android_os_Power.cpp

hardware/libhardware_legacy/include/hardware_legacy/power.h

hardware/libhardware_legacy/power/power.c

2011年8月27日 星期六

摘譯 steve jobs 語錄

你是否已經找到終身熱愛的志業?
你是否浪費自己的生命在過別人的生活?
你是否有勇氣追隨自己真實的想法與直覺?
你是否有良好的人際關係,隨著歲月增長而成長的人際關係?
你是否能在幾天,或幾個月內告訴孩子們所有你想到關於十年後的事物?
當生命遭逢巨變,你是否讓你的家人平和的接受生活上的不適與改變?
你是否能夠在離別之前道別,避免將來後悔?

原文來自:Reflecting on Steve Job's Words of Wisdom

2011年8月16日 星期二

Linux gpio & irq mapping

arch/arm/plat-pxa/gpio.c 定義了 pxa_gpio_chip 指的是某一個管理 gpio interrupt 的 register 而一個 register 是 4 bytes,所以最多管 32 根 gpio (irq),例如 pxa270 的 Section 24. Interrupt Controller 定義了 0~39 (扣除 reserved 也用到 33,第 34 根 GPIO),因此保留兩個 gpio_chip 的空間 32*2= 64 個位置給 gpio 對應的 irq number。

Interrupt 借由 Interrupt controller 向 pxa270 發出 request,取得該 pin 腳的 GPIO number,再透過 arch/arm/mach-pxa/include/mach/gpio.h 的 gpio_to_irq 取得 irq number,再指向在

arch/arm/mach-pxa/pxa27x.c 中的 pxa27x_init_irq 與
arch/arm/plat-pxa/gpio.c 中的 pxa_init_gpio 初始化時指定的 gpio 與 irq chip,最後註冊 irq chip 內的 chained_handler ...

Linux 使用 irq_desc 表示某一個 irq,chip level ISR 實作可能是舊式的 __do_IRQ 或採用新的 irq_desc->handle_irq() ,到上一層透過 irq_desc->chip 呼叫不同的 handler

kernel/irq/handle.c 定義了 irq_desc[NR_IRQS], NR_IRQS, nr_irqs 代表目前 Linux kernel 擁有的 irq 總數

另外相關的部份:

arch/arm/plat-pxa/gpio.c

arch/arm/kernel/calls.S 處理的 system call interface

arch/arm/kernel/entry-armv.S 定義 irq_handler, interrupt vector table, dispatcher table

arch/arm/mach-pxa/irq.c 處理的 irq interface

https://www.kernel.org/doc/htmldocs/genericirq/index.html

linux kernel source base: 3.1.0-rc1

參考:

ARM中斷流程

2011年8月7日 星期日

linux nfc kernel driver pn544

讀 linux kernel "Documentation/nfc/nfc-pn544.txt"

感謝作者: Jari Vanhala
聯絡方式: Matti Aaltonen (matti.j.aaltonen at nokia.com)

兩個可參考的驅動程式: "drivers/nfc/pn533.c", "drivers/nfc/pn544.c" 感謝 Nokia 的愛心。

使用 linux kernel 的 misc device, device name /dev/pn544
其中 pn544 有 I2C, SPI, HSU 三種介面但驅動程式只提供 I2C 介面實作

對 user space 介面有 sysfs 的硬體測試與 IOCTL 切換 HCI, firmware update 兩種工作模式,傳輸訊息的方式有三種:read, write, poll

由 user space 傳訊息到 PN544  晶片進行控制,驅動程式目前只傳遞訊息不瞭解訊息內容

溝通協定

正常的 HCI 模式與 firmware update 模式的 read/write 行為不太一樣,因為兩種模式的訊息格式與溝通協定都不同。

HCI模式的溝通協定採用 ETSI 的 HCI spec,firmware update 則另有特殊協定。

HCI 訊息有 8 bit header 跟訊息內容。header 包括訊息長度,最大 33 bytes。傳送出去的訊息需要經過 checksum 驗證。

Firmware update 訊息長度存在第二(MSB)跟第三(LSB)位元組,最大值 1024 bytes.

sysfs 的硬體測試指的是讀取 sysfs 檔案後能將 pn544 轉為 firmware update mode,如果未提供測試則不需要建立此 sysfs 檔案。

使用範例:

 60 Example:
 61 > cat /sys/module/pn544/drivers/i2c\:pn544/3-002b/nfc_test
 62 1

正常運作流程:
device 檔案 open 後 pn544 就給電,未開啟前斷電,一次只能有單一使用者。user space 應用程式使用 HCI 訊息控制。 當有資料可讀時就發出一次中斷,當 user space 下 read 時才從 pn544 實際讀取資料,poll() 檢查 read interrupt state。設定與單元測試都由 user space 的 read/write 完成。

範例 platform data:


78 static int rx71_pn544_nfc_request_resources(struct i2c_client *client)
79 {
80 /* Get and setup the HW resources for the device */
81 }
82
83 static void rx71_pn544_nfc_free_resources(void)
84 {
85 /* Release the HW resources */
86 }
87
88 static void rx71_pn544_nfc_enable(int fw)
89 {
90 /* Turn the device on */
91 }
92
93 static int rx71_pn544_nfc_test(void)
94 {
95 /*
96 * Put the device into the FW update mode
97 * and then back to the normal mode.
98 * Check the behavior and return one on success,
99 * zero on failure.
100 */
101 }
102
103 static void rx71_pn544_nfc_disable(void)
104 {
105 /* turn the power off */
106 }
107
108 static struct pn544_nfc_platform_data rx71_nfc_data = {
109 .request_resources = rx71_pn544_nfc_request_resources,
110 .free_resources = rx71_pn544_nfc_free_resources,
111 .enable = rx71_pn544_nfc_enable,
112 .test = rx71_pn544_nfc_test,
113 .disable = rx71_pn544_nfc_disable,
114 };


NXP pn544 introduction pdf
including: contact less procotols, host interfaces, power cosumption

NXP NFC 的 peer to peer, card emulation, Reader三種模式與使用的溝同協定說明

值得注意的是,就專利版圖來看,目前 NFC 市場並沒有真正的大廠,前六強分別是 Sony, Broadcom, IBM, Nokia, Panasonic, NXP

2011年8月4日 星期四

幫 pxa270 超頻

要幫 pxa270 超頻,先看 linux kernel arch/arm/mach-pxa/pxa27x.c 的
pxa27x_get_clk_frequency_khz() 如何讀出目前系統設定的 520MHz

CPLL 是用Crystal clock: 13MHz * L (16) * N (2.5) = 520MHz
我們 CPLL 目標是 624 MHz 因此外頻不改,只要改倍頻就可以達到:
Crystal clock: 13MHz * L (16) * N (3) = 624MHz

原本讀取是看 CCSR register,設定是設 CCCR,但是 CCCR 設完還要靠 CLKCFG
register 才能使 CCCR 的設定生效。

pxa270 datasheet CLKCFG 是 co-processor 不像 CCCR/CCSR 使用 memory map 後就可
以讀到,因此要使用 gnu arm assembly code,原本 pxa27x_get_clk_frequency_khz() 就有
讀 CLKCFG 的程式碼:



84 /* Read clkcfg register: it has turbo, b, half-turbo (and f) */
85 asm( "mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg) );
86 t = clkcfg & (1 << 0);


然後找到
 Performance Profiling Techniques on Intel ® XScale™ Microarchitecture Processors pdf
有寫入 co-processor 14 register 6 (CLKCFG) 的語法


asm( "mcr\tp14, 0, %0, c6, c0, 0" : : "r" (VAL) );



好久沒看組語 XD,該學一下 GNU ARM assembly