第7章 基于Linux的嵌入式系统开发实例_第1页
第7章 基于Linux的嵌入式系统开发实例_第2页
第7章 基于Linux的嵌入式系统开发实例_第3页
第7章 基于Linux的嵌入式系统开发实例_第4页
第7章 基于Linux的嵌入式系统开发实例_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1http:/第第7 7章章 基于基于LinuxLinux的嵌入式系的嵌入式系统开发实例统开发实例 n主讲:本章内容n嵌入式多媒体播放系统1、开发环境的搭建2、Boot Loader移植3、嵌入式Linux内核移植4、根文件系统移植5、应用程序开发nPXA系列典型嵌入式系统开发环境的搭建nPXA255系统开发平台介绍宿主机-目标机开发模式n搭建开发环境安装Linux操作系统安装xinetd安装BOOTP安装TFTP服务器n交叉编译环境的搭建PXA255系统开发平台介绍项目描述项目描述处理器PXA255USB Host2SlotSDRAMSamsung 2片64MBUSB Slave1SlotF

2、lashINTEL E28F128 2片32MBPCMCIA1Slot以太网卡CS8900A 10BaseT实时时钟Real-time clock RTC4513声卡AC97 Stereo audio红外HDSL3600显示屏LG TFT LCD 6.4英寸(640X480)CF1SlotJTAG20针界面串口9针宿主机-目标机开发模式安装Linux操作系统nFedora 7BOOTP简介nBOOTP服务的全称是Bootstrap Protocol,是一种比较早出现的远程启动的协议,我们经常用到的DHCP服务就是从BOOTP服务扩展而来的。nBOOTP协议使用TCP/IP网络协议中的UDP 6

3、7/68两个通讯端口。nBOOTP主要是用于无磁盘的客户机从服务器得到自己的IP地址、服务器的IP地址、启动映象文件名、网关IP等等。 TFTP简介nTFTP可以看成一个简化了的FTP,主要的区别是没有用户权限管理的功能,也就是说TFTP不需要认证客户端的权限,这样远程启动的客户机在启动一个完整的操作系统之前就可以通过TFTP下载启动映象档,而不需要证明自己是合法的用户。 nTFTP在安装时一定要设立一个单独的目录作为TFTP服务的根目录,以减少安全隐患xinetd简介n为了使用BOOTP和TFTP协议,首先要在宿主机上安装xinetd。nxinetd是被动式的超级服务,也就是服务程序是被ft

4、p, telnetd, pop3,imap, auth等应用程序所启动,平时则无须启动。 安装xinetdn进行安装之前,首先用rpm命令查询xinetd rpm包的安装信息:n如果没有安装xinetd,可以从Linux安装包中取得xinetd rpm包,并运行rpm命令进行安装:n最后启动xinetd,正常情况下,系统会显示服务启动信息:armlocalhost root# rpm qa | grep xinetdarmlocalhost root# rpm Uvh xinetd-pre15-2.i386.rpmarmlocalhost root# etc/rc.d/init.

5、d/xinetd start安装BOOTPn先用rpm命令检查是否已经安装BOOTP rpm包,如果没有则参照xinetd rmp包的安装方法进行安装。n安装完毕之后会生成/usr/sbin/bootpd文件,这个文件运行时会激发守护进程xinetd运行,需要创建/etc/xinetd.d/bootp文件并进行如下设置: armlocalhost root# cd /etc/xinetd.darmlocalhost xinetd.d# vi bootpService bootpsdisable = nosocket_type = dgramprotocol = udpwait = yesuse

6、r = rootserver = /usr/sbin/bootpd配置bootptab 在目标板上发送BOOTP请求时,宿主机上安装的BOOTP服务器(bootpd)根据/etc/bootptab中定义的目标机信息来生成BOOTP响应包以作应答。所以为了使用BOOTP,需事先在/etc/bootptab中输入目标机的Mac地址和分配的IP等信息,如下图:字段ht表示Hardware Type,因为使用10Mb Ethernet,所以设置为1(Ethernet);ha表示Hardware Address,是发送bootp请求的目标机的Mac地址;ip表示分配给目标机的IP地址;sm表示Subne

7、t Mask,应与宿主机相同。 armlocalhost xinetd.d# vi /etc/bootptabtest:ht = 1:ha = 0 x151436188A11:ip = 95:sm = 安装TFTP服务器n首先应确认宿主机上是否正确安装了TFTP rpm包。安装以后,会生成/etc/xinetd.d/tftp文件。如同BOOTP一样,TFTP也将激发守护进程xinetd的执行,需要对/etc/xinetd.d/tftp档进行如右所示修改:n为了操作方便,通常需要在根目录下建立一个/tftpboot目录,并将server_args设

8、置为该目录(当然也可以自行设定其他目录)。 Service tftpdisable = nosocket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /tftpboot搭建交叉编译环境n交叉编译就是在一个架构下编译另一个架构的目标文件n采用何种交叉编译器产生何种格式的目标文件还要取决于目标机的操作系统。nLinux应用程序编译时,需要交叉编译Gcc,而Gcc最终输出的是汇编语言源程序。想要进一步编译成我们所需要的机器代码,需要引入一些新的工具,比如,汇编程序

9、等。Binutils工具集提供了一些这样的工具。另外,对C语言而言,需要有相应的函数库支持C语言源程序的编译。而在Linux中应用最多的就是glibc 。GCC、Binutils和glibcngcc是Linux中最重要的软件开发工具,是一组编译工具的总称。它是GNUC和C+的编译程序。gcc编译程序能将C、C+语言源程序、汇编程序化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。nBinutils是一套用来构造和使用二进制的工具集,其中两个最为关键的binutils是GNU链接器ld和GNU汇编程序as,这两个工具是GNU工具链中的两个完

10、整部分,通常是由Gcc前端进行驱动的。nglibc是提供系统调用和基本函数的 C 库,比如open, malloc, printf等等。所有动态连接的程序都要共享它(除了kernel、bootload、和其它完全不用C库的功能代码),因此glibc的存在有利益小系统或嵌入系统缩减系统总代码尺寸与存放空间。 实验n内容:编译安装交叉编译器n相关源码:binutils-2.19.tar.bz2 gcc-2.95.3.gz glibc -2.3.2.gz glibc-Linuxthreads-2.3.2.tar.gz Linux-2.6.10.gz patch-2.6.10-bk4.bz2Boot

11、Loader移植nBoot Loader功能nBoot Loader启动流程n常见的几种Boot LoadernU-Boot分析与移植U-Boot启动代码分析U-Boot移植过程U-Boot的烧写n仿真器与JTAGBoot Loader功能nBoot Loader是系统加电后运行的第一段软件代码。通过这段代码,我们可以初始化硬设备、建立内存空间的映像图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 Boot Loader启动流程n操作系统的角度看,Boot Loader的总目标就是正确地调用内核来执行 n大多数Boot Loader都分为阶段1和阶段2

12、两大部分 阶段1实现依赖于CPU体系结构的代码 阶段2实现一些复杂的功能 Boot Loader的第一阶段nBoot Loader的阶段1通常用汇编语言编写,主要包括以下步骤:a. 硬件设备初始化。b. 为加载 Boot Loader 的 阶段2 准备 RAM 空间。 c. 拷贝 Boot Loader 的 阶段2 到 RAM 空间中。 d. 设置好堆栈。 e. 跳转到 阶段2 的 C 入口点。 Boot Loader的第二阶段nBoot Loader的阶段2通常由C语言编写,主要包括以下步骤:a. 初始化本阶段要使用到的硬件设备。b. 检测系统内存映射(memory map)。 c. 将 k

13、ernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 d. 为内核设置启动参数。e. 跳转到内核入口地址常见的Boot LoadernBLOB:最后版本为blob-2.0.5nArmboot:http:/ nRedboot:http:/ nBios-lt:http:/ U-BOOT源代码结构:board:一些已有开发板相关的文件 common:与体系结构无关的文件,实现各种命令的C文件 cpu:CPU相关文件 disk:disk驱动的分区处理代码doc:说明文档 drivers:通用设备驱动程序 fs:支持文件系统的文件 net:与网络有关的代码 lib_arm:与ARM体

14、系结构相关的代码tools:创建S-Record格式文件 和U-BOOT images的工具Include:头文件和开发板配置文件,所有开发板的配置文件都在configs目录下tools:存放制作S-Record或者U-Boot格式的映射等工具,例如mkimage U-Boot启动代码分析系统启动后进入_start位置,这里是ARM异常向量表,发生异常情况时从这里跳转到相应的位置。上电的第一条指令是跳转到reset复位处理程序: .globl _start_start: b resetldr pc, _undefined_instructionldr pc, _software_interru

15、ptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiqreset:/* 进入SVC模式 */#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit /* we do sys-critical inits */#endif#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate:.cpu_init_crit函数cpu_init_crit:/* 屏蔽所有中断 */* 设置时钟源,关闭除FFUART,SRAM,SD

16、RAM,FLASH以外的外设时钟 */.#ifdef CFG_CPUSPEEDldr r0, CC_BASE /* 时钟控制寄存器基址 */ldr r1, cpuspeed /* cpuspeed: .word CFG_CPUSPEED */str r1, r0, #CCCRmov r0, #2mcr p14, 0, r0, c6, c0, 0setspeed_done:#endif /* CFG_CPUSPEED */* 跳转到lowlevel_init,这里ip即r12,用作暂存寄存器 */mov ip, lrbl lowlevel_initmov lr, ip/* Memory inte

17、rfaces are working. Disable MMU and enable I-cache. */ldr r0, =0 x2001 ./* 关闭MMU,使能I-Cache(可选) */mov pc, lr /* 这里是从cpu_init_crit返回到relocate标号 */relocate函数relocate: /* relocate U-Boot to RAM */adr r0, _start /* r0 - current position of code */ldr r1, _TEXT_BASE /* test if we run from flash or RAM */c

18、mp r0, r1 /* dont reloc during debug */beq stack_setupldr r2, _armboot_start /* 读入_start到r2 */ldr r3, _bss_start /* 读入_bss_start到r3 */sub r2, r3, r2 /* r2 - size of armboot */add r2, r0, r2 /* r2 Default kernel command string: noinitrd root=/dev/mtdblock2 init=/Linuxrc console=ttyS0,115200 修改Linuxrc

19、文件权限: 配置内核时,指定命令行参数如下: 编辑Linuxrc文件:Busybox介绍n很多标准 Linux 工具都可以共享很多共同的元素。当这些工具被合并到一个可执行程序中时,它们就可以共享这些相同的元素,这样可以产生更小的可执行程序。 nBusyBox 可以将大约 3.6MB 的工具包装成大约 200KB 大小。 配置Busyboxarmlocalhost busybox-1.1.3$ make menuconfig Busybox Settings - General Configuration - * Support for devfs Build Options - * Build

20、 BusyBox as a static binary (no shared libs) /* 将busybox 编译为静态连接,少了启动时找动态库的麻烦 */ * Do you want to build BusyBox with a Cross Compiler? (/usr/local/arm/3.3.2/bin/arm-Linux-) Cross Compiler prefix /* 指定交叉编译工具路径 */ Init Utilities - * init * Support reading an inittab file /* 支持init 读取/etc/inittab 配置文件,

21、一定要选上 */ Shells - Choose your default shell (ash) - * ash/* (X) ash 选中ash ,这样生成的时候才会生成bin/sh 文件 * 看看我们前头的Linuxrc 脚本的头一句: * #!/bin/sh 是由bin/sh 来解释执行的 */ 从http:/ - * cp * cat * ls * mkdir * echo (basic SuSv3 version taking no options) * env * mv * pwd * rm * touch Editors - * vi Linux System Utilities

22、 - * mount * umount * Support loopback mounts * Support for the old /etc/mtab file Networking Utilities - * inetd armlocalhost busybox-1.1.3$ make TARGET_ARCH=arm CROSS=arm-Linux- PREFIX=/home/arm/dev_home/rootfs/my_rootfs/ all install 编译并安装 Busybox:TinyLogin介绍nTinyLogin 是一套 tiny UNIX 实用程序,它用于登录嵌入式系

23、统、接受其验证身份、为其修改密码,并 能维护其用户和用户组。 nTinyLogin 非常小,对嵌入式系统上的 BusyBox 是极好的补充。TinyLogin移植n从网站http:/ 下载tinylogin-1.4 到/tmp目录当中n修改tinyLogin 的Makefile:n编译并安装armlocalhost tinylogin-1.4$ vi Makefile 修改记录如下: 指明静态编译,不连接动态库 DOSTATIC = true 指明tinyLogin 使用自己的算法来处理用户密码 USE_SYSTEM_PWD_GRP = false USE_SYSTEM_SHADOW = fa

24、lse rootlocalhost tinylogin-1.4# make CROSS=arm-Linux- PREFIX=/home/arm/dev_home /rootfs/my_rootfs all install 根文件系统相关配置文件 npasswdnshadowngroupnprofilenfstabcramfs压缩包ncramfs是一个压缩式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时侯,马上计算出该数据在cramfs中的位置,将其实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。n从网站

25、http:/prdownloads. cramfs包:armlocalhost $mkcramfs my_rootfs my_rootfs.cramfs 烧写根文件系统应用程序开发nLCD驱动移植nCF卡驱动移植nUSB主控接口驱动移植n应用程序开发实例安装图形化开发工具应用程序的实现多媒体播放系统nLinux启动成功之后,我们就可以进行嵌入式应用程序开发了。本实例我们要开发的是一个嵌入式多媒体播放系统。系统通过USB接口或CF卡接口读取视频数据,通过视频译码,在LCD屏上显示,实现一个多媒体播放功能n由于应用中需要使用LCD和USB、CF卡接口,所以必须先安装这几个部分的驱动。 LCD驱动n

26、本实验中所采用的PXA255开发板使用的LCD屏幕是640 x480像素的TFT显示屏, Linux内核已经提供了PXA LCD驱动,只需在内核配置菜单的device drivers-graphic support中选择PXA FRAMEBUFFER SOPPORT来支持PXA的LCD即可。n然后需要在xhyper255.c中定义lcd的工作模式static struct pxafb_mach_info xhyper255_pxafb_mach_info = .num_modes = 1, .modes = &xhyper255_pxafb_mode_info, .lccr0 = LCD_LC

27、CR0, .lccr3 = LCD_LCCR3, .pxafb_lcd_power = &xhyper255_lcd_power, .pxafb_backlight_power = &xhyper255_pxafb_backlight_on;CF卡驱动n在Linux系统下,由于CF卡与PCMCIA设备控制器兼容,通常把CF卡当作PC Card设备进行驱动和管理。PCMCIA的插槽驱动和PC卡驱动与硬件直接相关,是驱动移植中需要重新实现的部分。CF存储卡的驱动可以直接使用标准的ATA/IDE设备驱动ide-cs模块,因此在CSB226平台上驱动CF存储卡,只需要编写PCMCIA控制器的驱动。nC

28、F卡驱动移植的主要工作就是实现pcmcia_low_level结构体中底层平台相关的5个接口函数。 struct pcmcia_low_level int (*init)(struct pcmcia_init *);/主要完成三个工作:执行平台相关的初始化任务;设置所需要中断信号的方向和边缘触发方式;注册设备发现中断与对应的中断处理函数。int (*shutdown)(void);/在卸载驱动时使用,用来释放所申请的资源。 int (*socket_state)(struct pcmcia_state_array *);/设置插槽的初始化状态信息,完成对输入参数所包含的数据结构struct p

29、cmcia_state赋值,需要根据实际插槽的状态信息正确设置此数据结构。 int (*get_irq_info)(struct pcmcia_irq_info *);/用来获得每个插槽接口设备上的Ready中断信号。 int (*configure_socket)(unsigned int, socket_state_t *);/由上层驱动调用,用来动态改变插槽的状态,比如工作电压VCC、可程序设计电压VPP等。 ;USB主控接口驱动n在 Linux kernel 源码目录driver/usb/usb-skeleton中,为我们提供了一个最基础的 USB 设备驱动程序,我们称为 USB框架。通过它我们仅需要修改极少的部分,就可以完成一个 USB 设备的驱动。nLinux USB 驱动程序需要做的第一件事情就是在 Linux USB 子系统里注册,并提供一些相关信息。所有这些信息都传送到 USB 子系统中,在USB骨架驱动程序中表示如下:static struct usb_driver sekl_driver=name:”skeleton”,/一个字符串,它对驱动程序进行描述probe:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论