AM335x U-boot d代码分析过程3

    我们继续上一篇的代码,已经来到s_init()(位于arch\arm\cpu\armv7\am335x\board.c),其源代码如下:


  1. …defined(CONFIG_SPL_BUILD)  
  2.     gd = &gdata;  
  3.     preloader_console_init();//wlg: uart_init(), and print the first information U-boot SPL…  
  4. #endif  
  5. #if defined(CONFIG_SPL_AM33XX_ENABLE_RTC32K_OSC)  
  6.     /* Enable RTC32K clock */  
  7.     rtc32k_enable();  
  8. #endif  
  9. #ifdef CONFIG_SPL_BUILD  
  10.     board_early_init_f();//wlg: SPL only, initial some thing for sdram  
  11.     sdram_init();//wlg: initial the SDRAM for next stage, this function will read eeprom to decide how to initial sdram  
  12. #endif//wlg: now, we had correctly initial sdram, we return and it’s time to copy uboot from mmc.  
  13. }  
  14. #endif  
...defined(CONFIG_SPL_BUILD)
    gd = &gdata;
    preloader_console_init();//wlg: uart_init(), and print the first information U-boot SPL...




endif

if defined(CONFIG_SPL_AM33XX_ENABLE_RTC32K_OSC)

/* Enable RTC32K clock */
rtc32k_enable();

endif

ifdef CONFIG_SPL_BUILD

board_early_init_f();//wlg: SPL only, initial some thing for sdram
sdram_init();//wlg: initial the SDRAM for next stage, this function will read eeprom to decide how to initial sdram

endif//wlg: now, we had correctly initial sdram, we return and it’s time to copy uboot from mmc.

}

endif


    这段代码的开始,仍是将gdata的地址赋给gd这个指向gd_t(global_data)的指针,而上文中也有提及,gd这个指针实际上就是r9.所以这一步的工作仍然是将r9指向gdata,而gdata这个数据本身就是gd_t(global_data)结构体。这里估计也是进一步的确认吧?再往下看

    进入了preloader_console_init()函数,这个函数位于common\spl\Spl.c文件中,将其展开


  1. void preloader_console_init(void)  
  2. {  
  3.     gd->bd = &bdata;  
  4.     gd->baudrate = CONFIG_BAUDRATE;  
  5.   
  6.     serial_init();      /* serial communications setup */  
  7.   
  8.     gd->have_console = 1;  
  9.   
  10.     puts(”\nU-Boot SPL ” PLAIN_VERSION “ (“ U_BOOT_DATE “ - ” \  
  11.             U_BOOT_TIME ”)\n”);//wlg: now we print our first information  
  12. #ifdef CONFIG_SPL_DISPLAY_PRINT  
  13.     spl_display_print();  
  14. #endif  
  15. }  
void preloader_console_init(void)
{
    gd->bd = &bdata;
    gd->baudrate = CONFIG_BAUDRATE;

    serial_init();      /* serial communications setup */

    gd->have_console = 1;

    puts("\nU-Boot SPL " PLAIN_VERSION " (" U_BOOT_DATE " - " \
            U_BOOT_TIME ")\n");//wlg: now we print our first information




#ifdef CONFIG_SPL_DISPLAY_PRINT spl_display_print(); #endif }


    上面的代码主要是对gd这个指针所指向的结构体(以下简称为gdata结构体)进行赋值,主要包括:

    1. 对gdata结构体中的bd进行赋值,而这个bd本身就是一个指向bd_t(board_data)结构体的指针。所以说上面的bdata其本身也是bd_t(board_data)结构体,在该Spl.c文件中同样由描述:Spl.c (common\spl):static bd_t bdata __attribute__ ((section(“.data”)));所以同gdata一样,bdata也被预先保存在了 .data段中

    2. 对gdata结构体中的baudrate 进行赋值,CONFIG_BAUDRATE实际上就是115200。这个baudrate 实际上记录的就是uart的波特率,为115200.但是这里仅仅只是赋值而已,并没有对实际的uart硬件的波特率进行修改;

    3. 进入serial_init()函数(位于/drivers/serial/serial.c),该函数会利用gdata结构体中的baudrate对实际硬件进行操作!展开如下:

  1. int serial_init(void)  
  2. {  
  3.     gd->flags |= GD_FLG_SERIAL_READY;  
  4.     return get_current()->start();  
  5. }  
int serial_init(void)
{
    gd->flags |= GD_FLG_SERIAL_READY;
    return get_current()->start();
}
    这是个uart的初始化函数,首先是设置标志位,这个标志位就是在gdata结构体中的flags,这个flags是一个32位的数据,每一位都代表着某一标志,如这里就是将那个代表uart已经准备好的标志位拉高(#define GD_FLG_SERIAL_READY 0x00100 /* Pre-reloc serial console ready  */)。这是为了向后传递各种全局信息;

    设置好gdata(再啰嗦一句,gd就是r9,其实际指向gdata)标志位后,然后先执行get_current(),利用其返回再执行start()。先看get_current():

  1. static struct serial_device *get_current(void)  
  2. {  
  3.     struct serial_device *dev;  
  4.   
  5.     if (!(gd->flags & GD_FLG_RELOC))  
  6.         dev = default_serial_console();  
  7.     else if (!serial_current)  
  8.         dev = default_serial_console();  
  9.     else  
  10.         dev = serial_current;  
  11.   
  12.     /* We must have a console device */  
  13.     if (!dev) {  
  14. #ifdef CONFIG_SPL_BUILD  
  15.         puts(”Cannot find console\n”);  
  16.         hang();  
  17. #else  
  18.         panic(”Cannot find console\n”);  
  19. #endif  
  20.     }  
  21.   
  22.     return dev;  
  23. }  
static struct serial_device *get_current(void)
{
    struct serial_device *dev;

    if (!(gd->flags & GD_FLG_RELOC))
        dev = default_serial_console();
    else if (!serial_current)
        dev = default_serial_console();
    else
        dev = serial_current;

    /* We must have a console device */
    if (!dev) {




#ifdef CONFIG_SPL_BUILD puts("Cannot find console\n"); hang(); #else panic("Cannot find console\n"); #endif } return dev; }
    首先看到的是,这个函数的返回,是一个静态变量,而且是一个指向serial_device结构体的指针,继续往下看函数内部

    1. 首先是定义了一个指向serial_device结构体的局部指针变量。

    2. 然后判断gd->flags里面的GD_FLG_RELOC标志位是否有效,这个标志位代表是否已经完成了uboot的重定位,很明显我们目前还只是SPL程序,uboot的镜像还没有被复制到SDRAM中,更没有重定位了。所以这个判断无效,执行下一句

    3. 判断serial_current(这个是全局变量,也是一个指向serial_device结构体的指针)是否为0,如果为0的话,说明当前的serial设备没有初始化完成。很明显,我们之前都没有对这个serial_current进行操作,它实际上就是0x0000,所以这里的判断成立,开始执行dev = default_serial_console();(18 default_serial_console - Function in Serial_ns16550.c (drivers\serial) at line 235 (18 lines) 说实话,这个喊话在哪里定义我还真拿不准,后期再结合Makefile来一起看,暂列如下:

  1. __weak struct serial_device *default_serial_console(void)  
  2. {  
  3. #if CONFIG_CONS_INDEX == 1  
  4.     return &eserial1_device;  
  5. #elif CONFIG_CONS_INDEX == 2  
  6.     return &eserial2_device;  
  7. #elif CONFIG_CONS_INDEX == 3  
  8.     return &eserial3_device;  
  9. #elif CONFIG_CONS_INDEX == 4  
  10.     return &eserial4_device;  
  11. #elif CONFIG_CONS_INDEX == 5  
  12.     return &eserial5_device;  
  13. #elif CONFIG_CONS_INDEX == 6  
  14.     return &eserial6_device;  
  15. #else  
  16. #error “Bad CONFIG_CONS_INDEX.”  
  17. #endif  
  18. }  
__weak struct serial_device *default_serial_console(void)
{




#if CONFIG_CONS_INDEX == 1 return &eserial1_device; #elif CONFIG_CONS_INDEX == 2 return &eserial2_device; #elif CONFIG_CONS_INDEX == 3 return &eserial3_device; #elif CONFIG_CONS_INDEX == 4 return &eserial4_device; #elif CONFIG_CONS_INDEX == 5 return &eserial5_device; #elif CONFIG_CONS_INDEX == 6 return &eserial6_device; #else #error "Bad CONFIG_CONS_INDEX." #endif }    可以看到,这个函数是根据宏来条件编译的,这里的CONFIG_CONS_INDEX实际上在include\configs\am335x….h文件中的定义

  1. /* NS16550 Configuration */  
  2. #define CONFIG_SYS_NS16550_COM1     0x44e09000  /* UART0 */  
  3. #define CONFIG_CONS_INDEX       1  
  4. #define CONFIG_BAUDRATE         115200  
/* NS16550 Configuration */




#define CONFIG_SYS_NS16550_COM1 0x44e09000 /* UART0 */ #define CONFIG_CONS_INDEX 1 #define CONFIG_BAUDRATE 115200    所以default_serial_console()实际返回的就是return &eserial1_device;,而这个由定义如下:

  1. DECLARE_ESERIAL_FUNCTIONS(1);  
  2. struct serial_device eserial1_device =  
  3.     INIT_ESERIAL_STRUCTURE(1, ”eserial0”);  
DECLARE_ESERIAL_FUNCTIONS(1);
struct serial_device eserial1_device =
    INIT_ESERIAL_STRUCTURE(1, "eserial0");
    这里先执行了DECLARE_ESERIAL_FUNCTIONS(1),其功能如下:

  1. #define DECLARE_ESERIAL_FUNCTIONS(port) \  
  2.     static int  eserial##port##_init(void) \  
  3.     { \  
  4.         int clock_divisor; \  
  5.         clock_divisor = ns16550_calc_divisor(serial_ports[port-1], \  
  6.                 CONFIG_SYS_NS16550_CLK, gd->baudrate); \  
  7.         NS16550_init(serial_ports[port-1], clock_divisor); \  
  8.         return 0 ; \  
  9.     } \  
  10.     static void eserial##port##_setbrg(void) \  
  11.     { \  
  12.         serial_setbrg_dev(port); \  
  13.     } \  
  14.     static int  eserial##port##_getc(void) \  
  15.     { \  
  16.         return serial_getc_dev(port); \  
  17.     } \  
  18.     static int  eserial##port##_tstc(void) \  
  19.     { \  
  20.         return serial_tstc_dev(port); \  
  21.     } \  
  22.     static void eserial##port##_putc(const char c) \  
  23.     { \  
  24.         serial_putc_dev(port, c); \  
  25.     } \  
  26.     static void eserial##port##_puts(const char *s) \  
  27.     { \  
  28.         serial_puts_dev(port, s); \  
  29.     }  
#define DECLARE_ESERIAL_FUNCTIONS(port) \
    static int  eserial##port##_init(void) \
    { \
        int clock_divisor; \
        clock_divisor = ns16550_calc_divisor(serial_ports[port-1], \
                CONFIG_SYS_NS16550_CLK, gd->baudrate); \
        NS16550_init(serial_ports[port-1], clock_divisor); \
        return 0 ; \
    } \
    static void eserial##port##_setbrg(void) \
    { \
        serial_setbrg_dev(port); \
    } \
    static int  eserial##port##_getc(void) \
    { \
        return serial_getc_dev(port); \
    } \
    static int  eserial##port##_tstc(void) \
    { \
        return serial_tstc_dev(port); \
    } \
    static void eserial##port##_putc(const char c) \
    { \
        serial_putc_dev(port, c); \
    } \
    static void eserial##port##_puts(const char *s) \
    { \
        serial_puts_dev(port, s); \
    }
    然后执行INIT_ESERIAL_STRUCTURE(1, “eserial0”);


  1. #define INIT_ESERIAL_STRUCTURE(port, __name) {  \  
  2.     .name   = __name,           \  
  3.     .start  = eserial##port##_init,     \  
  4.     .stop   = NULL,             \  
  5.     .setbrg = eserial##port##_setbrg,   \  
  6.     .getc   = eserial##port##_getc,     \  
  7.     .tstc   = eserial##port##_tstc,     \  
  8.     .putc   = eserial##port##_putc,     \  
  9.     .puts   = eserial##port##_puts,     \  
  10. }  
#define INIT_ESERIAL_STRUCTURE(port, __name) { \ 
.name = __name, \
.start = eserial##port##_init, \
.stop = NULL, \
.setbrg = eserial##port##_setbrg, \
.getc = eserial##port##_getc, \
.tstc = eserial##port##_tstc, \
.putc = eserial##port##_putc, \
.puts = eserial##port##_puts, \
}
    简而言之这里就是初始化了一个serial_device结构体eserial1_device,这个结构体里的元素都用default,也就是预先定义好的函数或者字符进行替换。而这个初始化完成的结构体最后就被返回到get_current()函数中的局部变量dev中,在通过判断dev是否有效来,输出一些调试信息!

    最终get_current()函数的返回的就是dev。

————————–get_current()函数结束—————————

    我们继续回到serial_init()函数,我们需要利用get_current()的返回,去执行seserial1_device结构体中的tart元素,也就是说start这个元素实际上就是一个函数指针!我们展开start来看一下,实际上就是:

     .start= eserial##port##_init,(INIT_ESERIAL_STRUCTURE中)

                static int  eserial##port##_init(void) \
        { \
        int clock_divisor; \
        clock_divisor = ns16550_calc_divisor(serial_ports[port-1], \
        CONFIG_SYS_NS16550_CLK, gd->baudrate); \
        NS16550_init(serial_ports[port-1], clock_divisor); \
        return 0 ; \
        } \

    所以执行start()就是执行了上述的static int  eserial##port##_init(void)函数,可以看到这个函数就是利用gd->baudrate对uart进行初始化!这里不再细细展开,因为接下来的操作很多都是寄存器的操作,比较枯燥!


———-serial_init()函数执行完毕——————

    这样我们就返回到了preloader_console_init(),再往下执行:

    4. gd->have_console = 1; 通过设置全局变量,也就是igd所指向的gdata中的have_console元素来告诉其他函数,现在已经有console,也即是说目前已经有一个uart实现的控制台,可以实现简单的数据输出和输入!

    5. 然后我们就打印了UBOOT的信息,包括版本等等。这个其实也就是我们再利用uart实现uboot启动后的第一条信息输出,一般如下:

U-Boot SPL 2015.10-00001-g143c9ee (Nov 06 2015 - 15:27:19)


—————–    preloader_console_init()执行完毕———————

    继续返回到s_init(),

    接下来就要开始执行非常关键的两个函数:

    1.       board_early_init_f();//wlg: SPL only, initial some thing for sdram
    2.       sdram_init();//wlg: initial the SDRAM for next stage, this function will read eeprom to decide how to initial sdram

    第一个函数主要完成SDRAM的前期初始化,第二个函数进一个完成SDRAM的设置,先进入第一个函数:


  1. /* 
  2.  * In the case of non-SPL based booting we’ll want to call these 
  3.  * functions a tiny bit later as it will require gd to be set and cleared 
  4.  * and that’s not true in s_init in this case so we cannot do it there. 
  5.  */  
  6. int board_early_init_f(void)  
  7. {  
  8.     prcm_init();  
  9.     set_mux_conf_regs();  
  10.   
  11.     return 0;  
  12. }  
/*
 * In the case of non-SPL based booting we'll want to call these
 * functions a tiny bit later as it will require gd to be set and cleared
 * and that's not true in s_init in this case so we cannot do it there.
 */
int board_early_init_f(void)
{
    prcm_init();
    set_mux_conf_regs();

    return 0;
}

    看注释,应该是完成引脚的而配置工作,

  1. void prcm_init()  
  2. {  
  3.     enable_basic_clocks();  
  4.     scale_vcores();  
  5.     setup_dplls();  
  6. }  
void prcm_init()
{
    enable_basic_clocks();
    scale_vcores();
    setup_dplls();
}

直接看第三个函数

  1. static void setup_dplls(void)  
  2. {  
  3.     const struct dpll_params *params;  
  4.   
  5.     params = get_dpll_core_params();  
  6.     do_setup_dpll(&dpll_core_regs, params);  
  7.   
  8.     params = get_dpll_mpu_params();  
  9.     do_setup_dpll(&dpll_mpu_regs, params);  
  10.   
  11.     params = get_dpll_per_params();  
  12.     do_setup_dpll(&dpll_per_regs, params);  
  13.     writel(0x300, &cmwkup->clkdcoldodpllper);  
  14.   
  15.     params = get_dpll_ddr_params();  
  16.     do_setup_dpll(&dpll_ddr_regs, params);  
  17. }  
static void setup_dplls(void)
{
    const struct dpll_params *params;

    params = get_dpll_core_params();
    do_setup_dpll(&dpll_core_regs, params);

    params = get_dpll_mpu_params();
    do_setup_dpll(&dpll_mpu_regs, params);

    params = get_dpll_per_params();
    do_setup_dpll(&dpll_per_regs, params);
    writel(0x300, &cmwkup->clkdcoldodpllper);

    params = get_dpll_ddr_params();
    do_setup_dpll(&dpll_ddr_regs, params);
}

直接看倒数第二行,

  1. const struct dpll_params *get_dpll_ddr_params(void)  
  2. {  
  3.     struct am335x_baseboard_id header;  
  4.   
  5.     enable_i2c0_pin_mux();  
  6.     i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);  
  7.     if (read_eeprom(&header) < 0)  
  8.         puts(”Could not get board ID.\n”);  
  9.   
  10.     if (board_is_evm_sk(&header))  
  11.         return &dpll_ddr_evm_sk;  
  12.     else if (board_is_bone_lt(&header))  
  13.         return &dpll_ddr_bone_black;  
  14.     else if (board_is_evm_15_or_later(&header))  
  15.         return &dpll_ddr_evm_sk;  
  16.     else  
  17.         return &dpll_ddr;  
  18. }  
const struct dpll_params *get_dpll_ddr_params(void)
{
    struct am335x_baseboard_id header;

    enable_i2c0_pin_mux();
    i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
    if (read_eeprom(&header) < 0)
        puts("Could not get board ID.\n");

    if (board_is_evm_sk(&header))
        return &dpll_ddr_evm_sk;
    else if (board_is_bone_lt(&header))
        return &dpll_ddr_bone_black;
    else if (board_is_evm_15_or_later(&header))
        return &dpll_ddr_evm_sk;
    else
        return &dpll_ddr;
}

    这个函数的主要功能就是从EEPROM中读取到板子的信息,因为TI有很多开发板,每一个开发板上面的引脚配置是不一样的,SDRAM的容量也不一样,所以TI就把这些关键的board信息放到了一块EEPROM上,通过读取这个EEPROM上的内容来判断如何实现进一步配置!

    那么首先就是EEPROM的读取,为了读取EEPROM,就必须先要初始化I2C接口,利用:

    1.    enable_i2c0_pin_mux();//这一步完成I2C引脚的定义!

    2.    i2c_init( CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);来完成I2C的配置,包括时钟频率等

    以上两步完成以后,就可以开始真正的读取EEPROM里的内容了。实际上一开始就先定义一个struct am335x_baseboard_id header结构体,这个结构体是一个局部变量,所以里面的元素都是无效的,通过读取EEPROM中的数据,完成这个结构体的修改,所以下一步,就是执行read_eeprom(&header) ,并将读过来的数据保存到header结构体中!

    我们会在第4篇开始介绍这个EEPROM的操作,敬请期待

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux系统移植 目 录 第一部分 前言....................................................................................................................................8 1 硬件环境......................................................................................................................................8 1.1 主机硬件环境.......................................................................................................................8 1.2 目标板硬件环境...................................................................................................................8 1.3 工具介绍...............................................................................................................................8 2 软件环境.......................................................................................................................................8 2.1 主机软件环境.......................................................................................................................8 2.1.1 Windows 操作系统.......................................................................................................8 2.1.2 Linux 操作系统 .......................................................................................................8 2.1.3 目标板最后运行的环境...............................................................................................9 2.2 Linux 下工作用户及环境....................................................................................................9 2.2.1 交叉工具的安装...........................................................................................................9 2.2.2 u­boot移植工作目录....................................................................................................9 2.2.3 内核及应用程序移植工作...........................................................................................9 2.3 配置系统服务.....................................................................................................................10 2.3.1 tftp 服务器的配置.......................................................................................................10 2.4 工具使用.............................................................................................................................12 2.4.1 minicom的使用..........................................................................................................12 3 作者介绍....................................................................................................................................13 3.1 策划, 组织, 指导, 发布者...................................................................................................13 3.2 ADS bootloader部分..........................................................................................................13 3.3 交叉工具部分.....................................................................................................................13 3.4 uboot 部分...........................................................................................................................13 3.5 内核部分.............................................................................................................................13 3.6 应用程序部分.....................................................................................................................13 3.7 网卡驱动部分.....................................................................................................................13 3.8 Nand Flash 驱动部分.........................................................................................................13 第二部分 系统启动bootloader 的编写(ADS).................................................................................14 1 工具介绍....................................................................................................................................14 1.1 ADS 命令行命令介绍........................................................................................................14 1.1.1 armasm........................................................................................................................14 1.1.2 armcc, armcpp.............................................................................................................14 1.1.3 armlink.........................................................................................................................14 2 基本原理....................................................................................................................................15 2.1 可执行文件组成及内存映射.............................................................................................15 2.1.1 可执行文件的组成.....................................................................................................15 2.1.2 装载过程.....................................................................................................................16 2.1.3 启动过程的汇编部分.................................................................................................17 2.1.4 启动过程的 C部分.....................................................................................................17 3 AXD的使用以及源代码说明...................................................................................................18 3.1 源代码说明.........................................................................................................................18 3.1.1 汇编源代码说明.........................................................................................................18 3.1.2 C语言源代码说明......................................................................................................23 3.1.3 源代码下载.................................................................................................................23 3.2 AXD的使用.......................................................................................................................23 3.2.1 配置仿真器.................................................................................................................23 3.2.2 启动 AXD 配置开发板...............................................................................................23 第三部分 GNU交叉工具链.............................................................................................................25 1  设置环境变量,准备源码及相关补丁...................................................................................25 1.1 设置环境变量.....................................................................................................................25 1. 2 准备源码包............................................................................................................................25 1.2.1 binuils..........................................................................................................................25 1.2.2 gcc...............................................................................................................................25 1.2.3 glibc.............................................................................................................................25 1.2.4 linux kernel..................................................................................................................26 1.3 准备补丁.............................................................................................................................26 1.3.1 ioperm.c.diff................................................................................................................26 1.3.2 flow.c.diff....................................................................................................................26 1.3.3 t­linux.diff....................................................................................................................26 1.4   编译 GNU binutils...........................................................................................................26 1.5 准备内核头文件.................................................................................................................26 1.5.1 使用当前平台的 gcc编译内核头文件......................................................................26 1.5.2 复制内核头文件.........................................................................................................27 1.6   译编glibc头文件.............................................................................................................27 1.7   编译gcc第一阶段............................................................................................................27 1.8   编译完整的glibc..............................................................................................................27 1.9  编译完整的gcc.................................................................................................................28 2 GNU 交叉工具链的下载...........................................................................................................28 2.1 ARM 官方网站...................................................................................................................28 2.2 本文档提供的下载.............................................................................................................28 3 GNU 交叉工具链的介绍与使用...............................................................................................29 3.1 常用工具介绍.....................................................................................................................29 3.2.1 arm­linux­gcc的使用.................................................................................................29 3.2.2 arm­linux­ar 和 arm­linux­ranlib 的使用..................................................................30 3.2.3 arm­linux­objdump 的使用.........................................................................................30 3.2.4 arm­linux­readelf 的使用............................................................................................31 3.2.6 arm­linux­copydump 的使用......................................................................................32 4 ARM GNU 常用汇编语言介绍.................................................................................................32 4.1 ARM GNU常用汇编伪指令介绍.....................................................................................32 4.2 ARM GNU专有符号.........................................................................................................33 4.3 操作码.................................................................................................................................33 5 可执行生成说明........................................................................................................................33 5.1 lds文件说明.......................................................................................................................33 5.1.1 主要符号说明.............................................................................................................33 5.1.2 段定义说明.................................................................................................................34 第四部分 u­boot 的移植...................................................................................................................35 1 u­boot的介绍及系统结构.........................................................................................................35 1.1 u­boot 介绍.........................................................................................................................35 1.2 获取u­boot.........................................................................................................................35 1.3 u­boot 体系结构.................................................................................................................35 1.3.1 u­boot目录结构..........................................................................................................35 2 uboot的启动过程及工作原理...................................................................................................36 2.1 启动模式介绍.....................................................................................................................36 2.2 阶段1 介绍.........................................................................................................................36 2.2.1 定义入口.....................................................................................................................36 2.2.2 设置异常向量.............................................................................................................37 2.2.3 设置 CPU的模式为SVC模式..................................................................................37 2.2.4 关闭看门狗.................................................................................................................37 2.2.5 禁掉所有中断.............................................................................................................37 2.2.6 设置以 CPU的频率....................................................................................................37 2.2.7 设置 CP15...................................................................................................................37 2.2.8 配置内存区控制寄存器.............................................................................................38 2.2.9 安装 U­BOOT 使的栈空间........................................................................................38 2.2.10 BSS 段清 0................................................................................................................38 2.2.11 搬移 Nand Flash 代码...............................................................................................39 2.2.12 进入 C代码部分.......................................................................................................39 2.3 阶段2 的C语言代码部分 .............................................................................................39 2.3.1 调用一系列的初始化函数.........................................................................................39 2.3.2 初始化网络设备.........................................................................................................41 2.3.3 进入主 UBOOT 命令行..............................................................................................41 2.4 代码搬运.............................................................................................................................41 3 uboot的移植过程.......................................................................................................................42 3.1 环境.....................................................................................................................................42 3.2 步骤.....................................................................................................................................42 3.2.1 修改 Makefile..............................................................................................................42 3.2.2 在 board 子目录中建立 crane2410.............................................................................42 3.2.3 在 include/configs/中建立配置头文件......................................................................42 3.2.4 指定交叉编译工具的路径.........................................................................................42 3.2.5 测试编译能否成功.....................................................................................................42 3.2.6 修改 lowlevel_init.S 文件...........................................................................................43 3.2.9 UBOOT 的 Nand Flash 移植......................................................................................45 3.2.8 重新编译u­boot..........................................................................................................45 3.2.9 把 u­boot烧入flash....................................................................................................45 4  U­BOOT 命令的使用................................................................................................................46 4.1 U­BOOT命令的介绍.........................................................................................................46 4.1.1 获得帮助信息.............................................................................................................46 4.2 常用命令使用说明.............................................................................................................47 4.2.1 askenv(F).....................................................................................................................47 4.2.2 autoscr.........................................................................................................................47 4.2.3 base   ...........................................................................................................................47 4.2.4 bdinfo...........................................................................................................................47 4.2.5 bootp............................................................................................................................47 4.2.8 tftp(tftpboot)................................................................................................................48 4.2.9 bootm...........................................................................................................................48 4.2.10 go...............................................................................................................................48 4.2.11 cmp   .........................................................................................................................48 4.2.12 coninfo  .....................................................................................................................48 4.2.13 cp...............................................................................................................................48 4.2.14 date............................................................................................................................49 4.2.15 erase(F)......................................................................................................................49 4.2.16 flinfo(F).....................................................................................................................49 4.2.17 iminfo........................................................................................................................49 4.2.18 loadb..........................................................................................................................49 4.2.19 md..............................................................................................................................49 4.2.20 mm ............................................................................................................................50 4.2.21 mtest   .......................................................................................................................50 4.2.22 mw.............................................................................................................................50 4.2.23 nm   ...........................................................................................................................50 4.2.24 printenv......................................................................................................................50 4.2.25 ping  ..........................................................................................................................51 4.2.26 reset...........................................................................................................................51 4.2.27 run   ...........................................................................................................................51 4.2.28 saveenv(F).................................................................................................................51 4.2.29 setenv.........................................................................................................................51 4.2.30 sleep...........................................................................................................................51 4.2.31 version.......................................................................................................................51 4.2.32 nand info....................................................................................................................51 4.2.33 nand device ........................................................................................................51 4.2.34 nand bad....................................................................................................................51 4.2.35 nand read...................................................................................................................52 4.2.36 nand erease................................................................................................................52 4.2.37 nand write..................................................................................................................52 4.3 命令简写说明.....................................................................................................................52 4.4 把文件写入NandFlash.......................................................................................................53 4.5 下载提供.............................................................................................................................53 5 参考资料....................................................................................................................................53 第五部分 linux 2.6 内核的移植.......................................................................................................53 1 内核移植过程............................................................................................................................53 1.1 下载linux 内核...................................................................................................................53 1.2 修改Makefile.....................................................................................................................53 1.3 设置flash 分区...................................................................................................................54 1.3.1 指明分区信息.............................................................................................................54 1.3.2 指定启动时初始化.....................................................................................................56 1.3.3 禁止 Flash ECC校验 ................................................................................................56 1.4 配置内核.............................................................................................................................56 1.4.1 支持启动时挂载 devfs................................................................................................56 1.4.2 配置内核产生.config 文件.........................................................................................57 1.4.3 编译内核.....................................................................................................................58 1.4.4 下载 zImage到开发板................................................................................................58 2 创建 uImage................................................................................................................................61 2.1 相关技术背景介绍.............................................................................................................61 2.2 在内核中创建uImage 的方法...........................................................................................61 2.2.1 获取 mkimage工具.....................................................................................................61 2.2.2 修改内核的 Makefile文件.........................................................................................61 3 追加实验记录.............................................................................................................................62 3.1 移植 linux­2.6.15.7..............................................................................................................62 3.2 移植 linux­2.6.16.21............................................................................................................62 3.3 移植linux­2.6.17................................................................................................................62 4 参考资料....................................................................................................................................62 第六部分 应用程序的移植..............................................................................................................63 1 构造目标板的根目录及文件系统.............................................................................................63 1.1 建立一个目标板的空根目录.............................................................................................63 1.2 在 my_rootfs 中建立Linux 目录树...................................................................................63 1.3 创建linuxrc文件................................................................................................................63 2 移植 Busybox.............................................................................................................................64 2.1 下载busybox......................................................................................................................64 2.3 编译并安装Busybox..........................................................................................................65 3 移植 TinyLogin...........................................................................................................................66 3.1 下载.....................................................................................................................................66 3.2 修改tinyLogin 的 Makefile................................................................................................66 3.3 编译并安装.........................................................................................................................66 4 相关配置文件的创建................................................................................................................66 4.1 创建帐号及密码文件.........................................................................................................66 4.2 创建profile文件................................................................................................................67 4.4 创建fstab 文件...................................................................................................................67 4.5 创建inetd.conf 配置文件...................................................................................................67 5 移植 inetd....................................................................................................................................67 5.1 inetd 的选择及获取............................................................................................................67 5.1.1 获取 inetd....................................................................................................................67 5.2 编译inetd............................................................................................................................67 5.2.1 修改 configure文件....................................................................................................67 5.2.2 编译 ...........................................................................................................................68 5.3 配置inetd............................................................................................................................68 5.3.1 拷贝 inetd 到根文件系统的usr/sbin 目录中.............................................................68 6 移植 thttpd Web 服务器.............................................................................................................69 6.1 下载.....................................................................................................................................69 6.2 编译thttpd...........................................................................................................................69 6.3 配置.....................................................................................................................................69 6.3.1 拷贝 thttpd 二进制可执行文件到根文件系统/usr/sbin/目录中...............................69 6.3.2 修改 thttpd 配置文件..................................................................................................69 6.3.3 转移到根文件系统目录,创建相应的文件.............................................................69 7 建立根目录文件系统包............................................................................................................70 7.1 建立CRAMFS 包...............................................................................................................70 7.1.1 下载 cramfs 工具........................................................................................................70 7.1.2 制作 cramfs 包............................................................................................................70 7.1.3 写 cramfs 包到Nand Flash.........................................................................................70 8 参考资料....................................................................................................................................70 第七部分 Nand flash 驱动的编写与移植........................................................................................71 1 Nand flash 工作原理..................................................................................................................71 1.1 Nand flash 芯片工作原理..................................................................................................71 1.1.1 芯片内部存储布局及存储操作特点.........................................................................71 1.1.2 重要芯片引脚功能.....................................................................................................71 1.1.3 寻址方式.....................................................................................................................71 1.1.4 Nand flash 主要内设命令详细介绍...........................................................................72 1.2 Nand Flash 控制器工作原理.............................................................................................72 1.2.1 Nand Flash 控制器特性..............................................................................................72 1.2.2 Nand Flash 控制器工作原理......................................................................................72 1.3 Nand flash 控制器中特殊功能寄存器详细介绍 ............................................................72 1.4 Nand Flash 控制器中的硬件ECC介绍............................................................................73 1.4.1 ECC产生方法............................................................................................................73 1.4.2 ECC生成器工作过程................................................................................................74 1.4.3 ECC的运用................................................................................................................74 2 在 ADS下flash 烧写程序.........................................................................................................74 2.1 ADS 下 flash 烧写程序原理及结构...................................................................................74 2.2 第三层实现说明.................................................................................................................74 2.1.1 特殊功能寄存器定义.................................................................................................74 2.1.2 操作的函数实现.........................................................................................................74 2.3 第二层实现说明.................................................................................................................75 2.3.1 Nand Flash 初始化......................................................................................................75 2.3.3 获取 Nand flash ID......................................................................................................75 2.3.4 Nand flash 写入...........................................................................................................76 2.3.5 Nand flash 读取...........................................................................................................77 2.3.6 Nand flash 标记坏块...................................................................................................78 2.3.7 Nand Flash 检查坏块..................................................................................................79 2.3.8 擦除指定块中数据.....................................................................................................79 2.4  第一层的实现....................................................................................................................80 3 在 U­BOOT 对Nand Flash 的支持............................................................................................82 3.1 U­BOOT对从 Nand Flash 启动的支持.............................................................................82 3.1.1 从 Nand Flash 启动U­BOOT 的基本原理................................................................82 3.1.2 支持 Nand Flash 启动代码说明.................................................................................82 3.2 U­BOOT对 Nand Flash 命令的支持.................................................................................84 3.2.1 主要数据结构介绍.....................................................................................................84 3.2.2 支持的命令函数说明.................................................................................................85 4 在 Linux 对Nand Flash 的支持.................................................................................................87 4.1 Linux 下Nand Flash 调用关系..........................................................................................87 4.1.1 Nand Flash 设备添加时数据结构包含关系..............................................................87 4.1.2 Nand Flash 设备注册时数据结构包含关系..............................................................87 4.2 Linux 下Nand Flash 驱动主要数据结构说明..................................................................88 4.2.1 s3c2410 专有数据结构...............................................................................................88 4.2.2 Linux 通用数据结构说明..........................................................................................89 4.3.1 注册 driver_register....................................................................................................94 4.3.2 探测设备 probe...........................................................................................................94 4.3.3 初始化 Nand Flash 控制器.........................................................................................94 4.3.4 移除设备.....................................................................................................................94 4.3.5 Nand Flash 芯片初始化..............................................................................................94 4.3.6  读 Nand  Flash............................................................................................................95 4.3.7  写 Nand Flash.............................................................................................................95 第八部分 Cs8900a网卡驱动的编写与移植...................................................................................95 1 Cs8900a工作原理......................................................................................................................95 2 在 ADS下cs8900a的实现........................................................................................................95 2.1 在 cs8900a下实现的ping 工具.........................................................................................95 3 在 u­boot下cs8900a的支持......................................................................................................96 3.1 u­boot 下cs8900a的驱动介绍...........................................................................................96 3.2 u­boot 下cs8900a的移植说明...........................................................................................96 4 在 linux 下cs8900a驱动的编写与移植....................................................................................96 4.1 Linux 下cs8900a的驱动说明............................................................................................96 4.2 Linux 下 cs8900a的移植说明...........................................................................................96 4.2.1 为 cs8900a建立编译菜单..........................................................................................96 4.2.2 修改 S3C2410相关信息............................................................................................97 序 该文档的目的是总结我们在工作中的一些经验,并把它们分享给喜欢 ARM 和 Linux 的朋友, 如有错误 之处,请大家多多指点. 同样, 我们也希望更多人能把自己的工作经验和体会加入该文档,让大家共同进步. 该文档是一份交流性文档, 只供个人学习与交流,不允许公司和企业用于商业行为
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值