接u-boot学习报告(上)<br /><br />2. Board.c<br />源码位置:lib_arm/board.c<br />运行位置:SDRAM<br />描述:start_armboard()是u-boot运行的第一个c语言函数,完成系统的初始化工作,进入主循环,处理用户的命令。<br />void start_armboot (void)<br />{<br /> init_fnc_t **init_fnc_ptr;<br /> char *s;<br />#ifndef CFG_NO_FLASH<br /> ulong size;<br />#endif<br />#if defined(CONFIG_VFD) || defined(CONFIG_LCD)<br /> unsigned long addr;<br />#endif<br /><br /> /* Pointer is writable since we allocated a register for it */<br /> gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));<br /> /* compiler optimization barrier needed for GCC >= 3.4 */<br /> __asm__ __volatile__('': : :'memory');<br /><br /> memset ((void*)gd, 0, sizeof (gd_t));<br /> gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));<br /> memset (gd->bd, 0, sizeof (bd_t));<br /><br /> monitor_flash_len = _bss_start - _armboot_start;<br /><br /><br />/* 顺序执行init_sequence数组中的初始化函数 */<br /> for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {<br /> if ((*init_fnc_ptr)() != 0) {<br /> hang ();<br /> }<br /> }<br /><br />#ifndef CFG_NO_FLASH<br /> /* 配置可用的Flash*/<br /> size = flash_init ();<br /> display_flash_config (size);<br />#endif /* CFG_NO_FLASH */<br /><br />#ifdef CONFIG_VFD<br /># ifndef PAGE_SIZE<br /># define PAGE_SIZE 4096<br /># endif<br /> /*<br /> * reserve memory for VFD display (always full pages)<br /> */<br /> /* bss_end is defined in the board-specific linker script */<br /> addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);<br /> size = vfd_setmem (addr);<br /> gd->fb_base = addr;<br />#endif /* CONFIG_VFD */<br /><br />#ifdef CONFIG_LCD<br /># ifndef PAGE_SIZE<br /># define PAGE_SIZE 4096<br /># endif<br /> /*<br /> * reserve memory for LCD display (always full pages)<br /> */<br /> /* bss_end is defined in the board-specific linker script */<br /> addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);<br /> size = lcd_setmem (addr);<br /> gd->fb_base = addr;<br />#endif /* CONFIG_LCD */<br /><br /> /* armboot_start 在u-boot.lds连接脚本中定义*/<br /> mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);<br /><br />#if (CONFIG_COMMANDS & CFG_CMD_NAND)<br /> puts ('NAND: ');<br /> nand_init(); /* go init the NAND */<br />#endif<br /><br />#ifdef CONFIG_HAS_DATAFLASH<br /> AT91F_DataflashInit();<br /> dataflash_print_info();<br />#endif<br /><br /> /* initialize environment */<br /> env_relocate ();<br /><br />#ifdef CONFIG_VFD<br /> /* must do this after the framebuffer is allocated */<br /> drv_vfd_init();<br />#endif /* CONFIG_VFD */<br /><br /> /* IP Address */<br /> gd->bd->bi_ip_addr = getenv_IPaddr ('ipaddr');<br /><br /> /* MAC Address */<br /> {<br /> int i;<br /> ulong reg;<br /> char *s, *e;<br /> char tmp[64];<br /><br /> i = getenv_r ('ethaddr', tmp, sizeof (tmp));<br /> s = (i > 0) ? tmp : NULL;<br /><br /> for (reg = 0; reg < 6; ++reg) {<br /> gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;<br /> if (s)<br /> s = (*e) ? e + 1 : e;<br /> }<br /><br />#ifdef CONFIG_HAS_ETH1<br /> i = getenv_r ('eth1addr', tmp, sizeof (tmp));<br /> s = (i > 0) ? tmp : NULL;<br /><br /> for (reg = 0; reg < 6; ++reg) {<br /> gd->bd->bi_enet1addr[reg] = s ? simple_strtoul (s, &e, 16) : 0;<br /> if (s)<br /> s = (*e) ? e + 1 : e;<br /> }<br />#endif<br /> }<br /><br /> devices_init (); /* get the devices list going. */<br /><br />#ifdef CONFIG_CMC_PU2<br /> load_sernum_ethaddr ();<br />#endif /* CONFIG_CMC_PU2 */<br /><br /> jumptable_init ();<br /><br /> console_init_r (); /* fully init console as a device */<br /><br />#if defined(CONFIG_MISC_INIT_R)<br /> /* miscellaneous platform dependent initialisations */<br /> misc_init_r ();<br />#endif<br /><br /> /* enable exceptions */<br /> enable_interrupts ();<br /><br /> /* Perform network card initialisation if necessary */<br />#ifdef CONFIG_DRIVER_CS8900<br /> cs8900_get_enetaddr (gd->bd->bi_enetaddr);<br />#endif<br /><br />#if defined(CONFIG_DRIVER_SMC91111)||defined (CONFIG_DRIVER_LAN91C96)<br /> if (getenv ('ethaddr')) {<br /> smc_set_mac_addr(gd->bd->bi_enetaddr);<br /> }<br />#endif /* CONFIG_DRIVER_SMC91111 || CONFIG_DRIVER_LAN91C96 */<br /><br /> /* Initialize from environment */<br /> if ((s = getenv ('loadaddr')) != NULL) {<br /> load_addr = simple_strtoul (s, NULL, 16);<br /> }<br />#if (CONFIG_COMMANDS & CFG_CMD_NET)<br /> if ((s = getenv ('bootfile')) != NULL) {<br /> copy_filename (BootFile, s, sizeof (BootFile));<br /> }<br />#endif /* CFG_CMD_NET */<br /><br />#ifdef BOARD_LATE_INIT<br /> board_late_init ();<br />#endif<br />#if (CONFIG_COMMANDS & CFG_CMD_NET)<br />#if defined(CONFIG_NET_MULTI)<br /> puts ('Net: ');<br />#endif<br /> eth_initialize(gd->bd);<br />#endif<br /> /* main_loop() can return to retry autoboot, if so just run it again. */<br /> for (;;) {<br /> main_loop ();<br /> }<br /><br /> /* NOTREACHED - no way out of command loop except booting */<br />}<br /><br />3. Init_sequence[]<br />Init_sequence数组中保存系统启动过程顺序初始化的函数指针。<br />init_fnc_t *init_sequence[] = {<br /> cpu_init, /* 基本处理器相关配置 -- cpu/arm920t/cpu.c */<br /> board_init, /* 基本的板级相关配置—board/smdk2410/smdk2410.c */<br /> interrupt_init, /* 初始化异常处理 – cpu/arm920t/s3c24x0/interrupt.c */<br /> env_init, /* 初始化环境变量 – common/cmd_flash.c*/<br /> init_baudrate, /* 初始化波特率设置 -- lib_arm/board.c */<br /> serial_init, /* 串口通讯设置 --cpu/arm920t/s3c24x0/serial.c */<br /> console_init_f, /* 控制台初始化阶段1 –common/console.c*/<br /> display_banner, /* 打印u-boot信息 --lib_arm/board.c*/<br />#if defined(CONFIG_DISPLAY_CPUINFO)<br /> print_cpuinfo, /* display cpu info (and speed) */<br />#endif<br />#if defined(CONFIG_DISPLAY_BOARDINFO)<br /> checkboard, /* display board info */<br />#endif<br /> dram_init, /* 配置可用的RAM --board/smdk2410/smdk2410.c */<br /> display_dram_config, /*显示RAM的配置大小 – lib_arm/board.c */<br /> NULL,<br />};<br /><br />3.<br />u-boot移植过程3.1.<br />准备工作俗话说工欲善其事,必先利其器。在移植u-boot之前,第一步要做的事情就是要搭建移植过程所必需的软硬件环境。<br />3.1.1.<br />软件环境操作系统:Red Hat 9.0 <br />虚拟机:VMware5.5 workstation<br />交叉编译器:ELDK4.1<br />U-Boot源码:u-boot-1.2.0<br />烧写软件:sjf2410或者JFlash<br />3.1.2.<br />硬件环境PC机<br />目标开发板<br />串口线<br />网线<br />JTAG下载线<br />3.1.3.<br />目标板的硬件构架我们要清楚地掌握目标板的硬件配置,如CPU体系结构;FALSH,SDRAM的型号;串口和以太网控制芯片;运行前和运行过程内存空间的映射关系;目标板的启动方式等等。可以参阅目标板的数据手册获得这些方面的相关信息。<br />以Samsung S3c2410开发板为例。<br />CPU: arm920t<br />SoC: S3C2410<br />SDRAM: HY57V561620<br />Nand flash: K9F1208U0B(64M)<br />以太网芯片: CS8900A(10M/100MB)<br />S3C2410复位后内存映射图如下:<br /><br /><br />3.2.<br />移植步骤U-Boot能够支持多种体系结构的处理器,支持的开发板也越来越多。因为Bootloader是完全依赖硬件平台的,所以在新电路板上需要移植U-Boot程序。<br />开始移植U-Boot之前,先要熟悉硬件电路板和处理器。确认U-Boot是否已经支持新开发板的处理器和I/O设备。假如U-Boot已经支持一块非常相似的电路板,那么移植的过程将非常简单。<br />移植U-Boot工作就是添加开发板硬件相关的文件、配置选项,然后配置编译。<br />开始移植之前,需要先分析一下U-Boot已经支持的开发板,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围接口。还要验证一下这个参考开发板的U-Boot,至少能够配置编译通过。<br />以S3C2410处理器的开发板为例,U-Boot-1.1.2版本已经支持SMDK2410开发板。我们可以基于SMDK2410移植,那么先把SMDK2410编译通过。<br />我们以基于S3C2410SoC的开发板fs2410为例说明。移植的过程参考SMDK2410开发板,SMDK2410在U-Boot-1.1.2中已经支持。<br />移植U-Boot的基本步骤如下。<br />(1)在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。<br />smdk2410_config : unconfig<br /> @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0<br />参考上面2行,添加下面2行。<br />fs2410_config : unconfig<br /> @./mkconfig $(@:_config=) arm arm920t fs2410 NULL s3c24x0<br />(2)创建一个新目录存放开发板相关的代码,并且添加文件。<br />board/fs2410/config.mk<br />board/fs2410/flash.c<br />board/fs2410/fs2410.c<br />board/fs2410/Makefile<br />board/fs2410/lowlevel_init.S<br />board/fs2410/u-boot.lds<br />(3)为开发板添加新的配置文件<br />可以先复制参考开发板的配置文件,再修改。例如:<br />$cp include/configs/smdk2410.h include/configs/fs2410.h<br />如果是为一颗新的CPU移植,还要创建一个新的目录存放CPU相关的代码。<br />(4)配置开发板<br />$ make fs2410_config<br />(5)编译U-Boot<br />执行make命令,编译成功可以得到U-Boot映像。有些错误是跟配置选项是有关系的,通常打开某些功能选项会带来一些错误,一开始可以尽量跟参考板配置相同。<br />(6)添加驱动或者功能选项<br />在能够编译通过的基础上,就可以根据目标板和实际开发需要,实现U-Boot的以太网接口、Flash擦写、LCD、NVRAM等一些其它功能。<br />由于FS2410开发板的以太网驱动和smdk2410完全相同,所以可以直接使用。CS8900驱动程序文件如下。<br />drivers/cs8900.c<br />drivers/cs8900.h<br />如果目标板上的以太网控制器xxx与参考板上的不同,按照以下的步骤添加网卡驱动。<br />①查找对应于开发板上的以太网控制器的驱动程序,如果可以找到万事大吉,否则自己编写。<br />②拷贝驱动程序到drivers目录下,如:drivers/xxx.c<br />drivers/xxx.h<br />③在drivers/Makefile 里添加目标文件 xxx.o<br />④将lib_arm/board.c文件中所有的cs8900换成xxx 也就是<br />cs8900=〉xxx<br />⑤在include/configs/fs2410..h中加入以下几句<br />#define xxx_BASE >>>><br />#define xxx_BUS16 1<br />#define CONFIG_ETHADDR<br />>>:>>:>>:>>:>>:>><br />#define CONFIG_NETMASK<br />>>.>>.>>.>><br />#define CONFIG_IPADDR<br />>>.>>.>>.>><br />#define CONFIG_SERVERIP<br />>>.>>.>>.>><br /><br />对于Flash的选择就麻烦多了,Flash芯片价格或者采购方面的因素都有影响。多数开发板大小、型号不都相同。所以还需要移植Flash的驱动。每种开发板目录下一般都有flash.c这个文件,需要根据具体的Flash类型修改。例如:<br />board/fs2410/flash.c<br />(7)添加命令<br />为了方便以后的某项操作,如kernel的更新,需要将新编译的kernel写入flash中,这是u-boot提供的flash擦除和写入命令就能够很好完成这项工作。当然u-boot已经提供了许多常用的命令,如上面提到的flash擦、写命令。尽管如此,不管出于什么目的,我们还是可以定义我们自己的命令。<br />原理:<br />每个命令都有一个命令结构体<br />struct cmd_tbl_s {<br />char*name; /* Command Name*/<br />intmaxargs; /* maximum number of arguments*/<br />intrepeatable; /* autorepeat allowed?*/<br />int (*cmd)(struct cmd_tbl_s *, int, int, char *[]); /* Implementation function*/<br />char*usage;/* Usage message(short)*/<br />char*help;/* Help message(long)*/<br />};<br />Cmd为要调用的命令函数,name为该命令名字符串。 <br />在u-boot里面有这样的宏<br />#define Struct_Section __attribute__ ((unused,section ('.u_boot_cmd'))) <br />#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \<br />cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, <br />help} <br />宏U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)就是将<br />cmd_tbl_s{<br />ame,<br />maxargs,<br />rep,<br />cmd,<br />usage,<br />help<br />}<br />这样的一个命令结构体放入内存.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( ….)函数。 <br />下面以添加USB下载命令为例介绍如何添加命令。<br />①在include/configs/smdk2410.h中的CONFIG_COMMANDS中增加一项:CFG_CMD_USBLOAD, <br />/***********************************************************<br />* Command definition<br />***********************************************************/<br />#define CONFIG_COMMANDS \<br />(CONFIG_CMD_DFL | \<br />CFG_CMD_CACHE | \<br />CFG_CMD_NET | \<br />CFG_CMD_ENV | \<br />CFG_CMD_FLASH | \<br />CFG_CMD_PING | \<br />CFG_CMD_NAND | \<br />/*CFG_CMD_EEPROM |*/ \<br />/*CFG_CMD_I2C |*/ \<br />/*CFG_CMD_USB |*/ \<br />CFG_CMD_REGINFO | \<br />CFG_CMD_DATE | \<br />CFG_CMD_USBLOAD |\<br />CFG_CMD_ELF) <br />②在include/cmd_confdefs.h中加入命令标志位 <br />#define CFG_CMD_USBLOAD0 x00000055ULL (可以是其它值,不冲突就好) <br />③在common\下面加入usbload.c<br />框架如下 <br />#If(CONFIG_COMMANDS & CFG_CMD_USBLOAD) <br />Int usb_load(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[ ] )<br />{ …………………. <br />} <br />U_BOOT_CMD{<br />Usbload,<br />2,<br /><br />1,<br />usb_load,<br />“usb load img file”,<br />“This is a test”<br />};<br />#endif <br />④在common/Makefile 添加要编译的目标文件。<br />⑤重新编译u-boot。<br />(8)调试U-Boot源代码,直到U-Boot在开发板上能够正常启动。<br />3.3.<br />主要涉及修改的文件从移植U-Boot最小要求,U-Boot能正常启动的角度出发,主要考虑修改如下文件。<br />①<目标板>.h头文件,如include/configs/smdk2410.h。可以是U-BOOt源码中已有的目标板头文件,也可以是新命名的配置头文件;大多数的寄存器参数都是在这一文件中设置完成的。<br />②<目标板>.c文件,如board/smdk2410/smdk2410.c。它是SDRAM的驱动程序,主要完成SDRAM的UPM表设置,上电初始化。<br />③Flash的驱动程序,如board/smdk2410/flash.c或common/eft-flash.c。可在参考已有Flash驱动的基础上,结合目标板Flash数据手册,进行适当修改;<br />④串口驱动,如修改cpu/arm920t/s3c24x0/serial.c串口收发器芯片使能部分。<br />3.4.<br />移植要点①<br />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中已有的代码,更好地实现一些具体的功能。<br />②<br />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的设置来与硬件配置相对应。<br />③<br />CPU寄存器参数设置。根据处理器系列、类型不同,寄存器名称与作用有一定差别,必须根据目标板的实际进行合理配置。一个较为可行和有效的方法是,借鉴参考移植板的配置,再根据目标板实际,进行合理修改。这是一个较费功夫和考验耐力的过程。需要仔细对照处理器各寄存器定义、参考设置、目标板实际作出选择并不断测试。<br />④<br />串口调试。能从串口输出信息,即使是乱码,也可以说U-Boot移植取得了实质性突破。串口是否有输出,除了与串口驱动相关外,还与Flash相关的寄存器设置有关。因为u-boot是从Flash中被引导启动的,如果Flash设置不正确,U-Boot代码读取和执行就会出现一些问题。因此,还需要就Flash的相关寄存器设置进行一些参数调试。同时,要注意串口收发芯片相关引脚工作波形。<br />⑤<br />与启动Flash相关的寄存器BR0、OR0的参数设置,应根据目标板Flash的数据手册与BR0和OR0的相关位含义进行合理设置。这不仅关系到Flash能否正常工作,而且与串口调试有直接的关联。<br />⑥<br />SDRAM的驱动。串口能输出以后,u-Boot移植是否顺利基本取决于SDRAM的驱动是否正确。与串口调试相比,这部分工作更为重要,难度更大。MPC8xx目标板SDRAM驱动涉及三部分。一是相关寄存器的设置;二是UPM表;三是SDRAM上电初始化过程。任何一部分有问题,都会影响U-Boot、嵌入式操作系统甚至应用程序的稳定、可靠运行。所以说,SDRAM的驱动不仅关系到U-Boot本身能否正常运行,而且还与后续部分相关,是相当关键的部分。<br /><br />4.<br />举例说明(JK2410)这部分将详细介绍u-boot-1.1.3到JK2410目标板的移植过程。<br />4.1.<br />JK2410目标板的硬件组成Samsung S3c2410<br /> JK2410<br /> u-boot-1.1.3支持<br /> <br />CPU<br /> Arm920t<br /> √<br /> <br />SoC<br /> S3C2410<br /> √<br /> <br />SDRAM<br /> Samsung K4s5616323C (64M)<br /> √<br /> <br />Nand lash<br /> Samsung K9F1208U0B (64M)<br /> ?<br /> <br />NOR flash<br /> AMD AM29LV800 (1M)<br /> √<br /> <br />Ethernet<br /> CS8900A(10M/100MB)<br /> √<br /> <br />LCD /DMA LCD-dedicated<br /> Samsung 2.83’’ TFT <br /> ?<br /> <br />UART<br /> <br /> ?<br /> <br />MMU<br /> <br /> ?<br /> <br />SD&MMC<br /> <br /> √<br /> <br />GPIO<br /> <br /> ?<br /> <br />PLL<br /> <br /> ?<br /> <br />PWM<br /> <br /> ?<br /> <br />……<br /> <br /> <br /> <br />4.2.<br />U-Boot-1.1.3-JK2410-r3移植过程这一部分将按照3.2节介绍的u-boot移植步骤详细分析移植U-Boot-1.1.3到开发板JK2410的过程。<br />首先选择参考板。由于JK2410是参考SMDK2410开发板设计的培训用板,CPU都是arm920t,基本的硬件配置相同,所以选择SMDK2410作为开发板,这符合参考板选择标准。由于u-boot从1.1.2版本开始支持smdk2410,所以只要选择u-boot-1.1.2或以后的版本都可以基本满足需求。这里Jollen选择u-boot-1.1.3。<br />移植U-Boot的基本步骤如下。<br />(1)在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。<br />smdk2410_config : unconfig<br /> @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0<br />参考上面2行,添加下面2行。<br />JK2410_config : unconfig<br /> @./mkconfig $(@:_config=) arm arm920t JK2410 NULL s3c24x0<br />(2)创建一个新目录存放开发板相关的代码,并且添加文件。<br />board/JK2410/config.mk<br />board/JK2410/flash.c<br />board/JK2410/JK2410.c<br />board/JK2410/Makefile<br />board/JK2410/lowlevel_init.S<br />board/JK2410/u-boot.lds<br />(3)为开发板添加新的配置文件<br />可以先复制参考开发板的配置文件,再修改。例如:<br />$cp include/configs/smdk2410.h include/configs/JK2410.h<br />由于都是采用arm920t CPU所以不需要建立新的目录存放CPU相关的代码。<br />(4)配置开发板<br />$ make JK2410_config<br />(5)编译U-Boot<br />执行make命令,编译成功可以得到U-Boot映像。<br />(6)添加驱动或者功能选项<br /> 由4.1节目标板的硬件配置知道开发板需要添加的功能有以下几个方面:<br />a.<br />LCD驱动端口的设置<br />b.<br />Boot **的添加<br />c.<br /><br />U-boot中Nand flash驱动的配置<br />d.<br />MMU功能添加<br />下面详细介绍功能添加过程<br />①<br />Include/configs/jk2410.h<br /><br />/* Nand flash Boot 声明 */<br />#define<br />CONFIG_JK2410<br />1<br />/* #undef<br />CONFIG_JK2410_EXTUART<br />In the future, there will be an external UART */<br />// NAND boot is came from vivi.<br />#define CONFIG_NAND_BOOT<br /><br />/* LCD && MMU声明<br />*/<br />// jollen: LCD Panel (TFT)<br />#define<br />CONFIG_LCD<br />#define <br />CONFIG_LCD_**<br />#define<br />CONFIG_LCD_INFO<br />#define USE_920T_MMU<br />/*<br /><br />jollen: Use 920T MMU means that the Dcache function will be used, but it doesn't mean that<br /><br />the MMU will be turned off/off during boot sequence.<br /><br />See cpu/arm920t/cpu.c.<br />*/<br /><br />/* 打开CFG_CMD_NAND CFG_CMD_JFFS2命令项 */<br />由于提供了从Nand Flash 启动功能,则也同时学要提供相应的对Nand Flash操作的命令;开发板portingJFFS文件系统,所以要提供相应的对JFFS2操作的命令。<br />#define CONFIG_COMMANDS \<br /><br />(CONFIG_CMD_DFL<br />| \<br /><br />CFG_CMD_CACHE<br />| \<br /><br />CFG_CMD_NAND<br />| \<br /><br />/*CFG_CMD_EEPROM |*/ \<br /><br />/*CFG_CMD_I2C<br />|*/ \<br /><br />/*CFG_CMD_USB<br />|*/ \<br /><br />CFG_CMD_JFFS2<br />| \<br /><br />CFG_CMD_REGINFO<br />| \<br /><br />CFG_CMD_DATE<br />| \<br /><br />CFG_CMD_ELF)<br />/* 重新组织物理内存映射图<br />*/<br />#define CONFIG_NR_DRAM_BANKS<br />1<br />/* we have 1 bank of DRAM */<br />#define PHYS_SDRAM_1<br />0x30000000 /* SDRAM Bank #1 */<br /><br />#ifdef CONFIG_LCD<br />#define PHYS_SDRAM_1_SIZE<br />0x04000000 /* 64 MB */<br />#define PHYS_FB_BASE<br />0x33f00000<br />#ifdef CONFIG_NAND_BOOT // 2006/8/21<br />#define PHYS_FB_SIZE<br />1 * 1024 * 1024 /* FB: 1M bytes */<br />#define STACK_BASE<br />PHYS_FB_BASE + PHYS_FB_SIZE<br />#else<br />#define PHYS_FB_SIZE<br />4 * 1024 *1024 /* FB: 4M Bytes (max) */<br />#endif // CONFIG_NAND_BOOT<br />#else<br />#define PHYS_SDRAM_1_SIZE<br />0x04000000 /* 64 MB */<br />#endif<br /><br />/* 声明NOR Flash 为AMD AM29LV800<br />*/<br />#define CONFIG_AMD_LV800<br />1<br /><br /><br />/* LCD端口设置<br />*/<br />Register<br /><br />LCDCON1<br />LCD Control 1<br />[word, R/W, 0x00000000]<br /><br />LCDCON2<br />LCD Control 2<br />[word, R/W, 0x00000000]<br /><br />LCDCON3<br />LCD Control 3<br />[word, R/W, 0x00000000]<br /><br />LCDCON4<br />LCD Control 4<br />[word, R/W, 0x00000000]<br /><br />LCDCON5<br />LCD Control 5<br />[word, R/W, 0x00000000]<br /><br />LCDADDR1<br />STN/TFT: Frame Buffer Start Addr1<br />[word, R/W, 0x00000000]<br /><br />LCDADDR2<br />STN/TFT: Frame Buffer Start Addr2<br />[word, R/W, 0x00000000]<br /><br />LCDADDR3<br />STN/TFT: Virtual Screen Address Set<br />[word, R/W, 0x00000000]<br /><br />REDLUT<br />STN: Red Lookup Table<br />[word, R/W, 0x00000000]<br /><br />GREENLUT<br />STN: Green Lookup Table<br />[word, R/W, 0x00000000]<br /><br />BLUELUT<br />STN: Blue Lookup Table<br />[word, R/W, 0x0000]<br /><br />DP1_2<br />STN: Dithering Pattern Duty 1/2<br />[word, R/W]<br /><br />DP4_7<br />STN: Dithering Pattern Duty 4/7<br />[word, R/W]<br /><br />DP3_5<br />STN: Dithering Pattern Duty 3/5<br />[word, R/W]<br /><br />DP2_3<br />STN: Dithering Pattern Duty 2/3<br />[word, R/W]<br /><br />DP5_7<br />STN: Dithering Pattern Duty 5/7<br />[word, R/W]<br /><br />DP3_4<br />STN: Dithering Pattern Duty 3/4<br />[word, R/W]<br /><br />DP4_5<br />STN: Dithering Pattern Duty 4/5<br />[word, R/W]<br /><br />DP6_7<br />STN: Dithering Pattern Duty 6/7<br />[word, R/W]<br /><br />DITHMODE<br />STN: Dithering Mode<br />[word, R/W, 0x00000000]<br /><br />TPAL<br />TFT: Temporary Pallete<br />[word, R/W, 0x00000000]<br /><br />*<br /><br />*/<br /><br />#define bLCD_CTL(Nb)<br />__REG(0x4d000000 + (Nb))<br />#define rLCDCON1<br />bLCD_CTL(0x00)<br />#define rLCDCON2<br />bLCD_CTL(0x04)<br />#define rLCDCON3<br />bLCD_CTL(0x08)<br />#define rLCDCON4<br />bLCD_CTL(0x0c)<br />#define rLCDCON5<br />bLCD_CTL(0x10)<br />#define rLCDADDR1<br />bLCD_CTL(0x14)<br />#define rLCDADDR2<br />bLCD_CTL(0x18)<br />#define rLCDADDR3<br />bLCD_CTL(0x1c)<br />#define rREDLUT<br />bLCD_CTL(0x20)<br />#define rGREENLUT<br />bLCD_CTL(0x24)<br />#define rBLUELUT<br />bLCD_CTL(0x28)<br />#define rDITHMODE<br />bLCD_CTL(0x4c)<br />#define rTPAL<br />bLCD_CTL(0x50)<br />#define rLCDINTPND<br />bLCD_CTL(0x54)<br />#define rLCDSRCPND<br />bLCD_CTL(0x58)<br />#define rLCDINTMSK<br />bLCD_CTL(0x5c)<br />#define rLCDLPCSEL<br />bLCD_CTL(0x60)<br /><br />#define fLCD1_LINECNT<br />Fld(10,18)<br />/* the status of the line counter */<br />#define LCD1_LINECNT<br />FMsk(fLCD_LINECNT)<br /><br />#define fLCD1_CLKVAL<br />Fld(10,8)<br />/* rates of VCLK and CLKVAL[9:0] */<br />#define LCD1_CLKVAL(x)<br />FInsrt((x), fLCD1_CLKVAL)<br />#define LCD1_CLKVAL_MSK<br />FMask(fLCD1_CLKVAL)<br /><br />#define LCD1_MMODE (1<<7)<br /><br />#define fLCD1_PNR<br />Fld(2,5)<br />/* select the display mode */<br />#define LCD1_PNR_4D<br />FInsrt(0x0, fLCD1_PNR)<br />/* STN: 4-bit dual scan */<br />#define LCD1_PNR_4S<br />FInsrt(0x1, fLCD1_PNR)<br />/* STN: 4-bit single scan */<br />#define LCD1_PNR_8S<br />FInsrt(0x2, fLCD1_PNR)<br />/* STN: 8-bit single scan */<br />#define LCD1_PNR_TFT<br />FInsrt(0x3, fLCD1_PNR)<br />/* TFT LCD */<br /><br />#define fLCD1_BPP<br />Fld(4,1)<br />/* select BPP(Bit Per Pixel) */<br />#define LCD1_BPP_1S<br />FInsrt(0x0, fLCD1_BPP)<br />/* STN: 1 bpp, mono */<br />#define LCD1_BPP_2S<br />FInsrt(0x1, fLCD1_BPP)<br />/* STN: 2 bpp, 4-grey */<br />#define LCD1_BPP_4S<br />FInsrt(0x2, fLCD1_BPP)<br />/* STN: 4 bpp, 16-grey */<br />#define LCD1_BPP_8S<br />FInsrt(0x3, fLCD1_BPP)<br />/* STN: 8 bpp, color */<br />#define LCD1_BPP_12S<br />FInsrt(0x4, fLCD1_BPP)<br />/* STN: 12 bpp, color */<br />#define LCD1_BPP_1T<br />FInsrt(0x8, fLCD1_BPP)<br />/* TFT: 1 bpp */<br />#define LCD1_BPP_2T<br />FInsrt(0x9, fLCD1_BPP)<br />/* TFT: 2 bpp */<br />#define LCD1_BPP_4T<br />FInsrt(0xa, fLCD1_BPP)<br />/* TFT: 4 bpp */<br />#define LCD1_BPP_8T<br />FInsrt(0xb, fLCD1_BPP)<br />/* TFT: 8 bpp */<br />#define LCD1_BPP_16T<br />FInsrt(0xc, fLCD1_BPP)<br />/* TFT: 16 bpp */<br />…… ……<br />…… ……<br /><br />②<br />Cpu/arm920t/Start.s<br />由于增加从Nand flash启动功能,u-boot启动第一阶段需要增加代码复制的程序段也就是copy_myself。具体语句不贴出来了。相应地也要做堆栈的修改。<br />③<br />Lib_arm/board.c<br />在u-boot启动第二阶段添加新增的板级配置的初始化项。<br />void board_postinit(void)<br />{<br />#ifdef CONFIG_JK2410<br />#undef CONFIG_S3C2410_NAND_BOOT<br /><br />/* ports from vivi , by jollen.org */<br /><br />/* NOTICE: not work for current framebuffer memory base address setting */<br /><br />/* This is a TODO issue. */<br /><br />//mem_map_init();<br /><br />//mmu_init();<br />#endif<br /><br /><br />#ifdef<br />JK2410_DEBUG<br /><br />printf('%s: ',<br />__FUNCTION__);<br />#endif<br /><br />board_ioportinit();<br /><br />#ifdef CONFIG_LCD<br /><br />lcd_enable();<br /><br />lcd_boot_**();<br />#endif<br />#if<br />defined(CONFIG_JK2410) && defined(CONFIG_PLL_DEBUG)<br /><br />jk2410_show_PLLCLK();<br />#endif<br /><br />}<br />④<br />编译调试直至实现所有功能为止。<br /><br /> |
|