如何在U-Boot和Linux内核中添加自定义TAG变量?

时间:2013-07-15 18:43:37

标签: linux-kernel arm u-boot

我想在U-Boot和Linux内核中添加自定义的atag变量 我怎样才能做到这一点?
是否有任何程序可以在ATAGU-Boot中添加Linux变量?

3 个答案:

答案 0 :(得分: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更改:

      一个。在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中。在linux / include / asm-arm / setup.h中添加结构声明为U-Boot:

      #define ATAG_MACADDR 0x5441000a
      struct tag_custom {
          int cmd;
      };
      

      ℃。在“你”的尾部添加结构...

      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。用内核部件完成。

答案 1 :(得分:4)

最新的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 特定的。 命令参数设备树可能是首选方法。如果您举例说明了您需要什么类型的配置,那么有人可能会提供更好的指导。

答案 2 :(得分: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.