steredinfo 115 break break 116 ...... 117 118 119 120 done: 121 return ret 122 帧缓冲区硬件设备的注册事件最终是由函数 fbcon_fb_registered 来处理的,它的实现如下所示: struct 123 static int fbcon_fb_registeredstruct fb_info info 124 125 int ret 0 i idx info-gtnode 126 127 fbcon_select_primaryinfo 128 129 if info_idx -1 130 for i first_fb_vc i lt last_fb_vc i 131 if con2fb_map_booti idx 132 info_idx idx 133 break break 134 135 136 137 if info_idx -1 138 ret fbcon_takeover1 139 else 140 for i first_fb_vc i lt last_fb_vc i 141 if con2fb_map_booti idx 142 set_con2fb_mapi idx 0 143 144 145 146 return ret 147 函数 fbcon_select_primary 用来检查当前注册的帧缓冲区硬件设备是否是一个主帧缓冲区硬件设备。
如果是的话,那么就将它的信息记录下来。
这个函数只有当指定了CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY 编译选项时才有效,否则的话,它是一个空函数。
在 Linux 内核中,每一个控制台和每一个帧缓冲区硬件设备都有一个从0开始的编号,它们的初始对应关系保存在全局数组 con2fb_map_boot 中。
控制台和帧缓冲区硬件设备的初始对应关系是可以通过设置内核启动参数来初始化的。
在模块 fbcon 中,还有另外一个全局数组 con2fb_map,也是用来映射控制台和帧缓冲区硬件设备的对应关系,不过它映射的是控制台和帧缓冲区硬件设备的实际对应关系。
全局变量 first_fb_vc 和 last_fb_vc 是全局数组 con2fb_map_boot 和 con2fb_map的索引值,用来指定系统当前可用的控制台编号范围,它们也是可以通过设置内核启动参数来初始化的。
全局变量 first_fb_vc 的默认值等于0,而全局变量 last_fb_vc 的默认值等于MAX_NR_CONSOLES - 1。
全局变量 info_idx 表示系统当前所使用的帧缓冲区硬件的编号。
如果它的值等于-1,那么就说明系统当前还没有设置好当前所使用的帧缓冲区硬件设备。
在这种情况下,函数 fbcon_fb_registered 就会在全局数组 con2fb_map_boot 中检查是否存在一个控制台编号与当前所注册的帧缓冲区硬件设备的编号 idx 对应。
如果存在的话,那么就会将当前所注册的帧缓冲区硬件设备编号 idx 保存在全局变量 info_idx 中。
接下来还会调用函数fbcon_takeover 来初始化系统所使用的控制台。
在调用函数 fbcon_takeover 的时候,传进去的参数为1,表示要显示第一个开机画面。
如果全局变量 info_idx 的值不等于-1,那么函数 fbcon_fb_registered 同样会在全局数组 con2fb_map_boot 中检查是否存在一个控制台编号与当前所注册的帧缓冲区硬件设备的编号 idx 对应。
如果存在的话,那么就会调用函数 set_con2fb_map 来调整当前所注册的帧缓冲区硬件设备与控制台的映射关系,即调整数组 con2fb_map_boot 和 con2fb_map的值。
为了简单起见,我们假设系统只有一个帧缓冲区硬件设备,这样当它被注册的时候,全局变量 info_idx 的值就会等于-1。
当函数 fbcon_fb_registered 在全局数组con2fb_map_boot 中发现有一个控制台的编号与这个帧缓冲区硬件设备的编号 idx 对应时,接下来就会调用函数 fbcon_takeover 来设置系统所使用的控制台。
函数 fbcon_takeover 的实现如下所示: int 148 static int fbcon_takeoverint show_logo 149 150 int err i 151 152 if num_registered_fb 153 return -ENODEV 154 155 if show_logo 156 logo_shown FBCON_LOGO_DONTSHOW 157 158 for i first_fb_vc i lt last_fb_vc i 159 con2fb_mapi info_idx 160 161 err take_over_consoleampfb_con first_fb_vc last_fb_vc 162 fbcon_is_default 163 164 if err 165 for i first_fb_vc i lt last_fb_vc i 166 con2fb_mapi -1 167 168 info_idx -1 169 170 171 return err 172 全局变量 logo_shown 的初始值为 FBCON_LOGO_CANSHOW,表示可以显示第一个开机画面。
但是当参数 show_logo 的值等于0的时候,全局变量 logo_shown 的值会被重新设置为 FBCON_LOGO_DONTSHOW,表示不可以显示第一个开机画面。
中间的 for 循环将当前可用的控制台的编号都映射到当前正在注册的帧缓冲区硬件设备的编号 info_idx 中去,表示当前可用的控制台与缓冲区硬件设备的实际映射关系。
函数 take_over_console 用来初始化系统当前所使用的控制台。
如果它的返回值不等于0,那么就表示初始化失败。
在这种情况下,最后的 for 循环就会将全局数组 con2fb_map的各个元素的值设置为-1,表示系统当前可用的控制台还没有映射到实际的帧缓冲区硬件设备中去。
这时候全局变量 info_idx 的值也会被重新设置为-1。
调用函数 take_over_console 来初始化系统当前所使用的控制台,实际上就是向系统注册一系列回调函数,以便系统可以通过这些回调函数来操作当前所使用的控制台。
这些回调函数使用结构体 consw 来描述。
这里所注册的结构体 consw 是由全局变量 fb_con 来指定的,它的定义如下所示: 173 / 174 The console switch structure for the frame buffer based console 175 / 176 177 static const struct consw fb_con 178 .owner THIS_MODULE 179 .con_startup fbcon_startup 180 .con_init fbcon_init 181 .con_deinit fbcon_deinit 182 .con_clear fbcon_clear 183 .con_putc fbcon_putc 184 .con_putcs fbcon_putcs 185 .con_cursor fbcon_cursor 186 .con_scroll fbcon_scroll 187 .con_bmove fbcon_bmove 188 .con_switch fbcon_switch 189 .con_blank fbcon_blank 190 .con_font_set fbcon_set_font 191 .con_font_get fbcon_get_font 192 .con_font_default fbcon_set_def_font 193 .con_font_copy fbcon_copy_font 194 .con_set_palette fbcon_set_palette 195 .con_scrolldelta fbcon_scrolldelta 196 .con_set_origin fbcon_set_origin 197 .con_invert_region fbcon_invert_region 198 .con_screen_pos fbcon_screen_pos 199 .con_getxy fbcon_getxy 200 .con_resize fbcon_resize 201 接下来我们主要关注函数 fbcon_init 和 fbcon_switch 的实现,系统就是通过它来初始化和切换控制台的。
在初始化的过程中,会决定是否需要准备第一个开机画面的内容,而在切换控制台的过程中,会决定是否需要显示第一个开机画面的内容。
函数 fbcon_init 的实现如下所示: struct 202 static void fbcon_initstruct vc_data vc int init 203 204 struct fb_info info registered_fbcon2fb_mapvc-gtvc_num 205 struct fbcon_ops ops 206 struct vc_data default_mode vc-gtvc_display_fg 207 struct vc_data svc default_mode 208 struct display t p ampfb_displayvc-gtvc_num 209 int logo 1 new_rows new_cols rows cols charcnt 256 210 int cap 211 212 if info_idx -1 info NULL 213 return return 214 215 ...... 216 217 if vc svc logo_shown FBCON_LOGO_DONTSHOW 218 info-gtfix.type FB_TYPE_TEXT 219 logo 0 220 221 ...... 222 223 if logo 224 fbcon_prepare_logovc info cols rows new_cols new_rows 225 226 ...... 227 当前正在初始化的控制台使用参数 vc 来描述,而它的成员变量 vc_num 用来描述当前正在初始化的控制台的编号。
通过这个编号之后,就可以
上一篇:
图像处理毕业论文
下一篇:
成都住宅小区施工组织设计及预算参考资料