问题描述:项目需要用ARM板驱动金笛wavecom GSM模块发短信,该GSM模块为USB接口,内部采用PL2303HX芯片转为RS232接口实现AT指令协议。

将GSM模块插入ARM板的USB口,发现没有驱动。

进一步解决步骤:将GSM模块插入PC机的USB口,在Ubuntu 10.04下可以正确的识别为/dev/ttyUSB0。用minicom测试,功能正常。

由于没有ARM Linux驱动,尝试寻找ARM Linux 的内核驱动模块。上网查找资料,PL2303芯片驱动应该已经集成到了Linux的内核源码中,只是ARM Linux 把它剪裁掉了,需要重新编译为内核模块,并加载。

我的ARM环境为AT91SAM9261 CPU,Linux 版本为2.6.27,开发机为ubuntu 10.04。

去ATmel官方网站下载Linux内核源代码:

http://www.at91.com/linux4sam/bin/view/Linux4SAM/LinuxKernel

找到VANILLA Linux Kernel 的源代码包链接并下载: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.tar.bz2 ,解压到home下。在主文件夹中多了一个linux-2.6.27文件夹。

一并下载9261的内核配置文件ftp://www.at91.com/pub/linux/2.6.27-at91/at91sam9261ek_defconfig,下载到linux-2.6.27下,并且命名为.config

cd linux-2.6.27
make ARCH=arm menuconfig

在Device Drivers->USB Support --->USB Serial Converter Support选项,默认是没选中的。在该项中按M键,回车,就可以进入到下级菜单,找到USB Prolific 2303 Single Port Serial Driver项,按M选中,将本级的其它选项的M清空。M的意思是按模块编译,*是编译集成进内核。我们不需要编译整个内核。

设置好之后,保存退出。

在执行以下命令:

make ARCH=arm CROSS_COMPILE=/usr/local/arm/arm-2008q1/bin/arm-linux- modules

我的交叉编译toolchain的路径是/usr/local/arm/arm-2008q1/,这里要修改成你自己的路径。

编译完成后,在drivers/usb/serial下,生成了pl2303.ko文件。将该文件下载到ARM板上,在ARM命令行执行

insmod pl2303.ko

可以通过dmesg查看驱动模块加载情况:

# dmesg
usbserial: USB Serial support registered for pl2303
usbcore: registered new interface driver pl2303
pl2303: Prolific PL2303 USB to serial adaptor driver

说明驱动已经成功加载,插入GSM模块,会在/dev下出现ttyUSB0设备。

如果在这里出现invalid module format的错误,是因为在 make menuconfig的时候,没有正确配置CPU型号。下载对应的defconfig文件(本文对应的是at91sam9261ek_defconfig)即可解决问题。

至此,驱动安装成功。

在ARM上调试串口,我使用了一个简化版的类似minicom的源代码。下载地址:http://plunk.org/~grantham/serial.cpp

但是,进一步发现,通过ARM上的ttyUSB0与GSM模块无法通讯,表现为数据发不过去,也收不到任何应答。为了确定问题,用另一个PL2303的USB转RS232的转接头接在ARM板上,另一端通过串口数据线连接到PC上,在PC上用串口调试助手调试,居然可以正常的收发数据。

GSM连PC,正常,说明GSM模块没问题,ARM连PC,也正常,说明ARM和驱动也没问题,唯独GSM连ARM不正常。怪哉!于是将GSM模块拆开,用示波器测量PL2303芯片的RS232输出引脚电平,当GSM连PC时,输出电平波形正常,当GSM连ARM时,没有输出电平。也就是说,2303芯片根本就没有向GSM模块输出信号。当然也不会有任何回应。

问题指向了pl2303的linux驱动。

打开drivers/usb/serial/pl2303.c文件,发现以下一段代码:

enum pl2303_type {type_0,         /* don't know the difference between type 0 and */type_1,         /* type 1, until someone from prolific tells us... */HX,             /* HX version of the pl2303 chip */
};

也就是说驱动里可以识别pl2303芯片有三种类型type_0, type_1和HX。而驱动的作者也不知道几个类型之间有什么区别。

再次在ARM板上,以调试模式加载驱动模块:

insmod pl2303.ko debug=1

dmesg

发现识别为device type = 1,但是在芯片的标签上,明确标明型号为“PL2303HX”。就是说驱动程序把芯片的型号识别错了。

经过仔细阅读代码和反复调试,最终将以下代码

if (serial->dev->descriptor.bDeviceClass == 0x02)type = type_0;else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)type = HX;else if (serial->dev->descriptor.bDeviceClass == 0x00)type = type_1;else if (serial->dev->descriptor.bDeviceClass == 0xFF)type = type_1;

修改为

if (serial->dev->descriptor.bDeviceClass == 0x02)type = type_0;else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)type = HX;else if (serial->dev->descriptor.bMaxPacketSize0 == 0x02)type = HX;else if (serial->dev->descriptor.bDeviceClass == 0x00)type = type_1;else if (serial->dev->descriptor.bDeviceClass == 0xFF)type = type_1;

重新编译pl2303驱动,至此,问题全部解决。

PL2303在ARM Linux下驱动的问题及解决方法相关推荐

  1. linux下adb连接不上解决方法

    linux下adb连接不上解决方法 参考文章: (1)linux下adb连接不上解决方法 (2)https://www.cnblogs.com/asin-huang/p/8604368.html 备忘 ...

  2. 【linux】Linux下LCD自动熄屏解决方法

    1.原因分析 参考博客: https://blog.csdn.net/BOJUE01/article/details/53468026?locationNum=5&fps=1 https:// ...

  3. linux下vmware12不能3D加速解决方法

    最近终于舍弃了Winodws,装了个Centos7.以前用虚拟机运行Linux的时候,用字符界面也卡起卡起的,这下终于爽了. 在centos7上安装vmware12还算比较顺利,但是运行在虚拟机上运行 ...

  4. which oracle linux,(总结)Linux下Oracle11gR2的ORA-00845错误解决方法

    PS:前些时间一台演示环境的Oracle 11g for Linux不知什么原因,启动不起来,报错ORA-00845.搜索了下,这个问题是由于设置SGA的大小超过了操作系统/dev/shm的大小.当时 ...

  5. php fatal error 500,PHP在Linux下出现HTTP ERROR 500解决方法

    如图,出现HTTP ERROR 500说明你的php代码里可能有错,默认php的错误不会输出到浏览器 修改配置文件sudo vim /etc/php.ini #CentOS sudo vim /etc ...

  6. Linux下无法使用 itoa 函数的解决方法

    起因 在Linux环境下进行C++编程,使用 itoa 函数时出现以下错误: ' itoa ' was not declared in this scope. 翻阅Linux下的 stdlib.h 头 ...

  7. linux下vim中文乱码的解决方法

    下面内容转自:http://www.cnblogs.com/joeyupdo/archive/2013/03/03/2941737.html 顺便记录一下Vim编码的详细介绍 Vim和所有的流行文本编 ...

  8. linux下安装软件出错的解决方法

    $ sudo aptitude install scim-qtimm 解决eva 下无法使用 scim输入法的问题 ,~ af,g jwev}0 (1) #GsnZOT`4Ka)S3{0 sudo . ...

  9. linux下搜狗输入法无法输入中文解决方法

    今天打开电脑,突然发现之前一直用的很好的搜狗输入法突然炸了,竟然没法输中文,在谷歌了几个解决方法后,终于找到了一个能用的方法.记录下来,已备后用. 解决方法: 关闭搜狗输入法 killall fcit ...

最新文章

  1. 计算机视觉 专业术语,计算机视觉专业相关术语中英文对照5
  2. OpenCV访问Mat图像中每个像素的值
  3. linux自动挂载usb光驱,Linux下使用Usbmount实现USB设备自动挂载
  4. 调用cmd方法,用于网盘文件压缩下载
  5. vue 设置代理报错;occurred while trying to proxy request xxx
  6. mysql 插入记录慢_mysql:insert插入数据过慢如何解决,设置innodb_flush_log_at_trx_commit为0就能解决...
  7. php js下拉框与文本联动,php mysql js 下拉框 二级联动
  8. 以我的视角看java编程世界
  9. python generator_Python 生成器 generator
  10. 智能家居告别荒蛮:机会与挑战并存
  11. python支持双向索引_python3 deque 双向队列创建与使用方法分析
  12. NeatUpload
  13. 使用Photoshop分解gif
  14. 404是什么意思,404错误页面有什么用?
  15. Spring Boot 动态设置数据库密码,密码加密,密码单独处理
  16. MySQL如何修改主键
  17. Pytorch:RNN、LSTM、GRU 构建人名分类器(one-hot版本、Embedding嵌入层版本)
  18. 关于glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z)的参数的一些理解
  19. 电子科技大学硕士毕业论文和博士毕业论文Latex模板及问题集锦
  20. BGP属性即选路规则

热门文章

  1. Java-对象转型(casting)
  2. 圆圈中间一个乘号:克罗内克积
  3. 推动企业上云实施经验总结
  4. C# 使用Timer设置一个定时任务
  5. 可解释机器学习(Explainable/ Interpretable Machine Learning)的原理和应用(李宏毅视频课笔记)
  6. Ubuntu18.04使用Xorg创建虚拟屏幕
  7. UBUNTU开启CRONTAB日志记录及解决NO MTA INSTALLED, DISCARDING OUTPUT问题
  8. 51.Linux 什么是线程?
  9. Promise学习:基础入门
  10. 调用微信二维码识别开源库