Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 in U-Boot and Linux?

like image 340
Prashant Chikhalkar Avatar asked Jul 15 '13 18:07

Prashant Chikhalkar


3 Answers

The latest Linux kernel is attempting to obsolete ATAGS with device trees. However, the setup.h file defines the different ATAG values and structures. To parse these, you need to add them with something like,

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);

as found in atags_parse.c. Of course, you need to add these to the values in setup.h.

u-boot is probably less defined as for the most part, it passes arguments via the kernel command line as this is not ARM specific. A command argument or device trees is probably the preferred method. If you gave an example of what type of configuration you need, someone could probably give better guidance.

like image 140
artless noise Avatar answered Oct 23 '22 23:10

artless noise


  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.

like image 25
MNW Avatar answered Oct 23 '22 22:10

MNW


Follow this procedure ,

To achieve this goal, there're 2 parts need to be modified. One is the U-Boot, and the other one is the Linux kernel.

    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.
like image 4
vishnumotghare Avatar answered Oct 24 '22 00:10

vishnumotghare