免费注册 查看新帖 |

Chinaunix

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

[BootLoader] u-boot2012.04.01移植到JZ2440 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-04-18 13:40 |只看该作者 |倒序浏览
重点
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的宏开关
注销掉  //#define CONFIG_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.  编译相近的smdk2410看u-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

3.  vi boards.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的设置
   注释掉原文对PLL,MPLL的设置,,提取到start.S里设置
1.        注释掉(\board\samsung\smdk2410\Smdk2440.c)int board_early_init_f(void)中的
#if 0
        /* to reduce PLL lock time, adjust the LOCKTIME register */
        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
        //        mov r1, #0x03;                          // FCLK:HCLKCLK=1:2:4, HDIVN=1,PDIVN=1
        mov r1, #0x05;                          // FCLK:HCLKCLK=1:4:8
        str r1, [r0]

        /* 如果HDIVN非0,CPU的总线模式应该从“fast bus 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                /* 写入控制寄存器 */

#define S3C2440_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  出现乱码


三:  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 S3C2410 SoC */
添加     #define CONFIG_S3C2440
Make
出现一堆问题


查看代码发现因为我们关闭了 CONFIG_S3C2410 这个宏,导致里面的nand->nfconf成员不能用,需要完全的修改  static void s3c2410_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宏     
找到#define CONFIG_NAND_S3C2410的宏开关
全部注销   #ifdef CONFIG_CMD_NAND
//#define CONFIG_CMD_NAND
Make 烧写进NOR flash

看结果 能正常显示!!!!!



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
vi board/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)
{
        volatile int *p = (volatile int *)0;
        int val;

        val = *p;
        *p = 0x12345678;
        if (*p == 0x1234567
        {
                /* 写成功, 是nand启动 */
                *p = val;
                return 0;
        }
        else
        {
                /* NOR不能像内存一样写 */
                return 1;
        }
}

void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{        
        int i = 0;
        
        /* 如果是NOR启动 */
        if (isBootFromNorFlash())
        {
                while (i < len)
                {
                        dest = src;
                        i++;
                }
        }
        else
        {
                nand_read_ll((unsigned int)src, dest, len);
        }
}

void clear_bss(void)
{
        extern int __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)
{
        volatile int i;
        NFCMMD = cmd;
        for (i = 0; i < 10; i++);
}

static void nand_addr(unsigned int addr)
{
        unsigned int col  = addr % 2048;
        unsigned int page = addr / 2048;
        volatile int 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)
{
        return NFDATA;
}

void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)
{
        int col = addr % 2048;
        int i = 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 to call 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 */
…………………..
……………………
        bl red_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 一下

提示定义的board_init_f 函数与include/common.h:276行  类型不相同
处理措施:
修改:unsigned int board_init_f  (ulong) ;
void    board_init_r  (gd_t *, ulong) ;
make 一下

提示找不到这个nand_info
处理措施:
   



8.         
           //addr -= gd->mon_len;
           //addr &= ~(4096 - 1);
       addr = CONFIG_SYS_TEXT_BASE;




D     修改代码支持NOR FLASH
搜索 “Flash:” 找到arch\arm\lib\Board.c
                //puts(failed);
                //hang();
                puts("0 KB";


还未写完,,,后续继续更新










论坛徽章:
24
15-16赛季CBA联赛之北京
日期:2018-08-17 18:43:33技术图书徽章
日期:2018-08-22 12:53:57技术图书徽章
日期:2018-08-22 12:54:20技术图书徽章
日期:2018-08-22 12:54:3015-16赛季CBA联赛之福建
日期:2018-10-19 16:58:1619周年集字徽章-庆
日期:2019-08-27 13:28:5619周年集字徽章-19
日期:2019-08-27 13:31:2619周年集字徽章-19
日期:2019-08-27 13:31:2615-16赛季CBA联赛之同曦
日期:2019-09-05 12:03:2819周年集字徽章-周
日期:2019-09-06 18:54:5415-16赛季CBA联赛之上海
日期:2018-07-25 11:55:2615-16赛季CBA联赛之青岛
日期:2018-07-10 14:13:18
2 [报告]
发表于 2017-06-06 14:01 |只看该作者
不错,点赞

论坛徽章:
0
3 [报告]
发表于 2017-06-17 20:10 |只看该作者
如果排版里面把表情符号处理掉就更好拉
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP