windows PCI驱动Block DMA使用问题

最近在修改一份基于DriverStudio的PCI视频采集卡驱动代码,遇到了关于DMA的使用上的疑惑。
其OnStartDevice初始化了相关资源,代码如下:

    PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources();
    // Get the list of translated resources from the IRP
    PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources();
    // Initialize the device descriptor for the DMA object using the assigned resource
    DEVICE_DESCRIPTION dd;
    RtlZeroMemory(&dd, sizeof(dd));
    dd.Version = DEVICE_DESCRIPTION_VERSION;
    dd.Master = TRUE;
    dd.ScatterGather = FALSE;
    dd.DemandMode = TRUE;
    dd.AutoInitialize = FALSE;
    dd.Dma32BitAddresses = TRUE;
    dd.IgnoreCount = FALSE;
    dd.DmaChannel = 3;
    dd.InterfaceType = PCIBus;
    dd.DmaWidth = Width32Bits;  // PCI default width
    dd.DmaSpeed = MaximumDmaSpeed;
    dd.MaximumLength = m_nDmaBufferSize;

    // Initialize the DMA adapter object
    m_Dma.Initialize(&dd, m_Lower.TopOfStack());
    m_DmaBuffer.Initialize(&m_Dma,m_nDmaBufferSize,true);

    // Create an instance of KPciConfiguration so we can map Base Address
    // Register indicies to ordinals for memory or I/O port ranges.
    KPciConfiguration PciConfig(m_Lower.TopOfStack());

    // For each I/O port mapped region, initialize the I/O port range using
    // the resources provided by NT. Once initialized, use member functions such as
    // inb/outb, or the array element operator to access the ports range.
    status = m_IoPortRange0.Initialize(
        pResListTranslated,
        pResListRaw,
        PciConfig.BaseAddressIndexToOrdinal(0)
        );

    status = m_Irq.InitializeAndConnect(
    pResListTranslated, 
    LinkTo(Isr_Irq), 
    this
    );

    if (!NT_SUCCESS(status))
    {
        Invalidate();
        return status;      
    }

    // Setup the DPC to be used for interrupt processing
    m_DpcFor_Irq.Setup(LinkTo(DpcFor_Irq), this);

这里初始化了DMA,但是没有绑定PCI设备物理地址与驱动空间地址的相关代码。然而在IoControl中却有以下操作

//写
 UCHAR* pDMA = (UCHAR*)m_DmaBuffer.pVirtualAddress() + pCapInfo->nCode*pCapInfo->nSize + pCapInfo->nOffset;
        memcpy(pDMA,pCapInfo->pData,pCapInfo->nSize);
//读
UCHAR* pDMA = (UCHAR*)m_DmaBuffer.pVirtualAddress() + pCapInfo->nCode*pCapInfo->nSize + pCapInfo->nOffset;
        memcpy(pCapInfo->pData,pDMA,pCapInfo->nSize);

从代码可以看出,直接将m_DmaBuffer当做PCI的内存进行了访问。简单阅读了DriverStudio的封装源代码,初始化过程实际上调用了IoGetDmaAdapter与AllocateCommonBuffer,也就是说m_DmaBuffer.pVirtualAddress()实际上是AllocateCommonBuffer分配的公用缓冲区,而实际上并没有任何地方将该地址与PCI实际的物理地址进行绑定。查阅相关资料,AllocateCommonBuffer一般用于ScatterGather模式,这里使用的是block DMA模式。难道是IoGetDmaAdapter或者AllocateCommonBuffer自动将pVirtualAddress()与PCI的物理地址空间进行了绑定?查询相关资料,也没有这种解释。那究竟为什么能直接通过m_DmaBuffer.pVirtualAddress()操作PCI的物理地址空间呢?

求各位大神解答。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
PCI DMA驱动和动态库
driverstudio 和 DDK生成的PCI驱动,DMA传输,包含该驱动的动态库,在VC环境下验证成功
windows PCI驱动 问题
各位:我在测试一个PCI设备驱动程序,现在是关于中断的处理了。这个驱动的中断处理是通过回调函数来实现的,机理是在我初始化PCI设备的时候给驱动传入一个回调函数地址,当PCI设备产生中断后,系统会调用pci驱动的中断处理函数做处理,最后一步就是调用我在初始化时候给的那个回调函数。也就是内核函数来调用用户态函数。但是测试的时候到调用回调函数这里就死机了。我是用windbg来跟踪,确定到到回调函数处理就死机的。请各位指导。如有不明白的请指出。谢谢!
PCI 总线高速DMA 数据传输驱动程序设计
PCI总线标准与PCI9054的完美结合。
基于DMA的PCI驱动源码
该驱动使用DS开发的,在VC6下编译生成,有完整的源代码,它是基于DMA高速传输的PCI驱动,并且有测试应用程序
PCI驱动使用函数
PCI总线驱动 1.pci驱动注册 pci_register_driver(struct pci_driver *drv) static struct pci_driver hamachi_driver = {       .name       = DRV_NAME,       .id_table   = hamachi_pci_tbl,       .probe      = h
关于windows的pci驱动事件等待问题
pci驱动中,在线程中使用事件等待遇到一个问题请大家指教原因;rn我创建一个线程,在线程中使用事件等待函数KeWaitForSingleObject等待时间为1毫秒,可是在同样的WIN7下,待等时间相差有10毫秒的差别。rn[code=c]rnLARGE_INTEGER waitTime;rnwaitTime.QuadPart = -10*1000;或waitTime.QuadPart = -10*100;rn使用KeDelayExecutionThread(KernelMode,TRUE,&waitTime);rn或使用rnKeWaitForSingleObject(hExitEvent, Executive, KernelMode, FALSE,&waitTime);rn[/code]rn在有些系统下等待为1秒钟只能等待10次,即10毫秒才会超时或触发一次。rn或者使用定时器的时候,取值waitTime.QuadPart = -10*1000;或waitTime.QuadPart = -10*100;都是10毫秒才触发一次。rn我希望能最少1毫秒就能触发一次或1毫秒能触发多次,但在同样的WIN7下面,有些系统却如我所愿。请问这是什么原因。请各位老师指点
lcd驱动dma问题
lcd驱动中,分配dma buffer用的是dma_alloc_writecombine,用dma_alloc_coherent可以吗?这两个函数申请的都是一致性DMA映射吧?
DMA驱动
1、为什么要用DMA DMA是一个片内控制模块,作用是将从指定源地址开始的指定长度的字符拷贝到指定目的地址处,并且DMA在执行拷贝操作的时候并不会消耗CPU的资源,等于说是字符串传输不经过CPU,而是直接经由DMA模块进行传输。这在一些需要大量数据传输并且又不想要耗费CPU资源的场合是十分有用的,比如摄像头数据的传输,这个就可使用DMA进行传输,不耗费CPU的资源。 2、S3C2440的DMA
linux2.6下pci驱动的问题
通过PCI9656产生中断 INTA#该引脚连接到X86主机的PCI总线INTC#引脚上(手里的板卡是这样连接的)rnrn通过示波器看到INTA#引脚周期的产生了中断,但是X86主机没有收到任何的中断rnrn注册中断的代码:rnrnrequest_irq(5, &register_interrupt, IRQF_DISABLED, "pci_9656", NULL); rnrn中断5是配置给9656的中断,通过lspci -v可以查看到:rn06:04.0 Bridge: PLX Technology, Inc. PCI9656 PCI <-> IOBus Bridge (rev ba)rn Subsystem: PLX Technology, Inc. PCI9656 PCI <-> IOBus Bridgern Flags: bus master, 66MHz, medium devsel, latency 32, IRQ 5rn Memory at d1000000 (32-bit, non-prefetchable) [size=512]rn I/O ports at b000 [size=256]rn Memory at d0000000 (32-bit, non-prefetchable) [size=8M]rn Memory at d0800000 (32-bit, non-prefetchable) [size=8M]rn Capabilities: [40] Power Management version 0rn Capabilities: [48] #06 [0000]rn Capabilities: [4c] Vital Product Datarnrn通过cat /proc/interrupts 查看中断成功注册了rnrn CPU0 rn 0: 206 IO-APIC-edge timerrn 1: 2 IO-APIC-edge i8042rn 3: 2 IO-APIC-edge rn 4: 2 IO-APIC-edge rn 5: 0 IO-APIC-edge pci_9656rn 6: 2 IO-APIC-edge floppyrn 7: 0 IO-APIC-edge parport0rn 8: 7 IO-APIC-edge rtcrn 9: 0 IO-APIC-fasteoi acpirn 14: 0 IO-APIC-edge libatarn 15: 0 IO-APIC-edge libatarn 16: 800001 IO-APIC-fasteoi uhci_hcd:usb4, i915@pci:0000:00:02.0rn 18: 0 IO-APIC-fasteoi uhci_hcd:usb3rn 19: 172 IO-APIC-fasteoi uhci_hcd:usb1, ehci_hcd:usb5rn 20: 11640 IO-APIC-fasteoi uhci_hcd:usb2, libatarn 21: 5131 IO-APIC-fasteoi eth2rn219: 386432 PCI-MSI-edge eth0rn220: 5130 PCI-MSI-edge eth1rnNMI: 0 Non-maskable interruptsrnLOC: 216147 Local timer interruptsrnRES: 0 Rescheduling interruptsrnCAL: 0 function call interruptsrnTLB: 0 TLB shootdownsrnTRM: 0 Thermal event interruptsrnSPU: 0 Spurious interruptsrnERR: 0rnMIS: 0rnrn为何主机就是无法收到响应的中断呢?谢谢各位大侠了哈
pci板卡驱动问题
我有一个pci板卡,windows自带驱动,插入即安装驱动程序,我又尝试用WinDriver的Driver Wizard生成一个驱动,发现两个驱动程序对应的板卡的中断号,一些寄存器的配置都不一样,请问这是怎么回事,板卡寄存器的配置是在驱动程序里,还是寄存器已经配置好,如果配置好了的话,两个驱动对应的寄存器配置应该一样啊
pci device的驱动问题
我用的是via的主板,而现在的我设备管理中有个黄色的问号PCI DEVICE,问请应该下载什么驱动,主板的具型号我也不太清楚。
pci板卡驱动的问题
我有一个pci板卡,windows自带驱动,插入即安装驱动程序,我又尝试用WinDriver的Driver Wizard生成一个驱动,发现两个驱动程序对应的板卡的中断号,一些寄存器的配置都不一样,请问这是怎么回事,板卡寄存器的配置是在驱动程序里,还是寄存器已经配置好,如果配置好了的话,两个驱动对应的寄存器配置应该一样啊
pci数据采集卡DMA驱动开发问题
本人正在开发pci9052数据采集卡的驱动有那位大侠帮帮忙,我的问题是在用driverwork中如何做DMA传输代码。有那位有源代码的施舍小弟一点将有高分送上谢谢Email-bf_bf_bf@163.com
PCI串行口驱动 PCI串行口驱动
PCI串行口驱动 PCI串行口驱动 PCI串行口驱动 PCI串行口驱动 PCI串行口驱动
PCI驱动
PCI驱动程序,用VC++和Driverstudio+DDK2000编译
pcie驱动和pci驱动
各位前辈,现请教个简单的问题:linux的pcie驱动怎样编写啊?我在网上搜了好久都没有找到相关的资料。难道要用pci驱动就可以了?这样会不会使pcie设备的一些性能发挥不出来。pci驱动和pcie驱动有什么区别?rn请各位指点,编写时都需要注意哪些方面。谢了!!!
PCI局部总线 pci驱动介绍
pci总线的详细介绍,对于了解pci总线以及pci驱动开发有很大的帮助
要做PCI的驱动,需要看DMA相关的东西吗?
没做过,对硬件不是很动,现在看接口部分,有些驱动程序里还有DMA的处理,不知道要不要看?
诚心请教一个关于PCI使用DMA的问题
最近在做一个powerpc+fpga架构的项目,采用PCI总线进行数据传输,在调试驱动的时候遇到了这样的现象,在PCI的probe()之中对PCI的内存空间可以进行ioread,iowrite的操作,数据都正确(这段空间是fifo,读写都不用加偏移),为了提高速率所以添加了DMA,将PCI的内存空间作为源地址,malloc一段空间作为目的地址,计数器设一个定值,设置工作模式后启动DMA,DMA工作完成后读取目的地址的内存查看数据,结果为全0,即并没有将源地址的数据映射过去,在映射过程中读取DMA的状态寄存器可知道DMA确实启动了,工作模式的配置上也做出了多种尝试最后均未能调通。rn 求有经验的人能给我些指点,还有哪些手段可以用来定位这个问题,跟DMA映射流程相关的寄存器就那么几个,不知道还有什么办法可以来对这个问题进行调试,另外,有没有办法来排除硬件本身的问题?fifo的空间是否支持DMA映射功能?求指教,谢谢
windows驱动开发-基于WDM的PCIe DMA驱动
连接中断 Servicing Interrupts Registering an ISR Using Message-Signaled Interrupts Removing an ISR IoConnectInterrupt MSI必须使用 IoConnectInterruptEx,参考WdmlibIoConnectInterruptEx #define IoConnectInte...
有关LINUX DMA驱动的问题
小弟最近在学习写驱动,写了个最简单的DMA驱动但是用不起来,查了很久都不知道哪里有问题,贴出来大家看看哈.由于问题比较长也比较复杂,给50分.格式好难弄,大家将就下,或者可以联系我发.C文件给你~~rnrn[code=C/C++]编程步骤如下:(以下是初始化,一切结果表现的正常)rn…………rnresult = register_chrdev(210,"mydma",&dmatest_fops);rn …………rnCsr_Addr = DMA_ADDR_BASE+0x24; rn Csr_Addr = (unsigned long)ioremap(Csr_Addr,4);rn Sy_Addr = (unsigned long)ioremap(DMA_ADDR_BASE+0x28,4);rn Cn_CFG_Addr = (unsigned long)ioremap(DMA_ADDR_BASE+0x1E4,4);rn Cn_LLP_Addr = (unsigned long)ioremap(DMA_ADDR_BASE+0x1F0,4);rn Cn_Size_Addr = (unsigned long)ioremap(DMA_ADDR_BASE+0x1f4,4);rn Cn_Csr_Addr = (unsigned long)ioremap(DMA_ADDR_BASE+0x1e0,4);rnrn (*(volatile unsigned long *)Csr_Addr) = 0x0001; //设置地址格式为小端,同时ENABLEDMA控制器rn (*(volatile unsigned long *)Sy_Addr) = 0x0080; //设置同步模式rn (*(volatile unsigned long *)Cn_CFG_Addr) = 0x00000003; //设置允许中断rn (*(volatile unsigned long *)Cn_LLP_Addr) = 0x00000000; //设置LLP为0,这个我也不知道为什么,不过编程手册上这么写的rn (*(volatile unsigned long *)Cn_Size_Addr) = 0x00000400; //设置传输大小为1K rn (*(volatile unsigned long *)Cn_Csr_Addr) = 0x80fc1204; //设置权限、单次传输大小等rn …………rn以下是ioctl的内容:rn……rn Cn_SrcAddr = (unsigned long)ioremap(DMA_ADDR_BASE+0x1e8,4);rn Cn_DesAddr = (unsigned long)ioremap(DMA_ADDR_BASE+0x1ec,4);rn switch(cmd)rn rn case SETSRC:rn (*(volatile unsigned long *)Cn_SrcAddr) = arg; //设置源地址rn break;rn case SETDES:rn (*(volatile unsigned long *)Cn_DesAddr) = arg; //设置目标地址rn break;rn case STARTDMA:rn (*(volatile unsigned long *)Cn_Csr_Addr) |= 0x01; //开始DMA传输rn break ;rn case STOPDMA:rn (*(volatile unsigned long *)Cn_Csr_Addr) &= 0xfffffffe; //结束DMA传输rn break ;rn rnrn接着在应用程序里:rn int ret;rn int fileno;rn char buff_src[32] = "I AM THE SRC~~~~~~~~";rn char buff_des[32] = "DESDESDESDES";rn fileno = open("/dev/mydma",O_RDWR);rn …………rn ret = ioctl(fileno,SETSRC,&buff_src);rn ret = ioctl(fileno,SETDES,&buff_des);rn ret = ioctl(fileno,STARTDMA,NULL);rn ret = ioctl(fileno,STOPDMA,NULL);rn …………rn[/code]结果是buff_des还是DESDESDESDES,没有变成I AM THE SRC~~~~~~~~",哪里有问题呢,高手指点下rn
关于linux下DMA驱动的问题
在linux下怎样应用DMA呢?是要先写驱动吗?系统目录linux/arch/arm/mach-s3c2410/dma.c下的这个文件make后直接insmod行吗?谢谢!
有关2440 DMA驱动的问题
我在编写DMA 的驱动,想要与FPGA相连,以bank1外接FPGA,通过DMA从ARM的SDRAM(0x30000000开始)到bank1(0x08000000),但是我开过相关的DMA的函数,在rns3c2410_dma_devconfig( int channel, rn enum s3c2410_dmasrc source, //dma传送源的类型,可以是S3C2410_DMASRC_HW和S3C2410_DMASRC_MEMrnrn int hwcfg, rn unsigned long devaddr) //传送的目的地址rn这个函数中,只有对传输的目的地址的设置,而我把数据放到SDRAM(0x30000000开始)中了,请问哪位做过能指点一二,怎么对DMA的源地址设置啊?
请教linux&2440下DMA驱动问题
想写一个linux下DMA驱动,主要功能是将一个固定地址端口的数据传入内存rn写的时候仿照内核中uda1341的驱动中的s3c2410iis_dma_in部分编写rnrn问题出现在s3c2410_dma_enqueue中,在read()中调用了s3c2410_dma_enqueue函数,如下:rnstatic ssize_t ad_read(struct file *file, char *buffer, size_t count, loff_t *offset)rnrn const char *buffer0 = buffer;rn ad_stream_t *s = &ad_stream;rn unsigned long flags;rn //int chunksize, ret = 0;rn printk("ad_read: count=%d\n", count);rn rn if ( !s->buffers )rn rn if ( ad_setup_buf ( s ) )rn return -ENOMEM;rn rn ad_buf_t *b = s->buf;rn down ( &b->sem );rn printk("it is ok until here!1\n" );rn s3c2410_dma_enqueue ( s->dma_ch, ( void * ) b, b->dma_addr, s->fragsize ); rn rn printk( "it is ok until here!3\n" ); rn rn return 0;rnrnrn程序执行到s3c2410_dma_enqueue后停止,出现:rns3c2410_dma_start is at end !rnthe curr_tc is 107a40rns3c2410_dma_irq is running!rnBUG: soft lockup - CPU#0 stuck for 61s! [ad_dma:923]rnModules linked in: ad_dmarnrnPid: 923, comm: ad_dmarnCPU: 0 Not tainted (2.6.28.7 #355)rnPC is at handle_IRQ_event+0x34/0x80rnLR is at handle_edge_irq+0x104/0x144rnpc : [] lr : [] psr: 60000013rnrn跟踪到plat-s3c24xx\dma.c,发现程序在s3c2410_dma_enqueue()的最后执行了local_irq_restore(flags)后停止(此时DMA的计数器不为0),随后进入中断(此时DMA计数器应该为0了),程序出errorrnrn感觉在local_irq_restore(flags)执行后,程序应该是继续向下执行直到DMA计数器为0产生中断,但是这里给人的感觉是local_irq_restore(flags)执行完了系统死锁了,不向下执行了,但是又能进中断,不知道怎么把程序调通……rnrn在这个地方徘徊了N多天了,盼望牛人拯救啊!!!!rn
PCI 设备Windows 通用驱动程序设计
结合通用高速PCI 总线目标模块的驱动程序设计全面地讨论了Windows设备特别是PCI 设备驱动程序编写时所面临的主要问题及解决方案并提出了封装设备驱动的方法
求教:PCI驱动资源冲突问题
我用driverstudio的向导建立了一个PCI9030的驱动框架,并且未对这个驱动框架的代码做任何修改。但这个驱动出现一些异常的现象是:大部分主板可以安装设备,并且在windows xp下面能正常启动,并且在设备栏里能正确找到设备。但是奇怪的是,在某些板卡(如华硕的PQ5主板)的其中两个插槽上安装硬件卡和驱动的话,会出现一直重启计算机。我一直没有查出是具体是什么问题。但估计是在AddDevice(PDEVICE_OBJECT Pdo)函数里出现的问题。代码如下:rnNTSTATUS One::AddDevice(PDEVICE_OBJECT Pdo)rnrn t << "AddDevice called\n";rnrn // Create the device object. Note that we used a form of "placement" new,rn // that is a member operator of KDevice. This form will use storagern // allocated by the system in the device object's device to store ourrn // class instance.rnrnrn OneDevice * pDevice = new (rn static_cast(KUnitizedName(L"OneDevice", m_Unit)),rn FILE_DEVICE_UNKNOWN,rn NULL,rn 0,rn DO_BUFFERED_IOrn | DO_POWER_PAGABLErn )rnrn OneDevice(Pdo, m_Unit);rnrn if (pDevice == NULL)rn rn t << "Error creating device OneDevice"rn << (ULONG) m_Unit << EOL;rn return STATUS_INSUFFICIENT_RESOURCES;rn rnrn NTSTATUS status = pDevice->ConstructorStatus();rnrn if ( !NT_SUCCESS(status) )rn rn t << "Error constructing device OneDevice"rn << (ULONG) m_Unit << " status " << (ULONG) status << EOL;rn delete pDevice;rn rn elsern rn m_Unit++;rnrn pDevice->ReportNewDevicePowerState(PowerDeviceD0);rn rnrn return status;rnrnrn请指教。
PCI驱动地址读写的问题
写了个驱动(里面仅用RtlCopyMemory做一些操作),测试时采用CreateFile、ReadFile、WriteFile方式发现都是对共享内存进行操作,但是我想具体的读写PCI上所有地址和寄存器的值,驱动程序应该如何写呢?要应用哪些函数?
PCI驱动的数据传输速率问题
最近在做一个PCI驱动,功能比较简单 就是:先申请一块大小64k的连续物理内存,当接收到应用程序发下来的数据,将其写入申请的物理内存中,并通知下面的FPGA对数据进行处理,然后等待FPGA返回的中断,当接收到中断后从物理内存中读取数据返回给上层应用程序。现在功能已经实现,就是性能达不到,要求200Mbps,现在却只有100左右。驱动实现思路就是先用memcpy将要写的数据写到物理内存中,读数据用memcpy数据从物理内存读到IRP的buffer中返回给应用程序。应用程序通过DeviceIoControl与驱动交互,选择METHOD_BUFFERED方式。驱动很简单 核心就几条语句,但是速度无论怎样就提不上去了。同样的思路在linux下实现能够达到200。由于刚接触PCI驱动,很多细节还不是很清楚,还请大家指点 谢谢
block驱动不能挂载问题
我将微软自带的RamDisk移植到wince 6下,AutoMount AutoPart AutoFormat都设置为1 但是看不到盘符,驱动输出的信息如下:rnRAMDISK: DLL_PROCESS_ATTACHrnRAMDISK: DSK_Init enteredrn+CreateDiskObjectrn-CreateDiskObjectrnRAMDISK : ActiveKey = Drivers\Active\13rnRAMDISK : ActiveKey (copy) = Drivers\Active\13 (@ 0xD00E9D00)rnRAMDISK: sectors = 2048rnRAMDISK: RAMInit returning 0xd00e9cc0rnRAMDISK: DSK_Open returning -804348736rn+DSK_IOControl (4) rnRAMDISK: DSK_Close enteredrnRAMDISK: DSK_Close donernrn求高手指教,在线等回答
PCI驱动相关 (分层驱动)
请教各位大虾:本人刚接触驱动开发,目前需要写一个PCI驱动加一个串口驱动rnPCI驱动目前已经能正确获取基址,但是怎么加串口驱动比较合理?rn1.可不可以通过一个驱动程序在AddDevice函数中通过IoCreateDevice来创建2个设备(PCI和COM),相当于2个驱动合在一起(读取PCI资源来配置COM相关寄存器)?rn2.按2个驱动来做,先PCI驱动并创建串口设备,再把串口驱动挂在PCI上,这样就是2个驱动,我还不太了解怎么来分层调用驱动,希望各位高人给小弟一点指点,最好能详细一点,谢谢……
PCI并口驱动CH350L驱动
PCI并口驱动CH350L驱动,丢了的朋友可以来下载
linux的dma驱动
硬件平台:TI的3530 内核:linux-2.6.36 功能:将fpga的数据从内存的一个地方复制到内存另一个地方 初学dma感到很是吃力,编写的内核驱动代码仔细看了一个星期,才将dma的工作原理和程序流程给看明白 工作原理:通过软件配置dma控制器的寄存器,让dma自己讲数据从外部读入到内存中,使得linux系统可以直接访问,而在这数据传送的期间,cpu不参与数据的传输,这也大大提高了
DMA驱动程序设计
通过串口发送数据的实质是:内存保存着字符串,cpu将字符一一写入串口寄存器。在这个过程中,cpu被占用着,导致效率低;若有其它硬件可以代替cpu完成该工作,则cpu可以被释放出来。该硬件为DMA控制器,该机制称为DMA。
DMA 驱动:简单实例
1. 简介: 1)dma 直接内存访问。 2)把源地址和目的地址告诉芯片内部相关寄存器,根据 DMA 中断是不是发生来判断是不是操作完。 char *src = dma_alloc_writecombine(NULL, BUF_SIZE, &amp;src_phys, GFP_KERNEL); 函数返回虚拟地址,第三个参数返回物理地址。 用户操作的时候使用 虚拟地址。 传给控制器,控制...
tq2440 的dma裸机驱动
DMA是一种提高CPU效率的工具。如果让cpu去负责搬运数据,效率是十分低下的,因为在这个过程中,cpu就只能做这么一件事。因此DMA就应运而生。只要告诉dma,要搬运的数据源地址,以及要搬运到哪里去的地址,何种方式,使能它,DMA就会获取总线控制权,自动地搬运数据,从而解放cpu,提高效率。 tq2440的dma裸机驱动,按以下方式进行初始化: //初始化原地址 //初始化目的地址
SSD1305 SPI DMA驱动
基于STM32的SSD1305驱动程序,使用硬件SPI,DMA方式,高效的刷屏方式,不占用CPU,亲测可用
malloc分配的内存空间是连续的吗
1、linux内核管理内存空间的分配,所有程序对内存空间的申请和其他操作,最终都会交给内核来管理。 2、linux实现的是“虚拟内存系统”,对用户而言,所有内存都是虚拟的,也就是说程序并不是直接运行在物理内存上,而是运行在虚拟内存上,然后由虚拟内存转换到物理内存。 3、linux将所有的内存都以页为单位进行划分,通常每一页是4KB; 4、在对虚拟内存地址到物理内存地址进行转换时,内核会对地址...
一致性DMA驱动
有大神写过一致性DMA驱动吗?请教一致性DMA驱动流程是怎么样的啊,我只知道流式DMA的驱动方法,不知道一致性DMA的驱动读写流程,望大神指教,或者传一个一致性的代码例程,谢谢!
DMA驱动代码
本驱动代码为裸机驱动代码,针对的平台为ARM11,ok6410平台
DMA驱动疑问
最近搞DMA驱动,有些疑问,故请教。rn假设DMAC是pl330的,挂到AMBA总线上。rn1. 内核代码中的request_dma()函数与具体DMAC(如2410上的pl330)的代码中的s3c2410_dma_request()有什么关系没?rn2. 外设通过此DMA模块传输时,DMA请求是用s3c2410_dma_request还是request_dma来申请?rn3. request_dma()什么情况下用到?(我看request_dma好像和ISA总线关系很大,难道是作为ISA总线上的DMAC标准接口)rn
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview