前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >S3C2440移植uboot之支持DM9000

S3C2440移植uboot之支持DM9000

作者头像
嵌入式与Linux那些事
发布2021-05-20 10:34:53
7230
发布2021-05-20 10:34:53
举报
文章被收录于专栏:嵌入式与Linux那些事

通过Makefile把dm9000x编译进uboot

代码语言:javascript
复制
cd drivers/net
vi Makefile

  需要在文件中添加以下宏

  在smdk2440.h中修改文件支持DM9000

代码语言:javascript
复制
#if 0
#define CONFIG_CS8900		/* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE	0x19000300
#define CONFIG_CS8900_BUS16	/* the Linux driver does accesses as shorts */
#else
#define CONFIG_DRIVER_DM9000                    /*DM9000*/
#endif

  编译报错

编译报错 DM9000_DATA

  搜索DM9000_DATA那里定义

代码语言:javascript
复制
grep "DM9000_DATA" *nR

  参考别人配置文件

  在smdk2440.h中修改为如下内容

代码语言:javascript
复制
/*
 * Hardware drivers
 */
#if 0
#define CONFIG_CS8900		/* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE	0x19000300
#define CONFIG_CS8900_BUS16	/* the Linux driver does accesses as shorts */
#else
#define CONFIG_DRIVER_DM9000                    /*DM9000*/
#define CONFIG_DM9000_BASE                   0x20000000  /*参考芯片手册 nGCS4*/
#define DM9000_IO                            CONFIG_DM9000_BASE          
#define DM9000_DATA                         (CONFIG_DM9000_BASE + 4)  /*bit 2 1  0*/
#endif

  我们的DM9000是放在2440的bank4(0X20000000)的片选上面,而DM9000的CMD引脚接在bank4的LADDR2上面。也就是说当0X20000000地址上读写数据时, 此时CMD为低,则读写的便是DM9000C的地址。向0X20000000+4地址上读写数据时,此时CMD为高,则读写的便是DM9000C的数据。

修改内存控制器时序

  由于之前在start.S里,就调用了board/samsung/smdk2440/lowlevl_init.S来初始化各个bank的配置、时序。所以我们只需要在那里修改bank4的内容即可。(也可以直接在dm9000x.c里的dm9000_initialize()函数设置)参考之前写的移植DM9000C驱动里的时序   由于兼容DM9000E,所以修改的值尽量大一点, 修改\u-boot-2012.04.01\board\samsung\smdk2440\lowlevel_init.S 设为:

代码语言:javascript
复制
.long 0x00000740;    //BANKCON4

  参考手册如下   BWSCON位宽设置

  时序设置

  编译烧写

网卡的初始化的流程

搜索No ethernet found

  1)uboot重定位后进入第二阶段board_init_r():

代码语言:javascript
复制
void board_init_r(gd_t *id, ulong dest_addr)        //gd    uboot重定位地址
{
  ... ...
  #if defined(CONFIG_CMD_NET)
       puts("Net:   ");
       eth_initialize(gd->bd);                 // 以太网初始化

#if defined(CONFIG_RESET_PHY_R)
       debug("Reset Ethernet PHY\n");
       reset_phy();

#endif
#endif    
... ...
}

  2)然后进入board_init_r()->eth_initialize():

代码语言:javascript
复制
int eth_initialize(bd_t *bis)
{
 ... ...
if (board_eth_init(bis) < 0)                         //初始化 单板上的以太网
printf("Board Net Initialization Failed\n");
... ...

if (!eth_devices) {                                   //初始化失败,打印"No ethernet found.\n"
              puts ("No ethernet found.\n");
              bootstage_error(BOOTSTAGE_ID_NET_ETH_START);
       }
 ... ...
}

  3)进入board_eth_init(), 位于board/samsung/smdk2440/smdk2440.c

代码语言:javascript
复制
int board_eth_init(bd_t *bis)
{
       int rc = 0;
#ifdef CONFIG_CS8900                                                  
       rc = cs8900_initialize(0, CONFIG_CS8900_BASE);        //初始化cs8900
#endif
       return rc;
}

  从上面代码看到,单板初始化board_eth_init()函数里,只支持初始化CS8900,没有DM9000C

支持DM9000C的初始化

  搜索dm9000_initialize,看下其它单板的board_eth_init()是如何初始化DM9000C的,如下图所示:

  所以,我们修改2440单板的board_eth_init(),使它支持DM9000C   修改代码如下(位于board/samsung/smdk2440/smdk2440.c):

代码语言:javascript
复制
int board_eth_init(bd_t *bis)
{
       int rc = 0;

#ifdef CONFIG_CS8900                                                  
       rc = cs8900_initialize(0, CONFIG_CS8900_BASE);        //初始化cs8900
#endif

#ifdef CONFIG_DRIVER_DM9000                                           
       rc = dm9000_initialize(bis);                               //初始化DM9000C
#endif

       return rc;
}

编译测试

  然后试验,来ping下PC机,输入:

代码语言:javascript
复制
set ipaddr 192.168.159.120
ping 192.168.159.100

   打印如下图所示:

   上面表示,MAC(硬件地址)没有设置,我们需要设置ethaddr,来更改MAC地址 输入(参考别人的MAC地址):

代码语言:javascript
复制
set ethaddr 08:00:3e:26:0a:5b    //设置MAC地址
ping 192.168.159.100                 //重新ping    

便可以ping通.

TFTP下载测试

  使用tftp工具,通过网卡来下载内核   tftp工具是通过电脑来设置本机为服务器,然后开发板作为客户端,便可以读取到PC机里的文件了   1)PC机打开tftp工具,设置文件根目录,以及PC本机的IP地址   2)进入开发板,输入:

代码语言:javascript
复制
set serverip   192.168.2.101                //设置PC机地址
tftp 30000000    uImage                     //下载PC机设置的tftp根目录下的uImage文件
bootm  30000000                             //使用bootm命令启动内核代码

  由于uboot没有配置mtdparts命令,所以启动内核没成功. 主要修改文件:include/configs/smdk2440.h lowevel_init.s

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通过Makefile把dm9000x编译进uboot
  • 编译报错 DM9000_DATA
  • 修改内存控制器时序
  • 网卡的初始化的流程
  • 支持DM9000C的初始化
  • 编译测试
  • TFTP下载测试
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档