admin 管理员组

文章数量: 1184232


2024年3月6日发(作者:xml写条件判断)

Application

Note

如何在Linux开机时显示进度条

基于257开发套件

AN01010101 V1.00 Date: 2015/08/06

产品应用笔记

类别

关键词

摘 要

内容

257,Linux,开机进度条

本文基于257开发套件,介绍如何实现在Linux开机时显示进度条

广州致远电子股份有限公司

广州致远电子股份有限公司

如何在Linux开机时显示进度条

基于257开发套件

修订历史

版本

V1.00

日期

2015/08/06

原因

创建文档

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

i

广州致远电子股份有限公司

如何在Linux开机时显示进度条

基于257开发套件

目 录

1. 适用范围 ................................................................................................................... 1

2. 开发环境 ................................................................................................................... 2

3. 技术实现 ................................................................................................................... 3

3.1

3.2

3.3

3.4

3.5

解压内核源码包 ....................................................................................................... 3

复制boot_process.c文件 ......................................................................................... 3

定制boot_process.c .................................................................................................. 3

重新编译内核 ........................................................................................................... 4

开机启动系统 ........................................................................................................... 4

4. 免责声明 ................................................................................................................... 5

附录A 程序清单boot_process.c ................................................................................. 6

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

i

广州致远电子股份有限公司

如何在Linux开机时显示进度条

基于257开发套件

1. 适用范围

本文基于257开发套件,主要介绍了如何实现在Linux操作系统启动时显示开机进度条。

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

1

广州致远电子股份有限公司

如何在Linux开机时显示进度条

基于257开发套件

2. 开发环境

1) 开发主机环境:

Ubuntu 12.04(64位)、arm-none-linux-gnueabi-gcc系列交叉工具链。

2) 硬件清单:

257开发套件。

3) 软件资源:

产品光盘资料:EasyARM-iMX257_(点击这里可下载);

进度条实现的源文件:boot_process.c。

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

2

广州致远电子股份有限公司

如何在Linux开机时显示进度条

基于257开发套件

3. 技术实现

3.1 解压内核源码包

将产品光盘资料中的2内核源码包复制到ubuntu系统的“~/”目录,然后将其解压可得到linux-2.6.31目录,参考命令如下:

vmuser@Linux-host:~$ tar jxvf 2

3.2 复制boot_process.c文件

将附件boot_process.c文件拷贝到“~/linux-2.6.31/drivers/video/logo”目录下,如图3.1所示:

图3.1 复制boot_process.c

然后进入该目录并用vi指令编辑其中的Makefile文件:

vmuser@Linux-host:~$ cd linux-2.6.31/drivers/video/logo

vmuser@Linux-host:~/ linux-2.6.31/drivers/video/logo$ vi Makefile

按下“20gg”定位到第20行,然后按i键进入插入模式,输入如下所示内容:

obj-y += boot_process.o

修改后这部分代码应如图3.2所示:

图3.2 修改后的代码

修改完毕后,保存并退出编辑器。

3.3 定制boot_process.c

在boot_process.c文件中定义了几个宏,可供用户参考定制自己的进度条。这些宏的定义以及用法如下所示:

CONFIG_BOOT_PROCESS,开启或关闭进度条显示功能;

CONFIG_BOOT_PROCESS_BLOCK,选择启用块状进度条,与条状进度条互斥;

CONFIG_BOOT_PROCESS_BAR,选择启用条状进度条,与块状进度条互斥;

CONFIG_PROCESS_DURATION,延长或缩短进度条的持续时间;

PROCESS_BLOCK_NUM,修改进度条每一格的填充宽度。

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

3

广州致远电子股份有限公司

如何在Linux开机时显示进度条

基于257开发套件

3.4 重新编译内核

返回“~/linux-2.6.31”目录并重新编译内核,参考命令如下:

vmuser@Linux-host:~/ linux-2.6.31/drivers/video/logo$ cd ../../..

vmuser@Linux-host:~/ linux-2.6.31$ make uImage

编译完成后生成的固件存放在“arch/arm/boot”目录下,如图3.3所示:

图3.3 生成uImage

将这个固件重新烧写进开发套件,具体的烧写过程请参考产品光盘资料中的《EasyARM-iMX257 Linux开发指南》。

3.5 开机启动系统

将开发套件连接好液晶屏以及电源线,然后开机启动系统,可以看到在Linux小企鹅的下方出现了进度条,如图3.4所示。

图3.4 效果参考图片

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

4

广州致远电子股份有限公司

如何在Linux开机时显示进度条

基于257开发套件

4. 免责声明

广州周立功单片机科技有限公司所提供的所有服务内容旨在协助客户加速产品的研发进度,在服务过程中所提供的任何程序、文档、测试结果、方案、支持等资料和信息,都仅供参考,客户有权不使用或自行参考修改,本公司不提供任何的完整性、可靠性等保证,若在客户使用过程中因任何原因造成的特别的、偶然的或间接的损失,本公司不承担任何责任。

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

5

广州致远电子股份有限公司

如何在Linux开机时显示进度条

基于257开发套件

附录A 程序清单boot_process.c

#include

#include

#include

#include

#define CONFIG_DISPLAY_FB 0

//#define CONFIG_BOOT_PROCESS

//#define CONFIG_BOOT_PROCESS_BLOCK

#define CONFIG_BOOT_PROCESS_BAR

#define CONFIG_PROCESS_DURATION 20

static struct delayed_work boot_process_work;

static u32 palette[5] = {200, 203, 206, 209, 212};

static void draw_box(int x, int y, int width, int height, int color_index)

{

}

#if (defined CONFIG_BOOT_PROCESS_BAR) && (defined CONFIG_BOOT_PROCESS)

#define PROCESS_BLOCK_NUM 300

static void process_worker(struct work_struct * work)

{

struct fb_info * fb;

struct fb_image process;

char * data;

if (color_index >= sizeof(palette) / sizeof(u32)) {

}

data = kmalloc(width * height, GFP_KERNEL);

memset(data, color_index, width * height);

= x;

= y;

= width;

= height;

= data;

= 8;

fb = registered_fb[CONFIG_DISPLAY_FB];

fb->pseudo_palette = palette;

fb->fbops->fb_imageblit(fb, &process);

kfree(data);

printk("color_index out of range!n");

return ;

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

6

广州致远电子股份有限公司

static unsigned long timestamp = 0;

static int process_width;

static int process_height;

static int block_num_adjust;

static int block_width;

static int process_x;

static int process_y;

static int step;

如何在Linux开机时显示进度条

基于257开发套件

if ( registered_fb[CONFIG_DISPLAY_FB] == NULL ) {

}

if (timestamp == 0) {

}

if (jiffies - timestamp > CONFIG_PROCESS_DURATION * HZ) {

draw_box(process_x, process_y, process_width, process_height, 4);

//printk("Boot process: boot process end!n");

return ;

//modefy by fck zlgmcu

int screen_width;

int screen_height;

timestamp = jiffies;

step = 0;

screen_width = registered_fb[CONFIG_DISPLAY_FB]->;

screen_height = registered_fb[CONFIG_DISPLAY_FB]->;

process_width = screen_width * 4 / 5;

process_height = screen_height / 10;

process_x = (screen_width - process_width) / 2;

process_y = screen_height - process_height * 2;

block_width = process_width / PROCESS_BLOCK_NUM;

block_num_adjust = process_width / block_width;

draw_box(process_x, process_y, process_width, process_height, 0);

int i;

int current_x;

step++;

for (i = 0 ; i < 4; i++) {

}

current_x = process_x + block_width * ( step -i );

if (current_x >= (process_x + process_width - 2 * block_width) || current_x < process_x) {

}

draw_box(current_x, process_y, block_width, process_height, i + 1);

continue;

printk("Boot process: fb dev not inited, boot process not start!n");

return ;

/* fisrt call process_worker, set timestamp as jiffies */

/* draw process bar background */

} else {

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

7

广州致远电子股份有限公司

}

#endif

}

如何在Linux开机时显示进度条

基于257开发套件

schedule_delayed_work(&boot_process_work, CONFIG_PROCESS_DURATION * HZ /

(block_num_adjust) );

#if (defined CONFIG_BOOT_PROCESS_BLOCK) && (defined CONFIG_BOOT_PROCESS)

static void process_worker(struct work_struct * work)

{

/* fisrt call process_worker, set timestamp as jiffies */

timestamp = (timestamp == 0) ? jiffies : timestamp;

if (jiffies - timestamp > CONFIG_PROCESS_DURATION * HZ) {

}

for (i = 0; i < 5; i++) {

}

printk("Boot process: boot process end!n");

return ;

draw_box(start_x + i * span, start_y, width, height, 4);

if ( registered_fb[CONFIG_DISPLAY_FB] == NULL ) {

}

screen_width = registered_fb[CONFIG_DISPLAY_FB]->;

screen_height = registered_fb[CONFIG_DISPLAY_FB]->;

tmp = screen_width * 4 / 5;

height = screen_height / 10;

width = height;

start_x = (screen_width - tmp) / 2;

start_y = screen_height - height * 2;

span = (tmp - width) / 4;

printk("Boot process: fb dev not inited, boot process not start!n");

return ;

static unsigned long timestamp = 0;

static int start_x;

static int start_y;

static int count = 0;

int screen_width;

int screen_height;

int width;

int height;

int span;

int tmp;

int i;

/* draw process bar background */

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

8

广州致远电子股份有限公司

}

#endif

int boot_process_init(void)

{

#if defined CONFIG_BOOT_PROCESS

}

fs_initcall(boot_process_init);

tmp = ++count;

count = tmp % 5;

for (i = 0; i < 5; i++) {

}

if (count == i) {

}

如何在Linux开机时显示进度条

基于257开发套件

draw_box(start_x + i * span, start_y, width, height, 4);

draw_box(start_x + i * span, start_y, width, height, 0);

} else {

schedule_delayed_work(&boot_process_work, HZ);

INIT_DELAYED_WORK(&boot_process_work, process_worker);

schedule_delayed_work(&boot_process_work, HZ);

printk("Boot process: initn");

return 0;

#endif

产品应用笔记 ©2015 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

9


本文标签: 进度条 开机 产品 显示 开发