--- In Jim Jackson <> wrote:
>
>
>
>
> On Wed, 3 Oct 2007, chaisc97 wrote:
>
> > > * When gcc inserts a call to memcpy(), everything works wonderfully.
> > > * When gcc decides it wants to inline its ARM assembly-optimized
> > > version of memcpy(), the result is as if I called memcpy() with a
> > > source address aligned to an int (haven't played with unaligned dest
> > yet):
> > >
> > > memcpy(dest, src & ~3, n);
> > >
> > > It's as if I started the copy from an aligned address and
therefore I
> > > get unwanted garbage on dest before the actual data I need.
Replacing
> > > the call with my own copying in pure C just works, and so does the
> > > real memcpy().
>
> > i have the same problem, when i try to copy some data from
> > mem(0x20200000), some time i get the correct value some times i get
> > the wrong one, does anyone has any idea?
>
> given that 0x20200000 is word aligned, I seriously doubt this is the
same
> problem. If you show your code people may be able to help you.
>
I try to write a LCD driver, it works fine. i can show the picture on
the screen, however when i put QT on the embedded board(TS7200), when
the mouse move, the screen show the wrong result, i found in some
place i can get the correct data from the video memory sometimes not.
i have test two video driver as follows.
the first one
/*******************************************************/
s1d13xxx_mmap(struct fb_info *info, struct file *file, struct
vm_area_struct *vma)
{
unsigned long off, start;
u32 len;
unsigned long size = vma->vm_end - vma->vm_start;
unsigned long page, pos;
off = vma->vm_pgoff << PAGE_SHIFT;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
printk("vma->flag=%x\n",vma->vm_flags);
vma->vm_flags |=VM_RESERVED;
vma->vm_flags |=VM_READHINTMASK;
vma->vm_flags |=VM_IO;
vma->vm_flags |=VM_SHM;
vma->vm_flags |= VM_LOCKED;
printk("vma->flag=%x\n",vma->vm_flags);
if ((vma->vm_end - vma->vm_start) > len)
return -EINVAL;
vma->vm_pgoff = off >> PAGE_SHIFT;
start=vma->vm_start;
size=vma->vm_end - vma->vm_start;
pos=S1D_PHYSICAL_VMEM_ADDR;
while(size>0)
{
if (remap_page_range(start,pos,PAGE_SIZE, PAGE_SHARED))
return -EAGAIN;
start += PAGE_SIZE;
pos += PAGE_SIZE;
if (size > PAGE_SIZE)
size -= PAGE_SIZE;
else
size = 0;
}
/***********************************************/
second one
i just open the fd=/dev/mem
mapped_memlen, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x20200000);
what's wrong for my code
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/ts-7000/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/ts-7000/join
(Yahoo! ID required)
<*> To change settings via email:
<*> To unsubscribe from this group, send an email to:
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|