大家好,有个疑问。希望能帮我一下。。
看了一下,LCD控制器的驱动,有一点没弄明白。DMA是怎么知道内存的地址的?
saddr1 = info->fix.smem_start >> 1;
saddr2 = info->fix.smem_start;
saddr2 += info->fix.line_length * info->var.yres;
saddr2 >>= 1;
saddr3 = S3C2410_OFFSIZE(0) |
S3C2410_PAGEWIDTH((info->fix.line_length / 2) & 0x3ff);
writel(saddr1, regs + S3C2410_LCDSADDR1);
writel(saddr2, regs + S3C2410_LCDSADDR2);
writel(saddr3, regs + S3C2410_LCDSADDR3);
上面的代码根据2410的LCD控制介绍,在对LCDSADDR1和LCDSADDR2写了总线地址后。LCD控制器只知道总线地址的(30~22)位和(21~1)位。而不知道具体的地址.怎么能对应到向内核申请的framebuffer进行数据传输呢?
再看
info->fix.smem_start = map_dma;
info->screen_base = dma_alloc_writecombine(fbi->dev, map_size,
&map_dma, GFP_KERNEL);
map_dma的地址按2440的接线nGCS6,也就是说地址是0x30000000~0x31000000 (64M)
交给了LCD的DMA的地址只有30~1,这30个位。DMA地址怎么定的呢???