Chinaunix首页 | 论坛 | 博客
  • 博客访问: 241475
  • 博文数量: 51
  • 博客积分: 1065
  • 博客等级: 少尉
  • 技术积分: 556
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-11 14:50
文章分类

全部博文(51)

文章存档

2012年(1)

2011年(6)

2010年(39)

2008年(1)

2007年(4)

分类:

2010-03-18 11:57:58

1、页对齐内存大小:dma_map_size = PAGE_ALIGN(MY_DATA_SIZE + PAGE_SIZE);

MY_DATA_SIZE是你想分配的大小.

2、调用

A = dma_alloc_writecombine(B,C,D,GFP_KERNEL);

含义:

A: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存

B: struct device指针,可以平台初始化里指定,主要是dma_mask之类,可参考framebuffer

C: 实际分配大小,传入dma_map_size即可

D: 返回的内存物理地址,dma就可以用。

所以,A和D是一一对应的,只不过,A是虚拟地址,而D是物理地址。对任意一个操作都将改变缓冲区内容。当然要注意操作环境。


参见S3C2410 LCD驱动中的函数s3c2410fb_map_video_memory():
unsigned map_size = PAGE_ALIGN(info->fix.smem_len);
info->screen_base = dma_alloc_writecombine(fbi->dev, map_size,&map_dma, GFP_KERNEL);


阅读(6645) | 评论(1) | 转发(4) |
给主人留下些什么吧!~~