摘要:随着嵌入式Linux操作系统的迅速发展,嵌入式Linux已逐渐成为嵌入式操作系统的一个重要分支。介绍了LX800在车载监控系统中的应用,实现了CAN总线实时数据和视频的显示和控制。主要阐述了x86系统平台的硬件总体设计、PCI9054驱动的实现及应用主程序相关流程。
关键词:嵌入式Linux;LX800;PCI9054
引言
嵌入式系统由于体积小、功耗低、可靠性高、可裁减性强、软硬件集成度高等特点的被广泛地应用于工业制造、过程控制、通信、仪器、仪表、汽车、船舶、航空、航天、消费类产品等众多领域。一个完整的嵌入式Linux解决方案应包括嵌入式Linux操作系统内核、运行环境、图形化界面和应用软件等。由于嵌入式设备的特殊要求,嵌入式Linux解决方案中的内核、环境、GUI等都与标准Linux有很大不同,其主要挑战是如何在狭小的Flash、ROM和内存中,实现高质量的任务实时调度、图形化显示、网络通信等功能。本文基于AMD LX800微处理器和Linux操作系统进行车载监控系统的设计。车载监控系统是对车辆工作状态、运行情况进行显示、控制并完成人机交互的系统,实现系统实时响应操作、显示相关的机车信息。
1 系统硬件设计
GeodeLX处理器是AMD公司推出的基于x86体系结构的嵌入式处理器,主要用于工业控制、移动设备等领域。GeodeLX处理器支持i586指令集,并且带有MMX和AMD“3DNow!”指令集扩展;其CPU频率在400~500MHz,带有8级单发射的指令流水线,64 KB指令L1Cache和64 KB数据L1 Cache,128 KB的可配置为指令或数据的L2 Cache。处理器内部集成了图形和视频处理单元,提高了二维图形和视频的应用加速。
PCI总线即外围部件互连总线,是一种先进的高性能32/64位地址/数据复用局部总线,可同时支持多组外围设备,并且不受制于处理器,为处理器与高速外围设备提供了一座沟通的桥梁,提高了数据吞吐量(32位最大可达132 MB/s),因此是现在PC领域中很流行的总线。P CI总线具有严格的总线规范,保证了良好的兼容性,符合PCI总线规范的扩展卡可以插入任何PCI系统可靠地工作。因此,和GeodeLX处理器一起使用的CS5536芯片通过PCI总线组提供南桥的功能,如IDE、USB2.0、Flash、AC97和x86的外围设备接口。
为了扩展一些用户接口,如高速串口、CAN总线接口等,需要将复杂的PCI总线接口转换为相对简单的用户接口。本系统采用PLX公司生产的PCI总线通用接口芯片PLC9054,处理器可以通过PCI总线访问扩展资源,如CAN总线、液晶屏数据线、按键高速串口等其他扩展设备。此款芯片采用先进的PLX数据管道结构技术,符合PCIV2.1和V2.2规范;提供了两个独立的可编程DMA控制器;每个通道均支持块和分散/集中的DMA方式;在PCI总线端支持32位数据总线,33 MHz时钟信号;本地端可以编程实现8/16/32位的数据宽度;传输速率最高可达132 MB/s;本地总线端时钟最高可达50 MHz,支持复用/非复用的32位地址数据。PCI9054提供了PCI、LOCAL、EEPROM总线3个接口,作为一种桥接芯片在PCI总线和LOCAL总线之间提供传递消息。
W83627DHG通过LPC接口与CS5536通信,此款LPC接口的I/O芯片除了可以支持传统的输入/输出接口,如键盘和鼠标、并口、软盘口、UART、SPI口等,硬件监控针对新一代的CPU,提供符合VRD11.0规格的CPU电压侦测功能,并且可经由键盘任一按键或是鼠标将系统由休眠状态唤醒。
BIOS实际是一组被固化到电脑中,为电脑提供最基本的硬件控制的程序,它是连通软件程序和硬件设备之间的枢纽,负责响应硬件的即时要求,并按软件对硬件的操作要求执行。本设计BIOS芯片采用LPC Flash可擦写芯片。
系统的整体硬件结构如图1所示,系统由处理器、外围电路及外围接口设备组成。外围电路包括晶振、电源、复位电路、串口、网口、PCI总线、USB接口、Flash等。
2 系统软件设计
Linux采用统一的框架对硬件进行管理,从一个硬件平台到另一个硬件平台的改动与上层应用无关。Linux可以随意地配置,不需要任何许可证或与商家的合作关系,源代码可以免费得到,这使得采用Linux作为操作系统不会遇到任何关于版权的纠纷。Linux本身内置网络支持,而目前嵌入式系统对网络支持要求越来越高,Linux的高度模块化使添加部件非常容易。Linux是一个和Unix相似、以内核为基础的、具有完全的内存访问控制、支持大量硬件(包括x86、Alpha、ARM等现有的大部分芯片)等特性的一种通用操作系统。其程序源码全部公开,任何人可以修改,并在GNU通用公共许可证下发行。这样,开发人员可以对操作系统进行定制裁减,适应其特殊需要。其强大的语言编译器GCC、G++等不但成熟完善,而且使用方便。本论文中基于V2.6.27内核通过make menuconfig对内核进行部分功能裁减。
软硬件综合开发是嵌入式系统的一大特色,软件设计是在紧密联系硬件的基础上来完成的。本文的车载监控系统设计遵循嵌入式软件的体系结构设计方法,分为两个部分:①相关驱动的开发,如底层包括扩展的PCI9054驱动、串口驱动、CAN驱动及内核自带的网络驱动、USB、CS5536等设备驱动;②应用程序的开发,包括显示监控任务的实现、配置文件读写实现等。
2.1 设备驱动开发
底层接口层封装监控显示软件与底层通信硬件接口、操作系统交互等部分的代码,通过定义统一的接口规范,实现上层软件不依赖具体的硬件平台,从而实现软件易于移植。
作为底层驱动模块的基本结构至少必须包含两个函数:module_init()和module_exit()。第一个函数是在把模块加载入内核时调用的;第二个函数则在删除该模块时调用。module_init()向内核注册模块所能提供的所有新功能,即可以由应用程序使用的新功能。函数module_ exit()的任务是清除掉module_init()所做的一切,保证这个模块被安全地卸载。模块的调用情况如图2所示。下面以PCI9054为代表,描述硬件驱动设计过程。
PCI9054驱动程序主要实现PCI9054设备的中断使能屏蔽,PCI9054设备的中断处理,PCI9054设备的挂载、卸载、初始化。
2.1.1 定义和注册PCI9054设备
2.1.2 PCI9054_probe()函数任务
对于probe驱动函数,驱动程序的许多任务及硬件初始化工作都将在此函数中完成。它主要完成注册PCI9054时调用的函数,完成PCI9054配置信息读取,取得外设地址,申请中断,配置PCI9054的杂项寄存器。探测流程如图3所示。
2.1.3 pci9054_init_module初始化函数
主要完成PCI的初始化、注册PCI设备、使能PCI中断等。流程图如图4所示。
2.1.4 pci9054_cleanup_module注销函数
用于注销PCI9054设备及相关扩展设备。流程图如图5所示。
2.2 应用程序的开发
车载监控系统应用程序的实现过程主要包括:窗体和各个信息控件的初始化并显示窗体实现人机交互、对按键的响应、参数的存储、发送语音消息、图5 PCI9054设备的卸载CAN事件数据的处理并实时刷新屏上信息显示当前设备的工作状态。其程序流程如图6所示。
2.3 应用程序与设备驱动的关联
在Linux系统中,对于一个硬件设备对应的是/dev目录下的逻辑设备节点,这个节点以文件的形式存在,但它不是普通意义上的文件,是设备文件,更确切地说,它是设备节点。这个节点是通过mknod命令建立的,其中指定了主设备号和次设备号。通常而言,主设备号表明了对应着确定的驱动程序;次设备号由内核使用,用于正确确定设备文件所指的设备。
insmod加载驱动程序,设备号是从/proc/devices文件中获得的,所以通常是有驱动程序在内核中,才有设备节点在目录中。这个设备号(这里特指主设备号)的主要作用,就是声明设备所使用的驱动程序。驱动程序和设备号是一一对应的,当你打开一个设备文件时,操作系统能知道这个设备所对应的驱动程序的加载。
设备节点文件中的file属性中指明了驱动程序中fops方法实现的函数指针。应用程序通过使用open、write、read、ioetl等函数来访问设备节点,进行相应的工作。
结语
LX800微处理器以其丰富的接口、较快的处理速度、稳定性及易扩展性而受到嵌入式开发者的青睐。基于LX800的车载监控系统采用Lin ux操作系统,使其具备了实时多任务处理的能力。经过测试,系统运行稳定可靠,有较好应用前景。