kernle下制作动态logo

2023-05-16

在uboot中实现logo的好处是反映速度快。

在kernel中实现logo的好处是,不管是android还是什么其他平台,logo显示无需考虑上层平台。

参照三星平台的写法,logo的显示一方面是开机时产品的标志,另一方面也是lcd驱动执行后显示屏工作正常的标志。

所以logo的显示自然就藏于lcd驱动代码当中。

 

static int __devinit s3cfb_probe(struct platform_device *pdev)

{

 

    struct s3cfb_global *fbdev;

    fbdev = kzalloc(sizeof(struct s3cfb_global), GFP_KERNEL);

 

---------------------------------------------------------------

/*pin脚设置*/

    pdata = to_fb_plat(&pdev->dev);

    if (!pdata) {

        dev_err(fbdev->dev, "failed to get platform data\n");

        ret = -EINVAL;

        goto err_pdata;

    }

 

    if (pdata->cfg_gpio)

        pdata->cfg_gpio(pdev);

 

    if (pdata->clk_on)

        pdata->clk_on(pdev, &fbdev->clock);

 

---------------------------------------------------------------

/*lcd控制器设置*/

    s3cfb_set_gamma(fbdev);

 

    s3cfb_set_vsync_interrupt(fbdev, 1);

    s3cfb_set_global_interrupt(fbdev, 1);

    s3cfb_init_global(fbdev);

 

---------------------------------------------------------------

/*fb*/

    if (s3cfb_alloc_framebuffer(fbdev)) {

        ret = -ENOMEM;

        goto err_alloc;

    }

 

    if (s3cfb_register_framebuffer(fbdev)) {

        ret = -EINVAL;

        goto err_register;

    }

 

---------------------------------------------------------------

/*启动准备*/

    if (pdata->backlight_on)

        pdata->backlight_on(pdev);

 

    if (!bootloaderfb && pdata->reset_lcd)

        pdata->reset_lcd(pdev);

 

    if (pdata->lcd_on)

        pdata->lcd_on(pdev);

 

---------------------------------------------------------------

/*画logo*/

    if (fb_prepare_logo( fbdev->fb[pdata->default_win], FB_ROTATE_UR)) {

        printk("Start display and show logo\n");

        /* Start display and show logo on boot */

        fb_set_cmap(&fbdev->fb[pdata->default_win]->cmap, fbdev->fb[pdata->default_win]);

        fb_show_logo(fbdev->fb[pdata->default_win], FB_ROTATE_UR);

    }

 

---------------------------------------------------------------

}

 

《如何显示logo》

 

int fb_show_logo(struct fb_info *info, int rotate)

{

    int y;

    y = fb_show_logo_line(info, rotate, fb_logo.logo, 0, num_online_cpus());

    y = fb_show_extra_logos(info, y, rotate);

 

    return y;

}

 

static int fb_show_logo_line(struct fb_info *info, int rotate,

                 const struct linux_logo *logo, int y,

                 unsigned int n)

{

    fb_do_show_logo(info, &image, rotate, n);//

}

 

static void fb_do_show_logo(struct fb_info *info, struct fb_image *image,

                int rotate, unsigned int num)

{

    unsigned int x;

 

    if (rotate == FB_ROTATE_UR) {

        for (x = 0;

             x < num && image->dx + image->width <= info->var.xres;

             x++) {

 

            image->dx = ((info->var.xres - num*(image->width))>>1);

            image->dy = ((info->var.yres - num*(image->height))>>1);

 

   /* Draws a image to the display */

            info->fbops->fb_imageblit(info, image);//-->

 

            image->dx += image->width;

        }

    } 

}

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

在s3cfb_init_fbinfo中:

    fb->fbops = &s3cfb_ops;

挂在struct fb_info上。

 

struct  fb_ops  s3cfb_ops = {

    .owner = THIS_MODULE,

    .fb_fillrect = cfb_fillrect,

    .fb_copyarea = cfb_copyarea,

    .fb_imageblit = cfb_imageblit,

    .fb_check_var = s3cfb_check_var,

    .fb_set_par = s3cfb_set_par,

    .fb_blank = s3cfb_blank,

    .fb_pan_display = s3cfb_pan_display,

    .fb_setcolreg = s3cfb_setcolreg,

    .fb_ioctl = s3cfb_ioctl,

    .fb_open = s3cfb_open,

    .fb_release = s3cfb_release,

};

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

/* Draws a image to the display */

void cfb_imageblit(struct fb_info *p, const struct fb_image *image)

{

    。。。 。。。    

    if (image->depth == 1) {

 

    } else

        color_imageblit(image, p, dst1, start_index, pitch_index);//-->

}


具体画logo之处:

static inline void color_imageblit(const struct fb_image *image,

                   struct fb_info *p, u8 __iomem *dst1,

                   u32 start_index,

                   u32 pitch_index)

{

    /* Draw the penguin */

    u32 __iomem *dst, *dst2;

    u32 color = 0, val, shift;

    int i, n, bpp = p->var.bits_per_pixel;

    u32 null_bits = 32 - bpp;

    u32 *palette = (u32 *) p->pseudo_palette;

    const u8 *src = image->data;

    u32 bswapmask = fb_compute_bswapmask(p);

 

    dst2 = (u32 __iomem *) dst1;

 

    for (i = image->height; i--; ) {//画行

        n = image->width;

        dst = (u32 __iomem *) dst1;

        shift = 0;

        val = 0;

 

        if (start_index) {

            u32 start_mask = ~fb_shifted_pixels_mask_u32(p,

                        start_index, bswapmask);

            val = FB_READL(dst) & start_mask;

            shift = start_index;

        }

 

        while (n--) {

 

            if (p->fix.visual == FB_VISUAL_TRUECOLOR ||

                p->fix.visual == FB_VISUAL_DIRECTCOLOR )

                color = palette[*src];

            else

                color = *src;

            color <<= FB_LEFT_POS(p, bpp);

            val |= FB_SHIFT_HIGH(p, color, shift ^ bswapmask);

            if (shift >= null_bits) {

                FB_WRITEL(val, dst++);

 

                val = (shift == null_bits) ? 0 :

                    FB_SHIFT_LOW(p, color, 32 - shift);

            }

            shift += bpp;

            shift &= (32 - 1);

            src++;

        }

 

        if (shift) {

            u32 end_mask = fb_shifted_pixels_mask_u32(p, shift,

                        bswapmask);

            FB_WRITEL((FB_READL(dst) & end_mask) | val, dst);

        }

        dst1 += p->fix.line_length;

        if (pitch_index) {

            dst2 += p->fix.line_length;

            dst1 = (u8 __iomem *)((long __force)dst2 & ~(sizeof(u32) - 1));

 

            start_index += pitch_index;

            start_index &= 32 - 1;

        }

    }

}

 

 代码分析在此不做详述,看参见网络各路分析。

要制作动态logo,无非是一帧一帧的画企鹅。先看这段代码:

/*画logo*/

    if (fb_prepare_logo( fbdev->fb[pdata->default_win], FB_ROTATE_UR)) {

        printk("Start display and show logo\n");

        /* Start display and show logo on boot */

        fb_set_cmap(&fbdev->fb[pdata->default_win]->cmap, fbdev->fb[pdata->default_win]);

        fb_show_logo(fbdev->fb[pdata->default_win], FB_ROTATE_UR);

    }

 其实我们无需关注函数的细节,从函数的名字上看fb_prepare_logo准备好了一个结构体,该结构体代表了一只企鹅(.ppm图片)。

如果我要画一群不同的企鹅在屏幕上移动,那么就需要一群代表不同ppm的结构体,但内核默认情况下这样的结构体只有一个。怎么办?

以“对内核代码尽量少改动”的原则下,以上这段代码显示一帧,然后加个循环,不断显示不同的帧:

for (i = 0; i < x; i++)

{

        /* 上述代码段 */

}

 即:循环一次,采集一张图,并填充这个唯一的结构体struct linux_logo,然后显示。

 问题来了,fb_find_logo(int depth)只能找到固定的一只企鹅,但在我们面前的一群企鹅,难道给fb_find_logo多加个参数?

以“对内核代码尽量少改动”的原则下,我们发现,depth是32位,即使夸张的说,但其充其量也就用个16位,其他位不用简直是浪费啊浪费,然后,高8位可以用于企鹅编号,使fb_find_logo拥有识别不同企鹅的能力。然后,就可以达到不同的企鹅在屏幕移动的效果。

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

制作ppm文件

在2.6内核中修改开机LOGO

方法一:

          1、在Linux系统中安装所需的包netpbm。我用的Fedora 10,刚开始安装命令是yum install netpbm,安装完成后,发现系统中还是没有相关的命令。

          看来是相关的包没有安装完整,又使用命令yum install netpbm*,又安装了两个包

 

Dependencies Resolved

================================================================================

 Package             Arch        Version                   Repository      Size

================================================================================

Installing:

 netpbm-devel        i386        10.47.04-1.fc10           updates         96 k

 netpbm-progs        i386        10.47.04-1.fc10           updates        1.9 M

 

再看,发现相关的命令就有了

[root@localhost developer]# png

pngcomp   pngcrush  pngnq     pngtopam  pngtopnm 

 

2、logo图片改成.ppm格式。首先你要有个和自己屏幕分辨率一样或者小于屏幕分辨率的图片,如linux_iunin_logo.png

   将png图片转成pnm

     pngtopnm linux_iunin_logo.png > linux_iunin_logo.pnm

   将pnm图片的颜色数限制在224色

    pnmquant 224 linux_iunin_logo.pnm > logo_iunin_clut224.pnm

   将pnm图片转换成我们需要的ppm

    pnmtoplainpnm logo_iunin_clut224.pnm > logo_iunin_clut224.ppm

 

也可以使用软件,比如友善之臂的loglmaker,可以直接把图片转换成.ppm格式的。

 

方法二:

用RedHat9自带的图片编辑工具GIMP。

找一个任意格式的图片(JPG,BMP之类的),在图形界面中,右键单击这个图片,选“打开方式->The GIMP”,第一次打开需要安装GIMP软件,安装完后自动运行GIMP,这是一个很强大的图像处理工具,可称为Linux下的photoshop。

    右键单击窗口中的图片选“图像->模式->索引”,把颜色数改为:224(这步很重要)。其他的都默认,OK后右键“文件->Save As”,保存为ppm格式的文件,确定后弹出一个对话框,选择Ascii,OK后,GIMP会把图片转换成ppm格式,把这个文件复制到logo文件夹中就可以

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kernle下制作动态logo 的相关文章

  • LXC介绍

    LXC LXC又名Linux container xff0c 是一种虚拟化的解决方案 xff0c 这种是内核级的虚拟化 主流的解决方案Xen KVM LXC 介绍 通过namespace进行资源的隔离 Gust1下的进程与Guset2下的进
  • js中 offsetLeft图解

    1假设本图有三层div盒子 外 中 内 2最外层和页面的距离就是offsetLeft 元素与页面之间的左边的距离 3外层包含着中 和内 4外层和中层的距离是不变的 外层包含中层 xff0c 中层的offsetLeft是相对于外层的距离 5若
  • LAMP源码安装图文详解(超详细)

    文章目录 一 LAMP架构概述1 各组件的主要作用2 各组件安装顺序 二 编译安装Apache httpd服务1 关闭防火墙 xff0c 将安装Apache所需软件包传到 opt目录下2 安装环境依赖包3 配置软件模块4 编译及安装5 优化
  • c++学习总结(多态性)

    在学习c 43 43 的过程中 xff0c 根据自己的见解 xff0c 把一些自己认为重要的 容易混淆的知识点记录下来 xff0c 为了以后能够复习 今天主要总结多态性 主要从以下三个方面来讨论 xff1a what why how 什么是
  • [分享]分享一个多旋翼开源飞控项目

    https github com golaced Oldx fly controller tree rmd OLDX多旋翼开发平台 xff08 OLDX FC xff09 是由北京理工大学自动化学院所属 北理云逸科技 团队开发的一个目前国内
  • gitkraken安装教程

    版本gitkraken6 5 1 双击安装文件后 xff0c 安装成功后 xff0c 关掉软件 xff0c 删掉安装包 第一步 xff1a 修改hosts xff0c 路径为C Windows System32 drivers etc ho
  • 入手新单片机流程&提高可移植性的编程技巧

    现在单片机种类众多 xff0c 各有各的优势与不足 体现在价格 速度 外设 功耗 封装等许多方面 xff0c 这些单片机不可能一一去学习 xff0c 因此今后有很大可能需要应用到自己不熟的单片机 xff0c 对此 xff0c 我总结了一些经
  • ssh连接失败,但能ping通服务器

    ssh连接失败 xff0c 但能ping通服务器 问题描述问题排查1 判断是否客户端本身问题2 服务器端排查3 配置完服务器报错 问题描述 能ping通 xff0c ssh报错 Connection reset by peer span c
  • opencv库的功能

    OpenCV Open Source Computer Vision 是一个开源的计算机视觉库 xff0c 提供了很多用于图像处理 计算机视觉 机器学习等方面的函数和工具 以下是一些 OpenCV 库的功能 xff1a 图像和视频 I O

随机推荐

  • 深度学习模型列举

    深度学习是一种人工神经网络算法的实现方式 xff0c 主要用于处理大规模复杂数据集 xff0c 如图像 语音 文本等数据 以下是一些常见的深度学习模型 xff1a 卷积神经网络 xff08 Convolutional Neural Netw
  • CentOS8.3.2011无法联网解决方案

    1 切换到ifcfg ensXX目录下 cd etc sysconfig network scripts 2 编辑ifcfg ensXX文件 vim ifcfg ens33 3 修改 BOOTPROTO 61 dhcp 并且修改 ONBOO
  • Run Windows in Ubuntu with VMware Player 使用 VMware Player 在 Ubuntu 下运行 Win

    Are you an enthusiast who loves their Ubuntu Linux experience but still needs to use Windows programs Here s how you can
  • Ardupilot固定翼无人机L1制导律原理及代码解读

    L1制导律是固定翼无人机飞行路径跟踪的重要算法之一 xff0c 这个算法由MIT的研究人员提出 在这之前 xff0c 无人机进行路径跟踪一般采用基于侧偏距的PD控制器方法 至于为什么使用PD而不使用PID xff0c 那是因为位置环响应慢
  • sumo交通流仿真软件的使用说明

    1 安装流程 xff1a 1 xff09 mis文件安装 xff1a 官网下载下来一键安装 xff1b 2 xff09 tar利用压缩安装 xff1a 官网下载安装包 xff0c 解压后 xff0c 在系统变量变量中定义sumo的路径和bi
  • 搭建PX4开发环境

    PX4是著名的开源无人机开发平台 xff0c 它提供了一个虚拟环境 xff0c 可以用来验证无人机的飞控算法 xff0c 也可以连接开源硬件 xff0c 为无人机的开发提供了极大便利 目前PX4支持的操作系统是ubuntu 18 04LTS
  • 进程间通信IPC——命名管道

    命名管道 1 基本概念2 创建1 xff09 命令行2 xff09 函数 3 示例 1 基本概念 命名管道是一种特殊的文件类型 xff0c 其存在于磁盘上 xff0c 但是大小永远是0 不同于匿名管道的是 xff1a 可在同一台计算机的不同
  • docker学习内容(1)-介绍与安装

    docker是什么 Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案 Docker 的基础是 Linux 容器 xff08 LXC xff09 等技术 docker干什么 更快速的交付和部署 高效虚拟化 docker的出现 xf
  • 2014百度校园招聘笔试题(长春站)

    一 xff0c 简答题 30分 1 xff0c 当前计算机系统一般会采用层次结构存储数据 xff0c 请介绍下典型计算机存储系统一般分为哪几个层次 xff0c 为什么采用分层存储数据能有效提高程序的执行效率 xff1f 10分 2 xff0
  • 【图像处理】A Skinned Multi-Person Linear Model(SMPL)浅解析

    图像处理 A Skinned Multi Person Linear Model xff08 SMPL xff09 浅解析 SMPL的原理结语 SMPL的原理 首先 xff0c 博主不做3D建模的工作 xff08 尽管这项工作真的很酷 xf
  • 播放音乐There was an error running option A4 audio; amixer... error no such file or directory

    目标 xff1a 树莓派的3 5mm音频输出口连接音箱 xff0c 让音箱播放音乐 踩坑 xff1a 在网上找了各种教程 xff0c 前后折腾了三四天 xff0c 才终于把这个问题解决 xff08 不想看具体的踩坑过程的话 xff0c 可以
  • SLAM 介绍

    http www slamcn org index php E9 A6 96 E9 A1 B5 比较好的开源SLAM Odometry代码 xff1a https github com ethz asl rovio https github
  • 阅读:Learning Deep Features for Discriminative Localization

    作者 xff1a Bolei Zhou Aditya Khosla Agata Lapedriza Aude Oliva Antonio Torralba 来源 xff1a CVPR2015 摘要 本文重新审视了 Network in ne
  • openstack软删除虚拟机,类似于删除到回收站

    vim etc nova nova conf DEFAULT my ip 61 192 168 176 57 其他控制节点修改 use neutron 61 true firewall driver 61 nova virt firewal
  • C++:多态 详解

    目录 一 多态的概念 二 多态的定义及实现 1 重写 覆盖 的要求 2 多态两个要求 xff1a 3 多态的切片示意图 4 多态演示 xff1a 买票场景下的多态 完整代码 5 虚函数重写的例外 xff1a 协变 父类与子类虚函数返回值类型
  • 参考任哲的《嵌入式实时操作系统μC_OS-II原理及应用》,对UCOS的任务调度做了下整理。

    参考任哲的 嵌入式 实时操作系统 C OS II原理及应用 xff0c 对 UCOS 的任务调度做了下整理 UCOS有两种调度器 xff0c 一种是任务级的调度器 xff0c 一种是中断级的调度器 任务级的调度器由OSSHED 来实现 而中
  • 树莓派3 声音传感器(win10)

    这段时间太忙了 xff0c 项目收尾一直没有时间继续捣鼓树莓派 xff0c 正好趁这个双休抽点时间来和我的小伙伴玩耍一把 上篇文章提到我想用 Win10 Iot Core 和买来的一堆传感器摩擦出一些火花 xff0c 虽然 xff0c 已经
  • 离线安装centos7 图形界面

    离线安装centos7图形界面 一 配置yum源 1 备份系统 repo源 cd etc yum repos d mkdir back mv repo back 2 创建yum配置文件并编辑 cd etc yum repos d touch
  • eclipse部署tomcat修改项目访问路径(虚拟路径)

    原文参考 xff1a http www educity cn wenda 147993 html http blog 163 com java zf blog static 19926038420129240314546 tomcat部署w
  • kernle下制作动态logo

    在uboot中实现logo的好处是反映速度快 在kernel中实现logo的好处是 xff0c 不管是android还是什么其他平台 xff0c logo显示无需考虑上层平台 参照三星平台的写法 xff0c logo的显示一方面是开机时产品