详细的bootloader的移植(6)

简介:
 
    {
        clkdiv = clk_power->CLKDIVN;
        camdiv = clk_power->CAMDIVN;
        /* work out clock scalings */
        switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
        case S3C2440_CLKDIVN_HDIVN_1:
            hdiv = 1;
            break;
        case S3C2440_CLKDIVN_HDIVN_2:
            hdiv = 2;
            break;
        case S3C2440_CLKDIVN_HDIVN_4_8:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
            break;
        case S3C2440_CLKDIVN_HDIVN_3_6:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
            break;
        }
        return get_FCLK() / hdiv;
    }
}
/* return PCLK frequency */
ulong get_PCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    unsigned long clkdiv;
    unsigned long camdiv;
    int hdiv = 1;
    /* support both of S3C2410 and S3C2440 */
    if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
    return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK());
    else
    {   
        clkdiv = clk_power->CLKDIVN;
        camdiv = clk_power->CAMDIVN;
        /* work out clock scalings */
        switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
        case S3C2440_CLKDIVN_HDIVN_1:
            hdiv = 1;
            break;
        case S3C2440_CLKDIVN_HDIVN_2:
            hdiv = 2;
            break;
        case S3C2440_CLKDIVN_HDIVN_4_8:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
            break;
        case S3C2440_CLKDIVN_HDIVN_3_6:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
            break;
        }
        return get_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2:1);
    }        
}
(3)  common/env_nand.c
//   puts ("*** Warning - bad CRC or NAND, using default environment\n\n");   //HJ_del
注释此句
(4)  include/nand.h
struct nand_write_options { 结构体中添加
int skipfirstblk;   /* if true, skip the first good block*/
(5)  include/s3c2410.h
添加:
/* for s3c2440, www.top-e.org */
static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)
{
return (S3C2440_NAND * const)S3C2410_NAND_BASE;
}
5.增加函数实现
(1) common/cmd_load.c
1 】增加函数声明
/* support xmodem*/
static ulong load_serial_xmodem (ulong offset);
并后面添加其函数实现:
/* support xmodem */
static ulong load_serial_xmodem (ulong offset)
{
    int size;
    char buf[32];
    int err;
    int res;
    connection_info_t info;
    char xmodemBuf[1024];
    ulong store_addr = ~0;
    ulong addr = 0;
    size = 0;
    info.mode = xyzModem_xmodem;
    res = xyzModem_stream_open (&info, &err);
    if (!res) {
        while ((res =
            xyzModem_stream_read (xmodemBuf, 1024, &err)) > 0) {
            store_addr = addr + offset;
            size += res;
            addr += res;
#ifndef CFG_NO_FLASH
            if (addr2info (store_addr)) {
                int rc;
                rc = flash_write ((char *) xmodemBuf,
                          store_addr, res);
                if (rc != 0) {
                    flash_perror (rc);
                    return (~0);
                }
            } else
#endif
            {
                memcpy ((char *) (store_addr), xmodemBuf,
                    res);
            }
        }









本文转自 chen138 51CTO博客,原文链接:http://blog.51cto.com/chenboqiang/267035,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
Shell Linux 芯片
嵌入式系统中u-boot和bootloader到底有什么区别
嵌入式系统中u-boot和bootloader到底有什么区别
464 1
嵌入式系统中u-boot和bootloader到底有什么区别
|
6月前
|
存储 运维 Linux
Linux内核学习(三):Bootloader的特种兵-Uboot(一)
Linux内核学习(三):Bootloader的特种兵-Uboot(一)
85 0
|
6月前
|
Linux 编译器 Go
Linux内核学习(四):Bootloader的特种兵-Uboot(二)
Linux内核学习(四):Bootloader的特种兵-Uboot(二)
637 0
|
内存技术 芯片 编译器