基于ARM Linux下3G模块的通用驱动编写总结

本文介绍在嵌入式Linux环境下实现3G联网的方法,包括内核配置、驱动编写、PPP脚本编写及验证过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在之前:本文档无意对前人的相关抄袭,只是在前人的基础上进行补充,在此特别感谢前人的文档支持,有关疑惑点都加以备注,希望对需要的朋友已帮助。

本文介绍在嵌入式Linux中,实现3G联网的基本方法。包括驱动配置,和联网的过程。
 硬件:3G USB模块(华为E261)+sim卡(联通)
开发板:x210
Linux kernel2.6.28.10
此方法不针对任何开发板,但内核主要针对2.6版本以上否则无法实现ppp的支持。
相关软件包:usb-modeswitch-data-20160803.tar.bz2usb-modeswitch-2.4.0.tar.bz2libusb-compat-0.1.5.tar.bz2libusb-1.0.9.tar.bz2ppp-2.4.4.tar.gz
现将开发流程记录如下:

一:关于内核的配置:

  • .首先得让内核支持PPP,进入Linux 内核目录(kernel-2.6 或以上内核版本),执行 #make menuconfig

           添加如下内核选项:(因为mini2440默认内核没有添加该功能,所以需要重新配置内核)

 -> 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)

 

 

 

 

 

 

 

 

 




·         增加内核支持USBSerial驱动

-> Device Drivers                                                            

        x       -> USB support                                                            

        x         -> USB Serial Converter support                                         

        x           -> USB Serial Converter support (USB_SERIAL [=y])  

                           [*]USB Generic Serial Driver

                                     <M>USB driver for GSM and CDMA modems


 

 

 

 

 




·         增加USB的支持(网上大部分是没有提及这部分,如果此处不设置将会导致后面USB虚拟文件系统将无法挂载)

> Device Drivers > USB support
make ARCH=arm menuconfig
配置USB
驱动:
<*>     USB Mass Storage support
[*]       USB Mass Storage verbose debug
<*>       Realtek Card Reader support
[*]         Realtek Card Reader autosuspend support
<*>       Datafab Compact Flash Reader support

USB驱动

> Device Drivers > USB support
<*>   Inventra Highspeed Dual Role Controller (TI, ADI, ...)   
            MUSB Mode Selection (Dual Role mode)  --->             
    <*>     Platform Glue Layer (TI DSPS platforms)  --->           
        MUSB DMA mode (Disable DMA (always use PIO))  --->
<*>   USB Serial Converter support  --->
[*]      USBGeneric Serial Driver 
<*>     USBdriver for GSM and CDMA modems

 

 

 

 

 

 

 

 

 




·         修改内核:

  编译3G模块的驱动option.ko:配置内核时3G驱动对应的选项“USB driver for GSM and CDMA modems”需编译成模块,才能在后面转换时生成ttyUSB0ttyUSB1ttyUSB2

  修改usb3G驱动文件 driver//usb/serial/option.c在其中加入3G卡片的HUAWEI_VENDOR_ID 0x12D1HUAWEI_PRODUCT_EC1260 0x1446。直接找到对应位置添加即可。无需添加别的代码,编译成模块。注意此处的应该生成三个模块,option.kousb_wwan.ko,usbserial.ko文件。

·         执行编辑完成:# make zImage

  编译完成以后,在内核目录的arch/arm/boot 目录下便会生成一个 zImage 内核文件,烧到开发板中,这样开发板内核就支持了PPP了。

二:驱动的编写:

 相关工具与库文件的下载:
  1. usb_modeswitch-2.4.0.tar.bz2(http://www.draisberghof.de/usb_modeswitch/)

     Usb_modeswitch是对USB设备的工作模式进行转换一种万能工具,当然这种宝贝,只有在linux下才能体现其巨大的作用。随着移动通信,无线通信的发展,越来越多的设备被制作成USB接口,像一些无 线网卡,3G数据卡等等。

  2.usb_modeswitch-data-20160803-tar.bz2(http://www.draisberghof.de/usb_modeswitch/)

     这个包里包括提供给UDEV的驱动设备信息,和很多设备使用usb_mdoeswitch进行转换模式时需要配置的参数。下载它用于参考。

  3. libusb-1.0.9.tar.bz2 (http://sourceforge.net/projects/libusb/files/libusb-1.0/)

    Libusb才是我们的真正骨干力量,提供给usb_modeswitch一套系统API,所以,自然usb_modeswitch这个包工头要想工作,肯定不能离开libusb这个工人为其服务。

  4.libusb-compat-0.1.5.tar.bz2 (http://www.linuxfromscratch.org/blfs/view/svn/general/libusb-compat.html

    libusb分为0.1和1.0两年版本,而1.0版本与0.1有较大的不同,并不向下兼容,必须依赖libusb-compat。

  交叉编译usb_modeswitch: 

  1. 交叉编译 libusb

       A. 解压并进入libusb-1.0.9目录,建立子目录install用于存放最后生存的库文件与头文件。

     [y@-Inspiron-5437:~/3G/libusb-1.0.9]# mkdir install

    B. 配置并生成Makefile文件

     y@-Inspiron-5437:~/3G/libusb-1.0.9]#./configure --build=i686-linux --host=arm-linux --prefix=/home/y/3G/libusb-1.0.9/install

    C. [y@-Inspiron-5437:~/3G/libusb-1.0.9]#make

    D. [y@-Inspiron-5437:~/3G/libusb-1.0.9]# make install

  2. 设置PKG_CONFIG_PATH环境变量,以使我们后面的编译能够顺利找到libusb库

    A.设置环境变量

     [y@-Inspiron-5437:~/3G/libusb-1.0.9]# export PKG_CONFIG_PATH=/home/y/3G/libusb-1.0.9/install/lib/pkgconfig:$PKG_CONFIG_PATH

   B.查看是否设置正确

     [y@-Inspiron-5437:~/3G/libusb-1.0.9]#echo $PKG_CONFIG_PATH

  3. 交叉编译lib_compat

    与上面编译libusb的方法类似:

    A.[y@-Inspiron-5437:~/3G/libusb-compat-0.1.5]#.mkdir install

    B . [y@-Inspiron-5437:~/3G/libusb-compat-0.1.5]#./configure --build=i686-linux --host=arm-linux --prefix=/home/y/3G/libusb-compat-0.1.5/install

    C. [y@-Inspiron-5437:~/3G/libusb-compat-0.1.5]#make

    D. [y@-Inspiron-5437:~/3G/libusb-compat-0.1.5]#make install

  4. 交叉编译usb_modeswitch

     A.修改Makefile文件

     修改STRIP和CC选项为:

     STRIP = arm-linux-strip (注意:这行在Makefie中没用,直接添加即可)

     CC = arm-linux-gcc

    B.可以将上面的libusb和libusb-compat的库和头文件拷贝到交叉编译器的lib和include目录下

                  (注意:libusb和libusb-compat的库和头文件位于上面新建的install下,交叉编译其所有找到安装ARM-Linux-工具的目录下)                                                                                                                           

        C. make  

  5. 编辑usb_modeswitch目录下的usb_modeswitch.conf文件,加入以下内容:

DefaultVendor= 0x12d1        

DefaultProduct= 0x1446

TargetVendor = 0x12d1

TargetProduct= 0x140c

MessageContent="55534243000000000000000000000011060000000000000000000000000000"

MessageEndpoint=0x01

CheckSuccess=5

HuaweiMode=0

 

 

 

 

 

 

 

 

 

 

   

注意:以上的DefaultVendor,DefaultProduct,TargetVendor,TargetProduct的值是根据具体的设备所得

  6. 将上面生成的libusb动态库拷贝到开发板的库目录下,将上面生成的usb_modeswitch可执行程序和usb_modeswitch.conf配置文件下载到开发板某目录下。

    将上面内核编译得到的驱动option.ko,usb_wwan.ko,usbserial.ko移动到某一目录下,进行insmod进行驱动模块的加载

    挂载usb虚拟文件系统:mount -t usbfs usbfs /proc/bus/usb/      

    注意:在进行挂载之前,我们进行查看ls /proc/bus -l 查看是否有usb这样的一个文件夹,若没用这说明内核USB配置时出错,要从新对内核的配置

o    进行模式的转换:./usb_modeswitch -W -c ./usb_modeswitch.confg切换到3G卡片的模式下,此时会出现一些信息,你会看到转换成3G模式后的几个串口信息ttyUSB0,ttyUSB1,ttyUSB2,如下:

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

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

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

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

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

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

  注意:此时查看我们的:ls ttyUSB*是否存在这些ttyUSB0,ttyUSB1,ttyUSB2这些设备文件,若不存在,需要进行以下操作:                                               

   §   mknod /dev/usb/ttyUSB1 c 188 1                       

   §    mknod /dev/usb/ttyUSB2 c 188 2                  

   §    mknod /dev/usb/ttyUSB0 c 188 0

 此时我们我们再去查看/dev/tty*就会出现我们的ttyUSB0,ttyUSB1,ttyUSB2。

三:PPP脚本的编写:

·         在我们的PC端进行关于PPP的制作:
  1) 把ppp的源码解开

      tar zxvf ppp-2.4.5.tar.gz

  2) 进入ppp-2.4.5/pppd目录

      修改Makefile.linux

       设置 CC = /usr/local/arm/3.4.1/bin/arm-linux-gcc                                                            

  3) make -f Makefile.linux  即可编译出pppd
  4) 同样进入ppp-2.4.4/chat目录,并设置

    CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc

  5)  make -f Makefile.linux  即可编译出chat

    注意:读者在进行自我配置的时候,将黑色字体的路径替换成自己的编译器文件路径 

·            拨号程序就是ppp-2.4.4/pppd下的pppdppp-2.4.4/chat下的chat可执行程序,将交叉编译出来的这两个程序拷贝到开发板/usr/sbin目录下,更改文件属性为可执行文件

·         配置拨号的脚文件:
  创建:chat-cdma-connect文件 

ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'NO DIALTONE'
ABORT 'BUSY'
ABORT 'NO ANSWER'
'' AT
OK ATZ
OK AT+CFUN=1
OK ATDT#777
CONNECT ''

·       

 

 

 

 

 

 

 

 

 

  创建:chat-cdma-disconnect 文件

ABORT OK
ABORT BUSY
ABORT DELAYED
ABORT "NO ANSWER"
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT VOICE
ABORT ERROR
ABORT RINGING
TIMEOUT 12
"" \K
"" \K
"" \K
"" +++ATH
"" +++ATH
"" +++ATH
"" ATZ
SAY "\nGoodbay\n"

·         

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 创建:wcdma文件                                                                                                                                                                                      

nodetach
lock
/dev/ttyUSB0
921600
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 /etc/ppp/peers/chat-wcdma-connect'
disconnect '/usr/sbin/chat -s -v -f /etc/ppp/peers/chat-wcdma-disconnect'

·      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

注意:以上所建立的文件应放在/etc/ppp/peers/目录下,此目录需手动创建

四:验证通过:

  • 执行:pppd call wcdma &
  • 若实现以下情况说明已经成功:
·         进行ifconfig:

ppp0     

Link encap:Point-to-Point Protocol 

          inet addr:172.16.231.7  P-t-P:10.64.64.64  Mask:255.255.255.255

          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1

          RX packets:7 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:94 (94.0 B)  TX bytes:97 (97.0 B)

·       

 

 

 

 

 

 

 

 

 

  说明:已经成功IP172.16.231.7

·          

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值