OK6410A 开发板 (八) 53 linux-5.11 OK6410A mmap的实例 基于 fb

按照 初始化顺序 
	1. 内核 fb core 侧
	2. 内核驱动侧(此时fb_mmap没跑)
	3. 应用侧(应用侧运行的时候fb_mmap开始跑)
  • 内核 fb core 侧
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.c
s3cfb_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_display
fb 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值