《嵌入式驱动设计实训报告.doc》由会员分享,可在线阅读,更多相关《嵌入式驱动设计实训报告.doc(12页珍藏版)》请在三一办公上搜索。
1、2011-2012 学年 第 2 学期实 验 报 告 书课程名称 嵌入式驱动设计 系(部) 信 息 工 程 系 专业班级 计算机09-4教改班 学生姓名 王军 学生学号 0943020120 山东科技大学(泰山科技学院)一、 Mini2440 开发板的介绍我们这次实训用的板子是Mini2440,Mini2440是一款基于ARM9的开发板,采用 Samsung S3C2440 芯片,并采用专业稳定的 CPU 内核电源芯片和复位芯片来保证系统运行时的稳定性。在进行器件地址说明之前,有一点需要注意,nGCS0 片选的空间在不同的启动模式下,映射的器件是不一样的。在NAND Flash启动模式下,内部
2、的 4KBytes BootSram被映射到nGCS0 片选的空间;在Nor Flash启动模式下( 非Nand Flash 启动模式) ,与nGCS0 相连的外部存储器Nor Flash 就被映射到nGCS0 片选的空间 SDRAM 地址空间:0x30000000 0x34000000。Supervivi 在出厂的时候已经预装入板子的Nor Flash中,设置拨动开关 S2为NOR Flash启动,即可进入 BIOS模式,此时开发板上的绿色LED1 会呈现闪烁状态,其启动界面如下图:双击运行光盘中的“windows 平台工具usb 下载驱动 FriendlyARM USB Download
3、Driver Setup_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. 确定supe
4、rvivi的版本为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 /
5、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, “FriendlyARM Mini2440 development
6、 board”)。开发板运行后,在命令行终端输入:cat /proc/cpuinfo 可以看到我们添加的开发板信息。(2)、修改时钟源频率在 mach-mini2440.c (就是我们刚刚通过复制mach-smdk 2440.c 得到的)的第 160 行static void _init smdk2440_ map_io(void)函数中,把其中的16934400(代表原 SMDK 2440 目标板上的晶振是 16.9344MHz)改为 mini2440 开发板上实际使用的12000000(代表 mini2440 开发板上的晶振 12MHz,元器件标号为 X2)。(3)、从SMDK2440 到
7、MINI2440制作自己的 mini2440 平台体系,需要把mach-mini2440.c 中所有的smdk2440 字样改为mini2440 ,可以使用批处理命令修改,在 vim 的命令模式下输入:%s/smdk2440/mi ni2440/g 。(把所有和“smdk2440”匹配的字符串全部替换为“mini2440 ”,前面的“%s“代表字符串匹配,最后的“g”代表 global,是全局的意思),除此之外,还有一个地方需要改动,在 mini2440_machin e_init(void)函数中,把smdk_machine_init() 函数调用注释掉。(因为我们后面会编写自己的初始化函数
8、,不需要调用smdk2440 原来的)。(4)、编译测试在 Linux 源代码根目录下执行 #make mini2440_defconfig(使用 Linux 官方自带的 mini2440 配置); #make zImage ; 重新编译并把生成的内核文件zImage(位于 arch/arm/boot 目录)下到板子中,可以看到内核已经可以正常启动了(但此时大部分硬件驱动还没加,并且也没有文件系统,因此还无法登陆)。(5)、关于内核配置菜单中的mini2440选项在命令行执行: #make menuconfig(前面已经执行了make mini2440_de fconfig 加载了缺省配置,因
9、此这里可以直接执行该命令);可根据一下步骤找到MINI2440选项:System Type-S3C2440 Machines-MINI2440 development board,在Linux-2.6.32.2/arch/arm/mach-s3c2440/Kconfig文件中可查看到内核配置菜单中MINI2440选项的一些定义。这里的显示信息只是在内核配置菜单中出现的,要让选择的配置实际起效,还需要根据此配置在Makefile中添加相应的代码文件,请看该目录下的Makefile。4.移植Nand驱动并更改分区信息一般步骤:(1)、Linux-2.6.32.2 内核所支持的Nand Flash
10、类型Linux-2.6.32.2已经自带了大部分的驱动。在linux-2.6.32.2/drivers/mtd/nand/nand_ids.c文件中,定义了所支持的各种 Nand Flash 类型,如下图(2)、修改Nand Flash 分区表打开/arch/arm/plat-24xx/common-smdk.c可以看到Nand Flash 的分区表在 Linux-2.6.32.2 中,nand 驱动是被注册为平台设备的,这同样可在/arch/arm/plat-24xx/common-smdk.c 文件中看出。因此,在mach-mini2440.c 中加入为各个分区信息的代码(包含此分区的名字
11、,大小、偏移地址)。(3)、从启动信息中查看分区表至此,就完成了 nand flash 驱动的移植,此时在内核根目录执行“make zImage”,把生成的 zImage 烧写到开发板。5.让linux支持yaffs2文件系统(1)、获取yaffs2的源代码在 可以下载到最新的yaffs2 源代码,需要使用git工具,在命令行输入: #git clone git:/www.aleph1.co.uk/yaffs 2 稍等片刻,就可以下载到最新的yaffs2 的源代码目录,本光盘中也有单独的yaffs2 源代码包(文件名为:yaffs2-src-20100329.tar.gz) 。(2)、为内核打
12、上yaffs2的补丁进入yaffs2 源代码目录执行: #cd yaffs2 #./patch-ker.sh c /opt/FriendlyARM/mini2440/linux-2.6.32.2此时进入linux-2.6.32.2/fs 目录,可以看到已经多了一个yaffs2 目录。(3)、配置和编译带yaffs2支持的内核在Linux 内核源代码根目录运行:make menuconfig按照如下步骤进行配置:File Systems Miscellaneous filesystems YAFFS2 file system support 按空格选中它,这样我们就在内核中添加了yaffs2 文
13、件系统的支持,按“Exit ”退出内核配置。最后在命令行执行: #make zImage。待添加的隐藏文字内容2(4)、烧写到开发板运行测试最后会生成linux-2.6.32.2/arch/arm/boot/zImage ,使用 supervivi 的“k“功能把它烧写到nand flash,按“b“启动系统,这时,如果 nand flash已经存在文件系统( 可以使用supervivi的“y“功能烧写友善之臂提供的现成的 yaffs2 文件系统映像root_qtopia-128M.img 用以测试) ,就会看到下图信息了,这说明yaffs2 已经移植成功。 6.移植DM9000网卡驱动步骤:
14、(1)、设备资源初始化Linux-2.6.32.2已经自带了完善的DM9000 网卡驱动驱动( 源代码位置:linux-2.6.32.2/ drivers/net/dm900 0.c) ,它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相应的结构表即可,具体步骤如下:a.首先添加驱动所需的头文件dm9000.h;b.再定义DM9000 网卡设备的物理基地址;c.再填充该平台设备的资源设置,以便和DM9000 网卡驱动接口配合起来;这样,DM9000 平台设备的接口就填完了。(2)、调整DM9000所用的位宽寄存器因为Linux-2.6.32.2 的DM9000 网卡驱动并不是专门为m
15、ini2440 准备的,所以还要在其源代码中做一些移植工作,如下步骤。a、打开linux-2.6.32.2/ drivers/net/dm9000.c ,头文件处添加2410相关的配置定义,如下红色部分:b、在dm9000 设备的初始化函数中添加如下红色部分,这里是配置DM9000 所用片选总线的时序,因为mini2440 目前只有一个通过总线外扩的设备,在此设备驱动中直接修改相关的寄存器配置会更加容易理解一些,当然这部分也可以放到mach-mini2440.c中。(3)、关于MAC地址需要注意的是,本开发板所用的DM9000 网卡并没有外接EEPRO M用以存储MAC地址,因此系统中的 MA
16、C地址是一个“软”地址,也就是可以通过软件进行修改,可以随意改为其他值,在static int_devinit dm9000_probe (struct platform_device *pdev) 函数中可以看出:(4)、配置内核加入DM9000,并编译运行测试此时会带内核源代码目录,执行: #make menuconfig 开始在内核中配置网卡驱动,依次选择如下菜单项:然后执行:#make zImage 最后生成arch/arm/boot/zImage 文件,使用”k”命令把它烧写到开发板,并使用默认的文件系统启动,在命令行终端运行ifconfig 命令可以看到如图所示。四、实训心得在这次实训中,虽然工作紧张辛苦但是感觉很充实,经过这次的实训,我切实感受到了自己需要学习的东西还有很多,在嵌入式这条路上还需要稳扎稳打,通过实训,让我真真切切体会到做事情需要细心仔细,一个小小的错误,就可能会阻碍工作的进展,因此我们更需要有耐心。