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
手机扫一扫
移动阅读更方便
你可能感兴趣的文章