Chinaunix首页 | 论坛 | 博客
  • 博客访问: 655115
  • 博文数量: 171
  • 博客积分: 2246
  • 博客等级: 大尉
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 11:45
文章分类

全部博文(171)

文章存档

2018年(3)

2017年(4)

2015年(1)

2014年(20)

2013年(57)

2012年(86)

分类: 嵌入式

2012-09-05 16:18:13

本人使用的TD的模块是LC63**,在上个月的这几天刚拿到板子,折腾了将近一个月,这个板子打电话,上网都没有问题了。

 

首先还是有必要介绍一下ppp协议了,是TD上网的基础:

PPP是点对点的连接协议。这种连接建立之后,将给两点分别分配IP地址,使用这个IP可以进行两点之间的通讯。互联网最初的“拨号上网”方式说的就是它。因为现在最流行的互联网连接方式是Ethernet,所以PPP大都被很多人遗忘。还有就是PPP出来一个“变种”,被叫做PPPoE,也就是 PPP on Ethernet,这又增加了一个PPP被遗忘的理由.

 

先说说PPP连接互联网的一种比较常见的方式。
PC—-Modem—-PPP—–RemoteHost—-Internet
PC可以通过某种方式连接调制解调器调制解调器负责将数字信号转换成电信号(这个说法有点模糊,可能是音频或者脉冲),用一组“AT”命令与远程的一台主机通讯,这台主机是接入互联网的,主要负责将你的PC发过来包再次转发。下行流程于上面说的这个过程正好相反。从这个过程来看,PC的配置主要问题集中在:
    * 如何配置调制解调器Modem      -------------pppd
    * 如何配置那一组AT命令通讯脚本 -----------chat

正好这两个问题在Linux中有两个简单的工具一一对应,调制解调器的配置可以用过pppd完成,而AT命令的通讯脚本可以交给chat

现在常见的Linux系统中都自带了pppd的模块,如果没有可以自己下载来手动编译,然后将生成的可以执行文件(pppd,chat 等)放到/usr/sbin/文件夹下即可。

下面就配置系统的pppd吧:

安装完pppd后生成/etc/ppp/目录,修改/etc/ppp/peers/cmnet文件(若没有该文件,可手动建立,文件名不一定为cmnet):

/dev/ttyUSB1
115200
modem
nocrtscts
nocdtrcts
local
debug
nodetach
#nobsdcomp
#nodeflate
#novj
usepeerdns
defaultroute
noipdefault
ipcp-accept-local
ipcp-accept-remote
lock
connect '/usr/sbin/chat -s -v -f /etc/ppp/chat/cmtc-isp'

这些命令如果不明白的,可一到网上搜,很容易找到,就不再说明:

修改/etc/ppp/chat/cmtc-isp文件(本人的系统中没有该chat目录,则手动建立,建立cmtc-isp):

ABORT    'BUSY'
ABORT    'NO CARRIER'
ABORT    'ERROR'
ABORT    '+CME ERROR:100'
""     AT
OK     AT+CGDCONT=1,"IP","CMNET",,0,0
OK   AT+CGEQREQ=1,2,128,2048,0,0,0,0,"0E0","0E0",,0,0
OK   AT
OK   AT
OK   ATS0=0
OK   AT
OK   AT
OK   ATD*98*1#
CONNECT

这个文件中都是一些AT指令,网上也比较多,不再说明。

 

运行 pppd call cmnet 即可启动pppd脚本程序,如不出意外,会返回以下一些内容

 

abort on (BUSY)
abort on (NO CARRIER)
abort on (ERROR)
abort on (+CME ERROR:100)
send (AT^M)
expect (OK)
^M
OK
 -- got it

send (AT+CGDCONT=1,"IP","CMNET",,0,0^M)
expect (OK)
^M
^M
OK
 -- got it

send (AT+CGEQREQ=1,2,128,2048,0,0,0,0,"0E0","0E0",,0,0^M)
expect (OK)
^M
^M
OK
 -- got it

send (AT^M)
expect (OK)
^M
^M
OK
 -- got it

send (AT^M)
expect (OK)
^M
^M
OK
 -- got it

send (ATS0=0^M)
expect (OK)
^M
^M
OK
 -- got it

send (AT^M)
expect (OK)
^M
^M
OK
 -- got it

send (AT^M)
expect (OK)
^M
^M
OK
 -- got it

send (ATD*98*1#^M)
expect (CONNECT)
^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
CONNECT
 -- got it

Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB1
sent [LCP ConfReq id=0x1 ]
rcvd [LCP ConfReq id=0x28 ]
No auth is possible
sent [LCP ConfRej id=0x28 ]
rcvd [LCP ConfAck id=0x1 ]
rcvd [LCP ConfReq id=0x29 ]
sent [LCP ConfAck id=0x29 ]
sent [CCP ConfReq id=0x1 ]
sent [IPCP ConfReq id=0x1 ]
rcvd [LCP ProtRej id=0x2a 80 fd 01 01 00 0c 1a 04 78 00 18 04 78 00]
Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
sent [IPCP ConfReq id=0x1 ]
rcvd [IPCP ConfReq id=0x2b ]
sent [IPCP ConfAck id=0x2b ]
rcvd [IPCP ConfRej id=0x1 ]
sent [IPCP ConfReq id=0x2 ]
rcvd [IPCP ConfNak id=0x2 ]
sent [IPCP ConfReq id=0x3 ]
rcvd [IPCP ConfAck id=0x3 ]
local  IP address 10.170.57.106
remote IP address 192.168.0.1
primary   DNS address 211.136.17.108

 

我也到google里面搜了一些,发现有的TD需要用户名和密码,我的这个不需要也可以上网,也不知道为啥啦。

看到pppd call cmnet成功返回ip和DNS后说明pppd成功了,此时如果系统中的eth0这个设备启动了,则需要通过ifconfig eth0 down命令将其关闭,避免两个上网的端口冲突。

再设置ppp0端口的路由为系统的默认路由,命令如下:

route del default

route add default ppp0

将得到的DNS存到 /etc/resolve.conf文件中 nameserver 211.136.17.108(注:如果TD设备的文档中已给出这个DNS,则可以在运行pppd之前就放到resolve.conf这个文件中)

现在pppd成功启动了,很多人都会用ping这个命令去试一下网络是否通了,但是ping是行不通的。因为我们每次运行pppd这个程序返回的ip都是网内的动态ip,可以连接到公共网,但公共网却无法返回回来,所需只能通过浏览器的方式来测试网络是否已通 。需要设置网络的代理,代理如下:10.0.0.172  80。设置之后输入url即可访问网站了。

其中还有一个小问题:

本人一开始没哟考虑这个usbserial模块的问题,导致后来运行pppd call cmnet的时候老是出现如下的错误:

Serial connection established.
Couldn't get channel number: Inappropriate ioctl for devic

后来想了好久才明白是这个usbserial的问题

所以需要从新编译这个模块,这就涉及到linux驱动的问题了,如有不明白linux驱动的需要查找一些书来看一看了。

1.下载内核(注:下载的内核不一定要和系统的内核版本完全相同,我下载的内核版本就和系统的版本不一样),解压内核

2.copy当前内核配置文件至内核源代码目录下,
cp /boot/config-$(uname -r) /usr/src/linux-2.6.28/.config(即到/boot目录下找一个config开头的配置文件,将其复制到解压后的内核目录下,修改文件名为:.config即可)

3.为编译模块创建配置文件。
cd /usr/src/linux-source-2.6.24/ && make oldconfig

通过make oldconfig可以减少很多不必要的选择,使用系统当前的配置作为新内核默认的配置,也可以运行make menuconfig 等命令

4.对内核源码中的usbserial.c修改
usbserial.c进行修改,修改usb_serial_probe()函数中buffer_size = 4096;好像共有4个地方需要修改

5.编译修改后的模块(这里实际上编译了所有的USB串口模块,但至少比编译整个内核快得多)
make -C /lib/modules/$(uname -r)/build M=/usr/src/linux-2.6.28/drivers/usb/serial

/lib/modules/..../build为系统目录,如我的是:/lib/modules/2.6.32.10-90.fc12.i686.PAE/build。

后面一个目录为当前编译的usbserial模块的目录。

6.备份当前使用的usbserial.ko,然后将上步生成的usbserial.ko copy到/lib/modules/kernel/drivers/usb/serial/
如果找不到内核中usbserial.ko的位置,可以通过locate usbserial.ko指令找到

大概的过程和问题就这样了,终于搞定了!!!!!!!!!!

FROM:http://blog.csdn.net/yalexiaoqiang/article/details/5564715

阅读(2637) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~