打印
[ZLG-ARM]

u-boot学习报告(下)

[复制链接]
3408|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
armqt|  楼主 | 2009-7-9 13:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
接u-boot学习报告(上)

2. Board.c
源码位置:lib_arm/board.c
运行位置:SDRAM
描述:start_armboard()是u-boot运行的第一个c语言函数,完成系统的初始化工作,进入主循环,处理用户的命令。
void start_armboot (void)
{
        init_fnc_t **init_fnc_ptr;
        char *s;
#ifndef CFG_NO_FLASH
        ulong size;
#endif
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
        unsigned long addr;
#endif

        /* Pointer is writable since we allocated a register for it */
        gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
        /* compiler optimization barrier needed for GCC >= 3.4 */
        __asm__ __volatile__('': : :'memory');

        memset ((void*)gd, 0, sizeof (gd_t));
        gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
        memset (gd->bd, 0, sizeof (bd_t));

        monitor_flash_len = _bss_start - _armboot_start;


/* 顺序执行init_sequence数组中的初始化函数  */
        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
                if ((*init_fnc_ptr)() != 0) {
                        hang ();
                }
        }

#ifndef CFG_NO_FLASH
        /* 配置可用的Flash*/
        size = flash_init ();
        display_flash_config (size);
#endif /* CFG_NO_FLASH */

#ifdef CONFIG_VFD
#        ifndef PAGE_SIZE
#          define PAGE_SIZE 4096
#        endif
        /*
         * reserve memory for VFD display (always full pages)
         */
        /* bss_end is defined in the board-specific linker script */
        addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
        size = vfd_setmem (addr);
        gd->fb_base = addr;
#endif /* CONFIG_VFD */

#ifdef CONFIG_LCD
#        ifndef PAGE_SIZE
#          define PAGE_SIZE 4096
#        endif
        /*
         * reserve memory for LCD display (always full pages)
         */
        /* bss_end is defined in the board-specific linker script */
        addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
        size = lcd_setmem (addr);
        gd->fb_base = addr;
#endif /* CONFIG_LCD */

        /* armboot_start 在u-boot.lds连接脚本中定义*/
        mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);

#if (CONFIG_COMMANDS & CFG_CMD_NAND)
        puts ('NAND:  ');
        nand_init();                /* go init the NAND */
#endif

#ifdef CONFIG_HAS_DATAFLASH
        AT91F_DataflashInit();
        dataflash_print_info();
#endif

        /* initialize environment */
        env_relocate ();

#ifdef CONFIG_VFD
        /* must do this after the framebuffer is allocated */
        drv_vfd_init();
#endif /* CONFIG_VFD */

        /* IP Address */
        gd->bd->bi_ip_addr = getenv_IPaddr ('ipaddr');

        /* MAC Address */
        {
                int i;
                ulong reg;
                char *s, *e;
                char tmp[64];

                i = getenv_r ('ethaddr', tmp, sizeof (tmp));
                s = (i > 0) ? tmp : NULL;

                for (reg = 0; reg < 6; ++reg) {
                        gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
                        if (s)
                                s = (*e) ? e + 1 : e;
                }

#ifdef CONFIG_HAS_ETH1
                i = getenv_r ('eth1addr', tmp, sizeof (tmp));
                s = (i > 0) ? tmp : NULL;

                for (reg = 0; reg < 6; ++reg) {
                        gd->bd->bi_enet1addr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
                        if (s)
                                s = (*e) ? e + 1 : e;
                }
#endif
        }

        devices_init ();        /* get the devices list going. */

#ifdef CONFIG_CMC_PU2
        load_sernum_ethaddr ();
#endif /* CONFIG_CMC_PU2 */

        jumptable_init ();

        console_init_r ();        /* fully init console as a device */

#if defined(CONFIG_MISC_INIT_R)
        /* miscellaneous platform dependent initialisations */
        misc_init_r ();
#endif

        /* enable exceptions */
        enable_interrupts ();

        /* Perform network card initialisation if necessary */
#ifdef CONFIG_DRIVER_CS8900
        cs8900_get_enetaddr (gd->bd->bi_enetaddr);
#endif

#if defined(CONFIG_DRIVER_SMC91111)||defined (CONFIG_DRIVER_LAN91C96)
        if (getenv ('ethaddr')) {
                smc_set_mac_addr(gd->bd->bi_enetaddr);
        }
#endif /* CONFIG_DRIVER_SMC91111 || CONFIG_DRIVER_LAN91C96 */

        /* Initialize from environment */
        if ((s = getenv ('loadaddr')) != NULL) {
                load_addr = simple_strtoul (s, NULL, 16);
        }
#if (CONFIG_COMMANDS & CFG_CMD_NET)
        if ((s = getenv ('bootfile')) != NULL) {
                copy_filename (BootFile, s, sizeof (BootFile));
        }
#endif        /* CFG_CMD_NET */

#ifdef BOARD_LATE_INIT
        board_late_init ();
#endif
#if (CONFIG_COMMANDS & CFG_CMD_NET)
#if defined(CONFIG_NET_MULTI)
        puts ('Net:   ');
#endif
        eth_initialize(gd->bd);
#endif
        /* main_loop() can return to retry autoboot, if so just run it again. */
        for (;;) {
                main_loop ();
        }

        /* NOTREACHED - no way out of command loop except booting */
}

3. Init_sequence[]
Init_sequence数组中保存系统启动过程顺序初始化的函数指针。
init_fnc_t *init_sequence[] = {
        cpu_init,                /* 基本处理器相关配置  -- cpu/arm920t/cpu.c */
        board_init,                /* 基本的板级相关配置—board/smdk2410/smdk2410.c */
        interrupt_init,                /* 初始化异常处理 – cpu/arm920t/s3c24x0/interrupt.c */
        env_init,                /* 初始化环境变量 – common/cmd_flash.c*/
        init_baudrate,                /* 初始化波特率设置  -- lib_arm/board.c */
        serial_init,                /* 串口通讯设置  --cpu/arm920t/s3c24x0/serial.c */
        console_init_f,                /* 控制台初始化阶段1 –common/console.c*/
        display_banner,                /* 打印u-boot信息  --lib_arm/board.c*/
#if defined(CONFIG_DISPLAY_CPUINFO)
        print_cpuinfo,                /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
        checkboard,                /* display board info */
#endif
        dram_init,                /* 配置可用的RAM  --board/smdk2410/smdk2410.c */
        display_dram_config,  /*显示RAM的配置大小 – lib_arm/board.c */
        NULL,
};

3.
u-boot移植过程3.1.
准备工作俗话说工欲善其事,必先利其器。在移植u-boot之前,第一步要做的事情就是要搭建移植过程所必需的软硬件环境。
3.1.1.
软件环境操作系统:Red Hat 9.0 
虚拟机:VMware5.5 workstation
交叉编译器:ELDK4.1
U-Boot源码:u-boot-1.2.0
烧写软件:sjf2410或者JFlash
3.1.2.
硬件环境PC机
目标开发板
串口线
网线
JTAG下载线
3.1.3.
目标板的硬件构架我们要清楚地掌握目标板的硬件配置,如CPU体系结构;FALSH,SDRAM的型号;串口和以太网控制芯片;运行前和运行过程内存空间的映射关系;目标板的启动方式等等。可以参阅目标板的数据手册获得这些方面的相关信息。
以Samsung S3c2410开发板为例。
CPU: arm920t
SoC: S3C2410
SDRAM: HY57V561620
Nand flash: K9F1208U0B(64M)
以太网芯片: CS8900A(10M/100MB)
S3C2410复位后内存映射图如下:


3.2.
移植步骤U-Boot能够支持多种体系结构的处理器,支持的开发板也越来越多。因为Bootloader是完全依赖硬件平台的,所以在新电路板上需要移植U-Boot程序。
开始移植U-Boot之前,先要熟悉硬件电路板和处理器。确认U-Boot是否已经支持新开发板的处理器和I/O设备。假如U-Boot已经支持一块非常相似的电路板,那么移植的过程将非常简单。
移植U-Boot工作就是添加开发板硬件相关的文件、配置选项,然后配置编译。
开始移植之前,需要先分析一下U-Boot已经支持的开发板,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围接口。还要验证一下这个参考开发板的U-Boot,至少能够配置编译通过。
以S3C2410处理器的开发板为例,U-Boot-1.1.2版本已经支持SMDK2410开发板。我们可以基于SMDK2410移植,那么先把SMDK2410编译通过。
我们以基于S3C2410SoC的开发板fs2410为例说明。移植的过程参考SMDK2410开发板,SMDK2410在U-Boot-1.1.2中已经支持。
移植U-Boot的基本步骤如下。
(1)在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。
smdk2410_config   :       unconfig
         @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
参考上面2行,添加下面2行。
fs2410_config   :       unconfig
      @./mkconfig $(@:_config=) arm arm920t fs2410 NULL s3c24x0
(2)创建一个新目录存放开发板相关的代码,并且添加文件。
board/fs2410/config.mk
board/fs2410/flash.c
board/fs2410/fs2410.c
board/fs2410/Makefile
board/fs2410/lowlevel_init.S
board/fs2410/u-boot.lds
(3)为开发板添加新的配置文件
可以先复制参考开发板的配置文件,再修改。例如:
$cp include/configs/smdk2410.h  include/configs/fs2410.h
如果是为一颗新的CPU移植,还要创建一个新的目录存放CPU相关的代码。
(4)配置开发板
$ make fs2410_config
(5)编译U-Boot
执行make命令,编译成功可以得到U-Boot映像。有些错误是跟配置选项是有关系的,通常打开某些功能选项会带来一些错误,一开始可以尽量跟参考板配置相同。
(6)添加驱动或者功能选项
在能够编译通过的基础上,就可以根据目标板和实际开发需要,实现U-Boot的以太网接口、Flash擦写、LCD、NVRAM等一些其它功能。
由于FS2410开发板的以太网驱动和smdk2410完全相同,所以可以直接使用。CS8900驱动程序文件如下。
drivers/cs8900.c
drivers/cs8900.h
如果目标板上的以太网控制器xxx与参考板上的不同,按照以下的步骤添加网卡驱动。
①查找对应于开发板上的以太网控制器的驱动程序,如果可以找到万事大吉,否则自己编写。
②拷贝驱动程序到drivers目录下,如:drivers/xxx.c
drivers/xxx.h
③在drivers/Makefile 里添加目标文件 xxx.o
④将lib_arm/board.c文件中所有的cs8900换成xxx 也就是
cs8900=〉xxx
⑤在include/configs/fs2410..h中加入以下几句
#define xxx_BASE >>>>
#define xxx_BUS16 1
#define CONFIG_ETHADDR
>>:>>:>>:>>:>>:>>
#define CONFIG_NETMASK
>>.>>.>>.>>
#define CONFIG_IPADDR
>>.>>.>>.>>
#define CONFIG_SERVERIP
>>.>>.>>.>>

对于Flash的选择就麻烦多了,Flash芯片价格或者采购方面的因素都有影响。多数开发板大小、型号不都相同。所以还需要移植Flash的驱动。每种开发板目录下一般都有flash.c这个文件,需要根据具体的Flash类型修改。例如:
board/fs2410/flash.c
(7)添加命令
为了方便以后的某项操作,如kernel的更新,需要将新编译的kernel写入flash中,这是u-boot提供的flash擦除和写入命令就能够很好完成这项工作。当然u-boot已经提供了许多常用的命令,如上面提到的flash擦、写命令。尽管如此,不管出于什么目的,我们还是可以定义我们自己的命令。
原理:
每个命令都有一个命令结构体
struct cmd_tbl_s {
char*name;  /* Command Name*/
intmaxargs; /* maximum number of arguments*/
intrepeatable; /* autorepeat allowed?*/
int       (*cmd)(struct cmd_tbl_s *, int, int, char *[]);  /* Implementation function*/
char*usage;/* Usage message(short)*/
char*help;/* Help  message(long)*/
};
Cmd为要调用的命令函数,name为该命令名字符串。 
在u-boot里面有这样的宏
#define Struct_Section  __attribute__ ((unused,section ('.u_boot_cmd'))) 
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, 
help} 
宏U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)就是将
cmd_tbl_s{
ame,
maxargs,
rep,
cmd,
usage,
help
}
这样的一个命令结构体放入内存.u_boot_cmd这个区域,.u_boot_cmd这个域在board/smdk2410/u-boot.lds中定义。在U-boot中的shell中,根据用户输入的命令,就会在.u_boot_cmd这个内存区域中查找,当.u_boot_cmd中某一个cmd_tbl_s命令结构体的cmd_tbl_s.name和输入的命令字符串相符时,就调用该命令结构体的cmd_tbl_s.cmd( ….)函数。 
下面以添加USB下载命令为例介绍如何添加命令。
①在include/configs/smdk2410.h中的CONFIG_COMMANDS中增加一项:CFG_CMD_USBLOAD, 
/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL | \
CFG_CMD_CACHE | \
CFG_CMD_NET | \
CFG_CMD_ENV | \
CFG_CMD_FLASH | \
CFG_CMD_PING | \
CFG_CMD_NAND | \
/*CFG_CMD_EEPROM |*/ \
/*CFG_CMD_I2C |*/ \
/*CFG_CMD_USB |*/ \
CFG_CMD_REGINFO  | \
CFG_CMD_DATE | \
CFG_CMD_USBLOAD |\
CFG_CMD_ELF) 
②在include/cmd_confdefs.h中加入命令标志位 
#define CFG_CMD_USBLOAD0 x00000055ULL (可以是其它值,不冲突就好) 
③在common\下面加入usbload.c
框架如下 
#If(CONFIG_COMMANDS & CFG_CMD_USBLOAD) 
Int usb_load(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[ ] )
{    …………………. 

U_BOOT_CMD{
Usbload,
2,

1,
usb_load,
“usb load img file”,
“This is a test”
};
#endif 
④在common/Makefile 添加要编译的目标文件。
⑤重新编译u-boot。
(8)调试U-Boot源代码,直到U-Boot在开发板上能够正常启动。
3.3.
主要涉及修改的文件从移植U-Boot最小要求,U-Boot能正常启动的角度出发,主要考虑修改如下文件。
①<目标板>.h头文件,如include/configs/smdk2410.h。可以是U-BOOt源码中已有的目标板头文件,也可以是新命名的配置头文件;大多数的寄存器参数都是在这一文件中设置完成的。
②<目标板>.c文件,如board/smdk2410/smdk2410.c。它是SDRAM的驱动程序,主要完成SDRAM的UPM表设置,上电初始化。
③Flash的驱动程序,如board/smdk2410/flash.c或common/eft-flash.c。可在参考已有Flash驱动的基础上,结合目标板Flash数据手册,进行适当修改;
④串口驱动,如修改cpu/arm920t/s3c24x0/serial.c串口收发器芯片使能部分。
3.4.
移植要点①
u—Boot移植参考板,这是进行u-boot移植首先要明确的。可以根据目标板上CPU、Flash、SDRAM的情况,以尽可能相一致为原则,先找出一个与所移植目标板为同一个或同一系列处理器的u-Boot支持板为移植参考板。如上面提到fs2410板可选择U-Boot源码中smdk2410板作为U-Boot移植参考板。对U-Boot移植新手,建议依照循序渐进的原则,目标板文件名暂时先用移植参考板的名称,在逐步熟悉U-Boot移植基础上,再考虑给目标板重新命名。在实际移植过程中,可用Linux命令查找移植参考板的特定代码,如grep -r sm2410 ./ 可确定出在U-Boot中与smdk2410板有关的代码,依此对照目标板实际进行屏蔽或修改。同时,应不局限于移植参考板中的代码,要广泛借鉴U-Boot中已有的代码,更好地实现一些具体的功能。

U-Boot烧写地址。不同目标板,对U-Boot在Flash中存放地址的要求不尽相同。事实上,这是由处理器中断复位向量来决定的,与主板硬件相关。对MPC8XX主板来讲,就是由硬件配置字(HRCW)决定的。也就是说,U-Boot烧写具体位置是由硬件决定的,而不是程序设计来选择的。程序中相应u-Boot起始地址必须与硬件所确定的硬件复位向量相吻合,如RPXlite DW板的中断复位向量设置为0x00000100。因此,U-Boot的BIN镜像文件必须烧写到Flash的起始位置。事实上,大多数的PPC系列的处理器中断复位向量是0x00000100和0xfff00100。这也是一般所说的高位启动和低位启动的Bootloader所在位置。可通过修改u-boot源码<目标板>.h头文件中CFG_MONITOR_BASE和board/<目标板>/config.mk中的TEXT_BASE的设置来与硬件配置相对应。

CPU寄存器参数设置。根据处理器系列、类型不同,寄存器名称与作用有一定差别,必须根据目标板的实际进行合理配置。一个较为可行和有效的方法是,借鉴参考移植板的配置,再根据目标板实际,进行合理修改。这是一个较费功夫和考验耐力的过程。需要仔细对照处理器各寄存器定义、参考设置、目标板实际作出选择并不断测试。

串口调试。能从串口输出信息,即使是乱码,也可以说U-Boot移植取得了实质性突破。串口是否有输出,除了与串口驱动相关外,还与Flash相关的寄存器设置有关。因为u-boot是从Flash中被引导启动的,如果Flash设置不正确,U-Boot代码读取和执行就会出现一些问题。因此,还需要就Flash的相关寄存器设置进行一些参数调试。同时,要注意串口收发芯片相关引脚工作波形。

与启动Flash相关的寄存器BR0、OR0的参数设置,应根据目标板Flash的数据手册与BR0和OR0的相关位含义进行合理设置。这不仅关系到Flash能否正常工作,而且与串口调试有直接的关联。

SDRAM的驱动。串口能输出以后,u-Boot移植是否顺利基本取决于SDRAM的驱动是否正确。与串口调试相比,这部分工作更为重要,难度更大。MPC8xx目标板SDRAM驱动涉及三部分。一是相关寄存器的设置;二是UPM表;三是SDRAM上电初始化过程。任何一部分有问题,都会影响U-Boot、嵌入式操作系统甚至应用程序的稳定、可靠运行。所以说,SDRAM的驱动不仅关系到U-Boot本身能否正常运行,而且还与后续部分相关,是相当关键的部分。

4.
举例说明(JK2410)这部分将详细介绍u-boot-1.1.3到JK2410目标板的移植过程。
4.1.
JK2410目标板的硬件组成Samsung S3c2410
 JK2410
 u-boot-1.1.3支持
 
CPU
 Arm920t
 √
 
SoC
 S3C2410
 √
 
SDRAM
 Samsung K4s5616323C (64M)
 √
 
Nand lash
 Samsung K9F1208U0B (64M)
 ?
 
NOR flash
 AMD AM29LV800 (1M)
 √
 
Ethernet
 CS8900A(10M/100MB)
 √
 
LCD /DMA LCD-dedicated
 Samsung 2.83’’ TFT 
 ?
 
UART
 
 ?
 
MMU
 
 ?
 
SD&MMC
 
 √
 
GPIO
 
 ?
 
PLL
 
 ?
 
PWM
 
 ?
 
……
 
 
 
4.2.
U-Boot-1.1.3-JK2410-r3移植过程这一部分将按照3.2节介绍的u-boot移植步骤详细分析移植U-Boot-1.1.3到开发板JK2410的过程。
首先选择参考板。由于JK2410是参考SMDK2410开发板设计的培训用板,CPU都是arm920t,基本的硬件配置相同,所以选择SMDK2410作为开发板,这符合参考板选择标准。由于u-boot从1.1.2版本开始支持smdk2410,所以只要选择u-boot-1.1.2或以后的版本都可以基本满足需求。这里Jollen选择u-boot-1.1.3。
移植U-Boot的基本步骤如下。
(1)在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。
smdk2410_config   :       unconfig
         @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
参考上面2行,添加下面2行。
JK2410_config   :       unconfig
      @./mkconfig $(@:_config=) arm arm920t JK2410 NULL s3c24x0
(2)创建一个新目录存放开发板相关的代码,并且添加文件。
board/JK2410/config.mk
board/JK2410/flash.c
board/JK2410/JK2410.c
board/JK2410/Makefile
board/JK2410/lowlevel_init.S
board/JK2410/u-boot.lds
(3)为开发板添加新的配置文件
可以先复制参考开发板的配置文件,再修改。例如:
$cp include/configs/smdk2410.h  include/configs/JK2410.h
由于都是采用arm920t CPU所以不需要建立新的目录存放CPU相关的代码。
(4)配置开发板
$ make JK2410_config
(5)编译U-Boot
执行make命令,编译成功可以得到U-Boot映像。
(6)添加驱动或者功能选项
       由4.1节目标板的硬件配置知道开发板需要添加的功能有以下几个方面:
a.
LCD驱动端口的设置
b.
Boot **的添加
c.

U-boot中Nand flash驱动的配置
d.
MMU功能添加
下面详细介绍功能添加过程

Include/configs/jk2410.h

/* Nand flash Boot 声明 */
#define
CONFIG_JK2410
1
/* #undef
CONFIG_JK2410_EXTUART
In the future, there will be an external UART */
// NAND boot is came from vivi.
#define CONFIG_NAND_BOOT

/* LCD && MMU声明
*/
// jollen: LCD Panel (TFT)
#define
CONFIG_LCD
#define 
CONFIG_LCD_**
#define
CONFIG_LCD_INFO
#define USE_920T_MMU
/*

jollen: Use 920T MMU means that the Dcache function will be used, but it doesn't mean that

the MMU will be turned off/off during boot sequence.

See cpu/arm920t/cpu.c.
*/

/* 打开CFG_CMD_NAND CFG_CMD_JFFS2命令项 */
由于提供了从Nand Flash 启动功能,则也同时学要提供相应的对Nand Flash操作的命令;开发板portingJFFS文件系统,所以要提供相应的对JFFS2操作的命令。
#define CONFIG_COMMANDS \

(CONFIG_CMD_DFL
| \

CFG_CMD_CACHE
| \

CFG_CMD_NAND
| \

/*CFG_CMD_EEPROM |*/ \

/*CFG_CMD_I2C
|*/ \

/*CFG_CMD_USB
|*/ \

CFG_CMD_JFFS2
| \

CFG_CMD_REGINFO
| \

CFG_CMD_DATE
| \

CFG_CMD_ELF)
/* 重新组织物理内存映射图
*/
#define CONFIG_NR_DRAM_BANKS
1
/* we have 1 bank of DRAM */
#define PHYS_SDRAM_1
0x30000000 /* SDRAM Bank #1 */

#ifdef CONFIG_LCD
#define PHYS_SDRAM_1_SIZE
0x04000000 /* 64 MB */
#define PHYS_FB_BASE
0x33f00000
#ifdef CONFIG_NAND_BOOT // 2006/8/21
#define PHYS_FB_SIZE
1 * 1024 * 1024 /* FB: 1M bytes */
#define STACK_BASE
PHYS_FB_BASE + PHYS_FB_SIZE
#else
#define PHYS_FB_SIZE
4 * 1024 *1024 /* FB: 4M Bytes (max) */
#endif // CONFIG_NAND_BOOT
#else
#define PHYS_SDRAM_1_SIZE
0x04000000 /* 64 MB */
#endif

/* 声明NOR Flash 为AMD AM29LV800
*/
#define CONFIG_AMD_LV800
1


/* LCD端口设置
*/
Register

LCDCON1
LCD Control 1
[word, R/W, 0x00000000]

LCDCON2
LCD Control 2
[word, R/W, 0x00000000]

LCDCON3
LCD Control 3
[word, R/W, 0x00000000]

LCDCON4
LCD Control 4
[word, R/W, 0x00000000]

LCDCON5
LCD Control 5
[word, R/W, 0x00000000]

LCDADDR1
STN/TFT: Frame Buffer Start Addr1
[word, R/W, 0x00000000]

LCDADDR2
STN/TFT: Frame Buffer Start Addr2
[word, R/W, 0x00000000]

LCDADDR3
STN/TFT: Virtual Screen Address Set
[word, R/W, 0x00000000]

REDLUT
STN: Red Lookup Table
[word, R/W, 0x00000000]

GREENLUT
STN: Green Lookup Table
[word, R/W, 0x00000000]

BLUELUT
STN: Blue Lookup Table
[word, R/W, 0x0000]

DP1_2
STN: Dithering Pattern Duty 1/2
[word, R/W]

DP4_7
STN: Dithering Pattern Duty 4/7
[word, R/W]

DP3_5
STN: Dithering Pattern Duty 3/5
[word, R/W]

DP2_3
STN: Dithering Pattern Duty 2/3
[word, R/W]

DP5_7
STN: Dithering Pattern Duty 5/7
[word, R/W]

DP3_4
STN: Dithering Pattern Duty 3/4
[word, R/W]

DP4_5
STN: Dithering Pattern Duty 4/5
[word, R/W]

DP6_7
STN: Dithering Pattern Duty 6/7
[word, R/W]

DITHMODE
STN: Dithering Mode
[word, R/W, 0x00000000]

TPAL
TFT: Temporary Pallete
[word, R/W, 0x00000000]

*

*/

#define bLCD_CTL(Nb)
__REG(0x4d000000 + (Nb))
#define rLCDCON1
bLCD_CTL(0x00)
#define rLCDCON2
bLCD_CTL(0x04)
#define rLCDCON3
bLCD_CTL(0x08)
#define rLCDCON4
bLCD_CTL(0x0c)
#define rLCDCON5
bLCD_CTL(0x10)
#define rLCDADDR1
bLCD_CTL(0x14)
#define rLCDADDR2
bLCD_CTL(0x18)
#define rLCDADDR3
bLCD_CTL(0x1c)
#define rREDLUT
bLCD_CTL(0x20)
#define rGREENLUT
bLCD_CTL(0x24)
#define rBLUELUT
bLCD_CTL(0x28)
#define rDITHMODE
bLCD_CTL(0x4c)
#define rTPAL
bLCD_CTL(0x50)
#define rLCDINTPND
bLCD_CTL(0x54)
#define rLCDSRCPND
bLCD_CTL(0x58)
#define rLCDINTMSK
bLCD_CTL(0x5c)
#define rLCDLPCSEL
bLCD_CTL(0x60)

#define fLCD1_LINECNT
Fld(10,18)
/* the status of the line counter */
#define LCD1_LINECNT
FMsk(fLCD_LINECNT)

#define fLCD1_CLKVAL
Fld(10,8)
/* rates of VCLK and CLKVAL[9:0] */
#define LCD1_CLKVAL(x)
FInsrt((x), fLCD1_CLKVAL)
#define LCD1_CLKVAL_MSK
FMask(fLCD1_CLKVAL)

#define LCD1_MMODE (1<<7)

#define fLCD1_PNR
Fld(2,5)
/* select the display mode */
#define LCD1_PNR_4D
FInsrt(0x0, fLCD1_PNR)
/* STN: 4-bit dual scan */
#define LCD1_PNR_4S
FInsrt(0x1, fLCD1_PNR)
/* STN: 4-bit single scan */
#define LCD1_PNR_8S
FInsrt(0x2, fLCD1_PNR)
/* STN: 8-bit single scan */
#define LCD1_PNR_TFT
FInsrt(0x3, fLCD1_PNR)
/* TFT LCD */

#define fLCD1_BPP
Fld(4,1)
/* select BPP(Bit Per Pixel) */
#define LCD1_BPP_1S
FInsrt(0x0, fLCD1_BPP)
/* STN: 1 bpp, mono */
#define LCD1_BPP_2S
FInsrt(0x1, fLCD1_BPP)
/* STN: 2 bpp, 4-grey */
#define LCD1_BPP_4S
FInsrt(0x2, fLCD1_BPP)
/* STN: 4 bpp, 16-grey */
#define LCD1_BPP_8S
FInsrt(0x3, fLCD1_BPP)
/* STN: 8 bpp, color */
#define LCD1_BPP_12S
FInsrt(0x4, fLCD1_BPP)
/* STN: 12 bpp, color */
#define LCD1_BPP_1T
FInsrt(0x8, fLCD1_BPP)
/* TFT: 1 bpp */
#define LCD1_BPP_2T
FInsrt(0x9, fLCD1_BPP)
/* TFT: 2 bpp */
#define LCD1_BPP_4T
FInsrt(0xa, fLCD1_BPP)
/* TFT: 4 bpp */
#define LCD1_BPP_8T
FInsrt(0xb, fLCD1_BPP)
/* TFT: 8 bpp */
#define LCD1_BPP_16T
FInsrt(0xc, fLCD1_BPP)
/* TFT: 16 bpp */
…… ……
…… ……


Cpu/arm920t/Start.s
由于增加从Nand flash启动功能,u-boot启动第一阶段需要增加代码复制的程序段也就是copy_myself。具体语句不贴出来了。相应地也要做堆栈的修改。

Lib_arm/board.c
在u-boot启动第二阶段添加新增的板级配置的初始化项。
void board_postinit(void)
{
#ifdef CONFIG_JK2410
#undef CONFIG_S3C2410_NAND_BOOT

/* ports from vivi , by jollen.org */

/* NOTICE: not work for current framebuffer memory base address setting */

/* This is a TODO issue. */

//mem_map_init();

//mmu_init();
#endif


#ifdef
JK2410_DEBUG

printf('%s: ',
__FUNCTION__);
#endif

board_ioportinit();

#ifdef CONFIG_LCD

lcd_enable();

lcd_boot_**();
#endif
#if
defined(CONFIG_JK2410) && defined(CONFIG_PLL_DEBUG)

jk2410_show_PLLCLK();
#endif

}

编译调试直至实现所有功能为止。

相关帖子

沙发
lpc2410| | 2009-7-9 14:07 | 只看该作者

写的不错,楼上的辛苦了

使用特权

评论回复
板凳
tmake| | 2009-7-11 14:15 | 只看该作者

好复杂啊

使用特权

评论回复
地板
bespecial| | 2009-11-21 18:02 | 只看该作者
现在还看不懂
收藏以后在看

使用特权

评论回复
5
linhai1986| | 2009-11-21 21:35 | 只看该作者
好长啊:dizzy:

使用特权

评论回复
6
linhai1986| | 2009-11-21 21:36 | 只看该作者
收藏了,慢慢看

使用特权

评论回复
7
xiaoxin1986| | 2009-11-22 00:22 | 只看该作者
这个也很长,收藏了

使用特权

评论回复
8
beny5566| | 2009-11-22 16:06 | 只看该作者
确实很长啊。

使用特权

评论回复
9
woshic23| | 2011-3-30 10:53 | 只看该作者
都是2410,怎么不弄点新鲜的

使用特权

评论回复
10
maoyanketi| | 2011-3-30 20:46 | 只看该作者
uboot不会啊!

使用特权

评论回复
11
woshic23| | 2011-4-1 18:47 | 只看该作者
要做一块TI A8的板子,不知道uboot移植与ARM9的不同之处在哪,有做过的给点建议吧!!谢谢!!!!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

150

帖子

0

粉丝