在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6970|回复: 3

liu 版主,看看我改的这个函数行不行。

[复制链接]
发表于 2003-11-8 10:23:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
我觉得,只要把bus,device,function确定后就应该能取得io,memory等的基地址了吧。
而且,在嵌入式中,bus应该是0。 然后用查询的方法,把device,和function确定,就能用下面的函数取得基地址。  不知道我想对不对。
tmLibdevErr_t GetBaseAddress(UINT8 bus, UINT8 device,UINT8 function,UINT8 bar_number, PciAddr_t *addr_p)
{
    tmLibdevErr_t   tm_err ;
    UINT8           offset ;
    UINT32          addr ;
    offset = (bar_number*4) + 0x10 ;
    tm_err = pci_config_read32(bus,
                               device,
                               function,
                               offset,
                               &addr) ;
    if ((addr & 1) == 0)
    {
        addr &= ~0xf ;
    }
    else
    {
        addr &= ~0x3 ;
    }
    *addr_p = (PciAddr_t) addr ;
    return tm_err ;
}
//有个问题,从寄存器中读出的地址,并不是我们要的么? 还要进行处理! 这是怎么回事?
发表于 2003-11-8 12:24:33 | 显示全部楼层

liu 版主,看看我改的这个函数行不行。


这段代码描述了pci中的一个细节。
我这里没有pci协议,只能凭记忆给你回答,
pci协议中配置空间0x10以后的几个单元是描述空间映射的,
包括io空间和memory空间,那么如何区别这两个空间呢,就是
采用了最后1bit,如果最后1bit是1,那么就是io空间,否则就是memory空间。
你提供的这段代码就是说:
if ((addr & 1) == 0) {//如果最后一位是0,memory空间
  addr &= ~0xf ;//存储空间格式描述
} else {//否则是io空间
  addr &= ~0x3 ;//io空间描述
}
存储空间描述:
    bit0   为0;    bit1,bit2    memory类型;  bit3 豫提取位,你用的芯片为0
    这4位是协议应用位,其他28位再加上4个0就是memory基地址。
io空间描述:
    bit0   为1;    bit1    保留,其他30位加上两个0就是io基地址。。
数据手册上有描述。
应该这样理解。。
 楼主| 发表于 2003-11-8 12:30:59 | 显示全部楼层

liu 版主,看看我改的这个函数行不行。

哦。 对了,好象看过。
 楼主| 发表于 2003-11-8 12:45:05 | 显示全部楼层

liu 版主,看看我改的这个函数行不行。

是了, 收获不小。 以后看书要认真点。

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-1-3 10:52 , Processed in 0.016137 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表