UBOOT SD卡搬运到DDR中
去;;;;代码实现::
typedef unsigned int u32;
typedef unsigned long ulong;
typedef unsigned int (*copy_sd_mmc_to_mem)
(u32 channel, u32 start_block, unsigned char block_size, u32 *trg, u32 init);
void copy_code_to_dram(void)
{
ulong ch;
ulong dest = 0x34800000;
unsigned int uImage_dest = 30008000;
unsigned int uImage_sec_nu = 1000(我们自己定义的地方,之前的给uboot留出够了);//从sd卡的第1000个扇区开始去搬运uImage ,当然前提你烧录时候就要
时候把uImage 烧录到sd 卡的第1000个扇区。。。烧录脚本很简单。。。dd iflag=dysnc oflag=dysnc if=uImage of=/dev/sdb (uImage 的生成步骤其实很简单的 :写一下吧:::
在 tools找到mkimage ;;;;mkimage -n “wdh_kernel” -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage ;;;;;;;查看信息:::ll *Image
)
u32 ret;
ch = *(volatile u32 *)(0xD0037488);
copy_sd_mmc_to_mem copy_bl2 =
(copy_sd_mmc_to_mem) (*(u32 *) (0xD0037F98));
unsigned int uImage_dest = 0x30008000;
unsigned int uImage_sec_nu = 1000;
ulong dest = 0x34800000;
unsigned int sec_nu = 49;
if (ch == 0xEB000000) {
ret = copy_bl2(0, sec_nu, 128,(u32 *)dest , 0);
ret = copy_bl2(0, sec_nu+128, 128,(u32 *)(dest+0x10000) , 0);
ret = copy_bl2(0, sec_nu+256, 128,(u32 *)(dest+0x20000) , 0);
//ret = copy_b12(0, sec_nu+384, 128,(u32 *)(dest+0x30000) , 0);
for(i = 0;i < 5*1024(5M大小,其实是4.6M这是smart210的官方zImage 的大小,可以看出的吧);i++)
{
copy_b12(0,uImage_sec_nu + i*2(自动加1K,,,懂了吧),2(一次搬动2个扇区1K 1K 的搬到ddr中去), (unsigned int *)(uImage_dest + i*1024(当然要自动加1K了 你懂的)),0);
}
}
serctor 扇区这样的算法会耗时但是比较好写和理解 所以你需要去弄得有效率的话,就可以自己去计算,,,256serctor 去搬运也可以,,,,,这里简化了