济源职业技术学院——计算机应用专业
/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 #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: > 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”,此时液晶屏左上角出现小企鹅图案。
因篇幅问题不能全部显示,请点此查看更多更全内容