天嵌 ARM开发社区

 找回密码
 注册
查看: 6189|回复: 11

关于DM9000定义的tq2416_dm9k_resource中的CMD基址的定义怎么解释?

[复制链接]
艾那的小强 发表于 2013-9-17 18:08:10 | 显示全部楼层 |阅读模式
本帖最后由 艾那的小强 于 2013-9-29 09:22 编辑

向我们的售后技术请教一个问题:
以下的DM9000定义的CMD基址为什么是start = MACH_TQ2416_DM9K_BASE + 8?
电路中明明接的是LADDR2.不应该是+4吗?

static struct resource tq2416_dm9k_resource[] = {
[0] = {
.start = MACH_TQ2416_DM9K_BASE,
.end   = MACH_TQ2416_DM9K_BASE + 3,
.flags = IORESOURCE_MEM
},
[1] = {
.start = MACH_TQ2416_DM9K_BASE + 8,
.end   = MACH_TQ2416_DM9K_BASE + 8 + 3,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT4,
.end   = IRQ_EINT4,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
}
};
 楼主| 艾那的小强 发表于 2013-9-18 11:25:27 | 显示全部楼层
版主能给答疑解惑一下吗?
 楼主| 艾那的小强 发表于 2013-9-22 14:28:13 | 显示全部楼层
天嵌的UBOOT代码中关于DM9000的配置
#define DM9000_DATA        (CONFIG_DM9000_BASE + 8)
内核中关于DM9000配置
static struct resource tq2416_dm9k_resource[] = {
[0] = {
.start = MACH_TQ2416_DM9K_BASE,
.end   = MACH_TQ2416_DM9K_BASE + 3,
.flags = IORESOURCE_MEM
},
[1] = {
.start = MACH_TQ2416_DM9K_BASE + 8,
.end   = MACH_TQ2416_DM9K_BASE + 8 + 3,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT4,
.end   = IRQ_EINT4,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
}
};

而原理图中的 CMD连接的是地址线2。明显原理图与代码是不对应的。怎么解释?

请版主帮忙解释一下。
亚瑟王 发表于 2013-9-24 19:02:16 | 显示全部楼层
艾那的小强 发表于 2013-9-22 14:28
天嵌的UBOOT代码中关于DM9000的配置
#define DM9000_DATA        (CONFIG_DM9000_BASE + 8)
内核中关于DM9000配置 ...

问这个问题说明你用心思考了。也说明你没有看S3C2416的datasheet。
给你一个提示,在芯片手册的SMC章节在寄存器前面有个图标,根据图标就可以知道这个值为什么是8了。
如果你搞懂了请回复帖子解决方法,如果没看懂也回复帖子,明天我给你答案。
 楼主| 艾那的小强 发表于 2013-9-25 12:46:11 | 显示全部楼层
亚瑟王 发表于 2013-9-24 19:02
问这个问题说明你用心思考了。也说明你没有看S3C2416的datasheet。
给你一个提示,在芯片手册的SMC章节在 ...

管理员你好。请问你是指的这个吗?
地址线都是从0开始的。
这几天一直在找这个问题原因。所以SMC这一章还真看了几遍。可能有些没有看懂。没有找到端倪。
还请管理员指教。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
亚瑟王 发表于 2013-9-25 16:58:08 | 显示全部楼层
艾那的小强 发表于 2013-9-25 12:46
管理员你好。请问你是指的这个吗?
地址线都是从0开始的。
这几天一直在找这个问题原因。所以SMC这一章 ...

是的,地址线从ADDR0开始的,也就是说ADDR2的地址就是2的3次方,就是8了。
 楼主| 艾那的小强 发表于 2013-9-25 21:58:31 | 显示全部楼层
亚瑟王 发表于 2013-9-25 16:58
是的,地址线从ADDR0开始的,也就是说ADDR2的地址就是2的3次方,就是8了。

谢谢管理员的回复。
不过,你的解释更加让我迷惑了。
因为TQ2440里面也是接的ADDR2,而与之对应的UBOOT及内核使用的是+4.这个是好理解的,因为ADDR2对应的第三条地址线。也就是0100。也就是4.我是这样理解的。
关于这两者的不同怎么解释呢?

再次感谢管理员指教。
亚瑟王 发表于 2013-9-26 09:05:50 | 显示全部楼层
艾那的小强 发表于 2013-9-25 21:58
谢谢管理员的回复。
不过,你的解释更加让我迷惑了。
因为TQ2440里面也是接的ADDR2,而与之对应的UBOOT ...

那你没有看2440的datasheet了,2440的datasheet上面讲了的16bit地址总线的时候ADDR0对应的是地址线1,地址线二就是就是ADDR1,2的2次方就是4.
2416的是ADDR0对应的是地址线0,地址线2就是ADDR2,2的3次方就是8。
 楼主| 艾那的小强 发表于 2013-9-27 01:11:38 | 显示全部楼层
本帖最后由 艾那的小强 于 2013-9-27 01:12 编辑
亚瑟王 发表于 2013-9-26 09:05
那你没有看2440的datasheet了,2440的datasheet上面讲了的16bit地址总线的时候ADDR0对应的是地址线1,地址 ...

管理员,您好。研究你的回复一晚上。最后还是没有想明白。按照您的解释:
假设
#define CONFIG_DM9000_BASE                                0x20000300
#define DM9000_IO                                                CONFIG_DM9000_BASE
#define DM9000_DATA                                        (CONFIG_DM9000_BASE + 8)
若我们要读取DM9000的寄存器ISR(FEH)寄存器的值,那么我们要做的是:
1. 向0x20000300写FEH(示意:*0x20000300 = FEH)
2. 读0x20000308地址,得到寄存器的值(示意:val = *0x20000308)

注意:0x20000308对应的地址线的最后四位(也就是08表示的地址)为:0b1000
那么对应的就是:(如您所说:16位数据总线时A0对应ADDR0)
addr3=1;
addr2=0;
addr1=0;
addr0=0;
可以看出ADDR2=0;也就是此时的DM9000的CMD引脚为低电平。而低电平是命令操作。高电平才是数据操作。(这就是我不明白的地方)

所以2的3次方的解释真是不明白怎么理解。

谢谢管理员的回复。
 楼主| 艾那的小强 发表于 2013-9-27 13:46:58 | 显示全部楼层
亚瑟王 发表于 2013-9-26 09:05
那你没有看2440的datasheet了,2440的datasheet上面讲了的16bit地址总线的时候ADDR0对应的是地址线1,地址 ...

管理员,你好。昨天晚上睡觉前我突然想明白了。
2440的总线操作总是对齐的。所以ADD2对应的就是0x4;
而2416的总线操作8bit和16bit都是从0地址开始的。所以16bit的时候,总线的访问能力就比8bit时提高了一倍。
也就相当于ADDR0和ADDR1两条地址线拥有访问2*2*2(16bit)=8个字节 的能力。所以这里要加8.

亚瑟王 发表于 2013-9-30 16:42:32 | 显示全部楼层
艾那的小强 发表于 2013-9-27 13:46
管理员,你好。昨天晚上睡觉前我突然想明白了。
2440的总线操作总是对齐的。所以ADD2对应的就是0x4;
而 ...

可以这样理解。
qqqno1 发表于 2014-11-26 11:53:01 | 显示全部楼层

你好 亚瑟王,我也有类似的疑问,用的是贵公司tq2416开发板,公司的项目中是扩展了一个dm9000,接线与天前提供的原理图相同,另外不同是中断接的EINT13,片选接的是CSn1,CMD都是接的LADDR2,。驱动程序中增加了第二片dm9000的资源
#define MACH_TQ2416_DM9K_BASE1                (S3C2410_CS1+ 0x300)

static struct resource tq2416_dm9k_resource1[] = {
        [0] = {
                .start = MACH_TQ2416_DM9K_BASE1,
                .end   = MACH_TQ2416_DM9K_BASE1 + 3,
                .flags = IORESOURCE_MEM
        },
        [1] = {
                .start = MACH_TQ2416_DM9K_BASE1 + 4,
                .end   = MACH_TQ2416_DM9K_BASE1 + 4 + 3,
                .flags = IORESOURCE_MEM
        },
        [2] = {
                .start = IRQ_EINT13,
                .end   = IRQ_EINT13,
                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        }
};

在tq2416_machine_init函数中增加了
        s3c_gpio_cfgpin(S3C2410_GPA(12), (1<<12));// GPA12 to nRCS1

这样增加的资源可以读取到dm9000的ID,
如果按照天谴提供的驱动程序基地址加8,却读不到芯片ID,读到的是0x2b2a2928,
这把握搞糊涂了,到底是加4还是加8, 改作何解释呢?、期待您的解答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-6-3 19:53 , Processed in 1.046875 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表