u-boot2013.01デバイスツリーを使用してbootargsプロセス分析を取得する

4674 ワード

u-bootデバイスツリー形式取得bootargs
1.プログラム呼び出しプロセス
do_bootm
        bootm_start(cmdtp, flag, argc, argv)
        bootm_load_os(images.os, &load_end, 1)
        boot_fn = boot_os[images.os.os];
        boot_fn(0, argc, argv, &images);
              do_bootm_linux
                boot_prep_linux
                      create_fdt(bootm_headers_t *images)
                                ftd_chosen
                                            bootargs

2.詳細分析
do_bootm
        bootm_start(cmdtp, flag, argc, argv)
        bootm_load_os(images.os, &load_end, 1)
        boot_fn = boot_os[images.os.os];
        boot_fn(0, argc, argv, &images);
              do_bootm_linux
                boot_prep_linux         
                    //    。    
                    
                            #ifdef CONFIG_OF_LIBFDT
                            if (images->ft_len) {
                                debug("using: FDT
"); if (create_fdt(images)) { printf("FDT creation failed! hanging..."); hang(); } } else #endif // , #define CONFIG_OF_LIBFDT ( origen.h (\include\configs) boot_jump_linux

3. create_fdt分析
  
  static int create_fdt(bootm_headers_t *images)        
                
                ulong of_size = images->ft_len;
                char **of_flat_tree = &images->ft_addr;
                ulong *initrd_start = &images->initrd_start;
                ulong *initrd_end = &images->initrd_end;
                struct lmb *lmb = &images->lmb;
                ulong rd_len;
                int ret;
                
                boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
                // fdt       
                
                ret = boot_ramdisk_high(lmb, images->rd_start, rd_len,initrd_start, initrd_end);
                //ramdisk   ,    
                
                ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
                //         。         ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
                
                fdt_chosen(*of_flat_tree, 1);
                //    chosen node ,           
                
                            str = getenv("bootargs");
                            //        
                
                            err = fdt_setprop(fdt, nodeoffset,"bootargs", str, strlen(str)+1);
                            // bootargs          
                            
                fixup_memory_node(*of_flat_tree);
                
                            for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
                                start[bank] = bd->bi_dram[bank].start;
                                size[bank] = bd->bi_dram[bank].size;
                            }
                            //         
                            
                            fdt_fixup_memory_banks(blob, start, size, CONFIG_NR_DRAM_BANKS);
                            //       memory node
                            
                            fdt_fixup_ethernet(*of_flat_tree);
                          //      fdt
                          
                          fdt_initrd(*of_flat_tree, *initrd_start, *initrd_end, 1);            
                          //ramdisk    fdt
4.
 boot_jump_linux

        #ifdef CONFIG_OF_LIBFDT
            if (images->ft_len)
                r2 = (unsigned long)images->ft_addr;
            else
        #endif                    
            kernel_entry(0, machid, r2);      
        //             ,      。
        //         ,    gd->bd->bi_boot_params; 0x30001000      

参考文献:
 http://blog.csdn.net/xy010902100449/article/details/46918145
Uboot mainlineはv 1から.1.3デバイスTreeのサポートを開始し、ARMのサポートはARMカーネルサポートデバイスTreeと同期して完了する.
デバイスTreeができるように、Ubootをコンパイルするときにconfigファイルに#define CONFIG_を入れる必要があります.OF_LIBFDT
Ubootでは、NAND、SDまたはTFT P等の任意の媒体から、dtbはメモリを読み込む、仮定する.dtbに入れるメモリアドレスは0 x 7100000であり、その後Ubootでコマンドfdt addrコマンド設定を実行することができる.dtbのアドレス:
U-Boot> fdt addr 0x71000000
fdtの他のコマンドは、fdt resize、fdt printなど、使用可能になります.
ARMではbootz kernel_を透過できますaddr initrd_address dtb_addressのコマンドはカーネル、すなわちdtb_を起動します.addressはbootzまたはbootmの最後のパラメータとして、1番目のパラメータはカーネルイメージのアドレスであり、2番目のパラメータはinitrdのアドレスであり、initrdが存在しなければ-で代用することができる.