具体程序执行 流程如图4.2所示。 设置中断和异常向量 r 关闭■^T明D∞ lakeupstart0函数处理 J 关闭所有中断 上 点亮所有L即灯 1r 1 ! 初始化系统时钟频率 上 设置U^RT的OPIO 1P 初始化内存控制嚣 1L 内存测试 <螺警宏配> 1L 拷贝vivi代码至nM中 丫 一L 跳转至stase2运行 匿]4-2 vivi stage l启动流程 图4.3 vivi stage2启动流程 Fig 4-2 startup flow ofvivi stagel Fig 4-3 startup flow ofvivi stage2 Stage2的代码在initJmain.c中,包括开发板初始化、内存映射和内存管理单 元初始化等的实现,最后跳转至boot—or—vivii函数,辨别vivi的操作模式。Stage2 的具体实现步骤如图4.3所示。vivi的操作模式可分为启动加载模式和下载模式, 需要在初始化完成进行判断。一般通过是否有空格键按下判断,若有则进入、,ivi 命令行控制台进行文件下载、命令操作等,否则加载并启动linuxg马核。 16 硕士学位论文 4.2.2 vivi的配置移植 实现移动医疗应用嵌入式linux引导的基本修改【38-421 这部分可以生成基本硬件环境下运行的vivi Bootloader,包含交叉编译器设 (1) 置、顶层Makefile修改、NAND Flash存储分配三个方面的修改。 1)交叉编译器 在此使用2.95.3交叉编译器避免出现invalid option”no.q)u”之类的错误。 2)顶层Makefile 在顶层Makefile中设置①Llmm INCLUDE DIR=/kernel/include/,kernel 即为存放linux内核源码的位置,vivi的编译需要linux内核源码的部分头文件; ②cRoss COMPILE=arm-linux.,若没在/etc/profile文件中设置了默认的交叉 编译工具,则需具体交叉编译工具的路径;③ARM GCC LIBS一羔一 lust/local/arm/2.95.3/arm.1inux/lib/gee.1ib/arm.1inux/2.95.3,这边完成vivi编译时 链接库的配置,注意不是/usr/local/arm/2.95.3/lib,否则会由于arm-linux.1d找不 到所需的libgcc.a库而出珊uSr/local/ann/2.95.3/bin/arm—linux一1d:???一lgce的错误。 3)Nand Flash存储空间分配 一. 根据系统配置需求,可把NAND FLASH分为五个区,NAND FLASH存储 空间分配如图4.4所示。具体是通过修改arch/s3c2410/smdk2410.c中数据结构 . mtd_partitiont default_mtd_partitiom[]={>实现分区名称、偏移地址、占用空间 大小及标志位的设置。 Ox00000000 vivi Ox000f0000 param OxO0010000 kerrlel OX00300000 ya.ffs Ox03000000 USer Ox03 ffffff 图44NANDFALSH存储分配 Fig 4-4 NAND FLASH allocation 17 第四章系统移动终端软件平台构建 (2)功能扩展 以上完成得到的vivi已经可以进行移动医疗系统终端linux系统内核的引导 启动,但是仅支持串口模式的下载,具有一定的局限性。为有效缩减系统开发 时间和适应应用程序开发需要,本文对vivi添加了USB下载和yaffs文件系统的 烧写命令支持。 由于vivi源码中没有USB下载和yaffs文件系统的支持,因此需在原有代码基 础上先添加所需的源文件,再修改lib/config_cmd.in添加命令配置选项。vivi的命 令添加是通过include/command.h中的结构体user_command_t来实现的。以USB下 载命令usb download为例介绍vivi中命令的添加方法。usb download定义如下: user—command—t ‘'usb—download”, usb—cmd={ Command—usb, NULL, ‘'usb—download…download files vivi启动后会调用lib/command.c to nandflash using USB”); Op的add_command0把所支持的命令通过 链表连接起来。fl了main.c中调用init_builtin cmdsoi函数添加语句add_command(& usb!cmd)tlp n-I完成USB下载命令的添加。 (3)启动参数设置 上面完成后,移动医疗系统所需的vivi功能已全部实现。但是vivi是可以 传递参数给内核的Bootloader,linux内核会依据vivi中定义的linux—cmd—line来 启动系统。因此还需针对arch/s3c2410/smdk2410.c中的linux 置。根据NAND FLASH分区信息,设置为linux.cmd root=/dev/mtdblock3 ini仁/linuxrc crnd line进行设 line=¨noinitrd console=-ttySACO¨。其中,root设置根文件系统 ’ 所在分区,console设置与PC机连接的控制终端。 18 硕士学位论文 4.2.3 vivi下载到开发板 用直连串口线连接主机COMl和开发板的串口,用Jflash配线连接主机的 并口和开发板的JTAG接口;将Jflash软件放在宿主机目录,进入其目录并在 终端下输入:./Jflash-s3c2410 入O,回车;在Input Select the function to vivi/t=5,在Select the function to test:提示下键 烧写完毕后在 target block number:提示下键入0,回车; test:提示下键入2,回车完成vivi到开发板的下载。 4.3 Linux内核移植 实现嵌入式系统功能的第一步就是进行系统内核移植,内核提供移动医疗 终端应用程序的有效管理、为程序运行准备好设备、提供网络支持等 内核移植的关键是要确定硬件平台,目前嵌入式常用的处理器有ARM、 PowerPC、MIPS等【37。8】,在国内占据主导地位的主要是ARM。内核的裁剪、定 制其实就是进行内核的配置,配置内核主要是处理器类型、板级支持、设备驱 动支持、文件系统支持等。根据移动医疗终端的硬件环境,配置内核时先选择 ARM9 S3C2410 SOC支持,接下来完成文件系统类型支持,并准备好运行内核 所需的Nand Flash驱动信息加载。具体移植步骤如下: (1) 从邱:恤.arm.1inux.org下载2.6.24.7内核源码并解压; 确认ARCH与CROSS COMPILER的定义: ‘ (2)修改内核源码下顶层Makefile ARCH?=arln CROSS—COMPILER.9--/usr/local/arm/4.3.2/arm-none-linux-eabignu-: 第一行代码用于指定目标平台的体系结构。第二行代码用于指明交叉编译 器的绝对路径。因为宿主机安装了多种交叉编译器,为避免不必要的混淆,应 注意采用绝对路径的方法指明版本。 (3)为内核添加yaffs2文件系统的支持:将yaffs2源码放在内核源码的同一 目录下,进入yaffs2源码目录下用命令:./patch-ker.sh 19 c../linux一2.6.24.7 第四章系统移动终端软件平台构建 即可。上面的命令完成下面三件事情: 增加一行:∞llrce”fs/yaffs2/Kconfig” 增加一行:ojb-￥(CONFIG_YAFFS_FS)+=yaffs2/ 3)在内核纠目录下创建yaffs2目录 将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie; 将yaffs2源码目录的Kconfig文件复制到内核fs/yaffs2目录下; 将yaffs2源码目录下的幸.c?.h文件复制到内核fs/yaffs2目录下。 (4)NAND FLASH分区信息设置及其移植 为了让移植后的内核能够知:道NAND Flash的分区信息,需要修改内核源代 码,建立分区信息表,使得该分区信息和使用的Bootloader一致。根据vivi中已 确定的目标平台的分区信息,修改内核目录下文件 arch/arm/plat-s3c24xx/common-smdk.c中: static struct mtd_partition smdk_default_nand_part[]2{ 【0】={ .name=nvivi”, .size =OxOOOf0000, .offset=0, }, ‘ >; 对应好分区信息表后,接着初始化￥3C2410处理器上的NAND FLASH控 20 硕士学位论文 制器,从而建立对NAND Flash设备的支持。这主要是修改 arch/arm/machs.3c2410/mach-smdk2410.c文件中内容: stroct s3c24 1 0_platform nand smdk—nand—info 2{ .tacls=0, .twrph0=30, .twrphl=0, .nr—sets 2 ARRALSIZE(smdk hand_sets), .sets=smdk_nand_sets, ); 再来,将NAND Flash设备加入至US3C2410的设备定义中去,建立驱动。 arch/arm/plat-s3c24xx/devs.c中添加内容; extem struct s3c24 1 0_platform_hand smdk_nand info; 毒,、 stmct platform_device s3c—device—nand={ .namc=”s3c24 1 0-nand”, .id=-1, .numresources 2 ARRAY_SIZE(s3c_nandresource), 势‘ .resource=s3c_nand_resource, .dev= { .platform_data=&smdk_nand_info, ) }; 最后,找至Uplatform 加上一条语句: &s3e__device_nand, device?smdk2410_deviees[]—jnj妇a函数,在该函数体最后 为”motmt devfs._fsO:unable to mount devfS,err:-2”错误,还应禁用禁止Flash ECC 校验,修改drivers/mtd/nand/s3c24 1 0.c 2l 第四章 系统移动终端软件平台构建 SOFT; 找到chip->eccmode=NAND_ECC 改为chip->eccmode=NAND_ECC_NONE; 值得注意的是,如果将NAND 【?】Lets Yaffs do its own ECC SOFT改成NAND ECC NONE,那么 ECC这一步是必需的。 (5)支持启动时挂载devfs 为了在启动时,让内核自动挂载devfs文件系统,在内核目录下文件 /fs/Kconfig下面添加如下代码: config DEVFS—.FS bool”/dev file system default Y config DEVFS——MOUNT support(OBSOLETE)” bool”Automatically mount default Y depends on at boot” DEVFS—.FS (6)使用一个与硬件平台最相近的配置文件进行配置选项的修改 以上就完成了移动医疗终端运行的基本嵌入式Linux系统内核配置,接下来 还需获取一个默认配置文件以便将实现的功能编译进内核。在此,在shell下通 过命令cp arch/arm/configs/smdlO.4 1 0_defconfig.config拷贝与终端处理器一致的 S3C2410配置文件为系统内核默认配置。 (7)使用make menuconfig命令进入菜单配置系统运行环境。 (8)生成内核镜像 配置完成后就得到了符合移动医疗终端的内核源码。最后通过命令make clean先清除内核的编译记录,再make zImage即可在arch/arm/boot/-F生成所需 的内核镜像zlmage,将其下载到目标板上即完成了移动医疗终端内核的移植。 硕士学位论文 4.4文件系统构建 文件系统是指在一个物理设备上的任何文件组织和目录【43】,它构成了Linux 系统上所有数据的基础,移动医疗终端上各程序、库、系统文件和用户文件均 驻留其中。因此,它是终端上系统庞大复杂且又是最为基本和重要的资源。Linux 采用文件系统组织系统中的文件和设备,为设备和用户程序提供统一接口。他 支持CRAMFS,JFFS2,RAMDISK等多种文件系统。为方便新功能的开发测试, 本系统使用可读写的YAFFS2根文件系统。 YAFFS2是YAFFS(Yet Another FLASH File Sys tern)的升级版,能更好地支 持NAND FLASH,是一种类似于JFFS的专门为FLASH设计的嵌入式文件系统。 与JFFS相比,他减少了一些功能,因此速度更快、占用内存更少。通过YAFFS 文件系统,可以像操作硬盘上的文件一样操作FLASH中的数据,在系统断电后 数据仍然存储在FLASH芯片中。 4.4.1文件系统结构 大多数linux、UNIX发行版均遵循FHS(Filesystem Standard,文件 Hierarchy 系统层次标准)标准,它定义了文件系统中目录、文件分类存放的规则。Linux 根文件系统的一般结构如图4.5所示。 第四章系统移动终端软件平台构建 I’ 图4-5 linux根文件系统一般结构 Fig 4-5 general smlcture of linux root file system 其中,bin目录下存放所有用户都可以使用的基本命令,如cat、cp、ls等, 这些命令在挂接其他文件系统前就可以使用;sbin目录下存放基本系统命令,如 shutdown、reboot、fdisk等,只有管理员有权限使用,这些命令主要用于启动系 统、修复系统等;dev目录下存放设备文件,如mtdblock、ttySAC等,一般可以 通过mknod、devfs和udev三种方法创建这些设备文件;etC目录下存放各种配 置文件,这些文件、目录通常依据系统应用进行配置,常见的有profile、fstab、 inittab等;lib目录下存放一些共享库和可加载模块,共享库与可执行文件的运 行密切相关;home目录是用户目录,存放用户相关的配置文件,一般开发板上 运行的linux系统不是多用户的,可以不设此目录;root为超级用户目录:list 存放一些共享程序和数据;mnt目录用于临时挂接某个文件系统,通常为空目录; 硕士学位论文 proc目录为空目录,用于proc文件系统的挂接点;Imp目录用于存放临时文件, 一般程序运行生成临时文件时才会使用到;vat用于存放可变数据,如log文件、 spool目录等。 YAFFS文件系统创建 标准的Linux发行版本具有功能种类比较多的应用程序,这些应用程序占用 的空间也很大,这对存储容量空间移动医疗终端环境来说不是理想的选择。 busybox具有shell的功能,它能提供系统所需要的大部分工具,包括编辑工具、 网络工具、模块加载工具、压缩解压缩工具、查找工具、帐号密码管理工具和 进程相关工具等。因此,在构建终端上嵌入式linux的根文件系统时,以b瑕ybox 为基础是最优的选择。具体的文件系统创建过程如下: (1)创建基本系统目录 1)建一个目录来装文件系统:mkdir rooffs; bin sbin dev etc lib mnt proc root 4.4.2 2)创建所需各目录及其子目录:mkdir Var; tmp usr mkdir mr/bin usr/sbin。 (2)Shell应用程序定制 要获得开发板上运行的各shell命令,也需对busybox进行交叉编译移植。在 此选择的bmybOX版本是1.9.2版本。其过程如下: 1)下载解压 2)修改源码根目录下Makefile 找到ARCH和CRoSSCOMPILE修改如下: ARCH?=arm CROSS COMPILE?=/usr/loeal/arm/3.4.5/birdarm-linux- 3)修改编译配置选项 为了减少编译后的shell体积和降低应用程序编译难度,在此采用动态编译 第四章系统移动终端软件平台构建 b岫yb0X。在默认的选项前提之下,为提供移动医疗终端开发支持,一些重要选 项设置如下: 1)Install option-> 【*]Don't use/usr//避免覆盖主机系统上的文件 2)Busybox 【?]vi-style Library Tuning-一-> line editing commands//支持vi编辑器编辑文件 【?]History跗ving∥保存历史记录 【*]Tab completion//tab键补全命令 3)Linux Module Utilities...> []Support version 4)Linux System 2.2.x t02.4.X Linux kernels∥采用2.6内核,需去掉选项的选择 Utilities一> r]Support for the old/etc/mtab file肢持mdev仓lJ建设备文件 5)MiscellaneousUtilities一》 【?]devfs(obsolete) 【?]Use //dev文件系统支持 device(obsolete) devfs names for all 6)Shell..-> Choose your default shell(ash)--> 一ash//下面的选项全部选择,因为vivi仅支持ash 7)编译安装 make&make install,则在buSyboxf inS切ll目录下会生成所需的shell程序。 8)拷贝文件到文件系统 最后还需把busyboxl.9.2/_install_-里面的全部文件拷贝到文件系统的相应目 录,才能在终端上运行各shell命令。注意使用命令拷贝:ep-arf_instalV?-Imyfsl, 否则易出现一些软链接或者权限错误。为防止一些命令使用受限,一般还需修 改/bin/busylx, 属性:chmod 4755 dbin/busybox 硕士学位论文 Busybox编译生成的除-j"busybox#b,其他的命令都是到它的链接。 (3)dev目录下文件 mdev是busybox自带的一个简化版的udev,简单易用,适合于嵌入式的应 用场合。它的作用就是在系统启动和热插拔或动态加载驱动程序时,自动产生 驱动程序所需的节点文件。终端文件系统使用了mdev机制,因此,在/dev目录下 只需创建console、null两个设备节点即可,其余所需的设备节点会在系统初始化 或动态加载设备时自动创建: mknod.m 600 dev/console rnknod-m 666 dev/null c c 5 1 l 3 (4)etc目录 为实现移动医疗终端各应用程序的正确运行,需在etc目录对以下一些文件 进行具体配置: 1)profile文件:配置环境 #Set search library path exportLD_LIBRARY_PATH=/Iib:/usr/lib:￥LD_LIBRARY_PATH #Set user path PATH=,bin:/sbin:/usr/bin:/usr/sbin:￥PAlH aliasll=’ls.1. 撑SetPSlUSER一”idh吼、" LOGNAME=￥USER PSl=印n@汤I叼谬’ PATH=￥PATH export USER LOGNAME PS 1 PATH 2)fstab文件:系统挂载 proe/proe proc defaults 0 0 。 27 第四章系统移动终端软件平台构建 none/Imp ranlfs defaults 0 0 mdev/dev ramfs defaults 0 0 sysfs/sys sysfs defaults 0 0 3)inittab文件:启动应用程序脚本进入文件系统 ::sysinit:/ete/init.d/rcS ::respawn:-/bin/sh ::ctrlaltdel:/bin/umount.a.-r ::shutdown:/bin]umount.a-l" ::shutdown:/sbin/swapoff-a 4)init.d/rcS:应用程序运行规则脚本 rcS具体内容如下: #!/bin/sh 群设置主机名,需要在ete建立文件host ./etc/host hostname￥{HOSTNAME} #mountallfilesystemdefinedin'‘fstab’’ echo”#mountaU………..’。 /bin/mount-a echo”#Startingmdev………¨ /bin/echo/sbin/mdev>/proe/sys/kemel/hotplug mdev--s 5)host文件:主机名设置 HOSTNAME=sql 6)mdcv.conf文件(空文件):支持设备文件自动建立 7)passwd,group,shadow文件:设置保护 硕士学位论文 一般直接拷贝宿主机上文件,再修改p鼬swd中用户使用的shell名称。主机上 默认的为bash,而vivi只支持ash。 root:x:O:O:root:/root:/bin/bash--> root:x:O:O:root:/root:/bin/ash 以上就完成了etc目录下各文件的添加,最后还需修改各文件和文件夹的权 限避免运行受限,如: chmod 755 etc/init.d/rcS chmod 755 etc/host (5)lib lib的库其实就是进行busybox编译的库,即交叉编译器的库,我们这里使用 的是3.4.5(位置/usr/local/arm/3.4.1)。使用以下命令完成库根文件系统库文件的添 加: 捍cd/usr/locaFarm/3.4.1/arm-linux/lib 群for file in libc libcrypt libdl libra libpthread libresolv libutil >do >印￥file-*.so rootfs/lib(复制到你做的文件系统的/lib目录下) >cp-d >done 捍cp-d ld*.so?rooffs/lib Stile.SO.[?0-9】rootfs/lib 目录及其下文件添加完成后,一个可运行终端上的Linux文件系统已构建完 毕。最后使用mkya低inlg程序,用命令:mkyaffsimg rootfs rootfs.imgBP a-I"把rootfs 做成一个yaffs映像文件,将其下载到开发板上。至此,移动医疗终端的嵌入式 Linux软件平台已构建完毕。 第四章 系统移动终端软件平台构建 4.5驱动程序 4.5.1 Linux设备驱动原理 用户通过调用设备驱动程序来控制外设。设备驱动程序为用户屏蔽物理设 备的工作细节,为上层提供通用的编程接口,能使用户专注于软件编程,减轻 工作量,降低应用程序代码复杂性。嵌入式Linux将所有设备视为一个特殊的文 件一设备文件,存储在文件系统的dev目录下并给它一个专门的文件名,如串 口设备文件为/dev/ttyO。设备文件通过主、次设备号来唯一确定它的驱动程序和 物理设备。通常,linux系统设备驱动程序可分为三类:字符设备、块设备和网 络设备。其中,字符设备是最简单、最常用的设备,以字节流形式进行数据的 发送和接收,它包含一个重要的数据结构:file operations。驱动程序的这个结 构实现了主设备号与驱动程序连接的建立,其中定义Topen、read、write等成员, 每个成员分别对应open、read、write等系统调用。 应用程序 ;统调用 1 r 设备文件 设备号 1r 设各驱动程序 ’ r 系统调用对应函数 驱动的open。 l等函数 1 r 硬件 图4—6应用程序与硬件设备通信的方法 Fig 4-6 communication between application and hardware 30 硕士学位论文 当应用程序对某个设备文件执行open、read等操作时,设备文件就会根据已 分配的主、次设备号找到设备驱动程序,再根据设备驱动程序对file operations 结构体定义的系统调用,找到相对应的函数,并交予其控制权,即完成应用程 序与硬件设备的通信过程,具体流程如图4.6所示。 总而言之,Linux驱动硬件大致步骤如下: (1)加载驱动程序,向系统注册,得到一个主设备号。 (2)安装上相应硬件后,驱动程序根据主设备号在/dev N录下创建一个设备文 件,并给该设备文件分配一个次设备号。 (3)当进行设备相关系统调用时,Linux操作系统就获取该设备对应的驱动程 序来实现控制。 Linux设备驱动开发流程 苟g 4.5.2 依据设备驱动原理可知,嵌入式系统中设备驱动程序的开发其实就是完成 linux驱动硬件设备所需的各个部分…51。以字符型设备驱动为例,其开发需完 成以下几项内容: 确定文件系统接口; (1)设备号确定; (2)驱动程序的注册安装及卸载; (5)模块化; (3) (4)完成设备各个操作的函数; (6)编 译安装。内核中涉及定义、函数如图4.7所示。 第四章系统移动终端软件平台构建 define MA30R Register chrdev(1nJOR,”driver_name”,driver_anme_fops): UIlregister.c}Irdev(姒JOll’”driver_name”): Struct file_operations driver_name_fops= {.read--铀yread, ): Ssize nyread(struct file*fi lp,char_user*bur, size t count,loff t*f pos){) Module—init 0: Module—exit 0: Makefile添加编译 目标,mke编译, insmod安装, rmmod卸载 图4-7驱动开发函数流程 Fig 4-7 function flow ofdriver development 由于Linux内核功能强大,提供了诸多设备驱动程序。实际应用中,若源码 中存在相应设备驱动程序则只需针对具体硬件平台进行配置比较修改即可驱动 硬件;若不存在具体源码,才需按照以上流程进行驱动程序的开发,而其开发 亦可通过找寻源码中类似的硬件驱动进行修改添加来实现。 32 硕士学位论文 4.5.3系统所需设备驱动开发 根据终端上系统应用需求,所需添加或修改的驱动包括LCD驱动、触摸屏、 AD转换驱动、GPRS无线模块驱动和SD卡驱动。 随着Linux内核版本发展,源码中各类设备驱动不在局限于字符设备、块设 备和网络设备三类,而是不断细化,将具有共同特征的一类设备分离出来放在 驱动程序目录下作为驱动的一个子类。2.6.24内核中有一类platform设备,为内 核添加一个platform设备,只需填写platform device和platform driver两个数据 结构(这两个数据结构的定义都可以在include/linux/platform device.h文件中找 到),为该类设备驱动加载提供了极大的便利。其移植过程包括: arch/arm/roach-s3c2410/devs.c中完成platform device数据结构的填写; arch/arm/roach-s3c24 1 0/machs3c24 1 *smdk2410 (1)在 (2) 0.c文件中static struet platform_device devices[] initdata={)中添加形如&s3c device lcd使得在linux初始 化platform设备时能识别到对应设备; (3)由device init函数调用 platform_driverregister(&device_driver)I句内核注册这个platform设备驱动,并申 请资源。platform设备在内核注册中的向下调用过程如图4.8所示。 图4-8 platform设备注册调用过程图 Fig 4-8 registion and call ofplatform devices 系统所需除GPRS无线模块所需驱动外均属于platform设备,可按照其移植 过程进行驱动程序的添加修改。 第四章 4.5.3.1 系统移动终端软件平台构建 LCD驱动 终端平台LCD采用640*480的LCD,而内核默认为240*320,因此在终端 上驱动LCD需做平台相关参数的一些修改,具体如下: (1)在include/asm/arch/fb.h修改 .卜LCD description I| struct s3c24 1 0fb_display{ 卜led configuration registers_| //添加以下 unsigned long lcdconl; unsigned unsigned unsigned long long long ledcon2; lcdcon3; ledcon4; 膈加结束 unsigned ); (2)arch/arm/math-s3c24 1 0/maeh-smdk24 1 0.c long Icdcon5; 先加头文件#include 再加入如下内容实现实验箱平台上对应LCD的配置要求: static struct s3c24 1 0fb_display s3c24 1 0 led—cfg口 initdata={ { 卜Con.fig for 640x480 LCD I| .1edconl=(1<,<8)l(小≈)I(3<<5)I(12<<1)10, .1edeon2=(32<<24)1(479<<14)1(9<<6)1(1), .1edeon3=(47<<19)1(639<<8)1(15), 硕士学位论文 .Icdcon4=(13<<8)l(95), .1cdcorl5=(1<<11)I(1<<9)I(1<<8)I(1), .type 2￥3C2410且CDCONI_]陌T, =640, =480, .width .height .pixclock=1 00000,/?HCLK/1 0幸/ .xres =640, 2480, 2 .yres .bpp 16, .1eft_margin .right_margin .hsync_len .upper_margin .10wer_margin .vsync_len =1 1 6, =44, =96, =19, =1 1, =1 5, ) }; static struct s3c241 0fb—mach—info s3c24 10一fb—info——initdata 2{ .displays .num_displays =s3c24 1 0...Icd_cfg, =1, .default_display=0, .gpccon= Oxaa8002a8, .gpccon_mask=- .gl’cup= Oxffc003fc, Oxfg l e, 35 第四章系统移动终端软件平台构建 .gp吼lp m小Oxf81e, OxffcOfffO, .gpdcon=0xaa80aaa0, .gpdcon_.mask= .gpdup= OxfSfc, OxfSfc, .gpdup_mask=- .1pesel .=((0xCE6)&川I 1刘, >; 然后找到static void—init smdk2410_init(void)i函数加入 s3c24xx fb set__platdata(&s3c2410 fb info);完成平台设置。 (3)文件修改完毕后在make menuconfig中 Device Drivers...> Graphics support一--> Display device support > 选中 【?】￥3C2410 LCD framebuffer support 至此,LCD驱动添加完成。若想看开机的小企鹅确认LCD驱动是否加载成功还 应选中【?】Boot up logo选项。 4.5.3.2触摸屏驱动 需要说明的是2.6.24内核源码中并没有￥3C2410触摸屏驱动程序,像这样 的设备须按照驱动程序开发流程进行源码的编写,并将驱动程序加进内核源码 对应设备类型目录下,并修改Makefile和Kconfig文件才可真正在make menuconfig编译中将驱动程序编译进去。但实际网络上已出现众多成熟的 ￥3C2410开发板触摸屏驱动,因此触摸屏驱动主程序我们直接从网络上下载到并 命名为s3c2410 ts.c,其驱动在内核中添加实现过程如下: (1)drivers/inpuVtouchscreen/添加触摸屏驱动主程序s3c2410.文件并修改.tsC 硕士学位论文 Makefile文件添加: s3c24 1 obj?￥(CONFIG_TOUCHSCREEN_S3C24 1 0)+= 0一ts.0 (2)修改drivers/input/touchscreen/Kconfig文件 添加: config TOUCHSCREEN一￥3C2410//增加编译选项 tristate”Samsung S3C241 0 toucIl塔creeIl input driver” depends on ARCH—SMDK24 1 0&&INPUT&&INPUT._TOUCHSCREEN select SERIO help config TOUCHSCREEN_S3C2410_DEBUG//是否显示调试信息 boolean”Samsung S3C24 1 0 touchSc陀en debug messages” depends on TOUCHSCREEN——S3C24 1 0 help (3)修改include/asm.arm/plat-s3c24xx/devs.h文件 添加: struct s3c24 1 0一ts—mach—info{ delay; presc; oversampling_shifl; hat hat hat ); void......init ?hard_s3c24 1 0_ts s3c24xx_init_touchscreen(struet info); s3cdevice ts; extcm struct platform_device 37 第四章系统移动终端软件平台构建 (4)修改arch/arm/plat-s3e24xx/devs.C文件 群vi arch/ann/plat-s3c24xx/devs.C 添加: //Touchscreen static struct s3c24 1 0 ts mach_info s3c24 1 0_ts_info; void......init ?hard._s3c241 0 ts s3c24xx_init_touchsereen(struet info) { memcpy(&s3c24 1 0 s3c241 0 ts info,hard_s3e24 1 0 ts info,sizeof(struct ts——mach_info)); > EXPORT_SYMBOL(s3c24xx_init_touchsereen); struct platform_device s3e—device一={ .namc=”s3c24 1 0-ts”, .id=-1, .num—resources=ARRAY..sIZE(s3e_aderesource), .rCSOUrCC=s3c_adcresource, .dev={ .platform_data=&s3c24 1 0一tS—info, ) ); EXPORT_SYMBOL(s3c_deviee_ts); (5)修改arch/arm/mach-s3c2410/mach-smdk2410.C文件 添加: static struct s3c24 1 0一ts—mach—info s3c24 1 0_ts_cfg__i11itdata={ 硕士学位论文 .delay=10000, .presc=49, .oversampling shift=2, >; . 在smfic struct platform_device*smdk2410_devices[]—坷tda:ta={)结构中添加: &s3c_device ts, 宅Estatic void—init smdk24 1 0_map_io(void)i函数中添加: ts s3c24xx_init_touchscreen(&s3c24 1 0 cfg); (4)配置内核 最后由make menuconfig命令进入配置菜单添加驱动到内核: Device Drivers---> Input device support--》 Touchscreens一-> r]Samsung￥3C24 1 0 touchscreen input r]Samsung￥3C2410 driver touchscreen debug messages 至此,终端系统触摸屏驱动添加完成。 4.5.3.3 SD卡驱动 为避免数据采集后的数据丢失,终端上添加SD卡驱动加载SD卡存储生理数 据。Linux开发社区已经提供了完善的SD卡驱动程序补丁文件,因此我们只需为 内核打上补丁: patch-pl<。/s3c_mci.patch 再修改arch/arm/mach.s3c2410/mach-smdk2410.C文件内容添力Hsdi设备支持即 可: static struet platform_device幸smdE2410_devices[]___initdata 第四章系统移动终端软件平台构建 &s3e_deviee_sdi,//加入这一行 根据终端应用环境,还需在s3emei.c中进行detect脚位的设置: static struet s3e24xx_mei_.pdata s3emcLdef._pdata={ =0, =S3C2410_GPG8, 2 .do—dma .gpio_deteet .set._power .oer—avail //修改此处 NULL。 =MMC—VDD一32—33, }; 这样,SD卡驱动添加完成。 4.5.3.4 AD转换驱动 为实现实时生理数据采集,终端上必须实现AD转换驱动。￥3C2410内置8通 道10位的AD转换器,可通过驱动程序直接使用,工作电压为¨.3V,其具体驱 动源码见附录所示。 其驱动按字符设备驱动编写设计,实现从AIN0与AINl读取采集到的数据。 将驱动编译进内核只需在drivers/char/下的Makefile中将其源码加入编译目标即 可。为调试和测试方便,在此为AD转换驱动添加了编译选项,以模块形式加载, 分别通过insmod和rmmod进行驱动的加载和卸载。同时,为避免与系统已有设备 设备号冲突,通过mdev动态分配主设备号。当然也可以},)dproe/devieesqI查看已 有的设备号,然后选择其余空余的设备号。 4.5.3.5 GPRS模块驱动 移动医疗终端采用GPRS网络进行数据无线传输,因此需建立驱动连接,实 现处理器对GPRS模块的控制。常见GPRS模块均设计串口,因此实现ARM控制 40 硕士学位论文 器对GPRS模块的驱动控制可由串口驱动实现。如图4-9所示,终端上￥3C2410 通过UARTl(即串口2)控SUQ2403A进行无线传输设置。 S3C2410 ∞403A R)①cCVcc Vcc SIY T)∞ R功 Crs UARTl TXD∞cI蔗 口'S OCIO Cu( I/O RTS l淝a:llsT DSR ccIN I酐 CC8 DsR 叨t D(=D IyIR c【’ao GND DCD 图4-9 Fig 4-9 ARM控制器与GPRS模块连接图 between eo衄eetion ARM and GPRS module 第五章 系统信号获取 第五章系统信号获取 为有效测试系统的实用性,需要增加生理信号的接入。为缩减移动医疗 终端开发周期,本文利用Labview软件结合DAQ数据采集卡编程得到一个虚拟 模拟心电信号发生器。它能方便地获取到所需生理数据,也容易实现数据参数 控制。 虚拟仪器(virtual instrument,VI)指的是基于计算机的仪器,是计算 机与仪器的密切结合,是目前仪器发展的重要方向。实现的方式有两种: 一种是将计算机装入仪器,即所谓智能化的仪器如含嵌入式系统的仪器; 另一种是将仪器装入计算机,以通用的计算机硬件及操作系统为依托,实 现各种仪器功能,虚拟仪器主要指的是这一种。 Labview是美国国家仪器(NI)公司研发的,用于虚拟仪器开发的一种图形 化编程语言146],产生的程序是框图的形式,实现简单。利用Labview中的OAQmx 和DAQ Assistant可以方便快捷地建立基于DAQ数据采集卡的生理数据获取输 出【4刀。 5.1实现方案 l l ● I l!一一一一一一一一一: I l 。dat文件 缈””8叨’84粥影 l I …l I l L r PcI? I ● 控制界面 _-_-___-一I I I I }更多文件; 缓磁施鳓么貉缎蠡霸磁 ∥ 々 l:一一一一一一一一一- I I l l ● ! ! 图5?l模拟心电信号发生器实现方案图 Fig 5?l implementation solution of analogy ECG generator 硕士哮位论炙 DAQ数据采集卡采用NI公司的PXI.6221,它是16bit低价位数据采集卡, 带2路16bit模拟输出和24路DIO。DAQ数据采集卡与PC机通过PCI接口进 行通信连接后,在PC机中Labview环境编程实现模拟心电信号发牛器。 首先从MIT-BIH心电数据库获取所需心电dat文件,通过matlab编程设置存 储格式及数据精度,为Labview中数据准确读取做好准备;接着利用现有数据 文件Labview编程实现仪器控制界面;最后由DAQ数据采集卡的模拟输出端口 实现心电数据的读取与输出,其实现设计方案如图5—1所示。 DAQ数据采集卡与开发板连接如图5-2所示。 图5.2 DAQ数据采集卡与开发板连接 Fig 5-2 connection between DAQ data acquisition card and develop board 5.2具体实现 与其他高级语言编程系统类似,Labview也有一个用于完成编程任务的函数 库,其函数库包含数据采集、串口控制、数据分析、数据显示及数据存储等。 Labview设计虚拟仪器时依据各子模块的功能,在开发环境的功能函数面板上选 择所涉及到的函数得到程序框图,同时结合控件面板选择相应的控件和显示件, 最终实现所需的虚拟仪器。 43 第五章 系统信号获取 5.2.1数据文件处理 本文采用的数据文件在实验中先存储为dat二进制文件,dat文件可存储任 意类型数据,例如增加简单的头文件,用户可以根据需要增加相应的头文件信 息,如文件名称、创建时间等【4引。dat文件是字节的顺序排列,labview编程中 用户需了解文件的数据结构才能通过指针读写文件中的必需字节。由于生理信 号数据一般要求具有较高的精度,本文设计二进制数据文件数据结构为数据值 以float64类型存放,数值之间用分隔符“,”隔开,无头文件信息。 5.2.2前面板设计 Labview前面板主要由输入控件和显示控件组成H91。控件的种类包括:数值 控件(如滑动杆和旋钮)、图形、图表字符串、路径、数组、簇等。研制的模拟 心电信号发生器前面板如图5-3,各参数意义如下: ◆file path:用户存储生理信号数据的文件的路径 adjust:灵活设置所需的幅值,实现信号幅值的调节 ◆amplitude ◆Physical Channels:设置采集板卡上的信号输出通道 ◆Minimum Value:允许输出的最小幅值大小 ◆Maximum Value:允许输出的最大幅值大小 ◆output waveform:显示所读取的数据文件对应的波形 『雨joi…….i m●●?4 -o 产9~‘ 暑等一’一i ,,^ M.m,_i一一 ^-一 ●IⅢI …I 图5.3模拟心电信号发生器前面板图 Fig 5—3 controler panel of analogy ECG generator 硕士学位论文 5.2.3框图程序 Labview中框图程序是由节点、端点、图框和连线四部分构成的。Labview 有二种节点类型….函数节点和子VI(VI指虚拟仪器,在此是Labview的程 序模块)节点,用户通过对函数或子VI节点部分的访问和修改来实现程序 功能【5们。本文设计的模拟心电信号发生器完整程序框图如图5.4所示,并将设 计过程分为获取数据文件中数据、模拟数据接入和启动输出三部分实现。 b C 图5-4模拟心电信号发生器程序框图(a) Fig 5-4 function panel of analogy ECG generator(a) 图5_4模拟心电信号发生器程序框图(b) Fig 5--4 function panel of analogy ECG generator(b) 45 第五章系统信号获取 5.2.3.1获取数据文件中波形数据 采用labview编程实现获取数据文件中波形数据步骤如下: (1)添加一个文件路径输入控件 文件路径输入控件使得用户可以从主机硬盘上选择各种不同状态的心电文 件。 (2)添加从文件中读取数据子VI I盯—喧t西?n exi sting file) file h‘-di,loK) emmt a蚋FOg ia ref!mm吨t text cuc●】】-d I!g'z'OIF口nt 图5-5从文件中读取数据子Ⅵ Fig 5-5 VI ofread text from file 从文件中读取数据子Ⅵ如图5.5所示,各参数意义如下: ◆prompt(Open existing file):打开现有文件的对话框窗口; ◆file(use dialog):使用对话框打开要读取的文件; ◆count:函数所能读取的字符或行数的最大值; ◆refnum out:函数读取到的文件引用句柄; ◆text:从文件中读取到的文本; ◆cancelled:在取消对话框或运行对话框时产生错误其值将被设为真; ◆error in:这个函数运行前发生的错误状况; out:输出包含的所有错误信息。 ◆error 该节点函数实现使用对话框选择字节流文件,并将其中的数据按行读取出来的 功能。主要用到的节点是file和text,其中file连接文件路径,text为数据输出 端,应注意的是读取出来的数据是电子表格字符串形式。 (3)添加电子表格字符串至数组的转换子VI 硕士学位论文 delimi ter format sPretdsheet array 0曲) string string 盯r町 type眨D 1)b1) 图5-6 电子表格字符串至数组的转换子VI Fig 5-6 VI of spreadsheet to array 电子表格字符串至数组的转换子VI如图5-6所示,各参数意义如下: ◆delimiter.电子表格字符串数据的分隔符,默认采用\t; ◆format string:如何将电子表格字符串数据转换成数组,如使用%s则电 子表格字符串转换为字符串数组: ◆spreadsheet ◆array string:电子表格数据输入节点: type.-表示数组输入数据类型,默认为双精度二维数据; ◆array:输出的数组数据。 该节点完成读取出来的电子表格字符串数据到一维数值数组的转换。