How to add customised ATAG variable in U-Boot and Linux kernel?

前端 未结 3 1041
没有蜡笔的小新
没有蜡笔的小新 2020-12-25 08:36

I want to add customized atag variable in U-Boot and Linux kernel.
How can i achieve this?
Is there any procedure to add an ATAG variable i

3条回答
  •  独厮守ぢ
    2020-12-25 09:24

    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.
      
      1. 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.

提交回复
热议问题