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

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

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

3 驱动程序移植  软件设计主要是为设备编写驱动程序。设备驱动是介于硬件和操作系统之间的软件接口,主要功能包括:探测和初始化设备;从设备接收数据并提交给内核;从内核接收数据送到设备;检测和处理设备错误。
  串口驱动程序从上到下分为4层:终端设备层、行规程、串口抽象层、串口芯片层。其中,串口芯片层与具体的芯片相关,主要是向串口抽象层提供串口芯片所用的资源,还进行一些与芯片相关的设置。
  TL16C554A扩展串口芯片属于标准串口,内核的串口驱动程序对它支持它的驱动程序就是Linux内核代码中的driver/seria/8250.c.入口函数是serial8250_init,它用于向串口抽象层提供注册串口的物理信息。串口的物理信息主要有两类:访问地址和中断号。所以只要设置好这两类物理信息,就可以驱动扩展串口了,图5为驱动程序移植流程。

  3.1 构建扩展串口的数据结构
  串口的物理信息存储在内核源程序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个或者更多。
继承事业,薪火相传
返回列表