内核启动后,lcd显示logo失败

发布者:SparklingSoul最新更新时间:2025-01-06 来源: cnblogs关键字:内核启动  lcd显示  s5pv210 手机看文章 扫描二维码
随时随地手机看文章

针对-s5pv210,但对其他平台也使用

lcd显示logo失败,若显示成功默认的logo是一只企鹅,但是串口打印“Start display and show logo”,但是LCD屏没有显示   

[    0.833071] s3cfb s3cfb: [fb2] dma: 0x465ab000, cpu: 0xe1000000, size: 0x005dc000

[    0.845112] FIMD src sclk = 166750000

[    0.965701] s3cfb s3cfb: registered successfully

[    0.965744] Start display and show logo

 

原因:LCD驱动有问题。

第一步:在arch/arm/mach-s5pv210/mach-smdkc110.c当中,约712行,将之前的LCD初始化删掉,并修改如下:


#ifdef CONFIG_FB_S3C_LTE480WV

static struct s3cfb_lcd wvga_s70 = {

 

        .width = 800,

        .height = 480,

        .p_width = 154,

        .p_height = 96,

        .bpp = 32,

        .freq = 65,

 

        .timing = {

                .h_fp = 80,

                .h_bp = 36,

                .h_sw = 10,

                .v_fp = 22,

                .v_fpe = 1,

                .v_bp = 15,

                .v_bpe = 1,

                .v_sw = 8,

        },

        .polarity = {

                .rise_vclk = 0,

                .inv_hsync = 1,

                .inv_vsync = 1,

                .inv_vden = 0,

        },

};

 

static void lcd_cfg_gpio(struct platform_device *pdev)

{

    int i;

 

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

        s3c_gpio_cfgpin(S5PV210_GPF0(i), S3C_GPIO_SFN(2));

        s3c_gpio_setpull(S5PV210_GPF0(i), S3C_GPIO_PULL_NONE);

    }

 

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

        s3c_gpio_cfgpin(S5PV210_GPF1(i), S3C_GPIO_SFN(2));

        s3c_gpio_setpull(S5PV210_GPF1(i), S3C_GPIO_PULL_NONE);

    }

 

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

        s3c_gpio_cfgpin(S5PV210_GPF2(i), S3C_GPIO_SFN(2));

        s3c_gpio_setpull(S5PV210_GPF2(i), S3C_GPIO_PULL_NONE);

    }

 

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

        s3c_gpio_cfgpin(S5PV210_GPF3(i), S3C_GPIO_SFN(2));

        s3c_gpio_setpull(S5PV210_GPF3(i), S3C_GPIO_PULL_NONE);

    }

 

    /* mDNIe SEL: why we shall write 0x2 ? */

    writel(0x2, S5P_MDNIE_SEL);

 

    /* drive strength to max */

    writel(0xaaaaaaaa, S5PV210_GPF0_BASE + 0xc);

    writel(0xaaaaaaaa, S5PV210_GPF1_BASE + 0xc);

    writel(0xaaaaaaaa, S5PV210_GPF2_BASE + 0xc);

    writel(0x000000aa, S5PV210_GPF3_BASE + 0xc);

}

 

#define S5PV210_GPD_0_0_TOUT_0  (0x2)

#define S5PV210_GPD_0_1_TOUT_1  (0x2 << 4)

#define S5PV210_GPD_0_2_TOUT_2  (0x2 << 8)

#define S5PV210_GPD_0_3_TOUT_3  (0x2 << 12)

static int lcd_backlight_on(struct platform_device *pdev)

{

    int err;

 

    err = gpio_request(S5PV210_GPD0(3), 'GPD0');

 

    if (err) {

        printk(KERN_ERR 'failed to request GPD0 for '

            'lcd backlight controln');

        return err;

    }

 

    gpio_direction_output(S5PV210_GPD0(3), 1);

 

    s3c_gpio_cfgpin(S5PV210_GPD0(3), S5PV210_GPD_0_3_TOUT_3);

 

    gpio_free(S5PV210_GPD0(3));

    return 0;

}

 

static int lcd_backlight_off(struct platform_device *pdev, int onoff)

{

    int err;

 

    err = gpio_request(S5PV210_GPD0(3), 'GPD0');

 

    if (err) {

        printk(KERN_ERR 'failed to request GPD0 for '

                'lcd backlight controln');

        return err;

    }

 

    gpio_direction_output(S5PV210_GPD0(3), 0);

    gpio_free(S5PV210_GPD0(3));

    return 0;

}

 

static int lcd_reset_lcd(struct platform_device *pdev)

{

    int err;

 

    err = gpio_request(S5PV210_GPH0(6), 'GPH0');

    if (err) {

        printk(KERN_ERR 'failed to request GPH0 for '

                'lcd reset controln');

        return err;

    }

 

    gpio_direction_output(S5PV210_GPH0(6), 1);

    mdelay(100);

 

    gpio_set_value(S5PV210_GPH0(6), 0);

    mdelay(10);

 

    gpio_set_value(S5PV210_GPH0(6), 1);

    mdelay(10);

 

    gpio_free(S5PV210_GPH0(6));

 

    return 0;

}

 

static struct s3c_platform_fb lte480wv_fb_data __initdata = {

    .hw_ver    = 0x62,

    .nr_wins = 5,

    .default_win = CONFIG_FB_S3C_DEFAULT_WINDOW,

    .swap = FB_SWAP_WORD | FB_SWAP_HWORD,

       .lcd = &wvga_s70,

    .cfg_gpio    = lcd_cfg_gpio,

    .backlight_on    = lcd_backlight_on,

    .backlight_onoff    = lcd_backlight_off,

    .reset_lcd    = lcd_reset_lcd,

};

#endif


第二步:使用make menuconfig,去配置当前显示的windows,请配置为windows0

   

Device Drivers

  -->Graphics support 

     --> Support for frame buffer devices

        --> (2)     Default Window (0-4) 


修改为

Device Drivers

  -->Graphics support 

      --> Support for frame buffer devices

         --> (0)     Default Window (0-4)


关键字:内核启动  lcd显示  s5pv210 引用地址:内核启动后,lcd显示logo失败

上一篇:S5PV210 固件烧写 u-boot烧写
下一篇:linux驱动模型——platform(2)

推荐阅读最新更新时间:2026-03-23 10:50

[kernel 启动流程] (第五章)第一阶段之——临时内核页表的创建
本文是基于arm平台。例子都是以tiny210(s5pv210 armv7)为基础的。 系列: 前篇——vmlinux.lds分析 (第一章)概述 (第二章)第一阶段之——设置SVC、关闭中断 (第三章)第一阶段之——proc info的获取 (第四章)第一阶段之——dtb的验证 (第五章)第一阶段之——临时内核页表的创建 (第六章)第一阶段之——打开MMU (第七章)第一阶段之——跳转到start_kernel 建议参考文档: ARMV7官方数据手册 ARM的CP15协处理器的寄存器 ================================================ 零、说明 本文是《 (第一章)
[单片机]
Linux内核启动参数
一、系统启动流程 bootloader(uboot)——linux Kernel(uImage)——Rootfs(Init)——Application 二、启动环境配置 uboot环境变量:printenv setenv saveenv tftpboot nand read/write baudrate 115200 bootdelay bootcmd bootargs... 内核启动参数:bootargs ' name = value ...' bootargs root=/dev/nfs nfsroot=10.66.10.10:home/binge/rootfs ip=10.66.10.12 init=/li
[单片机]
u-boot之内核是怎么启动
在u-boot之start_armboot函数分析已经分析过了整个程序框架,但只是说了下什么时候运行内核,并没有具体说明是怎么执行内核的。内核启动分以下几个步骤说明: 1、启动参数bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0说明 2、run_command函数是怎么执行命令的 3、u-boot给内核传递的参数说明 4、内核启动流程 1、启动参数bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0说明 这个参数分了两条uboot命令首先从kernel区拷贝相应大小的内核到
[单片机]
Linux移植之内核启动过程引导阶段分析
在Linux移植之make uImage编译过程分析中已经提到了uImage是一个压缩的包并且内含压缩程序,可以进行自解压。自解压完成之后内核代码从物理地址为0x30008000处开始运行。下面分析在进入C之前内核做的一些工作,以下是内核启动过程中打印出来的信息,其中Uncompressing Linux就是在自解压代码。make uImage编译的最后也给出了链接脚本arch/arm/kernel/vmlinux.lds,以及链接的顺序arch/arm/kernel/head.o 是第一个。 分析arch/arm/kernel/vmlinux.lds可以知道程序入口的地址是stext,并且是.text.head段 277
[单片机]
Linux移植之<font color='red'>内核</font><font color='red'>启动</font>过程引导阶段分析
Linux移植之内核启动过程start_kernel函数简析
在Linux移植之内核启动过程引导阶段分析中从arch/arm/kernel/head.S开始分析,最后分析到课start_kernel这个C函数,下面就简单分析下这个函数,因为涉及到Linux的内容较多,这里只是简单介绍下内核启动流程。先看一下内核启动的流程框图,截图来自《嵌入式Linux应用开发完全手册》。内核引导阶段已经分析过,接下来分析一下内核启动的第二阶段。 1、start_kernel函数全局概览 2、start_kernel函数调用层次 1、start_kernel函数全局概览,对start_kernel作一下粗略注释。 打开initMain.c ,下面主要分析处理UBOOT传入的参数,其中r1是传入的第一个参
[单片机]
Linux移植之<font color='red'>内核</font><font color='red'>启动</font>过程start_kernel函数简析
第3阶段——内核启动分析之创建si工程和分析stext启动内核函数(4)
1 创建内核source sight 工程 1.1 点击 “add all” 添加所有文件,后面再慢慢删去Arch目录和Include目录中与2440芯片没用的文件。 1.2 点击Remove Tree 删除Arch文件夹,再添加与2440相关的硬件核心代码以及其它公用的代码  Arch:包含了平台,处理器相关的代码,并包括boot文件夹。 1.2.1 点击Add Tree添加以下子目录: linux-2.6.22.6/arch/arm/boot (启动配置文件) linux-2.6.22.6/arch/arm/common (公共文件) linux-2.6.22.6/arch/ar
[单片机]
第3阶段——<font color='red'>内核</font><font color='red'>启动</font>分析之创建si工程和分析stext<font color='red'>启动</font><font color='red'>内核</font>函数(4)
u-boot-2011.03在mini2440/micro2440上的移植 支持内核启动
4.1 include/conskfigs/micro2440.h 添加 #define CONFIG_SETUP_MEMORY_TAGS 1 //如果没有定义这个参数,则uboot参数必须加入men=内存大小 #define CONFIG_INITRD_TAG 1 #define CONFIG_CMDLINE_TAG 1 //设置bootargs出入内核必须 #define CONFIG_BOOTARGS noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 【说明】 到此步后,使用bootm后在 Starting kernel ..
[单片机]
1_5.3.4_内核配置裁剪及启动流程_内核启动流程分析之内核
内核的最终目的:运行应用程序(在根文件系统里面,需要挂接根文件系统)。 一下运行应用程序前要做什么事情? 1.处理u-boot传入的参数 从第一个文件(arch/arm/kernel/head.S)开始分析。 查找head.S,发现还有一个bootcompressed目录下的head.S文件,这是什么文件呢? 我们编译出来的内核可能会很大,有没有办法让它变小一点呢? 答:有的,使用压缩将文件变小。 在压缩后的文件前面加上一个自解压代码。本来代码是从原来的文件开始运行,现在使用压缩后的文件,代码就从自解压代码开始运行。自解压代码会将后面的压缩文件解压出来,然后再从解压缩后的代码开始运行。可以看出,这是一种时间
[单片机]
1_5.3.4_<font color='red'>内核</font>配置裁剪及<font color='red'>启动</font>流程_<font color='red'>内核</font><font color='red'>启动</font>流程分析之<font color='red'>内核</font>启
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved