LPC2478远程温度监控

更新时间:2024-07-10 06:33:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

桂林电子科技大学毕业设计(论文)报告用纸 第 1 页 共 56 页

摘 要

随着通讯技术、网络技术和半导体技术的飞速发展,嵌入式系统接入网络已成为其应用的一个重要方向。越来越多的嵌入式系统选择Web 服务器的方式与Internet 进行数据交换。而以太网是构筑现代Internet 网络的基础,因此选择基于以太网的嵌入式Web 服务器技术实现数据交换将具有较高的实用价值。温度是程控机房、档案室、图书馆、农业生产基地等众多场所需要实时监控的一个重要物理量。温度监控系统在实际生活中有着重要的作用。本文主要针对ARM7TDMI核的微处理器芯片,结合嵌入式Web 服务器技术,提出了基于以太网的远程温度监控系统的设计方案。该方案成功的实现了温度采集和控制的网络化。

本设计采用的是丰宝公司的LINPO-PS LPC_2478实验板,进行远程温度监控系统研究,该板采用了恩智浦公司基于ARM7TDMI-S内核、单电源供电、LQFP208封装的LPC2478,具有JTAG仿真调试,ISP编程等功能。

uClinux是应用于微控制领域的一种嵌入式Linux操作系统,它源码开放,移植性好,支持多种硬件平台和几乎所有常见网络通信协议,支持文件系统丰富,是一个功能完整的嵌入式操作系统。并且有大量优秀的开放源代码的应用软件和开发工具可用,因此,采用μClinux作为操作平台,使用Web技术进行远程在线监测系统的开发。

Boa是一个高性能的单任务型Web服务器,可以运行在几乎所有的类Unix的平台上,Boa支持认证,支持CGI,功能比较全,占用资源也少,非常适合于用在资源有限的嵌入式系统中,目前Boa已经以源码的形式包含在uClinux的发行包中。所以本设计采用uClinux和boa服务器可以较好的满足本次设计要求。

关键词:远程温度系统;AMR7;LPC2478;u-boot;uClinux;nand flash;nor flash;dp83848;ds18b20;cgi;boa;web;

1

桂林电子科技大学毕业设计(论文)报告用纸 第 2 页 共 56 页

Abstract

Along with communications technology, networking technology and the technology embedded systems developing rapidly and access network has become an important direction of its application. more and more options embedded systems and internet web server exchange data.. And ethernet is construct a modern internet network infrastructure and therefore opt for ethernet technology embedded web server for data interchange will be the practical value of the room. the temperature is controlled, and the archives, libraries, agricultural production base in many places such as real-time monitoring require a major physical quantities. the temperature control system in practical life is an important role. This article mainly aimed at the microprocessor chips arm7tdmi, the technology embedded web server, based on the temperature of the ethernet remote control system design scheme. This scheme successful to the collection and control of the network.

The design is based on the Fengbao Electronic Technology (Shanghai) Co., Ltd LINPO-PS LPC_2478 board to carry out the analysis on meter reading system, the board is integrated with NXP ARM7TDMI-S kernel, Single power supply, LQFP208 enclosed LPC2478, JTAG simulated debugging and ISP programming functions, etc.. This design adopts uclinux and the boa server can better meet the requirements.

uClinux is applied to a control an embedded linux operating system of its open source and transplant well, and support multiple hardware platforms and almost all common communication protocols network, supported file system, is a function of embedded system. and there is a good open source software application and development of tools available, and therefore, adopt μ clinux as operating platform, the use of remote web technology in the monitoring system development.

Boa is a performance of the task type of web server and run on almost all the kind of unix platforms, boa support and support, and the cgi be holding resources are few and are suitable for use in the limited resources of embedded systems, and the boa has been a source of the forms contained in the issue of uClinux package. So this design adopts uclinux and the boa server can better meet the requirements.

Key words: remote temperature measurement and control system;

ARM7;LPC2478;u-boot;uClinux;nand flash;norflash;dp83848;ds18b20;cgi;boa;web;

2

桂林电子科技大学毕业设计(论文)报告用纸 第 3 页 共 56 页

目 录

引言 ....................................................................................................................... 5 1 项目设计方案 ................................................................................................. 6 2 开发环境介绍 ................................................................................................. 7

2.1 LINPO-PS LPC_2478介绍 ............................................................................................ 7 2.2 NORFLASH介绍 ........................................................................................................... 7 2.2.1 AM29LV160DB简介 ............................................................................................. 8 2.2.2 AM29LV160DB的操作命令字 ............................................................................. 8 2.2.3 Nor flash的映射 ..................................................................................................... 8 2.3 NAND FLASH介绍 ......................................................................................................... 9 2.3.1 Nand flash芯片工作原理 ...................................................................................... 9 2.3.2 Nand flash主要内设命令详细介绍 .................................................................... 10 2.4 以太网接口介绍 ........................................................................................................ 11 2.4.1 以太网模块特点 ................................................................................................... 11 2.4.2 以太网模块初始化 ............................................................................................... 12 2.5 软件开发环境的介绍 ................................................................................................... 13

3 U-BOOT的移植 ........................................................................................... 14

3.1 U-BOOT简介 ................................................................................................................. 14 3.1.1 LPC2468OEM_Board中几个重要的文件 .......................................................... 16 3.1.2 U-Boot的启动流程 .............................................................................................. 17 3.2 U-BOOT的配置和编译 ................................................................................................... 19 3.3 U-BOOT的移植 ............................................................................................................... 19 3.4 U-BOOT NOR FLASH驱动的移植 .................................................................................. 21 3.5 NAND FLASH 驱动移植 .............................................................................................. 23 3.6 U-BOOT网卡驱动移植 ................................................................................................. 26

4 UCLINUX系统的移植 ................................................................................ 30

4.1 基本内核的移植 ........................................................................................................... 30 4.2 LINUX NOR FLASH驱动移植 ...................................................................................... 32 4.2.1 Linux mtd简介 ..................................................................................................... 32 4.2.2 Nor flash驱动移植 ............................................................................................... 33 4.2.3 JFFS2文件系统的制作 ........................................................................................ 37 4.3 LINUX网卡驱动移植 .................................................................................................. 38 4.3.1 网卡初始化 ........................................................................................................... 39 4.3.2 网卡打开 ............................................................................................................... 40 4.3.3 网卡发送 ............................................................................................................... 40

3

桂林电子科技大学毕业设计(论文)报告用纸 第 4 页 共 56 页

4.3.4 网卡接收 ............................................................................................................... 40 4.3.5 网卡关闭 ............................................................................................................... 41 4.3.6 网卡退出 ............................................................................................................... 41 4.3.7 LPC2468网卡驱动移植 ....................................................................................... 41 4.4 嵌入式WEB服务器BOA的移植 ............................................................................... 43 4.4.1 Boa简介 .............................................................................................................. 43 4.4.2 Boa编译配置 ..................................................................................................... 43 4.4.3 Boa目录的建立 ................................................................................................... 44 4.4.4 Boa的编译 ........................................................................................................... 44

5 软件开发过程 ............................................................................................... 45

5.1 DS18B20驱动程序设计 ............................................................................................... 45 5.1.2 DS18B20硬件连接 .............................................................................................. 47 5.1.3 DS18B20驱动介绍 ............................................................................................. 47 5.1.4 温度应用程序 ....................................................................................................... 49 5.2 LPC2478 DA驱动设计 ................................................................................................ 51 5.2.1 LPC2478 DA驱动测试 .................................................................................... 51 5.3 WEB程序设计 ................................................................................................................ 51 5.3.1 CGI简介 .............................................................................................................. 51 5.3.2 CGI程序工作原理 ............................................................................................ 52 5.3.3 WEB程序框图 ................................................................................................... 52 5.3.4 WEB程序介绍 .................................................................................................... 53

6 结论 ............................................................................................................... 54 谢 辞 ................................................................................................................. 55 参考文献 ............................................................................................................. 56

4

桂林电子科技大学毕业设计(论文)报告用纸 第 5 页 共 56 页

引言

我国是粮食生产大国,同时我国地域辽阔,气候差异大,粮食的安全存储是一项重要任务。环境的温度、湿度、压力等都是影响工农业生产的较重要的因素。如储存粮食的仓库中的温度、湿度的正常与否将直接影响到粮食可以储存的时间以及粮食的质量;在酿造业中,环境稍微有点变化就会有副产品制造出来,影响产品质量,因此酵池中的温度、压力更要进行精确的控制。温度是一个基本的物理量,它是农业生产过程中最普遍、最重要的工艺参数之一。随着农业的不断发展,对温度测量的要求越来越高,而且测量范围也越来越广,因此对温度检测技术的要求也越来越高。粮库多点温度监控系统也向着智能化方向发展,有效减少粮食在储存时的损失,成为了现代化粮食保存所必需的。

随着嵌入式技术的发展,嵌入式系统接入网络已成为其应用的一个重要方向。越来越多的嵌入式系统选择Web 服务器的方式与Internet 进行数据交换。而以太网是构筑现代Internet 网络的基础,因此选择基于以太网的嵌入式Web 服务器技术实现数据交换将具有较高的实用价值。本文主要针对ARM7TDMI核的微处理器芯片,结合嵌入式Web 服务器技术,提出了基于以太网的远程温度监控系统的设计方案。本方案采用LPC2478 uCliunx + WEB + CGI技术来实现对温度进行监控。

5

桂林电子科技大学毕业设计(论文)报告用纸 第 6 页 共 56 页

1 项目设计方案

本设计的系统框图如下所示:

温度传感器 喇叭 LPC2478 uClinux Web服务器 图1.1系统框图

实施方案:

LPC2478 和 uCliunx 实现对 DS18B20温度传感器进行温度的采集,通过Web浏览器访问Boa Web服务器可以查看到温度的情况,然后在通过Web CGI对LPC2478板子上的DAC(DAC与喇叭连接)进行控制,来模拟对温度的控制。

用户用web浏览器访问板子的web服务器,然后发送命令对板子进行控制。 监测温度:将温度以网页的形式显示出来,网页每两秒刷新一次并监测温度,如果大于预设值则驱使DAC输出报警。

升加1°C:用户点击该按钮即可实现对DAC的控制,是喇叭发出声响,来模拟对温度的控制。

降低1°C:用户点击该按钮即可实现对DAC的控制,是喇叭发出声响,来模拟对温度的控制。这三者的频率都不一样。

WEB系统框图如下:

Web客户端监控

图1.2 WEB系统框图

6

桂林电子科技大学毕业设计(论文)报告用纸 第 7 页 共 56 页

2 开发环境介绍

2.1 LINPO-PS LPC_2478介绍

LINPO-PS LPC_2478实验板是上海丰宝电子科技有限公司设计的ARM7系列实验板之一,采用了恩智浦公司基于ARM7TDMI-S内核、单电源供电、LQFP208封装的LPC2478,具有JTAG仿真调试,ISP编程等功能。

实验板上提供了一些键盘、数码管、LED、喇叭等常用功能部件,还具有RS232 接口电路、I2C 存储器电路、USB OTG和HOST电路、CAN总线电路、SD卡接口、I2S接口电路、CAN总线电路、LCD接口电路以及10M/100M以太网电路。另外,用户也可以更换兼容的MCU 进行仿真调试,如LPC2468、LPC2470等。还为用户引出I/O 接口以及地址和数据总线接口,极大地方便了用户进行32 位ARM 嵌入式系统的开发实验。

2.2 NORFLASH介绍

系统采用芯片AM29LV160DB是16位的存储宽度,因此芯片的A0~A19脚与总线的A1~A20脚连接。片选信号使用CS0,这样本片NOR Flash被配置为外部静态存储器的Bank0,其地址范围为0x80000000~0x801FFFFF。如下图所示:

图2.1

7

桂林电子科技大学毕业设计(论文)报告用纸 第 8 页 共 56 页

2.2.1 AM29LV160DB简介

AM29LV160DB为2MB的NOR Flash芯片,使用电平为2.7V~3.6V,存取时间70ns,封装形式为48脚的FBGA或TSOP封装。

AM29LV160DB一共提供了35个扇区,其中4~34号扇区为64Kbyte或32Kword。对扇区的操作为字节模式或字模式。字节模式时,每个扇区的存储单元大小为8bit;字模式时,扇区的存储空间寻址范围小一半,但每个地址单元的数据大小为16bit。 2.2.2 AM29LV160DB的操作命令字

对NOR Flash存储器的数据读操作跟普通的RAM是一样的。但进行写、擦除、查询等操作时要使用写入组合命令字来实现。AM29LV160DB的命令字见下图。

图2.2

例如:当要查询芯片的生产厂商ID号时,在字模式下,前三个周期分别向地址0x555、0x2AA、0x555处写入数据0xAA、0x55、0x90,第四个周期从地址0处即可获得厂商ID。

2.2.3 Nor flash的映射

LPC2400系列芯片具备外部存储器接口,通过外部存储器控制器(EMC)可以扩展两组共8个Bank的存储器组(静态存储器bank0~bank3,动态存储器bank0~bank3)。对于外扩的FLASH(NOR)型,则可以使用LDR指令读取数据,但是不能使用STR指令直接写数据,而是需要根据FLASH芯片写操作时序进行控制,实现FLASH的擦除编程。

8

桂林电子科技大学毕业设计(论文)报告用纸 第 9 页 共 56 页

2.3 Nand flash介绍

NAND Flash与总线的连接与SDRAM和NOR Flash的连接不同,地址线只用了A21和A22做时钟使能和地址使能信号,数据线只用8位作为IO线。分别与总线连接。片选信号使用CS1,这样本片NAND Flash被配置为外部静态存储器的Bank1,其地址范围为0x81000000~0x81FFFFFF。其硬件连接图如下:

图2.3

2.3.1 Nand flash芯片工作原理

Nand flash芯片型号为K9F2G08U0M,存储容量为256M ×8bit (256M字节),采用块页式存储管理。8个I/O引脚充当数据、地址、命令的复用端口。

芯片内部存储布局及存储操作特点

一片Nand flash为一个设备(device), 其数据存储分层为: 1 Block = 64 Pages (128K + 4k) Byte 1 Page = (2K + 64)Bytes

1 Block = (2K + 64)B x 64 Pages= (128K + 4K) Bytes

1 Device = (2K+64)B x 64Pages x 2048 Blocks= 2112 Mbits=264MB

在每一页中,最后64个字节(又称OOB)用于Nand Flash命令执行完后设置状态。 重要芯片引脚功能 I/O0I/O7:复用引脚。

可以通过它向nand flash芯片输入数据、地址、nand flash命令以及输出数据和操作

9

桂林电子科技大学毕业设计(论文)报告用纸 第 10 页 共 56 页

状态信息。

CLE(Command Latch Enable): 命令锁存允许。 ALE(Address Lactch Enable): 地址锁存允许。 CE:芯片选择。 RE:读允许。 WE:写允许。

WP:在写或擦除期间,提供写保护。 R/B:读/忙输出。

2.3.2 Nand flash主要内设命令详细介绍

Nand Flash命令执行是通过将命令字送到Nand Flash控制器的命令寄存器来执行。 Nand Flash的命令是分周期执行的,每条命令都有一个或多个执行周期,每个执行周期都有相映代码表示该周期将要执行的动作。

主要命令有:Read 1、Read 2、Read ID、Reset、Page Program、Block Erase、Read Status。

详细介绍如下: 1. Read 1:

功能:表示将要读取Nand flash存储空间中一个页的前半部分,并且将内置指针定位到前半部分的第一个字节。 命令代码:00h 2. Read 2:

功能:表示将要读取Nand flash存储空间中一个页的后半部分,并且将内置指针定位到后半部分的第一个字节。 命令代码:30h 3. Read ID:

功能:读取Nand flash芯片的ID号 命令代码:90h 4. Reset:

功能:重启芯片。 命令代码:FFh 5. Page Program:

功能:对页进行编程命令, 用于写操作。

10

桂林电子科技大学毕业设计(论文)报告用纸 第 11 页 共 56 页

命令代码:写入80h开始编程模式(写入模式),接下来写入地址和数据; 最后写入10h表示编程结束. 6. Block Erase

功能:块擦除命令。

命令代码:首先写入60h进入擦写模式,然后输入块地址; 接下来写入D0h, 表示擦写结束.

7. Read Status

功能:读取内部状态寄存器值命令。 命令代码:70h

2.4 以太网接口介绍

以太网模块包含一个功能齐全的10Mbps或100Mbps以太网MAC(媒体访问控制器),这个以太网MAC通过使用DMA硬件加速功能来提供优化的性能。以太网模块的功能包括大量的控制寄存器组、半双工或全双工操作、流控制、控制帧、用于重新发送的硬件加速功能、接收包过滤以及LAN上的唤醒。利用分散-集中式(Scatter-Gather)DMA进行自动的帧发送和接收操作,分担(off-load)了来自CPU的大量操作。以太网模块和CPU共享一个特定的AHB子系统(AHB2),该系统用于访问以太网SRAM来获得以太网数据、控制和状态信息。LPC2400中的其它所有AHB通信均在另一个AHB子系统上完成,从而有效地将以太网活动与系统的其它部分分开。以太网DMA在没有被USB模块使用的情况下,也可以通过外部存储器控制器来访问片外存储器以及AHB1上的SRAM。但是,当使用以太网SRAM之外的存储器,尤其是片外存储器时,将减慢以太网访问存储器的速度并增加AHB1的负载。以太网模块使用MII(媒体独立接口)或RMII(简化的MII)协议以及片上MIIM(媒体独立接口管理)串行总线来连接片外的以太网PHY。 2.4.1 以太网模块特点

以太网标准支持:

- 10M或100Mbps PHY器件,包括10 Base-T、100 Base-TX、100 Base-FX和100 Base-T4;

- 完全遵循IEEE标准802.3;

- 完全兼容802.3x全双工流控和半双工背压技术(back pressure); - 灵活的发送帧和接收帧选项; - 支持VLAN帧。

11

桂林电子科技大学毕业设计(论文)报告用纸 第 12 页 共 56 页

? 存储器管理:

- 独立的发送和接收缓冲区存储器,映射到共用的SRAM; - 带有分散/集中式DMA的DMA管理器以及帧描述符数组; - 通过缓冲和预取来实现存储器通信的优化。

? 以太网增强的功能: - 接收进行过滤;

- 发送和接收均支持多播帧(multicast frame)和广播帧(broadcast frame); - 发送操作可选择自动FCS插入(CRC);

- 可选择在发送操作时自动进行帧填充(frame padding); - 发送和接收均支持超长帧传输,允许帧长度为任意值; - 多种接收模式;

- 出现冲突时自动退避(backoff)并重新传送帧信息; - 通过时钟切换实现功率管理;

- 支持“LAN上唤醒”的功率管理功能以便将系统唤醒,该功能可使用接收滤波器或魔法帧(magic frame)检测滤波器来实现。

? 物理接口:

- 通过标准的媒体独立接口(MII)或标准的简化MII(RMII)接口来连接外部PHY芯片,该特性可通过软件来选择;

- 通过媒体独立接口管理(MIIM)接口可访问PHY寄存器。 2.4.2 以太网模块初始化

复位后,以太网软件驱动程序需对以太网模块进行初始化。在初始化过程中,软件需完成:

? 将软件复位条件从MAC中移除; ? 通过MAC的MIIM接口配置PHY; ? 选择RMII或MII模式;

? 配置发送和接收DMA引擎,包括描述符数组; ? 配置MAC中的主机寄存器(MAC1、MAC2等等); ? 使能接收和发送数据通道。

12

桂林电子科技大学毕业设计(论文)报告用纸 第 13 页 共 56 页

2.5 软件开发环境的介绍

操作系统:

Windows XP ,Red Hat Enterprise Linux 5。 使用软件:

虚拟机软件vmware_652,串口工具DNW,JLinkARM_V374m, IAR 4.42A 交叉编译工具:

arm-linux-tools-20061213.tar.gz。 使用源码:: linux-2.6.21.tar.bz2; uClinux-dist-20070130.tar.gz; linux-2.6.21-uc0-lpc2468.diff; linux-2.6.21-uc0-big.patch.gz;

uClinux-dist-20070130-nxp-lpc2468.tgz; u-boot-1.1.6.tar.gz.

13

桂林电子科技大学毕业设计(论文)报告用纸 第 14 页 共 56 页

3 U-Boot的移植

系统的移植是本项目的最重要的工作,系统的移植完成了,该项目可以说完成了很大的一部分。系统的移植包括两大部分的移植工作:u-boot的移植和uClinux的移植。

其中U-boot的移植又包括下面三部分的工作: (1)、nor flash的移植; (2)、nand flash的移植; (3)、网卡驱动的移植;

uClinux系统的移植包括下面四部分的工作: (1)、nor flash的移植; (2)、JFFS2文件系统的制作; (3)、网卡驱动的移植; (4)、boa web服务器的移植;

本章先介绍U-Boot的移植,第四章介绍linux系统的移植。

3.1 U-Boot简介

BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,BootLoader是严重地依赖于硬件而实现的,因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。

常用的Bootloader有U-Boot、vivi、Redboot、ARMboot、Blob、Bootldr等。通常要在特定的嵌入式平台上使用这些Bootloader,需要做一定的编程移植工作。

U-Boot,全称Universal Boot Loader,是一个遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人-德国DENX软件工程中心Wolfgang Denk-本人精湛的专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BootLoader移植工作的嵌入式开发人员正如火如荼地将各种不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。

U-Boot的源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中就能体现这一点。但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS等嵌入式操作系统。其目前要

14

桂林电子科技大学毕业设计(论文)报告用纸 第 15 页 共 56 页

支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS等。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。 其主要特点有: ① 开放源码; LynxOS;

③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; ④ 较高的可靠性和稳定性;

⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; ⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;

⑦ 较为丰富的开发调试文档与强大的网络技术支持。

u-boot源代码的目录结构: 目 录 board cpu lib_xxx 特 性 解释说明

② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS,

平台依赖 存放开发板相关的目录文件 平台依赖 存放CPU相关的目录文件,如mpc8xx、arm720t、arm920t、i386等 平台依赖 Xxx表示某种体系结构,如lib_arm存放对ARM体系结构通用的文件,lib_ppc存放对PowerPC体系结构通用的文件等。这类目录共有12个。 include common 通用 通用 头文件和开发板配置文件 通用的多功能函数实现 通用的库函数实现 存放网络程序 存放文件系统程序 硬盘接口程序 通用的设备驱动程序,如串口、RTC、USB等 lib_generic 通用 net fs disk drivers 通用 通用 通用 通用 15

桂林电子科技大学毕业设计(论文)报告用纸 第 16 页 共 56 页

post examples tools doc

通用 存放上电自检程序 应用例程 一些独立运行的应用程序的例子,如helloworld 工具 文档 存放一些制作映像的工具,如mkimage 开发使用文档 U-Boot的源代码包含对几十种处理器、几百种开发板的支持,对于特定的开发板,配置编译只需要改动其中平台依赖的部分程序即可。 3.1.1 LPC2468OEM_Board中几个重要的文件

① cpu/arm720t/start.S:在flash中执行的引导代码,负责初始化硬件环境,把U-Boot从flash加载到RAM中去,然后跳到lib_arm/board.c中的start_armboot中去执行。

② lib_arm/board.c:U-Boot的初始化流程,尤其是U-Boot用到的全局数据结构gd、bd的初始化,以及设备和控制台的初始化。

③ board/LPC2468OEM_Board/lowlevelsys_init.c、nand.c、eth.c等:在board目录下的代码都是严重依赖于目标板的。对于不同的CPU、SOC、ARCH来说,U-Boot都可以有相对通用的代码。但是板子的构成却是非常多样的,主要的差别是内存地址、flash型号、外围芯片如网络等等。以上几个文件分别用于LPC2468OEM_Board板的低级初始化、nand flash驱动、网络驱动等。如果要给开发板修改驱动程序或添加新的设备驱动程序,即添加在此处。

④ include/configs/ LPC2468OEM_Board.h:这个头文件中主要定义了两类变量。一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等,主要用来决定是否编译某些文件或者函数。另一类是参数,前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。这些常数参量主要用来支持通用目录中的代码,定义板子资源参数。

这两类宏定义对U-Boot的移植性非常关键,开发板上的相关硬件设备的启用与否,是通过编译条件判断#ifdef或#ifndef来选择配置编译的。U-Boot的命令也要通过这个配置头文件来进行配置:比如要添加ping命令,就必须添加CFG_CMD_NET和CFG_CMD_PING,不然common/cmd_net.c就不会被编译了。

⑤ board/LPC2468OEM_Board/config.mk和board/LPC2468OEM_Board/u-boot.lds:这两个文件跟U-Boot的内存分配有关。config.mk中的TEXT_BASE项定义了U-Boot的起始地址。u-boot.lds是编译的链接脚本文件,定义了链接生成U-Boot映像时各程序段的起始地址、内存分配、对齐方式等。

16

桂林电子科技大学毕业设计(论文)报告用纸 第 17 页 共 56 页

⑥ board/LPC2468OEM_Board /Makefile:板级的编译配置文件。使用该文件可以配置board目录中的哪些文件被编译进映像中。 3.1.2 U-Boot的启动流程

对于LPC2468平台来说,U-Boot启动流程主要是在两个文件中:cpu/arm720t/start.S和lib_arm/board.c。

start.S是U-Boot的引导代码,相当于常说的bootloader中的stage1,负责初始化硬件环境,把u-boot加载到RAM中去,然后跳到相关入口中去执行。

start.S完成的主要工作有: ① 定义程序入口;

一个可执行的Image 必须有一个并且只能有一个唯一的全局入口点。通常这个入口放在Rom(flash)的0x0 地址。start.S 中是依靠一个.globl _start标号来定义的。 ② 设置异常向量(Exception Vector);

异常向量表,也可称为中断向量表,必须是从地址0开始连续的存放。如ARM体系结构中包括复位(reset)、未定义处理(undef)、软件中断(SWI)、预取指令错误(Pabort)、数据错误(Dabort)、保留、以及IRQ、FIQ等异常模式。 ③ 初始化硬件环境;

代码中依次顺序为:进入SVC模式,擦除I/D Cache,关闭MMU部件,关闭中断,设置PLL(phase lock loop)时钟和存储器。相关代码见源代码中的cpu_init_crit过程。 ④ 内存重定位;

⑤ 转到C语言函数入口执行;

board.c里的start_armboot()函数是U-Boot执行的第一个C语言函数,完成系统初始化工作,进入主循环,处理用户输入的命令。这里只简要列出其主要执行的函数流程:

void start_armboot (void) {

/* 给全局数据变量gd安排空间*/

gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); memset ((void*)gd, 0, sizeof (gd_t)); /* 给开发板数据变量gd->bd安排空间*/ gd->bd = (bd_t*)((char*)gd - sizeof(bd_t)); memset (gd->bd, 0, sizeof (bd_t));

monitor_flash_len = _bss_start - _armboot_start;//取u-boot的长度。 /* 顺序执行init_sequence数组中的初始化函数 */

17

桂林电子科技大学毕业设计(论文)报告用纸 第 18 页 共 56 页

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) { hang (); } }

/*配置可用的Flash */ size = flash_init (); ??

/* 初始化堆空间 */

mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); /* 重新定位环境变量, */ env_relocate ();

/* 从环境变量中获取IP地址和以太网接口MAC 地址*/ gd->bd->bi_ip_addr = getenv_IPaddr (\ ……

/* 设备初始化 */ devices_init ();

/* 跳转表初始化 */ jumptable_init ();

/* 完整地初始化控制台设备 */ console_init_r ();

/* 使能中断处理 */ enable_interrupts ();

/* 通过环境变量初始化 */

if ((s = getenv (\

load_addr = simple_strtoul (s, NULL, 16); }

/* main_loop()循环不断执行 */ for (;;) {

main_loop (); /* 主循环函数处理执行用户命令 -- common/main.c */

} }

18

桂林电子科技大学毕业设计(论文)报告用纸 第 19 页 共 56 页

3.2 U-Boot的配置和编译

U-Boot工程的可配置性和移植性可以分为两层:一是由目录顶层的Makefile来实现,配置工程要包含的文件和文件夹,用什么编译器等等。二是由目标板的配置头文件来实现源码级的可配置性,通用性。主要使用的是#ifdef #else #endif 之类来实现的。 U-Boot的源码是通过GCC和Makefile来组织编译的。运行make命令以后,所有子目录的编译连接都由顶层目录的Makefile文件来确定,首先由顶层目录下的Makefile设置开发板定义,然后递归的调用各级子目录下的Makefile,最后把编译过的程序链接成U-Boot映像。

在执行make之前,先要执行make $(board)_config对工程进行配置,以确定特定于目标板的各个子目录和头文件。

$(board)_config:是Makefile 中的一个伪目标,它传入指定的CPU,ARCH,BOARD,SOC参数去执行mkconfig脚本。这个脚本的主要功能在于连接目标板平台相关的头文件夹,生成config.h文件包含板子的配置头文件。使得Makefile能根据目标板的这些参数去编译正确的平台相关的子目录。

执行make LPC2468OEM_Board_config,即可完成目标板的配置,并写入顶层Makefile中。

Makefile文件中的相关代码为:

LPC2468OEM_Board_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm720t LPC2468OEM_Board NULL lpc2468

顶层的Makefile还要定义交叉编译器、U-Boot所依赖的目标文件、映像编译的依赖关系等。缺省的编译目标为all,包括u-boot(U-Boot映像的ELF格式)、u-boot.bin(U-Boot映像的原始二进制格式)、u-boot.srec(U-Boot映像的S-Record格式)、System.map(U-Boot映像的符号表)一共四个文件。U-Boot通过ld命令按照System.map地址表把目标文件组装成u-boot。u-boot.bin和u-boot.srec依赖于u-boot,3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式。一般u-boot.bin最为常用,直接按照二进制格式下载,并且按照绝对地址烧写到Flash中就可以了。u-boot和u-boot.srec都自带地址定位信息。

3.3 U-Boot的移植

U-Boot能够支持多种体系结构的处理器,而且它能够支持的开发板也已经越来越多。由于Bootloader程序是完全依赖于底层硬件平台的,所以在一块新电路板上使用

19

桂林电子科技大学毕业设计(论文)报告用纸 第 20 页 共 56 页

U-Boot程序时,需要做一定的移植工作。

开始移植U-Boot之前,先要熟悉硬件电路板和处理器。确认U-Boot是否已经支持新电路板的处理器和I/O设备。假如U-Boot已经支持一块非常相似的电路板,那么移植的过程将会非常简单。

移植U-Boot工作主要是:添加开发板硬件相关的文件、配置选项,然后配置编译。 开始移植之前,需要先分析一下U-Boot已经支持的开发板,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围接口。还要验证一下这个参考开发板的U-Boot,至少能够配置编译通过。

我们是用EA公司提供的uboot 1.1.6源码进行移植,主要的工作包括norflash驱动,nandflsh驱动,网卡驱动的移植以及一些相关文件的修改。 [piaozhiye@localhost ~]$ tar -xzvf u-boot-1.1.6.tar.gz [piaozhiye@localhost ~]$ cd u-boot-1.1.6

[piaozhiye@localhost u-boot-1.1.6]$ make LPC2468OEM_Board_config [piaozhiye@localhost u-boot-1.1.6]$make

将/u-boot-1.1.6/common/cmd_bootm.c:167行注释掉否则会出现以下错误,它只是打印一些信息 无关紧要。

//printf(\%x %x\\r\\n\ADDRESS_PAGE_0, CACHE_PAGE_CTRL, CACHE_SETTINGS);

cmd_bootm.c: In function `do_bootm':

cmd_bootm.c:167: error: `ADDRESS_PAGE_0' undeclared (first use in this function) cmd_bootm.c:167: error: (Each undeclared identifier is reported only once cmd_bootm.c:167: error: for each function it appears in.)

cmd_bootm.c:167: error: `CACHE_PAGE_CTRL' undeclared (first use in this function)

cmd_bootm.c:167: error: `CACHE_SETTINGS' undeclared (first use in this function) make[1]: *** [cmd_bootm.o] 错误 1

将/u-boot-1.1.6/lib_arm/board.c:397和398行注释掉,USB 相关的。我们没有用到USB将其注释掉。 //usbhw_init(); //usbstatus_check();

/home/piaozhiye/u-boot-1.1.6/lib_arm/board.c:397: `usbhw_init'

/home/piaozhiye/u-boot-1.1.6/lib_arm/board.c:398: `usbstatus_check'

到此即可编译通过,uboot也可以在串口打印出启动信息。

20

undefined undefined

reference reference

to to

桂林电子科技大学毕业设计(论文)报告用纸 第 21 页 共 56 页

3.4 U-Boot Nor flash驱动的移植

Nor flash在uboot中的配置信息:

/*----------------------------------------------------------------------- * FLASH and environment organization */

#define CFG_MAX_FLASH_BANKS2/* max number of memory banks*/ #define CFG_MAX_FLASH_SECT35/* max number of sectors on one chip*/

/* timeout values are in ticks */

#define CFG_FLASH_ERASE_TOUT(2*CFG_HZ) /* Timeout for Flash Erase */ #define CFG_FLASH_WRITE_TOUT(2*CFG_HZ) /* Timeout for Flash Write */

原来代码中是SST39VF3201,现在板子用的是AM29LV160DB。板子上有两个flash一个是内部flash大小为500KB基址是0x00000000另一个是外部flash大小为1MB基址是0x80000000,我们把编译好后的uboot烧写到内部flash中。

它们的操作函数在u-boot-1.1.6/LPC2468OEM_Board/flash.c中实现。我们对flash.c做相应的修改即可。修改相应的flash初始化的信息,主要是扇区大小分布和一些相关信息。如下所示: ulong flash_init (void) { int j, k; ulong size = 0; ulong flashbase = 0;

flash_info[0].flash_id = (PHILIPS_LPC2468 & FLASH_VENDMASK); flash_info[0].size = 0x007D000;/* 512 - 12 KB */内部flash flash_info[0].sector_count = 27; memset (flash_info[0].protect, 0, 27); flashbase = 0x00000000; for (j = 0, k = 0; j < 8; j++, k++) { flash_info[0].start[k] = flashbase; flashbase += 0x00001000;

21

桂林电子科技大学毕业设计(论文)报告用纸 第 22 页 共 56 页

}

for (j = 0; j < 14; j++, k++) { flash_info[0].start[k] = flashbase; flashbase += 0x00008000; }

for (j = 0; j < 5; j++, k++) { flash_info[0].start[k] = flashbase; flashbase += 0x00001000; }

size += flash_info[0].size;

// Note the bank offsets are defined as follow:

// - 1st Bank: 0x00000000 (images at 0x00100000, 0x00800000, 0x00900000) // - 2nd Bank: 0x00400000 (images at 0x00500000, 0x00C00000, 0x00D00000) // - 3rd Bank: 0x00200000 (images at 0x00300000, 0x00A00000, 0x00B00000) // - 4th Bank: 0x00600000 (images at 0x00700000, 0x00E00000, 0x00F00000) flash_info[1].flash_id = (AMD_MANUFACT & FLASH_VENDMASK); flash_info[1].size = 0x00200000; /* 1st 2 MB */ 外部flash flash_info[1].sector_count = 35; memset (flash_info[1].protect, 0, 35); flashbase = AMD_BASEADDR; for (j=0; j<1; j++) {

flash_info[1].start[j] = flashbase; flashbase += 0x2000;/* 8 Kw sectors */ }

for (j=1; j<3; j++) {

flash_info[1].start[j] = flashbase; flashbase += 0x1000;/* 4 Kw 2 sectors */ }

for (j=3; j<4; j++) {

flash_info[1].start[j] = flashbase; flashbase += 0x4000;/* 16 Kw 1 sectors */ }

22

桂林电子科技大学毕业设计(论文)报告用纸 第 23 页 共 56 页

for (j=4; j<35; j++) {

flash_info[1].start[j] = flashbase; flashbase += 0x8000;/* 32 Kw sectors */ }

size += flash_info[1].size;

/* Protect monitor and environment sectors */ flash_protect (FLAG_PROTECT_SET, 0x0,

0x0 + monitor_flash_len - 1, &flash_info[0]);

#ifdef CFG_ENV_IS_IN_FLASH flash_protect (FLAG_PROTECT_SET, CFG_ENV_ADDR,

CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[0]); #endif

return size; }

到此uboot的nor flash驱动可以跑起来了。

3.5 NAND Flash 驱动移植

NAND Flash 驱动是从linux2.6内核移植过来的,因此它是按照linux MTD 系统层次结构来编写的(关于MTD的介绍将在移植linux驱动的时候做介绍)。它在MTD层下实现了通用的NAND驱动(主要是drivers/nand/nand_base.c文件实现的),因此它的芯片级的nand驱动比较容易。

Nand驱动在include/configs/LPC2468OEM_Board.h文件中的配置

#define CONFIG_COMMANDS(CONFIG_CMD_DFL | CFG_CMD_FAT | CFG_CMD_NET | CFG_CMD_MMC | CFG_CMD_NAND | CFG_CMD_DHCP | CFG_CMD_PING | CFG_CMD_I2C)

23

桂林电子科技大学毕业设计(论文)报告用纸 第 24 页 共 56 页

/*

* NAND Flash */

#define CFG_MAX_NAND_DEVICE1 #define NAND_MAX_CHIPS1

#define CFG_NAND_BASE0x81000000 //基地址

需要在board/LPC2468OEM_Board /nand.c中实现三个函数:

static void hwcontrol(struct mtd_info *mtd, int cmd)完成硬件控制,

static void nand_select_chip(struct mtd_info * mtd , int chip)完成芯片选择;void board_nand_init(struct nand_chip *nand)完成nand的初始化工作,具体代码见源代码。

#include #include

#include /*

* CLE at A21 * ALE at A22 CE P[0] 25 */

#define MASK_CLE (1<<21) #define MASK_ALE (1<<22)

static void hwcontrol(struct mtd_info *mtd, int cmd) {

struct nand_chip *this = mtd->priv; ulong IO_ADDR_W = (ulong) this->IO_ADDR_W;

IO_ADDR_W &= ~(MASK_ALE|MASK_CLE);

switch (cmd) {

case NAND_CTL_CLRNCE: IOCLR0 |=(1<<25); break;

case NAND_CTL_SETNCE: IOSET0 |=(1<<25);

24

桂林电子科技大学毕业设计(论文)报告用纸 第 25 页 共 56 页

break; case NAND_CTL_SETCLE: IO_ADDR_W |= MASK_CLE; break;

case NAND_CTL_SETALE: IO_ADDR_W |= MASK_ALE; break; }

this->IO_ADDR_W = (void *) IO_ADDR_W; }

static void nand_select_chip(struct mtd_info * mtd , int chip) {

struct nand_chip *this = mtd->priv; switch(chip) { case -1:

this->hwcontrol(mtd, NAND_CTL_SETNCE); break; case 0:

this->hwcontrol(mtd, NAND_CTL_CLRNCE); break; } }

void board_nand_init(struct nand_chip *nand) {

/* IO_ADDR_R and IO_ADDR_W set by nand-driver using CFG_NAND_BASE */ nand->hwcontrol = hwcontrol; /* nand->dev_ready = ; */

nand->eccmode = NAND_ECC_SOFT; //采用软件方式 nand->chip_delay = 25;/* us */

nand->options = NAND_SAMSUNG_LP_OPTIONS; //nand->cmdfunc = nand_command; nand->select_chip = nand_select_chip;

25

桂林电子科技大学毕业设计(论文)报告用纸 第 26 页 共 56 页

}

3.6 U-Boot网卡驱动移植

u-boot网络上层协议通过调用eth_init,eth_send,eth_rx,eth_halt函数实现以太网控制器的初始化、发送、接收数据和停止功能。对于不同的网络控制器,u-boot的驱动开发就是对这几个函数的编写。

以太网的移植是相对来说是比较难的,它是用DP83848C的芯片。 LPC2478和DP83848驱动部分: // 向DP83848的寄存器写一个值

void write_PHY (int PhyReg, int Value); // 读DP83848的寄存器值

unsigned short read_PHY (unsigned char PhyReg) ; // 接收缓冲区初始化,此处使用的是LAN控制器内的16KBRAM void rx_descr_init (void); // 发送缓冲区初始化,功能同上类似 void tx_descr_init (void) ; //发送MAC数据

static int mac_start_xmit(volatile void* buf, int length); //接收MAC数据

static void mac_rx(void); //MAC中断用来发送和接收数据 static void mac_interrupt(void);

u-boot提供了几个接口函数,移植的工作是完成这几个函数:

int eth_init(bd_t *bis);//以太网初始化

int eth_send(volatile void *packet, int length);//发送数据 int eth_rx(void); //接收数据 void eth_halt(void);//设备停止

eth_init主要完成下面的操作: (1) 设置MAC地址;

(2) 初始化硬件:使能MAC接口,设置RMII管理时钟频率,复位所有的MAC逻辑,

26

桂林电子科技大学毕业设计(论文)报告用纸 第 27 页 共 56 页

初始化MAC,设置最大入口个数、冲突窗和间隙,RMII/MII建立,复位物理层,使能链路层速率自动协商机制,检查链路状态,试验并配置100M/10M和全双工/半双工工作模式,建立接收和发送缓冲,使能广播功能,打开中断,打开接收和发送。

eth_send 通过以太网发送一个数据块。主要完成下面的操作: (1) 准备空闲缓冲区; (2) 将数据移动到缓冲区中; (3) 取下一个要发送数据的索引。

eth_rx 通过以太网接收一个数据块。主要完成下面的操作: (1) 判断是否已经收到一个帧;

(2) 若收到帧,则接收。接收操作包括:接收帧,获得帧的大小,将帧传给协议层。

eth_halt函数主要完成下面的操作: (1) 物理复位;

(2) 所有的MAC逻辑复位; (3) 关闭MAC时钟。

uboot中板子的IP设为192.168.0.1,子网掩码为255.255.255.0,服务器的IP192.168.0.2 ,以太网地址为0:1a:f1:00:00:00。如下所示:

图3.1

在PC机上架设好TFTP服务器(192.168.0.2),由于DP83848在配置成100Mbs的时候,会有一些问题,因此将将PC机的网卡设置为10Mbs的速率,之后就可以使用TFTP将编译好的镜像通过网线下载到flash中。

更详细的介绍见源代码。

简单介绍一下所用的配置文件include/configs/LPC2468OEM_Board.h //波特率

#define CONFIG_BAUDRATE38400 //启动参数

#define CONFIG_BOOTARGS \initrd=0xa1800000,4000k console=ttyS0,38400N8\//从norflash启动

#define CONFIG_BOOTCOMMAND\ \

#define CFG_MEMTEST_START0xA0000000/* memtest works on*/ #define CFG_MEMTEST_END0xA2000000 /* 32 MB in DRAM*/ #define CFG_ALT_MEMTEST

27

桂林电子科技大学毕业设计(论文)报告用纸 第 28 页 共 56 页

/* Memory映射

* Physical Memory Map */

#define CONFIG_NR_DRAM_BANKS1 /* we have 1 bank of DRAM */ #define PHYS_SDRAM_1 0xA0000000 /* SDRAM Bank #1 */ #define PHYS_SDRAM_1_SIZE0x02000000 /* 32 MB SDRAM */

#define PHYS_FLASH_1 0x80000000 /* Flash Bank #1 */ #define PHYS_FLASH_SIZE0x00200000 /* 2 MB */

#define CFG_FLASH_BASEPHYS_FLASH_1 /*

* Default environment settings */

#define CONFIG_EXTRA_ENV_SETTINGS \\ \a1000000 linux.bin;tftpboot a1800000 romfs.bin;bootm a1000000\\0\

\80000000 a1000000 c0000;cp.b 800c0000 a1800000 c0000;bootm a1000000\\0\

\400000;bootm a1000000\\0\

\mmc 0 a1000000 linux.bin;fatload mmc 0 a1800000 romfs.bin;bootm a1000000\\0\ \a1000000 u-boot.bin;protect off 0 2ffff;erase 0 2ffff;cp.b a1000000 0 $(filesize)\\0\

\erase;tftpboot a1000000 linux.bin;nand write a1000000 0 200000;tftpboot a1000000 romfs.bin;nand write a1000000 200000 400000\\0\

\ \ \ \

从上面可以看出来nor_boot 就是将0x80000000开始的0xd0000个字节(linux内核)复制到a1000000(SDRAM)中去,将0x800d0000开始的0xb0000个字节(romfs)复制到a1800000(SDRAM)中,然后再从a1000000启动系统。我将Nor flash 分为三个部分分别是832KB、704KB和512KB,前面两个部分是内核镜像和romfs文件系统,后面的512KB是给JFFS2文件系统,linux系统启动的时候再将JFFS2挂载。

在设置好之后就可以编译u-boot,使用命令make LPC2468OEM_Board_config 先配置文件,然后再make。编译完之后,在uboot根目录下生成u-boot.bin,然后通过J-Flash将u-boot烧写进内部flash,设置好串口工具,即可看到uboot的启动信息。如下:

28

桂林电子科技大学毕业设计(论文)报告用纸 第 29 页 共 56 页

图3.2

29

桂林电子科技大学毕业设计(论文)报告用纸 第 30 页 共 56 页

4 uClinux系统的移植

UCLINUX表示MICRO-CONTROL LINUX.即“微控制器领域中的LINUX系统”,是LINEO公司的主打产品,同时也是开放源码的嵌入式LINUX的典范之作。UCLINUX主要是针对目标处理器没有存储管理单元MMU(MEMORY MANAGEMENT UNIT)的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。

uClinux系统多采用Romfs文件系统,Romfs是一种相对简单、占用空间较少的文件系统。空间的节约来自于两个方面:首先内核支持Romfs文件系统比支持ext2文件系统需要更少的代码;其次romfs文件系统相对简单,在建立文件系统超级块(Superblock)需要更少的存储空间。Romfs是只读的文件系统,禁止写操作,因此系统同时需要虚拟盘(RAMDISK)支持临时文件和数据文件的存储。

随着技术的发展,近年来日志文件系统在uClinux系统上得到了较多的应用,其中以支持NOR FLASH的JFFS、JFFS2文件系统和支持NAND FLASH的YAFFS最为流行。这些文件系统都支持掉电文件保护,同时支持标准的MTD驱动。

因此,本文的uclinux文件系统采用的是romfs+jffs2, 系统系统之后在将jffs2分区挂载。

4.1 基本内核的移植

(1)解压uClinux源码并将原来的linux内核源码删除; tar –zxvf uClinux-dist-20070130.tar.gz rm -r uClinux-dist/linux-2.0.x rm -r uClinux-dist/linux-2.4.x rm -r uClinux-dist/linux-2.6.x

(2)解压linux2.6.21内核打上相关补丁并且移动到uclinux相关目录; tar -jxvf linux2.6.21.tar.bz2

tar –zxvf linux-2.6.21-uc0-big.patch.gz | patch -p0 cat linux-2.6.21-uc0-lpc2468.diff | patch -p0 mv linux-2.6.21 uClinux-dist/linux-2.6.x (3) 安装LPC2468 BSP;

tar –zxvf uClinux-dist-20070130-nxp-lpc2468.tgz

在/linux-2.6.18/scripts/mod/sumversion.c添加#include 否则编译会出

错。然后make menuconfig 除了SDRAM和Flash基地址需要改变之外其它的按照默认的即可如图:

30

桂林电子科技大学毕业设计(论文)报告用纸 第 31 页 共 56 页

图4.1

编译内核:make linux; 编译库:make lib_only; 编译用户程序:make user_only; 制作romfs:make romfs; 生成镜像:make image;

最后make,之后,如果再修改的话只编译相应的选项即可,节省时间。 在uClinux-dist/images下生成romfs镜像romfs.img。

在uClinux-dist/linux-2.6.x下生成内核镜像vmlinux,此时的vmlinux并不能直接使用,还要对其进一步的处理。为了方便写了个shell: #/bin/sh

#build uImage for uclinux #piaozhiye

arm-linux-objcopy -O binary -R .note -R .comment -S vmlinux linux.bin gzip -9 linux.bin

/home/piaozhiye/u-boot-1.1.6/tools/mkimage -A arm -O linux -T kernel -C gzip -a 0xa0008000 -e 0xa0008000 -n \ uImage.bin

第一个是将vmlinux 转换成linux.bin的二进制格式。 第二个是用gzip压缩linux.bin生成linux.bin.gz。

第三个是使用编译u-boot生成的mkimage 将linux.bin.gz 转换成uImage.bin。 下面是mkimage的用法:

Usage: /home/piaozhiye/u-boot-1.1.6/tools/mkimage -l image

31

桂林电子科技大学毕业设计(论文)报告用纸 第 32 页 共 56 页

-l ==> list image header information

/home/piaozhiye/u-boot-1.1.6/tools/mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image -A ==> set architecture to 'arch' -O ==> set operating system to 'os' -T ==> set image type to 'type' -C ==> set compression type 'comp' -a ==> set load address to 'addr' (hex) -e ==> set entry point to 'ep' (hex) -n ==> set image name to 'name' -d ==> use image data from 'datafile' -x ==> set XIP (execute in place)

现在uClinux基本上可以运行了,不过此时flash驱动、网卡等驱动都没有,只是在串口打印出一些相关信息。 通过tftp下载镜像:

首先将内核和romfs镜像复制到TFTP根目录下然后使用命令:

下载内核到a1000000:tftp a1000000 uImage.bin 下载romfs到a1800000:tftp a1800000 romfs 在内存中运行:bootm a1000000

4.2 Linux nor flash驱动移植

4.2.1 Linux mtd简介

MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。将CFI接口的MTD设备分为四层(从设备节点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。

一、Flash硬件驱动层:硬件驱动层负责在init时驱动Flash硬件,Linux MTD设备的NOR Flash芯片驱动遵循CFI接口标准,其驱动程序位于drivers/mtd/chips子目录下。NAND型Flash的驱动程序则位于/drivers/mtd/nand子目录下。

二、MTD原始设备:原始设备层有两部分组成,一部分是MTD原始设备的通用代码,

32

桂林电子科技大学毕业设计(论文)报告用纸 第 33 页 共 56 页

另一部分是各个特定的Flash的数据,例如分区。

三、MTD设备层:基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。MTD字符设备的定义在mtdchar.c中实现,通过注册一系列 fileoperation函数(lseek、open、close、read、write)。MTD块设备则是定义了一个描述MTD块设备的结构mtdblk_dev,并声明了一个名为mtdblks的指针数组,这数组中的每一个mtdblk_dev和mtd_table中的每一个mtd_info一一对应。 四、设备节点:通过mknod在/dev子目录下建立MTD字符设备节点(主设备号为90)和MTD块设备节点(主设备号为31),通过访问此设备节点即可访问MTD字符设备和块设备。

现在的NorFlash大多支持CFI或者JEDEC这样的规范,根据这些规范可以自动检测出芯片的一些参数并进行读写,所以uClinux将这些规范的驱动实现单独放在mtd/chips目录下。也就是说这个目录下放的是芯片的通用驱动代码,这些代码本身是不会主动去检测芯片的存在的,它仅仅是注册了一个驱动供其它模块调用。

在通用规范的基础上,每个不同的厂商有不同的实现,且芯片在不同的系统中可能有不同的参数,如基地址,位宽等。uClinux将这部分独立出来放在mtd/maps下。这个目录下的代码将根据芯片实现的不同规范调用相应的chips驱动。因此chips下的模块必须先于maps下的模块初始化。我们主要做的工作是在map目录下填写map_info结构体,并作相应的初始化。

4.2.2 Nor flash驱动移植

开发板nor flash分分区如下: //driver/mtd/maps/lpc2468nor.c /*????一些头文件*/

#define WINDOW_SIZE 0X200000 //2MB

#define WINDOW_ADDR 0X80000000 // 基地址 #define BUSWIDTH2 //16/8

#define PROBETYPES {\探测接口类型 #define MSG_PREFIX \前缀 #define MTDID \驱动

struct map_info lpc2468nor_map = {.name = \.size = WINDOW_SIZE, .bankwidth = BUSWIDTH,

33

桂林电子科技大学毕业设计(论文)报告用纸 第 34 页 共 56 页

.phys = WINDOW_ADDR };

#ifdef CONFIG_MTD_PARTITIONS

static struct mtd_partition static_partitions[]= {

{.name = \内核镜像 .offset = 0, .size = 0xd0000

},{.name = \做根文件系统 .offset = 0xd0000, .size = 0xb0000

},{.name = \用于JFSS2文件系统,系统启动之后挂载该分区

.offset = 0x180000, .size = 0x80000,} }; #endif

#define NUM_PARTITIONS ARRAY_SIZE(lpc2468nor_partitions) static struct mtd_info *mymtd; static int mtd_parts_nb = 0;

static struct mtd_partition *mtd_parts = 0; //norflash驱动模块的初始化代码

static int __init init_lpc2468nor_map(void) {

static const char *rom_probe_types[] = PROBETYPES; const char **type;

const char *part_type = 0; printk(KERN_NOTICE MSG_PREFIX \at 0xx \\n\

// 将物理地址映射到linux的内核空间

lpc2468nor_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE); if(!lpc2468nor_map.virt) {

printk(MSG_PREFIX \}

// 填充read, write, copy_from, copy_to几个函数指针为默认值。 simple_map_init(&lpc2468nor_map); mymtd = 0;

type =rom_probe_types;

for(; !mymtd && *type ; type++) {

/* do_map_probe这个函数位于drivers/mtd/chips/chipreg.c,用于查找指定名称的chip_driver,并调用它完成芯片的检测。*/

34

桂林电子科技大学毕业设计(论文)报告用纸 第 35 页 共 56 页

mymtd = do_map_probe(*type, &lpc2468nor_map); }

if(mymtd) {

mymtd->owner = THIS_MODULE;

printk(\mtd_parts = static_partitions;

mtd_parts_nb = ARRAY_SIZE(static_partitions); part_type = \add_mtd_device(mymtd); if(mtd_parts_nb == 0)

printk(KERN_NOTICE MSG_PREFIX \else {

printk(KERN_NOTICE MSG_PREFIX \add_mtd_partitions(mymtd, mtd_parts, mtd_parts_nb); }

return 0; }

iounmap((void *)lpc2468nor_map.virt); return - ENXIO; }

static void __exit cleanup_lpc2468nor_map(void) {

if(mymtd) {

del_mtd_partitions(mymtd); del_mtd_device(mymtd); map_destroy(mymtd); }

if(lpc2468nor_map.virt) {

iounmap((void *)lpc2468nor_map.virt); lpc2468nor_map.virt = NULL ; } }

module_init(init_lpc2468nor_map); module_exit(cleanup_lpc2468nor_map);

在driver/mtd/maps目录下在kconfig加上 config MTD_ARM_LPC2468NOR

tristate \depends on ARM && MTD

35

桂林电子科技大学毕业设计(论文)报告用纸 第 36 页 共 56 页

在driver/mtd/maps目录下在makefile中加上 obj-$(CONFIG_MTD_ARM_LPC2468NOR)+= lpc2468nor.o

编译配置选项:

图4.2

图4.3

36

桂林电子科技大学毕业设计(论文)报告用纸 第 37 页 共 56 页

图4.4

注:将drivers/mtd/chips/jedec_probe.c用linux2.6.29(或更高版本)内核中的jedec_probe.c去替换否则编译会出错。

最后make linux即可编译出内核镜像。

内核启动nor flash信息:

LPC2468-NOR:0x00200000 at 0x80000000

lpc2468nor_flash: Found 1 x16 devices at 0x0 in 16-bit bank Amd/Fujitsu Extended Query Table at 0x0040 number of CFI chips: 1

cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness. static_partitions

LPC2468-NOR:using static partition definition Creating 3 MTD partitions on \0x00000000-0x000d0000 : \0x000d0000-0x00180000 : \0x00180000-0x00200000 : \4.2.3 JFFS2文件系统的制作

上一节已经完成了nor flash 驱动的移植,这一节是在此基础上制作JFFS2文件系统。 在uClinux-dist/venders/NXP/LPC2468/Makefile中加上MTD设备: tty,c,5,0 console,c,5,1 cua0,c,5,64 cua1,c,5,65 \\ \\ mtd0,c,90,0 mtd1,c,90,2 mtd2,c,90,4 mtd3,c,90,6 \\ \\ mtd4,c,90,8 mtd5,c,90,10 mtd6,c,90,12 mtd7,c,90,14 \\ \\ mtdblock0,b,31,0 mtdblock1,b,31,1 mtdblock2,b,31,2 mtdblock3,b,31,3 \\ \\

37

桂林电子科技大学毕业设计(论文)报告用纸 第 38 页 共 56 页

mtdblock4,b,31,4 mtdblock5,b,31,5 mtdblock6,b,31,6 mtdblock7,b,31,7 \\ \\

mem,c,1,1 kmem,c,1,2 null,c,1,3 ram0,b,1,0 \\ 用一个shell脚本即可实现系统启动后可以JFFS2自动挂载到/mnt 目录。 在uClinux-dist/venders/NXP/LPC2468/rc 中添加: hostname LPC2468 By piaozhiye /bin/expand /etc/ramfs.img /dev/ram1 mount -t proc proc /proc mount -t ext2 /dev/ram1 /var mkdir /var/tmp mkdir /var/log mkdir /var/run mkdir /var/lock mkdir /var/empty ifconfig lo 127.0.0.1 #httpd & cat /etc/motd /bin/sh

mount -t jffs2 /dev/mtdblock3 /mnt

注意挂载的顺序,要在shell启动之后再挂载,否则系统启动后,虽然可以挂载,但是/mnt还是只读的。如下图:

图4.5

可见JFFS2是可写的启动之后也可以看见jffs2_test,说明JFFS2制作成功。

4.3 Linux网卡驱动移植

网络设备是Linux标准类设备之一,也是非常重要的一类设备。网络设备将数据发送到网络,或者接收来自网络的数据。网络驱动程序用到的重要数据结构有sk_buff和net_device。

38

桂林电子科技大学毕业设计(论文)报告用纸 第 39 页 共 56 页

sk_buff结构表示接收或发送数据包的包头信息,并包含很多成员变量供网络代码中的各子系统使用。这个结构被网络的不同层(MAC或者其他二层链路协议,三层的IP,四层的TCP或UDP等)使用,并且其中的成员变量在结构从一层向另一层传递时改变。

网络设备数据结构net_device是网络驱动程序的最重要的部分,也是理解Linux网络接口的关键。所有的网络设备的信息和操作都保存在设备数据结构中。每注册一个网络设备,都需要提供数据结构中各个域的数据。

4.3.1 网卡初始化

驱动程序加载时,初始化执行lpc2xxx_eth_init 函数,该功能由驱动程序中的module_init(lpc2xxx_eth_init)语句指定。lpc2xxx_eth_init 函数调用platform_driver_register函数对lpc2xxx_eth_driver中保存的信息进行注册,lpc2xxx_eth_driver中包含如下信息:

static struct platform_driver lpc2xxx_eth_driver = {

.probe .remove .resume .driver },

= lpc2xxx_eth_probe, = lpc2xxx_eth_remove, = lpc2xxx_eth_resume, = {

.suspend = lpc2xxx_eth_suspend,

.name = DRV_NAME, .owner = THIS_MODULE,

};通过注册,指定probe,remove,suspend,redume等操作所对应的函数,以及驱动器名

称。例如,设备probe采用函数lpc2xxx_eth_probe,驱动器名称为MODNAME。其中,lpc2xxx_eth_remove函数注销设备、释放中断、释放虚拟地址、停止时钟、释放网络设备;lpc2xxx_eth_suspend函数停用时钟并关闭设备,将设备从激活队列中撤出,不允许网卡收发包;lpc2xxx_eth_resume函数使能时钟并对设备进行复位和初始化,将设备加入激活队列,允许网卡收发包lpc2xxx_eth_probe函数获取平台资源(例如IO地址)、中断号、分配网络设备数据结构、获得网卡私有数据结构的起始地址、初始化自旋锁、获取设备时钟、使能网络时钟、映射虚拟地址、申请使用IRQ并注册中断处理程序、设置驱动函数等。例如,设置如下的驱动函数:

dev->open = lpc2xxx_eth_open;

dev->stop = lpc2xxx_eth_close;

39

桂林电子科技大学毕业设计(论文)报告用纸 第 40 页 共 56 页

dev->hard_start_xmit = lpc2xxx_eth_tx; dev->get_stats = lpc2xxx_eth_stats; dev->set_mac_address = set_mac_address; dev->ethtool_ops = &lpc2xxx_eth_ethtool_ops; dev->do_ioctl = lpc2xxx_eth_ioctl;

指定系统调用的入口函数。

4.3.2 网卡打开

打开函数lpc2xxx_eth_open在网络设备驱动程序里是网络设备被激活的时候被调用的,所以实际上很多在初始化的工作可以放到这里来做。lpc2xxx_eth_open函数使能网络时钟、复位和初始化以太网、开启网络接口接收和发送数据队列。

4.3.3 网卡发送

lpc2xxx_eth_tx函数将sk_buff *skb结构中存放的报文发送到网卡硬件。发送函数进行下面几步处理:

(1) 获得下一个发送缓冲区索引; (2) 设置控制器为“发送”; (3) 将数据拷贝到DMA缓冲区中; (4) 保存缓冲并将缓冲区计数加1; (5) 启动发送过程。

4.3.4 网卡接收

当发生中断时,中断处理程序_lpc32xx_eth_interrupt判断中断类型,如果是接收中断,则调用_lpc32xx_handle_recv函数,该接收函数的主要功能是从片上数据缓冲区中将数据传送给sk_buff缓冲区。接收处理主要经过下面几步: (1)获取接收缓冲区索引;

(2)获取接收状态,并做错误处理;

(3)将片上缓冲区中数据拷贝到sk_buff结构中,并提交给上层协议。

40

本文来源:https://www.bwwdw.com/article/g3v.html

Top