免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1942 | 回复: 0
打印 上一主题 下一主题

[BootLoader] u-boot-2012.04.01 移植到 JZ2440 开发板 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-04-18 13:39 |只看该作者 |倒序浏览
重点
1.      关闭的宏要怎么打开???
-----处理措施:
去它的.h配置文件中添加。
例如:   #define CONFIG_S3C2440
2.      怎么删除一个文件???
--处理措施:
例如:  要删除drivers\mtd\nand\s3c2410_nand.c
找到  drivers\mtd\nand\Makefile
搜索  s3c2410_nand  
找到 COBJS-$(CONFIG_NAND_S3C2410)+= s3c2410_nand.o
根据  CONFIG_NAND_S3C2410     
找到  #define CONFIG_NAND_S3C2410的宏开关
注销掉  //#defineCONFIG_NAND_S3C2410的宏开关
3.       编辑出来的U-BOOT非常大,用光盘里的U-BOOT来更新新的U-BOOT.
烧写到NOR FLASH的方法:
把光盘里的u-boot.bin 烧写进NOR FALSH
进去 u-boot模式,接好USB 线,打开DNW.exe 软件发送
Usb  1  30000000    // 一次,目标地址   
Protect off all          //擦出NOR 的写保护
Erase 0 7ffff           //从什么位置擦出,擦出多大
Cp.b 30000000 0 80000  //源地址,目标地址, 复制多大
烧写到 NAND FLASH的方法:
把光盘里的u-boot.bin烧写进NOR FALSH
进去 u-boot模式,接好USB 线,打开DNW.exe 软件发送
Usb  1  30000000    // 一次,目标地址
Nand erase 0 80000     //从什么位置擦出, 擦出多大
Nand write 30000000 0 80000  //源地址,目标地址, 复制多大
A.                    尝试创建新单板
1.  编译相近的smdk2410u-boot能否通过
Make smdk2410_config
Make //成功编译出U-BOOT
2.  开始创建自己的单板
cd board/samsung/
cp smdk2410 smdk2440 –rf
cd ../../include/configs/
cp smdk2410.h smdk2440.h
但现在还不能make smdk2440_config  通过grep"smdk2410" * -nR知道还需要修改boards.cfg
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
3.  viboards.cfg
添加一行:
smdk2440   arm         arm920t     -  samsung        s3c24x0
现在可以make smdk2440_config,新单板的u-boot的最初模型出来了,但绝对还不能使用,需要修改代码
B.                  修改代码(SDRAM, UART,时钟,重定位)
.      修改时钟
\u-boot-2012.04.01\arch\arm\cpu\arm920t\start.S阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置
   注释掉原文对PLLMPLL的设置,,提取到start.S里设置
1.      注释掉(\board\samsung\smdk2410\Smdk2440.c)intboard_early_init_f(void)中的
#if 0
/* to reduce PLL lock time, adjust the LOCKTIMEregister */
writel(0xFFFFFF, &clk_power->locktime);
/* configure MPLL */
writel((M_MDIV << 12) + (M_PDIV <<4) + M_SDIV,
       &clk_power->mpllcon);
/* some delay between MPLL and UPLL */
pll_delay(4000);
#endif
2.       Start.S 修改时钟设置,
注释掉:start.S 中的  
#if 0
/* FCLK:HCLKCLK = 1:2:4 */
           /* default FCLK is 120 MHz ! */
           ldr         r0,=CLKDIVN
           mov      r1,#3
           str         r1,[r0]
#endif
3.       添加代码
/* 2. 设置时钟 */
ldr r0, =0x4c000014
//      movr1, #0x03;                              // FCLK:HCLKCLK=1:2:4, HDIVN=1,PDIVN=1
mov r1, #0x05;                              // FCLK:HCLKCLK=1:4:8
str r1, [r0]
/* 如果HDIVN非0,CPU的总线模式应该从“fastbus mode”变为“asynchronous bus mode” */
mrc  p15,0, r1, c1, c0, 0           /* 读出控制寄存器 */
orr    r1,r1, #0xc0000000                            /*设置为“asynchronous bus mode” */
mcr  p15,0, r1, c1, c0, 0           /* 写入控制寄存器 */
#defineS3C2440_MPLL_400MHZ    ((0x5c<<12)|(0x01<<4)|(0x01))
/* MPLLCON = S3C2440_MPLL_200MHZ */
ldr r0, =0x4c000004
ldr r1, =S3C2440_MPLL_400MHZ
str r1, [r0]
/* 启动ICACHE */
mrc p15, 0, r0, c1, c0, 0  @ read control reg
orr r0, r0, #(1<<12)
mcr  p15, 0, r0, c1, c0, 0   @ write it back
二:修改SDRAM
注释掉以前对SMRDATA的设置换成
SMRDATA:
.long 0x22011110     //BWSCON
.long 0x00000700     //BANKCON0
.long 0x00000700     //BANKCON1
.long 0x00000700     //BANKCON2
.long 0x00000700     //BANKCON3  
.long 0x00000700     //BANKCON4
.long 0x00000700     //BANKCON5
.long 0x00018005     //BANKCON6
.long 0x00018005     //BANKCON7
.long 0x008C04F4     // REFRESH
.long 0x000000B1     //BANKSIZE
.long 0x00000030     //MRSRB6
.long 0x00000030     //MRSRB7
make  出现乱码
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
三:  UART  波特率
跟踪文件:
Start.S
board_init_f
init_sequence
   serial_init,              /*serial communications setup */
      serial_init_dev(UART_NR)
            _serial_setbrg(dev_index);
              reg= get_PCLK() / (16 * gd->baudrate) - 1;
                 get_HCLK
最中找到了这句  #ifdef CONFIG_S3C2440)  宏未定义
1.       处理措施:\include\configs\Smdk2440.h
取消/    /#define CONFIG_S3C2410             /* specifically a SAMSUNG S3C2410SoC */
添加     #define CONFIG_S3C2440
Make
出现一堆问题
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
查看代码发现因为我们关闭了CONFIG_S3C2410 这个宏,导致里面的nand->nfconf成员不能用,需要完全的修改  static voids3c2410_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)  这个函数,但我们现阶段只想让它能正常显示,所以先删除这个文件
2.   删除 drivers\mtd\nand\s3c2410_nand.c文件
--处理措施:
找到drivers\mtd\nand\Makefile
搜索s3c2410_nand  
找到COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
根据CONFIG_NAND_S3C2410宏     
找到#defineCONFIG_NAND_S3C2410的宏开关
全部注销   #ifdef CONFIG_CMD_NAND
//#defineCONFIG_CMD_NAND
Make 烧写进NOR flash
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
看结果能正常显示!!!!!
C.      修改代码支持NAND FLASH
原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K).
1.      通过grep "\-pie" * -nR 搜索
arch/arm/config.mk:75:LDFLAGS_u-boot+= -pie
   vi arch/arm/config.mk +75
ifndef CONFIG_NAND_SPL
#LDFLAGS_u-boot += -pie
Endif
2.       添加一个 init.c文件进U-BOOT工程
     把文件放入board/Samsung/smdk2440文件夹
     修改当前目录里的Makefile
viboard/samsung/smdk2440/Makefile
          添加:COBJS   := smdk2410.o init.o
Init.c 代码
/* NAND FLASH控制器 */
#define NFCONF (*((volatile unsigned long*)0x4E000000))
#define NFCONT (*((volatile unsigned long*)0x4E000004))
#define NFCMMD (*((volatile unsigned char*)0x4E00000)
#define NFADDR (*((volatile unsigned char*)0x4E00000C))
#define NFDATA (*((volatile unsigned char*)0x4E000010))
#define NFSTAT (*((volatile unsigned char*)0x4E000020))
void nand_read_ll(unsigned int addr,unsigned char *buf, unsigned int len);
static int isBootFromNorFlash(void)
{
         volatileint *p = (volatile int *)0;
         intval;
         val= *p;
         *p= 0x12345678;
         if(*p == 0x1234567
         {
                   /*写成功, nand启动 */
                   *p= val;
                   return0;
         }
         else
         {
                   /*NOR不能像内存一样写 */
                   return1;
         }
}
void copy_code_to_sdram(unsigned char *src,unsigned char *dest, unsigned int len)
{        
         inti = 0;
         
         /*如果是NOR启动 */
         if(isBootFromNorFlash())
         {
                   while(i < len)
                   {
                            dest= src;
                            i++;
                   }
         }
         else
         {
                   nand_read_ll((unsignedint)src, dest, len);
         }
}
void clear_bss(void)
{
         externint __bss_start, __bss_end;
         int*p = &__bss_start;
         
         for(; p < &__bss_end; p++)
                   *p= 0;
}
void nand_init_ll(void)
{
#define TACLS   0
#define TWRPH0  1
#define TWRPH1  0
         /*设置时序 */
         NFCONF= (TACLS<<12)|(TWRPH0<<|(TWRPH1<<4);
         /*使能NAND Flash控制器, 初始化ECC, 禁止片选 */
         NFCONT= (1<<4)|(1<<1)|(1<<0);   
}
static void nand_select(void)
{
         NFCONT&= ~(1<<1);      
}
static void nand_deselect(void)
{
         NFCONT|= (1<<1);  
}
static void nand_cmd(unsigned char cmd)
{
         volatileint i;
         NFCMMD= cmd;
         for(i = 0; i < 10; i++);
}
static void nand_addr(unsigned int addr)
{
         unsignedint col  = addr % 2048;
         unsignedint page = addr / 2048;
         volatileint i;
         NFADDR= col & 0xff;
         for(i = 0; i < 10; i++);
         NFADDR= (col >> & 0xff;
         for(i = 0; i < 10; i++);
         
         NFADDR  = page & 0xff;
         for(i = 0; i < 10; i++);
         NFADDR  = (page >> & 0xff;
         for(i = 0; i < 10; i++);
         NFADDR  = (page >> 16) & 0xff;
         for(i = 0; i < 10; i++);        
}
static void nand_wait_ready(void)
{
         while(!(NFSTAT & 1));
}
static unsigned char nand_data(void)
{
         returnNFDATA;
}
void nand_read_ll(unsigned int addr,unsigned char *buf, unsigned int len)
{
         intcol = addr % 2048;
         inti = 0;
                  
         /*1. 选中 */
         nand_select();
         while(i < len)
         {
                   /*2. 发出读命令00h */
                   nand_cmd(0x00);
                   /*3. 发出地址(5步发出) */
                   nand_addr(addr);
                   /*4. 发出读命令30h */
                   nand_cmd(0x30);
                   /*5. 判断状态 */
                   nand_wait_ready();
                   /*6. 读数据 */
                   for(; (col < 204 && (i < len); col++)
                   {
                            buf= nand_data();
                            i++;
                            addr++;
                   }
                  
                   col= 0;
         }
         /*7. 取消选中 */           
         nand_deselect();
}
3.       修改start.S 的重定位代码
     ldr    sp, =(CONFIG_SYS_INIT_SP_ADDR)
     bic    sp, sp, #7 /* 8-byte alignment for ABI compliance */
    bl    nand_init_ll
     mov r0, #0                      //源地址
     ldr r1, _TEXT_BASE              //目地地址
     ldr r2,  _bss_start_ofs           //长度
bl  copy_code_to_sdram        //拷贝代码
bl  clear_bss                 //清除BSS
ldr pc, =call_board_init_f      //从片内内存掉到SDRAM执行
/* Set stackpointer in internal RAM tocall board_init_f */
call_board_init_f:
     ldr    r0,=0x00000000
     bl      board_init_f
ldr r1, _TEXT_BASE          //第二阶段board_init_r(第二个参数)
bl  board_init_r             //跳到第二阶段函数
修改arch\arm\lib\Board.c里的这个  board_init_f 函数,让它有返回值,作为第二阶段board_init_r(第一个参数)保存到r0 里面
    unsigned int  board_init_f(ulong bootflag)
              return(unsigned int ) id;
4.       修改目地地址
include\configs\Smdk2440.h
设置为:#define CONFIG_SYS_TEXT_BASE     0x33f80000   //512K
后续还会修改,这只是个自己假设的值.后续编译得出的U-BOOT二进制文件远超过设定的0x33f80000
最终定位:#define CONFIG_SYS_TEXT_BASE         0x33f80000  //1M
5.      删除arch\arm\lib\Board.c
         //relocate_code(addr_sp,id, addr);
6.       删除start.S里的这一段代码:
/*------------------------------------------------------------------------------*/
*void relocate_code (addr_sp, gd, addr_moni)
*  …………………
    …………………
         .globl        relocate_code
relocate_code:
         mov r4, r0        /*save addr_sp */
…………………..
……………………
         blred_led_on
#endif
7.        修改链接脚本把 start.S,init.c, lowlevel.S等文件放在最前面
find-name "u-boot.lds"
vi  ./arch/arm/cpu/u-boot.lds:
    .text :
        {
               __image_copy_start = .;
                CPUDIR/start.o(.text)
           添加:board/samsung/smdk2440/libsmdk2440.o(.text)
                *(.text)
            }
Make一下
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
提示定义的board_init_f 函数与include/common.h:276  类型不相同
处理措施:
修改:unsignedint board_init_f  (ulong) ;
void    board_init_r  (gd_t *, ulong) ;
make 一下
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
提示找不到这个nand_info
处理措施:
   
8.      
            //addr -= gd->mon_len;
            //addr &= ~(4096 - 1);
      addr = CONFIG_SYS_TEXT_BASE;
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
D    修改代码支持NOR FLASH
搜索“Flash:” 找到arch\arm\lib\Board.c
                   //puts(failed);
                   //hang();
                   puts("0KB";
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
后续继续更新。。。。。。。。。。。。。。。。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP