S3C6410移植u-boot-2010.3(3)正常化配置

  一、网卡的正常化配置

  1、修改头文件调用关系

  在原配的smdk6400.h中(因为是复制过来的),网卡配置为CS8900,而手头开发板上的网卡为DM9000,所以第一步来修改网卡驱动程序。

  修改/include/configs/smdk6410.h

  找到如下字段,更改如下

/*
 * Hardware drivers
 */
#define CONFIG_NET_MULTI
//#define CONFIG_CS8900                 /* we have a CS8900 on-board    */
//#define CONFIG_CS8900_BASE            0x18800300
//#define CONFIG_CS8900_BUS16           /* follow the Linux driver      */
#define CONFIG_DRIVER_DM9000    1       /* we have a DM9000 on-board    */
#define CONFIG_DM9000_BASE              0x18000000
#define DM9000_IO               CONFIG_DM9000_BASE
#define DM9000_DATA             (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT

#define CONFIG_ETHADDR          00:40:5c:26:0a:5b
#define CONFIG_NETMASK          255.255.255.0
#define CONFIG_IPADDR           10.0.2.20
#define CONFIG_SERVERIP         10.0.2.2
#define CONFIG_GATEWAYIP        2.2.0.10

  2、修改dm9000x.c文件

  文件为drivers/net/dm9000x.c

  在for(;;)之前加入两句

DM9000_ior(DM9000_MRRH);
DM9000_ior(DM9000_MRRL);

  修改函数为dm9000_halt

static void dm9000_halt(struct eth_device *netdev)
{
        DM9000_DBG("%s\n", __func__);

        /* RESET devie */
//      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 */
 
}

  3、修改net配置文件

  文件一 /net/eth.c

  增加启动属性,在int eth_initialize(bd_t *bis)函数中,增加一段

        /* for DM9000 init */
#if defined(CONFIG_DRIVER_DM9000)
        dm9000_initialize(bis);
#endif  
        /*------------------------------*/

  文件二 /net/net.c

  修改ARP_TIMEOUT

#ifndef CONFIG_ARP_TIMEOUT
//# define ARP_TIMEOUT          5000UL  /* Milliseconds before trying ARP again */
# define ARP_TIMEOUT            5       /* Milliseconds before trying ARP again */
#else
# define ARP_TIMEOUT            CONFIG_ARP_TIMEOUT
#endif

  修改NetArpWaitTimerStart

//      if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT) {
        if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT*CONFIG_SYS_HZ) {

  修改NetSetTimeout

//      NetSetTimeout (10000UL, PingTimeout);
        NetSetTimeout (10*CONFIG_SYS_HZ, PingTimeout);

  文件三/net/tftp.c

  修改 TftpStart (void)

  注释如下函数段

        /*
         * Allow the user to choose TFTP blocksize and timeout.
         * TFTP protocol has a minimal timeout of 1 second.
         */
/*      if ((ep = getenv("tftpblocksize")) != NULL)
 *              TftpBlkSizeOption = simple_strtol(ep, NULL, 10);
 *
 *      if ((ep = getenv("tftptimeout")) != NULL)
 *              TftpTimeoutMSecs = simple_strtol(ep, NULL, 10);
 *
 *      if (TftpTimeoutMSecs < 1000) {
 *              printf("TFTP timeout (%ld ms) too low, "
 *                      "set minimum = 1000 ms\n",
 *                      TftpTimeoutMSecs);
 *              TftpTimeoutMSecs = 1000;
 *      }
 *
 *      debug("TFTP blocksize = %i, timeout = %ld ms\n",
 *              TftpBlkSizeOption, TftpTimeoutMSecs);
 */

  至此,网卡驱动修改完成,可以编译试一试了。

  如果在局域网中,可以尝试ping一下其他主机的ip,此处我不再尝试。

  接着是解决如下问题,NAND读取错误,CRC验证错误。

 

  二、修复NAND flash

  1、/include/linux/mtd/mtd.h

  修改erase_info结构体,注意了是u_int32_t,而不是uint32_t

struct erase_info {
        struct mtd_info *mtd;
/*      uint64_t addr;
 *      uint64_t len;
 *      uint64_t fail_addr;
 */     
        u_int32_t addr;
        u_int32_t len;
        u_int32_t fail_addr;
        u_long time;
        u_long retries;
        u_int dev;
        u_int cell;
        void (*callback) (struct erase_info *self);
        u_long priv;
        u_char state;
        struct erase_info *next;
};

  2、修改 mtd_erase_region_info 

struct mtd_erase_region_info {
//      uint64_t offset;                        /* At which this region starts, from the beginning of the MTD */
        u_int32_t offset;                        /* At which this region starts, from the beginning of the MTD */
        u_int32_t erasesize;            /* For this region */
        u_int32_t numblocks;            /* Number of blocks of erasesize in this region */
        unsigned long *lockmap;         /* If keeping bitmap of locks */
};

  3、修改mtd_info

struct mtd_info {
        u_char type;
        u_int32_t flags;
//      uint64_t size;   /* Total size of the MTD */
        u_int32_t size;   /* Total size of the MTD */
……
}

  4、修改两个函数参量

        /* Chip-supported device locking */
/*      int (*lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);
 *      int (*unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len);
 */
        int (*lock) (struct mtd_info *mtd, loff_t ofs, uint32_t len);
        int (*unlock) (struct mtd_info *mtd, loff_t ofs, uint32_t len);

  5、最后修改/drivers/mtd/nand/nand_ids.c

        /* 16 Gigabit */
        {"NAND 2GiB 1,8V 8-bit",        0xA5, 0, 2048, 0, LP_OPTIONS},
//      {"NAND 2GiB 3,3V 8-bit",        0xD5, 0, 2048, 0, LP_OPTIONS},
        {"NAND 2GiB 3,3V 8-bit",        0xD5, 4096, 2048, 512*1024, LP_OPTIONS},
        {"NAND 2GiB 1,8V 16-bit",       0xB5, 0, 2048, 0, LP_OPTIONS16},
        {"NAND 2GiB 3,3V 16-bit",       0xC5, 0, 2048, 0, LP_OPTIONS16},

  6、修改/includes/asm/arch-s3c64xx/s3c6410.h

/*-----------------------------------------------------------------------
 * Physical Memory Map
 */
//#define DMC1_MEM_CFG  0x00010012      /* burst 4, 13-bit row, 10-bit col */
#define DMC1_MEM_CFG    0x0001001A      /* burst 4, 13-bit row, 10-bit col */
#define DMC1_MEM_CFG2   0xB45
//#define DMC1_CHIP0_CFG        0x150F8         /* 0x5000_0000~0x57ff_ffff (128 MiB) */
#define DMC1_CHIP0_CFG  0x150F0         /* 0x5000_0000~0x57ff_ffff (128 MiB) */
#define DMC_DDR_32_CFG  0x0             /* 32bit, DDR */

  然后可以看到下图  

  此时的NAND flash已经正确读写了,只剩下CRC验证问题还有NAND无法识别zImage的问题。

 

  三、CRC error 

  ……这个我暂时没有解决成功…、日后再说。

  四、zImage识别

   uboot默认只能识别uImage。

  所以要在commom目录下增加一个cmd_bootzImage.c文件

#include <common.h>
#include <command.h>

#ifdef CONFIG_CMD_BOOTZIMAGE 
#define LINUX_PAGE_SHIFT 12
#define LINUX_PAGE_SIZE (1<<LINUX_PAGE_SHIFT)
#define LINUX_MACHINE_ID  1099          //根据平台修改

void do_bootzImage(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
        int i;
        u32 addr;
        char *cmdline = getenv("bootargs");
        void(*run)(int zero, int arch);
        struct param_struct *params = (struct param_struct*)0x20000100;
        //这里要注意根据平台的不同改,一般 约定俗成是内存首地址+100dex

        if(argc < 2){
                addr = load_addr;       //默认加载地址
        }
        else{
                addr = simple_strtoul(argv[1], NULL, 16);
        }

        for(i=0; i<(sizeof(struct param_struct)>>2); i++){
                ((u32 *)params)[i] = 0;
        }

        params->u1.s.page_size = LINUX_PAGE_SIZE;
        params->u1.s.nr_pages = (0x04000000 >> LINUX_PAGE_SHIFT);

        memcpy(params->commandline, cmdline, strlen(cmdline));
        run = (void(*)(int, int))addr;
        printf("start kernel.../n");
        run(0, LINUX_MACHINE_ID);

}

U_BOOT_CMD( bootzImage, 2, 1, do_bootzImage,"bootzImage --boot zImage from ram./n","[addr] boot zImage directoly.");

#endif

  在common/Makefile增加规则

COBJS-$(CONFIG_CMD_BOOTZIMAGE) +=cmd_bootzImage.o

  在include/configs/smdk6410.h文件中添加

#define CONFIG_CMD_BOOTZIMAGE

  但是在我的板子上是运行不成功的。

  现在来做最后一种尝试,见下一篇详解。

 

  

 

转载于:https://www.cnblogs.com/plinx/archive/2013/04/13/3015851.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值