I am writing a user space MAC driver in Linux 2.6.23 hosted on a Arm11 mpcore. A contiguous block of physical memory is allocated and mmap'd to userspace.
/dev/mem with O_SYNC flag is used to mmap so that the user virtual memory is uncached (with no much benefit).
Kernel
------
kptr = kmalloc(sz, GFP_DMA|GFP_KERNEL);
pptr = __pa(kptr);
User
----
fd = open("/dev/mem", O_RDWR|O_SYNC);
uptr = mmap(0, sz, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED,fd, pptr);
The map'd user virtual memory is carved into network buffers and used for DMA.The MAC is successfully able to DMA ethernet frames to the physical memory. From the Rx interrupt handler bh (kernel logical memory) the frames received could be viewed and the cache functions also work fine. However, the mmap'd memory in user space does not reflect the changes.
Why is the physical memory mapped to user virtual does not reflect the chages ?
Or any suggestions on what could be going wrong here ?
thanks,
Deb Rupam Banerjee
P.S: Please note that all buffer alignment's are taken care of.
__________________________
Subscribe now!
The Latest
Newsletter
Tech Tip Videos
- Nov-19-09
- Nov-04-09
Recently Popular
From the Magazine
December 2009, #188
If last month's Infrastrucuture issue was too "big" for you then try on this month's Embedded issue. Find out how to use Player for programming mobile robots, build a humidity controller for your root cellar, find out how to reduce the boot time of your embedded system, and if you're new to embedded systems find out the basics that go into one. You can also read about the Beagle Board, the Mesh Potato and a spate of other interestingly named items. And along with our regular columns don't miss our new monthly column: Economy Size Geek.
Delicious
Digg
StumbleUpon
Reddit
Facebook








Hi Deb, How did you solve
On September 8th, 2009 dono8 (not verified) says:
Hi Deb,
How did you solve this issue? I am also facing similar problem with ARM9. I have reserved 4M Bytes of memory at boot time, for using with the DMA and using the following code:
#define DMAMEM_START 0x73C00000
dma_fd = open("/dev/mem", O_RDWR | O_SYNC);
dma_mem = mmap(0, MSP2_DEV_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, dma_fd, DMAMEM_START);
DMA_write(DMAMEM_START, INST_Add, 16);
err = msync(dma_mem, (size_t) 64, MS_SYNC | MS_INVALIDATE);
DMA_read(INST_Add, DMAMEM_START+32, 16);
Using DMA_READ, I can see the data at DMAMEM_START, but sometime it is correct sometime incorrect.
I appreciate your step by step help!
Thanks,
Aa
DEVMEM
On August 27th, 2009 debrupam says:
Mitch,
Thanks for your comments. I was able to solve the problem as follows:
I was using the cache (flush/inv) routines used on the kernel logical address and was able to see the DMA'd data. The same idea I used for the user virtual mapping and the DMA'd data was visible in the user space mapping.
thanks,
Deb
DEVMEM
On June 21st, 2009 Mitch Frazier says:
Presumably mmap() is returning a valid pointer, correct? And you're not seeing any other errors occur, correct? You just never see the data change in the mapped area.
Does your kernel have CONFIG_STRICT_DEVMEM enabled?
__________________________Mitch Frazier is an Associate Editor for Linux Journal and the Web Editor for linuxjournal.com.
Post new comment