OK6410A 开发板 (四) OK6410A 裸机代码

写裸机代码是为了在 移植/调试 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:
 
 
 /* stack setup */
-       ldr sp, =8*1024
+       ldr sp, =0x0c002000
 
        
        bl clock_init   /* clock init */


代码架构示例

  • start.S
.text
.code 32

.global _start
_start:
	// 将 iRAM的最高位置设为SP
	ldr sp, =0x0c002000
	bl led_sample

loop:
	b loop
  • led.c
#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);

}

  • Makefile
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

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/114325101