u-boot移植(十二)---代码修改---支持DM9000网卡

发布者:EnchantedBreeze最新更新时间:2023-07-03 来源: elecfans关键字:u-boot  移植  DM9000网卡 手机看文章 扫描二维码
随时随地手机看文章

一、准备工作

1.1 原理图

  

  CONFIG_DM9000_BASE

  片选信号是接在nGCS4引脚,若要确定网卡的基地址,则要根据片选信号的接口去确定。

  在三星2440的DATASHEET中memory control这一章的Figure 5-1. S3C2440A Memory Map after Reset 已经说明了片选4的地址,如下:

  

  只要发出的信号在 0x20000000--0x28000000 之间,就会使得片选4引脚变为低电平。所以可以确定我们网卡的基地址为0x20000000。

  CONFIG_DM9000_IO 和CONFIG_DM9000_DATA

   LADDR2 接在网卡的CMD引脚上,即CPU在LADDR2上发出高电平或低电平的时候可以去访问某个地址。这些地址称为IO地址和DATA地址。

  LADDR2 对应 100,即为4。

  之后就是位宽要确定,根据原理图,可以确定的是DM9000为16位的位宽(LDATA0~LADATA15)。那么要设置BWSCON寄存器

  

  DW4应该置1。这一项可以更改 low_level_init 中的寄存器的值进行设置。

  再检查时序,时序在BANKCON4寄存器中设置,默认值也可以,寄存器也在low_level_init 中的寄存器的值进行设置。

  修改下Toch的值,改为2个时钟的保持时间。

  

1.2 修改参数

  u-boot 中已经有了DM9000的驱动,即dm9000x.c,现在要将DM9000的网卡驱动加进u-boot中进行编译。

  在drivers/net/Makefile文件中已经加进了dm9000x.c的编译文件,如下:

  

  现在要修改include/configs/jz2440.h文件,来支持dm9000x:

  

  改为:

  

  编译运行一次:

  

  运行成功,烧写:

  

二、代码修改

  搜索:No ethernet found.

  

  这里涉及到两个函数 eth_initialize 和 eth_init

    查看board_r.c中的init_sequence_r链表,找到网路的初始化程序。

  

  进入查看:

  

  这里调用的是 eth_initialize()函数。

  

  根据打印信息可以确定是调用的下面的那个。

  

  由代码可以看出  应该是在 eth_common_init()函数中初始化失败导致eth_devices初始化失败的。

  

  代码中调用了board_eth_init函数Jz2440.c (boardsamsungjz2440):

  

  这里只定义了 CONFIG_CS8900 并没有9000网卡,修改代码:

  

  编译运行:

  

  报告有错误:dm9000 address not set

  MAC地址未设置。

  对着打印信息查看代码,可以知道打印此条信息的代码是eth_write_hwaddr这个函数,这个函数在eth_initlize中调用:

 1 int eth_write_hwaddr(struct eth_device *dev, const char *base_name,

 2            int eth_number)

 3 {

 4     unsigned char env_enetaddr[6];

 5     int ret = 0;

 6 

 7     eth_getenv_enetaddr_by_index(base_name, eth_number, env_enetaddr);

 8 

 9     if (!is_zero_ethaddr(env_enetaddr)) {

10         if (!is_zero_ethaddr(dev->enetaddr) &&

11             memcmp(dev->enetaddr, env_enetaddr, 6)) {

12             printf("nWarning: %s MAC addresses don't match:n",

13                    dev->name);

14             printf("Address in SROM is         %pMn",

15                    dev->enetaddr);

16             printf("Address in environment is  %pMn",

17                    env_enetaddr);

18         }

19 

20         memcpy(dev->enetaddr, env_enetaddr, 6);

21     } else if (is_valid_ethaddr(dev->enetaddr)) {

22         eth_setenv_enetaddr_by_index(base_name, eth_number,

23                          dev->enetaddr);

24     } else if (is_zero_ethaddr(dev->enetaddr)) {

25 #ifdef CONFIG_NET_RANDOM_ETHADDR

26         net_random_ethaddr(dev->enetaddr);

27         printf("nWarning: %s (eth%d) using random MAC address - %pMn",

28                dev->name, eth_number, dev->enetaddr);

29 #else

30         printf("nError: %s address not set.n",

31                dev->name);

32         return -EINVAL;

33 #endif

34     }

35 

36     if (dev->write_hwaddr && !eth_mac_skip(eth_number)) {

37         if (!is_valid_ethaddr(dev->enetaddr)) {

38             printf("nError: %s address %pM illegal valuen",

39                    dev->name, dev->enetaddr);

40             return -EINVAL;

41         }

42 

43         ret = dev->write_hwaddr(dev);

44         if (ret)

45             printf("nWarning: %s failed to set MAC addressn",

46                    dev->name);

47     }

48 

49     return ret;

50 }


  上面定义了一个宏  CONFIG_NET_RANDOM_ETHADDR ,如果定义了此宏的话就会随机分配网卡物理地址,否则就打印错误信息,我们并不需要此宏。自己定义物理地址,从代码流程看,网卡地址是直接写进环境变量中的,然后再读取环境变量,这个时候就需要看看设置环境变量的地方了。

  环境变量的设置在 board_r.c的链表中,initr_env函数,initr_env 会调用 env_relocate() ,env_relocate() 调用 set_default_env 函数,set_default_env 函数中有一个结构体 default_environment ,这里面定义了默认的参数,进去看看一看就知道里面全部定义的是默认的环境变量参数,其中也有网络的:

  

  这里面没有物理地址的定义,所以我们可以自己定义物理地址:

  在这里加入下面的内容:

  

  在 include/configs/jz2440.h 中加入 CONFIG_ETHADDR的宏 ,这里我们可以根据自己本机上的MAC地址进行定义:

  

  

  保存编译,查看结果:

  

  已经不会再报错网卡了。进行测试看通讯是否正常。

  

  

  已经ping 通 网卡移植完成。


关键字:u-boot  移植  DM9000网卡 引用地址:u-boot移植(十二)---代码修改---支持DM9000网卡

上一篇:u-boot移植(十三)---代码修改---裁剪及环境变量 一
下一篇:u-boot移植(十)---代码修改---支持nor flash

推荐阅读最新更新时间:2024-10-31 00:24

AM3D 音频增强软件移植至Tensilica HiFi音频DSP
美国加州SANTA CLARA和丹麦AALBORG-2013年3月11日-Tensilica和AM3D A/S今日联合宣布双方拓展合作,将AM3D的音频增强产品移植至Tensilica的HiFi音频DSP系列。这将显著提升移动电话、车载娱乐、家庭娱乐系统和个人电脑的音频体验。 AM3D的低音增强和均衡变换器可以显著提升音频性能,而其虚拟环绕音效,则通过创建良好的声像延展了物理扬声器。该解决方案完全基于软件实现,所有功能都占用极低的内存和CPU性能。 Tensilica多媒体市场高级总监Larry Przywara表示:“许多客户都在寻找高级音频增强解决方案。AM3D显著提升了自然音色与低音音效,该优化的功能套件不久即将面世。”
[嵌入式]
u-boot-2016.09移植(2)-uboot启动简易分析
注:此文与下面关于uboot的移植都参考了《嵌入式linux学习笔记(基于s5pv210、tq210)》 不管什么版本的uboot都是在arch/arm/cpu/u-boot-spl.lds和arch/arm/cpu/u-boot.lds中制定了入口函数ENTRY(_start),u-boot-2016.09也不例外,搜索发现_start在arch/arm/lib/vectors.S中实现: _start首先执行reset,然后定义异常向量表,reset在arch/arm/cpu/armv7/start.S中实现 在reset中只执行了一条跳转指令,save_boot_params的功能是跳转到save_boot_pa
[单片机]
u-boot-2016.09<font color='red'>移植</font>(2)-uboot启动简易分析
典型范例:uCOSii在Coldfire MCF52235上的移植
引言 C/ OS 是一种多任务实时操作系统。内核源代码公开、短小精干、可裁剪、执行时间可确定, 可移植性较强, 非常适用于一些中小型嵌入式系统开发。uC/OS 可以移植到8~ 64 位的不同类型、不同规模的嵌入式系统, 并能在大部分的8 位、16 位、32 位, 甚至64 位的微处理器和DSP 上运行 。 MCF52235 是飞思卡尔公司Co ldf ire 系列32 位单片机解决方案的嵌入式微控制器, 采用的是V2 版本的 RISC 内核。MCF52235 内部有32 KB SRAM 和256 KB FLASH, 并且集成了标准的Coldfire 外围设备, 包括三个适合中长距离通信的SCI, 一个I2 C
[单片机]
典型范例:uCOSii在Coldfire MCF52235上的<font color='red'>移植</font>
移植u-boot 1.1.6到TQ2440开发板-第一阶段
最近买了一个TQ2440开发板,奈何天嵌只给出了编译好的文件,没有给源码,小弟从头开始移植Uboot 移植u-boot 1.1.6到TQ2440开发板-第一阶段 主要修改、配置源代码、编译源代码 TQ2440开发板信息: CPU:S3C2440 ARM核:arm920t SDRAM:64M Nor Flash:2M Nand Flash:64M 网卡:DM9000 第一步:下载 uboot 1 . 1 . 6源码 之前都是从CSDN上下载,发现下载的都不是真正的官方发布的源码,给大家提供一个官网 ftp://ftp.denx.de/pub/u-boot 格式为u-boot-1.1.6.tar.bz
[单片机]
tq2440-arm9 的移植(遇到的问题篇)
1、内核编译错误(使用编译器的版本不一样) ARM-Linux-ld: ERROR: drivers/media/video/tq2440/built-in.o is compiled for EABI version 5, whereas drivers/media/video/built-in.o is compiled for version 0 编译内核的时候,遇到了这个错误 ,根据报错提示,可以辨别是编译器的错误。天嵌的光盘 为我们提供了2个交叉编译器,EABI 4.3.3跟softfloat 3.4.5 ,而天气默认的.config配置文件,是使用EABI 4.3.3 ,如果遇到这个问题,可以换成EABI 4.3.
[单片机]
基于STM32MP157的Linux操作系统移植—系统镜像烧写
FS-MP1A支持通过STM32CubeProgrammer工具镜像的烧录,此外还支持通过BootLoader下的ums工具配合ubuntu操作系统进行单个镜像更新,通过使用tftp下载方式进行镜像的验证,以及使用scp方式来更新Linux内核与设备树。 STM32CubeProgrammer烧写方式 1、调整拨码开关 在开发板上电之前我们需要先将开发板的拨码开关拨到【000】位置。 2、硬件接线 在使用USB方式烧写镜像时,需要借助USB mini线来进行数据传输,此外还可以通过串口终端来监视烧写过程。 3、调试串口配置 在烧写过程中可以通过调试串口来监控烧写过程,串口调试可以借助XSHELL来进行相关调试。 开启x
[单片机]
在STM32上移植FreeModbus RTU的一点经验总结
这几天因为工作需要,移植了modbus RTU到STM32来,之前也听说过modbus,但是没有深入了解过,还以为会像usb 那样复杂的,经过这几天的折腾,发现真的太简单了。为了防止过段时间又忘记了怎么移植,在这里把移植过程记录下来,也为了方便初次接触modbus的人。 废话少说,首先去下载源码,我下载的是freemodbus-v1.5.0,解压后如图所示: 在demo文件夹中有很多移植好的例子,但是没有STM32的,不要紧,我们参考已有的例子来操作就可以了。在demo文件夹下新建一个文件夹,命名为STM32,将BARE文件夹里的文件全部复制过来。 然后,我们建立一个STM32的工程,我用的是mdk4.72,关于怎么建
[单片机]
在STM32上<font color='red'>移植</font>FreeModbus RTU的一点经验总结
移植u-boot-2010.03问题 --- No oob scheme defined for oobsize 32
1,找到u-boot-2010.03/drivers/mtd/nand下的nand_ids.c //{ NAND 2GiB 3,3V 8-bit , 0xD5, 0, 2048, 0, LP_OPTIONS}, { NAND 2GiB 3,3V 8-bit , 0xD5, 4096, 2048, 512*1024, LP_OPTIONS}, 2,找到u-boot-2010.03/include/linux/mtd下的mtd.h 第一处: //uint64_t addr; //uint64_t len; //uint64_t fail_addr; uint32_t addr; uint32_
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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