在u-boot里操作led灯

来源:互联网 发布:chrome 淘宝联盟插件 编辑:程序博客网 时间:2024/05/01 04:24
1.编辑led.c代码
#define rGPJ2CON (*(volatile unsigned long *)0xe0200280)
#define rGPJ2DAT (*(volatile unsigned long *)0xe0200284)


void Led_RunDelay(volatile int count);
int Led_RunHorse(void)
{
        int i=0;
        rGPJ2CON = 0x1111;
        rGPJ2DAT = 0xf;
        while (1)
        {
                rGPJ2DAT = ~(0x1<<i);
                Led_RunDelay(0xb0000);


                i++;
                if(i==4)
                {
                        i=0;
                        rGPJ2DAT = 0xf;
                }
        }
        return 0;
}
void Led_RunDelay(volatile int count)
{
        while (count--);
}


2 编译代码
#arm-linux-gcc led.c -o led   //不能这样编译,因为led是跟地址没有关系,它只能在linux系统上面跑
不能在u-boot上面跑,因为这是直接放到内存上跑的


1)编译:
#arm-linux-gcc -c -nostdlib -nostdinc led.c -o led.o 
2)链接
#arm-linux-ld -Ttext=0x40000000 led.o -o led.elf 
3)转换
#arm-linux-objcopy -O binary -S led.elf led.bin 


3. 代码的执行
1)打开tftp服务器
2)设置网络(ping通)
set serverip 
set ipaddr 
set gatewayip 

3)下载执行
tftp 40000000 led.bin 
go 40000000 

优化开发平台
1) 利用makefile来管理工程代码
#vim Makefile
添加以下内容:
all:led.bin clean
led.bin:led.o
        arm-linux-ld -Ttext=0x40000000 led.o -o led.elf 
        arm-linux-objcopy -O binary -S led.elf led.bin 
led.o:led.c
        arm-linux-gcc -c -nostdlib -nostdinc led.c -o led.o 


clean:
        rm -rf led.o led.elf 


2)利用u-boot自动启动功能来下载执行


# set bootcmd tftp 40000000 led.bin \;go 40000000
# save 
# re 

改回bootcmd

#set bootcmd nand read 40000000 600000 500000 \;bootm 40000000

再检查下bootargs,如果有变就改回

#set bootargs root=/dev/mtdblock4 init=/linuxrc console=ttySAC0,115200 rootfstype=yaffs rw
#save
程序如果是死循环就只能关开机重启。


-------------------------------------------------------------------
注意:如果报工具出错,记得加上以下两个操作
# ln -s arm-none-linux-gnueabi-ld arm-linux-ld
# ln -s arm-none-linux-gnueabi-objcopy arm-linux-objcopy 
# ln -s arm-none-linux-gnueabi-objdump arm-linux-objdump
0 0
原创粉丝点击