一、移植准备:修改Makefile文件,在U-Boot中建立自己的开发板文件(以友善之臂的sbc2410x为基础)。<br />1 解压u-boot-1.3.4,并进入u-boot目录,修改Makefile文件,添加开发板的配置选项。 tar -xjvf u-boot-1.3.4.tar.bz2 <br />cd u-boot-1.3.4<br />vi Makefile<br /><br /><br />in Makefile:<br /><br />#为mini2440建立配置项<br /><br />smdk2410_config : unconfig<br /> @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0<br /><br />mini2440_config : unconfig<br /> @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 tekkamanninja s3c24x0<br /><br /><br /><br />各项的意思如下:<br />arm : CPU的架构(ARCH)<br />arm920t : CPU的类型(CPU),其对应于cpu/arm920t子目录。<br />mini2440: 开发板的型号(BOARD),对应于board/tekkamanninja/mini2440目录。<br />tekkamanninja: 开发者/或经销商(vender)。<br />s3c24x0 : 片上系统(SOC)。 <br /><br /><br />同时在“ifndef CROSS_COMPILE ”之前加上自己交叉编译器的路径,比如我使用crosstool-0.43制作的基于2.6.27.4内核和gcc-4.1.1-glibc-2.3.2的ARM9TDMI交叉编译器,则:<br />CROSS_COMPILE=arm-9tdmi-linux-gnu-<br /><br /><br />别忘了在环境变量PATH中加上你的编译器路径!!!!<br /><br />特别注意: 在u-boot1.3.3及以上版本Makefile有一定的变化,使得对于24x0处理器从nand启动的遇到问题。也就是网上有人说的:无法运行过lowlevel_init。其实这个问题是由于编译器将我们自己添加的用于nandboot的子函数nand_read_ll放到了4K之后造成的(到这不理解的话,请仔细看看24x0处理器nandboot原理)。我是在运行失败后,利用mini2440的4个LED调试发现u-boot根本没有完成自我拷贝,然后看了uboot根目录下的System.map文件就可知道原因。<br /><br />解决办法其实很简单:<br />将__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))<br />改为__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))<br /><br /><br /><br /><br />2 在/board子目录中建立自己的开发板mini2440目录<br />由于我在上一步板子的开发者/或经销商(vender)中填了 tekkamanninja ,所以开发板mini2440目录一定要建在/board子目录中的tekkamanninja目录下 ,否则编译会出错。 cd board<br />mkdir tekkamanninja tekkamanninja/mini2440<br />cp -arf sbc2410x/* tekkamanninja/mini2440/<br />cd tekkamanninja/mini2440/<br />mv sbc2410x.c mini2440.c<br /><br /><br /><br />还要记得修改自己的开发板mini2440目录下的Makefile文件,不然编译时会出错:<br /><br /><br />vi Makefile<br /><br /><br /><br />in Makefile: COBJS := mini2440.o flash.o<br /><br /><br /><br />3 在include/configs/中建立配置头文件<br />cd ../../..<br />cp include/configs/sbc2410x.h include/configs/mini2440.h<br /><br /><br /><br />4 测试编译能否成功<br />make mini2440_config<br />Configuring for mini2440 board...<br />make<br /><br />测试编译成功后继续。 可能出现的问题:<br /> (1) 如果出现:<br /> $ make mini2440_config<br /> Makefile:xxxx: *** 遗漏分隔符 。 停止。<br /> 请在U-boot的根目录下的Makefile的<br /> @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 tekkamanninja)<br /> 前加上“Tab”键 <br /><br /><br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br />二、修改U-Boot中的文件,以同时匹配2440和2410。<br />1 修改/cpu/arm920t/start.S<br />(1)删除AT91RM9200使用的LED代码。<br />#include <br />#include <br />#if defined(CONFIG_AT91RM9200DK)<br />#include /*这是针对AT91RM9200DK开发板的。对于mini2440也有4个LED指示灯,我用来指示程序用行的进度。*/<br />#endif<br />......<br />/*<br />* the actual start code<br />*/<br /><br />start_code:<br /> /*<br /> * set the cpu to SVC32 mode<br /> */<br /> mrs r0,cpsr<br /> bic r0,r0,#0x1f<br /> orr r0,r0,#0xd3<br /> msr cpsr,r0<br />#if defined(CONFIG_AT91RM9200DK)<br /> bl coloured_LED_init<br /> bl red_LED_on<br />#endif<br /><br /><br /><br />(2)修改寄存器地址定义 <br />#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)<br /> /* turn off the watchdog */<br /><br />#if defined(CONFIG_S3C2400)<br />#define pWTCON 0x15300000<br />#define INTMSK 0x14400008 /* Interupt-Controller base addresses */<br />#define CLKDIVN 0x14800014 /* clock divisor register */<br />#else<br />#define pWTCON 0x53000000<br />#define INTMSK 0x4A000008 /* Interupt-Controller base addresses */<br />#define INTSUBMSK 0x4A00001C<br />#define CLKDIVN 0x4C000014 /* clock divisor register */<br />#endif<br />#define CLK_CTL_BASE 0x4C000000 /* tekkaman */<br />#define MDIV_405 0x7f << 12 /* tekkaman */<br />#define PSDIV_405 0x21 /* tekkaman */<br />#define MDIV_200 0xa1 << 12 /* tekkaman */<br />#define PSDIV_200 0x31 /* tekkaman */<br /><br /><br /><br />(3)修改中断禁止部分<br />#if defined(CONFIG_S3C2410)<br /> ldr r1, =0x7ff /*根据2410芯片手册,INTSUBMSK有11位可用*/<br /> ldr r0, =INTSUBMSK<br /> str r1, [r0]<br />#endif<br />#if defined(CONFIG_S3C2440)<br /> ldr r1, =0x7fff /*根据2440芯片手册,INTSUBMSK有15位可用*/<br /> ldr r0, =INTSUBMSK<br /> str r1, [r0]<br />#endif<br /><br /><br /><br />(4)修改时钟设置(2440的主频为405MHz。)<br /># if defined(CONFIG_S3C2440)<br /> /* FCLK:HCLKCLK = 1:4:8 */<br /> ldr r0, =CLKDIVN<br /> mov r1, #5<br /> str r1, [r0]<br /> <br /> mrc p15, 0, r1, c1, c0, 0 /*read ctrl register tekkaman*/<br /> orr r1, r1, #0xc0000000 /*Asynchronous tekkaman*/<br /> mcr p15, 0, r1, c1, c0, 0 /*write ctrl register tekkaman*/<br /><br /> /*now, CPU clock is 405.00 Mhz tekkaman*/<br /> mov r1, #CLK_CTL_BASE /* tekkaman*/<br /> mov r2, #MDIV_405 /* mpll_405mhz tekkaman*/<br /> add r2, r2, #PSDIV_405 /* mpll_405mhz tekkaman*/<br /> str r2, [r1, #0x04] /* MPLLCON tekkaman */<br /><br />#else<br /> /* FCLK:HCLKCLK = 1:2:4 */<br /> /* default FCLK is 12 MHz ! 在这里U-Boot有一个错误:以为默认时钟为120MHz。其实如果没有添加以下设置FCLK的语句,芯片内部的PLL是无效的,即FCLK为12MHz。S3C24x0的芯片手册说得很明白。我一开始没有注意到这一点,是 CalmArrow提醒了我并和我讨论过,他也做过实验证实了这点。在这里对CalmArrow表示感谢和敬意!*/<br /> ldr r0, =CLKDIVN<br /> mov r1, #3<br /> str r1, [r0]<br /><br /> mrc p15, 0, r1, c1, c0, 0 /*read ctrl register tekkaman*/<br /> orr r1, r1, #0xc0000000 /*Asynchronous tekkaman*/<br /> mcr p15, 0, r1, c1, c0, 0 /*write ctrl register tekkaman*/<br /><br /> /*now, CPU clock is 202.8 Mhz tekkaman*/<br /> mov r1, #CLK_CTL_BASE /* tekkaman*/<br /> mov r2, #MDIV_200 /* mpll_200mhz tekkaman*/<br /> add r2, r2, #PSDIV_200 /* mpll_200mhz tekkaman*/<br /> str r2, [r1, #0x04] <br /><br /># endif<br />#endif /* CONFIG_S3C2400 || CONFIG_S3C2410|| CONFIG_S3C2440 */<br /><br /><br /><br />(5)将从Flash启动改成从NAND Flash启动。<br />在以下U-Boot的重定向语句段(作用是将u-boot的源代码从nor flash到sdram中): #ifndef CONFIG_AT91RM9200<br /><br />#ifndef CONFIG_SKIP_RELOCATE_UBOOT<br />relocate: /* relocate U-Boot to RAM */<br /> adr r0, _start /* r0 <- current position of code */<br /> ldr r1, _TEXT_BASE /* test if we run from flash or RAM */<br /> cmp r0, r1 /* don't reloc during debug */<br /> beq stack_setup<br /><br /> ldr r2, _armboot_start<br /> ldr r3, _bss_start<br /> sub r2, r3, r2 /* r2 <- size of armboot */<br /> add r2, r0, r2 /* r2 <- source end address*/<br /><br />copy_loop:<br /> ldmia {r3-r10} /* copy from source address [r0] */<br /> stmia {r3-r10} /* copy to target address [r1] */<br /> cmp r0, r2 /* until source end addreee [r2] */<br /> ble copy_loop<br />#endif /* CONFIG_SKIP_RELOCATE_UBOOT */<br />#endif<br /><br /><br /><br />的前面添加上以下的nand boot代码: #ifdef CONFIG_S3C2440_NAND_BOOT<br /><br />#define NAND_CTL_BASE 0x4E000000<br />/* Offset */<br />#define oNFCONF 0x00<br />#define oNFCONT 0x04<br />#define oNFCMD 0x08<br />#define oNFSTAT 0x20<br />#define LENGTH_UBOOT 0x40000<br /><br /> @ reset NAND<br /> mov r1, #NAND_CTL_BASE<br /> ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )<br /> str r2, [r1, #oNFCONF]<br /> ldr r2, [r1, #oNFCONF]<br /> <br /> ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control <br /> str r2, [r1, #oNFCONT]<br /> ldr r2, [r1, #oNFCONT]<br /> <br /> ldr r2, =(0x6) @ RnB Clear<br /> str r2, [r1, #oNFSTAT]<br /> ldr r2, [r1, #oNFSTAT]<br /> <br /> mov r2, #0xff @ RESET command<br /> strb r2, [r1, #oNFCMD]<br /> <br /> mov r3, #0 @ wait<br />nand1: <br /> add r3, r3, #0x1<br /> cmp r3, #0xa<br /> blt nand1<br /><br />nand2:<br /> ldr r2, [r1, #oNFSTAT] @ wait ready<br /> tst r2, #0x4<br /> beq nand2<br /> <br /> <br /> ldr r2, [r1, #oNFCONT]<br /> orr r2, r2, #0x2 @ Flash Memory Chip Disable<br /> str r2, [r1, #oNFCONT]<br /> <br /> @ get read to call C functions (for nand_read())<br /> ldr sp, DW_STACK_START @ setup stack pointer<br /> mov fp, #0 @ no previous frame, so fp=0<br /> <br /> @ copy U-Boot to RAM<br /> ldr r0, =TEXT_BASE<br /> mov r1, #0x0<br /> mov r2, #LENGTH_UBOOT<br /> bl nand_read_ll<br /> tst r0, #0x0<br /> beq ok_nand_read<br /><br />bad_nand_read:<br />loop2:<br /> b loop2 @ infinite loop<br /><br /><br />ok_nand_read:<br /> @ verify<br /> mov r0, #0<br /> ldr r1, =TEXT_BASE<br /> mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes<br />go_next:<br /> ldr r3, [r0], #4<br /> ldr r4, [r1], #4<br /> teq r3, r4<br /> bne notmatch<br /> subs r2, r2, #4<br /> beq stack_setup<br /> bne go_next<br /><br />notmatch:<br />loop3:<br /> b loop3 @ infinite loop<br /><br />#endif<br /><br />#ifdef CONFIG_S3C2410_NAND_BOOT<br /><br />#define NAND_CTL_BASE 0x4E000000<br />/* Offset */<br />#define oNFCONF 0x00<br />#define oNFCMD 0x04<br />#define oNFSTAT 0x10<br />#define LENGTH_UBOOT 0x40000<br /><br /> @ reset NAND<br /> mov r1, #NAND_CTL_BASE<br /> ldr r2, =0xf830 @ initial value<br /> str r2, [r1, #oNFCONF]<br /> ldr r2, [r1, #oNFCONF]<br /> bic r2, r2, #0x800 @ enable chip<br /> str r2, [r1, #oNFCONF]<br /> mov r2, #0xff @ RESET command<br /> strb r2, [r1, #oNFCMD]<br /> <br /> <br /> mov r3, #0 @ wait<br />nand1:<br /> add r3, r3, #0x1<br /> cmp r3, #0xa<br /> blt nand1<br /><br />nand2:<br /> ldr r2, [r1, #oNFSTAT] @ wait ready<br /> tst r2, #0x1<br /> beq nand2<br /> <br /> ldr r2, [r1, #oNFCONF]<br /> orr r2, r2, #0x800 @ disable chip<br /> str r2, [r1, #oNFCONF]<br /> <br /> @ get read to call C functions (for nand_read())<br /> ldr sp, DW_STACK_START @ setup stack pointer<br /> mov fp, #0 @ no previous frame, so fp=0<br /> <br /> @ copy U-Boot to RAM<br /> ldr r0, =TEXT_BASE<br /> mov r1, #0x0<br /> mov r2, #LENGTH_UBOOT<br /> bl nand_read_ll<br /> tst r0, #0x0<br /> beq ok_nand_read<br /><br />bad_nand_read:<br />loop2:<br /> b loop2 @ infinite loop<br /><br /><br />ok_nand_read:<br /> @ verify<br /> mov r0, #0<br /> ldr r1, =TEXT_BASE<br /> mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes<br />go_next:<br /> ldr r3, [r0], #4<br /> ldr r4, [r1], #4<br /> teq r3, r4<br /> bne notmatch<br /> subs r2, r2, #4<br /> beq stack_setup<br /> bne go_next<br /><br />notmatch:<br />loop3:<br /> b loop3 @ infinite loop<br /><br />#endif<br /><br /><br /><br />在“ldr pc, _start_armboot”之前加入:<br /><br />#if defined(CONFIG_MINI2440_LED)<br />#define GPIO_CTL_BASE 0x56000000<br />#define oGPIO_B 0x10<br />#define oGPIO_CON 0x0<br />/* R/W, Configures the pins of the port */<br />#define oGPIO_DAT 0x4<br />#define oGPIO_UP 0x8<br />/* R/W, Pull-up disable register */<br /> mov r1, #GPIO_CTL_BASE<br /> add r1, r1, #oGPIO_B<br /> ldr r2, =0x295551<br /> str r2, [r1, #oGPIO_CON]<br /> mov r2, #0xff<br /> str r2, [r1, #oGPIO_UP]<br /> ldr r2, =0x1c1<br /> str r2, [r1, #oGPIO_DAT]<br />#endif<br /><br /><br /><br /> 修改目的:如果看到只有LED1亮了,并响起蜂鸣器,说明U-Boot的第一阶段已完成!(针对mini2440,若不是这块开发板的,必须修改或不添加) <br /><br /><br />在 “ _start_armboot: .word start_armboot ” 后加入: #define STACK_BASE 0x33f00000<br />#define STACK_SIZE 0x10000<br /> .align 2<br />DW_STACK_START: .word STACK_BASE+STACK_SIZE-4 <br /><br /><br /><br />2 在board/tekkamaninija/mini2440加入NAND Flash读取函数(start.S中需要的nand_read_ll函数)文件nand_read.c<br />nand_read.c: #include <br /><br />#define __REGb(x) (*(volatile unsigned char *)(x))<br />#define __REGi(x) (*(volatile unsigned int *)(x))<br />#define NF_BASE 0x4e000000<br />#define NFCONF __REGi(NF_BASE + 0x0)<br /><br />#if defined(CONFIG_S3C2440)<br /><br />#define NFCONT __REGi(NF_BASE + 0x4)<br />#define NFCMD __REGb(NF_BASE + 0x8)<br />#define NFADDR __REGb(NF_BASE + 0xC)<br />#define NFDATA __REGb(NF_BASE + 0x10)<br />#define NFSTAT __REGb(NF_BASE + 0x20)<br /><br />#define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1))<br />#define NAND_CHIP_DISABLE (NFCONT |= (1<<1))<br />#define NAND_CLEAR_RB (NFSTAT |= (1<<2))<br />#define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)));}<br /><br />/* low level nand read function */<br />int<br />nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)<br />{<br /> int i, j;<br /> <br /> if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {<br /> return -1; /* invalid alignment */<br /> }<br /> <br /> NAND_CHIP_ENABLE;<br /> <br /> for(i=start_addr; i < (start_addr + size);) {<br /> /* READ0 */<br /> NAND_CLEAR_RB; <br /> NFCMD = 0; <br /> <br /> /* Write Address */<br /> NFADDR = i & 0xff;<br /> NFADDR = (i >> 9) & 0xff;<br /> NFADDR = (i >> 17) & 0xff;<br /> NFADDR = (i >> 25) & 0xff;<br /> <br /> NAND_DETECT_RB;<br /> <br /> for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {<br /> *buf = (NFDATA & 0xff);<br /> buf++;<br /> }<br /> }<br /> NAND_CHIP_DISABLE; <br /> return 0;<br />} <br />#endif<br /><br />#if defined(CONFIG_S3C2410)<br /><br />#define NFCMD __REGb(NF_BASE + 0x4)<br />#define NFADDR __REGb(NF_BASE + 0x8)<br />#define NFDATA __REGb(NF_BASE + 0xc)<br />#define NFSTAT __REGb(NF_BASE + 0x10)<br />#define BUSY 1<br /><br />inline void wait_idle(void) {<br /> int i;<br /> while(!(NFSTAT & BUSY))<br /> for(i=0; i<10; i++);<br />}<br />/* low level nand read function */<br />int<br />nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)<br />{<br /> int i, j;<br /> if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {<br /> return -1; /* invalid alignment */<br /> }<br /> /* chip Enable */<br /> NFCONF &= ~0x800;<br /> for(i=0; i<10; i++);<br /> for(i=start_addr; i < (start_addr + size);) {<br /> /* READ0 */<br /> NFCMD = 0;<br /> /* Write Address */<br /> NFADDR = i & 0xff;<br /> NFADDR = (i >> 9) & 0xff;<br /> NFADDR = (i >> 17) & 0xff;<br /> NFADDR = (i >> 25) & 0xff;<br /> wait_idle();<br /> for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {<br /> *buf = (NFDATA & 0xff);<br /> buf++;<br /> }<br /> }<br /> /* chip Disable */<br /> NFCONF |= 0x800; /* chip disable */<br /> return 0;<br />}<br />#endif<br /><br /><br /><br />顺便修改board/tekkamanninja/mini2440/Makefile文件,将nand_read.c编译进u-boot。<br />OBJS := mini2440.o nand_read.o flash.o<br /><br /><br /><br />3 修改board/tekkamanninja/mini2440/lowlevel_init.S文件<br />/* REFRESH parameter */<br />#define REFEN 0x1 /* Refresh enable */<br />#define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */<br />#define Trc 0x3 /* 7clk */<br />#define Tchr 0x2 /* 3clk */<br /><br />#if defined(CONFIG_S3C2440)<br />#define Trp 0x2 /* 4clk */<br />#define REFCNT 1012<br />#else<br />#define Trp 0x0 /* 2clk */<br />#define REFCNT 0x0459<br />#endif<br /><br /><br />4 修改/board/tekkamanninja/mini2440/mini2440.c<br />修改其对GPIO和PLL的配置(请参阅开发板的硬件说明和芯片手册);并针对LCD显示部分和nand flash驱动添加相应的代码: ......<br />#include <br />#include <br />#include <br /><br />#if defined(CONFIG_CMD_NAND)<br />#include <br />#endif<br /><br />DECLARE_GLOBAL_DATA_PTR;<br /><br />#define FCLK_SPEED 1<br /><br />#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */<br />#define M_MDIV 0xC3<br />#define M_PDIV 0x4<br />#define M_SDIV 0x1<br />#elif FCLK_SPEED==1 /* Fout = 202.8MHz */<br /><br />#if defined(CONFIG_S3C2410)<br />/* Fout = 202.8MHz */<br />#define M_MDIV 0xA1<br />#define M_PDIV 0x3<br />#define M_SDIV 0x1<br />#endif<br /><br />#if defined(CONFIG_S3C2440)<br />/* Fout = 405MHz */<br />#define M_MDIV 0x7f <br />#define M_PDIV 0x2<br />#define M_SDIV 0x1<br />#endif<br />#endif<br /><br />#define USB_CLOCK 1<br /><br />#if USB_CLOCK==0<br />#define U_M_MDIV 0xA1<br />#define U_M_PDIV 0x3<br />#define U_M_SDIV 0x1<br />#elif USB_CLOCK==1<br /><br />#if defined(CONFIG_S3C2410)<br />#define U_M_MDIV 0x48<br />#define U_M_PDIV 0x3<br />#endif<br /><br />#if defined(CONFIG_S3C2440)<br />#define U_M_MDIV 0x38<br />#define U_M_PDIV 0x2<br />#endif<br /><br />#define U_M_SDIV 0x2<br />#endif<br />......<br /><br /><br /><br />为连接LED和蜂鸣器的GPIO修改配置寄存器:<br /><br />int board_init (void):<br /><br />......<br /><br />#if defined(CONFIG_MINI2440) <br /> gpio->GPBCON = 0x00295551;<br />#else<br /> gpio->GPBCON = 0x00044556;<br />#endif<br />......<br /><br /><br /><br />为引导linux 内核,修改开发板的类型代码:<br /><br />int board_init (void):<br /><br /><br />......<br /><br />#if defined(CONFIG_S3C2410)<br /> /* arch number of SMDK2410-Board */<br /> gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;<br />#endif<br /><br />#if defined(CONFIG_S3C2440)<br />/* arch number of S3C2440-Board */<br /> gd->bd->bi_arch_number = MACH_TYPE_S3C2440 ;<br />#endif<br /><br />......<br /><br /><br /><br />为使int board_init (void)设置完成后,LED1和LED2同时亮起,蜂鸣器继续鸣叫,在int board_init (void)的最后添加: ......<br /><br /> icache_enable();<br /> dcache_enable();<br />#if defined(CONFIG_MINI2440_LED)<br /> gpio->GPBDAT = 0x00000181;<br />#endif<br /> return 0;<br />}<br /><br /><br /><br /><br /><br /><br />针对LCD显示部分,在int board_init (void)函数后添加2440的LCD控制器的初始化代码: #define MVAL (0)<br />#define MVAL_USED (0) //0=each frame 1=rate by MVAL<br />#define INVVDEN (1) //0=normal 1=inverted<br />#define BSWP (0) //Byte swap control<br />#define HWSWP (1) //Half word swap control<br /><br /><br />//TFT 240320<br />#define LCD_XSIZE_TFT_240320 (240) <br />#define LCD_YSIZE_TFT_240320 (320)<br /><br />//TFT240320<br />#define HOZVAL_TFT_240320 (LCD_XSIZE_TFT_240320-1)<br />#define LINEVAL_TFT_240320 (LCD_YSIZE_TFT_240320-1)<br /><br />//Timing parameter for NEC3.5'<br /><br />#define VBPD_240320 (3) <br />#define VFPD_240320 (10)<br />#define VSPW_240320 (1)<br /><br />#define HBPD_240320 (5)<br />#define HFPD_240320 (2)<br />#define HSPW_240320 (36)<br /><br />#define CLKVAL_TFT_240320 (3) <br />//FCLK=101.25MHz,HCLK=50.625MHz,VCLK=6.33MHz<br /><br /><br />void board_video_init(GraphicDevice *pGD) <br />{ <br />S3C24X0_LCD * const lcd = S3C24X0_GetBase_LCD(); <br /> <br />/* FIXME: select LCM type by env variable */ <br /> <br /> /* Configuration for GTA01 LCM on QT2410 */ <br /> lcd->LCDCON1 = 0x00000378; /* CLKVAL=4, BPPMODE=16bpp, TFT, ENVID=0 */ <br /> lcd->LCDCON2 = (VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320); <br /> lcd->LCDCON3 = (HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320); <br /> lcd->LCDCON4 = (MVAL<<8)|(HSPW_240320); <br /> lcd->LCDCON5 = 0x00000f09; <br /> lcd->LPCSEL = 0x00000000; <br />}<br /><br /><br /><br />为nand flash驱动屏蔽相应的代码,因为此次使用的是u-boot从Linux移植来的代码,而不是原来的nand_legacy驱动: #if 0<br />#if defined(CONFIG_CMD_NAND)<br />extern ulong nand_probe(ulong physadr);<br /><br />static inline void NF_Reset(void)<br />{<br /> int i;<br /><br /> NF_SetCE(NFCE_LOW);<br /> NF_Cmd(0xFF); /* reset command */<br /> for(i = 0; i < 10; i++); /* tWB = 100ns. */<br /> NF_WaitRB(); /* wait 200~500us; */<br /> NF_SetCE(NFCE_HIGH);<br />}<br /><br />static inline void NF_Init(void)<br />{<br />#if 1<br />#define TACLS 0<br />#define TWRPH0 3<br />#define TWRPH1 0<br />#else<br />#define TACLS 0<br />#define TWRPH0 4<br />#define TWRPH1 2<br />#endif<br /><br /> NF_Conf((1<<15)|(0<<14)|(0<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0));<br /> /*nand->NFCONF = (1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0); */<br /> /* 1 1 1 1, 1 xxx, r xxx, r xxx */<br /> /* En 512B 4step ECCR nFCE=H tACLS tWRPH0 tWRPH1 */<br /><br /> NF_Reset();<br />}<br /><br />void nand_init(void)<br />{<br /> S3C2410_NAND * const nand = S3C2410_GetBase_NAND();<br /><br /> NF_Init();<br />#ifdef DEBUG<br /> printf('NAND flash probing at 0x%.8lX<br />', (ulong)nand);<br />#endif<br /> printf ('%4lu MB<br />', nand_probe((ulong)nand) >> 20);<br />}<br />#endif<br /><br />#endif<br /> <br /> <br /> |
|