- 论坛徽章:
- 0
|
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 |
|