FBDev Core 注册与生命周期

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
2
3
4
framebuffer_alloc(private_size, dev)
-> allocate fb_info + aligned driver private
-> set parent device and fbcon rotation hint
-> initialize optional backlight-curve lock

注册阶段才初始化主要refcount、lockmm_lock、modelist和默认pixmap。硬件停机仍需正确remove顺序。

4. 注册

1
2
3
4
5
6
7
8
register_framebuffer(info)
-> firmware fb acquires aperture range when applicable
-> hold registration_lock
-> allocate fb node
-> create /sys/class/graphics/fbN for fixed FB_MAJOR
-> initialize modelist/pixmap
-> publish registered_fb[N]
-> call fbcon_fb_registered()

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
2
3
4
5
6
7
8
9
10
unregister_framebuffer
-> hold registration_lock
-> destroy class device
-> unregister PM VT switch
-> unbind fbcon
-> release default pixmap/modelist
-> remove registered_fb entry
-> cleanup sysfs
-> call fbcon_fb_unregistered()
-> put initial fb_info reference

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。

文章互动

阅读 --

留言

0 条留言

正在加载留言…