有人UBOOT移植uboot到6410到奥尔斯pxa270rp 开发板 成功了的吗? 每...

嵌入式linux开发uboot移植(七)——三星官方uboot的移植
时间: 12:26:21
&&&& 阅读:54
&&&& 评论:
&&&& 收藏:0
标签:嵌入式linux开发uboot移植(七)——三星官方uboot的移植&&&&友善之臂Smart210开发板是基于三星SMDKV210评估板裁剪、调整而来的。因此三星官方发布的基于SMDKV210评估板的uboot是移植uboot到Smart210开发板的最合适uboot版本。本文将SMDKV210的uboot移植到Smart210开发板。Smart210开发板的配置如下:&&&&SoC:Samsung S5PV210&&&&SDRAM:512MB DDR2 RAM&&&&&&&&FLASH存储:2G&MLC NAND Flash 一、uboot工程项目目录的剪裁&&&&由于SMDKV210的uboot是针对SPV210芯片的,并且uboot工程内部保留了大量针对多种CPU架构和SoC的目录,因此需要将和S5PV210无关的目录剪裁删除。删除的目录、文件包括:1、uboot工程根目录下与Smart210开发板无关的目录删除下列目录onenand_ipl、onenand_bl1、lib_avr32、lib_blackfin、lib_i386、lib_m68k、lib_mips、lib_microblaze、lib_nios、lib_nios2、lib_ppc、lib_sh、lib_sparc。2、board目录下与Smart210无关目录的删除&& 删除board目录下除samsung以外的所有目录3、cpu目录下与Smart210无关目录的删除删除cpu目录下除s5pc11x目录外的所有目录4、include目录下与Smart210无关目录的删除删除include目录下的asm-avr32、asm-blackfin、asm-i386、asm-m68k、asm-sh、asm-microblaze、asm-mips、asm-nios、asm-nios2、asm-ppc、asm-sparc目录删除include/aasm-arm目录下的arch-arm720t、arch-arm925t、arch-arm926ejs、arch-at91rm9200、arch-at91sam9、arch-davinci、arch-imx、arch-ixp、arch-ks8695、arch-lpc2292、arch-mx31、arch-omap、arch-omap24xx、arch-pxa、arch-s3c24x0、arch-s3c24xx、arch-s3c44b0、arch-s3c64xx、arch-s5p64xx、arch-s5p644x、arch-s5pc1xx、arch-sa1100目录5、uboot的Makefile文件的修改找到Makefile中arm交叉编译器相关部分ifeq ($(ARCH),arm)#CROSS_COMPILE = arm-linux-#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-endif修改交叉编译器:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-#CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-endif6、查找Makefile中与Smart210相关的配置smdkv210single_config :unconfig@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110@echo "TEXT_BASE = 0xc3e00000" & $(obj)board/samsung/smdkc110/config.mk二、uboot工程项目的移植通过对uboot工程的目录的剪裁,Makefile文件的修改查阅知道,uboot工程的编译命令如下:make distclean;make smdkv210single_make -j4;1、编译剪裁目录后的uboot工程在对uboot工程目录进行剪裁后编译uboot:make distclean;make smdkv210single_make -j4;实验过程中发现uboot编译成功,但是串口没有输出信息,开发板无任何报警声音,电源灯正常,表明供电锁存是正常的。2、PMIC模块的修改由于开发板供电锁存是正常的,进入uboot工程中的start.S文件查阅lowlevel_init查阅供电锁存后的代码,发现Smart210无PMIC模块,将其注释。/* init PMIC chip *///bl PMIC_InitIp编译后烧录发现,仍然没有任何串口信息输出。使用点亮led灯的方式对uboot在lowlevel_init阶段中的串口初始化打印’O’和’K’前后分别加入点亮led灯的汇编代码,发现作为调试使用的四个Led灯都能点亮。表明串口的初始化输出是没有问题的,不过没有输出到开发板连接的当前串口中。3、修改串口输出&&&&修改开发板配置的头文件include/configs/smdkv210single.h&&&&找到串口端口的相关定义部分:&&&&#define CONFIG_SERIAL3 &&&&&&&&&1/* we use UART1 on SMDKC110 */&&&&发现SMDKV210开发板默认使用串口COM3输出,而Smart210使用COM0输出,需要修改为:&&&&#define CONFIG_SERIAL1 &&&&&&&&&1/* we use UART1 on Smart210 */&&&&编译工程后烧录u-boot.bin到SD卡启动运行,发现uboot已经正常打印出uboot启动的串口信息。但是DRAM显示的大小是错误的。OKU-Boot 1.3.4 (Jun 25 2016 - 03:29:22) for SMDKV210CPU: &(OK)&&&&&&&&APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz&&&&&&&&MPLL = 667MHz, EPLL = 80MHz&&&&&&&&&&&&&&&&&&&&&&&HclkDsys = 166MHz, PclkDsys = 83MHz&&&&&&&&&&&&&&&&&&&&&&&HclkPsys = 133MHz, PclkPsys = 66MHz&&&&&&&&&&&&&&&&&&&&&&&SCLKA2M &= 200MHzSerial = CLKUART Board: &&SMDKV210DRAM: &&&&0 kBFlash: &&8 MBSD/MMC: &7580MBNAND: &&&512 MB The input address don‘t need a virtual-to-physical translation : 23e9d2a0*** Warning - using default environment&In: &&&&&serialOut: &&&&serialErr: &&&&serialchecking mode for fastboot ...4、修改内存配置信息查阅Smart210核心板电路原理图,找到DDR相关部分,S5PV210有两个内存端口,分别为DRAM0和DRAM1,对应地址范围如下:DRAM0:0x——0x3FFFFFFF512MBDRAM1:0x——0x7FFFFFFF1024MB&&&&Smart210开发板共有四片128MB的内存芯片,每片芯片有14根地址线Xm1ADDR[13:0],8根数据线Xm1DATA[7:0],其余为控制总线。四片内存芯片并联后逻辑上只是一片内存芯片,大小为512MB,数据线为Xm1DATA[31:0],地址线不变Xm1ADDR[13:0]。根据DRAM原理图的片选引脚nCS、CKE、nWE选择知道,smart210开发板的四片内存芯片挂接到DMC0。DRAM0:0x——0x3FFFFFFF512MB修改开发板头文件include/configs/smdkv210single.h 配置信息:#define MEMORY_BASE_ADDRESS&&& & 0x #define DMC0_MEMCONTROL&&&&&&&& 0x #define DMC0_MEMCONFIG_0&&& &&&& 0x20E00323 #define DMC0_MEMCONFIG_1&&& &&&& 0x40F00323 #define DMC1_MEMCONTROL&& &&&&&& 0x #define DMC1_MEMCONFIG_0&&& &&&& 0x40F00313 #define DMC1_MEMCONFIG_1&&& &&&& 0x00F00313 #define SDRAM_BANK_SIZE&&&& &&&& 0x& /* 512 MB */ #define CONFIG_NR_DRAM_BANKS&&& 1&&&&&&&&/* we have 1 bank of DRAM */ #if 0 #define PHYS_SDRAM_2&&&&&&&& (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */ #define PHYS_SDRAM_2_SIZE&&& SDRAM_BANK_SIZE #endif 修改cpu/s5pc11x/s5pc110/cpu_init.S文件:ldr& r1, =0x //122行&& 修改为在smdkv210single.h头文件中定义的内容: ldr& r1, =DMC0_MEMCONTROL &5、网卡驱动的移植&&&&根据Smart210开发板底板电路原理图DM9000网卡的电路原理图可知,DM9000的片选线CS#接到了S5PV210的CSn1,即SROMC_BANK1,基地址为0x。DM9000的CMD接到了地址线ADDR2,访问DM9000数据的地址0xb100(0x8,ADDR2为高电平1)。DM9000的数据线与地址线复用,根据CMD引脚的电平信号确定传输的是数据还是地址,CMD为高电平为传输数据,CMD为低电平时传输地址。网卡电路原理图如下:修改uboot中开发板配置头文件include/configs/smdkv210single.h#define CONFIG_DM9000_BASE(0xA8000000)#define DM9000_DATA(CONFIG_DM9000_BASE+2)&& 修改为:#define CONFIG_DM9000_BASE(0x88000000)#define DM9000_DATA(CONFIG_DM9000_BASE+8)对DM9000网卡进行初始化:&&&&根据三星官方文档S5PV210_UM_REV1.1中的SROM控制器修改board/samsung/smdkc110/smdkc110.c文件中dm9000_pre_init函数static void dm9000_pre_init(void){#if defined(DM9000_16BIT_DATA)//SROM_BW_REG &= ~(0xf && 20);SROM_BW_REG &= ~(0xf && 4);SROM_BW_REG |= (0x1 && 4);//SROM_BW_REG |= (0&&23) | (0&&22) | (0&&21) | (1&&20);#elseSROM_BW_REG &= ~(0xf && 20);SROM_BW_REG |= (0&&19) | (0&&18) | (0&&16);#endif//SROM_BC5_REG = ((0&&28)|(1&&24)|(5&&16)|(1&&12)|(4&&8)|(6&&4)|(0&&0));SROM_BC1_REG = ((0&&28)|(0&&24)|(5&&16)|(0&&12)|(0&&8)|(0&&4)|(0&&0));tmp = MP01CON_REG;//tmp &=~(0xf&&20);tmp &=~(0xf&&4);//tmp |=(2&&20);tmp |=(2&&4);MP01CON_REG =}&&S5PV210的地址分配表:本文主要阐述了将三星SMDKV210开发板版本uboot移植到Smart210开发板的过程,但相对粗简,如果需要更精细的移植则需要做更深入的研究。本文出自 “” 博客,转载请与作者联系!标签:原文:http://6
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!博客访问: 254024
博文数量: 71
博客积分: 2606
博客等级: 上尉
技术积分: 1288
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
一、移植环境
主 &机:VMWare--redhat 5
开发板:MiniMB Nand
二、移植步骤
移植uboot到mini2440,使其可以在nor flash中运行
支持DM9000网卡
支持nor flash读写
1.选择移植参考开发板
1.1 首先选择MCU相同的开发板,在uboot-2008.10中不支持MCU为s3c2440芯片的开发板
1.2没有找到MCU相同的参考开发板,选择CPU相同的参考开发板,s3c2440的cpu为arm920T,smdk2410的cpu也是arm920T,选择smdk2410作为参考开发板。
2.在顶层makefile中为开发板添加新的配置选项(红色部分为添加代码,下同)
&&&&&& smdk2410_config :&&&&&& unconfig&&&&&&&&&&&&&& @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
&&&&&& mini2440_config :&&&&&& unconfig&&&&&&&&&&&&&& @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0
&注释:增加配置选项,使make mini2440_config得以进行,为make提供编译环境和设置编译选择路径;
&&&&&&&&&&&&& unconfig执行 @rm -f $(obj)include/config.h $(obj)include/config.mk \&&&&&&&&&&&&&&& $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \&&&&&&&&&&&&&&& $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep操作,该操作删除原有的配置;
&&&&&&&&&&&&& @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0执行根目录下的mkconfig脚本,后面几个为传入该脚本的参数,其中$(@:_config=) 的值为mini2440,mkconfig脚本根据传入的参数对mini2440编译环境进行配置.
3.修改cpu/arm920t/start.s
&3.1修改编译条件使其支持s3c2440
&&&&&&&&& 136 /*added by snowboy yzx mini2440*/&&&&&&&&& 137 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)&&&&&&&&& 138&&&&&&&& /* turn off the watchdog */
3.2添加寄存器的定义
&&&&&&&& <font color="#f0 /*added by yzx for mini2440,register define base on the table of s3c2440 datesheet*/&&&&&&&&&152 #define CLK_CTL_BASE 0x4c000000 //基地址&&&&&&&&&153 #define MDIV_405 0x7f << 12&&&&&&&&&154 #define PSDIV_405 0x21&&&&&&&&&155 #define UPLL_MDIV_48 0x38 << 12&&&&&&&&&156 #define UPLL_PSDIV_48 0x22&&&&&&&&&157 #define MDIV_200 0xa1 << 12&&&&&&&&&158 #define PSDIV_200 0x31
上述定义是根据芯片手册来设置的
&MDIV相应的数据之所以要左移12位是因为它在对应的寄存器的12-19位,将pdiv和sdiv放在一起用16进制表示,因为pdiv正好从第四位开始取值。
&根据下表来设置对应的寄存器的值,38 2 2对应于48Mhz的频率,7f 2 1对应405Mhz的频率,其中200的频率在mini2440的开发板中没有用到,可以提供给其他的开发板使用。
&&&&&&<font color="#.3 修改中断禁止部分,添加s3c2440的中断禁止代码
<font color="#0 # if defined(CONFIG_S3C2410)171&&&&&&&& ldr&&&& r1, =0x3ff172&&&&&&&& ldr&&&& r0, =INTSUBMSK173&&&&&&&& str&&&& r1, [r0]174 # endif175 176 /*added by yzx for mini0 have 15bit INTSUBMSK can be used*/177 #if defined(CONFIG_S3C2440)178&&&&&&&& ldr r1, =0x7fff179&&&&&&&& ldr r0, =INTSUBMSK180&&&&&&&& str r1, [r0]181 #endif182 /*added by yzx for mini0 have 15bit INTSUBMSK can be used*/
根据2440芯片手册,其INTSUBMSK有15位可用。
<font color="#.4 修改时钟设置(将s3c2440主频设置为405Mhz)
#if defined(CONFIG_S3C2440)185&&&&&&&& /* FCLK:HCLK:PCLK = 1:4:8 */186&&&&&&&& ldr r0, =CLKDIVN187&&&&&&&& mov r1, #5188&&&&&&&& str r1, [r0]189 190&&&&&&&& mrc p15, 0, r1, c1, c0, 0 /*read ctrl regester*/191&&&&&&&& orr r1, r1, #0xc0000000 /*asynchronous*/192&&&&&&&& mcr p15, 0, r1, c1, c0, 0 /*write ctrl register*/193 194 /*now,cpu clock is 405.00Mhz base on p255 of datasheet table*/195&&&&&&&& mov r1, #CLK_CTL_BASE196 197&&&&&&&& mov r2, #UPLL_MDIV_48198&&&&&&&& add r2, r2, #UPLL_PSDIV_48199&&&&&&&& str r2, [r1, #0x08] /*write UPLL first,48Mhz*/200 201&&&&&&&& mov r2, #MDIV_405202&&&&&&&& add r2, r2, #PSDIV_405203&&&&&&&& str r2, [r1, #0x04] /*MPLLCON MPLLCON 405Mhz*/204 205 #else206&&&&&&&& /* FCLK:HCLK:PCLK = 1:2:4 */207&&&&&&&& /* default FCLK is 120 MHz ! */208&&&&&&&& ldr&&&& r0, =CLKDIVN209&&&&&&&& mov&&&& r1, #3210&&&&&&&& str&&&& r1, [r0]211 #endif分频FCLK:HCLK:PCLK = 1:4:8 是根据下表来设置的,而寄存器的设置是根据上面添加的寄存器定义来赋值的。通过芯片手册可以查到MPLLCON和UPLLCON的地址分别为0x4Cx4C000008
4 修改cpu/arm920t/s3c24x0/interrupts.c
4.1 在有s3c2410宏定义开关里加入对s3c2440的支持
32 #include &33 /*modified by yzx for 2440*/&34 #if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined (CONFIG_TRAB)&35 &36 #include &37 #if defined(CONFIG_S3C2400)&38 #include &39 /*modified by yzx for 2440*/&40 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)&41 #include &42 #endif&&&&&&
4.2在函数get_tbclk中,添加对s3c2440的支持
179 /*modified by yzx for 2440*/180 #if defined(CONFIG_SMDK2400) || defined(CONFIG_TRAB)181&&&&&&&& tbclk = timer_load_val * 100;182 #elif defined(CONFIG_SBC2410X) || \183&&&&&& defined(CONFIG_SMDK2410) || \184&&&&&& defined(CONFIG_MINI2440) || \185&&&&&& defined(CONFIG_VCMA9)186&&&&&&&& tbclk = CFG_HZ;187 #else188 #&&&&&& error "tbclk not configured"189 #endif
5. 修改cpu/arm920t/s3c24x0/speed.c
&5.1在宏定义中添加对s3c2440的支持
32 #include &33 /*modified by yzx for 2440*/&34 #if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined (CONFIG_TRAB)&35 &36 #if defined(CONFIG_S3C2400)&37 #include &38 /*modified by yzx for 2440*/&39 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)&40 #include &41 #endif
&5.2修改函数get_PLLCLK
s3c2410与s3c2440的MPLL、UPLL计算公式不同,需要修改相关代码。
&72 /*modified by yzx*/&73 #if defined(CONFIG_S3C2440)&74&&&&& if (pllreg == MPLL)&75&&&&&&&& return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));&76&&&&&&&& else if (pllreg == UPLL)&77 #endif&78 &79&&&& return((CONFIG_SYS_CLK_FREQ * m) / (p << s));根据芯片手册中的公式修改
5.3 修改函数get_HCLK
同样s3c2410与s3c2440对分频的设置也不相同,需添加相关修改
93 /*modified by yzx for 2440*/&94 #if defined(CONFIG_S3C2440)&95&&&&&&&& if (clk_power->CLKDIVN & 0x6)&96&&&&&&&& {&97&&&&&&&&&&&&&&&& if((clk_power->CLKDIVN & 0x6) == 2)&98&&&&&&&&&&&&&&&&&&&&&&&& return(get_FCLK()/2);&99&&&&&&&&&&&&&&&& if((clk_power->CLKDIVN & 0x6) == 6)100&&&&&&&&&&&&&&&&&&&&&&&& return((clk_power->CAMDIVN & 0x100) ? get_FCLK()/6 : get_FCLK()/3);101&&&&&&&&&&&&&&&& if((clk_power->CLKDIVN & 0x6) == 4)102&&&&&&&&&&&&&&&&&&&&&&&& return((clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4);103&&&&&&&&&&&&&&&& return(get_FCLK());104&&&&&&&& }105&&&&&&&& else106&&&&&&&&&&&&&&&& return(get_FCLK());107 #else108&&&& return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());109 #endif
根据芯片手册CLKDIVN寄存器的描述,如图:
可以看出代码中clk_power->CLKDIVN & 0x6确定其HDIVN的值,clk_power->CAMDIVN & 0x100)和
clk_power->CAMDIVN & 0x200分别确定CAMDIVN 第八位和第九位中的值,从而确定其分频系数。
(下面的一段代码为自己粗心所移植的,最后导致串口数据显示乱码,最后定位了半天才找到这里出了问题,通过问题了定位,也进一步了解了时钟对串口显示的重要性。&
ulong get_HCLK(void)&90 {&91&&&& S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();&92 &93 #if defined(CONFIG_S3C2440)&94&&&&&&&& if (clk_power->CLKDIVN & 0x6)&95&&&&&&&& {&96&&&&&&&&&&&&&&&& if((clk_power->CLKDIVN) == 2)&97&&&&&&&&&&&&&&&&&&&&&&&& return(get_FCLK()/2);&98&&&&&&&&&&&&&&&& if((clk_power->CLKDIVN) == 6)&99&&&&&&&&&&&&&&&&&&&&&&&& return((clk_power->CAMDIVN & 0x100)?get_FCLK()/6:get_FCLK()/3);100&&&&&&&&&&&&&&&& if((clk_power->CLKDIVN) == 4)101&&&&&&&&&&&&&&&&&&&&&&&& return((clk_power->CAMDIVN & 0x200)?get_FCLK()/8:get_FCLK()/4);102&&&&&&&&&&&&&&&& return(get_FCLK());103&&&&&&&& }104&&&&&&&& else105&&&&&&&&&&&&&&&& return(get_FCLK());106 #else107&&&& return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());108 #endif109 }根据上面的分频表来更改的代码。
6. 修改include/asm-arm/mach-types.h
添加mini2440机器ID,要求添加的ID与内核提供的ID保持一致
<font color="#f0 /*modified by yzx for 2440*/&1861 #define MACH_TYPE_MINI2440&&&&&&&&&&&& 1999
7.修改cpu/arm920t/s3c24x0/serial.c
在有s3c2410宏定义开关里加入对s3c2440的支持
&22 /*modified by yzx*/&23 #if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined (CONFIG_TRAB)&24 &25 #if defined(CONFIG_S3C2400) || defined(CONFIG_TRAB)&26 #include &27 /*modified by yzx for 2440*/&28 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)&29 #include &30 #endif&8.修改drivers/rtc/s3c24x0_rtc.c
在有s3c2410宏定义开关里加入对s3c2440的支持
&33 #if defined(CONFIG_S3C2400)&34 #include &35 #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)&36 #include &37 #endif
9.修改include/s3c24x0.h
9.1 在有s3c2410宏定义开关里加入对s3c2440的支持,和上面的改法一致
9.2添加寄存器CAMDIVN的定义,该寄存器在speed.c中确定分频系数时会用到。
&<font class="Apple-style-span" color="#f0 /*modified by yzx for 2440*/
&134 #if defined(CONFIG_S3C2440)
&135 & & & & S3C24X0_REG32 & CAMDIVN;
&136 #endif
10.在board目录中创建一个属于新开发板的目录,向目录中添加文件,再修改
cp -a& board/smdk2410 board/mini2440
对smdk2410.c和Makefile做修改
将smdk2410.c改为mini2440.c
修改Makefile
COBJS := smdk2410.o flash.o
COBJS := mini2440.o flash.o
11.修改board/mini2440/mini2440.c
11.1 修改PLL的配置
根据上面提供的频率对照表来设置相关值
&40 /*modified by yzx for mini2440*/&41 #if defined(CONFIG_S3C2410)&42 /*Fout = 202.8Mhz*/&43 #define M_MDIV& 0xA1&44 #define M_PDIV& 0x3&45 #define M_SDIV& 0x1&46 #endif&47 #if defined(CONFIG_S3C2440)&48 /*Fout = 405Mhz*/&49 #define M_MDIV& 0x7f&50 #define M_PDIV& 0x2&51 #define M_SDIV& 0x1&52 #endif
11.2 修改UPLL的配置
&68 /*modified by yzx for 2440*/&69 #if defined(CONFIG_S3C2410)&70 #define U_M_MDIV&&&&&&& 0x48&71 #define U_M_PDIV&&&&&&& 0x3&72 #endif&73 &74 &75 #if defined(CONFIG_S3C2440)&76 #define U_M_MDIV&&&&&&& 0x38&77 #define U_M_PDIV&&&&&&& 0x2&78 #endif&79 &80 #define U_M_SDIV&&&&&&& 0x2&81 #endif
11.3为了引导内核,修改函数board_init中开发板类型代码部分。
<font color="#f0&&&&&&&& /*modified by yzx,arcm number of MINI2440-board*/133&&&&&&&& gd->bd->bi_arch_number = MACH_TYPE_MINI2440;
12.修改board/mini2440/lowlevel_init.S
修改REFRESH的刷新周期
<font color="#0 /* REFRESH parameter */121 #define REFEN&&&&&&&&&&&&&&&&&& 0x1&&&& /* Refresh enable */122 #define TREFMD&&&&&&&&&&&&&&&&& 0x0&&&& /* CBR(CAS before RAS)/Auto refresh */123 #define Trp&&&&&&&&&&&&&&&&&&&& 0x2&&&& /* 4clk *//*modified by yzx*/124 #define Trc&&&&&&&&&&&&&&&&&&&& 0x3&&&& /* 7clk */125 #define Tchr&&&&&&&&&&&&&&&&&&& 0x2&&&& /* 3clk */126 #define REFCNT&&&&&&&&&&&&&&&&& 1012&&& /* period=7.8us, HCLK=133Mhz, (.8*133) modified by yzx*/127 /**************************************/
关于这一部分的修改,在我的博客日志《修改REFRESH的刷新周期》有详细介绍。
13.修改软硬件配置文件mini2440.h
先复制参考开发板的配置文件smdk2410.h,然后再修改
cp include/configs/smdk2410.h& include/configs/mini2440.h
<font color="#.1添加对s3c2440宏定义
&36 #define CONFIG_ARM920T&&&&&&&&& 1&&&&&& /* This is an ARM920T Core&&&&& */&37 #define CONFIG_S3C2440&&&&&&&&& 1&&&&&& /* modified by yzx for 2440&&&& */&38 #define CONFIG_MINI2440&&&&&&&& 1&&&&&& /* modified by yzx for 2440& */
13.2修改命令提示符
<font color="#f0 #define CFG_PROMPT&&&&&&&&&&&&& "yzx2440 # "&&& /* Monitor Command Prompt&*/
至此初步修改完毕
make mini2440_config
make CROSS_COMPILE=arm-linux-
在顶层目录下生成u-boot.bin文件。
&将该文件烧写到开发板上能够正常运行,如图:
注意:上图中打印出的警告是因为没有设置环境变量,设置环境变量后保存再复位之后该警告消除,如下图所示:
该部分移植的u-boot能够在mini2440上运行,但有一些功能还不完善,比如网络不通、flash不能正常使用,后面会对它进行完善。
有一些说明可能自己分析不是很透彻,可以关注下面的这篇文章,里面有一些东西还写得不错
/portinguboottomini2440step1.html
阅读(12664) | 评论(3) | 转发(12) |
相关热门文章
给主人留下些什么吧!~~
LZ,不要嫌我菜哈,那个get_PLLCLK函数为什么是那样改的?&C语言函数里面可以用#if什么的吗
第9步,具体怎么操作
移植成功&非常感谢
请登录后评论。嵌入式开发uboot移植(七)——官方uboot的移植&&&&友善之臂Smart210开发板是基于三星SMDKV210评估板裁剪、调整而来的。因此三星官方发布的基于SMDKV210评估板的uboot是移植uboot到Smart210开发板的最合适uboot版本。本文将SMDKV210的uboot移植到Smart210开发板。Smart210开发板的配置如下:&&&&SoC:Samsung S5PV210&&&&SDRAM:512MB DDR2 RAM&&&&&&&&:2G&MLC NAND Flash 一、uboot工程目录的剪裁&&&&由于SMDKV210的uboot是针对SPV210芯片的,并且uboot工程内部保留了大量针对多种CPU架构和SoC的目录,因此需要将和S5PV210无关的目录剪裁删除。删除的目录、文件包括:1、uboot工程下与Smart210开发板无关的目录删除下列目录onenand_ipl、onenand_bl1、lib_avr32、lib_blackfin、lib_i386、lib_m68k、lib_mips、lib_microblaze、lib_nios、lib_nios2、lib_ppc、lib_sh、lib_sparc。2、board目录下与Smart210无关目录的删除&& 删除board目录下除samsung以外的所有目录3、cpu目录下与Smart210无关目录的删除删除cpu目录下除s5pc11x目录外的所有目录4、include目录下与Smart210无关目录的删除删除include目录下的asm-avr32、asm-blackfin、asm-i386、asm-m68k、asm-sh、asm-microblaze、asm-mips、asm-nios、asm-nios2、asm-ppc、asm-sparc目录删除include/aasm-arm目录下的arch-arm720t、arch-arm925t、arch-arm926ejs、arch-at91rm9200、arch-at91sam9、arch-davinci、arch-imx、arch-ixp、arch-ks8695、arch-lpc2292、arch-mx31、arch-omap、arch-omap24xx、arch-pxa、arch-s3c24x0、arch-s3c24xx、arch-s3c44b0、arch-s3c64xx、arch-s5p64xx、arch-s5p644x、arch-s5pc1xx、arch-sa1100目录5、uboot的Makefile文件的修改找到Makefile中arm交叉相关部分ifeq ($(ARCH),arm)#CROSS_COMPILE = arm-linux-#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-endif修改交叉编译器:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-#CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-endif6、查找Makefile中与Smart210相关的配置smdkv210single_config :unconfig@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110@echo "TEXT_BASE = 0xc3e00000" & $(obj)board/samsung/smdkc110/config.mk二、uboot工程项目的移植通过对uboot工程的目录的剪裁,Makefile文件的修改查阅知道,uboot工程的编译命令如下:make distclean;make smdkv210single_make -j4;1、编译剪裁目录后的uboot工程在对uboot工程目录进行剪裁后编译uboot:make distclean;make smdkv210single_make -j4;实验过程中发现uboot编译成功,但是串口没有输出信息,开发板无任何报警声音,电源灯正常,表明供电锁存是正常的。2、PMIC模块的修改由于开发板供电锁存是正常的,进入uboot工程中的start.S文件查阅lowlevel_init查阅供电锁存后的代码,发现Smart210无PMIC模块,将其注释。/* init PMIC chip *///bl PMIC_InitIp编译后烧录发现,仍然没有任何串口信息输出。使用点亮led灯的方式对uboot在lowlevel_init阶段中的串口初始化打印’O’和’K’前后分别加入点亮led灯的汇编代码,发现作为调试使用的四个Led灯都能点亮。表明串口的初始化输出是没有问题的,不过没有输出到开发板连接的当前串口中。3、修改串口输出&&&&修改开发板配置的头文件include/configs/smdkv210single.h&&&&找到串口端口的相关定义部分:&&&&#define CONFIG_SERIAL3 &&&&&&&&&1/* we use UART1 on SMDKC110 */&&&&发现SMDKV210开发板默认使用串口COM3输出,而Smart210使用COM0输出,需要修改为:&&&&#define CONFIG_SERIAL1 &&&&&&&&&1/* we use UART1 on Smart210 */&&&&编译工程后烧录u-boot.bin到SD卡启动运行,发现uboot已经正常打印出uboot启动的串口信息。但是DRAM显示的大小是错误的。OKU-Boot 1.3.4 (Jun 25 2016 - 03:29:22) for SMDKV210CPU: &S5PV210@1000MHz(OK)&&&&&&&&APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz&&&&&&&&MPLL = 667MHz, EPLL = 80MHz&&&&&&&&&&&&&&&&&&&&&&&HclkDsys = 166MHz, PclkDsys = 83MHz&&&&&&&&&&&&&&&&&&&&&&&HclkPsys = 133MHz, PclkPsys = 66MHz&&&&&&&&&&&&&&&&&&&&&&&SCLKA2M &= 200MHzSerial = CLKUART Board: &&SMDKV210DRAM: &&&&0 kBFlash: &&8 MBSD/MMC: &7580MBNAND: &&&512 MB The input address don't need a virtual-to-physical translation : 23e9d2a0*** Warning - using default environment&In: &&&&&serialOut: &&&&serialErr: &&&&serialchecking mode for fastboot ...4、修改内存配置信息查阅Smart210核心板电路原理图,找到DDR相关部分,S5PV210有两个内存端口,分别为DRAM0和DRAM1,对应地址范围如下:DRAM0:0x——0x3FFFFFFF512MBDRAM1:0x——0x7FFFFFFF1024MB650) this.width=650;" src="/upload/images//111.png" title="图片1.png" alt="wKioL1dwgDKScT0mAAHzn_-eH5g349.png" />&&&&Smart210开发板共有四片128MB的内存芯片,每片芯片有14根地址线Xm1ADDR[13:0],8根数据线Xm1DATA[7:0],其余为控制总线。650) this.width=650;" src="/upload/images//112.png" title="图片2.png" alt="wKioL1dwgGWTm0ZWAAEnbkDJTQ8352.png" />四片内存芯片并联后逻辑上只是一片内存芯片,大小为512MB,数据线为Xm1DATA[31:0],地址线不变Xm1ADDR[13:0]。根据DRAM原理图的片选引脚nCS、CKE、nWE选择知道,smart210开发板的四片内存芯片挂接到DMC0。DRAM0:0x——0x3FFFFFFF512MB修改开发板头文件include/configs/smdkv210single.h 配置信息:#define MEMORY_BASE_ADDRESS&&& & 0x #define DMC0_MEMCONTROL&&&&&&&& 0x #define DMC0_MEMCONFIG_0&&& &&&& 0x20E00323 #define DMC0_MEMCONFIG_1&&& &&&& 0x40F00323 #define DMC1_MEMCONTROL&& &&&&&& 0x #define DMC1_MEMCONFIG_0&&& &&&& 0x40F00313 #define DMC1_MEMCONFIG_1&&& &&&& 0x00F00313 #define SDRAM_BANK_SIZE&&&& &&&& 0x& /* 512 MB */ #define CONFIG_NR_DRAM_BANKS&&& 1&&&&&&&&/* we have 1 bank of DRAM */ #if 0 #define PHYS_SDRAM_2&&&&&&&& (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */ #define PHYS_SDRAM_2_SIZE&&& SDRAM_BANK_SIZE #endif 修改cpu/s5pc11x/s5pc110/cpu_init.S文件:ldr& r1, =0x //122行&& 修改为在smdkv210single.h头文件中定义的内容: ldr& r1, =DMC0_MEMCONTROL &5、网卡驱动的移植&&&&根据Smart210开发板底板电路原理图DM9000网卡的电路原理图可知,DM9000的片选线CS#接到了S5PV210的CSn1,即SROMC_BANK1,基地址为0x。DM9000的CMD接到了地址线ADDR2,访问DM9000数据的地址0xb100(0x8,ADDR2为高电平1)。DM9000的数据线与地址线复用,根据CMD引脚的电平信号确定传输的是数据还是地址,CMD为高电平为传输数据,CMD为低电平时传输地址。网卡电路原理图如下:650) this.width=650;" src="/upload/images//113.png" title="图片3.png" alt="wKioL1dwgI6Dqy_2AADcdd8pT50534.png" />修改uboot中开发板配置头文件include/configs/smdkv210single.h#define CONFIG_DM9000_BASE(0xA8000000)#define DM9000_DATA(CONFIG_DM9000_BASE+2)&& 修改为:#define CONFIG_DM9000_BASE(0x88000000)#define DM9000_DATA(CONFIG_DM9000_BASE+8)对DM9000网卡进行初始化:&&&&根据三星官方文档S5PV210_UM_REV1.1中的SROM控制器修改board/samsung/smdkc110/smdkc110.c文件中dm9000_pre_init函数static void dm9000_pre_init(void){#if defined(DM9000_16BIT_DATA)//SROM_BW_REG &= ~(0xf && 20);SROM_BW_REG &= ~(0xf && 4);SROM_BW_REG |= (0x1 && 4);//SROM_BW_REG |= (0&&23) | (0&&22) | (0&&21) | (1&&20);#elseSROM_BW_REG &= ~(0xf && 20);SROM_BW_REG |= (0&&19) | (0&&18) | (0&&16);#endif//SROM_BC5_REG = ((0&&28)|(1&&24)|(5&&16)|(1&&12)|(4&&8)|(6&&4)|(0&&0));SROM_BC1_REG = ((0&&28)|(0&&24)|(5&&16)|(0&&12)|(0&&8)|(0&&4)|(0&&0));tmp = MP01CON_REG;//tmp &=~(0xf&&20);tmp &=~(0xf&&4);//tmp |=(2&&20);tmp |=(2&&4);MP01CON_REG =}&&S5PV210的地址分配表:650) this.width=650;" src="/upload/images//114.png" title="图片4.png" alt="wKioL1dwgLDwtEThAAG260aGWf8232.png" />本文主要阐述了将三星SMDKV210开发板版本uboot移植到Smart210开发板的过程,但相对粗简,如果需要更精细的移植则需要做更深入的研究。本文出自 “生命不息,奋斗不止” ,转载请与作者联系!

我要回帖

更多关于 uboot移植 的文章

 

随机推荐