基于S3C2440和嵌入式Linux的擴(kuò)展串口設(shè)計(jì)
2)增加串口的物理信息
在common-smdk.c文件中增加8個(gè)元素的structplat_serial8250_port結(jié)構(gòu)數(shù)組,并加入數(shù)據(jù)項(xiàng),如每個(gè)串口使用的物理地址和中斷號(hào)等信息,使系統(tǒng)啟動(dòng)后能找到串口。下面以第1片TL16c554A的第1個(gè)串口CSA為例說(shuō)明如何在源程序中添加數(shù)據(jù)結(jié)構(gòu):
3)加入內(nèi)核設(shè)備列表中
把串口設(shè)備(s3c_deviee_8250代表TL16c550A芯片)加入到內(nèi)核的platform_device結(jié)構(gòu)中
static struct platform_device_initdata*smdk_devs[]={ s3c_device_8250,};
3.2 增加開(kāi)發(fā)板代碼使串口可用
主要修改drivers/serial/8250.c文件,使BANK5以8位的位寬訪問(wèn)TL16c554A芯片,并指定芯片的中斷觸發(fā)方式。
1)增加頭文件asm/areh-s3c2410/regs-mem.h,定位TL16c554A所在的地址空間;
2)設(shè)置存儲(chǔ)控制器的BANK5的位寬(8位)
在serial8250_init(void)初始化函數(shù)中把存儲(chǔ)控制器的位寬寄存器設(shè)為0X22011110;
3)指定中斷觸發(fā)方式
因?yàn)門(mén)L160554A的中斷信號(hào)INTA、INTB、INTC、INTD為高電平有效,所以需將INTA、INTB、INTC、INTD上升沿觸發(fā),在調(diào)用中斷函數(shù)req-uest_irq前應(yīng)設(shè)置中斷標(biāo)志為IRQF_TRIGGER_RISING。
3. 3 增加內(nèi)核配置項(xiàng)
在內(nèi)核源代碼的driver/serial/Kconfig中增加config條目CONFIG_SERIAL_EXTEND_S3C24XX,內(nèi)核編譯時(shí)選定該選項(xiàng)可以把驅(qū)動(dòng)程序編譯進(jìn)系統(tǒng)中。
4 測(cè)試擴(kuò)展串口
測(cè)試的工作包括編譯內(nèi)核、在根文件系統(tǒng)中增加設(shè)備文件、修改系統(tǒng)初始化腳本、測(cè)試擴(kuò)展串口幾個(gè)步驟。圖6為串口測(cè)試流程圖。本文引用地址:http://m.butianyuan.cn/article/150465.htm
1)配置、編譯內(nèi)核
配置內(nèi)核時(shí)增加配置選項(xiàng)CONFIG_SERIAL_EXTEND_S3C24XX,執(zhí)行“make uImage”命令,編譯內(nèi)核。
2)修改根文件系統(tǒng)
在Linux系統(tǒng)中通過(guò)設(shè)備文件來(lái)訪問(wèn)具體的物理設(shè)備,故使用mknod命令,增加ttyS0,ttyS1,…,ttyS7設(shè)備文件,分別對(duì)應(yīng)兩片TL16c554A的8個(gè)串口。命令格式如下:
# mknod/dev/ttyS0 c 4 64
3)修改配置文件
在/etc/inittab配置文件中添加ttyS0::askfirat:-/bin/sh
4)測(cè)試
把第一個(gè)串口與主機(jī)相連,設(shè)置U-Boot的啟動(dòng)參數(shù)為:noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttyS0,重新啟動(dòng)開(kāi)發(fā)板,就能在超級(jí)終端下看到linux系統(tǒng)啟動(dòng)信息了。
5 結(jié)束語(yǔ)
本文提供了在原有TQ2440開(kāi)發(fā)板中擴(kuò)展8個(gè)串口,采用中斷服務(wù)的方案,提高了ARM9系統(tǒng)運(yùn)行效率。在此基礎(chǔ)上可以進(jìn)一步擴(kuò)大,將串口擴(kuò)展到12個(gè)、16個(gè)或者更多。
評(píng)論