接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
} ④ 编译调试直至实现所有功能为止。
|
|