打印

CS8900A在uboot1.1.6下的adsp-bf533移植

[复制链接]
476|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Roses|  楼主 | 2017-8-13 10:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CS8900A在uboot1.1.6下的adsp-bf533移植

首先解释一下U-BOOT的硬件驱动模型。 U-BOOT中没有使用中断资源,所有的与中断相关的硬件操作均是基于轮询操作完成。 例如:网络芯片发送数据包结束,是通过循环查询网络芯片的相关寄存器位来判断的。 因此无需在U-BOOT中配置中断。 准备知识: 1、搞清楚CS8900A映射在blackfin533中的地址,例如我移植的板子上CS8900A的基地址为0x203D4000。注意CS8900A自身还有一定的偏移地址,具体请查看CS8900A的datasheet中的I/O BASE ADDRESS寄存器,我所用的芯片默认的片内偏移值为0x300。所以实际的寄存器地址应该为0x203D4000 + 0x300*2 = 0x203D4600。(为什么要乘以2:因为bf533是16位总线,bf的A1接在CS8900的a0上) 2、修改板子的主要配置文件(include/configs/bf533-xxx.h) 我选择的模板配置文件为bf533-stamp.h,其默认的网卡芯片为SMC91111。 A:修改驱动配置 CONFIG_DRIVER_SMC91111 -> CONFIG_DRIVER_CS8900 B:修改基地址 CONFIG_SMC91111_BASE 0x20300300 -> CS8900_BASE 0x203d4600 C:定义总线宽度 #define CS8900_BUS16 D:配置IP地址 找到Network settings段,将 #if (CONFIG_DRIVER_SMC91111) 改为 #if (CONFIG_DRIVER_CS8900) E:如果没有为CS8900A配置EEPROM的话 还需要将 #define CONFIG_ETHADDR 的注释去掉 F:开放网络相关命令 找到 #define CONFIG_COMMANDS1 将其前的 #if (CONFIG_DRIVER_SMC91111) 修改为 #if (CONFIG_DRIVER_CS8900) 3、修改board.c(lib_blackfin/board.c) A:去掉smc91111.h的头文件的包含,即注释掉 #include "../drivers/smc91111.h" B:初始化CS8900的MAC地址 在board_init_r函数中 #ifdef CONFIG_DRIVER_SMC91111 之前增加以下程序 #ifdef CONFIG_DRIVER_CS8900 cs8900_get_enetaddr (gd->bd); #endif 4、修改驱动(drivers/cs8900.c和cs8900.h) A:修改cs00.h 将 #ifdef CS8900_BUS16 /* 16 bit aligned registers, 16 bit wide */ #define CS8900_REG u16 #define CS8900_OFF 0x02 段的#define CS8900_OFF 0x02 修改为 #define CS8900_OFF 0x04 原因:还是因为blackfin的地址总线有偏移,没有A0这根地址线。 B:修改get_reg_init_bus()函数 在调试的过程中,发现加上CS8900后,系统上电运行后即异常,并且很难用仿真器进入到硬件仿真环境下。经跟踪发现cs8900.c文件中的get_reg_init_bus()函数有问题。将 /* force 16 bit busmode */ volatile unsigned char c; c = CS8900_BUS16_0; c = CS8900_BUS16_1; c = CS8900_BUS16_0; c = CS8900_BUS16_1; c = CS8900_BUS16_0; 注释掉后就不会再导致以上问题了。 C:修改 eth_send()函数 调试过程中,发现尽管编译通过,但仍不能发送数据包。经跟踪发现eth_send函数中,if ((get_reg (PP_BusSTAT) & PP_BusSTAT_TxRDY) == 0)的判断始终失败,导致一直在retry。 进一步的跟踪却发现,在此if语句内再次读PP_BusSTAT寄存器时,可满足通过条件。遂更改为: 在此if语句内,再次判断,若满足要求,则跳出此if语句,继续执行后面的程序 具体修改的程序为: 在此if语句体中第一行增加以下程序 if ((get_reg (PP_BusSTAT) & PP_BusSTAT_TxRDY) != 0) goto resumeSend; 注:resumeSend为此if语句后的行号。放置在for (addr = packet; length > 0; length -= 2)之前。 至此全部移植工作完成,编译后下载到板子后,可完成ping命令,并能ping到活动主机。

相关帖子

沙发
ic12580| | 2017-8-30 15:36 | 只看该作者
我们有做 CS8900配套的网络变压器

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

709

主题

1023

帖子

7

粉丝