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
原文:https://www.cnblogs.com/yangxinrui/p/12689090.html