本帖最后由 Damon_回归 于 2016-6-4 13:54 编辑
有二种方法可以做!第一种方法就是用u-boot里面的printf,第二种方法就是自己直接写个printf函数!
第一方法就是先知道u-boot里面的printf函数的地址在那里!那么下面例子就是操作nand,把id打印出来!
test.S
typedef volatile unsigned int u32;
typedef volatile unsigned char u8;
#define NFCONF *(u32 *)0x70200000
#define NFCONT *(u32 *)0x70200004
#define NFCMMD *(u8 *)0x70200008
#define NFADDR *(u8 *)0x7020000C
#define NFDATA *(u8 *)0x70200010
void (*printf)(char *, ...) = (void *)0x57e11df8;
void _start()
{
NFCONF = (3 << 12)|(2 << 8)|(1 << 4)|(1 << 2);
/ /tacls = 3, twrph0 = 3, twrph1 = 2
NFCONT = 1;
NFCMMD = 0x90;
NFADDR = 0;
printf("%02x\n", NFDATA);
printf("%02x\n", NFDATA);
printf("%02x\n", NFDATA);
printf("%02x\n", NFDATA);
printf("%02x\n", NFDATA);
}
Makefile
all:
arm-none-linux-gnueabi-gcc -c test.c -o test.o -fno-builtin
arm-none-linux-gnueabi-ld -T test.lds test.o -o test
arm-none-linux-gnueabi-objcopy -O binary test /tftpboot/test.bin
第2种方法自己写了啊!
#include <stdio.h>
void printf_int(int val)
{
if (val <=0)
return ;
printf_int(val/10);
putchar(val%10+'0');
}
void printf_hex(int val)
{
if (val <=0)
return ;
printf_hex(val/16);
putchar(val%16+'0');
}
void printf_float(float val)
{
int i;
printf_int(val);
putchar('.');
val=val-(int)val;
for(i=0;i<6;i++)
{
val=val*10;
putchar((int)val%10+'0');
}
}
void my_printf(char *cmd,...)
{
int *addr=(void *)&cmd;
int num=0;
while(*cmd)
{
while(*cmd &&(*cmd != '%'))
putchar(*cmd++);
if(*cmd=='\0')
break;
cmd++;
num++;
switch(*cmd)
{
case 'c' :putchar(*(addr+num));
break;
case 's' :puts((char *)*(addr+num));
break;
case 'd': printf_int(*(addr+num));
break;
case 'p': printf_hex(*(addr+num));
break;
// case 'f' : printf_float(*(addr+num));
// break;
}
cmd++;
}
}
int main(void)
{
int i=2;
my_printf("%d\n",i);
//printf_float(21.045);
return 0;
}
现在float支持部了,有点问题!!!函数printf_foat可以单独使用,所以现在还在调试中!!!
第一种方法怎么在那个地址里面找到相应的printf函数地址呢,那么在boot.map里面去找
可以加qq群 D.T.Software入口群 199546072 交流学习 |