嵌入式驱动设计实训报告.docx
《嵌入式驱动设计实训报告.docx》由会员分享,可在线阅读,更多相关《嵌入式驱动设计实训报告.docx(11页珍藏版)》请在冰豆网上搜索。
嵌入式驱动设计实训报告
2011-2012学年第2学期
实验报告书
课程名称嵌入式驱动设计
系(部)信息工程系
专业班级计算机09-4教改班
学生姓名王军
学生学号0943020120
山东科技大学(泰山科技学院)
一、Mini2440开发板的介绍
我们这次实训用的板子是Mini2440,Mini2440是一款基于ARM9的开发板,采用SamsungS3C2440芯片,并采用专业稳定的CPU内核电源芯片和复位芯片来保证系统运行时的稳定性。
在进行器件地址说明之前,有一点需要注意,nGCS0片选的空间在不同的启动模式下,映射的器件是不一样的。
在NANDFlash启动模式下,内部的4KBytesBootSram被映射到nGCS0片选的空间;在NorFlash启动模式下(非NandFlash启动模式),与nGCS0相连的外部存储器NorFlash就被映射到nGCS0片选的空间SDRAM地址空间:
0x30000000~0x34000000。
Supervivi在出厂的时候已经预装入板子的NorFlash中,设置拨动开关S2为NORFlash启动,即可进入BIOS模式,此时开发板上的绿色LED1会呈现闪烁状态,其启动界面如下图:
双击运行光盘中的“windows平台工具\usb下载驱动\FriendlyARMUSBDownloadDriverSetup_20090421.exe”安装程序,开始安装USB下载驱动。
注意:
此处安装的USB驱动仅在BIOS模式下有用。
安装完成后,打开光盘中的dnw.exe下载软件,可以看到USB连接OK,如图:
功能主菜单如下图:
二、实训流程
1.确定supervivi版本、开发平台及交叉编译器;
2.获取Linux内核源代码(采用版本为Linux-2.6.32.2);
3.克隆建立自己的目标平台(制定交叉编译环境变量及配置内核菜单中的MINI2440);
4.移植Nand驱动并更改分区信息;
5.移植yaffs2;
6.移植DM9000网卡驱动;
7.实训扩展;
三、实训内容
1.确定supervivi的版本为supervivi-0945-2K,supervivi的功能可通过USB下载配合DNW这个程序使用。
功能如图所示:
2.获取Linux内核源代码
对于Linux-2.6.32.2,我们是基于Ubuntu10.04平台做开发的,所有的配置和编译脚本也基于此平台,并使用符合EABI标准的新型编译器:
arm-linux-gcc-4.3.2。
3.克隆建立自己的目标平台一般步骤为:
(1)、获取mini2440.c
我们要参考SMDK2440加入自已的开发板平台,我们使用的是mini2440,因此取名为MINI2440。
在linux-2.6.32.2/arch/arm/tools/mach_types文件中,我们可以看到mini2440的机器码为1999。
接下来,我们注意到linux-2.6.32.2/arch/arm/mach-s3c2440目录下有个mach-mini2440.c文件,把它直接删除。
将linux-2.6.32.2/arch/arm/mach-s3c2440/目录下的mach-smdk2440.c复制一份。
命名为mach-mini2440.c,找到MACHINE_START(S3C2440,“SMDK2440”),修改为MACHINE_START(MINI2440,“FriendlyARMMini2440developmentboard”)。
开发板运行后,在命令行终端输入:
cat/proc/cpuinfo可以看到我们添加的开发板信息。
(2)、修改时钟源频率
在mach-mini2440.c(就是我们刚刚通过复制mach-smdk2440.c得到的)的第160行staticvoid__initsmdk2440_map_io(void)函数中,把其中的16934400(代表原SMDK2440目标板上的晶振是16.9344MHz)改为mini2440开发板上实际使用的12000000(代表mini2440开发板上的晶振12MHz,元器件标号为X2)。
(3)、从SMDK2440到MINI2440
制作自己的mini2440平台体系,需要把mach-mini2440.c中所有的smdk2440字样改为mini2440,可以使用批处理命令修改,在vim的命令模式下输入:
%s/smdk2440/mini2440/g。
(把所有和“smdk2440”匹配的字符串全部替换为“mini2440”,前面的“%s“代表字符串匹配,最后的“g”代表global,是全局的意思),除此之外,还有一个地方需要改动,在mini2440_machine_init(void)函数中,把smdk_machine_init()函数调用注释掉。
(因为我们后面会编写自己的初始化函数,不需要调用smdk2440原来的)。
(4)、编译测试
在Linux源代码根目录下执行#makemini2440_defconfig(使用Linux官方自带的mini2440配置);#makezImage;重新编译并把生成的内核文件zImage(位于arch/arm/boot目录)下到板子中,可以看到内核已经可以正常启动了(但此时大部分硬件驱动还没加,并且也没有文件系统,因此还无法登陆)。
(5)、关于内核配置菜单中的mini2440选项
在命令行执行:
#makemenuconfig(前面已经执行了makemini2440_defconfig加载了缺省配置,因此这里可以直接执行该命令);可根据一下步骤找到MINI2440选项:
SystemType->S3C2440Machines->MINI2440developmentboard,在Linux-2.6.32.2/arch/arm/mach-s3c2440/Kconfig文件中可查看到内核配置菜单中MINI2440选项的一些定义。
这里的显示信息只是在内核配置菜单中出现的,要让选择的配置实际起效,还需要根据此配置在Makefile中添加相应的代码文件,请看该目录下的Makefile。
4.移植Nand驱动并更改分区信息一般步骤:
(1)、Linux-2.6.32.2内核所支持的NandFlash类型
Linux-2.6.32.2已经自带了大部分的驱动。
在linux-2.6.32.2/drivers/mtd/nand/nand_ids.c文件中,定义了所支持的各种NandFlash类型,如下图
(2)、修改NandFlash分区表
打开/arch/arm/plat-24xx/common-smdk.c可以看到NandFlash的分区表在Linux-2.6.32.2中,nand驱动是被注册为平台设备的,这同样可在/arch/arm/plat-24xx/common-smdk.c文件中看出。
因此,在mach-mini2440.c中加入为各个分区信息的代码(包含此分区的名字,大小、偏移地址)。
(3)、从启动信息中查看分区表
至此,就完成了nandflash驱动的移植,此时在内核根目录执行“makezImage”,把生成的zImage烧写到开发板。
5.让linux支持yaffs2文件系统
(1)、获取yaffs2的源代码
在可以下载到最新的yaffs2源代码,需要使用git工具,在命令行输入:
#gitclonegit:
//www.aleph1.co.uk/yaffs2稍等片刻,就可以下载到最新的yaffs2的源代码目录,本光盘中也有单独的yaffs2源代码包(文件名为:
yaffs2-src-20100329.tar.gz)。
(2)、为内核打上yaffs2的补丁
进入yaffs2源代码目录执行:
#cdyaffs2
#./patch-ker.shc/opt/FriendlyARM/mini2440/linux-2.6.32.2
此时进入linux-2.6.32.2/fs目录,可以看到已经多了一个yaffs2目录。
(3)、配置和编译带yaffs2支持的内核
在Linux内核源代码根目录运行:
makemenuconfig
按照如下步骤进行配置:
FileSystemsMiscellaneousfilesystemsYAFFS2filesystemsupport
按空格选中它,这样我们就在内核中添加了yaffs2文件系统的支持,按“Exit”退出内核配置。
最后在命令行执行:
#makezImage。
(4)、烧写到开发板运行测试
最后会生成linux-2.6.32.2/arch/arm/boot/zImage,使用supervivi的“k“功能把它烧写到nandflash,按“b“启动系统,这时,如果nandflash已经存在文件系统(可以使用supervivi的“y“功能烧写友善之臂提供的现成的yaffs2文件系统映像root_qtopia-128M.img用以测试),就会看到下图信息了,这说明yaffs2已经移植成功。
6.移植DM9000网卡驱动步骤:
(1)、设备资源初始化
Linux-2..6.32.2已经自带了完善的DM9000网卡驱动驱动(源代码位置:
linux-2.6.32.2/drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相应的结构表即可,具体步骤如下:
a.首先添加驱动所需的头文件dm9000.h;
b.再定义DM9000网卡设备的物理基地址;
c.再填充该平台设备的资源设置,以便和DM9000网卡驱动接口配合起来;这样,DM9000平台设备的接口就填完了。
(2)、调整DM9000所用的位宽寄存器
因为Linux-2.6.32.2的DM9000网卡驱动并不是专门为mini2440准备的,所以还要在其源代码中做一些移植工作,如下步骤。
a、打开linux-2.6.32.2/drivers/net/dm9000.c,头文件处添加2410相关的配置定义,如下红色部分:
b、在dm9000设备的初始化函数中添加如下红色部分,这里是配置DM9000所用片选总线的时序,因为mini2440目前只有一个通过总线外扩的设备,在此设备驱动中直接修改相关的寄存器配置会更加容易理解一些,当然这部分也可以放到mach-mini2440.c中。
(3)、关于MAC地址
需要注意的是,本开发板所用的DM9000网卡并没有外接EEPROM用以存储MAC地址,因此系统中的MAC地址是一个“软”地址,也就是可以通过软件进行修改,可以随意改为其他值,在staticint__devinitdm9000_probe(structplatform_device*pdev)函数中可以看出:
(4)、配置内核加入DM9000,并编译运行测试
此时会带内核源代码目录,执行:
#makemenuconfig
开始在内核中配置网卡驱动,依次选择如下菜单项:
然后执行:
#makezImage
最后生成arch/arm/boot/zImage文件,使用”k”命令把它烧写到开发板,并使用默认的文件系统启动,在命令行终端运行ifconfig命令可以看到如图所示。
四、实训心得
在这次实训中,虽然工作紧张辛苦但是感觉很充实,经过这次的实训,我切实感受到了自己需要学习的东西还有很多,在嵌入式这条路上还需要稳扎稳打,通过实训,让我真真切切体会到做事情需要细心仔细,一个小小的错误,就可能会阻碍工作的进展,因此我们更需要有耐心。