阅读:1261回复:10
s5933地址配置一问
我得5933作为主控设备,由板卡设置5933,发起传输,dma传输,我得问题是在设置目标地址时如何确定?因为我不可能随便设置一个值的,否则驱动程序或应用程序怎么知道到那去取数啊?
困扰了我很久了,在版上问了很多边也没人讲清楚!!! |
|
沙发#
发布于:2002-11-29 13:55
系统会根据你的配置信息分配给你一个基地址。用这个作为目标地址就可以了。
|
|
板凳#
发布于:2002-11-29 18:17
楼上的大哥,你说的不对吧!我没有申请内存空间的话,那怎么传输数据给pc机啊?
|
|
地板#
发布于:2002-11-30 11:29
龙兄来吧!!!
帮忙啊!!!救命啊!!!!! |
|
地下室#
发布于:2002-12-02 13:15
龙兄来吧!!! 我对你的问题的描述还不是太清楚,能否再详细点。 |
|
|
5楼#
发布于:2002-12-02 15:23
你终于来了,呵呵
我得5933作为主控设备,由板卡设置5933,发起传输,使用dma传输,(s5933作为主控设备是不是有两种发起方式嘛!一个是pci局部总线启动5933,也就是设置目标地址,和数据量的值;另一个是所谓的外接口启动,就是由板卡上的cpu设置目标地址和数据量值)我得问题是我在用外部板卡上的cpu设置5933中的目标地址寄存器时如何确定这个地址值?我认为这个地址是逻辑值,因为我不可能随便设置一个值的,否则驱动程序或应用程序怎么知道到那去取数啊? 当由pci总线启动时,我感觉是比较容易的,先由应用程序申请一块地址,锁定它,获取他的首址,把这个首址放到s5933的mwar寄存器中,启动5933就行了。 相应的外部接口启动时,我就不知道这个存放数据的地址怎么才能获得?是在一开始申请的嘛? |
|
6楼#
发布于:2002-12-03 19:53
5933 我不太熟悉,但感觉上是有区城望5933的某个存储dma目标地址的寄存器写入目标地址,当然,这里的目标地址是由驱程分配的一块共享内存地址,
|
|
|
7楼#
发布于:2002-12-04 11:14
竟然没人指导!!!5555,太惨了!!
|
|
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之间的通信。呵呵,只是一个想法,没有验证过,大家给点意见。 |
|
9楼#
发布于:2003-02-12 18:48
根据驱动模型,首先是在用户程序分配一块缓冲区,然后通过DeviceIoControl()将缓冲区的指针(虚拟地址)传递进内核,这一步必须是IRP排队的,然后再通过一个什么函数,锁定该用户缓冲区并将虚拟地址映射为CPU核心虚拟地址,然后再通过一个映射函数,获取第一个连续的缓冲区地址物理及其长度,进行第一次分割传输。然后再……。俺好久未整驱动了,影象已有些模糊,但推荐一个帅哥――brucezh(疯狂灌水的斑竹)一直在做驱动,用过5933,你可以问他。
|
|
10楼#
发布于:2003-02-12 19:13
对不起,我未认真看问题。你的那种应用最好应用在嵌入式,由卡上的cpu启动DMA,因为在这种情况下,你可以写入存储器的任意的物理地址,只要你能确保这个地址不会破坏数据即可,而且这个物理地址是很直接的,但在Windows下存储管理采用的是虚拟内存机制,要想显式获得一块安全的地址连续的缓冲区(用户缓冲区通常是存储碎片的集合)很困难。但不是不可以获得,你可以通过通常的PCI启动的代码获取用户缓冲区的碎片的物理地址及其长度,可以通过连续多次使用那个Iomap***函数,一次获取用户缓冲区的所有碎片的物理地址及其长度(类似于scatter/gather方式),然后将该物理地址及其长度通过PASSTHRU方式或mail或FIFO送入卡上的什么寄存器,然后由卡上的CPU设置5933的寄存器启动一次DMA,第一次传输完后,再将用户缓冲区的第二个碎片的物理地址及其长度送到卡上,再由卡上的CPU对5933进行设置启动第二次DMA,依次类推,直至传输完。
|
|