根据移动医疗终端的硬件环境,配置内核时先选择 ARM9 S3C2410 SOC支持,接下来完成文件系统类型支持,并准备好运行内核 所需的Nand Flash驱动信息加载。具体移植步骤如下: (1) 从邱:恤.allll.1inux.org下载2.6.24.7内核源码并解压; 确认ARCH与CROSS COMPILER的定义: ‘ (2)修改内核源码下顶层Makefile ARCH?=arm 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 第四章系统移动终端软件平台构建 即可。上面的命令完成下面三件事情: 增加一行"source¨fs/yaffs2/Kcontig” 增加一行:ojb-￥(CONFIG_YAFFS_FS)+=yaffs2/ 3)在内核fs/H录下创建yaffs2目录 将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie; 将yaffs2源码目录的Kconfig文件复制到内核fs/yaffs2目录下; 将yaffs2源码目录下的幸.c★.h文件复制到内核fs/yaffs2目录下。 (4)NAND FLASH分区信息设置及其移植 为了让移植后的内核能够知道N砧旧Flash的分区信息,需要修改内核源代 码,建立分区信息表,使得该分区信息和使用的Bootloader一致。根据vivi中已 确定的目标平台的分区信息,修改内核目录下文件 arch/arm/plat-s3e24xx/common-smdk.c中: static struet mtd_partition smdk default_hand_part[_]={ 【0】={ .name=nvivi”, .size =OxOOOf0000, .offset=0, }, f >; 对应好分区信息表后,接着初始化￥3C2410处理器上的NAND FLASH控 20 硕士学位论文 制器,从而建立对NAND Flash设备的支持。这主要是修改 arch/arm/machs.3c2410/mach-smdk2410.c文件中内容: struct s3c241 0_plafformnand smdk—nand—info 2{ .tacls=0, .twrph0=30, .twrphl=0, .nr—sets 2 ARRALSIZE(smdk hand_sets), .sets=smdk hand_sets, ); 再来,将NAND Flash设备加入至US3C2410的设备定义中去,建立驱动。 arch/arm/plat-s3c24xx/devs.c中添加内容; extem struct s3c24 1 0__plafform_nand smdk_nand_info; 毒,1‘ struct platform_device s3c—device—nand={ .name=”s3c24 1 0-hand”, .id=-1, .numresources .resource 2 2 ARRAY_SIZE(s3c_nandresource), 蒋_m’. s3c_nandresource, .dev= { .platform_data=&smdk hand info, ) }; 最后,找至Uplatform 加上一条语句: &s3c__device_nand, device?smdk2410._devices[]—jnj妇a函数,在该函数体最后 为”mount__devfs._fsO:unable to mount devfs,err".2”错误,还应禁用禁止Flash ECC 校验,修改drivers/mtd/nand/s3c24 1 0.c 2l 第四章系统移动终端软件平台构建 找到chip->eccmode=NAND_ECC_SOFT; 改为chip->eccmode=NAND_ECC_NONE; 值得注意的是,如果将NAND 【?】Lets ECC SOFT改成NAND ECC NONE,那么 Yaffs do its own ECC这一步是必需的。 (5)支持启动时挂载devfs 为了在启动时,让内核自动挂载devfs文件系统,在内核目录下文件 /fs/Kconfig下面添加如下代码: config DEVFS_FS bool”/dev file system default Y config DEVFS——MOUNT bool”Automatically mount default Y depends on support(OBSOLETE)” at boot” DEVFS——FS (6)使用一个与硬件平台最相近的配置文件进行配置选项的修改 以上就完成了移动医疗终端运行的基本嵌入式Linux系统内核配置,接下来 还需获取一个默认配置文件以便将实现的功能编译进内核。在此,在shell下通 过命令cp arch/arm/configs/smdk24 1 0_defconfig.config拷贝与终端处理器一致的 ￥3C2410配置文件为系统内核默认配置。 (7)使用make menuconfig命令进入菜单配置系统运行环境。 (8)生成内核镜像 配置完成后就得到了符合移动医疗终端的内核源码。最后通过命令make clean先清除内核的编译记录,再make zImagc即可在arch/arm/boot厂F生成所需 的内核镜像zImage,将其下载到目标板上即完成了移动医疗终端内核的移植。 硕士学位论文 4.4文件系统构建 文件系统是指在一个物理设备上的任何文件组织和目录【43】,它构成了Linux 系统上所有数据的基础,移动医疗终端上各程序、库、系统文件和用户文件均 驻留其中。因此,它是终端上系统庞大复杂且又是最为基本和重要的资源。Linux 采用文件系统组织系统中的文件和设备,为设备和用户程序提供统一接口。他 支持CRAMFS,JFFS2,RAMDISK等多种文件系统。为方便新功能的开发测试, 本系统使用可读写的YAFFS2根文件系统。 YAFFS2是YAFFS(Yet Another FLASH File Sys tem)的升级版,能更好地支 持NAND FLASH,是一种类似于JFFS的专门为FLASH设计的嵌入式文件系统。 与JFFS相比,他减少了一些功能,因此速度更快、占用内存更少。通过YAFFS 文件系统,可以像操作硬盘上的文件一样操作FLASH中的数据,在系统断电后 数据仍然存储在FLASH芯片中。 4.4.1文件系统结构 大多数linux、UNIX发行版均遵循FHS(Filesystem Standard,文件 Hierarchy 系统层次标准)标准,它定义了文件系统中目录、文件分类存放的规则。Linux 根文件系统的一般结构如图4.5所示。 第四章系统移动终端软件平台构建 l 图4-5 linux根文件系统一般结构 Fig 4-5 general structure 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为超级用户目录:llsr 存放一些共享程序和数据;mnt目录用于临时挂接某个文件系统,通常为空目录; 硕士学位论文 proc目录为空目录,用于proe文件系统的挂接点;tmp目录用于存放临时文件, 一般程序运行生成临时文件时才会使用到;val"用于存放可变数据,如log文件、 spool目录等。 YAFFS文件系统创建 标准的Linux发行版本具有功能种类比较多的应用程序,这些应用程序占用 的空间也很大,这对存储容量空间移动医疗终端环境来说不是理想的选择。 bmybox具有shell的功能,它能提供系统所需要的大部分工具,包括编辑工具、 网络工具、模块加载工具、压缩解压缩工具、查找工具、帐号密码管理工具和 进程相关工具等。因此,在构建终端上嵌入式linux的根文件系统时,以busybox 为基础是最优的选择。具体的文件系统创建过程如下: (1)创建基本系统目录 1)建一个目录来装文件系统:mkdir rootfs; bin sbin dev etc 4.4.2 2)创建所需各目录及其子目录:mkdir Var; lib mnt proc root tmp usr mkdir usr/bin usr/sbin。 (2)Shell应用程序定制 要获得开发板上运行的各shell命令,也需对busybox进行交叉编译移植。在 此选择的busybOX版本是1.9.2版本。其过程如下: 1)下载解压 2)修改源码根目录下Makefile 找到ARCH和CRoSSCOMPILE修改如下: ARCH?=arm CROSS_COMPILE?=/usr/local/arm/3.4.5/birdarm-linux- 3)修改编译配置选项 为了减少编译后的shell体积和降低应用程序编译难度,在此采用动态编译 第四章系统移动终端软件平台构建 b岫yboX。在默认的选项前提之下,为提供移动医疗终端开发支持,一些重要选 项设置如下: 1)InstaU option-> 【*]Don't use/usr//避免覆盖主机系统上的文件 2)Busybox Library Tuning-一-> editing 【?】、,i-style line commands//支持vi编辑器编辑文件 【*]History saviIlg∥保存历史记录 【*]Tab completion//tab键补全命令 3)Linux Module Utilities...> []Support version 2.2.x t02.4.X Linux kernels//采用2.6内核,需去掉选项的选择 4)Linux System Utilities一> file//支持mdev仓lJ建设备文件 【*]Support for the old/ete/mtab 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,则在buSybox/inS切ll目录下会生成所需的Shell程序。 8)拷贝文件到文件系统 最后还需把busyboxl.9.2/__install=里面的全部文件拷贝到文件系统的相应目 录,才能在终端上运行各shell命令。注意使用命令拷贝:ep-aft_install/?-Imyfsl, 否则易出现一些软链接或者权限错误。为防止一些命令使用受限,一般还需修 改/bin/busylx,xl拘属性:chmod 4755 Jbin/busybox 硕士学位论文 Busybox编译生成的除Tbusybox#b,其他的命令都是到它的链接。 (3)dev目录下文件 mdev是busybox自带的一个简化版的udev,简单易用,适合于嵌入式的应 用场合。它的作用就是在系统启动和热插拔或动态加载驱动程序时,自动产生 驱动程序所需的节点文件。终端文件系统使用了mdev机制,因此,在/dev目录下 只需创建console、null两个设备节点即可,其余所需的设备节点会在系统初始化 或动态加载设备时自动创建: mknod.m 600 dev/console mknod--111 666 dev/null c c 5 1 l 3 (4)etc目录 为实现移动医疗终端各应用程序的正确运行,需在etc目录对以下一些文件 进行具体配置: 1)profile文件:配置环境 #Set search library path exportLD_LIBRARY_PATH=/lib:/usr/lib:￥LD_LIBRARY_PATH #Set user path PATH=,bin:/sbin:/usr/bin:/usr/sbin:￥PAl]H aliasll=’ls.1. 撑SetPSlUSER='”i(}—un、" LOGNAME=￥USER PSI=’[Xu@hh\W]\S’ PA僻￥PATH export USER LOGNAME PS l PATH 2)fstab文件:系统挂载 proc/proc proc defaults 0 0 。 27 第四章系统移动终端软件平台构建 none/Imp ramfs defaults 0 0 mdev/dev ramfs defaults 0 0 sysfs/sys sysfs defaults 0 0 3)inittab文件:启动应用程序脚本进入文件系统 ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::ctrlaltdel:/bin/umount.aor ::shutdown:/bin/umount.a-r ::shutdown:/sbin/swapoff-a 4)init.d/rcS:应用程序运行规则脚本 rcS具体内容如下: #!/bin/sh 群设置主机名,需要在etc建立文件host ./etc/host hostname￥{HOSTNAME} #mountallfilesystemdefinedin'‘fstab’’ echo¨#mountall………。¨ /bin/mount-a echo”#Startingmdev………¨ /birdecho/sbin/mdev>/proc/sys/kemel/hotplug mdev--s 5)host文件:主机名设置 HOSTNAME=sql 6)mdev.conf文件(空文件):支持设备文件自动建立 7)passwd,group,shadow文件:设置保护 硕士学位论文 一般直接拷贝宿主机上文件,再修改passwdqa用户使用的shell名称。主机上 默认的为bash,而vi、,i只支持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的库其实就是进行b邺ybox编译的库,即交叉编译器的库,我们这里使用 的是3.4.5(位置/usr/local/arm/3.4.1)。使用以下命令完成库根文件系统库文件的添 加: 群cd/usr/Iocal/arm/3.4.1/arm-linux/lib ,●- 一 群for tile in libc liberypt libdl libm libpthread libresolv libutil >do >cp Stile-*.SO >cp-d >done 群cp-d ld*.so?rooffs/lib rootfs/lib(复制到你做的文件系统的/lib目录下) Stile.SO.[?0?9】rootfs/lib 目录及其下文件添加完成后,一个可运行终端上的Linux文件系统已构建完 毕。最后使用Inkya低inlg程序,用命令:mkyaffsimg rootfs rooffs.imgflp n-I"把rootfs 做成一个yaffs映像文件,将其下载到开发板上。至此,移动医疗终端的嵌入式 Linux软件平台已构建完毕。 第四章 系统移动终端软件平台构建 4.5驱动程序 4.5.1 Linux设备驱动原理 用户通过调用设备驱动程序来控制外设。设备驱动程序为用户屏蔽物理设 备的工作细节,为上层提供通用的编程接口,能使用户专注于软件编程,减轻 工作量,降低应用程序代码复杂性。嵌入式Linux将所有设备视为一个特殊的文 件一设备文件,存储在文件系统的dev目录下并给它一个专门的文件名,如串 121设备文件为/dev/ttyO。设备文件通过主、次设备号来唯一确定它的驱动程序和 物理设备。通常,linux系统设备驱动程序可分为三类:字符设备、块设备和网 络设备。其中,字符设备是最简单、最常用的设备,以字节流形式进行数据的 发送和接收,它包含一个重要的数据结构:file operations。驱动程序的这个结 构实现了主设备号与驱动程序连接的建立,其中定义Topen、read、write等成员, 每个成员分别对应open、read、write等系统调用。 应用程序 ;统调用 P 设备文件 设备号 1r 设各驱动程序 1 r 系统调用对应函数 驱动的open。 l等函数 ’ r 硬件 图4—6应用程序与硬件设备通信的方法 Fig 4-6 communication between application and hardware 30 硕士学位论文 当应用程序对某个设备文件执行open、read等操作时,设备文件就会根据已 分配的主、次设备号找到设备驱动程序,再根据设备驱动程序对file operations 结构体定义的系统调用,找到相对应的函数,并交予其控制权,即完成应用程 序与硬件设备的通信过程,具体流程如图4.6所示。 总而言之,Linux驱动硬件大致步骤如下: (1)加载驱动程序,向系统注册,得到一个主设备号。 (2)安装上相应硬件后,驱动程序根据主设备号在/dev目录下创建一个设备文 件,并给该设备文件分配一个次设备号。 (3) 当进行设备相关系统调用时,Linux操作系统就获取该设备对应的驱动程 序来实现控制。 4.5.2 Linux设备驱动开发流程 荀∥ 依据设备驱动原理可知,嵌入式系统中设备驱动程序的开发其实就是完成 linux驱动硬件设备所需的各个部分…51。以字符型设备驱动为例,其开发需完 成以下几项内容: 确定文件系统接口; (1)设备号确定; (2)驱动程序的注册安装及卸载; (5)模块化; (3) (4)完成设备各个操作的函数; (6)编 译安装。内核中涉及定义、函数如图4.7所示。 第四章系统移动终端软件平台构建 define M九JOR Register ehrdev(MAJOR,”driver_name”,driver_ar皿e_fops): Unregister chrdev(MAJOll’”driver_r衄e”): Struct fi le_operat ions driver_n锄e_fops= {.read--myread, ): Ssize retread(struct file*fi lp,char_user*bur, size_t count,loff t*f_pos){) Module—init 0: Module—exit 0: Makefile添加编译 目标,make编译, insmod安装, rmod卸载 图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 0.c文件中static *smdk2410 struet (1)在 (2) 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设备,可按照其移植 过程进行驱动程序的添加修改。 33 第四章系统移动终端软件平台构建 4.5.3.1 LC'D驱动 终端平台LCD采用640*480的LCD,而内核默认为240*320,因此在终端 上驱动LCD需做平台相关参数的一些修改,具体如下: (1)在include/asm/arch/fb.h修改 1.LCD description|| struct s3c24 1 0fb_display{ 卜led configuration registers I| //添加以下 unsigned long unsigned long unsigned long unsigned long lcdconl; lcdcon2; lcdcon3; lcdcon4; 膈加结束 unsigned ); (2)arch/arm/mach-s3c24 1 0/mach-smdk24 1 0.c long Icdcon5; 先加头文件#include 再加入如下内容实现实验箱平台上对应LCD的配置要求: static struct s3c24 1 Orb_display s3c24 1 O_lcd cfg口 initdata={ { 卜Config for 640x480 LCD’1 .1cdconl=(1“8)I(0<<7)I(3《5)I(12《1)10, .1edeon2 2(32<<24)1(479<<14)1(9<<6)1(1), .1cdcon3=(47<<19)1(639<<8)1(15), 硕士学位论文 .Icdcon4=(13<<8)l(95), .Icdcon5=(1<<11)I(1<<9)I(1《8)I(1), .type 2 S3C2410且CDCONl_]陌T, .width .height =640, =480, .pixclock=100000,/?HCLK/10幸/ .xres =640, =480, =16, =1 1 6, =44, .yres .bpp .1eft_margin .fight_margin .hsyne__len .upper_margin .10wer_margin .vsync_len =96, 2 1 9, =1 1, =1 5, > }; static struct s3c24 1 0fb—mach—info s3c24 1 0一fb—info——initdata 2{ .displays .num_displays =s3c24 1 0 Icd cfg, 2 1, .default_display=0, .gpccon= Oxaa8002a8, .gpccon._mask=- .gpcup= Oxffc003fc, OxfS l e, 35 第四章系统移动终端软件平台构建 .gpcup_maslF- Oxf8 1 e, .glxlcon--0xaa80aaa0, .glXtCon_mask=-0xffcofff0, .gtxtup=0xfSfc, .gpdup_mask=-0xfSfc, .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和Kcorttig文件才可真正在make menueonfig编译中将驱动程序编译进去。但实际网络上已出现众多成熟的 ￥3C2410开发板触摸屏驱动,因此触摸屏驱动主程序我们直接从网络上下载到并 命名为s3c2410 ts.c,其驱动在内核中添加实现过程如下: (1)drivers/input/touchscreen/添加触摸屏驱动主程序s3c2410.c文件并修改.KS 硕士学位论文 Makefile文件添加: s3c2410一.O obj?￥(CONFIG_TOUCHSCREEN_S3C24 1 0)忙 (2)修改“ve稿/inplIt/toucllScreen依co血g文件 添加: eonfig TOUCHSCREEN_S3C2410//增加编译选项 tristate”Samsung S3C2410 touchscreen input driver¨ depends On ARCH—SMDK24 1 0&&INPUT&&INPUT.JOUCHSCREEN select SERl0 help eonfig TOUCHSCREEN_S3C2410_DEBUG//是否显示调试信息 boolean”Samsung￥3C24 1 0 touchscreen debug messages” depends on TOUCHSCREEN——￥3C2410 help (3)修改include/asm.arm/plat-s3c24xx/devs.h文件 添加: struct s3c24 1 0一tS—mach—into{ delay; presc; hat hat int oversampling_shiit; }; void...——init s3c24xx——init——touchscreen(struet ?hards3c24 1 0_ts_info); extem struct platform_device s3c_device ts; 37 第四章系统移动终端软件平台构建 (4)修改arch/arm/plat-s3e24xx/devs.C文件 群vi arch/ann/plat-s3c24xx/devs.C 添加: //Touchscreen static struct s3c24 1 0—.ts—.maeh——info s3c24 1 0_ts_info; void......init ?hard_s3c241 0 ts s3c24xx_init_touchsereen(struet info) { memcpy(&s3c24 1 0 s3c24 1 0 ts info,hard_s3e24 1 0 ts info,sizeof(struct ts——mach_info)); } EXPORT_SYMBOL(s3c24xx_init_touchsereen); struct platform_device s3e—device—ts={ 硕士学位论文 .delay=10000, .presc=49, .oversampling_shifl=2, >; 在static . struct platform_device?smdk2410_devices[]—坷tda缸={)结构中添加: &s3c_device_ts, 在static void—init smdk24 1 0_map_io(void)i函数中添加: s3c24xx_init_touchscreen(&s3c24 1 0 ts cfg); (4)配置内核 最后f1日make menuconfig命令进入配置菜单添加驱动到内核: Device Drivers.--> Input device support--》 Touchscreens一.> r]Samsung￥3C24 1 0 r]Samsung￥3C2410 touchscreen input driver touchscreen debug messages 至此,终端系统触摸屏驱动添加完成。 4.5.3.3 SD卡驱动 为避免数据采集后的数据丢失,终端上添hlSD卡驱动加载SD卡存储生理数 据。Linux开发社区已经提供了完善的SD卡驱动程序补丁文件,因此我们只需为 内核打上补丁: patch-pl<。/s3c_mci.patch 再修改arch/arm/mach.s3c2410/mach-smdk2410.C文件内容添力Isdi设备支持即 可: static struet platform_device幸smdlO.410_devices[]_._initdata 39 的设置: .set_power .oct—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动态分配主设备号。当然也可以从/proc/deviCes中查看已 有的设备号,然后选择其余空余的设备号。 4.5.3.5 GPRS模块驱动 移动医疗终端采用GPRS网络进行数据无线传输,因此需建立驱动连接,实 现处理器对GPRS模块的控制。常见GPRS模块均设计串口,因此实现ARM控制 硕士学位论文 器对GPRS模块的驱动控制可由串口驱动实现。如图4-9所示,终端上S3C2410 通过UARTl(即串口2)控SUQ2403A进行无线传输设置。 S3C2410 ∞403A SIY T)∞ 呦c【Ncc 口①∞口蔗 研'S OCIO Vcc R功 Crs UARTl CLK I/O l淝 DsR l淝a:llsT 璐R ccIN I酐 Cc8 叨t D(=D 们限00GND GND DCD 图4-9 Fig 4-9 ARM控制器与GPRS模块连接图 between co衄ection ARM觚d GPRS module 第五章系统信号获取 第五章系统信号获取 为有效测试系统的实用性,需要增加生理信号的接入。为缩减移动医疗 终端开发周期,本文利用Labview软件结合DAQ数据采集卡编程得到一个虚拟 模拟心电信号发生器。它能方便地获取到所需生理数据,也容易实现数据参数 控制。 虚拟仪器(virtual instrument,VI)指的是基于计算机的仪器,是计算 机与仪器的密切结合,是目前仪器发展的重要方向。实现的方式有两种: 一种是将计算机装入仪器,即所谓智能化的仪器如含嵌入式系统的仪器; 另一种是将仪器装入计算机,以通用的计算机硬件及操作系统为依托,实 现各种仪器功能,虚拟仪器主要指的是这一种。 Labview是美国国家仪器(NI)公司研发的,用于虚拟仪器开发的一种图形 化编程语言问,产生的程序是框图的形式,实现简单。利用Labview中的DAQmx 和DAQ Assistant可以方便快捷地建立基于DAQ数据采集卡的生理数据获取输 出【4刀。 5.1实现方案 Fig 5?1 implementation solution of analogy ECG generator 42 硕士学位论文 DAQ数据采集卡采用NI公司的PXI.6221,它是16bit低价位数据采集卡, 带2路16bit模拟输出和24路DIO。DAQ数据采集卡与PC机通过PCI接1:3进 行通信连接后,在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文件可存储任 意类型数据,例如增加简单的头文件,用户可以根据需要增加相应的头文件信 息,如文件名称、创建时间等[481。dat文件是字节的顺序排列,labview编程中 用户需了解文件的数据结构才能通过指针读写文件中的必需字节。由于生理信 号数据一般要求具有较高的精度,本文设计二进制数据文件数据结构为数据值 以float64类型存放,数值之间用分隔符“,”隔开,无头文件信息。 5.2.2前面板设计 Labview前面板主要由输入控件和显示控件组成【491。控件的种类包括:数值 控件(如滑动杆和旋钮)、图形、图表字符串、路径、数组、簇等。