FBDev Core 注册与生命周期
1. 对象
struct fb_info包含:
- device和node编号;
fb_ops;fb_var_screeninfo可变模式;fb_fix_screeninfo固定信息;- screen base/size;
- pseudo palette/cmap;
- pixmap;
- modelist;
- flags/state;
- lock、refcount、deferred I/O;
- driver private
par。
2. fb_ops
驱动常实现:
- open/release;
- read/write;
- check_var/set_par;
- setcolreg/setcmap;
- blank/pan_display;
- fillrect/copyarea/imageblit;
- cursor;
- sync;
- ioctl/compat_ioctl;
- mmap;
- destroy。
Core提供缺省read/write和software drawing helper。
3. 分配
1 | framebuffer_alloc(private_size, dev) |
注册阶段才初始化主要refcount、lock、mm_lock、modelist和默认pixmap。硬件停机仍需正确remove顺序。
4. 注册
1 | register_framebuffer(info) |
Node数量受FB_MAX限制。
本版本普通注册并不通过通用fb notifier广播FB_EVENT_FB_REGISTERED;源码中的该事件调用仅受特定Gumstix配置保护。不要把它当成所有驱动都能观察到的注册通知。
5. Open
fb_open()按minor从registered_fb[]取对象,增加引用并调用driver fb_open。若设备正在unregister,必须拒绝新open。
6. Mode设置
Core先调用fb_check_var()规范化请求,再在必要时调用fb_set_par()编程硬件;随后更新cmap、pan和notifier。
check_var不能产生超出pixel clock、stride、VRAM或接口能力的模式。
7. Drawing
fbcon和Core通过:
fb_fillrect;fb_copyarea;fb_imageblit;fb_cursor。
驱动可硬件加速,也可使用CFB/SYS helper。Helper选择取决于framebuffer位于I/O memory还是system memory。
8. Notifier
Clients可监听注册、注销、mode、blank、suspend、resume等事件。Notifier callback不能反向制造锁顺序死锁。
9. Unregister
1 | unregister_framebuffer |
Core注释明确:如果不在module_exit()中注销,driver应实现fb_open/fb_release自行确保没有进程仍使用设备。仍被open/mmap的显存不能提前free。
10. Suspend
Driver持有console semaphore时调用fb_set_suspend(info, 1/0)通知Core/fbcon,配合blank、clock、power-domain和显存保存。
11. 并发
Core使用console lock、registration lock、info lock和refcount协调VT、userspace、notifier及remove。Driver私有寄存器/queue仍需自身锁。
12. DRM兼容层
DRM fbdev emulation也构造fb_info并注册framebuffer,因此/dev/fb0存在不代表系统正在运行legacy fbdev硬件driver。
正在加载留言…