DSPRelated.com
Forums

Re: PCI data transfer (dm642 DSP)

Started by Jeff Brower June 12, 2007
Geckook Xu-

> Thank you for your idea.
> I try internal mem in this time, I can read the data from PC (host).

Ok that's good progress.

> But when I use SDRAM to read data, It is not work.
> I still can write data from SDRAM to PC (use API PCI_xfrStart(PCI_WRITE);).
> I try to init the emif, but didn't succeed.
>
> Do you have any advice?

First you have to verify EMIF init and SDRAM operation just by using DSP code,
without host and PCI involved. A basic DSP test program that writes/reads back test
pattern data to/from the SDRAM would be helpful.

To initialize EMIF, my suggestion would be to study Gel file and other basic C code
initialization for TI's EVM DM642 card; this would show good examples for
initializing SDRAM. Hopefully your PCI card has similar EMIF design as with EVM
DM642.

-Jeff

> On 6/7/07, Jeff Brower wrote:
> > Geckook Xu-
> >
> > > Thank you for your reply.
> > > 1) I don't know what did you refer to 'PMC'. But I am sure my card
> > > implements PCI bus interface.
> >
> > Ok. I mentioned PMC because you said "I have a system where the a PMC card with
> > C6415 act as a daughter board" (see below). I assume you mean a standard PMC
> > form-factor card with 32-bit, 33 MHz PCI interface.
> >
> > > 2) I try external mem in SDRAM. (and what should I take attention to
> > > in this case?)
> >
> > Ok, but why not try internal mem first? It's easier to deal with, and you don't have
> > to worry about EMIF register configuration.
> >
> > > 3) I write a wdm driver of windows XP. It will offer an physical address to dsp.
> > > And the physical address would work when DSP transfer data to this
> > > physical address of PC(host) with API below:
> > > PCI_xfrStart(PCI_WRITE);
> > > But why I can not read data from this physical address?
> >
> > How sure are you the physical address is correct? When I wrote PCI drivers for DSP
> > cards before, the physical address on the host (PC) side often proved to be a
> > problem.
> >
> > -Jeff
> >
> > > On 6/4/07, Jeff Brower wrote:
> > > > Chiun-Siang Beh-
> > > >
> > > > > Can you tell me how to start the pci master read?
> > > > > my code like this:
> > > > > config.dspma = (Uns)req->dstAddr;
> > > > > config.pcima = (Uns)req->srcAddr;
> > > > > config.pcimc = (Uns)GET_BYTE_COUNT(req->byteCnt);
> > > > > PCI_xfrConfig(&config);
> > > > > PCI_xfrStart(PCI_READ_NOPREF);
> > > > >
> > > > > but I can not read the data.
> > > > > Are there somethind to be take attention in DSP or PC host?
> > > > > Can you give me an example including the pc host and dsp?
> > > >
> > > > Questions:
> > > >
> > > > 1) Which PMC card is this? Are you sure it implements PCI bus interface and not HPI32 interface?
> > > >
> > > > 2) Have you tried a DSP mem address in internal (onchip) SRAM? If you are trying SDRAM, then that makes the test more
> > > > complicated, more things that can go wrong.
> > > >
> > > > 3) How did you determine the PC mem addr? Under both Win and Linux there are specific ways to determine actual
> > > > physical mem addr (not C code "logical" mem addr). If the physical addr you specify is not permitted by the OS, then
> > > > the transfer won't take place (or won't *appear* to take place).
> > > >
> > > > -Jeff
> > > >
> > > > >> Hi,
> > > > >>
> > > > >>I have a system where the a PMC card with
> > > > >>C6415 act as a daughter board.
> > > > >>Currently, I'm using the method describe
> > > > >>in the "C6000 Peripheral Guide" when i need to transfer
> > > > >>data from SDRAM of the PMC Card to the memory
> > > > >>the host system. i.e. I will use the master read
> > > > >>and Master Write method describe in Chapter 9.
> > > > >>For a MasterRead, I will write the source address
> > > > >>(host's memory address) to the PCIMA register. Then,
> > > > >>I write the destination address (DSP's memory address)
> > > > >>to the DSPMA. Then, I write the total byte I wish to
> > > > >>transfer and the read method accordingly to PCIMC.
> > > > >>The above method works fine. However, it's
> > > > >>not really "convenient" compare to the DAT module
> > > > >>of DSP/BIOS.
> > > > >>For example, if I wish to transfer (read/write)
> > > > >>large amount of data through PCI interface to/from
> > > > >>host, I have to use for/while-loop to transfer the
> > > > >>data. The maximum amount can be trasfer at a time
> > > > >>is limited to 65535 (i think so) as the totol bytes
> > > > >>to transfer field (CNT) in PCIMC is only a 16-bit field.
> > > > >>So, i need to seperate the large data to small transfers.
> > > > >>Futher more, i need to pool (or can use Interrupt)
> > > > >>the MASTEROK (in PCI Interrupt Source Register), to monitor
> > > > >>the status of previous transfer before making new
> > > > >>trasnfer request.
> > > > >>Thus, my problem is this method of transfer
> > > > >>appears to me as "blocking I/O" as my program will
> > > > >>be "blocked" until the transfer end.
> > > > >>
> > > > >>Is there any other better method to transfer data
> > > > >>between the memory visible to DSP to memory of Host ?
> > > > >>I'm hoping that the transfer can be "handled in
> > > > >>backgroud" .. something like that provided by the
> > > > >>DSP/BIOS's DAT module.. Can i use the QuickDMA / EDMA
> > > > >>to do so ? How ?
> > > > >>
> > > > >>Sorry if the message looks a bit messy :-p..
> > > > >>Please advise.. Thanks in advance.
> > > > >>
> > > > >>--
> > > > >>Beh, Chiun-Siang
> >