10

我想atag在 U-Boot 和 Linux 内核中添加自定义变量。
我怎样才能做到这一点?
有什么程序可以在and中添加ATAG变量吗?U-BootLinux

4

3 回答 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
  1. 需要 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.
    
    1. 需要 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 回答