今天将以前在windows ADS上写好的一些裸机程序用linux + arm-linux tools 移植到 TQ2440上,刚弄第一个 LED,就卡住了,
main.c 不加任何修改
#define rGPBCON (*(volatile unsigned *)0x56000010) //Port B control
#define rGPBDAT (*(volatile unsigned *)0x56000014) //Port B data
#define rGPBUP (*(volatile unsigned *)0x56000018) //Pull-up control B
static
void led_conf (void)
{
rGPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16)); /* clear */
rGPBCON |= ((1<<10)|(1<<12)|(1<<14)|(1<<16)); /* set */
/* pull up by default */
}
static
void led_opt (int led_nr,int val)
{
led_nr &= 3;
val = (val > 0);
led_nr += 5;
if (rGPBDAT & (1 << led_nr)) { /* if on */
if (!val) /* turn off */
rGPBDAT &= ~(1<
if (val) /* turn on */
rGPBDAT |= (1<
}
void delay (int dl)
{
int x,y;
for (x = 0;x < dl; x ++)
{
for (y = 0;y < 1000;y ++);
}
}
int main (void)
{
led_conf ();
led_opt (0,1);
led_opt (1,1);
led_opt (2,1);
led_opt (3,1);
while (1) {
led_opt (1,0);
delay (10);
led_opt (1,1);
delay (10);
}
}
ADS 上的 start.s
/ * start.s */
AREA Init,code,readonly
entry
import main
bl main
b .
end
linux 下 start.s
/* start.s for linux */
.global _start
.extern main
.text
_start:
bl main
b .
/* makefile */
all:
arm-linux-gcc -g -c -nostdlib start.s -o start.o
arm-linux-gcc -g -c -nostdlib main.c -o main.o
arm-linux-ld -Ttext 0x00 -g start.o main.o -o led.o
arm-linux-objcopy -O binary -S led.o led.bin
sudo dnw -a 0x0 led.bin
@echo download compelete !
clean:
rm -f *.o *.bin
# sudo minicom casey
下载模式。。。。。。
# make all
原以为是小菜,可是TQ2440死活不干活
我做了以下努力 :
1. 将ads 下弄好的 bin文件 ,用 dnw 下载到 nandflash ,运行OK
2. 将 windows 下的bin和arm-linux 弄出的bin分别dump ,看他们的bl 地址,一直follow ,可是,对比仍旧无问题
3.将 ld 地址 改为 0x30000000,下载到 sdram,运行OK(开始我认为相当奇怪)
4.ld 0x30000000的前提下,加上 ldr sp,=4096,反而G掉了
5.后来我再继续dump,用没有Strip 的 elf 文件dump,总算发现了,原来是ld 0x00 的时候 ldr sp,=4096,sdram 改变了sp 的地址,板子当然罢工,嘿嘿
然后将start.s 改成如下:
/* start.s for linux */
.global _start
.extern main
.text
_start:
ldr sp,=4096
bl main
b .
# 后面一切顺利 !