CS8900A在uboot1.1.6下的adsp-bf533移植
来源:百度文库 编辑:神马文学网 时间:2024/04/30 02:23:16
先解释一下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到活动主机。
更多相关的资料大家可以到我的blog中翻阅。
http://topone.blog.xdnice.com/
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到活动主机。
更多相关的资料大家可以到我的blog中翻阅。
http://topone.blog.xdnice.com/
CS8900A在uboot1.1.6下的adsp-bf533移植
U-Boot在S3C2410上的移植
linux下Nand Flash的JFFS2文件系统的移植
基于ADSP-BF561的H.264编码器设计
陈易妈妈在移植城上的帖子
linux 2.6 在s3c2410上的移植笔记
u-boot-2010.03在tq6410上的移植详解(五)
Windows下程序向Linux下移植细节 - wenhm的专栏 - CSDNBlog
Ubuntu 8.10 下移植 madplay 到 mini2440 - maojudong的专栏 - CSDN博客
已移植到uCLinux(ADI公司Blackfin系列DSP版)下的用户自定义应用程序
U-Boot在S3C2410上的移植 - xbl1986的专栏 - CSDNBlog
(转载)mplayer在arm 2410上的移植--氧气的小木屋
u-boot-2010.03在tq6410上的移植详解(二) - embedsky的专栏 ...
u-boot-2010.03在tq6410上的移植详解(三)
u-boot-2010.03在tq6410上的移植详解(八)
u-boot-2010.03在tq6410上的移植详解(六)
yaffs文件系统在2.6内核上的移植--操作步骤(转载)
移植微软Office的个性化设置
android bionic移植需要注意的事项
高效可移植程序的一些习惯
再造汴梁:被移植的政治心脏
基于Linux2.6的YAFFS文件系统移植
移植jffs2文件系统中碰到的问题
【转】Python的ARM-Linux平台移植