FS4412裸机程序------调用uboot下的printf

1、将u-boot-2010.03-FS4412.tar.xz压缩包放在自己想要的目录下

在这里插入图片描述

2、使用命令“tar -xvf u-boot-2010.03-FS4412.tar.xz”解压缩u-boot-2010.03-FS4412.tar.xz

在这里插入图片描述
解压缩完成
在这里插入图片描述

3、使用命令“./build_uboot.sh”编译uboot,生成u-boot.map文件,出现类似报错

在这里插入图片描述
使用命令“vim Makefile”修改Makefile文件
在这里插入图片描述
在命令模式输入“/CROSS”找到CROSS_COMFILE的位置
在这里插入图片描述
修改成下图样子
在这里插入图片描述
保存退出并重新编译
在这里插入图片描述
编译成功
在这里插入图片描述
已经生成了u-boot.map文件
在这里插入图片描述

4、使用命令“vim u-boot.map”命令查看.map文件

在这里插入图片描述
在命令模式下输入“/vprintf”以便找到printf函数的地址
在这里插入图片描述
记住printf()函数的地址
在这里插入图片描述

5、新建一个项目,新建一个reg4412.h文件,内容如下
#pragma once
#define gpiobase 0x11000000
#define GPM4CON (*(volatile unsigned long *)(gpiobase + 0x02E0))
#define GPM4DAT (*(volatile unsigned long *)(gpiobase + 0x02E4))
#define GPX3CON (*(volatile unsigned long *)(gpiobase + 0x0C60))
#define GPX4DAT (*(volatile unsigned long *)(gpiobase + 0x0C64))
#define gicbase 0x10480000
#define ICCICR_CPU0 (*(volatile unsigned long *)(gicbase + 0x0))
#define ICCPMR_CPU0 (*(volatile unsigned long *)(gicbase + 0x4))
#define ICCBPR_CPU0 (*(volatile unsigned long *)(gicbase + 0x8))
#define ICCIAR_CPU0 (*(volatile unsigned long *)(gicbase + 0xc))
#define ICCEOIR_CPU0 (*(volatile unsigned long *)(gicbase + 0x10))
#define ICCRPR_CPU0 (*(volatile unsigned long *)(gicbase + 0x14))
#define ICCHPIR_CPU0 (*(volatile unsigned long *)(gicbase + 0x18))
#define ICCABPR_CPU0 (*(volatile unsigned long *)(gicbase + 0x1c))
#define INTEG_EN_C_CPU0 (*(volatile unsigned long *)(gicbase + 0x40))
#define INTERRUPT_OUT_CPU0 (*(volatile unsigned long *)(gicbase + 0x44))
#define ICCIIDR (*(volatile unsigned long *)(gicbase + 0xfc))
#define icdbase 0x10490000
#define ICDDCR (*(volatile unsigned long *)(icdbase + 0x0))
#define ICDICTR (*(volatile unsigned long *)(icdbase + 0x4))
#define ICDIIDR (*(volatile unsigned long *)(icdbase + 0x8))
#define ICDISR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0080))
#define ICDISR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0084))
#define ICDISR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0088))
#define ICDISR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x008C))
#define ICDISR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0090))
#define ICDISER0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0100))
#define ICDISER1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0104))
#define ICDISER2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0108))
#define ICDISER3_CPU0 (*(volatile unsigned long *)(icdbase + 0x010C))
#define ICDISER4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0110))
#define ICDICER0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0180))
#define ICDICER1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0184))
#define ICDICER2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0188))
#define ICDICER3_CPU0 (*(volatile unsigned long *)(icdbase + 0x018C))
#define ICDICER4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0190))
#define ICDISPR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0200))
#define ICDISPR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0204))
#define ICDISPR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0208))
#define ICDISPR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x020C))
#define ICDISPR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0210))
#define ICDICPR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0280))
#define ICDICPR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0284))
#define ICDICPR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0288))
#define ICDICPR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x028C))
#define ICDICPR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0290))
#define ICDABR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0300))
#define ICDABR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0304))
#define ICDABR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0308))
#define ICDABR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x030C))
#define ICDABR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0310))
/*ICDIPR0_CPU0 ~~~ ICDIPR39_CPU0 */
#define ICDIPTR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0800))
#define ICDIPTR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0804))
#define ICDIPTR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0808))
#define ICDIPTR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x080C))
#define ICDIPTR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0810))
#define ICDIPTR5_CPU0 (*(volatile unsigned long *)(icdbase + 0x0814))
#define ICDIPTR6_CPU0 (*(volatile unsigned long *)(icdbase + 0x0818))
#define ICDIPTR7_CPU0 (*(volatile unsigned long *)(icdbase + 0x081C))
#define ICDIPTR8_CPU0 (*(volatile unsigned long *)(icdbase + 0x0820))
#define ICDIPTR9_CPU0 (*(volatile unsigned long *)(icdbase + 0x0824))
#define ICDIPTR10_CPU0 (*(volatile unsigned long *)(icdbase + 0x0828))
#define ICDIPTR11_CPU0 (*(volatile unsigned long *)(icdbase + 0x082C))
#define ICDIPTR12_CPU0 (*(volatile unsigned long *)(icdbase + 0x0830))
#define ICDIPTR13_CPU0 (*(volatile unsigned long *)(icdbase + 0x0834))
#define ICDIPTR14_CPU0 (*(volatile unsigned long *)(icdbase + 0x0838))
#define ICDIPTR15_CPU0 (*(volatile unsigned long *)(icdbase + 0x083C))
#define ICDIPTR16_CPU0 (*(volatile unsigned long *)(icdbase + 0x0840))
#define ICDIPTR17_CPU0 (*(volatile unsigned long *)(icdbase + 0x0844))
#define ICDIPTR18_CPU0 (*(volatile unsigned long *)(icdbase + 0x0848))
#define ICDIPTR19_CPU0 (*(volatile unsigned long *)(icdbase + 0x084C))
#define ICDIPTR20_CPU0 (*(volatile unsigned long *)(icdbase + 0x0850))
#define ICDIPTR21_CPU0 (*(volatile unsigned long *)(icdbase + 0x0854))
#define ICDIPTR22_CPU0 (*(volatile unsigned long *)(icdbase + 0x0858))
#define ICDIPTR23_CPU0 (*(volatile unsigned long *)(icdbase + 0x085C))
#define ICDIPTR24_CPU0 (*(volatile unsigned long *)(icdbase + 0x0860))
#define ICDIPTR25_CPU0 (*(volatile unsigned long *)(icdbase + 0x0864))
#define ICDIPTR26_CPU0 (*(volatile unsigned long *)(icdbase + 0x0868))
#define ICDIPTR27_CPU0 (*(volatile unsigned long *)(icdbase + 0x086C))
#define ICDIPTR28_CPU0 (*(volatile unsigned long *)(icdbase + 0x0870))
#define ICDIPTR29_CPU0 (*(volatile unsigned long *)(icdbase + 0x0874))
#define ICDIPTR30_CPU0 (*(volatile unsigned long *)(icdbase + 0x0878))
#define ICDIPTR31_CPU0 (*(volatile unsigned long *)(icdbase + 0x087C))
#define ICDIPTR32_CPU0 (*(volatile unsigned long *)(icdbase + 0x0880))
#define ICDIPTR33_CPU0 (*(volatile unsigned long *)(icdbase + 0x0884))
#define ICDIPTR34_CPU0 (*(volatile unsigned long *)(icdbase + 0x0888))
#define ICDIPTR35_CPU0 (*(volatile unsigned long *)(icdbase + 0x088C))
#define ICDIPTR36_CPU0 (*(volatile unsigned long *)(icdbase + 0x0890))
#define ICDIPTR37_CPU0 (*(volatile unsigned long *)(icdbase + 0x0894))
#define ICDIPTR38_CPU0 (*(volatile unsigned long *)(icdbase + 0x0898))
#define ICDIPTR39_CPU0 (*(volatile unsigned long *)(icdbase + 0x089C))
#define ICDICFR0_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C00))
#define ICDICFR1_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C04))
#define ICDICFR2_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C08))
#define ICDICFR3_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C0C))
#define ICDICFR4_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C10))
#define ICDICFR5_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C14))
#define ICDICFR6_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C18))
#define ICDICFR7_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C1C))
#define ICDICFR8_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C20))
#define ICDICFR9_CPU0 (*(volatile unsigned long *)(icdbase + 0x0C24))
#define PPI_STATUS_CPU0 (*(volatile unsigned long *)(icdbase + 0x0D00))
#define SPI_STATUS0 (*(volatile unsigned long *)(icdbase + 0x0D04))
#define SPI_STATUS1 (*(volatile unsigned long *)(icdbase + 0x0D08))
#define SPI_STATUS2 (*(volatile unsigned long *)(icdbase + 0x0D0C))
#define SPI_STATUS3 (*(volatile unsigned long *)(icdbase + 0x0D10))
#define ICDSGIR (*(volatile unsigned long *)(icdbase + 0x0f00))
6、新建test.c文件,内容如下
#include "reg4412.h"
void (*printf)(char *, ...) = 0xc3e0f248;
int test(void)
{
	unsigned long value = 0;
	__asm__ __volatile__ (
	"mrs %0, cpsr\n"
	: "=&r" (value)
	);
	printf(" hello uboot!!!!!!\n");
	printf(" value = 0x%x\n", value);
	return 0;
}

tip:第二行的地址 0xc3e0f248 是自己printf()的地址

7、新建Makefile文件,内容如下
default:
	arm-linux-gcc -c test.c -o test.o
	arm-linux-ld -Ttext=0x70003000 test.o -o test
	arm-linux-objcopy -O binary test test.bin
clean:
	rm -f test.o test test.bin *~
8、将上面3个文件放进一个文件夹

在这里插入图片描述

9、使用命令“make”编译,生成test.bin文件

在这里插入图片描述

10、开发板拨码开关调至1000,连接板子与电脑,使用串口助手建立会话,使用SD卡启动uboot

在这里插入图片描述

11、uboot使用命令“dnw 70003000”下载test.bin

在这里插入图片描述
VMware提示如下信息,选择连接到虚拟机,选中要用的虚拟机
在这里插入图片描述

12、在Ubuntu的dnw目录下使用命令“sudo ./dnw /FS4412/print_cz/test.bin”传输test.bin程序

报如下错误
在这里插入图片描述
输入命令“sudo insmod sebulk.ko”,然后重新传输
在这里插入图片描述
uboot提示下载完成
在这里插入图片描述

13、使用命令“go 70003000”运行test.bin,成功输出“hello uboot!!!”并且返回value的值

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后天必早起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值