Linux 系统使用 Sierra Wireless MC7750 连接 EVDO

最近买了一部联想的 ThinkPad T430s,之所以买它,很大的一个原因是它可以安装内置的移动网络数据模块,但是该死的联想公司竟然在 BIOS 中限制用户自由选择硬件模块(真想 FUCK 它),导致手头上现有的华为 EM660 不能用,额外花了 ¥600 买了一个 Sierra Wireless MC7750。

Sierra Wireless MC7750 支持 GSM/EGDE/UMTS/HSDAP CDMA/1X/EVDO LTE 等网络制式,在 Arch Linux 系统中使用 NetworkManager + ModemManager 连接 EVDO 可以获得 IP 地址(wwan0 网络接口),但 ping 任何一个外网 IP 地址都是 Timeout。经过分析后发现在 Linux (kernel 3.x) 系统中将会使用 qcserial 和 qmi-wwan 驱动。而应用程序 ModemManager (0.7.99) 默认的行为是在有 QMI 的情况下优化使用。但 QMI 接口可能是内核中还存在着 Bug 吧?只能使用传统的 PPP 模式。

详细配置
1. 禁用 qmi-wwan 驱动

echo "blacklist qmi-wwan" | sudo tee /etc/modprobe.d/qmi-wwan.conf

2. 配置 NetworkManager 网络连接
Number: #777
Username: ctnet@mycdma.cn
Password: vnet.mobi
Authication method: PAP

至此,就可以直接使用 NetworkManager 连接 EVDO 啦。

Over!

修复 Linux RTLWifi 驱动的 AP 模式支持

买了个 TL-WN725N v1 的无线网卡,据它自己说是支持 AP 模式的,Linux 3.7.x 驱动正常,使用的 rtlwifi:rtl8192cu。使用 iw list 命令查看网卡的确是支持 AP 模式的,由于配置 hostapd 测试了一下,客户端也可以看到 AP 了,但连接上后就自动断开,iPad 直接就连接不上。。。

通过查找、分析,最后定位问题在驱动程序上,下面是修复补丁,将rtlwifi编译成独立的模块替换系统中原有的模块即可。

From 59fb30735cbe7eb4f69b13a056947efcc4bfeab0 Mon Sep 17 00:00:00 2001
From: Heiher <admin@heiher.info>
Date: Tue, 19 Feb 2013 22:51:22 +0800
Subject: [PATCH] rtlwifi: Fix AP mode.
 
---
 Makefile | 25 ++++++++++++++-----------
 core.c   | 26 ++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 11 deletions(-)
 
diff --git a/Makefile b/Makefile
index 97935c5..544d22b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-obj-$(CONFIG_RTLWIFI) 		+= rtlwifi.o
+obj-m 		+= rtlwifi.o
 rtlwifi-objs	:=		\
 		base.o		\
 		cam.o		\
@@ -11,18 +11,21 @@ rtlwifi-objs	:=		\
 
 rtl8192c_common-objs +=		\
 
-ifneq ($(CONFIG_PCI),)
 rtlwifi-objs	+= pci.o
-endif
-
-ifneq ($(CONFIG_USB),)
 rtlwifi-objs	+= usb.o
-endif
 
-obj-$(CONFIG_RTL8192C_COMMON)	+= rtl8192c/
-obj-$(CONFIG_RTL8192CE)		+= rtl8192ce/
-obj-$(CONFIG_RTL8192CU)		+= rtl8192cu/
-obj-$(CONFIG_RTL8192SE)		+= rtl8192se/
-obj-$(CONFIG_RTL8192DE)		+= rtl8192de/
+#obj-m	+= rtl8192c/
+#obj-m	+= rtl8192ce/
+#obj-m	+= rtl8192cu/
+#obj-m	+= rtl8192se/
+#obj-m	+= rtl8192de/
 
 ccflags-y += -D__CHECK_ENDIAN__
+
+KVERSION = $(shell uname -r)
+
+all:
+	make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
+clean:
+	make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
+
diff --git a/core.c b/core.c
index a7c0e52..6e40070 100644
--- a/core.c
+++ b/core.c
@@ -574,6 +574,27 @@ static int rtl_op_conf_tx(struct ieee80211_hw *hw,
 	return 0;
 }
 
+static void _rtl_update_beacon(struct ieee80211_hw *hw,
+            struct ieee80211_sta *sta, struct ieee80211_vif *vif)
+{
+    struct sk_buff *skb;
+    struct ieee80211_tx_control control;
+
+    control.sta = sta;
+    skb = ieee80211_beacon_get(hw, vif);
+    rtl_op_tx(hw, &control, skb);
+}
+
+static int rtl_op_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
+             bool set)
+{
+    struct rtl_priv *rtlpriv = rtl_priv(hw);
+
+    _rtl_update_beacon(hw, sta, rtlpriv->mac80211.vif);
+
+    return 0;
+}
+
 static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
 			     struct ieee80211_vif *vif,
 			     struct ieee80211_bss_conf *bss_conf, u32 changed)
@@ -591,6 +612,10 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
 		if ((changed & BSS_CHANGED_BEACON) ||
 		    (changed & BSS_CHANGED_BEACON_ENABLED &&
 		     bss_conf->enable_beacon)) {
+			rcu_read_lock();
+			sta = get_sta(hw, vif, bss_conf->bssid);
+			_rtl_update_beacon(hw, sta, vif);
+			rcu_read_unlock();
 			if (mac->beacon_enabled == 0) {
 				RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
 					 "BSS_CHANGED_BEACON_ENABLED\n");
@@ -1183,6 +1208,7 @@ const struct ieee80211_ops rtl_ops = {
 	.configure_filter = rtl_op_configure_filter,
 	.sta_add = rtl_op_sta_add,
 	.sta_remove = rtl_op_sta_remove,
+	.set_tim = rtl_op_set_tim,
 	.set_key = rtl_op_set_key,
 	.conf_tx = rtl_op_conf_tx,
 	.bss_info_changed = rtl_op_bss_info_changed,
-- 
1.8.1.3
cd linux-3.7
cd drivers/net/wirless/rtlwifi/
patch -Np1 -i ~/rtlwifi-Fix-AP-mode.patch
make
 
# Test
sudo rmmod rtl8129cu
sudo rmmod rtlwifi
sudo insmod ./rtlwifi.ko
sudo insmod rtl8192cu.ko

Over!

来自国内行货 Android 手机 GPS 配置文件

我的 HTC Evo 4G 刷了 CM 7.2 ROM 后 GPS 就不好用了,使用 GPS Test 在室外竟然都一颗星也找不到。定位问题应该在 /etc/gps.conf 配置文件不适合在国内使用,原因我想大家都懂的。

从国内行货手机里复制了个配置文件,室外基本上可以秒定了。

NTP_SERVER=asia.pool.ntp.org
XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin
XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin
XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin
C2K_HOST=default
C2K_PORT=6066
DEFAULT_AGPS_MODE=MS_BASED
PHONE_TYPE=CDMA

Over!

关于 VoIP 的一些想法

最近更换了电信CDMA网络的手机,使用的上网套餐并不适合通话,原计划使用 Skype 通过网络拨打电话,以补充这方面的不足。

使用了一段时间发现 Skype 通话效果非常的差,经常出现严重掉话的情况,基于上是不可用的。实验发现并不是因为手机的 CDMA 1X 网络带宽不够,也不是由于手机性能不足,而是 Skype 自己的 PSTN 网络问题。

于是就有自己架设语音网关服务的想法,这样可以使用本地的落地电话,从而达到最佳通话效果。

因为手机上集成了 SIP 客户端,想在自己的服务器上架设个 SIP 服务器端,并把这个服务器端桥接到 USB 接口的 CDMA 的无线上网卡上,这样在手机端连接服务器拨打 PSTN,服务器将使用 CDMA 网关拨出,从而达到较好的通话效果,费用和直接使用CDMA资费卡在手机上拨打相同。

目前对 SIP 协议的实现不清楚,不过这应该有相应的开源实现的库可以帮助解决。比较麻烦的应该是如果将 CDMA 上网卡作为一个语音网关接入进 SIP 系统。我的上网卡虽然多有个串口,但测试发现不能将语音数据从串口输出或输入,可能还要需要使用计算机的音频接口。

相关资料
VoIP-GSM шлюз для Asterisk на USB модеме HUAWEI E1550

Over!

morse – Linux 系统莫尔斯电码练习软件

morse 是一款运行在 Linux 系统里,利用计算机声卡运行 morse 电码播放的练习软件,这个软件编译后生成两个程序 morse 和 QSO。

morse : 将标准输入的字符以 morse 电码的形式播放出来。
QSO : 生成练习通信案例。

源代码 http://www.heiher.info/service/files/morse-2.1.tar.gz

编译方法

tar xzf morse-2.1.tar.gz
cd morse-2.1
make all

使用方法

./QSQ | ./morse -w 速度 -l -e

Over!