本文共 1417 字,大约阅读时间需要 4 分钟。
按照 初始化顺序 1. 内核 fb core 侧 2. 内核驱动侧(此时fb_mmap没跑) 3. 应用侧(应用侧运行的时候fb_mmap开始跑)
drivers/video/fbdev/core/fbmem.c static const struct file_operations fb_fops = { .mmap = fb_mmap, } fbmem_init register_chrdev(FB_MAJOR, "fb", &fb_fops); fb_mmap // start:51600000,len:7f800 vm_iomap_memory(vma, start, len);
fb 驱动 mmap 的代码 来自于 https://github.com/lisider/linux/tree/ok6410a-linux-5.11
drivers/video/samsung/s3cfb.cs3cfb_probe s3cfb_map_video_memory(&s3cfb_info[index]); fbi->map_cpu_f1 = dma_alloc_wc(fbi->dev, fbi->map_size_f1, &fbi->map_dma_f1, GFP_KERNEL); // dma=51600000 cpu=(ptrval) size=0007f800 // 480 * 272 = 0x1 FE00 (个像素) // 0x1 FE00 像素 * 4byte/像素 = 0007f800 Byte
fb write 的代码来自于 Linux设备驱动开发详解光盘 linux设备驱动开发详解光盘源码\linux设备驱动开发详解光盘源码\18\FRAMEBUFFER应用程序范例\fb_displayfb mmap 的代码来自 嵌入式C语言自我修养 P242
fb_mmap 执行的时候, 内核 fb_mmap 执行并调用 vm_iomap_memory 参数 为 // start:51600000,len:7f800 vm_iomap_memory(vma, start, len);
对应 https://blog.csdn.net/u011011827/article/details/117371188 中 驱动mmap实现的 第一种情况1.在file->f_op->mmap前已经分配了物理内存,file->f_op->mmap 只做了映射
lcd 包括 LCD 控制器 // 对于s3c6410 , lcd 控制器在片上 lcd 驱动器 // 在 lcd 模组上 lcd 屏幕 // 在 lcd 模组上 显示内存(ram) // 在 ddr 中 //写数据在ram中,会呈现在屏幕上s3cfb_init_registers s3cfb_set_fb_addr 写了 51600000 到 S3C_VIDW00ADD0B0 寄存器 // 这个寄存器就是 lcd 显示器的 显示内存首地址实际物理地址 addr 51600000 size7f800内核虚拟地址 addr d084b000 size 7f800进程虚拟地址 addr b6dfa000 size 7f800