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-11-20 04:55

内核移植和文件系统制作(2):linux内核最小系统和initramfs文件系统
linux内核最小系统,使用内核版本: 1,FL2440板子的基本硬件:晶振12MHZ CPU 型号为S3C2440,基于ARM920T,指令集ARMV4,时钟主频400MHz SDRAM H57V2562GTR-75C 2片*32MB=64MB,挂载于nGCS6 (0x3000 0000) NANDFLASH 型号:K9F2G08U0B 大小:256MB Network Adapter DM9000AEP 10/100M自适应,挂载于nGCS4 (0x2000 0000) LED 5个LED(LED0~3)I/O口指示灯,LED5电源指示灯,LED9
[单片机]
内核<font color='red'>移植</font>和文件系统制作(2):linux内核最小系统和initramfs文件系统
文件系统的移植(一):Initramfs文件系统的移植
内 核 版 本:linux-3.0 u-boot版本:u-boot-2010.09 开发板型号:FL2440 1、对根文件系统进行修改 (一)的前提下不需要修改 2、添加内核对 initramfs 的支持 $ vt100 $ make menuconfig General setup --- 注:其中:../../rootfs_tree为自己的文件系统相对于内核的路径。 修改Makefile $ vim Makefile 修改195、196行 注:196行为自己的交叉编译器的路径 $ make 编译过程省略 $ ls ky-initramfs.bin为编译好的内核。
[单片机]
文件系统的<font color='red'>移植</font>(一):Initramfs文件系统的<font color='red'>移植</font>
基于eCos的FLASH驱动的分析与移植
0 引 言 嵌入式系统需要支持的外部设备种类繁多,如何构造运行良好的嵌入式设备的驱动程序,对嵌入式操作系统的实际应用有重要意义。eCos是一种源代码公开的实时嵌人式操作系统,对嵌入式应用具有良好的支持,内核专门设计了便于设备驱动管理和开发的I/O包和DEV包,开发人员可以方便地将自己开发的驱动程序加入其中,与别的系统组件一起进行配置。 1 系统目标板简介 硬件目标板是为无人机系统设计的系统开发板,它是从Arca系统测试板经过功能简化设计而来的满足无人机系统要求的目标板。硬件目标板如图1所示。 GT2000支持SRAM,FLASH,ROM,VLIO(静态段支持可变等待时间I/O设备)和SDRAM(同步动态RAM)等外部扩展
[单片机]
基于eCos的FLASH驱动的分析与<font color='red'>移植</font>
ARM SDT汇编格式与GNU汇编格式的移植
问题:如何将ARM SDT环境下的汇编代码移植到GCC编译环境中? 回答:将ARM SDT下的汇编码移植到GCC for ARM编译器时,经常要做如下修改: 1、注释行以“#”或“/* ... */”代替“;” 2、伪操作符替换: INCLUDE 替换成 .INCLUDE TCLK2 EQU PB25 替换成 .equ TCLK2, PB25 EXPORT 替换成 .global IMPORT 替换成 .extern DCD 替换成 .long IF :DEF: 替换成 .IFDEF ELSE 替换成 .ELSE ENDIF 替换成 .ENDIF :OR: 替换成 | :SHL:
[单片机]
s3c2440之ADS移植keil
最近把ADS1.2工程转到MDK4.03出现一些error,罗列了可能出现的error,并给予相关的办法,让大家在以后的转换中尽快搞定 1:error : No section matches selector no section to be FIRST/LAST. 把原来的Init 代码段名修改成RESET: ; AREA Init,CODE,READONLY AREA RESET,CODE,READONLY 2:error Undefined symbol Main (referred from 2440
[单片机]
OK6410A 开发板 (五) u-boot-2021.01 移植 到 ok6410a
用的代码是 https://github.com/u-boot/u-boot 基于该代码的 TAG v2021.01 开发 用的ok6410a相关代码来自于 https://blog.csdn.net/Golden_Chen/article/details/89077655 代码已经上库 https://github.com/lisider/u-boot/tree/ok6410a 目前做了三次提交 提交 cb36d21d6276ac17507e19974ba974c2b0df87b0 完成了 A. 目录角度 1. s3c6410 soc 的移植 arch/arm/mach-s3c64xx drivers/gpio
[单片机]
S3C4510上嵌入式Web服务器-boa在uclinux下的的移植
uClinux下,主要有三个Web Server:httpd、thttpd和Boa。Httpd是最简单的一个Web Server,它的功能最弱,不支持认证,不支持CGI。Thttpd和Boa都支持认证、CGI等,功能都比较全。为了实现动态Web技术,这里我们选择实现一个支持CGI的、非常适合于嵌入式系统的Boa Web Server。 Boa是一个单任务的http服务器,源代码开放、性能高。目前,uClinux的代码中已经包含boa的源代码,在uClinux下实现 Boa,需要对Boa做一些配置和修改。这主要通过对boa.conf和mime.types文件进行修改来实现,需要改动的配置有以下几项。 (1)建目录 由于uClinux
[单片机]
PPCBoot在MPC8250上的移植方法
摘要:The Bootloader(引导加载程序)是嵌入式系统CPU加电后即开始运行的第一段代码,它把Linux内核与硬件平台衔接在一起,对于嵌入式系统的后续软件开发十分重要。PPCBoot是功能十分强大的Bootloader。深入研究了PPCBOOt的工作机理,详细分析了PPCBoot在基于MPC8250型处理器的嵌入式系统板上的移植方法、过程与移植要点。 关键词:Bootloader;PPCBoot;MPC8250;嵌入式系统 1 引言 Boodoader(引导加载程序)是CPU复位后和进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统
[应用]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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