4330|4

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CS8900不能初始化,请高手指点一下 [复制链接]

有谁做过TI的430以太网,就是easyweb那个解决方案,我的cs8900A始终不能初始化,在这个循环里跳不出来:
do
Write8900(ADD_PORT, PP_SelfST); // set register
while (!(Read8900(DATA_PORT) & INIT_DONE)); // wait until chip-reset is done

哪位高手指点一下,不胜感激!

最新回复

我也出现这种问题,一直不能解决,找不到是什么原因,那位高手能帮我一下啊???  详情 回复 发表于 2010-5-9 21:27
 
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
经过反复调试,现在已经能够初始化了,可是还是不能显示网页,还有PC机上的IP应该怎样设置呢?
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

CS8900A不能初始化

你好!
请问后来是怎么处理的,我也碰到了与你类似的问题?
cs8900A始终不能初始化,在这个循环里跳不出来:
do
Write8900(ADD_PORT, PP_SelfST); // set register
while (!(Read8900(DATA_PORT) & INIT_DONE)); // wait until chip-reset is done
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
cs8900初始化代码分析

整个代码分析由上叙述的的修改过程作为指导
static struct map_desc smdk2410_iodesc[] __initdata = {
IODESC_ENT(CS8900)
};
让我们看一下IODESC_ENT(CS8900)宏定义在arch/arm/mach-s3c2410/cup.h中的代码部分
#define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE }


经过宏替换,原来的部分将被替换为如下的式子

static struct map_desc smdk2410_iodesc[] __initdata = {
{(unsigned long)S3C24XX_VA_CS8900,
__phys_to_pfn(S3C24XX_PA_CS8900)
S3C24XX_SZ_CS8900,
MT_DEVICE};
};



而其中的那些宏也就是我们在include/asm-arm/arch-s3c2410/map.h定义的那4个宏
#define S3C24XX_VA_CS8900 S3C2410_ADDR(0x01300000)
#define S3C2410_PA_CS8900 (0x19000000)
#define S3C24XX_SZ_CS8900 SZ_1M
#define S3C24XX_PA_CS8900 S3C2410_PA_CS8900

其中 S3C24XX_VA_CS8900 是CS8900的物理地址映射到虚拟内存页上的地址
S3C2410_PA_CS8900 是实际CS8900所在的物理地址
S3C24XX_SZ_CS8900 是为CS8900申请的虚拟内存空间的大小,这里设置为1M.

smdk2410_iodesc[]结构体数组会在系统为设备io的时候进行调用,该部分调用在以下的文件中:
arch/arm/mach-s3c2410/mach-smdk2410.c 中的smdk2410_map_io 函数内,函数实现如下:

static void __init smdk2410_map_io(void)
{
s3c24xx_init_io(smdk2410_iodesc,ARRAY_SIZE(smdk2410_iodesc));
s3c24xx_init_clocks(0);
s3c24xx_init_uarts(smdk2410_uartcfgs,ARRAY_SIZE(smdk2410_uartcfgs));
s3c24xx_set_board(&smdk2410_board);
}

该函数会在系统读取完s3c2410的cpuId后执行运行。

当系统启动后,需要初始化CS8900该部分工作从 drivers/net/Space.c里的net_olddevs_init(void)函数开始。

static int __init net_olddevs_init(void)
{
int num;

#ifdef CONFIG_SBNI
for (num = 0; num < 8; ++num)
sbni_probe(num);
#endif
#ifdef CONFIG_TR
for (num = 0; num < 8; ++num)
if (!trif_probe(num))
trif_probe2(num);
#endif
for (num = 0; num < 8; ++num)
ethif_probe2(num);

#ifdef CONFIG_COPS
cops_probe(0);
cops_probe(1);
cops_probe(2);
#endif
#ifdef CONFIG_LTPC
ltpc_probe();
#endif

return 0;
}


如上代码的标红语句ethif_probe2(num);这个语句用来查询系统中所存在的网卡设备最多支持8个设备。
该函数也定义在Space.c中

static void __init ethif_probe2(int unit)
{
unsigned long base_addr = netdev_boot_base("eth", unit);

if (base_addr == 1)
return;

(void)(probe_list2(unit, m68k_probes, base_addr == 0) &&
probe_list2(unit, eisa_probes, base_addr == 0) &&
probe_list2(unit, mca_probes, base_addr == 0) &&
probe_list2(unit, isa_probes, base_addr == 0) &&
probe_list2(unit, parport_probes, base_addr == 0));
}

在上面的代码中有一个比较特别的函数probe_list2,这个函数用来调用特定的网卡设备所对应的初始化函数,而这个初始化函数能否被调用又是由系统编译前的裁减工作所确定的。以我们当前as8900网卡为例,来说明这点
static struct devprobe2 isa_probes[] __initdata = {


#ifdef CONFIG_CS89x0
{cs89x0_probe, 0},
#endif





因此在函数probe_list2内实际调用的初始化函数为cs89x0_probe函数。probe_list2的代码如下:

static int __init probe_list2(int unit, struct devprobe2 *p, int autoprobe)
{
struct net_device *dev;
for (; p->probe; p++) {
if (autoprobe && p->status)
continue;
dev = p->probe(unit);//该部分就实际调用cs89x0_probe
if (!IS_ERR(dev))
return 0;
if (autoprobe)
p->status = PTR_ERR(dev);
}
return -ENODEV;
}


我们随后就可以进入drivers/net/cs89x0.c文件中超找该函数cs89x0_probe。该函数的主要代码流程将以伪代码的方式给出:

(1)调用netdev_boot_setup_check(dev);遍历已有的网络设备,以确定当前要初始化的设备是否已经存在。(这些设备可以通过在引导过程中传入网络设置参数进行初始化设置)
(2)初始化CS8900的功能引脚。(这部分是由我们自己添加的)
(3)cs89x0_probe1(dev, *port, 0)调用该函数进行初始化探测工作,包括设备ID,初始化芯片,设置MAC地址(由我们添加),分配内存空间。
(4)当成功初始化设备后返回一个net_device的结构,作为这个设别的标识。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
我也出现这种问题,一直不能解决,找不到是什么原因,那位高手能帮我一下啊???
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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