GFP_USER 用来为用户空间页来分配内存; 它可能睡眠.; 1.2 dma_free_wc staticinlinevoiddma_free_wc(structdevice *dev, size_t size,void*cpu_addr, dma_addr_t dma_addr) 该函数用于释放DMA缓冲区,参数和dma_alloc_wc一样。 1.3 framebuffer_alloc structfb_info *framebuffer_alloc(size_t size,struct...
上面说的是常规DMA,有些SoC可以用硬件做CPU和外设的cache coherence,例如在SoC中集成了叫做“Cache Coherent interconnect”的硬件,它可以做到让DMA踏到CPU的cache或者帮忙做cache的刷新。这样的话,dma_alloc_coherent()申请的内存就没必要是非cache的了。 2.2 使用DMA 看看别人是怎么实现,打开s3cmci.c的s3cmci_...
与dma_alloc_writecombine相同的还有另一个函数,dma_alloc_coherent,这两个的区别就是,dma_alloc_writecombine是使用关闭cache,但是会启用write buffer,而dma_alloc_coherent则是既关闭cache,也不使用write buffer,那么什么是write buffer呢?实际上write buffer也是cache,只有当进行写操作时,cache才会往write中写入数据。
先梳理一下思路: 让驱动支持 double buffer 需要做 3 件事。 1. 申请2 x buffer: 复制 size= (2 * width * height);fbi->screen_base = dma_alloc_wc(sfb->dev,size, &map_dma, GFP_KERNEL); 1. 2. 2. 将 buffer 相关的信息保存 struct fb_info-> struct fb_var_screeninfo。 复制 struct f...
size = (2 * width * height); fbi->screen_base = dma_alloc_wc(sfb->dev, size, &map_dma, GFP_KERNEL); 2. 将 buffer 相关的信息保存 struct fb_info-> struct fb_var_screeninfo。 struct fb_var_screeninfo { __u32 xres; /* visible resolution */ __u32 yres; __u32 xres_virtual...
DMA 控制器内部包含若干个可以被 CPU 读写的寄存器:一个主存地址寄存器 MAR(存放要交换数据的主存地址)、一个外设地址寄存器 ADR(存放 I/O 设备的设备码,或者是设备信息存储区的寻址信息)、一个字节数寄存器 WC(对传送数据的总字数进行统计)、和一个或多个控制寄存器。
让驱动支持double buffer需要做3件事。 1.申请2 x buffer: size = (2 * width * height); fbi->screen_base = dma_alloc_wc(sfb->dev, size, &map_dma, GFP_KERNEL); 2.将buffer相关的信息保存struct fb_info-> struct fb_var_screeninfo。
DMA 控制器内部包含若干个可以被 CPU 读写的寄存器:一个主存地址寄存器 MAR(存放要交换数据的主存地址)、一个外设地址寄存器 ADR(存放 I/O 设备的设备码,或者是设备信息存储区的寻址信息)、一个字节数寄存器 WC(对传送数据的总字数进行统计)、和一个或多个控制寄存器。
dev_err(uhci_dev(uhci), "unable to create qh dma_pool\n"); goto err_create_qh_pool; } //分配一个td用于结尾td uhci->term_td = uhci_alloc_td(uhci); //检测结尾td分配是否成功 if (!uhci->term_td) { dev_err(uhci_dev(uhci), "unable to allocate terminating TD\n"); ...
//drivers/base/dma-mapping.c dmaenginem_async_device_register() dmam_alloc_coherent() dmam_alloc_attrs() dmam_declare_coherent_memory() dmam_free_coherent() dmam_pool_create() dmam_pool_destroy() GPIO //drivers/gpio/gpiolib-devres.c ...