关键词:
一、准备工作
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 (board\samsung\jz2440):
这里只定义了 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 %pM\n",
15 dev->enetaddr);
16 printf("Address in environment is %pM\n",
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 - %pM\n",
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 value\n",
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 address\n",
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-2014.10移植识别dm9000(代码片段)
在smdk2440.h里面注释掉CS8900相关的#if0#defineCONFIG_DRIVER_CS89001/*wehaveaCS8900on-board*/#defineCS8900_BASE0x19000300#defineCS8900_BUS161/*theLinuxdriverdoesaccessesasshorts*/#endif#if!defined(CONFIG_DRIVER_ 查看详情
u-boot移植(十三)---代码修改---支持文件系统及补丁制作
一、烧写文件系统1.1jffs2烧写 1.下载文件系统:tftp30000000fs_mini_mdev.jffs2 2.擦除文件的块:nanderase.partrootfs 3.烧入文件系统:nandwrite.jffs2300000000x00260000 5b89a8 4.设置启动参数:setbootargsconsole=ttySAC0root=/d... 查看详情
u-boot移植---代码修改---时钟修改sdram
...现在就需要做的是代码的修改,配置成适合目标板使用的u-boot。一、时钟修改 在代码流程分析中,我们知道,系统的启动是:设置CPU为管理员模式关闭看门狗屏蔽中断设置启动参数:时钟 FCLK:HCLK:PCLK=1:2:4 FCLK... 查看详情
驱动12.移植dm9000驱动程序
1确定相异性1.1选中网卡芯片nGCS41.2确定相异性:基地址,中断号,设置时序(内存控制器BWSCON,BANKCONn)1.3修改相应的部分2测试DM9000C驱动程序:2.1把dm9dev9000c.c放到内核的drivers/net目录下2.2修改drivers/net/Makefile把obj-$(CONFIG_DM9000)+=dm9000.o... 查看详情
u-boot移植---修改前工作:代码流程分析1
一、代码执行总体流程图1.1代码路径 U-boot.lds(archarmcpu) vectors.S(archarmlib) start.S(archarmcpuarm920t) lowlevel_init.S(boardsamsungjz2440) crt0.S(archarmlib)relocate.S(archarmlib) 查看详情
图像识别dm8127开发攻略——uboot的移植说明(代码片段)
...上没啥意思。一、DM8127UBOOT编译说明DM8127的UBOOT的版本是u-boot-2 查看详情
u-boot移植---修改前工作:代码流程分析3---代码重定位
...链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds): 查看详情
u-boot移植---代码修改---nand
一、NAND原理 NAND无地址空间,地址和数据的发送都依赖于LDATA[0:7]这一串数据总线。 不看随机页编程,看到从高位到低位的页,总共分为64个页面,每个页的组成是2K+64 个byte,一个块的大小是(128K+4K)b... 查看详情
u-boot移植(十三)---代码修改---裁剪及环境变量一
一、内核裁剪 内核的裁剪首先就是修改我们的配置文件,即include/configs/jz2440.h文件,里面定义的很多宏,我们也许用不上的就要去掉。1/*2*(C)Copyright20023*SysgoReal-TimeSolutions,GmbH<www.elinos.com>4*MariusGroeger<[email protected]>... 查看详情
u-boot移植---修改前工作:代码流程分析2
一、vectors.S1.1代码地址 vectors.S(archarmlib) 1.2流程跳转 跳转符号B为start.S中的reset执行代码,暂且先不看,先看看vector.S中的执行。1.3代码分析 ldr{条件}目的寄存器<存储器地址>1_start:23#ifdefCONFIG_SYS_DV_NOR_B... 查看详情
u-boot-2014.10移植支持nand(代码片段)
在smdk2440.h里面加上NAND的配置选项 #defineCONFIG_CMD_NAND编译出错drivers/mtd/nand/s3c2410_nand.c:Infunction‘s3c2410_hwcontrol‘:drivers/mtd/nand/s3c2410_nand.c:44:warning:implicitdeclarationoffunction‘s3c2410_g 查看详情
u-boot移植---代码修改---存储控制器
一、CPU访问芯片的条件 CPU通过访问存储控制器,来读取外部设备的数据。 CPU想访问一个芯片,需要如下条件(配置信息):地址线数据线:8位/16位/32位数据宽度时钟/频率 其他芯片相关的特性:比如SDRAM,有行地... 查看详情
u-boot-2014.10移植重定位,支持nand启动(代码片段)
...统。现在把链接地址改成0x33f00000一旦更改了链接地址,u-boot从norflash加载时,串口没有任何输出 添加文件boot_init.c#defineNFCONF(*((volatileunsignedlong*)0x4E000000))#defineNFCONT(*((volatileunsignedlong*)0x4 查看详情
u-boot-2014.10移植修改环境变量的存储位置(代码片段)
原来环境变量存储在norflash里,前面mtdparts分区第二个分区就是params现在修改环境变量到nand里, 搜索defaultenvironment在Env_common.c函数里面:default_environment结构体default_environment结构体定义在env_common.c里面其中有:#ifdefCONFIG_BOOTARG... 查看详情
移植最新u-boot之裁剪和修改默认参数
...ceinsight工程、编译、烧写、如果无运行分析原因 tarxjfu-boot-2012.04.01.tar.bz2 cdu-boot-2012.04.01 makesmdk2410_config make2.分析u-boot:通过链接命令分析组成文件、阅读代码分析启动过程 a.初始化硬件:关看门狗、设置时钟、... 查看详情
tiny4412-1312__uboot移植(代码片段)
...inaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi要移植的u-boot版本:u-boot-2016-11Tiny4412开发板硬件版本为: 底板: Tiny4412SDK1312B 核心板:Tiny4412-1306 1.获取U-BOOT源码从FTP站点下载: ftp://ftp.denx.de/pub/... 查看详情
u-boot-2014.10移植设置时钟/sdram(代码片段)
时钟修改vimarch/arm/cpu/arm920t/start.S#ifdefined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)ldrr1,=0x3ffldrr0,=INTSUBMSKstrr1,[r0]/*FCLK:HCLK:PCLK=1:2:4*//*defaultFCLKis120MHz!*/ldrr0,=CLKDIVNmovr1,#5strr1, 查看详情
六,移植uboot-设置默认环境变量,完善u-boot(代码片段)
文档时间:2018-08-14交叉编译器:arm-linux-gcc-4.3.2Ubuntu版本:16.04uboot版本:2013.10 1,修改uboot默认环境变量前面章节得到的uboot串口打印信息如下:可以看出,读出的是坏的CRC,使用默认的环境变量,搜索"usingdefaultenvironment",... 查看详情