kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1186回复:10

s5933地址配置一问

楼主#
更多 发布于:2002-11-29 09:30
我得5933作为主控设备,由板卡设置5933,发起传输,dma传输,我得问题是在设置目标地址时如何确定?因为我不可能随便设置一个值的,否则驱动程序或应用程序怎么知道到那去取数啊?
困扰了我很久了,在版上问了很多边也没人讲清楚!!!
stroll
驱动小牛
驱动小牛
  • 注册日期2001-10-26
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分161分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-29 13:55
系统会根据你的配置信息分配给你一个基地址。用这个作为目标地址就可以了。
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-29 18:17
楼上的大哥,你说的不对吧!我没有申请内存空间的话,那怎么传输数据给pc机啊?
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-30 11:29
龙兄来吧!!!
帮忙啊!!!救命啊!!!!!
Dragon2008
驱动中牛
驱动中牛
  • 注册日期2002-04-01
  • 最后登录2006-03-13
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-02 13:15
龙兄来吧!!!
帮忙啊!!!救命啊!!!!!

我对你的问题的描述还不是太清楚,能否再详细点。
我姓龙,我属龙,我叫龙。。。
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-02 15:23
你终于来了,呵呵
我得5933作为主控设备,由板卡设置5933,发起传输,使用dma传输,(s5933作为主控设备是不是有两种发起方式嘛!一个是pci局部总线启动5933,也就是设置目标地址,和数据量的值;另一个是所谓的外接口启动,就是由板卡上的cpu设置目标地址和数据量值)我得问题是我在用外部板卡上的cpu设置5933中的目标地址寄存器时如何确定这个地址值?我认为这个地址是逻辑值,因为我不可能随便设置一个值的,否则驱动程序或应用程序怎么知道到那去取数啊?
当由pci总线启动时,我感觉是比较容易的,先由应用程序申请一块地址,锁定它,获取他的首址,把这个首址放到s5933的mwar寄存器中,启动5933就行了。
相应的外部接口启动时,我就不知道这个存放数据的地址怎么才能获得?是在一开始申请的嘛?
lifeship
驱动小牛
驱动小牛
  • 注册日期2002-10-18
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-03 19:53
5933 我不太熟悉,但感觉上是有区城望5933的某个存储dma目标地址的寄存器写入目标地址,当然,这里的目标地址是由驱程分配的一块共享内存地址,
杯汝前来,  老子今朝,  放荡形骸!  甚长年抱渴,  咽如焦釜,  于今喜醉,  气似奔雷!  慢说刘伶,  古今达者,  醉后何妨死便埋! 
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-04 11:14
竟然没人指导!!!5555,太惨了!!
ming_ming_s
驱动牛犊
驱动牛犊
  • 注册日期2002-07-30
  • 最后登录2003-04-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-11 10:11
我没做过由外部cpu设置目标地址的DMA控制方式,不过我觉得应该有两种解决的办法:
1、由于在驱动中申请的缓冲区地址只有主机CPU才知道,所以,如果目标地址必须由外CPU来写(DMA外加接口启动方式),那么只有在DMA初始化时通过两个CPU之间的通信来使外CPU获取该目标地址,然后写到目标地址寄存器中去。
2、干脆改变成由主机CPU来写目标地址寄存器。即每次外CPU要启动DMA传送时,先通过S5933向主机CPU发送一个特殊信息(可以采用信箱中断方式传送),然后由主机CPU写目标地址寄存器(主机CPU是知道目标地址的)。
   总之必须有主机CPU和外CPU之间的通信。呵呵,只是一个想法,没有验证过,大家给点意见。


mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-02-12 18:48
根据驱动模型,首先是在用户程序分配一块缓冲区,然后通过DeviceIoControl()将缓冲区的指针(虚拟地址)传递进内核,这一步必须是IRP排队的,然后再通过一个什么函数,锁定该用户缓冲区并将虚拟地址映射为CPU核心虚拟地址,然后再通过一个映射函数,获取第一个连续的缓冲区地址物理及其长度,进行第一次分割传输。然后再……。俺好久未整驱动了,影象已有些模糊,但推荐一个帅哥――brucezh(疯狂灌水的斑竹)一直在做驱动,用过5933,你可以问他。
mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-02-12 19:13
对不起,我未认真看问题。你的那种应用最好应用在嵌入式,由卡上的cpu启动DMA,因为在这种情况下,你可以写入存储器的任意的物理地址,只要你能确保这个地址不会破坏数据即可,而且这个物理地址是很直接的,但在Windows下存储管理采用的是虚拟内存机制,要想显式获得一块安全的地址连续的缓冲区(用户缓冲区通常是存储碎片的集合)很困难。但不是不可以获得,你可以通过通常的PCI启动的代码获取用户缓冲区的碎片的物理地址及其长度,可以通过连续多次使用那个Iomap***函数,一次获取用户缓冲区的所有碎片的物理地址及其长度(类似于scatter/gather方式),然后将该物理地址及其长度通过PASSTHRU方式或mail或FIFO送入卡上的什么寄存器,然后由卡上的CPU设置5933的寄存器启动一次DMA,第一次传输完后,再将用户缓冲区的第二个碎片的物理地址及其长度送到卡上,再由卡上的CPU对5933进行设置启动第二次DMA,依次类推,直至传输完。
游客

返回顶部