ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年11月30日 星期五

touch interface in framework

跟 kernel 介面 (/dev) 銜接的 code 好像是 /framework/base/libs/ui/EventHub.cpp

先 scanDir( ),把 /dev/input/ 下所有有效的 file 列出。
然後一一用 openDevice( ) 打開,看看屬於哪一種 input 類型 (keyboard, trackball, touch pad/singl,multi..)
然後決定要不要 monitor


在 frameworks/base/services/java/com/android/server/InputManager.java

kernel 所有的 input driver 都會在 /dev/input/event?

可以用 read



ref:
  • http://ray2501.blogspot.tw/2012/08/keyboard-and-touch-panel.html
  • http://download.farsight.com.cn/download/pdf/Farsight091114-linux-1.pdf
  • http://source.android.com/tech/input/touch-devices.html
  • http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.t
  • http://blog.csdn.net/liwendovo/article/details/7903635
  • http://www.cnblogs.com/tnxk/archive/2012/10/26/2741326.html

2012年11月27日 星期二

platform-device, plat-form-drier : part II

以前寫過一篇: platform-device, platform-driver.

device 就是 hardware,
driver 就是 software。

hardware 是說 memory map 位址區域, irq number。
software 是說 裝置的啟動,偵測,操作,移除 等等動作。


系統上,同一個裝置可以有很多個,
例如:多組 eMMC port。

因為eMMC 的動作都一樣,所以只要寫一組 platform-driver 的 code。
但是每一個 eMMC port mapping 的 DMA, memory map region, irq, hardware detect pin 都不一樣。 所以每一個 eMMC port 都要有一個 platform-device。

platform-device 和 platform-driver 利用 name 來關連,
註冊時,kernel 會比較 name 字串。

所以當 platform-driver 註冊時,kernel 會找是不是有.name 的 device 已經註冊,
如果有找到,就呼叫 platform-driver 的 probe function。
並且把找到的 platform-device 當作參數傳給 probe( )。

2012年11月26日 星期一

繼續:suspend/wakeup, gpio state

iMX51 有 GPIO1-4 ,4 組 gpio port,每個 port 有 32 pin 。

GPIO 控制暫存器的位址是在:
  • 73F8-4000 : GPIO1
  • 73F8-8000 : GPIO2
  • 73F8-C000 : GPIO3
  • 73F9-0000 : GPIO4

2012年11月23日 星期五

linux , suspend/resume driver and kernel

driver/base/sys.c:
int sysdev_suspend(pm_message_t state) { .... list_for_each_entry(sysdev, &cls->kset.list, kobj.entry) { if (drv->suspend) { ret = drv->suspend(sysdev, state);
就 一一把 registered driver 的 suspend( ) 呼叫一次 (如果有的話)。

這個 function 是 kernel/power/suspend.c 的 suspend_enter( ) 呼叫的。
是在 kernel/printk.c 的 suspend_console() 之後,

所以printk 已經印不出 message 了。

如果要看到 message,就要在 boot argument 加上 no_console_suspend=1

2012年11月19日 星期一

iMX51 suspend 最後(底層)的 code

suspend 時,最後 callmx5_suspend_enter( )
會 call 到 suspend_in_iram(suspend_param1, NULL, NULL);

suspend_in_iram 是一個 function pointer. void (*suspend_in_iram)(void *param1, void *param2, void* param3) = NULL; 在 pm_init 時: suspend_param1 = cpu_is_mx51() ? (void *)SUSPEND_ID_MX51: (void *)SUSPEND_ID_MX53; memcpy(suspend_iram_base, cpu_do_suspend_workaround,SZ_4K); suspend_in_iram = (void *)suspend_iram_base; 也就是..把cpu_do_suspend_workaround 這塊區域copy 到 suspend_iram_base 中。
再把 suspend_iram_base 指定給 suspend_in_iram( )

這是因為suspend 時,dram 會disable, 進入 self-refresh,所以不能 access。

所以要把 dram 中的 code 先 copy 到 internal ram (iram) 中,才可以執行。


cpu_do_suspend_workaround 是 assembly code: suspend.S

parameter 1 是 chip ID, 因為這個 function 是mx50,mx51, mx53 共用的。
這段assembly code,作 invalid cache, set ddr to self-refresh mode.
set dd pin to high-z, 然後就進入 wait for interrupt 模式:
    /*
     * PLL1 workaround as the following: For mx51 only.
     * Before enter WFI
     *      (1) switch DDR and ARM to PLL2
     *      (2) Disable AREN bit to avoid PLL1 restart during MFN change)
     *      (3) set PLL1 to ~864Mhz with MFI = 8, MFN = 180, MFD = 179
     *          thus the equation |MFN/(MFD+1)|  < 1
     *      (4) Manual restart PLL1
     *      (5) Wait PLL1 lock
     * After CPU out of WFI
     *      (6) Set PLL1 to 800Mhz with only change MFN to 60, others keep
     *      (7) Wait MFN change complete by delay 4.6us,
     *      (8) Switch DDR and ARM back to PLL1
     */

atmel studio 6 -- project 有 C 和 assembly source

依照一般方法 New Project -- 選 C/C++ project, User Board。

這樣 就會產生 USER_APPLICATION1 的 project。
裡面已經有了main.C

接著在外面用編輯器新增一個 test.S 的 assembly source。
之後再拖拉到 project 的 src folder。

然後就可以 build 了。

2012年11月14日 星期三

atmel xmega : 減少 power down mode 的電流

依據 atmel 的 application note: AVR1010: Minimizing the power consumption of XMEGA devices

Power Reduction Registers

xmega有一組 Power Reduction Registers,可以分別開啟/關個別 component 的 clock,好達到 power reduction 的目的。

但是在 Power-Down Mode,因為 peripherial clk source 已經關掉,所以無論 Power Reduction Registers 的內容是如何,所有周邊都是關掉的。
也就是說,不用費心去設了



GPIO

另外文章有說到 gpio 的設置:

所以 io pin 都設定為 floating 避免影響到週邊,但是要注意,因為內部有 digitial input buffer。
會隨者 io pin 的 floating 電壓作 high/low 的變化,還是會消耗電流。
所以最好讓 io pin 有特定的 high/low 電壓,避免 switching 造成電流消耗。

如果 gpio pin 連接到 類比信號,即使他不是 configure 成 input,都應該要把那一個 pin 的 digital input buffer disable 掉,
-- 可以經由 PINnCTL 來設定。

要減小電流,把所有沒用到的 gpio pin 都enable pull-up 或 pull-down,並且把 digital input buffer disable 掉。


JTAG

JTAG 也可以 disable,好降低耗電,OCD (on chip debugging) 也一樣,
OCD 只能由 fuse disable,JTAG 可以用 software 的方式 disable/enable。

當使用 PDI 介面作 debugging 時,因為完全不需要用到 JTAG 介面,所以可以經由 FUSE 把 JTAG 功能關閉。


Flash & EEPROM

EEPROM 和 flash 也可以關掉,有一個 errata 說明有些裝置在 sleep mode 時,flash 還繼續耗電,
所以在 sleep 前,要手動把 flash 關掉。

2012年11月13日 星期二

subversion web interface : 指定看某個 rev

直接在 browser 上輸入 subversion repo link 的話,他顯示的是最新的狀態,
如果要指定是哪一個 revision ,就要:

在 repo root 後面加上 !svn/bc/<revision_number>/
要注意,是 repo link 的後面,不是整個的最後面。

以 這個 link 來說:
http://svn.yoya.com/PANDA/CVV-7AA0/branches/Charles/SystemController/CVV73AAY_ONOFF/
rev 就要寫成:
http://svn.yoya.com/PANDA/!svn/bc/36097/CVV-7AA0/branches/Charles/SystemController/CVV73AAY_ONOFF/



atxmega128a3 -- adc

xmega A3 有兩組adc 轉換器,
這兩組可以規劃成
  • 同時運作
  • 獨立運作
  • 同步運作


12bit 解析度, 2MHz sampling rate

輸入端可以選擇
  • sigle ended
  • differential
configure 成 differential 時,還有一個 內部 gain 可以選擇。


是 pipeline ADC

pipeline 的設計,把 ADC 的動作,分成很多獨立的 stage,
當第一個stage 完成,把結果交給下一個 stage 後,他就可以繼續下一個 adc 動作,
不用等待每個stage 都作玩。

這樣的設計,可以得到高 sampling rate。



ADC 可以由軟體觸發,或是經由其他的週邊裝置觸發,
ADC 將結果放在 4 個 result register 中的一個,供後續的動作使用。
所以可以利用 DMA 自動將 result 搬移到 memory。

2012年11月12日 星期一

sanyo 行動電源



買了行動電源 ,連著電池,我以為可以用來充電池 ,結果不行。

實際用 Nexus S 測試:

先把 他充飽.

Nexus S從 20% 開始充到 92%, 約 3hr.
-- 還是綠燈

然後用到19%,再繼續充,
充到 60%, 約 1.5hr,已經變成 "橘色" (還是紅色?)。
繼續充...到飽,還是橘色

Nexus S 從 60% 開始充,,充到 80%, 變紅色,繼續..
充到92%. 還沒斷電。

所以大概可以充 2.5 次 (每次 20% --> 90%).

2012年11月9日 星期五

avr-gcc, xmega

avr tool 好像包含在 debian 的標準套件中。
所以用 apt 安裝就可以。
#apt-get install gcc-avr

裝完後,可以用 avr-gcc --target-help 列出 support 的 avr chip.

現在要用的 atxmega128a3,所以可以把輸出用 grep 慮一下。
發現這一版有 support atxmega128a3

這樣 build 的時候就可以用 option: -mmcu=atxmega128a3


也有包含需要的 libc 和 peripherial register definition.

會安裝在 /usr/lib/avr

像 register 的定義,要直接用的話,就只要在 source code include avr/io.h

io.h 會依照 target mcu 的定義來 include 正確的 ioXXXX.h

在 windows 版也一樣, include avr/io.h 就好。
-- 實際上,include avr_compiler.h 就好,他會 include 需要的 io.h, interrupt.h, pgmspace.h .. etc

raspberry_pi, samba share

samba 的話,也跟一般 linux distro 一樣: #sudo apt-get install samba samba-common-bin 然後用 default 的 /etc/samba/smb.conf 就可以。 .. 或是修改,home share, browseable = yes readonly = false

之後要把 user 加進 sambs 中。
因為 default smb.conf 是 sync user account,所以只能加這個系統上有的 user。 $sudo smbpasswd -a pi
輸入 password 兩次後,再 run service samba reload 就可以了。

在 windows 機器上 file browser 輸入 \\ip-address\pi
就會出現 account login 畫面,使用 pi, raspberry 就可以 看到 /home/pi 目錄了。



配上前一篇,可以把 transmission-daemon 的 download path 改到 /hom/pi/downloads 中。


raspbere pi 壞了

不能開機了,ok燈不會亮,console 顯示的是
要Fsck 一下。
看來是sd card 壞掉。
便宜的sd 果然沒好貨。


這次使用標準系統再run 一次,看看還會不會有問題。

如果還有,就要隔開 root/system 和 download parition 了。
-- swap 搞不好也要開一個,不開的話,系統好像會在 /var 下開一個約 100M 的 swap file.


2012年11月8日 星期四

草稿:簡單的小系統 os .. 1

先作 schuduler 和 delay

就只有 8 個 task,每個數字代表一個 priority,每個 priority 只有一個 task。
task 0 是 reserverd system task,作 background task 使用。

這樣 scheduler 就很簡單: SAVECONTEXT; currtaski=0; for(i=7;i>0;i--) if(readytask[i]==true){ currtaski=i; break; } RESTORECONTEXT;
bool readytask[] 就是標示現在是 ready to run 的 task。



delay 要實做,要配合 timer

int delaytask[i];

timer 的 ISR:
for(i=1;i<8;i++) if(delaytask[i]>0){ delaytask[i]--; if(delaytask[i]==0){ readytask[i]=true; delaytask[i]=-1; // for safe } } ... 然後如果有改變,就要 call reschedule()

create task 就超簡單,stack 也是預先宣告好的 array..
createTask(int priority, (void *taskbody)(), int *stack);
task 都create 完,call start_scheduler( ) 就可以了。




download 下來包含 atmel studio 4, 6 的project 檔,可以 build OK (使用 native compileer , not winavr)

Atmel Xmega 架構說明

這個應該要參考 XMEGA D Manual (doc8210.pdf)

  • harvard architecture -- seperate program and data bus
  • single level pipeline, one executed, one pre-fetch (這樣不就是 2 level ?)
  • 是 8/16 bit risc microcontrollers (8/16 是什麼意思?)
  • 32 個8bit general purpose working registers.
  • 有 program memory (flash),EEPROM 和 SRAM
  • Stack in RAM
  • Stack pointer accessible in I/O memory space
  • direct addressing 16MB , both data and program memory
  • 16/24 bit I/O registers (?)
  • I/O status & control registers 位於 lowest 4KB data memory addess
  • SRAM 的位置是由 0x2000 開始
  • EEPROM 是 0x1000 到 0x1FFF
  • program memory 被分成兩部份:boot program section, application program section

跟 context switch 最有關係的是 stack 和 status register。

Status Register : SREG
  • 在 interrupt 發生時,cpu 並不會作 save-restore 的動作,需要寫出code來作
  • SREG 也被mapping 在 I/O memory space,所以可以自由存取

Stack & Stack Register : SP
  • Stack Register 的size 是兩個 byte,一樣mapping 到 I/O memory 的位置,佔兩個位址
  • 和一般 Stack 一樣,初始在高位址,push 時減少address。
  • CPU reset 時,SP 的初始值是 SRAM 的最高位址
  • SP 也可以由軟體更改,但是必須要在0x2000 以上
  • 執行中斷和call指令時,return address 會自行 push 到 stack,同樣的 RET, RETI 指令會自動 pop
  • 執行 中斷, call, RET, RETI 命令時,每次push/pop 的size 隨裝置的program memory 大小而有不同,program memory 小於 128k 的裝置,每次 push/pop 2 個 byte,大於 128k 的,每次三個 byte
  • 值行單純的 push, pop 命令時,每次只能對 1 個 byte 操作
  • 當變更 SPL (SP 內容) 時,會自動 disable interrupt 4 個 instruction cycle



這樣的架構是可以support rtos 的,
這篇文章有說明在 interrupt routine 中,preserve/restore context 的code:
Preserving sreg in AVR interrupts

在avrfreak 有一篇 freeRTOS , atxmega128a1 port 的code,
這段是寫在 include/FreeRTOS v6.1.0/ISR_Support.h 中。

2012年11月7日 星期三

bootloader for atxmega

Xmega_bootloader 是一個給 atmel xmega 系列的 bootloader,

從他的 readme 可以知道,這個 bootloader 藉由 某一pin 的狀態,決定是 normal boot 還是進入 programming mode。

一旦進入 programming mode 後,他就會從 serial port 收取資料,
program 自己的 program memory , eepron..

serial port 的 protocol 是 AVR9001。

2012年11月2日 星期五

16g sd 開始運作

pchome 買的,兩片600.


2012年11月1日 星期四

Raspberry pi -- ssh 檔案名稱亂碼

上次用 transmission-daemon download 下來的檔案,有些是亂碼,導致在 ssh 下 無法刪除。
這是因為 locale 沒設定正確。

所以 follow 這一篇,設定 : #dpkg-reconfigure locales
我好像只有選中文, 中文 utf8,和簡體,簡體 utf8。
然後 default 選中文 utf8。

之後就可以在 ssh 中正常顯示了。

然後發現每次 apt-get install 都會有 error message 出現,用 locale 看一下也有 error message: locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory LANG=en_US.utf8 LANGUAGE= LC_CTYPE="en_US.utf8" LC_NUMERIC="en_US.utf8" LC_TIME="en_US.utf8" LC_COLLATE="en_US.utf8" LC_MONETARY="en_US.utf8" LC_MESSAGES="en_US.utf8" LC_PAPER="en_US.utf8" LC_NAME="en_US.utf8" LC_ADDRESS="en_US.utf8" LC_TELEPHONE="en_US.utf8" LC_MEASUREMENT="en_US.utf8" LC_IDENTIFICATION="en_US.utf8" LC_ALL= 所以重新 run dpkg-reconfigure locales
把 en_US.utf8 加進來。這樣就可以了。

標籤

網誌存檔