Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48729
  • 博文数量: 36
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 390
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-23 15:42
文章分类
文章存档

2011年(1)

2009年(35)

我的朋友
最近访客

分类: LINUX

2009-08-15 12:46:21

   最近实现的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就好了啊。
 
阅读(590) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~