uboot分析——预备知识
阅读原文时间:2023年07月12日阅读:2

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

#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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章