U-Boot 除了 Bootloader 的系統引導功能,它還有用戶命令介面,具備多種引導內核啟動的方式。常用的 go 和 bootm 命令可以直接引導 Linux 內核映像啟動。
U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目。從FADSROM、8xxROM、PPCBOOT逐步發展演化而來。其源碼目錄、編譯形式與Linux內核很相似,事實上,不少U-Boot源碼就是根據相應的Linux內核源程序進行簡化而形成的,尤其是一些設備的驅動程序,這從U-Boot源碼的注釋中能體現這一點。
⑵ 怎樣弄uboot編譯交叉編譯工具,我的xp和ubuntu間有個共享文件夾,我把交叉工具放在那裡,怎樣把它安裝
1:先把交叉編譯環境包放到你的共享目錄,(我這里的版本是:arm-linux-gcc-4.4.3.tar.gz)
2:進行解壓 tar zxvf arm-linux-gcc-4.4.3.tar.gz -C (要解壓的路徑)
比如:tar zxvf arm-linux-gcc-4.4.3.tar.gz -C ~/ (root 用戶的工作目錄)
3:然後設置環境變數:export PATH=$PATH:~/opt/FriendlyARM/toolschain/4.4.3/bin
4:要想系統啟動自動載入環境變數:
1:普通用戶:vim .profile 在最後添加你的環境變數:export PATH=$PATH:~/opt/FriendlyARM/toolschain/4.4.3/bin
2:root用戶:vim .bashrc 在最後添加你的環境變數:export PATH=$PATH:~/opt/FriendlyARM/toolschain/4.4.3/bin
自此,交叉環境徹底搭建完畢。
注意:我的交叉編譯包,解壓出來的路徑就是:opt/FriendlyARM/toolschain/4.4.3/bin
你的版本,可能有些不同
⑶ linux編譯u-boot時顯示[arch/arm/dts/zynq-zc702.dtb]錯誤
在編譯uboot的時候,會出現出錯,因此我們要首先做 make disclean. 將原來的一些中間文件清理干凈。
因此在編譯Uboot依次執行 1.make disclean
2.make smdk2440_config
3. make
就可以編譯通過了
⑷ 如何在自己的uboot中實現命令
你這個問題專業性太強了,還好你遇到了我,我11年的時候參加過一個嵌入式的培訓,當初我們是做一個數碼相框的項目,就是要把已經編寫好的程序移植到ARM2440板上面運行。整個過程非常的繁瑣復雜,我真的無法口述清楚。你想把linux中的命令移植到uboot代碼中,應該也是想在你的ARM上面編譯你的程序然後運行,你可以進我的CSDN的博客,博客地址:http://blog.csdn.net/coolboyli520,然後打開那個《Linux移植課實驗指導書》,這里有詳細的記錄,如果對你有幫助,還望採納!
⑸ 從庖丁解牛說uboot如何編譯
其實,這個世界上的萬事萬物,都有一個「紋理」。我讀中學的時候劈柴,如果順著木頭的紋理劈下去很輕易的就劈開了,但如果反其道而行之不但劈不開而且斧頭還會彈回來傷人!呵呵,城裡出生的孩子是沒這個體會,即使現在農村的孩子因為家裡都燒液化氣也沒有這個機會體驗了。 庖丁解牛之所以游刃有餘,是因為他掌握了牛的紋理,順著這些紋理就應該很容易。 那麼我們的uboot的紋理在哪裡呢? 很多初學者,拿到這種代碼從來沒有去看過它的readme或者document!這兩個文本文件是非常重要的東西,可惜呀!很多人不去看readme而去請教別人,google,,跑圖書館。其實,有些東西當你問到別人的時候,聰明的人也是去看readme然後給你解答的。 下面我們就去找uboot的紋理! 本文u-boot版本U-Boot 1.1.4 我們按正常人的思維(智商90)來分析。 首先,是要編譯,那麼編譯就要執行命令make,而make實際上就是執行makefile文件。第一次make肯定是不能成功的。聽從觀音菩薩的教誨「從哪裡來就到哪裡去」!make 出問題,我們就去makefile里找原因。Makefile里有這樣一段話: TOPDIR := $(shell if [「$$PWD」 != 「」]; then echo $$PWD; else pwd; fi) export TOPDIR ifeq (include/config.mk,$(wildcard include/config.mk)) # load ARCH, BOARD, and CPU configuration include include/config.mk export ARCH CPU BOARD VENDOR SOC # load other configuration include $(TOPDIR)/config.mk ifndef CROSS_COMPILE ifeq ($(HOSTARCH),ppc) CROSS_COMPILE = else ifeq ($(ARCH),ppc) CROSS_COMPILE = powerpc-linux- endif ifeq ($(ARCH),arm) CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux- endif ifeq ($(ARCH),i386) ifeq ($(HOSTARCH),i386) CROSS_COMPILE = else CROSS_COMPILE = i386-linux- endif endif ifeq ($(ARCH),mips) CROSS_COMPILE = mips_4KC- endif ifeq ($(ARCH),nios) CROSS_COMPILE = nios-elf- endif ifeq ($(ARCH),nios2) CROSS_COMPILE = nios2-elf- endif ifeq ($(ARCH),m68k) CROSS_COMPILE = m68k-elf- endif ifeq ($(ARCH),microblaze) CROSS_COMPILE = mb- endif endif endif export CROSS_COMPILE 這段腳本就是設置交叉編譯路徑CROSS_COMPILE,在設置這個路徑前要判斷我們所用的平台是什麼,即ARCH是什麼。我們這里以ARM為例。1 2
⑹ 如何實現uboot和linux之間的參數傳遞
U-boot會給Linux Kernel傳遞很多參數,如:串口,RAM,videofb等。而Linux kernel也會讀取和處理這些參數。兩者之間通過struct tag來傳遞參數。U-boot把要傳遞給kernel的東西保存在struct tag數據結構中,啟動kernel時,把這個結構體的物理地址傳給kernel;Linux kernel通過這個地址,用parse_tags分析出傳遞過來的參數。
本文主要以U-boot傳遞RAM和Linux kernel讀取RAM參數為例進行說明。
1、u-boot給kernel傳RAM參數
./common/cmd_bootm.c文件中(指Uboot的根目錄),bootm命令對應的do_bootm函數,當分析uImage中信息發現OS是Linux時,調用./lib_arm/bootm.c文件中的do_bootm_linux函數來啟動Linux kernel。
在do_bootm_linux函數中:
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],\
ulong addr, ulong *len_ptr, int verify)
{
......
#if defined (CONFIG_SETUP_MEMORY_TAGS) || \
defined (CONFIG_CMDLINE_TAG) || \
defined (CONFIG_INITRD_TAG) || \
defined (CONFIG_SERIAL_TAG) || \
defined (CONFIG_REVISION_TAG) || \
defined (CONFIG_LCD) || \
defined (CONFIG_VFD)
setup_start_tag (bd); //初始化tag結構體開始
#ifdef CONFIG_SERIAL_TAG
setup_serial_tag (¶ms);
#endif
#ifdef CONFIG_REVISION_TAG
setup_revision_tag (¶ms);
#endif
#ifdef CONFIG_SETUP_MEMORY_TAGS
setup_memory_tags (bd); //設置RAM參數
#endif
#ifdef CONFIG_CMDLINE_TAG
setup_commandline_tag (bd, commandline);
#endif
#ifdef CONFIG_INITRD_TAG
if (initrd_start && initrd_end)
setup_initrd_tag (bd, initrd_start, initrd_end);
#endif
#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
setup_videolfb_tag ((gd_t *) gd);
#endif
setup_end_tag (bd); //初始化tag結構體結束
#endif
......
......
theKernel (0, machid, bd->bi_boot_params);
//傳給Kernel的參數= (struct tag *)型的bd->bi_boot_params
//bd->bi_boot_params在board_init 函數中初始化,如對於at91rm9200,初始化在at91rm9200dk.c的board_init中進 行:bd->bi_boot_params=PHYS_SDRAM + 0x100;
//這個地址也是所有taglist的首地址,見下面的setup_start_tag函數
}
對於setup_start_tag和setup_memory_tags函數說明如下。
函數setup_start_tag也在此文件中定義,如下:
static void setup_start_tag (bd_t *bd)
{
params = (struct tag *) bd->bi_boot_params;
//初始化(struct tag *)型的全局變數params為bd->bi_boot_params的地址,之後的setup tags相關函數如下面的setup_memory_tags就把其它tag的數據放在此地址的偏移地址上。
params->hdr.tag = ATAG_CORE;
params->hdr.size = tag_size (tag_core);
params->u.core.flags = 0;
params->u.core.pagesize = 0;
params->u.core.rootdev = 0;
params = tag_next (params);
}
RAM相關參數在bootm.c中的函數setup_memory_tags中初始化:
static void setup_memory_tags (bd_t *bd)
{
int i;
for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
params->hdr.tag = ATAG_MEM;
params->hdr.size = tag_size (tag_mem32);
params->u.mem.start = bd->bi_dram[i].start;
params->u.mem.size = bd->bi_dram[i].size;
params = tag_next (params);
} //初始化內存相關tag
}
2、Kernel讀取U-boot傳遞的相關參數
對於Linux Kernel,ARM平台啟動時,先執行arch/arm/kernel/head.S,此文件會調用arch/arm/kernel/head- common.S和arch/arm/mm/proc-arm920.S中的函數,並最後調用start_kernel:
......
b start_kernel
......
init/main.c中的start_kernel函數中會調用setup_arch函數來處理各種平台相關的動作,包括了u-boot傳遞過來參數的分析和保存:
start_kernel()
{
......
setup_arch(&command_line);
......
}
其中,setup_arch函數在arch/arm/kernel/setup.c文件中實現,如下:
void __init setup_arch(char **cmdline_p)
{
struct tag *tags = (struct tag *)&init_tags;
struct machine_desc *mdesc;
char *from = default_command_line;
setup_processor();
mdesc = setup_machine(machine_arch_type);
machine_name = mdesc->name;
if (mdesc->soft_reboot)
reboot_setup("s");
if (__atags_pointer)
//指向各種tag起始位置的指針,定義如下:
//unsigned int __atags_pointer __initdata;
//此指針指向__initdata段,各種tag的信息保存在這個段中。
tags = phys_to_virt(__atags_pointer);
else if (mdesc->boot_params)
tags = phys_to_virt(mdesc->boot_params);
if (tags->hdr.tag != ATAG_CORE)
convert_to_tag_list(tags);
if (tags->hdr.tag != ATAG_CORE)
tags = (struct tag *)&init_tags;
if (mdesc->fixup)
mdesc->fixup(mdesc, tags, &from, &meminfo);
if (tags->hdr.tag == ATAG_CORE) {
if (meminfo.nr_banks != 0)
squash_mem_tags(tags);
save_atags(tags);
parse_tags(tags);
//處理各種tags,其中包括了RAM參數的處理。
//這個函數處理如下tags:
__tagtable(ATAG_MEM, parse_tag_mem32);
__tagtable(ATAG_VIDEOTEXT, parse_tag_videotext);
__tagtable(ATAG_RAMDISK, parse_tag_ramdisk);
__tagtable(ATAG_SERIAL, parse_tag_serialnr);
__tagtable(ATAG_REVISION, parse_tag_revision);
__tagtable(ATAG_CMDLINE, parse_tag_cmdline);
}
init_mm.start_code = (unsigned long) &_text;
init_mm.end_code = (unsigned long) &_etext;
init_mm.end_data = (unsigned long) &_edata;
init_mm.brk = (unsigned long) &_end;
memcpy(boot_command_line, from, COMMAND_LINE_SIZE);
boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
parse_cmdline(cmdline_p, from); //處理編譯內核時指定的cmdline或u-boot傳遞的cmdline
paging_init(&meminfo, mdesc);
request_standard_resources(&meminfo, mdesc);
#ifdef CONFIG_SMP
smp_init_cpus();
#endif
cpu_init();
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
conswitchp = &vga_con;
#elif defined(CONFIG_DUMMY_CONSOLE)
conswitchp = &mmy_con;
#endif
#endif
early_trap_init();
}
對於處理RAM的tag,調用了parse_tag_mem32函數:
static int __init parse_tag_mem32(const struct tag *tag)
{
......
arm_add_memory(tag->u.mem.start, tag->u.mem.size);
......
}
__tagtable(ATAG_MEM, parse_tag_mem32);
上述的arm_add_memory函數定義如下:
static void __init arm_add_memory(unsigned long start, unsigned long size)
{
struct membank *bank;
size -= start & ~PAGE_MASK;
bank = &meminfo.bank[meminfo.nr_banks++];
bank->start = PAGE_ALIGN(start);
bank->size = size & PAGE_MASK;
bank->node = PHYS_TO_NID(start);
}
如上可見,parse_tag_mem32函數調用arm_add_memory函數把RAM的start和size等參數保存到了meminfo結構的meminfo結構體中。最後,在setup_arch中執行下面語句:
paging_init(&meminfo, mdesc);
對沒有MMU的平台上調用arch/arm/mm/nommu.c中的paging_init,否則調用arch/arm/mm/mmu.c中的paging_init函數。這里暫不分析mmu.c中的paging_init函數。
3、關於U-boot中的bd和gd
U-boot中有一個用來保存很多有用信息的全局結構體 --gd_t(global data縮寫),其中包括了bd變數,可以說gd_t結構體包括了u-boot中所有重要全局變數。最後傳遞給內核的參數,都是從gd和bd中來的,如上 述的setup_memory_tags函數的作用就是用bd中的值來初始化RAM相應的tag。
對於ARM平台這個結構體的定義大致如下:
include/asm-arm/global_data.h
typedef struct global_data {
bd_t *bd;
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
void **jt; /* jump table */
} gd_t;
在U-boot中使用gd結構之前要用先用宏DECLARE_GLOBAL_DATA_PTR來聲明。這個宏的定義如下:
include/asm-arm/global_data.h
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")
從這個宏的定義可以看出,gd是一個保存在ARM的r8寄存器中的gd_t結構體的指針。
說明:本文的版本為U-boot-1.3.4、Linux-2.6.28,平台是ARM。
⑺ Linux 3.10.17下的單獨編譯u-boot的配置命令是什麼
如果你是要編譯u-boot,uImage和文件系統的話建議你使用yocto命令來編譯。如果是僅僅編譯u-boot或者uImage的話,你可以使用命令單獨編譯,編譯的話和以前release的BSP中文檔中的方法是一樣的。
⑻ 如何編譯u-boot-xlnx-xilinx-v2017.1.tar
$(EBI_UBOOT_DIR)是你uboot解壓後的目錄
$(EBI_IMAGE_DIR)是你編譯後放置u-boot.elf的目錄
⑼ linux下jlink燒寫uboot求助
Jlink for Linux之燒寫
為什麼會這樣做,是因為我每次編譯好u-boot後都要到Windows下進行燒寫,用的是j-flash(j-link家庭一款軟體)。我不知道它是出現的很晚還是怎麼回事,看很多人還在用「j-link command工具」,這個東西我沒有用過,不過看博客講述的燒寫過程極其復雜。j-flash三下五除2就搞定了。到目前應該不會去認識它了。就好比高中時沒有電腦的時候Windows Vista很火,但是到大學能用上電腦的時候又都是Win7了。
在Jlink for Linux之燒寫要做的話就按照這篇文章《J-LINK燒寫NOR FLASH NAND FLASH》來做,在沒有J-flash之前,這個應該算是很牛的了,但是在j-flash出來之後才接觸j-link的對上邊那篇文章就顯得很無力了。
不過話說過來,為什麼直接用Win7的人去了解Windows Vista呢?有一定的原因的。我是想在Linux也能燒u-boot.bin。但是下載的j-link工具中沒有j-flash那種工具。只有命令行的(這也說明linux應用老滯後win)。然後我就碰到了《J-LINK燒寫NOR FLASH NAND FLASH》,先是覺得神奇,又覺得好笑,最好又覺得神奇了。關於在linux的用jlink來燒寫到nor flash就不深入研究了,這里我在尋找Linux gdb調試u-boot的路上的一個意外收獲!目前的jlink for Linux版本的GDB提供的還是比較全的。
⑽ 如何在linux下用openjtag 燒寫uboot到MINI6410上(arm板子已是板磚,所以不用說uboot燒寫uboot的方法)
首先要有 CPU 和 內存的初始化代碼。
可以從Uboot中提取出來,編譯成bin下載到內存運行,也可以通過OpenJtag的腳本操作CPU 寄存器完成初始化。
內存初始化完成後,直接用OpenJtag將完整的Uboot下載到連接時指定的地址運行即可。
Uboot可以運行了,後面的就不成問題了。
另外用SD卡,也能很方便的解決問題。