如果串口驱动有问题,怎么调
有很多人问我,为什么不录串口驱动?
实际上串口裸板很简单,但是串口驱动还是挺复杂的;
另外基本上所有芯片的内核源码中基本上都会有串口驱动。
所以我认为对于串口,我们只要会APP编程即可,不需要去写它的驱动程序。
现在有2个问题:
1.怎么写串口APP? 2.如果串口驱动有问题,怎么调?
第1个问题挺简单,百度搜搜就可以找到源码。
但是向我提问的人还是非常非常多,
我干脆写一个示例代码好了:serial_test.c
这个程序会一边往串口中写入数据0x5A,一边从串口中读出数据并打印出来。
用法为:
a. 编译:
arm-linux-gcc -o serial_test serail_test.c -static
b. 在开发板上运行:
./serial_test </dev/XXX> // /dev/XXX为串口的设备节点
比如在jz2440的3.4.2内核上:
./serial_test /dev/ttySAC1
比如在jz2440的2.6.22.6内核上:
./serial_test /dev/s3c2410_serial1
c. 然后用镊子短接串口的TXD、RXD引脚,即可看到这个程序不断打印0x5a:这表明测试成功
第2个问题:总有一些不太完善的驱动程序需要我们稍微调整。
比如jz2440用的linux 3.4.2内核,它的/dev/ttySAC2无法使用。
需要修改2个文件,mach-smdk2440.c和samsung.c,这些文件的源码我一起打包上传,需要代码联系我即可。
下面讲解。
解决方法为:
a. 修改内核 arch/arm/mach-s3c24xx/mach-smdk2440.c
找到”ulcon = 0x43;” 改为 “ulcon = 0x03;”
2440的串口2可以用作红外接收或发送, 我们要把它改为一般的串口。
b. 修改内核 drivers/tty/serial/samsung.c
对于串口2,该文件中没有配置对应的GPIO用于串口。
修改方法如下:
b.1 在前面添加头文件:
#include <mach/regs-gpio.h>
#include <plat/gpio-cfg.h>
b.2 在s3c24xx_serial_startup函数中加入:
if (ourport->cfg->hwport == 0)
{
printk(“config pin for uart %dn”, ourport->cfg->hwport);
s3c_gpio_cfgpin(S3C2410_GPH(2), S3C2410_GPH2_TXD0);
s3c_gpio_cfgpin(S3C2410_GPH(3), S3C2410_GPH3_RXD0);
}
else if (ourport->cfg->hwport == 1)
{
printk(“config pin for uart %dn”, ourport->cfg->hwport);
s3c_gpio_cfgpin(S3C2410_GPH(4), S3C2410_GPH4_TXD1);
s3c_gpio_cfgpin(S3C2410_GPH(5), S3C2410_GPH5_RXD1);
}
else if (ourport->cfg->hwport == 2)
{
printk(“config pin for uart %dn”, ourport->cfg->hwport);
s3c_gpio_cfgpin(S3C2410_GPH(6), S3C2410_GPH6_TXD2);
s3c_gpio_cfgpin(S3C2410_GPH(7), S3C2410_GPH7_RXD2);
}
- Flash/Flex学习笔记(34):AS3中的自定义事件
- 字符串处理总结(旧)
- 计算某年某月的某一天是星期几的算法
- Flash/Flex学习笔记(33):如何用As3协同Flash CS IDE控制MovieClip实例
- live writer的折腾
- 用C语言写的万年历---亲手写的。好累哦
- Flash/Flex学习笔记(32):播放音乐并同步显示lyc歌词(适用于Silverlight)
- Flash/Flex学习笔记(31):对象拖拽与投掷
- 如何评价张小龙在2016微信公开课的演讲
- VS2010如何做WAP开发
- (原创)详解KMP算法
- Flash/Flex学习笔记(30):不用startDrag和stopDrag的对象拖动
- JS代码和网页的混用
- Flash/Flex学习笔记(29):MovieClip帧/时间轴的控制
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 速读原著-UnixLinux基础(六)
- Python GUI编程:Tkinter
- JVM系列之:通过一个例子分析JIT的汇编代码
- 二叉查找树-增删查和针对重复数据处理的 Java 实现
- 手把手教你实现自定义Spring Boot的 Starter
- JVM详解之:本地变量的生命周期
- VBA解析复合文档01——实现的功能
- VBA解压缩ZIP文件09——解压-静态Huffman
- 第5章 流水线数据脱敏-Jenkins系统凭据管理
- 100% 展示 MySQL 语句执行的神器-Optimizer Trace
- Kafka消费者分区分配策略及自定义分配策略
- Java8新特性之日期、时间操作
- Java8新特性之Stream流(基础篇)
- Effective Java(一)
- Effective Java(二)