开发环境:
主机环境:VMare下CentOS 5.5
linux版本:linux-3.0-rc4
1.背景
Linux内核默认把UART2的功能设置为红外通讯(Irda),没有作为正常串口使用,如果我们想要将UART2作为串口,此时,串口2是无法收发数据的,因此需要做相应的修改。
其寄存器部分寄存器的说明如下:
2.修改平台配置文件
2.1 修改mach-smdk2440.c
打开arch/arm/mach-s3c2440/mach-smdk2440.c(注意不同的平台mach-smdk2440.c文件有可能有略微的区别)
修改代码如下:
static struct s3c2410_uartcfg smdk2440_uartcfgs[] __initdata = {
[0] = {
.hwport = 0,
.flags = 0,
.ucon = 0x3c5,
.ulcon = 0x03,
.ufcon = 0x51,
},
[1] = {
.hwport = 1,
.flags = 0,
.ucon = 0x3c5,
.ulcon = 0x03,
.ufcon = 0x51,
},
/* IR port */
[2] = {
.hwport = 2,
.flags = 0,
.ucon = 0x3c5,
// .ulcon = 0x43,
.ulcon = 0x03,
.ufcon = 0x51,
}
};
2.2 修改samsung.c
打开drivers/tty/serial/samsung.c文件(不同内核版本可能文件位置略有不同)。
加上如下代码:
if (port->line == 2) {
s3c2410_gpio_cfgpin(S3C2410_GPH(6), S3C2410_GPH6_TXD2);
s3c2410_gpio_pullup(S3C2410_GPH(6), 1);
s3c2410_gpio_cfgpin(S3C2410_GPH(7), S3C2410_GPH7_RXD2);
s3c2410_gpio_pullup(S3C2410_GPH(7), 1);
}
S3C2410_GPH(6),S3C2410_GPH(7)等宏定义在mach/regs-gpio.h。需要包含该文件。有的内核版本是S3C2410_GPH6,S3C2410_GPH7,应根据具体情况修改。
加上头文件:
#include<linux/gpio.h>
#include<mach/regs-gpio.h>
3.修改配置文件
确认相应驱动被被编译进内核makemenuconfig
DivicesDrivers->Characterdevices->SerialDrivers->选中
<*>SansungSoC serial support
<*>Samsungs3c2410 serial port support
<*>SamsungS3C2440/S3C2442/S3c2416 serial port support
保存退出,重新编译内核,下载到开发板。
4.测试
运行测试程序后,有以下警告。好像是回溯信息,折腾了好久,没有去掉,就放着了。
参考文献:
https://wenku.baidu.com/view/1b26fc0eba1aa8114431d9f3.html
http://blog.csdn.net/fyyy4030/article/details/7243998
http://www.linuxidc.com/Linux/2011-09/43690.htm