ARM LINUX 擴充串口
分類: 嵌入式
----XR21V1414 USB轉串口
----16C554 匯流排擴充串口
不同的項目,有些項目經常需要轉串口。有兩種方式,一種用USB去擴,另一種用16C554 去擴。這兩種從本質上來說,是一樣的。成本上也不相上下。如果兩種方式在項目設計中都可以的話,建議採用匯流排的方式。因為擴充串口總是會出現一些問題,沒有原生串口好用。但匯流排方式相對來說問題更少,而USB擴串口,相信在PC機上就領略了它的脾氣。
一、XR21V1414 USB轉串口
USB 擴串口方案還是很多的。這裡以我用過的XR21V1414為例。首先去官網上下載一個核心對應的驅動,我是採用Linux 2.6.18-3.4.x這種相容模式的驅動。連結:
http://www.exar.com/common/content/default.aspx?id=10296
把驅動解壓到drivers/usb/serial/ 下面,然後修改相應的Makefile ,Kconifg 就行了。這樣就可以支援1410,1412,1414 ,分別是1路,2路,4路。如果usb 不夠用的話,可以採用GL850G usb hub 去擴充,然後再接XR21V1414。
點擊(此處)摺疊或開啟 Makefile :
obj-$(CONFIG_USB_SERIAL_EXAR_XR21V14XX) += vizzini.o
Kconfig :
config USB_SERIAL_EXAR_XR21V14XX
tristate "USB serial exar xr21v14XX 4 Port Serial Driver"
help
Say Y here if you want to use 4 port usb to serial adapter.
二、16C554 匯流排擴充串口
匯流排擴充串口,16C55 系列比較常用,也比較好用,核心支援得很好了。這是一個古老的驅動。st16c554是一款整合了4路標準非同步串列收發器的串口擴充晶片,它的操作方法和寄存器用法與8250完全相同,因此我們可以用linux內經典的8250驅動來驅動st16c554。
點擊(此處)摺疊或開啟 //定義好裝置檔案
#include <linux/serial_8250.h>
#define PORT(_base,_irq) \
{ //不是iobase,arm IO和MEMORY統一編址
.mapbase = (unsigned long)_base, \
.irq = _irq, \
.uartclk = 115200*16, \
.iotype = UPIO_MEM, \ // 表示8位讀寫
.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_AUTO_IRQ , \
.regshift = 1, \
}
.mapbase指的是16C554的物理基地址,注意不是membase,iobase;.uartclk是16C554晶振的頻率,其最高傳輸速率為.uartclk/16;.iotype指的是訪問類型,與硬體的串連相關,UPIO_MEM指的是8位匯流排串連,而UPIO_MEM32表示為32位匯流排訪問方式,即訪問16C554的寄存器時,讀取32位元,取低8位;.regshift也跟硬體的物理串連相關,指的是訪問16C554的每個地址時的位移,也就是16C554的A0對應CPU的A幾;
點擊(此處)摺疊或開啟 static struct plat_serial8250_port serial_8250_data[] = {
PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 0)<<1))), gpio_to_irq(CPUNAME_GPIO33)),
PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 8)<<1))), gpio_to_irq(CPUNAME_GPIO34)),
PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 16)<<1))), gpio_to_irq(CPUNAME_GPIO35)),
PORT(((unsigned long)(MX53_CS0_BASE_ADDR+((0x60000 + 24)<<1))), gpio_to_irq(CPUNAME_GPIO36)),
{},
};
static struct platform_device serial_device = {
.name = "serial8250",
.id = 0,
.dev = {
.platform_data = serial_8250_data,
},
};
//初始化裝置與GPIO 口
weim_cs_config(); //匯流排的初始化要在這之前完成
gpio_request(CPUNAME_GPIO34, "34");
gpio_direction_input(CPUNAME_GPIO34 );
gpio_request(CPUNAME_GPIO35, "35");
gpio_direction_input(CPUNAME_GPIO35 );
gpio_request(CPUNAME_GPIO36, "36");
gpio_direction_input(CPUNAME_GPIO36 );
gpio_request(CPUNAME_GPIO33, "33");
gpio_direction_input(CPUNAME_GPIO33 );
platform_device_register(&serial_device); //註冊裝置
//driver/serial/ 下8250.c
在device driver/char/serial/ 下面
核心config圖如下: