📄 fw-dma.txt
字号:
This page describes the structures and procedures used by the cx2341x DMAengine.Introduction============The cx2341x PCI interface is busmaster capable. This means it has a DMAengine to efficiently transfer large volumes of data between the card and mainmemory without requiring help from a CPU. Like most hardware, it must operateon contiguous physical memory. This is difficult to come by in large quantitieson virtual memory machines.Therefore, it also supports a technique called "scatter-gather". The card cantransfer multiple buffers in one operation. Instead of allocating one largecontiguous buffer, the driver can allocate several smaller buffers.In practice, I've seen the average transfer to be roughly 80K, but transfersabove 128K were not uncommon, particularly at startup. The 128K figure isimportant, because that is the largest block that the kernel can normallyallocate. Even still, 128K blocks are hard to come by, so the driver writer isurged to choose a smaller block size and learn the scatter-gather technique.Mailbox #10 is reserved for DMA transfer information.Note: the hardware expects little-endian data ('intel format').Flow====This section describes, in general, the order of events when handling DMAtransfers. Detailed information follows this section.- The card raises the Encoder interrupt.- The driver reads the transfer type, offset and size from Mailbox #10.- The driver constructs the scatter-gather array from enough free dma buffers to cover the size.- The driver schedules the DMA transfer via the ScheduleDMAtoHost API call.- The card raises the DMA Complete interrupt.- The driver checks the DMA status register for any errors.- The driver post-processes the newly transferred buffers.NOTE! It is possible that the Encoder and DMA Complete interrupts get raisedsimultaneously. (End of the last, start of the next, etc.)Mailbox #10===========The Flags, Command, Return Value and Timeout fields are ignored.Name: Mailbox #10Results[0]: Type: 0: MPEG.Results[1]: Offset: The position relative to the card's memory space.Results[2]: Size: The exact number of bytes to transfer.My speculation is that since the StartCapture API has a capture type of "RAW"available, that the type field will have other values that correspond to YUVand PCM data.Scatter-Gather Array====================The scatter-gather array is a contiguously allocated block of memory thattells the card the source and destination of each data-block to transfer.Card "addresses" are derived from the offset supplied by Mailbox #10. Hostaddresses are the physical memory location of the target DMA buffer.Each S-G array element is a struct of three 32-bit words. The first word isthe source address, the second is the destination address. Both take up theentire 32 bits. The lowest 18 bits of the third word is the transfer bytecount. The high-bit of the third word is the "last" flag. The last-flag tellsthe card to raise the DMA_DONE interrupt. From hard personal experience, ifyou forget to set this bit, the card will still "work" but the stream willmost likely get corrupted.The transfer count must be a multiple of 256. Therefore, the driver will needto track how much data in the target buffer is valid and deal with itaccordingly.Array Element:- 32-bit Source Address- 32-bit Destination Address- 14-bit reserved (high bit is the last flag)- 18-bit byte countDMA Transfer Status===================Register 0x0004 holds the DMA Transfer Status:Bit0 read completed1 write completed2 DMA read error3 DMA write error4 Scatter-Gather array error
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -