我是靠谱客的博主 潇洒小猫咪,最近开发中收集的这篇文章主要介绍基于ARM Linux下3G模块的通用驱动编写总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

本文介绍在嵌入式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 "nGoodbayn"

·         

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 创建: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

·          

 

最后

以上就是潇洒小猫咪为你收集整理的基于ARM Linux下3G模块的通用驱动编写总结的全部内容,希望文章能够帮你解决基于ARM Linux下3G模块的通用驱动编写总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部