zoukankan      html  css  js  c++  java
  • FL2440移植u-boot2011.09

    u-boot version:2011.09-rc1

    /home/lucas/u-boot-2011.09-rc1

    OS:debian 7.1

    cross-compilation chain:arm-linux-4.3.2

    致谢:部分内容参考http://my.csdn.net/crazyman2010的博文,感谢分享。

    第一步:u-boot初步编译

    【目的】验证开发平台可以正确编译u-boot,初步建立文件目录。

    1.建立目标板相关文件

    (1)建立板级文件夹

    board/samsung下建立fl440目录,并将相似的板级文件夹smdk2410下全部文件拷贝过去。重命名fl2440下的smdk2410.c为fl2440.c;修改Makefile中的目标COBJS中的smdk2410.ofl2440.o

    (2)建立芯片级文件夹

    直接使用cpu/arm920t的芯片文件夹即可,无需修改。

    2.初步编译u-boot生成.bin文件

    (1)建立配置文件

    拷贝includ/configs/smdk2410.h,重命名为fl2440.h

    (2)建立编译规则

    在根目录的Makefile中找到ARM架构smdk2410编译规则

    smdk2410_config : unconfig
      @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0

    仿写fl2440编译规则

    fl2440+config : unconfig
      @$(MKCONFIG) $(@:_config=) arm arm920t fl2440 samsung s3c24x0

    另外需要指定交叉编译:

    CROSS_COMPILE ?= arm-linux-

    (3)编译u-boot

    make clean

    make fl2440_config

    make

    【注】根目录下生成u-boot.bin和u-boot(即u-boot.axf,添加axf缀即可)。若编译工具为3.3.2等不支持软浮点型,需要把arm920t/config.mk中的#-msoft-float注释掉。

    【特别说明】DNW下载的程序是从指定位置运行,而u-boot默认地址为0。FL2440的DRAM地址空间是0x30000000-0x34000000,共64M。所以需要修改

    (1)修改DNW配置,设置下载地址为0x32000000;

    (2)修改include/configs/fl2440.h:#define CONFIG_SYS_TEXT_BASE    0x32000000

    第二步:修改相关配置,在SDRAM中调试

    【注】因为实在SDRAM中调试,需要跳过cpu的初始化,所以应在include/configs/fl2440.h中添加#define  CONFIG_SKIP_LOWLEVEL_INIT 1

    1.修改include/configs/fl2440.h

    删除:

    #define CONFIG_S3C2410          /*specifically a SAMSUNG S3C2410 SoC */

    #define CONFIG_SMDK2410         /* on aSAMSUNG SMDK2410 Board */
    添加:
    #define CONFIG_S3C2440 
    【注】将NAND配置先注释起来,不然会有很多错误:/*#define CONFIG_CMD_NAND*/
    更改内存范围:
    #defineCONFIG_SYS_MEMTEST_END         0x33F00000
    修改为:
    #defineCONFIG_SYS_MEMTEST_END         0x34000000
    2.修改时钟

    (1)修改arch/arm/cpu/arm920t/start.S

    在line163处增加屏蔽中断代码:

    # if defined(CONFIG_S3C2440)
            ldr     r1,=0x7fff /*S3C2440使用15位,所以是111 1111 1111 1111*/
            ldr     r0,=INTSUBMSK
            str     r1, [r0]
    # endif

    删除:

    ldr     r0, =CLKDIVN
    mov     r1, #3
    str     r1, [r0]

    添加:

    # if defined(CONFIG_S3C2440)
            ldr     r0,=CLKDIVN
            mov     r1, #5
            str     r1, [r0]
    #endif

    (2)修改board/samsung/fl2440/fl2440.c

    删除:

    #define FCLK_SPEED 1
    #ifFCLK_SPEED==0              /* Fout = 203MHz, Fin = 12MHz for Audio */
    #define M_MDIV  0xC3
    #define M_PDIV  0x4
    #define M_SDIV  0x1
    #elifFCLK_SPEED==1            /* Fout = 202.8MHz */
    #define M_MDIV  0xA1
    #define M_PDIV  0x3
    #define M_SDIV  0x1
    #endif
    #define USB_CLOCK 1
    #if USB_CLOCK==0
    #define U_M_MDIV        0xA1
    #define U_M_PDIV        0x3
    #define U_M_SDIV        0x1
    #elif USB_CLOCK==1
    #define U_M_MDIV        0x48
    #define U_M_PDIV        0x3
    #define U_M_SDIV        0x2
    #endif

    添加:(晶振12M,CPU405M,USB48M)

    #define M_MDIV 0x7f
    #define M_PDIV 0x2
    #define M_SDIV 0x1
    #define U_M_MDIV 0x38
    #define U_M_PDIV 0x2
    #define U_M_SDIV 0x2

    修改 board_init 函数中:
    gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
    改为:
    gd->bd->bi_arch_number = MACH_TYPE_S3C2440;

    3.再次编译u-boot,串口有输出


    第三步:配置Nand Flash(K9F1G08U0A 128MB 8BIT)

    1.删除对Nor Flash支持

    (1)修改include/configs/fl2440.h

    删除:

    #define CONFIG_SYS_FLASH_CFI
    #define CONFIG_FLASH_CFI_DRIVER
    #define CONFIG_FLASH_CFI_LEGACY
    #define CONFIG_SYS_FLASH_LEGACY_512Kx16
    #define CONFIG_FLASH_SHOW_PROGRESS      45
    #define CONFIG_SYS_MAX_FLASH_BANKS      1
    #define CONFIG_SYS_FLASH_BANKS_LIST     { CONFIG_SYS_FLASH_BASE }
    #define CONFIG_SYS_MAX_FLASH_SECT       (19)
    #define CONFIG_ENV_ADDR                 (CONFIG_SYS_FLASH_BASE + 0x070000)
    #define CONFIG_ENV_IS_IN_FLASH

    添加:

    #define CONFIG_SYS_NO_FLASH 1
    #define CONFIG_ENV_IS_NOWHERE   1

    (2)修改include/config_cmd_default.h

    删除:

    #define CONFIG_CMD_IMI
    #define CONFIG_CMD_IMLS

    (3)修改 board/samsung/fl2440/fl2440.c

    修改board_flash_get_legacy函数附近代码:

    #if !defined(CONFIG_SYS_NO_FLASH)
    ulong board_flash_get_legacy(ulong base, int banknum, flash_info_t *info)
    {
            info->portwidth = FLASH_CFI_16BIT;
            info->chipwidth = FLASH_CFI_BY16;
            info->interface = FLASH_CFI_X16;
            return 1;
    }
    #endif

    2.添加Nand Flash支持

    (1)修改include/configs/fl2440.h

    取消CONFIG_CMD_NAND的注释。

    (2)添加Nand驱动文件

    拷贝drivers/mtd/nand/s3c2410_nand.c,并更名s3c2440_nand.c,并修改:

    删除:

    #define S3C2410_NFCONF_EN          (1<<15)
    #define S3C2410_NFCONF_512BYTE     (1<<14)
    #define S3C2410_NFCONF_4STEP       (1<<13)
    #define S3C2410_NFCONF_INITECC     (1<<12)
    #define S3C2410_NFCONF_nFCE        (1<<11)
    #define S3C2410_NFCONF_TACLS(x)    ((x)<<8)
    #define S3C2410_NFCONF_TWRPH0(x)   ((x)<<4)
    #define S3C2410_NFCONF_TWRPH1(x)   ((x)<<0)
    #define S3C2410_ADDR_NALE 4
    #define S3C2410_ADDR_NCLE 8

    添加:

    #define S3C2440_ADDR_NALE 0xc
    #define S3C2440_ADDR_NCLE 0x8

    替换所有的2410为2440::g/2410/s//2440/g

    修改boart_nand_init函数:

    删除:

    #else
            tacls = 4;
            twrph0 = 8;
            twrph1 = 8;
    #endif
      cfg = S3C2440_NFCONF_EN;
      cfg |= S3C2440_NFCONF_TACLS(tacls - 1);
      cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);
      cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);
    writel(cfg, &nand_reg->nfconf);

    添加:

    #else
    /*
    HCLK is 100MHZ
    FL2440'NAND FLASH IS K9F1G08U0A
    time_acls=tacls*HCLK=10ns
    time_we=HCLK*(twrph0+1)=15ns
    time_wh=HCLK*(twrph1+1)=10ns
    */
            tacls = 1;//10ns
            twrph0 = 1;//20ns
            twrph1 = 0;
    #endif
            u_int32_t cnt;
            cfg =tacls<<12 | twrph0<<8 | twrph1<<4;//for nfconf
            cfg &= ~(1<<0);//bus 8bit
            writel(cfg, &nand_reg->nfconf);
            cnt = 1<<6|1<<5|1<<0;//for nfcont
            writel(cnt,&nand_reg->nfcont);

    修改s3c2440_hwcontrol函数:

    struct nand_chip *chip = mtd->priv;  
            struct s3c2440_nand *nand = s3c2440_get_base_nand();  
            debugX(1, "hwcontrol(): 0x%02x 0x%02x ", cmd, ctrl);  
       //if (ctrl & NAND_CTRL_CHANGE) { 
            ulong IO_ADDR_W = (ulong)nand;  
                    if (ctrl & NAND_CLE)  
                            IO_ADDR_W |= S3C2440_ADDR_NCLE;  
                    if (ctrl & NAND_ALE)  
                           IO_ADDR_W |= S3C2440_ADDR_NALE;  
                    //chip->IO_ADDR_W=(void*)IO_ADDR_W;  
                    if(ctrl & NAND_NCE){  
                            writel(readl(&nand->nfcont) & ~(1<<1),&nand->nfcont);  
                     }else{  
                            writel(readl(&nand->nfcont) | (1<<1),&nand->nfcont);  
                     }  
            //}  
            if (cmd != NAND_CMD_NONE)  
                    writeb(cmd,(void*)IO_ADDR_W); 

    3.重新编译u-boot,有Nand信息输出

    第三步:添加网卡支持(DM9000)

    1.删除原网卡CS8900支持

    修改include/configs/fl2440.h

    /*#define CONFIG_CS8900*/               /* we have a CS8900 on-board */  
    /*#define CONFIG_CS8900_BASE    0x19000300 */  
    /*#define CONFIG_CS8900_BUS16*/ /* the Linux driver does accesses as shorts */  
    #define CONFIG_DRIVER_DM9000 1  
    #define CONFIG_DM9000_BASE 0x20000300  
    #define DM9000_IO CONFIG_DM9000_BASE  
    #define DM9000_DATA (CONFIG_DM9000_BASE+4) /* the cmd pin is addr2*/  
    #define CONFIG_ETHADDR a8:00:3E:26:0A:5B  
    #define CONFIG_NETMASK 255.255.255.0  
    #define CONFIG_IPADDR 192.168.1.11  
    #define CONFIG_SERVERIP 192.168.1.234  
    #define CONFIG_NET_MULTI  
    /* 
    #define CONFIG_NETMASK          255.255.255.0 
    #define CONFIG_IPADDR           10.0.0.110 
    #define CONFIG_SERVERIP         10.0.0.1 
    */ 

    【注】DM9000接到NGCS4,基址为0x20000000,网卡基址0x20000300。

    2.添加DM9000支持

    (1)修改board/samsung/fl2440/fl2440.c中的board_eth_init函数

    #ifdef CONFIG_CMD_NET  
    int board_eth_init(bd_t *bis)  
    {  
            return dm9000_initialize(bis);  
    }  
    #endif 

    (2)修改drivers/net/dm9000x.c

    删除:

    i = 0;  
    while (!(dm9000_phy_read(1) & 0x20)) {  /* autonegation complete bit */  
            udelay(1000);  
            i++;  
            if (i == 10000) {  
                    printf("could not establish link ");  
                    return 0;  
            }  
    }  
    /* see what we've got */  
    lnk = dm9000_phy_read(17) >> 12;  
    printf("operating at ");  
    switch (lnk) {  
    case 1:  
            printf("10M half duplex ");  
            break;  
    case 2:  
            printf("10M full duplex ");  
            break;  
    case 4:  
            printf("100M half duplex ");  
            break;  
    case 8:  
            printf("100M full duplex ");  
            break;  
    default:  
            printf("unknown: %d ", lnk);  
            break;  
    }  
    printf("mode "); 

    删除函数 dm9000_halt 中的内容:

    static void dm9000_halt(struct eth_device *netdev)  
    {  
    #if 0  
            DM9000_DBG("%s ", __func__);  
            /* RESET devie */  
            dm9000_phy_write(0, 0x8000);    /* PHY RESET */  
            DM9000_iow(DM9000_GPR, 0x01);   /* Power-Down PHY */  
            DM9000_iow(DM9000_IMR, 0x80);   /* Disable all interrupt */  
            DM9000_iow(DM9000_RCR, 0x00);   /* Disable RX */  
    #endif  

    3.重新编译u-boot,可以启动网卡了

    作者:Lucas Hsueh
    文章部分是自己的学习体会、代码等,还有收集和整理其他技术牛人的文章。
  • 相关阅读:
    MianShiTi
    C#多线程解决界面卡死问题的完美解决方案
    C#中的WebBrowser控件的使用
    解决Linq第一次调用存储过程时速度慢的问题
    AX 的 NumberSequences
    Ax 从一个form关闭另外一个form,AX全局变量
    查询数据库后台Block 的Sql存储过程
    Dynamic AX 4.0 用户组权限SecurityKey
    20160408 从软件工程的3大文档开始说起
    获取AX的窗口所有控件的lableID及内容
  • 原文地址:https://www.cnblogs.com/lucas-hsueh/p/3709063.html
Copyright © 2011-2022 走看看