【转载】Linux-2.6.32.2内核在mini2440上的移植(三)---DM9000网卡驱动移植_rootfs dm9000 移植-程序员宅基地

技术标签: driver  c/c++  

移植环境(红色粗字体字修改后内容,蓝色粗体字为特别注意内容)

1,主机环境:VMare下CentOS 5.5 ,1G内存。

2,集成开发环境:Elipse IDE

3,编译编译环境: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.08

6,linux 版本:linux-2.6.32.2

7,参考文章:

【1】嵌入式linux应用开发完全手册,韦东山,编著。

【2】Mini2440 之Linux 移植开发实战指南

【3】http://linux.chinaunix.net/techdoc/system/2009/08/24/1131864.shtml

3.1,移植DM9000 网卡驱动

【1】设备资源初始化

Linux-2..6.32.2 已经自带了完善的DM9000 网卡驱动驱动(源代码位置:linux-2.6.32.2/drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相应的结构表即可,具体步骤如下:
(1)确认已经添加了驱动所需的头文件 dm9000.h:

用gedit打开linux-2.6.32.2/arch/arm/mach-mini2440.c,定位到55行附近,加入dm9000.h,如下所示:

#include <plat/common-smdk.h>

#include <linux/mtd/mtd.h> 
#include <linux/mtd/nand.h> 
#include <linux/mtd/nand_ecc.h> 
#include <linux/mtd/partitions.h> 
#include <plat/nand.h>
#include <linux/dm9000.h>

(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 it's 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-2.6.32.2 的DM9000 网卡驱动并不是专门为mini2440 准备的,所以还要在其源代码中做一些移植工作,如下步骤。

(1)打开linux-2.6.32.2/drivers/net/dm9000.c,定位到41行附近,添加2410 相关的配置定义,如下红色部分:

#include <asm/delay.h>
#include <asm/irq.h>
#include <asm/io.h>

#include "dm9000.h"
#if defined(CONFIG_ARCH_S3C2410)
#include <mach/regs-mem.h>
#endif

(2) 在dm9000 设备的初始化函数中添加如下红色部分,这里是配置DM9000 所用片选总线的时序,因为mini2440 目前只有一个通过总线外扩的设备,在此设备驱动中直接修改相关的寄存器配置会更加容易理解一些,当然这部分也可以放到mach-mini2440.c 中。

打开linux-2.6.32.2/drivers/net/dm9000.c,定位到1555行附近,加入下面代码:

static int __init
dm9000_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 & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
 *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif 
 printk(KERN_INFO "%s Ethernet Driver, V%s\n", CARDNAME, DRV_VERSION);

 return platform_driver_register(&dm9000_driver);
}

【3】需要注意的是,本开发板所用的DM9000 网卡并没有外接EEPROM 用以存储MAC 地址,因此系统中的MAC 地址是一个“软”地址,也就是可以通过软件进行修改,可以随意改为其他值。

打开linux-2.6.32.2/drivers/net/dm9000.c,定位到1461行附近,加入下面一行代码:

static int __devinit
dm9000_probe(struct platform_device *pdev)
{

... ...

/* try reading the node address from the attached EEPROM */

//;尝试从EEPROM 读取MAC 地址
 for (i = 0; i < 6; i += 2)
  dm9000_read_eeprom(db, i / 2, ndev->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 < 6; i++)
   ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
 }

 //;使用“软”MAC 地址: 08:90:90:90:90:90
 memcpy(ndev->dev_addr, "\x08\x90\x90\x90\x90\x90", 6);

 if (!is_valid_ether_addr(ndev->dev_addr))
  dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
    "set using ifconfig\n", 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】在编译之前,需要确认在内核中已经配置了网卡驱动

在内核目录下执行:

[root@localhost linux-2.6.32.2]# make menuconfig

在打开的配置菜单Device Drivers --->Network device support ---> Ethernet (10 or 100Mbit) --->,可以看到如下图

Linux-2.6.32.2内核在mini2440上的移植(三)---DM9000网卡驱动移植 - singleboy - singleboy的博客

DM9000 已经被选中,这是因为Linux-2.6.32.2默认的内核配置已经加入了DM9000 的支持。


【2】编译

[root@localhost linux-2.6.32.2]# make clean
[root@localhost linux-2.6.32.2]# make uImage

编译完成后生成zImage 和 uImage

【3】进行网卡驱动测试

(1)采用友善官方已经移植好的根文件系统,可以从其提供的光盘映像/linux目录下直接复制过来。
[root@localhost ~]# cd linux-test
[root@localhost linux-test]# ls
busybox-1.13.3               mkyaffs2image.tgz
busybox-1.13.3-mini2440.tgz  myrootfs
busybox-1.18.4               rootfs_qtopia_qt4
busybox-1.18.4.tar.bz2       rootfs_qtopia_qt4-20110304.tar.gz
linux-2.6.32.2               usr
linux-2.6.39                 yaffs2
[root@localhost linux-test

(2)将其复制到宿主机/nfsboot目录下并命名为roorfs

[root@localhost linux-test]# cp -rf rootfs_qtopia_qt4 /nfsboot/rootfs
[root@localhost linux-test]#

并确保rootfs目录可读写

[root@localhost linux-test]# cd /nfsboot
[root@localhost nfsboot]# ls -l
总计 65280
drwxr-xr-x 18 root root     4096 06-01 19:06 rootfs
-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_T35
[root@localhost nfsboot]#

(3)修改/etc/exports配置文件将rootfs默认的共享目录

[root@localhost ~]# 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.*表示客户端所在网段10.1.0.0/24
# 10.1.0.0/24表示10.1.0.1~10.1.0.254网段,子网掩码是255.255.255.0。
# 子网掩码是怎么来的呢?其实关键就在“24”上。我们知道IP地址是四个十进制数
# 组成的,相当于32位二进制。用CIDR表示形式,后一个数字将这32位进行了间隔
#(以24为例):前24位用"1"表示,后面8位用0表示,得到一个二进制数:
# 11111111 11111111 11111111 00000000
# 将其转化为十进制,就是:255.255.255.0了。
# rw:可读写
# sync:同步写入磁盘。
# no_root_squash:允许非root用户操作改文件夹

然后保存退出,重新启动nfs服务:

[root@localhost ~]# service nfs restart
关闭 NFS mountd:                                          [确定]
关闭 NFS 守护进程:                                        [确定]
关闭 NFS quotas:                                          [确定]
关闭 NFS 服务:                                            [确定]
启动 NFS 服务:                                            [确定]
关掉 NFS 配额:                                            [确定]
启动 NFS 守护进程:                                        [确定]
启动 NFS mountd:                                          [确定]
[root@localhost ~]#

(4)修改u-boot内核引导参数

在u-boot启动并进入命令行状态下

A,确保bootargs ="noinitrd console=ttySAC0,115200 init=/linuxrc mem=64M \
 root=/dev/nfs rw nfsroot=10.1.0.128:/nfsboot \
 ip=10.1.0.129:10.1.128:10.1.0.1:255.255.255.0::eth0:off"

B,确保bootcmd="nfs 0x30008000 10.1.0.128:/nfsboot/uImage;bootm"

先查看u-boot的环境变量

 [u-boot@MINI2440]# printenv
bootargs=noinitrd console=ttySAC0,115200  init=/linuxrc root=/dev/mtdblock3 rw r
ootfstype=yaffs ip=10.1.0.129:10.1.0.128:10.1.0.1:255.255.255.0::eth0:off
bootcmd=nand read 0x30008000 0x80000 0x300000;bootm 0x30008000
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
ipaddr=10.1.0.129
serverip=10.1.0.128
gatewayip=10.1.0.1
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial
ethact=dm9000

Environment size: 405/131068 bytes
[u-boot@MINI2440]#

这里的u-boot内核引导参数bootargs和bootcmd显然与我们要求的不一致,要重新设置此参数:

[u-boot@MINI2440]# setenv bootargs 'noinitrd console=ttySAC0,115200 init=/linux'
rc mem=64M root=/dev/nfs rw nfsroot=10.1.0.128:/nfsboot/rootfs ip=10.1.0.129:10'
.1.0.128:10.1.0.1:255.255.255.0::eht0:off'
[u-boot@MINI2440]# setenv bootcmd 'nfs 0x31000000 10.1.0.128:/uImage;bootm 0x31000000'

然后保存此变量到nand flash

[u-boot@MINI2440]# saveenv
Saving 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=10.1.0.128:/nfsboot/rootfs ip=10.1.0.129 console=ttySAC0 mem=64M"

如果编译内核生成的是uImage映像文件,那么CONFIG_CMDLINE可以为空,因为uImage的文件头中的参数会被传进这个地方来。

(6)将编译生成zImage和uImage文件复制到宿主机/nfsboot/目录下

[root@localhost nfsboot]# ls
rootfs  root_qtopia-128M.img  uImage  uImage_T35  zImage  zImage_T35
[root@localhost nfsboot]# 
(7)给开发板上电,启动u-boot

I2C:   ready
DRAM:  64 MB
Flash:  2 MB
NAND:  128 MiB
Video: 240x320x16 20kHz 62Hz
In:    serial
Out:   serial
Err:   serial
Net:   dm9000
U-Boot 2009.08
modified by singleboy([email protected])
Love Linux forever!!!
Hit any key to stop autoboot:  0
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at 100M full duplex mode
Using dm9000 device
File transfer via NFS from server 10.1.0.128; our IP address is 10.1.0.129
Filename '/nfsboot/uImage'.
Load address: 0x31000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #######################
done
Bytes transferred = 2110772 (203534 hex)
## Booting kernel from Legacy Image at 31000000 ...
   Image Name:   Linux-2.6.32.2
   Created:      2011-06-01  11:10:24 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2110708 Bytes =  2 MB
   Load Address: 30008000
   Entry Point:  30008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux.............................................................
...................................................................... done, boo
ting the kernel.
Linux version 2.6.32.2 ([email protected]) (gcc version 4.4.3 (ctng-1.6
.1) ) #11 Wed Jun 1 19:10:07 CST 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177
CPU: VIVT data cache, VIVT instruction cache
Machine: my mini2440 devolopment board [email protected]

... ...

S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c24xx-nand s3c2440-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29ns
s3c24xx-nand s3c2440-nand: NAND soft ECC
NAND device: Manufacturer ID: 0xec, Chip ID: 0xf1 (Samsung NAND 128MiB 3,3V 8-bi
t)
Scanning device for bad blocks
Creating 5 MTD partitions on "NAND 128MiB 3,3V 8-bit":
0x000000000000-0x000000040000 : "boot"
0x000000040000-0x000000060000 : "param"
0x000000060000-0x000000560000 : "kernel"
0x000000560000-0x000008000000 : "rootfs"
0x000000000000-0x000008000000 : "nand"
dm9000 Ethernet Driver, V1.31
eth0: dm9000e at c486e300,c4872304 IRQ 51 MAC: 08:90:90:90:90:90 (chip)

... ...

eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
IP-Config: Complete:
     device=eth0, addr=10.1.0.129, mask=255.255.255.0, gw=10.1.0.1,
     host=10.1.0.129, domain=, nis-domain=(none),
     bootserver=10.1.0.128, rootserver=10.1.0.128, rootpath=
Looking up port of RPC 100003/2 on 10.1.0.128
Looking up port of RPC 100005/1 on 10.1.0.128
VFS: Mounted root (nfs filesystem) on device 0:14.
Freeing init memory: 132K
----------munt all----------------
***********************************************
************booting to mini2440 *****************
Kernel version:linux-2.6.32.2
the fans:singelboy
Date:2011.5.30
***********************************************

Please press Enter to activate this console.

根据内核启动信息,可以看到dm9000网卡驱动移植成功。

接下来,将为内核建立根文件系统。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/win2domain/article/details/38361225

智能推荐

BAT批处理创建文件桌面快捷方式_批处理创建桌面快捷方式-程序员宅基地

文章浏览阅读1.5w次,点赞9次,收藏26次。简介一个创建某个文件到桌面快捷方式的BAT批处理.代码@echooff::设置程序或文件的完整路径(必选)setProgram=D:\Program Files (x86)\格式工厂.4.2.0\FormatFactory.exe::设置快捷方式名称(必选)setLnkName=格式工厂v4.2.0::设置程序的工作路径,一般为程序主目录,此项若留空,脚本将..._批处理创建桌面快捷方式

射频识别技术漫谈(6-10)_芯片 ttf模式-程序员宅基地

文章浏览阅读2k次。射频识别技术漫谈(6-10),概述RFID的通讯协议;射频ID卡的原理与实现,数据的传输与解码;介绍动物标签属性与数据传输;RFID识别号的变化等_芯片 ttf模式

Python 项目实战 —— 手把手教你使用 Django 框架实现支付宝付款_django 对接支付宝接口流程-程序员宅基地

文章浏览阅读1.1k次。今天小编心血来潮,为大家带来一个很有趣的项目,那就是使用 Python web 框架 Django 来实现支付宝支付,废话不多说,一起来看看如何实现吧。_django 对接支付宝接口流程

Zabbix 5.0 LTS在清理历史数据后最新数据不更新_zabbix问题没有更新-程序员宅基地

文章浏览阅读842次。Zabbix 5.0 LTS,跑了一年多了一直很稳定,前两天空间显示快满了,于是手贱清理了一下history_uint表(使用mysql truncate),结果折腾了一周。大概故障如下:然后zabbix论坛、各种群问了好久都没解决,最后自己一番折腾似乎搞定了。初步怀疑,应该是由于历史数据被清空后,zabbix需要去处理数据,但是数据量太大,跑不过来,所以来不及更新了(?)..._zabbix问题没有更新

python学习历程_基础知识(2day)-程序员宅基地

文章浏览阅读296次。一、数据结构之字典 key-value

mybatis-plus字段策略注解strategy_mybatisplus strategy-程序员宅基地

文章浏览阅读9.7k次,点赞3次,收藏13次。最近项目中遇到一个问题,是关于mybatis-plus的字段注解策略,记录一下。1问题调用了A组件(基础组件),来更新自身组件的数据,发现自己组件有个字段总是被清空。2原因分析调用的A组件的字段,属于基础字段,自己业务组件,对这个基础字段做了扩展,增加了业务字段。但是在自己的组件中的实体注解上,有一个注解使用错误。mybatis-plus封装的updateById方法,如果..._mybatisplus strategy

随便推点

信息检索笔记-索引构建_为某一文档及集构件词项索引时,可使用哪些索引构建方法-程序员宅基地

文章浏览阅读3.8k次。如何构建倒排索引,我们将这个过程叫做“索引构建”。如果我们的文档很多,这样索引就一次性装不下内存,该如何构建。硬件的限制 我们知道ram读写是随机的操作,只要输入相应的地址单元就能瞬间将数据读出来或者写进去。但是磁盘不行,磁盘必须有一个寻道的过程,外加一个旋转时间。那么只有涉及到磁盘,我们就可以考虑怎么节省I/O操作时间。【注】操作系统往往以数据块为单位进行读写。因为读一_为某一文档及集构件词项索引时,可使用哪些索引构建方法

IT巨头英特尔看好中国市场前景-程序员宅基地

文章浏览阅读836次。英特尔技术与制造事业部副总裁卞成刚7日在财富论坛间隙接受中新社记者采访时表示,该公司看好中国市场前景,扎根中国并以此走向世界是目前最重要的战略之一。卞成刚说,目前该公司正面临战略转型,即从传统PC服务领域扩展至所有智能设施领域,特别是移动终端。而中国目前正引领全球手机市场,预计未来手机、平板电脑等方面的发明创新将大量在中国市场涌现,并推向全球。持相同态度的还有英特尔中国区执行董事戈峻。戈峻

ceph中的radosgw相关总结_radosgw -c-程序员宅基地

文章浏览阅读627次。https://blog.csdn.net/zrs19800702/article/details/53101213http://blog.csdn.net/lzw06061139/article/details/51445311https://my.oschina.net/linuxhunter/blog/654080rgw 概述Ceph 通过radosgw提供RES..._radosgw -c

前端数据可视化ECharts使用指南——制作时间序列数据的可视化曲线_echarts 时间序列-程序员宅基地

文章浏览阅读3.7k次,点赞6次,收藏9次。我为什么选择ECharts ? 本周学校课程设计,原本随机佛系选了一个51单片机来做音乐播放器,结果在粗略玩了CN-DBpedia两天后才回过神,课设还没有开始整。于是懒癌发作,碍于身上还有比赛的作品没交,本菜鸡对硬件也没啥天赋,所以就直接把题目切换成软件方面的题目。写python的同学选择了一个时间序列数据的可视化曲线程序设计题目,果真python在数据可视化这一点性能很优秀。..._echarts 时间序列

ApplicationEventPublisherAware事件发布-程序员宅基地

文章浏览阅读1.6k次。事件类:/** * *   * @className: EarlyWarnPublishEvent *   * @description:数据风险预警发布事件 *   * @param: *   * @return: *   * @throws: *   * @author: lizz *   * @date: 2020/05/06 15:31 * */public cl..._applicationeventpublisheraware

自定义View实现仿朋友圈的图片查看器,缩放、双击、移动、回弹、下滑退出及动画等_imageview图片边界回弹-程序员宅基地

文章浏览阅读1.2k次。如需转载请注明出处!点击小图片转到图片查看的页面在Android开发中很常用到,抱着学习和分享的心态,在这里写下自己自定义的一个ImageView,可以实现类似微信朋友圈中查看图片的功能和效果。主要功能需求:1.缩放限制:自由缩放,有最大和最小的缩放限制 2居中显示:.若图片没充满整个ImageView,则缩放过程将图片居中 3.双击缩放:根据当前缩放的状态,双击放大两倍或缩小到原来 4.单指_imageview图片边界回弹