当前位置:嗨网首页>书籍在线阅读

08-帧缓冲设备驱动的模块加载与卸载函数

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

18.4 帧缓冲设备驱动的模块加载与卸载函数

在帧缓冲设备驱动的模块加载函数中,应该完成如下4个工作。

(1)申请FBI结构体的内存空间,初始化FBI结构体中固定和可变的屏幕参数,即填充FBI 中fb_var_screeninfo var和struct fb_fix_screeninfo fix成员。

(2)根据具体LCD屏幕的特点,完成LCD控制器硬件的初始化。

(3)申请帧缓冲设备的显示缓冲区空间。

(4)注册帧缓冲设备。

在帧缓冲设备驱动的模块卸载函数中,应该完成相反的工作,包括释放FBI结构体内存、关闭LCD、释放显示缓冲区以及注销帧缓冲设备。

由于LCD控制器经常被集成在SoC上作为一个独立的硬件模块而存在(成为platform_device),因此,LCD驱动中也经常包含平台驱动,这样,在帧缓冲设备驱动的模块加载函数中完成的工作只是注册平台驱动,而初始化FBI结构体中的固定和可变参数、LCD控制器硬件的初始化、申请帧缓冲设备的显示缓冲区空间和注册帧缓冲设备的工作则移交到平台驱动的探测函数中完成。

同样地,在使用平台驱动的情况下,释放FBI结构体内存、关闭LCD、释放显示缓冲区以及注销帧缓冲设备的工作也移交到平台驱动的移除函数中完成。

代码清单18.9所示为帧缓冲设备驱动的模块加载和卸载以及平台驱动的探测和移除函数中的模板。

代码清单18.9 帧缓冲设备驱动的模块加载/卸载及平台驱动的探测/移除函数的模板

1 / 平台驱动结构体 /

2 static struct platform_driver xxxfb_driver = {

3 .probe = xxxfb_probe,

4 .remove = xxxfb_remove,

5 .suspend = xxxfb_suspend,

6 .resume = xxxfb_resume,

7 .driver = {

8 .name = "xxx-lcd", / 驱动名 /

9 .owner = THIS_MODULE,

10 }

11 };

12

13 / 平台驱动探测函数 /

14 static int _ _init xxxfb_probe(...)

15 {

16 struct fb_info *info;

17

18 /分配fb_info结构体/

19 info = framebuffer_alloc(...);

20

21 info->screen_base = framebuffer_virtual_memory;

22 info->var = xxxfb_var; / 可变参数 /

23 info->fix = xxxfb_fix; / 固定参数 /

24

25 /分配显示缓冲区/

26 alloc_dis_buffer(...);

27

28 /初始化LCD控制器/

29 lcd_init(...);

30

31 /检查可变参数/

32 xxxfb_check_var(&info->var, info);

33

34 /注册fb_info/

35 if (register_framebuffer(info) < 0)

36 return - EINVAL;

37

38 return 0;

39 }

40

41 / 平台驱动移除函数 /

42 static void _ _exit xxxfb_remove(...)

43 {

44 struct fb_info *info = dev_get_drv_data(dev);

45

46 if (info) {

47 unregister_framebuffer(info); / 注销fb_info /

48 dealloc_dis_buffer(...); / 释放显示缓冲区 /

49 framebuffer_release(info); / 注销fb_info /

50 }

51

52 return 0;

53 }

54

55 / 帧缓冲设备驱动模块加载与卸载函数 /

56 int __init xxxfb_init(void)

57 {

58 return platform_driver_register(&xxxfb_driver); / 注册平台设备 /

59 }

60

61 static void __exit xxxfb_cleanup(void)

62 {

63 platform_driver_unregister(&xxxfb_driver); / 注销平台设备 /

64 }

65

66 module_init(xxxfb_init);

67 module_exit(xxxfb_cleanup);

上述代码中第35行、47行成对出现的register_framebuffer()和unregister_framebuffer()分别用于注册和注销帧缓冲设备。