我想atag
在 U-Boot 和 Linux 内核中添加自定义变量。
我怎样才能做到这一点?
有什么程序可以在and中添加ATAG
变量吗?U-Boot
Linux
问问题
7066 次
3 回答
5
最新的 Linux 内核正试图用设备树淘汰ATAGS。但是,setup.h文件定义了不同的ATAG值和结构。要解析这些,您需要添加它们,例如,
static int __init parse_tag_custom(const struct tag *tag)
{
if (tag->hdr.size > CUSTOM_SIZE) {
/* Use, storing or acting on passed values */
tag->u.custom;
}
return 0;
}
__tagtable(ATAG_CUSTOM, parse_tag_custom);
在atags_parse.c中找到。当然,您需要将这些添加到setup.h中的值中。
大多数情况下, u-boot的定义可能较少,它通过内核命令行传递参数,因为这不是ARM特定的。命令参数或设备树可能是首选方法。如果您举例说明您需要什么类型的配置,那么有人可能会提供更好的指导。
于 2013-07-16T00:54:44.850 回答
5
需要 U-Boot 更改:
A. Make sure the CONFIG_CMDLINE_TAG/CONFIG_SETUP_MEMORY_TAGS/CONFIG_INITRD_TAG are defined in you project definition header file ( u-boot/include/configs/am335x_evm.h ), and we can add our own tag here, eg. CONFIG_CUSTOM_TAG. B. Add the structure definition you wanna append w/ ATAG in u-boot/include/asm-arm/setup.h, eg. #define ATAG_CUSTOM 0x5441000a struct tag_custom{ unsigned char mac_addr[6]; }; C. Add the struct at the tail of "u"... struct tag { struct tag_header hdr; union { struct tag_core core; struct tag_mem32 mem; struct tag_videotext videotext; struct tag_ramdisk ramdisk; struct tag_initrd initrd; struct tag_serialnr serialnr; struct tag_revision revision; struct tag_videolfb videolfb; struct tag_cmdline cmdline; /* * Acorn specific */ struct tag_acorn acorn; /* * DC21285 specific */ struct tag_memclk memclk; /****** INFOTECH Custom TAG ********/ struct tag_custom custom; } u; }; D. Add implementation code in lib_arm/bootm.c: static void setup_custom_tag(bd_t *bd); static void setup_custom_tag(bd_t *bd) { params->hdr.tag = ATAG_CUSTOM; params->hdr.size = tag_size (tag_macaddr); params->u.custom.cmd =0; params = tag_next (params); } E. Add "#ifdef CONFIG_CUSTOM_TAG / #endif" at every place you change the code. F. Done of U-Boot modification.
需要 Linux 更改:
A.在linux/arch/arm/kernel/setup.c中添加parse标签代码:
int cmd; static int __init parse_tag_custom(const struct tag *tag){ printk("u.custom.cmd=%d\n",tag->u.custom.cmd); return 0; } __tagtable(ATAG_MACADDR, parse_tag_custom);
B. 像 U-Boot 在 linux/include/asm-arm/setup.h 中一样添加结构声明:
#define ATAG_MACADDR 0x5441000a struct tag_custom { int cmd; };
C. 在“u”的尾部添加结构...
struct tag { struct tag_header hdr; union { struct tag_core core; struct tag_mem32 mem; struct tag_videotext videotext; struct tag_ramdisk ramdisk; struct tag_initrd initrd; struct tag_serialnr serialnr; struct tag_revision revision; struct tag_videolfb videolfb; struct tag_cmdline cmdline; /* * Acorn specific */ struct tag_acorn acorn; /* * DC21285 specific */ struct tag_memclk memclk; /* Add Infotech custom tag */ struct tag_custom custom; } u; };
D. 使用内核部分完成。
于 2013-10-25T18:34:54.573 回答
4
按照这个程序,
为了实现这个目标,有 2 个部分需要修改。一个是 U-Boot,另一个是 Linux 内核。
1. U-Boot changes required :
A. Make sure the CONFIG_CMDLINE_TAG/CONFIG_SETUP_MEMORY_TAGS/CONFIG_INITRD_TAG are defined in you project definition header file ( u-boot/include/configs/am335x_evm.h ), and we can add our own tag here, eg. CONFIG_CUSTOM_TAG.
B. Add the structure definition you wanna append w/ ATAG in u-boot/include/asm-arm/setup.h, eg.
#define ATAG_CUSTOM 0x5441000a
struct tag_custom{
unsigned char mac_addr[6];
};
C. Add the struct at the tail of "u"...
struct tag {
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
struct tag_cmdline cmdline;
/*
* Acorn specific
*/
struct tag_acorn acorn;
/*
* DC21285 specific
*/
struct tag_memclk memclk;
/****** INFOTECH Custom TAG ********/
struct tag_custom custom;
} u;
};
D. Add implementation code in lib_arm/bootm.c:
static void setup_custom_tag(bd_t *bd);
static void setup_custom_tag(bd_t *bd) {
params->hdr.tag = ATAG_CUSTOM;
params->hdr.size = tag_size (tag_macaddr);
params->u.custom.cmd =0;
params = tag_next (params);
}
E. Add "#ifdef CONFIG_CUSTOM_TAG / #endif" at every place you change the code.
F. Done of U-Boot modification.
2. Linux Changes required:
A. Add parse tag code in linux/arch/arm/kernel/setup.c:
int cmd;
static int __init parse_tag_custom(const struct tag *tag){
printk("u.custom.cmd=%d\n",tag->u.custom.cmd);
return 0;
}
__tagtable(ATAG_MACADDR, parse_tag_custom);
B. Add the structure declaration as U-Boot did in linux/include/asm-arm/setup.h:
#define ATAG_MACADDR 0x5441000a
struct tag_custom {
int cmd;
};
C. Add the struct at the tail of "u"...
struct tag {
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
struct tag_cmdline cmdline;
/*
* Acorn specific
*/
struct tag_acorn acorn;
/*
* DC21285 specific
*/
struct tag_memclk memclk;
/* Add Infotech custom tag */
struct tag_custom custom;
} u;
};
D. Done w/ Kernel parts.
于 2013-07-16T07:27:43.090 回答