2010年12月20日 星期一

RIL for android

RIL: Radio Interface Layer, RIL控制數據機和提供通訊協定(Protocol)
並且和rild(ril daemon)溝通.
RIL主要是基於AT command來操作,如發命令和response解析等等

*Android ril layer on /hardware/ril
*Android ril 主要分為三塊:
./system/lib/libreference-ril.so
./system/lib/libril.so
./system/bin/rild

reference:http://miox.cc/2009/07/android-gsmrild.html
1. rild:
僅實現一main函數作為整個ril層的入口點,負責完成初始化。

2. libril.so:
與 rild結合相當緊密,是其共享庫,編譯時就已經建立了這一關係。組成部分為ril.cpp,ril_event.cpp。libril.so駐留在 rild這一守護進程中,主要完成同上層通信的工作,接受ril請求並傳遞給librefrence_ril.so, 同時把來自librefrence_ril.so的反饋回傳給調用進程。

3. librefrence_ril.so:
rild通過手 動的dlopen方式加載,結合稍微鬆散,這也是因為librefrence.so主要負責跟Modem硬件通信的緣故。這樣做更方便替換或修改以適配更 多的Modem種類。它轉換來自libril.so的請求為AT命令,同時監控Modem的反饋信息,並傳遞迴libril.so。在初始化時, rild通過符號RIL_Init獲取一組函數指針並以此與之建立聯繫。

4. radiooptions:
radiooptiongs通過獲取啟動參數, 利用socket與rild通信,可供調試時配置Modem參數。



./ril/
|-- CleanSpec.mk
|-- include
| `-- telephony
| |-- ril.h
| `-- ril_cdma_sms.h
|-- libril
| |-- Android.mk
| |-- MODULE_LICENSE_APACHE2
| |-- NOTICE
| |-- ril.cpp
| |-- ril_commands.h
| |-- ril_event.cpp
| |-- ril_event.h
| `-- ril_unsol_commands.h
|-- reference-cdma-sms
| |-- Android.mk
| |-- reference-cdma-sms.c
| `-- reference-cdma-sms.h
|-- reference-ril
| |-- Android.mk
| |-- MODULE_LICENSE_APACHE2
| |-- NOTICE
| |-- at_tok.c
| |-- at_tok.h
| |-- atchannel.c
| |-- atchannel.h
| |-- misc.c
| |-- misc.h
| `-- reference-ril.c
`-- rild
|-- Android.mk
|-- MODULE_LICENSE_APACHE2
|-- NOTICE
|-- radiooptions.c
`-- rild.c


./ril/
|-- CleanSpec.mk
|-- include
| `-- telephony
| |-- ril.h
| `-- ril_cdma_sms.h
|-- libril
| |-- Android.mk
| |-- MODULE_LICENSE_APACHE2
| |-- NOTICE
| |-- ril.cpp
| |-- ril_commands.h
| |-- ril_event.cpp
| |-- ril_event.h
| `-- ril_unsol_commands.h
|-- reference-cdma-sms
| |-- Android.mk
| |-- reference-cdma-sms.c
| `-- reference-cdma-sms.h
|-- reference-ril
| |-- Android.mk
| |-- MODULE_LICENSE_APACHE2
| |-- NOTICE
| |-- at_tok.c
| |-- at_tok.h
| |-- atchannel.c
| |-- atchannel.h
| |-- misc.c
| |-- misc.h
| `-- reference-ril.c
`-- rild
|-- Android.mk
|-- MODULE_LICENSE_APACHE2
|-- NOTICE
|-- radiooptions.c
`-- rild.c

2010年12月14日 星期二

Vim plugin tabbar/easygrep

使用起來也很方便,把下載的tabbar.vim放在Linux環境下的$HOME/.vim/plugin或Windows環境下的C:\Program Files\Vim\vimfiles\plugin就可以啦。

在同時開啓編輯多個檔案時,就會在編輯的上方多出一個TabBar的區域,顯示目前開啓的全部檔案和檔案編號,要切換不同的檔案就用+<檔案編號>就可以了

you may try to delete buffers with:
:bdelete
or
:bd

reference:
http://allen501pc.wordpress.com/2009/12/17/%E6%88%91%E7%9A%84-vim-%E8%A8%AD%E5%AE%9A%E9%85%8D%E7%BD%AE/
http://rickey-nctu.blogspot.com/2009/02/vim-nerd-tree.html


Easygrep:
依照滑鼠的位置來搜尋字串"\"+"vv" in my PC

cscope:
[ Ctrl + \ + s ] : 搜尋游標上的 function 哪邊參考到
[ Ctrl + \ + c ] : 搜尋游標上的 function 哪邊呼叫到
[ Ctrl + \ + g ] : 搜尋游標上的 function 是在哪邊定義的

[ Ctrl + \ + t ] : 跳回下一個位置
[ Ctrl + \ + o ] : 跳回上一個位置

http://blog.chhsu.org/2009/03/multi-projects-of-vim-using-cscope.html

----------------------------------------
*ctags and cscope script file
#!/bin/sh
#Using Ctrl+] and Ctr+T
ctags -R -h ".h.c.s"
#
#find . -name '*.[hc]' | cscope -i - -b -R &
cscope.sh `pwd`

----------------------------------------
cscope.sh

#!/bin/sh
CSCOPE_FILE=cscope.out
if [ -n "$1" ]; then
echo "Source code directory: " $1
echo "Create file map : " $CSCOPE_FILE
find $1 -name "*.h" -o -name "*.c" -o -name "*.cpp" > $CSCOPE_FILE
cscope -bkq -i $CSCOPE_FILE
# cscope -Rbkq
ctags -R
else
echo "Please key-in path of project"
fi

2010年12月13日 星期一

Using diff on VIM

http://www.farmer.idv.tw/index.php?viewDoc=364

*vimdiff FILE_LEFT FILE_RIGHT
*然後在vim的ex模式(也就是"冒號"模式)下輸入:

:vertical diffsplit FILE_RIGHT

更新diff的狀況
:diffupdate

用 do 可以把對面比對的部份的抓過來 , o for "obtain" 。
用 dp 則是把目前視窗比對到的部份的放到對面去。 p for "put"。

:wa 存全部
:diffupdate

2010年12月2日 星期四

Study BT concept

http://dicky-chiang.blogspot.com/2009_07_01_archive.html

先總結一下目前我所認知BT :

藍牙協議堆疊依照其功能可分四層:

* 核心協議層(HCI、LMP、L2CAP、SDP)
* 線纜替換協定層(RFCOMM)
* 電話控制協定層(TCS-BIN)
* 選用協議層(PPP、TCP、IP、UDP、OBEX、IrMC、WAP、WAE)

藍牙規範(Profile)是指藍牙通訊在那一種用途下應該使用的通訊協定和相關的規範。藍牙1.1定義的profile有13個。SIG 認為藍牙裝置有4個最基本的 Profile:

* General Access Profile(GAP)
* Service Discovery Application Profile(SDAP)
* Serial Port Profile(SPP)
* General Object Exchange Profile(GOEP)

我所關心的是核心協議層,其中

LMP(Link Management Protocol):它主要是負責base band與之間控制訊息的交換

HCI(Host Controller Interface):這個介面是用來處理Host與BT device之間的通訊,透過HCI,無論這個BT device是以USB介面還是serial port介面連接到Host,Host都可以存取BT device,聽起來很像是驅動程式,但它卻不會像驅動程式一樣去存取記憶體等資源,它的作法是HCI透過發送命令或是資料封包到BT device,這時BT device也會回覆資訊,所以簡單講,HCI提供了一個uniform的介面來存取BT device

L2CAP(Logic Link Control and Apapation Protocol):L2CAP是負責多工,從上層送來的封包過大時,它是切成適當的大小往下層送,好讓下層可以處理,反之亦然.

SDP(service discovery protocol):簡單的話,這協議定議了如何發現哪個可用的BT deivce,並且在找不到BT device時,同時也有探測的功能.

Bluez它是標準的Linux Bluetooth module,幾乎支援各個BT device

整個BT architecture中,除了硬體的RF module , base band , Link Manager之外

還需要軟體部份的L2CAP,RFcomm module,SDP,TCS 而Bluez就是負責這部份


--------------------------------------------------------------
http://dicky-chiang.blogspot.com/2009_07_01_archive.html

Bluez是官方 Linux Bluetooth stack,由主機控制介面(Host Control Interface ,HCI)層、Bluetooth 協定核心、邏輯鏈路控制和適配協定(Logical Link Control and Adaptation Protocol,L2CAP)、SCO 音訊層、其他 Bluetooth 服務、使用者空間後臺預設程式以及設定工具組成.

而bluez裡面,有一個源始碼叫 hci_core.c ,它是HCI的核心所在,而H4 procotol跟BCSP procotol全都依賴這個HCI core,而H4跟BCSP的源始碼也放在bluez裡叫hci_h4.c和hci_bcsp.c,想更深入了解的人可以先去翻閱.

那H4跟BCSP又是什麼呢?BCSP全名叫BlueCore serial Protocol,而H4是UART的規範,如果是RS232呢?那就是H3 procotol,所以這次的HCI protcol將會用到H4跟BCSP,所以在設置核心時,記得要打勾!!

己經知道BT會用到的protocol之後,再來就是要來了解是誰負責傳/收資料,誰又是負責處理資料.

負責傳/收當然就由UART負責跟硬體層溝通,接著會到serial core,這個serial core會把UART接收到的信號轉成數位,而且handle所有的資料跟接口(ports),並且對該device向tty I/O註冊,而tty I/O會再把它轉換成device並通知核心註冊一個character device,讓你能夠經由terminal對serial port下command.

而處理資料是經過一個叫HCIline discipline,Line disicpline是在同一種serial driver上使用不同科技的一種方法,它是位於serial core的上層,如果說serial是負責控制硬體傳/收資料,那line disicpline就是負責處理這些資料的方法,而且是在user space及kernel space做傳輸.

它會執行封包切割 配置並且產生相對對應的網路資料結構,然後把對應的資料傳送到對應的協定層...沒錯,它將會傳送到H4及BCSP的協定層.

而這顆chip是屬於內置CSR bluetooth並使用UART連接.因為CSR是設計為HCI資料分組,所以必為要用hciattach來通知bluez來鏈結驅動程式.

reference:
http://i-miss-erin.blogspot.com/search/label/bluetooth