ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年2月2日 星期四

3g modem, rild & pppd

init.rc 啟動 rild 和 pppd: service ril-daemon /system/bin/rild -l /system/lib/libreference-ril.so socket rild stream 660 root radio socket rild-debug stream 660 radio system socket rild-ppp stream 660 radio system user root group radio cache inet misc audio service pppd_gprs /etc/init.gprs-pppd user root group radio cache inet misc disabled oneshot rild 的部份是直接 run rild (實際是去 run libreference-ril.so 的 Init)

rild 負責 modem 的初始化,語音撥撥號,接聽,modem 連線狀態維護 (連線中, operator, signal strength.. etc)。
pppd 則負責 ppp protocol,並形成 ppp0 這個 network interface

pppd 是 run script : /etc/init.gprs-pppd: PPPD_PID= /system/bin/setprop "net.gprs.ppp-exit" "" /system/bin/log -t pppd "Starting pppd" #/system/xbin/pppd $* # pppd was put into /system/bin instead of /system/xbin after SDK1.6 if ls /dev/ttyUSB0 > /dev/null 2>&1; then /system/bin/pppd connect 'chat -f "/etc/3gdata.conf"' /dev/ttyUSB3 115200 mru 1280 mtu 1280 nodetach debug dump defaultroute usepeerdns novj novjccomp noipdefault ipcp-accept-local ipcp-accept-remote connect-delay 5000 linkname ppp0 else /system/bin/pppd ttyACM0 921600 nodetach noauth noipdefault defaultroute usepeerdns linkname ppp0 connect "chat -v '' AT OK ATD*99***1# CONNECT" debug fi PPPD_EXIT=$? PPPD_PID=$! /system/bin/log -t pppd "pppd exited with $PPPD_EXIT" /system/bin/setprop "net.gprs.ppp-exit" "$PPPD_EXIT" .. 這個 file 在 /system/core/rootfs/etc/

script 是啟動 pppd ,在參數指定連接的動作,使用 chat: connect 'chat -f "/etc/3gdata.conf" ' 這樣寫是要 chat 使用 3gdata.conf 作 連線參數。
connect "chat -v ''AT OK ATD*99***1# CONNECT" 這樣寫是使用簡單是 chat 設定,所以直接寫出來。

chat 是一種 send - reply 對應的程式,會依照config 送 string,並且依照 config 檢查回應的string。

pppd 的 help 中,connet 的說明是: connect <p> Invoke shell command <p> to set up the serial line 就是另外 run script 'p' 來作建立連線的動作 (撥號)。

啟動 pppd 還要給的就是 pppd 對應的 3g modem data port number,一般會是 /dev/ttyUSB?

3g modem 會提供很多 ttyUSB port,每個有不同的功能
  1. AT Command 語音撥號
  2. ppp 資料
  3. AT Command 系統狀態
每一個廠家的port 對應都不一樣,所以要告訴 pppd 對哪一個 port 動作。

同理,撥號也一樣,如果撥號和 ppp 通訊在同一個,就可以寫在 這裡,叫 pppd 撥號。
如果 撥號 和 ppp 通訊在不同的 port,就不能請 pppd 做了 (也就沒有 connect 這個 參數)



port 是 支援 3g modem 時最麻煩的東西。
不同的 modem 有不同的 port 指定。
不僅 pppd 要知道對哪一個 port 動作, rild 也要知道。

舊版的 android,是把 port number 直接寫在 init.rc 的 啟動命令參數,所以要同時支持多個 3g modem 是不可能的。

新版修改了 rild reference-ril,會由 3g modem 的 vid, pid 知道是哪一個 modem,然後有一個內建的 table,決定 port。
所以只要有在 vid. pid table 中的 3g modem, rild 都可以正確動作。

* 但是這樣只有作半套...
pppd 的 port 還是由 init.rc 寫死,所以沒辦法依照 vid.pid 來決定。

2 則留言:

Unknown 提到...

rild reference-ril,會由 3g modem 的 vid, pid 知道是哪一個 modem,然後有一個內建的 table,決定 port。
所以只要有在 vid. pid table 中的 3g modem, rild 都可以正確動作。


你好,請問該table 在哪個位置? 找了很久 謝謝

Unknown 提到...

我是查詢 ICS 4.0.4

標籤

網誌存檔