如何解决 FrameBuffer console (vc)自动关闭显示
转载:http://blog.chinaunix.net/uid-9688646-id-1998294.html
控制台VT篇:
控制台VT有一个定时器,默认为10分钟,只要时间一到就会blank screen,会导致fb黑屏,会导致给人“电源管理的假象”
函数再现:
static void blank_screen_t(unsigned long dummy) {if (unlikely(!keventd_up())) {mod_timer(&console_timer, jiffies + (blankinterval * HZ));return;}blank_timer_expired = 1;schedule_work(&console_work); }
Linux 默认闪烁光标篇
如果产品需要去掉光标,只需要修改VT代码,将VT的vc->vc_cursor_type = CUR_DEFAULT修改为vc->vc_cursor_type=CUR_NONE即可,
默认的光标即为不显示状态。
现象的本质与内核电源管理编译选项无关,总的解决方法:在用户空间代码里添加
/* disable console. avoid console blank automatically */system("echo -e \"\033[9;0]\" > /dev/tty1");
解释:
该系统调用相当于setterm -blank 0,详见setterm命令的源码,其中
/* -blank [0-60]. */if (opt_blank && vcterm)printf("\033[9;%d]", opt_bl_min);
也可以见Vt.c (drivers\char): case ']': /* setterm functions */
9月13日
由一些小问题引起的东西
static int __init con_init(void) {const char *display_desc = NULL;struct vc_data *vc;unsigned int currcons = 0;acquire_console_sem();if (conswitchp)display_desc = conswitchp->con_startup();if (!display_desc) {fg_console = 0;release_console_sem();return 0;}init_timer(&console_timer); console_timer.function = blank_screen_t;if (blankinterval) { blank_state = blank_normal_wait; mod_timer(&console_timer, jiffies + blankinterval); } // 这是对控制台定时器的初始化,定时器事件函数被连接到了blank_screen_t()/** kmalloc is not running yet - we use the bootmem allocator.*/for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) {vc_cons[currcons].d = vc = alloc_bootmem(sizeof(struct vc_data));visual_init(vc, currcons, 1);vc->vc_screenbuf = (unsigned short *)alloc_bootmem(vc->vc_screenbuf_size);vc->vc_kmalloced = 0;vc_init(vc, vc->vc_rows, vc->vc_cols, currcons || !vc->vc_sw->con_save_screen);}currcons = fg_console = 0;master_display_fg = vc = vc_cons[currcons].d;set_origin(vc);save_screen(vc);gotoxy(vc, vc->vc_x, vc->vc_y);csi_J(vc, 0);update_screen(vc);printk("Console: %s %s %dx%d",vc->vc_can_do_color ? "colour" : "mono", display_desc, vc->vc_cols, vc->vc_rows);printable = 1;printk("\n");release_console_sem();#ifdef CONFIG_VT_CONSOLEregister_console(&vt_console_driver);#endifreturn 0; }
其中引用了一个叫blankinterval的全局变量和一个console_time,我不知道内核的定时器是具体是怎么工作,但是 这样的代码已经很明显了。这个定时器和电源管理宏PM_CONFIG没有任何关系,它是控制台的一部分。再看下blank_screen_t():
static void blank_screen_t(unsigned long dummy) {blank_timer_expired = 1;schedule_work(&console_work); }
static void console_callback(void *ignored) {acquire_console_sem();if (want_console >= 0) {if (want_console != fg_console &&vc_cons_allocated(want_console)) {hide_cursor(vc_cons[fg_console].d);change_console(vc_cons[want_console].d);/* we only changed when the console had alreadybeen allocated - a new console is not createdin an interrupt routine */}want_console = -1;}if (do_poke_blanked_console) { /* do not unblank for a LED change */do_poke_blanked_console = 0;poke_blanked_console();}if (scrollback_delta) {struct vc_data *vc = vc_cons[fg_console].d;clear_selection();if (vc->vc_mode == KD_TEXT)vc->vc_sw->con_scrolldelta(vc, scrollback_delta);scrollback_delta = 0;}if (blank_timer_expired) { do_blank_screen(0); blank_timer_expired = 0; }release_console_sem(); }
static struct tty_operations con_ops = {.open = con_open,.close = con_close,.write = con_write,.write_room = con_write_room,.put_char = con_put_char,.flush_chars = con_flush_chars,.chars_in_buffer = con_chars_in_buffer,.ioctl = vt_ioctl,.stop = con_stop,.start = con_start,.throttle = con_throttle,.unthrottle = con_unthrottle, };
/* -blank [0-60]. */if (opt_blank && vcterm)printf("\033[9;%d]", opt_bl_min);
#include #include #includevoid some_function() {int f;f = open("/dev/tty0", O_RDWR);write(f, "\033[9;0]", 8);close(f); }
系统默认的是:Vt.c (drivers\char):static int blankinterval = 10*60*HZ;
另外还可以参考http://patchwork.kernel.org/patch/27474/
如何解决 FrameBuffer console (vc)自动关闭显示相关推荐
- python 横坐标只显示部分数据_解决echarts中横坐标值显示不全(自动隐藏)问题
echarts中,横轴数据如果非常多,会自动隐藏一部分数据,我们可以通过属性interval来进行调整. 如下图,当横轴时间为13天时,echarts会自动隔天显示 如果我们想显示全,则需要在xAxi ...
- USB通讯入门(二)CyUSB.inf文件修改后,设备管理器可以识别出USB设备,但Cypress USB Console没有任何显示
Cypress提供的通用驱动程序是CyUSB.sys,对应的驱动信息文件是CyUSB.inf.通过CyUSB.inf文件安装通用驱动后,插入FX2LP开发板,计算机设备管理器和Cypress USB ...
- 【Python_025】解决jupyter notebook 画图不显示 及在深色背景下图表坐标看不清
本篇博客分享一下解决jupyter notebook 画图不显示 及在深色背景下图表坐标看不清 画图不显示 在import 各种包最后加上一行 %matplotlib inline 这行代码用在Jup ...
- 微信小程序购物车(云数据库)详细-解决了更新数据库延迟显示
首先完成的大图 这里不对新建云数据库进行讲解,直接插入,查询. 首页 想要获取云数据库的内容,我们要修改app.js //app.js App({onLaunch: function () {// s ...
- 1分钟解决VS每次运行都显示“正在还原nuget程序包”问题
1分钟解决VS每次运行都显示"正在还原nuget程序包"问题 参考文章: (1)1分钟解决VS每次运行都显示"正在还原nuget程序包"问题 (2)https: ...
- 解决django关于图片无法显示的问题
解决django关于图片无法显示的问题 参考文章: (1)解决django关于图片无法显示的问题 (2)https://www.cnblogs.com/zhuifeng-mayi/articles/8 ...
- 解决网页ICON图标无法显示的问题
解决网页ICON图标无法显示的问题 参考文章: (1)解决网页ICON图标无法显示的问题 (2)https://www.cnblogs.com/ziyoublog/p/10974406.html 备忘 ...
- 解决Layui的switch样式显示问题
解决Layui的switch样式显示问题 参考文章: (1)解决Layui的switch样式显示问题 (2)https://www.cnblogs.com/evanmemo/p/9166870.htm ...
- vue中解决时间在ios上显示NAN的问题
vue中解决时间在ios上显示NAN的问题 参考文章: (1)vue中解决时间在ios上显示NAN的问题 (2)https://www.cnblogs.com/wzs5800/p/9580785.ht ...
最新文章
- js 函数定义的方式
- Ubuntu 20.04 E:无法找到软件包python-pip 安装python2.7
- 用PHP实现单向链表
- WebRTC 的 log 系统实现分析
- Android平台发展史
- 数据结构(java语言描述)顺序栈的使用
- u-boot中filesize环境变量
- python并发处理list数据_3种方式实现python多线程并发处理
- 上班工作压力太大?来玩个游戏解压下
- 句法结构分析:基于PCFG的基本分析方法
- LibPcap丢包问题
- Video.js的简单使用介绍
- Solide work每日一练
- php ECShop form,在ecshop中添加页面并且实现后台管理
- 信安专业学生-必考认证证书( 2023.1-6月 CISP/NISP考试安排)
- 5G在工业互联网领域的应用进展
- Jquery控制滚动Div 滚动条事件
- 十大垂直行业分析 大数据应用正在面临的挑战​​​​​​​
- 微服务生态系统的4层模型
- 二本程序员投简历被公司嘲讽:过面试的可能性不大,别白跑了