windchaser
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2005-06-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2232回复:4

关于pci的CAN卡驱动

楼主#
更多 发布于:2005-01-18 19:19
    请教关于pci9052芯片的CAN卡的驱动编写,CAN控制器是sja1000,卡是周立功公司的can接口卡pci9820,上面有两个sja1000控制器。我用的是x86的tornado。

      我现在已经能实现内存映射,用的是sysMmuMapAdd()函数,映射之后对映射的内存可以操作,不像先前总是出现“page fault”,应该是映射成功了,但我还是不能成功的对sja1000的寄存器进行操作。我描述一下:

1。我在vxorks下通过两个ID阿号找到pci设备
2。利用程序得到pci的内存空间,我找到了三段,起始地址分别是:0xf5006000,0xf5007000,0xf5008000,我不知道这是否就是我可以对sja1000寄存器进行配置的基地址。
3。我在sysLib.c中用sysMmuMapAdd()函数把这三段地址映射到内存中,应该得到了物理地址
4。我按照周立功技术支持的解释来操作(不一定是正确的),他们说0xf5006000(第一个空间)是pc9052的配置空间,0xf5007000,0xf5008000(后两个)是两个sja1000的寄存器空间,我于是用*((UINT32)*(0xf5007000+偏移))对sja1000寄存器进行访问,但好像结果并不正确(按照sja1000的寄存器之间的约束关系,而且好多寄存器根本无法写入),应该是并没有访问到sja1000的真实寄存器(厂商说如果基地址对了,应该就可以访问寄存器了)。


       我现在是一头雾水,不知道哪里错了,为什么映射的寄存器不能访问,驱动程序无法进行下去,希望能再指点我一下,或者也许我的思路是错误的,大家提醒一下,我还需要向厂商要什么资料。我在windows下我在设备管理器中的板卡资源中看到的三段内存地址也是以0xf5006000,0xf5007000,0xf5008000开始的,和我在vxworks下得到的三段地址是一致的,不知道是不是这就是基地址。另外,pci9052芯片的配置空间是什么概念,我们还需要修改吗? :)
windchaser
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2005-06-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-19 09:33
大家帮一下,给思路也感谢阿
aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-23 17:41
推荐使用winDriver看看配置空间、存储空间的内容是否都正确
现在急着出去,晚上再详细说
我的邮件地址:hwybird@sohu。com,两三天看一次
aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-23 20:13
你的方法基本是正确的,关于配置空间可以看任何一本总线书上的介绍。(你的地址就是从配置空间读到的),有些器件可能作内存配置空间的映射(但我没遇到过)。
建议你在windows下使用winDriver看看先
下面的办法可以试试:
1。动态影射,但是你要是不动硬件的话应该没问题
2。保证硬件正确
3。和硬件开发人员交流一下
我的邮件地址:hwybird@sohu。com,两三天看一次
我的邮件地址:hwybird@sohu。com,两三天看一次
eechina
驱动牛犊
驱动牛犊
  • 注册日期2004-01-08
  • 最后登录2007-04-25
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-24 09:20
>>3。我在sysLib.c中用sysMmuMapAdd()函数把这三段地址映射到内>>存中,应该得到了物理地址
这一步是什么意思?问题是不是出在这里?

游客

返回顶部