嵌入式Linux下3G USB Modem的使用

时间:2022-06-19 12:23:38

busybox中需打开:wcpidof

busyboxshell下打开getopts



百度搜索Serial connection established. using channel 1包含大量问题解答


2013-12-22      0个评论       

收藏    

嵌入式Linux下3G USB Modem的使用

我要投稿

.ARM-Linux

ARM-Linux-2.6.17

3G USB Modem:huaweiE220(WCDMA),huaweiEC156(EVDO)

arm-linux至少需要支持usb host,usb storage,usbfs,usb serial

 

.Linux驱动

option.c

linuxoption.c就是针对3G modem的驱动,稍作修改即可支持大部分的3G usb modem

目前我的这个版本的USB Option PCMCIA serial driver依赖于USB_SERIAL && USB_OHCI_HCD && PCCARD,所以系统要保证已经选定了这三个选项,如果host不同,可以自行修改USB_OHCI_HCD这个依赖项,我的目前使用isp芯片所以就修改了这个依赖项,总而言之,usb host是必须需要的.

添加对华为e220和华为ec156的支持,option_ids数组中添加子项:


1.      #define HUAWEI_PRODUCT_E220                    0x1003  

2.      #define HUAWEI_PRODUCT_EC156                   0x140c  


1.      { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) },  

2.      { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_EC156)},  

 

.工具

usb_switchmode-1.2.4

这是目前的最新版本,使用这个工具的目的是将默认被识别为存储设备的3g usb modem转换为可以通讯的多个串口设备,以用于ppp拨号连接.

此工具依赖于linusb,全部交叉编译之,.

        1.下载并交叉编译libusb-0.1.12:



./configure --build=i686-linux --host=arm-linux --prefix=$PWD/install



make



make -n install  (确定安装目录)



make install   

至此,libusb编译完毕.

2.交叉编译usb_switchmode

修改makefile:



cc=arm-linux-gcc



INCLUDEDIR =/home/jay/tools/3G/libusb-0.1.12/install/include



LIBDIR =/home/jay/tools/3G/libusb-0.1.12/install/lib






$(CC) -I $(INCLUDEDIR) -L $(LIBDIR) -o $(PROG) $(OBJS) $(CFLAGS) $(LIBS) $(LDFLAGS) -static



make



顺利通过,至此得到静态编译的usb_switchmode

 

3.usb_switchmode移到arm linux文件系统中,然后将usb_switchmode.conf文件夹复制进arm linux中的/etc/目录下,这个文件夹下是很多3g usb modem的配置文件.




4.pppd拨号软件

移植pppd2.4.5



./configure



make CC=arm-linux-gcc



需要的东西就是:pppd chat pppdump pppstats下可执行程序pppd, chat, pppdump, pppstats

在嵌入式文件系统下需要建立/etc/ppp/peers文件夹

 

.使用

插入3g usb modem的时候会被默认识别为u,此时使用usb_switchmode工具转换,就会绑定到多个串口上去,

usb_modeswitch -W -c /etc/usb_modeswitch.d/12d1_1505

其中-W仅仅是显示详细配置信息,-c是指指定配置文件,usb_switchmode自带的配置文件貌似在嵌入式下使用都多多少少有点问题,随后发现,必须要指定

DefaultVendor DefaultProduct两个参数.

usb 1-1: new full speed USB device using isp1362-hcd and address 8



usb 1-1: configuration #1 chosen from 1 choice



option 1-1:1.0: Option 3G data card converter detected



usb 1-1: Option 3G data card converter now attached to ttyUSB0



option 1-1:1.1: Option 3G data card converter detected



usb 1-1: Option 3G data card converter now attached to ttyUSB1



option 1-1:1.2: Option 3G data card converter detected



usb 1-1: Option 3G data card converter now attached to ttyUSB2



option 1-1:1.3: Option 3G data card converter detected



usb 1-1: Option 3G data card converter now attached to ttyUSB3



scsi6 : SCSI emulation for USB Mass Storage devices

如果没有ttyUSB0之类的设备节点,可以自己手动建立,

mknod /dev/ttyUSB0 c 188 0

mknod /dev/ttyUSB0 c 188 1

....

之后可以

echo ATZ>/dev/ttyUSB0,如果没有错误,转换基本ok.

 

最后就剩下ppp拨号

目前我使用的e220wcdma制式,ec156evdo制式,其拨号脚本少有不同(驱动仅仅是设备号码有点点区别)

1.wcdma:


1.      debug  

2.      nodetach  

3.      lock  

4.      /dev/ttyUSB0  

5.      115200  

6.      user "14522023288"  

7.      password "******"  

8.      crtscts  

9.      show-password  

10.   usepeerdns  

11.   noauth  

12.   noipdefault  

13.   novj  

14.   novjccomp  

15.   noccp  

16.   defaultroute  

17.   ipcp-accept-local  

18.   ipcp-accept-remote  

19.   connect '/usr/sbin/chat -s -v -f chat-wcdma-connect'  

20.   disconnect '/usr/sbin/chat -s -v -f chat-wcdma-disconnect'  




chat-wcdma-connect:


1.      TIMEOUT 5  

2.      ABORT 'NO CARRIER'  

3.      ABORT 'ERROR'  

4.      ABORT 'NO DIALTONE'  

5.      ABORT 'BUSY'  

6.      ABORT 'NO ANSWER'  

7.      '' /rAT  

8.      OK /rATZ  

9.      OK /rAT+CGDCONT=1,"IP","3gnet",,0,0  

10.   OK-AT-OK ATDT*99#  

11.   CONNECT /d/c  




chat-wcdma-disconnect:

[html] view plaincopy

1.      ABORT "BUSY"  

2.      ABORT "ERROR"  

3.      ABORT "NO DIALTONE"  

4.      SAY "/nSending break to the modem/n"  

5.      '' "/K"  

6.      '' "+++ATH"  

7.      SAY "/nGoodbay/n"  


2.evdo


1.      debug  

2.      nodetach  

3.      lock  

4.      /dev/ttyUSB0  

5.      115200  

6.      user "ctnet@mycdma.cn"  

7.      password "vnet.mobi"  

8.      crtscts  

9.      show-password  

10.   usepeerdns  

11.   noauth  

12.   noipdefault  

13.   novj  

14.   novjccomp  

15.   noccp  

16.   defaultroute  

17.   ipcp-accept-local  

18.   ipcp-accept-remote  

19.   connect '/usr/sbin/chat -s -v -f /etc/ppp/peers/chat-evdo-connect'  

20.   disconnect '/usr/sbin/chat -s -v -f /etc/ppp/peers/chat-evdo-disconnect'  




chat-evdo-connect:


1.      TIMEOUT 60  

2.      ABORT 'NO CARRIER'  

3.      ABORT 'ERROR'  

4.      ABORT 'NO DIALTONE'  

5.      ABORT 'BUSY'  

6.      ABORT 'NO ANSWER'  

7.      '' /rATZ  

8.      OK-AT-OK ATD#777  

9.      CONNECT /d/c  




chat-evdo-disconnect:


1.      ABORT 'NO CARRIER'  

2.      ABORT 'ERROR'  

3.      ABORT 'NO DIALTONE'  

4.      ABORT 'BUSY'  

5.      ABORT 'NO ANSWER'  

6.      SAY "/nSending break to the modem/n"  

7.      '' "/K"  

8.      '' "+++ATH"  

9.      SAY "/nGoodbay/n"  


后台拨号使用:

pppd call wcdma&

pppd call evdo&

电信的ecdo貌似账号密码必须使用ctnet@mycdma.cn vnet.mobi,不能使用电话号码和给定的密码.

如果拨号成功ifconfig可以看到ppp0

ppp0      Link encap:Point-to-Point Protocol  



          inet addr:183.43.180.134  P-t-P:113.115.0.1  Mask:255.255.255.255



          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1



          RX packets:4 errors:0 dropped:0 overruns:0 frame:0



          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0



          collisions:0 txqueuelen:3 



          RX bytes:70 (70.0 B)  TX bytes:64 (64.0 B)

测试网络:

# ping www.baidu.com



PING www.a.shifen.com (220.181.111.148): 56 data bytes



64 bytes from 220.181.111.148: icmp_seq=0 ttl=55 time=91.3 ms



64 bytes from 220.181.111.148: icmp_seq=1 ttl=55 time=105.3 ms



64 bytes from 220.181.111.148: icmp_seq=2 ttl=55 time=93.9 ms



64 bytes from 220.181.111.148: icmp_seq=3 ttl=55 time=98.9 ms



64 bytes from 220.181.111.148: icmp_seq=4 ttl=55 time=95.4 ms

ping的时候注意屏蔽掉eth0之类的其他网络节点:ifconfig eth0 down

如果无法解析域名,多半应该是dns问题,本来pppdns是自动获取的,但是它保存的路径是/etc/ppp/resolv.conf,但是linux使用的却是/etc/resolv.conf,所以我们建立一个软连接即可:

ln -s /etc/ppp/resolv.conf /etc/resolv.conf

至此3G usb modem嵌入式下使用告一段落



断开3G网卡,需要将ppp/script下的poff脚本拷贝到开发板/usr/sbin下,且修改为可执行的权限

断开3G网卡:poff


DNS问题:拷贝/etc/ppp/resolv.conf /etc/resolv.conf



 atd NO CARRIER出错 

      gsm/gprs模块如果是语音拨号(打电话)格式是ATDT05923434343;<回车>,注意有分号。如果是数据分组拨号(CSD或者GPRS)格式是ATDT*99***1#<回车>,注意回车前没有分号。注意一下。错了肯定会报NO CARRIER,或者NO DIALTONE



这个是每个运行商的拨号中心号码:

运营商名称       接入点               用户名密码       拨号号码                   备注   

中国移动          Cmnet cmwap                     *99***1#                    2.5G2.75GGPRS   

                          Cmnet cmwap                      *98*1#                       3G(TD-SCDMA)   

中国联通            3gnet                                    *99#                            3G(WCDMA)   

中国电信                                   card  card       #777                           2G  3G   



运营商(ISPAPN拨号号码帐号密码

中国联通WCDMAChina Unicom3GNET*99#

中国电信CDMA2000China TelecomEVDO网络#777ctnet@mycdma.cnvnet.mobi

1X网络#777card (CARD)cardCARD

中国移动 TD-SCDMAChina MobileCMNET*98*1#

中国移动 GPRSChina MobileCMNET*99***1#







各种拨号脚本

A. 联通WCDMA-HSDPA:

(1)wcdma: 

debug

nodetach

lock

/dev/ttyUSB0

115200

user "card"

password "card"

crtscts

show-password

usepeerdns

noauth

noipdefault

novj

novjccomp

noccp

defaultroute

ipcp-accept-local

ipcp-accept-remote

connect '/usr/sbin/chat -s -v -f chat-wcdma-connect'

disconnect '/usr/sbin/chat -s -v -f chat-wcdma-disconnect'


(2) chat-wcdma-connect: 

TIMEOUT 5

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' \rAT

OK \rATZ

OK \rAT+CGDCONT=1,"IP","3gnet",,0,0

OK-AT-OK ATDT*99#

CONNECT \d\c


(3) chat-wcdma-disconnect 

ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "\nSending break to the modem\n"

'' "\K"

'' "+++ATH"

SAY "\nGoodbay\n”



B. 移动TD-CDMA

(1)td: 

debug

logfile /var/log/pppd.log

lock

/dev/ttyUSB0

115200

user "card"

password "card"

crtscts

connect '/usr/sbin/chat -v -t3 -f td-connect-chat'

disconnect '/usr/sbin/chat -s -v -f td-disconnect-chat'

show-password

usepeerdns

noauth

noipdefault

novj

novjccomp

noccp

defaultroute

ipcp-accept-local

ipcp-accept-remote



(2) td-connect-chat: 

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' \rATZ

OK-AT-OK ATD#777

CONNECT \d\c



(3) td-disconnect-chat: 

ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "\nSending break to the modem\n"

'' "\K"

'' "+++ATH"

SAY "\nGoodbay\n"




C. 电信CDMA1x

(1) cdma1x: 

debug

nodetach

lock

/dev/ttyUSB0

115200

user "card"

password "card"

crtscts

show-password

usepeerdns

noauth

noipdefault

novj

novjccomp

noccp

defaultroute

ipcp-accept-local

ipcp-accept-remote

connect '/usr/sbin/chat -s -v -f cdma1x-connect-chat'

disconnect '/usr/sbin/chat -s -v -f cdma1x-disconnect-chat'


(2) cdma1x-connect-chat: 

TIMEOUT 5

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' \rATZ

OK \rAT\^PREFMODE=2

OK-AT-OK ATD#777

CONNECT \d\c


(3) cdma1x-disconnect-chat: 

ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "\nSending break to the modem\n"

'' "\K"

'' "+++ATH"

SAY "\nGoodbay\n”



D. 电信CDMA2000-EVDO

(1) evdo 

debug

nodetach

lock

/dev/ttyUSB0

115200

user "card"

password "card"

crtscts

show-password

usepeerdns

noauth

noipdefault

novj

novjccomp

noccp

defaultroute

ipcp-accept-local

ipcp-accept-remote

connect '/usr/sbin/chat -s -v -f evdo-connect-chat'

disconnect '/usr/sbin/chat -s -v -f evdo-disconnect-chat'


2evdo-connect-chat 

TIMEOUT 5

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' \rATZ

OK-AT-OK ATD#777

CONNECT \d\c


3evdo-disconnect-chat 

ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "\nSending break to the modem\n"

'' "\K"

'' "+++ATH"

SAY "\nGoodbay\n"




HSPA


WCDMA的发展基本可以分为以下几个不同的版本。首先是R99/R4版本,这个版本算是WCDMA的早期版本,现在我们通常也把这个版本叫做WCDMA,这个版本可以提供384Kbps的最高上传速度和2Mbps的最高下载速度。后来WCDMA发展到了R5版本,这时提出了一个技术,就是HSDPA(高速下行分组数据接入技术),这个版本大幅度强化了R99/R4版本的最高下载速度,达到7.2Mbps或者14.4Mbps,我们现在就把这个版本的WCDMA叫做HSDPA。在接下来技术进一步进化,到了R6版本时,提出了HSUPA(高速上行分组数据接入技术),这个技术在保持R5版本的下行速度不变的情况下大幅度强化了HSDPA的最高上行速度,提升到5.76Mbps,我们现在就把R6版本的WCDMA叫做HSUPAR5R6版本统称HSPA。技术总是进化的,到了R7版本时,HSPA+出现了,这个版本保持R...



HSPA英文全称为HSPA High-Speed Packet Access

WCDMAR99R4系统能够提供的最高上下行速率分别为64kbps384kbps,为了能够与CDMA1XEV-DO抗衡,WCDMAR5规范中引入了HSDPA,在R6规范中引入了HSUPAHS-DPAHSUPA合称为HSPA

HSDPA(高速下行分组接入)在下行链路上能够实现高达14.4Mbit/s的速率。通过新的自适应调制与编码以及将部分无线接口控制功能从无线网络控制器转移到基站中,实现了更高效的调度以及更快捷的重传,HSDPA的性能得到了优化和提升。

HSUPA(高速上行分组接入)在上行链路中能够实现高达5.76Mbit/s的速度。基站中更高效的上行链路调度以及更快捷的重传控制成就了HSUPA的优越性能。

HSPA+(增强型高速分组接入)是HSPA的强化版本。HSPA+HSPA的速度更快,性能更好,技术更先进,同时网络也更稳定,是目前LTE技术运用之前的最快的网络。



setsockopt绑定到特定interface

http://hi.baidu.com/lewutian/item/6b8a2c80db48e929110ef314

(转)SOL_BINDTODEVICE

SOL_BINDTODEVICEsetsockopt设置中的一种套接口选项.当套接口被绑定到

指定的网络设备接口之后,只有来自该设备的数据包才会被套接口处理。


Linux下,对网络设备的引用是通过struct ifreq来完成.通过设置struct

ifreq中的ifr_name[IFNAMSIZ]来指定网络设备接口.举例如下:

struct ifreq interface;

char *inf = "eth0";

strncpy(interface.ifr_name, inf, IFNAMSIZ);


这样再通过设置:

if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0)

{

    close(fd);

    return -1;

}

就绑定到了接口"eth0",所有数据报的收发都只经过这个接口.


对于SOL_BINDTODEVICE的总结如下:


1       对于TCP套接口、UDP套接口、RAW套接口,可以通过SO_BINDTODEVICE套接口选项将套接口绑定到指定的网络接口上。绑定之后,套接口的所有数据包收发都只经过指定的网络接口;

2       对于PF_PACKET类型的套接口,不能通过SO_BINDTODEVICE绑定到指定的网络接口上,而要通过bind(2)来与特定的网络接口绑定,所用的套接口地址结构为struct sockaddr_ll,此套接口地址结构是链路层的地址结构,独立于具体的网络设备。比如,该地址结构既可以用于表示PPP设备,也能用于表示ethernet设备。

3        SO_BINDTODEVICE套接口选项只适用于Linux系统。如果要编写运行在多操作系统平台上的程序,不能依赖SO_BINDTODEVICE来完成套接口与具体设备的绑定。


转自:http://blog.chinaunix.net/u2/64516/showart_673646.html

另有一篇比较不错,讲述如何使用setsockopt()getsockopt()及套接口选项

http://hi.baidu.com/goodluckyyc/blog/item/7d3f442d6436b2eb8b1399ba.html


setsockopt()getsockopt()的选项名称选项意义 期望值 SO_BINDTODEVICE

可以使socket只在某个特殊的网络接口(网卡)有效。

一个字符串给出设备的名称,或者一个空字符串返回默认值 SO_BROADCAST允许广播地址发送和接收信息包,只对UDP有效。布尔型整数 SO_DONTROUTE禁止通过路由器和网关往外发送信息包。可以防止数据离开本地网络,起到安全保护的作用。布尔型整数 SO_KEEPALIVE可以使TCP通信的信息包保持连续性,在连接数很多,而且要持续连接时很有用,减少重新连接服务器的开销。布尔型整数  SO_OOBINLINE可以把收到的不正常数据看成是正常的数据;也就是说,会通过一个标准的对recv()的调用来接收这些数据布尔型整数  SO_REUSEADDRsocket关闭后,本地端用于该socket的端口号立刻就可以被重用。这个可以减少TIME_WAIT的存在布尔型整数  SO_TYPE 重新得到socket类型(例如:SOCK_STREAM SOCK_DGRAM)。只用于getsockopt()整数


原文地址http://neupest.blog.163.com/blog/static/53714126200932331436280/

 

setsockopt()getsockopt()的选项名称

 

 

选项 意义 期望值 

SO_BINDTODEVICE 可以使socket只在某个特殊的网络接口(网卡)有效。一个字符串给出设备的名称,或者一个空字符串返回默认值 

SO_BROADCAST 允许广播地址发送和接收信息包,只对UDP有效。布尔型整数 

SO_DONTROUTE 禁止通过路由器和网关往外发送信息包。可以防止数据离开本地网络,起到安全保护的作用。布尔型整数 

SO_KEEPALIVE 可以使TCP通信的信息包保持连续性,在连接数很多,而且要持续连接时很有用,减少重新连接服务器的开销。布尔型整数  

SO_OOBINLINE 可以把收到的不正常数据看成是正常的数据;也就是说,会通过一个标准的对recv()的调用来接收这些数据布尔型整数  

SO_REUSEADDR socket关闭后,本地端用于该socket的端口号立刻就可以被重用。这个可以减少TIME_WAIT的存在布尔型整数  

SO_TYPE 重新得到socket类型(例如:SOCK_STREAM SOCK_DGRAM)。只用于getsockopt()整数 

 







 多网卡发送数据包 


通常情况,非特殊程序联网,不会指定使用有线还是无线网卡,更不会指定用哪个网卡。假如同时有两块网卡(笔记本就有无线有无线两块),在有线和无线都连上的情况下,使用哪个网线上网,是系统决定的,如果用户自己没对此时行特别设置的话,系统会默认使用有线的。如果你正在使用有图形界面的Linux,在托盘的网络图标就可以设置,把无线网卡禁掉。如果非图形界面,你要告诉大家你是用什么发行版的Linux,假设你两个网卡都可以联网了,那就试下在终端打入以下命令来禁无线网卡: ifconfig wlan0 down 如果执行完后,程序无法联网,就说明你的有线网卡没配置好,你要给大家提供更多的信息,比如可以打入: ifconfig -a把输出粘上来给大家看。

分类: C/C++


方法一:

使用libnet,这里就不介绍了


方法二:

使用原始套接字

>>

>>指定网卡发送数据的时候不需要指定网卡IP,只要设置struct ifreg ifr.ifr_name就可以了。

>>例如:

>>    struct ifreq ifr;

>>    fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

>>    memset(&ifr, 0, sizeof (ifr));

>>    strncpy(ifr.ifr_name, "eth0", sizeof (ifr.ifr_name) -1);

>>    ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';

>>    if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0 )

>>    {

>>        snprintf(err_buf, ERRBUF_SIZE,

>>                "SIOCGIFHWADDR: %s", strerror(errno));

>>        return -1;

>>    }

>>


方法三:bind的时候设置不同网卡的ip

这种情况适用于运行Server端操作,为套接字绑定不同的接口ip,可以接受不同网络[不同ISP]的数据包


在双线接入主机中,可以使用这种方法来编写程序,来相应不同接口的数据包,而且反应快。



方法四:


in_addr interface;

interface.s_addr = inet_addr("192.168.0.100");

setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, reinterpret_cast<char*>(&interface), sizeof(interface))



方法五:

问题:一台服务器有多张网卡,要让数据包从指定的发出去,怎么实现,多谢!

假如linux服务器下有几个网卡,且都属于一个网段,通常数据从eth0,发出,那该如何指定一些特殊数据从eth1eth2发送呢?

哪位知道的给个解决方案好不? 

认为较好的答案:

假设:

3个网卡 eth0 eth1 eth2

地址:192.168.0.1 192.168.0.2 192.168.0.3网关 192.168.0.254


ip route add default via 192.168.0.254 dev eth0 table 100 src 192.168.0.1

ip route add default via 192.168.0.254 dev eth1 table 200 src 192.168.0.2

ip route add default via 192.168.0.254 dev eth3 table 300 src 192.168.0.3


ip rule add from 192.168.0.1 table 100

ip rule add from 192.168.0.2 table 200

ip rule add from 192.168.0.3 table 300


这样设置后,你访问哪个地址,就会使用哪个网卡来发送数据


还有,多个网卡设置为同一段的IP不会引起任何麻烦,只是需要提醒的是设置IP的时候不能每个网卡都设置缺省网关,否则就会有麻烦了。 

windows 中有双网卡,一个网卡的IP地址为192.168.180.1一个是192.168.170.1 

在没有手工添加路由项的情况下,这时ping 发出的数据全部是从192.168.180.1这个网卡发出去。 

那么了为能够让192.168.170.1这个网卡也能够往外ping那么必须指定一条路由 

route add 192.168.0.0 mask 255.255.255.0 192.168.170.254 

这样192.168.170.1这个网卡就能够往外ping






 cortex-A83G模块的支持

作者:陈老师,华清远见嵌入式学院讲师。

开发主机          VMware ubuntu10.10    |
        |  移植内核             linux-2.6.22.6            |
        |   3G模块                华为 E220           |
        |    SIM                     联通3G                     |
        |    pppd                       ppp-2.4.4          
        |         |
        |____________________________________|

内核配置:

增加内核支持USB Serial 驱动

-> Device Drivers                                                            
        x       -> USB support                                                             
        x         -> USB Serial Converter support                                          
        x           -> USB Serial Converter support (USB_SERIAL [=y])  
                           [*]USB Generic Serial Driver
                                      <*>USB driver for GSM and CDMA modems

增加内核支持PPP协议驱动
        -> Device Drivers                                                            
        x       -> Network device support                                      
        x         -> Network device support (NETDEVICES [=y])  
                     <*>   PPP (point-to-point protocol) support                      
                       [*]     PPP multilink support (EXPERIMENTAL)          
                           [*]     PPP filtering                                                   
                            <*>     PPP support for async serial ports                          
                            <*>     PPP support for sync tty ports                                 
                            <*>     PPP Deflate compression                                        
                            <*>     PPP BSD-Compress compression                                      
                            <*>     PPP MPPE compression (encryption) (EXPERIMENTAL)                  
                            <*>     PPP over Ethernet (EXPERIMENTAL)

pppd

下载地址:http://www.linuxfromscratch.org/blfs/view/6.3/basicnet/ppp.html
        解压  ppp-2.4.4.tar.gz
        执行脚本产生Makefile等文件:./configure

若为android系统,则需要改变编译方式,需要静态编译;(因为 android c库使用的是Bionic库,不与GNU C库,ucLibc,或任何已知的Linux C库相兼容,所以编译时需要静态编译)

chat:   chat.o
                $(CC) -o chat chat.o  -static
        chat.o: chat.c
                $(CC) -c $(CFLAGS) -o chat.o chat.c  -static

用开发板的交叉编译工具链编译: make CC=arm-unknown-linux-gnueabi-gcc

ppp-2.4.4/chat/chat      ppp-2.4.4/pppd/pppd 复制到开发板文件系统/usr/sbin

在到开发板文件系统/var/ 下建立run目录

开始编写脚本:

在开发板文件系统里建立/etc/ppp/peers文件夹,下面所创建出的脚本都存放在该路径

1、创建拨号选项脚本: vi  wcdma

1 noauth
         2 debug
         3 connect '/usr/sbin/chat -v -f /etc/ppp/peers/wcdma-chat-connect'
         4 /dev/ttyUSB0
         5 115200 
         6 defaultroute
         7 noipdefault
         8 novj
         9 novjccomp
        10 noccp
        11 ipcp-accept-local
        12 ipcp-accept-remote
        13 local
        15 dump
        16 nodetach
        17 nocrtscts
        18 #usepeerdns    

2、创建脚本: vi wcdma-chat-connect

1 "" AT
        2 OK ATDT  *99# 
        3 CONNECT

测试:

启动开发板,进入文件系统,插上3G模块(MG3732

提示:

usb 1-1: new full speed USB device using s3c2410-ohci and address 4
        option 1-1:1.0: GSM modem (1-port) converter detected
        usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
        option 1-1:1.1: GSM modem (1-port) converter detected
        usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
        libusual: modprobe for usb-storage succeeded, but module is not present

我们使用的是ttyUSB0,虽然有module is not present,但是不影响ping;

调用脚本拨号:
        # pppd call wcdma & 

终端会出现:
       [root@wuqing/]#pppd options in effect:
debug           # (from /etc/ppp/peers/wcdma)
nodetach                # (from /etc/ppp/peers/wcdma)
dump            # (from /etc/ppp/peers/wcdma)
noauth          # (from /etc/ppp/peers/wcdma)
/dev/ttyUSB0            # (from /etc/ppp/peers/wcdma)
115200          # (from /etc/ppp/peers/wcdma)
connect /usr/sbin/chat -v -f /etc/ppp/peers/wcdma-chat-connect          # (from                                            /etc/ppp/peers/wcdma)
nocrtscts               # (from /etc/ppp/peers/wcdma)
local           # (from /etc/ppp/peers/wcdma)
novj            # (from /etc/ppp/peers/wcdma)
novjccomp               # (from /etc/ppp/peers/wcdma)
ipcp-accept-local               # (from /etc/ppp/peers/wcdma)
ipcp-accept-remote              # (from /etc/ppp/peers/wcdma)
noipdefault             # (from /etc/ppp/peers/wcdma)
defaultroute            # (from /etc/ppp/peers/wcdma)
noccp           # (from /etc/ppp/peers/wcdma)
Serial connection established.
using channel 3
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB0
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x9793836> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0xcd7ea3> <pcomp>                                              <accomp>]
No auth is possible
sent [LCP ConfRej id=0x0 <auth chap MD5>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x9793836> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0xcd7ea3> <pcomp> <accomp>]
sent [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0xcd7ea3> <pcomp> <accomp>]
sent [IPCP ConfReq id=0x1 <addr 0.0.0.0>]
rcvd [LCP DiscReq id=0x2 magic=0xcd7ea3]
rcvd [IPCP ConfNak id=0x1 <ms-dns1 10.11.12.13> <ms-dns3 10.11.12.14> <ms-wins 10.11.12.13> <ms-wins 10.11.12.14>]
sent [IPCP ConfReq id=0x2 <addr 0.0.0.0>]
rcvd [IPCP ConfNak id=0x2 <ms-dns1 10.11.12.13> <ms-dns3 10.11.12.14> <ms-wins 10.11.12.13> <ms-wins 10.11.12.14>]
sent [IPCP ConfReq id=0x3 <addr 0.0.0.0>]
rcvd [IPCP ConfNak id=0x3 <ms-dns1 10.11.12.13> <ms-dns3 10.11.12.14> <ms-wins 10.11.12.13> <ms-wins 10.11.12.14>]
sent [IPCP ConfReq id=0x4 <addr 0.0.0.0>]
rcvd [IPCP ConfReq id=0x0]
sent [IPCP ConfNak id=0x0 <addr 0.0.0.0>]
rcvd [IPCP ConfNak id=0x4 <addr 172.17.15.110>]
sent [IPCP ConfReq id=0x5 <addr 172.17.15.110>]
rcvd [IPCP ConfReq id=0x1]
sent [IPCP ConfAck id=0x1]
rcvd [IPCP ConfAck id=0x5 <addr 172.17.15.110>]
Could not determine remote IP address: defaulting to 10.64.64.64
local  IP address 172.17.15.110
remote IP address 10.64.64.64

此时用ifconfig命令,会看到ppp0 
       # ifconfig
eth0      Link encap:Ethernet  HWaddr 00:00:3E:26:0A:00
          inet addr:192.168.1.3  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3402 errors:53 dropped:53 overruns:0 frame:0
          TX packets:1742 errors:0 dropped:0 overruns:0 carrier:0
          collisions:1498 txqueuelen:1000
          RX bytes:4058678 (3.8 MiB)  TX bytes:663372 (647.8 KiB)
          Interrupt:53 Base address:0x300

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:172.17.15.110  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:168 (168.0 B)  TX bytes:104 (104.0 B)

看到ppp0 说明拨号成功,现在可以ping一下外网IP测试

#ping 220.181.111.147 -I ppp0   (需要指明数据出口网卡,有可能默认从eth0出去)
PING www.baidu.com (220.181.111.147): 56 data bytes
64 bytes from 220.181.111.147: seq=0 ttl=49 time=397.414 ms
64 bytes from 220.181.111.147: seq=1 ttl=49 time=345.459 ms
64 bytes from 220.181.111.147: seq=2 ttl=49 time=340.552 ms
64 bytes from 220.181.111.147: seq=3 ttl=49 time=355.576 ms
64 bytes from 220.181.111.147: seq=4 ttl=49 time=330.651 ms
64 bytes from 220.181.111.147: seq=5 ttl=49 time=355.569 ms
64 bytes from 220.181.111.147: seq=6 ttl=49 time=330.554 ms
64 bytes from 220.181.111.147: seq=7 ttl=49 time=335.571 ms
64 bytes from 220.181.111.147: seq=8 ttl=49 time=360.553 ms

补充:

当域名ping不通时,可能是默认的网关指向eth0的网关
      
虽然ping时指定了数据包的出口-I ppp0但是使用的路由表却是eth0的路由表

(此为ping不通的情况)
       # route
       Kernel IP routing table
       Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
       10.64.64.64     *               255.255.255.255 UH    0      0        0 ppp0
       192.168.7.0     *               255.255.255.0   U     0      0        0 eth0
       default         192.168.7.1     0.0.0.0         UG    0      0        0 eth0

(此为ping通时情况)
       # route
       Kernel IP routing table
       Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
       10.64.64.64     *               255.255.255.255 UH    0      0        0 ppp0
       192.168.7.0     *               255.255.255.0   U     0      0        0 eth0
       default         *               0.0.0.0         U     0      0        0 ppp0

补充2

嵌入式Linux操作系统下,如果要进行PPP连接,就需要配置拨号要使用的连接脚本。这些脚本参数就决定了PPPD的行为,会对PPP连接产生很大的影响。和PPP连接关系密切的有两个脚本是wcdma-chat-connect'wcdma两个脚本。其中,wcdma-chat-connect脚本是用来进行AT呼叫和控制的脚本,而wcdma脚本就影响PPP连接的。

1.  wcdma-chat-connect脚本

一个简单的wcdma-chat-connect脚本有下面的结构:

""              AT
        OK             ATDT  dialnumber
        CONNECT      ""

一个wcdma-chat-connect脚本都是由字符串对来组成的。前面的字符串都是期望获取的串,紧跟的是发送的字符串。这个脚本每一项的具体含义是这样的:

1)   MODEM期望空字符串。这句话的意思直接理解就是MODEM不管收到什么字符串,先发出字符串AT
        2)   期望收到“OK”字符串,然后发送字符串“ATDT dialnumber”
        3)   如果收到“CONNECT”,就不再发送,认为数据链路已建立连接。

这样的wcdma-chat-connect脚本是最简单的,如果需要进行超时控制,就可以加入如下字段:

TIMEOUT 10

如果要增加对特殊情况的处理,就加入下面字段:
        ABORT           BUSY         
        ABORT           NO ANSWER
        ABORT           RINGING

这三行语句的意思是:如果收到字符串“BUSY”“NO ANSWER”“RINGING”就退出执行。

所以在考虑到各种特殊情况下,配置一个PPP连接的wcdma-chat-connect脚本就可以像下面这样:

TIMEOUT         30
        ABORT           BUSY         
                ABORT           NO ANSWER
                ABORT           RINGING
        ""                 AT
        OK                ATDT dialnumber
        CONNECT         ""

2. wcdma脚本

OPTIONS脚本的内容,为PPP连接指定了连接使用的设备、使用的控制字符传输速率、指定了硬件加速、溢出控制等。

例如下面的wcdma脚本:

ttyS0 ---- 指定连接使用的设备,例如:ttyS0ttyS1
        57600 ---- 设置连接使用的控制字符传输速率,可以设置为57600115200
        debug ---- 如果需要加入调试信息,就加入参数debug
        logfile /var/ ppplog ---- 将连接过程中的信息输入到某个文件中
        mtu 1500
        -detach
        noipdefault ---- 不使用默认IP就可以加入参数noipdefault
        defaultroute
        usepeerdns ---- 使用服务器端协商的DNS就可以设置参数usepeerdns
        lcp-echo-failure 4 ---- 当连续4次没有收到发出的LCP回声请求时,就认为服务器端已不再响应,就退出执行。这里的失败次数可以灵活来决定。
        -ccp ---- 不使用压缩控制协议
        -vj ---- 关掉式IP头压缩
        -chap ---- 不使用chap鉴权
        -mschap-v2 ---- 不使用mschap鉴权
        user
        hide-password
        connect "/usr/bin/chat -v -t6 -f /var/ chat" ---- 制定了要使用的chat脚本的位置。加上参数-v告诉 chat命令将其所有的输出/入拷贝到系统记录里(通常是 /var/log/messages)。-t 6指定了执行chat该命令的时间为6schat脚本的位置可以位于/etc/目录下,也可以位于/var下,这个可以更加需要灵活设置。
        persist --- 永久链接(自动重拨)
        crtscts --- 告诉ppp使用modem的硬件流量控制
        modem --- 使ppp使用DCD信号来判断连接是否正常,有无掉线现象
        deflate --- 使pppd使用defalte压缩方式
        idle --- 设置了一个时间限制,当在300秒的时间内没有数据传送,就断开连接
        lock --- 则创建一个锁定文件,其他程序在发现存在这个文件后,就能得知相应的串口已经被使用。
        demond --- 参数告诉pppd停留在后台,监视网络数据,一旦有要求就立即进行连网,超时后就断开连接,但pppd仍然停留在后台等待下次数据传送

其他的参数具体含义可以参照参考PPPD2.4.4 options.c文件中注释。






 linux pppd GRPS 配置若干问题 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成功返回ipDNS后说明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









linux的/dev/ttyACM0是什么样的设备


usb设备插入到板子上后出现

cdc_acm 1-1:1.0: ttyACM0: USB ACM device


请问ttyACM0是种什么样的设备?

类似于usb转串口的那种吗?

ttyACM1的读写可以按照串口的操作

ttyACM0fd = open("/dev/ttyACM0", O_RDWR); 奇偶校验和数据位是都需要设置,

 除了不用设置波特率外,其他都是一样的操作


然后如果要往ttyACM0中传数据就是用write(,,)

接收数据就用read(,,);


ttyACM0就是映射cdma modem的设备文件,访问方法的的话应该和ttyS0之类的一样访问



内核打开ttyACM支持的选项:Device Drivers-->USB support->USB support-->USB Gadget Support -->

                           --> USB Peripheral Controller (Inventra HDRC USB Peripheral (TI, ADI, ...))

                           -->USB Gadget Drivers-->Serial Gadget (with CDC ACM and CDC OBEX support)

在主机测能看到/dev/ttyACM0,说明配置是对的



What is the difference between /dev/ttyUSB and /dev/ttyACM?分类:Linux

2014-04-27 19:24 1328人阅读评论(0)收藏 举报目录(?)

[+]Have you ever wondered why some USB devices used/dev/ttyUSB0 (or 1, orn) and others/dev/ttyACM0 (or 1, orn) when they are plugged into the host computer, while they seem to be acting asUART devices (RS-232-like) over USB in both cases? Have you wondered why example USB firmwares for microcontrollers always end up with names such as/dev/ttyACM0 and never as/dev/ttyUSB0?

Warning: this is a Linux specific post, although it also contains genuine pieces of USB culture.What does ttyACM mean?The USB implementors forum organization has described how devices conforming to theCommunications Device Class (CDC) should present themselves to the USB host. The USB implementors forum also specified how CDC subclasses should act, including for those devices intended to talk with each other over the public switched telephone network (PSTN). Those are known asmodems because the data goes through a modulation operation on the sending side, which transforms the bits into analog signals that can be carried over phone wires, and then through a demodulation operation on the receiving side to convert the analog signal back into the original bits.

To discuss with the modem, the host USB driver must use one of the existing control models. For example, thedirect line control model controls how data is exchanged between the host and the modem through an audio class interface, with the host taking charge of the modulation, demodulation, data compression (such as V.42bis) and error correction (such as V.42). This model is used by someUSB soft modems, which are very cheap because they mostly contain aDSP chip and some amplification and line adaptation layers.

Another control model, aptly named abstract control model or ACM, lets the modem hardware perform the analog functions, and require that it supports theITU V.250 (also known as Hayes in its former life) command set, either in the data stream or as a separate control stream through the communication class interface. When the commands are multiplexed with the data in the data stream, an escape sequence such as Hayes 302 (also known as “1 sec +++ 1 sec”) or TIES (that nobody remembers) must allow the host to put the modem into command mode.

When developping on a USB-enabled embedded microcontroller that needs to exchange data with a computer over USB, it is tempting to use a standardized way of communication which is well supported by virtually every operating system. This is why most people choose to implement CDC/PSTN with ACM (did you notice that the Linux kernel driver for /dev/ttyACM0 is named cdc_acm?) because it is the simplest way to exchange raw data.

But what about the mandatory V.250 command set? It is almost never implemented in such devices, but since the host has no reason to spontaneously generate V.250 commands by itself, the device will never have to answer them. Pretending the embedded device is a modem is the simplest way to communicate with it, even though it will probably never perform any modulation or demodulation task. Linux will not know that the device is lying, and will have it show up as/dev/ttyS0.What does ttyUSB mean?Sometimes, the embedded microcontroller does not come with a hardware USB interface. While it is possible to use asoftware-only USB stack, the additional constraints put onto the CPU and the usually small storage size often lead board designers to include a dedicated UART to USB bridge. Several vendors, such as FTDIor Prolific sell dedicated chips for a few euros.

Those vendors opted not to lie to the host computer in having the chips announce themselves as USB modems when they were not. Each vendor defined its own (usually proprietary) protocols, with commands allowing to control functions of the chips such as setting the baud rate or controlling additional signals used to implement hardware flow control.

When it is practical to do so, Linux groups devices with similar functionalities under the same default device or interface names. For example, the UARTs present on your computer (if any) will be named/dev/ttyS0 and/dev/ttyS1 even if one of them is a legacy16550 chip and the other one is aMAX3100 SPI-controlled UART. Similarly, the devices offering UART-over-USB functionalities are named/dev/ttyUSB0,/dev/ttyUSB1, and so on, even though they are in fact using distinct device drivers.ConclusionSo, when you see a /dev/ttyACM0 popping up, you can try to send it the escape sequence followed by AT commands, but there is a good chance that the device only pretends to be a modem and will happily send those characters to the core application without even considering intercepting them. If it is a /dev/ttyS0, do not try, unless the device behind the USB-UART bridge understands those command by itself (this is the case for theXBee chip).



利用FT232进行USB-RS232接口的开发2010-05-12 01:14:01分类: LINUX


市面上的USB转串口线,为了压低成本,稳定性做的都不是很好。


有兴趣的话,自己焊接一条,用Ft232,比较简单,而且也稳定



FT232特征及应用

    USB的神奇在于它是现代化的接口并通过USB总线直接给设备供电,它的接口轻巧并能使大量数据在其中传输,这些都是它的优点。缺点是硬件的设计因为高频率和复杂的协议而变得困难。该如何是好?我们如何把我们的微控制器(Microcontroller)USB总线连上? FTDI,一个苏格兰的公司,有了解决的办法(http://www.ftdichip.com)。他们提供了一种实现USB与串口连接的芯片FT232 FT232芯片一边是RS232,另一边是USB。换一句话说,你只是将原来需要外加电源的MAX232转化成了带RS232转换线的FT232芯片。FT232USBRS232/RS422/RS48532pin LQFP单芯片转换IC

特点:

1 USB端口到串行端口通信

1 支持RS232标准串行端口及RS422/RS485介面

1 虚拟串口驱动程序VCP支持:

- Windows 98 and Windows 98 SE

- Windows 2000/ME/XP

- MAC OS-8 and OS-9

- MAC OS-X

- Linux 2.40

1 USB驱动程序D2XX 支持

- Windows 98 and Windows98 SE

- Windows 2000/ME/XP

1 完全兼容USB V1.1USB V2.0规范

1 提供384Byte的接收缓存和128Byte的发送缓存。

1 USB全速连接 12Mb/s

1 USB总线直接取电,无需外接电源

1 支持自动握手协议

1 高达1 MbpsRS232)或者3MbpsRS422/RS485)的传输速率

1 符合TIA/EIARS422/RS485标准

1 支持远程唤醒和电源管理

1 可支持点到多点(RS485

    FT232提供的USB232串口在RS232USB口之间非常容易地建立可靠的连接。通过利用USB接口具有的即插即用和热插拔的能力给串口RS232外围设备提供非常容易使用的环境。它的设计可以让你方便地连接诸如手提电话、数码相机、ISDN-TAModem等设备,并提供高达115.2Kbps的传输速率。(如果电平转换IC采用Maxim MAX3245CAI,则传输速率可达到1Mbps以上的速率)

    FT232提供的USBRS422/RS485设备把RS422/RS485USB两种通讯协议取长补短,将它们的优点集于一身,在RS422/RS485USB口之间建立可靠的连接。利用USB接口具有的即插即用和热插拔的能力可以给RS422/RS485设备提供非常容易使用的环境。同时利用RS422/RS485具有的远距离传输和抗干扰性能好等特点赋予了USB口远距离传输的功能。它的设计可以让你方便地连接诸如PLCPLD、条码扫描器、工控自动化等设备,并提供高达3Mbps的传输速率。 

    FT232是真正的跨平台的解决方案,有适合各种操作系统的版本,为Linux内核准备的是ftdi_sio并且源代码开放,它是Linux内核的一部分。FT232不仅提供了USBRS232的连接,它的Linux下的内核模块仍在继续开发之中以扩充所有的函数功能。

    一个需要注意的问题是电力的消耗,如果你设计了一个总线供电的设备,必须让它小于100mA的电流。你的设备还必须支持USB挂起模式(Suspend)USB处于挂起模式时,要求设备的耗电量必须小于0.5mA。如果你的设备不支持USB挂起模式,FT232提供了一个简单有效的方法在USB处于挂起模式时去关闭你的设备电源。 

    市面上有很多USBRS232的解决方案,例如Prolific公司的PL-2303系列。但是Prolific公司PL-2303系列的驱动程序不支持MAC OS的操作系统,并且没有提供D2XX驱动程序,不方便设计人员使用DLL来设计应用软件。FT232BM还提供一个93C4693C5693C66EEPROM,用于存储产品的VIDPID、设备序列号及一些说明性文字等。这些需要用户自己编写,编写的应用程序由FTDI提供。用户只须运行相应的应用程序,写入自己相应的信息即可。如果设备采用总线供电且需要消耗100mA以上,500mA以下的电流,则可以在EEPROM中设定一个最大的电流范围,设备需要使用这个EEPROM中的电流描述符去告知主机系统,设备需要多大的电流。该EEPROM是可选的。若没有EEPROMFT232BM将使用默认的VIDPID、产品描述符和电源描述符,并且没有设备的序列号。

    利用FT232进行USB接口的开发,简单、容易,开发周期短,易于为工程实践所采用。同时,也可以直接用于新产品的开发,如数码相机的USB接口、MP3播放器的USB接口及无线ModemUSB接口等。