2011年9月30日 星期五

imx51 bbg板上做出calibration的retry機制

20110929 20110930:
redmine 516
tag = // add calibration retry function

說明:
整個流程:
debug function
check conf file
get framebuff from video info + access framebuff
get ts device as input device form "/dev/input/event" ("/dev/input/event3: is mxc_ts")
do calibration

1.
該程式是nit.rc裡面"exec /sbin/ts_calibrator"執行的.
\sbin\ts_calibrator
\\192.168.144.239\tony-liao\myandroid\device\fsl\imx5x\init.rc

2.
利用檔案來存放calibration的校正值.
如果程式一開始找不到該檔案,就會進入校正畫面,並把新的校正值寫入,可以讓下次開機的時候使用.
\data\system\calibration

3.
利用video的IOcontrol來獲得display相關的資訊
FBIOGET_VSCREENINFO
FBIOGET_FSCREENINFO
這是video driver的位置
\\192.168.144.239\tony-liao\myandroid\kernel_imx\drivers\video\fbmem.c

動作:

修改:
commit 5907ccdf1c2ace52ee66949688dbe3e8ae5bea56
source code:
\\192.168.144.239\tony-liao\myandroid\system\core\ts_calibrator\ts_calibrator.c
int sx[3], sy[3]; // 這是三組預設的點
#define CALIBRATION_OFFSET 40 // 這是預設的誤差範圍
座標系統 : X軸往左是正 Y軸往下是正

calibration bin file:
\\192.168.144.239\tony-liao\myandroid\out\target\product\CV-7000\root\sbin\ts_calibrator

Device calibration info:
\data\system\calibration
\sbin\ts_calibrator

參考:

ts_calibrator.c這個檔案可以學到很多其他的linux技巧,雖然跟calibration沒有直接關係.

mmap 如何利用memory map的方式來達到快速的file access及PCI share memory的方法
http://lazyflai.blogspot.com/2008/06/linuxmmap.html
http://www.lslnet.com/linux/docs/linux-5064.htm
http://fanqiang.chinaunix.net/a4/b8/20010526/110000243_b.html

stat 查詢檔案的狀態
http://new-acos.blogspot.com/2010/02/linuxprocstatcpu.html
http://blog.csdn.net/xuemiao1234/article/details/5544226

EVIOCGNAME 一個巨集來得到裝置的名稱
http://blog.csdn.net/wzz_momo/article/details/6534175
http://hi.baidu.com/zhouhanqing/blog/item/9d18a3cc16020a580eb3451c.html

va_list va_start va_end va_arg 多重且不定的參數如何處理
http://blog.chinaunix.net/space.php?uid=20696246&do=blog&cuid=1892642
http://hi.baidu.com/grdd/blog/item/f21c05b37ef548a0d8335a41.html
http://blog.chinaunix.net/space.php?uid=20691105&do=blog&cuid=1185545

vsnprintf 使用一個固定size的buffer來接收不定參數的方法
http://topic.csdn.net/u/20090710/16/ae72ae61-3dc9-49eb-bbe8-ce2e1823415e.html
http://www.wretch.cc/blog/shinningball/33081867

附註:

2011年9月23日 星期五

BlueTooth要怎麼進測試模式要怎麼搞-3

  • 6. FAE是這麼說滴

以下是FAE所提供的兩個HCI command

實際上操作的結果:
# hcitool cmd 0x03 0x1a 0x03
hcitool cmd 0x03 0x1a 0x03
< HCI Command: ogf 0x03, ocf 0x001a, plen 1
  03
> HCI Event: 0x0e plen 4
  01 1A 0C 00

# hcitool cmd 0x06 0x03
hcitool cmd 0x06 0x03
< HCI Command: ogf 0x06, ocf 0x0003, plen 0
> HCI Event: 0x0e plen 4
  01 03 18 00
 
說明:
1.0
HCI OGF  OCF  para1
hcitool cmd 0x03 0x1a 0x03
引述FAE的描述
"進入測試模式前, 需要下 Page 694 的 7.3.18 Write Scan Enable Command (參數 0x03) 讓模組可以被測試機找到"

1.1
"hcitool cmd 0x03 0x1a 0x03"
OGF=0x03 OCF=0x1a > 這各是參考到 7.3.18 Write Scan Enable Command
"0x03" 參數"0x03"是指 Inquiry Scan enabled + Page Scan enabled.

1.2
"HCI Event: 0x0e plen 4"
"0x0e" 根據7.7.14 Command Complete Event, 是指host端的command已經完成了
"plen 4" 是HCI event的長度
"01 1A 0C 00" 根據7.7.14 Command Complete Event,
"01"表示HCI command的packet的數目(的確只有一個packet)
"1A 0C" 其實是由host HCI command的OGF(MSB-6bit)+OCF(LSB-10bit)組成的 000011 + 0000011010 = 0000 1100 0001 1010 = 0x0C1A
"0" 根據7.3.18 Write Scan Enable Command "0"表示 Write_Scan_Enable command succeeded.

2.0
HCI OGF  OCF
hcitool cmd 0x06 0x03
引述FAE的描述
"Page 774 的 7.6.3 Enable Device Under Test Mode Command 則有進入 DUT 模式的 HCI command, 請參考."

2.1
"hcitool cmd 0x06 0x03"
OGF=0x06 OCF=0x3 > 這各是參考到 7.6.3 Enable Device Under Test Mode Command

2.2
"HCI Event: 0x0e plen 4"
"0x0e" 根據7.7.14 Command Complete Event, 是指host端的command已經完成了
"plen 4" 是HCI event的長度
"01 1A 0C 00" 根據7.7.14 Command Complete Event,
"01"表示HCI command的packet的數目(的確只有一個packet)
"03 18" 其實是由host HCI command的OGF(MSB-6bit)+OCF(LSB-10bit)組成的 000110 + 0000000011 = 0001 1000 0000 0011 = 0x1803
"0" 根據7.6.3 Enable Device Under Test Mode Command, "0"表示 Write_Scan_Enable command succeeded.


  • 7.結論




1.
測試模式的進入似乎是由BT spec所規範了.
所以只要是用HCI command的話應該是一體適用的.
這意味著只要是通過BT spec 2.1的藍芽裝置通通可以使用這一個方法進入測試模式.

2.
整個測試的流程
待測物進入測試模式 -> BT測試治具規畫好測試項目(公司用的是安捷倫N4010A PC端程式remote control)
-> 測試治具會自動完成與待測物的溝通並且收集test plan的相關數據 -> 透過PC端的程式把治具上的數據log下來.

3.
實際上前面1~5點都是BT學習過程的自high內容,真的solution是在第6點的時候才真的可以解決.

2011年8月28日 星期日

BlueTooth要怎麼進測試模式要怎麼搞-2

  • 3. 找新方向想想可樂果 K個data sheet先

Vendor給的文件 建議最好是照順序看  前兩份需要好好理解後面才可以知道怎麼下
1.) 這個在介紹HCI command的格式 是怎麼做的 然後最主要是介紹怎麼加入自訂格式
HCI Extensions (bcore-an-009Pb).pdf
2.) CSR他們家自己自訂的格式 該格式叫做BCCMD
BCCMD Protocol (bcore-sp-002Pc).pdf
3.) 介紹CSR他們家所有的BCCMD指令集 這份是工具書所以大概知道可以查到什麼就好了
BCCMD Commands (bcore-sp-005Pe).pdf

此外還建議可以看看以下這幾個參考


不知道什麼叫做HCI可以看看人家寫的說明
http://www.palowireless.com/infotooth/tutorial/hci.asp#Bluetooth-defined Host Controller Transport Layers

初步介紹BT跟HCI的關係
http://blog.csdn.net/evilcode/article/details/5713847

可以初步理解一下HCI command的格式
http://kunyichen.wordpress.com/2006/11/28/bluetooth-hci-data-format/

HCI command的指令集
http://www.lisha.ufsc.br/teaching/ish/ine5346-2003-1/work/bluetooth/hci_commands.html




  • 4. 直接動手玩玩看

看完了相關介紹 + BT是ok的 + hcitool也有了
這時候可以來玩玩看了


可以直接複製貼上試試看
hcitool cmd 0x3f 0x00 0xc2 0x00 0x00 0x09 0x00 0x34 0x12 0x1a 0x28 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00



如果有看完之前的資料大概就知道 這個要幹嘛了
為了讓希望快速上手的人明白 稍微解釋一下好了
第一行是 HCI extensions的格式說明 其實HCI ext.的格式裡面還有一個欄位是長度 不過我試過了hcitool自己計算這個長度所以並不需要
第二行是說明 BCCMD的格式說明 因為BCCMD每一家廠商都會不一樣 所以格式也不一定就長降子
真的必須在console下的指令式第三行
OGF = 0x3f 這個值是HCI command保留給各家廠商使用自己的格是用的 所以後面如果要加上vendor-spec.的格式就要用這個值
OCF = 0 ; Payload description (PLD) = 0xc2 快速路門不需要懂這個寫降子就對了
接下來的BCD.TYP 就定義在CSR的"BCCMD Protocol (bcore-sp-002Pc).pdf"裡面
BCD.LNG 是指BCCMD的長度 BCCMD的格是很多樣有8-bit 16-bit 32-bit這裡的是16-bit所以 長度是9 (header=5 PL=4)
BCD.SN 是package的流水號 流水號只是要check用的所以只要不重複就沒問題了
BCD.VID 是command set的ID 這個去查BCCMD的data sheet就知道是要做什麼了 0x281a請參考一下這張圖
BCD.STS 是下了command之後的狀態 只要是零就是很滴
BCD.PLx 是各command的參數 根據command的需求而帶進去的參數




由這張圖看來就知道 事情很順利的弄好了 HCI Event有回覆了
0x00 0x03









  • 5. 看一下別人的心路歷程


此外還有些參考到的資料
Nelson研究BT的心路歷程 (公司內部的wiki 外人應該是看不到才對)
http://wiki.royaltek.com/index.php/Verify_bt

Nelson之前研究BT的心路歷程 (Nelson個人的部落格)
http://nelsonchunglife.blogspot.com/search/label/bluetooth

BlueTooth要怎麼進測試模式要怎麼搞-1


  • 0. 故事是醬子滴 

根據CSR的說法要進test mode本來是可以用SPI << 這個最值觀
很可惜我們HW並沒有預留SPI所以沒搞頭
再根據CSR的說法用UART也可以 << 這個他們自己也沒試過
很可惜我們HW也沒預留 所以只能用USB直接來了

對於USB不熟 + HCI不熟 + BlueTooth不熟的人來說很適合玩玩看

對於怎麼對USB直接下command其實我也不太了解
不過好像已經有人訂出醬子的規格了
所以也不需要知道人家怎麼做只要找到對的工具應該就可以直接來了
查來查去好像似乎有個工具叫做"hcitool"的東西
前情提要到此 故事本文要開始囉




  • 1. hcitool

從Nelson的wiki裡 找到了些資料
原來android已經把hcitool包進去了

hcitool的指令集
Commands:
        dev     Display local devices
        inq     Inquire remote devices
        scan    Scan for remote devices
        name    Get name from remote device
        info    Get information from remote
        spinq   Start periodic inquiry
        epinq   Exit periodic inquiry
        cmd     Submit arbitrary HCI comman
        con     Display active connections
        cc      Create connection to remote
        dc      Disconnect from remote devi
        sr      Switch master/slave role
        cpt     Change connection packet ty
        rssi    Display connection RSSI
        lq      Display link quality
        tpl     Display transmit power leve
        afh     Display AFH channel map
        lp      Set/display link policy set
        lst     Set/display link supervisio
        auth    Request authentication
        enc     Set connection encryption
        key     Change connection link key
        clkoff  Read clock offset
        clock   Read local or remote clock
        lescan  Start LE scan
        lecc    Create a LE Connection
        ledc    Disconnect a LE Connection



  • 2. 先來試試看有什麼裝置


# hcitool inq
hcitool inq
Inquiring ...
        E0:F8:47:1E:4D:77       clock offset: 0x25f7    class: 0x3a010c
        00:10:60:E2:A6:29       clock offset: 0x2dae    class: 0x020104
        24:21:AB:9A:61:1B       clock offset: 0x48ad    class: 0x5a0204
        00:16:CF:E3:8D:94       clock offset: 0x6b24    class: 0x00010c
        00:1C:A4:7F:F8:0F       clock offset: 0x49ae    class: 0x520204
        74:F0:6D:C4:81:88       clock offset: 0x34db    class: 0x3e010c
        00:16:CE:DC:DB:1D       clock offset: 0x2f3a    class: 0x3e010c
        00:1D:60:3B:81:79       clock offset: 0x4407    class: 0x1c010c
我的還蠻順利的HCI似乎是通的裝置都找得到
不過由wilki裡面看來Nelson似乎一直找不到device
去問了一下Charles 他提到之前Nelson遇到的情況是USB沒透過Hub直接拉到BT
這跟公板的作法不一樣 所以driver一直起不來 現在起得來的原因是我們的版子也上了Hub
故事看到這裡Nelson似乎跟的我情況不一樣 他在wiki上面的紀錄幾乎都是在處理找不到裝置這件事