原文地址:修改2410的linux串口驅動,使其支持RS485 作者:daijianfu
修改2410的linux串口驅動,使其支持RS4852410自帶有三個串口,但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.