uboot分析——预备知识

1. 刷机

  刷机是使用fastboot,所以板子首先要已经能运行uboot,若ROM没有uboot,则使用sd卡或usb启动uboot。

  板子进入uboot后,输入fastboot命令,进入fastboot模式,电脑能识别安卓设备。

  主机在命令行下运行fastboot工具,有如下常用命令及参数

fastboot devices                来查看当前连接的设备。
fastboot flash xxx        
fastboot reboot            

fastboot flash bootloader android4.0/uboot.bin        烧uboot
fastboot flash kernel android4.0/zImage-android        烧linux kernel
fastboot flash system android4.0/x210.img            烧android rom

2. uboot的基本使用

  常用命令

print
set
save

set ipaddr       192.168.3.22
set serveraddr   192.168.3.11     设置tftp-server 

bootm  0x30000000
go 0x30000000

3.基本裸机实验   led

首先准备好交叉编译工具链。

link.lds

SECTIONS
{
    . = 0xd0024000;
    
    .text : {
        start.o
        * (.text)
    }
            
    .data : {
        * (.data)
    }
    
    bss_start = .; 
    .bss : {
        * (.bss)
    }
    
    bss_end  = .;    
}

makefile

CROSS_COMPILE =  arm-none-linux-gnueabi
led.bin: start.o led.o $(CROSS_COMPILE)
-ld -Tlink.lds -o led.elf $^ $(CROSS_COMPILE)-objcopy -O binary led.elf led.bin %.o : %.S arm-linux-gcc -o $@ $< -c -nostdlib %.o : %.c arm-linux-gcc -o $@ $< -c -nostdlib clean: rm *.o *.elf *.bin *.dis -f

start.S

扫描二维码关注公众号,回复: 10739961 查看本文章
#define WTCON        0xE2700000

#define SVC_STACK    0xd0037d80

.global _start                    
_start:
    ldr r0, =WTCON
    ldr r1, =0x0
    str r1, [r0]
    
    ldr sp, =SVC_STACK
    
    mrc p15,0,r0,c1,c0,0;       
    orr r0, r0, #(1<<12)         
    mcr p15,0,r0,c1,c0,0;
    
    adr r0, _start         
    ldr r1, =_start 
    ldr r2, =bss_start    
    cmp r0, r1            
    beq clean_bss       
copy_loop:
    ldr r3, [r0], #4 
    str r3, [r1], #4   
    cmp r1, r2            
    bne copy_loop

clean_bss:
    ldr r0, =bss_start                    
    ldr r1, =bss_end
    cmp r0, r1                
    beq run_on_dram        
    mov r2, #0
clear_loop:
    str r2, [r0], #4        
    cmp r0, r1            
    bne clear_loop

run_on_dram:    
    ldr pc, =led_blink            
    

led.c

#define GPJ0CON        0xE0200240
#define GPJ0DAT        0xE0200244

#define rGPJ0CON    *((volatile unsigned int *)GPJ0CON)
#define rGPJ0DAT    *((volatile unsigned int *)GPJ0DAT)

void delay(void);

void led_blink(void)
{
    rGPJ0CON = 0x11111111;
    
    while (1)
    {
        rGPJ0DAT = ((0<<3) | (0<<4) | (0<<5));
        delay();
        rGPJ0DAT = ((1<<3) | (1<<4) | (1<<5));
        delay();
    }
}
void delay(void)
{
    volatile unsigned int i = 900000;   
    while (i--);                    
}  

  汇编代码的必要性:

  (1)初始化硬件,(如 icache 必须用汇编)

  (2)重定位

  (3)设置栈

  重定位的必要性:

  由于有些指令是地址相关指令,所以必须保证链接地址和运行地址相同。

  地址相关指令: 指令使用的地址参数是链接地址,如 ldr pc, =led_blink ,这里 =led_blink 符号的值为 link.lds 设置的链接起始地址为基地址,并加偏移地址得到的值。

  地址无关指令:指令使用的地址参数是运行地址,如 adr pc, =led_blink,这里 =led_blink 符号的值为 运行时 的 pc 寄存器中的值作为基地址,并加偏移地址得到的值。

  设置栈

  栈基地址为 sp 寄存器,不同cpu状态有不同的sp寄存器。

4. source insight 准备 uboot 

猜你喜欢

转载自www.cnblogs.com/yangxinrui/p/12689090.html