TQ210裸机编程(12)——从SD卡拷贝程序到DDR内存储器

TQ210裸机编程(12)——从SD卡拷贝程序到DDR内存

参考手册:

S5PV210_UM_REV1.1.pdf       S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf


参考《TQ210裸机编程(5)——S5PV210启动流程和系统时钟配置》


本次实验中,程序分为2部分,BL1和BL2。BL1烧写到SD卡的扇区1,BL2烧写到SD卡的扇区10,S5PV210上电从SD卡启动,内部IROM中的代码自动拷贝BL1到内部SRAM,然后运行BL1,我们在BL1初始化串口、DDR内存、时钟,拷贝BL2到DDR,然后跳转到DDR执行BL2。


要从SD卡拷贝程序到内存,不用我们自己实现拷贝函数,S5PV210内部IROM固话的代码包含了这个拷贝函数,我们只需按照手册(S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf)要求调用这个函数就可以了。

TQ210裸机编程(12)——从SD卡拷贝程序到DDR内存储器


关键点解析:

1、如何判断SD卡当前启动通道?

在《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》中2.6 Global Variable中写着地址0xD0037488保存着V210_SDMMC_BASE(SDMMC寄存器的基地址),再查看《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》中7.9.1  REGISTER MAP,0xEB00_0000即代表通道0,0xEB20_0000即代表通道2.


2、在《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》写着SD/MMC Copy函数的工作时钟源External source clock parameter is used to fit EPLL source clock at 20MHz. ,这个EPLL的20MHz时钟在系统上电由内部IROM代码初始化,因此我们必须先执行程序拷贝,在执行自己的时钟初始化代码。


3、系统自动初始化的时钟配置信息在S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》中2.11 Clock Configuration 


下面列出源程序

root@zjh:/mnt/hgfs/E/cloud/embedded/my_code/tq210/12-CopySDMMCtoMem# tree .
.
├── bl1
│   ├── clock.c
│   ├── copy.c
│   ├── ddr.c
│   ├── link.lds
│   ├── Makefile
│   ├── start.S
│   ├── types.h
│   ├── uart.c
│   └── uart.h
├── bl2
│   ├── led.c
│   ├── Makefile
│   ├── start.S
│   └── \350\257\264\346\230\216.txt
└── \350\257\264\346\230\216.txt

2 directories, 14 files

编译步骤:

进入变bl1文件夹执行

root@zjh:/mnt/hgfs/E/cloud/embedded/my_code/tq210/12-CopySDMMCtoMem/bl1# make
arm-linux-gcc -c start.S -o start.o
arm-linux-gcc -c clock.c -o clock.o -fno-builtin
arm-linux-gcc -c uart.c -o uart.o -fno-builtin
arm-linux-gcc -c ddr.c -o ddr.o -fno-builtin
arm-linux-gcc -c copy.c -o copy.o -fno-builtin
arm-linux-ld -Tlink.lds -o uart.elf start.o clock.o uart.o ddr.o copy.o
arm-linux-objcopy -O binary uart.elf uart.bin
arm-linux-objdump -D uart.elf > uart.dis


进入bl2文件夹执行

root@zjh:/mnt/hgfs/E/cloud/embedded/my_code/tq210/12-CopySDMMCtoMem/bl2# make
arm-linux-gcc -c start.S -o start.o
arm-linux-gcc -c led.c -o led.o
arm-linux-ld -Ttext 0x20000000 -o led.elf start.o led.o
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led.dis


使用前面几节讲解到的addheader给bl1下的uart.bin添加头信息。

root@zjh:/mnt/hgfs/E/cloud/embedded/my_code/tq210/12-CopySDMMCtoMem/bl1# ../../addheader uart.bin /mnt/hgfs/E/210.bin


最终得到要烧写的程序210.bin和led.bin,我们将210.bin 烧写到SD的扇区1,将led.bin烧写到SD的扇区10,从SD卡启动可以看到串口打印信息(从BL1中打印),以及跑马灯效果(BL2)。


有读卡器的朋友可以在虚拟机下使用dd命令烧写:

root@zjh:/mnt/hgfs/E/cloud/embedded/my_code/tq210/12-CopySDMMCtoMem/bl1# dd iflag=dsync oflag=dsync if=./210.bin of=/dev/sdb seek=1


root@zjh:/mnt/hgfs/E/cloud/embedded/my_code/tq210/12-CopySDMMCtoMem/bl2# dd iflag=dsync oflag=dsync if=./led.bin of=/dev/sdb seek=10


对于没有读卡器的朋友,可以在Windows下使用我写的工具进行烧写,选择文件210.bin烧写到扇区1,然后选择文件led.bin烧写到扇区10.

TQ210裸机编程(12)——从SD卡拷贝程序到DDR内存储器


所有裸机程序下载地址在我的QQ群共享里面:153530783

转载请注明来源:http://blog.****.net/zjhsucceed_329/

QQ:809205580

技术交流群:153530783