学位论文基于s3c2440的嵌入式linux操作系统内核研究.docx
《学位论文基于s3c2440的嵌入式linux操作系统内核研究.docx》由会员分享,可在线阅读,更多相关《学位论文基于s3c2440的嵌入式linux操作系统内核研究.docx(30页珍藏版)》请在冰豆网上搜索。
![学位论文基于s3c2440的嵌入式linux操作系统内核研究.docx](https://file1.bdocx.com/fileroot1/2022-11/23/cf7cdb03-7e1c-492c-8bbd-5c2a136262a1/cf7cdb03-7e1c-492c-8bbd-5c2a136262a11.gif)
学位论文基于s3c2440的嵌入式linux操作系统内核研究
学校代码:
11059
学号:
0805070285
HefeiUniversity
毕业论文(设计)
BACHELORDISSERTATION
论文题目:
基于S3C2440的嵌入式
LINUX操作系统内核研究
学位类别:
工学学士
学科专业:
自动化
作者姓名:
郭辉
导师姓名:
干开峰
完成时间:
2012年5月12号
基于S3C2440的嵌入式LINUX操作系统内核研究
中文摘要
嵌入式Linux是以Linux为基础的嵌入式操作系统,可应用于多种硬件平台,是一个和Unix相似、以内核为基础的、具有完全的内存访问控制,支持大量硬件等特性的一种通用操作系统。
它能够适应对工业控制领域高实时性的要求,被广泛应用在移动电话、个人数字助理、媒体播放器、消费性电子产品以及航空航天等领域中。
本课题是以GT2440开发板为平台来研究Linux操作系统的内核,GT2440采用高主频高性能的SamsungS3C2440A处理器作为主控芯片,接口资源丰富,具有通用性。
主要完成NandFlash驱动、LCD驱动、CS8900A网卡驱动、UDA1341声卡驱动、触摸屏驱动、SD卡驱动、RTC驱动和USB驱动等移植实现。
最后把移植的内核文件下载到GT2440开发板进行测试,测试结果验证了内核移植的正确性。
关键词:
嵌入式系统;S3C2440;Linux内核移植;驱动移植
StudyofEmbeddedLinuxOperatingSystemKernelBasedonS3C2440
Abstract
EmbeddedLinuxisaembeddedoperatingsystembasedonLinux,whichcanbeappliedtoavarietyofhardwareplatforms,withfullmemoryaccesscontrol,supportingforalotofhardwarefeatures.Itcanadapttoreal-timerequirementsonthefieldofindustrialcontrol,itiswidelyusedinmobilephones,personaldigitalassistants,mediaplayers,consumerelectronics,andaerospaceandotherfields.
ThekerneloftheLinuxoperatingsystemisstudiedbasedontheGT2440inthetopic,theGT2440useshighfrequencyandhigh-performanceSamsungS3C2440Aprocessorasthemasterchip,whoseinterfaceisrichinresourcesandversatile.PrimarilythetransplantingofNandFlashdrive,LCDdriver,CS8900ALANDriver,UDA1341soundcarddriver,touchscreendriver,SDcarddriver,RTCdriverandUSBdriverarefinished.Finally,thekernelfiletransplantedisdownloadedtotheGT2440developmentboardfortesting,andthetestresultsverifythecorrectnessofthekerneltransplantation.
KEYWORD:
Embeddedsystem;S3C2440;Linuxkernelporting;Drivetransplant
目录
第一章前言1
1.1嵌入式系统简介1
1.2嵌入式操作系统概述2
1.3章节安排2
第二章开发环境搭建3
2.1硬件平台3
2.2交叉开发环境6
2.2.1交叉开发环境简介6
2.2.2交叉编译环境的建立6
第三章嵌入式Linux内核移植实现8
3.1嵌入式Linux内核概述8
3.2嵌入式Linux内核移植实现10
3.2.1移植准备工作10
3.2.2CS8900A网卡驱动移植11
3.2.3UDA1341声卡驱动移植15
3.2.4触摸屏驱动移植16
3.2.5NandFlash驱动移植18
3.2.6yaffs2文件系统的支持20
3.2.7LCD驱动的移植21
3.2.8RTC驱动移植22
3.2.9USB驱动移植22
第四章系统的功能测试24
4.1测试准备24
4.2CS8900A网卡测试24
4.3UDA1341测试24
4.4触摸屏测试25
4.5LCD测试25
4.6RTC实时时钟测试26
4.7USB驱动测试26
第五章总结28
参考文献29
致谢30
第一章前言
一.1嵌入式系统简介
根据IEEE的定义,嵌入式系统是控制、监视或者辅助装置、机器和设备运行的装置。
从中可看出嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。
嵌入式系统是与应用紧密结合的,具有很强专用性,必须结合实际系统需求进行合理的裁减利用。
国内一个普遍被认同的定义是:
以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统[1]。
嵌入式系统有以下一些特点:
1.系统内核小。
由于嵌入式系统一般是应用于小型电子装置的,系统资源相对有限,所以内核较传统的操作系统要小得多。
比如Enea公司的OSE分布式系统,内核只有5K。
2.专用性强。
嵌入式系统的个性化很强,其中的软件4种嵌入式操作系统的调度机制和硬件的结合非常紧密,一般要针对硬件进行系统的移植,即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。
同时针对不同的任务,往往需要对系统进行较大更改,程序的编译下载要和系统相结合,这种修改和通用软件的升级是完全两个概念。
3.系统精简。
嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能设计及实现上过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全。
4.高实时性的系统软件是嵌入式软件的基本要求。
而且软件要求固态存储,以提高速度;软件代码要求高质量和高可靠性。
5.嵌入式软件开发要想走向标准化,就必须使用多任务的操作系统。
嵌入式系统的应用程序可以没有操作系统直接在芯片上运行;但是为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量。
6.嵌入式系统开发需要开发工具和环境。
由于其本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。
开发时往往有主机和目标机的概念,主机用于程序的开发,目标机作为最后的执行机,开发时需要交替结合进行[2-3]。
一.2嵌入式操作系统概述
嵌入式操作系统(EmbeddedOperationSystem,EOS)是一种用途广泛的系统软件,过去它主要应用于工业控制和国防系统领域。
EOS负责嵌入系统的全部软、硬件资源的分配、任务调度,控制、协调并发活动。
它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。
目前,已推出一些应用比较成功的EOS产品系列。
常见的嵌入式操作系统有uC/OSII、RT-thread、uCLinux、FreeRTOS、RTX、Arm-Linux、VxWorks、RTEMS、pSOS、Nucleus、PalmOS、WindowsCE、WindowsXPEmbedded、WindowsVistaEmbedded、嵌入式Linux等[4]。
嵌入式Linux操作系统是指对Linux经过小型化裁剪后,能够固化在容量只有几十万字节或几十亿字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。
嵌入式Linux操作系统具有以下特点:
1.内核完全开放;
2.强大的网络支持功能;
3.具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,并且可以跨越嵌入式系统开发中仿真工具的障碍;
4.具有广泛的硬件支持特性;
5.遵循通用国际标准,便于程序的移植。
本课题选择了嵌入式Linux操作系统作为研究对象,移植内核并下载运行。
一.3章节安排
第一章,前言,简要介绍嵌入式系统以及嵌入式操作系统的概念;
第二章,开发环境搭建,介绍内核移植的硬件平台以及交叉编译环境的建立;
第三章,内核移植实现,简要介绍一下嵌入式linux内核,并详细介绍内核移植步骤;
第四章,系统功能的测试,下载测试软件到开发板,观察是否能实现所需功能,
第五章,总结,对毕业设计进行一个总结。
第二章
开发环境搭建
二.1硬件平台
GT2440是一款具有极高性价比的嵌入式开发系统,采用高主频高性能的SamsungS3C2440A处理器作为主控芯片,专业的电路设计,优秀的LAYOUT,采用高品质的PCB板材和元器件,使其具备优越的稳定性;
GT2440开发板总体结构如图1所示。
图1GT2440开发板总体结构图
GT2440开发板硬件资源特性如下:
●CPU处理器
-SamsungS3C2440A,主频400MHz,最高533Mhz
●SDRAM内存
-板载64MSDRAM
-32bit数据总线
-SDRAM时钟频率高达100MHz
●FLASH存储
-板载256MNandFlash,掉电非易失
-板载2MNorFlash,掉电非易失,已经安装BIOS
●LCD显示
-板上集成4线电阻式触摸屏接口,可以直接连接四线电阻触摸屏
-支持黑白、4级灰度、16级灰度、256色、4096色STN液晶屏,尺寸从3.5寸到12.1寸,屏幕分辨率可以达到1024x768象素;
●接口和资源
-1个10M以太网RJ-45接口(采用CS8900网络芯片)
-3个串行口
-1个USBHost
-1个USBSlaveB型接口
-1个SD卡存储接口
-1路立体声音频输出接口,一路麦克风接口;
-1个2.0mm间距20针标准JTAG接口
-4USERLeds
-4USERbuttons
-1个PWM控制蜂鸣器
-1个可调电阻,用于AD模数转换测试
-1个I2C总线AT24C08芯片,用于I2C总线测试
-1个20pin摄像头接口
-板载实时时钟电池
-电源接口(12V),带电源开关和指示灯
●系统时钟源
-12M无源晶振
●实时时钟
-内部实时时钟(带后备锂电池)
●扩展接口
-1个34pin2.0mmGPIO接口
-1个44pin2.0mm系统总线接口
地址空间分配和片选信号定义S3C2440支持两种启动模式:
一种是从NandFlash启动;一种是从NorFlash启动。
在此两种启动模式下,各个片选的存储空间分配是不同的,如图2所示。
图2硬件资源分配
上图中,左边是nGCS0片选的NorFlash启动模式下的存储分配图;右边是NandFlash启动模式下的存储分配图。
在进行器件地址说明之前,有一点需要注意,nGCS0片选的空间在不同的启动模式下,映射的器件是不一样的。
由上图可以知道:
在NANDFlash启动模式下,内部的4KBytesBootSram被映射到nGCS0片选的空间;在NorFlash启动模式下(非NandFlash启动模式),与nGCS0相连的外部存储器NorFlash就被映射到nGCS0片选的空间。
SDRAM地址空间:
0x30000000~0x34000000[5]。
二.2交叉开发环境
二.2.1交叉开发环境简介
嵌入式系统是专用计算机系统,由于其处理能力和存储能力较弱及特殊的处理器结构,使嵌入式系统中不能安装开发软件。
所以,在进行嵌入式开发时,往往采用交叉编译的方式。
所谓交叉编译是指在宿主机(host)中编辑和编译程序,并在目标机(target)中运行由主机编译得到的可执行代码[6]。
二.2.2交叉编译环境的建立
1.在Windows中安装虚拟机,虚拟机版本为VmwareWorkstation8.0.2。
2.在VmwareWorkstation虚拟机中安装Linux操作系统,版本为Redhadlinux9.0。
3.在Linux操作系统中安装安装交叉编译器arm-linux-gcc。
下载arm-linux-gcc-4.3.3.tgz,进行解压操作:
#tarxzvfarm-linux-gcc-4.3.3.tgz/
修改环境变量:
在etc/profile中添加exportPATH=/usr/local/arm/4.3.3/bin:
$PATH。
然后输入:
arm-linux-gcc–v
出现如图3所示的信息,说明交叉编译环境搭建成功。
图3交叉编译器版本显示
3.在Windows中安装一些工具软件,如文本编辑器Notepad++,串口通信secureCRT,烧录工具DNW等,便于开发。
第三章
嵌入式Linux内核移植实现
三.1嵌入式Linux内核概述
Linux是最受欢迎的自由电脑操作系统内核。
它是一个用C语言写成,符合POSIX标准的类Unix操作系统。
Linux最早是由芬兰黑客LinusTorvalds为尝试在英特尔x86架构上提供自由免费的类Unix操作系统而开发的。
该计划开始于1991年,在计划的早期有一些Minix黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助[7]。
内核指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。
一个内核不是一套完整的操作系统。
一套基于Linux内核的完整操作系统叫作Linux操作系统。
嵌入式Linux内核的体系结构如下:
1.进程调度:
负责控制进程对CPU的使用。
CPU是计算机系统中最核心的资源,调度程序负责在可运行进程中公平地选择,使其中之一成为运行进程,从而充分利用CPU的资源。
同时,它也负责保证内核及时对硬件进行操作。
2.内存管理:
标准Linux的内存管理支持虚拟内存,进程的代码、数据和堆栈的总量可以超过实际内存的大小。
而Linux大致可以根据平台有无存储管理单元分为两个类别:
一类是和标准Linux一样运行在有硬件存储管理器的处理器上,另外一类通常针对无硬件存储管理器的CPU进行裁剪和移植。
3.虚拟文件系统:
隐藏了不同硬件的具体细节,为所有设备提供统一的接口。
虚拟文件系统可再分为逻辑文件系统和设备驱动程序两部分。
逻辑文件系统指Linux支持的文件系统,如etx2、jffs和nfs等。
设备驱动程序是具体操作硬件控制器的代码。
4.网络接口:
负责支持标准的网络通信协议和各种网络硬件设备。
其中网络通信协议部分负责实现各种标准的链路层、网络层和传输层协议;而设备驱动程序负责对网络硬件进行具体操作。
5.进程间通信:
支持进程间各种通信机制。
其通信手段主要有:
信号、文件锁、管道、等待队列、信号量、消息队列、共享内存和套接字。
Linux内核系统模块结构及相互依赖关系如图4所示。
虚拟文件系统
文件系统
网络接口
内存管理
进程调度
进程间通信
图4Linux内核系统模块结构及相互依赖关系
由上图可以看出,所有的模块都与进程调度模块存在依赖关系。
因为它们都需要依靠进程调度程序来挂起(暂停)或重新运行它们的进程。
通常,一个模块会在等待硬件操作期间被挂起,而在操作完成后才可继续运行。
例如,当一个进程试图将一数据块写到软盘上去时,软盘驱动程序就可能在启动软盘旋转期间将该进程置为挂起等待状态,而在软盘进入到正常转速后再使得该进程能继续运行。
另外3个模块也是由于类似的原因而与进程调度模块存在依赖关系。
其他几个模块的依赖关系有些不太明显,同样也很重要。
进程调度子系统需要使用内存管理来调整特定进程所使用的物理内存空间。
进程通信子系统则需要依靠内存管理器来支持共享内存通信机制。
这种通信机制允许两个进程访问内存的同一区域以进行进程间信息的交换。
虚拟文件系统也会使用网络接口来支持网络文件系统(NFS),同样也能使用内存管理子系统提供内存虚拟盘(ramdisk)设备。
而内存管理子系统也会使用文件系统来支持内存数据块的交换操作[8]。
Linux内核源码目录如下:
1.Documentation:
这个目录下面没有内核代码,只有很多质量参差不齐的文档,但往往能够给我们提供很多的帮助。
2.arch:
所有与体系结构相关的代码都在这个目录以及include/asm-*/目录中,Linux支持的每种体系结构在arch目录下都有对应的子目。
3.drivers:
这个目录是内核中最庞大的一个目录,显卡、网卡、SCSI适配器、PCI总线、USB总线和其他任何Linux支持的外围设备或总线的驱动程序都可以在这里找到。
4.fs:
虚拟文件系统(VFS,VirtualFileSystem)的代码,和各个不同文件系统的代码都在这个目录中。
Linux支持的所有文件系统在fs目录下面都有一个对应的子目录。
5.include:
这个目录包含了内核中大部分的头文件,它们按照下面的子目录进行分组。
include/asm-*/,这样的子目录有多个,每一个都对应着一个arch的子目录。
6.init:
内核的初始化代码。
包括main.c、创建早期用户空间的代码以及其他初始化代码。
7.ipc:
即进程间通信(interprocesscommunication)。
它包含了共享内存、信号量以及其他形式IPC的代码。
8.kernel:
内核中最核心部分,包括进程的调度(kernel/sched.c),以及进程的创建和撤销(kernel/fork.c和kernel/exit.c)等,和平台相关的另外一部分核心的代码在arch/*/kernel目录。
9.lib:
库代码,实现了一个标准C库的通用子集,包括字符串和内存操作的函数(strlen、mmcpy和其他类似的函数)以及有关sprintf和atoi的系列函数。
与arch/lib下的代码不同,这里的库代码都是使用C编写的,在内核新的移植版本中可以直接使用。
10.mm:
包含了体系结构无关部分的内存管理代码,体系相关的部分位于arch/*/mm目录下。
:
网络相关代码,实现了各种常见的网络协议,如TCP/IP、IPX等。
12.scripts:
该目录下没有内核代码,只包含了用来配置内核的脚本文件。
当运行makemenuconfig或者makexconfig之类的命令配置内核时,用户就是和位于这个目录下的脚本进行交互的。
13.block:
block层的实现。
最初block层的代码一部分位于drivers目录,一部分位于fs目录,从2.6.15开始,block层的核心代码被提取出来放在了顶层的block目录。
14.crypto:
内核本身所用的加密API,实现了常用的加密和散列算法,还有一些压缩和CRC校验算法。
15.security:
这个目录包括了不同的Linux安全模型的代码,比如NSASecurity-EnhancedLinux。
16.sound:
声卡驱动以及其他声音相关的代码。
17.usr:
实现了用于打包和压缩的的cpio等[9]。
三.2嵌入式Linux内核移植实现
三.2.1移植准备工作
1.为了方便修改程序,在windows平台下面操作。
需要windows和Linux之间共享文件,实现如下:
(1)安装smb服务器。
(2)配置smb服务器:
建立一个共享的目录和win7可以访问的用户名和密码。
(3)在win7中创建一个虚拟网卡,设置虚拟网卡的静态ip地址,例如:
192.168.3.1。
(4)设置虚拟机网络:
vmnet8,host-only;subnet的ip:
192.168.3.0。
(5)设置linuxeth0的ip地址和虚拟网卡ip地址在一个网段,例如:
192.168.3.100。
(6)启动smb服务器:
#servicesmbstart。
(7)win7中win+r输入\\192.168.3.100即可访问共享的资源。
2.准备内核干净的源码,从官网下载,本课题用的是linux2.3.61版本的内核,即文件linux-2.6.31.tar.bz2。
解压至工作目录linux-2.6.31。
3.指定内核为arm,交叉编译器为linux
修改linux-2.6.31下的Makefile:
183行:
linuxARCH?
=arm
184行:
CROSS_COMPILE?
=arm-linux-
修改Makefile权限为可写可执行,保存。
4.修改时钟
修改arch/arm/mach-s3c2440/mach-smdk2440.c
163行:
s3c24xx_init_clocks(12000000)。
5.载入配置文件
#makemenuconfig
进入LoadanAlternateConfigurationFile
输入2440的默认配置文件:
arch/arm/configs/s3c2410_defconfig
在SystemType下,s3c24XXMachine那部分,只选中:
SMDK2410/A9M2410
SMDK2440
SMDK2440withS3C2440cpumoudle
进入KernelFeatures选择UsetheARMEABItocompilethekernel和AllowoldABIbinariestorunwiththiskernel
保存配置文件改名为:
.config并退出[10]。
编译:
#makezImage,把镜像烧进NandFlash跑一下,看串口是否打印出信息。
三.2.2CS8900A网卡驱动移植
CS8900A工作流程图如图5所示。
图5CS8900A工作流程图
移植时首先确定网卡的地址为0x19000000,中断号为EINT9。
修改drivers/net/cs89x0.c,指定CS8900A使用的资源:
#elifdefined(CONFIG_ARCH_S3C2410)
#include
#include
#defineS3C24XX_PA_CS89000x19000000
staticunsignedintnetcard_portlist[]__initdata={0,0};
staticu