百家汽车网
您的当前位置:首页LINUX——u-boot移植——济源职业技术学院

LINUX——u-boot移植——济源职业技术学院

来源:百家汽车网


济源职业技术学院——计算机应用专业

/etc/udev/rules.d/70-persistent-net.rules

apt-get install system-config-samba system-config-samba

一、获得U-Boot源码

将u-boot-1.3.2.tar.bz2拷贝了工作目录下,解压源码包: [root@vm-dev cpshare]# mkdir u-boot

[root@vm-dev u-boot]# cp /mnt/shared/u-boot-1.3.2.tar.bz2 ./ [root@vm-dev u-boot]# tar xjvf u-boot-1.3.2.tar.bz2 [root@vm-dev u-boot]# cd u-boot-1.3.2

二、建立板级支持包

在board目录下,每一块开发板都有一个对应的目录,因此我们需要为我们的开发板建立一个目录,名字叫做up2410,并创建相应的文件:

[root@vm-dev u-boot-1.3.2]# cd board/ [root@vm-dev board]# mkdir up2410

[root@vm-dev board]# cp smdk2410/* up2410 [root@vm-dev board]# cd ../

上面的步骤中,我们把smdk2410目录下的所有文件都拷贝到了我们的up2410目录下,因为我们的开发板和smdk2410开发板的配置差不多。

每个开发板都有一个自己的配置文件,如smdk2410开发板的配置文件为include/configs/smdk2410.h,我们也需要为我们的开发板建立自己的配置文件。可以直接从smdk2410开发板的配置文件中修改而来。因此我们先把smdk2410的配置文件复制到我们开发板的配置文件当中:

[root@vm-dev u-boot-1.3.2]# cp include/configs/smdk2410.h include/configs/up2410.h 然后,修改Makefile,使得可以配置我们的开发板: [root@vm-dev u-boot-1.3.2]# vi Makefile 在Makefile中找到下面两行: smdk2400_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0 紧接这这两行添加如下两行: up2410_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t up2410 NULL s3c24x0

注意第二行开始部分的空白是按TAB键获得的!红色的部分显示了不同处! 这样,我们自己的板级支持包就建好了。

三、添加代码,支持从Nand Flash启动

由于我们的开发板上没有Nor Flash,只能从Nand Flash启动。而U-Boot默认不支持从Nand Flash启动,所以需要我们自己添加代码来实现从Nand Flash启动。

1、修改start.S文件

位于cpu/arm920t/目录下的start.S文件是开发板上电后运行的第一段代码,需要在这个文件中添加内容,以支持从Nand Flash启动。

[root@vm-dev u-boot-1.3.2]# vi cpu/arm920t/start.S 首先,删掉start.S中的第181行和201行的下面内容: #ifdef CONFIG_AT91RM9200

............................................................... #endif

如果有这两句,这两句之间的内容将不会被编译。而我们的开发板需要执行这些内容。然后,找到这一行: #ifndef CONFIG_SKIP_RELOCATE_UBOOT 在紧接这这行的下面添加下面几行:

#ifdef CONFIG_S3C2410_NAND_BOOT bl copy_myself #else 再找到 ble copy_loop 在它的下面添加一行: #endif 做这些工作就是要完成一个简单的功能:如果我们定义了CONFIG_S3C2410_NAND_BOOT这个宏,那么就执行copy_myself这个子程序,否则就执行#else下面的程序。copy_myself这个子程序的功能就是把U-Boot自身的代码从Nand Flash拷贝到SDRAM中,需要我们自己实现,U-Boot自身并没有为我们实现。 我们把copy_myself也添加在start.S文件中。找到下面的一行:

_start_armboot: .word start_armboot 在这一行的下面添加如下的内容: /*

************************************************************************* *

* copy u-boot to ram *

************************************************************************* */

#ifdef CONFIG_S3C2410_NAND_BOOT copy_myself:

mov r10, lr @save return address to r10 ldr sp, DW_STACK_START @安装栈的起始地址 mov fp, #0 @初始化帧指针寄存器 bl NF_Init @跳到复位C函数去执行 @read UBOOT from Nand Flash to RAM ldr r0, =UBOOT_RAM_BASE @设置第1个参数: UBOOT在RAM中的起始地址 mov r1, #0x0 @设置第2个参数:Nand Flash的起始地址 mov r2, #0x30000 @设置第3个参数: UBOOT的长度(192KB) bl nand_read_whole @调用nand_read_whole(), 该函数在board/up2410/nand.c中 tst r0, #0x0 @如果函数的返回值为0,表示执行成功. beq ok_nand_read @ 执行内存比较 1: b 1b ok_nand_read:

mov r0, #0x00000000 @内部RAM的起始地址 ldr r1, =UBOOT_RAM_BASE @UBOOT在RAM中的起始地址 mov r2, #0x400 @比较1024次, 每次4字节, 4 bytes * 1024 = 4Kbytes go_next:

ldr r3, [r0], #4 ldr r4, [r1], #4 teq r3, r4 bne notmatch subs r2, r2, #4 beq done_nand_read bne go_next notmatch:

1: b 1b done_nand_read:

mov pc, r10 #endif

DW_STACK_START:

.word STACK_BASE+STACK_SIZE-4

上面是copy_myself的实现代码,添加完成以后,U-Boot启动时就会执行我们的这段代码,将U-Boot的内容从Flash中拷贝到SDRAM中。 这样,start.S这个文件就修改完成了,保存刚才的修改。

2、添加nand.c文件

在copy_mysel这段程序中,我们调用了nand_read_whole子程序。这个程序是用C程序实现的,我们新建一个文件,

board/up2410/nand.c,在这个文件中实现它: #include #include #include

#define TACLS 0 #define TWRPH0 3

#define TWRPH1 0 #define U32 unsigned int

extern unsigned long nand_probe(unsigned long physadr);

static void NF_Reset(void) {

int i;

NF_nFCE_L();/* 使能Nand Flash */ NF_CMD(0xFF); for(i=0;i<10;i++); NF_WAITRB(); NF_nFCE_H(); }

void NF_Init(void) {

rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0); NF_Reset(); }

int nand_read_whole(unsigned char *buf, unsigned long start_addr, int size) {

int i, j;

if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))

return 1;

NF_nFCE_L(); for(i=0; i<10; i++); i = start_addr;

while(i < start_addr + size) {

rNFCMD = 0; /* 建立每次读写的地址,NANDFLASH按照扇区来进行读写*/ rNFADDR = i & 0xff;

rNFADDR = (i >> 9) & 0xff; rNFADDR = (i >> 17) & 0xff; rNFADDR = (i >> 25) & 0xff; NF_WAITRB();

for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {/* 读取每个扇区的所有指令*/

*buf = (rNFDATA & 0xff);

buf 在其下面添加下面几行:

#define CONFIG_CMD_REGINFO #define CONFIG_CMD_NAND #define CONFIG_CMD_PING #define CONFIG_CMD_DLF #define CONFIG_CMD_ENV #define CONFIG_CMD_NET 这样就添加了一些我们需要的命令。

3、修改环境变量

环境变量是U-Boot运行时或者传递给内核的重要参数,需要正确设置。找到下面的一行:

#define CONFIG_BOOTDELAY 3

/*#define CONFIG_BOOTARGS \"root=ramfs devfs=mount console=ttySA0,9600\" */ /*#define CONFIG_ETHADDR 08:00:3e:26:0a:5b */ #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 10.0.0.110 #define CONFIG_SERVERIP 10.0.0.1

/*#define CONFIG_BOOTFILE \"elinos-lart\" */

/*#define CONFIG_BOOTCOMMAND \"tftp; bootm\" */

#if defined(CONFIG_CMD_KGDB) 注意上面的#if defined(CONFIG_CMD_KGDB)处,需要做的修改都在这之前进行修改。修改后的代码如下: #define CONFIG_BOOTDELAY 3

#define CONFIG_BOOTARGS \"root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200\" #define CONFIG_ETHADDR 08:00:3e:26:0a:5b

#define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 192.168.1.131 #define CONFIG_SERVERIP 192.168.1.132 #define CONFIG_BOOTFILE \"uImage\"

#define CONFIG_BOOTCOMMAND \"tftp; bootm\"

#define CONFIG_CMDLINE_TAG 1

#define CONFIG_SETUP_MEMORY_TAGS 1

#define CONFIG_INITRD_TAG 1 #if defined(CONFIG_CMD_KGDB) 上面添加的环境变量在U-Boot启动时作为U-Boot的默认环境变量,如果不执行saveenv命令,则这些变量只存在于SDRAM中;执行saveenv命令后,这些便量会保存到Flash中,下次上电,在从Flash中把它读出来,作为环境变量使用。

4、修改命令提示符

找到下面一行:

#define CFG_PROMPT \"SMDK2410 # \" /* Monitor Command Prompt */ 修改为: #define CFG_PROMPT \"[UP-2410 #]\" 这样,U-Boot的命令提示符就是[UP-2410 #]。这样做只是为了使用的时候知道我们使用的是经典2410开发板上Bootloader,当然不改的话,也没有什么影响。

5、修改默认下载地址

找到下面的一行:

#define CFG_LOAD_ADDR 0x33000000 /* default load address */ 这个变量定义的是在使用串口或者网卡下载文件到SDRAM时,如果不指定下载地址,则下载到这个宏指定的默认地址。我们用下面的两行来替代: #define CFG_LOAD_ADDR 0x30008000 #define CFG_TFTP_LOAD_ADDR 0x30008000

6、修改环境变量在Flash中的存储地址

找到下面的两行: #define CFG_ENV_IS_IN_FLASH 1

#define CFG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */ 上面的定义说明环境变量是存在Flash中。我们的板子上只有Nand Flash,因此环境变量只能存在Nand Flash中。因此,注释掉上面的两行,用下面的几行代替: #define CFG_ENV_IS_IN_NAND 1 #define CFG_ENV_SIZE 0x4000

#define CFG_ENV_OFFSET (0x80000-0x4000) 表示环境变量存储在Nand Flash中,大小为16KB,起始地址是0.5M往下的16KB地址处。这样的话,U-Boot占用的Flash地址是前0.5M,对U-Boot来说,已经足够了。 到这里,配置文件的修改就完成了。

四、修改网卡驱动

前面提到,我们的开发板上是DM9000A网卡,不能直接使用U-Boot提供的网卡驱动,我们提供了这个网卡的驱动,由于修改的地方比较多,就不作详细解释了,直接给出这个驱动的实现代码。该驱动会在网络驱动课程中讲解。共有两个文件:dm9000x.c和dm9000x.h。这两个文件在我们的src目录中存放。把这两个拷贝到u-boot源代码目录下的drivers/net下,替换掉U-Boot自身的驱动文件。 [root@vm-dev u-boot-1.3.2]# cp /mnt/hgfs/e/dm9000x.c drivers/net/

cp:是否覆盖‘drivers/net/dm9000x.c’? y

[root@vm-dev u-boot-1.3.2]# cp /mnt/hgfs/e/dm9000x.h drivers/net/ cp:是否覆盖‘drivers/net/dm9000x.h’? y [root@vm-dev u-boot-1.3.2]#

修改u-boot工程目录下lib_arm/board.c源文件,添加网卡初始化函数接口调用: 找到源码中如下语句:(第424行)

#ifdef CONFIG_DRIVER_CS00

cs00_get_enetaddr (gd->bd->bi_enetaddr); #endif

在这段语句前面加入“eth_init(gd->bd);”语句,如下:

eth_init(gd->bd);

#ifdef CONFIG_DRIVER_CS00

cs00_get_enetaddr (gd->bd->bi_enetaddr); #endif

这样u-boot启动时候,将自动初始化网卡。

五、编译U-Boot

首先运行如下命令配置U-Boot:

[root@vm-dev u-boot-1.3.2]# make up2410_config Configuring for up2410 board... [root@vm-dev u-boot-1.3.2]# 然后运行make命令编译:

[root@vm-dev u-boot-1.3.2]# make

编译完成后,会在U-Boot的源代码目录下生成u-boot.bin文件。这个文件就是我们需要的二进制文件。

六、烧写U-Boot

将编译得到的u-boot.bin拷贝到XP的D盘下,将我们光盘中的sjf2410-s.exe文件也拷贝到D盘下。连接好开发板的电源、JTAG下载线,打开开发板的电源。在电脑桌面的左下角点击开始,找到运行: 在打开的菜单中输入cmd,并回车: 这样将会打开一个DOS对话框。在打开的DOS对话框中进入D盘: Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp.

C:\\Documents and Settings\\Administrator>D: D:\\> 这样就进入了D盘,运行如下命令进行烧写: D:\\>sjf2410-s.exe /f:u-boot.bin 这样就会启动烧写程序。在烧写程序中需要我们做一些选择,要分别输入三次0,然后才开始真正的烧写,烧写完毕后,输入2推出程序。如下面的内容:

D:\\>sjf2410-s.exe /f:u-boot.bin +------------------------------------+

| SEC JTAG FLASH(SJF) v 0.7 | | (S3C2410X & SMDK2410 B/D) | | PROVIDED BY KENT 20050628 | | kent@up-tech.com | +------------------------------------+

Usage: SJF /f: /d=

> S3C2410X(ID=0x0032409d) is detected.

[SJF Main Menu]

0:K9S1208 prog 1:K9F2808 prog 2:28F128J3A prog 3:AM29LV800 Prog 4:Memory Rd/Wr 5:Exit Select the function to test:0

[K9S1208 NAND Flash JTAG Programmer] K9S1208 is detected. ID=0xec76

0:K9S1208 Program 1:K9S1208 Pr BlkPage 2:Exit Select the function to test :0

[SMC(K9S1208V0M) NAND Flash Writing Program]

Source size:0h~21237h

Available target block number: 0~4095 Input target block number:0

target start block number =0

target size (0x4000*n) =0x24000

STATUS:Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp Epppppppppppppppppppppppppppppppp

0:K9S1208 Program 1:K9S1208 Pr BlkPage 2:Exit Select the function to test :2 D:\\>

七、测试U-Boot

现在U-Boot已经烧写到开发板上了,可以启动开发板检测是否烧写好。连接好开发板和主机之间的串口、网口,断开开发板的JTAG下载线,启动开发板。如果烧写成功,会在串口终端上出现如下内容: U-Boot 1.3.2 (Dec 5 2008 - 10:35:38)

DRAM: MB Flash: 512 kB NAND: MiB

*** Warning - bad CRC or NAND, using default environment

In: serial Out: serial Err: serial

Hit any key to stop autoboot: 0 [UP-2410-S #] 注意上面内容中红色的部分,主要是因为我们没有把环境变脸写入Flash。运行如下命令将环境变量写入Flash中: [UP-2410 #]saveenv

Saving Environment to NAND...

Erasing Nand...Writing to Nand... done [UP-2410 #] 运行printenv查看环境变量: [UP-2410 #]printenv

bootargs=root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 bootcmd=tftp; bootm

bootdelay=3

baudrate=115200

ethaddr=08:00:3e:26:0a:5b

ipaddr=192.168.1.131 serverip=192.168.1.132

netmask=255.255.255.0 bootfile=\"uImage\" stdin=serial stdout=serial stderr=serial

Environment size: 265/16380 bytes [UP-2410 #] 可以看到我们在up2410.h中定义的环境变量都正确地保存下来了。然后检测网络功能: [UP-2410 #]ping 192.168.1.135 host 192.168.1.135 is alive [UP-2410 #] 返回host 192.168.1.135 is alive,说明网卡已经通了。 另外,还可以运行help命令来查看U-Boot提供的命令及其作用: [UP-2410 #]help

? - alias for 'help'

autoscr - run script from memory base - print or set address offset bdinfo - print Board Info structure

boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootelf - Boot from an ELF image in memory bootm - boot application image from memory

bootp - boot image via network using BootP/TFTP protocol bootvx - Boot vxWorks from an ELF image cmp - memory compare

coninfo - print console devices and information cp - memory copy

crc32 - checksum calculation date - get/set/reset date & time dcache - enable or disable data cache echo - echo args to console erase - erase FLASH memory

flinfo - print FLASH memory information

go - start application at address 'addr' help - print online help

icache - enable or disable instruction cache

iminfo - print header information for application image imls - list all images found in flash

itest - return true/false on integer compare

loadb - load binary file over serial line (kermit mode) loads - load S-Record file over serial line

loady - load binary file over serial line (ymodem mode) loop - infinite loop on address range md - memory display

mm - memory modify (auto-incrementing) mtest - simple RAM test mw - memory write (fill) nand - NAND sub-system

nboot - boot from NAND device

nfs - boot image via network using NFS protocol nm - memory modify (constant address)

七、测试U-Boot

现在U-Boot已经烧写到开发板上了,可以启动开发板检测是否烧写好。连接好开发板和主机之间的串口、网口,断开开发板的JTAG下载线,启动开发板。如果烧写成功,会在串口终端上出现如下内容: U-Boot 1.3.2 (Dec 5 2008 - 10:35:38)

DRAM: MB Flash: 512 kB NAND: MiB

*** Warning - bad CRC or NAND, using default environment

In: serial Out: serial Err: serial

Hit any key to stop autoboot: 0 [UP-2410-S #] 注意上面内容中红色的部分,主要是因为我们没有把环境变脸写入Flash。运行如下命令将环境变量写入Flash中: [UP-2410 #]saveenv

Saving Environment to NAND...

Erasing Nand...Writing to Nand... done [UP-2410 #] 运行printenv查看环境变量: [UP-2410 #]printenv

bootargs=root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 bootcmd=tftp; bootm

bootdelay=3

baudrate=115200

ethaddr=08:00:3e:26:0a:5b

ipaddr=192.168.1.131 serverip=192.168.1.132

netmask=255.255.255.0 bootfile=\"uImage\" stdin=serial stdout=serial stderr=serial

Environment size: 265/16380 bytes [UP-2410 #] 可以看到我们在up2410.h中定义的环境变量都正确地保存下来了。然后检测网络功能: [UP-2410 #]ping 192.168.1.135 host 192.168.1.135 is alive [UP-2410 #] 返回host 192.168.1.135 is alive,说明网卡已经通了。 另外,还可以运行help命令来查看U-Boot提供的命令及其作用:

[UP-2410 #]help

? - alias for 'help'

autoscr - run script from memory base - print or set address offset bdinfo - print Board Info structure

boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootelf - Boot from an ELF image in memory bootm - boot application image from memory

bootp - boot image via network using BootP/TFTP protocol bootvx - Boot vxWorks from an ELF image cmp - memory compare

coninfo - print console devices and information cp - memory copy

crc32 - checksum calculation date - get/set/reset date & time dcache - enable or disable data cache echo - echo args to console erase - erase FLASH memory

flinfo - print FLASH memory information go - start application at address 'addr' help - print online help

icache - enable or disable instruction cache

iminfo - print header information for application image imls - list all images found in flash

itest - return true/false on integer compare

loadb - load binary file over serial line (kermit mode) loads - load S-Record file over serial line

loady - load binary file over serial line (ymodem mode) loop - infinite loop on address range md - memory display

mm - memory modify (auto-incrementing) mtest - simple RAM test mw - memory write (fill) nand - NAND sub-system

nboot - boot from NAND device

nfs - boot image via network using NFS protocol nm - memory modify (constant address)

——来自济源职业技术学院计算机应用1002 10090230

Linux 内核移植

1、 获得 Linux 内核源码

我们的光盘中提供了 linux-2.6.24.4 的内核源码,也可以从 www.kernel.org 上下载。 将 linux-2.6.24.4.tar.bz2 拷贝到工作目录下,解压,就可以得到完整的 Linux 内核源码 包:

[root@vm-dev 2410-s]# pwd

/root/2410-s

[root@vm-dev 2410-s]# cp /mnt/hgfs/kernel/linux-2.6.24.4.tar.bz2 ./ [root@vm-dev 2410-s]# tar xjvf linux-2.6.24.4.tar.bz2 [root@vm-dev 2410-s]# cd linux-2.6.24.4/

2、 修改 Makefile

为了交叉编译内核,需要修改内核的底层 Makefile: [root@vm-dev linux-2.6.24.4]# vi Makefile

找到下面的两行:

ARCH

?= $(SUBARCH)

CROSS_COMPILE ?=

修改成如下两行:

ARCH ?= arm

CROSS_COMPILE ?= arm-linux-

上面这样修改的意思是说我们的目标平台是 arm,使用的交叉编译器的前缀是

arm-linux-.

3、 得到.config 文件

编译内核时会依赖于源代码目录下的 .config 文件。如果没有这个文件,在 make menuconfig 的时候,会默认按照 i386 的配置生成.config 文件,而这不是我们需要的。因 此我们要有自己的.config 文件。

由于我们的配置和 SMDK2410 开发板的类似,因此可以使用它的 .config 文件,只需要 把它的.config 文件拷贝到源代码根目录下的.config 文件即可:

[root@vm-dev linux-2.6.24.4]# cp arch/arm/configs/s3c2410_defconfig .config

4、 修改 Nand Flash 分区

由于我们使用的是 SMDK2410 开发板的原型,SMDK2410 开发板的 NAND Flash 和我们的 不一样,因此需要修改。打开 arch/arm/plat-s3c24xx/common-smdk.c 这个文件:

[root@vm-dev linux-2.6.24.4]# vi arch/arm/plat-s3c24xx/common-smdk.c

找到 struct mtd_partition smdk_default_nand_part[]这个结构体,并修改它。修改 后的结构体如下面的代码所示:

static struct mtd_partition smdk_default_nand_part[] = {

[0] = {

.name = \"Bootloader\.size = 0x80000, .offset = 0, }, [1] = {

.name = \"Linux Kernel\.offset = 0x80000, .size = SZ_2M, }, [2] = {

.name = \"Root File System\.offset = 0x280000, .size = SZ_4M, }, [3] = {

.name = \"User Space\.offset = 0x680000, .size = 0x3980000, }, };

这样就把我们的 M 的 NAND Flash 分为四个区: 第一个区从 0x00000000 到 0x00080000,大小为 0.5M 第二个区从 0x00080000 到 0x00280000,大小为 2M 第三个区从 0x00280000 到 0x00680000,大小为 4M 第四个区从 0x00680000 到 0x04000000,大小为 57.5M

5、 添加 LCD 支持

我们的开发平台上配置有 0*480 的液晶屏,我们来为它加上驱动支持。需要在 arch/arm/mach-s3c2410/mach-smdk2410.c 中添加一些内容。

[root@vm-dev linux-2.6.24.4]# vi arch/arm/mach-s3c2410/mach-smdk2410.c 首先要包含我们的 LCD 使用的数据结构的头文件,增加如下内容: #include

#include 然后添加如下内容:

static struct s3c2410fb_display up2410_fb[] __initdata = {

{

.lcdcon5 = (1<<12)|(1<<11)|(1<<9)|(1<<8)|(1<<0), .type = (3<<5), .width = 0, .height = 480, .pixclock = 39721, .xres = 0, .yres = 480, .bpp = 16,

.left_margin = 40, .right_margin = 32, .hsync_len = 32, .vsync_len = 2,

.upper_margin = 35, .lower_margin = 5, }, };

static struct s3c2410fb_mach_info up2410_fb_info __initdata = {

.displays = up2410_fb, .num_displays = 1, .default_display = 0, .gpcup = 0xffffffff, .gpcup_mask = 0x0, .gpccon = 0xaaaaaaaa, .gpccon_mask = 0x0, .gpdup = 0xffffffff, .gpdup_mask = 0x0, .gpdcon = 0xaaaaaaaa, .gpdcon_mask = 0x0,

.lpcsel = 0,

};

然后,在这个文件中找到 smdk2410_init 这个函数,在函数的末尾添加这样一行,来 对 LCD 的数据进行设置:

s3c24xx_fb_set_platdata(&up2410_fb_info);

6、 添加网卡驱动支持

开发板上配置了 DM9000A 网卡,内核已经有网卡驱动的实现代码,需要我们做一定的 配置。在 arch/arm/mach-s3c2410/mach-smdk2410.c 文件中添加如下内容: static struct resource s3c_dm9ks_resource[] = {

[0] = {

.start = 0x10000000, .end = 0x10000040,

.flags = IORESOURCE_MEM,

}, [1] = {

.start = IRQ_EINT2, .end = IRQ_EINT2,

.flags = IORESOURCE_IRQ,

},

};

struct platform_device s3c_device_dm9ks = {

.name = \"s3c2410-dm9ks\.id = -1,

.num_resources = ARRAY_SIZE(s3c_dm9ks_resource), .resource = s3c_dm9ks_resource,

};

然后,把网卡数据加入 smdk2410_devices 数组:

static struct platform_device *smdk2410_devices[] __initdata = {

&s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c, &s3c_device_iis, &s3c_device_dm9ks, };

另外,根据我们的经典 2410 开发板的配置,网卡驱动需要修改。由于修改的地方比较

多,这里就不详细说明了,直接给出修改后的源文件,在我们光盘的相应 src 目录下。共两 个文件:dm9000.c 和 dm9000.h。现在需要作的只是把内核中的 drivers/net 目录下的这两个

文件用我们提供的文件替换掉。

其中需要注意的是对开发板的初始化。我们的开发板上使用 BANK2 作为 DM9000 的 IO, 中断使用 EINT2,因此需要配置好 BANK2 和 EINT2,实现的函数如下(已经在我们的驱动文 件中添加了,不需要手动添加): static void uptech_dm9k_init(void) {

u32 bwscon;

bwscon = __raw_readl(S3C2410_BWSCON);

bwscon&= ~(S3C2410_BWSCON_WS2|S3C2410_BWSCON_ST2|S3C2410_BWSCON_DW2_32); bwscon |= (S3C2410_BWSCON_ST2|S3C2410_BWSCON_DW2_16);

__raw_writel(bwscon, S3C2410_BWSCON);

__raw_writel(S3C2410_BANKCON_Tacs4|S3C2410_BANKCON_Tcos4|

S3C2410_BANKCON_Tacc14|S3C2410_BANKCON_Tcoh4|S3C2410_BANKCON_Tcah4| S3C2410_BANKCON_Tacp 6| S3C2410_BANKCON_PMCnorm, S3C2410_BANKCON2);

set_irq_type(IRQ_EINT2,IRQT_RISING);

s3c2410_gpio_cfgpin(S3C2410_GPF2, S3C2410_GPF2_EINT2); s3c2410_gpio_pullup(S3C2410_GPF2, 0);

printk(KERN_INFO \"Board init for AX88796 finished!\\n\"); }

然后在这个文件中的 axdrv_init 函数的开头部分调用这个函数: static int __init dm9k_init_module(void) {

uptech_dm9k_init();

return platform_driver_register(&dm9k_driver); }

七、添加 YAFFS 文件系统支持

将我们提供的 YAFFS 的源代码 yaffs2.tar.gz 拷贝到 linux-2.6.24.4 的同级目

录下,解压该源码包,获得 YAFFS 源码:

[root@vm-dev 2410-s]# pwd

/root/2410-s

[root@vm-dev 2410-s]# cp /mnt/hgfs/e/yaffs2.tar.gz ./ [root@vm-dev 2410-s]# tar xzvf yaffs2.tar.gz

然后进入 yaffs2 目录,运行./patch-ker.sh 给内核打上补丁: [root@vm-dev 2410-s]# cd yaffs2

[root@vm-dev yaffs2]# ./patch-ker.sh c ../linux-2.6.24.4/

这样打好补丁以后,再做正确的配置,内核就可以支持 YAFFS 文件系统了。

八、配置和编译内核

到现在,一个简单的内核就准备好了,我们还需要做一些配置,然后编译,内核才能 正常使用。

在内核源代码的根目录下运行 make menuconfig 命令,进入配置界面: [root@vm-dev linux-2.6.24.4]# make menuconfig

1、选择硬件系统

做如下选择: System Type --->

S3C2410 Machines --->

[*] SMDK2410/A9M2410

[ ] IPAQ H1940 [ ] Acer N30

[ ] Simtec Electronics BAST (EB2410ITX) [ ] NexVision OTOM Board [ ] AML M5900 Series [ ] Thorcom VR1000 [ ] QT2410

其他的:

S3C2400 Machines ---> S3C2412 Machines ---> S3C2440 Machines ---> S3C2442 Machines ---> S3C2443 Machines --->

上面的四个选项下的所有选项都不要选,以减小内核体积。

2、配置 LCD 驱动

做如下选择:

Device Drivers --->

Graphics support --->

<*> Support for frame buffer devices --->

<*> S3C2410 LCD framebuffer

support

[*] Bootup logo --->

--- Bootup logo

[*] Standard black and white Linux logo [*] Standard 16-color Linux logo [*] Standard 224-color Linux logo

这样,在内核启动的时候,在 LCD 的左上角就会出现 Linux 的 LOGO,一只小企鹅。

3、配置 NAND Flash 驱动

做如下选择:

Device Drivers --->

<*> Memory Technology Device (MTD) support --->

<*> NAND Device Support --->

<*> NAND Flash support for

S3C2410/S3C2440 SoC

4、配置网卡驱动

做如下选择:

Device Drivers --->

[*] Network device support --->

[*] Ethernet (10 or 100Mbit) --->

--- Ethernet (10 or 100Mbit)

-*- Generic Media Independent Interface device support <*> ASIX AX88796 NE2000 clone support

[ ] ASIX AX88796 external 93CX6 eeprom support < > SMC 91C9x/91C1xxx support < > DM9000 support

< > Broadcom 440x/47xx ethernet support

5、配置文件系统

做如下配置,以支持 CRAMFS 文件系统和 YAFFS 文件系统,为了调试方便,也 选上 NFS 文件系统的支持:

File systems --->

Miscellaneous filesystems --->

<*> YAFFS2 file system support -*- 512 byte / page devices

[ ] Use older-style on-NAND data format with pageStatus byte [ ] Lets Yaffs do its own ECC

-*- 2048 byte (or larger) / page devices [*] Autoselect yaffs2 format [ ] Disable lazy loading [ ] Turn off wide tnodes [ ] Force chunk erase check [*] Cache short names in RAM

< > Journalling Flash File System v2 (JFFS2) support <*> Compressed ROM file system support (cramfs) [*] Network File Systems --->

--- Network File Systems

<*> NFS file system support

[*] Provide NFSv3 client support

[*] Provide client support for the NFSv3 ACL

protocol

extension

[ ] Provide NFSv4 client support (EXPERIMENTAL) [*] Allow direct I/O on NFS files < > NFS server support

[*] Root file system on NFS

Pseudo filesystems ---> [*] Virtual memory file system support (former shm fs) [*] Tmpfs POSIX Access Control Lists < > Userspace-driven configuration filesystem (EXPERIMENTAL)

这样,内核的配置基本上就做好了。如果有兴趣,可以自己查看内核的其他配

置,并决定是否选择某项功能,以适合自己的开发板。

在内核源文件的根目录下运行如下命令编译内核: [root@vm-dev linux-2.6.24.4]# make

编译完成后,会在内核的/arch/arm /boot 目录下生成 zImage 文件。这个文件就

是内核的镜像文件。经过处理,可以启动,后面会详细介绍。

九、用 U-Boot 启动内核

编译 U-Boot 时在源代码的 tools 目录下会生成一个 mkimage 可执行文件,用这个工具

可以对前面编译内核时生成的 zImage 进行处理,以供 U-Boot 启动。

把 mkimage 拷 贝 到 一 个 目 录 下 , 比 如内核源码目录, 把 上 面 编 译 生 成 的

zImage 也拷贝到该目录下,运行如下命令生成 uImage:

./mkimage -A arm -T kernel -C none -O linux -a 0x30008000 -e 0x30008040 -d

zImage -n 'Linux-2.6.24' uImage

这样会在这个目录下生成 uImage,把 uImage 放入主机的 TFTP 目录下,启动开发板,

用 U-Boot 的 tftp 命令下载 uImage 到 SDRAM,操作如下:

1.

确认serverip是Linux虚拟机的IP地址

(1)执行“printenv”,查看serverip是否与Linux虚拟机的IP地址一致 (2)若不一致,执行“setenv serverip 192.168.1.12”来指定tftp服务器的IP地址

(3)执行“saveenv”保存设置。 2、在ARM开发板上运行命令: tftp 0x30008000 uImage

(把uImage文件下载到ARM开发板的

(擦除Nand Flash中起始地址为

SDRAM中0x30008000开始的空间中) nand erase 0x80000 0x200000 0x80000,大小为0x200000的空间)

nand write 0x30008000 0x80000 0x200000 (把SDRAM中0x30008000开始的内容写入Nand Flash0x80000开始的空间内,大小为0x200000) 重启ARM开发板,执行命令“bootm”,此时液晶屏左上角出现小企鹅图案。

因篇幅问题不能全部显示,请点此查看更多更全内容