打印

2440U-BOOT 移植nand之外部分,笔记。

[复制链接]
2887|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
icecut|  楼主 | 2009-12-14 20:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2440U-BOOT 移植nand之外部分,笔记。
刚才看到有人发了《U-BOOT移植手册》,正好是我没写的部分。大家先看那个。比较入门。
总是匆匆的。还没移植完整U-BOOT,又要去准备学习STM32,我的计划总是半途改变。虽然没有NAND,现在这样也可以做个总结了。否则就忘记了。
我移植的版本是2009-11版,但是到现在已经不再是最新了。
我是一个懒人,从2年前就准备移植一下。上次是因为jlink不支持在Linux下调试而终结,其实,这些都不难,关键是一条主线。不要走错误路线。这次的路线,依旧是一条主线,一个懒人的主线。
我选择了一个OPENJTAG,这是一个Linux下的仿真器,虽然速度不快,虽然eclipse总有些小错误,我还是很喜欢它,至少不用点灯大-法了。
移植的芯片是2440,我以为是兼容2410的,其实我错了。这个让我浪费了几天时间。下面我先总结一下方法。一般有2中方法,一种是主动移植,第二种是被动移植。
对于主动移植,就是对比2410版和2440芯片手册的区别,还有pcb的区别。然后修改寄存器声明文件。然后运行至ok
对于被动移植,那就是,搞一个环境,不改动任何,然后仿真,直到跑飞为止,然后分析如何出错的。
我采用的第二种,开始移植到时候,连芯片手册都没读。当然对U-BOOT的了解也不深,然后直到跑飞。。。。。。
先搞定start.S,由于是内存仿真,所以,网上说注释掉底层初始化,但是我不知道为什么,于是我先注释掉,把start.S仿真的直到熟悉,然后再看看底层初始化为什么要注释掉。
创建属于2440的环境。比如说smdk2440文件夹,configs下的smdk2440.h。这些都是按照网上复制的。然后修改makefile让其被编译。然后就会出现错误。这里就找找是不是被#ifdefine 或着#if defined()给注释掉了。直到编译成功。这样,和2410兼容的东西都被包含过来了。
随着以前的**,1,把中断初始化给更新了。24402410要多机构中断。这里我就不写了。网上一大堆。首次调试我就看看直接运行2410的代码会如何。结果发现跑飞了,初始化中断后ok了。(但是芯片复位后,中断是关闭的,所以看出内存仿真时,中断不是关闭的)。
2.测试一下底层初始化为什么要被注释。
原因是这样的start.S是从0地址开始编译的。底层初始化配置内存的时候就从nor地址读取的,而不是当前调试的文件,导致配置错误,在配置sdram的时候跑飞。而其他文件是基于内存地址编译的,这样一个b start_armboot就可以跳到内存空间。这就是所谓的分散加载。
3.还需要改底层初始化的sdram初始化。这里网上比较多了,就搜个值填上吧。都是鸟语,慢慢算也能算出来。

相关帖子

沙发
icecut|  楼主 | 2009-12-14 20:21 | 只看该作者
4.这样也能执行到c语言里去了。那就跑吧。然后困扰我三天的问题就这样来了。串口输出是乱码,记得以前移植到时候没出现乱码,不知道以前怎么搞的,估计是patch过网上的包。现在去搜,说是串口模块时钟不对,我愿意为是兼容的。网上就那么提了一下。郁闷之极我去看2410和2440的芯片手册,发现的确不是那会事。时钟配置差远了。还有一个问题是start.S里我的总线速率配置的是1:2:4(值是3)可是到c语言里不知哪里给我改成了1:4:8(值是5),最后发现如果配置成1:2:4然后使用400.5M的话总线速度会超过允许值。不过调试的时候还没出现问题。于是改成5.在UBOOT中串口的配置是自己计算的,所以我无论如何也想不通为什么会算错(看来那时候我傻了,傻到不知道如何找错误了).网上搜到是pclk的问题之后,我开始调试,发现串口寄存器计算出来的值不对.然后我重新考虑了MCLK,HCLK ,PCLK,然后看网上的移植,直接配置了PCLK的值,我是极度不推荐了。写死这个值,就等于结束了这次移植,以后遇到还要重新搞。我根据芯片手册重写了get_PCLK,函数,这里对寄存器结构进行了扩展,因为2440增加了寄存器。写到这里的时候,串口输出就正确了。但是又卡在了网络上,网卡自检失败。我以为莫非是总线配置错误?(我还是太笨了,这个配置是openjtag自带的初始化程序初始化的。这个是支持2410和2440的。)然后就调试,走到它跑飞的地方,我是很有耐心的。以前做逆向工程时候练就的。结果呢,发现使用了一个异常的地址。一步步的回来找,发现竟然是个BUG,在没有初始化结构变量就先使用了。哎呀。估计下一个版本会更正吧。调节这两个代码的位置就ok了。
以后就要增加nand的读写了。这个曾经做过,但是失败在不知为什么就不认nand了。由于学习stm32,先放下这个了。
关键代码:

int cs8900_initialize(u8 dev_num, int base_addr)
{
    struct eth_device *dev;
    struct cs8900_priv *priv;

    dev = malloc(sizeof(*dev));
    if (!dev) {
        free(dev);
        return 0;
    }
    memset(dev, 0, sizeof(*dev));

    priv = malloc(sizeof(*priv));
    if (!priv) {
        free(priv);
        return 0;
    }
    memset(priv, 0, sizeof(*priv));
    priv->regs = (struct cs8900_regs *)base_addr;

    dev->iobase = base_addr;//原文这2句在下面,导致出错
    dev->priv = priv;
    /* Load MAC address from EEPROM */
    cs8900_get_enetaddr(dev);

    dev->init = cs8900_init;
    dev->halt = cs8900_halt;
    dev->send = cs8900_send;
    dev->recv = cs8900_recv;
    sprintf(dev->name, "%s-%hu", CS8900_DRIVERNAME, dev_num);

    eth_register(dev);
    return 0;
}

ulong get_HCLK(void)
{
    struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
    ulong nRet = 0;
// 下面是对HCLK频率的计算
    unsigned int nCLKDIVN = readl(&clk_power->CLKDIVN);
    unsigned int nCAMDIVN = readl(&clk_power->CAMDIVN);
    switch(nCLKDIVN & 6)
    {
        case 0:
            nRet = get_FCLK();
            break;
        case 2:
            nRet = get_FCLK() / 2;
            break;
        case 4:
            if (nCAMDIVN & 0x100)
            {
                nRet = get_FCLK() / 8;
            }
            else
            {
                nRet = get_FCLK() / 4;
            }
            break;
        case 6:
            if (nCAMDIVN & 0x80)
            {
                nRet = get_FCLK() / 6;
            }
            else
            {
                nRet = get_FCLK() / 3;
            }
            break;
        default:
            break;
    }
    return nRet;
}

使用特权

评论回复
板凳
huangqi412| | 2009-12-14 20:23 | 只看该作者
MARK一下,

使用特权

评论回复
地板
icecut|  楼主 | 2009-12-14 22:23 | 只看该作者
顶一个,我发现大晚上的帖子沉的 还挺快

使用特权

评论回复
5
liliang9554| | 2009-12-14 22:25 | 只看该作者
U-BOOT移植手册在哪?

使用特权

评论回复
6
icecut|  楼主 | 2009-12-15 09:28 | 只看该作者
5# liliang9554

也在这一版
https://bbs.21ic.com/icview-148714-1-1.html

使用特权

评论回复
7
myitlover| | 2009-12-15 10:11 | 只看该作者
没有移植nand啊

使用特权

评论回复
8
icecut|  楼主 | 2009-12-15 12:48 | 只看该作者
nand 不难啊....就是start.s里从nand读出来.写汇编函数.
c也写一个驱动就可以.

网上有

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:个人发展,技术咨询,点此  嵌入式arm爱好者←← +→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

1120

主题

15358

帖子

585

粉丝