写裸机代码是为了在 移植/调试 u-boot 的时候,更加从容
全部代码可以参考 https://github.com/lisider/ok6410-rawcode
研究裸机代码是为了
1.知道你写的每一行代码在bin文件,SD卡,内存的位置
2.熟悉 gnu armv6 汇编
3.更顺手的调试u-boot
另外 其他历程可参考 https://github.com/fengrc/OK6410.git , 每个历程需要修改为如下,才可工作
$ git diff *
diff --git a/lcd/Makefile b/lcd/Makefile
index 93f04cd..66d66e5 100644
--- a/lcd/Makefile
+++ b/lcd/Makefile
@@ -1,5 +1,5 @@
lcd.bin: start.o clock.o uart.o lcd.o sdram.o main.o framebuffer.o
- arm-linux-ld -Ttext 0 -o lcd.elf start.o uart.o clock.o lcd.o sdram.o main.o framebuffer.o
+ arm-linux-ld -Ttext 0x0c000000 -o lcd.elf start.o uart.o clock.o lcd.o sdram.o main.o framebuffer.o
arm-linux-objcopy -O binary lcd.elf lcd.bin
arm-linux-objdump -D lcd.elf > lcd.dis
diff --git a/lcd/start.S b/lcd/start.S
index a37cfd6..1981d4d 100644
--- a/lcd/start.S
+++ b/lcd/start.S
@@ -15,7 +15,7 @@ _start:
- ldr sp, =8*1024
+ ldr sp, =0x0c002000
bl clock_init
代码架构示例
.text
.code 32
.global _start
_start:
ldr sp, =0x0c002000
bl led_sample
loop:
b loop
#define gpmcon *((volatile unsigned long *)0x7F008820)
#define gpmdat *((volatile unsigned long *)0x7F008824)
void delay()
{
volatile int i = 0x100000;
while (i--);
}
const unsigned char mask[5] = {
0x0,0xe,0xd,0xb,0x7};
unsigned int led_change_times = 0;
int led_change(int led_number)
{
if ((led_change_times%2) == 0)
gpmdat = gpmdat & mask[led_number];
else
gpmdat = gpmdat | ~mask[led_number];
delay();
led_change_times++;
return 0;
}
int led_c_set_led_flash(int led_number,int count){
while(count --){
gpmdat = gpmdat & mask[led_number];
delay();
gpmdat = gpmdat | ~mask[led_number];
delay();
}
return 0;
}
int led_c_set_led_on(int led_number){
gpmdat = gpmdat & mask[led_number];
delay();
return 0;
}
void led_c_init(void)
{
gpmcon = 0x1111;
gpmdat = 0xf;
}
void led_change_test(void)
{
int n = 5;
led_change_times=0;
while(n--)
led_change(1);
n = 5;
led_change_times=0;
while(n--)
led_change(2);
n = 5;
led_change_times=0;
while(n--)
led_change(3);
n = 5;
led_change_times=0;
while(n--)
led_change(4);
}
void led_sample(void){
led_c_init();
led_c_set_led_on(1);
led_c_set_led_on(2);
led_c_set_led_on(3);
led_c_set_led_on(4);
led_c_set_led_flash(1,5);
led_c_set_led_flash(2,5);
led_c_set_led_flash(3,5);
led_c_set_led_flash(4,5);
led_change_test();
while(1);
}
CROSS_COMPILE=arm-linux-
TARGET=led
CFLAG=-c
LDFLAG=-e _start -Ttext 0x0c000000
SDCARD=/dev/sdb
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld
OBJCOPY=$(CROSS_COMPILE)objcopy
OBJDUMP=${
CROSS_COMPILE}objdump
FLASH=../0base/flash.sh
all: $(TARGET).dis $(TARGET).bin
$(TARGET).dis: $(TARGET)
$(OBJDUMP) -D $(TARGET) > $(TARGET).dis
$(TARGET).bin: $(TARGET)
$(OBJCOPY) -O binary $< $@
# start.o 必须在最前面
$(TARGET): start.o $(TARGET).o
$(LD) $(LDFLAG) $? -o $@
%.o:%.S
$(CC) $(CFLAG) $< -o $@
flash:$(TARGET).bin $(SDCARD)
#$(FLASH) ./$(TARGET).bin $(SDCARD)
@if [ $(shell du -b $(TARGET).bin|cut -f1) -le 8192 ];then \
$(FLASH) $(TARGET).bin $(SDCARD); \
else \
echo bin file is lager than 8192,size is $(shell du -b $(TARGET).bin|cut -f1); \
fi \
clean:
rm *.o $(TARGET) $(TARGET).bin $(TARGET).dis -f