免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1657 | 回复: 0
打印 上一主题 下一主题

uboot传递参数到linux内核,并在用户空间访问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-30 14:52 |只看该作者 |倒序浏览

在uboot中添加一个命令set_test_param,设置环境变量test_param为1,再传递到内核,并可在用户空间访问。

uboot和linux内核的参数传递通过相同的数据结构struct tag实现;在用户空间访问通过proc文件系统实现。

以下是需要修改的代码(git diff得出):


diff --git a/uboot/arch/arm/include/asm/setup.h b/uboot/arch/arm/include/asm/setup.h
index 89df4dc..e95dc82 100644
--- a/uboot/arch/arm/include/asm/setup.h
+++ b/uboot/arch/arm/include/asm/setup.h
@@ -188,6 +188,12 @@ struct tag_cmdline {
  char cmdline[1]; /* this is the minimum size */
 };
 
+//gxh add
+#define ATAG_test_param   0x5441000a
+struct tag_test_param {
+    char    test_param[8];  /* this is the minimum size */
+};
+
 /* acorn RiscPC specific information */
 #define ATAG_ACORN 0x41000101
 
@@ -218,6 +224,9 @@ struct tag {
   struct tag_videolfb videolfb;
   struct tag_cmdline cmdline;
 
+  //gxh add
+  struct tag_test_param test_param;
+
   /*
    * Acorn specific
    */
diff --git a/uboot/arch/arm/lib/bootm.c b/uboot/arch/arm/lib/bootm.c
index 7a22048..1539ed8 100644
--- a/uboot/arch/arm/lib/bootm.c
+++ b/uboot/arch/arm/lib/bootm.c
@@ -29,6 +29,8 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static void setup_test_param_tag (bd_t *bd, char *test_param);    //gxh add
+
 #if defined (CONFIG_SETUP_MEMORY_TAGS) || \
     defined (CONFIG_CMDLINE_TAG) || \
     defined (CONFIG_INITRD_TAG) || \
@@ -63,6 +65,9 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
  char *pxa_commandline = getenv ("pxa_bootargs");
 #endif
 
+ //gxh add
+    char *test_param = getenv("test_param");
+
  if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
   return 1;
 
@@ -102,6 +107,10 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
  if (images->rd_start && images->rd_end)
   setup_initrd_tag (bd, images->rd_start, images->rd_end);
 #endif
+
+ //gxh add
+    setup_test_param_tag(bd, test_param);
+
  setup_end_tag (bd);
 #endif
 
@@ -123,6 +132,32 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
  return 1;
 }
 
+//gxh add
+static void setup_test_param_tag (bd_t *bd, char *test_param)
+{
+    char *p;
+   
+ if (!test_param)
+        return;
+
+    for (p = test_param; *p == ' '; p++);
+
+     /* skip non-existent command lines so the kernel will still
+     * use its default command line.
+     */
+     if (*p == '\0')
+        return;
+
+
+    params->hdr.tag = ATAG_test_param;
+    params->hdr.size = tag_size (tag_test_param);
+
+    strcpy (params->u.test_param.test_param, p);
+
+ //printf("params->u.test_param.test_param: %s\n", params->u.test_param.test_param);
+
+    params = tag_next (params);
+}
 
 #if defined (CONFIG_SETUP_MEMORY_TAGS) || \
     defined (CONFIG_CMDLINE_TAG) || \
diff --git a/uboot/common/Makefile b/uboot/common/Makefile
index 2cd1480..4627e1f 100644
--- a/uboot/common/Makefile
+++ b/uboot/common/Makefile
@@ -118,7 +118,8 @@ COBJS-$(CONFIG_CMD_MG_DISK) += cmd_mgdisk.o
 COBJS-$(CONFIG_MII) += miiphyutil.o
 COBJS-$(CONFIG_CMD_MII) += miiphyutil.o
 COBJS-$(CONFIG_CMD_MII) += cmd_mii.o
-COBJS-$(CONFIG_CMD_MISC) += cmd_misc.o
+#COBJS-$(CONFIG_CMD_MISC) += cmd_misc.o
+COBJS-y += cmd_misc.o
 COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o
 COBJS-$(CONFIG_MP) += cmd_mp.o
 COBJS-$(CONFIG_CMD_MTDPARTS) += cmd_mtdparts.o
diff --git a/uboot/common/cmd_misc.c b/uboot/common/cmd_misc.c
index 061b1bb..ab59ca0 100644
--- a/uboot/common/cmd_misc.c
+++ b/uboot/common/cmd_misc.c
@@ -53,3 +53,28 @@ U_BOOT_CMD(
  "N\n"
  "    - delay execution for N seconds (N is _decimal_ !!!)"
 );
+
+
+/**************************gxh add**********************************************/
+
+int do_test_param (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+ setenv("test_param", "1");
+}

 
+U_BOOT_CMD(
+ set_test_param ,    2,    1,     do_test_param,
+ "Trun on test_param mode.",
+ NULL
+);

diff --git a/kernel/arch/arm/include/asm/setup.h b/kernel/arch/arm/include/asm/setup.h
index 5ccce0a..6eb875d 100644
--- a/kernel/arch/arm/include/asm/setup.h
+++ b/kernel/arch/arm/include/asm/setup.h
@@ -143,6 +143,12 @@ struct tag_memclk {
  __u32 fmemclk;
 };
 
+//gxh add
+#define ATAG_test_param   0x5441000a
+struct tag_test_param {
+    char    test_param[8];  /* this is the minimum size */
+};
+
 struct tag {
  struct tag_header hdr;
  union {
@@ -155,7 +161,9 @@ struct tag {
   struct tag_revision revision;
   struct tag_videolfb videolfb;
   struct tag_cmdline cmdline;
-
+  //gxh add
+  struct tag_test_param  test_param;
+  
   /*
    * Acorn specific
    */
diff --git a/kernel/arch/arm/kernel/setup.c b/kernel/arch/arm/kernel/setup.c
index c6c57b6..ba00880 100644
--- a/kernel/arch/arm/kernel/setup.c
+++ b/kernel/arch/arm/kernel/setup.c
@@ -123,6 +123,9 @@ static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
 static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
 #define ENDIANNESS ((char)endian_test.l)
 
+//gxh add
+char default_test_param[8] = {'\0'};
+
 DEFINE_PER_CPU(struct cpuinfo_arm, cpu_data);
 
 /*
@@ -635,6 +638,17 @@ static int __init parse_tag_cmdline(const struct tag *tag)
 
 __tagtable(ATAG_CMDLINE, parse_tag_cmdline);
 
+//gxh add
+static int __init parse_tag_test_param(const struct tag *tag)
+{
+ //printk(KERN_INFO "test_param:%s", tag->u.test_param.test_param);
+ //printk(KERN_INFO "test_param_type:0x%08x\n", tag->hdr.tag);
+    strlcpy(default_test_param, tag->u.test_param.test_param, 4);
+    return 0;
+}
+__tagtable(ATAG_test_param, parse_tag_test_param);
+
+
 /*
  * Scan the tag table for this tag, and call its parse function.
  * The tag table is built by the linker from all the __tagtable
diff --git a/kernel/arch/arm/plat-pxa/generic.c b/kernel/arch/arm/plat-pxa/generic.c
index 3b0adcf..96ed2db 100644
--- a/kernel/arch/arm/plat-pxa/generic.c
+++ b/kernel/arch/arm/plat-pxa/generic.c
@@ -64,6 +64,35 @@ static int __init create_pxa_cmdline_proc_file(void)
 }
 module_init(create_pxa_cmdline_proc_file);
 
+#if 1 //gxh add
+
+extern char default_test_param[8];
+
+static ssize_t test_param_read_proc(char *page, char **start, off_t off,
+  int count, int *eof, void *data)
+{
+ int len = strlen(default_test_param);
+
+ sprintf(page, "%s\n", default_test_param);
+ return len + 1;
+}
+static int __init create_test_param_proc_file(void)
+{
+ struct proc_dir_entry *test_param_proc_file =
+  create_proc_entry("test_param", 0644, NULL);
+
+ if (test_param_proc_file)
+  test_param_proc_file->read_proc = test_param_read_proc;
+ else
+  printk(KERN_INFO "test_param proc file create failed!\n");
+
+ return 0;
+}
+module_init(create_test_param_proc_file);
+
+#endif
+
+
 static int android_project = 0;
 static int __init android_setup(char *__unused)
 {

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP