首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于S3C2440和嵌入式Linux的扩展串口设计(2)

基于S3C2440和嵌入式Linux的扩展串口设计(2)

串口的物理信息存储在内核源程序arch/arm/plats3c24xx/common-smdk.c中,所以主要工作是在commonsmdk.c源文件中增加三段代码:
1)增加头文件
源程序中要包含头文件linux/serial_8250.h,用于告诉编译器使用8250.c作为扩展串口的源程序;

2)增加串口的物理信息
在common-smdk.c文件中增加8个元素的structplat_serial8250_port结构数组,并加入数据项,如每个串口使用的物理地址和中断号等信息,使系统启动后能找到串口。下面以第1片TL16c554A的第1个串口CSA为例说明如何在源程序中添加数据结构:


3)加入内核设备列表中
把串口设备(s3c_deviee_8250代表TL16c550A芯片)加入到内核的platform_device结构中
static struct platform_device_initdata*smdk_devs[]={ &s3c_device_8250,};

3.2 增加开发板代码使串口可用
主要修改drivers/serial/8250.c文件,使BANK5以8位的位宽访问TL16c554A芯片,并指定芯片的中断触发方式。
1)增加头文件asm/areh-s3c2410/regs-mem.h,定位TL16c554A所在的地址空间;
2)设置存储控制器的BANK5的位宽(8位)
在serial8250_init(void)初始化函数中把存储控制器的位宽寄存器设为0X22011110;
3)指定中断触发方式
因为TL160554A的中断信号INTA、INTB、INTC、INTD为高电平有效,所以需将INTA、INTB、INTC、INTD上升沿触发,在调用中断函数req-uest_irq前应设置中断标志为IRQF_TRIGGER_RISING。
3. 3 增加内核配置项
在内核源代码的driver/serial/Kconfig中增加config条目CONFIG_SERIAL_EXTEND_S3C24XX,内核编译时选定该选项可以把驱动程序编译进系统中。

4 测试扩展串口
测试的工作包括编译内核、在根文件系统中增加设备文件、修改系统初始化脚本、测试扩展串口几个步骤。图6为串口测试流程图。


1)配置、编译内核
配置内核时增加配置选项CONFIG_SERIAL_EXTEND_S3C24XX,执行“make uImage”命令,编译内核。
2)修改根文件系统
在Linux系统中通过设备文件来访问具体的物理设备,故使用mknod命令,增加ttyS0,ttyS1,…,ttyS7设备文件,分别对应两片TL16c554A的8个串口。命令格式如下:
# mknod/dev/ttyS0 c 4 64
3)修改配置文件
在/etc/inittab配置文件中添加ttyS0::askfirat:-/bin/sh
4)测试
把第一个串口与主机相连,设置U-Boot的启动参数为:noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttyS0,重新启动开发板,就能在超级终端下看到linux系统启动信息了。

5 结束语
本文提供了在原有TQ2440开发板中扩展8个串口,采用中断服务的方案,提高了ARM9系统运行效率。在此基础上可以进一步扩大,将串口扩展到12个、16个或者更多。

继承事业,薪火相传
返回列表