免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4616 | 回复: 1
打印 上一主题 下一主题

RS485驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-19 15:31 |只看该作者 |倒序浏览

                RS485驱动
修改16C550驱动,以便实现RS485通讯。
修改8250.c文件,增加RS485的方向控制代码即可。
在将接收字符的函数receive_chars增加方向切换为接收的代码:
1297 static void
1298 receive_chars(struct uart_8250_port *up, unsigned int *status)
1299 {
1300     struct tty_struct *tty = up->port.info->port.tty;
1301     unsigned char ch, lsr = *status;
1302     int max_count = 256;
1303     char flag;
1304
1305     if (up->port.line==3) {
1306 //        printk("ABING, ttyS3 receive chars\n");
1307         __raw_writel(_BIT(11), GPIO_P3_OUTP_CLR(GPIO_IOBASE)); //ABING
1308         udelay(30);
1309     }
在发送字符函数transmit_chars处增加方向控制代码:
1379 static void transmit_chars(struct uart_8250_port *up)
1380 {
1381     struct circ_buf *xmit = &up->port.info->xmit;
1382     int count;
1383
1384     if (up->port.line==3) {
1385 //        printk("ABING, ttyS3 transmit chars\n");
1386         __raw_writel(_BIT(11), GPIO_P3_OUTP_SET(GPIO_IOBASE)); //ABING
1387         udelay(30);
1388     }
1241 static void serial8250_start_tx(struct uart_port *port)1242 {1243 struct uart_8250_port *up = (struct uart_8250_port *)port;12441245 if (!(up->ier & UART_IER_THRI)) {1246 up->ier |= UART_IER_THRI;1247 serial_out(up, UART_IER, up->ier);12481249 if (up->bugs & UART_BUG_TXEN) {1250 unsigned char lsr, iir;1251 lsr = serial_in(up, UART_LSR);1252 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;1253 iir = serial_in(up, UART_IIR) & 0x0f;1254 if ((up->port.type == PORT_RM9000) ?1255 (lsr & UART_LSR_THRE &&1256 (iir == UART_IIR_NO_INT || iir == UART_IIR_THRI)) :1257 (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT))1258 transmit_chars(up);1259 }1260 }12611262 /*1263 * Re-enable the transmitter if we disabled it.1264 */1265 if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {1266 up->acr &= ~UART_ACR_TXDIS;1267 serial_icr_write(up, UART_ACR, up->acr);1268 }12691270 // if (up->port.line==3){1271 __raw_writel(_BIT(11), GPIO_P3_OUTP_CLR(GPIO_IOBASE)); //ABING set to receive1272 udelay(30);1273 // }1274 }
发送完成后的方向切换,保证除了发送期间,其余时间都要保持接收状态。
1670 static unsigned int serial8250_tx_empty(struct uart_port *port)
1671 {
1672     struct uart_8250_port *up = (struct uart_8250_port *)port;
1673     unsigned long flags;
1674     unsigned int lsr;
1675
1676     spin_lock_irqsave(&up->port.lock, flags);
1677     lsr = serial_in(up, UART_LSR);
1678     up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
1679     spin_unlock_irqrestore(&up->port.lock, flags);
1680
1681     //if(up->port.line==3) {
1682         __raw_writel(_BIT(11), GPIO_P3_OUTP_CLR(GPIO_IOBASE)); //ABING set for receive
1683         udelay(30);
1684    // }
1685     return lsr & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
1686 }
测试程序,使用标准的232测试程序即可。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/51797/showart_2073346.html

论坛徽章:
0
2 [报告]
发表于 2011-11-18 09:46 |只看该作者
为何要 udelay(30);???????????????????
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP