Linux-2.6.32.2内核在mini2440上的移植(三).doc_第1页
Linux-2.6.32.2内核在mini2440上的移植(三).doc_第2页
Linux-2.6.32.2内核在mini2440上的移植(三).doc_第3页
Linux-2.6.32.2内核在mini2440上的移植(三).doc_第4页
Linux-2.6.32.2内核在mini2440上的移植(三).doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux-内核在mini2440上的移植(三)-DM9000网卡驱动移植 移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容)1,主机环境:VMare下CentOS 5.5 ,1G内存。2,集成开发环境:Elipse IDE3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。4,开发板:mini2440,2M nor flash,128M nand flash。5,u-boot版本:u-boot-2009.086,linux 版本:linux-7,参考文章:【1】嵌入式linux应用开发完全手册,韦东山,编著。【2】Mini2440 之Linux 移植开发实战指南【3】/techdoc/system/2009/08/24/1131864.shtml3.1,移植DM9000 网卡驱动【1】设备资源初始化Linux- 已经自带了完善的DM9000 网卡驱动驱动(源代码位置:linux-/drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相应的结构表即可,具体步骤如下:(1)确认已经添加了驱动所需的头文件 dm9000.h:用gedit打开linux-/arch/arm/mach-mini2440.c,定位到55行附近,加入dm9000.h,如下所示:#include #include #include #include #include #include #include (2)填充该平台设备的资源设置定位到210行附近,如入下面代码:tatic struct s3c2410_platform_nand mini2440_nand_info = .tacls = 20,.twrph0 = 60,.twrph1 = 20,.nr_sets = ARRAY_SIZE(mini2440_nand_sets),.sets = mini2440_nand_sets,.ignore_unset_ecc = 1,;/* DM9000AEP 10/100 ethernet controller */ /定义DM9000 网卡设备的物理基地址,以便后面用到#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)/再填充该平台设备的资源设置,以便和 DM9000 网卡驱动接口配合起来static struct resource mini2440_dm9k_resource = 0 = .start = MACH_MINI2440_DM9K_BASE,.end = MACH_MINI2440_DM9K_BASE + 3,.flags = IORESOURCE_MEM,1 = .start = MACH_MINI2440_DM9K_BASE + 4,.end = MACH_MINI2440_DM9K_BASE + 7,.flags = IORESOURCE_MEM,2 = .start = IRQ_EINT7,.end = IRQ_EINT7,.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,;/* * The DM9000 has no eeprom, and its MAC address is set by* * the bootloader before starting the kernel.* */static struct dm9000_plat_data mini2440_dm9k_pdata = .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),;static struct platform_device mini2440_device_eth = .name = dm9000,.id = -1,.num_resources = ARRAY_SIZE(mini2440_dm9k_resource),.resource = mini2440_dm9k_resource,.dev = .platform_data = &mini2440_dm9k_pdata,;static struct platform_device *mini2440_devices _initdata = &s3c_device_usb,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c0,&s3c_device_iis,&s3c_device_nand, /;把nand flash 设备添加到开发板的设备列表结构&mini2440_device_eth, /;把网卡平台设备添加到开发板的设备列表结构;static void _init mini2440_map_io(void)【2】调整DM9000 所用的位宽寄存器因为 Linux- 的DM9000 网卡驱动并不是专门为mini2440 准备的,所以还要在其源代码中做一些移植工作,如下步骤。(1)打开linux-/drivers/net/dm9000.c,定位到41行附近,添加2410 相关的配置定义,如下红色部分:#include #include #include #include dm9000.h#if defined(CONFIG_ARCH_S3C2410)#include #endif(2) 在dm9000 设备的初始化函数中添加如下红色部分,这里是配置DM9000 所用片选总线的时序,因为mini2440 目前只有一个通过总线外扩的设备,在此设备驱动中直接修改相关的寄存器配置会更加容易理解一些,当然这部分也可以放到mach-mini2440.c 中。打开linux-/drivers/net/dm9000.c,定位到1555行附近,加入下面代码:static int _initdm9000_init(void)#if defined(CONFIG_ARCH_S3C2410)unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;*(volatile unsigned int *)S3C2410_BWSCON) =(oldval_bwscon & (316) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;*(volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;#endif printk(KERN_INFO %s Ethernet Driver, V%sn, CARDNAME, DRV_VERSION);return platform_driver_register(&dm9000_driver);【3】需要注意的是,本开发板所用的DM9000 网卡并没有外接EEPROM 用以存储MAC 地址,因此系统中的MAC 地址是一个“软”地址,也就是可以通过软件进行修改,可以随意改为其他值。打开linux-/drivers/net/dm9000.c,定位到1461行附近,加入下面一行代码:static int _devinitdm9000_probe(struct platform_device *pdev). ./* try reading the node address from the attached EEPROM */;尝试从EEPROM 读取MAC 地址for (i = 0; i dev_addr+i);if (!is_valid_ether_addr(ndev-dev_addr) & pdata != NULL) mac_src = platform data;memcpy(ndev-dev_addr, pdata-dev_addr, 6);if (!is_valid_ether_addr(ndev-dev_addr) /* try reading from mac */mac_src = chip;for (i = 0; i dev_addri = ior(db, i+DM9000_PAR);/;使用“软”MAC 地址: 08:90:90:90:90:90memcpy(ndev-dev_addr, x08x90x90x90x90x90, 6);if (!is_valid_ether_addr(ndev-dev_addr)dev_warn(db-dev, %s: Invalid ethernet MAC address. Please set using ifconfign, ndev-name);platform_set_drvdata(pdev, ndev);ret = register_netdev(ndev);if (ret = 0)printk(KERN_INFO %s: dm9000%c at %p,%p IRQ %d MAC: %pM (%s)n,ndev-name, dm9000_type_to_char(db-type),db-io_addr, db-io_data, ndev-irq,ndev-dev_addr, mac_src);return 0;out:dev_err(db-dev, not found (%d).n, ret);dm9000_release_board(pdev, db);free_netdev(ndev);return ret;实际上到此为止 DM9000 就已经移植结束了。3.2,编译测试【1】在编译之前,需要确认在内核中已经配置了网卡驱动在内核目录下执行:rootlocalhost linux-# make menuconfig在打开的配置菜单Device Drivers -Network device support - Ethernet (10 or 100Mbit) -,可以看到如下图DM9000 已经被选中,这是因为Linux-默认的内核配置已经加入了DM9000 的支持。【2】编译rootlocalhost linux-# make cleanrootlocalhost linux-# make uImage编译完成后生成zImage 和 uImage【3】进行网卡驱动测试(1)采用友善官方已经移植好的根文件系统,可以从其提供的光盘映像/linux目录下直接复制过来。rootlocalhost # cd linux-testrootlocalhost linux-test# lsbusybox-1.13.3 mkyaffs2image.tgzbusybox-1.13.3-mini2440.tgz myrootfsbusybox-1.18.4 rootfs_qtopia_qt4busybox-1.18.4.tar.bz2 rootfs_qtopia_qt4-20110304.tar.gzlinux- usrlinux-2.6.39 yaffs2rootlocalhost linux-test(2)将其复制到宿主机/nfsboot目录下并命名为roorfsrootlocalhost linux-test# cp -rf rootfs_qtopia_qt4 /nfsboot/rootfsrootlocalhost linux-test# 并确保rootfs目录可读写rootlocalhost linux-test# cd /nfsbootrootlocalhost nfsboot# ls -l总计 65280drwxr-xr-x 18 root root 4096 06-01 19:06rootfs-rwxrw-rw- 1 root root 58487616 2009-07-18 root_qtopia-128M.img-rw-r-r- 1 root root 2110720 06-01 13:31 uImage-rwxr-xr-x 1 root root 2022412 05-12 11:37 uImage_T35-rwxr-xr-x 1 root root 2110656 06-01 13:31 zImage-rwxrw-rw- 1 root root 2022348 2009-07-08 zImage_T35rootlocalhost nfsboot# (3)修改/etc/exports配置文件将rootfs默认的共享目录rootlocalhost # vim /etc/exports打开的配置文件将共享目录修改成如下所示:/nfsboot/rootfs 10.1.0.*(rw,sync,no_root_squash)/nfsboot/kernel 10.1.0.*(rw,sync,no_root_squash)/nfsboot/nfs 10.1.0.*(rw,sync,no_root_squash)# /nfsboot/rootfs 是共享目录,存放跟文件系统(使用绝对路径)# /nfsboot/kernel 是共享目录,存放跟文件系统(使用绝对路径)# /nfsboot/nfs 是共享目录,存放应用程序(使用绝对路径)# 10.1.0.*表示客户端所在网段/24# /24表示54网段,子网掩码是。# 子网掩码是怎么来的呢?其实关键就在“24”上。我们知道IP地址是四个十进制数# 组成的,相当于32位二进制。用CIDR表示形式,后一个数字将这32位进行了间隔#(以24为例):前24位用1表示,后面8位用0表示,得到一个二进制数:# 11111111 11111111 11111111 00000000# 将其转化为十进制,就是:了。# rw:可读写# sync:同步写入磁盘。# no_root_squash:允许非root用户操作改文件夹然后保存退出,重新启动nfs服务:rootlocalhost # service nfs restart关闭 NFS mountd: 确定关闭 NFS 守护进程: 确定关闭 NFS quotas: 确定关闭 NFS 服务: 确定启动 NFS 服务: 确定关掉 NFS 配额: 确定启动 NFS 守护进程: 确定启动 NFS mountd: 确定rootlocalhost # (4)修改u-boot内核引导参数在u-boot启动并进入命令行状态下A,确保bootargs =noinitrd console=ttySAC0,115200 init=/linuxrc mem=64M root=/dev/nfs rw nfsroot=28:/nfsboot ip=29:10.1.128:::eth0:offB,确保bootcmd=nfs 0x30008000 28:/nfsboot/uImage;bootm先查看u-boot的环境变量u-bootMINI2440# printenvbootargs=noinitrd console=ttySAC0,115200 init=/linuxrc root=/dev/mtdblock3 rw rootfstype=yaffs ip=29:28:::eth0:offbootcmd=nand read 0x30008000 0x80000 0x300000;bootm 0x30008000bootdelay=3baudrate=115200ethaddr=08:00:3e:26:0a:5bipaddr=29serverip=28gatewayip=netmask=stdin=serialstdout=serialstderr=serialethact=dm9000Environment size: 405/131068 bytesu-bootMINI2440#这里的u-boot内核引导参数bootargs和bootcmd显然与我们要求的不一致,要重新设置此参数:u-bootMINI2440# setenv bootargs noinitrd console=ttySAC0,115200 init=/linuxrc mem=64M root=/dev/nfs rw nfsroot=28:/nfsboot/rootfs ip=29:28:::eht0:offu-bootMINI2440# setenv bootcmd nfs 0x31000000 28:/uImage;bootm 0x31000000然后保存此变量到nand flashu-bootMINI2440# saveenvSaving Environment to NAND.Erasing Nand.Erasing at 0x4000000000002 - 0% complete.Writing to Nand. done有关内核引导参数的含义请参照u-boot-2009.08在mini2440上的移植(六)-增加引导内核功能。(5)确认内核的命令行参数如果编译内核生成的是zImage映像文件,那么CONFIG_CMDLINE需要CONFIG_CMDLINE=root=/dev/nfs rw nfsroot=28:/nfsboot/rootfs ip=29 console=ttySAC0 mem=64M如果编译内核生成的是uImage映像文件,那么CONFIG_CMDLINE可以为空,因为uImage的文件头中的参数会被传进这个地方来。(6)将编译生成zImage和uImage文件复制到宿主机/nfsboot/目录下rootlocalhost nfsboot# lsrootfs root_qtopia-128M.img uImage uImage_T35 zImage zImage_T35rootlocalhost nfsboot# (7)给开发板上电,启动u-bootI2C: readyDRAM: 64 MBFlash: 2 MBNAND: 128 MiBVideo: 240x320x16 20kHz 62HzIn: serialOut: serialErr: serialNet: dm9000U-Boot 2009.08modified by singleboy()Love Linux forever!Hit any key to stop autoboot: 0dm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 08:00:3e:26:0a:5boperating at 100M full duplex modeUsing dm9000 deviceFile transfer via NFS from server 28; our IP address is 29Filename /nfsboot/uImage.Load address: 0x31000000Loading: #doneBytes transferred = 2110772 (203534 hex)# Booting kernel from Legacy Image at 31000000 .Image Name: Linux-Created: 2011-06-01 11:10:24 UTCImage Type: ARM Linux Kernel Image (uncompressed)Data Size: 2110708 Bytes = 2 MBLoad Address: 30008000Entry Point: 30008000Verifying Checksum . OKLoading Kernel Image . OKOKStarting kernel .Uncompressing Linux. done, booting the kernel.Linux version (rootlocalhost.localdomain) (gcc version 4.4.3 (ctng-1.6.1) ) #11 Wed Jun 1 19:10:07 CST 2011CPU: ARM920T 41129200 revision 0 (ARMv4T), cr=00007177CPU: VIVT data cache, VIVT instruction cacheMachine: my mini2440 devolopment board . .S3C24XX NAND Driver, (c) 2004 Simtec Electronicss3c24xx-nand s3c2440-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29nss3c24xx-nand s3c2440-nand: NAND soft

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论