u-boot 移植 --->5、友善之臂Tiny210底板王网卡驱动移植

发布者:温暖梦想最新更新时间:2024-12-23 来源: cnblogs关键字:u-boot  移植  网卡驱动移植 手机看文章 扫描二维码
随时随地手机看文章

网卡芯片的工作原理

DM9000AE具有以下主要性能:

①48管脚的LQFP封装,管脚少体积小;

②支持8/16位数据总线;

③适用于10Base-T和100Base-T,10/100M自适应,适应不同的网络速度要求

④内置16KB的SRAM,用于收发缓冲,降低对主处理器的速度要求;

⑤支持IP /TCP /UDP加速,减轻了CPU负担,提高网络速度;⑥支持Back pressure半双工流量控制,与IEEE802.3u兼容,支持IEEE802.3x全双工流量控制;

⑦20ns响应时间,2.5V/3.3V低功耗。下图是DM9000网卡芯片常用在嵌入式网络系统上的结构框图。

 

 数据支持8位和16位,不同模式下的PIN脚定义是不相同额,就拿16bit数据位宽来说。如下

 

 其中RX和TX和LED是到隔离变压器的,X1和2为工作时钟晶振接入。CS为片选脚,默认低电平有效,可通过内部EEPROM配置。SD为数据脚,INT为接受到数据并校验正确后的中断信号,一般接到处理器的中断脚上。EE打头的脚是用来操作内部eeprom的。其中32脚为CMD脚,他是控制数据交换的主要脚,SD脚负责数据传输。通过手册可以知道CPU总线只访问它的两个地址,CMD管脚为0时,数据线送的是DM9000的寄存器地址,CMD管脚为1时,数据线上送的是16位的寄存器数据,所以对DM9000的操作至少需要两步:先写地址,再写(读)数据。这样CPU和他的数据交换原理就清楚了。下面是我的硬件的原理图

 

 

 

 这里看到他将这个芯片接在了SOC内存接口0上,通过三星的手册知道芯片的这个接口可以支持访问外部8/16bit的 norflash、SRAM等,共支持6个bank。由片选脚的编号可以知道网卡被安排在bank1上,所以上面芯片内存map图,知道地址为88000000~8fffffff。中断脚接在了芯片的外部中断7脚上。知道这些信息就可以修改Uboot中的代码以使我们的板子支持这个网卡芯片了。

代码修改

先直接通过menuconfig使能Networking support 并选择DM9000网卡驱动,烧写后启动提示(这个图是我当时调试参考的博主的博客中的因为自己当时调试忘记截图了。。。)

根据提示信息找打打印这一段信息的代码位置在board_r.c这个文件中,可见我通过menuconfig启用网络实际上就是在配置文件中增加CONFIG_CMD_NET 这个宏


#ifdef CONFIG_CMD_NET

static int initr_net(void)

{

    puts('Net:   ');

    eth_initialize();

#if defined(CONFIG_RESET_PHY_R)

    debug('Reset Ethernet PHYn');

    reset_phy();

#endif

    return 0;

}

#endif


继续向下看里面的各个函数内部的实现


int eth_initialize(void)

{

    int num_devices = 0;


    eth_devices = NULL;

    eth_current = NULL;

    eth_common_init();

    /*

     * If board-specific initialization exists, call it.

     * If not, call a CPU-specific one

     */

    if (board_eth_init != __def_eth_init) {

        if (board_eth_init(gd->bd) < 0)

            printf('Board Net Initialization Failedn');

    } else if (cpu_eth_init != __def_eth_init) {

        if (cpu_eth_init(gd->bd) < 0)

            printf('CPU Net Initialization Failedn');

    } else {

        printf('Net Initialization Skippedn');

    }


    if (!eth_devices) {

        puts('No ethernet found.n');

        bootstage_error(BOOTSTAGE_ID_NET_ETH_START);

    } else {

        struct eth_device *dev = eth_devices;

        char *ethprime = getenv('ethprime');


        bootstage_mark(BOOTSTAGE_ID_NET_ETH_INIT);

        do {

            if (dev->index)

                puts(', ');


            printf('%s', dev->name);


            if (ethprime && strcmp(dev->name, ethprime) == 0) {

                eth_current = dev;

                puts(' [PRIME]');

            }


            if (strchr(dev->name, ' '))

                puts('nWarning: eth device name has a space!'

                    'n');


            eth_write_hwaddr(dev, 'eth', dev->index);


            dev = dev->next;

            num_devices++;

        } while (dev != eth_devices);


        eth_current_changed();

        putc('n');

    }


    return num_devices;

}


这里主要是u-boot的为了增加他的通用性和兼容所以内部机制复杂了一些,首先判断板级和CPU级的网络配置接口是否定义,具体的处理就是如果板级和cpu级的配置接口都在则优先执行board的网络初始化,通过打印内容可以很清楚的看到实际上我们现在是都未定义所以执行最后的else分支打印了上面的log信息。所以我们需要自己实现两者其中之一,移植大法就是参考已有的,通过在u-boot代码中找到我们自己的硬件比较相似的现成驱动来参考,全局搜索最后选择使用三星的smdk100他使用了网卡所以可以借鉴他的实现


int board_eth_init(bd_t *bis)

{

    int rc = 0;

#ifdef CONFIG_SMC911X    

    rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);

#endif

    return rc;

}


发现他使用的网卡是SMC911x系列的和我们的并不相同,还是找参考找和我手上相同的网卡的初始化驱动代码来参考,最后找到u-boot内部自带自带的dm9000x.c这个驱动文件,他就是实现好了网卡的初始化而且这个驱动封装的非常容易移植,通用的的部分内部实现不通用的部分留给移植实现如下


int dm9000_initialize(bd_t *bis)

{

    struct eth_device *dev = &(dm9000_info.netdev);


    /* Load MAC address from EEPROM */

    dm9000_get_enetaddr(dev);


    dev->init = dm9000_init;

    dev->halt = dm9000_halt;

    dev->send = dm9000_send;

    dev->recv = dm9000_rx;

    strcpy(dev->name, 'dm9000');


    eth_register(dev);


    return 0;

}


这里我在我的板级文件s5pc210.c的文件中增加这个接口内容如下同时还需要通过menuconfig使能dm9000x的驱动:


int board_eth_init(bd_t *bis)

{

    int rc = 0;

#ifdef CONFIG_DRIVER_DM9000

    rc = dm9000_initialize(bis);

#endif

    return rc;

}


接下来还要继续实现一下具体的不通用的部分的部分,因为SMC911x和DM9000的工作原理类似就如同我前面介绍的一样,他们都是作为ROM实现接在CPU存储器控制总线上的所以当然也需要初始化CPU的存储器控制接口,这也是参考smdk100进行修改最后如下


static void dm9000_pre_init(void)

{

    u32 smc_bw_conf, smc_bc_conf;

 

     

    /* gpio configuration GPK0CON */

    gpio_cfg_pin(S5PC110_GPIO_MP010 + CONFIG_ENV_SROM_BANK, S5P_GPIO_FUNC(2));

 

    /* Ethernet needs bus width of 16 bits */

    smc_bw_conf = SMC_DATA16_WIDTH(CONFIG_ENV_SROM_BANK)    |   

                    SMC_BYTE_ADDR_MODE(CONFIG_ENV_SROM_BANK)|

                    SMC_WAIT_ENABLE(CONFIG_ENV_SROM_BANK)   |   

                    SMC_BYTE_ENABLE(CONFIG_ENV_SROM_BANK);

 

    smc_bc_conf = SMC_BC_TACS(0x0) | SMC_BC_TCOS(0x1) | SMC_BC_TACC(0x3)

                | SMC_BC_TCOH(0x1) | SMC_BC_TAH(0x0)

                | SMC_BC_TACP(0x0) | SMC_BC_PMC(0x0);

 

    /* Select and configure the SROMC bank */

    s5p_config_sromc(CONFIG_ENV_SROM_BANK, smc_bw_conf, smc_bc_conf);

}


其中主要修改索对应的BANK,IO接口和硬件接口时序时间控制参数相关的内容,然后在板级初始化文件中调用完成硬件的提前初始化,从而保证后面DM9000网卡驱动工作时的硬件基础


int board_init(void)

{

    #ifdef CONFIG_CMD_NET

    dm9000_pre_init();

    #endif

    /* Set Initial global variables */

    gd->bd->bi_arch_number = MACH_TYPE_S5PV210;

    gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;


    return 0;

}


其实当时调试的时候我还在好奇dm9000的驱动是怎么和具体额硬件操作关联起来的,最后再看前面原理的时候就焕然大悟了,因为DM9000是作为ROM挂接在CPU的存储器总线上的,自然由CPU内部总线直接访问到网卡,而需要知道的就是网卡芯片作为ROM到底映射在了内存接口总线上的哪一个地址空间这是dm9000网卡的内部寄存器相关的就直接映射到CPU的存储总线地址空间了,这地址映射这一部分就是在dm9000_pre_init()处理接口中完成的这一部分涉及具体CPU的存储总线接口的初始化和工作原理,所以需要先了解这部分内容才是理解这部分的关键。

然后重新编译烧录SD卡启动如下(图片同上唯一的不同是我当时为出现地址为设置的提示,因为在板级文件中我指定了MAC地址)

 

 u-boot的调试过程网络驱动的移植十分重要,他可以大大的简化后面的调试移植内核的工作,要不然就是需要修改编译一次内核就的插拔SD卡拷贝新的内核镜像文件到SD在重新启动,移植完了网络驱动在通过配置u-boot就支持ftp从而配合交叉编译的机器搭建tfp服务器后就很方便的可以从网络加载内核镜像进行调试移植内核和驱动了。这篇博客写作中间简短了一段时间所以效果不太好,但是总是要做完所以这里就强行结束了。不过在当时移植的时候是遇到了不少坑的,以后长点心及时记录不然 坑复坑。这里需要感谢一个博主是他的博客给力我很大的帮助从移植u-boot和Linux内核即部分驱动的开发。

关键字:u-boot  移植  网卡驱动移植 引用地址:u-boot 移植 --->5、友善之臂Tiny210底板王网卡驱动移植

上一篇:u-boot 移植 --->7、u-bootl流程粗线条梳理
下一篇:u-boot 移植 --->4、Tiny210核心板的DDR初始化下详解

推荐阅读最新更新时间:2026-03-24 15:20

u-boot-2009.08在mini2440上的移植 增加DM9000网卡驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 u-boot-2009.08版本已经对CS8900、RTL8019和DM9000X等网卡有比较完善的代码支持(代码在drivers/net/目录下),而且在S3C24XX系列中默认对CS8900网卡进行配置使用。而mini2440开发板使用的则是DM9000网卡芯片
[单片机]
linux-2.6.32在mini2440开发板上移植*移植DM9000 网卡驱动
1 设备资源初始化 Linux-2..6.32.2 已经自带了完善的DM9000 网卡驱动驱动(源代码位置:linux-2.6.32.2/ drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相 应的结构表即可,具体步骤如下: 首先添加驱动所需的头文件dm9000.h: #include linux/dm9000.h 再定义DM9000 网卡设备的物理基地址,以便后面用到: /* DM9000AEP 10/100 ethernet controller */ #define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300) 再填充该平台
[单片机]
linux 2.6.24.4在S3C2410上的移植(CS8900网卡驱动)(基于GEC2410)
SMDK2410配置默认使用的是DM9000A的网卡,因此我们需要修改成CS8900A的网卡驱动. 网上找到移植方法有两种方法,一种是将以前版本的cs8900.c驱动拿过来用,只要在配置中增加ARM_CS8900选项,这个代码网上有很多,拿过来试了以下,的确没问题. 另一种方法是修改2.6.24.4自带的cs89x0.c驱动,这个驱动没有2410的直接支持,我们需要修改. 这里采用第二种方法.参考了网上很多方法,将我的步骤整理如下,如有错误,欢迎指正. 1.内核配置菜单 由于cs89x0驱动依赖于NET_PCI,见drivers/net/Kconfig depends on NET_PCI && (ISA || M
[单片机]
u-boot 移植 --->6、引导Linux启动测试
在引导Linux开机之前需要先清楚Linux启动的必要或者说是先决条件,这里就是提到了u-boot的作用了引用百度云---主要用于嵌入式系统的引导加载,其实在我调试下来总结一下就是初始化硬件这里的硬件包括必要部分和不必要的部分,比如SOC的时钟,外部RAM(DDR内存),栈等。因为linux的内核相对于SOC内部的RAM而言还是比较庞大的,并且运行Linux的SOC的主频普遍是比较高的,受限于flash的访问速度,Linux肯定是不能像单片机的程序一样放在片上flash运行的,毕竟在48M以上的时候常见的单片机都是需要加wait以匹配CPU和flash的速度差距了。所以u-boot一定的需要先初始化好RAM(DDR)然后将linu
[单片机]
U-boot内核移植步骤
Linux 3.3.5系统移植 将arch/arm/mach-s3c6410/下的,mach-smdk6410.c cp为mach-my6410.c; 打开arch/arm/mach-s3c6410/下的Kconfig,仿照MACH_SMDK6410做一个菜单项: config MACH_MY6410 bool MY6410 select CPU_S3C6410 select SAMSUNG_DEV_ADC select S3C_DEV_HSMMC select S3C_DEV_HSMMC1 select S3C_DEV_I2C1 select SAMSUNG_DEV_IDE select
[单片机]
S3C6410移植u-boot
  1、下载uboot http://ftp.denx.de/pub/u-boot/   2、解压文件 tar xvf u-boot-latest.tar.bz2   3、进入uboot根目录、接着开始修改文件   4、创建板级文件目录 cd /borad/samsung mkdir smdk6410   5、复制smdk6400文件到创建的文件目录 cp smdk6400/* smdk6410/   6、修改目录下的文件名 cd smdk6410 mv smdk6400.c smdk6410.c mv smdk6400_nand_spl.c smdk6410_nand_spl.c   7、修改板级文件内容
[单片机]
U-Boot移植(7)总结U-Boot工程的总体结构
3、u-boot的通用目录是怎么做到与平台无关的? include/configs/100ask24x0.h 这个头文件中主要定义了两类变量。  一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等,主要用来决定是否编译某些文件或者函数。 另一类是参数,前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。这些常数参量主要用来支持通用目录中的代码,定义板子资源参数。 这两类宏定义对u-boot的移植性非常关键,比如drivers/cs8900.c,对cs8900而言,很多操作都是通用的,但不是所有的板子上面都有这个芯片,即使有它在内存中映射的基地址也是平台相关的。所以对于smdk2410板,在s
[单片机]
U-Boot移植(9)u-boot主要的数据结构
u-boot的主要功能是用于引导OS的,但是本身也提供许多强大的功能,可以通过输入命令行来完成许多操作。所以它本身也是一个很完备的系统。u-boot的大部分操作都是围绕它自身的数据结构,这些数据结构是通用的,但是不同的板子初始化这些数据就不一样了。所以u-boot的通用代码是依赖于这些重要的数据结构的。这里说的数据结构其实就是一些全局变量。  1)gd 全局数据变量指针,它保存了u-boot运行需要的全局数据,类型定义:  typedef struct global_data { bd_t *bd; //board data pointor板子数据指针 unsigned long flags;  /
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved