u-boot-2009.08在mini2440上的移植 增加LCD显示功能

发布者:温柔的心情最新更新时间:2024-07-01 来源: elecfans关键字:u-boot  mini2440  移植 手机看文章 扫描二维码
随时随地手机看文章

移植环境

1,主机环境:VMare下CentOS 5.5 ,1G内存。

2,集成开发环境:Elipse IDE

3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。

4,开发板:mini2440,2M nor flash,128M nand flash。

5,u-boot版本:u-boot-2009.08


7.1添加 LCD 显示功能


对于这个 LCD 的支持是参考Openmoko 的代码移植的。Openmoko 的GTA2 使用的是S3C2442 的CPU,在LCD 控制器上是一样的。而GTA2 在U-boot 的可以在LCD 上显示字符,而且对于软件分层的U-boot 来说,只要将底层驱动移植过来并调整好初始化参数就可以在LCD 上显示console。下图是LCD驱动软件分层执行流程示意。可以看到LCD在执行时最终调用的是底层的board_video_init()函数,其主要作用是对LCD控制寄存器进行初始化。可由用户根据实际LCD硬件编写。

u-boot-2009.08在mini2440上的移植(七)---增加LCD显示功能

由于友善之臂使用了两种屏,他们在一个参数上有很小的差别,而屏有不可以通过程序去识别,所以只能简单的通过Nand Flash 配置来区分导入的参数(64MB Nand 的板子使用的都是NEC 的,其他的都是统宝的)。这个功能的移植修改了5 个文件(包括drivers/video/Makefile,以及前面已经修改过的board/samsung/mini2440/mini2440.c 文件)。

【1】在/drivers/video/下添加一个驱动文件名为s3c2410_fb.c,将下面内容粘贴进去:

/*
 * (C) Copyright 2006 by OpenMoko, Inc.
 * Author: Harald Welte
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include
 
#if defined(CONFIG_VIDEO_S3C2410)
 
#include
#include 'videomodes.h'
#include
/*
 * Export Graphic Device
 */
GraphicDevice smi;
 
#define VIDEO_MEM_SIZE  0x200000        /* 240x320x16bit = 0x25800 bytes */
 
extern void board_video_init(GraphicDevice *pGD);
 
/*******************************************************************************
 *
 * Init video chip with common Linux graphic modes (lilo)
 */
void *video_hw_init (void)
{
    S3C24X0_LCD * const lcd = S3C24X0_GetBase_LCD();
    GraphicDevice *pGD = (GraphicDevice *)&smi;
    int videomode;
    unsigned long t1, hsynch, vsynch;
    char *penv;
    int tmp, i, bits_per_pixel;
    struct ctfb_res_modes *res_mode;
    struct ctfb_res_modes var_mode;
//    unsigned char videoout;
 
    /* Search for video chip */
    printf('Video: ');

    tmp = 0;
 
         videomode = CFG_SYS_DEFAULT_VIDEO_MODE;
         /* get video mode via environment */
         if ((penv = getenv ('videomode')) != NULL) {
                 /* deceide if it is a string */
                 if (penv[0] <= '9') {
                         videomode = (int) simple_strtoul (penv, NULL, 16);
                         tmp = 1;
                 }
         } else {
                 tmp = 1;
         }
         if (tmp) {
                 /* parameter are vesa modes */
                 /* search params */
                 for (i = 0; i < VESA_MODES_COUNT; i++) {
                         if (vesa_modes[i].vesanr == videomode)
                                 break;
                 }
                 if (i == VESA_MODES_COUNT) {
                         printf ('no VESA Mode found, switching to mode 0x%x ', CFG_SYS_DEFAULT_VIDEO_MODE);
                         i = 0;
                }
                 res_mode =
                         (struct ctfb_res_modes *) &res_mode_init[vesa_modes[i].
                                                                  resindex];
                 bits_per_pixel = vesa_modes[i].bits_per_pixel;
         } else {
 
                res_mode = (struct ctfb_res_modes *) &var_mode;
                 bits_per_pixel = video_get_params (res_mode, penv);
         }
 
         /* calculate hsynch and vsynch freq (info only) */
         t1 = (res_mode->left_margin + res_mode->xres +
               res_mode->right_margin + res_mode->hsync_len) / 8;
         t1 *= 8;
         t1 *= res_mode->pixclock;
         t1 /= 1000;
         hsynch = 1000000000L / t1;
         t1 *=
                 (res_mode->upper_margin + res_mode->yres +
                  res_mode->lower_margin + res_mode->vsync_len);
         t1 /= 1000;
         vsynch = 1000000000L / t1;
 
         /* fill in Graphic device struct */
         sprintf (pGD->modeIdent, '%dx%dx%d %ldkHz %ldHz', res_mode->xres,
                  res_mode->yres, bits_per_pixel, (hsynch / 1000),
                  (vsynch / 1000));
         printf ('%sn', pGD->modeIdent);
         pGD->winSizeX = res_mode->xres;
         pGD->winSizeY = res_mode->yres;
         pGD->plnSizeX = res_mode->xres;
         pGD->plnSizeY = res_mode->yres;
            
         switch (bits_per_pixel) {
         case 8:
                 pGD->gdfBytesPP = 1;
                 pGD->gdfIndex = GDF__8BIT_INDEX;
                 break;
         case 15:
                 pGD->gdfBytesPP = 2;
                 pGD->gdfIndex = GDF_15BIT_555RGB;
                 break;
         case 16:
                 pGD->gdfBytesPP = 2;
                 pGD->gdfIndex = GDF_16BIT_565RGB;
                 break;
         case 24:
                 pGD->gdfBytesPP = 3;
                 pGD->gdfIndex = GDF_24BIT_888RGB;
                 break;
         }
 
         /* statically configure settings */
        pGD->winSizeX = pGD->plnSizeX = 240;
         pGD->winSizeY = pGD->plnSizeY = 320;
         pGD->gdfBytesPP = 2;
         pGD->gdfIndex = GDF_16BIT_565RGB;
 
         pGD->frameAdrs = LCD_VIDEO_ADDR;
         pGD->memSize = VIDEO_MEM_SIZE;
 
         board_video_init(pGD);
 
         lcd->LCDSADDR1 = pGD->frameAdrs >> 1;
 
         /* This marks the end of the frame buffer. */
         lcd->LCDSADDR2 = (lcd->LCDSADDR1&0x1fffff) + (pGD->winSizeX+0) * pGD->winSizeY;
         lcd->LCDSADDR3 = (pGD->winSizeX & 0x7ff);
 
         /* Clear video memory */
         memset((void *)pGD->frameAdrs, 0, pGD->memSize);
 
         /* Enable  Display  */
         lcd->LCDCON1 |= 0x01;   /* ENVID = 1 */
 
         return ((void*)&smi);
 }
 
 void
 video_set_lut (unsigned int index,      /* color number */
                unsigned char r, /* red */
                unsigned char g, /* green */
                unsigned char b  /* blue */
  )
 {
 }
 
 #endif /* CONFIG_VIDEO_S3C2410 */

[1] [2] [3]
关键字:u-boot  mini2440  移植 引用地址:u-boot-2009.08在mini2440上的移植 增加LCD显示功能

上一篇:u-boot-2009.08在mini2440上的移植 增加DM9000网卡驱动
下一篇:u-boot-2009.08在mini2440上的移植 增加USB功能

推荐阅读最新更新时间:2024-11-02 15:21

NFC会是下一个被移植到汽车上的技术么?
    在跟电子行业的朋友聊天时,车云菌常能听到这种论调:“俺这个行业都日薄西山了,也就是汽车拯救了俺们。”且不论电子行业是否真的日薄西山,但是汽车,确实已经成为它们一个相当重要的细分市场。很多企业都十分努力在汽车行业找到看家本领的第二春。     比如说HUD(抬头显示),虽说现在HUD在汽车上还并没有普及开来,只在一些中高端车型上才有搭载,但是在很多概念性技术和概念车上,HUD的存在已然让人习惯。那么,下一个会被移植到汽车上的技术会是什么呢?     美国工程师协会(SAE)最近的一篇文章中认为,NFC技术将会成为下一个被从移动端移植到汽车上的技术。     NFC技术是啥技术呢?NFC与蓝牙类似,只不过通讯距离相
[汽车电子]
s3c6410_u-boot-2010.03移植
开发环境: 开发板 FriendlyARM Tiny6410 主机 CentOS release 6.4 (Final) 参考: http://www.cnblogs.com/plinx/archive/2013/03/15/2960925.html http://www.cnblogs.com/plinx/archive/2013/04/11/2963823.html http://www.cnblogs.com/plinx/archive/2013/04/13/3015851.html http://wenku.baidu.com/view/a4d3f5320b4c2e3f572763d5.html
[单片机]
μC/OS-II在S3C44BOX处理器上的移植
摘要:介绍实时操作系统μC/OS-II的特点和内核结构,给出μC/OS-II在Samsung嵌入式S3C44BOX ARM7微处理器上的移植的步骤及详细相关代码,同时阐述μC/OS-II在应用中应注意的问题。 关键词:μC/OS-II S3C44BOX 移植 实时操作系统 μC/OS-II功能强大,支持56个用户任务,其内核为占先式,支持信号量、邮箱、消息队列等多种常用的进程间通信机制,现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。与大多商用RTOS不同的是,μC/OS-II公开所有的源代码,90%的代码使用标准的ANSI C语言书写,程序可读性强、移植性好;同时它可免费获得,即使商业应用也只收取少量的许可费用
[嵌入式]
autossh 移植到arm
一、环境介绍 1.1 宿主机 Ubuntu 1404 32 位 1.2 嵌入式平台 ATMEL AT91SAM9X25 1.3 交叉工具链 arm-none-linux-gnueabi autossh源码下载地址 二、交叉编译 tar xvf autossh-1.4b.tgz cd autossh-1.4b/ ./configure --prefix=$PWD/tmp --host=arm-none-linux-gnueabi --build=i686-linux make make install 执行完安装之后,将安装目录的可执行文件拷贝到目标板即可
[单片机]
STM32MP1 U-Boot
U-Boot简介 SSBL第二级启动加载器:由TF-A加载与引导 初始化平台 加载内核 可选加载Cortex-M4 U-Boot SPL的注意事项 U-Boot SPL仅用于DDR Tuning和U-Boot开发 不支持使用U-Boot SPL作为FSBL 获取源代码的多种方式 从Developer Package获取:从http://www.st.com中下载指定版本;从STM32 github获取更新版本 从Das U-Boot网站获取 配置要点 选择预先定义的配置:stm32mp15_trusted_defconfig;stm32mp15_optee_defconfig ;stm32mp15_basic_de
[单片机]
移植Python3到TQ2440(二)
在上一篇博文中我们用NFS挂载根文件系统的方式启动了系统,接下来我们把移植了Python3的根文件系统固化到NandFlash中,但是由于linux-4.9目前不支持Yaffs2文件系统,所以我们用Jiffs2文件系统。 下面我们分为几部分: 1、移植mtd-utils工具 2、固化根文件系统到NandFlash中 3、支持Telnet 平台 硬件:TQ2440 64MB内存 256MB NandFlash bootloader:U-Boot 2015.04 kernel:linux-4.9 Python: Python-3.6.0 工具链:arm-none-linux-gnueabi-gcc 4.8.3 一、移植mt
[单片机]
ARM9 2410移植之ARM中断原理, 中断嵌套的误区,中断号的怎么来的
几天前一个学生问我ARM中断嵌套的问题,我才发现原在我心中理所当然的事对学生来说理解实属不易。 ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。 我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫 irq pin, 一根叫fiq pin. 在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ的。 先不说中断控制器,只说ARM核心。正常情况下,ARM核都只是机械地随着pc的指示去做事情,当CPSR中的I和F位为1的时候,IRQ和FIQ全部处 于禁止状态。无论你在irq pin和fiq pin上面发什么样的中断信号,ARM是不会理你的,你根本不能打断他,因为他耳聋了,眼也瞎了
[单片机]
文件系统的移植(四):cramfs 文件系统的移植
内 核 版 本:linux-3.0 u-boot版本:u-boot-2010.09 开发板型号:FL2440 1、对根文件系统进行修改 无修改 2、添加内核对 cramfs 的支持 $ vt100 $ make menuconfig File systems --- Miscellaneous filesystems --- * Compressed ROM file system support (cramfs) 修改Makefile $ vim Makefile 修改195、196行 $ make
[单片机]
文件系统的<font color='red'>移植</font>(四):cramfs 文件系统的<font color='red'>移植</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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