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)要求调用这个函数就可以了。
关键点解析:
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.
所有裸机程序下载地址在我的QQ群共享里面:153530783
转载请注明来源:http://blog.****.net/zjhsucceed_329/
QQ:809205580
技术交流群:153530783