2010年12月24日 星期五

Android GPS porting HAL code

http://kb.cnblogs.com/a/1682913/
and
http://source.android.com/porting/gps.html
說要根據gps.h去implement gps driver (libgps.so)


http://blog.chinaunix.net/u3/118873/showart_2339574.html
有解釋GPS底層檔案分佈, JNI以及Android提供service的部份

http://www.douban.com/note/80170485/
提供Application開啟GPS呼叫到底層回覆的過程

有人回應說需要implement HAL
http://groups.google.com/group/android-developers/browse_thread/thread/3bb4dd9070451df2#

http://blog.chinaunix.net/u1/56680/showart_2143187.html
android gps 需要實做HAL(hardware abstruct layer)

該怎麼作呢

參考glgps.c
用mm來buidl libhardware_legacy.so
所以要想辦法讓mm可以build出libhardware_legacy.so


Modify
/device/fsl/imx51_bbg/BoardConfig.mk

add BOARD_GPS_LIBRARIES := libgps

switch  /hardware/libhardware_legacy

choosecombo設定一下平台


Build for the simulator or the device?
     1. Device
     2. Simulator

Which would you like? [1]


Build type choices are:
     1. release
     2. debug

Which would you like? [1]


Which product would you like? [imx51_bbg]


Variant choices are:
     1. user
     2. userdebug
     3. eng
Which would you like? [eng]

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.2
TARGET_PRODUCT=imx51_bbg
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=FRF85B
============================================

build:

elsonchung@gps1004:~/myandroid9.1/hardware/libhardware_legacy$ mm 
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.2
TARGET_PRODUCT=imx51_bbg
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=FRF85B
============================================
No private recovery resources for TARGET_DEVICE imx51_bbg
make: Entering directory `/home/nelsonchung/myandroid9.1'
Copy: out/target/product/imx51_bbg/root/init.rc
target thumb C: libhardware_legacy <= hardware/libhardware_legacy/gps/glgps.c
target SharedLib: libhardware_legacy (out/target/product/imx51_bbg/obj/SHARED_LIBRARIES/libhardware_legacy_intermediates/LINKED/libhardware_legacy.so)
target Prelink: libhardware_legacy (out/target/product/imx51_bbg/symbols/system/lib/libhardware_legacy.so)
libelfcopy: Warning: Range lists in .debug_info section aren't in ascending order!
libelfcopy: Warning: Range lists in .debug_ranges section start at 0x5a8
target Strip: libhardware_legacy (out/target/product/imx51_bbg/obj/lib/libhardware_legacy.so)
Install: out/target/product/imx51_bbg/system/lib/libhardware_legacy.so
make: Leaving directory `/home/nelsonchung/myandroid9.1'

如果用mm showcommands
可以看到
glgps.c 編譯成glgps.o 並放到out/target/product/imx51_bbg/obj/SHARED_LIBRARIES/libhardware_legacy_intermediates/gps/

message:
out/target/product/imx51_bbg/obj/SHARED_LIBRARIES/libhardware_legacy_intermediates/gps/glgps.o hardware/libhardware_legacy/gps/glgps.c

最後編譯好的libhardware_legacy.so就會放到以下路徑
out/target/product/imx51_bbg/system/lib/libhardware_legacy.so

croot
make snod
去產生system.img

這之間為了讓Android能夠正常起來
follow http://nelsonchunglife.blogspot.com/2010/12/disable-original-audio-driver-and.html
重新編譯了system.img

使用Denny寫好的GPSDemo
利用adb install X.apk裝到機器上

操作Panel
Settings-->Applications-->Manage applications-->Downloaded
就會看到剛剛install的程式
點擊執行
能夠看到在glgps.c裡面加上的message

D/gps_BRCM( 2106): *****20101216: gps_init *****
AP還沒看到gps相關訊息
底層有些訊息值得參考
E/ThrottleService( 2102): Could not open GPS configuration file /etc/gps.conf

W/GpsLocationProvider( 2102): Could not open GPS configuration file /etc/gps.conf

D/gps_BRCM( 2102): *****20101216: gps_init *****
D/gps_BRCM( 2102): gps state initialized
D/gps_BRCM( 2102): gps thread running

Could not open GPS configuration file /etc/gps.conf的訊息只是warning not error.
follow this information.
http://groups.google.com/group/android-framework/browse_thread/thread/9c2a9b8b7c7fb394

發現卡住epoll_wait

恢復預設值 /cache/gpspipe
執行GPSDemo 出現
E/GpsLocationProvider( 2107): native_start failed in startNavigating()
設成 /dev/ttymxc1
看一下會不會
E/GpsLocationProvider( 2107): native_start failed in startNavigating()
一樣

此錯誤訊息發生在GpsLocationProvider.java的startNavigating()

因為將gps mode設成 GPS_POSITION_MODE_MS_BASED
造成HAL(glgps.c)判斷gps mode非 GPS_POSITION_MODE_STANDALONE回傳false
而出現的錯誤訊息

誰應該設定gps mode為 GPS_POSITION_MODE_STANDALONE呢?

是根據這行判斷而來的

           if (Settings.Secure.getInt(mContext.getContentResolver(),
                    Settings.Secure.ASSISTED_GPS_ENABLED, 1) != 0) {
                positionMode = GPS_POSITION_MODE_MS_BASED;
            } else {
                positionMode = GPS_POSITION_MODE_STANDALONE;
            }

Denny 說 ASSISTED_GPS_ENABLED 就是所謂的AGPS.
Android 2.2版已經建議移除

上面code的意思是 如果ASSISTEND_GPS_ENABLED沒有定義
會回傳第三個參數值(1)
1 != 0
所以設定成GPS_POSITION_MODE_MS_BASED

參考
http://developer.android.com/reference/android/provider/Settings.Secure.html#getInt(android.content.ContentResolver, java.lang.String, int)

compare /hardware/qcom/gps/loc_api/libloc_api/loc_eng.cpp with /hardware/libhardware_legacy/gps/glgps.c

loc_eng_set_position_mode and gps_set_position_mode


            if (!native_start(positionMode, false, 1)) {
                mStarted = false;
                Log.e(TAG, "native_start failed in startNavigating()");
                return;
            }



nelsonchung@gps1004:~/myandroid9.1$ cgrep native_start
./frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:519:    {"native_start", "(IZI)Z", (void*)android_location_GpsLocationProvider_start},

native_start會對應到 android_location_GpsLocationProvider_start

--

建立軟連結的方式
modify the content on /device/fsl/imx5x/init.rc
symlink /dev/ttymxc1 /pipe
在將glgps.c GPS_PIPE 由原先的 /cache/gpspipe 改成 /gpspipe
就不會發生open com port fail的問題
猜測是權限的問題
叫glgps.c檔案起來的process權限可能不足
--

之後open後回傳fd去作註冊的動作epoll_register
就不會一直卡在epoll_wait

epoll是linux為了改善poll的機制
透過發送event的方式改善performance

註冊完之後如果該com port有送出訊息的話
linux就會送出event出來
就可以繼續往後執行

之後用read方式讀取gps nmea
透過nmea_reader_addc丟給Android structure - NmeaReader
之後透過nmea_reader_set_callback回應給Android gps interface.

這樣子之後用Denny GPSDemo程式可以讀到經緯度的資料

另外
GPS status and nmea還沒辦法完整呈現

透過Facebook分享

134 則留言:

Danny 提到...

你好, 最近我也在porting GPS driver, 搞了很久後看到你這篇文章, 所以想跟你請教一下是否知道我的問題在哪裡. 先附上Logcat的訊息
E/lib_api_rpc_glue( 806): Trying to create RPC client...
E/RPC ( 806): error opening /dev/oncrpc/3000008c:00010000: No such file or directory
E/RPC ( 806): ERROR OPENING [/dev/oncrpc/3000008c:00010000]: No such file or directory
E/RPC ( 806): failed to initialize client (permissions?)!
E/lib_api_rpc_glue( 806): Created loc_api_clnt ---- 0
D/lib_locapi( 806): loc_eng_set_gps_lock mode, client = -1234, lock_type = 1
D/lib_locapi( 806): loc_eng_set_gps_lock mode failed
我在想是不是沒有/dev/oncrpc/3000008c:00010000所以導致失敗, 但是我上網找了很久都找不到如何建立此檔案, 應該不是讓我自己建立device node吧. 請問您當初有遇過這個問題嗎? 謝謝

Danny 提到...

想順便請問一下, 有了libhardware_legacy.so是否還需要libgps.so呢? 謝謝

鍾志均 提到...

先回答第二個問題
看你的code最後build出來的是libhardware_legancy.so or liggps.so
可以從Android.mk看出

鍾志均 提到...

回答第一個問題
從訊息看來
你的程式想要開啟gps path - /dev/oncrpc/3000008c
卻無法開啟

請先確認是否真的有這個path

如果沒有

請修改成可以讀到你的gps nmea的位置

ex. /dev/ttyxxx

當然你可能會碰到權限問題(之後有遇到在討論)

Danny 提到...
作者已經移除這則留言。
Danny 提到...

我剛剛發現我的BoardConfig.mk沒辦法設為libgps必須設為libloc_api, build才會過, 原因是make: *** No rule to make target `out/target/product/ventana/obj/lib/libgps.so', needed by `outarget/product/ventana/obj/SHARED_LIBRARIES/libhardware_legacy_intermediates/LINKED/libhardwarlegacy.so'. Stop.
所以我現在才會使用libloc_api, 然後就會出現第一個問題的錯誤, 囧... 所以我現在在想是不是我有少了什麼東西...
對了 謝謝您的回答喔 你的回答給我很大的鼓勵

鍾志均 提到...

嗯嗯
我想你需要先確定你要讀取的gps nmea是對應到linux的哪個位置

ex /dev/ttyxxx

鍾志均 提到...

加油!!

Danny 提到...

嗯嗯 我現在知道我的gps nmea會對應到ttyHS1

Danny 提到...

哈哈 謝謝你的加油阿 真是一道強心劑, 不好意思可以再為我解惑一下嗎? (我很新手) 我想問的就是你是設定BOARD_GPS_LIBRARIES為libgps, 但是您build出來的是libhardware_legacy.so, 代表你會有libgps.ro囉...?@@ 是否我還得必須說要根據gps.h去implement gps driver (libgps.so)呢?

鍾志均 提到...

我build出來的為libhardware_legacy.so
根據Android.mk檔案
會build許多檔案後再合併成libhardware_legacy.so

一般而言
gps底層的implement
的確是需要follow gps.h去implment相關的function
如果你的平台沒有提供你sample code
那就需要去implement gps.c然後再修改Android.mk
確保你增加的檔案gps.c會被build到

如果你有sample code
當然Android.mk會把build環境設定好
你就只需要去修改sample code與你平台有關係的部份

Danny 提到...

恩...... 那到底哪部分是屬於driver呢, 哪部分屬於HAL呢? 我現在有點搞混了....

鍾志均 提到...

你可以把接收gps nmea的部份視為driver
level 跟android gps interface有關的視為HAL level.

兩者似乎也有些交集

Danny 提到...

哦 所以感覺driver只有那一小部份, 其他大部分都是HAL囉, 都寫在一起讓我好亂QQ
謝謝你的回答! 看來我得找出如何讓/dev/oncrpc/3000008c啟動, 他才能正常WORK的感覺= =...只是那個path不知道他怎麼產生的

鍾志均 提到...

ok
任何問題儘管問

不清楚的部份
互相討論也是很棒的一件事情

Danny 提到...

你好, 不好意思 我又來求助了QQ...
我最近拿到driver, 使gps的hardware可以啟動然後吐NMEA資料了, 但是目前Android上層的apk似乎沒辦法獲得這些NMEA資料. 我想我可能需要自己寫一個glgps.c, build出HAL層來接收TTyHS1這個port的資料. 我的問題是我沒有sample code的話, 我可以參考qcom的loc_eng.cpp來實做嗎?謝謝您

鍾志均 提到...

Denny.
Log time no see.
看起來你又邁進了一大步

當初我拿到廠商的driver的時候發現廠商並沒有把完整的code給implement

你提到nmea有在底層抓到
卻沒有辦法在上層的AP讀到

你可以參考這篇文章
http://nelsonchunglife.blogspot.com/2010/12/android-gps-porting-hal-code-fix.html

如果還不了解
請在告訴我

Danny 提到...

其實我現在拿到的檔案並沒有source code, 我只能執行他並輸入一些指令讓他運行, 但是他並沒有包含HAL層, 所以有關GPS的apk都會無法執行, 因為沒有實做LocationManager的關係. 為了讓apk可以開啟, 我現在的HAL層是build qcom的libloc...

所以我在想我要繼續使用qcom的來修改呢, 還是自己根據http://source.android.com/porting/gps.html 重寫一個HAL來接受資料, 可是根據gps.html, 我也不知道裡面得填些什麼東西... 真是糟糕...

鍾志均 提到...

可否告知一下有關GPS跟你的版子之間硬體架構

ex.
你是使用GPS module or其他方式得到GPS nmea

Danny 提到...

我是使用gps module, 拉起gpio後在daemon下command透過ttyHS1去啟動gps, gps開始work並產生log file. 在log file裡面可以看到nmea...

真的非常謝謝你的回應
十分感激

鍾志均 提到...

gps module workable.

接下來
你需要把nmea接收後給Android HAL layer.

實做~/myandroid9.1/hardware/libhardware_legacy/gps下的檔案

你可以看這個路徑下的Android.mk
他會決定要將哪個檔案編譯進libhardware_legacy.so

Danny 提到...

不好意思我想請問一下 你cat device node ttyxxx 他就會直接秀
$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74
這種格式嗎?
我看我的cat ttyHS1 他是秀出一堆亂碼 囧

鍾志均 提到...

你需要設定baudrate

鍾志均 提到...

你可以使用stty來設定baudrate

參考此篇
http://nelsonchunglife.blogspot.com/2010/11/sttybaudrate.html

Danny 提到...

不好意思我已經設定baudrate了
但是cat他依然是顯示亂碼
會是因為他是丟raw data通訊嗎?
謝謝

Danny 提到...

喔喔 不好意思 我修改xml後產生gpspipe, cat pipe後就可以正常獲取了@@..
$GPGSA,A,1,,,,,,,,,,,,,140.0,99.0,99.0*35
$GPRMC,000038.99,V,,,,,,,010407,,,N*74
$GPGGA,000039.99,,,,,0,00,999.9,,M,,M,,*6C
$PGLOR,STA,000039.99,-1345235.097,1734.425,0,2000,9999,0,PWR,D*21
大概是長這樣, 請問這樣我可以直接塞進去typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length); 嗎?謝謝

鍾志均 提到...

你可以抓到gps nmea

剩餘的就是將nmea parse後
將各個所需要的參數填入
GpsCallbacks所定義的call back function內

你可以在./include/hardware_legacy/gps.h找到
/** GPS callback structure. */
typedef struct {
gps_location_callback location_cb;
gps_status_callback status_cb;
gps_sv_status_callback sv_status_cb;
gps_nmea_callback nmea_cb;
} GpsCallbacks;

Danny 提到...

不好意思請問一下
我fopen gpspipe他想parse
但是他pipe一直丟 請問你當初是怎樣parse的呢?

鍾志均 提到...

char buff[100];
ret = read( fd, buff, sizeof(buff) );
D("received %d bytes: %.*s", ret, ret, buff);

Danny 提到...

真是感謝您! 我覺得我快完成了 (痛哭)
我原本自己寫parser, 寫到一半看到gps_qemu裡面有parser... 就改用他的parser.

不過就如你另一篇文章說得他只有實做location_callback.

但是我想先測試看到底能不能work, 所以想先用類似qemu的方式去測試.

現在卡在我不知道怎樣把他往上傳給apk層... 囧 我必須也把interface實做出來嗎?謝謝

PS. 非常感謝您的熱心回答 並且容忍我這個新手 Orz

鍾志均 提到...

./include/hardware_legacy/gps.h
找到
/** GPS callback structure. */
typedef struct {
gps_location_callback location_cb;
gps_status_callback status_cb;
gps_sv_status_callback sv_status_cb;
gps_nmea_callback nmea_cb;
} GpsCallbacks;

如果你要上層apk讀到nmea
你需要implement此callback function-
gps_nmea_callback nmea_cb

將接到的nmea傳入此function

Danny 提到...

請問將接到的nmea傳入此function後
我還需要作什麼動作才能讓他傳上去嗎?
謝謝您

鍾志均 提到...

因為是callback function的關係
所以只要實做好
接到nmea之後
將nmea帶入function的參數
就會自動上傳嚕

Danny 提到...

嗯嗯...大概懂了, 現在卡在把他build成libgps.so, build之後會進不了os, 但是adb還是正常= =...
執行有些daemon會出現link_image[2046]: failed to link
CANNOT LINK EXECUTABLE

不知道哪裡有問題 囧

感謝你的回答!

被遺忘的人... 提到...

Hello Nelson,
我最近也在port GPS Hal,我拜讀你的網頁後,實作還是有些問題,想來請教一下。
我是新新手,我想從最開頭請教。見笑了..

1. 請問你的實作上最終是只有libhardware_legcy.so還是也同時存在libgps.so呢? (現在我實作出來兩個同時都會有)

2. 我在\hardware\hardware_leagcy\gps\ 下看到有三個檔案(gps.cpp / gps_fake.c / gps_qemu.c) 再參看 android.mk,如果是模擬器的話是參考 qps_qemu.c ,如果是有實際GPS H/W的話,就用gps.cpp和gps_fake.c
這三個檔案的內容很不一樣,請問一下,你當初實作的時候,是從哪一個改出來的呢?

謝謝

鍾志均 提到...

Denny
你可以在build的時候加上showcommands確認你build有關gps的檔案時有沒有問題

鍾志均 提到...

Dear Collect,

1.
這要看你的Android.mk內容決定
目前我的是只有libhardware_legcy.so

2.
你可以從hardware/libhardware_legacy/Android.mk來確認哪個檔案會被build

被遺忘的人... 提到...

>>2.
>>你可以從hardware/libhardware_legacy/Android.mk來確認哪個檔案會被build

Hello Nelson

Thanks for comment.
我想你誤會我的意思了
從Android.mk可以看出來,最後他會用gps.cpp和gps_fake.cpp來產生 libhardware_legacy.so
想請教的是,你當初也是改寫這兩個檔案嗎?我看你之前的紀錄,你參考glgps.c來實作,不知道哪裡可以看得到這支檔案呢?謝謝

鍾志均 提到...

那我想你應該直接修改gps.cpp or gps_fake.cpp就可以嚕

我修改glgps.c也是因為根據Android.mk來決定的

Danny 提到...
作者已經移除這則留言。
Danny 提到...

不好意思我現在在寫GPSsvStatus...
但是他一直回傳android.location.GpsStatus.setStatus(GpsStatus.java:153)
然後用apk看都沒東西@@... 請問他的值要怎樣填呢? 謝謝 QQ.. 感覺是我parse GSV與GSA封包填入後有出錯

鍾志均 提到...

將nmea中parse出以下四個資料
prn
snr
elevation
azimuth

GpsSvStatus

最後用callback function
類似

r->sv_status_callback(&r->gpssvstatus);
就可以嚕

Danny 提到...

喔喔 我發現了我的錯誤在哪了... 因為我直接set sv_list[1], 沒有從0開始, 所以會出現error..

再請問一下@@.. 標準的NMEA封包, 衛星的prn不應該超過32, 但是實際上收到的NMEA GSV卻會超過32 ex. 42 50.

但是uint32_t used_in_fix_mask 只有32bit, 請問你那時後有將prn超過32的衛星過濾掉嗎? ^^

真的很感謝您的建議與耐心的回答, 讓我有很大的進展, 目前只剩下nmea_cb還沒作, 其他都已經可以傳了!

Danny 提到...

真的很抱歉 我又來麻煩您了...
現在在實作nmea_cb, 但是我呼叫r->nmea_callback(r->fix.timestamp, tmp ,strlen(tmp));
他會回以下的錯誤
I/DEBUG ( 779): pid: 833, tid: 1100 >>> system_server <<<
I/DEBUG ( 779): signal 11 (SIGSEGV), fault addr 00000000
可是我印出我的內容來看 都是有值的, 沒有用到00000000... 請問您之前有遇到這個問題嗎?QQ
r->fix.timestamp = 86399000
r->pos = 64
r->in = 0x48dc0aa4

Danny 提到...

喔喔 不好意思 我發現錯在我的程式碼沒有把callback pointer給r->nmea_callback, 所以出現這個錯誤, 現在四個callback function應該都OK!感謝!現在我只要再寫根據系統的狀態去更改gps stats還有一些開機關機與thread的問題就好囉!

非常感謝您! ^^

鍾志均 提到...

恭喜啦
看來要完成了

Danny 提到...

對阿 搞了好久XD...

想請問您個問題 就是有關衛星編號超過32的問題, 標準的NMEA封包, 衛星的prn不應該超過32, 但是實際上收到的NMEA GSV卻會超過32 ex. 42 50.

uint32_t used_in_fix_mask 只有32bit, 請問你那時後有將prn超過32的衛星過濾掉嗎? ^^

鍾志均 提到...

不太合理
衛星編號不應該超過32

你可以給我你接到的nmea嗎
ex. GSA and GSV

Danny 提到...

$GPGSV,3,1,12,09,68,030,33,42,54,141,37,18,54,335,29,21,50,226,44*7D
$GPGSV,3,2,12,27,46,034,29,12,30,133,39,14,17,277,28,22,24,318,30*7F
$GPGSV,3,3,12,25,12,176,27,50,50,134,,15,38,041,,40,20,254,*72
$GPGSA,A,3,09,12,14,18,21,27,42,,,,,,1.7,1.1,1.2*31
thx ^^

鍾志均 提到...

Danny

衛星的ID編號的確會超過32

看來Android目前的定義會有問題

無法將ID編號超過32的衛星資訊通知回上層

這是好機會

你可以修改這個中間層

將patch給Android提供更新

Danny 提到...

先等我把我的板子搞定好了XD...

我現在被丁schedule...

請問您有實做當settings-> location&security->use gps satellites取消時, 把gps ic 關掉不讓他繼續吐NMEA封包嗎?因為我的gps module是host based, 會吃cpu且耗電, 但是我不知道該動哪個function... 不知道GpsInterface裡有沒有對應到他會call的function呢? QQ

感謝

鍾志均 提到...

目前沒有實做這個部份

也歡迎研究出來後

po文分享給世界

Danny 提到...

沒問題的... 現在在trace settings-> location&security->use gps satellites取消時會有什麼行為模式.

不然完全沒頭緒 Orz

Danny 提到...

我目前是利用system property 去控制GPS module開與關閉, 然後在SecureSettings.java那裡set properties! 就能達到在settings裡面選取是否使用GPS定位順便開關GPS module的功能了!

目前快結束了 只要在tune開與關GPS定位的速度就好了! 感謝囉!

鍾志均 提到...

恭喜ㄋㄟ

被遺忘的人... 提到...

不好意思又是我來插花
想借個版面問一下Danny

我也想知道Location & Security開關GPS的點。

想請教一下,依你的方式,GPS是真的power off嗎?你是透過修改.java來控制 GPS power開關?(比如說GPIO)

謝謝
-------From Danny------------------------
我目前是利用system property 去控制GPS module開與關閉, 然後在SecureSettings.java那裡set properties! 就能達到在settings裡面選取是否使用GPS定位順便開關GPS module的功能了!
--------------------------------

Danny 提到...

嗯, 在Location & Security的.java裡我增加了set prop的動作, 之後利用一隻daemon一直polling system property來決定GPIO的開與關. 因為我查看SecuritySetting.java 檔發現他似乎不會作關GPS的動作(或去他會去執行gps interface的gps_done function, 但我沒有繼續Trace.)
所以我自己另外增加一隻daemon與設定一個Property來拉高或拉低GPIO, 與叫醒GPS driver.

被遺忘的人... 提到...

Dear Danny

謝謝分享,跟我想的一樣,還是需要透過一個app來達到真正關閉GPS H/W的功能。

稍候我們也會分享我們實作過程的心得

再次感謝兩位

----- From Danny ----
嗯, 在Location & Security的.java裡我增加了set prop的動作, 之後利用一隻daemon一直polling system property來決定GPIO的開與關. 因為我查看SecuritySetting.java 檔發現他似乎不會作關GPS的動作(或去他會去執行gps interface的gps_done function, 但我沒有繼續Trace.)
所以我自己另外增加一隻daemon與設定一個Property來拉高或拉低GPIO, 與叫醒GPS driver.
----------------------------

鍾志均 提到...

感謝各位無私的分享

被遺忘的人... 提到...

不好意思來晚了
這是我們整理的心得
http://dl.dropbox.com/u/12275050/Android_GPS_HAL.pdf

鍾志均 提到...

感謝大家無私的分享

被遺忘的人... 提到...

雖然GPS porting我們已經結束
今天不小心看到這個網站
再補充一下供以後的人參考
http://blog.chinaunix.net/space.php?uid=25369701&do=blog&id=125329

大頭鰱 提到...

你好
我正在 android 2.2 上面開發 GPS function
我使用ublox GPS 模組, 在我們的platform上面去實現
GPS, 我在kernel 我有去下 cat /dev/ttyS1後那邊確
定有吐出訊息如下

$GPVTG,,T,,M,0.023,N,0.042,K,A*24

$GPGGA,051848.00,2446.82595,N,12059.38626,E,1,05,1.23,191.7,M,16.3,M,,*52

$GPGSA,A,3,21,22,27,14,15,,,,,,,,5.82,1.23,5.69*00

$GPGSV,2,1,06,14,25,294,42,15,25,064,30,21,37,209,41,22,39,322,36*70

$GPGSV,2,2,06,27,31,035,35,42,54,140,37*7E

$GPGLL,2446.82595,N,12059.38626,E,051848.00,A,A*68

$GPRMC,051849.00,A,2446.82590,N,12059.38634,E,0.064,,120411,,,A*73

$GPVTG,,T,,M,0.064,N,0.118,K,A*29

$GPGGA,051849.00,2446.82590,N,12059.38634,E,1,05,1.23,192.3,M,16.3,M,,*52

$GPGSA,A,3,21,22,27,14,15,,,,,,,,5.82,1.23,5.69*00

$GPGSV,2,1,06,14,25,294,42,15,25,064,28,21,37,209,40,22,39,322,37*79

$GPGSV,2,2,06,27,31,035,34,42,54,140,37*7F

$GPGLL,2446.82590,N,12059.38634,E,051849.00,A,A*6F

$GPRMC,051850.00,A,2446.82585,N,12059.38641,E,0.036,,120411,,,A*7A

$GPVTG,,T,,M,0.036,N,0.066,K,A*26

在HAL 那一層, 我有按照 gps_qumu.c 去修改屬於我們的 function as gps_custom.c, 後來我使用
GPS Test Plus v1.2 (http://soft.shouji.com.cn/down/18998.html)
都捉不到衛星, 可以請給我一點點指示嗎?
你們當初有遇到這類似的問題嗎? 我去參考 gps_qemu.c 改寫成 gps_custom.c 幾乎改動不大, 但是用 gpstest 去戶外找衛星, 幾乎都找不到, 所以很困擾? 請求幫忙

大頭鰱 提到...

你好
我正在 android 2.2 上面開發 GPS function
我使用ublox GPS 模組, 在我們的platform上面去實現
GPS, 我在kernel 我有去下 cat /dev/ttyS1後那邊確
定有吐出訊息如下

$GPVTG,,T,,M,0.023,N,0.042,K,A*24

$GPGGA,051848.00,2446.82595,N,12059.38626,E,1,05,1.23,191.7,M,16.3,M,,*52

$GPGSA,A,3,21,22,27,14,15,,,,,,,,5.82,1.23,5.69*00

$GPGSV,2,1,06,14,25,294,42,15,25,064,30,21,37,209,41,22,39,322,36*70

$GPGSV,2,2,06,27,31,035,35,42,54,140,37*7E

$GPGLL,2446.82595,N,12059.38626,E,051848.00,A,A*68

$GPRMC,051849.00,A,2446.82590,N,12059.38634,E,0.064,,120411,,,A*73

$GPVTG,,T,,M,0.064,N,0.118,K,A*29

$GPGGA,051849.00,2446.82590,N,12059.38634,E,1,05,1.23,192.3,M,16.3,M,,*52

$GPGSA,A,3,21,22,27,14,15,,,,,,,,5.82,1.23,5.69*00

$GPGSV,2,1,06,14,25,294,42,15,25,064,28,21,37,209,40,22,39,322,37*79

$GPGSV,2,2,06,27,31,035,34,42,54,140,37*7F

$GPGLL,2446.82590,N,12059.38634,E,051849.00,A,A*6F

$GPRMC,051850.00,A,2446.82585,N,12059.38641,E,0.036,,120411,,,A*7A

$GPVTG,,T,,M,0.036,N,0.066,K,A*26

在HAL 那一層, 我有按照 gps_qumu.c 去修改屬於我們的 function 改為 gps_custom.c
跟 gps_qemu.c 差不多, 修改不大, 後來我使用
GPS Test Plus v1.2 (http://soft.shouji.com.cn/down/18998.html)
都捉不到衛星, 可以請給我一點點指示嗎?

大頭鰱 提到...

Dear Collect Countries and 志均兄

我那個HAL那一層, 我命名為 gps_custom.c
但是我只有 implement "gps_location_callback"
我沒有去 implement "gps_nmea_callback" function
請問你一下, 你們的 HAL 那一個 codes 可以借我參考
一下嗎?

我正苦惱當中, 因為我用那個 gpstest apk 一直任不到
衛星!

BRS
大頭

鍾志均 提到...
作者已經移除這則留言。
鍾志均 提到...
作者已經移除這則留言。
大頭鰱 提到...

版主你好, 我收到你給我得軟體, 但是我好像都沒愾到畫面有狀況ㄟ!

你有mail嗎? 我把狀況記給你看一下!方便嗎?

鍾志均 提到...

你可以把畫面擷取出來
上傳照片到一些網路空間
然後把link附在回應裡面

or是有message也可以提供在這裡

我會回應你的

鍾志均 提到...

ok

那你用你的軟體

可以抓得到location的資訊嗎(因為我看你有implement location)

大頭鰱 提到...

版主你好
我發現我好像從framework 那邊的UI call下來時,我的HAL那一個c程式發現無法 open tty ,我在正在查這個問題!我那各 HAL 的程式我命名為 gps_custom.c
這是我整個系統跑起來得 log,出現下列訊息

D/gps_custom( 79): gps_state_init
D/gps_custom( 79): +gps_port_setup:
D/gps_custom( 79): gps_port_setup: open(/dev/ttyS1,*) = -1, errno 13
D/gps_custom( 79): no gps port detected

會不會我那各open 有做錯阿!妳知道 這個錯誤訊息 open(/dev/ttyS1,*) = -1, errno 13

得意思是???

鍾志均 提到...

/dev/ttyS1代表你版子的gps com port

你可以在一般command模式下使用

cat /dev/ttyS1 顯示出gps nmea嗎?

大頭鰱 提到...

版主你好阿!
我kernel 那邊的driver porting 好後,我就事先 cat /dev/ttyS1 ,所以一直都有吐訊息在。

而且我跟我們得GPS模組的FAE也確認,吐出來得訊息也是對的!

所以我想有點不知道上層call HAL 的 gps.c 時,我為何會出現這個訊息。

下面就是我改寫gps_qemu.c得程式碼?
我在裡面有去對 /dev/ttyS1 open 兩次,但是問題就出在第二次


http://www.dainau.com/phpBB3/viewtopic.php?f=7&t=7381

gps.zip (這是我得程式,妳直接按下去就可以下載)

鍾志均 提到...

check一下你的/dev/ttyS1的權限

大頭鰱 提到...

版主你好
你得意思是說,我得程式沒錯(你以經下載囉嗎?如果你有下載來看的話,我要del 囉!)但是權限要check 阿!
我大陸那邊也跟我這樣講,問題是我不懂你們意思!我事要從程式去改還是???
還是open 的參數要改呢?

鍾志均 提到...

幾個問題問你一下

1. 你可以run起來你的機器嗎?(看起來可以)
2. 你可以對機器下一些linux的command
ex. ls -al

如果上述都可以

你就可以檢查ls -al /dev/ttyS1的權限嚕

大頭鰱 提到...

版主你好
# ls -l /dev/ttyS1
crw------- root root 4, 65 2013-08-12 09:31 ttyS1

這是我的訊息, 請問這樣對不對啊!
請你指導我一下吧!
下面是我程式裡面作兩次open 程式碼?
那如果權限不對?我該如何在程式裡面改呢?


hPort = open( port, (O_RDWR | O_WRONLY ) );

fd = open(GPS_ENABLE_PATH, O_WRONLY);

鍾志均 提到...

你的權限設定的有問題
我是開成777
你的目前是600

你知道怎麼設定權限嗎

大頭鰱 提到...

版主你好
我不清楚怎要設定權限, 請你教導我一下謝謝!
不過有一點我很好奇就是, 我一開機, 我在 setting 那邊 location & sectury 我就有趣把 GPS 打勾, 這時候android 就已經開始去問我 HAL 那一個程式, 所以我要改成 777的話, 是程式裡面去改, 還是開好機, 再去下cmd 呢?

鍾志均 提到...

你需要修改init.rc

在我的環境中是在以下路徑
/out/target/product/平台相關目錄/root/init.rc

你需要找一下你的的路徑

打開init.rc
請加入
chmod 755 /dev/ttyS1

之後請build出新的kernel image

大頭鰱 提到...

版主你好
下面這個路徑,就是我的一些附件,請你上去download 一下,
我好說明我的問題
http://www.dainau.com/phpBB3/viewtopic.php?f=7&t=7381


附件中有附我們的init.rc,我就是按照你所建議的
/out/target/product/平台相關目錄/root/init.rc

加這兩行
chown system system /dev/ttyS1
chmod 755 /dev/ttyS1

於是我把整個 android 重新build 後產生的 system.img
重新download,

我開機後再打 logcat & 後,"0414_Log"就是我的整個log,
昨天如果你有download 我所說給妳的檔案 gps.c ,那各其
實在我這裡是命名為 gps_custom.c ,所以如果你在 "0414_Log"
裡面,所看到的 D/gps_custom ,他指的就是昨天我給妳的那各HAL
gps.c 。

我現在"0414_Log"這個log就是我安裝那各 GPSTEST去找衛星的APK (http://gphonefans.net/thread-18343-1-1.html)
啟動他,但是它呈現 GPS ON,但是就是找不到衛星。

"0414_Log" 裡面有兩個錯誤的訊息,我還是百思不解。分別是 line 2924~2928
D/gps_custom( 79): gps_state_init
D/gps_custom( 79): +gps_port_setup:
D/gps_custom( 79): HAL open _1 YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
D/gps_custom( 79): gps_port_setup: open(/dev/ttyS1,*) = -1, Error-2 13
D/gps_custom( 79): no gps port detected

我有按照你的指導去改init.rc 但是還是有這個error


line 4032~4034
這個訊息就是我從 android framework 那邊的 "android_location_GpsLocationProvider_start"
call 到我 HAL 那各 gps.c
但是在我程式裡面卻發生錯誤,

E/GpsLocationProvider( 79): UI-17 android_location_GpsLocationProvider_start 1111111111111111111111111111111
D/gps_custom( 79): gps_custom_start: called
D/gps_custom( 79): gps_state_start: could not send CMD_START command: ret=-1: Bad file number

我想我的問題就是android 跟我 HAL 的gps.c 要資料我都回錯誤低,但是我還是不知道錯在哪裡阿!
版主請你協助我一下!
謝謝

大頭鰱 提到...

版主你好
那個 /dev/ttyS1 的權限, 我已經解決了.
我聽你的建議用這個 APK http://dl.dropbox.com/u/2452511/AndroidAP/RTKGPSDemoApp.apk
去試看看後, 發現我一執行後
有三個值
lat, Lon , TTFF等等, 都有不同得值產生, 請問一下, 這個意思
代表就是有捉到位置嗎?

也就是我用你建議的 APK去實驗時, 上面都有數值等等, 這樣代表 ok囉嗎??

但是我用這個 GPSTEST APK https://market.android.com/details?id=com.chartcross.gpstest
我有看到 那個 GPS ON 變成綠色的, 據說變成綠色的就是GPS有 ON.

可是我還有一個問題就是說 我沒有看到 GPSTEST 有偵測到幾顆 GPS ㄟ! 因為要是有捉到
因為要是有捉到幾顆衛星的話, 應該有好幾根柱子狀得東西會上升下降, 我這邊有沒看到
這個訊息

http://www.dainau.com/phpBB3/viewtopic.php?f=7&t=7381
(這是我的狀況, 我附圖給你參考一下)
這邊這個網站, 就是我去是外捉到的狀況,

請問一下, 是不是我 HAL 那邊少送那些資訊啊! 我有送 "GSA", "RMC" , "GGA"
等等, 是不是要回類似 "GGA" or "GSV" 等等, 你有 sample codes 嗎?
可以給我參考一下嗎?


ps: (我上一次給你的那個gps.c 裡面有 nmea_reader_parse 這個function, 我試不是要再加
其他的東西啊!)

Wei 提到...

您好,我目前是學生, 我最近也在研究Android和GPS的問題,我用的是開發板,而GPS是硬體式的GPS,連接的是rs232,如果是此方式的話,該如何讓Android進行讀取呢?是在gps_state_init()函式修改state->fd 的開啟嗎? 謝謝!

大頭鰱 提到...

版主你好
那個 /dev/ttyS1 的權限, 我已經解決了.
我聽你的建議用這個 APK http://dl.dropbox.com/u/2452511/AndroidAP/RTKGPSDemoApp.apk
去試看看後, 發現我一執行後
有三個值
lat, Lon , TTFF等等, 都有不同得值產生, 請問一下, 這個意思
代表就是有捉到位置嗎?

也就是我用你建議的 APK去實驗時, 上面都有數值等等, 這樣代表 ok囉嗎??

但是我用這個 GPSTEST APK https://market.android.com/details?id=com.chartcross.gpstest
我有看到 那個 GPS ON 變成綠色的, 據說變成綠色的就是GPS有 ON.

可是我還有一個問題就是說 我沒有看到 GPSTEST 有偵測到幾顆 GPS ㄟ! 因為要是有捉到
因為要是有捉到幾顆衛星的話, 應該有好幾根柱子狀得東西會上升下降, 我這邊有沒看到
這個訊息

http://www.dainau.com/phpBB3/viewtopic.php?f=7&t=7381
(這是我的狀況, 我附圖給你參考一下)
這邊這個網站, 就是我去是外捉到的狀況,

請問一下, 是不是我 HAL 那邊少送那些資訊啊! 我有送 "GSA", "RMC" , "GGA"
等等, 是不是要回類似 "GGA" or "GSV" 等等, 你有 sample codes 嗎?
可以給我參考一下嗎?


ps: (我上一次給你的那個gps.c 裡面有 nmea_reader_parse 這個function, 我試不是要再加
其他的東西啊!)

鍾志均 提到...

1. 先確定kernel運作下可否正常得到GPS nmea

假設你的gps com port 是 /dev/ttyS1

在command模式下要使用
cat /dev/ttyS1
要能夠顯示nmea

2. 第一步ok之後
在確認是否Android GPS HAL層有implement好

這個檔案通常位於
hardware/libhardware_legacy/gps

大頭鰱 提到...

版主你好
謝謝你大力幫忙!我在kernel 下面打
cat /dev/ttyS1 有吐出訊息,一直吐出訊息,都沒錯!
我也確定我那各 HAL那一層也友implement 進去,因為我用 GPSTest
時,都有印出 HAL 那邊的訊息。

所以版主你所提得部分,我都有做到,我在開機後打 logcat &
也有印出 nmea 的訊息!

我想請問版主就是說!你有HAL 那一各sample code 可以讓我參考嗎?

鍾志均 提到...

我是希望用概念的方式來做討論

你可以表達出你現在哪些知道
哪些不知道

我就可以提供你不知道的那些資訊

Mitch 提到...

版主您好~
謝謝你的分享,讓我第一次接到gps有了眉目,想請問您一個問題。
我嘗試在thread中取消read
直接放
buff[]="$GPSGLL,4717.11634,N,000833.91297,E,124923.00,A,A*60\n"
...
nmea_reader_addc()...
但丟到tokenizer之後message id讀出來卻是空的,請問一下這樣的測試方法還有甚麼地方需要改的呢?
謝謝版主

Mitch 提到...

版主你好~
我也正在porting gps hal
目前我是去讀一個.txt檔
可以將讀到的資料token出來
parser之後的資料也是對的
想跟您請教一下~callback的問題
我沒有改glgps.c的callback方式
發現他不會呼叫callback function
自己嘗試寫固定的資料去呼叫callback
結果整個系統就當掉了
附上我的logcat訊息,
I/DEBUG ( 2035): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 2035): Build fingerprint: 'freescale/imx53_w1/imx53_w1:2.3.3/GRI40/eng.root.20110426.121042:eng/test-keys'
I/DEBUG ( 2035): pid: 2082, tid: 2196 >>> system_server <<<
I/DEBUG ( 2035): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG ( 2035): r0 00000000 r1 2b0df918 r2 2cddc9dc r3 363ff6d0
I/DEBUG ( 2035): r4 00000000 r5 363ffe38 r6 363ffe20 r7 41702560
I/DEBUG ( 2035): r8 00000001 r9 0000008b 10 417029fe fp 0000008a
I/DEBUG ( 2035): ip 6ca9f80c sp 363ff6c0 lr 6e20adff pc 6e207e9e cpsr 60000030
I/DEBUG ( 2035): d0 7974742f7665646d d1 7473206461657278
I/DEBUG ( 2035): d2 2020676e69747263 d3 6e6f697461636f32
..
..
I/DEBUG ( 2035): scr 60000012
I/DEBUG ( 2035):
I/DEBUG ( 2035): #00 pc 00007e9e /system/lib/libandroid_servers.so
I/DEBUG ( 2035): #01 pc 0000adfa /system/lib/libandroid_servers.so
I/DEBUG ( 2035): #02 pc 00001fa2 /system/lib/hw/gps.W1.so
I/DEBUG ( 2035): #03 pc 000118e4 /system/lib/libc.so
I/DEBUG ( 2035): #04 pc 000114b0 /system/lib/libc.so
I/DEBUG ( 2035):
I/DEBUG ( 2035): code around pc:
I/DEBUG ( 2035): 6e207e7c b513b40c f853ab04 93012b04 6f646804
I/DEBUG ( 2035): 6e207e8c e8bd47a0 b002401c bf004770 b513b40c
I/DEBUG ( 2035): 6e207e9c 6804ab04 2b04f853 f8d49301 47a040f8
I/DEBUG ( 2035): 6e207eac 401ce8bd 4770b002 b513b40c f853ab04
I/DEBUG ( 2035): 6e207ebc 93012b04 f8d46804 47a04098 401ce8bd
I/DEBUG ( 2035):
I/DEBUG ( 2035): code around lr:
I/DEBUG ( 2035): 6e20addc 00004018 00000788 4605b570 ea1cf7fb
I/DEBUG ( 2035): 6e20adec 88ab4a07 f8d2447a 685212c4 f7fd4604
I/DEBUG ( 2035): 6e20adfc 4904f84d 44794620 f7ff31c0 bd70fe77
I/DEBUG ( 2035): 6e20ae0c 00003fdc 00000756 b08fb530 f7fb4605
I/DEBUG ( 2035): 6e20ae1c ed95ea04 eef71a09 edd50ac1 edd51a08
I/DEBUG ( 2035):
I/DEBUG ( 2035): stack:
I/DEBUG ( 2035): 363ff680 00000000
I/DEBUG ( 2035): 363ff684 00000000
I/DEBUG ( 2035): 363ff688 00000000
I/DEBUG ( 2035): 363ff68c 00000000
I/DEBUG ( 2035): 363ff690 00000000
I/DEBUG ( 2035): 363ff694 00000000
I/DEBUG ( 2035): 363ff698 00000000
I/DEBUG ( 2035): 363ff69c 00000000
I/DEBUG ( 2035): 363ff6a0 0000008a
I/DEBUG ( 2035): 363ff6a4 00000078
I/DEBUG ( 2035): 363ff6a8 0000008a
I/DEBUG ( 2035): 363ff6ac 363ff6bc
I/DEBUG ( 2035): 363ff6b0 363ff6cc
I/DEBUG ( 2035): 363ff6b4 6ca433ab /system/lib/libdvm.so
I/DEBUG ( 2035): 363ff6b8 df002777
I/DEBUG ( 2035): 363ff6bc e3a070ad
I/DEBUG ( 2035): #00 363ff6c0 00000000
I/DEBUG ( 2035): 363ff6c4 2b0df918
I/DEBUG ( 2035): 363ff6c8 00000000
I/DEBUG ( 2035): 363ff6cc 6e20adff /system/lib/libandroid_servers.so
I/DEBUG ( 2035): 363ff6d0 2cddc9dc
I/DEBUG ( 2035): 363ff6d4 00000001
I/DEBUG ( 2035): #01 363ff6d8 417032a0
I/DEBUG ( 2035): 363ff6dc 000000ba
I/DEBUG ( 2035): 363ff6e0 363ffe20
I/DEBUG ( 2035): 363ff6e4 41701fa5 /system/lib/hw/gps.W1.so
W/ActivityManager( 2082): finishReceiver called but no pending broadcasts
I/DEBUG ( 2035): debuggerd committing suicide to free the zombie!
I/DEBUG ( 2369): debuggerd: Apr 26 2011 12:27:24
請問您有遇過這樣的問題嗎?能否指點我問題出在哪裡,謝謝

opeekon 提到...

版主你好,
最近也在porting GPS
你的這幾篇文章給了我不少收穫
但我想要請教你是否都是在Android2.2上porting?

因為我在Android2.3 porting(有實體GPS裝置)試圖修改qemu.c,只要data要往java層丟就會發生crash

後來我找到這是一個2.3上的bug
http://code.google.com/p/android/issues/detail?id=13015

請問是否有類似經驗?抑或解決的辦法?

opeekon 提到...
作者已經移除這則留言。
鍾志均 提到...

的確

過去我是在2.2上作開發

搭配freescale imx51公板

鍾志均 提到...

大家有沒有使用其他公版開發gps相關應用呢?

有的話請提供給我

Mitch 提到...

版主你好~
我目前正在用imx53在porting gps
但我還沒port成功...
請跟您請教一下
我收到nmea的值之後callback到jni層
出現了下面logcat的訊息:
I/DEBUG ( 2045): Build fingerprint: 'freescale/imx53_w1/imx53_w1:2.3.3/GRI40/eng.mitch.20110418.153251:eng/test-keys'
I/DEBUG ( 2045): pid: 2091, tid: 2197 >>> system_server <<<
I/DEBUG ( 2045): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
hal傳到jni的值是對的,但在CallVoidMethod的function時就掛了。
不曉得版主有沒有遇過這樣的問題,可以提供點建議跟指教嗎? 謝謝

匿名 提到...

你好,我想請問關於A-GPS,xtra方面的問題,A-GPS是通過電話綫路進行工作,xtra是通過WIFI工作。我這麽理解對嗎?
能對A-GPS,XTRA的工作流程及實做方法說說嗎?

鍾志均 提到...

目前版主Nelson正在進行Android-x86環境建制
http://nelsonchunglife.blogspot.com/2011/05/build-android-x86.html

如果建制起來將會將GPS的部份整合到Android-x86並且繼續為大家解決疑惑

匿名 提到...

版主你好!
小弟最近也在弄gps porting
看了版主的文章後真的是受益良多

匿名 提到...

均兄,
打擾了~看了大家的文章~~還是沒有辨法把底層GPS(/dev/ttyS2)CAT到HAL裡...想問一下我應該怎麼做....小弟不材

鍾志均 提到...

ok.

首先你需要確定幾件事情

1. /dev/ttyS2的gps端口無誤
2. 手動cat /dev/ttyS2是否可以導出gps nmea
3. 檢查/dev/ttyS2的權限
4. implement gps.c(or glgps.c depend your system)
5. 參考此篇文章implement相關function
http://nelsonchunglife.blogspot.com/2010/12/android-gps-porting-hal-code-fix.html

祝順利

鍾志均 提到...

4.5是在說同一件事情

你可以參考這篇文章
http://nelsonchunglife.blogspot.com/2010/12/android-gps-porting-hal-code-fix.html

匿名 提到...

均兄,

我沒有GPS.C..有什麼辨法取得
我一直卡在到底是那一支程式去CAT /DEV/TTYS2 的東西.....

鍾志均 提到...

請參考你平台下hardware/libhardware_legacy/gps 下的Makefile就知道你是用哪個檔案去實做cat /dev/ttyxxx的功能

匿名 提到...

均兄,
我去看了hardware\libhardware_legacy\gps\的Android.mk
是gps_qemu.c去處理..不過我看了內容卻找不到怎麼把TTYS2的東西CAT出來

鍾志均 提到...

gps_qemu.c負責讀取gps com port資訊
然後參考此篇文章implement相關function
http://nelsonchunglife.blogspot.com/2010/12/android-gps-porting-hal-code-fix.html
去將gps com port導向到Android GPS HAL層

匿名 提到...

均兄,

我有去看http://nelsonchunglife.blogspot.com/2010/12/android-gps-porting-hal-code-fix.html
是不是要在GPS.CPP(我沒有GLGPS.CPP)implement status_callback,
sv_status_callback

鍾志均 提到...

你的平台是需要implment到gps_qemu.c

匿名 提到...

均兄,
不好意思~我找到
http://dl.dropbox.com/u/12275050/Android_GPS_HAL.pdf.....並且在gps_qemu.c中的增加
GpsSvStarus status;
GpsStatus gpsstatus;
gps_status_callback status_callback;
gps sv status callback Sv callback;

那在GPS中定義

/** Represents SV information. */
typedef struct {
/** Pseudo-random number for the SV. */
int prn;
/** Signal to noise ratio. */
float snr;
/** Elevation of SV in degrees. */
float elevation;
/** Azimuth of SV in degrees. */
float azimuth;
} GpsSvInfo;


/** Represents SV status. */
typedef struct {
/** Number of SVs currently visible. */
int num_svs;


/** Contains an array of SV information. */
GpsSvInfo sv_list[GPS_MAX_SVS];


/** Represents a bit mask indicating which SVs
* have ephemeris data.
*/
uint32_t ephemeris_mask;


/** Represents a bit mask indicating which SVs
* have almanac data.
*/
uint32_t almanac_mask;


/**
* Represents a bit mask indicating which SVs
* were used for computing the most recent position fix.
*/
uint32_t used_in_fix_mask;
} GpsSvStatus;是在GPS.H嗎?????

匿名 提到...

均兄,

小弟不材還是搞不定gps_qemu.c

鍾志均 提到...

你的問題是這個嗎?"我看了內容卻找不到怎麼把TTYS2的東西CAT出來"

匿名 提到...

均兄,
我是在KERNEL下 CAT /DEV/TTYS* 有LOG出來..不過在android...我去看了gps_qemu.c...改了~~進了OS,GPS也不會動
??完了...我想你那有沒有會動的CODE.讓我去比對啊

鍾志均 提到...

你可以先確認一下gps_qemu.c有無讀取com port的code.

如果有
下一步就是要將讀進來的gps nmea值導入到Android GPS HAL(這個是抽象的形容).

匿名 提到...

Hi均兄

我是要在gps_qemu.c裡確認有無讀取com port的code.....還是要在那裡確認
真的不好意思~問題比較多

鍾志均 提到...

你可以寄到chihchun.chung@gmail.com

匿名 提到...

Hi 均兄,

那gps_qemu.c有要再加什麼??(原生gps_qemu.c就可以用嗎)

你說的Makefile(是不是\hardware\libhardware_legacy\gps\Android.mk)

我沒有LIBGPS.SO 只有libhardware.SO(如果CHECK gps_qemu.c有沒有在libhardware.SO)

鍾志均 提到...

可以在gps_qemu.c
找到function-gps_state_thread

先透過epoll_wait等到gps nmea進來
然後透過read讀取gps nmea
ret = read( fd, buff, sizeof(buff) );

你可以打印buff確認是否讀入gps nmea

匿名 提到...

Hi 均兄,
有在gps_qemu.c (gps_state_thread)
也有看到epoll_wait( epoll_fd, events, 2, -1 );
也看到ret = read( fd, buff, sizeof(buff) );

不過我在這段後面加了printf("\n%s\n",buff);

然後再進去android 下logcat -b radio & 沒有看到gps nmea (CAT /DEV/TTYS* 的nmea)

鍾志均 提到...

epoll_wait需要接受系統所發送出來的event才會有可能做到ret = read( fd, buff, sizeof(buff) );

如果沒有等到就會一直hold住

請先確認你是否可以執行到epoll_wait的下一行

匿名 提到...

Hi 均兄,

系統沒有event....所以android 下logcat -b radio & 沒有看到gps nmea

鍾志均 提到...

這個是問題

你可以先處理這一個部份

匿名 提到...

Hi 均兄,
目前有把gps_qemu.c去改成gps.c然後MAKE如下
target thumb C: libgps <= hardware/libhardware_legacy/gps/gps.c
target StaticLib: libgps (out/target/product/XXX/obj/STATIC_LIBRARIES/libgps_intermediates/libgps.a)
Install system fs image: out/target/product/avd1/system.img
在佞下有找到gps.o
\out\target\product\XXX\obj\STATIC_LIBRARIES\libgps_intermediates\gps.o
應該有被放在libhardware_legacy.so裡吧???
然後有在init.rc加了
chown system system /dev/ttyS2
chmod 755 /dev/ttyS2
那有用在system\buikd.prop再加什麼東西嗎???像3g module
rild.libpath=/system/lib/libzobestU6300-ril.so
rild.libargs=-d /dev/ttyUSB1

下了LOGCAT -B RADIO &...都沒有看到gps的log

大頭鰱 提到...

Hi 老兄
我同一份軟體方在兩個版子,這兩個版子都是同一版本的板子,一個認的到衛星,功能都ok.但是另一個板子就都認不到, 一直報這個訊息,請問一下你知道原因是???

D/gps_custom( 77): Received: '$GPGSV,1,1,00*79
D/gps_custom( 77): '
D/gps_custom( 77): ==========================Received: $GPGSV,1,1,00*79

鍾志均 提到...

Dear 大頭鰱,

從你提供的gps nmea log看來
就是一顆衛星都沒有

你可以參考這篇
http://nelsonchunglife.blogspot.com/2010/12/gps-nmea-gpgsa-and-gpgsv.html
是有關gpgsv

大頭鰱 提到...

板主你好
我們開發的Android 2.2 當中關於 agps 部分, 我不是很清楚, 你知道怎樣加嗎?
請教我一下謝謝你!

鍾志均 提到...

這個部分沒有study過

歡迎研究後分享文章出來

^^

大頭鰱 提到...

版主你好
我有一個問題想請教一下, 我是android2.2版本, 我的GPS 已經porting 成功HAL 那一層範例是用 gps_qemu.c 去改的. 我的問題是我用 GSP Test 去驗證我的 GPS發現有些問題.
我用 GPSTestPlus_1.1.3_android_zol.apk 去驗正的話顯示 locate time and utc time 都是符合要求

但是我用 GPS_Test_Plus_1.2.9_mf.apk 所show 出來的 locate time and utc time 就都不 一樣

也就是說 GSP Test 新舊版本會有差異. 我的 driver 都是一樣的但是GPS 新舊版本顯示出來的 locate time and utc time 有差異請問你知道原因嗎?

cy 提到...

您好 最近我在porting GPS Driver 我在系統 開起後..adb 進去cat ttyACM0 可看nmea data 但我GPS Status.apk 卻看不到..後來看到您的文章...我發現..我這版跟您的有些不同..我是在OMAP4460 Android 4.0.4上開發我想跟您請教..我在kernel的UART那要如何對應..我的gps...謝謝

鍾志均 提到...

Hi cy,

cat ttyACM0 可看nmea data > 這代表GPS硬體接收訊號的部份沒有問題。


你還需要了解android 4.0有關 GPS HAL的實作方式。
這個部分,我在adnrdoi 4.0版本沒有涉略。
所以不確定我當初開發的2.2版本到4.0在這方面演進有無任何變化。

2.2功能上可以分成
1. Android GPS HAL
2. Kernel driver

Kernel driver的部份就是要open ttyACM0
然後read資料
將read出來的資料交給Android GPS HAL
這樣子,你的GPS Status.apk就可以透過Android所開放出來的API去抓取gps的資訊

你可以按照這樣的思維去4.0上尋找相關的資訊

希望對你有幫助

鍾志均 提到...

Hi cy,

cat ttyACM0 可看nmea data > 這代表GPS硬體接收訊號的部份沒有問題。


你還需要了解android 4.0有關 GPS HAL的實作方式。
這個部分,我在adnrdoi 4.0版本沒有涉略。
所以不確定我當初開發的2.2版本到4.0在這方面演進有無任何變化。

2.2功能上可以分成
1. Android GPS HAL
2. Kernel driver

Kernel driver的部份就是要open ttyACM0
然後read資料
將read出來的資料交給Android GPS HAL
這樣子,你的GPS Status.apk就可以透過Android所開放出來的API去抓取gps的資訊

你可以按照這樣的思維去4.0上尋找相關的資訊

希望對你有幫助

cy 提到...

hi 謝謝你的回應 若要將 ttyACM0的GPS NMEA data要po到HAL layer 有那幾個步驟要做ㄚ (以imx53為例 android2.2) 謝謝您歐

鍾志均 提到...

你要的東西,就是我這一篇寫的。

cy 提到...

哈...不好一思我問這個問題..其實是我剛好有之前開發imx53的code....但我手上現在要弄的是omap平台 所以我想用imx53跟omap的code做比對

但我發現我要問的問題跟之前Danny很像...除了gps.h要設定好以外..gps.c也要加上 open與read ttyacm0的部份不知對不對..謝謝

鍾志均 提到...

open與read ttyacm0的部份你需要修改到gps.c檔案
也許你的平台實作的檔案名字不叫gps.c。
你可以確認你的平台實作的檔案是哪個。

Unknown 提到...

你好,我在開發qualcomm apq8060 android4.0.4時,打開gps apk後系統會reboot,┌不知道是否可以跟你討論一些想法,謝謝

匿名 提到...

hi Nelson 你好 我這邊gps 已經可以在gps test apk 上看到 gps 狀態 主要是build出來的so檔要放進 system/lib/hw以及定義的uart port是 ttyACM 的定義檔 u-blox.conf 要放進 /etc 下 conf檔案權限要定義 並且最重要的ttyACM 的權限 定義在ueventd.rc 要定義好... 還有個問題 可否請教版主 就是 gps 衛星強度 你會在 gps-test.apk上看到-1值嗎..不知道是哪方面問題.....還有 樓上的問題我也遇到過 可能是APK版本出問題 或是JAR檔沒放進去