Saturday, February 14, 2009

Debian 下使用Nokia手机作为modem上网

我使用的是N73, 其他的Nokia手机方法应该是类似的.

第一步, 将数据线连接至PC, 然后在手机上选择PC套件, 这时通过在PC上通过dmesg应该可以看到kernel已经检测到数据线的插入, 并已经自动load usbseria module.

第二步, 此时检查一下 /dev/ttyACM0 (我这里是ACM0, 但也许是USB0或者其它)是否已经建立, 这个在dmesg中应该也可以看到.

第三步, 可以通过minicom连接至ttyACM0, 输入一个简单的AT cmd, 比如就输入AT, 看看是否返回OK. 没什么问题的话, 可以退出minicom. 这步只是验证一下手机是否连好, 可以忽略.

第四步, 准备建立ppp相关的配置文件了, 首先在 /etc/ppp/peer 下面建立一个 nokia-provider 文件, 内容如下:

/dev/ttyACM0
debug
connect '/usr/sbin/chat -v -f /etc/ppp/peers/connect-chat'
disconnect '/usr/sbin/chat -v -f /etc/ppp/peers/disconnect-chat'
460800
crtscts # hardware flow control for cable
local
lcp-echo-failure 0
lcp-echo-interval 0
:0.0.0.0
noipdefault # pppd must not propose any IP address to the peer!
ipcp-accept-local # Accept peers idea of our local address
defaultroute # Add the ppp interface as default route to the IP routing table
usepeerdns # User DNS returned by server
noauth # The phone is not required to authenticate
noipv6
novj
nobsdcomp
novjccomp
nopcomp
noaccomp
persist # Persistent connection
maxfail 99999 # Retry and retry and retry if failed...

然后再建立一个文件 connect-chat, 内容如下:
TIMEOUT 10
ECHO ON
ABORT '\nBUSY\r'
ABORT '\nERROR\r'
ABORT '\nNO ANSWER\r'
ABORT '\nNO CARRIER\r'
ABORT '\nNO DIALTONE\r'
ABORT '\nRINGING\r\n\r\nRINGING\r'
'' \rAT
TIMEOUT 12
OK ATE1
OK 'AT+cgdcont=1,"IP","CMWAP","",0,0'
OK ATD*99***1#
CONNECT

注意我这里填的是CMWAP, 如果你的运营商给你开通了CMNET, 你也可以填写CMNET, 使用CMWAP上网的话, 还必须给浏览器添加网关, 这个后面会说.

然后再添加 disconnect-chat 文件:
#!/bin/sh
# send break exec /usr/sbin/chat -V -s -S \
ABORT "BUSY" \
ABORT "ERROR" \
ABORT "NO DIALTONE" \
SAY "\nSending break to the modem\n" \
"" "\K" \
"" "\K" \
"" "\K" \
"" "\d\d+++\d\dATH" \
SAY "\nPDP context detached\n"

第五步, 输入 pon nokia-provider, 这样就启动pppd了. 不用多久 通过ifconfig应该就可以看到ppp0, 注意那个"P-t-P:10.6.6.6", 此时要添加一个默认网关: route add default gw 10.6.6.6.
OK 现在你的debian就可以通过nokia手机上网了, 注意看手机屏幕, 你的GPRS连接应该已经连上了.

第六步, 之前提到过的, 如果使用APN是CMWAP, 那么, 在通过浏览器访问网站时, 还必须设置代理服务器为10.0.0.172, 这是中国移动提供的网关, 开启的端口很少, 我只用了80, 其他未测试过.

参考:
http://users.utu.fi/tmwire/nokia_n73_linux.html

Saturday, September 27, 2008

Monday, August 11, 2008

module_init and module_exit

linux内核代码中,module_init(fn)在模块被链接到内核中的情况下,最终被宏替换如下:

#define module_init(fn) \
static initcall_t __initcall_##fn##6 __attribute_used__ \
__attribute__((__section__(".initcall6.init"))) = fn

我的理解是, 定义了一个指针指向fn, 这个指针变量链接时被保存在一个特定的位置.

'特定的位置'在vmlinux.lds中有定义
大致是这样:


__initcall_start = .;
.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
*(.initcall0.init)
*(.initcall0s.init)
...
*(.initcall7.init)
*(.initcall7s.init)
}
__initcall_end = .;

这里可以说是把初始化用的函数划分为了14个级别, module_init的全部都在initcal6.init这一段.

然后 在init/main.c 中, 有do_initcalls这个函数
会从__initcall_start开始, 逐个根据函数指针调用每一个函数直到__initcall_end.

接下来是module_exit:
#define module_exit(x) __exitcall(x);
#define __exitcall(fn) \
static exitcall_t __exitcall_##fn __attribute_used__ \
__attribute__ ((__section__ (".exitcall.exit"))) = fn
跟module_init是一个意思, 只是'特殊位置'换成了.exitcall.exit.

如果是编译为模块, 则不一样了:
#define module_init(initfn) \
static inline initcall_t __inittest(void) \
{ return initfn; } \
int init_module(void) __attribute__((alias(#initfn)));

#define module_exit(exitfn) \
static inline exitcall_t __exittest(void) \
{ return exitfn; } \
void cleanup_module(void) __attribute__((alias(#exitfn)));

利用gcc扩展定义了一个alias, 调用init_module就等同于调用initfn.
这样insmod无论是什么模块, 找init_module这个函数就可以了.

Tuesday, March 18, 2008

据说可以通过过发邮件来写Blog

这封信来自我的gmail邮箱, 我就是想确认下这样是否真的能写Blog, 还有, 图片是怎样显示的呢?

--
不了解debian就不要下结论说哪个发行版更好.
不了解emacs就不要下结论说哪个编辑器更好..

伪户外运动爱好者

自从上个周末跟李ちゃん爬了一次梧桐山后, 我就对户外运动充满了期待.
还特地跑到深圳一些户外运动网站看他们的活动, 兴致勃勃的想要参与下.
看完后, 一想到要跟一大帮陌生人出去玩一天, 我又立刻缩卵了...

娘的, 我真是宅太久了么...

Thursday, January 3, 2008

我对你的爱藏在堆里面

我对你的爱藏在堆里面
Fork的那一瞬就已出现

我对你的爱藏在堆里面
只有用指针才能够发现

我对你的爱藏在堆里面
尽管OS只给64K空间

我对你的爱藏在堆里面
4G也不会是我的终点

我对你的爱藏在堆里面
malloc把我带到你跟前

我对你的爱藏在堆里面
free也无法阻挡它出现

我对你的爱藏在堆里面
我以虚拟内存之名许愿

我对你的爱藏在堆里面
承诺你取之不尽的空间

我对你的爱藏在堆里面
离开前我没有任何哀怨

我对你的爱藏在堆里面
OS见证了我爱的思念

嘿嘿, 我的原创.

Saturday, December 15, 2007

总算打开我的Blog了.

在大陆, Blogspot经常打不开, 我许久不来写了.
这次借来东京出差, 上来给我的Blog打个招呼.