Path: utzoo!utgpu!jarvis.csri.toronto.edu!clyde.concordia.ca!uunet!lll-winken!decwrl!ucbvax!UMIX.CC.UMICH.EDU!krowitz%richter From: krowitz%richter@UMIX.CC.UMICH.EDU (David Krowitz) Newsgroups: comp.sys.apollo Subject: Re: DMA on DN4000 AT-bus Message-ID: <9001032011.AA02924@richter.mit.edu> Date: 3 Jan 90 20:11:24 GMT Sender: daemon@ucbvax.BERKELEY.EDU Organization: The Internet Lines: 42 It should be possible to do if you can wire (lock into physical memory) and map a large enough I/O buffer to hold the entire stream of data. I have wired buffers of up to 128Kb under SR10. I don't know what the limit would be under SR9.6, you'll have to try it. You'll have to use a single buffer for the entire transfer, since at 20K words/sec you only have 0.5 msec between transfers. That it not enough time to wire and map a second buffer. The sequence of calls you want to use would be something like: pbu_$aquire (device_name, name_len, debug_flg, unit_num, status) pbu_$allocate_map (unit, length_of_buffer, force_flag, I/O_vir_addr, status) pbu_$map (unit, big_buffer, length_of_buffer, I/O_vir_addr, status) pbu_$wire (unit, big_buffer, length_of_buffer, status) set dma-enable, interrupt-enable on interface board pbu_$dma_start (unit, dma_channel_from_ddf_blk, pbu_$read, buffer,length_of_buffer, option, status); pbu_$wait (unit, timeout, quit_flg, status); pbu_$dma_stop (unit, dma_channel, status) clear dma-enable, interrupt-enable on interface board pbu_$unwire (unit, buffer, length_of_buffer, flag, status) pbu_$unmap (unit, buffer, length, I/O_vir_addr, status); pbu_$free_map ( unit, status) -- David Krowitz krowitz@richter.mit.edu (18.83.0.109) krowitz%richter.mit.edu@eddie.mit.edu krowitz%richter.mit.edu@mitvma.bitnet (in order of decreasing preference)