Linux基础与驱动开发 实训报告.docx
《Linux基础与驱动开发 实训报告.docx》由会员分享,可在线阅读,更多相关《Linux基础与驱动开发 实训报告.docx(57页珍藏版)》请在冰豆网上搜索。
Linux基础与驱动开发实训报告
苏州市职业大学
实习(实训)任务书
名称:
Linux基础与驱动开发
起讫时间:
2015年12月28日~2015年12月30日
学院(部):
计算机工程
班 级:
14物联网应用技术2
指导教师:
秦云涛、周莉
学院(部)负责人:
李金祥
一、实习(实训)目的和要求
目的
1.熟知Linux操作系统;
2.熟知Linux设备驱动基础;
3.熟知Linux内核机制;
4.熟知简单Linux驱动程序的编写。
要求
1.能完成对Linux操作系统的安装及应用软件的安装和使用;
2.能对操作系统进行相应的配置;
3.能够完成文件系统的相关操作;
4.掌握Linux驱动程序编写的一般方法,能够阅读和编写简单的Linux驱动程序。
二、实习(实训)内容
(1)学会对嵌入式系统进行分析、设计,培养嵌入式系统底层开发能力。
(2)掌握嵌入式Linux开发环境的搭建方法。
(3)掌握编译Bootloader、编译内核、部署文件系统的方法。
(4)掌握基于嵌入式Linux的ARM微处理器的简单接口驱动程序的设计方法。
(5)加强各小组之间的团队合作精神。
三、实习(实训)方式
■集中□分散□校内□校外
四、实习(实训)具体安排
(1)开发前的准备:
基于Linux的开发环境的搭建。
(2)系统分析:
包括基于Linux驱动程序的原理、开发的流程。
(3)编码实现:
根据要求对LED驱动程序进行编码实现。
(4)测试:
编写测试程序对驱动程序进行测试。
安排24课时时间进行综合实训。
4课时----嵌入式Linux开发环境的搭建方法。
8课时----编译Bootloader、编译内核、文件系统。
8课时----基于嵌入式Linux的ARM微处理器的简单接口驱动程序的设计和测试程序的设计。
4课时----完成实训
五、实习(实训)报告内容(有指导书的可省略)
苏州市职业大学
实习(实训)报告
名称 Linux基础与驱动开发
2015年12月28日至2015年12月30日共1周
学院(部)计算机工程
班级14物联网应用技术2
姓名陈超群
学院(部)负责人李金祥
系主任刘昭斌
指导教师秦云涛、周莉
设计需求
1.1嵌入式系统简介
嵌入式系统是基于单片机的一种升级版,它是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
我们可从几方面来理解嵌入式系统:
1、嵌入式系统是面向用户、面向产品、面向应用的,嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理的裁减利用。
嵌入式系统和具体应用有机地结合在一起,它的升级换代也是和具体产品同步进行,因此嵌入式系统产品一旦进入市场,具有较长的生命周期。
2、嵌入式系统是将先进的计算机技术、半导体技术和电子技术和各个行业的具体应用相结合后的产物。
这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。
3、嵌入式系统必须根据应用需求对软硬件进行裁剪,满足应用系统的功能、可靠性、成本、体积等要求。
为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。
4、嵌入式系统本身不具备自主开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发。
实际上,凡是与产品结合在一起的具有嵌入式特点的控制系统都可以叫嵌入式系统。
现在人们讲嵌入式系统时,某种程度上指近些年比较热的具有操作系统的嵌入式系统。
1.2设计需求
本次综合实训任务主要是基于Linux的LED驱动程序设计及完成相关的操作。
大致分为两个阶段,第一阶段为环境搭建,第二部分是驱动程序设计。
需要完成的任务是,由驱动程序驱动开发板的LED灯,并且经测试,能够正确的点亮或熄灭开发板上的LED灯,即为完成本次实训任务。
有能力的同学,可以尝试使用更多的方式实现LED控制,或者尝试驱动开发板上的其它硬件设备,如数码管、摄像头、触控屏、网卡等等。
项目一开发环境搭建
一、实验目的
通过实训掌握在vmware下安装CentOS5.5的方法;安装wmtools、wm的共享文件夹。
掌握Linux的交叉编译环境的建立
2、实验步骤
1安装VmwareWorkstation10软件
打开已经下载好的VMware-workstation-full-9.0.1-894247.exe,进入安装界面,安装过程采用默认设置安装,安装过程中需要输入序列号,如下列图1-1至1-9所示:
开始安装VmwareWorkstation
1-1开始安装VmwareWorkstation
图1-2典型安装
图1-3安装路径
图1-4启动时检查更新
图1-5帮助提高VmwareWorkstation
图1-6创建桌面快捷方式和开始菜单文件夹
图1-7继续完成安装
图1-8安装进度
图1-9安装完成
安装结束后,VmwareWorkstation10软件可以正常使用了
2安装操作系统
在VmwareWorkstation10中安装Linux操作系统(centos5.5)
CentOS是一个免费的操作系统,隶属Linux类操作系统,基于GNU/Linux设计,基于Debian之上的一个发行版。
CentOS囊括了大量精挑细选自Debian发行版的软件包,同时保留了Debian强大的软件包管理系统,以便简易的安装或彻底的删除程序。
与大多数发行版附带数量巨大的可用可不用的软件不同,CentOS的软件包清单只包含那些高质量的重要应用程序。
CentOS提供了一个健壮、功能丰富的计算环境,既适合家用又适用于商业环境。
CentOS开发团队努力精益求精,每6个月就会发布一个版本,以提供最新最强大的软件。
默认桌面环境采用GNOME,一个UNIX和Linux主流桌面套件和开发平台。
另一个UNIX和Linux主流桌面环境是KDE。
接下来,准备在VmwareWorkstation10中安装centos5.5操作系统,安装步骤如下图1-10至1-15所示:
图1-10典型安装
图1-11选择安装文件
图1-12设置用户名及密码
图1-13虚拟机安装路径
图1-14设置虚拟机文件结构
图1-15完成安装
至此centos5.5操作系统安装完毕,等待系统自动配置完成即可,安装完成后,会进入centos5.5的图形界面,这样我们就安装centos5.5操作系统完成了,可以在这个操作系统下进行我们的实训了。
3安装VMwareTools
登录:
root
123456
用管理员登录后,不用sudo了
3.1进入终端
3.2Ip地址设置
在win7在执行ipconfig命令,查看本机ip地址,如本机ip如下:
在centos中设置ip地址为最后一位减100,即172.23.40.52,在终端执行命令:
设置ip地址和子网掩码
ifconfigeth0172.23.40.52netmask255.255.255.0
设置默认网关
routeadddefaultgw172.23.40.1deveth0
设置dns服务器ip
gedit/etc/resolv.conf
添加一行nameserver61.177.7.1
保存退出
3.3安装vmtools
加载windows.iso,
双击root的主文件夹,将文件粘贴到目录中
tarzxvfVMwareTools-8.8.0-471268.tar.gz
cdvmwar-tools-distrib
ls
./vmware-install.pl
有问题即回车,
[root@localhostvmware-tools-distrib]#./vmware-install.pl //开始安装
CreatinganewVMwareToolsinstallerdatabaseusingthetar4format.
InstallingVMwareTools.
Inwhichdirectorydoyouwanttoinstallthebinaryfiles?
//遇到这样的直接回车就可以了
[/usr/bin]
Whatisthedirectorythatcontainstheinitdirectories(rc0.d/torc6.d/)?
[/etc/rc.d]
最后得到
关闭计算机,命令
halt
CentOS关机后完成1.5文件共享,
(这个完成1.5后再看)启动后。
。
。
就可以看到变成下图所显示。
。
。
说明VMTools安装成功了。
。
。
4文件共享
关闭虚拟机,进入VM的”虚拟机”—>”设置”
选择”总是启用””添加”
启动后。
。
。
可以在CentOS内看到共享的目录
5、交叉编译环境
复制arm-linux-gcc-4.4.3.tar.gz到centos的root的主文件夹
使用命令:
cd/root
tar-zxvfarm-linux-gcc-4.3.2.tgz-C/
gedit/etc/profile
在末尾添加
exportPATH=$PATH:
/usr/local/arm/4.3.2/bin
保存
使用命令:
source/etc/profile使环境变量生效
使用命令:
arm-linux-gcc–v测试环境,正确的话如下图所示
三、实验总结
通过项目一的内容,我掌握了在vmware下安装centos5.5的方法;安装wmtools、wm的共享文件夹。
掌握Linux的交叉编译环境的建立。
通过这一周的Linux实训,包括了从网上查资料、翻书本,学到了很多,同时也巩固了这学期以来所学的Linux系统的操作。
平时上课的时候我们只是上课听老师讲,做做实验,实验做出来了就认为没事了,根本没有了解实验的真正原理。
做实训的时候本来也是认为照着书,和实训指导书做就可以了,后来发现不是这么回事。
很多操作是会出问题的,必须理解这个实验的原理才能够发现其中的错误,学会自己思考分析问题,解决问题。
在了解了基础知识之后,根据任务指导书开始进行最基础的Linux交叉环境的搭建,包括先是安装VmwareWorkstation10软件,在VmwareWorkstation10中安装Linux操作系统(centos5.5)Linux操作系统,很多东西都是第一次接触,又没有别人在旁边指导操作,完全凭借自己去摸索练习。
安装centos5.5,包括安装正确安装VMwaretools,其中出错了很多次,原因就是没有正确导入Windows镜像,终于很多次之后可以正确使用VMwaretools工具了,然后是安装交叉编译环境,毕竟配置好环境时以后实验的基础。
Arm环境的搭建倒是很简单,因为课上做过实验的原因,所以环境的搭建很快很成功。
通过本次实验,了解到我对嵌入式的知识学习的还是不太多,我也学会了如何去分析问题,根据问题去找到解决方法,这就是一个自我学习的过程。
当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。
当然,也发现自己的许多不足之处,比如基础知识太少,耐性很差,但是实训也让自己学会到好多东西自己,也是对自己的一种锻炼。
项目二Uboot、Linux内核的编译及根文件系统的制作
一、实验目的
通过实训掌握编译Bootloader、编译内核、文件系统的制作过程
2、实验步骤
1、uboot的移植
要求:
当前拿到一块开发板,它的cpu型号是smdk2440,使用的是三星的cpu。
现在没有正好的uboot,所以我们用同样为三星公司的cpu,型号为smdk2410的配置来修改,通过修改,让新的uboot可以在smdk2440的主板上运行起来。
复制u-boot-2010.06.tar.bz2到root的主文件夹
解压缩命令
tar-xjvfu-boot-2010.06.tar.bz2
cdu-boot-2010.06
开始对配置来进行修改
要修改的文件
Makefile
board/
include/configs
cpu/arm920t/
driver/
1.1修改Makefile文件
命令:
geditMakefile
添加smdk2440的配置
可以使用ctrl+f查找smdk2410
找到代码或找到3054行
smdk2410_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tsmdk2410samsungs3c24x0
后,在下面添加代码
smdk2440_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tsmdk2440samsungs3c24x0
各项的意思如下:
arm:
CPU的架构(ARCH)
arm920t:
CPU的类型(CPU),其对应于cpu/arm920t子目录。
smdk2440:
开发板的型号(BOARD),对应于board/samsung/smdk2440目录。
samsung:
开发者/或经销商。
指定交叉编译环境的路径:
使用ctrl+f查找CROSS_COMPILE
CROSS_COMPILE?
=改为
CROSS_COMPILE?
=/usr/local/arm/4.3.2/bin//arm-linux-
保存、退出
1.2建立自己的DEMO板
进入三星cpu的主板目录
cdboard/samsung/
新建目录smdk2440
mkdirsmdk2440
将2410下所有的代码复制到2440下
cp-rfsmdk2410/*smdk2440/
进入smdk2440目录
cdsmdk2440
将smdk2440下的smdk2410.c改名为smdk2440.c
mvsmdk2410.csmdk2440.c
返回u-boot-2010.06目录
cd../../..
建立2440头文件
cpinclude/configs/smdk2410.hinclude/configs/smdk2440.h
修改smdk2440下Makefile的编译项
gedit board/samsung/smdk2440/Makefile
修改第28行因在smdk2440下我们将smdk2410.c改名为smdk2440.c
COBJS:
=smdk2410.oflash.o 改为
COBJS:
=smdk2440.oflash.o
保存、退出
1.3测试
在uboot根目录测试,应用配置。
下图为配置没问题
makesmdk2440_config
根目录下生成bin文件
make
1.4修改相关的配置
S3C2440和S3C2410的区别主要是2440的主频更高,接口方面增加了摄像头接口和AC’97音频接口,寄存器方面,出了新增模块寄存器外nandflash的控制寄存器有了较大的变化,芯片的时钟频率控制寄存器有一定的变化,其他寄存器是兼容的,综上所述,我们要的的时钟频率和NANDFLASH底层驱动。
另外根据SDRAM芯片不同还需修改SDRAM刷新频率和SDRAMRAS充电速度。
再者要想u-boot在nor,sdram,nand都可以运行,还得修改代码的定向文件。
我们主要需要修改的文件有:
/cpu/arm920t/start.S在此文件中修改cpu时钟频率,
/board/sbc240x/lowlevel_init.S在此文件中修改SDRAM相关刷新频率/board/Samsung/mini2440/mini2440.c再此文件中修改cpu时钟频率
1、在include/configs/smdk2440.h头文件中添加CONFIG_S3C2440宏
geditinclude/configs/smdk2440.h 在第40行添加
#defineCONFIG_S3C24401保存退出
2、cpu/arm920t/start.S在此文件中修改cpu时钟频率
geditarch/arm/cpu/arm920t/start.S
查找if defined(CONFIG_S3C2410)或找到163行,添加
#ifdefined(CONFIG_S3C2440)/*添加s3c2440的中断禁止部分*/
ldr r1,=0x7fff /*根据2440芯片手册,INTSUBMSK寄存器有15位可用 */
ldr r0,=INTSUBMSK
str r1,[r0]
#endif
#ifdefined(CONFIG_S3C2440) /*添加s3c2440的时钟部分*/
#defineMPLLCON 0x4C000004 /*系统主频配置寄存器基地址*/
#defineUPLLCON 0x4C000008 /*USB时钟频率配置寄存器基地址 */
ldr r0,=CLKDIVN /*设置分频系数FCLK:
HCLK:
PCLK=1:
4:
8*/
mov r1,#5
str r1,[r0]
ldr r0,=MPLLCON /*设置系统主频为405MHz */
ldr r1,=0x7F021 /*这个值参考芯片手册“PLLVALUESELECTIONTABLE”部分*/
str r1,[r0]
ldr r0,=UPLLCON /*设置USB时钟频率为48MHz */
ldr r1,=0x38022 /*这个值参考芯片手册“PLLVALUESELECTIONTABLE”部分
str r1,[r0]*/
#else/*其他开发板的时钟部分,这里就不用管了,我们现在是做2440的*/
/*下面这部分是本身有的*/
/*FCLK:
HCLK:
PCLK=1:
2:
4*/
/*defaultFCLKis120MHz!
*/
ldr r0,=CLKDIVN
mov r1,#3
str r1,[r0]
#endif
保存退出
3、S3C2440的时钟部分除了在start.S中添加外,还要分别在
board/samsung/smdk2440/smdk2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下:
geditboard/samsung/smdk2440/smdk2440.c
时钟部分修改第34行和在44行添加如下绿底部分
删掉#defineFCLK_SPEED1
#defineFCLK_SPEED2 /*设置默认等于2,即下面绿底代码部分有效*/
/*下面这部分是本身有的*/
#ifFCLK_SPEED==0 /*Fout=203MHz,Fin=12MHzforAudio*/
#defineM_MDIV 0xC3
#defineM_PDIV 0x4
#defineM_SDIV 0x1
#elifFCLK_SPEED==1 /*Fout=202.8MHz*/
#defineM_MDIV 0xA1
#defineM_PDIV 0x3
#defineM_SDIV 0x1
#elifFCLK_SPEED==2 /*Fout=405MHz*/
#defineM_MDIV 0x7F /*这三个值根据S3C2440芯片手册“PLLVALUESELECTIONTABLE”部分进行设置*/
#defineM_PDIV 0x2
#defineM_SDIV 0x1
/*下面这部分是本身有的*/
#endif
USB时钟部分修改第47行和在56行添加如下绿底部分
删掉##defineUSB_CLOCK1
#defineUSB_CLOCK2 //设置默认等于2,即下面绿底代码部分有效
/*下面这部分是本身有的*/
#ifUSB_CLOCK==0
#defineU_M_MDIV 0xA1
#defineU_M_PDIV 0x3
#defineU_M_SDIV 0x1
#elifUSB_CLOCK==1
#defineU_M_MDIV 0x48
#defineU_M_PDIV 0x3
#defineU_M_SDIV 0x2
#elifUSB_CLOCK==2 /*Fout=48MHz*/
#defineU_M_MDIV 0x38 /*这三个值根据S3C2440芯片手册“PLLVALUESELECTIONTABLE”部分进行设置*/
#defineU_M_PDIV 0x2
#defineU_M_SDIV 0x2
/*下面这部分是本身有的*/
#endif
保存退出
3、设置分频系数,FCLK:
HCLK:
PCLK=1:
4:
8
geditarch/arm/cpu/arm920t/s3c24x0/speed.c
第66行如下添加如下绿底部分
/*下面这部分是本身有的*/
staticulongget_PLLCLK(intpllreg)
{
structs3c24x0_clock_power*clk_power=s3c24x0_get_base_clock_power();
ulongr,m,p,s;
if(pllreg==MPLL)
r=clk_power->MPLLCON;
elseif(pllreg==UPLL)
r=clk_power->UPLLCON;
else
hang();
m=((r&0xFF000)>>12)+8;
p=((r&0x003F0)>>4)+2;
s=r&0x3;
#ifdefined(CONFIG_S3C2440)
if(pllreg==MPLL)
{ //参考S3C2440芯片手册上的公式:
PLL=(2*m*Fin)/(p*2s)
retu