修改2410的linux串口驱动,使其支持RS485
2013-02-17 23:54
218 查看
修改2410的linux串口驱动,使其支持RS485
2410自带有三个串口,但mizi linux中自带的驱动均为RS232的,因为所用的485是半双工的,比232多了一个方向控制信号,所以linux的自带驱动并不适合485,需要进行一定的修改,步骤如下。
1. 首先硬件方面肯定要改动,假设我们要改的串口为串口2,电路原理图如下:
有图可知,485与232相比多了一个方向控制信号nRTS0,当其为低电平时,MAX485处于接收状态,反正为发送状态。因此我们在修改驱动时主要就是要让串口2发送时,nRTS0必须为低电平,接收时必须为高电平。
2. 我们要修改的linux串口驱动主要为driver/serial/serial_s3c2410.c文件. 涉及到的函数主要有s3c2410uart_startup,s3c2410uart_start_tx和s3c2410uart_stop_tx,他们的作用分别为启动串口,开始串口接收,停止串口接收。
3.首先修改s3c2410uart_startup函数,在其初始化的最后即return 0之前添加如下代码:
if( port!=&s3c2410_ports[2] ) { //如果初始化的是串口2
GPHCON = (GPHCON&0xfffffff3)+0x04; //将GPH1,即nRTS0设为输出功能
GPHDAT &= 0xfffd; //将nRTS0设为低电平,使串口启动时处于接收数据状态。
}
4. 修改s3c2410uart_start_tx,在enable_irq语句前添加如下代码:
if( port!=&s3c2410_ports[2] ) { //如果启动发送的是的是串口2
GPHCON = (GPHCON&0xfffffff3)+0x04; //将GPH1,即nRTS0设为输出功能
GPHDAT = 0x02; //将nRTS0设为高电平,使串口进入发送数据状态。
}
5.修改s3c2410uart_stop_tx,在disable_irq语句前添加如下代码:
if( port!=&s3c2410_ports[2] ) { //如果停止发送的是的是串口2
while( !(UART_UTRSTAT(port)&0x04) ) ; //等待串口发送完成 ,这句千万不能少
GPHCON = (GPHCON&0xfffffff3)+0x04; //将GPH1,即nRTS0设为输出功能
GPHDAT = 0x02; //将nRTS0设为低电平,使串口重新进入接收数据状态。
}
其中特别需要注意的是第二行的while语句千万不能少,否则可能导致发送的数据丢失,因为在串口没发送完毕时就将nRTS0设为低电平会使MAX485芯片退出发送状态,导致发送数据的丢失。
至此驱动修改完成,重新编译内核即可。其中用于控制485发送接收状态的信号可以是任意的空闲CPU引脚,修改原理与使用nRTS0是相同的。
6. 关于linux串口编程的文章推荐下面两篇,注意485编程时务必将串口设为RAW MODE.
2410自带有三个串口,但mizi linux中自带的驱动均为RS232的,因为所用的485是半双工的,比232多了一个方向控制信号,所以linux的自带驱动并不适合485,需要进行一定的修改,步骤如下。
1. 首先硬件方面肯定要改动,假设我们要改的串口为串口2,电路原理图如下:
有图可知,485与232相比多了一个方向控制信号nRTS0,当其为低电平时,MAX485处于接收状态,反正为发送状态。因此我们在修改驱动时主要就是要让串口2发送时,nRTS0必须为低电平,接收时必须为高电平。
2. 我们要修改的linux串口驱动主要为driver/serial/serial_s3c2410.c文件. 涉及到的函数主要有s3c2410uart_startup,s3c2410uart_start_tx和s3c2410uart_stop_tx,他们的作用分别为启动串口,开始串口接收,停止串口接收。
3.首先修改s3c2410uart_startup函数,在其初始化的最后即return 0之前添加如下代码:
if( port!=&s3c2410_ports[2] ) { //如果初始化的是串口2
GPHCON = (GPHCON&0xfffffff3)+0x04; //将GPH1,即nRTS0设为输出功能
GPHDAT &= 0xfffd; //将nRTS0设为低电平,使串口启动时处于接收数据状态。
}
4. 修改s3c2410uart_start_tx,在enable_irq语句前添加如下代码:
if( port!=&s3c2410_ports[2] ) { //如果启动发送的是的是串口2
GPHCON = (GPHCON&0xfffffff3)+0x04; //将GPH1,即nRTS0设为输出功能
GPHDAT = 0x02; //将nRTS0设为高电平,使串口进入发送数据状态。
}
5.修改s3c2410uart_stop_tx,在disable_irq语句前添加如下代码:
if( port!=&s3c2410_ports[2] ) { //如果停止发送的是的是串口2
while( !(UART_UTRSTAT(port)&0x04) ) ; //等待串口发送完成 ,这句千万不能少
GPHCON = (GPHCON&0xfffffff3)+0x04; //将GPH1,即nRTS0设为输出功能
GPHDAT = 0x02; //将nRTS0设为低电平,使串口重新进入接收数据状态。
}
其中特别需要注意的是第二行的while语句千万不能少,否则可能导致发送的数据丢失,因为在串口没发送完毕时就将nRTS0设为低电平会使MAX485芯片退出发送状态,导致发送数据的丢失。
至此驱动修改完成,重新编译内核即可。其中用于控制485发送接收状态的信号可以是任意的空闲CPU引脚,修改原理与使用nRTS0是相同的。
6. 关于linux串口编程的文章推荐下面两篇,注意485编程时务必将串口设为RAW MODE.
相关文章推荐
- 修改2410的linux串口驱动,使其支持RS485
- 修改2410的linux串口驱动,使其支持RS485
- 05-S3C2440学习之内核(移植)linux3.4.2移植(3)之支持DM9000C网卡及修改支持串口2
- 【linux内核剖析笔记】linux支持的终端设备类型及终端、控制台、串口、UART、RS232、RS485的联系和区别
- Mni2440 linux PWM 驱动代码修改支持 频率,占空比修改--XiaoLin.Peng
- 【linux内核剖析笔记】linux支持的终端设备类型及终端、控制台、串口、UART、RS232、RS485的联系和区别
- Linux串口驱动
- [原创]CS8900A 网卡芯片驱动,Linux-2.6.27内核,SMDK2410平台
- linux查看当前驱动的支持模式, 命令iw list
- 将S3C2416的RS232改为RS485(修改内核驱动)
- Linux串口驱动分析read
- S3C2416支持DM9000驱动(Linux)
- Linux下的串口总线驱动(二)
- Linux环境thinkphp配置以及数据源驱动修改
- ARM-Linux S5PV210 UART驱动(4)----串口驱动初始化过程
- [3]ARM-Linux S5PV210 UART驱动----串口核心层、关键结构体、接口关系
- Linux-2.6 16c550 串口驱动移植
- Linux 打开默认串口支持数量超过4个的方法
- 修改s3c440普通串口驱动为485驱动
- linux支持串口(serial)登录配置方法