最近实现的4*1键盘和4*4键盘控制led都是通过viv提供的命令下载到内存和执行的,这样虽然便捷但是掉电后程序就没了。相关的vivi命令为:
load ram 0x30000000 0x33333(可执行文件的大小)x;
go 0x30000000;
现在目标想把可执行文件下载到flash中,然后模拟启动内核boot命令来执行程序,这样就可以避免上面的缺点。下载到nand flash中,可以参考vivi下载内核命令:
load flash kernel x,只要理解此命令就很容易实现把可执行程序下载到内存中,其中kernel指的是mtd分区的kernel的分区。所以要为可执行程序划分一个分区,在smdk.c文件中模仿上面给可执行程序划分一个mtd分区。
load命令会根据mtd分区把可行文件下载到相应的mtd分区,那么无需修改了,剩下的任务就是把flash中的考到内存中,修改boot_kernel.c文件。模仿cammand_boot命令添加cammand_boot_test命令:
void command_boot(int argc, const char **argv)
{
int media_type = 0;
ulong from = 0;
size_t size = 0;
mtd_partition_t *kernel_part;
int ret;
switch (argc) {
case 1:
media_type = get_param_value("media_type", &ret);
if (ret) {
printk("Can't get default 'media_type'\n");
return;
}
test_part = get_mtd_partition("test");
if (test_part == NULL) {
printk("Can't find default 'test' partition\n");
return;
}
from = test_part->offset;
size = test_part->size;
break;
default:
break;
}
boot_test(from, size, media_type);
}
user_command_t boot_cmd = {
"boot_test",
command_boot_test,
NULL,
"boot_test [{cmds}] \t\t\t-- Booting test"
};
int boot_test(ulong from, size_t size, int media_type)
{
int ret = 0;
ulong to =0x30000000;
ret = copy_test(to, (char *)from, size);
if (ret) {
printk("failed\n");
return -1;
} else {
printk("done\n");
}
}
static inline int copy_test(ulong dst, const char *src, size_t size)
{
int ret =0;
#ifdef CONFIG_S3C2410_NAND_BOOT
ret = nand_read_ll((unsigned char *)dst,
(unsigned long)src, (int)size);/*从nandflash读到内存中
go(0x30000000,0,0,0,0);
#endif
return ret;
}
这样就顺利的将可执行程序从flah 读到了sdram中了,最后就是怎么来执行这个程序了,当直接考到sdram中的时候用的是go命令来执行文件的,那么我们只需在copy_test 里添加go命令就好了,查看一下go命令
static void go(unsigned long addr, long a0, long a1, long a2, long a3)
{
.......
.......
}
此命令被本地化了,那么把static去掉吧,然后在boot_kernel.c前面声明一下吧。不要把实现好的boot_test命令添加到command.c文件中。
......
extern user_command_t boot_cmd;
extern user_command_t boot_test_cmd;
..........
#endif
........
add_command(&boot_cmd);
add_command(&boot_test_cmd);
.........
ok
启动viv
vivi> load flash test x(把以前实现的4*1键盘的程序下载到test分区中)
vivi>boot_test
程序跑起来啦。
也可以写在一个函数里,本身后面关键的就是两个函数的调用。
也可以写在另一个.c文件中,别忘记修改相应的makefile就好了啊。
阅读(616) | 评论(0) | 转发(0) |